diff options
Diffstat (limited to 'src/engine')
-rw-r--r-- | src/engine/bank01.asm | 2 | ||||
-rw-r--r-- | src/engine/bank03.asm | 6 | ||||
-rw-r--r-- | src/engine/bank04.asm | 121 | ||||
-rw-r--r-- | src/engine/bank06.asm | 2 | ||||
-rw-r--r-- | src/engine/bank07.asm | 5 | ||||
-rw-r--r-- | src/engine/bank1c.asm | 63 | ||||
-rw-r--r-- | src/engine/bank20.asm | 400 | ||||
-rw-r--r-- | src/engine/home.asm | 8 |
8 files changed, 563 insertions, 44 deletions
diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index bf16a12..b7fb896 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -7,7 +7,7 @@ GameLoop: ; 4000 (1:4000) call EnableInt_VBlank call EnableInt_Timer call EnableSRAM - ld a, [s0a006] + ld a, [sTextSpeed] ld [wTextSpeed], a ld a, [s0a009] ld [wSkipDelayAllowed], a diff --git a/src/engine/bank03.asm b/src/engine/bank03.asm index 6b7c2cb..1b4207b 100644 --- a/src/engine/bank03.asm +++ b/src/engine/bank03.asm @@ -42,7 +42,7 @@ LoadMap: ; c000 (3:4000) call Func_c4b9 call Func_c943 call Func_c158 - farcall Func_80480 + farcall DoMapOWFrame call SetOverworldDoFrameFunction xor a ld [wd0b4], a @@ -270,7 +270,7 @@ Func_c1f8: ; c1f8 (3:41f8) call EnableSRAM ld a, [sAnimationsDisabled] ld [wAnimationsDisabled], a - ld a, [s0a006] + ld a, [sTextSpeed] ld [wTextSpeed], a call DisableSRAM farcall Func_10756 @@ -464,7 +464,7 @@ Func_c36a: ; c36a (3:436a) cp POKEMON_DOME_ENTRANCE jr nz, .asm_c379 xor a - ld [wd324], a + ld [wd323 + 1], a .asm_c379 ret diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm index 330cd3f..b22581f 100644 --- a/src/engine/bank04.asm +++ b/src/engine/bank04.asm @@ -1101,7 +1101,124 @@ Func_11416: ; 11416 (4:5416) INCROM $11416, $11430 Func_11430: ; 11430 (4:5430) - INCROM $11430, $1157c + push de + ld de, sb800 + call .Func_11439 + pop de + ret + +.Func_11439 + push hl + push bc + call EnableSRAM + call .Func_11447 + call DisableSRAM + pop bc + pop hl + ret + +.Func_11447 + push hl + push bc + push de + ld a, e + add $08 + ld [wTempPointer], a + ld a, d + adc 0 + ld [wTempPointer + 1], a + ld hl, .data_11498 +.asm_11459 + ld a, [hli] + ld e, a + ld d, [hl] + or d + jr z, .done_copy + inc hl + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + +; copy bc bytes from wTempPointer to de + push hl + ld a, [wTempPointer] + ld l, a + ld a, [wTempPointer + 1] + ld h, a +.loop_copy + ld a, [hli] + ld [de], a + inc de + dec bc + ld a, c + or b + jr nz, .loop_copy + + ld a, l + ld [wTempPointer], a + ld a, h + ld [wTempPointer + 1], a + pop hl + inc hl + inc hl + jr .asm_11459 + +.done_copy + call EnableSRAM + ld a, [sAnimationsDisabled] + ld [wAnimationsDisabled], a + ld a, [sTextSpeed] + ld [wTextSpeed], a + call DisableSRAM + pop de + pop bc + pop hl + ret + +.data_11498 +; pointer, number of bytes, unknown + dw wd3cc, 1, $ff00 + dw wd3cb, 1, $ff00 + dw wPlayTimeCounter + 0, 1, $ff00 + dw wPlayTimeCounter + 1, 1, $ff00 + dw wPlayTimeCounter + 2, 1, $ff00 + dw wPlayTimeCounter + 3, 2, $ff00 + dw wd32e, 1, $ff00 + dw wTempMap, 1, $ff00 + dw wTempPlayerXCoord, 1, $ff00 + dw wTempPlayerYCoord, 1, $ff00 + dw wTempPlayerDirection, 1, $ff00 + dw wd0c2, 1, $ff00 + dw wDuelResult, 1, $ff00 + dw wd0c4, 1, $ff00 + dw wd696, 1, $ff00 + dw wd698, 4, $ff00 + dw wd323, 11, $ff00 + dw Data_1156c, 1, $ff00 + dw wd0b8, 1, $ff00 + dw wd0b9, 1, $ff00 + dw wd11b, 1, $ff00 + dw wd0ba, 1, $ff00 + dw wPCPackSelection, 1, $0e00 + dw wPCPacks, 15, $ff00 + dw wd111, 1, $ff00 + dw wcad5, 1, $ff00 + dw wd3b8, 1, $ff00 + dw wd3bb, 10, $ff00 + dw wd0c5, 1, $ff00 + dw wMultichoiceTextboxResult_ChooseDeckToDuelAgainst, 1, $ff00 + dw wd10e, 1, $ff00 + dw Data_1156c, 15, $ff00 + dw Data_1156c, 16, $ff00 + dw Data_1156c, 16, $ff00 + dw wEventFlags, 64, $ff00 + dw NULL +; 0x1156c + +Data_1156c: ; 1156c (4:556c) + db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 +; 0x1157c ; save the game ; if c is 0, save the player at their current position @@ -2137,7 +2254,7 @@ MainMenu_NewGame: ; 12704 (4:6704) call EnableSRAM ld a, [sAnimationsDisabled] ld [wAnimationsDisabled], a - ld a, [s0a006] + ld a, [sTextSpeed] ld [wTextSpeed], a call DisableSRAM ld a, MUSIC_STOP diff --git a/src/engine/bank06.asm b/src/engine/bank06.asm index c96d2a1..1413aed 100644 --- a/src/engine/bank06.asm +++ b/src/engine/bank06.asm @@ -1501,7 +1501,7 @@ Func_1996e: ; 1996e (6:596e) ld a, $2 ld [s0a003], a ld a, $2 - ld [s0a006], a + ld [sTextSpeed], a ld [wTextSpeed], a xor a ld [sAnimationsDisabled], a diff --git a/src/engine/bank07.asm b/src/engine/bank07.asm index 376f2f1..018787e 100644 --- a/src/engine/bank07.asm +++ b/src/engine/bank07.asm @@ -50,6 +50,7 @@ Func_1c056: ; 1c056 (7:4056) INCLUDE "data/warps.asm" +; loads data from the map header of wCurMap LoadMapHeader: ; 1c33b (7:433b) push hl push bc @@ -66,7 +67,7 @@ LoadMapHeader: ; 1c33b (7:433b) ld a, [hli] ld [wCurTilemap], a ld a, [hli] - ld c, a + ld c, a ; CGB tilemap variant ld a, [hli] ld [wd28f], a ld a, [hli] @@ -1709,7 +1710,7 @@ Credits_1d6ad: ; 1d6ad (7:56ad) call Func_1d705 call Func_1c858 xor a - ld [wd324], a + ld [wd323 + 1], a ld a, MUSIC_CREDITS call PlaySong farcall Func_10031 diff --git a/src/engine/bank1c.asm b/src/engine/bank1c.asm index 0c992dc..8de8786 100644 --- a/src/engine/bank1c.asm +++ b/src/engine/bank1c.asm @@ -330,8 +330,65 @@ Func_70214: ; 70214 (1c:4214) Unknown_7024a: ; 7024a (1c:424a) INCROM $7024a, $7036a -Func_7036a: ; 7036a (1c:436a) - INCROM $7036a, $703cb +; decompresses palette data depending on wd132 +; then sends it as SGB packet +SetSGB2AndSGB3MapPalette: ; 7036a (1c:436a) + ld a, [wConsole] + cp CONSOLE_SGB + ret nz ; return if not SGB + ld a, [wd132] + or a + ret z ; not valid + + push hl + push bc + push de + ld a, [wd132] + add a + ld c, a + ld b, $0 + ld hl, .pal_data_pointers + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + call DecompressSGBPalette + + ; load palettes to wTempSGBPacket + ld hl, wBGMapBuffer + ld de, wTempSGBPacket + 1 ; PAL Packet color #0 (PAL23's SGB2) + ld bc, 8 ; pal size + call CopyDataHLtoDE + ld hl, wBGMapBuffer + 34 + ld de, wTempSGBPacket + 9 ; PAL Packet color #4 (PAL23's SGB3) + ld bc, 6 + call CopyDataHLtoDE + + xor a + ld [wTempSGBPacket + 15], a + ld hl, wTempSGBPacket + ld a, $1 + ld [hl], a + call Func_704c7 + call SendSGB + pop de + pop bc + pop hl + ret + +.pal_data_pointers + dw $722f ; unused + dw $722f ; MAP_SGB_PALETTE_1 + dw $7253 ; MAP_SGB_PALETTE_2 + dw $7277 ; MAP_SGB_PALETTE_3 + dw $729a ; MAP_SGB_PALETTE_4 + dw $72bd ; MAP_SGB_PALETTE_5 + dw $72e0 ; MAP_SGB_PALETTE_6 + dw $7304 ; MAP_SGB_PALETTE_7 + dw $7328 ; MAP_SGB_PALETTE_8 + dw $734b ; MAP_SGB_PALETTE_9 + dw $736f ; MAP_SGB_PALETTE_10 +; 0x703cb Func_703cb: ; 703cb (1c:43cb) ld a, [wConsole] @@ -361,7 +418,7 @@ Func_703cb: ; 703cb (1c:43cb) pop hl ret -Func_70403: ; 70403 (1c:4403) +DecompressSGBPalette: ; 70403 (1c:4403) push hl push bc push de diff --git a/src/engine/bank20.asm b/src/engine/bank20.asm index 4d46930..dee6699 100644 --- a/src/engine/bank20.asm +++ b/src/engine/bank20.asm @@ -1,8 +1,22 @@ Func_80000: ; 80000 (20:4000) - INCROM $80000, $80028 + call ClearSRAMBGMaps + xor a + ld [wTextBoxFrameType], a + call Func_8003d + farcall Func_c37a + farcall Func_c9c7 + call Func_801a1 + farcall Func_c3ff + ld a, [wCurMap] + cp $00 + ret nz + farcall Func_10f2e + farcall Func_10fbc + ret +; 0x80028 Func_80028: ; 80028 (20:4028) - call Func_801f1 + call ClearSRAMBGMaps ld bc, $0000 call Func_80077 farcall Func_c9c7 @@ -13,7 +27,7 @@ Func_80028: ; 80028 (20:4028) Func_8003d: ; 8003d (20:403d) farcall LoadMapHeader - farcall Func_7036a + farcall SetSGB2AndSGB3MapPalette ld bc, $0 call Func_80077 ld a, $80 @@ -38,13 +52,13 @@ Func_8003d: ; 8003d (20:403d) ; 0x80077 Func_80077: ; 80077 (20:4077) - ld a, $1 - ld [wBGMapCopyMode], a + ld a, TRUE + ld [wWriteBGMapToSRAM], a jr Func_80082 Func_8007e: ; 8007e (20:407e) xor a - ld [wBGMapCopyMode], a + ld [wWriteBGMapToSRAM], a ; fallthrough Func_80082: ; 80082 (20:4082) @@ -214,13 +228,13 @@ Func_80148: ; 80148 (20:4148) ret ; copies BG Map data pointed by hl -; to either VRAM or SRAM, depending on wBGMapCopyMode +; to either VRAM or SRAM, depending on wWriteBGMapToSRAM ; de is the target address in VRAM, ; if SRAM is the target address to copy, ; copies data to s0BGMap or s1BGMap ; for VRAM0 or VRAM1 respectively CopyBGDataToVRAMOrSRAM: ; 8016e (20:416e) - ld a, [wBGMapCopyMode] + ld a, [wWriteBGMapToSRAM] or a jp z, SafeCopyDataHLtoDE @@ -308,16 +322,16 @@ Func_801a1: ; 801a1 (20:41a1) pop hl ret -; Clears the first x800 bytes of S1:a000 -Func_801f1: ; 801f1 (20:41f1) +; clears s0BGMap and s1BGMap +ClearSRAMBGMaps: ; 801f1 (20:41f1) push hl push bc ldh a, [hBankSRAM] push af - ld a, $1 + ld a, BANK(s0BGMap) ; SRAM 1 call BankswitchSRAM - ld hl, $a000 - ld bc, $0800 + ld hl, s0BGMap + ld bc, $800 ; s0BGMap + s1BGMap xor a call FillMemoryWithA pop af @@ -804,22 +818,315 @@ CopyPaletteDataToBuffer: ; 80456 (20:4456) INCROM $8047b, $80480 -Func_80480: ; 80480 (20:4480) - INCROM $80480, $804d8 +; for the current map, process the animation +; data of its corresponding OW tiles +DoMapOWFrame: ; 80480 (20:4480) + push hl + push bc + ld a, [wCurMap] + add a + add a ; *4 + ld c, a + ld a, [wConsole] + cp CONSOLE_CGB + jr nz, .not_cgb + ld a, c + add 2 + ld c, a +.not_cgb + ld b, $0 + ld hl, MapOWFramesetPointers + add hl, bc + ; got pointer for current map's frameset data + ld a, [hli] + ld h, [hl] + ld l, a + call ProcessOWFrameset + pop bc + pop hl + ret +; 0x804a2 + +; processes the OW frameset pointed by hl +ProcessOWFrameset: ; 804a2 (20:44a2) + push hl + push bc + ld a, l + ld [wCurMapOWFrameset], a + ld a, h + ld [wCurMapOWFrameset + 1], a + xor a + ld [wumLoadedFramesetSubgroups], a + call ClearOWFramesetSubgroups + ld c, 0 +.loop_subgroups + call LoadOWFramesetSubgroup + call GetOWFramesetSubgroupData + ld a, [wCurOWFrameDataOffset] + cp -1 + jr z, .next_subgroup + ld a, [wumLoadedFramesetSubgroups] + inc a + ld [wumLoadedFramesetSubgroups], a + call LoadOWFrameTiles + call StoreOWFramesetSubgroup +.next_subgroup + inc c + ld a, c + cp NUM_OW_FRAMESET_SUBGROUPS + jr c, .loop_subgroups + pop bc + pop hl + ret +; 0x804d8 + +; for each of the loaded frameset subgroups +; load their tiles and advance their durations +DoLoadedFramesetSubgroupsFrame: ; 804d8 (20:44d8) + ld a, [wumLoadedFramesetSubgroups] + or a + ret z + ld c, 0 +.loop_subgroups + call LoadOWFramesetSubgroup + cp -1 + jr z, .next_subgroup + call LoadOWFrameTiles + call StoreOWFramesetSubgroup +.next_subgroup + inc c + ld a, c + cp NUM_OW_FRAMESET_SUBGROUPS + jr c, .loop_subgroups + ret +; 0x804f3 + +; from subgroup in register c, get +; from OW frameset in hl its corresponding +; data offset and duration +GetOWFramesetSubgroupData: ; 804f3 (20:44f3) + push hl + push bc + push hl + ld b, $0 + add hl, bc + ld c, [hl] + pop hl + add hl, bc + ld a, [hl] ; beginning of OW_FRAME + cp -1 + jr z, .end_of_list ; skip if it's end of list + ld a, c ; store its addr offset + ld [wCurOWFrameDataOffset], a + xor a + ld [wCurOWFrameDuration], a +.end_of_list + pop bc + pop hl + ret +; 0x8050c + +; if wCurOWFrameDuration == 0, processes next frame for OW map +; by loading the tiles corresponding to current frame +; if wCurOWFrameDuration != 0, then simply decrements it and returns +LoadOWFrameTiles: ; 8050c (20:450c) + ld a, [wCurOWFrameDuration] + or a + jr z, .next_frame + dec a + ld [wCurOWFrameDuration], a + ret + +.next_frame + push hl + push de + push bc + ; add wCurOWFrameDataOffset to pointer in wCurMapOWFrameset + ld a, [wCurOWFrameDataOffset] + ld c, a + ld a, [wCurMapOWFrameset] + add c + ld l, a + ld a, [wCurMapOWFrameset + 1] + adc 0 + ld h, a + + ld a, [hl] + ld [wCurOWFrameDuration], a +.loop_ow_frames + call .LoadTile + ld de, OW_FRAME_STRUCT_SIZE + add hl, de ; next frame data + ld a, c + add e + ld c, a + ; OW frames with 0 duration are processed + ; at the same time as the previous frame data + ld a, [hl] + or a + jr z, .loop_ow_frames -Func_804d8: ; 804d8 (20:44d8) - INCROM $804d8, $80b7a + cp -1 + ld a, c + ld [wCurOWFrameDataOffset], a + jr nz, .done +; there's no more frames to process for this map +; reset the frame data offset + pop bc + push bc + ld a, [wCurOWFrameDuration] + push af + ld a, [wCurMapOWFrameset] + ld l, a + ld a, [wCurMapOWFrameset + 1] + ld h, a + call GetOWFramesetSubgroupData + pop af + ld [wCurOWFrameDuration], a + +.done + pop bc + pop de + pop hl + ret + +; load a single tile specified +; by the OW frame data pointed by hl +.LoadTile + push hl + push bc + push de + ldh a, [hBankVRAM] + push af + inc hl + ld a, [hli] ; tile number + xor $80 + ld e, a + ld a, [hli] ; VRAM bank + +; get tile offset of register e +; and load its address in de + push hl + call BankswitchVRAM + ld h, $00 + ld l, e + add hl, hl ; *2 + add hl, hl ; *4 + add hl, hl ; *8 + add hl, hl ; *16 + ld de, v0Tiles1 ; or v1Tiles1 + add hl, de + ld e, l + ld d, h + pop hl + + ld a, [hli] ; bank of tileset + add BANK(MapOWFramesetPointers) + ld [wTempPointerBank], a + ld a, [hli] ; tileset addr lo byte + ld c, a + ld a, [hli] ; tileset addr hi byte + ld b, a + ld a, [hli] ; tile number lo byte + ld h, [hl] ; tile number hi byte + ld l, a + add hl, hl ; *2 + add hl, hl ; *4 + add hl, hl ; *8 + add hl, hl ; *16 + add hl, bc + ; copy tile from the tileset to VRAM addr + lb bc, 1, TILE_SIZE + call CopyGfxDataFromTempBank + pop af + call BankswitchVRAM + pop de + pop bc + pop hl + ret +; 0x8059a + +; fills wOWFramesetSubgroups with $ff +ClearOWFramesetSubgroups: ; 8059a (20:459a) + push hl + push bc + ld hl, wOWFramesetSubgroups + ld c, NUM_OW_FRAMESET_SUBGROUPS * 2 + ld a, $ff +.loop + ld [hli], a + dec c + jr nz, .loop + pop bc + pop hl + ret +; 0x805aa + +; copies wOWFramesetSubgroups + 2*c +; to wCurOWFrameDataOffset and wCurOWFrameDuration +; also returns its current duration +LoadOWFramesetSubgroup: ; 805aa (20:45aa) + push hl + push bc + ld hl, wOWFramesetSubgroups + sla c + ld b, $00 + add hl, bc + ld a, [hli] + ld [wCurOWFrameDataOffset], a + push af + ld a, [hl] + ld [wCurOWFrameDuration], a + pop af + pop bc + pop hl + ret +; 0x805c1 + +; copies wCurOWFrameDataOffset and wCurOWFrameDuration +; to wOWFramesetSubgroups + 2*c +StoreOWFramesetSubgroup: ; 805c1 (20:45c1) + push hl + push bc + ld hl, wOWFramesetSubgroups + sla c + ld b, $00 + add hl, bc + ld a, [wCurOWFrameDataOffset] + ld [hli], a + ld a, [wCurOWFrameDuration] + ld [hl], a + pop bc + pop hl + ret +; 0x805d6 + +INCLUDE "data/map_ow_framesets.asm" + +; clears wd323 Func_80b7a: ; 80b7a (20:4b7a) - INCROM $80b7a, $80b89 + push hl + push bc + ld c, $b + ld hl, wd323 + xor a +.loop + ld [hli], a + dec c + jr nz, .loop + pop bc + pop hl + ret +; 0x80b89 Func_80b89: ; 80b89 (20:4b89) push hl push bc push af ld c, a - ld a, $01 - ld [wBGMapCopyMode], a + ld a, TRUE + ld [wWriteBGMapToSRAM], a ld b, $00 ld hl, wd323 add hl, bc @@ -837,9 +1144,9 @@ Func_80b89: ; 80b89 (20:4b89) Func_80ba4: ; 80ba4 (20:4ba4) push af xor a - ld [wBGMapCopyMode], a + ld [wWriteBGMapToSRAM], a pop af -; Fallthrough +; fallthrough Func_80baa: ; 80baa (20:4baa) push hl @@ -858,16 +1165,18 @@ Func_80baa: ; 80baa (20:4baa) push af ld a, [wd23a + 1] push af + ld b, $0 ld hl, wd323 add hl, bc ld a, $1 ld [hl], a + ld a, c add a ld c, a ld b, $0 - ld hl, Unknown_80c21 + ld hl, .unknown_80c21 add hl, bc ld a, [hli] ld h, [hl] @@ -885,13 +1194,13 @@ Func_80baa: ; 80baa (20:4baa) ld a, [hl] ld [wCurTilemap], a push bc - farcall Func_80082 + farcall Func_80082 ; unnecessary farcall pop bc srl b ld a, c rrca - and $f - swap a + and $0f + swap a ; * $10 add b ld c, a ld b, $0 @@ -915,8 +1224,43 @@ Func_80baa: ; 80baa (20:4baa) pop hl ret -Unknown_80c21: ; 80c21 (20:4c21) - INCROM $80c21, $80e5a +.unknown_80c21 + dw .data_1 + dw .data_2 + dw .data_3 + dw .data_4 + dw .data_5 + dw .data_6 + dw .data_7 + dw .data_8 + dw .data_9 + dw .data_10 + dw .data_11 + +.data_1 + db $16, $00, TILEMAP_UNUSED_5, TILEMAP_UNUSED_6 +.data_2 + db $0e, $00, TILEMAP_UNUSED_7, TILEMAP_UNUSED_8 +.data_3 + db $06, $02, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4 +.data_4 + db $0a, $02, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4 +.data_5 + db $0e, $02, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4 +.data_6 + db $12, $02, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4 +.data_7 + db $0e, $0a, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4 +.data_8 + db $12, $0a, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4 +.data_9 + db $0e, $12, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4 +.data_10 + db $12, $12, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4 +.data_11 + db $0a, $00, TILEMAP_UNUSED_1, TILEMAP_UNUSED_2 + + INCROM $80c63, $80e5a SpriteNullAnimationPointer: ; 80e5a (20:4e5a) dw SpriteNullAnimationFrame diff --git a/src/engine/home.asm b/src/engine/home.asm index 6ec1230..f12f24d 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -10577,9 +10577,9 @@ OverworldDoFrameFunction: ; 380e (0:380e) call BankswitchROM call Func_1c610 call Func_3cb4 - ld a, BANK(Func_804d8) + ld a, BANK(DoLoadedFramesetSubgroupsFrame) call BankswitchROM - call Func_804d8 + call DoLoadedFramesetSubgroupsFrame call UpdateRNGSources pop af call BankswitchROM @@ -11690,9 +11690,9 @@ Func_3e31: ; 3e31 (0:3e31) ldh a, [hBankROM] push af call Func_3cb4 - ld a, BANK(Func_804d8) + ld a, BANK(DoLoadedFramesetSubgroupsFrame) call BankswitchROM - call Func_804d8 + call DoLoadedFramesetSubgroupsFrame pop af call BankswitchROM ret |