add loader
This commit is contained in:
126
snes/loader/routines/joypadread.asm
Normal file
126
snes/loader/routines/joypadread.asm
Normal file
@@ -0,0 +1,126 @@
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user