From: ol.sc
Date: Thu, 29 Oct 2009 23:11:46 +0000 (+0000)
Subject: Changes to the TGI driver API:
X-Git-Tag: V2.13.1~131
X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=50c1db0331770b6751102c13302793384a167bdc;p=cc65
Changes to the TGI driver API:
* Removed CIRCLE
* Aspect ratio is a new header variable
* Removed the reserved bytes - it's easier to bump the API version
* Clipping is done completely in the wrapper
git-svn-id: svn://svn.cc65.org/cc65/trunk@4398 b7a2c559-68d2-44c3-8de9-860c34a00d81
---
diff --git a/libsrc/apple2/apple2-280-192-8.s b/libsrc/apple2/apple2-280-192-8.s
index 5b3f84600..a83ead4d5 100644
--- a/libsrc/apple2/apple2-280-192-8.s
+++ b/libsrc/apple2/apple2-280-192-8.s
@@ -3,7 +3,6 @@
;
; Stefan Haubenthal
; Oliver Schmidt
-; Based on Maciej Witkowiak's circle routine
;
.include "zeropage.inc"
@@ -69,18 +68,6 @@ X1 := ptr1
Y1 := ptr2
X2 := ptr3
Y2 := ptr4
-RADIUS := tmp1
-
-ADDR := tmp1 ; (2) SETPIXELCLIP
-TEMP := tmp3 ; icmp
-TEMP2 := tmp4 ; icmp
-XX := ptr3 ; (2) CIRCLE
-YY := ptr4 ; (2) CIRCLE
-TEMP3 := sreg ; CIRCLE
-TEMP4 := sreg+1 ; CIRCLE
-MaxO := sreg ; (overwritten by TEMP3+TEMP4, but restored from OG/OU anyway)
-XS := regsave ; (2) CIRCLE
-YS := regsave+2 ; (2) CIRCLE
; ------------------------------------------------------------------------
@@ -99,10 +86,10 @@ yres: .word 192 ; Y resolution
.byte 2 ; Number of screens available
.byte 8 ; System font X size
.byte 8 ; System font Y size
- .res 4, $00 ; Reserved for future extensions
+ .word $100 ; Aspect ratio
-; Next comes the jump table. Currently all entries must be valid and may point
-; to an RTS for test versions (function not implemented).
+; Next comes the jump table. With the exception of IRQ, all entries must be
+; valid and may point to an RTS for test versions (function not implemented).
.addr INSTALL
.addr UNINSTALL
@@ -121,7 +108,6 @@ yres: .word 192 ; Y resolution
.addr GETPIXEL
.addr LINE
.addr BAR
- .addr CIRCLE
.addr TEXTSTYLE
.addr OUTTEXT
.addr 0 ; IRQ entry is unused
@@ -138,12 +124,6 @@ ERROR: .res 1 ; Error code
Set80: .res 1 ; Set 80 column store
.endif
-; Circle stuff
-
-OGora: .res 2
-OUkos: .res 2
-Y3: .res 2
-
; ------------------------------------------------------------------------
.rodata
@@ -389,31 +369,6 @@ SETPIXEL:
bit $C080 ; Switch in LC bank 2 for R/O
rts
-SETPIXELCLIP:
- lda Y1+1
- bmi :+ ; y < 0
- lda X1+1
- bmi :+ ; x < 0
- lda X1
- ldx X1+1
- sta ADDR
- stx ADDR+1
- ldx #ADDR
- lda xres
- ldy xres+1
- jsr icmp ; ( x < xres ) ...
- bcs :+
- lda Y1
- ldx Y1+1
- sta ADDR
- stx ADDR+1
- ldx #ADDR
- lda yres
- ldy yres+1
- jsr icmp ; ... && ( y < yres )
- bcc SETPIXEL
-: rts
-
; GETPIXEL: Read the color value of a pixel and return it in A/X. The
; coordinates passed to this function are never outside the visible screen
; area, so there is no need for clipping inside this function.
@@ -476,203 +431,6 @@ BAR:
bne :-
rts
-; CIRCLE: Draw a circle around the center X1/Y1 (= ptr1/ptr2) with the
-; radius in tmp1 and the current drawing color.
-; Must set an error code: NO
-CIRCLE:
- lda RADIUS
- bne :+
- jmp SETPIXELCLIP ; Plot as a point
-: sta XX
-
- ; x = r
- lda #$00
- sta XX+1
- sta YY
- sta YY+1
- sta MaxO
- sta MaxO+1
-
- ; y = 0, mo = 0
- lda X1
- ldx X1+1
- sta XS
- stx XS+1
- lda Y1
- ldx Y1+1
- sta YS
- stx YS+1 ; XS/YS to remember the center
-
- ; while (y < x) {
-while: ldx #YY
- lda XX
- ldy XX+1
- jsr icmp
- bcc :+
- rts
-
- ; Plot points in 8 slices...
-: lda XS
- add XX
- sta X1
- lda XS+1
- adc XX+1
- sta X1+1 ; x1 = xs + x
- lda YS
- add YY
- sta Y1
- pha
- lda YS+1
- adc YY+1
- sta Y1+1 ; (stack) = ys + y, y1 = (stack)
- pha
- jsr SETPIXELCLIP ; plot (xs + x, ys + y)
- lda YS
- sub YY
- sta Y1
- sta Y3
- lda YS+1
- sbc YY+1
- sta Y1+1 ; y3 = y1 = ys - y
- sta Y3+1
- jsr SETPIXELCLIP ; plot (xs + x, ys - y)
- pla
- sta Y1+1
- pla
- sta Y1 ; y1 = ys + y
- lda XS
- sub XX
- sta X1
- lda XS+1
- sbc XX+1
- sta X1+1
- jsr SETPIXELCLIP ; plot (xs - x, ys + y)
- lda Y3
- sta Y1
- lda Y3+1
- sta Y1+1
- jsr SETPIXELCLIP ; plot (xs - x, ys - y)
-
- lda XS
- add YY
- sta X1
- lda XS+1
- adc YY+1
- sta X1+1 ; x1 = xs + y
- lda YS
- add XX
- sta Y1
- pha
- lda YS+1
- adc XX+1
- sta Y1+1 ; (stack) = ys + x, y1 = (stack)
- pha
- jsr SETPIXELCLIP ; plot (xs + y, ys + x)
- lda YS
- sub XX
- sta Y1
- sta Y3
- lda YS+1
- sbc XX+1
- sta Y1+1 ; y3 = y1 = ys - x
- sta Y3+1
- jsr SETPIXELCLIP ; plot (xs + y, ys - x)
- pla
- sta Y1+1
- pla
- sta Y1 ; y1 = ys + x(stack)
- lda XS
- sub YY
- sta X1
- lda XS+1
- sbc YY+1
- sta X1+1
- jsr SETPIXELCLIP ; plot (xs - y, ys + x)
- lda Y3
- sta Y1
- lda Y3+1
- sta Y1+1
- jsr SETPIXELCLIP ; plot (xs - y, ys - x)
-
- ; og = mo + y + y + 1
- lda MaxO
- ldx MaxO+1
- add YY
- tay
- txa
- adc YY+1
- tax
- tya
- add YY
- tay
- txa
- adc YY+1
- tax
- tya
- add #$01
- bcc :+
- inx
-: sta OGora
- stx OGora+1
-
- ; ou = og - x - x + 1
- sub XX
- tay
- txa
- sbc XX+1
- tax
- tya
- sub XX
- tay
- txa
- sbc XX+1
- tax
- tya
- add #$01
- bcc :+
- inx
-: sta OUkos
- stx OUkos+1
-
- ; ++y
- inc YY
- bne :+
- inc YY+1
-
- ; if (abs (ou) < abs (og)) {
-: lda OUkos
- ldy OUkos+1
- jsr abs
- sta TEMP3
- sty TEMP4
- lda OGora
- ldy OGora+1
- jsr abs
- ldx #TEMP3
- jsr icmp
- bpl :++
-
- ; --x
- lda XX
- sub #$01
- sta XX
- bcs :+
- dec XX+1
-
- ; mo = ou }
-: lda OUkos
- ldx OUkos+1
- jmp :++
-
- ; else mo = og
-: lda OGora
- ldx OGora+1
-: sta MaxO
- stx MaxO+1
-
- ; }
- jmp while
-
; TEXTSTYLE: Set the style used when calling OUTTEXT. Text scaling in X and Y
; direction is passend in X/Y, the text direction is passed in A.
; Must set an error code: NO
@@ -730,44 +488,3 @@ OUTTEXT:
bne :-
: 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 :+
- 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)
-
- sub TEMP2
- bne :++
- cpx TEMP
- beq :+
- adc #$FF
- ora #$01
-: rts
-: bvc :+
- eor #$FF
- ora #$01
-: rts