1 ;-----------------------------------------------------------------------
\r
4 ; Line drawing functions.
\r
10 ; ****** XLIB - Mode X graphics library ****************
\r
11 ; ****** ****************
\r
12 ; ****** Written By Themie Gouthas ****************
\r
14 ; egg@dstos3.dsto.gov.au
\r
15 ; teg@bart.dsto.gov.au
\r
16 ;-----------------------------------------------------------------------
\r
26 mov dx,[_ScrnLogicalByteWidth]
\r
36 ;-----------------------------------------------------------------------
\r
39 ; Line drawing function for all MODE X 256 Color resolutions
\r
40 ; Based on code from "PC and PS/2 Video Systems" by Richard Wilton.
\r
42 ; Compile with Tasm.
\r
47 ARG x1:word,y1:word,x2:word,y2:word,Color:word,PgOffs:word
\r
48 LOCAL vertincr:word,incr1:word,incr2:word,routine:word=LocalStk
\r
49 push bp ; Set up stack frame
\r
58 mov dx,SC_INDEX ; setup for plane mask access
\r
60 ; check for vertical line
\r
62 mov si,[_ScrnLogicalByteWidth]
\r
81 ; calc dy = abs(y2 - y1)
\r
93 ; select appropriate routine for slope of line
\r
97 mov [routine],offset LoSlopeLine
\r
100 mov [routine],offset HiSlopeLine
\r
103 ; calc initial decision variable and increments
\r
113 ; calc first pixel address
\r
122 mov ah,al ; duplicate nybble
\r
130 ; routine for verticle lines
\r
152 mov ax, word ptr [Color]
\r
162 ; routine for horizontal line
\r
171 mov di,bx ; set dl = first byte mask
\r
175 mov cx,[x2] ; set dh = last byte mask
\r
181 ; determine byte offset of first and last pixel in line
\r
186 shr ax,2 ; set ax = last byte column
\r
187 shr bx,2 ; set bx = first byte column
\r
188 mov cx,ax ; cx = ax - bx
\r
191 mov ax,dx ; mov end byte masks to ax
\r
192 mov dx,SC_INDEX ; setup dx for VGA outs
\r
195 ; set pixels in leftmost byte of line
\r
197 or cx,cx ; is start and end pt in same byte
\r
199 and ah,al ; combine start and end masks
\r
210 ; draw remainder of the line
\r
220 ; set pixels in rightmost byte of line
\r
225 mov byte ptr es:[di],bl
\r
230 ; routine for dy >= dx (slope <= 1)
\r
234 mov bh,byte ptr [Color]
\r
243 ; bit mask not shifted out
\r
262 ; bit mask shifted out
\r
279 ; routine for dy > dx (slope > 1)
\r