home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / VOGLE.ZIP / VOGLE / DRIVERS / IBMPC / EGALINE.ASM < prev    next >
Assembly Source File  |  2000-02-11  |  5KB  |  345 lines

  1.     TITLE    EGALINE - Fast line drawing routine.
  2.     NAME    EGALINE
  3.     PAGE    55,132
  4.  
  5.  
  6.     COMMENT    $
  7.  
  8.     Name:        EGALINE
  9.  
  10.     Function:    Draw a line in the following EGA/VGA graphics modes:
  11.             200 line 16 colour modes
  12.             350 line modes
  13.             640 x 480 16 colour modes
  14.  
  15.     Caller:        Microsoft C:
  16.  
  17.             void     egaline(x1, y1, x2, y2, n);
  18.                 int    x1, y1, x2, y2;    /* pixel co-ords */
  19.                 int    n;        /* pixel value */
  20.         $
  21.  
  22.  
  23. ; Stack frame addressing - LARGE CODE MODEL
  24.  
  25. ARGx1        EQU    word ptr [bp+6]
  26. ARGy1        EQU    word ptr [bp+8]
  27. ARGx2        EQU    word ptr [bp+10]
  28. ARGy2        EQU    word ptr [bp+12]
  29. ARGn        EQU    byte ptr [bp+14]
  30.  
  31. VARvertincr    EQU    word ptr [bp-6]
  32. VARincr1    EQU    word ptr [bp-8]
  33. VARincr2    EQU    word ptr [bp-10]
  34. VARroutine    EQU    word ptr [bp-12]
  35.  
  36. ByteOffsetShift    EQU    3
  37. BytesPerLine    EQU    80
  38. RMWbits        EQU    0
  39.  
  40.  
  41. VEGA_TEXT    SEGMENT    byte public 'CODE'
  42.         ASSUME    cs:VEGA_TEXT
  43.  
  44.         EXTRN    egapaddr:far
  45.         PUBLIC    _egaline
  46.  
  47. _egaline    PROC    far
  48.  
  49.         push    bp        ; Set up stack frame
  50.         mov    bp,sp
  51.         sub    sp,10
  52.         push    si
  53.         push    di
  54.  
  55. ; config graphics controller
  56.  
  57.         mov    dx,3CEH
  58.         mov    ah,ARGn
  59.         xor    al,al
  60.         out    dx,ax
  61.  
  62.         mov    ax,0F01H
  63.         out    dx,ax
  64.  
  65.         mov    ah,RMWbits
  66.         mov    al,3
  67.         out    dx,ax
  68.  
  69. ; check for vertical line
  70.  
  71.         mov    si,BytesPerLine
  72.         mov    cx,ARGx2
  73.         sub    cx,ARGx1
  74.         jz    VertLine
  75.  
  76. ; force x1 < x2
  77.  
  78.         jns    L01
  79.  
  80.         neg    cx
  81.  
  82.         mov    bx,ARGx2
  83.         xchg    bx,ARGx1
  84.         mov    ARGx2,bx
  85.  
  86.         mov    bx,ARGy2
  87.         xchg    bx,ARGy1
  88.         mov    ARGy2,bx
  89.  
  90. ; calc dy = abs(y2 - y1)
  91.  
  92. L01:
  93.         mov    bx,ARGy2
  94.         sub    bx,ARGy1
  95.         jz    HorizLine
  96.         jns    L03
  97.  
  98.         neg    bx
  99.         neg    si
  100.  
  101. ; select appropriate routine for slope of line
  102.  
  103. L03:
  104.         mov    VARvertincr,si
  105.         mov    VARroutine,offset LoSlopeLine
  106.         cmp    bx,cx
  107.         jle    L04
  108.         mov    VARroutine,offset HiSlopeLine
  109.         xchg    bx,cx
  110.  
  111. ; calc initial decision variable and increments
  112.  
  113. L04:
  114.         shl    bx,1
  115.         mov    VARincr1,bx
  116.         sub    bx,cx
  117.         mov    si,bx
  118.         sub    bx,cx
  119.         mov    VARincr2,bx
  120.  
  121. ; calc first pixel address
  122.  
  123.         push    cx
  124.         mov    ax,ARGy1
  125.         mov    bx,ARGx1
  126.         call    egapaddr
  127.         mov    di,bx
  128.         shl    ah,cl
  129.         mov    bl,ah
  130.         mov    al,8
  131.         pop    cx
  132.         inc    cx
  133.         jmp    VARroutine
  134.  
  135. ; routine for verticle lines
  136.  
  137. VertLine:
  138.         mov    ax,ARGy1
  139.         mov    bx,ARGy2
  140.         mov    cx,bx
  141.         sub    cx,ax
  142.         jge    L31
  143.         neg    cx
  144.         mov    ax,bx
  145.  
  146. L31:
  147.         inc    cx
  148.         mov    bx,ARGx1
  149.         push    cx
  150.         call    egapaddr
  151.  
  152. ; set up graphics controller
  153.  
  154.         shl    ah,cl
  155.         mov    al,8
  156.         out    dx,ax
  157.         pop    cx
  158.  
  159. ; draw the line
  160.  
  161. L32:
  162.         or    es:[bx],al
  163.         add    bx,si
  164.         loop    L32
  165.         jmp    Lexit
  166.  
  167. ; routine for horizontal line
  168.  
  169. HorizLine:
  170.         push    ds
  171.  
  172.         mov    ax,ARGy1
  173.         mov    bx,ARGx1
  174.         call    egapaddr
  175.         mov    di,bx
  176.         mov    dh,ah
  177.         not    dh
  178.         shl    dh,cl
  179.         not    dh
  180.  
  181.         mov    cx,ARGx2
  182.         and    cl,7
  183.         xor    cl,7
  184.         mov    dl,0FFH
  185.         shl    dl,cl
  186.  
  187. ; determine byte offset of first and last pixel in line
  188.  
  189.         mov    ax,ARGx2
  190.         mov    bx,ARGx1
  191.         mov    cl,ByteOffsetShift
  192.  
  193.         shr    ax,cl
  194.         shr    bx,cl
  195.         mov    cx,ax
  196.         sub    cx,bx
  197.  
  198. ; get graphics controller port address into DX
  199.  
  200.         mov    bx,dx
  201.         mov    dx,3CEH
  202.         mov    al,8
  203.  
  204. ; make video buffer addressable through DS:SI
  205.  
  206.         push    es
  207.         pop    ds
  208.         mov    si,di
  209.  
  210. ; set pixels in leftmost byte of line
  211.  
  212.         or    bh,bh
  213.         js    L43
  214.         or    cx,cx
  215.         jnz    L42
  216.         and    bl,bh
  217.         jmp    short L44
  218.  
  219. L42:
  220.         mov    ah,bh
  221.         out    dx,ax
  222.         movsb
  223.         dec    cx
  224.  
  225. ; draw remainder of the line
  226.  
  227. L43:
  228.         mov    ah,0FFH
  229.         out    dx,ax
  230.         rep    movsb
  231.  
  232. ; set pixels in rightmost byte of line
  233.  
  234. L44:
  235.         mov    ah,bl
  236.         out    dx,ax
  237.         movsb
  238.         pop    ds
  239.         jmp    short Lexit
  240.  
  241.  
  242.  
  243. ; routine for dy >= dx (slope <= 1)
  244.  
  245. LoSlopeLine:
  246.  
  247. L10:
  248.         mov    ah,bl
  249.  
  250. L11:
  251.         or    ah,bl
  252.         ror    bl,1
  253.         jc    L14
  254.  
  255. ; bit mask not shifted out
  256.  
  257.         or    si,si
  258.         jns    L12
  259.         add    si,VARincr1
  260.         loop    L11
  261.  
  262.         out    dx,ax
  263.         or    es:[di],al
  264.         jmp    short Lexit
  265.  
  266. L12:
  267.         add    si,VARincr2
  268.         out    dx,ax
  269.         or    es:[di],al
  270.         add    di,VARvertincr
  271.         loop    L10
  272.         jmp    short Lexit
  273.  
  274. ; bit mask shifted out
  275.  
  276. L14:
  277.         out    dx,ax
  278.         or    es:[di],al
  279.         inc    di
  280.         or    si,si
  281.         jns    L15
  282.         add    si,VARincr1
  283.         loop    L10
  284.         jmp    short Lexit
  285.  
  286. L15:
  287.         add    si,VARincr2
  288.         add    di,VARvertincr
  289.         loop    L10
  290.         jmp    short Lexit
  291.  
  292.  
  293.  
  294. ; routine for dy > dx (slope > 1)
  295.  
  296. HiSlopeLine:
  297.         mov    bx,VARvertincr
  298.  
  299. L21:
  300.         out    dx,ax
  301.         or    es:[di],al
  302.         add    di,bx
  303.  
  304. L22:
  305.         or    si,si
  306.         jns    L23
  307.  
  308.         add    si,VARincr1
  309.         loop    L21
  310.         jmp    short Lexit
  311.  
  312. L23:
  313.         add    si,VARincr2
  314.         ror    ah,1
  315.         adc    di,0
  316.         loop    L21
  317.  
  318. ; restore default graphics controoler state and return to caller
  319.  
  320. Lexit:
  321.  
  322. COMMENT $
  323.         xor    ax,ax
  324.         out    dx,ax
  325.         inc    ax
  326.         out    dx,ax
  327.         mov    ax,3
  328.         out    dx,ax
  329.         mov    ax,0FF08H
  330.         out    dx,ax
  331.         $
  332.  
  333.         pop    di
  334.         pop    si
  335.         mov    sp,bp
  336.         pop    bp
  337.         ret
  338.  
  339. _egaline    endp
  340.  
  341. VEGA_TEXT    ends
  342.  
  343.         end
  344.  
  345.