ref: 4a323cf591f27c928acc295f0044ff1608ebada1
dir: /engine/debug/debug_room.asm/
; _DebugRoom.MenuItems indexes const_def const DEBUGROOMMENU_PAGE_1 ; 0 const DEBUGROOMMENU_PAGE_2 ; 1 const DEBUGROOMMENU_PAGE_3 ; 2 DEBUGROOMMENU_NUM_PAGES EQU const_value ; _DebugRoom.Strings and _DebugRoom.Jumptable indexes const_def const DEBUGROOMMENUITEM_SP_CLEAR ; 00 const DEBUGROOMMENUITEM_WIN_WORK_CLR ; 01 const DEBUGROOMMENUITEM_POKEMON_GET ; 02 const DEBUGROOMMENUITEM_POKEDEX_COMP ; 03 const DEBUGROOMMENUITEM_TIMER_RESET ; 04 const DEBUGROOMMENUITEM_DECORATE_ALL ; 05 const DEBUGROOMMENUITEM_ITEM_GET ; 06 const DEBUGROOMMENUITEM_RTC_EDIT ; 07 const DEBUGROOMMENUITEM_NEXT ; 08 const DEBUGROOMMENUITEM_GB_ID_SET ; 09 const DEBUGROOMMENUITEM_BTL_REC_CLR ; 0a const DEBUGROOMMENUITEM_POKEDEX_CLR ; 0b const DEBUGROOMMENUITEM_HALT_CHK_CLR ; 0c const DEBUGROOMMENUITEM_BATTLE_SKIP ; 0d const DEBUGROOMMENUITEM_HOF_CLEAR ; 0e const DEBUGROOMMENUITEM_ROM_CHECKSUM ; 0f const DEBUGROOMMENUITEM_TEL_DEBUG ; 10 const DEBUGROOMMENUITEM_SUM_RECALC ; 11 const DEBUGROOMMENUITEM_RAM_FLAG_CLR ; 12 const DEBUGROOMMENUITEM_CHANGE_SEX ; 13 const DEBUGROOMMENUITEM_BT_BUG_POKE ; 14 _DebugRoom: ldh a, [hJoyDown] and SELECT | START cp SELECT | START ret nz ldh a, [hDebugRoomMenuPage] push af xor a ldh [hDebugRoomMenuPage], a .loop ld hl, wTilemap ld bc, wTilemapEnd - wTilemap ld a, " " call ByteFill call DebugRoom_PrintStackBottomTop call DebugRoom_PrintWindowStackBottomTop call DebugRoom_PrintRTCHaltChk call DebugRoom_PrintBattleSkip call DebugRoom_PrintTelDebug call DebugRoom_PrintRAMFlag call DebugRoom_PrintGender ldh a, [hDebugRoomMenuPage] ld [wWhichIndexSet], a ld hl, .MenuHeader call LoadMenuHeader call SetUpMenu .wait call GetScrollingMenuJoypad ld a, [wMenuJoypad] and A_BUTTON | B_BUTTON jr z, .wait call CloseWindow cp B_BUTTON jr z, .done ld a, [wMenuSelection] ld hl, .Jumptable rst JumpTable jr .loop .done pop af ldh [hDebugRoomMenuPage], a ret .MenuHeader: db MENU_BACKUP_TILES ; flags menu_coords 0, 0, 15, SCREEN_HEIGHT - 1 dw .MenuData db 1 ; default option .MenuData: db STATICMENU_CURSOR ; flags db 0 ; items dw .MenuItems dw PlaceMenuStrings dw .Strings .Strings: ; entries correspond to DEBUGROOMMENUITEM_* constants db "SP CLEAR@" db "WIN WORK CLR@" db "#MON GET!@" db "#DEX COMP@" db "TIMER RESET@" db "DECORATE ALL@" db "ITEM GET!@" db "RTC EDIT@" db "NEXT@" db "GB ID SET@" db "BTL REC CLR@" db "#DEX CLR@" db "HALT CHK CLR@" db "BATTLE SKIP@" db "HOF CLEAR@" db "ROM CHECKSUM@" db "TEL DEBUG@" db "SUM RECALC@" db "RAM FLAG CLR@" db "CHANGE SEX@" db "BT BUG POKE@" .Jumptable: ; entries correspond to DEBUGROOMMENUITEM_* constants dw DebugRoomMenu_SpClear dw DebugRoomMenu_WinWorkClr dw DebugRoomMenu_PokemonGet dw DebugRoomMenu_PokedexComp dw DebugRoomMenu_TimerReset dw DebugRoomMenu_DecorateAll dw DebugRoomMenu_ItemGet dw DebugRoomMenu_RTCEdit dw DebugRoomMenu_Next dw DebugRoomMenu_GBIDSet dw DebugRoomMenu_BtlRecClr dw DebugRoomMenu_PokedexClr dw DebugRoomMenu_HaltChkClr dw DebugRoomMenu_BattleSkip dw DebugRoomMenu_HOFClear dw DebugRoomMenu_ROMChecksum dw DebugRoomMenu_TelDebug dw DebugRoomMenu_SumRecalc dw DebugRoomMenu_RAMFlagClr dw DebugRoomMenu_ChangeSex dw DebugRoomMenu_BTBugPoke .MenuItems: ; entries correspond to DEBUGROOMMENU_* constants ; DEBUGROOMMENU_PAGE_1 db 8 db DEBUGROOMMENUITEM_SP_CLEAR db DEBUGROOMMENUITEM_BATTLE_SKIP db DEBUGROOMMENUITEM_RTC_EDIT db DEBUGROOMMENUITEM_TIMER_RESET db DEBUGROOMMENUITEM_HALT_CHK_CLR db DEBUGROOMMENUITEM_GB_ID_SET db DEBUGROOMMENUITEM_BTL_REC_CLR db DEBUGROOMMENUITEM_NEXT db -1 ; DEBUGROOMMENU_PAGE_2 db 8 db DEBUGROOMMENUITEM_POKEMON_GET db DEBUGROOMMENUITEM_ITEM_GET db DEBUGROOMMENUITEM_POKEDEX_COMP db DEBUGROOMMENUITEM_POKEDEX_CLR db DEBUGROOMMENUITEM_DECORATE_ALL db DEBUGROOMMENUITEM_HOF_CLEAR db DEBUGROOMMENUITEM_ROM_CHECKSUM db DEBUGROOMMENUITEM_NEXT db -1 ; DEBUGROOMMENU_PAGE_3 db 6 db DEBUGROOMMENUITEM_TEL_DEBUG db DEBUGROOMMENUITEM_SUM_RECALC db DEBUGROOMMENUITEM_RAM_FLAG_CLR db DEBUGROOMMENUITEM_CHANGE_SEX db DEBUGROOMMENUITEM_BT_BUG_POKE db DEBUGROOMMENUITEM_NEXT db -1 DebugRoomMenu_Next: ldh a, [hDebugRoomMenuPage] inc a cp DEBUGROOMMENU_NUM_PAGES jr c, .got_page xor a ; DEBUGROOMMENU_PAGE_1 .got_page ldh [hDebugRoomMenuPage], a ret DebugRoom_SaveChecksum: ld a, BANK(sGameData) call OpenSRAM ld bc, sGameDataEnd - sGameData ld de, 0 ld hl, sGameData .loop ld a, [hli] add e ld e, a ld a, d adc 0 ld d, a dec bc ld a, b or c jr nz, .loop ld a, e ld [sChecksum + 0], a ld a, d ld [sChecksum + 1], a call CloseSRAM ret DebugRoomMenu_SpClear: call YesNoBox ret c ld a, BANK(sStackTop) call OpenSRAM xor a ld hl, sStackTop ld [hli], a ld [hl], a call CloseSRAM call DebugRoom_PrintStackBottomTop ret DebugRoom_PrintStackBottomTop: ld a, BANK(sStackTop) call OpenSRAM hlcoord 16, 14 ld de, sStackTop + 1 ld c, 1 call PrintHexNumber ld de, sStackTop + 0 ld c, 1 call PrintHexNumber call CloseSRAM hlcoord 16, 12 ld de, .SPString call PlaceString ld d, LOW(wStackBottom) ld e, HIGH(wStackBottom) push de ld hl, sp+0 ld d, h ld e, l hlcoord 16, 13 ld c, 2 call PrintHexNumber pop de ret .SPString: db "SP:@" DebugRoomMenu_WinWorkClr: call YesNoBox ret c ld a, [wWindowStackPointer] ld l, a ld a, [wWindowStackPointer + 1] ld h, a inc hl ld a, l sub LOW(wWindowStack) ld a, h sbc HIGH(wWindowStack) ret c ld a, $00 call OpenSRAM ld bc, -wWindowStack + $10000 add hl, bc ld b, h ld c, l ld hl, wWindowStack xor a call ByteFill call CloseSRAM ret DebugRoom_PrintWindowStackBottomTop: ret ; stubbed out ld a, $00 call OpenSRAM ld hl, wWindowStack .loop ld a, h cp $c0 jr z, .ok ld a, [hl] or a jr nz, .ok inc hl jr .loop .ok call CloseSRAM ld a, h ld h, l ld l, a push hl ld hl, sp+0 ld d, h ld e, l hlcoord 16, 17 ld c, 2 call PrintHexNumber pop hl ld d, LOW(wWindowStack) ld e, HIGH(wWindowStack) push de ld hl, sp+0 ld d, h ld e, l hlcoord 16, 16 ld c, 2 call PrintHexNumber pop de hlcoord 16, 15 ld de, .WSPString call PlaceString ret .WSPString: db "WSP:@" DebugRoomMenu_PokedexComp: call YesNoBox ret c ld a, BANK(sGameData) ; aka BANK(sPlayerData) call OpenSRAM ld hl, sPlayerData + (wPokedexCaught - wPlayerData) ld b, wEndPokedexSeen - wPokedexCaught ld a, %11111111 .loop1 ld [hli], a dec b jr nz, .loop1 ld a, (1 << (NUM_POKEMON % 8)) - 1 ; %00000111 ld [sPlayerData + (wEndPokedexCaught - 1 - wPlayerData)], a ld [sPlayerData + (wEndPokedexSeen - 1 - wPlayerData)], a ld hl, sPlayerData + (wStatusFlags - wPlayerData) set STATUSFLAGS_UNOWN_DEX_F, [hl] ld a, UNOWN_A ld [sGameData + (wFirstUnownSeen - wGameData)], a ld hl, sGameData + (wUnownDex - wGameData) ld b, NUM_UNOWN .loop2 ld [hli], a inc a dec b jr nz, .loop2 call CloseSRAM call DebugRoom_SaveChecksum ret DebugRoomMenu_PokedexClr: call YesNoBox ret c ld a, BANK(sPlayerData) call OpenSRAM ld hl, sPlayerData + (wStatusFlags - wPlayerData) res STATUSFLAGS_UNOWN_DEX_F, [hl] ld hl, sPlayerData + (wPokedexCaught - wPlayerData) ld bc, wEndPokedexSeen - wPokedexCaught xor a call ByteFill ld hl, sGameData + (wUnownDex - wGameData) ld bc, NUM_UNOWN xor a call ByteFill call CloseSRAM call DebugRoom_SaveChecksum ret DebugRoomMenu_TimerReset: call YesNoBox ret c ld a, BANK(sRTCStatusFlags) call OpenSRAM ld hl, sRTCStatusFlags set 7, [hl] call CloseSRAM ret DebugRoomMenu_BattleSkip: ld a, BANK(sSkipBattle) call OpenSRAM ld a, [sSkipBattle] inc a and 1 ld [sSkipBattle], a call CloseSRAM ret DebugRoom_PrintBattleSkip: hlcoord 16, 6 ld de, .BTLString call PlaceString ld a, BANK(sSkipBattle) call OpenSRAM ld a, [sSkipBattle] call CloseSRAM hlcoord 16, 7 ld de, .DoString or a jr z, .ok ld de, .SkipString .ok call PlaceString ret .BTLString: db "BTL:@" .DoString: db " DO@" .SkipString: db "SKIP@" DebugRoomMenu_ChangeSex: ld a, BANK(sCrystalData) call OpenSRAM ld a, [sCrystalData + (wPlayerGender - wCrystalData)] inc a and 1 ld [sCrystalData + (wPlayerGender - wCrystalData)], a call CloseSRAM ret DebugRoom_PrintGender: hlcoord 16, 0 ld de, .SexString call PlaceString ld a, BANK(sCrystalData) call OpenSRAM ld a, [sCrystalData + (wPlayerGender - wCrystalData)] call CloseSRAM or a ld a, "♂" jr z, .ok ld a, "♀" .ok hlcoord 19, 1 ld [hl], a ret .SexString: db "SEX:@" DebugRoomMenu_TelDebug: ld a, BANK(sDebugTimeCyclesSinceLastCall) call OpenSRAM ld a, [sDebugTimeCyclesSinceLastCall] inc a cp 3 jr c, .ok xor a .ok ld [sDebugTimeCyclesSinceLastCall], a call CloseSRAM ret DebugRoom_PrintTelDebug: hlcoord 16, 16 ld de, .TelString call PlaceString ld a, BANK(sDebugTimeCyclesSinceLastCall) call OpenSRAM ld a, [sDebugTimeCyclesSinceLastCall] call CloseSRAM hlcoord 16, 17 ld de, .BusyString dec a jr z, .ok ld de, .HardString dec a jr z, .ok ld de, .OffString .ok call PlaceString ret .TelString: db "TEL:@" .OffString: db " OFF@" .BusyString: db "BUSY@" .HardString: db "HARD@" DebugRoomMenu_RAMFlagClr: call YesNoBox ret c ld a, BANK(sOpenedInvalidSRAM) call OpenSRAM xor a ld [sOpenedInvalidSRAM], a call CloseSRAM ret DebugRoom_PrintRAMFlag: ld a, BANK(sOpenedInvalidSRAM) call OpenSRAM ld de, sOpenedInvalidSRAM hlcoord 18, 4 ld c, 1 call PrintHexNumber call CloseSRAM hlcoord 16, 3 ld de, .RamString call PlaceString ret .RamString: db "RAM:@" DebugRoomMenu_SumRecalc: call YesNoBox ret c call DebugRoom_SaveChecksum ret DebugRoomMenu_DecorateAll: call YesNoBox ret c ld a, BANK(sPlayerData) call OpenSRAM ld hl, sPlayerData + (wEventFlags - wPlayerData) ld de, EVENT_DECO_BED_1 ; the first EVENT_DECO_* constant ld b, SET_FLAG ld c, EVENT_DECO_BIG_LAPRAS_DOLL - EVENT_DECO_BED_1 + 1 .loop push bc push de push hl call FlagAction pop hl pop de pop bc inc de dec c jr nz, .loop call CloseSRAM call DebugRoom_SaveChecksum ret paged_value: MACRO dw \1 ; value address db \2 ; min value db \3 ; max value db \4 ; initial value dw \5 ; label string dw \6 ; value name function db \7 ; is hex value? ENDM PAGED_VALUE_SIZE EQU 10 DebugRoom_EditPagedValues: xor a ld [wDebugRoomCurPage], a ld [wDebugRoomCurValue], a ld a, [hli] ld [wDebugRoomAFunction], a ld a, [hli] ld [wDebugRoomAFunction+1], a ld a, [hli] ld [wDebugRoomSelectFunction], a ld a, [hli] ld [wDebugRoomSelectFunction+1], a ld a, [hli] ld [wDebugRoomStartFunction], a ld a, [hli] ld [wDebugRoomStartFunction+1], a ld a, [hli] ld [wDebugRoomAutoFunction], a ld a, [hli] ld [wDebugRoomAutoFunction+1], a ld a, [hli] ld [wDebugRoomPageCount], a ld a, l ld [wDebugRoomPagedValuesPtr], a ld a, h ld [wDebugRoomPagedValuesPtr+1], a ld hl, hInMenu ld a, [hl] push af ld [hl], TRUE call ClearBGPalettes hlcoord 0, 0 ld b, SCREEN_HEIGHT - 2 ld c, SCREEN_WIDTH - 2 call Textbox hlcoord 8, 17 ld de, DebugRoom_PageString call PlaceString call DebugRoom_InitializePagedValues xor a call DebugRoom_PrintPage ld a, "▶" call DebugRoom_ShowHideCursor xor a ldh [hJoyLast], a xor a ld [wDebugRoomCurPage], a inc a ldh [hBGMapMode], a call WaitBGMap ld b, SCGB_DIPLOMA call GetSGBLayout call SetPalettes .resume call DelayFrame call JoyTextDelay ldh a, [hJoyLast] bit 1, a jr nz, .done ld hl, .continue push hl rra ; A_BUTTON_F? jr c, DebugRoom_PagedValuePressedA rra ; skip B_BUTTON_F rra ; SELECT_F? jr c, DebugRoom_PagedValuePressedSelect rra ; START_F? jr c, DebugRoom_PagedValuePressedStart rra ; D_RIGHT_F? jp c, DebugRoom_IncrementPagedValue rra ; D_LEFT_F? jp c, DebugRoom_DecrementPagedValue rra ; D_UP_F? jp c, DebugRoom_PrevPagedValue rra ; D_DOWN_F? jp c, DebugRoom_NextPagedValue pop hl .continue ; call wDebugRoomAutoFunction if it's not null, then jump to .resume ld hl, .resume push hl ld a, [wDebugRoomAutoFunction] ld l, a ld a, [wDebugRoomAutoFunction+1] ld h, a or l ret z jp hl .done pop af ldh [hInMenu], a scf ret DebugRoom_PagedValuePressedA: ld hl, wDebugRoomAFunction jr _CallNonNullPointer DebugRoom_PagedValuePressedSelect: ld hl, wDebugRoomSelectFunction jr _CallNonNullPointer DebugRoom_PagedValuePressedStart: ld hl, wDebugRoomStartFunction ; fallthrough _CallNonNullPointer: ld a, [hli] ld h, [hl] ld l, a or h ret z jp hl DebugRoom_PageString: db " P @" DebugRoom_IncrementPagedValue: call DebugRoom_GetCurPagedValuePtr ld e, [hl] ; de = value address inc hl ld d, [hl] inc hl inc hl ld a, [de] ; a = max value cp [hl] ret z inc a ld [de], a call DebugRoom_PrintPageBValueC ret DebugRoom_DecrementPagedValue: call DebugRoom_GetCurPagedValuePtr ld e, [hl] ; de = value address inc hl ld d, [hl] inc hl ld a, [de] ; a = min value cp [hl] ret z dec a ld [de], a call DebugRoom_PrintPageBValueC ret DebugRoom_NextPage: ld a, [wDebugRoomPageCount] ld c, a ld a, [wDebugRoomCurPage] inc a cp c jr c, .ok xor a .ok ld [wDebugRoomCurPage], a call DebugRoom_PrintPage ld a, [wDebugRoomCurPage] call DebugRoom_GetNthPagePtr ld a, [wDebugRoomCurValue] cp [hl] jr c, .skip ld a, [hl] dec a ld [wDebugRoomCurValue], a .skip ld a, "▶" call DebugRoom_ShowHideCursor ret DebugRoom_PrevPage: ld a, [wDebugRoomCurPage] or a jr nz, .ok ld a, [wDebugRoomPageCount] .ok dec a ld [wDebugRoomCurPage], a call DebugRoom_PrintPage ld a, [wDebugRoomCurPage] call DebugRoom_GetNthPagePtr ld a, [wDebugRoomCurValue] cp [hl] jr c, .skip ld a, [hl] dec a ld [wDebugRoomCurValue], a .skip ld a, "▶" call DebugRoom_ShowHideCursor ret DebugRoom_NextPagedValue: ld a, " " call DebugRoom_ShowHideCursor ld a, [wDebugRoomCurPage] call DebugRoom_GetNthPagePtr ld a, [wDebugRoomCurValue] inc a cp [hl] ; incremented value < paged_value count? jr c, DebugRoom_UpdateValueCursor xor a ld [wDebugRoomCurValue], a jr DebugRoom_NextPage DebugRoom_UpdateValueCursor: ld [wDebugRoomCurValue], a ld a, "▶" call DebugRoom_ShowHideCursor ret DebugRoom_PrevPagedValue: ld a, " " call DebugRoom_ShowHideCursor ld a, [wDebugRoomCurValue] or a ; pre-decremented value > 0? jr nz, .decrement ld a, -1 ld [wDebugRoomCurValue], a jr DebugRoom_PrevPage .decrement: dec a jr DebugRoom_UpdateValueCursor DebugRoom_GetNthPagePtr: ; Input: a = page index ; Output: hl = pointer to paged_data list ld h, 0 ld l, a add hl, hl ld a, [wDebugRoomPagedValuesPtr] ld e, a ld a, [wDebugRoomPagedValuesPtr+1] ld d, a add hl, de ld a, [hli] ld h, [hl] ld l, a ret _DebugRoom_GetPageBValueCPtr: push bc ld a, b call DebugRoom_GetNthPagePtr pop bc inc hl ld a, c ld bc, PAGED_VALUE_SIZE call AddNTimes ret DebugRoom_GetCurPagedValuePtr: ld a, [wDebugRoomCurPage] ld b, a ld a, [wDebugRoomCurValue] ld c, a jr _DebugRoom_GetPageBValueCPtr DebugRoom_ShowHideCursor: push af hlcoord 1, 1 ld bc, SCREEN_WIDTH * 2 ld a, [wDebugRoomCurValue] call AddNTimes pop af ld [hl], a ret DebugRoom_InitializePagedValues: ; Load the initial values for all pages of the current paged value header ld a, [wDebugRoomPageCount] .page_loop dec a push af call .InitializePage pop af jr nz, .page_loop ret .InitializePage: ; Load the initial values for page a ld b, a ld h, 0 ld l, a add hl, hl ld a, [wDebugRoomPagedValuesPtr] ld e, a ld a, [wDebugRoomPagedValuesPtr+1] ld d, a add hl, de ld a, [hli] ld h, [hl] ld l, a ld c, [hl] ; c = paged_value count .value_loop push bc dec c call .InitializeValue pop bc dec c jr nz, .value_loop ret .InitializeValue: ; Load the initial value for page b, value c ld h, 0 ld l, b add hl, hl ld a, [wDebugRoomPagedValuesPtr] ld e, a ld a, [wDebugRoomPagedValuesPtr+1] ld d, a add hl, de ld a, [hli] ld h, [hl] ld l, a inc hl ; skip the paged_value count ld a, c push bc ld bc, PAGED_VALUE_SIZE call AddNTimes pop bc ld e, [hl] ; de = value address inc hl ld d, [hl] inc hl inc hl inc hl ld a, [hl] ; a = initial value ld [de], a ret DebugRoom_PrintPage: push af hlcoord 10, 17 add "1" ld [hl], a hlcoord 1, 1 lb bc, SCREEN_HEIGHT - 2, SCREEN_WIDTH - 2 call ClearBox pop af ld b, a ld h, 0 ld l, a add hl, hl ld a, [wDebugRoomPagedValuesPtr] ld e, a ld a, [wDebugRoomPagedValuesPtr+1] ld d, a add hl, de ld a, [hli] ld h, [hl] ld l, a ld c, [hl] ; c = paged_value count .loop push bc dec c call DebugRoom_PrintPagedValue pop bc dec c jr nz, .loop ret DebugRoom_PrintPageBValueC: ld a, [wDebugRoomCurPage] ld b, a ld a, [wDebugRoomCurValue] ld c, a jr DebugRoom_PrintPagedValue DebugRoom_PrintPagedValue: ; Print the value for page b, value c ld h, 0 ld l, b add hl, hl ld a, [wDebugRoomPagedValuesPtr] ld e, a ld a, [wDebugRoomPagedValuesPtr+1] ld d, a add hl, de ld a, [hli] ld h, [hl] ld l, a inc hl ; skip the paged_value count ld a, c push bc ld bc, PAGED_VALUE_SIZE call AddNTimes pop bc ld e, [hl] ; de = value address inc hl ld d, [hl] inc hl push de inc hl inc hl inc hl ld e, [hl] ; de = label string inc hl ld d, [hl] inc hl push hl hlcoord 2, 1 ld a, c ld bc, SCREEN_WIDTH * 2 call AddNTimes push hl call PlaceString pop hl ld bc, SCREEN_WIDTH - 7 add hl, bc pop bc ; pushed hl pop de push de push bc inc bc inc bc ld a, [bc] ; a = is hex value? or a jr nz, .hex lb bc, PRINTNUM_LEADINGZEROS | 1, 3 call PrintNum jr .printed .hex ld c, 1 call PrintHexNumber ld [hl], "H" inc hl .printed ld bc, 6 add hl, bc ld b, h ld c, l pop hl pop de ld a, [hli] ; hl = value name function ld h, [hl] ld l, a or h ret z ld a, [de] jp hl DebugRoom_JoyWaitABSelect: .loop call GetJoypad ldh a, [hJoyPressed] and A_BUTTON | B_BUTTON | SELECT jr z, .loop ret DebugRoomMenu_ItemGet: ld hl, .PagedValuesHeader call DebugRoom_EditPagedValues ret .PagedValuesHeader: dw NULL ; A function dw NULL ; Select function dw DebugRoom_SaveItem ; Start function dw NULL ; Auto function db 1 ; # pages dw DebugRoomMenu_ItemGet_Page1Values DebugRoom_SaveItem: call YesNoBox ret c ld a, BANK(sPlayerData) call OpenSRAM ld hl, sPlayerData + (wPCItems - wPlayerData) ld a, [wDebugRoomItemID] ld c, a .loop1 ld a, [hl] cp c jr z, .found cp -1 jr z, .not_found inc hl inc hl jr .loop1 .found inc hl ld a, [wDebugRoomItemQuantity] add [hl] cp MAX_ITEM_STACK + 1 jr c, .max ld a, MAX_ITEM_STACK .max ld [hl], a ld hl, .ItemNumberAddedText jr .done .not_found ld a, [sPlayerData + (wNumPCItems - wPlayerData)] cp MAX_PC_ITEMS jr nc, .full inc a ld [sPlayerData + (wNumPCItems - wPlayerData)], a ld a, [wDebugRoomItemID] ld [hli], a ld a, [wDebugRoomItemQuantity] ld [hli], a ld [hl], -1 ; terminator ld hl, .CreatedNewItemText jr .done .full ld hl, .StockFullText .done call CloseSRAM call MenuTextbox call DebugRoom_JoyWaitABSelect call CloseWindow call DebugRoom_SaveChecksum ret .ItemNumberAddedText: text "Item number added!" done .CreatedNewItemText: text "Created new item!" done .StockFullText: text "Stock full!!" done DebugRoom_PrintItemName: ld [wNamedObjectIndexBuffer], a push bc call GetItemName pop hl push hl lb bc, 1, 12 call ClearBox pop hl ld de, wStringBuffer1 call PlaceString ret DebugRoomMenu_ItemGet_Page1Values: db 2 paged_value wDebugRoomItemID, 1, NUM_POKEMON, MASTER_BALL, .ItemNameString, DebugRoom_PrintItemName, FALSE paged_value wDebugRoomItemQuantity, 1, 99, 1, .NumberString, NULL, FALSE .ItemNameString: db "ITEM NAME@" .NumberString: db "NUMBER@" DebugRoomMenu_PokemonGet: ld hl, .PagedValuesHeader call DebugRoom_EditPagedValues ret .PagedValuesHeader: dw NULL ; A function dw NULL ; Select function dw DebugRoom_SavePokemon ; Start function dw NULL ; Auto function db 4 ; # pages dw DebugRoomMenu_PokemonGet_Page1Values dw DebugRoomMenu_PokemonGet_Page2Values dw DebugRoomMenu_PokemonGet_Page3Values dw DebugRoomMenu_PokemonGet_Page4Values DebugRoom_SavePokemon: call YesNoBox ret c call DebugRoom_UpdateExpForLevel ld a, [wDebugRoomMonBox] dec a ld b, a add a add b ld h, 0 ld l, a ld de, DebugRoom_BoxAddresses add hl, de ld a, [hli] call OpenSRAM ld a, [hli] ld h, [hl] ld l, a ld a, [hl] cp MONS_PER_BOX jr nc, .full ; update count and species list push hl inc [hl] inc hl ld d, 0 ld e, a add hl, de ld a, [wDebugRoomMonSpecies] ld [hli], a ld [hl], -1 pop hl ; skip count and species list ld bc, 2 + MONS_PER_BOX add hl, bc ; update Nth box mon push de push hl ld a, e ld bc, BOXMON_STRUCT_LENGTH call AddNTimes ld d, h ld e, l ld hl, wDebugRoomMon ld bc, BOXMON_STRUCT_LENGTH call CopyBytes pop hl pop de ; skip box mons ld bc, BOXMON_STRUCT_LENGTH * MONS_PER_BOX add hl, bc ; update Nth OT name push de push hl ld a, e ld bc, NAME_LENGTH call AddNTimes ld d, h ld e, l ld hl, .OTString ld bc, NAME_LENGTH call CopyBytes pop hl pop de ; skip OT names ld bc, NAME_LENGTH * MONS_PER_BOX add hl, bc ; update Nth nickname push de push hl ld a, e ld bc, MON_NAME_LENGTH call AddNTimes ld d, h ld e, l ld hl, .NicknameString ld bc, MON_NAME_LENGTH call CopyBytes pop hl pop de call CloseSRAM ld hl, .CompletedText call MenuTextbox call DebugRoom_JoyWaitABSelect call CloseWindow ret .full call CloseSRAM ld hl, .BoxIsFullText call MenuTextbox call DebugRoom_JoyWaitABSelect call CloseWindow ret .OTString: db "DEBUG▶OT@" .NicknameString: db "DEBUG▶<PK><MN>@" .CompletedText: text "COMPLETED!" done .BoxIsFullText: text "BOX IS FULL!" done DebugRoom_PrintPokemonName: ld [wNamedObjectIndexBuffer], a push bc call GetPokemonName jr _DebugRoom_FinishGetName DebugRoom_PrintItemName2: ld [wNamedObjectIndexBuffer], a push bc call GetItemName jr _DebugRoom_FinishGetName DebugRoom_PrintMoveName: ld [wNamedObjectIndexBuffer], a push bc call GetMoveName jr _DebugRoom_FinishGetName _DebugRoom_FinishGetName: pop hl push hl lb bc, 1, 12 call ClearBox pop hl ld de, wStringBuffer1 call PlaceString ret DebugRoom_UpdateExpForLevel: ld hl, BaseData + BASE_GROWTH_RATE ld bc, BASE_DATA_SIZE ld a, [wDebugRoomMonSpecies] dec a call AddNTimes ld a, BANK(BaseData) call GetFarByte ld [wBaseGrowthRate], a ld a, [wDebugRoomMonLevel] ld d, a farcall CalcExpAtLevel ld hl, wDebugRoomMonExp ldh a, [hProduct + 1] ld [hli], a ldh a, [hProduct + 2] ld [hli], a ldh a, [hProduct + 3] ld [hl], a ret DebugRoomMenu_PokemonGet_Page1Values: db 8 paged_value wDebugRoomMonSpecies, 1, NUM_POKEMON, BULBASAUR, DebugRoom_BoxStructStrings.Pokemon, DebugRoom_PrintPokemonName, FALSE paged_value wDebugRoomMonItem, 1, $ff, MASTER_BALL, DebugRoom_BoxStructStrings.Item, DebugRoom_PrintItemName2, FALSE paged_value wDebugRoomMonMoves+0, 1, NUM_ATTACKS, POUND, DebugRoom_BoxStructStrings.Move1, DebugRoom_PrintMoveName, FALSE paged_value wDebugRoomMonMoves+1, 1, NUM_ATTACKS, POUND, DebugRoom_BoxStructStrings.Move2, DebugRoom_PrintMoveName, FALSE paged_value wDebugRoomMonMoves+2, 1, NUM_ATTACKS, POUND, DebugRoom_BoxStructStrings.Move3, DebugRoom_PrintMoveName, FALSE paged_value wDebugRoomMonMoves+3, 1, NUM_ATTACKS, POUND, DebugRoom_BoxStructStrings.Move4, DebugRoom_PrintMoveName, FALSE paged_value wDebugRoomMonID+0, $00, $ff, HIGH(1234), DebugRoom_BoxStructStrings.ID0, NULL, FALSE paged_value wDebugRoomMonID+1, $00, $ff, LOW(1234), DebugRoom_BoxStructStrings.ID1, NULL, FALSE DebugRoomMenu_PokemonGet_Page2Values: db 8 paged_value wDebugRoomMonHPExp+0, $00, $ff, $00, DebugRoom_BoxStructStrings.HPExp0, NULL, FALSE paged_value wDebugRoomMonHPExp+1, $00, $ff, $00, DebugRoom_BoxStructStrings.HPExp1, NULL, FALSE paged_value wDebugRoomMonAtkExp+0, $00, $ff, $00, DebugRoom_BoxStructStrings.AttkExp0, NULL, FALSE paged_value wDebugRoomMonAtkExp+1, $00, $ff, $00, DebugRoom_BoxStructStrings.AttkExp1, NULL, FALSE paged_value wDebugRoomMonDefExp+0, $00, $ff, $00, DebugRoom_BoxStructStrings.DfnsExp0, NULL, FALSE paged_value wDebugRoomMonDefExp+1, $00, $ff, $00, DebugRoom_BoxStructStrings.DfnsExp1, NULL, FALSE paged_value wDebugRoomMonSpdExp+0, $00, $ff, $00, DebugRoom_BoxStructStrings.SpeedExp0, NULL, FALSE paged_value wDebugRoomMonSpdExp+1, $00, $ff, $00, DebugRoom_BoxStructStrings.SpeedExp1, NULL, FALSE DebugRoomMenu_PokemonGet_Page3Values: db 8 paged_value wDebugRoomMonSpcExp+0, $00, $ff, $00, DebugRoom_BoxStructStrings.SpclExp0, NULL, FALSE paged_value wDebugRoomMonSpcExp+1, $00, $ff, $00, DebugRoom_BoxStructStrings.SpclExp1, NULL, FALSE paged_value wDebugRoomMonDVs+0, $00, $ff, $00, DebugRoom_BoxStructStrings.PowerRnd0, NULL, TRUE paged_value wDebugRoomMonDVs+1, $00, $ff, $00, DebugRoom_BoxStructStrings.PowerRnd1, NULL, TRUE paged_value wDebugRoomMonPP+0, $00, $ff, $00, DebugRoom_BoxStructStrings.PP1, NULL, FALSE paged_value wDebugRoomMonPP+1, $00, $ff, $00, DebugRoom_BoxStructStrings.PP2, NULL, FALSE paged_value wDebugRoomMonPP+2, $00, $ff, $00, DebugRoom_BoxStructStrings.PP3, NULL, FALSE paged_value wDebugRoomMonPP+3, $00, $ff, $00, DebugRoom_BoxStructStrings.PP4, NULL, FALSE DebugRoomMenu_PokemonGet_Page4Values: db 6 paged_value wDebugRoomMonHappiness, $00, $ff, BASE_HAPPINESS, DebugRoom_BoxStructStrings.Friend, NULL, FALSE paged_value wDebugRoomMonPokerusStatus, $00, $ff, $00, DebugRoom_BoxStructStrings.Pokerus, NULL, TRUE paged_value wDebugRoomMonCaughtData+0, $00, $ff, $00, DebugRoom_BoxStructStrings.NoUse0, NULL, FALSE paged_value wDebugRoomMonCaughtData+1, $00, $ff, $00, DebugRoom_BoxStructStrings.NoUse1, NULL, FALSE paged_value wDebugRoomMonLevel, 1, MAX_LEVEL, $05, DebugRoom_BoxStructStrings.Level, NULL, FALSE paged_value wDebugRoomMonBox, 1, NUM_BOXES, $0e, DebugRoom_BoxStructStrings.SendBox, NULL, FALSE DebugRoom_BoxStructStrings: .Pokemon: db "#MON@" .Item: db "ITEM@" .Move1: db "MOVE 1@" .Move2: db "MOVE 2@" .Move3: db "MOVE 3@" .Move4: db "MOVE 4@" .ID0: db "ID[0]@" .ID1: db "ID[1]@" .BaseExp0: db "BASE EXP[0]@" ; unreferenced .BaseExp1: db "BASE EXP[1]@" ; unreferenced .BaseExp2: db "BASE EXP[2]@" ; unreferenced .HPExp0: db "HP EXP[0]@" .HPExp1: db "HP EXP[1]@" .AttkExp0: db "ATTK EXP[0]@" .AttkExp1: db "ATTK EXP[1]@" .DfnsExp0: db "DFNS EXP[0]@" .DfnsExp1: db "DFNS EXP[1]@" .SpeedExp0: db "SPEED EXP[0]@" .SpeedExp1: db "SPEED EXP[1]@" .SpclExp0: db "SPCL EXP[0]@" .SpclExp1: db "SPCL EXP[1]@" .PowerRnd0: db "POWER RND[0]<LF> RARE:--1-1010@" .PowerRnd1: db "POWER RND[1]<LF> RARE:10101010@" .PP1: db "PP 1@" .PP2: db "PP 2@" .PP3: db "PP 3@" .PP4: db "PP 4@" .Friend: db "FRIEND@" .Pokerus: db "#RUS@" .NoUse0: db "NO USE[0]@" .NoUse1: db "NO USE[1]@" .Level: db "LEVEL@" .SendBox: db "SEND BOX@" DebugRoom_BoxAddresses: dba sBox1 dba sBox2 dba sBox3 dba sBox4 dba sBox5 dba sBox6 dba sBox7 dba sBox8 dba sBox9 dba sBox10 dba sBox11 dba sBox12 dba sBox13 dba sBox14 DebugRoomMenu_RTCEdit: ld hl, .PagedValuesHeader call DebugRoom_EditPagedValues ret .PagedValuesHeader: dw NULL ; A function dw NULL ; Select function dw DebugRoom_SaveRTC ; Start function dw DebugRoomMenu_RTCEdit_UpdateClock ; Auto function db 1 ; # pages dw DebugRoomMenu_RTCEdit_Page1Values DebugRoom_SaveRTC: call YesNoBox ret c ld hl, wDebugRoomRTCSec call DebugRoom_SetClock ret DebugRoomMenu_RTCEdit_UpdateClock: ld hl, wDebugRoomRTCCurSec call DebugRoom_GetClock ld de, DebugRoom_DayHTimeString hlcoord 3, 14 call PlaceString ld a, [wDebugRoomRTCCurDay + 0] ld h, a ld a, [wDebugRoomRTCCurDay + 1] ld l, a push hl ld hl, sp+0 ld d, h ld e, l hlcoord 7, 14 ld c, 2 call PrintHexNumber pop hl hlcoord 8, 15 ld de, wDebugRoomRTCCurHour lb bc, PRINTNUM_LEADINGZEROS | 1, 2 call PrintNum ld [hl], ":" inc hl ld de, wDebugRoomRTCCurMin lb bc, PRINTNUM_LEADINGZEROS | 1, 2 call PrintNum ld [hl], ":" inc hl ld de, wDebugRoomRTCCurSec lb bc, PRINTNUM_LEADINGZEROS | 1, 2 call PrintNum ret DebugRoom_DayHTimeString: db "DAY H<LF>TIME@" DebugRoom_GetClock: ld a, SRAM_ENABLE ld [MBC3SRamEnable], a xor a ld [MBC3LatchClock], a inc a ld [MBC3LatchClock], a ld b, RTC_DH - RTC_S + 1 ld c, RTC_S .loop ld a, c ld [MBC3SRamBank], a ld a, [MBC3RTC] ld [hli], a inc c dec b jr nz, .loop call CloseSRAM ret DebugRoom_SetClock: ld a, SRAM_ENABLE ld [MBC3SRamEnable], a ld b, RTC_DH - RTC_S + 1 ld c, RTC_S .loop ld a, c ld [MBC3SRamBank], a ld a, [hli] ld [MBC3RTC], a inc c dec b jr nz, .loop call CloseSRAM ret DebugRoomMenu_RTCEdit_Page1Values: db 5 paged_value wDebugRoomRTCSec, 0, 60 - 1, 0, .SecondString, NULL, FALSE paged_value wDebugRoomRTCMin, 0, 60 - 1, 0, .MinuteString, NULL, FALSE paged_value wDebugRoomRTCHour, 0, 24 - 1, 0, .HourString, NULL, FALSE paged_value wDebugRoomRTCDay+0, $00, $ff, 0, .DayLString, NULL, TRUE paged_value wDebugRoomRTCDay+1, $00, $ff, 0, .DayHString, NULL, TRUE .SecondString: db "SECOND@" .MinuteString: db "MINUTE@" .HourString: db "HOUR@" .DayLString: db "DAY L@" .DayHString: db "DAY H<LF> BIT0:DAY MSB<LF> BIT6:HALT<LF> BIT7:DAY CARRY@" DebugRoomMenu_HaltChkClr: call YesNoBox ret c ld a, BANK(sRTCHaltCheckValue) call OpenSRAM xor a ld hl, sRTCHaltCheckValue ld [hli], a ld [hl], a call CloseSRAM call DebugRoom_PrintRTCHaltChk ret DebugRoom_PrintRTCHaltChk: hlcoord 16, 9 ld de, .RTCString call PlaceString ld a, BANK(sRTCHaltCheckValue) ld hl, sRTCHaltCheckValue call OpenSRAM ld a, [hli] ld h, [hl] ld l, a call CloseSRAM ld de, .HaltString ld a, h cp HIGH(RTC_HALT_VALUE) jr nz, .ok ld a, l cp LOW(RTC_HALT_VALUE) jr z, .done .ok ld de, .OKString .done hlcoord 16, 10 call PlaceString ret .RTCString: db "RTC:@" .OKString: db " OK@" .HaltString: db "HALT@" DebugRoomMenu_GBIDSet: ld hl, .PagedValuesHeader call DebugRoom_EditPagedValues ret .PagedValuesHeader: dw NULL ; A function dw NULL ; Select function dw DebugRoom_SaveGBID ; Start function dw NULL ; Auto function db 1 ; # pages dw DebugRoomMenu_GBIDSet_Page1Values DebugRoom_SaveGBID: call YesNoBox ret c ld a, BANK(sPlayerData) call OpenSRAM ld hl, sPlayerData + (wPlayerID - wPlayerData) ld a, [wDebugRoomGBID + 0] ld [hli], a ld a, [wDebugRoomGBID + 1] ld [hli], a call CloseSRAM call DebugRoom_SaveChecksum ret DebugRoomMenu_GBIDSet_Page1Values: db 2 paged_value wDebugRoomGBID+0, $00, $ff, $00, .GBID0String, NULL, TRUE paged_value wDebugRoomGBID+1, $00, $ff, $00, .GBID1String, NULL, TRUE .GBID0String: db "GB ID [0]@" .GBID1String: db "GB ID [1]@" DebugRoomMenu_BtlRecClr: call YesNoBox ret c ld a, BANK(sLinkBattleStats) call OpenSRAM xor a ld hl, sLinkBattleStats ld bc, sLinkBattleStatsEnd - sLinkBattleStats call ByteFill call CloseSRAM ret DebugRoomMenu_HOFClear: call YesNoBox ret c ld a, BANK(sPlayerData) call OpenSRAM ld hl, sPlayerData + (wHallOfFameCount - wPlayerData) ld [hl], 0 xor a ld hl, sHallOfFame ld bc, sHallOfFameEnd - sHallOfFame call ByteFill call CloseSRAM call DebugRoom_SaveChecksum ret ComputeROMChecksum: ld de, 0 call .ComputeROM0Checksum ld c, $01 ; first bank .loop: push bc push de ld a, c cpl inc a add $80 ld de, wDebugRoomCurChecksumBank ld [de], a hlcoord 16, 16 ld c, 1 call PrintHexNumber ld [hl], "h" pop de pop bc call ComputeROMXChecksum inc c ld a, c cp $80 ; number of banks jr c, .loop ld a, d ld [wDebugRoomROMChecksum + 0], a ld a, e ld [wDebugRoomROMChecksum + 1], a ret .AddAtoDE: add e ld e, a ld a, d adc 0 ld d, a ret .ComputeROM0Checksum: ld hl, $0000 ; ROM0 start .rom0_loop ld a, [hli] call .AddAtoDE ld a, h cp $40 ; HIGH(ROM0 end) jr c, .rom0_loop ret .ComputeROMXChecksum: ; unreferenced ld hl, $4000 ; ROMX start .romx_loop ld a, c call GetFarByte inc hl call .AddAtoDE ld a, h cp $80 ; HIGH(ROMX end) jr c, .romx_loop ret DebugRoom_PrintROMChecksum: ; unreferenced hlcoord 16, 0 ld de, .SumString call PlaceString hlcoord 16, 1 ld de, wDebugRoomROMChecksum ld c, 2 call PrintHexNumber ret .SumString: db "SUM:@" DebugRoomMenu_ROMChecksum: ld hl, .WaitText call MenuTextbox call ComputeROMChecksum call CloseWindow ld hl, .ROMChecksumText call MenuTextbox hlcoord 14, 14 ld de, wDebugRoomROMChecksum ld c, 2 call PrintHexNumber ld [hl], "h" call DebugRoom_JoyWaitABSelect call CloseWindow ret .WaitText: text "Wait..." done .ROMChecksumText: text "ROM CHECKSUM:" next "" done DebugRoomMenu_BTBugPoke: ld a, BANK(sIsBugMon) call OpenSRAM ld a, [sIsBugMon] call CloseSRAM or a jr nz, .bug_mon ld hl, .NoBugMonText call MenuTextbox call DebugRoom_JoyWaitABSelect call CloseWindow ret .NoBugMonText: text "No bug #MON." done .bug_mon: ld hl, .ItsBugMonText call MenuTextbox ld a, BANK(sIsBugMon) call OpenSRAM hlcoord 4, 16 ld de, sIsBugMon ld c, 1 call PrintHexNumber ld [hl], "h" call YesNoBox jr c, .done xor a ld [sIsBugMon], a .done call CloseSRAM call CloseWindow ret .ItsBugMonText: text "It'", "s bug #MON!" next "No. Clear flag?" done PrintHexNumber: ; Print the c-byte value from de to hl as hexadecimal digits. .loop push bc call .HandleByte pop bc dec c jr nz, .loop ret .HandleByte: ld a, [de] swap a and $f call .PrintDigit ld [hli], a ld a, [de] and $f call .PrintDigit ld [hli], a inc de ret .PrintDigit: ld bc, .HexDigits add c ld c, a ld a, 0 adc b ld b, a ld a, [bc] ret .HexDigits: db "0123456789ABCDEF"