.include "tgi-kernel.inc"
.include "tgi-error.inc"
- .export _tgi_setup
.importzp ptr1
+ .interruptor tgi_irq ; Export as IRQ handler
;----------------------------------------------------------------------------
.bss
-_tgi_drv: .res 2 ; Pointer to driver
-_tgi_error: .res 1 ; Last error code
-_tgi_mode: .res 1 ; Graphics mode or zero
-_tgi_curx: .res 2 ; Current drawing cursor X
-_tgi_cury: .res 2 ; Current drawing cursor Y
-_tgi_color: .res 1 ; Current drawing color
-_tgi_xres: .res 2 ; X resolution of the current mode
-_tgi_yres: .res 2 ; Y resolution of the current mode
-_tgi_colorcount:.res 1 ; Number of available colors
-_tgi_pagecount: .res 1 ; Number of available screen pages
+_tgi_drv: .res 2 ; Pointer to driver
+; From here on, variables get cleared when a new driver is loaded
+cstart:
+_tgi_error: .res 1 ; Last error code
+_tgi_gmode: .res 1 ; Flag: Graphics mode active
+_tgi_curx: .res 2 ; Current drawing cursor X
+_tgi_cury: .res 2 ; Current drawing cursor Y
+_tgi_color: .res 1 ; Current drawing color
+_tgi_font: .res 1 ; Which font to use
+_tgi_textdir: .res 1 ; Current text direction
+_tgi_vectorfont: .res 2 ; Pointer to vector font
+; The following two store an 8.8 fixed point value in the first two bytes,
+; and a rounded integer value in the third byte. The latter is passed to the
+; driver to scale the bitmap font. The variables are expected to be in
+; this order and adjacent.
+_tgi_textscalew: .res 3 ; Text scale for the width
+_tgi_textscaleh: .res 3 ; Text scale for the height
+
+; The following two must also be in exactly this order
+_tgi_charwidth: .res 1 ; Char width of system font
+_tgi_charheight: .res 1 ; Char height of system font
+
+; End of section that gets cleared when a new driver is loaded
+csize = * - cstart
+
+; Maximum X and Y coordinate (that is, xres-1 and yres-1)
+_tgi_xmax: .res 2
+_tgi_ymax: .res 2
+
+; The following variables are copied from the driver header for faster access
+; fontwidth and fontheight are expected to be in order and adjacent.
+tgi_driver_vars:
+_tgi_xres: .res 2 ; X resolution of the current mode
+_tgi_yres: .res 2 ; Y resolution of the current mode
+_tgi_colorcount: .res 1 ; Number of available colors
+_tgi_pagecount: .res 1 ; Number of available screen pages
+_tgi_fontwidth: .res 1 ; System font width in pixels
+_tgi_fontheight: .res 1 ; System font height in pixels
+_tgi_aspectratio: .res 2 ; Aspect ratio in 8.8 fixed point
.data
; Jump table for the driver functions.
-tgi_install: jmp $0000
-tgi_deinstall: jmp $0000
-tgi_init: jmp $0000
-tgi_done: jmp $0000
-tgi_control: jmp $0000
-tgi_clear: jmp $0000
-tgi_setviewpage:jmp $0000
-tgi_setdrawpage:jmp $0000
-tgi_setcolor: jmp $0000
-tgi_setpixel: jmp $0000
-tgi_getpixel: jmp $0000
-tgi_line: jmp $0000
-tgi_bar: jmp $0000
-tgi_circle: jmp $0000
-
-
+jumpvectors:
+tgi_install: jmp $0000
+tgi_uninstall: jmp $0000
+tgi_init: jmp $0000
+tgi_done: jmp $0000
+tgi_geterror: jmp $0000
+tgi_control: jmp $0000
+tgi_clear: jmp $0000
+tgi_setviewpage: jmp $0000
+tgi_setdrawpage: jmp $0000
+tgi_setcolor: jmp $0000
+tgi_setpalette: jmp $0000
+tgi_getpalette: jmp $0000
+tgi_getdefpalette: jmp $0000
+tgi_setpixel: jmp $0000
+tgi_getpixel: jmp $0000
+tgi_line: jmp $0000
+tgi_bar: jmp $0000
+tgi_textstyle: jmp $0000
+tgi_outtext: jmp $0000
+tgi_irq: .byte $60, $00, $00 ; RTS plus two dummy bytes
+
+; Driver header signature
+.rodata
+tgi_sig: .byte $74, $67, $69, TGI_API_VERSION ; "tgi", version
+
+
+.code
;----------------------------------------------------------------------------
-; void __fastcall__ tgi_setup (void);
-; /* Setup the driver and graphics kernel once the driver is loaded */
+; void __fastcall__ tgi_install (void* driver);
+; /* Install an already loaded driver. */
-copy: lda (ptr1),y
- sta tgi_install,x
- iny
- inx
- rts
+_tgi_install:
+ sta _tgi_drv
+ sta ptr1
+ stx _tgi_drv+1
+ stx ptr1+1
+; Check the driver signature
-_tgi_setup:
- jsr tgi_set_ptr ; load _tgi_drv into ptr1
+ ldy #.sizeof(tgi_sig)-1
+@L0: lda (ptr1),y
+ cmp tgi_sig,y
+ bne tgi_inv_drv
+ dey
+ bpl @L0
; Copy the jump vectors
- ldy #TGI_HDR_JUMPTAB
+ ldy #TGI_HDR::JUMPTAB
ldx #0
@L1: inx ; Skip JMP opcode
jsr copy ; Copy one byte
jsr copy ; Copy one byte
- cpx #(TGI_HDR_JUMPCOUNT*3)
+ cpy #(TGI_HDR::JUMPTAB + .sizeof(TGI_HDR::JUMPTAB))
bne @L1
-; Check for emulation vectors needed
+; Call the driver install routine. It may update header variables, so we copy
+; them after this call.
- lda tgi_bar+1
- ora tgi_bar+2 ; Do we have a BAR vector?
- bne @L2 ; Jump if yes
- lda #<tgi_emu_bar ; Use emulation if no
- sta tgi_bar+1
- lda #>tgi_emu_bar
- sta tgi_bar+2
+ jsr tgi_install
-; Copy variables. Beware: We are using internal knowledge about variable
-; layout here!
+; Copy variables from the driver header for faster access.
-@L2: ldy #TGI_HDR_XRES
- ldx #0
+ jsr tgi_set_ptr ; Set ptr1 to tgi_drv
+ ldy #(TGI_HDR::VARS + .sizeof(TGI_HDR::VARS) - 1)
+ ldx #.sizeof(TGI_HDR::VARS)-1
@L3: lda (ptr1),y
- sta _tgi_xres,x
- iny
- inx
- cpx #6
- bne @L3
+ sta tgi_driver_vars,x
+ dey
+ dex
+ bpl @L3
-; Initialize variables
+; Install the IRQ vector if the driver needs it.
+
+ lda tgi_irq+2 ; Check high byte of IRQ vector
+ beq @L4 ; Jump if vector invalid
+ lda #$4C ; Jump opcode
+ sta tgi_irq ; Activate IRQ routine
+
+; Initialize some other variables
lda #$00
- ldx #6-1
-@L4: sta _tgi_error,x ; Clear error/mode/curx/cury
+@L4: ldx #csize-1
+@L5: sta cstart,x ; Clear error/mode/curx/cury/...
dex
- bpl @L4
+ bpl @L5
+
+ rts
+
+; Copy one byte to the jump vectors
+
+copy: lda (ptr1),y
+ sta jumpvectors,x
+ iny
+ inx
+ rts
- jsr tgi_install ; Call driver install routine
+;----------------------------------------------------------------------------
+; Set an invalid argument error
-; jmp tgi_fetch_error
+tgi_inv_arg:
+ lda #TGI_ERR_INV_ARG
+ sta _tgi_error
+ rts
;----------------------------------------------------------------------------
-; Fetch the error code from the driver and place it into the global error
-; variable. The function will also return the error in A and the flags from
-; loading the error code are set.
+; Set an invalid driver error
-tgi_fetch_error:
- jsr tgi_set_ptr
- ldy #TGI_HDR_ERROR
- lda (ptr1),y
- sta _tgi_error
- rts
+tgi_inv_drv:
+ lda #TGI_ERR_INV_DRIVER
+ sta _tgi_error
+ rts
;----------------------------------------------------------------------------
; Load the pointer to the tgi driver into ptr1.
tgi_set_ptr:
- lda _tgi_drv
- sta ptr1
- lda _tgi_drv+1
- sta ptr1+1
+ lda _tgi_drv
+ sta ptr1
+ lda _tgi_drv+1
+ sta ptr1+1
rts
;----------------------------------------------------------------------------
-; Set an invalid argument error
+; void __fastcall__ tgi_uninstall (void);
+; /* Uninstall the currently loaded driver but do not unload it. Will call
+; * tgi_done if necessary.
+; */
-tgi_inv_arg:
- lda #TGI_ERR_INV_ARG
+_tgi_uninstall:
+ jsr _tgi_done ; Switch off graphics
+
+ jsr tgi_uninstall ; Allow the driver to clean up
+
+ lda #$60 ; RTS opcode
+ sta tgi_irq ; Disable IRQ entry point
+
+; Clear driver pointer and error code
+
+ lda #$00
+ sta _tgi_drv
+ sta _tgi_drv+1
sta _tgi_error
+
rts
+
+