]> git.sur5r.net Git - cc65/blobdiff - libsrc/tgi/tgi-kernel.s
remove superfluous ".code" line
[cc65] / libsrc / tgi / tgi-kernel.s
index c15737e79be7ba30d57e87e5a7bef7134fdba83a..a4316f8f1a5b5f920462cfc23eb1f863dcc5e649 100644 (file)
 ;
 
         .include        "tgi-kernel.inc"
+        .include        "tgi-error.inc"
+
+        .importzp       ptr1
+        .interruptor    tgi_irq         ; Export as IRQ handler
+
 
 ;----------------------------------------------------------------------------
 ; Variables
 
 .bss
 
-_tgi_drv:      .res    2               ; Pointer to driver
-_tgi_error:    .res    1               ; Last error code
+_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_post:       jmp    $0000
-tgi_control:    jmp    $0000
-tgi_clear:      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_install (void* driver);
+; /* Install an already loaded driver. */
 
 
-;----------------------------------------------------------------------------
-; Setup the TGI driver once it is loaded.
+_tgi_install:
+               sta     _tgi_drv
+       sta     ptr1
+       stx     _tgi_drv+1
+       stx     ptr1+1
 
-tgi_setup:
-       lda     _tgi_drv
-       sta     ptr1
-       lda     _tgi_drv+1
-       sta     ptr1+1
+; Check the driver signature
 
-        ldy     #TGI_HDR_JUMPTAB
-        ldx     #1
+        ldy     #.sizeof(tgi_sig)-1
+@L0:    lda     (ptr1),y
+        cmp     tgi_sig,y
+        bne     tgi_inv_drv
+        dey
+        bpl     @L0
 
-@L1:    lda     (ptr1),y
-        sta     tgi_install,x
-        iny
-        inx
-        lda     (ptr1),y
-        sta     tgi_install,x
-        inx
-        cpx     #(TGI_HDR_JMPCOUNT*3)
+; Copy the jump vectors
+
+        ldy     #TGI_HDR::JUMPTAB
+        ldx     #0
+@L1:    inx                             ; Skip JMP opcode
+        jsr     copy                    ; Copy one byte
+        jsr     copy                    ; Copy one byte
+        cpy     #(TGI_HDR::JUMPTAB + .sizeof(TGI_HDR::JUMPTAB))
         bne     @L1
 
+; Call the driver install routine. It may update header variables, so we copy
+; them after this call.
+
+        jsr     tgi_install
+
+; Copy variables from the driver header for faster access.
+
+        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
+        dey
+        dex
+        bpl     @L3
+
+; 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
-        sta     _tgi_error
+@L4:    ldx     #csize-1
+@L5:    sta     cstart,x                ; Clear error/mode/curx/cury/...
+        dex
+        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.
+; 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
+
+;----------------------------------------------------------------------------
+; 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
 
+
+