mirror of
https://github.com/cc65/cc65.git
synced 2025-01-13 09:31:53 +00:00
fixed line drawing routines
git-svn-id: svn://svn.cc65.org/cc65/trunk@2282 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
67a7e672b1
commit
7cc6ab0c16
@ -696,63 +696,70 @@ HORLINE:
|
|||||||
;
|
;
|
||||||
|
|
||||||
LINE:
|
LINE:
|
||||||
; if (x2>x1) {
|
; nx = abs(x2 - x1)
|
||||||
ldx #X1
|
|
||||||
lda X2
|
|
||||||
ldy X2+1
|
|
||||||
jsr icmp
|
|
||||||
bcc @L0137
|
|
||||||
beq @L0137
|
|
||||||
; x2<->x1 }
|
|
||||||
lda X1
|
|
||||||
ldx X2
|
|
||||||
sta X2
|
|
||||||
stx X1
|
|
||||||
lda X1+1
|
|
||||||
ldx X2+1
|
|
||||||
sta X2+1
|
|
||||||
stx X1+1
|
|
||||||
@L0137: ; if (y2>y1) {
|
|
||||||
ldx #Y1
|
|
||||||
lda Y2
|
|
||||||
ldy Y2+1
|
|
||||||
jsr icmp
|
|
||||||
bcc @L013F
|
|
||||||
bne @nequal
|
|
||||||
jmp HORLINE ; x1/x2 are sorted, y1==y2 - do faster horizontal line draw
|
|
||||||
@nequal:
|
|
||||||
; y2<->y1 }
|
|
||||||
lda Y1
|
|
||||||
ldx Y2
|
|
||||||
sta Y2
|
|
||||||
stx Y1
|
|
||||||
lda Y1+1
|
|
||||||
ldx Y2+1
|
|
||||||
sta Y2+1
|
|
||||||
stx Y1+1
|
|
||||||
@L013F:
|
|
||||||
; nx = x2 - x1
|
|
||||||
lda X2
|
lda X2
|
||||||
sec
|
sec
|
||||||
sbc X1
|
sbc X1
|
||||||
sta NX
|
sta NX
|
||||||
lda X2+1
|
lda X2+1
|
||||||
sbc X1+1
|
sbc X1+1
|
||||||
sta NX+1
|
tay
|
||||||
; ny = y2 - y1
|
lda NX
|
||||||
|
jsr abs
|
||||||
|
sta NX
|
||||||
|
sty NX+1
|
||||||
|
; ny = abs(y2 - y1)
|
||||||
lda Y2
|
lda Y2
|
||||||
sec
|
sec
|
||||||
sbc Y1
|
sbc Y1
|
||||||
sta NY
|
sta NY
|
||||||
lda Y2+1
|
lda Y2+1
|
||||||
sbc Y1+1
|
sbc Y1+1
|
||||||
sta NY+1
|
tay
|
||||||
|
lda NY
|
||||||
|
jsr abs
|
||||||
|
sta NY
|
||||||
|
sty NY+1
|
||||||
|
; if (x2>x1)
|
||||||
|
ldx #X2
|
||||||
|
lda X1
|
||||||
|
ldy X1+1
|
||||||
|
jsr icmp
|
||||||
|
bcc @L0243
|
||||||
|
beq @L0243
|
||||||
|
; dx = 1;
|
||||||
|
lda #1
|
||||||
|
bne @L0244
|
||||||
|
; else
|
||||||
|
; dx = -1;
|
||||||
|
@L0243: lda #$ff
|
||||||
|
@L0244: sta DX
|
||||||
|
; if (y2>y1)
|
||||||
|
ldx #Y2
|
||||||
|
lda Y1
|
||||||
|
ldy Y1+1
|
||||||
|
jsr icmp
|
||||||
|
bcc @L024A
|
||||||
|
beq @L024A
|
||||||
|
; dy = 1;
|
||||||
|
lda #1
|
||||||
|
bne @L024B
|
||||||
|
; else
|
||||||
|
; dy = -1;
|
||||||
|
@L024A: lda #$ff
|
||||||
|
@L024B: sta DY
|
||||||
|
; err = ay = 0;
|
||||||
|
lda #0
|
||||||
|
sta ERR
|
||||||
|
sta ERR+1
|
||||||
|
sta AY
|
||||||
|
|
||||||
; if (nx<ny) {
|
; if (nx<ny) {
|
||||||
ldx #NX
|
ldx #NX
|
||||||
lda NY
|
lda NY
|
||||||
ldy NY+1
|
ldy NY+1
|
||||||
jsr icmp
|
jsr icmp
|
||||||
bcs @L041B
|
bcs @L0255
|
||||||
; nx <-> ny
|
; nx <-> ny
|
||||||
lda NX
|
lda NX
|
||||||
ldx NY
|
ldx NY
|
||||||
@ -762,21 +769,19 @@ LINE:
|
|||||||
ldx NY+1
|
ldx NY+1
|
||||||
sta NY+1
|
sta NY+1
|
||||||
stx NX+1
|
stx NX+1
|
||||||
; dx = dy = 0; ax = ay = 1 }
|
; ay = dx
|
||||||
ldy #1
|
lda DX
|
||||||
sty AY
|
sta AY
|
||||||
dey
|
; dx = dy = 0;
|
||||||
beq @L025A
|
|
||||||
; else { dx = dy = 1; ax = ay = 0 }
|
|
||||||
@L041B: ldy #0
|
|
||||||
sty AY
|
|
||||||
iny
|
|
||||||
@L025A: sty DX
|
|
||||||
sty DY
|
|
||||||
; err = 0
|
|
||||||
lda #0
|
lda #0
|
||||||
sta ERR
|
sta DX
|
||||||
sta ERR+1
|
sta DY
|
||||||
|
; ny = - ny;
|
||||||
|
@L0255: lda NY
|
||||||
|
ldy NY+1
|
||||||
|
jsr neg
|
||||||
|
sta NY
|
||||||
|
sty NY+1
|
||||||
; for (count=nx;count>0;--count) {
|
; for (count=nx;count>0;--count) {
|
||||||
lda NX
|
lda NX
|
||||||
ldx NX+1
|
ldx NX+1
|
||||||
@ -788,13 +793,13 @@ LINE:
|
|||||||
rts
|
rts
|
||||||
; setpixel(X1,Y1)
|
; setpixel(X1,Y1)
|
||||||
@L0167: jsr SETPIXELCLIP
|
@L0167: jsr SETPIXELCLIP
|
||||||
; pb = err - ny
|
; pb = err + ny
|
||||||
lda ERR
|
lda ERR
|
||||||
sec
|
clc
|
||||||
sbc NY
|
adc NY
|
||||||
sta PB
|
sta PB
|
||||||
lda ERR+1
|
lda ERR+1
|
||||||
sbc NY+1
|
adc NY+1
|
||||||
sta PB+1
|
sta PB+1
|
||||||
tax
|
tax
|
||||||
; ub = pb + nx
|
; ub = pb + nx
|
||||||
@ -806,21 +811,27 @@ LINE:
|
|||||||
adc NX+1
|
adc NX+1
|
||||||
sta UB+1
|
sta UB+1
|
||||||
; x1 = x1 + dx
|
; x1 = x1 + dx
|
||||||
lda X1
|
ldx #0
|
||||||
clc
|
lda DX
|
||||||
adc DX
|
bpl @L027B
|
||||||
|
dex
|
||||||
|
@L027B: clc
|
||||||
|
adc X1
|
||||||
sta X1
|
sta X1
|
||||||
bcc @L0254
|
txa
|
||||||
inc X1+1
|
adc X1+1
|
||||||
|
sta X1+1
|
||||||
; y1 = y1 + ay
|
; y1 = y1 + ay
|
||||||
@L0254:
|
ldx #0
|
||||||
lda Y1
|
lda AY
|
||||||
clc
|
bpl @L027E
|
||||||
adc AY
|
dex
|
||||||
|
@L027E: clc
|
||||||
|
adc Y1
|
||||||
sta Y1
|
sta Y1
|
||||||
bcc @L0255
|
txa
|
||||||
inc Y1+1
|
adc Y1+1
|
||||||
@L0255:
|
sta Y1+1
|
||||||
; if (abs(pb)<abs(ub)) {
|
; if (abs(pb)<abs(ub)) {
|
||||||
lda PB
|
lda PB
|
||||||
ldy PB+1
|
ldy PB+1
|
||||||
@ -832,32 +843,38 @@ LINE:
|
|||||||
jsr abs
|
jsr abs
|
||||||
ldx #TEMP3
|
ldx #TEMP3
|
||||||
jsr icmp
|
jsr icmp
|
||||||
bpl @L017B
|
bpl @L027F
|
||||||
; err = pb
|
; err = pb
|
||||||
lda PB
|
lda PB
|
||||||
ldx PB+1
|
ldx PB+1
|
||||||
jmp @L025B
|
jmp @L0312
|
||||||
; } else { x1 = x1 + ay
|
; } else { x1 = x1 + ay
|
||||||
@L017B:
|
@L027F:
|
||||||
lda X1
|
ldx #0
|
||||||
clc
|
lda AY
|
||||||
adc AY
|
bpl @L0288
|
||||||
|
dex
|
||||||
|
@L0288: clc
|
||||||
|
adc X1
|
||||||
sta X1
|
sta X1
|
||||||
bcc @L0256
|
txa
|
||||||
inc X1+1
|
adc X1+1
|
||||||
|
sta X1+1
|
||||||
; y1 = y1 + dy
|
; y1 = y1 + dy
|
||||||
@L0256:
|
ldx #0
|
||||||
lda Y1
|
lda DY
|
||||||
clc
|
bpl @L028B
|
||||||
adc DY
|
dex
|
||||||
|
@L028B: clc
|
||||||
|
adc Y1
|
||||||
sta Y1
|
sta Y1
|
||||||
bcc @L0257
|
txa
|
||||||
inc Y1+1
|
adc Y1+1
|
||||||
|
sta Y1+1
|
||||||
; err = ub }
|
; err = ub }
|
||||||
@L0257:
|
|
||||||
lda UB
|
lda UB
|
||||||
ldx UB+1
|
ldx UB+1
|
||||||
@L025B:
|
@L0312:
|
||||||
sta ERR
|
sta ERR
|
||||||
stx ERR+1
|
stx ERR+1
|
||||||
; } (--count)
|
; } (--count)
|
||||||
@ -1194,9 +1211,9 @@ abs:
|
|||||||
; a/y := abs(a/y)
|
; a/y := abs(a/y)
|
||||||
dey
|
dey
|
||||||
iny
|
iny
|
||||||
bpl @L1
|
bpl absend
|
||||||
; negay
|
; negay
|
||||||
clc
|
neg: clc
|
||||||
eor #$ff
|
eor #$ff
|
||||||
adc #1
|
adc #1
|
||||||
pha
|
pha
|
||||||
@ -1205,7 +1222,7 @@ abs:
|
|||||||
adc #0
|
adc #0
|
||||||
tay
|
tay
|
||||||
pla
|
pla
|
||||||
@L1: rts
|
absend: rts
|
||||||
|
|
||||||
icmp:
|
icmp:
|
||||||
; compare a/y to zp,x
|
; compare a/y to zp,x
|
||||||
|
@ -694,63 +694,70 @@ HORLINE:
|
|||||||
;
|
;
|
||||||
|
|
||||||
LINE:
|
LINE:
|
||||||
; if (x2>x1) {
|
; nx = abs(x2 - x1)
|
||||||
ldx #X1
|
|
||||||
lda X2
|
|
||||||
ldy X2+1
|
|
||||||
jsr icmp
|
|
||||||
bcc @L0137
|
|
||||||
beq @L0137
|
|
||||||
; x2<->x1 }
|
|
||||||
lda X1
|
|
||||||
ldx X2
|
|
||||||
sta X2
|
|
||||||
stx X1
|
|
||||||
lda X1+1
|
|
||||||
ldx X2+1
|
|
||||||
sta X2+1
|
|
||||||
stx X1+1
|
|
||||||
@L0137: ; if (y2>y1) {
|
|
||||||
ldx #Y1
|
|
||||||
lda Y2
|
|
||||||
ldy Y2+1
|
|
||||||
jsr icmp
|
|
||||||
bcc @L013F
|
|
||||||
bne @nequal
|
|
||||||
jmp HORLINE ; x1/x2 are sorted, y1==y2 - do faster horizontal line draw
|
|
||||||
@nequal:
|
|
||||||
; y2<->y1 }
|
|
||||||
lda Y1
|
|
||||||
ldx Y2
|
|
||||||
sta Y2
|
|
||||||
stx Y1
|
|
||||||
lda Y1+1
|
|
||||||
ldx Y2+1
|
|
||||||
sta Y2+1
|
|
||||||
stx Y1+1
|
|
||||||
@L013F:
|
|
||||||
; nx = x2 - x1
|
|
||||||
lda X2
|
lda X2
|
||||||
sec
|
sec
|
||||||
sbc X1
|
sbc X1
|
||||||
sta NX
|
sta NX
|
||||||
lda X2+1
|
lda X2+1
|
||||||
sbc X1+1
|
sbc X1+1
|
||||||
sta NX+1
|
tay
|
||||||
; ny = y2 - y1
|
lda NX
|
||||||
|
jsr abs
|
||||||
|
sta NX
|
||||||
|
sty NX+1
|
||||||
|
; ny = abs(y2 - y1)
|
||||||
lda Y2
|
lda Y2
|
||||||
sec
|
sec
|
||||||
sbc Y1
|
sbc Y1
|
||||||
sta NY
|
sta NY
|
||||||
lda Y2+1
|
lda Y2+1
|
||||||
sbc Y1+1
|
sbc Y1+1
|
||||||
sta NY+1
|
tay
|
||||||
|
lda NY
|
||||||
|
jsr abs
|
||||||
|
sta NY
|
||||||
|
sty NY+1
|
||||||
|
; if (x2>x1)
|
||||||
|
ldx #X2
|
||||||
|
lda X1
|
||||||
|
ldy X1+1
|
||||||
|
jsr icmp
|
||||||
|
bcc @L0243
|
||||||
|
beq @L0243
|
||||||
|
; dx = 1;
|
||||||
|
lda #1
|
||||||
|
bne @L0244
|
||||||
|
; else
|
||||||
|
; dx = -1;
|
||||||
|
@L0243: lda #$ff
|
||||||
|
@L0244: sta DX
|
||||||
|
; if (y2>y1)
|
||||||
|
ldx #Y2
|
||||||
|
lda Y1
|
||||||
|
ldy Y1+1
|
||||||
|
jsr icmp
|
||||||
|
bcc @L024A
|
||||||
|
beq @L024A
|
||||||
|
; dy = 1;
|
||||||
|
lda #1
|
||||||
|
bne @L024B
|
||||||
|
; else
|
||||||
|
; dy = -1;
|
||||||
|
@L024A: lda #$ff
|
||||||
|
@L024B: sta DY
|
||||||
|
; err = ay = 0;
|
||||||
|
lda #0
|
||||||
|
sta ERR
|
||||||
|
sta ERR+1
|
||||||
|
sta AY
|
||||||
|
|
||||||
; if (nx<ny) {
|
; if (nx<ny) {
|
||||||
ldx #NX
|
ldx #NX
|
||||||
lda NY
|
lda NY
|
||||||
ldy NY+1
|
ldy NY+1
|
||||||
jsr icmp
|
jsr icmp
|
||||||
bcs @L041B
|
bcs @L0255
|
||||||
; nx <-> ny
|
; nx <-> ny
|
||||||
lda NX
|
lda NX
|
||||||
ldx NY
|
ldx NY
|
||||||
@ -760,21 +767,19 @@ LINE:
|
|||||||
ldx NY+1
|
ldx NY+1
|
||||||
sta NY+1
|
sta NY+1
|
||||||
stx NX+1
|
stx NX+1
|
||||||
; dx = dy = 0; ax = ay = 1 }
|
; ay = dx
|
||||||
ldy #1
|
lda DX
|
||||||
sty AY
|
sta AY
|
||||||
dey
|
; dx = dy = 0;
|
||||||
beq @L025A
|
|
||||||
; else { dx = dy = 1; ax = ay = 0 }
|
|
||||||
@L041B: ldy #0
|
|
||||||
sty AY
|
|
||||||
iny
|
|
||||||
@L025A: sty DX
|
|
||||||
sty DY
|
|
||||||
; err = 0
|
|
||||||
lda #0
|
lda #0
|
||||||
sta ERR
|
sta DX
|
||||||
sta ERR+1
|
sta DY
|
||||||
|
; ny = - ny;
|
||||||
|
@L0255: lda NY
|
||||||
|
ldy NY+1
|
||||||
|
jsr neg
|
||||||
|
sta NY
|
||||||
|
sty NY+1
|
||||||
; for (count=nx;count>0;--count) {
|
; for (count=nx;count>0;--count) {
|
||||||
lda NX
|
lda NX
|
||||||
ldx NX+1
|
ldx NX+1
|
||||||
@ -786,13 +791,13 @@ LINE:
|
|||||||
rts
|
rts
|
||||||
; setpixel(X1,Y1)
|
; setpixel(X1,Y1)
|
||||||
@L0167: jsr SETPIXELCLIP
|
@L0167: jsr SETPIXELCLIP
|
||||||
; pb = err - ny
|
; pb = err + ny
|
||||||
lda ERR
|
lda ERR
|
||||||
sec
|
clc
|
||||||
sbc NY
|
adc NY
|
||||||
sta PB
|
sta PB
|
||||||
lda ERR+1
|
lda ERR+1
|
||||||
sbc NY+1
|
adc NY+1
|
||||||
sta PB+1
|
sta PB+1
|
||||||
tax
|
tax
|
||||||
; ub = pb + nx
|
; ub = pb + nx
|
||||||
@ -804,21 +809,27 @@ LINE:
|
|||||||
adc NX+1
|
adc NX+1
|
||||||
sta UB+1
|
sta UB+1
|
||||||
; x1 = x1 + dx
|
; x1 = x1 + dx
|
||||||
lda X1
|
ldx #0
|
||||||
clc
|
lda DX
|
||||||
adc DX
|
bpl @L027B
|
||||||
|
dex
|
||||||
|
@L027B: clc
|
||||||
|
adc X1
|
||||||
sta X1
|
sta X1
|
||||||
bcc @L0254
|
txa
|
||||||
inc X1+1
|
adc X1+1
|
||||||
|
sta X1+1
|
||||||
; y1 = y1 + ay
|
; y1 = y1 + ay
|
||||||
@L0254:
|
ldx #0
|
||||||
lda Y1
|
lda AY
|
||||||
clc
|
bpl @L027E
|
||||||
adc AY
|
dex
|
||||||
|
@L027E: clc
|
||||||
|
adc Y1
|
||||||
sta Y1
|
sta Y1
|
||||||
bcc @L0255
|
txa
|
||||||
inc Y1+1
|
adc Y1+1
|
||||||
@L0255:
|
sta Y1+1
|
||||||
; if (abs(pb)<abs(ub)) {
|
; if (abs(pb)<abs(ub)) {
|
||||||
lda PB
|
lda PB
|
||||||
ldy PB+1
|
ldy PB+1
|
||||||
@ -830,32 +841,38 @@ LINE:
|
|||||||
jsr abs
|
jsr abs
|
||||||
ldx #TEMP3
|
ldx #TEMP3
|
||||||
jsr icmp
|
jsr icmp
|
||||||
bpl @L017B
|
bpl @L027F
|
||||||
; err = pb
|
; err = pb
|
||||||
lda PB
|
lda PB
|
||||||
ldx PB+1
|
ldx PB+1
|
||||||
jmp @L025B
|
jmp @L0312
|
||||||
; } else { x1 = x1 + ay
|
; } else { x1 = x1 + ay
|
||||||
@L017B:
|
@L027F:
|
||||||
lda X1
|
ldx #0
|
||||||
clc
|
lda AY
|
||||||
adc AY
|
bpl @L0288
|
||||||
|
dex
|
||||||
|
@L0288: clc
|
||||||
|
adc X1
|
||||||
sta X1
|
sta X1
|
||||||
bcc @L0256
|
txa
|
||||||
inc X1+1
|
adc X1+1
|
||||||
|
sta X1+1
|
||||||
; y1 = y1 + dy
|
; y1 = y1 + dy
|
||||||
@L0256:
|
ldx #0
|
||||||
lda Y1
|
lda DY
|
||||||
clc
|
bpl @L028B
|
||||||
adc DY
|
dex
|
||||||
|
@L028B: clc
|
||||||
|
adc Y1
|
||||||
sta Y1
|
sta Y1
|
||||||
bcc @L0257
|
txa
|
||||||
inc Y1+1
|
adc Y1+1
|
||||||
|
sta Y1+1
|
||||||
; err = ub }
|
; err = ub }
|
||||||
@L0257:
|
|
||||||
lda UB
|
lda UB
|
||||||
ldx UB+1
|
ldx UB+1
|
||||||
@L025B:
|
@L0312:
|
||||||
sta ERR
|
sta ERR
|
||||||
stx ERR+1
|
stx ERR+1
|
||||||
; } (--count)
|
; } (--count)
|
||||||
@ -1208,9 +1225,9 @@ abs:
|
|||||||
; a/y := abs(a/y)
|
; a/y := abs(a/y)
|
||||||
dey
|
dey
|
||||||
iny
|
iny
|
||||||
bpl @L1
|
bpl absend
|
||||||
; negay
|
; negay
|
||||||
clc
|
neg: clc
|
||||||
eor #$ff
|
eor #$ff
|
||||||
adc #1
|
adc #1
|
||||||
pha
|
pha
|
||||||
@ -1219,7 +1236,7 @@ abs:
|
|||||||
adc #0
|
adc #0
|
||||||
tay
|
tay
|
||||||
pla
|
pla
|
||||||
@L1: rts
|
absend: rts
|
||||||
|
|
||||||
icmp:
|
icmp:
|
||||||
; compare a/y to zp,x
|
; compare a/y to zp,x
|
||||||
|
Loading…
x
Reference in New Issue
Block a user