gbdk-releases/gbdk-lib/libc/gb/pad.s
2015-01-10 16:25:08 +01:00

81 lines
1.3 KiB
ArmAsm

.include "global.s"
;; BANKED: checked
.area _BASE
;; Wait until all buttons have been released
.padup::
_waitpadup::
PUSH AF ; Save modified registers
PUSH BC
1$:
LD B,#0xFF
2$:
CALL .jpad
OR A ; Have all buttons been released?
JR NZ,1$ ; Not yet
DEC B
JR NZ,2$
POP BC ; Restore registers
POP AF
RET
;; Get Keypad Button Status
;; The following bits are set if pressed:
;; 0x80 - Start 0x08 - Down
;; 0x40 - Select 0x04 - Up
;; 0x20 - B 0x02 - Left
;; 0x10 - A 0x01 - Right
.jpad::
PUSH BC ; Save modified registers
LD A,#0x20
LDH (.P1),A ; Turn on P15
LDH A,(.P1) ; Delay
LDH A,(.P1)
CPL
AND #0x0F
SWAP A
LD B,A
LD A,#0x10
LDH (.P1),A ; Turn on P14
LDH A,(.P1) ; Delay
LDH A,(.P1)
LDH A,(.P1)
LDH A,(.P1)
LDH A,(.P1)
LDH A,(.P1)
CPL
AND #0x0F
OR B
SWAP A
LD B,A
LD A,#0x30
LDH (.P1),A ; Turn off P14 and P15 (reset joypad)
LD A,B
POP BC ; Restore registers
RET
;; Wait for the key in B to be pressed
.wait_pad::
1$:
CALL .jpad ; Read pad
AND B ; Compare with mask?
JR Z,1$ ; Loop if no intersection
RET
_joypad::
CALL .jpad
LD E,A ; Return result in DE
RET
_waitpad::
PUSH BC
LDA HL,4(SP) ; Skip return address and registers
LD B,(HL)
CALL .wait_pad
LD E,A ; Return result in DE
POP BC
RET