From 5304a8149e0e2a7e567b6c971ebb0d5a5aab81c3 Mon Sep 17 00:00:00 2001 From: uz Date: Thu, 29 Oct 2009 20:13:56 +0000 Subject: [PATCH] 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@4396 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- asminc/tgi-kernel.inc | 7 +- include/tgi/tgi-kernel.h | 11 +- libsrc/atmos/atmos-240-200-2.s | 20 +- libsrc/c128/c128-640-200-2.s | 249 +---------------------- libsrc/c128/c128-640-480-2.s | 277 ++----------------------- libsrc/c64/c64-320-200-2.s | 359 +-------------------------------- libsrc/tgi/tgi-kernel.s | 4 +- libsrc/tgi/tgi_circle.s | 9 +- 8 files changed, 43 insertions(+), 893 deletions(-) diff --git a/asminc/tgi-kernel.inc b/asminc/tgi-kernel.inc index 14c9d4d6f..3ff27eb68 100644 --- a/asminc/tgi-kernel.inc +++ b/asminc/tgi-kernel.inc @@ -46,8 +46,8 @@ PAGECOUNT .byte 1 ; Number of screens available FONTSIZE_X .byte 1 ; System font size in X direction FONTSIZE_Y .byte 1 ; System font size in Y direction + ASPECTRATIO .word 1 ; Fixed point 8.8 format .endstruct - RESERVED .byte 4 ; Reserved for extensions JUMPTAB .struct INSTALL .addr ; INSTALL routine UNINSTALL .addr ; UNINSTALL routine @@ -66,7 +66,6 @@ GETPIXEL .addr ; GETPIXEL routine LINE .addr ; LINE routine BAR .addr ; BAR routine - CIRCLE .addr ; CIRCLE routine TEXTSTYLE .addr ; TEXTSTYLE routine OUTTEXT .addr ; OUTTEXT routine IRQ .addr ; IRQ routine @@ -76,7 +75,7 @@ ;------------------------------------------------------------------------------ ; The TGI API version, stored at TGI_HDR_VERSION -TGI_API_VERSION = $02 +TGI_API_VERSION = $03 ;------------------------------------------------------------------------------ ; Text style constants @@ -102,6 +101,7 @@ TGI_TEXT_VERTICAL = 1 .global _tgi_pagecount ; Number of available screen pages .global _tgi_fontsizex ; System font X size .global _tgi_fontsizey ; System font Y size + .global _tgi_aspectratio ; Aspect ratio, fixed point 8.8 ;------------------------------------------------------------------------------ ; Driver entry points @@ -123,7 +123,6 @@ TGI_TEXT_VERTICAL = 1 .global tgi_getpixel .global tgi_line .global tgi_bar - .global tgi_circle .global tgi_textstyle .global tgi_outtext diff --git a/include/tgi/tgi-kernel.h b/include/tgi/tgi-kernel.h index e7c02a25b..2fa820998 100644 --- a/include/tgi/tgi-kernel.h +++ b/include/tgi/tgi-kernel.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2002-2004 Ullrich von Bassewitz */ -/* Römerstraße 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2002-2009, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -44,7 +44,7 @@ -/* TGI kernel variables */ +/* TGI kernel variables */ extern void* tgi_drv; /* Pointer to driver */ extern unsigned char tgi_error; /* Last error code */ extern unsigned char tgi_gmode; /* Flag: Graphics mode active */ @@ -55,6 +55,7 @@ extern unsigned tgi_xres; /* X resolution of the current mode */ extern unsigned tgi_yres; /* Y resolution of the current mode */ extern unsigned char tgi_colorcount; /* Number of available colors */ extern unsigned char tgi_pagecount; /* Number of available screens */ +extern unsigned tgi_aspectratio;/* Aspect ratio as fixed point 8.8 */ diff --git a/libsrc/atmos/atmos-240-200-2.s b/libsrc/atmos/atmos-240-200-2.s index b5c71446f..72887db4a 100644 --- a/libsrc/atmos/atmos-240-200-2.s +++ b/libsrc/atmos/atmos-240-200-2.s @@ -29,7 +29,7 @@ .byte 1 ; Number of screens available xsize: .byte 6 ; 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). @@ -51,7 +51,6 @@ xsize: .byte 6 ; System font X size .addr GETPIXEL .addr LINE .addr BAR - .addr _CIRCLE .addr TEXTSTYLE .addr OUTTEXT .addr 0 ; IRQ entry is unused @@ -88,7 +87,6 @@ CHAR = $F12D POINT = $F1C8 PAPER = $F204 INK = $F210 -CIRCLE = $F37F .rodata @@ -350,22 +348,6 @@ BAR: bne @L1 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 #3 - jsr mymode - lda RADIUS - sta PARAM1 - lda MODE - sta PARAM2 - jmp CIRCLE - ; ------------------------------------------------------------------------ ; 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. diff --git a/libsrc/c128/c128-640-200-2.s b/libsrc/c128/c128-640-200-2.s index 3dfed639f..1a51eb903 100644 --- a/libsrc/c128/c128-640-200-2.s +++ b/libsrc/c128/c128-640-200-2.s @@ -62,7 +62,7 @@ yres: .word 200 ; Y resolution pages: .byte 1 ; 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). @@ -84,7 +84,6 @@ pages: .byte 1 ; Number of screens available .addr GETPIXEL .addr LINE .addr BAR - .addr CIRCLE .addr TEXTSTYLE .addr OUTTEXT .addr 0 ; IRQ entry is unused @@ -99,7 +98,6 @@ X1 = ptr1 Y1 = ptr2 X2 = ptr3 Y2 = ptr4 -RADIUS = tmp1 ADDR = tmp1 ; (2) CALC TEMP = tmp3 ; CALC icmp @@ -112,12 +110,6 @@ PB = ptr3 ; (2) LINE UB = ptr4 ; (2) LINE ERR = regsave ; (2) LINE NX = regsave+2 ; (2) LINE -; Circle stuff -XX = ptr3 ; (2) CIRCLE -YY = ptr4 ; (2) CIRCLE -MaxO = sreg ; (overwritten by TEMP3+TEMP4, but restored from OG/OU anyway) -XS = regsave ; (2) CIRCLE -YS = regsave+2 ; (2) CIRCLE ; Absolute variables used in the code @@ -132,13 +124,10 @@ BITMASK: .res 1 ; $00 = clear, $FF = set pixels OLDCOLOR: .res 1 ; colors before entering gfx mode -; Line routine stuff (combined with CIRCLE to save space) +; Line routine stuff -OGora: COUNT: .res 2 -OUkos: NY: .res 2 -Y3: DX: .res 1 DY: .res 1 AX: .res 1 @@ -504,31 +493,6 @@ GETDEFPALETTE: ; Must set an error code: NO ; -SETPIXELCLIP: - lda Y1+1 - bmi @finito ; y<0 - lda X1+1 - bmi @finito ; x<0 - lda X1 - ldx X1+1 - sta ADDR - stx ADDR+1 - ldx #ADDR - lda xres - ldy xres+1 - jsr icmp ; ( x < xres ) ... - bcs @finito - lda Y1 - ldx Y1+1 - sta ADDR - stx ADDR+1 - ldx #ADDR - lda yres - ldy yres+1 - jsr icmp ; ... && ( y < yres ) - bcc SETPIXEL -@finito:rts - SETPIXEL: jsr CALC ; Calculate coordinates @@ -683,7 +647,7 @@ LINE: bne @L0167 rts ; setpixel(X1,Y1) -@L0167: jsr SETPIXELCLIP +@L0167: jsr SETPIXEL ; pb = err + ny lda ERR clc @@ -917,213 +881,6 @@ HORLINE: @L5: jmp HORLINE -; ------------------------------------------------------------------------ -; 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 @L1 - jmp SETPIXELCLIP ; Plot as a point - -@L1: sta XX - ; x = r; - lda #0 - 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 (y320 - sta X2+1 - lda TEMP2 - sec - sbc #<320 - sta TEMP2 - lda TEMP2+1 - sbc #>320 - sta TEMP2+1 - - tya - dec BROW - bmi EXIT2 - rts -EXIT2: pla ;Grab return address - pla - jmp CIRCEXIT ;Restore interrupts, etc. - -; Increment upper pointers -INCYOFF: - tay - lda #00 - sta Y1 - lda X1 - clc - adc #<320 - sta X1 - lda X1+1 - adc #>320 - sta X1+1 - lda POINT - clc - adc #<320 - sta POINT - lda POINT+1 - adc #>320 - sta POINT+1 -@ISKIP: inc TROW - bmi @DONE - lda TROW - cmp #25 - bcs EXIT2 -@DONE: tya - rts - -; -; UPCHUNK1 -- Update right-moving chunk pointers -; Due to passing through a column -; -UPCHUNK1: - tax - jsr PCHUNK1 -UPCH1: lda #$FF ;Alternative entry point - sta CHUNK1 - sta OLDCH1 - lda TEMP2 - clc - adc #8 - sta TEMP2 - bcc @CONT - inc TEMP2+1 - clc -@CONT: lda POINT - adc #8 - sta POINT - bcc @DONE - inc POINT+1 -@DONE: txa - inc RCOL - rts - -; -; UPCHUNK2 -- Update left-moving chunk pointers -; -UPCHUNK2: - tax - jsr PCHUNK2 -UPCH2: lda #$FF - sta CHUNK2 - sta OLDCH2 - lda X2 - sec - sbc #8 - sta X2 - bcs @CONT - dec X2+1 - sec -@CONT: lda X1 - sbc #8 - sta X1 - bcs @DONE - dec X1+1 -@DONE: txa - dec LCOL - rts -; -; Plot right-moving chunk pairs for circle routine -; -PCHUNK1: - - lda RCOL ;Make sure we're in range - cmp #40 - bcs @SKIP2 - lda CHUNK1 ;Otherwise plot - eor OLDCH1 - sta TEMP - lda TROW ;Check for underflow - bmi @SKIP - ldy Y1 - lda (POINT),y - eor BITMASK - and TEMP - eor (POINT),y - sta (POINT),y - -@SKIP: lda BROW ;If CY+Y >= 200... - cmp #25 - bcs @SKIP2 - ldy Y2 - lda (TEMP2),y - eor BITMASK - and TEMP - eor (TEMP2),y - sta (TEMP2),y -@SKIP2: rts - -; -; Plot left-moving chunk pairs for circle routine -; - -PCHUNK2: - lda LCOL ;Range check in X - cmp #40 - bcs EXIT3 - lda CHUNK2 ;Otherwise plot - eor OLDCH2 - sta TEMP - lda TROW ;Check for underflow - bmi @SKIP - ldy Y1 - lda (X1),y - eor BITMASK - and TEMP - eor (X1),y - sta (X1),y - -@SKIP: lda BROW ;If CY+Y >= 200... - cmp #25 - bcs EXIT3 - ldy Y2 - lda (X2),y - eor BITMASK - and TEMP - eor (X2),y - sta (X2),y -EXIT3: rts - ; ------------------------------------------------------------------------ ; 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. diff --git a/libsrc/tgi/tgi-kernel.s b/libsrc/tgi/tgi-kernel.s index 6b95e1c96..1016635fc 100644 --- a/libsrc/tgi/tgi-kernel.s +++ b/libsrc/tgi/tgi-kernel.s @@ -34,6 +34,7 @@ _tgi_colorcount: .res 1 ; Number of available colors _tgi_pagecount: .res 1 ; Number of available screen pages _tgi_fontsizex: .res 1 ; System font X size _tgi_fontsizey: .res 1 ; System font Y size +_tgi_aspectratio: .res 2 ; Aspect ratio in 8.8 fixed point .data @@ -57,7 +58,6 @@ tgi_setpixel: jmp $0000 tgi_getpixel: jmp $0000 tgi_line: jmp $0000 tgi_bar: jmp $0000 -tgi_circle: jmp $0000 tgi_textstyle: jmp $0000 tgi_outtext: jmp $0000 tgi_irq: .byte $60, $00, $00 ; RTS plus two dummy bytes @@ -189,4 +189,4 @@ _tgi_uninstall: rts - + diff --git a/libsrc/tgi/tgi_circle.s b/libsrc/tgi/tgi_circle.s index ab79a1d2b..4766e5331 100644 --- a/libsrc/tgi/tgi_circle.s +++ b/libsrc/tgi/tgi_circle.s @@ -6,14 +6,11 @@ .include "tgi-kernel.inc" - .import popax - .importzp tmp1 + .import incsp4 .proc _tgi_circle - sta tmp1 ; Get the coordinates - jsr popax - jsr tgi_popxy ; Pop X/Y into ptr1/ptr2 - jmp tgi_circle ; Call the driver + ; For now + jmp incsp4 .endproc -- 2.39.5