]> git.sur5r.net Git - cc65/commitdiff
Fix joystick driver. Add interruptor support.
authorChristian Groessler <chris@groessler.org>
Wed, 15 Feb 2017 14:45:49 +0000 (15:45 +0100)
committerChristian Groessler <chris@groessler.org>
Wed, 15 Feb 2017 14:45:49 +0000 (15:45 +0100)
Note that the joystick driver doesn't support combined movements (like
left/up or right/down). This should be fixed.

asminc/creativision.inc
include/creativision.h
libsrc/creativision/crt0.s
libsrc/creativision/irq.s [new file with mode: 0644]
libsrc/creativision/joy/creativision-stdjoy.s
testcode/lib/joy-test.c

index bd30bc4627cfcc21db9afb04e53b71681710b186..59b26101bbfcf9ce89b3aed80ad7a314aa930b00 100644 (file)
@@ -36,3 +36,7 @@ ZP_JOY1_DIR             = $13
 ZP_JOY0_BUTTONS         = $16
 ZP_JOY1_BUTTONS         = $17
 
+;** BIOS
+BIOS_IRQ1_ADDR          = $FF3F
+BIOS_IRQ2_ADDR          = $FF52
+BIOS_NMI_RESET_ADDR     = $F808
index adaa1caab7a55d4332389ac33ced2fb71bd91477..5cc99b7affb04ce8fd5f92ca448ee26f29a4e3f0 100644 (file)
@@ -1,9 +1,38 @@
-/* CreatiVision Header */
+/*****************************************************************************/
+/*                                                                           */
+/*                             creativision.h                                */
+/*                                                                           */
+/*                  Creativision system specific definitions                 */
+/*                                                                           */
+/*                                                                           */
+/*                                                                           */
+/* (C) 2013      cvemu                                                       */
+/* (C) 2017      Christian Groessler <chris@groessler.org>                   */
+/*                                                                           */
+/*                                                                           */
+/* This software is provided 'as-is', without any expressed or implied       */
+/* warranty.  In no event will the authors be held liable for any damages    */
+/* arising from the use of this software.                                    */
+/*                                                                           */
+/* Permission is granted to anyone to use this software for any purpose,     */
+/* including commercial applications, and to alter it and redistribute it    */
+/* freely, subject to the following restrictions:                            */
+/*                                                                           */
+/* 1. The origin of this software must not be misrepresented; you must not   */
+/*    claim that you wrote the original software. If you use this software   */
+/*    in a product, an acknowledgment in the product documentation would be  */
+/*    appreciated but is not required.                                       */
+/* 2. Altered source versions must be plainly marked as such, and must not   */
+/*    be misrepresented as being the original software.                      */
+/* 3. This notice may not be removed or altered from any source              */
+/*    distribution.                                                          */
+/*                                                                           */
+/*****************************************************************************/
 
 #ifndef _CVISION_H
-
 #define _CVISION_H
 
+/* Character codes */
 #define CH_VLINE 33
 #define CH_HLINE 34
 #define CH_ULCORNER 35
 #define CH_LLCORNER 37
 #define CH_LRCORNER 38
 
+/* no support for dynamically loadable drivers */
 #define DYN_DRV 0
 
 /* Colours - from TMS9918 */
 #define C_TRANSPARENT   0
 #define C_BLACK         1
-#define C_MED_GREEN     2 
+#define C_MED_GREEN     2
 #define C_LIGHT_GREEN   3
 #define C_DARK_BLUE     4
 #define C_LIGHT_BLUE    5
 #define C_GREY          14
 #define C_WHITE         15
 
-/* Joystick states */
-#define JOY_UP          5
-#define JOY_DOWN        1
-#define JOY_LEFT        7
-#define JOY_RIGHT       3
-#define JOY_LEFT_UP     6
-#define JOY_LEFT_DOWN   8
-#define JOY_RIGHT_UP    4
-#define JOY_RIGHT_DOWN  2
-#define JOY_LBUTTON     1
-#define JOY_RBUTTON     2
-
-/* Joystick values */
-#define JOY_LEFT_DIR      1
-#define JOY_RIGHT_DIR     2
-#define JOY_LEFT_BUTTONS  3
-#define JOY_RIGHT_BUTTONS 4                     
-
 /* Protos */
-void __fastcall__ psg_outb( unsigned char b );
-void __fastcall__ psg_delay( unsigned char b );
-void psg_silence( void );
-void __fastcall__ bios_playsound( void *a, unsigned char b);
-unsigned char __fastcall__ joystate( unsigned char which );
+void __fastcall__ psg_outb(unsigned char b);
+void __fastcall__ psg_delay(unsigned char b);
+void psg_silence(void);
+void __fastcall__ bios_playsound(void *a, unsigned char b);
 
-#endif
+#endif  /* #ifndef _CVISION_H */
index ccae38e811041e1a1c7b78c11aec9f37f5f4ef1e..6faec38ebf0eee3db4caea7de347822cf363ee48 100644 (file)
@@ -4,11 +4,13 @@
 
         .export         _exit
         .export         __STARTUP__ : absolute = 1      ; Mark as startup
+        .export         irq2
         .import         zerobss, copydata
         .import         initlib, donelib, callmain
         .import         __VECTORS_LOAD__, __VECTORS_RUN__, __VECTORS_SIZE__
         .import         __ZP_LAST__, __STACKSIZE__, __RAM_START__
 
+        .include        "creativision.inc"
         .include        "zeropage.inc"
 
 ; ------------------------------------------------------------------------
@@ -61,8 +63,8 @@ loop:   jmp loop
 
 .segment        "VECTORS"
 
-irq1:   jmp     $FF3F
-irq2:   jmp     $FF52
+irq1:   jmp     BIOS_IRQ1_ADDR
+irq2:   jmp     BIOS_IRQ2_ADDR
 
 ; ------------------------------------------------------------------------
 ; Define CART setup values for BIOS.
@@ -92,7 +94,7 @@ irq2:   jmp     $FF52
         ; BIOS Vector after NMI or RESET
         ; Keeping with retail cartridges, we jump back to BIOS ROM and have it
         ; setup zeropage etc, and show the Creativision logo and copyright.
-        .addr $F808
+        .addr BIOS_NMI_RESET_ADDR
 
         ; BIOS Short Interrupt Handler
         ; Vectored from BIOS ROM:FE2C. This should contain a pointer to the user's
diff --git a/libsrc/creativision/irq.s b/libsrc/creativision/irq.s
new file mode 100644 (file)
index 0000000..f154c91
--- /dev/null
@@ -0,0 +1,40 @@
+;
+; IRQ handling (CreatiVision version)
+;
+
+        .export         initirq, doneirq
+        .import         callirq, irq2
+
+        .include        "creativision.inc"
+
+; ------------------------------------------------------------------------
+
+.segment        "ONCE"
+
+initirq:
+        lda     #<IRQStub
+        ldx     #>IRQStub
+        jmp     setvec
+
+; ------------------------------------------------------------------------
+
+.code
+
+doneirq:
+        lda     #<BIOS_IRQ2_ADDR
+        ldx     #>BIOS_IRQ2_ADDR
+setvec: sei
+        sta     irq2+1
+        stx     irq2+2
+        cli
+        rts
+
+; ------------------------------------------------------------------------
+
+.segment        "CODE"
+
+IRQStub:
+        cld                             ; Just to be sure
+        jsr     callirq                 ; Call the functions
+        jmp     BIOS_IRQ2_ADDR          ; Jump to the BIOS IRQ vector
+
index f24a8045b786e434064981f451527d835fd980d0..37b927d08c6fa40497e66cf15c963ca619f830ba 100644 (file)
@@ -49,7 +49,7 @@
 ; ------------------------------------------------------------------------
 ; Constants
 
-JOY_COUNT       = 2             ; Number of joysticks we support
+JOY_COUNT       = 2                     ; Number of joysticks we support
 
 ; ------------------------------------------------------------------------
 ; Code
@@ -66,7 +66,7 @@ JOY_COUNT       = 2             ; Number of joysticks we support
 INSTALL:
         lda     #JOY_ERR_OK
         ldx     #0
-;       rts                     ; Fall through
+;       rts                             ; Fall through
 
 ; ------------------------------------------------------------------------
 ; UNINSTALL routine. Is called before the driver is removed from memory.
@@ -91,14 +91,14 @@ COUNT:
 ;
 
 READJOY:
-        and     #1              ; fix joystick number
-        bne     READJOY_1       ; read right joystick
+        and     #1                      ; fix joystick number
+        bne     READJOY_1               ; read right joystick
 
 ; Read left joystick
 
         ldx     ZP_JOY0_DIR
         lda     ZP_JOY0_BUTTONS
-        jmp     convert         ; convert joystick state to sane cc65 values
+        jmp     convert                 ; convert joystick state to sane cc65 values
 
 ; Read right joystick
 
@@ -108,8 +108,8 @@ READJOY_1:
         lda     ZP_JOY1_BUTTONS
         lsr     a
         lsr     a
-        ;jmp    convert         ; convert joystick state to sane cc65 values
-                                ; fall thru...
+        ;jmp    convert                 ; convert joystick state to sane cc65 values
+                                        ; fall thru...
 
 ; ------------------------------------------------------------------------
 ; convert: make runtime lib compatible values
@@ -119,7 +119,7 @@ READJOY_1:
 
 convert:
         ldy     #0
-        sty     retval          ; initialize return value
+        sty     retval                  ; initialize return value
 
 ; ------
 ; buttons:
@@ -127,7 +127,7 @@ convert:
         ; values were shifted to the right to be identical).
         ; Why are there two bits indicating a pressed trigger?
         ; According to the "Second book of programs for the Dick Smith Wizard"
-       ; (pg. 88ff), the left hand fire button gives the value of
+        ; (pg. 88ff), the left hand fire button gives the value of
         ; %00010001 and the right hand button gives %00100010
         ; Why two bits? Am I missing something? Can there be cases that just
         ; one of those bits is set?
@@ -137,7 +137,7 @@ convert:
         and     #%00010001
         beq     cnv_1
 
-        inc     retval           ; left button pressed
+        inc     retval                  ; left button pressed
 
 cnv_1:  tya
         and     #%00100010
@@ -145,45 +145,47 @@ cnv_1:  tya
 
         lda     #$02
         ora     retval
-        sta     retval           ; right button pressed
+        sta     retval                  ; right button pressed
 
 ; ------
 ; direction:
 cnv_2:  txa
-       ; tested with https://sourceforge.net/projects/creativisionemulator
-       ; $49 - %01001001 - up
-       ; $41 - %01000001 - down
-       ; $4D - %01001101 - left
-       ; $45 - %01000101 - right
-       ;
-       ; are these correct? "Second book of programs for the Dick Smith Wizard" pg. 85 says something different
-       ; ignored for now...
-       ; $85 - %10000101 - up + right
-       ; $8D - %10001101 - down + left
-       ; $89 - %10001001 - up + left
-       ; $85 - %10000101 - down + right (emulator bug?)
-
-       bit     testbit         ; bit #0 set?
-       beq     done            ; no, no direction
-
-       and     #%00001100      ; mask out other bits
-       tax
-       lda     #%00000100      ; init bitmask
-loop:  dex
-       bmi     done2
-       asl     a
-       bne     loop
-
-done2: ora     retval
-       rts
-
-done:  lda     retval
-       rts
+        ; tested with https://sourceforge.net/projects/creativisionemulator
+        ; $49 - %01001001 - up
+        ; $41 - %01000001 - down
+        ; $4D - %01001101 - left
+        ; $45 - %01000101 - right
+        ;
+        ; are these correct? "Second book of programs for the Dick Smith Wizard" pg. 85 says something different
+        ; ignored for now...
+        ; $85 - %10000101 - up + right
+        ; $8D - %10001101 - down + left
+        ; $89 - %10001001 - up + left
+        ; $85 - %10000101 - down + right (emulator bug?)
+
+        bit     testbit                 ; bit #0 set?
+        beq     done                    ; no, no direction
+
+        and     #%00001100              ; mask out other bits
+        lsr     a
+        lsr     a
+        tax
+        lda     #%00000100              ; init bitmask
+loop:   dex
+        bmi     done2
+        asl     a
+        bne     loop
+
+done2:  ora     retval
+        rts
+
+done:   lda     retval
+        rts
 
 ; ------------------------------------------------------------------------
 ;
         .data
-testbit:.byte  $01
+testbit:.byte   $01
 
 ; ------------------------------------------------------------------------
 ;
index 0a5c809022c31d21c5257c7897c8b9ec6c029a57..fc751ebdcfa6d7f1b9e557b8e5623ea92ecb551f 100644 (file)
@@ -46,7 +46,7 @@ int main (void)
 
     clrscr ();
     count = joy_count ();
-#ifdef __ATARI5200__
+#if defined(__ATARI5200__) || defined(__CREATIVISION__)
     cprintf ("JOYSTICKS: %d", count);
 #else
     cprintf ("Driver supports %d joystick(s)", count);
@@ -55,13 +55,13 @@ int main (void)
         for (i = 0; i < count; ++i) {
             gotoxy (0, i+1);
             j = joy_read (i);
-#ifdef __ATARI5200__
+#if defined(__ATARI5200__) || defined(__CREATIVISION__)
             cprintf ("%1d:%-3s%-3s%-3s%-3s%-3s%-3s",
                      i,
-                     (j & joy_masks[JOY_UP])?    " U " : " u ",
-                     (j & joy_masks[JOY_DOWN])?  " D " : " d ",
-                     (j & joy_masks[JOY_LEFT])?  " L " : " l ",
-                     (j & joy_masks[JOY_RIGHT])? " R " : " r ",
+                     (j & joy_masks[JOY_UP])?    " U " : "   ",
+                     (j & joy_masks[JOY_DOWN])?  " D " : "   ",
+                     (j & joy_masks[JOY_LEFT])?  " L " : "   ",
+                     (j & joy_masks[JOY_RIGHT])? " R " : "   ",
                      (j & joy_masks[JOY_FIRE])?  " 1 " : "   ",
                      (j & joy_masks[JOY_FIRE2])? " 2 " : "   ");
 #else