;------------------------------------------------------------------------------- ;@doc:file ; ; === Line.asm === ; ; Provides methods for drawing lines. ; ;@doc:end ;------------------------------------------------------------------------------- .module Line ;------------------------------------------------------------------------------- ;@doc:routine ; ; === Line.Draw === ; ; Draws a line. The line must have been clipped beforehand. This code must ; run from RAM. It is 175 bytes in size. ; ; INPUTS: ; REGISTERS ; * B = X coordinate of start of line. ; * C = Y coordinate of start of line. ; * D = X coordinate of end of line. ; * E = Y coordinate of end of line. ; ; DESTROYED ; * AF, BC, DE, HL ; ;@doc:end ;------------------------------------------------------------------------------- DrawCode $ = statVars Draw exx Style = $+1 ld hl,$0404 ld d,1 exx DrawQuickQuit ld hl,$2B02 ; DEC HL, RLC D ld a,b sub d jr nc,+ ld hl,$230A ; INC HL, RRC D neg + ; a = | b - d | ld (AbsDX1),a ld (AbsDX2),a ld a,l ld (PixelMaskShift1),a ld (PixelMaskShift2),a ld a,h ld (PixelMaskMove1),a ld (PixelMaskMove2),a ld hl,-12 ld a,c sub e jr nc,+ neg ld hl,+12 + ; a = | c - e | ld (AbsDY1),a ld (AbsDY2),a ld (AbsDYCheckSteepness),a ld (RowMove1),hl ld (RowMove2),hl ; Retrieve pixel info for starting point. ld a,b ld l,c call GetPixelInfo PixelMaskOp = $+0 nop ld d,a ; d = pixel mask ld a,(AbsDX1) AbsDYCheckSteepness = $+1 cp $55 jr c,LineIsSteep inc a ld b,a ; b = AbsDX + 1 neg sra a ld c,a - ; Do we draw the line? exx dec h jr nz,+ ld h,l inc d + bit 0,d exx jr z,ShallowLineSkipDraw ld a,d LinePutOp1 = $+0 or (hl) ld (hl),a ShallowLineSkipDraw PixelMaskShift1 = $+1 rrc d PixelMaskShiftRpt1 = $+0 jr nc,+ PixelMaskMove1 = $+0 inc hl + AbsDY1 = $+1 ld a,$55 add a,c ld c,a jp m,+ push de RowMove1 = $+1 ld de,12 add hl,de pop de AbsDX1 = $+1 ld c,$55 sub c ld c,a + djnz - ret LineIsSteep ld a,(AbsDY1) inc a ld b,a ; b = AbsDY + 1 neg sra a ld c,a - ; Do we draw the line? exx dec h jr nz,+ ld h,l inc d + bit 0,d exx jr z,SteepLineSkipDraw ld a,d LinePutOp2 = $+0 or (hl) ld (hl),a SteepLineSkipDraw push de RowMove2 = $+1 ld de,12 add hl,de pop de AbsDX2 = $+1 ld a,$55 add a,c ld c,a jp m,++ PixelMaskShift2 = $+1 rrc d PixelMaskShiftRpt2 = $+0 jr nc,+ PixelMaskMove2 = $+0 inc hl + AbsDY2 = $+1 ld c,$55 sub c ld c,a ++ djnz - ret DrawEnd .if $>$8B00 .echoln "Line.DrawCode overflows into interrupt jump table." .endif $ = @ DrawCodeEnd ;------------------------------------------------------------------------------- ;@doc:routine ; ; === Line.SetColourXor === ; ; Makes subsequent calls to Line.Draw XOR a line. ; ; DESTROYED: ; REGISTERS ; * A ; ;@doc:end ;------------------------------------------------------------------------------- SetColourXor push hl ld hl,DrawPointE ld (EllipsePixelPutter),hl pop hl ld a,$AE ; XOR (HL) jr + ;------------------------------------------------------------------------------- ;@doc:routine ; ; === Line.SetColourBlack === ; ; Makes subsequent calls to Line.Draw draw black lines. ; ; DESTROYED: ; REGISTERS ; * A ; ;@doc:end ;------------------------------------------------------------------------------- SetColourBlack push hl ld hl,DrawPointB ld (EllipsePixelPutter),hl pop hl ld a,$B6 ; OR (HL) + ld (LinePutOp1),a ld (LinePutOp2),a ld a,$21 ; LD HL, nn ld (DrawQuickQuit),a ld a,$00 ; NOP ld (PixelMaskOp),a ld a,$30 ; JR NC ld (PixelMaskShiftRpt1),a ld (PixelMaskShiftRpt2),a ret ;------------------------------------------------------------------------------- ;@doc:routine ; ; === Line.SetColourWhite === ; ; Makes subsequent calls to Line.Draw draw white lines. ; ; DESTROYED: ; REGISTERS ; * A ; ;@doc:end ;------------------------------------------------------------------------------- SetColourWhite push hl ld hl,DrawPointW ld (EllipsePixelPutter),hl pop hl ld a,$21 ; LD HL, nn ld (DrawQuickQuit),a ld a,$A6 ; AND (HL) ld (LinePutOp1),a ld (LinePutOp2),a ld a,$2F ; NOP ld (PixelMaskOp),a ld a,$38 ; JR C ld (PixelMaskShiftRpt1),a ld (PixelMaskShiftRpt2),a ret ;------------------------------------------------------------------------------- ;@doc:routine ; ; === Line.SetColourWhite === ; ; Makes subsequent calls to Line.Draw draw white lines. ; ; DESTROYED: ; REGISTERS ; * A ; ;@doc:end ;------------------------------------------------------------------------------- SetColourInvisible push hl ld hl,DrawPointNop ld (EllipsePixelPutter),hl pop hl ld a,$C9 ; RET ld (DrawQuickQuit),a ret .endmodule