cc65/libsrc/pce/joy/pce-stdjoy.s

144 lines
3.0 KiB
ArmAsm
Raw Normal View History

2015-07-12 12:27:24 +00:00
;
; Standard joystick driver for the PCEngine
;
.include "joy-kernel.inc"
.include "joy-error.inc"
2015-08-29 13:58:57 +00:00
.include "pce.inc"
2015-07-12 12:27:24 +00:00
.macpack module
; ------------------------------------------------------------------------
; Header. Includes jump table
module_header _pce_stdjoy_joy
; Driver signature
2015-10-02 14:50:22 +00:00
.byte $6A, $6F, $79 ; "joy"
.byte JOY_API_VERSION ; Driver API version number
2015-07-12 12:27:24 +00:00
; Library reference
.addr $0000
; Jump table.
.addr INSTALL
.addr UNINSTALL
.addr COUNT
.addr READJOY
; ------------------------------------------------------------------------
; Constants
JOY_COUNT = 4 ; Number of joysticks we support
.bss
padbuffer: .res JOY_COUNT
2015-07-12 12:27:24 +00:00
.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.
2015-10-02 14:50:22 +00:00
; Must return a JOY_ERR_xx code in a/x.
2015-07-12 12:27:24 +00:00
;
INSTALL:
2023-02-26 19:03:41 +00:00
lda #JOY_ERR_OK
.assert JOY_ERR_OK = 0, error
tax
2015-07-12 12:27:24 +00:00
2015-08-29 13:58:57 +00:00
; rts ; Run into UNINSTALL instead
2015-07-12 12:27:24 +00:00
; ------------------------------------------------------------------------
; DEINSTALL routine. Is called before the driver is removed from memory.
; Can do cleanup or whatever. Must not return anything.
;
UNINSTALL:
2015-08-29 13:58:57 +00:00
rts
2015-07-12 12:27:24 +00:00
; ------------------------------------------------------------------------
; COUNT: Return the total number of available joysticks in a/x.
;
;unsigned char __fastcall__ joy_count (void);
COUNT:
2015-08-29 13:58:57 +00:00
lda #<JOY_COUNT
clx ; ldx #>JOY_COUNT
2015-08-29 13:58:57 +00:00
rts
2015-07-12 12:27:24 +00:00
; ------------------------------------------------------------------------
; READ: Read a particular joystick passed in A.
;
;unsigned char __fastcall__ joy_read (unsigned char joystick);
READJOY:
2015-08-29 13:58:57 +00:00
pha
jsr read_joy
pla
tax ; Joystick number into X
2015-07-12 12:27:24 +00:00
2015-08-29 13:58:57 +00:00
; return value from buffer
2015-07-12 12:27:24 +00:00
joy1:
2015-08-29 13:58:57 +00:00
lda padbuffer,x
rts
2015-07-12 12:27:24 +00:00
read_joy:
2015-10-02 14:50:22 +00:00
; Reset Multitap counter.
2015-08-29 13:58:57 +00:00
lda #$01
sta JOY_CTRL
pha
pla
nop
nop
lda #$03
sta JOY_CTRL
pha
pla
nop
nop
cly
2015-07-12 12:27:24 +00:00
nextpad:
2015-08-29 13:58:57 +00:00
lda #$01
2015-10-02 14:50:22 +00:00
sta JOY_CTRL ; sel = 1
2015-08-29 13:58:57 +00:00
pha
pla
nop ; some delay is required
nop
lda JOY_CTRL
asl a
asl a
asl a
asl a
2015-10-02 14:50:22 +00:00
sta padbuffer,y ; store new value
2015-08-29 13:58:57 +00:00
stz JOY_CTRL
pha
pla
nop ; some delay is required
nop
lda JOY_CTRL
and #$0F
2015-10-02 14:50:22 +00:00
ora padbuffer,y ; second half of new value
2015-08-29 13:58:57 +00:00
eor #$FF
2015-10-02 14:50:22 +00:00
sta padbuffer,y ; store new value
2015-08-29 13:58:57 +00:00
iny
cpy #.sizeof(padbuffer)
2015-08-29 13:58:57 +00:00
bcc nextpad
rts