pokecrystal-board/home/joypad.asm

473 lines
7.5 KiB
NASM
Raw Normal View History

2018-06-24 07:09:41 -07:00
JoypadInt::
2013-02-19 20:57:07 -08:00
; Replaced by Joypad, called from VBlank instead of the useless
; joypad interrupt.
; This is a placeholder in case the interrupt is somehow enabled.
reti
2018-06-24 07:09:41 -07:00
ClearJoypad::
2013-02-19 20:57:07 -08:00
xor a
; Pressed this frame (delta)
2013-03-20 19:55:09 -07:00
ld [hJoyPressed], a
2013-02-19 20:57:07 -08:00
; Currently pressed
2013-03-20 19:55:09 -07:00
ld [hJoyDown], a
2013-02-19 20:57:07 -08:00
ret
2018-06-24 07:09:41 -07:00
Joypad::
2013-02-19 20:57:07 -08:00
; Read the joypad register and translate it to something more
; workable for use in-game. There are 8 buttons, so we can use
; one byte to contain all player input.
; Updates:
2013-03-20 19:55:09 -07:00
; hJoypadReleased: released this frame (delta)
; hJoypadPressed: pressed this frame (delta)
; hJoypadDown: currently pressed
; hJoypadSum: pressed so far
2013-02-19 20:57:07 -08:00
; Any of these three bits can be used to disable input.
2015-02-10 15:14:41 -08:00
ld a, [wcfbe]
2013-02-19 20:57:07 -08:00
and %11010000
ret nz
2013-02-19 20:57:07 -08:00
; If we're saving, input is disabled.
ld a, [wGameLogicPaused]
2013-02-19 20:57:07 -08:00
and a
ret nz
2013-02-19 20:57:07 -08:00
; We can only get four inputs at a time.
; We take d-pad first for no particular reason.
2015-10-16 10:35:43 -07:00
ld a, R_DPAD
2013-02-19 23:46:40 -08:00
ld [rJOYP], a
2013-02-19 20:57:07 -08:00
; Read twice to give the request time to take.
2013-02-19 23:46:40 -08:00
ld a, [rJOYP]
ld a, [rJOYP]
2013-02-19 20:57:07 -08:00
; The Joypad register output is in the lo nybble (inversed).
; We make the hi nybble of our new container d-pad input.
cpl
and $f
swap a
2013-02-19 20:57:07 -08:00
; We'll keep this in b for now.
ld b, a
2013-02-19 20:57:07 -08:00
; Buttons make 8 total inputs (A, B, Select, Start).
; We can fit this into one byte.
2015-10-16 10:35:43 -07:00
ld a, R_BUTTONS
2013-02-19 23:46:40 -08:00
ld [rJOYP], a
2013-02-19 20:57:07 -08:00
; Wait for input to stabilize.
2015-07-20 19:18:18 -07:00
rept 6
2013-02-19 23:46:40 -08:00
ld a, [rJOYP]
2015-07-20 19:18:18 -07:00
endr
2013-02-19 20:57:07 -08:00
; Buttons take the lo nybble.
cpl
and $f
or b
ld b, a
2013-02-19 20:57:07 -08:00
; Reset the joypad register since we're done with it.
ld a, $30
2013-02-19 23:46:40 -08:00
ld [rJOYP], a
2013-02-19 20:57:07 -08:00
; To get the delta we xor the last frame's input with the new one.
2013-03-20 19:55:09 -07:00
ld a, [hJoypadDown] ; last frame
2013-02-19 20:57:07 -08:00
ld e, a
xor b
ld d, a
; Released this frame:
and e
2013-03-20 19:55:09 -07:00
ld [hJoypadReleased], a
2013-02-19 20:57:07 -08:00
; Pressed this frame:
ld a, d
and b
2013-03-20 19:55:09 -07:00
ld [hJoypadPressed], a
2013-02-19 20:57:07 -08:00
; Add any new presses to the list of collective presses:
ld c, a
2013-03-20 19:55:09 -07:00
ld a, [hJoypadSum]
2013-02-19 20:57:07 -08:00
or c
2013-03-20 19:55:09 -07:00
ld [hJoypadSum], a
2013-02-19 20:57:07 -08:00
; Currently pressed:
ld a, b
2013-03-20 19:55:09 -07:00
ld [hJoypadDown], a
2013-02-19 20:57:07 -08:00
; Now that we have the input, we can do stuff with it.
; For example, soft reset:
and A_BUTTON | B_BUTTON | SELECT | START
cp A_BUTTON | B_BUTTON | SELECT | START
2013-07-26 20:49:33 -07:00
jp z, Reset
2013-02-19 20:57:07 -08:00
ret
2018-06-24 07:09:41 -07:00
GetJoypad::
2013-03-20 19:55:09 -07:00
; Update mirror joypad input from hJoypadDown (real input)
2013-02-19 20:57:07 -08:00
2013-03-20 19:55:09 -07:00
; hJoyReleased: released this frame (delta)
; hJoyPressed: pressed this frame (delta)
; hJoyDown: currently pressed
2013-02-19 20:57:07 -08:00
; bit 0 A
; 1 B
; 2 SELECT
; 3 START
; 4 RIGHT
; 5 LEFT
; 6 UP
; 7 DOWN
push af
push hl
push de
push bc
2013-02-19 20:57:07 -08:00
; The player input can be automated using an input stream.
; See more below.
2018-01-23 14:39:09 -08:00
ld a, [wInputType]
cp AUTO_INPUT
2013-02-19 20:57:07 -08:00
jr z, .auto
; To get deltas, take this and last frame's input.
2013-03-20 19:55:09 -07:00
ld a, [hJoypadDown] ; real input
2013-02-19 20:57:07 -08:00
ld b, a
2013-03-20 19:55:09 -07:00
ld a, [hJoyDown] ; last frame mirror
2013-02-19 20:57:07 -08:00
ld e, a
2013-02-19 20:57:07 -08:00
; Released this frame:
xor b
ld d, a
and e
2013-03-20 19:55:09 -07:00
ld [hJoyReleased], a
2013-02-19 20:57:07 -08:00
; Pressed this frame:
ld a, d
and b
2013-03-20 19:55:09 -07:00
ld [hJoyPressed], a
2013-02-19 20:57:07 -08:00
; It looks like the collective presses got commented out here.
ld c, a
2013-02-19 20:57:07 -08:00
; Currently pressed:
ld a, b
2013-03-20 19:55:09 -07:00
ld [hJoyDown], a ; frame input
2013-02-19 20:57:07 -08:00
.quit
pop bc
pop de
pop hl
pop af
ret
2013-02-19 20:57:07 -08:00
.auto
; Use a predetermined input stream (used in the catching tutorial).
; Stream format: [input][duration]
; A value of $ff will immediately end the stream.
; Read from the input stream.
2013-03-20 19:55:09 -07:00
ld a, [hROMBank]
2013-02-19 20:57:07 -08:00
push af
2018-01-23 14:39:09 -08:00
ld a, [wAutoInputBank]
2013-02-19 20:57:07 -08:00
rst Bankswitch
2018-01-23 14:39:09 -08:00
ld hl, wAutoInputAddress
2013-02-19 20:57:07 -08:00
ld a, [hli]
ld h, [hl]
ld l, a
2013-02-19 20:57:07 -08:00
; We only update when the input duration has expired.
2018-01-23 14:39:09 -08:00
ld a, [wAutoInputLength]
2013-02-19 20:57:07 -08:00
and a
jr z, .updateauto
2013-02-19 20:57:07 -08:00
; Until then, don't change anything.
dec a
2018-01-23 14:39:09 -08:00
ld [wAutoInputLength], a
2013-02-19 20:57:07 -08:00
pop af
rst Bankswitch
jr .quit
2013-02-19 20:57:07 -08:00
.updateauto
; An input of $ff will end the stream.
ld a, [hli]
cp -1
2013-02-19 20:57:07 -08:00
jr z, .stopauto
ld b, a
2013-02-19 20:57:07 -08:00
; A duration of $ff will end the stream indefinitely.
ld a, [hli]
2018-01-23 14:39:09 -08:00
ld [wAutoInputLength], a
cp -1
2013-02-19 20:57:07 -08:00
jr nz, .next
2013-02-19 20:57:07 -08:00
; The current input is overwritten.
dec hl
dec hl
2013-02-19 20:57:07 -08:00
ld b, NO_INPUT
jr .finishauto
2013-02-19 20:57:07 -08:00
.next
; On to the next input...
ld a, l
2018-01-23 14:39:09 -08:00
ld [wAutoInputAddress], a
2013-02-19 20:57:07 -08:00
ld a, h
2018-01-23 14:39:09 -08:00
ld [wAutoInputAddress+1], a
2013-02-19 20:57:07 -08:00
jr .finishauto
2013-02-19 20:57:07 -08:00
.stopauto
call StopAutoInput
ld b, NO_INPUT
2013-02-19 20:57:07 -08:00
.finishauto
pop af
rst Bankswitch
ld a, b
2013-03-20 19:55:09 -07:00
ld [hJoyPressed], a ; pressed
ld [hJoyDown], a ; input
2013-02-19 20:57:07 -08:00
jr .quit
2018-06-24 07:09:41 -07:00
StartAutoInput::
2013-02-19 20:57:07 -08:00
; Start reading automated input stream at a:hl.
2018-01-23 14:39:09 -08:00
ld [wAutoInputBank], a
2013-02-19 20:57:07 -08:00
ld a, l
2018-01-23 14:39:09 -08:00
ld [wAutoInputAddress], a
2013-02-19 20:57:07 -08:00
ld a, h
2018-01-23 14:39:09 -08:00
ld [wAutoInputAddress+1], a
2013-02-19 20:57:07 -08:00
; Start reading the stream immediately.
xor a
2018-01-23 14:39:09 -08:00
ld [wAutoInputLength], a
2013-02-19 20:57:07 -08:00
; Reset input mirrors.
xor a
2013-03-20 19:55:09 -07:00
ld [hJoyPressed], a ; pressed this frame
ld [hJoyReleased], a ; released this frame
ld [hJoyDown], a ; currently pressed
2013-02-19 20:57:07 -08:00
ld a, AUTO_INPUT
2018-01-23 14:39:09 -08:00
ld [wInputType], a
2013-02-19 20:57:07 -08:00
ret
2018-06-24 07:09:41 -07:00
StopAutoInput::
2013-02-19 20:57:07 -08:00
; Clear variables related to automated input.
xor a
2018-01-23 14:39:09 -08:00
ld [wAutoInputBank], a
ld [wAutoInputAddress], a
ld [wAutoInputAddress+1], a
ld [wAutoInputLength], a
2013-02-19 20:57:07 -08:00
; Back to normal input.
2018-01-23 14:39:09 -08:00
ld [wInputType], a
2013-02-19 20:57:07 -08:00
ret
2018-06-24 07:09:41 -07:00
JoyTitleScreenInput::
.loop
call DelayFrame
push bc
call JoyTextDelay
pop bc
ld a, [hJoyDown]
cp D_UP | SELECT | B_BUTTON
jr z, .keycombo
2015-10-16 10:35:43 -07:00
ld a, [hJoyLast]
and START | A_BUTTON
jr nz, .keycombo
dec c
jr nz, .loop
and a
ret
.keycombo
scf
ret
2018-06-24 07:09:41 -07:00
JoyWaitAorB::
.loop
call DelayFrame
call GetJoypad
ld a, [hJoyPressed]
and A_BUTTON | B_BUTTON
ret nz
call RTC
jr .loop
2018-06-24 07:09:41 -07:00
WaitButton::
ld a, [hOAMUpdate]
push af
ld a, 1
ld [hOAMUpdate], a
call WaitBGMap
call JoyWaitAorB
pop af
ld [hOAMUpdate], a
ret
2018-06-24 07:09:41 -07:00
JoyTextDelay::
call GetJoypad
2015-10-16 10:35:43 -07:00
ld a, [hInMenu]
and a
ld a, [hJoyPressed]
2015-10-16 10:35:43 -07:00
jr z, .ok
ld a, [hJoyDown]
2015-10-16 10:35:43 -07:00
.ok
ld [hJoyLast], a
ld a, [hJoyPressed]
and a
2015-10-16 10:35:43 -07:00
jr z, .checkframedelay
ld a, 15
2018-01-23 14:39:09 -08:00
ld [wTextDelayFrames], a
ret
2015-10-16 10:35:43 -07:00
.checkframedelay
2018-01-23 14:39:09 -08:00
ld a, [wTextDelayFrames]
and a
2015-10-16 10:35:43 -07:00
jr z, .restartframedelay
xor a
ld [hJoyLast], a
ret
2015-10-16 10:35:43 -07:00
.restartframedelay
ld a, 5
2018-01-23 14:39:09 -08:00
ld [wTextDelayFrames], a
ret
2018-06-24 07:09:41 -07:00
WaitPressAorB_BlinkCursor::
2015-11-02 08:15:32 -08:00
ld a, [hMapObjectIndexBuffer]
push af
2015-11-02 08:15:32 -08:00
ld a, [hObjectStructIndexBuffer]
push af
xor a
2015-11-02 08:15:32 -08:00
ld [hMapObjectIndexBuffer], a
ld a, 6
2015-11-02 08:15:32 -08:00
ld [hObjectStructIndexBuffer], a
.loop
push hl
2015-02-10 15:14:41 -08:00
hlcoord 18, 17
call BlinkCursor
pop hl
call JoyTextDelay
2015-10-16 10:35:43 -07:00
ld a, [hJoyLast]
and A_BUTTON | B_BUTTON
jr z, .loop
pop af
2015-11-02 08:15:32 -08:00
ld [hObjectStructIndexBuffer], a
pop af
2015-11-02 08:15:32 -08:00
ld [hMapObjectIndexBuffer], a
ret
2018-06-24 07:09:41 -07:00
SimpleWaitPressAorB::
.loop
call JoyTextDelay
2015-10-16 10:35:43 -07:00
ld a, [hJoyLast]
and A_BUTTON | B_BUTTON
jr z, .loop
ret
2018-06-24 07:09:41 -07:00
ButtonSound::
ld a, [wLinkMode]
and a
jr nz, .link
call .wait_input
push de
ld de, SFX_READ_TEXT_2
2013-10-08 10:10:36 -07:00
call PlaySFX
pop de
ret
.link
ld c, 65
jp DelayFrames
2018-06-24 07:09:41 -07:00
.wait_input
ld a, [hOAMUpdate]
push af
ld a, $1
ld [hOAMUpdate], a
2018-01-23 14:39:09 -08:00
ld a, [wInputType]
or a
jr z, .input_wait_loop
2017-12-24 09:47:30 -08:00
farcall _DudeAutoInput_A
.input_wait_loop
call .blink_cursor
call JoyTextDelay
ld a, [hJoyPressed]
and A_BUTTON | B_BUTTON
jr nz, .received_input
call RTC
ld a, $1
ld [hBGMapMode], a
call DelayFrame
jr .input_wait_loop
.received_input
pop af
ld [hOAMUpdate], a
ret
2018-06-24 07:09:41 -07:00
.blink_cursor
ld a, [hVBlankCounter]
and %00010000 ; bit 4, a
jr z, .cursor_off
ld a, "▼"
jr .load_cursor_state
.cursor_off
2017-12-29 14:07:21 -08:00
lda_coord 17, 17
.load_cursor_state
2017-12-29 14:07:21 -08:00
ldcoord_a 18, 17
ret
2018-06-24 07:09:41 -07:00
BlinkCursor::
push bc
ld a, [hl]
ld b, a
ld a, "▼"
cp b
pop bc
jr nz, .place_arrow
2015-11-02 08:15:32 -08:00
ld a, [hMapObjectIndexBuffer]
dec a
2015-11-02 08:15:32 -08:00
ld [hMapObjectIndexBuffer], a
ret nz
2015-11-02 08:15:32 -08:00
ld a, [hObjectStructIndexBuffer]
dec a
2015-11-02 08:15:32 -08:00
ld [hObjectStructIndexBuffer], a
ret nz
ld a, "─"
ld [hl], a
ld a, -1
2015-11-02 08:15:32 -08:00
ld [hMapObjectIndexBuffer], a
ld a, 6
2015-11-02 08:15:32 -08:00
ld [hObjectStructIndexBuffer], a
ret
.place_arrow
2015-11-02 08:15:32 -08:00
ld a, [hMapObjectIndexBuffer]
and a
ret z
dec a
2015-11-02 08:15:32 -08:00
ld [hMapObjectIndexBuffer], a
ret nz
dec a
2015-11-02 08:15:32 -08:00
ld [hMapObjectIndexBuffer], a
ld a, [hObjectStructIndexBuffer]
dec a
2015-11-02 08:15:32 -08:00
ld [hObjectStructIndexBuffer], a
ret nz
ld a, 6
2015-11-02 08:15:32 -08:00
ld [hObjectStructIndexBuffer], a
ld a, "▼"
ld [hl], a
ret