1
0
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:
izydorst 2003-08-12 15:39:39 +00:00
parent 67a7e672b1
commit 7cc6ab0c16
2 changed files with 212 additions and 178 deletions

View File

@ -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

View File

@ -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