1
0
mirror of https://github.com/cc65/cc65.git synced 2025-01-11 11:30:13 +00:00

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
This commit is contained in:
uz 2009-10-29 20:13:56 +00:00
parent 1d9fc5f655
commit 5304a8149e
8 changed files with 43 additions and 893 deletions

View File

@ -46,8 +46,8 @@
PAGECOUNT .byte 1 ; Number of screens available PAGECOUNT .byte 1 ; Number of screens available
FONTSIZE_X .byte 1 ; System font size in X direction FONTSIZE_X .byte 1 ; System font size in X direction
FONTSIZE_Y .byte 1 ; System font size in Y direction FONTSIZE_Y .byte 1 ; System font size in Y direction
ASPECTRATIO .word 1 ; Fixed point 8.8 format
.endstruct .endstruct
RESERVED .byte 4 ; Reserved for extensions
JUMPTAB .struct JUMPTAB .struct
INSTALL .addr ; INSTALL routine INSTALL .addr ; INSTALL routine
UNINSTALL .addr ; UNINSTALL routine UNINSTALL .addr ; UNINSTALL routine
@ -66,7 +66,6 @@
GETPIXEL .addr ; GETPIXEL routine GETPIXEL .addr ; GETPIXEL routine
LINE .addr ; LINE routine LINE .addr ; LINE routine
BAR .addr ; BAR routine BAR .addr ; BAR routine
CIRCLE .addr ; CIRCLE routine
TEXTSTYLE .addr ; TEXTSTYLE routine TEXTSTYLE .addr ; TEXTSTYLE routine
OUTTEXT .addr ; OUTTEXT routine OUTTEXT .addr ; OUTTEXT routine
IRQ .addr ; IRQ routine IRQ .addr ; IRQ routine
@ -76,7 +75,7 @@
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; The TGI API version, stored at TGI_HDR_VERSION ; The TGI API version, stored at TGI_HDR_VERSION
TGI_API_VERSION = $02 TGI_API_VERSION = $03
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; Text style constants ; Text style constants
@ -102,6 +101,7 @@ TGI_TEXT_VERTICAL = 1
.global _tgi_pagecount ; Number of available screen pages .global _tgi_pagecount ; Number of available screen pages
.global _tgi_fontsizex ; System font X size .global _tgi_fontsizex ; System font X size
.global _tgi_fontsizey ; System font Y size .global _tgi_fontsizey ; System font Y size
.global _tgi_aspectratio ; Aspect ratio, fixed point 8.8
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; Driver entry points ; Driver entry points
@ -123,7 +123,6 @@ TGI_TEXT_VERTICAL = 1
.global tgi_getpixel .global tgi_getpixel
.global tgi_line .global tgi_line
.global tgi_bar .global tgi_bar
.global tgi_circle
.global tgi_textstyle .global tgi_textstyle
.global tgi_outtext .global tgi_outtext

View File

@ -6,10 +6,10 @@
/* */ /* */
/* */ /* */
/* */ /* */
/* (C) 2002-2004 Ullrich von Bassewitz */ /* (C) 2002-2009, Ullrich von Bassewitz */
/* Römerstraße 52 */ /* Roemerstrasse 52 */
/* D-70794 Filderstadt */ /* D-70794 Filderstadt */
/* EMail: uz@cc65.org */ /* EMail: uz@cc65.org */
/* */ /* */
/* */ /* */
/* This software is provided 'as-is', without any expressed or implied */ /* 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 void* tgi_drv; /* Pointer to driver */
extern unsigned char tgi_error; /* Last error code */ extern unsigned char tgi_error; /* Last error code */
extern unsigned char tgi_gmode; /* Flag: Graphics mode active */ 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 tgi_yres; /* Y resolution of the current mode */
extern unsigned char tgi_colorcount; /* Number of available colors */ extern unsigned char tgi_colorcount; /* Number of available colors */
extern unsigned char tgi_pagecount; /* Number of available screens */ extern unsigned char tgi_pagecount; /* Number of available screens */
extern unsigned tgi_aspectratio;/* Aspect ratio as fixed point 8.8 */

View File

@ -29,7 +29,7 @@
.byte 1 ; Number of screens available .byte 1 ; Number of screens available
xsize: .byte 6 ; System font X size xsize: .byte 6 ; System font X size
.byte 8 ; System font Y 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 ; Next comes the jump table. Currently all entries must be valid and may point
; to an RTS for test versions (function not implemented). ; to an RTS for test versions (function not implemented).
@ -51,7 +51,6 @@ xsize: .byte 6 ; System font X size
.addr GETPIXEL .addr GETPIXEL
.addr LINE .addr LINE
.addr BAR .addr BAR
.addr _CIRCLE
.addr TEXTSTYLE .addr TEXTSTYLE
.addr OUTTEXT .addr OUTTEXT
.addr 0 ; IRQ entry is unused .addr 0 ; IRQ entry is unused
@ -88,7 +87,6 @@ CHAR = $F12D
POINT = $F1C8 POINT = $F1C8
PAPER = $F204 PAPER = $F204
INK = $F210 INK = $F210
CIRCLE = $F37F
.rodata .rodata
@ -350,22 +348,6 @@ BAR:
bne @L1 bne @L1
rts 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 ; 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. ; direction is passend in X/Y, the text direction is passed in A.

View File

@ -62,7 +62,7 @@ yres: .word 200 ; Y resolution
pages: .byte 1 ; Number of screens available pages: .byte 1 ; Number of screens available
.byte 8 ; System font X size .byte 8 ; System font X size
.byte 8 ; System font Y 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 ; Next comes the jump table. Currently all entries must be valid and may point
; to an RTS for test versions (function not implemented). ; to an RTS for test versions (function not implemented).
@ -84,7 +84,6 @@ pages: .byte 1 ; Number of screens available
.addr GETPIXEL .addr GETPIXEL
.addr LINE .addr LINE
.addr BAR .addr BAR
.addr CIRCLE
.addr TEXTSTYLE .addr TEXTSTYLE
.addr OUTTEXT .addr OUTTEXT
.addr 0 ; IRQ entry is unused .addr 0 ; IRQ entry is unused
@ -99,7 +98,6 @@ X1 = ptr1
Y1 = ptr2 Y1 = ptr2
X2 = ptr3 X2 = ptr3
Y2 = ptr4 Y2 = ptr4
RADIUS = tmp1
ADDR = tmp1 ; (2) CALC ADDR = tmp1 ; (2) CALC
TEMP = tmp3 ; CALC icmp TEMP = tmp3 ; CALC icmp
@ -112,12 +110,6 @@ PB = ptr3 ; (2) LINE
UB = ptr4 ; (2) LINE UB = ptr4 ; (2) LINE
ERR = regsave ; (2) LINE ERR = regsave ; (2) LINE
NX = regsave+2 ; (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 ; 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 OLDCOLOR: .res 1 ; colors before entering gfx mode
; Line routine stuff (combined with CIRCLE to save space) ; Line routine stuff
OGora:
COUNT: .res 2 COUNT: .res 2
OUkos:
NY: .res 2 NY: .res 2
Y3:
DX: .res 1 DX: .res 1
DY: .res 1 DY: .res 1
AX: .res 1 AX: .res 1
@ -504,31 +493,6 @@ GETDEFPALETTE:
; Must set an error code: NO ; 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: SETPIXEL:
jsr CALC ; Calculate coordinates jsr CALC ; Calculate coordinates
@ -683,7 +647,7 @@ LINE:
bne @L0167 bne @L0167
rts rts
; setpixel(X1,Y1) ; setpixel(X1,Y1)
@L0167: jsr SETPIXELCLIP @L0167: jsr SETPIXEL
; pb = err + ny ; pb = err + ny
lda ERR lda ERR
clc clc
@ -917,213 +881,6 @@ HORLINE:
@L5: jmp 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 (y<x) {
@L013B: ldx #YY
lda XX
ldy XX+1
jsr icmp
bcc @L12
rts
@L12: ; plot points in 8 slices...
lda XS
clc
adc XX
sta X1
lda XS+1
adc XX+1
sta X1+1 ; x1 = xs+x
lda YS
clc
adc 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
sec
sbc 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
sec
sbc 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
clc
adc YY
sta X1
lda XS+1
adc YY+1
sta X1+1 ; x1 = xs+y
lda YS
clc
adc 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
sec
sbc 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
sec
sbc 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
clc
adc YY
tay
txa
adc YY+1
tax
tya
clc
adc YY
tay
txa
adc YY+1
tax
tya
clc
adc #1
bcc @L0143
inx
@L0143: sta OGora
stx OGora+1
; ou = og-x-x+1
sec
sbc XX
tay
txa
sbc XX+1
tax
tya
sec
sbc XX
tay
txa
sbc XX+1
tax
tya
clc
adc #1
bcc @L0146
inx
@L0146: sta OUkos
stx OUkos+1
; ++y
inc YY
bne @L0148
inc YY+1
@L0148: ; 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 @L0149
; { --x;
sec
lda XX
sbc #1
sta XX
bcs @L014E
dec XX+1
@L014E: ; mo = ou; }
lda OUkos
ldx OUkos+1
jmp @L014G
; else { mo = og }
@L0149: lda OGora
ldx OGora+1
@L014G: sta MaxO
stx MaxO+1
; }
jmp @L013B
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; TEXTSTYLE: Set the style used when calling OUTTEXT. Text scaling in X and Y ; 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. ; direction is passend in X/Y, the text direction is passed in A.

View File

@ -63,7 +63,7 @@ yres: .word 480 ; Y resolution
pages: .byte 0 ; Number of screens available pages: .byte 0 ; Number of screens available
.byte 8 ; System font X size .byte 8 ; System font X size
.byte 8 ; System font Y 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 ; Next comes the jump table. Currently all entries must be valid and may point
; to an RTS for test versions (function not implemented). ; to an RTS for test versions (function not implemented).
@ -85,7 +85,6 @@ pages: .byte 0 ; Number of screens available
.addr GETPIXEL .addr GETPIXEL
.addr LINE .addr LINE
.addr BAR .addr BAR
.addr CIRCLE
.addr TEXTSTYLE .addr TEXTSTYLE
.addr OUTTEXT .addr OUTTEXT
.addr 0 ; IRQ entry is unused .addr 0 ; IRQ entry is unused
@ -100,7 +99,6 @@ X1 = ptr1
Y1 = ptr2 Y1 = ptr2
X2 = ptr3 X2 = ptr3
Y2 = ptr4 Y2 = ptr4
RADIUS = tmp1
ADDR = tmp1 ; (2) CALC ADDR = tmp1 ; (2) CALC
TEMP = tmp3 ; CALC icmp TEMP = tmp3 ; CALC icmp
@ -113,12 +111,6 @@ PB = ptr3 ; (2) LINE
UB = ptr4 ; (2) LINE UB = ptr4 ; (2) LINE
ERR = regsave ; (2) LINE ERR = regsave ; (2) LINE
NX = regsave+2 ; (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 ; Absolute variables used in the code
@ -133,11 +125,8 @@ OLDCOLOR: .res 1 ; colors before entering gfx mode
; Line routine stuff (combined with CIRCLE to save space) ; Line routine stuff (combined with CIRCLE to save space)
OGora:
COUNT: .res 2 COUNT: .res 2
OUkos:
NY: .res 2 NY: .res 2
Y3:
DX: .res 1 DX: .res 1
DY: .res 1 DY: .res 1
AX: .res 1 AX: .res 1
@ -183,7 +172,7 @@ InitVDCTab:
.byte 27, $00 .byte 27, $00
.byte $ff .byte $ff
SCN80CLR: .byte 27,88,147,27,88,0 SCN80CLR: .byte 27,88,147,27,88,0
.code .code
@ -502,51 +491,26 @@ GETDEFPALETTE:
; Must set an error code: NO ; 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: SETPIXEL:
jsr CALC ; Calculate coordinates jsr CALC ; Calculate coordinates
stx TEMP stx TEMP
lda ADDR lda ADDR
ldy ADDR+1 ldy ADDR+1
jsr VDCSetSourceAddr jsr VDCSetSourceAddr
jsr VDCReadByte jsr VDCReadByte
ldx TEMP ldx TEMP
sta TEMP sta TEMP
eor BITMASK eor BITMASK
and BITTAB,X and BITTAB,X
eor TEMP eor TEMP
pha pha
lda ADDR lda ADDR
ldy ADDR+1 ldy ADDR+1
jsr VDCSetSourceAddr jsr VDCSetSourceAddr
pla pla
jsr VDCWriteByte jsr VDCWriteByte
@L9: rts @L9: rts
@ -681,7 +645,7 @@ LINE:
bne @L0167 bne @L0167
rts rts
; setpixel(X1,Y1) ; setpixel(X1,Y1)
@L0167: jsr SETPIXELCLIP @L0167: jsr SETPIXEL
; pb = err + ny ; pb = err + ny
lda ERR lda ERR
clc clc
@ -916,213 +880,6 @@ HORLINE:
@L5: jmp 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 (y<x) {
@L013B: ldx #YY
lda XX
ldy XX+1
jsr icmp
bcc @L12
rts
@L12: ; plot points in 8 slices...
lda XS
clc
adc XX
sta X1
lda XS+1
adc XX+1
sta X1+1 ; x1 = xs+x
lda YS
clc
adc 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
sec
sbc 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
sec
sbc 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
clc
adc YY
sta X1
lda XS+1
adc YY+1
sta X1+1 ; x1 = xs+y
lda YS
clc
adc 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
sec
sbc 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
sec
sbc 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
clc
adc YY
tay
txa
adc YY+1
tax
tya
clc
adc YY
tay
txa
adc YY+1
tax
tya
clc
adc #1
bcc @L0143
inx
@L0143: sta OGora
stx OGora+1
; ou = og-x-x+1
sec
sbc XX
tay
txa
sbc XX+1
tax
tya
sec
sbc XX
tay
txa
sbc XX+1
tax
tya
clc
adc #1
bcc @L0146
inx
@L0146: sta OUkos
stx OUkos+1
; ++y
inc YY
bne @L0148
inc YY+1
@L0148: ; 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 @L0149
; { --x;
sec
lda XX
sbc #1
sta XX
bcs @L014E
dec XX+1
@L014E: ; mo = ou; }
lda OUkos
ldx OUkos+1
jmp @L014G
; else { mo = og }
@L0149: lda OGora
ldx OGora+1
@L014G: sta MaxO
stx MaxO+1
; }
jmp @L013B
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; TEXTSTYLE: Set the style used when calling OUTTEXT. Text scaling in X and Y ; 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. ; direction is passend in X/Y, the text direction is passed in A.

View File

@ -30,13 +30,10 @@
.byte 1 ; Number of screens available .byte 1 ; Number of screens available
.byte 8 ; System font X size .byte 8 ; System font X size
.byte 8 ; System font Y 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 ; Next comes the jump table. With the exception of IRQ, all entries must be
; to an RTS for test versions (function not implemented). A future version may ; valid and may point to an RTS for test versions (function not implemented).
; allow for emulation: In this case the vector will be zero. Emulation means
; that the graphics kernel will emulate the function by using lower level
; primitives - for example ploting a line by using calls to SETPIXEL.
.addr INSTALL .addr INSTALL
.addr UNINSTALL .addr UNINSTALL
@ -55,7 +52,6 @@
.addr GETPIXEL .addr GETPIXEL
.addr LINE .addr LINE
.addr BAR .addr BAR
.addr CIRCLE
.addr TEXTSTYLE .addr TEXTSTYLE
.addr OUTTEXT .addr OUTTEXT
.addr 0 ; IRQ entry is unused .addr 0 ; IRQ entry is unused
@ -70,7 +66,6 @@ X1 := ptr1
Y1 := ptr2 Y1 := ptr2
X2 := ptr3 X2 := ptr3
Y2 := ptr4 Y2 := ptr4
RADIUS := tmp1
ROW := tmp2 ; Bitmap row... ROW := tmp2 ; Bitmap row...
COL := tmp3 ; ...and column, both set by PLOT COL := tmp3 ; ...and column, both set by PLOT
@ -98,21 +93,11 @@ OLDD018: .res 1 ; Old register value
DX: .res 2 DX: .res 2
DY: .res 2 DY: .res 2
; Circle routine stuff, overlaid by BAR variables ; BAR variables
X1SAVE: X1SAVE: .res 2
CURX: .res 1 Y1SAVE: .res 2
CURY: .res 1 X2SAVE: .res 2
Y1SAVE: Y2SAVE: .res 2
BROW: .res 1 ; Bottom row
TROW: .res 1 ; Top row
X2SAVE:
LCOL: .res 1 ; Left column
RCOL: .res 1 ; Right column
Y2SAVE:
CHUNK1: .res 1
OLDCH1: .res 1
CHUNK2: .res 1
OLDCH2: .res 1
; Text output stuff ; Text output stuff
TEXTMAGX: .res 1 TEXTMAGX: .res 1
@ -859,334 +844,6 @@ BAR: lda Y2
@L4: rts @L4: 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
sta CURY
bne @L1
jmp SETPIXEL ; Plot as a point
@L1: clc
adc Y1
sta Y1
bcc @L2
inc Y1+1
@L2: jsr CALC ; Compute XC, YC+R
lda ROW
sta BROW
lda COL
sta LCOL
sta RCOL
sty Y2 ; Y AND 07
lda BITCHUNK,X
sta CHUNK1 ; Forwards chunk
sta OLDCH1
lsr
eor #$FF
sta CHUNK2 ; Backwards chunk
sta OLDCH2
lda POINT
sta TEMP2 ; TEMP2 = forwards high pointer
sta X2 ; X2 = backwards high pointer
lda POINT+1
sta TEMP2+1
sta X2+1
; Next compute CY-R
lda Y1
sec
sbc RADIUS
bcs @C3
dec Y1+1
sec
@C3: sbc RADIUS
bcs @C4
dec Y1+1
@C4: sta Y1
jsr CALC ; Compute new coords
sty Y1
lda POINT
sta X1 ; X1 will be the backwards
lda POINT+1 ; low-pointer
sta X1+1 ; POINT will be forwards
lda ROW
sta TROW
sei ; Get underneath ROM
lda #$34
sta $01
lda RADIUS
lsr ; A=r/2
ldx #00
stx CURX ; y=0
; Main loop
@LOOP: inc CURX ; x=x+1
lsr CHUNK1 ; Right chunk
bne @CONT1
jsr UPCHUNK1 ; Update if we move past a column
@CONT1: asl CHUNK2
bne @CONT2
jsr UPCHUNK2
@CONT2: sec
sbc CURX ; a=a-x
bcs @LOOP
adc CURY ;if a<0 then a=a+y; y=y-1
tax
jsr PCHUNK1
jsr PCHUNK2
lda CHUNK1
sta OLDCH1
lda CHUNK2
sta OLDCH2
txa
dec CURY ;(y=y-1)
dec Y2 ;Decrement y-offest for upper
bpl @CONT3 ;points
jsr DECYOFF
@CONT3: ldy Y1
iny
sty Y1
cpy #8
bcc @CONT4
jsr INCYOFF
@CONT4: ldy CURX
cpy CURY ;if y<=x then punt
bcc @LOOP ;Now draw the other half
;
; Draw the other half of the circle by exactly reversing
; the above!
;
NEXTHALF:
lsr OLDCH1 ;Only plot a bit at a time
asl OLDCH2
lda RADIUS ;A=-R/2-1
lsr
eor #$FF
@LOOP:
tax
jsr PCHUNK1 ;Plot points
jsr PCHUNK2
txa
dec Y2 ;Y2=bottom
bpl @CONT1
jsr DECYOFF
@CONT1: inc Y1
ldy Y1
cpy #8
bcc @CONT2
jsr INCYOFF
@CONT2: ldx CURY
beq @DONE
clc
adc CURY ;a=a+y
dec CURY ;y=y-1
bcc @LOOP
inc CURX
sbc CURX ;if a<0 then x=x+1; a=a+x
lsr CHUNK1
bne @CONT3
tax
jsr UPCH1 ;Upchunk, but no plot
@CONT3: lsr OLDCH1 ;Only the bits...
asl CHUNK2 ;Fix chunks
bne @CONT4
tax
jsr UPCH2
@CONT4: asl OLDCH2
bcs @LOOP
@DONE:
CIRCEXIT: ;Restore interrupts
lda #$37
sta $01
cli
rts
;
; Decrement lower pointers
;
DECYOFF:
tay
lda #7
sta Y2
lda X2 ;If we pass through zero, then
sec
sbc #<320 ;subtract 320
sta X2
lda X2+1
sbc #>320
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 ; 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. ; direction is passend in X/Y, the text direction is passed in A.

View File

@ -34,6 +34,7 @@ _tgi_colorcount: .res 1 ; Number of available colors
_tgi_pagecount: .res 1 ; Number of available screen pages _tgi_pagecount: .res 1 ; Number of available screen pages
_tgi_fontsizex: .res 1 ; System font X size _tgi_fontsizex: .res 1 ; System font X size
_tgi_fontsizey: .res 1 ; System font Y size _tgi_fontsizey: .res 1 ; System font Y size
_tgi_aspectratio: .res 2 ; Aspect ratio in 8.8 fixed point
.data .data
@ -57,7 +58,6 @@ tgi_setpixel: jmp $0000
tgi_getpixel: jmp $0000 tgi_getpixel: jmp $0000
tgi_line: jmp $0000 tgi_line: jmp $0000
tgi_bar: jmp $0000 tgi_bar: jmp $0000
tgi_circle: jmp $0000
tgi_textstyle: jmp $0000 tgi_textstyle: jmp $0000
tgi_outtext: jmp $0000 tgi_outtext: jmp $0000
tgi_irq: .byte $60, $00, $00 ; RTS plus two dummy bytes tgi_irq: .byte $60, $00, $00 ; RTS plus two dummy bytes
@ -189,4 +189,4 @@ _tgi_uninstall:
rts rts

View File

@ -6,14 +6,11 @@
.include "tgi-kernel.inc" .include "tgi-kernel.inc"
.import popax .import incsp4
.importzp tmp1
.proc _tgi_circle .proc _tgi_circle
sta tmp1 ; Get the coordinates ; For now
jsr popax jmp incsp4
jsr tgi_popxy ; Pop X/Y into ptr1/ptr2
jmp tgi_circle ; Call the driver
.endproc .endproc