quickdev16/snes/monitor/routines/joypadread.asm
David Voswinkel a7270acdf1 o add monitor
2009-07-20 19:05:40 +02:00

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