eca line PROTO C, x1:WORD,y1:WORD,x2:WORD,y2:WORD,color:WORD .MODEL SMALL .386 .CODE ;***** ;***** line ;***** ; The following line routine is a modified version of code in Richard ; Wilton's book "Programmer's Guide to PC and PS/2 Video Systems". SCREENSEG EQU 0A000h PIXELADDR MACRO xchg ah,al ; ax=256*y add bx,ax ; bx=256*y+x shr ax,2 add bx,ax ; bx=320*y+x (+ offset in buffer if needed.) mov ax,SCREENSEG mov es,ax ; es:bx=address of pixel ENDM line PROC C USES es si di, x1:WORD, y1:WORD, x2:WORD, y2:WORD, colour:WORD LOCAL VARincr1:WORD, VARincr2:WORD, VARroutine:WORD ; check for vertical lines mov si,320 ; initial y-increment mov cx,x2 sub cx,x1 ; cx=x2-x1 jz vertLine ; force x1 < x2 jns L01 ; jump if x1=0 neg cx ; force dy>=0 mov ax,bx ; ax=y2 L31: inc cx ; cx=# of pixels to draw mov bx,x1 ; bx=x PIXELADDR ; es:bx mov di,bx ; es:di dec si ; si=bytes/line-1 mov ax,colour L32: stosb add di,si ; next line loop L32 jmp Lexit ; routine for horizontal lines (slope=0) horizLine: mov ax,y1 mov bx,x1 PIXELADDR ; es:bx mov di,bx ; es:di mov ax,colour mov ah,al mov bx,ax shl eax,16 mov ax,bx inc cx mov dx,cx shr cx,2 rep stosd mov cx,dx and cx,0000000000000011b rep stosb jmp Lexit ; routine for dy<=dx (slope<=1) ; es:di -> video buffer ; bx=y-increment ; cx =# of pixels to draw ; si=decision variable loSlopeLine: mov ax,colour L11: stosb ; put pixel, increment x or si,si ; test sign of d jns L12 ; jump id d>=0 add si,VARincr1 ; d=d+incr1 loop L11 jmp Lexit L12: add si,VARincr2 ; d=d+incr2 add di,bx ; increment y loop L11 jmp Lexit ; routine for dy>dx (slope >1) ; es:di -> video buffer ; bx=y-increment ; cx=# of pixels to draw ; si=decision variable hiSlopeLine: mov ax,colour L21: stosb ; put pixel, increment x add di,bx ; increment y L22: or si,si ; test sign of d jns L23 ; jump if d>=0 add si,VARincr1 ; d=d+incr1 dec di ; dec x (inc by stosb) loop L21 jmp Lexit L23: add si,VARincr2 ; d=d+incr2 loop L21 Lexit: ret line ENDP END . 0