.include "tgi-kernel.inc"
.include "tgi-error.inc"
- .export _tgi_setup
.importzp ptr1
+ .interruptor tgi_irq ; Export as IRQ handler
;----------------------------------------------------------------------------
_tgi_drv: .res 2 ; Pointer to driver
_tgi_error: .res 1 ; Last error code
-_tgi_mode: .res 1 ; Graphics mode or zero
+_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_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_driver_var_size = * - tgi_driver_vars
.data
; Jump table for the driver functions.
tgi_install: jmp $0000
-tgi_deinstall: jmp $0000
+tgi_uninstall: jmp $0000
tgi_init: jmp $0000
tgi_done: jmp $0000
tgi_geterror: jmp $0000
tgi_getdefpalette: jmp $0000
tgi_setpixel: jmp $0000
tgi_getpixel: jmp $0000
-tgi_horline: 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
+
+; Driver header signature
+.rodata
+tgi_sig: .byte $74, $67, $69, TGI_API_VERSION ; "tgi", version
;----------------------------------------------------------------------------
-; 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_driver_vars,x
- iny
- inx
- cpx #tgi_driver_var_size
- bne @L3
+ dey
+ dex
+ bpl @L3
+
+; Install the IRQ vector if the driver needs it.
-; Initialize variables
+ 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 #7-1
-@L4: sta _tgi_error,x ; Clear error/mode/curx/cury/textdir
+@L4: ldx #8-1
+@L5: sta _tgi_error,x ; Clear error/mode/curx/cury/textdir
dex
- bpl @L4
+ bpl @L5
- jmp tgi_install ; Call driver install routine
+ rts
-;----------------------------------------------------------------------------
-; Load the pointer to the tgi driver into ptr1.
+; Copy one byte from the jump vectors
-tgi_set_ptr:
- lda _tgi_drv
- sta ptr1
- lda _tgi_drv+1
- sta ptr1+1
+copy: lda (ptr1),y
+ sta tgi_install,x
+ iny
+ inx
rts
;----------------------------------------------------------------------------
sta _tgi_error
rts
+;----------------------------------------------------------------------------
+; Set an invalid driver error
+
+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
+ rts
+
+;----------------------------------------------------------------------------
+; void __fastcall__ tgi_uninstall (void);
+; /* Uninstall the currently loaded driver but do not unload it. Will call
+; * tgi_done if necessary.
+; */
+
+_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
+
+