Merge pull request #687 from mid-kid/master

Small home/ reorganization
This commit is contained in:
Rangi 2020-02-23 14:16:26 -05:00 committed by GitHub
commit ef1c4c5a81
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 1887 additions and 1895 deletions

174
home.asm
View File

@ -1,30 +1,16 @@
INCLUDE "constants.asm"
SECTION "NULL", ROM0
NULL::
INCLUDE "home/rst.asm"
INCLUDE "home/interrupts.asm"
SECTION "Header", ROM0
Start::
nop
jp _Start
INCLUDE "home/header.asm"
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,189 +18,45 @@ INCLUDE "home/serial.asm"
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"
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"

44
home/array.asm Normal file
View File

@ -0,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

View File

@ -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]
@ -224,3 +259,22 @@ GetBattleAnimByte::
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

8
home/call_regs.asm Normal file
View File

@ -0,0 +1,8 @@
; Register aliases
_hl_::
jp hl
_de_::
push de
ret

View File

@ -1,391 +1,131 @@
; 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::
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
ldh a, [hBGMapMode]
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
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
; copy a byte from [de] to [hl]
ld a, [de]
ld [hli], a
.done
ld a, c
and $7f ; pretty silly, considering at most bits 0-2 would be set
ldh [hDMATransfer], a
call DelayFrame
; retrieve the previous value of [hl]; put it in [de]
pop af
rst Bankswitch
ld [de], a
inc de
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
; handle loop stuff
dec bc
ld a, b
call FarDecompress
pop bc
pop hl
ld de, sScratch
call Request2bpp
call CloseSRAM
or c
jr nz, .Loop
ret
FarCopyBytes::
; copy bc bytes from a:hl to de
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
rst Bankswitch
ldh [rSVBK], a
ret
FarCopyBytesDouble::
; Copy bc bytes from a:hl to bc*2 bytes at de,
; doubling each byte in the process.
GetFarWRAMByte::
ldh [hBuffer], a
ldh a, [hROMBank]
ldh a, [rSVBK]
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
ldh [rSVBK], a
ld a, [hl]
ldh [hBuffer], a
pop af
rst Bankswitch
ldh [rSVBK], a
ldh a, [hBuffer]
ret
Request2bpp::
; Load 2bpp at b:de to occupy c tiles of hl.
ldh a, [hBGMapMode]
GetFarWRAMWord::
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 [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
ldh a, [hBuffer]
ldh [rSVBK], a
ld a, [hli]
ld h, [hl]
ld l, a
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]
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

View File

@ -1,131 +0,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

View File

@ -1,101 +0,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

View File

@ -101,3 +101,30 @@ CheckReceivedDex::
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

391
home/gfx.asm Normal file
View File

@ -0,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

66
home/header.asm Normal file
View File

@ -0,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 - @

View File

@ -1,17 +0,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

View File

@ -1,16 +0,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

View File

@ -1,4 +1,4 @@
JoypadInt::
Joypad::
; Replaced by Joypad, called from VBlank instead of the useless
; joypad interrupt.
@ -13,7 +13,7 @@ ClearJoypad::
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

View File

@ -2277,3 +2277,12 @@ LoadMapTileset::
pop bc
pop hl
ret
InexplicablyEmptyFunction::
; unused
; Inexplicably empty.
; Seen in PredefPointers.
rept 16
nop
endr
ret

View File

@ -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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,242 +0,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

View File

@ -1,87 +0,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

View File

@ -1,34 +0,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

Some files were not shown because too many files have changed in this diff Show More