]> git.sur5r.net Git - cc65/blob - libsrc/tgi/tgi-kernel.s
Working on the TGI API, adding vector fonts. Only roughly tested!
[cc65] / libsrc / tgi / tgi-kernel.s
1 ;
2 ; Ullrich von Bassewitz, 21.06.2002
3 ;
4 ; Common functions of the tgi graphics kernel.
5 ;
6
7         .include        "tgi-kernel.inc"
8         .include        "tgi-error.inc"
9
10         .importzp       ptr1
11         .interruptor    tgi_irq         ; Export as IRQ handler
12
13
14 ;----------------------------------------------------------------------------
15 ; Variables
16
17 .bss
18
19 _tgi_drv:           .res    2           ; Pointer to driver
20 _tgi_error:         .res    1           ; Last error code
21 _tgi_gmode:         .res    1           ; Flag: Graphics mode active
22 _tgi_curx:          .res    2           ; Current drawing cursor X
23 _tgi_cury:          .res    2           ; Current drawing cursor Y
24 _tgi_color:         .res    1           ; Current drawing color
25 _tgi_font:          .res    1           ; Which font to use
26 _tgi_textdir:       .res    1           ; Current text direction
27 ; The following two store an 8.8 fixed point value in the first two bytes,
28 ; and a rounded integer value in the third byte. The latter is passed to the
29 ; driver to scale the bitmap font. The variables are expected to be in
30 ; this order and adjacent.
31 _tgi_textscalew:    .res    3           ; Text scale for the width
32 _tgi_textscaleh:    .res    3           ; Text scale for the height
33
34 ; The following two must also be in exactly this order
35 _tgi_charwidth:     .res    1           ; Char width of system font
36 _tgi_charheight:    .res    1           ; Char height of system font
37
38 ; The following variables are copied from the driver header for faster access
39 ; fontwidth and fontheight are expected to be in order and adjacent.
40 tgi_driver_vars:
41 _tgi_xres:          .res    2           ; X resolution of the current mode
42 _tgi_yres:          .res    2           ; Y resolution of the current mode
43 _tgi_colorcount:    .res    1           ; Number of available colors
44 _tgi_pagecount:     .res    1           ; Number of available screen pages
45 _tgi_fontwidth:     .res    1           ; System font width in pixels
46 _tgi_fontheight:    .res    1           ; System font height in pixels
47 _tgi_aspectratio:   .res    2           ; Aspect ratio in 8.8 fixed point
48
49
50 .data
51
52 ; Jump table for the driver functions.
53
54 tgi_install:        jmp     $0000
55 tgi_uninstall:      jmp     $0000
56 tgi_init:           jmp     $0000
57 tgi_done:           jmp     $0000
58 tgi_geterror:       jmp     $0000
59 tgi_control:        jmp     $0000
60 tgi_clear:          jmp     $0000
61 tgi_setviewpage:    jmp     $0000
62 tgi_setdrawpage:    jmp     $0000
63 tgi_setcolor:       jmp     $0000
64 tgi_setpalette:     jmp     $0000
65 tgi_getpalette:     jmp     $0000
66 tgi_getdefpalette:  jmp     $0000
67 tgi_setpixel:       jmp     $0000
68 tgi_getpixel:       jmp     $0000
69 tgi_line:           jmp     $0000
70 tgi_bar:            jmp     $0000
71 tgi_textstyle:      jmp     $0000
72 tgi_outtext:        jmp     $0000
73 tgi_irq:            .byte   $60, $00, $00       ; RTS plus two dummy bytes
74
75 ; Driver header signature
76 .rodata
77 tgi_sig:        .byte   $74, $67, $69, TGI_API_VERSION  ; "tgi", version
78
79
80 .code
81 ;----------------------------------------------------------------------------
82 ; void __fastcall__ tgi_install (void* driver);
83 ; /* Install an already loaded driver. */
84
85
86 _tgi_install:
87         sta     _tgi_drv
88         sta     ptr1
89         stx     _tgi_drv+1
90         stx     ptr1+1
91
92 ; Check the driver signature
93
94         ldy     #.sizeof(tgi_sig)-1
95 @L0:    lda     (ptr1),y
96         cmp     tgi_sig,y
97         bne     tgi_inv_drv
98         dey
99         bpl     @L0
100
101 ; Copy the jump vectors
102
103         ldy     #TGI_HDR::JUMPTAB
104         ldx     #0
105 @L1:    inx                             ; Skip JMP opcode
106         jsr     copy                    ; Copy one byte
107         jsr     copy                    ; Copy one byte
108         cpy     #(TGI_HDR::JUMPTAB + .sizeof(TGI_HDR::JUMPTAB))
109         bne     @L1
110
111 ; Call the driver install routine. It may update header variables, so we copy
112 ; them after this call.
113
114         jsr     tgi_install
115
116 ; Copy variables from the driver header for faster access.
117
118         jsr     tgi_set_ptr             ; Set ptr1 to tgi_drv
119         ldy     #(TGI_HDR::VARS + .sizeof(TGI_HDR::VARS) - 1)
120         ldx     #.sizeof(TGI_HDR::VARS)-1
121 @L3:    lda     (ptr1),y
122         sta     tgi_driver_vars,x
123         dey
124         dex
125         bpl     @L3
126
127 ; Install the IRQ vector if the driver needs it.
128
129         lda     tgi_irq+2               ; Check high byte of IRQ vector
130         beq     @L4                     ; Jump if vector invalid
131         lda     #$4C                    ; Jump opcode
132         sta     tgi_irq                 ; Activate IRQ routine
133
134 ; Initialize some other variables
135
136         lda     #$00
137 @L4:    ldx     #8-1
138 @L5:    sta     _tgi_error,x            ; Clear error/mode/curx/cury/textdir
139         dex
140         bpl     @L5
141
142         rts
143
144 ; Copy one byte from the jump vectors
145
146 copy:   lda     (ptr1),y
147         sta     tgi_install,x
148         iny
149         inx
150         rts
151
152 ;----------------------------------------------------------------------------
153 ; Set an invalid argument error
154
155 tgi_inv_arg:
156         lda     #TGI_ERR_INV_ARG
157         sta     _tgi_error
158         rts
159
160 ;----------------------------------------------------------------------------
161 ; Set an invalid driver error
162
163 tgi_inv_drv:
164         lda     #TGI_ERR_INV_DRIVER
165         sta     _tgi_error
166         rts
167
168 ;----------------------------------------------------------------------------
169 ; Load the pointer to the tgi driver into ptr1.
170
171 tgi_set_ptr:
172         lda     _tgi_drv
173         sta     ptr1
174         lda     _tgi_drv+1
175         sta     ptr1+1
176         rts
177
178 ;----------------------------------------------------------------------------
179 ; void __fastcall__ tgi_uninstall (void);
180 ; /* Uninstall the currently loaded driver but do not unload it. Will call
181 ;  * tgi_done if necessary.
182 ;  */
183
184 _tgi_uninstall:
185         jsr     _tgi_done               ; Switch off graphics
186
187         jsr     tgi_uninstall           ; Allow the driver to clean up
188
189         lda     #$60                    ; RTS opcode
190         sta     tgi_irq                 ; Disable IRQ entry point
191
192 ; Clear driver pointer and error code
193
194         lda     #$00
195         sta     _tgi_drv
196         sta     _tgi_drv+1
197         sta     _tgi_error
198
199         rts
200
201
202