]> git.sur5r.net Git - cc65/commitdiff
intermediate check-in -- creativision joystick driver
authorChristian Groessler <chris@groessler.org>
Wed, 8 Feb 2017 13:34:35 +0000 (14:34 +0100)
committerChristian Groessler <chris@groessler.org>
Wed, 8 Feb 2017 13:34:35 +0000 (14:34 +0100)
asminc/creativision.inc
libsrc/creativision/joy/creativision-stdjoy.s [new file with mode: 0644]
libsrc/creativision/joy_stat_stddrv.s [new file with mode: 0644]
libsrc/creativision/libref.s

index 624b65e8fc707440d49bcb064822ea3d7b47852f..bd30bc4627cfcc21db9afb04e53b71681710b186 100644 (file)
@@ -29,10 +29,10 @@ CH_URCORNER             = 36
 CH_LLCORNER             = 37
 CH_LRCORNER             = 38
 
-;** I/O
+;** I/O (Zero-page variables)
 ZP_KEYBOARD             = $10
 ZP_JOY0_DIR             = $11
 ZP_JOY1_DIR             = $13
-ZP_JOY_LBUTTONS         = $16
-ZP_JOY_RBUTTONS         = $17
+ZP_JOY0_BUTTONS         = $16
+ZP_JOY1_BUTTONS         = $17
 
diff --git a/libsrc/creativision/joy/creativision-stdjoy.s b/libsrc/creativision/joy/creativision-stdjoy.s
new file mode 100644 (file)
index 0000000..f24a804
--- /dev/null
@@ -0,0 +1,191 @@
+;
+; Standard joystick driver for the Creativision.
+;
+; Christian Groessler, 2017-02-06
+;
+
+        .include        "zeropage.inc"
+
+        .include        "joy-kernel.inc"
+        .include        "joy-error.inc"
+        .include        "creativision.inc"
+
+        .macpack        module
+
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table
+
+        module_header   _creativisionstd_joy
+
+; Driver signature
+
+        .byte   $6A, $6F, $79           ; "joy"
+        .byte   JOY_API_VERSION         ; Driver API version number
+
+; Library reference
+
+        .addr   $0000
+
+; Button state masks (8 values)
+
+        .byte   $10                     ; JOY_UP
+        .byte   $04                     ; JOY_DOWN
+        .byte   $20                     ; JOY_LEFT
+        .byte   $08                     ; JOY_RIGHT
+        .byte   $01                     ; JOY_FIRE (button #1)
+        .byte   $02                     ; JOY_FIRE2 (button #2)
+        .byte   $00                     ; Future expansion
+        .byte   $00                     ; Future expansion
+
+; Jump table.
+
+        .addr   INSTALL
+        .addr   UNINSTALL
+        .addr   COUNT
+        .addr   READJOY
+        .addr   0                       ; IRQ entry not used
+
+; ------------------------------------------------------------------------
+; Constants
+
+JOY_COUNT       = 2             ; Number of joysticks we support
+
+; ------------------------------------------------------------------------
+; Code
+
+        .code
+
+; ------------------------------------------------------------------------
+; INSTALL routine. Is called after the driver is loaded into memory. If
+; possible, check if the hardware is present and determine the amount of
+; memory available.
+; Must return an JOY_ERR_xx code in a/x.
+;
+
+INSTALL:
+        lda     #JOY_ERR_OK
+        ldx     #0
+;       rts                     ; Fall through
+
+; ------------------------------------------------------------------------
+; UNINSTALL routine. Is called before the driver is removed from memory.
+; Can do cleanup or whatever. Must not return anything.
+;
+
+UNINSTALL:
+        rts
+
+
+; ------------------------------------------------------------------------
+; COUNT: Return the total number of available joysticks in a/x.
+;
+
+COUNT:
+        lda     #<JOY_COUNT
+        ldx     #>JOY_COUNT
+        rts
+
+; ------------------------------------------------------------------------
+; READ: Read a particular joystick passed in A.
+;
+
+READJOY:
+        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
+
+; Read right joystick
+
+READJOY_1:
+
+        ldx     ZP_JOY1_DIR
+        lda     ZP_JOY1_BUTTONS
+        lsr     a
+        lsr     a
+        ;jmp    convert         ; convert joystick state to sane cc65 values
+                                ; fall thru...
+
+; ------------------------------------------------------------------------
+; convert: make runtime lib compatible values
+;       A - buttons
+;       X - direction
+;
+
+convert:
+        ldy     #0
+        sty     retval          ; initialize return value
+
+; ------
+; buttons:
+        ; Port values are for the left hand joystick (right hand joystick
+        ; 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
+        ; %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?
+        ; We just test if any of those two bits is not zero...
+
+        tay
+        and     #%00010001
+        beq     cnv_1
+
+        inc     retval           ; left button pressed
+
+cnv_1:  tya
+        and     #%00100010
+        beq     cnv_2
+
+        lda     #$02
+        ora     retval
+        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
+
+; ------------------------------------------------------------------------
+;
+        .data
+testbit:.byte  $01
+
+; ------------------------------------------------------------------------
+;
+        .bss
+retval: .res    0
diff --git a/libsrc/creativision/joy_stat_stddrv.s b/libsrc/creativision/joy_stat_stddrv.s
new file mode 100644 (file)
index 0000000..fc45864
--- /dev/null
@@ -0,0 +1,12 @@
+;
+; Address of the static standard joystick driver
+;
+; Christian Groessler, 2017-02-06
+;
+; const void joy_static_stddrv[];
+;
+
+        .export _joy_static_stddrv
+        .import _creativisionstd_joy
+
+_joy_static_stddrv := _creativisionstd_joy
index b642da80a734b7a204c1759b51ef1000115c1cf5..19e7e778f9fa4f2fa3b353617011a880756edf89 100644 (file)
@@ -2,8 +2,7 @@
 ; Oliver Schmidt, 2013-05-31
 ;
 
-        .export         joy_libref, tgi_libref
+        .export         joy_libref
         .import         _exit
 
 joy_libref      :=      _exit
-tgi_libref      :=      _exit