]> git.sur5r.net Git - cc65/commitdiff
Driver for Protovision 4 Player Joystick by Stefan Haubenthal
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 28 Aug 2005 21:01:59 +0000 (21:01 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 28 Aug 2005 21:01:59 +0000 (21:01 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3595 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/vic20/Makefile
libsrc/vic20/vic20-ptvjoy.s [new file with mode: 0644]

index 7027185b719116fd9f67f4f83e093b89ab62521b..eae0e96c61b1e039ee6faa12cb3d2c725cd6a916 100644 (file)
@@ -61,7 +61,7 @@ OBJS =        _scrsize.o      \
 
 EMDS =
 
-JOYS = vic20-stdjoy.joy
+JOYS = vic20-stdjoy.joy vic20-ptvjoy.joy
 
 TGIS =
 
diff --git a/libsrc/vic20/vic20-ptvjoy.s b/libsrc/vic20/vic20-ptvjoy.s
new file mode 100644 (file)
index 0000000..72b341e
--- /dev/null
@@ -0,0 +1,146 @@
+;
+; PTV-3 Player joystick driver for the VIC20
+;
+; Stefan Haubenthal, 2005-05-25
+; Groepaz/Hitmen, 2002-12-23
+; obviously based on Ullrichs driver :)
+; Using code from Steve Schmidtke
+;
+
+       .include "zeropage.inc"
+
+       .include "joy-kernel.inc"
+       .include "joy-error.inc"
+       .include "vic20.inc"
+
+; ------------------------------------------------------------------------
+; Header. Includes jump table
+
+       .segment "JUMPTABLE"
+
+; Driver signature
+
+       .byte   $6A, $6F, $79   ; "joy"
+       .byte   JOY_API_VERSION ; Driver API version number
+
+; Button state masks (8 values)
+
+       .byte   $01                     ; JOY_UP
+       .byte   $02                     ; JOY_DOWN
+       .byte   $04                     ; JOY_LEFT
+       .byte   $08                     ; JOY_RIGHT
+       .byte   $10                     ; JOY_FIRE
+       .byte   $00                     ; JOY_FIRE2 unavailable
+       .byte   $00                     ; Future expansion
+       .byte   $00                     ; Future expansion
+
+; Jump table.
+
+       .addr   INSTALL
+       .addr   UNINSTALL
+       .addr   COUNT
+       .addr   READ
+       .addr   0                       ; IRQ entry unused
+
+; ------------------------------------------------------------------------
+; Constants
+
+VIA1_PRB               := VIA1         ; User port register
+JOY_COUNT      = 3             ; Number of joysticks we support
+
+
+.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     #>JOY_ERR_OK
+;      rts                     ; Run into UNINSTALL instead
+
+; ------------------------------------------------------------------------
+; 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.
+;
+
+READ:  tax                     ; Joystick number into X
+       bne     joy2
+
+; Read joystick 1
+
+joy1:  lda     #$7F            ; mask for VIA2 JOYBIT: sw3
+       ldx     #$C3            ; mask for VIA1 JOYBITS: sw0,sw1,sw2,sw4
+       sei                     ; necessary?
+
+       ldy     VIA2_DDRB       ; remember the date of DDRB
+       sta     VIA2_DDRB       ; set JOYBITS on this VIA for input
+       lda     VIA2_JOY        ; read JOYBIT: sw3
+       sty     VIA2_DDRB       ; restore the state of DDRB
+       asl                     ; Shift sw3 into carry
+
+       ldy     VIA1_DDRA       ; remember the state of DDRA
+       stx     VIA1_DDRA       ; set JOYBITS on this VIA for input
+       lda     VIA1_JOY        ; read JOYBITS: sw0,sw1,sw2,sw4
+       sty     VIA1_DDRA       ; restore the state of DDRA
+
+       cli                     ; necessary?
+       ror                     ; Shift sw3 into bit 7
+       and     #$9E            ; Mask relevant bits
+       eor     #$9E            ; Active states are inverted
+
+       rts
+
+; Read joystick 2
+
+joy2:  lda     #%10000000      ; via port B Data-Direction
+       sta     VIA1_DDRB       ; bit 7: out    bit 6-0: in
+
+       dex
+       bne     joy3
+
+       lda     #$80            ; via port B read/write
+       sta     VIA1_PRB        ; (output one at PB7)
+
+       lda     VIA1_PRB        ; via port B read/write
+       and     #$1f            ; get bit 4-0 (PB4-PB0)
+       rts
+
+; Read joystick 3
+
+joy3:  lda     #$00            ; via port B read/write
+       sta     VIA1_PRB        ; (output zero at PB7)
+
+       lda     VIA1_PRB        ; via port B read/write
+       and     #$0f            ; get bit 3-0 (PB3-PB0)
+       sta     tmp1            ; joy 4 directions
+
+       lda     VIA1_PRB        ; via port B read/write
+       and     #%00100000      ; get bit 5 (PB5)
+       lsr
+       ora     tmp1
+
+       ldx     #0
+       rts
+