1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
;
; Standard joystick driver for the PCEngine
;
.include "joy-kernel.inc"
.include "joy-error.inc"
.include "pce.inc"
.macpack module
; ------------------------------------------------------------------------
; Header. Includes jump table
module_header _pce_stdjoy_joy
; Driver signature
.byte $6A, $6F, $79 ; "joy"
.byte JOY_API_VERSION ; Driver API version number
; 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
.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 a JOY_ERR_xx code in a/x.
;
INSTALL:
lda #<JOY_ERR_OK
ldx #>JOY_ERR_OK
; rts ; Run into UNINSTALL instead
; ------------------------------------------------------------------------
; DEINSTALL 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.
;
;unsigned char __fastcall__ joy_count (void);
COUNT:
lda #<JOY_COUNT
clx ; ldx #>JOY_COUNT
rts
; ------------------------------------------------------------------------
; READ: Read a particular joystick passed in A.
;
;unsigned char __fastcall__ joy_read (unsigned char joystick);
READJOY:
pha
jsr read_joy
pla
tax ; Joystick number into X
; return value from buffer
joy1:
lda padbuffer,x
rts
read_joy:
; Reset Multitap counter.
lda #$01
sta JOY_CTRL
pha
pla
nop
nop
lda #$03
sta JOY_CTRL
pha
pla
nop
nop
cly
nextpad:
lda #$01
sta JOY_CTRL ; sel = 1
pha
pla
nop ; some delay is required
nop
lda JOY_CTRL
asl a
asl a
asl a
asl a
sta padbuffer,y ; store new value
stz JOY_CTRL
pha
pla
nop ; some delay is required
nop
lda JOY_CTRL
and #$0F
ora padbuffer,y ; second half of new value
eor #$FF
sta padbuffer,y ; store new value
iny
cpy #.sizeof(padbuffer)
bcc nextpad
rts
|