]> git.sur5r.net Git - cc65/commitdiff
Lynx TGI driver update by Karri Kaksonen. Adds collision detection.
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 26 Oct 2009 19:28:11 +0000 (19:28 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 26 Oct 2009 19:28:11 +0000 (19:28 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@4393 b7a2c559-68d2-44c3-8de9-860c34a00d81

doc/lynx.sgml
include/lynx.h
libsrc/lynx/lynx-160-102-16.s

index fa2a9dc514313063d517f59d5ac8973f58a380a4..856b909ec4f49daadf779b31dfd433dfdcf57c89 100644 (file)
@@ -46,7 +46,7 @@ that shows how to create a complete bootable Lynx cart.
 <sect>Memory layout<p>
 
 cc65 generated programs with the default setup run with the I/O area and the
-kernal enabled, which gives a usable memory range of &dollar;400 - &dollar;C038.
+kernal enabled, which gives a usable memory range of &dollar;400 - &dollar;C037.
 
 Special locations:
 
@@ -62,12 +62,17 @@ Special locations:
   '?' for all keys down at the same time.
 
   <tag/Stack/
-  The C runtime stack is located at &dollar;C037 and growing downwards.
+  The C runtime stack is located at &dollar;C037 (or &dollar;A057 if collision
+  detection is enabled) and growing downwards.
 
   <tag/Heap/
   The C heap is located at the end of the program and grows towards the C
   runtime stack.
 
+  <tag/Screen/
+  The collision detection screen is at &dollar;A058 if it is enabled. The
+  double buffered screens are at &dollar;C038 and &dollar;E018.
+
 </descrip><p>
 
 
@@ -145,6 +150,10 @@ 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).
 
+You can also enable or disable collision detection by a call to
+tgi_setcollisiondetection(active) or tgi_ioctl(5, active). The collision
+result is located before the sprite structure by default in this driver.
+
 <sect1>Extended memory drivers<p>
 
 No extended memory drivers are currently available for the Lynx.
index c51d4cbf18d6c2ffaa62dc38eb7568cd41b8aa90..303260e33d26c35969004f8226ea9bae0648d9e4 100644 (file)
@@ -109,6 +109,7 @@ void __fastcall__ lynx_eeprom_erase (unsigned char cell);
 #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_setcollisiondetection(active) tgi_ioctl(5, (unsigned)(active))
 
 /* End of lynx.h */
 #endif
index 864ab554fd6310574538abb9521f5396c0e08b4c..83e0c10afd8d8a8f1e99cc154554223e3b19c7a1 100644 (file)
@@ -199,6 +199,16 @@ INIT:
 ; Enable interrupts for VBL
        lda     #$80
        tsb     VTIMCTLA
+; Set up collision buffer to $A058
+       lda     #$58
+       sta     COLLBASL
+       lda     #$A0
+       sta     COLLBASH
+; Put collision index before sprite data
+       lda     #$FE
+       sta     COLLOFFL
+       lda     #$FF
+       sta     COLLOFFH
 ; Done, reset the error code
         lda     #TGI_ERR_OK
         sta     ERROR
@@ -245,6 +255,8 @@ GETERROR:
 ;
 ; To update displays you can call tgi_ioctl(4, 1) it will wait for the
 ; next VBL interrupt and swap draw and view buffers.
+;
+; Activate or deactivate collision detection by calling tgi_ioctl(5, 0/1).
 
 CONTROL:
         pha                    ; Almost all control routines succeed
@@ -252,6 +264,20 @@ CONTROL:
        sta     ERROR
        pla
 
+       cmp     #5
+       bne     ControlSwap
+       lda     ptr1
+       bne     @L0
+       lda     __sprsys
+       ora     #$20
+       bra     @L1
+@L0:   lda     __sprsys
+       and     #$df
+@L1:   sta     __sprsys
+       sta     SPRSYS
+       rts
+
+ControlSwap:
        cmp     #4
        bne     ControlFramerate