; lineproc.mac
; MASM macro definition for Bresenham line-drawing routine
; Colin Kelley
; January 13, 1987
INCAX equ 40h ; for Self-Modifying Code
INCBX equ 43h
DECAX equ 48h
DECBX equ 4bh
; usage:
; lineproc linename, pixelname
;
; where linemane is the name you want for the proc, and pixelname is the
; name of the routine that linename is to call to set pixels
;
lineproc macro linename, pixelname
beginproc linename
push bp
mov bp,sp
push si
push di
mov ax,[bp+X] ; x1
mov bx,[bp+X+2] ; y1
mov cx,[bp+X+4] ; x2
mov si,[bp+X+6] ; y2
cmp ax,cx ; x1,x2
jne i19
cmp bx,si ; y1,y2
jne i19
call pixelname
jmp i28
i19:
mov dx,ax ; dx,x1
sub dx,cx ; x2
jnc noabsx
neg dx
noabsx:
mov di,bx ; dy,y1
sub di,si ; y2
jnc noabsy
neg di ; dy
noabsy:
cmp dx,di ; dx,dy
jb i21 ; go iterate y's
;
; iterate x's
;
cmp bx,si ; y1,y2
jb forwardy
mov byte ptr cs:yinc1,DECBX
jmp short i22
forwardy:
mov byte ptr cs:yinc1,INCBX
i22:
cmp ax,cx ; x1,x2
jae l20004
mov byte ptr cs:xinc1,INCAX
jmp short l20005
l20004:
mov byte ptr cs:xinc1,DECAX
l20005:
mov bp,dx ; sum,dx
shr bp,1 ; sum
d23:
cmp ax,cx ; x1,x2
je i28 ; done
xinc1: inc ax ; may become inc or dec
add bp,di ; sum,dy
cmp bp,dx
jb i27
sub bp,dx ; sum,dx
yinc1: inc bx ; may become inc or dec
i27:
call pixelname
jmp short d23
;
; else iterate y's
;
i21:
cmp ax,cx ; x1,x2
jae l20006
mov byte ptr cs:xinc2,INCAX
jmp short l20007
l20006:
mov byte ptr cs:xinc2,DECAX
l20007:
cmp bx,si ; y1,y2
jb forwardy2
mov byte ptr cs:yinc2,DECBX
jmp short i29
forwardy2:
mov byte ptr cs:yinc2,INCBX
i29:
mov bp,di ; sum,dy
shr bp,1 ; sum,1
d30:
cmp bx,si ; y1,y2
je i28
yinc2: inc bx ; may become inc or dec
add bp,dx ; sum,dx
cmp bp,di ; sum,dy
jb i34
sub bp,di ; sum,dy
xinc2: inc ax ; may become inc or dec
i34:
call near ptr pixelname
jmp short d30
;
; clean up and exit
;
i28:
pop di
pop si
pop bp
ret
linename endp
endm