The TGI driver has a few Lynx-specific extensions.
-Calling tgi_ioctl(0, spr) will display a standard Lynx sprite on screen.
+Calling tgi_sprite(spr) or tgi_ioctl(0, spr) will display a standard Lynx
+sprite on screen.
-Calling tgi_ioctl(1, 0) will do a flip screen. If you decide to flip the
-screen then it may be a good idea to call the install-routine for the
-joystick to get that flipped too.
+Calling tgi_flip() or tgi_ioctl(1, 0) will do a flip screen.
-Calling tgi_ioctl(2, bgindex) will set the text background color to the index
-defined by bgindex. If bgindex is 0 then the background color is transparent.
+Calling tgi_setbgcolor(bgcolor) or tgi_ioctl(2, bgindex) will set the text
+background color to the index defined by bgindex. If bgindex is 0 then the
+background color is transparent.
+
+To set the framerate of the display hardware call tgi_setframerate(rate) or
+tgi_ioctl(3, rate). The supported framerates are 50, 60 and 75 frames per
+second. Actually there is no real reason to use anything else than 75 frames
+per second.
+
+To check if the drawing engine is busy with the previous swap you can
+call tgi_busy or tgi_ioctl(4, 0). It returns 0 if idle and 1 if busy
+
+To update displays you can call tgi_updatedisplay() or tgi_ioctl(4, 1) it
+will wait for the next VBL interrupt and set the draw buffer to the
+view buffer. The draw buffer is also changed to (drawbuffer xor 1).
+
+Set an address for a subroutine you want to call at every VBL by calling
+tgi_setvblhook(addr) or tgi_ioctl(5, addr).
<sect1>Extended memory drivers<p>
+/*****************************************************************************/
+/* TGI extras */
+/*****************************************************************************/
+
+
+
+#define tgi_sprite(spr) tgi_ioctl(0, (unsigned)(spr))
+#define tgi_flip() tgi_ioctl(1, 0)
+#define tgi_setbgcolor(bgcol) tgi_ioctl(2, (unsigned)(bgcol))
+#define tgi_setframerate(rate) tgi_ioctl(3, (unsigned)(rate))
+#define tgi_busy() tgi_ioctl(4, 0)
+#define tgi_updatedisplay() tgi_ioctl(4, 1)
+#define tgi_setvblhook(addr) tgi_ioctl(5, (unsigned)(addr))
+
+
+/*****************************************************************************/
+/* TGI extras */
+/*****************************************************************************/
+
+#define tgi_sprite(spr) tgi_ioctl(0, (unsigned)(spr))
+#define tgi_flip() tgi_ioctl(1, 0)
+#define tgi_setbgcolor(bgcol) tgi_ioctl(2, (unsigned)(bgcol))
+#define tgi_setframerate(rate) tgi_ioctl(3, (unsigned)(rate))
+#define tgi_busy() tgi_ioctl(4, 0)
+#define tgi_updatedisplay() tgi_ioctl(4, 1)
+#define tgi_setvblhook(addr) tgi_ioctl(5, (unsigned)(addr))
+
/* End of lynx.h */
#endif
pha
cld
jsr callirq
+ lda INTSET
+ sta INTRST
pla
plx
ply
;
; To set the frame rate for the display hardware call tgi_ioctl(3, rate)
;
-; To make a request for swapping the display buffers call tgi_ioctl(4, dataptr)
-; If the value of the char pointed to by the dataptr is 0 then fill in the
-; value of the char with the current state of the swap buffer 0 = idle, 1 = busy
-; If the value is not 0 then activate the swap function at next VBL interrupt
+; To check if the drawing engine is busy with the previous swap you can
+; call tgi_ioctl(4, 0). It returns 0 if idle and 1 if busy
+;
+; To update displays you can call tgi_ioctl(4, 1) it will wait for the
+; next VBL interrupt and swap draw and view buffers.
;
; Set an address for a subroutine you want to call at every VBL
; tgi_ioctl(5, hook)
bne IRQVBL
clc ; Not a VBL interrupt - exit
rts
-IRQVBL: sta INTRST ; Clear interrupt
+IRQVBL:
lda SWAPREQUEST
- bne @L0
+ beq @L0
lda DRAWPAGE
jsr SETVIEWPAGE
lda DRAWPAGE
stz SWAPREQUEST
@L0:
jsr VBLHOOK
- sec
+ clc
rts
; ------------------------------------------------------------------------