127 lines
3.2 KiB
NASM
127 lines
3.2 KiB
NASM
|
|
CheckJoypadModeLUT:
|
|
.dw CheckJoypadSinglePlayer
|
|
.dw CheckJoypad8Player
|
|
.dw CheckJoypadVoid
|
|
.dw CheckJoypadVoid
|
|
|
|
CheckJoypadVoid:
|
|
rts
|
|
|
|
|
|
;slow joypad checker, gets data for all 8 joypads with iobit=0.
|
|
;writes collected data to 8 individual joypad buffers
|
|
CheckJoypad8Player:
|
|
lda $4212
|
|
bit #$01
|
|
bne CheckJoypad8Player
|
|
|
|
rep #$31
|
|
lda.w $4218
|
|
sta.w JoyPortBuffer&$ffff ;port1 pad 1
|
|
lda.w $421c
|
|
sta.w JoyPortBuffer&$ffff+2 ;port1 pad 2
|
|
lda.w $421a
|
|
sta.w JoyPortBuffer&$ffff+8 ;port2 pad 1
|
|
lda.w $421e
|
|
sta.w JoyPortBuffer&$ffff+10 ;port2 pad 2
|
|
|
|
;assume we don't need to latch again:
|
|
sep #$20
|
|
|
|
lda.b #%11000000 ;enable iobit on joyport1&2
|
|
sta.w $4201
|
|
|
|
lda.b #1
|
|
sta.w $4016 ;enable latching
|
|
|
|
stz.w $4016 ;latching end
|
|
|
|
|
|
rep #$31
|
|
|
|
ldx #16 ;get 32 bits from every port
|
|
CheckJoyPortsLoop3:
|
|
lda.w $4016
|
|
lsr a ;put bit0 into carry
|
|
rol.w JoyPortBuffer&$ffff+4 ;port 1 pad 3
|
|
lsr a ;put bit1 into carry
|
|
rol.w JoyPortBuffer&$ffff+6 ;port 1 pad 4
|
|
|
|
asl a ;get upper byte
|
|
asl a
|
|
xba
|
|
|
|
lsr a ;put bit0 into carry
|
|
rol.w JoyPortBuffer&$ffff+12 ;port 2 pad 3
|
|
lsr a ;put bit1 into carry
|
|
rol.w JoyPortBuffer&$ffff+14 ;port 2 pad 4
|
|
dex
|
|
bne CheckJoyPortsLoop3
|
|
|
|
sep #$20
|
|
lda.b #1
|
|
sta.w $4016 ;enable latching
|
|
nop ;short delay is needed, otherwise mp5 sometimes doesn't respond in time.
|
|
nop
|
|
lda.w $4016 ;discard first read
|
|
lda.w $4016
|
|
and.b #%00000010 ;get data1,2 bits only
|
|
; cmp.b #%10 ;mp5 on port1?
|
|
bne Port1MP5Connected
|
|
|
|
stz.w JoyPortBuffer&$ffff+4 ;clear this joypads data if no mp5 connected
|
|
stz.w JoyPortBuffer&$ffff+5 ;clear this joypads data if no mp5 connected
|
|
|
|
Port1MP5Connected:
|
|
lda.w $4017 ;discard first read
|
|
lda.w $4017
|
|
and.b #%00000010 ;get data1,2 bits only
|
|
; cmp.b #%10 ;mp5 on port2?
|
|
bne Port2MP5Connected
|
|
|
|
stz.w JoyPortBuffer&$ffff+$c ;clear this joypads data if no mp5 connected
|
|
stz.w JoyPortBuffer&$ffff+$d ;clear this joypads data if no mp5 connected
|
|
|
|
Port2MP5Connected:
|
|
stz.w $4016 ;latching end
|
|
|
|
rep #$31
|
|
ldx.w #0
|
|
CheckJoyPortsTriggerLoop:
|
|
lda.w JoyPortBufferOld&$ffff,x ;get last button state
|
|
eor.w #$ffff ;xor
|
|
sta.w JoyPortBufferTrigger&$ffff,x
|
|
lda.w JoyPortBuffer&$ffff,x
|
|
sta.w JoyPortBufferOld&$ffff,x
|
|
and.w JoyPortBufferTrigger&$ffff,x ;and and only get buttons that werent pressed last frame
|
|
sta.w JoyPortBufferTrigger&$ffff,x ;store in old joypad trigger buffer
|
|
inx
|
|
inx
|
|
cpx.w #8*2 ;process 8 entries
|
|
bne CheckJoyPortsTriggerLoop
|
|
|
|
|
|
sep #$20
|
|
stz.w $4201 ;clear iobit again.
|
|
rts
|
|
|
|
|
|
;fast joy1 checker. check this late in nmi so we don't have to wait for auto joypad read to finish:
|
|
CheckJoypadSinglePlayer:
|
|
lda $4212
|
|
bit #$01
|
|
bne CheckJoypadSinglePlayer
|
|
|
|
rep #$30
|
|
lda.w JoyPortBufferOld&$ffff ;get last button state
|
|
eor.w #$ffff ;xor
|
|
sta.w JoyPortBufferTrigger&$ffff
|
|
lda $4218
|
|
sta.w JoyPortBuffer&$ffff
|
|
sta.w JoyPortBufferOld&$ffff
|
|
and.w JoyPortBufferTrigger&$ffff ;and and only get buttons that werent pressed last frame
|
|
sta.w JoyPortBufferTrigger&$ffff ;store in joypad buffer
|
|
sep #$20
|
|
rts
|