From 7cc6ab0c16fc28d5800cd78e5e395016e118f8e3 Mon Sep 17 00:00:00 2001 From: izydorst Date: Tue, 12 Aug 2003 15:39:39 +0000 Subject: [PATCH] fixed line drawing routines git-svn-id: svn://svn.cc65.org/cc65/trunk@2282 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/c128/c128-640-200-2.s | 195 +++++++++++++++++++---------------- libsrc/c128/c128-640-480-2.s | 195 +++++++++++++++++++---------------- 2 files changed, 212 insertions(+), 178 deletions(-) diff --git a/libsrc/c128/c128-640-200-2.s b/libsrc/c128/c128-640-200-2.s index 10a7b21e5..c43601fbc 100644 --- a/libsrc/c128/c128-640-200-2.s +++ b/libsrc/c128/c128-640-200-2.s @@ -696,63 +696,70 @@ HORLINE: ; LINE: - ; if (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 + ; nx = abs(x2 - x1) lda X2 sec sbc X1 sta NX lda X2+1 sbc X1+1 - sta NX+1 - ; ny = y2 - y1 + tay + lda NX + jsr abs + sta NX + sty NX+1 + ; ny = abs(y2 - y1) lda Y2 sec sbc Y1 sta NY lda Y2+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 lda NX ldx NY @@ -762,21 +769,19 @@ LINE: ldx NY+1 sta NY+1 stx NX+1 - ; dx = dy = 0; ax = ay = 1 } - ldy #1 - sty AY - dey - beq @L025A - ; else { dx = dy = 1; ax = ay = 0 } -@L041B: ldy #0 - sty AY - iny -@L025A: sty DX - sty DY - ; err = 0 + ; ay = dx + lda DX + sta AY + ; dx = dy = 0; lda #0 - sta ERR - sta ERR+1 + sta DX + sta DY + ; ny = - ny; +@L0255: lda NY + ldy NY+1 + jsr neg + sta NY + sty NY+1 ; for (count=nx;count>0;--count) { lda NX ldx NX+1 @@ -788,13 +793,13 @@ LINE: rts ; setpixel(X1,Y1) @L0167: jsr SETPIXELCLIP - ; pb = err - ny + ; pb = err + ny lda ERR - sec - sbc NY + clc + adc NY sta PB lda ERR+1 - sbc NY+1 + adc NY+1 sta PB+1 tax ; ub = pb + nx @@ -806,21 +811,27 @@ LINE: adc NX+1 sta UB+1 ; x1 = x1 + dx - lda X1 - clc - adc DX + ldx #0 + lda DX + bpl @L027B + dex +@L027B: clc + adc X1 sta X1 - bcc @L0254 - inc X1+1 + txa + adc X1+1 + sta X1+1 ; y1 = y1 + ay -@L0254: - lda Y1 - clc - adc AY + ldx #0 + lda AY + bpl @L027E + dex +@L027E: clc + adc Y1 sta Y1 - bcc @L0255 - inc Y1+1 -@L0255: + txa + adc Y1+1 + sta Y1+1 ; if (abs(pb)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 + ; nx = abs(x2 - x1) lda X2 sec sbc X1 sta NX lda X2+1 sbc X1+1 - sta NX+1 - ; ny = y2 - y1 + tay + lda NX + jsr abs + sta NX + sty NX+1 + ; ny = abs(y2 - y1) lda Y2 sec sbc Y1 sta NY lda Y2+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 lda NX ldx NY @@ -760,21 +767,19 @@ LINE: ldx NY+1 sta NY+1 stx NX+1 - ; dx = dy = 0; ax = ay = 1 } - ldy #1 - sty AY - dey - beq @L025A - ; else { dx = dy = 1; ax = ay = 0 } -@L041B: ldy #0 - sty AY - iny -@L025A: sty DX - sty DY - ; err = 0 + ; ay = dx + lda DX + sta AY + ; dx = dy = 0; lda #0 - sta ERR - sta ERR+1 + sta DX + sta DY + ; ny = - ny; +@L0255: lda NY + ldy NY+1 + jsr neg + sta NY + sty NY+1 ; for (count=nx;count>0;--count) { lda NX ldx NX+1 @@ -786,13 +791,13 @@ LINE: rts ; setpixel(X1,Y1) @L0167: jsr SETPIXELCLIP - ; pb = err - ny + ; pb = err + ny lda ERR - sec - sbc NY + clc + adc NY sta PB lda ERR+1 - sbc NY+1 + adc NY+1 sta PB+1 tax ; ub = pb + nx @@ -804,21 +809,27 @@ LINE: adc NX+1 sta UB+1 ; x1 = x1 + dx - lda X1 - clc - adc DX + ldx #0 + lda DX + bpl @L027B + dex +@L027B: clc + adc X1 sta X1 - bcc @L0254 - inc X1+1 + txa + adc X1+1 + sta X1+1 ; y1 = y1 + ay -@L0254: - lda Y1 - clc - adc AY + ldx #0 + lda AY + bpl @L027E + dex +@L027E: clc + adc Y1 sta Y1 - bcc @L0255 - inc Y1+1 -@L0255: + txa + adc Y1+1 + sta Y1+1 ; if (abs(pb)