; X2/Y2 = ptr3/ptr4 using the current drawing color.
; Must set an error code: NO
- .proc LINE
+ .proc LINE
; Used for passing parameters to the driver.
-X1 := ptr1
-Y1 := ptr2
-X2 := ptr3
-Y2 := ptr4
+X1 := ptr1
+Y1 := ptr2
+X2 := ptr3
+Y2 := ptr4
; These ones must be on zpage.
-TEMP1 := tmp3
-TEMP2 := tmp4
-TEMP3 := sreg
-TEMP4 := sreg+1
-PB := ptr3
-UB := ptr4
-ERR := regsave
-NX := regsave+2
+TEMP1 := tmp3
+TEMP2 := tmp4
+TEMP3 := sreg
+TEMP4 := sreg+1
+PB := ptr3
+UB := ptr4
+ERR := regsave
+NX := regsave+2
; ------------------------------------------------------------------------
- .bss
+ .bss
-COUNT: .res 2
-NY: .res 2
-DX: .res 1
-DY: .res 1
-AX: .res 1
-AY: .res 1
+COUNT: .res 2
+NY: .res 2
+DX: .res 1
+DY: .res 1
+AX: .res 1
+AY: .res 1
; ------------------------------------------------------------------------
- .code
-
- ; nx = abs (x2 - x1)
- sec
- lda X2
- sbc X1
- sta NX
- lda X2+1
- sbc X1+1
- tay
- lda NX
- jsr abs
- sta NX
- sty NX+1
-
- ; ny = abs (y2 - y1)
- sec
- lda Y2
- sbc Y1
- sta NY
- lda Y2+1
- sbc Y1+1
- tay
- lda NY
- jsr abs
- sta NY
- sty NY+1
-
- ; if (x2 >= x1)
- ldx #X2
- lda X1
- ldy X1+1
- jsr icmp
- bcc :+
-
- ; dx = 1
- lda #$01
- bne :++
-
- ; else
- ; dx = -1
-: lda #$FF
-: sta DX
-
- ; if (y2 >= y1)
- ldx #Y2
- lda Y1
- ldy Y1+1
- jsr icmp
- bcc :+
-
- ; dy = 1
- lda #$01
- bne :++
-
- ; else
- ; dy = -1
-: lda #$FF
-: sta DY
-
- ; err = ax = ay = 0
- lda #$00
- sta ERR
- sta ERR+1
- sta AX
- sta AY
-
- ; if (nx < ny) {
- ldx #NX
- lda NY
- ldy NY+1
- jsr icmp
- bcs :+
-
- ; nx <-> ny
- lda NX
- ldx NY
- sta NY
- stx NX
- lda NX+1
- ldx NY+1
- sta NY+1
- stx NX+1
-
- ; ax = dx
- lda DX
- sta AX
-
- ; ay = dy
- lda DY
- sta AY
-
- ; dx = dy = 0 }
- lda #$00
- sta DX
- sta DY
-
- ; ny = - ny
-: lda NY
- ldy NY+1
- jsr neg
- sta NY
- sty NY+1
-
- ; for (count = nx; count > 0; --count) {
- lda NX
- ldx NX+1
- sta COUNT
- stx COUNT+1
-for: lda COUNT ; count > 0
- ora COUNT+1
- bne :+
- rts
-
- ; setpixel (X1, Y1)
-: jsr SETPIXEL
-
- ; pb = err + ny
- clc
- lda ERR
- adc NY
- sta PB
- lda ERR+1
- adc NY+1
- sta PB+1
- tax
-
- ; ub = pb + nx
- clc
- lda PB
- adc NX
- sta UB
- txa
- adc NX+1
- sta UB+1
-
- ; x1 = x1 + dx
- ldx #$00
- lda DX
- bpl :+
- dex
-: clc
- adc X1
- sta X1
- txa
- adc X1+1
- sta X1+1
-
- ; y1 = y1 + ay
- ldx #$00
- lda AY
- bpl :+
- dex
-: clc
- adc Y1
- sta Y1
- txa
- adc Y1+1
- sta Y1+1
-
- ; if (abs (pb) < abs (ub)) {
- lda PB
- ldy PB+1
- jsr abs
- sta TEMP3
- sty TEMP4
- lda UB
- ldy UB+1
- jsr abs
- ldx #TEMP3
- jsr icmp
- bpl :+
-
- ; err = pb }
- lda PB
- ldx PB+1
- jmp next
-
- ; else { x1 = x1 + ax
-: ldx #$00
- lda AX
- bpl :+
- dex
-: clc
- adc X1
- sta X1
- txa
- adc X1+1
- sta X1+1
-
- ; y1 = y1 + dy
- ldx #$00
- lda DY
- bpl :+
- dex
-: clc
- adc Y1
- sta Y1
- txa
- adc Y1+1
- sta Y1+1
-
- ; err = ub }
- lda UB
- ldx UB+1
-next: sta ERR
- stx ERR+1
-
- ; } (--count)
- lda COUNT
- sec
- sbc #$01
- sta COUNT
- bcc :+
- jmp for
-: dec COUNT+1
- jmp for
+ .code
+
+ ; nx = abs (x2 - x1)
+ sec
+ lda X2
+ sbc X1
+ sta NX
+ lda X2+1
+ sbc X1+1
+ tay
+ lda NX
+ jsr abs
+ sta NX
+ sty NX+1
+
+ ; ny = abs (y2 - y1)
+ sec
+ lda Y2
+ sbc Y1
+ sta NY
+ lda Y2+1
+ sbc Y1+1
+ tay
+ lda NY
+ jsr abs
+ sta NY
+ sty NY+1
+
+ ; if (x2 >= x1)
+ ldx #X2
+ lda X1
+ ldy X1+1
+ jsr icmp
+ bcc :+
+
+ ; dx = 1
+ lda #$01
+ bne :++
+
+ ; else
+ ; dx = -1
+: lda #$FF
+: sta DX
+
+ ; if (y2 >= y1)
+ ldx #Y2
+ lda Y1
+ ldy Y1+1
+ jsr icmp
+ bcc :+
+
+ ; dy = 1
+ lda #$01
+ bne :++
+
+ ; else
+ ; dy = -1
+: lda #$FF
+: sta DY
+
+ ; err = ax = ay = 0
+ lda #$00
+ sta ERR
+ sta ERR+1
+ sta AX
+ sta AY
+
+ ; if (nx < ny) {
+ ldx #NX
+ lda NY
+ ldy NY+1
+ jsr icmp
+ bcs :+
+
+ ; nx <-> ny
+ lda NX
+ ldx NY
+ sta NY
+ stx NX
+ lda NX+1
+ ldx NY+1
+ sta NY+1
+ stx NX+1
+
+ ; ax = dx
+ lda DX
+ sta AX
+
+ ; ay = dy
+ lda DY
+ sta AY
+
+ ; dx = dy = 0 }
+ lda #$00
+ sta DX
+ sta DY
+
+ ; ny = - ny
+: lda NY
+ ldy NY+1
+ jsr neg
+ sta NY
+ sty NY+1
+
+ ; for (count = nx; count > 0; --count) {
+ lda NX
+ ldx NX+1
+ sta COUNT
+ stx COUNT+1
+for: lda COUNT ; count > 0
+ ora COUNT+1
+ bne :+
+ rts
+
+ ; setpixel (X1, Y1)
+: jsr SETPIXEL
+
+ ; pb = err + ny
+ clc
+ lda ERR
+ adc NY
+ sta PB
+ lda ERR+1
+ adc NY+1
+ sta PB+1
+ tax
+
+ ; ub = pb + nx
+ clc
+ lda PB
+ adc NX
+ sta UB
+ txa
+ adc NX+1
+ sta UB+1
+
+ ; x1 = x1 + dx
+ ldx #$00
+ lda DX
+ bpl :+
+ dex
+: clc
+ adc X1
+ sta X1
+ txa
+ adc X1+1
+ sta X1+1
+
+ ; y1 = y1 + ay
+ ldx #$00
+ lda AY
+ bpl :+
+ dex
+: clc
+ adc Y1
+ sta Y1
+ txa
+ adc Y1+1
+ sta Y1+1
+
+ ; if (abs (pb) < abs (ub)) {
+ lda PB
+ ldy PB+1
+ jsr abs
+ sta TEMP3
+ sty TEMP4
+ lda UB
+ ldy UB+1
+ jsr abs
+ ldx #TEMP3
+ jsr icmp
+ bpl :+
+
+ ; err = pb }
+ lda PB
+ ldx PB+1
+ jmp next
+
+ ; else { x1 = x1 + ax
+: ldx #$00
+ lda AX
+ bpl :+
+ dex
+: clc
+ adc X1
+ sta X1
+ txa
+ adc X1+1
+ sta X1+1
+
+ ; y1 = y1 + dy
+ ldx #$00
+ lda DY
+ bpl :+
+ dex
+: clc
+ adc Y1
+ sta Y1
+ txa
+ adc Y1+1
+ sta Y1+1
+
+ ; err = ub }
+ lda UB
+ ldx UB+1
+next: sta ERR
+ stx ERR+1
+
+ ; } (--count)
+ lda COUNT
+ sec
+ sbc #$01
+ sta COUNT
+ bcc :+
+ jmp for
+: dec COUNT+1
+ jmp for
; Copies of some runtime routines
abs:
- ; A/Y := abs (A/Y)
- cpy #$00
- bpl :+
-
- ; A/Y := neg (A/Y)
-neg: clc
- eor #$FF
- adc #$01
- pha
- tya
- eor #$FF
- adc #$00
- tay
- pla
-: rts
+ ; A/Y := abs (A/Y)
+ cpy #$00
+ bpl :+
+
+ ; A/Y := neg (A/Y)
+neg: clc
+ eor #$FF
+ adc #$01
+ pha
+ tya
+ eor #$FF
+ adc #$00
+ tay
+ pla
+: rts
icmp:
- ; Compare A/Y to zp,X
- sta TEMP1 ; TEMP1/TEMP2 - arg2
- sty TEMP2
- lda $00,x
- pha
- lda $01,x
- tay
- pla
- tax
- tya ; X/A - arg1 (a = high)
-
- sec
- sbc TEMP2
- bne :++
- cpx TEMP1
- beq :+
- adc #$FF
- ora #$01
-: rts
-: bvc :+
- eor #$FF
- ora #$01
-: rts
-
- .endproc
+ ; Compare A/Y to zp,X
+ sta TEMP1 ; TEMP1/TEMP2 - arg2
+ sty TEMP2
+ lda $00,x
+ pha
+ lda $01,x
+ tay
+ pla
+ tax
+ tya ; X/A - arg1 (a = high)
+
+ sec
+ sbc TEMP2
+ bne :++
+ cpx TEMP1
+ beq :+
+ adc #$FF
+ ora #$01
+: rts
+: bvc :+
+ eor #$FF
+ ora #$01
+: rts
+
+ .endproc