summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2017-07-09 13:16:25 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2017-07-09 13:16:41 -0400
commitc0382daeb5959a0be56fbf46de19873fc3a0bb39 (patch)
tree1eca65b8465602a91e672e5d7e3522519680a980
parent2f7383f03d9e7368d744690be93e811a052d0d42 (diff)
Some more organization of HOME
-rw-r--r--engine/copyright_screen.asm4
-rw-r--r--engine/erase_all_data_menu.asm4
-rw-r--r--engine/field_select_screen.asm4
-rw-r--r--engine/high_scores_screen.asm6
-rw-r--r--engine/options_screen.asm4
-rw-r--r--engine/pinball_game.asm10
-rw-r--r--engine/pinball_game/load_stage_data/load_blue_field.asm2
-rw-r--r--engine/pinball_game/load_stage_data/load_red_field.asm10
-rw-r--r--engine/pinball_game/object_collision/gengar_bonus_resolve_collision.asm2
-rw-r--r--engine/pinball_game/save_game.asm2
-rw-r--r--engine/pinball_game/stage_init/init_stages.asm4
-rw-r--r--engine/pinball_game/vertical_screen_transition.asm4
-rw-r--r--engine/pokedex.asm4
-rw-r--r--engine/select_gameboy_target_menu.asm4
-rw-r--r--engine/titlescreen.asm8
-rw-r--r--home.asm1439
-rw-r--r--home/audio.asm101
-rw-r--r--home/copy.asm591
-rw-r--r--home/ir.asm457
-rw-r--r--home/joypad.asm131
-rw-r--r--home/random.asm129
-rw-r--r--macros.asm1
m---------pokemon-reverse-engineering-tools0
-rw-r--r--sram.asm12
-rw-r--r--wram.asm15
25 files changed, 1481 insertions, 1467 deletions
diff --git a/engine/copyright_screen.asm b/engine/copyright_screen.asm
index 35a5329..c749043 100644
--- a/engine/copyright_screen.asm
+++ b/engine/copyright_screen.asm
@@ -21,7 +21,7 @@ FadeInCopyrightScreen: ; 0x8228
call LoadVideoData
call ClearOAMBuffer
call Func_b66
- call Func_588
+ call EnableLCD
call SGBNormal
ld bc, $0050
call AdvanceFrames
@@ -68,7 +68,7 @@ DisplayCopyrightScreen: ; 0x8290
FadeOutCopyrightScreenAndLoadData: ; 0x82a8
call FadeOut
- call Func_576
+ call DisableLCD
ld hl, sHighScores
ld de, wRedHighScore1Points
ld bc, $0082
diff --git a/engine/erase_all_data_menu.asm b/engine/erase_all_data_menu.asm
index 7504cf5..6ef174f 100644
--- a/engine/erase_all_data_menu.asm
+++ b/engine/erase_all_data_menu.asm
@@ -29,7 +29,7 @@ CheckForResetButtonCombo: ; 0x8167
call LoadVideoData
call ClearOAMBuffer
call Func_b66
- call Func_588
+ call EnableLCD
call SGBNormal
call FadeIn
ld hl, wScreenState
@@ -107,7 +107,7 @@ HandleEraseAllDataInput: ; 0x81d4
ExitEraseAllDataMenu: ; 0x820f
call FadeOut
- call Func_576
+ call DisableLCD
ld hl, wCurrentScreen
inc [hl]
xor a
diff --git a/engine/field_select_screen.asm b/engine/field_select_screen.asm
index 0033488..26dfc47 100644
--- a/engine/field_select_screen.asm
+++ b/engine/field_select_screen.asm
@@ -28,7 +28,7 @@ LoadFieldSelectScreen: ; 0xd6dd
call SetSongBank
ld de, $0003
call PlaySong
- call Func_588
+ call EnableLCD
call FadeIn
ld hl, wScreenState
inc [hl]
@@ -82,7 +82,7 @@ ExitFieldSelectScreen: ; 0xd774
ld a, [hJoypadState]
push af
call FadeOut
- call Func_576
+ call DisableLCD
ld a, [wd8f6]
bit BIT_A_BUTTON, a
jr z, .pressedB
diff --git a/engine/high_scores_screen.asm b/engine/high_scores_screen.asm
index 9823d67..09b16d6 100644
--- a/engine/high_scores_screen.asm
+++ b/engine/high_scores_screen.asm
@@ -164,7 +164,7 @@ Func_cb14: ; 0xcb14
ld de, $0002
call PlaySong
.asm_cba6
- call Func_588
+ call EnableLCD
ld bc, $0009
call Func_d68a
ld bc, $03c9
@@ -179,7 +179,7 @@ Func_cb14: ; 0xcb14
call SetSongBank
ld de, $0004
call PlaySong
- call Func_588
+ call EnableLCD
ld bc, $0009
call Func_d68a
ld bc, $03c9
@@ -944,7 +944,7 @@ Func_d159: ; 0xd159
ExitHighScoresScreen: ; 0xd171
call FadeOut
- call Func_576
+ call DisableLCD
ld hl, hSTAT
res 6, [hl]
ld hl, rIE
diff --git a/engine/options_screen.asm b/engine/options_screen.asm
index e29c96f..6549451 100644
--- a/engine/options_screen.asm
+++ b/engine/options_screen.asm
@@ -36,7 +36,7 @@ Func_c35a: ; 0xc35a
call SetSongBank
ld de, $0002
call PlaySong
- call Func_588
+ call EnableLCD
ld a, [wSoundTestCurrentBackgroundMusic]
hlCoord 7, 11, vBGMap
call RedrawSoundTestID
@@ -146,7 +146,7 @@ Func_c447: ; 0xc447
Func_c483: ; 0xc483
call FadeOut
- call Func_576
+ call DisableLCD
ld a, SCREEN_TITLESCREEN
ld [wCurrentScreen], a
xor a
diff --git a/engine/pinball_game.asm b/engine/pinball_game.asm
index c0da4a9..4374670 100644
--- a/engine/pinball_game.asm
+++ b/engine/pinball_game.asm
@@ -60,7 +60,7 @@ GameScreenFunction_StartBall: ; 0xd87f
xor a
ld [wd7c1], a
call Func_b66
- call Func_588
+ call EnableLCD
call FadeIn
ld hl, wScreenState
inc [hl]
@@ -234,7 +234,7 @@ GameScreenFunction_EndBall: ; 0xdab2
ld a, [wd849]
and a
call z, Func_e5d
- call Func_576
+ call DisableLCD
ld hl, hSTAT
res 6, [hl]
ld hl, rIE
@@ -252,7 +252,7 @@ GameScreenFunction_EndBall: ; 0xdab2
ld a, [wd849]
and a
call nz, Func_e5d
- call Func_576
+ call DisableLCD
ld hl, hSTAT
res 6, [hl]
ld hl, rIE
@@ -279,7 +279,7 @@ GameScreenFunction_EndBall: ; 0xdab2
ld a, [wd849]
and a
call nz, Func_e5d
- call Func_576
+ call DisableLCD
ld hl, hSTAT
res 6, [hl]
ld hl, rIE
@@ -300,7 +300,7 @@ TransitionToHighScoresScreen: ; 0xdb5d
ld bc, $0004
call AdvanceFrames
call FadeOut
- call Func_576
+ call DisableLCD
ld hl, hSTAT
res 6, [hl]
ld hl, rIE
diff --git a/engine/pinball_game/load_stage_data/load_blue_field.asm b/engine/pinball_game/load_stage_data/load_blue_field.asm
index 7d5c888..6e0554d 100644
--- a/engine/pinball_game/load_stage_data/load_blue_field.asm
+++ b/engine/pinball_game/load_stage_data/load_blue_field.asm
@@ -350,7 +350,7 @@ Func_1c3ee: ; 0x1c3ee
ld hl, PaletteData_dd188
ld de, $0070
ld bc, $0010
- call Func_6fd
+ call FarCopyCGBPals
ret
Func_1c43c: ; 0x1c43c
diff --git a/engine/pinball_game/load_stage_data/load_red_field.asm b/engine/pinball_game/load_stage_data/load_red_field.asm
index 1e40057..29cca35 100644
--- a/engine/pinball_game/load_stage_data/load_red_field.asm
+++ b/engine/pinball_game/load_stage_data/load_red_field.asm
@@ -299,7 +299,7 @@ Func_14234: ; 0x14234
ld hl, PaletteData_dd188
ld de, $0070
ld bc, $0010
- call Func_6fd
+ call FarCopyCGBPals
ret
Func_14282: ; 0x14282
@@ -403,7 +403,7 @@ Func_142fc: ; 0x142fc
ld hl, PokeBallObjPalette
ld de, $0040
ld bc, $0008
- call Func_6fd
+ call FarCopyCGBPals
ret
.notPokeball
@@ -413,7 +413,7 @@ Func_142fc: ; 0x142fc
ld hl, GreatBallObjPalette
ld de, $0040
ld bc, $0008
- call Func_6fd
+ call FarCopyCGBPals
ret
.notGreatball
@@ -423,7 +423,7 @@ Func_142fc: ; 0x142fc
ld hl, UltraBallObjPalette
ld de, $0040
ld bc, $0008
- call Func_6fd
+ call FarCopyCGBPals
ret
.notUltraball
@@ -431,7 +431,7 @@ Func_142fc: ; 0x142fc
ld hl, MasterBallObjPalette
ld de, $0040
ld bc, $0008
- call Func_6fd
+ call FarCopyCGBPals
ret
Func_14377: ; 0x14377
diff --git a/engine/pinball_game/object_collision/gengar_bonus_resolve_collision.asm b/engine/pinball_game/object_collision/gengar_bonus_resolve_collision.asm
index dca326b..6d57675 100644
--- a/engine/pinball_game/object_collision/gengar_bonus_resolve_collision.asm
+++ b/engine/pinball_game/object_collision/gengar_bonus_resolve_collision.asm
@@ -1440,7 +1440,7 @@ Func_18d34: ; 0x18d34
ld a, $80
ld [wFlipperCollision], a
ld de, $002f
- call Func_4d8
+ call PlaySFXIfNoneActive
.asm_18d71
ret
diff --git a/engine/pinball_game/save_game.asm b/engine/pinball_game/save_game.asm
index 1d2f539..624a1a9 100644
--- a/engine/pinball_game/save_game.asm
+++ b/engine/pinball_game/save_game.asm
@@ -7,7 +7,7 @@ SaveGame: ; 0xda05
ld a, [wd849]
and a
call nz, Func_e5d
- call Func_576
+ call DisableLCD
ld hl, hSTAT
res 6, [hl]
ld hl, rIE
diff --git a/engine/pinball_game/stage_init/init_stages.asm b/engine/pinball_game/stage_init/init_stages.asm
index 1d4ba78..5e26639 100644
--- a/engine/pinball_game/stage_init/init_stages.asm
+++ b/engine/pinball_game/stage_init/init_stages.asm
@@ -10,14 +10,14 @@ InitializeCurrentStage: ; 0x8311
ld hl, vBGWin
ld bc, $0400
ld a, $0
- call Func_63e
+ call __memset_8
jr .asm_833c
.asm_8331
ld hl, vBGWin
ld bc, $0400
ld a, $8
- call Func_63e
+ call __memset_8
.asm_833c
xor a
ld [rVBK], a
diff --git a/engine/pinball_game/vertical_screen_transition.asm b/engine/pinball_game/vertical_screen_transition.asm
index 94290f2..f27a221 100644
--- a/engine/pinball_game/vertical_screen_transition.asm
+++ b/engine/pinball_game/vertical_screen_transition.asm
@@ -17,13 +17,13 @@ FieldVerticalTransition: ; 0xe674
ld [hOBP1], a
rst AdvanceFrame
call Func_e5d
- call Func_576
+ call DisableLCD
call ClearOAMBuffer
call Func_1129
call LoadStageCollisionAttributes
call LoadStageData
call Func_e5d
- call Func_588
+ call EnableLCD
ld a, $e4
ld [hBGP], a
ld a, $e1
diff --git a/engine/pokedex.asm b/engine/pokedex.asm
index 8251d03..e903bb8 100644
--- a/engine/pokedex.asm
+++ b/engine/pokedex.asm
@@ -64,7 +64,7 @@ LoadPokedexScreen: ; 0x2800e
call SetSongBank
ld de, $0004
call PlaySong
- call Func_588
+ call EnableLCD
call FadeIn
ld hl, wScreenState
inc [hl]
@@ -711,7 +711,7 @@ Func_284bc: ; 0x284bc
ExitPokedexScreen: ; 0x284f9
call FadeOut
- call Func_576
+ call DisableLCD
ld hl, hSTAT
res 6, [hl]
ld hl, rIE
diff --git a/engine/select_gameboy_target_menu.asm b/engine/select_gameboy_target_menu.asm
index 3f18b60..339bc55 100644
--- a/engine/select_gameboy_target_menu.asm
+++ b/engine/select_gameboy_target_menu.asm
@@ -40,7 +40,7 @@ InitSelectGameboyTargetMenu: ; 0x800a
call LoadGameboyTargetMenuGfx
call ClearOAMBuffer
call Func_b66
- call Func_588
+ call EnableLCD
call FadeIn
ld hl, wScreenState
inc [hl]
@@ -230,7 +230,7 @@ CGBSelected_TileData: ; 0x8144
EndSelectGameboyTargetMenu: ; 0x414e
call FadeOut
- call Func_576
+ call DisableLCD
ld hl, wCurrentScreen
inc [hl] ; set to SCREEN_ERASE_ALL_DATA
xor a
diff --git a/engine/titlescreen.asm b/engine/titlescreen.asm
index 057e937..641b0cd 100644
--- a/engine/titlescreen.asm
+++ b/engine/titlescreen.asm
@@ -34,7 +34,7 @@ FadeInTitlescreen: ; 0xc00e
call SetSongBank
ld de, $0004
call PlaySong
- call Func_588
+ call EnableLCD
call FadeIn
ld hl, wScreenState
inc [hl]
@@ -148,7 +148,7 @@ Func_c10e: ; 0xc10e
and a
jr z, .asm_c177
call FadeOut
- call Func_576
+ call DisableLCD
ld a, [wd7c2]
and a
jr z, .asm_c173
@@ -224,7 +224,7 @@ Func_c1b1: ; 0xc1b1
Func_c1cb: ; 0c1cb
call FadeOut
- call Func_576
+ call DisableLCD
ld a, [wTitleScreenCursorSelection]
ld c, a
ld b, $0
@@ -243,7 +243,7 @@ Data_c1e4: ; 0xc1e4
GoToHighScoresFromTitlescreen: ; 0xc1e7
call FadeOut
- call Func_576
+ call DisableLCD
ld a, SCREEN_HIGH_SCORES
ld [wCurrentScreen], a
ld a, $1
diff --git a/home.asm b/home.asm
index fb199a5..7f1e91f 100644
--- a/home.asm
+++ b/home.asm
@@ -9,7 +9,7 @@ SECTION "rst 18", ROM0
jp JumpToFuncInTable
SECTION "rst 20", ROM0
- jp Func_486
+ jp _ReadHalfword
SECTION "VBlankInt", ROM0
jp VBlank
@@ -334,7 +334,7 @@ VBlank: ; 0x2f2
jr nz, .asm_37d
ld a, [wd85d]
and a
- call nz, Func_504
+ call nz, UpdateSFX
.asm_37d
ld a, [wd84a]
and a
@@ -382,7 +382,7 @@ Func_3c3:
jr z, .asm_03cf
call FadeOut
; Fades palettes in from white screen.
- call Func_576
+ call DisableLCD
.asm_03cf
ld hl, hSTAT
res 6, [hl]
@@ -444,7 +444,7 @@ Timer: ; 0x418
jr z, .asm_42a
ld a, [wd85d]
and a
- call nz, Func_504
+ call nz, UpdateSFX
.asm_42a
ld a, [wd84a]
and a
@@ -522,7 +522,7 @@ JumpToFuncInTable: ; 0x477
pop de
jp hl
-Func_486: ; 0x486
+_ReadHalfword: ; 0x486
rlca
add l
ld l, a
@@ -534,105 +534,7 @@ Func_486: ; 0x486
ld l, a
ret
-PlaySong: ; 0x490
- ld a, [hLoadedROMBank]
- push af
- ld a, [wCurrentSongBank]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, e
- ld [wStageSong], a
- ld a, [wCurrentSongBank]
- ld [wStageSongBank], a
- call PlaySong_BankF ; this function is replicated in multiple banks.
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-PlaySoundEffect: ; 0x4af
-; input: de = sound effect id? I think d specifies something special and e holds the id
- ld a, [wdead]
- and a
- ret nz
- ld a, [wSFXTimer]
- and a
- jr z, .asm_4bd
- ld a, d
- and a
- ret z
-.asm_4bd
- ld a, d
- ld [wSFXTimer], a
- ld d, $0
- ld a, [hLoadedROMBank]
- push af
- ld a, [wCurrentSongBank]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- call PlaySoundEffect_BankF ; this function is replicated in multiple banks
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-Func_4d8: ; 0x4d8
- push bc
- push de
- push hl
- ld a, [wChannel4 + 2]
- ld hl, wChannel5 + 2
- or [hl]
- ld hl, wChannel6 + 2
- or [hl]
- and $1
- call z, PlaySoundEffect
- pop hl
- pop de
- pop bc
- ret
-
-PlayCry: ; 0x4ef
-; Plays a Pokemon cry.
-; Input: e = mon id
- ld a, [hLoadedROMBank]
- push af
- ld a, [wCurrentSongBank]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- call PlayCry_BankF ; this function is replicated in multiple banks
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-Func_504: ; 0x504
- ld a, [hLoadedROMBank]
- push af
- ld a, [wCurrentSongBank]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- call Func_3c180
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, [wd801]
- inc a
- ld [wd801], a
- and $3
- ret nz
- ld a, [wSFXTimer]
- and a
- ret z
- dec a
- ld [wSFXTimer], a
- ret
-
-SetSongBank: ; 0x52c
- di
- ld [wCurrentSongBank], a
- ei
- ret
+INCLUDE "home/audio.asm"
CallInFollowingTable: ; 0x532
; Calls a function in a table located immediately after a call to this function.
@@ -690,7 +592,7 @@ BankSwitch: ; 0x54f
ld a, [hFarCallTempA]
jp hl
-Func_576: ; 0x576
+DisableLCD: ; 0x576
ld a, [rLCDC]
bit 7, a
ret z
@@ -703,17 +605,17 @@ Func_576: ; 0x576
jr nz, .asm_581
ret
-Func_588: ; 0x588
+EnableLCD: ; 0x588
ld a, [hFFC4]
and a
- call nz, Func_597
+ call nz, .UpdatePals
ld a, [hLCDC]
set 7, a
ld [rLCDC], a
ld [hLCDC], a
ret
-Func_597: ; 0x597
+.UpdatePals
ld de, rBGPI
ld a, $80
ld [de], a
@@ -721,7 +623,7 @@ Func_597: ; 0x597
ld b, $8
.asm_5a0
ld a, [wBGP]
- call Func_5c2
+ call .UpdateDMGPals
dec b
jr nz, .asm_5a0
ld de, rOBPI
@@ -731,14 +633,14 @@ Func_597: ; 0x597
ld b, $4
.asm_5b2
ld a, [wOBP0]
- call Func_5c2
+ call .UpdateDMGPals
ld a, [wOBP1]
- call Func_5c2
+ call .UpdateDMGPals
dec b
jr nz, .asm_5b2
ret
-Func_5c2: ; 0x5c2
+.UpdateDMGPals
push bc
ld b, $4
.asm_5c5
@@ -769,13 +671,13 @@ GreyscalePalette:
RGB 11, 11, 11
RGB 0, 0, 0
-Func_5e9:
+VBlankIntDisable:
ld a, [rIE]
res 0, a
ld [rIE], a
ret
-Func_5f0:
+VBlankIntEnable:
ld a, [rIE]
set 0, a
ld [rIE], a
@@ -811,9 +713,9 @@ WaitForLCD: ; 0x60f
and $3
jr nz, WaitForLCD
ld a, $a
-.delay10Cycles
+.delay40Cycles
dec a
- jr nz, .delay10Cycles
+ jr nz, .delay40Cycles
ret
Func_61b: ; 0x61b
@@ -842,585 +744,7 @@ Func_61b: ; 0x61b
.asm_63d
ret
-Func_63e: ; 0xc3e
- dec bc
-.asm_63f
- ld [hli], a
- dec bc
- bit 7, b
- jr z, .asm_63f
- ret
-
-Func_646:
- srl b
- rr c
-.asm_064a
- ld a, e
- ld [hli], a
- ld a, d
- ld [hli], a
- dec bc
- ld a, b
- or c
- jr nz, .asm_064a
- ret
-
-ClearData: ; 0x654
-; Clears bc bytes starting at hl.
-; bc can be a maximum of $7fff, since it checks bit 7 of b when looping.
- xor a
- dec bc
-.clearLoop
- ld [hli], a
- dec bc
- bit 7, b
- jr z, .clearLoop
- ret
-
-LocalCopyData: ; 0x65d
- ld a, [hli]
- ld [de], a
- inc de
- dec bc
- ld a, c
- or b
- jr nz, LocalCopyData
- ret
-
-FarCopyData: ; 0x666 spooky
-; Copies data from any bank to either working RAM or video RAM
-; Input: hl = address of data to copy
-; a = bank of data to copy
-; de = destination for data
-; bc = number of bytes to copy
- bit 7, h
- jr nz, .copyFromSRAM
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- scf
- jr .copyData
-
-.copyFromSRAM
- ld [MBC5SRamBank], a
- and a
-.copyData
- push af
-.copyLoop
- ld a, [hli]
- ld [de], a
- inc de
- dec bc
- ld a, c
- or b
- jr nz, .copyLoop
- pop af
- ret nc
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-ReadByteFromBank: ; 0x68f
-; Input: a = bank
-; hl = address of byte to read
-; Output: a = byte at a:hl
- push de
- ld d, a
- ld a, [hLoadedROMBank]
- ld e, a
- ld a, d
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld d, [hl]
- ld a, e
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, d
- pop de
- ret
-
-LoadVideoData: ; 0x6a4
-; Input:
-; hl = address of pointer table
-; a = index of item to load in pointer table
-; This needs more documentation. It loads things like graphics and palettes.
- sla a
- ld c, a
- ld b, $0
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
-.loadItem
- ld a, [hli]
- ld c, a
- and [hl]
- cp $ff ; two consecutive $ff bytes terminate the array
- ret z
- ld a, [hli]
- ld b, a ; bc contains pointer to data to be loaded
- push hl
- push bc
- ld a, [hli] ; a contains bank of data to be loaded
- ld e, [hl]
- inc hl
- ld d, [hl] ; de contains destination address for data
- inc hl
- ld c, [hl]
- inc hl
- ld b, [hl] ; bc contains last word of data struct
- inc hl ; this is a wasted instruction
- pop hl
- call Func_6cb
- pop hl
- ld bc, $0005
- add hl, bc
- jr .loadItem
-
-Func_6cb: ; 0x6cb
- srl b
- rr c
- jp c, Func_6fd ; if lowest bit of bc is set
- jp Func_6d5 ; This jumps to the next instruction... Strange.
-
-Func_6d5: ; 0x6d5
- ld [hROMBankBuffer], a ; save bank of data to be loaded
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer] ; a contains bank of data to be loaded
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a ; switch bank to the bank of data to be loaded
- srl b
- rr c
- rl a
- and $1 ; checks bit 1 of the last word in the data struct
- ld [rVBK], a ; set VRAM Bank
-.copyByte
- ld a, [hli]
- ld [de], a
- inc de
- dec bc
- ld a, c
- or b ; does bc = 0?
- jr nz, .copyByte
- xor a
- ld [rVBK], a ; set VRAM Bank to Bank 0
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a ; reload the previous ROM Bank
- ret
-
-Func_6fd: ; 0x6fd
- ld [hROMBankBuffer], a ; save bank of data to be loaded
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer] ; a contains bank of data to be loaded
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a ; switch bank to the bank of data to be loaded
- ld a, e
- bit 6, a
- jr nz, .asm_717
- ld de, rBGPI
- call Func_724
- jr z, .asm_71d
- xor a
-.asm_717
- ld de, rOBPI
- call Func_724
-.asm_71d
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-Func_724: ; 0x724
- res 6, a
- ld b, a
- set 7, a
- ld [de], a
- inc de
-.copyByte
- ld a, [hli]
- ld [de], a
- inc b
- dec c
- ret z
- bit 6, b
- jr z, .copyByte
- ret
-
-LoadOrCopyVRAMData: ; 0x735
- push hl
- ld hl, rLCDC
- bit 7, [hl]
- pop hl
- jp z, FarCopyData
- ; fall through
-LoadVRAMData: ; 0x73f
-; This loads some data into VRAM. It waits for the LCD H-Blank to copy the data 4 bytes at a time.
-; input: hl = source of data
-; a = bank of data to load
-; de = destination of data
-; bc = number of bytes to copy
- bit 7, h
- jr nz, .asm_752
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- scf
- jr .asm_756
-
-.asm_752
- ld [MBC5SRamBank], a
- and a
-.asm_756
- push af
- call WaitForLCD
-.loop
- call Func_61b
-.waitForHBlank
- ld a, [rSTAT]
- and $3
- jr nz, .waitForHBlank
- ld a, [hli]
- ld [de], a
- inc de
- ld a, [hli]
- ld [de], a
- inc de
- ld a, [hli]
- ld [de], a
- inc de
- ld a, [hli]
- ld [de], a
- inc de
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- dec bc
- dec bc
- dec bc
- dec bc
- nop
- nop
- nop
- nop
- ld a, b
- or c
- jr nz, .loop
- pop af
- ret nc
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-FarCopyPalettes: ; 0x790
- push hl
- ld hl, rLCDC
- bit 7, [hl]
- pop hl
- jp nz, Func_7dc
- bit 7, h
- jr nz, .asm_7ad
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- scf
- jr .asm_7b1
-
-.asm_7ad
- ld [MBC5SRamBank], a
- and a
-.asm_7b1
- push af
- ld a, e
- bit 6, e
- ld de, rBGPI
- jr z, .asm_7bf
- res 6, a
- ld de, rOBPI
-.asm_7bf
- set 7, a
- ld [de], a
- inc de
-.asm_7c3
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- dec bc
- dec bc
- dec bc
- dec bc
- ld a, b
- or c
- jr nz, .asm_7c3
- pop af
- ret nc
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-Func_7dc: ; 0x7dc
- bit 7, h
- jr nz, .asm_7ef
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- scf
- jr .asm_7f3
-
-.asm_7ef
- ld [MBC5SRamBank], a
- and a
-.asm_7f3
- push af
- ld a, e
- bit 6, e
- ld de, rBGPI
- jr z, .asm_801
- res 6, a
- ld de, rOBPI
-.asm_801
- push hl
- ld h, d
- ld l, e
- set 7, a
- call PutTileInVRAM
- inc de
- pop hl
- call WaitForLCD
-.asm_80e
- call Func_61b
-.asm_811
- ld a, [rSTAT]
- and $3
- jr nz, .asm_811
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- dec bc
- dec bc
- dec bc
- dec bc
- nop
- nop
- nop
- nop
- ld a, b
- or c
- jr nz, .asm_80e
- pop af
- ret nc
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-PutTileInVRAM: ; 0x848
-; Puts a tile in VRAM.
-; input: a = tile number
-; hl = pointer to VRAM location where tile should be placed
- push af
- call WaitForLCD
- call Func_61b
-.asm_84f
- ld a, [rSTAT]
- and $3
- jr nz, .asm_84f ; wait for lcd controller to finish transferring data
- pop af
- ld [hl], a ; Store tile number in VRAM background map
- ret
-
-Func_858: ; 0x858
- push af
- call WaitForLCD
- call Func_61b
-.asm_85f
- ld a, [rSTAT]
- and $3
- jr nz, .asm_85f
- ld a, $1
- ld [rVBK], a
- pop af
- ld [hl], a
- xor a
- ld [rVBK], a
- ret
-
-LoadBillboardPaletteMap: ; 0x86f
-; Loads the background palette map for a 6x4-tile billboard picture.
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, [rLCDC]
- bit 7, a
- jr nz, .asm_8ac
- ld a, $1
- ld [rVBK], a
- ld b, $4
-.loop
- push bc
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld bc, $001a
- add hl, bc
- pop bc
- dec b
- jr nz, .loop
- xor a
- ld [rVBK], a
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-.asm_8ac
- ld b, $4
-.asm_8ae
- push bc
- ld a, [de]
- call Func_858
- inc hl
- inc de
- ld a, [de]
- call Func_858
- inc hl
- inc de
- ld a, [de]
- call Func_858
- inc hl
- inc de
- ld a, [de]
- call Func_858
- inc hl
- inc de
- ld a, [de]
- call Func_858
- inc hl
- inc de
- ld a, [de]
- call Func_858
- inc de
- ld bc, $001b
- add hl, bc
- pop bc
- dec b
- jr nz, .asm_8ae
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-Func_8e1: ; 0x8e1
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, [rLCDC]
- bit 7, a
- jr nz, .asm_902
- ld a, c
- ld [hli], a
-.asm_8f5
- ld a, [de]
- ld [hl], a
- inc de
- dec b
- jr nz, .asm_8f5
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-.asm_902
- ld a, c
- call PutTileInVRAM
- inc hl
-.asm_907
- ld a, [de]
- call PutTileInVRAM
- inc de
- dec b
- jr nz, .asm_907
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
+INCLUDE "home/copy.asm"
ClearOAMBuffer: ; 0x916
; Clears the OAM buffer by loading $f0 into all of the entries.
@@ -1481,266 +805,8 @@ SGBWait1750: ; 0x948
jr nz, SGBWait1750
ret
-GenRandom: ; 0x959
- push bc
- push de
- push hl
- ld a, [wd811]
- ld c, a
- ld b, $0
- inc a
- cp $37
- jr nz, .asm_96e
- call Func_9fa
- xor a
- ld bc, $0000
-.asm_96e
- ld [wd811], a
- ld hl, wd812
- add hl, bc
- ld a, [hl]
- pop hl
- pop de
- pop bc
- ret
-
-Func_97a: ; 0x97a
- ld a, [wd810]
- ld d, a
- ld a, $0
- ld a, [$afff]
-.asm_983
- cp d
- jr c, .asm_989
- sub d
- jr .asm_983
-
-.asm_989
- ld [wd80f], a
- ld [wd848], a
- ld e, $1
- ld hl, Data_9c4
- ld a, $36
-.asm_996
- push af
- ld c, [hl]
- inc hl
- ld b, $0
- push hl
- ld hl, wd812
- add hl, bc
- ld [hl], e
- ld a, [wd80f]
- sub e
- jr nc, .asm_9a8
- add d
-.asm_9a8
- ld e, a
- ld a, [hl]
- ld [wd80f], a
- pop hl
- pop af
- dec a
- jr nz, .asm_996
- call Func_9fa
- call Func_9fa
- call Func_9fa
- ld a, $0
- call GenRandom
- ld [$afff], a
- ret
-
-Data_9c4:
- db $14, $29, $07, $1c, $31, $0f, $24, $02, $17
- db $2c, $0a, $1f, $34, $12, $27, $05, $1a, $2f
- db $0d, $22, $00, $15, $2a, $08, $1d, $32, $10
- db $25, $03, $18, $2d, $0b, $20, $35, $13, $28
- db $06, $1b, $30, $0e, $23, $01, $16, $2b, $09
- db $1e, $33, $11, $26, $04, $19, $2e, $0c, $21
-
-Func_9fa: ; 0x9fa
- ld a, [wd810]
- ld d, a
- ld bc, wd812
- ld hl, wd831
- ld e, $18
-.asm_a06
- ld a, [bc]
- sub [hl]
- jr nc, .asm_a0b
- add d
-.asm_a0b
- ld [bc], a
- dec e
- jr nz, .asm_a06
- ld bc, wd82a
- ld hl, wd812
- ld e, $1f
-.asm_a17
- ld a, [bc]
- sub [hl]
- jr nc, .asm_a1c
- add d
-.asm_a1c
- ld [bc], a
- dec e
- jr nz, .asm_a17
- ret
-
-Func_a21: ; 0xa21
- push bc
- push hl
- ld c, a
- ld b, $0
- ld hl, Data_a38
- add hl, bc
- ld l, [hl]
- call GenRandom
- call Func_dd4
- inc h
- srl h
- ld a, h
- pop hl
- pop bc
- ret
-
-Data_a38:
-x = 0
-REPT 128
- db x | ((x >> 7) & 1)
-x = x + 2
-ENDR
-
-ReadJoypad: ; 0xab8
-; Reads the current state of the joypad and saves the state into
-; some registers the game uses during gameplay. It remembers the joypad state
-; from the current frame, previous frame, and two frames ago.
- ld a, $20
- ld [rJOYP], a
- ld a, [rJOYP]
- ld a, [rJOYP]
- and $f
- swap a
- ld b, a
- ld a, $30
- ld [rJOYP], a
- ld a, $10
- ld [rJOYP], a
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- and $f
- or b
- cpl ; a contains currently-pressed buttons
- ld [hJoypadState], a
- ld a, $30
- ld [rJOYP], a
- ld a, [hJoypadState]
- ld hl, hPreviousJoypadState
- xor [hl] ; a contains buttons that are different from previous frame
- push af
- ld hl, hJoypadState
- and [hl] ; a contains newly-pressed buttons compared to last frame
- ld [hNewlyPressedButtons], a
- ld [hPressedButtons], a
- pop af
- ld hl, hPreviousJoypadState
- and [hl] ; a contains newly-pressed buttons compared to two frames ago
- ld [hPrevPreviousJoypadState], a
- ld a, [hJoypadState]
- and a
- jr z, .asm_b15
- ld hl, hPreviousJoypadState
- cp [hl]
- jr nz, .asm_b15
- ; button(s) is pressed, and they're identical to the buttons pressed last frame.
- ; this code is related to holding down a button for an extended period of time.
- ld hl, hJoyRepeatDelay
- dec [hl]
- jr nz, .asm_b1a
- ld a, [hJoypadState]
- ld [hPressedButtons], a
- ld a, [wd807]
- ld [hJoyRepeatDelay], a
- jr .asm_b1a
-
-.asm_b15
- ld a, [wd806]
- ld [hJoyRepeatDelay], a
-.asm_b1a
- ld a, [hJoypadState]
- ld [hPreviousJoypadState], a
- ld hl, wJoypadStatesPersistent
- ld a, [hJoypadState]
- or [hl]
- ld [hli], a
- ld a, [hNewlyPressedButtons]
- or [hl]
- ld [hli], a
- ld a, [hPressedButtons]
- or [hl]
- ld [hli], a
- ret
-
-ClearPersistentJoypadStates: ; 0xb2e
- ld hl, wJoypadStatesPersistent
- xor a
- ld [hli], a
- ld [hli], a
- ld [hl], a
- ret
-
-IsKeyPressed2: ; 0xb36
- ld a, [hJoypadState]
- and [hl]
- jr z, .asm_b3e
- cp [hl]
- jr z, .asm_b48
-.asm_b3e
- inc hl
- ld a, [hJoypadState]
- and [hl]
- ret z
- cp [hl]
- jr z, .asm_b48
- xor a
- ret
-
-.asm_b48
- ld a, $1
- and a
- ret
-
-IsKeyPressed: ; 0xb4c
-; Checks if a key for the specified key config is pressed.
-; input: hl = pointer to key config byte pair (e.g. wKeyConfigLeftFlipper)
-; output: zero flag is set if a corresponding key is pressed
-; zero flag is reset if no corresponding key is pressed
- ld a, [hJoypadState]
- and [hl]
- jr z, .asm_b58
- cp [hl]
- jr nz, .asm_b58
- ld a, [hNewlyPressedButtons]
- and [hl]
- ret nz
-.asm_b58
- inc hl
- ld a, [hJoypadState]
- and [hl]
- ret z
- cp [hl]
- jr nz, .asm_b64
- ld a, [hNewlyPressedButtons]
- and [hl]
- ret
-
-.asm_b64
- xor a
- ret
+INCLUDE "home/random.asm"
+INCLUDE "home/joypad.asm"
Func_b66: ; 0xb66
ld a, [hGameBoyColorFlag]
@@ -3255,7 +2321,8 @@ Func_1bb2: ; 0x1bb2
ret
Data_1bcf:
- db $02, $01, $04, $03
+ ; $ff, >$7f, >$3f, else
+ db $02, $01, $04, $03
Func_1bd3: ; 0x1bd3
lb de, $00, $01
@@ -3266,463 +2333,7 @@ Func_1bd3: ; 0x1bd3
scf
ret
-Func_1be3: ; 0x1be3
- ld a, $c0
- ld [rRP], a
- ld a, $ff
- ld [wd8ea], a
- xor a
- ld b, a
-.asm_1bee
- inc a
- jr nz, .asm_1bee
- inc b
- jr nz, .asm_1bee
- ld hl, wd8eb
- ld a, [rKEY1]
- bit 7, a
- jr z, .asm_1c0c
- ld [hl], $e
- inc hl
- ld [hl], $12
- inc hl
- ld [hl], $8
- inc hl
- ld [hl], $c
- inc hl
- ld [hl], $c
- ret
-
-.asm_1c0c
- ld [hl], $6
- inc hl
- ld [hl], $8
- inc hl
- ld [hl], $2
- inc hl
- ld [hl], $4
- inc hl
- ld [hl], $5
- ret
-
-Func_1c1b: ; 0x1c1b
- inc d
- ret z
- ld a, [$ff00+c]
- bit 1, a
- jr z, Func_1c1b
- ret
-
-Func_1c23: ; 0x1c23
- inc d
- ret z
- ld a, [$ff00+c]
- bit 1, a
- jr nz, Func_1c23
- ret
-
-Func_1c2b: ; 0x1c2b
- ld a, $c1
- ld [$ff00+c], a
-.asm_1c2e
- dec d
- jr nz, .asm_1c2e
- ret
-
-Func_1c32: ; 0x1c32
- ld a, $c0
- ld [$ff00+c], a
-.asm_1c35
- dec d
- jr nz, .asm_1c35
- ret
-
-Func_1c39:
- xor a
- ld [hNumFramesSinceLastVBlank], a
- ld a, $1
- ld [wd8e9], a
-.asm_1c41
- ld b, $2
- ld c, rRP % $100
- ld a, [$ff00+c]
- and b
- jr z, Func_1c50
- ld a, [hNumFramesSinceLastVBlank]
- and a
- jr nz, Func_1ca1
- jr .asm_1c41
-
-Func_1c50: ; 0x1c50
- ld a, $1
- ld [wd8e9], a
- ld b, $1a
- ld c, rRP % $100
- ld d, $0
- ld e, d
- call Func_1c23
- ld a, d
- and a
- jp z, Func_1dc2
- ld d, e
- call Func_1c1b
- ld a, d
- and a
- jp z, Func_1dc2
- call Func_1c23
- ld a, d
- and a
- jp z, Func_1dc2
- call Func_1c1b
- ld a, d
- and a
- jp z, Func_1dc2
- cp $8
- jp c, Func_1dc2
- cp $2a
- jp nc, Func_1dc2
- ld a, $0
- ld [wd8ea], a
- ld d, b
- call Func_1c32
- ld d, b
- call Func_1c2b
- ld d, b
- call Func_1c32
- ld d, b
- call Func_1c2b
- ld d, b
- call Func_1c32
- ret
-
-Func_1ca1: ; 0x1ca1
- ld a, $2
- ld [wd8e9], a
- ld b, $1a
- ld c, rRP % $100
- ld d, b
- ld e, $0
- call Func_1c32
- ld d, b
- call Func_1c2b
- ld d, b
- call Func_1c32
- ld d, b
- call Func_1c2b
- ld d, b
- call Func_1c32
- ld d, e
- call Func_1c23
- ld a, d
- and a
- jp z, Func_1dc2
- ld d, e
- call Func_1c1b
- ld a, d
- and a
- jp z, Func_1dc2
- ld d, e
- call Func_1c23
- ld a, d
- and a
- jp z, Func_1dc2
- ld d, e
- call Func_1c1b
- ld a, d
- and a
- jp z, Func_1dc2
- ld d, $1a
- call Func_1c32
- ld a, $0
- ld [wd8ea], a
- ret
-
-Func_1cef:
- xor a
- ld [rRP], a
- ld a, $ff
- ld [wd8ea], a
- ret
-
-Func_1cf8: ; 0x1cf8
- xor a
- ld [wd8e4], a
- ld [wd8e5], a
- push hl
- push bc
- ld hl, wd8e6
- ld a, $5a
- ld [hli], a
- ld [hl], b
- dec hl
- ld b, $2
- ld d, $1e
- call Func_1c32
- call Func_1d44
- pop bc
- pop hl
- call Func_1ed3
- call Func_1d44
- ld a, [wd8e4]
- ld [wd8e6], a
- ld a, [wd8e5]
- ld [wd8e7], a
- ld hl, wd8e6
- ld b, $2
- call Func_1d44
- ld hl, wd8ea
- ld b, $1
- call Func_1e3b
- ld a, [wd8e6]
- ld [wd8e4], a
- ld a, [wd8e7]
- ld [wd8e5], a
- ret
-
-Func_1d44: ; 0x1d44
- ld a, [wd8ea]
- cp $0
- ret nz
- ld c, rRP % $100
- ld d, $16
- call Func_1c2b
- ld d, $16
- call Func_1c32
- ld a, b
- cpl
- ld b, a
-.asm_1d59
- inc b
- jr z, .asm_1dae
- ld a, $8
- ld [wd8e3], a
- ld a, [hli]
- ld e, a
- ld a, [wd8e4]
- add e
- ld [wd8e4], a
- jr nc, .asm_1d75
- ld a, [wd8e5]
- inc a
- ld [wd8e5], a
- jr .asm_1d78
-
-.asm_1d75
- call Func_1ed3
-.asm_1d78
- ld a, e
- rlca
- ld e, a
- jr nc, .asm_1d8d
- ld a, [wd8eb]
- ld d, a
- call Func_1c2b
- ld a, [wd8ec]
- ld d, a
- call Func_1c32
- jr .asm_1d9b
-
-.asm_1d8d
- ld a, [wd8ed]
- ld d, a
- call Func_1c2b
- ld a, [wd8ee]
- ld d, a
- call Func_1c32
-.asm_1d9b
- ld a, [wd8e3]
- dec a
- ld [wd8e3], a
- jr z, .asm_1dac
- call Func_1ed4
- call Func_1ed4
- jr .asm_1d78
-
-.asm_1dac
- jr .asm_1d59
-
-.asm_1dae
- call Func_1ed3
- call Func_1ed3
- call Func_1ed4
- ld d, $16
- call Func_1c2b
- ld d, $16
- call Func_1c32
- ret
-
-Func_1dc2: ; 0x1dc2
- ld a, $2
- ld [wd8ea], a
- ret
-
-Func_1dc8:
- ld a, [wd8ea]
- or $1
- ld [wd8ea], a
- ret
-
-Func_1dd1: ; 0x1dd1
- ld a, [wd8ea]
- or $4
- ld [wd8ea], a
- ret
-
-Func_1dda: ; 0x1dda
- xor a
- ld [wd8e4], a
- ld [wd8e5], a
- push hl
- ld hl, wd8e6
- ld b, $2
- call Func_1e3b
- ld a, [wd8e7]
- ld [wd8e8], a
- ld b, a
- pop hl
- ld a, [wd8e6]
- cp $5a
- jp nz, Func_1dd1
- call Func_1e3b
- ld a, [wd8e4]
- ld d, a
- ld a, [wd8e5]
- ld e, a
- push de
- ld hl, wd8e6
- ld b, $2
- call Func_1e3b
- pop de
- ld hl, wd8e6
- ld a, [hli]
- xor d
- ld b, a
- ld a, [hl]
- xor e
- or b
- jr z, .asm_1e22
- ld a, [wd8ea]
- or $1
- ld [wd8ea], a
-.asm_1e22
- push de
- ld hl, wd8ea
- ld b, $1
- call Func_1d44
- pop de
- ld a, d
- ld [wd8e4], a
- ld a, e
- ld [wd8e5], a
- ld a, [wd8e8]
- cp $82
- ret z
- ret
-
-Func_1e3b: ; 0x1e3b
- ld a, [wd8ea]
- cp $0
- ret nz
- ld c, rRP % $100
- ld d, $0
- call Func_1c23
- ld a, d
- or a
- jp z, Func_1dc2
- ld d, $0
- call Func_1c1b
- ld a, d
- or a
- jp z, Func_1dc2
- ld d, $0
- call Func_1c23
- ld a, d
- or a
- jp z, Func_1dc2
- call Func_1ed4
- call Func_1ed4
- push af
- pop af
- ld a, b
- cpl
- ld b, a
-.asm_1e6c
- inc b
- jr z, .asm_1eb9
- ld a, $8
- ld [wd8e3], a
-.asm_1e74
- ld d, $0
- call Func_1c1b
- call Func_1c23
- ld a, [wd8ef]
- cp d
- jr nc, .asm_1e88
- ld a, e
- set 0, a
- ld e, a
- jr .asm_1e8c
-
-.asm_1e88
- ld a, e
- res 0, a
- ld e, a
-.asm_1e8c
- ld a, [wd8e3]
- dec a
- ld [wd8e3], a
- jr z, .asm_1ea0
- ld a, e
- rlca
- ld e, a
- call Func_1ed4
- call Func_1ed4
- jr .asm_1e74
-
-.asm_1ea0
- ld a, e
- ld [hli], a
- ld a, [wd8e4]
- add e
- ld [wd8e4], a
- jr nc, .asm_1eb4
- ld a, [wd8e5]
- inc a
- ld [wd8e5], a
- jr .asm_1eb7
-
-.asm_1eb4
- call Func_1ed3
-.asm_1eb7
- jr .asm_1e6c
-
-.asm_1eb9
- ld d, $0
- call Func_1c1b
- ld a, d
- and a
- jp z, Func_1dc2
- ld d, $11
- call Func_1c32
- ret
-
-Func_1ec9:
- ld b, $00
- jp Func_1cf8
-
-Func_1ece:
- ld b, $00
- jp Func_1dda
-
-Func_1ed3: ; 0x1ed3
- ret
-
-Func_1ed4: ; 0x1ed4
- jr z, .asm_1ed6
-.asm_1ed6
- jr nz, .asm_1ed8
-.asm_1ed8
- ret
+INCLUDE "home/ir.asm"
Func_1ed9:
push bc
@@ -4380,7 +2991,7 @@ ApplyTorque: ; 0x222b
jr nz, .asm_2254
push de
ld de, $0008
- call Func_4d8
+ call PlaySFXIfNoneActive
pop de
.asm_2254
srl d
diff --git a/home/audio.asm b/home/audio.asm
new file mode 100644
index 0000000..622e5da
--- /dev/null
+++ b/home/audio.asm
@@ -0,0 +1,101 @@
+
+PlaySong: ; 0x490
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [wCurrentSongBank]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, e
+ ld [wStageSong], a
+ ld a, [wCurrentSongBank]
+ ld [wStageSongBank], a
+ call PlaySong_BankF ; this function is replicated in multiple banks.
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+PlaySoundEffect: ; 0x4af
+; u8 d = duration
+; u8 e = SFX ID
+ ld a, [wdead]
+ and a
+ ret nz
+ ld a, [wSFXTimer]
+ and a
+ jr z, .asm_4bd
+ ld a, d
+ and a
+ ret z
+.asm_4bd
+ ld a, d
+ ld [wSFXTimer], a
+ ld d, $0
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [wCurrentSongBank]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ call PlaySoundEffect_BankF ; this function is replicated in multiple banks
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+PlaySFXIfNoneActive: ; 0x4d8
+ push bc
+ push de
+ push hl
+ ld a, [wChannel4 + 2]
+ ld hl, wChannel5 + 2
+ or [hl]
+ ld hl, wChannel6 + 2
+ or [hl]
+ and $1
+ call z, PlaySoundEffect
+ pop hl
+ pop de
+ pop bc
+ ret
+
+PlayCry: ; 0x4ef
+; Plays a Pokemon cry.
+; Input: e = mon id
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [wCurrentSongBank]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ call PlayCry_BankF ; this function is replicated in multiple banks
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+UpdateSFX: ; 0x504
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [wCurrentSongBank]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ call Func_3c180
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, [wd801]
+ inc a
+ ld [wd801], a
+ and $3
+ ret nz
+ ld a, [wSFXTimer]
+ and a
+ ret z
+ dec a
+ ld [wSFXTimer], a
+ ret
+
+SetSongBank: ; 0x52c
+ di
+ ld [wCurrentSongBank], a
+ ei
+ ret
diff --git a/home/copy.asm b/home/copy.asm
new file mode 100644
index 0000000..d8f2a74
--- /dev/null
+++ b/home/copy.asm
@@ -0,0 +1,591 @@
+__memset_8: ; 0xc3e
+ dec bc
+.asm_63f
+ ld [hli], a
+ dec bc
+ bit 7, b
+ jr z, .asm_63f
+ ret
+
+__memset_16:
+ srl b
+ rr c
+.asm_064a
+ ld a, e
+ ld [hli], a
+ ld a, d
+ ld [hli], a
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_064a
+ ret
+
+ClearData: ; 0x654
+; Clears bc bytes starting at hl.
+; bc can be a maximum of $7fff, since it checks bit 7 of b when looping.
+ xor a
+ dec bc
+.clearLoop
+ ld [hli], a
+ dec bc
+ bit 7, b
+ jr z, .clearLoop
+ ret
+
+LocalCopyData: ; 0x65d
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, c
+ or b
+ jr nz, LocalCopyData
+ ret
+
+FarCopyData: ; 0x666 spooky
+; Copies data from any bank to either working RAM or video RAM
+; Input: hl = address of data to copy
+; a = bank of data to copy
+; de = destination for data
+; bc = number of bytes to copy
+ bit 7, h
+ jr nz, .copyFromSRAM
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ scf
+ jr .copyData
+
+.copyFromSRAM
+ ld [MBC5SRamBank], a
+ and a
+.copyData
+ push af
+.copyLoop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, c
+ or b
+ jr nz, .copyLoop
+ pop af
+ ret nc
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+ReadByteFromBank: ; 0x68f
+; Input: a = bank
+; hl = address of byte to read
+; Output: a = byte at a:hl
+ push de
+ ld d, a
+ ld a, [hLoadedROMBank]
+ ld e, a
+ ld a, d
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld d, [hl]
+ ld a, e
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, d
+ pop de
+ ret
+
+LoadVideoData: ; 0x6a4
+; Input:
+; hl = address of pointer table
+; a = index of item to load in pointer table
+; This needs more documentation. It loads things like graphics and palettes.
+ sla a
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+.loadItem
+ ld a, [hli]
+ ld c, a
+ and [hl]
+ cp $ff ; two consecutive $ff bytes terminate the array
+ ret z
+ ld a, [hli]
+ ld b, a ; bc contains pointer to data to be loaded
+ push hl
+ push bc
+ ld a, [hli] ; a contains bank of data to be loaded
+ ld e, [hl]
+ inc hl
+ ld d, [hl] ; de contains destination address or palette offset for data
+ inc hl
+ ld c, [hl]
+ inc hl
+ ld b, [hl] ; bc contains size and flags
+ inc hl ; this is a wasted instruction
+ pop hl
+ call .autoCopyVideoData
+ pop hl
+ ld bc, $0005
+ add hl, bc
+ jr .loadItem
+
+.autoCopyVideoData
+; a: bank
+; hl: source
+; bc: flags and size rolled into one
+; bit 0: CGB palette data if set, tile data else
+; If tile data:
+; bit 1: VBank
+; de = dest
+; Else:
+; de = palette offset
+; remaining bits: size
+ srl b
+ rr c
+ jp c, FarCopyCGBPals ; if lowest bit of bc is set
+ jp @ + 2
+ ld [hROMBankBuffer], a ; save bank of data to be loaded
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer] ; a contains bank of data to be loaded
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a ; switch bank to the bank of data to be loaded
+ srl b
+ rr c
+ rl a
+ and $1 ; checks bit 1 of the last word in the data struct
+ ld [rVBK], a ; set VRAM Bank
+.copyByte
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, c
+ or b ; does bc = 0?
+ jr nz, .copyByte
+ xor a
+ ld [rVBK], a ; set VRAM Bank to Bank 0
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a ; reload the previous ROM Bank
+ ret
+
+FarCopyCGBPals: ; 0x6fd
+; a: bank
+; hl: source
+; e: dest offset
+; bc: size
+ ld [hROMBankBuffer], a ; save bank of data to be loaded
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer] ; a contains bank of data to be loaded
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a ; switch bank to the bank of data to be loaded
+ ld a, e
+ bit 6, a
+ jr nz, .do_obp
+ ld de, rBGPI
+ call .copyPaletteData
+ jr z, .no_obp
+ xor a
+.do_obp
+ ld de, rOBPI
+ call .copyPaletteData
+.no_obp
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+.copyPaletteData
+ res 6, a ; only 64 bytes fit here
+ ld b, a
+ set 7, a ; auto-increment
+ ld [de], a
+ inc de
+.copyByte
+ ld a, [hli]
+ ld [de], a
+ inc b
+ dec c
+ ret z
+ bit 6, b
+ jr z, .copyByte
+ ret
+
+LoadOrCopyVRAMData: ; 0x735
+ push hl
+ ld hl, rLCDC
+ bit 7, [hl]
+ pop hl
+ jp z, FarCopyData
+ ; fall through
+LoadVRAMData: ; 0x73f
+; This loads some data into VRAM. It waits for the LCD H-Blank to copy the data 4 bytes at a time.
+; input: hl = source of data
+; a = bank of data to load
+; de = destination of data
+; bc = number of bytes to copy
+ bit 7, h
+ jr nz, .asm_752
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ scf
+ jr .asm_756
+
+.asm_752
+ ld [MBC5SRamBank], a
+ and a
+.asm_756
+ push af
+ call WaitForLCD
+.loop
+ call Func_61b
+.waitForHBlank
+ ld a, [rSTAT]
+ and $3
+ jr nz, .waitForHBlank
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ dec bc
+ dec bc
+ dec bc
+ dec bc
+ nop
+ nop
+ nop
+ nop
+ ld a, b
+ or c
+ jr nz, .loop
+ pop af
+ ret nc
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+FarCopyPalettes: ; 0x790
+ push hl
+ ld hl, rLCDC
+ bit 7, [hl]
+ pop hl
+ jp nz, Func_7dc
+ bit 7, h
+ jr nz, .asm_7ad
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ scf
+ jr .asm_7b1
+
+.asm_7ad
+ ld [MBC5SRamBank], a
+ and a
+.asm_7b1
+ push af
+ ld a, e
+ bit 6, e
+ ld de, rBGPI
+ jr z, .asm_7bf
+ res 6, a
+ ld de, rOBPI
+.asm_7bf
+ set 7, a
+ ld [de], a
+ inc de
+.asm_7c3
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ dec bc
+ dec bc
+ dec bc
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_7c3
+ pop af
+ ret nc
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+Func_7dc: ; 0x7dc
+ bit 7, h
+ jr nz, .asm_7ef
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ scf
+ jr .asm_7f3
+
+.asm_7ef
+ ld [MBC5SRamBank], a
+ and a
+.asm_7f3
+ push af
+ ld a, e
+ bit 6, e
+ ld de, rBGPI
+ jr z, .asm_801
+ res 6, a
+ ld de, rOBPI
+.asm_801
+ push hl
+ ld h, d
+ ld l, e
+ set 7, a
+ call PutTileInVRAM
+ inc de
+ pop hl
+ call WaitForLCD
+.asm_80e
+ call Func_61b
+.asm_811
+ ld a, [rSTAT]
+ and $3
+ jr nz, .asm_811
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ dec bc
+ dec bc
+ dec bc
+ dec bc
+ nop
+ nop
+ nop
+ nop
+ ld a, b
+ or c
+ jr nz, .asm_80e
+ pop af
+ ret nc
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+PutTileInVRAM: ; 0x848
+; Puts a tile in VRAM.
+; input: a = tile number
+; hl = pointer to VRAM location where tile should be placed
+ push af
+ call WaitForLCD
+ call Func_61b
+.asm_84f
+ ld a, [rSTAT]
+ and $3
+ jr nz, .asm_84f ; wait for lcd controller to finish transferring data
+ pop af
+ ld [hl], a ; Store tile number in VRAM background map
+ ret
+
+Func_858: ; 0x858
+ push af
+ call WaitForLCD
+ call Func_61b
+.asm_85f
+ ld a, [rSTAT]
+ and $3
+ jr nz, .asm_85f
+ ld a, $1
+ ld [rVBK], a
+ pop af
+ ld [hl], a
+ xor a
+ ld [rVBK], a
+ ret
+
+LoadBillboardPaletteMap: ; 0x86f
+; Loads the background palette map for a 6x4-tile billboard picture.
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, [rLCDC]
+ bit 7, a
+ jr nz, .asm_8ac
+ ld a, $1
+ ld [rVBK], a
+ ld b, $4
+.loop
+ push bc
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld bc, $001a
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .loop
+ xor a
+ ld [rVBK], a
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+.asm_8ac
+ ld b, $4
+.asm_8ae
+ push bc
+ ld a, [de]
+ call Func_858
+ inc hl
+ inc de
+ ld a, [de]
+ call Func_858
+ inc hl
+ inc de
+ ld a, [de]
+ call Func_858
+ inc hl
+ inc de
+ ld a, [de]
+ call Func_858
+ inc hl
+ inc de
+ ld a, [de]
+ call Func_858
+ inc hl
+ inc de
+ ld a, [de]
+ call Func_858
+ inc de
+ ld bc, $001b
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .asm_8ae
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+Func_8e1: ; 0x8e1
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, [rLCDC]
+ bit 7, a
+ jr nz, .asm_902
+ ld a, c
+ ld [hli], a
+.asm_8f5
+ ld a, [de]
+ ld [hl], a
+ inc de
+ dec b
+ jr nz, .asm_8f5
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+.asm_902
+ ld a, c
+ call PutTileInVRAM
+ inc hl
+.asm_907
+ ld a, [de]
+ call PutTileInVRAM
+ inc de
+ dec b
+ jr nz, .asm_907
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
diff --git a/home/ir.asm b/home/ir.asm
new file mode 100644
index 0000000..97572eb
--- /dev/null
+++ b/home/ir.asm
@@ -0,0 +1,457 @@
+Func_1be3: ; 0x1be3
+ ld a, $c0
+ ld [rRP], a
+ ld a, $ff
+ ld [wd8ea], a
+ xor a
+ ld b, a
+.loop
+ inc a
+ jr nz, .loop
+ inc b
+ jr nz, .loop
+ ld hl, wd8eb
+ ld a, [rKEY1]
+ bit 7, a
+ jr z, .normalSpeed
+ ld [hl], $e
+ inc hl
+ ld [hl], $12
+ inc hl
+ ld [hl], $8
+ inc hl
+ ld [hl], $c
+ inc hl
+ ld [hl], $c
+ ret
+
+.normalSpeed
+ ld [hl], $6
+ inc hl
+ ld [hl], $8
+ inc hl
+ ld [hl], $2
+ inc hl
+ ld [hl], $4
+ inc hl
+ ld [hl], $5
+ ret
+
+Func_1c1b: ; 0x1c1b
+ inc d
+ ret z
+ ld a, [$ff00+c]
+ bit 1, a
+ jr z, Func_1c1b
+ ret
+
+Func_1c23: ; 0x1c23
+ inc d
+ ret z
+ ld a, [$ff00+c]
+ bit 1, a
+ jr nz, Func_1c23
+ ret
+
+Func_1c2b: ; 0x1c2b
+ ld a, $c1
+ ld [$ff00+c], a
+.asm_1c2e
+ dec d
+ jr nz, .asm_1c2e
+ ret
+
+Func_1c32: ; 0x1c32
+ ld a, $c0
+ ld [$ff00+c], a
+.asm_1c35
+ dec d
+ jr nz, .asm_1c35
+ ret
+
+Func_1c39:
+ xor a
+ ld [hNumFramesSinceLastVBlank], a
+ ld a, $1
+ ld [wd8e9], a
+.asm_1c41
+ ld b, $2
+ ld c, rRP % $100
+ ld a, [$ff00+c]
+ and b
+ jr z, Func_1c50
+ ld a, [hNumFramesSinceLastVBlank]
+ and a
+ jr nz, Func_1ca1
+ jr .asm_1c41
+
+Func_1c50: ; 0x1c50
+ ld a, $1
+ ld [wd8e9], a
+ ld b, $1a
+ ld c, rRP % $100
+ ld d, $0
+ ld e, d
+ call Func_1c23
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ ld d, e
+ call Func_1c1b
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ call Func_1c23
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ call Func_1c1b
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ cp $8
+ jp c, Func_1dc2
+ cp $2a
+ jp nc, Func_1dc2
+ ld a, $0
+ ld [wd8ea], a
+ ld d, b
+ call Func_1c32
+ ld d, b
+ call Func_1c2b
+ ld d, b
+ call Func_1c32
+ ld d, b
+ call Func_1c2b
+ ld d, b
+ call Func_1c32
+ ret
+
+Func_1ca1: ; 0x1ca1
+ ld a, $2
+ ld [wd8e9], a
+ ld b, $1a
+ ld c, rRP % $100
+ ld d, b
+ ld e, $0
+ call Func_1c32
+ ld d, b
+ call Func_1c2b
+ ld d, b
+ call Func_1c32
+ ld d, b
+ call Func_1c2b
+ ld d, b
+ call Func_1c32
+ ld d, e
+ call Func_1c23
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ ld d, e
+ call Func_1c1b
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ ld d, e
+ call Func_1c23
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ ld d, e
+ call Func_1c1b
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ ld d, $1a
+ call Func_1c32
+ ld a, $0
+ ld [wd8ea], a
+ ret
+
+Func_1cef:
+ xor a
+ ld [rRP], a
+ ld a, $ff
+ ld [wd8ea], a
+ ret
+
+Func_1cf8: ; 0x1cf8
+ xor a
+ ld [wd8e4], a
+ ld [wd8e5], a
+ push hl
+ push bc
+ ld hl, wd8e6
+ ld a, $5a
+ ld [hli], a
+ ld [hl], b
+ dec hl
+ ld b, $2
+ ld d, $1e
+ call Func_1c32
+ call Func_1d44
+ pop bc
+ pop hl
+ call Func_1ed3
+ call Func_1d44
+ ld a, [wd8e4]
+ ld [wd8e6], a
+ ld a, [wd8e5]
+ ld [wd8e7], a
+ ld hl, wd8e6
+ ld b, $2
+ call Func_1d44
+ ld hl, wd8ea
+ ld b, $1
+ call Func_1e3b
+ ld a, [wd8e6]
+ ld [wd8e4], a
+ ld a, [wd8e7]
+ ld [wd8e5], a
+ ret
+
+Func_1d44: ; 0x1d44
+ ld a, [wd8ea]
+ cp $0
+ ret nz
+ ld c, rRP % $100
+ ld d, $16
+ call Func_1c2b
+ ld d, $16
+ call Func_1c32
+ ld a, b
+ cpl
+ ld b, a
+.asm_1d59
+ inc b
+ jr z, .asm_1dae
+ ld a, $8
+ ld [wd8e3], a
+ ld a, [hli]
+ ld e, a
+ ld a, [wd8e4]
+ add e
+ ld [wd8e4], a
+ jr nc, .asm_1d75
+ ld a, [wd8e5]
+ inc a
+ ld [wd8e5], a
+ jr .asm_1d78
+
+.asm_1d75
+ call Func_1ed3
+.asm_1d78
+ ld a, e
+ rlca
+ ld e, a
+ jr nc, .asm_1d8d
+ ld a, [wd8eb]
+ ld d, a
+ call Func_1c2b
+ ld a, [wd8ec]
+ ld d, a
+ call Func_1c32
+ jr .asm_1d9b
+
+.asm_1d8d
+ ld a, [wd8ed]
+ ld d, a
+ call Func_1c2b
+ ld a, [wd8ee]
+ ld d, a
+ call Func_1c32
+.asm_1d9b
+ ld a, [wd8e3]
+ dec a
+ ld [wd8e3], a
+ jr z, .asm_1dac
+ call Func_1ed4
+ call Func_1ed4
+ jr .asm_1d78
+
+.asm_1dac
+ jr .asm_1d59
+
+.asm_1dae
+ call Func_1ed3
+ call Func_1ed3
+ call Func_1ed4
+ ld d, $16
+ call Func_1c2b
+ ld d, $16
+ call Func_1c32
+ ret
+
+Func_1dc2: ; 0x1dc2
+ ld a, $2
+ ld [wd8ea], a
+ ret
+
+Func_1dc8:
+ ld a, [wd8ea]
+ or $1
+ ld [wd8ea], a
+ ret
+
+Func_1dd1: ; 0x1dd1
+ ld a, [wd8ea]
+ or $4
+ ld [wd8ea], a
+ ret
+
+Func_1dda: ; 0x1dda
+ xor a
+ ld [wd8e4], a
+ ld [wd8e5], a
+ push hl
+ ld hl, wd8e6
+ ld b, $2
+ call Func_1e3b
+ ld a, [wd8e7]
+ ld [wd8e8], a
+ ld b, a
+ pop hl
+ ld a, [wd8e6]
+ cp $5a
+ jp nz, Func_1dd1
+ call Func_1e3b
+ ld a, [wd8e4]
+ ld d, a
+ ld a, [wd8e5]
+ ld e, a
+ push de
+ ld hl, wd8e6
+ ld b, $2
+ call Func_1e3b
+ pop de
+ ld hl, wd8e6
+ ld a, [hli]
+ xor d
+ ld b, a
+ ld a, [hl]
+ xor e
+ or b
+ jr z, .asm_1e22
+ ld a, [wd8ea]
+ or $1
+ ld [wd8ea], a
+.asm_1e22
+ push de
+ ld hl, wd8ea
+ ld b, $1
+ call Func_1d44
+ pop de
+ ld a, d
+ ld [wd8e4], a
+ ld a, e
+ ld [wd8e5], a
+ ld a, [wd8e8]
+ cp $82
+ ret z
+ ret
+
+Func_1e3b: ; 0x1e3b
+ ld a, [wd8ea]
+ cp $0
+ ret nz
+ ld c, rRP % $100
+ ld d, $0
+ call Func_1c23
+ ld a, d
+ or a
+ jp z, Func_1dc2
+ ld d, $0
+ call Func_1c1b
+ ld a, d
+ or a
+ jp z, Func_1dc2
+ ld d, $0
+ call Func_1c23
+ ld a, d
+ or a
+ jp z, Func_1dc2
+ call Func_1ed4
+ call Func_1ed4
+ push af
+ pop af
+ ld a, b
+ cpl
+ ld b, a
+.asm_1e6c
+ inc b
+ jr z, .asm_1eb9
+ ld a, $8
+ ld [wd8e3], a
+.asm_1e74
+ ld d, $0
+ call Func_1c1b
+ call Func_1c23
+ ld a, [wd8ef]
+ cp d
+ jr nc, .asm_1e88
+ ld a, e
+ set 0, a
+ ld e, a
+ jr .asm_1e8c
+
+.asm_1e88
+ ld a, e
+ res 0, a
+ ld e, a
+.asm_1e8c
+ ld a, [wd8e3]
+ dec a
+ ld [wd8e3], a
+ jr z, .asm_1ea0
+ ld a, e
+ rlca
+ ld e, a
+ call Func_1ed4
+ call Func_1ed4
+ jr .asm_1e74
+
+.asm_1ea0
+ ld a, e
+ ld [hli], a
+ ld a, [wd8e4]
+ add e
+ ld [wd8e4], a
+ jr nc, .asm_1eb4
+ ld a, [wd8e5]
+ inc a
+ ld [wd8e5], a
+ jr .asm_1eb7
+
+.asm_1eb4
+ call Func_1ed3
+.asm_1eb7
+ jr .asm_1e6c
+
+.asm_1eb9
+ ld d, $0
+ call Func_1c1b
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ ld d, $11
+ call Func_1c32
+ ret
+
+Func_1ec9:
+ ld b, $00
+ jp Func_1cf8
+
+Func_1ece:
+ ld b, $00
+ jp Func_1dda
+
+Func_1ed3: ; 0x1ed3
+ ret
+
+Func_1ed4: ; 0x1ed4
+ jr z, .asm_1ed6
+.asm_1ed6
+ jr nz, .asm_1ed8
+.asm_1ed8
+ ret
diff --git a/home/joypad.asm b/home/joypad.asm
new file mode 100644
index 0000000..ff9e6dc
--- /dev/null
+++ b/home/joypad.asm
@@ -0,0 +1,131 @@
+
+ReadJoypad: ; 0xab8
+; Reads the current state of the joypad and saves the state into
+; some registers the game uses during gameplay. It remembers the joypad state
+; from the current frame, previous frame, and two frames ago.
+ ld a, $20
+ ld [rJOYP], a
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ and $f
+ swap a
+ ld b, a
+ ld a, $30
+ ld [rJOYP], a
+ ld a, $10
+ ld [rJOYP], a
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ and $f
+ or b
+ cpl ; a contains currently-pressed buttons
+ ld [hJoypadState], a
+ ld a, $30
+ ld [rJOYP], a
+ ld a, [hJoypadState]
+ ld hl, hPreviousJoypadState
+ xor [hl] ; a contains buttons that are different from previous frame
+ push af
+ ld hl, hJoypadState
+ and [hl] ; a contains newly-pressed buttons compared to last frame
+ ld [hNewlyPressedButtons], a
+ ld [hPressedButtons], a
+ pop af
+ ld hl, hPreviousJoypadState
+ and [hl] ; a contains newly-pressed buttons compared to two frames ago
+ ld [hPrevPreviousJoypadState], a
+ ld a, [hJoypadState]
+ and a
+ jr z, .asm_b15
+ ld hl, hPreviousJoypadState
+ cp [hl]
+ jr nz, .asm_b15
+ ; button(s) is pressed, and they're identical to the buttons pressed last frame.
+ ; this code is related to holding down a button for an extended period of time.
+ ld hl, hJoyRepeatDelay
+ dec [hl]
+ jr nz, .asm_b1a
+ ld a, [hJoypadState]
+ ld [hPressedButtons], a
+ ld a, [wd807]
+ ld [hJoyRepeatDelay], a
+ jr .asm_b1a
+
+.asm_b15
+ ld a, [wd806]
+ ld [hJoyRepeatDelay], a
+.asm_b1a
+ ld a, [hJoypadState]
+ ld [hPreviousJoypadState], a
+ ld hl, wJoypadStatesPersistent
+ ld a, [hJoypadState]
+ or [hl]
+ ld [hli], a
+ ld a, [hNewlyPressedButtons]
+ or [hl]
+ ld [hli], a
+ ld a, [hPressedButtons]
+ or [hl]
+ ld [hli], a
+ ret
+
+ClearPersistentJoypadStates: ; 0xb2e
+ ld hl, wJoypadStatesPersistent
+ xor a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ret
+
+IsKeyPressed2: ; 0xb36
+ ld a, [hJoypadState]
+ and [hl]
+ jr z, .asm_b3e
+ cp [hl]
+ jr z, .asm_b48
+.asm_b3e
+ inc hl
+ ld a, [hJoypadState]
+ and [hl]
+ ret z
+ cp [hl]
+ jr z, .asm_b48
+ xor a
+ ret
+
+.asm_b48
+ ld a, $1
+ and a
+ ret
+
+IsKeyPressed: ; 0xb4c
+; Checks if a key for the specified key config is pressed.
+; input: hl = pointer to key config byte pair (e.g. wKeyConfigLeftFlipper)
+; output: zero flag is set if a corresponding key is pressed
+; zero flag is reset if no corresponding key is pressed
+ ld a, [hJoypadState]
+ and [hl]
+ jr z, .asm_b58
+ cp [hl]
+ jr nz, .asm_b58
+ ld a, [hNewlyPressedButtons]
+ and [hl]
+ ret nz
+.asm_b58
+ inc hl
+ ld a, [hJoypadState]
+ and [hl]
+ ret z
+ cp [hl]
+ jr nz, .asm_b64
+ ld a, [hNewlyPressedButtons]
+ and [hl]
+ ret
+
+.asm_b64
+ xor a
+ ret
diff --git a/home/random.asm b/home/random.asm
new file mode 100644
index 0000000..84e4571
--- /dev/null
+++ b/home/random.asm
@@ -0,0 +1,129 @@
+GenRandom: ; 0x959
+ push bc
+ push de
+ push hl
+ ld a, [wd811]
+ ld c, a
+ ld b, $0
+ inc a
+ cp 54 + 1
+ jr nz, .asm_96e
+ call Func_9fa
+ xor a
+ ld bc, $0000
+.asm_96e
+ ld [wd811], a
+ ld hl, wd812
+ add hl, bc
+ ld a, [hl]
+ pop hl
+ pop de
+ pop bc
+ ret
+
+Func_97a: ; 0x97a
+ ld a, [wd810]
+ ld d, a
+ ld a, $0
+ ld a, [sRNGMod]
+.asm_983
+ cp d
+ jr c, .asm_989
+ sub d
+ jr .asm_983
+
+.asm_989
+ ld [wd80f], a
+ ld [wd848], a
+ ld e, $1
+ ld hl, Data_9c4
+ ld a, $36
+.asm_996
+ push af
+ ld c, [hl]
+ inc hl
+ ld b, $0
+ push hl
+ ld hl, wd812
+ add hl, bc
+ ld [hl], e
+ ld a, [wd80f]
+ sub e
+ jr nc, .asm_9a8
+ add d
+.asm_9a8
+ ld e, a
+ ld a, [hl]
+ ld [wd80f], a
+ pop hl
+ pop af
+ dec a
+ jr nz, .asm_996
+ call Func_9fa
+ call Func_9fa
+ call Func_9fa
+ ld a, $0
+ call GenRandom
+ ld [sRNGMod], a
+ ret
+
+Data_9c4:
+ db $14, $29, $07, $1c, $31, $0f, $24, $02, $17
+ db $2c, $0a, $1f, $34, $12, $27, $05, $1a, $2f
+ db $0d, $22, $00, $15, $2a, $08, $1d, $32, $10
+ db $25, $03, $18, $2d, $0b, $20, $35, $13, $28
+ db $06, $1b, $30, $0e, $23, $01, $16, $2b, $09
+ db $1e, $33, $11, $26, $04, $19, $2e, $0c, $21
+
+Func_9fa: ; 0x9fa
+ ld a, [wd810]
+ ld d, a
+ ld bc, wd812
+ ld hl, wd812 + $1f
+ ld e, $18
+.asm_a06
+ ld a, [bc]
+ sub [hl]
+ jr nc, .asm_a0b
+ add d
+.asm_a0b
+ ld [bc], a
+ dec e
+ jr nz, .asm_a06
+ ld bc, wd812 + $18
+ ld hl, wd812
+ ld e, $1f
+.asm_a17
+ ld a, [bc]
+ sub [hl]
+ jr nc, .asm_a1c
+ add d
+.asm_a1c
+ ld [bc], a
+ dec e
+ jr nz, .asm_a17
+ ret
+
+Func_a21: ; 0xa21
+ push bc
+ push hl
+ ld c, a
+ ld b, $0
+ ld hl, Data_a38
+ add hl, bc
+ ld l, [hl]
+ call GenRandom
+ call Func_dd4
+ inc h
+ srl h
+ ld a, h
+ pop hl
+ pop bc
+ ret
+
+Data_a38:
+x = 0
+REPT 128
+ db x | ((x >> 7) & 1)
+x = x + 2
+ENDR
diff --git a/macros.asm b/macros.asm
index d737152..ab03801 100644
--- a/macros.asm
+++ b/macros.asm
@@ -2,6 +2,7 @@ INCLUDE "macros/sound.asm"
AdvanceFrame EQUS "$10"
JumpTable EQUS "$18"
+ReadHalfword EQUS "$20"
dex_text EQUS "db " ; Start beginning of pokedex description
dex_line EQUS "db $0d," ; Start new line in pokedex description
diff --git a/pokemon-reverse-engineering-tools b/pokemon-reverse-engineering-tools
-Subproject 74c620d01ad59bfb09cf4111ace549b925fcb9a
+Subproject 979c98a7c0f67ad6b9685b2d532c66a1f76ffb2
diff --git a/sram.asm b/sram.asm
index 22bd143..4586a34 100644
--- a/sram.asm
+++ b/sram.asm
@@ -9,7 +9,11 @@ saved_data: MACRO
\1BackupChecksum:: dw
ENDM
- saved_data sHighScores, $82
- saved_data sPokedexFlags, $98
- saved_data sKeyConfigs, $e
- saved_data sSaveGame, $4c3
+ saved_data sHighScores, $82 ; a000
+ saved_data sPokedexFlags, $98 ; a10c
+ saved_data sKeyConfigs, $e ; a244
+ saved_data sSaveGame, $4c3 ; a268
+; abf6
+
+ ds $409
+sRNGMod:: ; afff
diff --git a/wram.asm b/wram.asm
index 6dce20d..655eda1 100644
--- a/wram.asm
+++ b/wram.asm
@@ -1860,19 +1860,7 @@ wd811:: ; 0xd811
ds $1
wd812:: ; 0xd812
- ds $18
-
-wd82a:: ; 0xd82a
- ds $7
-
-wd831:: ; 0xd831
- ds $c
-
-wd83d:: ; 0xd83d
- ds $9
-
-wd846:: ; 0xd846
- ds $2
+ ds $36
wd848:: ; 0xd848
ds $1
@@ -2142,6 +2130,7 @@ wd8e9:: ; 0xd8e9
ds $1
wd8ea:: ; 0xd8ea
+; IR status flags?
ds $1
wd8eb:: ; 0xd8eb