; 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