diff options
Diffstat (limited to 'src/engine/bank04.asm')
-rw-r--r-- | src/engine/bank04.asm | 1255 |
1 files changed, 1146 insertions, 109 deletions
diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm index 38b1271..d1d6bfa 100644 --- a/src/engine/bank04.asm +++ b/src/engine/bank04.asm @@ -23,20 +23,24 @@ Func_10000: ; 10000 (4:4000) ld [wVBlankOAMCopyToggle], a ret -Func_10031: ; 10031 (4:4031) +; saves all pals to SRAM, then fills them with white. +; after flushing, it loads back the saved pals from SRAM. +FlashWhiteScreen: ; 10031 (4:4031) ldh a, [hBankSRAM] + push af - ld a, $1 + ld a, BANK("SRAM1") call BankswitchSRAM - call Func_10cbb + call CopyPalsToSRAMBuffer call DisableSRAM call Func_10b28 call FlushAllPalettes call EnableLCD call DoFrameIfLCDEnabled - call Func_10cea + call LoadPalsFromSRAMBuffer call FlushAllPalettes pop af + call BankswitchSRAM call DisableSRAM ret @@ -51,7 +55,13 @@ Func_1010c: ; 1010c (4:410c) INCROM $1010c, $10197 Func_10197: ; 10197 (4:4197) - INCROM $10197, $1029e + INCROM $10197, $101df + +Func_101df: ; 101df (4:41df) + INCROM $101df, $1024f + +Func_1024f: ; 1024f (4:424f) + INCROM $1024f, $1029e Medal_1029e: ; 1029e (4:429e) sub $8 @@ -80,7 +90,7 @@ Medal_1029e: ; 1029e (4:429e) ld [wTxRam2], a ld a, [hl] ld [wTxRam2 + 1], a - call Func_10031 + call FlashWhiteScreen ld a, MUSIC_MEDAL call PlaySong ld a, $ff @@ -148,7 +158,7 @@ GiveBoosterPack: ; 1031b (4:431b) ld [wTxRam2], a ld a, [hl] ld [wTxRam2 + 1], a - call Func_10031 + call FlashWhiteScreen call PauseSong ld a, MUSIC_BOOSTER_PACK call PlaySong @@ -272,7 +282,7 @@ Duel_Init: ; 103d3 (4:43d3) call Func_3e2a ; LoadDuelistPortrait ld a, [wMatchStartTheme] call PlaySong - call Func_10031 + call FlashWhiteScreen call DoFrameIfLCDEnabled lb bc, $2f, $1d ; cursor tile, tile behind cursor lb de, 18, 17 ; x, y @@ -285,10 +295,14 @@ Duel_Init: ; 103d3 (4:43d3) ret Unknown_10451: ; 10451 (4:4451) - INCROM $10451, $10456 + db 1, 14 + tx Text0395 + db $ff Unknown_10456: ; 10456 (4:4456) - INCROM $10456, $1045b + db 1, 16 + tx Text0396 + db $ff Unknown_1045b: ; 1045b (4:445b) INCROM $1045b, $1052f @@ -311,7 +325,7 @@ TryGivePCPack: ; 10a70 (4:4a70) push bc push de ld b, a - ld c, $f ; number of packs possible + ld c, NUM_PC_PACKS ld hl, wPCPacks .searchLoop1 ld a, [hli] @@ -320,7 +334,7 @@ TryGivePCPack: ; 10a70 (4:4a70) jr z, .quit dec c jr nz, .searchLoop1 - ld c, $f + ld c, NUM_PC_PACKS ld hl, wPCPacks .findFreeSlotLoop ld a, [hl] @@ -334,7 +348,7 @@ TryGivePCPack: ; 10a70 (4:4a70) .foundFreeSlot ld a, b - or $80 ; mark pack as unopened + or PACK_OPENED ; mark pack as unopened ld [hl], a .quit @@ -343,17 +357,400 @@ TryGivePCPack: ; 10a70 (4:4a70) pop hl ret +; writes wd293 with byte depending on console +; every entry in the list is $00 Func_10a9b: ; 10a9b (4:4a9b) - INCROM $10a9b, $10ab4 + push hl + ld a, [wConsole] + add LOW(.data_10ab1) + ld l, a + ld a, HIGH(.data_10ab1) + adc $00 + ld h, a + ld a, [hl] + ld [wd293], a + xor a + ld [wd317], a + pop hl + ret + +.data_10ab1 + db $00 ; CONSOLE_DMG + db $00 ; CONSOLE_SGB + db $00 ; CONSOLE_CGB +; 0x10ab4 Func_10ab4: ; 10ab4 (4:4ab4) - INCROM $10ab4, $10af9 + ld a, [wLCDC] + bit 7, a + jr z, .lcd_off + ld a, [wd293] + ld [wd294], a + ld [wd295], a + ld [wd296], a + ld de, PALRGB_WHITE + ld hl, wTempBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + call FillMemoryWithDE + call RestoreFirstColorInOBPals + call FadeScreenToTempPals + call DisableLCD + ret + +.lcd_off + ld a, [wd293] + ld [wBGP], a + ld [wOBP0], a + ld [wOBP1], a + ld de, PALRGB_WHITE + ld hl, wBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + call FillMemoryWithDE + call FlushAllPalettes + ret +; 0x10af9 Func_10af9: ; 10af9 (4:4af9) - INCROM $10af9, $10b28 + call BackupPalsAndSetWhite + call RestoreFirstColorInOBPals + call FlushAllPalettes + call EnableLCD + jp FadeScreenToTempPals +; 0x10b08 + +BackupPalsAndSetWhite: ; 10b08 (4:4b08) + ld a, [wBGP] + ld [wd294], a + ld a, [wOBP0] + ld [wd295], a + ld a, [wOBP1] + ld [wd296], a + ld hl, wBackgroundPalettesCGB + ld de, wTempBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + NUM_OBJECT_PALETTES palettes + call CopyDataHLtoDE_SaveRegisters + jr Func_10b28 ; can be fallthrough +; fills wBackgroundPalettesCGB with white pal Func_10b28: ; 10b28 (4:4b28) - INCROM $10b28, $10c96 + ld a, [wd293] + ld [wBGP], a + ld [wOBP0], a + ld [wOBP1], a + ld de, PALRGB_WHITE + ld hl, wBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + call FillMemoryWithDE + ret +; 0x10b41 + +; gets from backup OB pals the first color +; of each pal and writes them in wObjectPalettesCGB +RestoreFirstColorInOBPals: ; 10b41 (4:4b41) + ld hl, wTempObjectPalettesCGB + ld de, wObjectPalettesCGB + ld c, NUM_OBJECT_PALETTES +.loop_pals + push bc + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + ld bc, CGB_PAL_SIZE - 1 + add hl, bc + ld a, c + add e + ld e, a + ld a, b + adc d + ld d, a + pop bc + dec c + jr nz, .loop_pals + ret +; 0x10b5e + +FadeScreenToTempPals: ; 10b5e (4:4b5e) + ld a, [wVBlankCounter] + push af + ld c, $10 +.loop + push bc + ld a, c + and %11 + cp 0 + call z, Func_10b85 + call FadeBGPalIntoTemp3 + call FadeOBPalIntoTemp + call FlushAllPalettes + call DoFrameIfLCDEnabled + pop bc + dec c + dec c + jr nz, .loop + pop af + ld b, a + ld a, [wVBlankCounter] + sub b + ret +; 0x10b85 + +; does something with wBGP given wd294 +; mixes them into a single value? +Func_10b85: ; 10b85 (4:4b85) + push bc + ld c, $03 + ld hl, wBGP + ld de, wd294 +.asm_10b8e + push bc + ld b, [hl] + ld a, [de] + ld c, a + call .Func_10b9e + ld [hl], a + pop bc + inc de + inc hl + dec c + jr nz, .asm_10b8e + pop bc + ret + +.Func_10b9e + push bc + push de + ld e, 4 + ld d, $00 +.loop + call .Func_10bba + or d + rlca + rlca + ld d, a + rlc b + rlc b + rlc c + rlc c + dec e + jr nz, .loop + ld a, d + pop de + pop bc + ret + +; calculates ((b & %11) << 2) | (c & %11) +; that is, %0000xxyy, where x and y are +; the 2 lower bits of b and c respectively +; and outputs the entry from a table given that value +.Func_10bba + push hl + push bc + ld a, %11 + and b + add a + add a + ld b, a + ld a, %11 + and c + or b + ld c, a + ld b, $00 + ld hl, .data_10bd1 + add hl, bc + ld a, [hl] + pop bc + pop hl + ret + +.data_10bd1 + db %00 ; b = %00 | c = %00 + db %01 ; b = %00 | c = %01 + db %01 ; b = %00 | c = %10 + db %01 ; b = %00 | c = %11 + db %00 ; b = %01 | c = %00 + db %01 ; b = %01 | c = %01 + db %10 ; b = %01 | c = %10 + db %10 ; b = %01 | c = %11 + db %01 ; b = %10 | c = %00 + db %01 ; b = %10 | c = %01 + db %10 ; b = %10 | c = %10 + db %11 ; b = %10 | c = %11 + db %10 ; b = %11 | c = %00 + db %10 ; b = %11 | c = %01 + db %10 ; b = %11 | c = %10 + db %11 ; b = %11 | c = %11 +; 0x10be1 + +FadeOBPalIntoTemp: ; 10be1 (4:4be1) + push bc + ld c, 4 palettes + ld hl, wObjectPalettesCGB + ld de, wTempObjectPalettesCGB + jr FadePalIntoAnother +; 0x10bec + +FadeBGPalIntoTemp1: ; 10bec (4:4bec) + push bc + ld c, 2 palettes + ld hl, wBackgroundPalettesCGB + ld de, wTempBackgroundPalettesCGB + jr FadePalIntoAnother + +FadeBGPalIntoTemp2: ; 10bf7 (4:4bf7) + push bc + ld c, 2 palettes + ld hl, wBackgroundPalettesCGB + 4 palettes + ld de, wTempBackgroundPalettesCGB + 4 palettes + jr FadePalIntoAnother + +FadeBGPalIntoTemp3: ; 10c02 (4:4c02) + push bc + ld c, 4 palettes + ld hl, wBackgroundPalettesCGB + ld de, wTempBackgroundPalettesCGB +; fallthrough + +; hl = input pal to modify +; de = pal to fade into +; c = number of colors to fade +FadePalIntoAnother: ; 10c0b (4:4c0b) + push bc + ld a, [de] + inc de + ld c, a + ld a, [de] + inc de + ld b, a + push de + push bc + ld c, [hl] + inc hl + ld b, [hl] + pop de + call .GetFadedColor + ; overwrite with new color + ld [hld], a + ld [hl], c + inc hl + inc hl + pop de + pop bc + dec c + jr nz, FadePalIntoAnother + pop bc + ret + +; fade pal bc to de +; output resulting pal in a and c +.GetFadedColor + push hl + ld a, c + cp e + jr nz, .unequal + ld a, b + cp d + jr z, .skip + +.unequal + ; red + ld a, e + and %11111 + ld l, a + ld a, c + and %11111 + call .FadeColor + ldh [hffb6], a + + ; green + ld a, e + and %11100000 + ld l, a + ld a, d + and %11 + or l + swap a + rrca + ld l, a + ld a, c + and %11100000 + ld h, a + ld a, b + and %11 + or h + swap a + rrca + call .FadeColor + rlca + swap a + ld h, a + and %11 + ldh [hffb7], a + ld a, %11100000 + and h + ld h, a + ldh a, [hffb6] + or h + ld h, a + + ; blue + ld a, d + and %1111100 + rrca + rrca + ld l, a + ld a, b + and %1111100 + rrca + rrca + call .FadeColor + rlca + rlca + ld b, a + ldh a, [hffb7] + or b + ld c, h +.skip + pop hl + ret + +; compares color in a and in l +; if a is smaller/greater than l, then +; increase/decrease its value up to l +; up to a maximum of 4 +; a = pal color (red, green or blue) +; l = pal color (red, green or blue) +.FadeColor + cp l + ret z ; same value + jr c, .incr_a +; decr a + dec a + cp l + ret z + dec a + cp l + ret z + dec a + cp l + ret z + dec a + ret + +.incr_a + inc a + cp l + ret z + inc a + cp l + ret z + inc a + cp l + ret z + inc a + ret +; 0x10c96 Func_10c96: ; 10c96 (4:4c96) ldh a, [hBankSRAM] @@ -361,13 +758,13 @@ Func_10c96: ; 10c96 (4:4c96) push bc ld a, $1 call BankswitchSRAM - call Func_10cbb + call CopyPalsToSRAMBuffer call Func_10ab4 pop bc ld a, c or a jr nz, .asm_10cb0 - call Func_10cea + call LoadPalsFromSRAMBuffer call Func_10af9 .asm_10cb0 @@ -377,11 +774,137 @@ Func_10c96: ; 10c96 (4:4c96) call DisableSRAM ret -Func_10cbb: ; 10cbb (4:4cbb) - INCROM $10cbb, $10cea +; copies current BG and OP pals, +; wBackgroundPalettesCGB and wObjectPalettesCGB +; to sGfxBuffer2 +CopyPalsToSRAMBuffer: ; 10cbb (4:4cbb) + ldh a, [hBankSRAM] + + push af + cp BANK("SRAM1") + jr z, .ok + debug_nop +.ok + ld a, BANK("SRAM1") + call BankswitchSRAM + ld hl, sGfxBuffer2 + ld a, [wBGP] + ld [hli], a + ld a, [wOBP0] + ld [hli], a + ld a, [wOBP1] + ld [hli], a + ld e, l + ld d, h + ld hl, wBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + NUM_OBJECT_PALETTES palettes + call CopyDataHLtoDE_SaveRegisters + pop af + + call BankswitchSRAM + call DisableSRAM + ret +; 0x10cea + +; loads BG and OP pals, +; wBackgroundPalettesCGB and wObjectPalettesCGB +; from sGfxBuffer2 +LoadPalsFromSRAMBuffer: ; 10cea (4:4cea) + ldh a, [hBankSRAM] + + push af + cp BANK("SRAM1") + jr z, .ok + debug_nop +.ok + ld a, BANK("SRAM1") + call BankswitchSRAM + ld hl, sGfxBuffer2 + ld a, [hli] + ld [wBGP], a + ld a, [hli] + ld [wOBP0], a + ld a, [hli] + ld [wOBP1], a + ld de, wBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + NUM_OBJECT_PALETTES palettes + call CopyDataHLtoDE_SaveRegisters + pop af + + call BankswitchSRAM + call DisableSRAM + ret +; 0x10d17 + +; backs up all palettes +; and writes 4 BG pals with white pal +Func_10d17: ; 10d17 (4:4d17) + ld a, [wBGP] + ld [wd294], a + ld a, [wOBP0] + ld [wd295], a + ld a, [wOBP1] + ld [wd296], a + ld hl, wBackgroundPalettesCGB + ld de, wTempBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + NUM_OBJECT_PALETTES palettes + call CopyDataHLtoDE_SaveRegisters + + ld a, [wd293] + ld [wBGP], a + ld de, PALRGB_WHITE + ld hl, wBackgroundPalettesCGB + ld bc, 4 palettes + call FillMemoryWithDE + call FlushAllPalettes -Func_10cea: ; 10cea (4:4cea) - INCROM $10cea, $10d98 + ld a, $10 + ld [wd317], a + ret +; 0x10d50 + +Func_10d50: ; 10d50 (4:4d50) + ld a, [wd293] + ld [wd294], a + ld a, [wOBP0] + ld [wd295], a + ld a, [wOBP1] + ld [wd296], a + ld de, PALRGB_WHITE + ld hl, wTempBackgroundPalettesCGB + ld bc, 4 palettes + call FillMemoryWithDE + ld a, $10 + ld [wd317], a + ret +; 0x10d74 + +; does stuff according to bottom 2 bits from wd317: +; - if equal to %01, modify wBGP +; - if bottom bit not set, fade BG pals 0 and 1 +; - if bottom bit is set, fade BG pals 4 and 5 +; and Flush Palettes +; then decrements wd317 +; does nothing if wd317 is 0 +Func_10d74: ; 10d74 (4:4d74) + ld a, [wd317] + or a + ret z + and %11 + ld c, a + cp $1 + call z, Func_10b85 + bit 0, c + call z, FadeBGPalIntoTemp1 + bit 0, c + call nz, FadeBGPalIntoTemp2 + bit 0, c + call nz, FlushAllPalettes + ld a, [wd317] + dec a + ld [wd317], a + ret +; 0x10d98 Unknown_10d98: ; 10d98 (4:4d98) INCROM $10d98, $10da9 @@ -394,7 +917,7 @@ Func_10dba: ; 10dba (4:4dba) farcall Func_c29b ld a, [wd0ba] ld hl, Unknown_10e17 - farcall Func_111e9 + farcall InitAndPrintPauseMenu .asm_10dca call DoFrameIfLCDEnabled call HandleMenuInput @@ -1079,17 +1602,153 @@ OverworldMap_ContinuePlayerWalkingAnimation: ; 11184 (4:5184) dec [hl] ret +; prints $ff-terminated list of text to text box +; given 2 bytes for text alignment and 2 bytes for text ID Func_111b3: ; 111b3 (4:51b3) - INCROM $111b3, $111e9 + ldh a, [hffb0] + push af + ld a, $02 + ldh [hffb0], a -Func_111e9: ; 111e9 (4:51e9) - INCROM $111e9, $11238 + push hl +.loop_text_print_1 + ld d, [hl] + inc hl + bit 7, d + jr nz, .next + inc hl + ld a, [hli] + push hl + ld h, [hl] + ld l, a + call PrintTextNoDelay + pop hl + inc hl + jr .loop_text_print_1 -Func_11238: ; 11238 (4:5238) - INCROM $11238, $1124d +.next + pop hl + pop af + ldh [hffb0], a +.loop_text_print_2 + ld d, [hl] + inc hl + bit 7, d + ret nz + ld e, [hl] + inc hl + call AdjustCoordinatesForBGScroll + call InitTextPrinting + ld a, [hli] + push hl + ld h, [hl] + ld l, a + call PrintTextNoDelay + pop hl + inc hl + jr .loop_text_print_2 +; 0x111e9 -Func_1124d: ; 1124d (4:524d) - INCROM $1124d, $1127f +InitAndPrintPauseMenu: ; 111e9 (4:51e9) + push hl + push bc + push de + push af + ld d, [hl] + inc hl + ld e, [hl] + inc hl + ld b, [hl] + inc hl + ld c, [hl] + inc hl + push hl + call AdjustCoordinatesForBGScroll + farcall Func_c3ca + call DrawRegularTextBox + call DoFrameIfLCDEnabled + pop hl + call Func_111b3 + pop af + call InitializeMenuParameters + pop de + pop bc + pop hl + ret +; 0x1120f + +; xors sb800 +; this has the effect of invalidating the save data checksum +; which the game interprets as being having no save data +InvalidateSaveData: ; 1120f (4:520f) + push hl + ldh a, [hBankSRAM] + + push af + ld a, $02 + call BankswitchSRAM + ld a, $08 + xor $ff + ld [sb800 + 0], a + ld a, $00 + xor $ff + ld [sb800 + 1], a + pop af + + call BankswitchSRAM + call DisableSRAM + call EnableSRAM + bank1call DiscardSavedDuelData + call DisableSRAM + pop hl + ret +; 0x11238 + +; saves all data to SRAM, including +; General save data and Album/Deck data +; and backs up in SRAM2 +SaveAndBackupData: ; 11238 (4:5238) + push de + ld de, sGeneralSaveData + call SaveGeneralSaveDataFromDE + ld de, sAlbumProgress + call UpdateAlbumProgress + call WriteBackupGeneralSaveData + call WriteBackupCardAndDeckSaveData + pop de + ret +; 0x1124d + +_SaveGeneralSaveData: ; 1124d (4:524d) + push de + call GetReceivedLegendaryCards + ld de, sGeneralSaveData + call SaveGeneralSaveDataFromDE + ld de, sAlbumProgress + call UpdateAlbumProgress + pop de + ret +; 0x1125f + +; de = pointer to general game data in SRAM +SaveGeneralSaveDataFromDE: ; 1125f (4:525f) + push hl + push bc + call EnableSRAM + push de + farcall TryGiveMedalPCPacks + ld [wMedalCount], a + farcall OverworldMap_GetOWMapID + ld [wCurOverworldMap], a + pop de + push de + call CopyGeneralSaveDataToSRAM + pop de + call DisableSRAM + pop bc + pop hl + ret +; 0x1127f ; writes in de total num of cards collected ; and in (de + 1) total num of cards to collect @@ -1113,45 +1772,324 @@ UpdateAlbumProgress: ; 1127f (4:527f) ret ; 0x11299 - INCROM $11299, $11320 +; save values that are listed in WRAMToSRAMMapper +; from WRAM to SRAM, and calculate its checksum +CopyGeneralSaveDataToSRAM: ; 11299 (4:5299) + push hl + push bc + push de + push de + ld hl, sGeneralSaveDataHeaderEnd - sGeneralSaveData + add hl, de + ld e, l + ld d, h + xor a + ld [wGeneralSaveDataByteCount + 0], a + ld [wGeneralSaveDataByteCount + 1], a + ld [wGeneralSaveDataCheckSum + 0], a + ld [wGeneralSaveDataCheckSum + 1], a + + ld hl, WRAMToSRAMMapper +.loop_map + ld a, [hli] + ld [wTempPointer + 0], a + ld c, a + ld a, [hli] + ld [wTempPointer + 1], a + or c + jr z, .done_copy + ld a, [hli] + ld c, a ; number of bytes LO + ld a, [hli] + ld b, a ; number of bytes HI + ld a, [wGeneralSaveDataByteCount + 0] + add c + ld [wGeneralSaveDataByteCount + 0], a + ld a, [wGeneralSaveDataByteCount + 1] + adc b + ld [wGeneralSaveDataByteCount + 1], a + call .CopyBytesToSRAM + inc hl + inc hl + jr .loop_map -Func_11320: ; 11320 (4:5320) - INCROM $11320, $11343 +.done_copy + pop hl + ld a, $08 + ld [hli], a + ld a, $00 + ld [hli], a + ld a, [wGeneralSaveDataByteCount + 0] + ld [hli], a + ld a, [wGeneralSaveDataByteCount + 1] + ld [hli], a + ld a, [wGeneralSaveDataCheckSum + 0] + ld [hli], a + ld a, [wGeneralSaveDataCheckSum + 1] + ld [hli], a + pop de + pop bc + pop hl + ret -Func_11343: ; 11343 (4:5343) - INCROM $11343, $11416 +.CopyBytesToSRAM + push hl + ld a, [wTempPointer + 0] + ld l, a + ld a, [wTempPointer + 1] + ld h, a +.loop_bytes + push bc + ld a, [hli] + ld [de], a + inc de + ld c, a + ld a, [wGeneralSaveDataCheckSum + 0] + add c + ld [wGeneralSaveDataCheckSum + 0], a + ld a, [wGeneralSaveDataCheckSum + 1] + adc 0 + ld [wGeneralSaveDataCheckSum + 1], a + pop bc + dec bc + ld a, c + or b + jr nz, .loop_bytes + ld a, l + ld [wTempPointer + 0], a + ld a, h + ld [wTempPointer + 1], a + pop hl + ret +; 0x11320 -Func_11416: ; 11416 (4:5416) - INCROM $11416, $11430 +; returns carry if no error +; is found in sBackupGeneralSaveData +ValidateBackupGeneralSaveData: ; 11320 (4:5320) + push de + ldh a, [hBankSRAM] + push af + ld a, BANK(sBackupGeneralSaveData) + call BankswitchSRAM + ld de, sBackupGeneralSaveData + call ValidateGeneralSaveDataFromDE + ld de, sAlbumProgress + call LoadAlbumProgressFromSRAM + pop af + call BankswitchSRAM + call DisableSRAM + pop de + ld a, [wNumSRAMValidationErrors] + cp 1 + ret +; 0x11343 -Func_11430: ; 11430 (4:5430) +; returns carry if no error +; is found in sGeneralSaveData +_ValidateGeneralSaveData: ; 11343 (4:5343) push de - ld de, sb800 - call .Func_11439 + call EnableSRAM + ld de, sGeneralSaveData + call ValidateGeneralSaveDataFromDE + ld de, sAlbumProgress + call LoadAlbumProgressFromSRAM + call DisableSRAM pop de + ld a, [wNumSRAMValidationErrors] + cp 1 ret +; 0x1135d -.Func_11439 +; validates the general game data saved in SRAM +; de = pointer to general game data in SRAM +ValidateGeneralSaveDataFromDE: ; 1135d (4:535d) push hl push bc + push de + xor a + ld [wNumSRAMValidationErrors], a + push de + + push de + inc de + inc de + ld a, [de] + inc de + ld [wGeneralSaveDataByteCount + 0], a + ld a, [de] + inc de + ld [wGeneralSaveDataByteCount + 1], a + ld a, [de] + inc de + ld [wGeneralSaveDataCheckSum + 0], a + ld a, [de] + inc de + ld [wGeneralSaveDataCheckSum + 1], a + pop de + + ld hl, sGeneralSaveDataHeaderEnd - sGeneralSaveData + add hl, de + ld e, l + ld d, h + ld hl, WRAMToSRAMMapper +.loop + ld a, [hli] + ld c, a + ld a, [hli] + or c + jr z, .exit_loop + ld a, [hli] + ld c, a ; number of bytes LO + ld a, [hli] + ld b, a ; number of bytes HI + ld a, [wGeneralSaveDataByteCount + 0] + sub c + ld [wGeneralSaveDataByteCount + 0], a + ld a, [wGeneralSaveDataByteCount + 1] + sbc b + ld [wGeneralSaveDataByteCount + 1], a + +; loop all the bytes of this struct +.loop_bytes + push hl + push bc + ld a, [de] + push af + ld c, a + ld a, [wGeneralSaveDataCheckSum + 0] + sub c + ld [wGeneralSaveDataCheckSum + 0], a + ld a, [wGeneralSaveDataCheckSum + 1] + sbc 0 + ld [wGeneralSaveDataCheckSum + 1], a + pop af + + ; check if it's within the specified values + cp [hl] ; min value + jr c, .error + inc hl + cp [hl] ; max value + jr z, .next_byte + jr c, .next_byte +.error + ld a, [wNumSRAMValidationErrors] + inc a + ld [wNumSRAMValidationErrors], a +.next_byte + inc de + pop bc + pop hl + dec bc + ld a, c + or b + jr nz, .loop_bytes + ; next mapped struct + inc hl + inc hl + jr .loop + +.exit_loop + pop hl + ld a, [hli] + sub $8 + ld c, a + ld a, [hl] + sub 0 + or c + ld hl, wGeneralSaveDataByteCount + or [hl] + inc hl + or [hl] + ld hl, wGeneralSaveDataCheckSum + or [hl] + inc hl + or [hl] + jr z, .no_header_error + ld hl, wNumSRAMValidationErrors + inc [hl] +.no_header_error + pop de + ; copy play time minutes and hours + ld hl, (sPlayTimeCounter + 2) - sGeneralSaveData + add hl, de + ld a, [hli] + ld [wPlayTimeHourMinutes + 0], a + ld a, [hli] + ld [wPlayTimeHourMinutes + 1], a + ld a, [hli] + ld [wPlayTimeHourMinutes + 2], a + + ; copy medal count and current overworld map + ld hl, sGeneralSaveDataHeaderEnd - sGeneralSaveData + add hl, de + ld a, [hli] + ld [wMedalCount], a + ld a, [hl] + ld [wCurOverworldMap], a + pop bc + pop hl + ret +; 0x1140a + +LoadAlbumProgressFromSRAM: ; 1140a (4:540a) + push de + ld a, [de] + ld [wTotalNumCardsCollected], a + inc de + ld a, [de] + ld [wTotalNumCardsToCollect], a + pop de + ret +; 0x11416 + +; first copies data from backup SRAM to main SRAM +; then loads it to WRAM from main SRAM +LoadBackupSaveData: ; 11416 (4:5416) + push hl + push de call EnableSRAM - call .Func_11447 + bank1call DiscardSavedDuelData + call DisableSRAM + call LoadBackupGeneralSaveData + call LoadBackupCardAndDeckSaveData + ld de, sGeneralSaveData + call LoadGeneralSaveDataFromDE + pop de + pop hl + ret +; 0x11430 + +_LoadGeneralSaveData: ; 11430 (4:5430) + push de + ld de, sGeneralSaveData + call LoadGeneralSaveDataFromDE + pop de + ret +; 0x11439 + +; de = pointer to save data +LoadGeneralSaveDataFromDE: ; 11439 (4:5439) + push hl + push bc + call EnableSRAM + call .LoadData call DisableSRAM pop bc pop hl ret -.Func_11447 +.LoadData push hl push bc push de ld a, e - add $08 - ld [wTempPointer], a + add sGeneralSaveDataHeaderEnd - sGeneralSaveData + ld [wTempPointer + 0], a ld a, d adc 0 ld [wTempPointer + 1], a - ld hl, .wram_map + + ld hl, WRAMToSRAMMapper .asm_11459 ld a, [hli] ld e, a @@ -1166,7 +2104,7 @@ Func_11430: ; 11430 (4:5430) ; copy bc bytes from wTempPointer to de push hl - ld a, [wTempPointer] + ld a, [wTempPointer + 0] ld l, a ld a, [wTempPointer + 1] ld h, a @@ -1180,7 +2118,7 @@ Func_11430: ; 11430 (4:5430) jr nz, .loop_copy ld a, l - ld [wTempPointer], a + ld [wTempPointer + 0], a ld a, h ld [wTempPointer + 1], a pop hl @@ -1199,48 +2137,61 @@ Func_11430: ; 11430 (4:5430) pop bc pop hl ret - -.wram_map +; 0x11498 + +wram_sram_map: MACRO + dw \1 ; WRAM address + dw \2 ; number of bytes + db \3 ; min allowed value + db \4 ; max allowed value +ENDM + +; maps WRAM addresses to SRAM addresses in order +; to save and subsequently retreive them on game load +; also works as a test in order check whether +; the saved values is SRAM are legal, within the given value range +WRAMToSRAMMapper: ; 11498 (4:5498) ; pointer, number of bytes, unknown - dw wd3cc, 1, $ff00 ; sb808 - dw wd3cb, 1, $ff00 ; sb809 - dw wPlayTimeCounter + 0, 1, $ff00 ; sPlayTimeCounter - dw wPlayTimeCounter + 1, 1, $ff00 - dw wPlayTimeCounter + 2, 1, $ff00 - dw wPlayTimeCounter + 3, 2, $ff00 - dw wOverworldMapSelection, 1, $ff00 ; sOverworldMapSelection - dw wTempMap, 1, $ff00 ; sTempMap - dw wTempPlayerXCoord, 1, $ff00 ; sTempPlayerXCoord - dw wTempPlayerYCoord, 1, $ff00 ; sTempPlayerYCoord - dw wTempPlayerDirection, 1, $ff00 ; sTempPlayerDirection - dw wd0c2, 1, $ff00 ; sb814 - dw wDuelResult, 1, $ff00 ; sDuelResult - dw wNPCDuelist, 1, $ff00 ; sNPCDuelist - dw wChallengeHallNPC, 1, $ff00 ; sChallengeHallNPC - dw wd698, 4, $ff00 ; sb818 - dw wOWMapEvents, 11, $ff00 ; sOWMapEvents - dw Data_1156c, 1, $ff00 ; sb827 - dw wd0b8, 1, $ff00 ; sb828 - dw wd0b9, 1, $ff00 ; sb829 - dw wd11b, 1, $ff00 ; sb82a - dw wd0ba, 1, $ff00 ; sb82b - dw wPCPackSelection, 1, $0e00 ; sPCPackSelection - dw wPCPacks, 15, $ff00 ; sPCPacks - dw wDefaultSong, 1, $ff00 ; sDefaultSong - dw wcad5, 1, $ff00 ; sb83d - dw wd3b8, 1, $ff00 ; sb83e - dw wd3bb, 10, $ff00 ; sb83f - dw wd0c5, 1, $ff00 ; sb849 - dw wMultichoiceTextboxResult_ChooseDeckToDuelAgainst, 1, $ff00 ; sMultichoiceTextboxResult_ChooseDeckToDuelAgainst - dw wd10e, 1, $ff00 ; sb84b - dw Data_1156c, 15, $ff00 ; sb84c - dw Data_1156c, 16, $ff00 ; sb85b - dw Data_1156c, 16, $ff00 ; sb86b - dw wEventVars, 64, $ff00 ; sEventVars + wram_sram_map wMedalCount, 1, $00, $ff ; sMedalCount + wram_sram_map wCurOverworldMap, 1, $00, $ff ; sCurOverworldMap + wram_sram_map wPlayTimeCounter + 0, 1, $00, $ff ; sPlayTimeCounter + wram_sram_map wPlayTimeCounter + 1, 1, $00, $ff + wram_sram_map wPlayTimeCounter + 2, 1, $00, $ff + wram_sram_map wPlayTimeCounter + 3, 2, $00, $ff + wram_sram_map wOverworldMapSelection, 1, $00, $ff ; sOverworldMapSelection + wram_sram_map wTempMap, 1, $00, $ff ; sTempMap + wram_sram_map wTempPlayerXCoord, 1, $00, $ff ; sTempPlayerXCoord + wram_sram_map wTempPlayerYCoord, 1, $00, $ff ; sTempPlayerYCoord + wram_sram_map wTempPlayerDirection, 1, $00, $ff ; sTempPlayerDirection + wram_sram_map wd0c2, 1, $00, $ff ; sb814 + wram_sram_map wDuelResult, 1, $00, $ff ; sDuelResult + wram_sram_map wNPCDuelist, 1, $00, $ff ; sNPCDuelist + wram_sram_map wChallengeHallNPC, 1, $00, $ff ; sChallengeHallNPC + wram_sram_map wd698, 4, $00, $ff ; sb818 + wram_sram_map wOWMapEvents, NUM_MAP_EVENTS, $00, $ff ; sOWMapEvents + wram_sram_map .EmptySRAMSlot, 1, $00, $ff ; sb827 + wram_sram_map wd0b8, 1, $00, $ff ; sb828 + wram_sram_map wd0b9, 1, $00, $ff ; sb829 + wram_sram_map wd11b, 1, $00, $ff ; sb82a + wram_sram_map wd0ba, 1, $00, $ff ; sb82b + wram_sram_map wPCPackSelection, 1, 0, 14 ; sPCPackSelection + wram_sram_map wPCPacks, NUM_PC_PACKS, $00, $ff ; sPCPacks + wram_sram_map wDefaultSong, 1, $00, $ff ; sDefaultSong + wram_sram_map wcad5, 1, $00, $ff ; sb83d + wram_sram_map wRonaldIsInMap, 1, $00, $ff ; sRonaldIsInMap + wram_sram_map wMastersBeatenList, 10, $00, $ff ; sMastersBeatenList + wram_sram_map wd0c5, 1, $00, $ff ; sb849 + wram_sram_map wMultichoiceTextboxResult_ChooseDeckToDuelAgainst, 1, $00, $ff ; sMultichoiceTextboxResult_ChooseDeckToDuelAgainst + wram_sram_map wd10e, 1, $00, $ff ; sb84b + wram_sram_map .EmptySRAMSlot, 15, $00, $ff ; sb84c + wram_sram_map .EmptySRAMSlot, 16, $00, $ff ; sb85b + wram_sram_map .EmptySRAMSlot, 16, $00, $ff ; sb86b + wram_sram_map wEventVars, 64, $00, $ff ; sEventVars dw NULL ; 0x1156c -Data_1156c: ; 1156c (4:556c) +; fills an empty SRAM slot with zero +.EmptySRAMSlot: ; 1156c (4:556c) db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 0x1157c @@ -1267,7 +2218,7 @@ _SaveGame: ; 1157c (4:557c) ld [wOverworldMapSelection], a .save - call Func_11238 + call SaveAndBackupData ret _AddCardToCollectionAndUpdateAlbumProgress: ; 115a3 (4:55a3) @@ -1299,7 +2250,74 @@ _AddCardToCollectionAndUpdateAlbumProgress: ; 115a3 (4:55a3) ret ; 0x115d4 - INCROM $115d4, $1162a +WriteBackupCardAndDeckSaveData: ; 115d4 (4:55d4) + ld bc, sCardAndDeckSaveDataEnd - sCardAndDeckSaveData + ld hl, sCardCollection + jr WriteDataToBackup + +WriteBackupGeneralSaveData: ; 115dc (4:55dc) + ld bc, sGeneralSaveDataEnd - sGeneralSaveData + ld hl, sGeneralSaveData +; fallthrough + +; bc = number of bytes to copy to backup +; hl = pointer in SRAM of data to backup +WriteDataToBackup: ; 115e2 (4:55e2) + ldh a, [hBankSRAM] + push af +.loop + xor a ; SRAM0 + call BankswitchSRAM + ld a, [hl] + push af + ld a, BANK("SRAM2") + call BankswitchSRAM + pop af + ld [hli], a + dec bc + ld a, b + or c + jr nz, .loop + pop af + call BankswitchSRAM + call DisableSRAM + ret +; 0x115ff + +LoadBackupCardAndDeckSaveData: ; 115ff (4:55ff) + ld bc, sCardAndDeckSaveDataEnd - sCardAndDeckSaveData + ld hl, sCardCollection + jr LoadDataFromBackup + +LoadBackupGeneralSaveData: ; 11607 (4:5607) + ld bc, sGeneralSaveDataEnd - sGeneralSaveData + ld hl, sGeneralSaveData +; fallthrough + +; bc = number of bytes to load from backup +; hl = pointer in SRAM of backup data +LoadDataFromBackup: ; 1160d (4:560d) + ldh a, [hBankSRAM] + push af + +.loop + ld a, BANK("SRAM2") + call BankswitchSRAM + ld a, [hl] + push af + xor a + call BankswitchSRAM + pop af + ld [hli], a + dec bc + ld a, b + or c + jr nz, .loop + pop af + call BankswitchSRAM + call DisableSRAM + ret +; 0x1162a INCLUDE "data/map_scripts.asm" @@ -1325,17 +2343,17 @@ LoadNPCSpriteData: ; 11857 (4:5857) ld a, [hli] ld [wNPCSpriteID], a ld a, [hli] - ld [wd3b1], a + ld [wNPCAnim], a ld a, [hli] push af ld a, [hli] - ld [wd3b2], a + ld [wNPCAnimFlags], a pop bc ld a, [wConsole] cp CONSOLE_CGB jr nz, .not_cgb ld a, b - ld [wd3b1], a + ld [wNPCAnim], a .not_cgb pop bc pop hl @@ -2812,13 +3830,13 @@ _GameLoop: ; 126d1 (4:66d1) inc [hl] farcall SetIntroSGBBorder ld a, $ff - ld [wd627], a + ld [wLastSelectedStartMenuItem], a .main_menu_loop ld a, PLAYER_TURN ldh [hWhoseTurn], a farcall Func_c1f8 - farcall Func_1d078 - ld a, [wd628] + farcall HandleTitleScreen + ld a, [wStartMenuChoice] ld hl, MainMenuFunctionTable call JumpToFunctionInTable jr c, .main_menu_loop ; return to main menu @@ -2850,7 +3868,7 @@ MainMenu_NewGame: ; 12704 (4:6704) ld a, MUSIC_OVERWORLD ld [wDefaultSong], a call PlayDefaultSong - farcall Func_1d306 + farcall DrawPlayerPortraitAndPrintNewGameText ld a, GAME_EVENT_OVERWORLD ld [wGameEvent], a farcall $03, ExecuteGameEvent @@ -2860,7 +3878,7 @@ MainMenu_NewGame: ; 12704 (4:6704) MainMenu_ContinueFromDiary: ; 12741 (4:6741) ld a, MUSIC_STOP call PlaySong - call Func_11320 + call ValidateBackupGeneralSaveData jr nc, MainMenu_NewGame farcall Func_c1ed farcall SetMainSGBBorder @@ -2888,8 +3906,8 @@ MainMenu_CardPop: ; 12768 (4:6768) MainMenu_ContinueDuel: ; 1277e (4:677e) ld a, MUSIC_STOP call PlaySong - farcall Func_c9cb - farcall $04, Func_3a40 + farcall ClearEvents + farcall $04, LoadGeneralSaveData farcall SetMainSGBBorder ld a, GAME_EVENT_CONTINUE_DUEL ld [wGameEvent], a @@ -2907,7 +3925,22 @@ Func_12871: ; 12871 (4:6871) INCROM $12871, $1288c Func_1288c: ; 1288c (4:688c) - INCROM $1288c, $128a9 + push hl + push bc + push de + ld a, %11100100 + ld [wBGP], a + ld [wOBP0], a + ld [wOBP1], a + ld a, 4 + ld [wTextBoxFrameType], a + bank1call SetDefaultPalettes + call FlushAllPalettes + pop de + pop bc + pop hl + ret +; 0x128a9 DisplayPlayerNamingScreen:: ; 128a9 (4:68a9) ; clear the name buffer. @@ -3061,24 +4094,26 @@ FillNewSpriteAnimBufferEntry: ; 129d9 (4:69d9) pop hl ret -Func_129fa: ; 129fa (4:69fa) +DisableCurSpriteAnim: ; 129fa (4:69fa) ld a, [wWhichSprite] ; fallthrough -Func_129fd: ; 129fd (4:69fd) +; sets SPRITE_ANIM_ENABLED to false +; of sprite in register a +DisableSpriteAnim: ; 129fd (4:69fd) push af ld a, [wd5d7] or a - jr z, .asm_12a06 + jr z, .disable pop af ret -.asm_12a06 +.disable pop af push hl push bc ld c, SPRITE_ANIM_ENABLED call GetSpriteAnimBufferProperty_SpriteInA - ld [hl], $00 + ld [hl], FALSE pop bc pop hl ret @@ -3096,7 +4131,7 @@ GetSpriteAnimCounter: ; 12a13 (4:6a13) ret ; 0x12a21 -HandleAllSpriteAnimations: ; 12a21 (4:6a21) +_HandleAllSpriteAnimations: ; 12a21 (4:6a21) push af ld a, [wd5d7] ; skip animating this frame if enabled or a @@ -3220,6 +4255,8 @@ StartSpriteAnimation: ; 12ac0 (4:6ac0) ret ; 0x12ac9 +; a = sprite animation +; c = animation counter value Func_12ac9: ; 12ac9 (4:6ac9) push bc ld b, a @@ -3259,7 +4296,7 @@ LoadSpriteAnimPointers: ; 12ae2 (4:6ae2) pop hl ; hl is animation bank ld a, [wTempPointerBank] ld [hli], a - ld a, [wTempPointer] + ld a, [wTempPointer + 0] ld [hli], a ld c, a ld a, [wTempPointer + 1] @@ -3293,7 +4330,7 @@ HandleAnimationFrame: ; 12b13 (4:6b13) inc hl inc hl ld a, [hl] ; SPRITE_ANIM_FRAME_OFFSET_POINTER - ld [wTempPointer], a + ld [wTempPointer + 0], a add SPRITE_FRAME_OFFSET_SIZE ; advance FRAME_OFFSET_POINTER by 1 frame, 4 bytes ld [hli], a ld a, [hl] @@ -3357,7 +4394,7 @@ GetAnimFramePointerFromOffset: ; 12b6a (4:6b6a) ld a, [hli] ld [wTempPointerBank], a ld a, [hli] - ld [wTempPointer], a + ld [wTempPointer + 0], a ld a, [hli] ld [wTempPointer + 1], a pop hl |