diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2017-07-09 13:16:25 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2017-07-09 13:16:41 -0400 |
commit | c0382daeb5959a0be56fbf46de19873fc3a0bb39 (patch) | |
tree | 1eca65b8465602a91e672e5d7e3522519680a980 | |
parent | 2f7383f03d9e7368d744690be93e811a052d0d42 (diff) |
Some more organization of HOME
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
@@ -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 @@ -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 @@ -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 @@ -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 |