; Z80 ; FASTLINE 1.0 ; ; BRESENHAM'S LINE ALGORITHM ; by Jimmy M†rdell ; ; Parameters: BC = memory area to draw line (usually $FC00) ; DE,HL = coordinates of line (D,E)-(H,L) ; 0 < D,H < 128, 0 < E,L < 64 ; ; Code size: 145 bytes (excluding FindPixel) ; ; Registers: AF destroyed. ; ; Performance: 4 times faster than Stephane Jantzens line routine ; ; Delta_X > Delta_Y => innerloop = 98.50 T states ; Delta_Y > Delta_X => innerloop = 106.75 T states ; FLine: push bc push de push hl push bc ld a,h cp d jr nc,DXpos ex de,hl DXpos: ld b,d ld c,e pop de push hl call FindPixel add hl,de ex (sp),hl ld e,c ld c,a ld a,h sub b ld b,a ld a,l sub e ld de,16 jr nc,DYpos neg ld de,-16 DYpos: push af sub b jr nc,DY_Greater add a,a neg ld (x_ai+1),a pop af add a,a ld (XDNeg+1),a sub b pop hl push af ld a,c or (hl) ld (hl),a pop af bit 7,a jr nz,XDNeg XNewRow: add hl,de x_ai: sub 0 push af rrc c jr nc,XNoWrap1 inc hl XNoWrap1: ld a,c or (hl) ld (hl),a pop af dec b jr z,LineDone jr nc,XNewRow XDNeg: add a,0 push af rrc c jr nc,XNoWrap2 inc hl XNoWrap2: ld a,c or (hl) ld (hl),a pop af dec b jr z,LineDone jr c,XNewRow jr XDNeg DY_Greater: neg add a,a ld (YNoWrap+1),a ld a,b add a,a ld (YDNeg+1),a pop hl sub h ld b,h pop hl push af ld a,c or (hl) ld (hl),a pop af YRepeat: bit 7,a jr nz,YDNeg rrc c jr nc,YNoWrap inc hl YNoWrap: add a,0 jr YPlot YDNeg: add a,0 YPlot: add hl,de push af ld a,c or (hl) ld (hl),a pop af djnz YRepeat LineDone: pop hl pop de pop bc ret ; ; This is your default FindPixel routine. Can be exchanged with ; the famous Eble-Yopp... FindPixel routine. ; FindPixel: push bc push de ld hl,ExpTable ld d,0 ld a,b and $07 ld e,a add hl,de ld e,(hl) ld h,d srl b srl b srl b ld a,c add a,a add a,a ld l,a add hl,hl add hl,hl ld a,e ld e,b add hl,de pop de pop bc ret ExpTable: .db $80,$40,$20,$10,$08,$04,$02,$01