From 5a0041df7a71af732cee2725f000097b8d630370 Mon Sep 17 00:00:00 2001 From: cuz Date: Sat, 27 Sep 2003 20:14:31 +0000 Subject: [PATCH] Added two more joystick drivers from groepaz git-svn-id: svn://svn.cc65.org/cc65/trunk@2454 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/c64/Makefile | 2 +- libsrc/c64/c64-hitjoy.s | 252 ++++++++++++++++++++++++++++++++++++++++ libsrc/c64/c64-ptvjoy.s | 158 +++++++++++++++++++++++++ 3 files changed, 411 insertions(+), 1 deletion(-) create mode 100755 libsrc/c64/c64-hitjoy.s create mode 100755 libsrc/c64/c64-ptvjoy.s diff --git a/libsrc/c64/Makefile b/libsrc/c64/Makefile index 5263bdce5..2403b8bff 100644 --- a/libsrc/c64/Makefile +++ b/libsrc/c64/Makefile @@ -56,7 +56,7 @@ OBJS = _scrsize.o \ EMDS = c64-georam.emd c64-ram.emd c64-ramcart.emd c64-reu.emd c64-vdc.emd -JOYS = c64-stdjoy.joy +JOYS = c64-hitjoy.joy c64-ptvjoy.joy c64-stdjoy.joy SERS = c64-swlink.ser diff --git a/libsrc/c64/c64-hitjoy.s b/libsrc/c64/c64-hitjoy.s new file mode 100755 index 000000000..cb5dde3d9 --- /dev/null +++ b/libsrc/c64/c64-hitjoy.s @@ -0,0 +1,252 @@ +; +; DXS/HIT-4 Player joystick driver for the C64 +; +; Groepaz/Hitmen, 2002-12-23 +; obviously based on Ullrichs driver :) +; + + .include "zeropage.inc" + + .include "joy-kernel.inc" + .include "joy-error.inc" + .include "c64.inc" + + .macpack generic + +; ------------------------------------------------------------------------ +; Header. Includes jump table + + .segment "JUMPTABLE" + +; Driver signature + + .byte $6A, $6F, $79 ; "joy" + .byte $00 ; 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 ; Future expansion + .byte $00 ; Future expansion + .byte $00 ; Future expansion + +; Jump table. + + .word INSTALL + .word DEINSTALL + .word COUNT + .word READ + +; ------------------------------------------------------------------------ +; Constants + +JOY_COUNT = 4 ; Number of joysticks we support + +; ------------------------------------------------------------------------ +; Data. Written in the IRQ, read by the READ routine + +.bss + +temp3: .byte 0 +temp4: .byte 0 + +.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: + sei + lda $0314 + sta irqjmp+1 + lda $0315 + sta irqjmp+2 + lda #pollirq + sta $0315 + cli + + lda #JOY_ERR_OK + + rts + +; ------------------------------------------------------------------------ +; DEINSTALL routine. Is called before the driver is removed from memory. +; Can do cleanup or whatever. Must not return anything. +; + +DEINSTALL: + sei + lda irqjmp+1 + sta $0314 + lda irqjmp+2 + sta $0315 + cli + rts + +; ------------------------------------------------------------------------ +; we must use an irq here since we need timers +; which otherwhise would conflict with system-irq +pollirq: + ; cia 2 setup + + ldy #$00 ; port b direction + sty $dd03 ; => input + +; ldy #$00 + sty $dd05 ; cia2 timer a highbyte + sty $dc05 ; cia1 timer a highbyte + iny +; lda #$01 + sty $dd04 ; cia2 timer a lowbyte + sty $dc04 ; cia1 timer a lowbyte + + lda #%00010001 + sta $dd0e ; control register a + ; timer: start + ; continous + ; forced load + ; serial port: input + + ; cia 1 setup + +; lda #%00000001 +; sty $dc0d ; irq ctrl reg + + lda #%01010001 + sta $dc0e ; control register a + ; timer: start + ; continous + ; forced load + ; serial port: output + + + ; read directions 3 + + lda $dd01 ;read cia 2 port b + and #$0f + sta temp3 + + ; read button 3 + + lda $dd02 ;cia 2 port a + and #%11111011 ;data direction + sta $dd02 ;=> bit 2 input + + lda $dd00 ;read cia 2 p.A + and #%00000100 ;check bit 2 + asl a + asl a + ora temp3 + sta temp3 + + ; read directions 4 + + lda $dd01 ;read cia 2 port b + lsr a + lsr a + lsr a + lsr a + sta temp4 + + ; read button 4 + + ldx #$ff ;serial data register + stx $dc0c;=> writing $ff causes + ;cia to output some + ;count signals at cnt1 + + ldx $dd0c ;read cia 2 serial in + beq fire ;button press if zero + + lda temp4 + ora #%00010000 + sta temp4 + +fire: + + ; Default Value: $40/64 on PAL + ; $42/66 on NTSC + lda #$41 + sta $dc05 + ; Default Value: $25/37 on PAL + ; $95/149 on NTSC + lda #0 + sta $dc04 + +irqjmp: jmp $dead + +; ------------------------------------------------------------------------ +; COUNT: Return the total number of available joysticks in a/x. +; + +COUNT: + lda #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 + sei + sta CIA1_PRA + lda CIA1_PRB + cli + and #$1F + eor #$1F + rts + + ; Read joystick 2 +joy2: + dex + bne joy3 + + ; ldx #0 + lda #$E0 + ldy #$FF + sei + sta CIA1_DDRA + lda CIA1_PRA + sty CIA1_DDRA + cli + and #$1F + eor #$1F + rts + + ; Read joystick 3 + +joy3: + dex + bne joy4 + + lda temp3 + eor #$1F + ldx #0 + rts + + ; Read joystick 4 + +joy4: + lda temp4 + eor #$1F + ldx #0 + rts + diff --git a/libsrc/c64/c64-ptvjoy.s b/libsrc/c64/c64-ptvjoy.s new file mode 100755 index 000000000..6e01895cf --- /dev/null +++ b/libsrc/c64/c64-ptvjoy.s @@ -0,0 +1,158 @@ +; +; PTV-4 Player joystick driver for the C64 +; +; Groepaz/Hitmen, 2002-12-23 +; obviously based on Ullrichs driver :) +; + + .include "zeropage.inc" + + .include "joy-kernel.inc" + .include "joy-error.inc" + .include "c64.inc" + + .macpack generic + +; ------------------------------------------------------------------------ +; Header. Includes jump table + + .segment "JUMPTABLE" + +; Driver signature + + .byte $6A, $6F, $79 ; "joy" + .byte $00 ; 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 ; Future expansion + .byte $00 ; Future expansion + .byte $00 ; Future expansion + +; Jump table. + + .word INSTALL + .word DEINSTALL + .word COUNT + .word READ + +; ------------------------------------------------------------------------ +; Constants + +JOY_COUNT = 4 ; 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 + +; rts ; Run into DEINSTALL instead + +; ------------------------------------------------------------------------ +; DEINSTALL routine. Is called before the driver is removed from memory. +; Can do cleanup or whatever. Must not return anything. +; + +DEINSTALL: + rts + + +; ------------------------------------------------------------------------ +; COUNT: Return the total number of available joysticks in a/x. +; + +COUNT: + lda #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 + sei + sta CIA1_PRA + lda CIA1_PRB + cli + and #$1F + eor #$1F + rts + + ; Read joystick 2 + +joy2: + dex + bne joy3 + + ; ldx #0 + lda #$E0 + ldy #$FF + sei + sta CIA1_DDRA + lda CIA1_PRA + sty CIA1_DDRA + cli + and #$1F + eor #$1F + rts + + ; Read joystick 3 + +joy3: + dex + bne joy4 + + lda #%10000000 ; cia 2 port B Data-Direction + sta $dd03 ; bit 7: out bit 6-0: in + + lda #$80 ; cia 2 port B read/write + sta $dd01 ; (output one at PB7) + + lda $dd01 ; cia 2 port B read/write + and #$1f ; get bit 4-0 (PB4-PB0) + ; ldx #0 + rts + + ; Read joystick 4 + +joy4: + lda #%10000000 ; cia 2 port B Data-Direction + sta $dd03 ; bit 7: out bit 6-0: in + + lda #$00 ; cia 2 port B read/write + sta $dd01 ; (output zero at PB7) + + lda $dd01 ; cia 2 port B read/write + and #$0f ; get bit 3-0 (PB3-PB0) + sta tmp1 ; joy 4 directions + + lda $dd01 ; cia 2 port B read/write + and #%00100000 ; get bit 5 (PB5) + lsr + ora tmp1 + + ldx #0 + rts + -- 2.39.5