ref: ef1c4c5a813595841a2c81105ca0c06e5ea85db0
parent: 9a927c1b3efa2eca886f346a4fcca0eb57278faf
parent: 813d0aa73a16ababcf257d4df57ff3b69879b011
author: Rangi <35663410+Rangi42@users.noreply.github.com>
date: Sun Feb 23 09:16:26 EST 2020
Merge pull request #687 from mid-kid/master Small home/ reorganization
--- a/home.asm
+++ b/home.asm
@@ -1,30 +1,16 @@
INCLUDE "constants.asm"
-
SECTION "NULL", ROM0
-
NULL::
+INCLUDE "home/header.asm"
-INCLUDE "home/rst.asm"
-
-
-INCLUDE "home/interrupts.asm"
-
-
-SECTION "Header", ROM0
-
-Start::
- nop
- jp _Start
-
-
SECTION "Home", ROM0
INCLUDE "home/init.asm"
INCLUDE "home/vblank.asm"
INCLUDE "home/delay.asm"
-INCLUDE "home/rtc.asm"
+INCLUDE "home/time_palettes.asm"
INCLUDE "home/fade.asm"
INCLUDE "home/lcd.asm"
INCLUDE "home/time.asm"
@@ -32,7 +18,7 @@
INCLUDE "home/joypad.asm"
INCLUDE "home/decompress.asm"
INCLUDE "home/palettes.asm"
-INCLUDE "home/copy.asm"
+INCLUDE "home/gfx.asm"
INCLUDE "home/text.asm"
INCLUDE "home/video.asm"
INCLUDE "home/map_objects.asm"
@@ -39,182 +25,38 @@
INCLUDE "home/sine.asm"
INCLUDE "home/movement.asm"
INCLUDE "home/menu.asm"
-INCLUDE "home/menu_window.asm"
-INCLUDE "home/menu2.asm"
-INCLUDE "home/handshake.asm"
+INCLUDE "home/printer.asm"
INCLUDE "home/game_time.asm"
INCLUDE "home/map.asm"
-
-InexplicablyEmptyFunction::
-; unused
-; Inexplicably empty.
-; Seen in PredefPointers.
-rept 16
- nop
-endr
- ret
-
INCLUDE "home/farcall.asm"
INCLUDE "home/predef.asm"
INCLUDE "home/window.asm"
INCLUDE "home/flag.asm"
-
-Unreferenced_CheckBPressedDebug::
-; Used in debug ROMs to walk through walls and avoid encounters.
-
- ld a, [wDebugFlags]
- bit DEBUG_FIELD_F, a
- ret z
-
- ldh a, [hJoyDown]
- bit B_BUTTON_F, a
- ret
-
-xor_a::
- xor a
- ret
-
-xor_a_dec_a::
- xor a
- dec a
- ret
-
-Unreferenced_CheckFieldDebug::
- push hl
- ld hl, wDebugFlags
- bit DEBUG_FIELD_F, [hl]
- pop hl
- ret
-
INCLUDE "home/sprite_updates.asm"
INCLUDE "home/string.asm"
INCLUDE "home/region.asm"
-
-ret_2f3e::
- ret
-
INCLUDE "home/item.asm"
INCLUDE "home/random.asm"
INCLUDE "home/sram.asm"
-
-; Register aliases
-
-_hl_::
- jp hl
-
-_de_::
- push de
- ret
-
+INCLUDE "home/call_regs.asm"
INCLUDE "home/double_speed.asm"
INCLUDE "home/clear_sprites.asm"
-INCLUDE "home/copy2.asm"
+INCLUDE "home/copy.asm"
INCLUDE "home/copy_tilemap.asm"
INCLUDE "home/copy_name.asm"
-
-IsInArray::
-; Find value a for every de bytes in array hl.
-; Return index in b and carry if found.
-
- ld b, 0
- ld c, a
-.loop
- ld a, [hl]
- cp -1
- jr z, .NotInArray
- cp c
- jr z, .InArray
- inc b
- add hl, de
- jr .loop
-
-.NotInArray:
- and a
- ret
-
-.InArray:
- scf
- ret
-
-SkipNames::
-; Skip a names.
- ld bc, NAME_LENGTH
- and a
- ret z
-.loop
- add hl, bc
- dec a
- jr nz, .loop
- ret
-
+INCLUDE "home/array.asm"
INCLUDE "home/math.asm"
INCLUDE "home/print_text.asm"
-
-CallPointerAt::
- ldh a, [hROMBank]
- push af
- ld a, [hli]
- rst Bankswitch
-
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
- call _hl_
-
- pop hl
- ld a, h
- rst Bankswitch
- ret
-
INCLUDE "home/queue_script.asm"
INCLUDE "home/compare.asm"
INCLUDE "home/tilemap.asm"
-INCLUDE "home/hp_pals.asm"
-
-CountSetBits::
-; Count the number of set bits in b bytes starting from hl.
-; Return in a, c and [wNumSetBits].
- ld c, 0
-.next
- ld a, [hli]
- ld e, a
- ld d, 8
-
-.count
- srl e
- ld a, 0
- adc c
- ld c, a
- dec d
- jr nz, .count
-
- dec b
- jr nz, .next
-
- ld a, c
- ld [wNumSetBits], a
- ret
-
-GetWeekday::
- ld a, [wCurDay]
-.mod
- sub 7
- jr nc, .mod
- add 7
- ret
-
INCLUDE "home/pokedex_flags.asm"
INCLUDE "home/names.asm"
INCLUDE "home/scrolling_menu.asm"
INCLUDE "home/stone_queue.asm"
INCLUDE "home/trainers.asm"
-INCLUDE "home/mon_stats.asm"
-INCLUDE "home/cry.asm"
-INCLUDE "home/print_level.asm"
-INCLUDE "home/mon_data.asm"
+INCLUDE "home/pokemon.asm"
INCLUDE "home/print_bcd.asm"
-INCLUDE "home/mon_data_2.asm"
INCLUDE "home/battle.asm"
INCLUDE "home/sprite_anims.asm"
INCLUDE "home/audio.asm"
--- /dev/null
+++ b/home/array.asm
@@ -1,0 +1,44 @@
+IsInArray::
+; Find value a for every de bytes in array hl.
+; Return index in b and carry if found.
+
+ ld b, 0
+ ld c, a
+.loop
+ ld a, [hl]
+ cp -1
+ jr z, .NotInArray
+ cp c
+ jr z, .InArray
+ inc b
+ add hl, de
+ jr .loop
+
+.NotInArray:
+ and a
+ ret
+
+.InArray:
+ scf
+ ret
+
+SkipNames::
+; Skip a names.
+ ld bc, NAME_LENGTH
+ and a
+ ret z
+.loop
+ add hl, bc
+ dec a
+ jr nz, .loop
+ ret
+
+AddNTimes::
+; Add bc * a to hl.
+ and a
+ ret z
+.loop
+ add hl, bc
+ dec a
+ jr nz, .loop
+ ret
--- a/home/battle.asm
+++ b/home/battle.asm
@@ -1,3 +1,38 @@
+GetPartyParamLocation::
+; Get the location of parameter a from wCurPartyMon in hl
+ push bc
+ ld hl, wPartyMons
+ ld c, a
+ ld b, 0
+ add hl, bc
+ ld a, [wCurPartyMon]
+ call GetPartyLocation
+ pop bc
+ ret
+
+GetPartyLocation::
+; Add the length of a PartyMon struct to hl a times.
+ ld bc, PARTYMON_STRUCT_LENGTH
+ jp AddNTimes
+
+Unreferenced_GetDexNumber::
+; Probably used in gen 1 to convert index number to dex number
+; Not required in gen 2 because index number == dex number
+ push hl
+ ld a, b
+ dec a
+ ld b, 0
+ add hl, bc
+ ld hl, BaseData + BASE_DEX_NO
+ ld bc, BASE_DATA_SIZE
+ call AddNTimes
+ ld a, BANK(BaseData)
+ call GetFarHalfword
+ ld b, l
+ ld c, h
+ pop hl
+ ret
+
UserPartyAttr::
push af
ldh a, [hBattleTurn]
@@ -223,4 +258,23 @@
pop hl
ld a, [wBattleAnimByte]
+ ret
+
+PushLYOverrides::
+ ldh a, [hLCDCPointer]
+ and a
+ ret z
+
+ ld a, LOW(wLYOverridesBackup)
+ ld [wRequested2bppSource], a
+ ld a, HIGH(wLYOverridesBackup)
+ ld [wRequested2bppSource + 1], a
+
+ ld a, LOW(wLYOverrides)
+ ld [wRequested2bppDest], a
+ ld a, HIGH(wLYOverrides)
+ ld [wRequested2bppDest + 1], a
+
+ ld a, (wLYOverridesEnd - wLYOverrides) / 16
+ ld [wRequested2bpp], a
ret
--- /dev/null
+++ b/home/call_regs.asm
@@ -1,0 +1,8 @@
+; Register aliases
+
+_hl_::
+ jp hl
+
+_de_::
+ push de
+ ret
--- a/home/copy.asm
+++ b/home/copy.asm
@@ -1,140 +1,59 @@
-; Functions to copy data from ROM.
-
-Get2bpp_2::
- ldh a, [rLCDC]
- bit rLCDC_ENABLE, a
- jp z, Copy2bpp
-
- homecall _Get2bpp
-
+CopyBytes::
+; copy bc bytes from hl to de
+ inc b ; we bail the moment b hits 0, so include the last run
+ inc c ; same thing; include last byte
+ jr .HandleLoop
+.CopyByte:
+ ld a, [hli]
+ ld [de], a
+ inc de
+.HandleLoop:
+ dec c
+ jr nz, .CopyByte
+ dec b
+ jr nz, .CopyByte
ret
-Get1bpp_2::
- ldh a, [rLCDC]
- bit rLCDC_ENABLE, a
- jp z, Copy1bpp
-
- homecall _Get1bpp
-
- ret
-
-FarCopyBytesDouble_DoubleBankSwitch::
- ldh [hBuffer], a
- ldh a, [hROMBank]
+SwapBytes::
+; swap bc bytes between hl and de
+.Loop:
+ ; stash [hl] away on the stack
+ ld a, [hl]
push af
- ldh a, [hBuffer]
- rst Bankswitch
- call FarCopyBytesDouble
+ ; copy a byte from [de] to [hl]
+ ld a, [de]
+ ld [hli], a
+ ; retrieve the previous value of [hl]; put it in [de]
pop af
- rst Bankswitch
- ret
+ ld [de], a
+ inc de
-OldDMATransfer::
- dec c
- ldh a, [hBGMapMode]
- push af
- xor a
- ldh [hBGMapMode], a
- ldh a, [hROMBank]
- push af
+ ; handle loop stuff
+ dec bc
ld a, b
- rst Bankswitch
-
-.loop
-; load the source and target MSB and LSB
- ld a, d
- ldh [rHDMA1], a ; source MSB
- ld a, e
- and $f0
- ldh [rHDMA2], a ; source LSB
- ld a, h
- and $1f
- ldh [rHDMA3], a ; target MSB
- ld a, l
- and $f0
- ldh [rHDMA4], a ; target LSB
-; stop when c < 8
- ld a, c
- cp $8
- jr c, .done
-; decrease c by 8
- sub $8
- ld c, a
-; DMA transfer state
- ld a, $f
- ldh [hDMATransfer], a
- call DelayFrame
-; add $100 to hl and de
- ld a, l
- add LOW($100)
- ld l, a
- ld a, h
- adc HIGH($100)
- ld h, a
- ld a, e
- add LOW($100)
- ld e, a
- ld a, d
- adc HIGH($100)
- ld d, a
- jr .loop
-
-.done
- ld a, c
- and $7f ; pretty silly, considering at most bits 0-2 would be set
- ldh [hDMATransfer], a
- call DelayFrame
- pop af
- rst Bankswitch
-
- pop af
- ldh [hBGMapMode], a
+ or c
+ jr nz, .Loop
ret
-ReplaceKrisSprite::
- farcall _ReplaceKrisSprite
+ByteFill::
+; fill bc bytes with the value of a, starting at hl
+ inc b ; we bail the moment b hits 0, so include the last run
+ inc c ; same thing; include last byte
+ jr .HandleLoop
+.PutByte:
+ ld [hli], a
+.HandleLoop:
+ dec c
+ jr nz, .PutByte
+ dec b
+ jr nz, .PutByte
ret
-LoadStandardFont::
- farcall _LoadStandardFont
- ret
-
-LoadFontsBattleExtra::
- farcall _LoadFontsBattleExtra
- ret
-
-LoadFontsExtra::
- farcall _LoadFontsExtra1
- farcall _LoadFontsExtra2
- ret
-
-LoadFontsExtra2::
- farcall _LoadFontsExtra2
- ret
-
-DecompressRequest2bpp::
- push de
- ld a, BANK(sScratch)
- call GetSRAMBank
- push bc
-
- ld de, sScratch
- ld a, b
- call FarDecompress
-
- pop bc
- pop hl
-
- ld de, sScratch
- call Request2bpp
- call CloseSRAM
- ret
-
-FarCopyBytes::
-; copy bc bytes from a:hl to de
-
+GetFarByte::
+; retrieve a single byte from a:hl, and return it in a.
+ ; bankswitch to new bank
ldh [hBuffer], a
ldh a, [hROMBank]
push af
@@ -141,16 +60,21 @@
ldh a, [hBuffer]
rst Bankswitch
- call CopyBytes
+ ; get byte from new bank
+ ld a, [hl]
+ ldh [hBuffer], a
+ ; bankswitch to previous bank
pop af
rst Bankswitch
+
+ ; return retrieved value in a
+ ldh a, [hBuffer]
ret
-FarCopyBytesDouble::
-; Copy bc bytes from a:hl to bc*2 bytes at de,
-; doubling each byte in the process.
-
+GetFarHalfword::
+; retrieve a halfword from a:hl, and return it in hl.
+ ; bankswitch to new bank
ldh [hBuffer], a
ldh a, [hROMBank]
push af
@@ -157,235 +81,51 @@
ldh a, [hBuffer]
rst Bankswitch
-; switcheroo, de <> hl
- ld a, h
- ld h, d
- ld d, a
- ld a, l
- ld l, e
- ld e, a
+ ; get halfword from new bank, put it in hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
- inc b
- inc c
- jr .dec
-
-.loop
- ld a, [de]
- inc de
- ld [hli], a
- ld [hli], a
-.dec
- dec c
- jr nz, .loop
- dec b
- jr nz, .loop
-
+ ; bankswitch to previous bank and return
pop af
rst Bankswitch
ret
-Request2bpp::
-; Load 2bpp at b:de to occupy c tiles of hl.
- ldh a, [hBGMapMode]
+FarCopyWRAM::
+ ldh [hBuffer], a
+ ldh a, [rSVBK]
push af
- xor a
- ldh [hBGMapMode], a
+ ldh a, [hBuffer]
+ ldh [rSVBK], a
- ldh a, [hROMBank]
- push af
- ld a, b
- rst Bankswitch
+ call CopyBytes
- ldh a, [hTilesPerCycle]
- push af
- ld a, $8
- ldh [hTilesPerCycle], a
-
- ld a, [wLinkMode]
- cp LINK_MOBILE
- jr nz, .NotMobile
- ldh a, [hMobile]
- and a
- jr nz, .NotMobile
- ld a, $6
- ldh [hTilesPerCycle], a
-
-.NotMobile:
- ld a, e
- ld [wRequested2bppSource], a
- ld a, d
- ld [wRequested2bppSource + 1], a
- ld a, l
- ld [wRequested2bppDest], a
- ld a, h
- ld [wRequested2bppDest + 1], a
-.loop
- ld a, c
- ld hl, hTilesPerCycle
- cp [hl]
- jr nc, .iterate
-
- ld [wRequested2bpp], a
-.wait
- call DelayFrame
- ld a, [wRequested2bpp]
- and a
- jr nz, .wait
-
pop af
- ldh [hTilesPerCycle], a
-
- pop af
- rst Bankswitch
-
- pop af
- ldh [hBGMapMode], a
+ ldh [rSVBK], a
ret
-.iterate
- ldh a, [hTilesPerCycle]
- ld [wRequested2bpp], a
-
-.wait2
- call DelayFrame
- ld a, [wRequested2bpp]
- and a
- jr nz, .wait2
-
- ld a, c
- ld hl, hTilesPerCycle
- sub [hl]
- ld c, a
- jr .loop
-
-Request1bpp::
-; Load 1bpp at b:de to occupy c tiles of hl.
- ldh a, [hBGMapMode]
+GetFarWRAMByte::
+ ldh [hBuffer], a
+ ldh a, [rSVBK]
push af
- xor a
- ldh [hBGMapMode], a
-
- ldh a, [hROMBank]
- push af
- ld a, b
- rst Bankswitch
-
- ldh a, [hTilesPerCycle]
- push af
- ld a, $8
- ldh [hTilesPerCycle], a
-
- ld a, [wLinkMode]
- cp LINK_MOBILE
- jr nz, .NotMobile
- ldh a, [hMobile]
- and a
- jr nz, .NotMobile
- ld a, $6
- ldh [hTilesPerCycle], a
-
-.NotMobile:
- ld a, e
- ld [wRequested1bppSource], a
- ld a, d
- ld [wRequested1bppSource + 1], a
- ld a, l
- ld [wRequested1bppDest], a
- ld a, h
- ld [wRequested1bppDest + 1], a
-.loop
- ld a, c
- ld hl, hTilesPerCycle
- cp [hl]
- jr nc, .iterate
-
- ld [wRequested1bpp], a
-.wait
- call DelayFrame
- ld a, [wRequested1bpp]
- and a
- jr nz, .wait
-
+ ldh a, [hBuffer]
+ ldh [rSVBK], a
+ ld a, [hl]
+ ldh [hBuffer], a
pop af
- ldh [hTilesPerCycle], a
-
- pop af
- rst Bankswitch
-
- pop af
- ldh [hBGMapMode], a
+ ldh [rSVBK], a
+ ldh a, [hBuffer]
ret
-.iterate
- ldh a, [hTilesPerCycle]
- ld [wRequested1bpp], a
-
-.wait2
- call DelayFrame
- ld a, [wRequested1bpp]
- and a
- jr nz, .wait2
-
- ld a, c
- ld hl, hTilesPerCycle
- sub [hl]
- ld c, a
- jr .loop
-
-Get2bpp::
- ldh a, [rLCDC]
- bit rLCDC_ENABLE, a
- jp nz, Request2bpp
-
-Copy2bpp::
-; copy c 2bpp tiles from b:de to hl
-
- push hl
- ld h, d
- ld l, e
- pop de
-
-; bank
- ld a, b
-
-; bc = c * $10
+GetFarWRAMWord::
+ ldh [hBuffer], a
+ ldh a, [rSVBK]
push af
- swap c
- ld a, $f
- and c
- ld b, a
- ld a, $f0
- and c
- ld c, a
+ ldh a, [hBuffer]
+ ldh [rSVBK], a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
pop af
-
- jp FarCopyBytes
-
-Get1bpp::
- ldh a, [rLCDC]
- bit rLCDC_ENABLE, a
- jp nz, Request1bpp
-
-Copy1bpp::
-; copy c 1bpp tiles from b:de to hl
-
- push de
- ld d, h
- ld e, l
-
-; bank
- ld a, b
-
-; bc = c * $10 / 2
- push af
- ld h, 0
- ld l, c
- add hl, hl
- add hl, hl
- add hl, hl
- ld b, h
- ld c, l
- pop af
-
- pop hl
- jp FarCopyBytesDouble
+ ldh [rSVBK], a
+ ret
--- a/home/copy2.asm
+++ /dev/null
@@ -1,131 +1,0 @@
-CopyBytes::
-; copy bc bytes from hl to de
- inc b ; we bail the moment b hits 0, so include the last run
- inc c ; same thing; include last byte
- jr .HandleLoop
-.CopyByte:
- ld a, [hli]
- ld [de], a
- inc de
-.HandleLoop:
- dec c
- jr nz, .CopyByte
- dec b
- jr nz, .CopyByte
- ret
-
-SwapBytes::
-; swap bc bytes between hl and de
-.Loop:
- ; stash [hl] away on the stack
- ld a, [hl]
- push af
-
- ; copy a byte from [de] to [hl]
- ld a, [de]
- ld [hli], a
-
- ; retrieve the previous value of [hl]; put it in [de]
- pop af
- ld [de], a
- inc de
-
- ; handle loop stuff
- dec bc
- ld a, b
- or c
- jr nz, .Loop
- ret
-
-ByteFill::
-; fill bc bytes with the value of a, starting at hl
- inc b ; we bail the moment b hits 0, so include the last run
- inc c ; same thing; include last byte
- jr .HandleLoop
-.PutByte:
- ld [hli], a
-.HandleLoop:
- dec c
- jr nz, .PutByte
- dec b
- jr nz, .PutByte
- ret
-
-GetFarByte::
-; retrieve a single byte from a:hl, and return it in a.
- ; bankswitch to new bank
- ldh [hBuffer], a
- ldh a, [hROMBank]
- push af
- ldh a, [hBuffer]
- rst Bankswitch
-
- ; get byte from new bank
- ld a, [hl]
- ldh [hBuffer], a
-
- ; bankswitch to previous bank
- pop af
- rst Bankswitch
-
- ; return retrieved value in a
- ldh a, [hBuffer]
- ret
-
-GetFarHalfword::
-; retrieve a halfword from a:hl, and return it in hl.
- ; bankswitch to new bank
- ldh [hBuffer], a
- ldh a, [hROMBank]
- push af
- ldh a, [hBuffer]
- rst Bankswitch
-
- ; get halfword from new bank, put it in hl
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
- ; bankswitch to previous bank and return
- pop af
- rst Bankswitch
- ret
-
-FarCopyWRAM::
- ldh [hBuffer], a
- ldh a, [rSVBK]
- push af
- ldh a, [hBuffer]
- ldh [rSVBK], a
-
- call CopyBytes
-
- pop af
- ldh [rSVBK], a
- ret
-
-GetFarWRAMByte::
- ldh [hBuffer], a
- ldh a, [rSVBK]
- push af
- ldh a, [hBuffer]
- ldh [rSVBK], a
- ld a, [hl]
- ldh [hBuffer], a
- pop af
- ldh [rSVBK], a
- ldh a, [hBuffer]
- ret
-
-GetFarWRAMWord::
- ldh [hBuffer], a
- ldh a, [rSVBK]
- push af
- ldh a, [hBuffer]
- ldh [rSVBK], a
- ld a, [hli]
- ld h, [hl]
- ld l, a
- pop af
- ldh [rSVBK], a
- ret
--- a/home/cry.asm
+++ /dev/null
@@ -1,101 +1,0 @@
-PlayStereoCry::
- push af
- ld a, 1
- ld [wStereoPanningMask], a
- pop af
- call _PlayMonCry
- call WaitSFX
- ret
-
-PlayStereoCry2::
-; Don't wait for the cry to end.
-; Used during pic animations.
- push af
- ld a, 1
- ld [wStereoPanningMask], a
- pop af
- jp _PlayMonCry
-
-PlayMonCry::
- call PlayMonCry2
- call WaitSFX
- ret
-
-PlayMonCry2::
-; Don't wait for the cry to end.
- push af
- xor a
- ld [wStereoPanningMask], a
- ld [wCryTracks], a
- pop af
- call _PlayMonCry
- ret
-
-_PlayMonCry::
- push hl
- push de
- push bc
-
- call GetCryIndex
- jr c, .done
-
- ld e, c
- ld d, b
- call PlayCry
-
-.done
- pop bc
- pop de
- pop hl
- ret
-
-LoadCry::
-; Load cry bc.
-
- call GetCryIndex
- ret c
-
- ldh a, [hROMBank]
- push af
- ld a, BANK(PokemonCries)
- rst Bankswitch
-
- ld hl, PokemonCries
-rept 6 ; sizeof(mon_cry)
- add hl, bc
-endr
-
- ld e, [hl]
- inc hl
- ld d, [hl]
- inc hl
-
- ld a, [hli]
- ld [wCryPitch], a
- ld a, [hli]
- ld [wCryPitch + 1], a
- ld a, [hli]
- ld [wCryLength], a
- ld a, [hl]
- ld [wCryLength + 1], a
-
- pop af
- rst Bankswitch
- and a
- ret
-
-GetCryIndex::
- and a
- jr z, .no
- cp NUM_POKEMON + 1
- jr nc, .no
-
- dec a
- ld c, a
- ld b, 0
- and a
- ret
-
-.no
- scf
- ret
--- a/home/flag.asm
+++ b/home/flag.asm
@@ -101,3 +101,30 @@
ld a, c
and a
ret
+
+Unreferenced_CheckBPressedDebug::
+; Used in debug ROMs to walk through walls and avoid encounters.
+
+ ld a, [wDebugFlags]
+ bit DEBUG_FIELD_F, a
+ ret z
+
+ ldh a, [hJoyDown]
+ bit B_BUTTON_F, a
+ ret
+
+xor_a::
+ xor a
+ ret
+
+xor_a_dec_a::
+ xor a
+ dec a
+ ret
+
+Unreferenced_CheckFieldDebug::
+ push hl
+ ld hl, wDebugFlags
+ bit DEBUG_FIELD_F, [hl]
+ pop hl
+ ret
--- /dev/null
+++ b/home/gfx.asm
@@ -1,0 +1,391 @@
+; Functions to copy data from ROM.
+
+Get2bpp_2::
+ ldh a, [rLCDC]
+ bit rLCDC_ENABLE, a
+ jp z, Copy2bpp
+
+ homecall _Get2bpp
+
+ ret
+
+Get1bpp_2::
+ ldh a, [rLCDC]
+ bit rLCDC_ENABLE, a
+ jp z, Copy1bpp
+
+ homecall _Get1bpp
+
+ ret
+
+FarCopyBytesDouble_DoubleBankSwitch::
+ ldh [hBuffer], a
+ ldh a, [hROMBank]
+ push af
+ ldh a, [hBuffer]
+ rst Bankswitch
+
+ call FarCopyBytesDouble
+
+ pop af
+ rst Bankswitch
+ ret
+
+OldDMATransfer:
+ dec c
+ ldh a, [hBGMapMode]
+ push af
+ xor a
+ ldh [hBGMapMode], a
+ ldh a, [hROMBank]
+ push af
+ ld a, b
+ rst Bankswitch
+
+.loop
+; load the source and target MSB and LSB
+ ld a, d
+ ldh [rHDMA1], a ; source MSB
+ ld a, e
+ and $f0
+ ldh [rHDMA2], a ; source LSB
+ ld a, h
+ and $1f
+ ldh [rHDMA3], a ; target MSB
+ ld a, l
+ and $f0
+ ldh [rHDMA4], a ; target LSB
+; stop when c < 8
+ ld a, c
+ cp $8
+ jr c, .done
+; decrease c by 8
+ sub $8
+ ld c, a
+; DMA transfer state
+ ld a, $f
+ ldh [hDMATransfer], a
+ call DelayFrame
+; add $100 to hl and de
+ ld a, l
+ add LOW($100)
+ ld l, a
+ ld a, h
+ adc HIGH($100)
+ ld h, a
+ ld a, e
+ add LOW($100)
+ ld e, a
+ ld a, d
+ adc HIGH($100)
+ ld d, a
+ jr .loop
+
+.done
+ ld a, c
+ and $7f ; pretty silly, considering at most bits 0-2 would be set
+ ldh [hDMATransfer], a
+ call DelayFrame
+ pop af
+ rst Bankswitch
+
+ pop af
+ ldh [hBGMapMode], a
+ ret
+
+ReplaceKrisSprite::
+ farcall _ReplaceKrisSprite
+ ret
+
+LoadStandardFont::
+ farcall _LoadStandardFont
+ ret
+
+LoadFontsBattleExtra::
+ farcall _LoadFontsBattleExtra
+ ret
+
+LoadFontsExtra::
+ farcall _LoadFontsExtra1
+ farcall _LoadFontsExtra2
+ ret
+
+LoadFontsExtra2:
+ farcall _LoadFontsExtra2
+ ret
+
+DecompressRequest2bpp::
+ push de
+ ld a, BANK(sScratch)
+ call GetSRAMBank
+ push bc
+
+ ld de, sScratch
+ ld a, b
+ call FarDecompress
+
+ pop bc
+ pop hl
+
+ ld de, sScratch
+ call Request2bpp
+ call CloseSRAM
+ ret
+
+FarCopyBytes::
+; copy bc bytes from a:hl to de
+
+ ldh [hBuffer], a
+ ldh a, [hROMBank]
+ push af
+ ldh a, [hBuffer]
+ rst Bankswitch
+
+ call CopyBytes
+
+ pop af
+ rst Bankswitch
+ ret
+
+FarCopyBytesDouble:
+; Copy bc bytes from a:hl to bc*2 bytes at de,
+; doubling each byte in the process.
+
+ ldh [hBuffer], a
+ ldh a, [hROMBank]
+ push af
+ ldh a, [hBuffer]
+ rst Bankswitch
+
+; switcheroo, de <> hl
+ ld a, h
+ ld h, d
+ ld d, a
+ ld a, l
+ ld l, e
+ ld e, a
+
+ inc b
+ inc c
+ jr .dec
+
+.loop
+ ld a, [de]
+ inc de
+ ld [hli], a
+ ld [hli], a
+.dec
+ dec c
+ jr nz, .loop
+ dec b
+ jr nz, .loop
+
+ pop af
+ rst Bankswitch
+ ret
+
+Request2bpp::
+; Load 2bpp at b:de to occupy c tiles of hl.
+ ldh a, [hBGMapMode]
+ push af
+ xor a
+ ldh [hBGMapMode], a
+
+ ldh a, [hROMBank]
+ push af
+ ld a, b
+ rst Bankswitch
+
+ ldh a, [hTilesPerCycle]
+ push af
+ ld a, $8
+ ldh [hTilesPerCycle], a
+
+ ld a, [wLinkMode]
+ cp LINK_MOBILE
+ jr nz, .NotMobile
+ ldh a, [hMobile]
+ and a
+ jr nz, .NotMobile
+ ld a, $6
+ ldh [hTilesPerCycle], a
+
+.NotMobile:
+ ld a, e
+ ld [wRequested2bppSource], a
+ ld a, d
+ ld [wRequested2bppSource + 1], a
+ ld a, l
+ ld [wRequested2bppDest], a
+ ld a, h
+ ld [wRequested2bppDest + 1], a
+.loop
+ ld a, c
+ ld hl, hTilesPerCycle
+ cp [hl]
+ jr nc, .iterate
+
+ ld [wRequested2bpp], a
+.wait
+ call DelayFrame
+ ld a, [wRequested2bpp]
+ and a
+ jr nz, .wait
+
+ pop af
+ ldh [hTilesPerCycle], a
+
+ pop af
+ rst Bankswitch
+
+ pop af
+ ldh [hBGMapMode], a
+ ret
+
+.iterate
+ ldh a, [hTilesPerCycle]
+ ld [wRequested2bpp], a
+
+.wait2
+ call DelayFrame
+ ld a, [wRequested2bpp]
+ and a
+ jr nz, .wait2
+
+ ld a, c
+ ld hl, hTilesPerCycle
+ sub [hl]
+ ld c, a
+ jr .loop
+
+Request1bpp::
+; Load 1bpp at b:de to occupy c tiles of hl.
+ ldh a, [hBGMapMode]
+ push af
+ xor a
+ ldh [hBGMapMode], a
+
+ ldh a, [hROMBank]
+ push af
+ ld a, b
+ rst Bankswitch
+
+ ldh a, [hTilesPerCycle]
+ push af
+ ld a, $8
+ ldh [hTilesPerCycle], a
+
+ ld a, [wLinkMode]
+ cp LINK_MOBILE
+ jr nz, .NotMobile
+ ldh a, [hMobile]
+ and a
+ jr nz, .NotMobile
+ ld a, $6
+ ldh [hTilesPerCycle], a
+
+.NotMobile:
+ ld a, e
+ ld [wRequested1bppSource], a
+ ld a, d
+ ld [wRequested1bppSource + 1], a
+ ld a, l
+ ld [wRequested1bppDest], a
+ ld a, h
+ ld [wRequested1bppDest + 1], a
+.loop
+ ld a, c
+ ld hl, hTilesPerCycle
+ cp [hl]
+ jr nc, .iterate
+
+ ld [wRequested1bpp], a
+.wait
+ call DelayFrame
+ ld a, [wRequested1bpp]
+ and a
+ jr nz, .wait
+
+ pop af
+ ldh [hTilesPerCycle], a
+
+ pop af
+ rst Bankswitch
+
+ pop af
+ ldh [hBGMapMode], a
+ ret
+
+.iterate
+ ldh a, [hTilesPerCycle]
+ ld [wRequested1bpp], a
+
+.wait2
+ call DelayFrame
+ ld a, [wRequested1bpp]
+ and a
+ jr nz, .wait2
+
+ ld a, c
+ ld hl, hTilesPerCycle
+ sub [hl]
+ ld c, a
+ jr .loop
+
+Get2bpp::
+ ldh a, [rLCDC]
+ bit rLCDC_ENABLE, a
+ jp nz, Request2bpp
+
+Copy2bpp:
+; copy c 2bpp tiles from b:de to hl
+
+ push hl
+ ld h, d
+ ld l, e
+ pop de
+
+; bank
+ ld a, b
+
+; bc = c * $10
+ push af
+ swap c
+ ld a, $f
+ and c
+ ld b, a
+ ld a, $f0
+ and c
+ ld c, a
+ pop af
+
+ jp FarCopyBytes
+
+Get1bpp::
+ ldh a, [rLCDC]
+ bit rLCDC_ENABLE, a
+ jp nz, Request1bpp
+
+Copy1bpp::
+; copy c 1bpp tiles from b:de to hl
+
+ push de
+ ld d, h
+ ld e, l
+
+; bank
+ ld a, b
+
+; bc = c * $10 / 2
+ push af
+ ld h, 0
+ ld l, c
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ ld b, h
+ ld c, l
+ pop af
+
+ pop hl
+ jp FarCopyBytesDouble
--- a/home/handshake.asm
+++ /dev/null
@@ -1,41 +1,0 @@
-PrinterReceive::
- homecall _PrinterReceive
- ret
-
-AskSerial::
-; send out a handshake while serial int is off
- ld a, [wPrinterConnectionOpen]
- bit 0, a
- ret z
-
-; if we're still interpreting data, don't try to receive
- ld a, [wPrinterOpcode]
- and a
- ret nz
-
-; once every 6 frames
- ld hl, wHandshakeFrameDelay
- inc [hl]
- ld a, [hl]
- cp 6
- ret c
-
- xor a
- ld [hl], a
-
- ld a, 12
- ld [wPrinterOpcode], a
-
-; handshake
- ld a, $88
- ldh [rSB], a
-
-; switch to internal clock
- ld a, (0 << rSC_ON) | (1 << rSC_CLOCK)
- ldh [rSC], a
-
-; start transfer
- ld a, (1 << rSC_ON) | (1 << rSC_CLOCK)
- ldh [rSC], a
-
- ret
--- /dev/null
+++ b/home/header.asm
@@ -1,0 +1,66 @@
+; rst vectors (called through the rst instruction)
+
+SECTION "rst0", ROM0[$0000]
+ di
+ jp Start
+
+SECTION "rst8", ROM0[$0008] ; rst FarCall
+ jp FarCall_hl
+
+SECTION "rst10", ROM0[$0010] ; rst Bankswitch
+ ldh [hROMBank], a
+ ld [MBC3RomBank], a
+ ret
+
+SECTION "rst18", ROM0[$0018]
+ rst $38
+
+SECTION "rst20", ROM0[$0020]
+ rst $38
+
+SECTION "rst28", ROM0[$0028] ; rst JumpTable
+ push de
+ ld e, a
+ ld d, 0
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+; SECTION "rst30", ROM0[$0030]
+ ld l, a
+ pop de
+ jp hl
+
+SECTION "rst38", ROM0[$0038]
+ rst $38
+
+
+; Game Boy hardware interrupts
+
+SECTION "vblank", ROM0[$0040]
+ jp VBlank
+
+SECTION "lcd", ROM0[$0048]
+ jp LCD
+
+SECTION "timer", ROM0[$0050]
+ jp Timer
+
+SECTION "serial", ROM0[$0058]
+ jp Serial
+
+SECTION "joypad", ROM0[$0060]
+ jp Joypad
+
+
+; Game Boy cartridge header
+
+SECTION "Header", ROM0[$0100]
+
+Start::
+ nop
+ jp _Start
+
+; The cartridge header data is filled in by rgbfix.
+; This makes sure it doesn't get used.
+ ds $0150 - @
--- a/home/hp_pals.asm
+++ /dev/null
@@ -1,17 +1,0 @@
-SetHPPal::
-; Set palette for hp bar pixel length e at hl.
- call GetHPPal
- ld [hl], d
- ret
-
-GetHPPal::
-; Get palette for hp bar pixel length e in d.
- ld d, HP_GREEN
- ld a, e
- cp (HP_BAR_LENGTH_PX * 50 / 100) ; 24
- ret nc
- inc d ; HP_YELLOW
- cp (HP_BAR_LENGTH_PX * 21 / 100) ; 10
- ret nc
- inc d ; HP_RED
- ret
--- a/home/interrupts.asm
+++ /dev/null
@@ -1,16 +1,0 @@
-; Game Boy hardware interrupts
-
-SECTION "vblank", ROM0
- jp VBlank
-
-SECTION "lcd", ROM0
- jp LCD
-
-SECTION "timer", ROM0
- jp Timer
-
-SECTION "serial", ROM0
- jp Serial
-
-SECTION "joypad", ROM0
- jp JoypadInt
--- a/home/joypad.asm
+++ b/home/joypad.asm
@@ -1,4 +1,4 @@
-JoypadInt::
+Joypad::
; Replaced by Joypad, called from VBlank instead of the useless
; joypad interrupt.
@@ -13,7 +13,7 @@
ldh [hJoyDown], a
ret
-Joypad::
+UpdateJoypad::
; This is called automatically every frame in VBlank.
; Read the joypad register and translate it to something more
; workable for use in-game. There are 8 buttons, so we can use
--- a/home/map.asm
+++ b/home/map.asm
@@ -2277,3 +2277,12 @@
pop bc
pop hl
ret
+
+InexplicablyEmptyFunction::
+; unused
+; Inexplicably empty.
+; Seen in PredefPointers.
+rept 16
+ nop
+endr
+ ret
--- a/home/math.asm
+++ b/home/math.asm
@@ -1,13 +1,3 @@
-AddNTimes::
-; Add bc * a to hl.
- and a
- ret z
-.loop
- add hl, bc
- dec a
- jr nz, .loop
- ret
-
SimpleMultiply::
; Return a * c.
and a
--- a/home/menu.asm
+++ b/home/menu.asm
@@ -60,3 +60,784 @@
ld l, a
ld [hl], " "
ret
+
+PushWindow::
+ callfar _PushWindow
+ ret
+
+ExitMenu::
+ push af
+ callfar _ExitMenu
+ pop af
+ ret
+
+InitVerticalMenuCursor::
+ callfar _InitVerticalMenuCursor
+ ret
+
+CloseWindow::
+ push af
+ call ExitMenu
+ call ApplyTilemap
+ call UpdateSprites
+ pop af
+ ret
+
+RestoreTileBackup::
+ call MenuBoxCoord2Tile
+ call .copy
+ call MenuBoxCoord2Attr
+ call .copy
+ ret
+
+.copy
+ call GetMenuBoxDims
+ inc b
+ inc c
+
+.row
+ push bc
+ push hl
+
+.col
+ ld a, [de]
+ ld [hli], a
+ dec de
+ dec c
+ jr nz, .col
+
+ pop hl
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .row
+
+ ret
+
+PopWindow::
+ ld b, $10
+ ld de, wMenuFlags
+.loop
+ ld a, [hld]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .loop
+ ret
+
+GetMenuBoxDims::
+ ld a, [wMenuBorderTopCoord] ; top
+ ld b, a
+ ld a, [wMenuBorderBottomCoord] ; bottom
+ sub b
+ ld b, a
+ ld a, [wMenuBorderLeftCoord] ; left
+ ld c, a
+ ld a, [wMenuBorderRightCoord] ; right
+ sub c
+ ld c, a
+ ret
+
+CopyMenuData::
+ push hl
+ push de
+ push bc
+ push af
+ ld hl, wMenuDataPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, wMenuDataFlags
+ ld bc, wMenuDataEnd - wMenuDataFlags
+ call CopyBytes
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+
+GetWindowStackTop::
+ ld hl, wWindowStackPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ inc hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+PlaceVerticalMenuItems::
+ call CopyMenuData
+ ld hl, wMenuDataPointer
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ call GetMenuTextStartCoord
+ call Coord2Tile ; hl now contains the tilemap address where we will start printing text.
+ inc de
+ ld a, [de] ; Number of items
+ inc de
+ ld b, a
+.loop
+ push bc
+ call PlaceString
+ inc de
+ ld bc, 2 * SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .loop
+
+ ld a, [wMenuDataFlags]
+ bit 4, a
+ ret z
+
+ call MenuBoxCoord2Tile
+ ld a, [de]
+ ld c, a
+ inc de
+ ld b, $0
+ add hl, bc
+ jp PlaceString
+
+MenuBox::
+ call MenuBoxCoord2Tile
+ call GetMenuBoxDims
+ dec b
+ dec c
+ jp Textbox
+
+GetMenuTextStartCoord::
+ ld a, [wMenuBorderTopCoord]
+ ld b, a
+ inc b
+ ld a, [wMenuBorderLeftCoord]
+ ld c, a
+ inc c
+; bit 6: if not set, leave extra room on top
+ ld a, [wMenuDataFlags]
+ bit 6, a
+ jr nz, .bit_6_set
+ inc b
+
+.bit_6_set
+; bit 7: if set, leave extra room on the left
+ ld a, [wMenuDataFlags]
+ bit 7, a
+ jr z, .bit_7_clear
+ inc c
+
+.bit_7_clear
+ ret
+
+ClearMenuBoxInterior::
+ call MenuBoxCoord2Tile
+ ld bc, SCREEN_WIDTH + 1
+ add hl, bc
+ call GetMenuBoxDims
+ dec b
+ dec c
+ call ClearBox
+ ret
+
+ClearWholeMenuBox::
+ call MenuBoxCoord2Tile
+ call GetMenuBoxDims
+ inc c
+ inc b
+ call ClearBox
+ ret
+
+MenuBoxCoord2Tile::
+ ld a, [wMenuBorderLeftCoord]
+ ld c, a
+ ld a, [wMenuBorderTopCoord]
+ ld b, a
+
+Coord2Tile::
+; Return the address of wTilemap(c, b) in hl.
+ xor a
+ ld h, a
+ ld l, b
+ ld a, c
+ ld b, h
+ ld c, l
+ add hl, hl
+ add hl, hl
+ add hl, bc
+ add hl, hl
+ add hl, hl
+ ld c, a
+ xor a
+ ld b, a
+ add hl, bc
+ bccoord 0, 0
+ add hl, bc
+ ret
+
+MenuBoxCoord2Attr::
+ ld a, [wMenuBorderLeftCoord]
+ ld c, a
+ ld a, [wMenuBorderTopCoord]
+ ld b, a
+
+Coord2Attr::
+; Return the address of wAttrmap(c, b) in hl.
+ xor a
+ ld h, a
+ ld l, b
+ ld a, c
+ ld b, h
+ ld c, l
+ add hl, hl
+ add hl, hl
+ add hl, bc
+ add hl, hl
+ add hl, hl
+ ld c, a
+ xor a
+ ld b, a
+ add hl, bc
+ bccoord 0, 0, wAttrmap
+ add hl, bc
+ ret
+
+LoadMenuHeader::
+ call CopyMenuHeader
+ call PushWindow
+ ret
+
+CopyMenuHeader::
+ ld de, wMenuHeader
+ ld bc, wMenuHeaderEnd - wMenuHeader
+ call CopyBytes
+ ldh a, [hROMBank]
+ ld [wMenuDataBank], a
+ ret
+
+StoreTo_wMenuCursorBuffer::
+ ld [wMenuCursorBuffer], a
+ ret
+
+MenuTextbox::
+ push hl
+ call LoadMenuTextbox
+ pop hl
+ jp PrintText
+
+; unused
+ ret
+
+LoadMenuTextbox::
+ ld hl, .MenuHeader
+ call LoadMenuHeader
+ ret
+
+.MenuHeader:
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 0, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
+ dw vTiles0
+ db 0 ; default option
+
+MenuTextboxBackup::
+ call MenuTextbox
+ call CloseWindow
+ ret
+
+LoadStandardMenuHeader::
+ ld hl, .MenuHeader
+ call LoadMenuHeader
+ ret
+
+.MenuHeader:
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
+ dw 0
+ db 1 ; default option
+
+Call_ExitMenu::
+ call ExitMenu
+ ret
+
+VerticalMenu::
+ xor a
+ ldh [hBGMapMode], a
+ call MenuBox
+ call UpdateSprites
+ call PlaceVerticalMenuItems
+ call ApplyTilemap
+ call CopyMenuData
+ ld a, [wMenuDataFlags]
+ bit 7, a
+ jr z, .cancel
+ call InitVerticalMenuCursor
+ call StaticMenuJoypad
+ call MenuClickSound
+ bit 1, a
+ jr z, .okay
+.cancel
+ scf
+ ret
+
+.okay
+ and a
+ ret
+
+GetMenu2::
+ call LoadMenuHeader
+ call VerticalMenu
+ call CloseWindow
+ ld a, [wMenuCursorY]
+ ret
+
+CopyNameFromMenu::
+ push hl
+ push bc
+ push af
+ ld hl, wMenuDataPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ inc hl
+ inc hl
+ pop af
+ call GetNthString
+ ld d, h
+ ld e, l
+ call CopyName1
+ pop bc
+ pop hl
+ ret
+
+YesNoBox::
+ lb bc, SCREEN_WIDTH - 6, 7
+
+PlaceYesNoBox::
+ jr _YesNoBox
+
+PlaceGenericTwoOptionBox::
+ call LoadMenuHeader
+ jr InterpretTwoOptionMenu
+
+_YesNoBox::
+; Return nc (yes) or c (no).
+ push bc
+ ld hl, YesNoMenuHeader
+ call CopyMenuHeader
+ pop bc
+; This seems to be an overflow prevention, but
+; it was coded wrong.
+ ld a, b
+ cp SCREEN_WIDTH - 6
+ jr nz, .okay ; should this be "jr nc"?
+ ld a, SCREEN_WIDTH - 6
+ ld b, a
+
+.okay
+ ld a, b
+ ld [wMenuBorderLeftCoord], a
+ add 5
+ ld [wMenuBorderRightCoord], a
+ ld a, c
+ ld [wMenuBorderTopCoord], a
+ add 4
+ ld [wMenuBorderBottomCoord], a
+ call PushWindow
+
+InterpretTwoOptionMenu::
+ call VerticalMenu
+ push af
+ ld c, $f
+ call DelayFrames
+ call CloseWindow
+ pop af
+ jr c, .no
+ ld a, [wMenuCursorY]
+ cp 2 ; no
+ jr z, .no
+ and a
+ ret
+
+.no
+ ld a, 2
+ ld [wMenuCursorY], a
+ scf
+ ret
+
+YesNoMenuHeader::
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 10, 5, 15, 9
+ dw .MenuData
+ db 1 ; default option
+
+.MenuData:
+ db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
+ db 2
+ db "YES@"
+ db "NO@"
+
+OffsetMenuHeader::
+ call _OffsetMenuHeader
+ call PushWindow
+ ret
+
+_OffsetMenuHeader::
+ push de
+ call CopyMenuHeader
+ pop de
+ ld a, [wMenuBorderLeftCoord]
+ ld h, a
+ ld a, [wMenuBorderRightCoord]
+ sub h
+ ld h, a
+ ld a, d
+ ld [wMenuBorderLeftCoord], a
+ add h
+ ld [wMenuBorderRightCoord], a
+ ld a, [wMenuBorderTopCoord]
+ ld l, a
+ ld a, [wMenuBorderBottomCoord]
+ sub l
+ ld l, a
+ ld a, e
+ ld [wMenuBorderTopCoord], a
+ add l
+ ld [wMenuBorderBottomCoord], a
+ ret
+
+DoNthMenu::
+ call DrawVariableLengthMenuBox
+ call MenuWriteText
+ call InitMenuCursorAndButtonPermissions
+ call GetStaticMenuJoypad
+ call GetMenuJoypad
+ call MenuClickSound
+ ret
+
+SetUpMenu::
+ call DrawVariableLengthMenuBox ; ???
+ call MenuWriteText
+ call InitMenuCursorAndButtonPermissions ; set up selection pointer
+ ld hl, w2DMenuFlags1
+ set 7, [hl]
+ ret
+
+DrawVariableLengthMenuBox::
+ call CopyMenuData
+ call GetMenuIndexSet
+ call AutomaticGetMenuBottomCoord
+ call MenuBox
+ ret
+
+MenuWriteText::
+ xor a
+ ldh [hBGMapMode], a
+ call GetMenuIndexSet ; sort out the text
+ call RunMenuItemPrintingFunction ; actually write it
+ call SafeUpdateSprites
+ ldh a, [hOAMUpdate]
+ push af
+ ld a, $1
+ ldh [hOAMUpdate], a
+ call ApplyTilemap
+ pop af
+ ldh [hOAMUpdate], a
+ ret
+
+AutomaticGetMenuBottomCoord::
+ ld a, [wMenuBorderLeftCoord]
+ ld c, a
+ ld a, [wMenuBorderRightCoord]
+ sub c
+ ld c, a
+ ld a, [wMenuDataItems]
+ add a
+ inc a
+ ld b, a
+ ld a, [wMenuBorderTopCoord]
+ add b
+ ld [wMenuBorderBottomCoord], a
+ ret
+
+GetMenuIndexSet::
+ ld hl, wMenuDataIndicesPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wWhichIndexSet]
+ and a
+ jr z, .skip
+ ld b, a
+ ld c, -1
+.loop
+ ld a, [hli]
+ cp c
+ jr nz, .loop
+ dec b
+ jr nz, .loop
+
+.skip
+ ld d, h
+ ld e, l
+ ld a, [hl]
+ ld [wMenuDataItems], a
+ ret
+
+RunMenuItemPrintingFunction::
+ call MenuBoxCoord2Tile
+ ld bc, 2 * SCREEN_WIDTH + 2
+ add hl, bc
+.loop
+ inc de
+ ld a, [de]
+ cp -1
+ ret z
+ ld [wMenuSelection], a
+ push de
+ push hl
+ ld d, h
+ ld e, l
+ ld hl, wMenuDataDisplayFunctionPointer
+ call ._hl_
+ pop hl
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ pop de
+ jr .loop
+
+._hl_
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+InitMenuCursorAndButtonPermissions::
+ call InitVerticalMenuCursor
+ ld hl, wMenuJoypadFilter
+ ld a, [wMenuDataFlags]
+ bit 3, a
+ jr z, .disallow_select
+ set START_F, [hl]
+
+.disallow_select
+ ld a, [wMenuDataFlags]
+ bit 2, a
+ jr z, .disallow_left_right
+ set D_LEFT_F, [hl]
+ set D_RIGHT_F, [hl]
+
+.disallow_left_right
+ ret
+
+GetScrollingMenuJoypad::
+ call ScrollingMenuJoypad
+ ld hl, wMenuJoypadFilter
+ and [hl]
+ jr ContinueGettingMenuJoypad
+
+GetStaticMenuJoypad::
+ xor a
+ ld [wMenuJoypad], a
+ call StaticMenuJoypad
+
+ContinueGettingMenuJoypad:
+ bit A_BUTTON_F, a
+ jr nz, .a_button
+ bit B_BUTTON_F, a
+ jr nz, .b_start
+ bit START_F, a
+ jr nz, .b_start
+ bit D_RIGHT_F, a
+ jr nz, .d_right
+ bit D_LEFT_F, a
+ jr nz, .d_left
+ xor a
+ ld [wMenuJoypad], a
+ jr .done
+
+.d_right
+ ld a, D_RIGHT
+ ld [wMenuJoypad], a
+ jr .done
+
+.d_left
+ ld a, D_LEFT
+ ld [wMenuJoypad], a
+ jr .done
+
+.a_button
+ ld a, A_BUTTON
+ ld [wMenuJoypad], a
+
+.done
+ call GetMenuIndexSet
+ ld a, [wMenuCursorY]
+ ld l, a
+ ld h, $0
+ add hl, de
+ ld a, [hl]
+ ld [wMenuSelection], a
+ ld a, [wMenuCursorY]
+ ld [wMenuCursorBuffer], a
+ and a
+ ret
+
+.b_start
+ ld a, B_BUTTON
+ ld [wMenuJoypad], a
+ ld a, -1
+ ld [wMenuSelection], a
+ scf
+ ret
+
+PlaceMenuStrings::
+ push de
+ ld hl, wMenuDataPointerTableAddr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wMenuSelection]
+ call GetNthString
+ ld d, h
+ ld e, l
+ pop hl
+ call PlaceString
+ ret
+
+PlaceNthMenuStrings::
+ push de
+ ld a, [wMenuSelection]
+ call GetMenuDataPointerTableEntry
+ inc hl
+ inc hl
+ ld a, [hli]
+ ld d, [hl]
+ ld e, a
+ pop hl
+ call PlaceString
+ ret
+
+Unreferenced_Function1f9e::
+ call GetMenuDataPointerTableEntry
+ inc hl
+ inc hl
+ ld a, [hli]
+ ld d, [hl]
+ ld e, a
+ ret
+
+MenuJumptable::
+ ld a, [wMenuSelection]
+ call GetMenuDataPointerTableEntry
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+GetMenuDataPointerTableEntry::
+ ld e, a
+ ld d, $0
+ ld hl, wMenuDataPointerTableAddr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ add hl, de
+ add hl, de
+ add hl, de
+ add hl, de
+ ret
+
+ClearWindowData::
+ ld hl, wWindowStackPointer
+ call .bytefill
+ ld hl, wMenuHeader
+ call .bytefill
+ ld hl, wMenuDataFlags
+ call .bytefill
+ ld hl, w2DMenuCursorInitY
+ call .bytefill
+
+ ldh a, [rSVBK]
+ push af
+ ld a, BANK(wWindowStack)
+ ldh [rSVBK], a
+
+ xor a
+ ld hl, wWindowStackBottom
+ ld [hld], a
+ ld [hld], a
+ ld a, l
+ ld [wWindowStackPointer], a
+ ld a, h
+ ld [wWindowStackPointer + 1], a
+
+ pop af
+ ldh [rSVBK], a
+ ret
+
+.bytefill
+ ld bc, $10
+ xor a
+ call ByteFill
+ ret
+
+MenuClickSound::
+ push af
+ and A_BUTTON | B_BUTTON
+ jr z, .nosound
+ ld hl, wMenuFlags
+ bit 3, [hl]
+ jr nz, .nosound
+ call PlayClickSFX
+.nosound
+ pop af
+ ret
+
+PlayClickSFX::
+ push de
+ ld de, SFX_READ_TEXT_2
+ call PlaySFX
+ pop de
+ ret
+
+MenuTextboxWaitButton::
+ call MenuTextbox
+ call WaitButton
+ call ExitMenu
+ ret
+
+Place2DMenuItemName::
+ ldh [hBuffer], a
+ ldh a, [hROMBank]
+ push af
+ ldh a, [hBuffer]
+ rst Bankswitch
+
+ call PlaceString
+ pop af
+ rst Bankswitch
+
+ ret
+
+_2DMenu::
+ ldh a, [hROMBank]
+ ld [wMenuData_2DMenuItemStringsBank], a
+ farcall _2DMenu_
+ ld a, [wMenuCursorBuffer]
+ ret
+
+InterpretBattleMenu::
+ ldh a, [hROMBank]
+ ld [wMenuData_2DMenuItemStringsBank], a
+ farcall _InterpretBattleMenu
+ ld a, [wMenuCursorBuffer]
+ ret
+
+InterpretMobileMenu::
+ ldh a, [hROMBank]
+ ld [wMenuData_2DMenuItemStringsBank], a
+ farcall _InterpretMobileMenu
+ ld a, [wMenuCursorBuffer]
+ ret
--- a/home/menu2.asm
+++ /dev/null
@@ -1,539 +1,0 @@
-; Functions used in displaying and handling menus.
-
-LoadMenuHeader::
- call CopyMenuHeader
- call PushWindow
- ret
-
-CopyMenuHeader::
- ld de, wMenuHeader
- ld bc, wMenuHeaderEnd - wMenuHeader
- call CopyBytes
- ldh a, [hROMBank]
- ld [wMenuDataBank], a
- ret
-
-StoreTo_wMenuCursorBuffer::
- ld [wMenuCursorBuffer], a
- ret
-
-MenuTextbox::
- push hl
- call LoadMenuTextbox
- pop hl
- jp PrintText
-
-; unused
- ret
-
-LoadMenuTextbox::
- ld hl, .MenuHeader
- call LoadMenuHeader
- ret
-
-.MenuHeader:
- db MENU_BACKUP_TILES ; flags
- menu_coords 0, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
- dw vTiles0
- db 0 ; default option
-
-MenuTextboxBackup::
- call MenuTextbox
- call CloseWindow
- ret
-
-LoadStandardMenuHeader::
- ld hl, .MenuHeader
- call LoadMenuHeader
- ret
-
-.MenuHeader:
- db MENU_BACKUP_TILES ; flags
- menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
- dw 0
- db 1 ; default option
-
-Call_ExitMenu::
- call ExitMenu
- ret
-
-VerticalMenu::
- xor a
- ldh [hBGMapMode], a
- call MenuBox
- call UpdateSprites
- call PlaceVerticalMenuItems
- call ApplyTilemap
- call CopyMenuData
- ld a, [wMenuDataFlags]
- bit 7, a
- jr z, .cancel
- call InitVerticalMenuCursor
- call StaticMenuJoypad
- call MenuClickSound
- bit 1, a
- jr z, .okay
-.cancel
- scf
- ret
-
-.okay
- and a
- ret
-
-GetMenu2::
- call LoadMenuHeader
- call VerticalMenu
- call CloseWindow
- ld a, [wMenuCursorY]
- ret
-
-CopyNameFromMenu::
- push hl
- push bc
- push af
- ld hl, wMenuDataPointer
- ld a, [hli]
- ld h, [hl]
- ld l, a
- inc hl
- inc hl
- pop af
- call GetNthString
- ld d, h
- ld e, l
- call CopyName1
- pop bc
- pop hl
- ret
-
-YesNoBox::
- lb bc, SCREEN_WIDTH - 6, 7
-
-PlaceYesNoBox::
- jr _YesNoBox
-
-PlaceGenericTwoOptionBox::
- call LoadMenuHeader
- jr InterpretTwoOptionMenu
-
-_YesNoBox::
-; Return nc (yes) or c (no).
- push bc
- ld hl, YesNoMenuHeader
- call CopyMenuHeader
- pop bc
-; This seems to be an overflow prevention, but
-; it was coded wrong.
- ld a, b
- cp SCREEN_WIDTH - 6
- jr nz, .okay ; should this be "jr nc"?
- ld a, SCREEN_WIDTH - 6
- ld b, a
-
-.okay
- ld a, b
- ld [wMenuBorderLeftCoord], a
- add 5
- ld [wMenuBorderRightCoord], a
- ld a, c
- ld [wMenuBorderTopCoord], a
- add 4
- ld [wMenuBorderBottomCoord], a
- call PushWindow
-
-InterpretTwoOptionMenu::
- call VerticalMenu
- push af
- ld c, $f
- call DelayFrames
- call CloseWindow
- pop af
- jr c, .no
- ld a, [wMenuCursorY]
- cp 2 ; no
- jr z, .no
- and a
- ret
-
-.no
- ld a, 2
- ld [wMenuCursorY], a
- scf
- ret
-
-YesNoMenuHeader::
- db MENU_BACKUP_TILES ; flags
- menu_coords 10, 5, 15, 9
- dw .MenuData
- db 1 ; default option
-
-.MenuData:
- db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
- db 2
- db "YES@"
- db "NO@"
-
-OffsetMenuHeader::
- call _OffsetMenuHeader
- call PushWindow
- ret
-
-_OffsetMenuHeader::
- push de
- call CopyMenuHeader
- pop de
- ld a, [wMenuBorderLeftCoord]
- ld h, a
- ld a, [wMenuBorderRightCoord]
- sub h
- ld h, a
- ld a, d
- ld [wMenuBorderLeftCoord], a
- add h
- ld [wMenuBorderRightCoord], a
- ld a, [wMenuBorderTopCoord]
- ld l, a
- ld a, [wMenuBorderBottomCoord]
- sub l
- ld l, a
- ld a, e
- ld [wMenuBorderTopCoord], a
- add l
- ld [wMenuBorderBottomCoord], a
- ret
-
-DoNthMenu::
- call DrawVariableLengthMenuBox
- call MenuWriteText
- call InitMenuCursorAndButtonPermissions
- call GetStaticMenuJoypad
- call GetMenuJoypad
- call MenuClickSound
- ret
-
-SetUpMenu::
- call DrawVariableLengthMenuBox ; ???
- call MenuWriteText
- call InitMenuCursorAndButtonPermissions ; set up selection pointer
- ld hl, w2DMenuFlags1
- set 7, [hl]
- ret
-
-DrawVariableLengthMenuBox::
- call CopyMenuData
- call GetMenuIndexSet
- call AutomaticGetMenuBottomCoord
- call MenuBox
- ret
-
-MenuWriteText::
- xor a
- ldh [hBGMapMode], a
- call GetMenuIndexSet ; sort out the text
- call RunMenuItemPrintingFunction ; actually write it
- call SafeUpdateSprites
- ldh a, [hOAMUpdate]
- push af
- ld a, $1
- ldh [hOAMUpdate], a
- call ApplyTilemap
- pop af
- ldh [hOAMUpdate], a
- ret
-
-AutomaticGetMenuBottomCoord::
- ld a, [wMenuBorderLeftCoord]
- ld c, a
- ld a, [wMenuBorderRightCoord]
- sub c
- ld c, a
- ld a, [wMenuDataItems]
- add a
- inc a
- ld b, a
- ld a, [wMenuBorderTopCoord]
- add b
- ld [wMenuBorderBottomCoord], a
- ret
-
-GetMenuIndexSet::
- ld hl, wMenuDataIndicesPointer
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, [wWhichIndexSet]
- and a
- jr z, .skip
- ld b, a
- ld c, -1
-.loop
- ld a, [hli]
- cp c
- jr nz, .loop
- dec b
- jr nz, .loop
-
-.skip
- ld d, h
- ld e, l
- ld a, [hl]
- ld [wMenuDataItems], a
- ret
-
-RunMenuItemPrintingFunction::
- call MenuBoxCoord2Tile
- ld bc, 2 * SCREEN_WIDTH + 2
- add hl, bc
-.loop
- inc de
- ld a, [de]
- cp -1
- ret z
- ld [wMenuSelection], a
- push de
- push hl
- ld d, h
- ld e, l
- ld hl, wMenuDataDisplayFunctionPointer
- call ._hl_
- pop hl
- ld de, 2 * SCREEN_WIDTH
- add hl, de
- pop de
- jr .loop
-
-._hl_
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jp hl
-
-InitMenuCursorAndButtonPermissions::
- call InitVerticalMenuCursor
- ld hl, wMenuJoypadFilter
- ld a, [wMenuDataFlags]
- bit 3, a
- jr z, .disallow_select
- set START_F, [hl]
-
-.disallow_select
- ld a, [wMenuDataFlags]
- bit 2, a
- jr z, .disallow_left_right
- set D_LEFT_F, [hl]
- set D_RIGHT_F, [hl]
-
-.disallow_left_right
- ret
-
-GetScrollingMenuJoypad::
- call ScrollingMenuJoypad
- ld hl, wMenuJoypadFilter
- and [hl]
- jr ContinueGettingMenuJoypad
-
-GetStaticMenuJoypad::
- xor a
- ld [wMenuJoypad], a
- call StaticMenuJoypad
-
-ContinueGettingMenuJoypad:
- bit A_BUTTON_F, a
- jr nz, .a_button
- bit B_BUTTON_F, a
- jr nz, .b_start
- bit START_F, a
- jr nz, .b_start
- bit D_RIGHT_F, a
- jr nz, .d_right
- bit D_LEFT_F, a
- jr nz, .d_left
- xor a
- ld [wMenuJoypad], a
- jr .done
-
-.d_right
- ld a, D_RIGHT
- ld [wMenuJoypad], a
- jr .done
-
-.d_left
- ld a, D_LEFT
- ld [wMenuJoypad], a
- jr .done
-
-.a_button
- ld a, A_BUTTON
- ld [wMenuJoypad], a
-
-.done
- call GetMenuIndexSet
- ld a, [wMenuCursorY]
- ld l, a
- ld h, $0
- add hl, de
- ld a, [hl]
- ld [wMenuSelection], a
- ld a, [wMenuCursorY]
- ld [wMenuCursorBuffer], a
- and a
- ret
-
-.b_start
- ld a, B_BUTTON
- ld [wMenuJoypad], a
- ld a, -1
- ld [wMenuSelection], a
- scf
- ret
-
-PlaceMenuStrings::
- push de
- ld hl, wMenuDataPointerTableAddr
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, [wMenuSelection]
- call GetNthString
- ld d, h
- ld e, l
- pop hl
- call PlaceString
- ret
-
-PlaceNthMenuStrings::
- push de
- ld a, [wMenuSelection]
- call GetMenuDataPointerTableEntry
- inc hl
- inc hl
- ld a, [hli]
- ld d, [hl]
- ld e, a
- pop hl
- call PlaceString
- ret
-
-Unreferenced_Function1f9e::
- call GetMenuDataPointerTableEntry
- inc hl
- inc hl
- ld a, [hli]
- ld d, [hl]
- ld e, a
- ret
-
-MenuJumptable::
- ld a, [wMenuSelection]
- call GetMenuDataPointerTableEntry
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jp hl
-
-GetMenuDataPointerTableEntry::
- ld e, a
- ld d, $0
- ld hl, wMenuDataPointerTableAddr
- ld a, [hli]
- ld h, [hl]
- ld l, a
- add hl, de
- add hl, de
- add hl, de
- add hl, de
- ret
-
-ClearWindowData::
- ld hl, wWindowStackPointer
- call .bytefill
- ld hl, wMenuHeader
- call .bytefill
- ld hl, wMenuDataFlags
- call .bytefill
- ld hl, w2DMenuCursorInitY
- call .bytefill
-
- ldh a, [rSVBK]
- push af
- ld a, BANK(wWindowStack)
- ldh [rSVBK], a
-
- xor a
- ld hl, wWindowStackBottom
- ld [hld], a
- ld [hld], a
- ld a, l
- ld [wWindowStackPointer], a
- ld a, h
- ld [wWindowStackPointer + 1], a
-
- pop af
- ldh [rSVBK], a
- ret
-
-.bytefill
- ld bc, $10
- xor a
- call ByteFill
- ret
-
-MenuClickSound::
- push af
- and A_BUTTON | B_BUTTON
- jr z, .nosound
- ld hl, wMenuFlags
- bit 3, [hl]
- jr nz, .nosound
- call PlayClickSFX
-.nosound
- pop af
- ret
-
-PlayClickSFX::
- push de
- ld de, SFX_READ_TEXT_2
- call PlaySFX
- pop de
- ret
-
-MenuTextboxWaitButton::
- call MenuTextbox
- call WaitButton
- call ExitMenu
- ret
-
-Place2DMenuItemName::
- ldh [hBuffer], a
- ldh a, [hROMBank]
- push af
- ldh a, [hBuffer]
- rst Bankswitch
-
- call PlaceString
- pop af
- rst Bankswitch
-
- ret
-
-_2DMenu::
- ldh a, [hROMBank]
- ld [wMenuData_2DMenuItemStringsBank], a
- farcall _2DMenu_
- ld a, [wMenuCursorBuffer]
- ret
-
-InterpretBattleMenu::
- ldh a, [hROMBank]
- ld [wMenuData_2DMenuItemStringsBank], a
- farcall _InterpretBattleMenu
- ld a, [wMenuCursorBuffer]
- ret
-
-InterpretMobileMenu::
- ldh a, [hROMBank]
- ld [wMenuData_2DMenuItemStringsBank], a
- farcall _InterpretMobileMenu
- ld a, [wMenuCursorBuffer]
- ret
--- a/home/menu_window.asm
+++ /dev/null
@@ -1,242 +1,0 @@
-PushWindow::
- callfar _PushWindow
- ret
-
-ExitMenu::
- push af
- callfar _ExitMenu
- pop af
- ret
-
-InitVerticalMenuCursor::
- callfar _InitVerticalMenuCursor
- ret
-
-CloseWindow::
- push af
- call ExitMenu
- call ApplyTilemap
- call UpdateSprites
- pop af
- ret
-
-RestoreTileBackup::
- call MenuBoxCoord2Tile
- call .copy
- call MenuBoxCoord2Attr
- call .copy
- ret
-
-.copy
- call GetMenuBoxDims
- inc b
- inc c
-
-.row
- push bc
- push hl
-
-.col
- ld a, [de]
- ld [hli], a
- dec de
- dec c
- jr nz, .col
-
- pop hl
- ld bc, SCREEN_WIDTH
- add hl, bc
- pop bc
- dec b
- jr nz, .row
-
- ret
-
-PopWindow::
- ld b, $10
- ld de, wMenuFlags
-.loop
- ld a, [hld]
- ld [de], a
- inc de
- dec b
- jr nz, .loop
- ret
-
-GetMenuBoxDims::
- ld a, [wMenuBorderTopCoord] ; top
- ld b, a
- ld a, [wMenuBorderBottomCoord] ; bottom
- sub b
- ld b, a
- ld a, [wMenuBorderLeftCoord] ; left
- ld c, a
- ld a, [wMenuBorderRightCoord] ; right
- sub c
- ld c, a
- ret
-
-CopyMenuData::
- push hl
- push de
- push bc
- push af
- ld hl, wMenuDataPointer
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld de, wMenuDataFlags
- ld bc, wMenuDataEnd - wMenuDataFlags
- call CopyBytes
- pop af
- pop bc
- pop de
- pop hl
- ret
-
-GetWindowStackTop::
- ld hl, wWindowStackPointer
- ld a, [hli]
- ld h, [hl]
- ld l, a
- inc hl
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ret
-
-PlaceVerticalMenuItems::
- call CopyMenuData
- ld hl, wMenuDataPointer
- ld e, [hl]
- inc hl
- ld d, [hl]
- call GetMenuTextStartCoord
- call Coord2Tile ; hl now contains the tilemap address where we will start printing text.
- inc de
- ld a, [de] ; Number of items
- inc de
- ld b, a
-.loop
- push bc
- call PlaceString
- inc de
- ld bc, 2 * SCREEN_WIDTH
- add hl, bc
- pop bc
- dec b
- jr nz, .loop
-
- ld a, [wMenuDataFlags]
- bit 4, a
- ret z
-
- call MenuBoxCoord2Tile
- ld a, [de]
- ld c, a
- inc de
- ld b, $0
- add hl, bc
- jp PlaceString
-
-MenuBox::
- call MenuBoxCoord2Tile
- call GetMenuBoxDims
- dec b
- dec c
- jp Textbox
-
-GetMenuTextStartCoord::
- ld a, [wMenuBorderTopCoord]
- ld b, a
- inc b
- ld a, [wMenuBorderLeftCoord]
- ld c, a
- inc c
-; bit 6: if not set, leave extra room on top
- ld a, [wMenuDataFlags]
- bit 6, a
- jr nz, .bit_6_set
- inc b
-
-.bit_6_set
-; bit 7: if set, leave extra room on the left
- ld a, [wMenuDataFlags]
- bit 7, a
- jr z, .bit_7_clear
- inc c
-
-.bit_7_clear
- ret
-
-ClearMenuBoxInterior::
- call MenuBoxCoord2Tile
- ld bc, SCREEN_WIDTH + 1
- add hl, bc
- call GetMenuBoxDims
- dec b
- dec c
- call ClearBox
- ret
-
-ClearWholeMenuBox::
- call MenuBoxCoord2Tile
- call GetMenuBoxDims
- inc c
- inc b
- call ClearBox
- ret
-
-MenuBoxCoord2Tile::
- ld a, [wMenuBorderLeftCoord]
- ld c, a
- ld a, [wMenuBorderTopCoord]
- ld b, a
-
-Coord2Tile::
-; Return the address of wTilemap(c, b) in hl.
- xor a
- ld h, a
- ld l, b
- ld a, c
- ld b, h
- ld c, l
- add hl, hl
- add hl, hl
- add hl, bc
- add hl, hl
- add hl, hl
- ld c, a
- xor a
- ld b, a
- add hl, bc
- bccoord 0, 0
- add hl, bc
- ret
-
-MenuBoxCoord2Attr::
- ld a, [wMenuBorderLeftCoord]
- ld c, a
- ld a, [wMenuBorderTopCoord]
- ld b, a
-
-Coord2Attr::
-; Return the address of wAttrmap(c, b) in hl.
- xor a
- ld h, a
- ld l, b
- ld a, c
- ld b, h
- ld c, l
- add hl, hl
- add hl, hl
- add hl, bc
- add hl, hl
- add hl, hl
- ld c, a
- xor a
- ld b, a
- add hl, bc
- bccoord 0, 0, wAttrmap
- add hl, bc
- ret
--- a/home/mon_data.asm
+++ /dev/null
@@ -1,87 +1,0 @@
-Unreferenced_GetNthMove::
- ld hl, wListMoves_MoveIndicesBuffer
- ld c, a
- ld b, 0
- add hl, bc
- ld a, [hl]
- ret
-
-GetBaseData::
- push bc
- push de
- push hl
- ldh a, [hROMBank]
- push af
- ld a, BANK(BaseData)
- rst Bankswitch
-
-; Egg doesn't have BaseData
- ld a, [wCurSpecies]
- cp EGG
- jr z, .egg
-
-; Get BaseData
- dec a
- ld bc, BASE_DATA_SIZE
- ld hl, BaseData
- call AddNTimes
- ld de, wCurBaseData
- ld bc, BASE_DATA_SIZE
- call CopyBytes
- jr .end
-
-.egg
- ld de, UnknownEggPic
-
-; Sprite dimensions
- ld b, $55 ; 5x5
- ld hl, wBasePicSize
- ld [hl], b
-
-; Beta front and back sprites
-; (see pokegold-spaceworld's data/pokemon/base_stats/*)
- ld hl, wBaseUnusedFrontpic
- ld [hl], e
- inc hl
- ld [hl], d
- inc hl
- ld [hl], e
- inc hl
- ld [hl], d
- jr .end ; useless
-
-.end
-; Replace Pokedex # with species
- ld a, [wCurSpecies]
- ld [wBaseDexNo], a
-
- pop af
- rst Bankswitch
- pop hl
- pop de
- pop bc
- ret
-
-GetCurNick::
- ld a, [wCurPartyMon]
- ld hl, wPartyMonNicknames
-
-GetNick::
-; Get nickname a from list hl.
-
- push hl
- push bc
-
- call SkipNames
- ld de, wStringBuffer1
-
- push de
- ld bc, MON_NAME_LENGTH
- call CopyBytes
- pop de
-
- callfar CorrectNickErrors
-
- pop bc
- pop hl
- ret
--- a/home/mon_data_2.asm
+++ /dev/null
@@ -1,34 +1,0 @@
-GetPartyParamLocation::
-; Get the location of parameter a from wCurPartyMon in hl
- push bc
- ld hl, wPartyMons
- ld c, a
- ld b, 0
- add hl, bc
- ld a, [wCurPartyMon]
- call GetPartyLocation
- pop bc
- ret
-
-GetPartyLocation::
-; Add the length of a PartyMon struct to hl a times.
- ld bc, PARTYMON_STRUCT_LENGTH
- jp AddNTimes
-
-Unreferenced_GetDexNumber::
-; Probably used in gen 1 to convert index number to dex number
-; Not required in gen 2 because index number == dex number
- push hl
- ld a, b
- dec a
- ld b, 0
- add hl, bc
- ld hl, BaseData + BASE_DEX_NO
- ld bc, BASE_DATA_SIZE
- call AddNTimes
- ld a, BANK(BaseData)
- call GetFarHalfword
- ld b, l
- ld c, h
- pop hl
- ret
--- a/home/mon_stats.asm
+++ /dev/null
@@ -1,104 +1,0 @@
-IsAPokemon::
-; Return carry if species a is not a Pokemon.
- and a
- jr z, .NotAPokemon
- cp EGG
- jr z, .Pokemon
- cp NUM_POKEMON + 1
- jr c, .Pokemon
-
-.NotAPokemon:
- scf
- ret
-
-.Pokemon:
- and a
- ret
-
-DrawBattleHPBar::
-; Draw an HP bar d tiles long at hl
-; Fill it up to e pixels
-
- push hl
- push de
- push bc
-
-; Place 'HP:'
- ld a, $60
- ld [hli], a
- ld a, $61
- ld [hli], a
-
-; Draw a template
- push hl
- ld a, $62 ; empty bar
-.template
- ld [hli], a
- dec d
- jr nz, .template
- ld a, $6b ; bar end
- add b
- ld [hl], a
- pop hl
-
-; Safety check # pixels
- ld a, e
- and a
- jr nz, .fill
- ld a, c
- and a
- jr z, .done
- ld e, 1
-
-.fill
-; Keep drawing tiles until pixel length is reached
- ld a, e
- sub TILE_WIDTH
- jr c, .lastbar
-
- ld e, a
- ld a, $6a ; full bar
- ld [hli], a
- ld a, e
- and a
- jr z, .done
- jr .fill
-
-.lastbar
- ld a, $62 ; empty bar
- add e ; + e
- ld [hl], a
-
-.done
- pop bc
- pop de
- pop hl
- ret
-
-PrepMonFrontpic::
- ld a, $1
- ld [wBoxAlignment], a
-
-_PrepMonFrontpic::
- ld a, [wCurPartySpecies]
- call IsAPokemon
- jr c, .not_pokemon
-
- push hl
- ld de, vTiles2
- predef GetMonFrontpic
- pop hl
- xor a
- ldh [hGraphicStartTile], a
- lb bc, 7, 7
- predef PlaceGraphic
- xor a
- ld [wBoxAlignment], a
- ret
-
-.not_pokemon
- xor a
- ld [wBoxAlignment], a
- inc a
- ld [wCurPartySpecies], a
- ret
--- a/home/pokedex_flags.asm
+++ b/home/pokedex_flags.asm
@@ -1,3 +1,35 @@
+CountSetBits::
+; Count the number of set bits in b bytes starting from hl.
+; Return in a, c and [wNumSetBits].
+ ld c, 0
+.next
+ ld a, [hli]
+ ld e, a
+ ld d, 8
+
+.count
+ srl e
+ ld a, 0
+ adc c
+ ld c, a
+ dec d
+ jr nz, .count
+
+ dec b
+ jr nz, .next
+
+ ld a, c
+ ld [wNumSetBits], a
+ ret
+
+GetWeekday::
+ ld a, [wCurDay]
+.mod
+ sub 7
+ jr nc, .mod
+ add 7
+ ret
+
SetSeenAndCaughtMon::
push af
ld c, a
--- /dev/null
+++ b/home/pokemon.asm
@@ -1,0 +1,323 @@
+IsAPokemon::
+; Return carry if species a is not a Pokemon.
+ and a
+ jr z, .NotAPokemon
+ cp EGG
+ jr z, .Pokemon
+ cp NUM_POKEMON + 1
+ jr c, .Pokemon
+
+.NotAPokemon:
+ scf
+ ret
+
+.Pokemon:
+ and a
+ ret
+
+DrawBattleHPBar::
+; Draw an HP bar d tiles long at hl
+; Fill it up to e pixels
+
+ push hl
+ push de
+ push bc
+
+; Place 'HP:'
+ ld a, $60
+ ld [hli], a
+ ld a, $61
+ ld [hli], a
+
+; Draw a template
+ push hl
+ ld a, $62 ; empty bar
+.template
+ ld [hli], a
+ dec d
+ jr nz, .template
+ ld a, $6b ; bar end
+ add b
+ ld [hl], a
+ pop hl
+
+; Safety check # pixels
+ ld a, e
+ and a
+ jr nz, .fill
+ ld a, c
+ and a
+ jr z, .done
+ ld e, 1
+
+.fill
+; Keep drawing tiles until pixel length is reached
+ ld a, e
+ sub TILE_WIDTH
+ jr c, .lastbar
+
+ ld e, a
+ ld a, $6a ; full bar
+ ld [hli], a
+ ld a, e
+ and a
+ jr z, .done
+ jr .fill
+
+.lastbar
+ ld a, $62 ; empty bar
+ add e ; + e
+ ld [hl], a
+
+.done
+ pop bc
+ pop de
+ pop hl
+ ret
+
+PrepMonFrontpic::
+ ld a, $1
+ ld [wBoxAlignment], a
+
+_PrepMonFrontpic::
+ ld a, [wCurPartySpecies]
+ call IsAPokemon
+ jr c, .not_pokemon
+
+ push hl
+ ld de, vTiles2
+ predef GetMonFrontpic
+ pop hl
+ xor a
+ ldh [hGraphicStartTile], a
+ lb bc, 7, 7
+ predef PlaceGraphic
+ xor a
+ ld [wBoxAlignment], a
+ ret
+
+.not_pokemon
+ xor a
+ ld [wBoxAlignment], a
+ inc a
+ ld [wCurPartySpecies], a
+ ret
+
+PlayStereoCry::
+ push af
+ ld a, 1
+ ld [wStereoPanningMask], a
+ pop af
+ call _PlayMonCry
+ call WaitSFX
+ ret
+
+PlayStereoCry2::
+; Don't wait for the cry to end.
+; Used during pic animations.
+ push af
+ ld a, 1
+ ld [wStereoPanningMask], a
+ pop af
+ jp _PlayMonCry
+
+PlayMonCry::
+ call PlayMonCry2
+ call WaitSFX
+ ret
+
+PlayMonCry2::
+; Don't wait for the cry to end.
+ push af
+ xor a
+ ld [wStereoPanningMask], a
+ ld [wCryTracks], a
+ pop af
+ call _PlayMonCry
+ ret
+
+_PlayMonCry::
+ push hl
+ push de
+ push bc
+
+ call GetCryIndex
+ jr c, .done
+
+ ld e, c
+ ld d, b
+ call PlayCry
+
+.done
+ pop bc
+ pop de
+ pop hl
+ ret
+
+LoadCry::
+; Load cry bc.
+
+ call GetCryIndex
+ ret c
+
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(PokemonCries)
+ rst Bankswitch
+
+ ld hl, PokemonCries
+rept 6 ; sizeof(mon_cry)
+ add hl, bc
+endr
+
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc hl
+
+ ld a, [hli]
+ ld [wCryPitch], a
+ ld a, [hli]
+ ld [wCryPitch + 1], a
+ ld a, [hli]
+ ld [wCryLength], a
+ ld a, [hl]
+ ld [wCryLength + 1], a
+
+ pop af
+ rst Bankswitch
+ and a
+ ret
+
+GetCryIndex::
+ and a
+ jr z, .no
+ cp NUM_POKEMON + 1
+ jr nc, .no
+
+ dec a
+ ld c, a
+ ld b, 0
+ and a
+ ret
+
+.no
+ scf
+ ret
+
+PrintLevel::
+; Print wTempMonLevel at hl
+
+ ld a, [wTempMonLevel]
+ ld [hl], "<LV>"
+ inc hl
+
+; How many digits?
+ ld c, 2
+ cp 100 ; This is distinct from MAX_LEVEL.
+ jr c, Print8BitNumLeftAlign
+
+; 3-digit numbers overwrite the :L.
+ dec hl
+ inc c
+ jr Print8BitNumLeftAlign
+
+PrintLevel_Force3Digits::
+; Print :L and all 3 digits
+ ld [hl], "<LV>"
+ inc hl
+ ld c, 3
+
+Print8BitNumLeftAlign::
+ ld [wDeciramBuffer], a
+ ld de, wDeciramBuffer
+ ld b, PRINTNUM_LEFTALIGN | 1
+ jp PrintNum
+
+Unreferenced_GetNthMove::
+ ld hl, wListMoves_MoveIndicesBuffer
+ ld c, a
+ ld b, 0
+ add hl, bc
+ ld a, [hl]
+ ret
+
+GetBaseData::
+ push bc
+ push de
+ push hl
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(BaseData)
+ rst Bankswitch
+
+; Egg doesn't have BaseData
+ ld a, [wCurSpecies]
+ cp EGG
+ jr z, .egg
+
+; Get BaseData
+ dec a
+ ld bc, BASE_DATA_SIZE
+ ld hl, BaseData
+ call AddNTimes
+ ld de, wCurBaseData
+ ld bc, BASE_DATA_SIZE
+ call CopyBytes
+ jr .end
+
+.egg
+ ld de, UnknownEggPic
+
+; Sprite dimensions
+ ld b, $55 ; 5x5
+ ld hl, wBasePicSize
+ ld [hl], b
+
+; Beta front and back sprites
+; (see pokegold-spaceworld's data/pokemon/base_stats/*)
+ ld hl, wBaseUnusedFrontpic
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ inc hl
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ jr .end ; useless
+
+.end
+; Replace Pokedex # with species
+ ld a, [wCurSpecies]
+ ld [wBaseDexNo], a
+
+ pop af
+ rst Bankswitch
+ pop hl
+ pop de
+ pop bc
+ ret
+
+GetCurNick::
+ ld a, [wCurPartyMon]
+ ld hl, wPartyMonNicknames
+
+GetNick::
+; Get nickname a from list hl.
+
+ push hl
+ push bc
+
+ call SkipNames
+ ld de, wStringBuffer1
+
+ push de
+ ld bc, MON_NAME_LENGTH
+ call CopyBytes
+ pop de
+
+ callfar CorrectNickErrors
+
+ pop bc
+ pop hl
+ ret
--- a/home/print_level.asm
+++ /dev/null
@@ -1,28 +1,0 @@
-PrintLevel::
-; Print wTempMonLevel at hl
-
- ld a, [wTempMonLevel]
- ld [hl], "<LV>"
- inc hl
-
-; How many digits?
- ld c, 2
- cp 100 ; This is distinct from MAX_LEVEL.
- jr c, Print8BitNumLeftAlign
-
-; 3-digit numbers overwrite the :L.
- dec hl
- inc c
- jr Print8BitNumLeftAlign
-
-PrintLevel_Force3Digits::
-; Print :L and all 3 digits
- ld [hl], "<LV>"
- inc hl
- ld c, 3
-
-Print8BitNumLeftAlign::
- ld [wDeciramBuffer], a
- ld de, wDeciramBuffer
- ld b, PRINTNUM_LEFTALIGN | 1
- jp PrintNum
--- a/home/print_text.asm
+++ b/home/print_text.asm
@@ -118,3 +118,20 @@
pop af
rst Bankswitch
ret
+
+CallPointerAt::
+ ldh a, [hROMBank]
+ push af
+ ld a, [hli]
+ rst Bankswitch
+
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+ call _hl_
+
+ pop hl
+ ld a, h
+ rst Bankswitch
+ ret
--- /dev/null
+++ b/home/printer.asm
@@ -1,0 +1,41 @@
+PrinterReceive::
+ homecall _PrinterReceive
+ ret
+
+AskSerial::
+; send out a handshake while serial int is off
+ ld a, [wPrinterConnectionOpen]
+ bit 0, a
+ ret z
+
+; if we're still interpreting data, don't try to receive
+ ld a, [wPrinterOpcode]
+ and a
+ ret nz
+
+; once every 6 frames
+ ld hl, wHandshakeFrameDelay
+ inc [hl]
+ ld a, [hl]
+ cp 6
+ ret c
+
+ xor a
+ ld [hl], a
+
+ ld a, 12
+ ld [wPrinterOpcode], a
+
+; handshake
+ ld a, $88
+ ldh [rSB], a
+
+; switch to internal clock
+ ld a, (0 << rSC_ON) | (1 << rSC_CLOCK)
+ ldh [rSC], a
+
+; start transfer
+ ld a, (1 << rSC_ON) | (1 << rSC_CLOCK)
+ ldh [rSC], a
+
+ ret
--- a/home/region.asm
+++ b/home/region.asm
@@ -30,3 +30,6 @@
.Kanto:
ld a, 1
ret
+
+ret_2f3e::
+ ret
--- a/home/rst.asm
+++ /dev/null
@@ -1,35 +1,0 @@
-; rst vectors
-
-SECTION "rst0", ROM0
- di
- jp Start
-
-SECTION "rst8", ROM0 ; rst FarCall
- jp FarCall_hl
-
-SECTION "rst10", ROM0 ; rst Bankswitch
- ldh [hROMBank], a
- ld [MBC3RomBank], a
- ret
-
-SECTION "rst18", ROM0
- rst $38
-
-SECTION "rst20", ROM0
- rst $38
-
-SECTION "rst28", ROM0 ; rst JumpTable
- push de
- ld e, a
- ld d, 0
- add hl, de
- add hl, de
- ld a, [hli]
- ld h, [hl]
-; SECTION "rst30", ROM0
- ld l, a
- pop de
- jp hl
-
-SECTION "rst38", ROM0
- rst $38
--- a/home/rtc.asm
+++ /dev/null
@@ -1,22 +1,0 @@
-UpdateTimeAndPals::
-; update time and time-sensitive palettes
-
-; rtc enabled?
- ld a, [wSpriteUpdatesEnabled]
- cp 0
- ret z
-
- call UpdateTime
-
-; obj update on?
- ld a, [wVramState]
- bit 0, a ; obj update
- ret z
-
-TimeOfDayPals::
- callfar _TimeOfDayPals
- ret
-
-UpdateTimePals::
- callfar _UpdateTimePals
- ret
--- a/home/sprite_anims.asm
+++ b/home/sprite_anims.asm
@@ -1,22 +1,3 @@
-PushLYOverrides::
- ldh a, [hLCDCPointer]
- and a
- ret z
-
- ld a, LOW(wLYOverridesBackup)
- ld [wRequested2bppSource], a
- ld a, HIGH(wLYOverridesBackup)
- ld [wRequested2bppSource + 1], a
-
- ld a, LOW(wLYOverrides)
- ld [wRequested2bppDest], a
- ld a, HIGH(wLYOverrides)
- ld [wRequested2bppDest + 1], a
-
- ld a, (wLYOverridesEnd - wLYOverrides) / 16
- ld [wRequested2bpp], a
- ret
-
InitSpriteAnimStruct::
ld [wSpriteAnimIDBuffer], a
ldh a, [hROMBank]
--- a/home/tilemap.asm
+++ b/home/tilemap.asm
@@ -216,3 +216,21 @@
.sgb
predef_jump LoadSGBLayout
+
+SetHPPal::
+; Set palette for hp bar pixel length e at hl.
+ call GetHPPal
+ ld [hl], d
+ ret
+
+GetHPPal::
+; Get palette for hp bar pixel length e in d.
+ ld d, HP_GREEN
+ ld a, e
+ cp (HP_BAR_LENGTH_PX * 50 / 100) ; 24
+ ret nc
+ inc d ; HP_YELLOW
+ cp (HP_BAR_LENGTH_PX * 21 / 100) ; 10
+ ret nc
+ inc d ; HP_RED
+ ret
--- /dev/null
+++ b/home/time_palettes.asm
@@ -1,0 +1,22 @@
+UpdateTimeAndPals::
+; update time and time-sensitive palettes
+
+; rtc enabled?
+ ld a, [wSpriteUpdatesEnabled]
+ cp 0
+ ret z
+
+ call UpdateTime
+
+; obj update on?
+ ld a, [wVramState]
+ bit 0, a ; obj update
+ ret z
+
+TimeOfDayPals::
+ callfar _TimeOfDayPals
+ ret
+
+UpdateTimePals::
+ callfar _UpdateTimePals
+ ret
--- a/home/vblank.asm
+++ b/home/vblank.asm
@@ -131,7 +131,7 @@
ld [wTextDelayFrames], a
.ok2
- call Joypad
+ call UpdateJoypad
ld a, BANK(_UpdateSound)
rst Bankswitch
@@ -325,7 +325,7 @@
call hTransferVirtualOAM
- call Joypad
+ call UpdateJoypad
xor a
ld [wVBlankOccurred], a
@@ -364,7 +364,7 @@
xor a
ld [wVBlankOccurred], a
- call Joypad
+ call UpdateJoypad
xor a
ldh [rIF], a