From e9f69ad12371c5c6645945c0a65f7331c5e60fb7 Mon Sep 17 00:00:00 2001 From: "ol.sc" Date: Sun, 24 Jan 2010 11:21:44 +0000 Subject: [PATCH] Factored out generic LINE implementation based on SETPIXEL from the three drivers previously containing the identical code. Note: Originally I planned to create a module to be linked to the driver. However this turned out to cause quite some issues with the Makefiles - especially on the Apple2 where one driver uses to generic LINE implementation and the other doesn't. The final Makefile was so ugly that I rather opted for including the code in question on source level. In order to avoid to unwanted cross dependencies the whole .inc file content is wrapped in its own scope. git-svn-id: svn://svn.cc65.org/cc65/trunk@4553 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/apple2/apple2-40-48-16.s | 294 +----------------------------- libsrc/c128/c128-640-200-2.s | 271 +--------------------------- libsrc/c128/c128-640-480-2.s | 271 +--------------------------- libsrc/tgi/tgidrv_line.inc | 310 ++++++++++++++++++++++++++++++++ 4 files changed, 327 insertions(+), 819 deletions(-) create mode 100644 libsrc/tgi/tgidrv_line.inc diff --git a/libsrc/apple2/apple2-40-48-16.s b/libsrc/apple2/apple2-40-48-16.s index 477e24a53..4ea540840 100644 --- a/libsrc/apple2/apple2-40-48-16.s +++ b/libsrc/apple2/apple2-40-48-16.s @@ -30,28 +30,13 @@ SCRN := $F871 SETGR := $FB40 HOME := $FC58 -; ------------------------------------------------------------------------ - -; Variables mapped to the zero page segment variables. Some of these are -; used for passing parameters to the driver. +; Used for passing parameters to the driver X1 := ptr1 Y1 := ptr2 X2 := ptr3 Y2 := ptr4 -TEMP := tmp3 -TEMP2 := tmp4 -TEMP3 := sreg -TEMP4 := sreg+1 - -; Line routine stuff (must be on zpage) - -PB := ptr3 ; (2) LINE -UB := ptr4 ; (2) LINE -ERR := regsave ; (2) LINE -NX := regsave+2 ; (2) LINE - ; ------------------------------------------------------------------------ .segment "JUMPTABLE" @@ -99,26 +84,13 @@ NX := regsave+2 ; (2) LINE .bss -; Absolute variables used in the code - ERROR: .res 1 ; Error code MIX: .res 1 ; 4 lines of text -; Line routine stuff - -COUNT: .res 2 -NY: .res 2 -DX: .res 1 -DY: .res 1 -AX: .res 1 -AY: .res 1 - ; ------------------------------------------------------------------------ .rodata -; Constants and tables - DEFPALETTE: .byte $00, $01, $02, $03, $04, $05, $06, $07 .byte $08, $09, $0A, $0B, $0C, $0D, $0E, $0F @@ -333,226 +305,6 @@ GETPIXEL: bit $C080 ; Switch in LC bank 2 for R/O rts -; LINE: Draw a line from X1/Y1 to X2/Y2, where X1/Y1 = ptr1/ptr2 and -; X2/Y2 = ptr3/ptr4 using the current drawing color. -; Must set an error code: NO -LINE: - ; 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 - ; BAR: Draw a filled rectangle with the corners X1/Y1, X2/Y2, where ; X1/Y1 = ptr1/ptr2 and X2/Y2 = ptr3/ptr4 using the current drawing color. ; Contrary to most other functions, the graphics kernel will sort and clip @@ -580,46 +332,6 @@ BAR: bit $C080 ; Switch in LC bank 2 for R/O rts -; 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 +; ------------------------------------------------------------------------ -icmp: - ; Compare A/Y to zp,X - sta TEMP ; TEMP/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 TEMP - beq :+ - adc #$FF - ora #$01 -: rts -: bvc :+ - eor #$FF - ora #$01 -: rts +.include "../tgi/tgidrv_line.inc" diff --git a/libsrc/c128/c128-640-200-2.s b/libsrc/c128/c128-640-200-2.s index 0dc7a7c78..6f8118932 100644 --- a/libsrc/c128/c128-640-200-2.s +++ b/libsrc/c128/c128-640-200-2.s @@ -99,17 +99,10 @@ Y1 = ptr2 X2 = ptr3 Y2 = ptr4 -ADDR = tmp1 ; (2) CALC -TEMP = tmp3 ; CALC icmp -TEMP2 = tmp4 ; icmp -TEMP3 = sreg ; LINE -TEMP4 = sreg+1 ; LINE - -; Line routine stuff (must be on zpage) -PB = ptr3 ; (2) LINE -UB = ptr4 ; (2) LINE -ERR = regsave ; (2) LINE -NX = regsave+2 ; (2) LINE +ADDR = tmp1 +TEMP = tmp3 +TEMP2 = tmp4 ; HORLINE +TEMP3 = sreg ; HORLINE ; Absolute variables used in the code @@ -124,15 +117,6 @@ BITMASK: .res 1 ; $00 = clear, $FF = set pixels OLDCOLOR: .res 1 ; colors before entering gfx mode -; Line routine stuff - -COUNT: .res 2 -NY: .res 2 -DX: .res 1 -DY: .res 1 -AX: .res 1 -AY: .res 1 - ; Text output stuff TEXTMAGX: .res 1 TEXTMAGY: .res 1 @@ -541,207 +525,6 @@ GETPIXEL: ldx #$00 ; Clear high byte rts -; ------------------------------------------------------------------------ -; LINE: Draw a line from X1/Y1 to X2/Y2, where X1/Y1 = ptr1/ptr2 and -; X2/Y2 = ptr3/ptr4 using the current drawing color. -; -; Must set an error code: NO -; - -LINE: - ; nx = abs(x2 - x1) - lda X2 - sec - sbc X1 - sta NX - lda X2+1 - sbc X1+1 - 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 - tay - lda NY - jsr abs - sta NY - sty NY+1 - ; if (x2>=x1) - ldx #X2 - lda X1 - ldy X1+1 - jsr icmp - bcc @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 - ; dy = 1; - lda #1 - bne @L024B - ; else - ; dy = -1; -@L024A: lda #$ff -@L024B: sta DY - ; err = ax = ay = 0; - lda #0 - sta ERR - sta ERR+1 - sta AX - sta AY - - ; if (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 #0 - 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 - sta COUNT - stx COUNT+1 -@L0166: lda COUNT ; count>0 - ora COUNT+1 - bne @L0167 - rts - ; setpixel(X1,Y1) -@L0167: jsr SETPIXEL - ; pb = err + ny - lda ERR - clc - adc NY - sta PB - lda ERR+1 - adc NY+1 - sta PB+1 - tax - ; ub = pb + nx - lda PB - clc - adc NX - sta UB - txa - adc NX+1 - sta UB+1 - ; x1 = x1 + dx - ldx #0 - lda DX - bpl @L027B - dex -@L027B: clc - adc X1 - sta X1 - txa - adc X1+1 - sta X1+1 - ; y1 = y1 + ay - ldx #0 - lda AY - bpl @L027E - dex -@L027E: clc - adc Y1 - sta Y1 - txa - adc Y1+1 - sta Y1+1 - ; if (abs(pb)=x1) - ldx #X2 - lda X1 - ldy X1+1 - jsr icmp - bcc @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 - ; dy = 1; - lda #1 - bne @L024B - ; else - ; dy = -1; -@L024A: lda #$ff -@L024B: sta DY - ; err = ax = ay = 0; - lda #0 - sta ERR - sta ERR+1 - sta AX - sta AY - - ; if (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 #0 - 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 - sta COUNT - stx COUNT+1 -@L0166: lda COUNT ; count>0 - ora COUNT+1 - bne @L0167 - rts - ; setpixel(X1,Y1) -@L0167: jsr SETPIXEL - ; pb = err + ny - lda ERR - clc - adc NY - sta PB - lda ERR+1 - adc NY+1 - sta PB+1 - tax - ; ub = pb + nx - lda PB - clc - adc NX - sta UB - txa - adc NX+1 - sta UB+1 - ; x1 = x1 + dx - ldx #0 - lda DX - bpl @L027B - dex -@L027B: clc - adc X1 - sta X1 - txa - adc X1+1 - sta X1+1 - ; y1 = y1 + ay - ldx #0 - lda AY - bpl @L027E - dex -@L027E: clc - adc Y1 - sta Y1 - txa - adc Y1+1 - sta Y1+1 - ; if (abs(pb) +; +; Generic LINE implementation based on SETPIXEL for TGI driver inclusion +; Code previously present in a2.lo.tgi, c128-vdc.tgi and c128-vdc2.tgi +; + +; ------------------------------------------------------------------------ + +; LINE: Draw a line from X1/Y1 to X2/Y2, where X1/Y1 = ptr1/ptr2 and +; X2/Y2 = ptr3/ptr4 using the current drawing color. +; Must set an error code: NO + + .proc LINE + +; Used for passing parameters to the driver. + +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 + +; ------------------------------------------------------------------------ + + .bss + +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 + + +; 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 + +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 -- 2.39.5