387 lines
9.0 KiB
Python
387 lines
9.0 KiB
Python
from ..assembler import ASM
|
|
from .. import utils
|
|
|
|
|
|
def addBank3F(rom):
|
|
# Bank3F is used to initialize the tile data in VRAM:1 at the start of the rom.
|
|
# The normal rom does not use this tile data to maintain GB compatibility.
|
|
rom.patch(0, 0x0150, ASM("""
|
|
cp $11 ; is running on Game Boy Color?
|
|
jr nz, notGBC
|
|
ldh a, [$4d]
|
|
and $80 ; do we need to switch the CPU speed?
|
|
jr nz, speedSwitchDone
|
|
; switch to GBC speed
|
|
ld a, $30
|
|
ldh [$00], a
|
|
ld a, $01
|
|
ldh [$4d], a
|
|
xor a
|
|
ldh [$ff], a
|
|
stop
|
|
db $00
|
|
|
|
speedSwitchDone:
|
|
xor a
|
|
ldh [$70], a
|
|
ld a, $01 ; isGBC = true
|
|
jr Init
|
|
|
|
notGBC:
|
|
xor a ; isGBC = false
|
|
Init:
|
|
"""), ASM("""
|
|
; Check if we are a color gameboy, we require a color version now.
|
|
cp $11
|
|
jr nz, notGBC
|
|
|
|
; Switch to bank $3F to run our custom initializer
|
|
ld a, $3F
|
|
ld [$2100], a
|
|
call $4000
|
|
; Switch back to bank 0 after loading our own initializer
|
|
ld a, $01
|
|
ld [$2100], a
|
|
|
|
; set a to 1 to indicate GBC
|
|
ld a, $01
|
|
jr Init
|
|
notGBC:
|
|
xor a
|
|
Init:
|
|
"""), fill_nop=True)
|
|
|
|
rom.patch(0x3F, 0x0000, None, ASM("""
|
|
; switch speed
|
|
ld a, $30
|
|
ldh [$00], a
|
|
ld a, $01
|
|
ldh [$4d], a
|
|
xor a
|
|
ldh [$ff], a
|
|
stop
|
|
db $00
|
|
|
|
; Switch VRAM bank
|
|
ld a, $01
|
|
ldh [$4F], a
|
|
|
|
call $28CF ; display off
|
|
|
|
; Use the GBC DMA to transfer our tile data
|
|
ld a, $68
|
|
ldh [$51], a
|
|
ld a, $00
|
|
ldh [$52], a
|
|
|
|
ld a, $80
|
|
ldh [$53], a
|
|
ld a, $00
|
|
ldh [$54], a
|
|
|
|
ld a, $7F
|
|
ldh [$55], a
|
|
|
|
waitTillTransferDone:
|
|
ldh a, [$55]
|
|
and $80
|
|
jr z, waitTillTransferDone
|
|
|
|
ld a, $70
|
|
ldh [$51], a
|
|
ld a, $00
|
|
ldh [$52], a
|
|
|
|
ld a, $88
|
|
ldh [$53], a
|
|
ld a, $00
|
|
ldh [$54], a
|
|
|
|
ld a, $7F
|
|
ldh [$55], a
|
|
|
|
waitTillTransferDone2:
|
|
ldh a, [$55]
|
|
and $80
|
|
jr z, waitTillTransferDone2
|
|
|
|
ld a, $68
|
|
ldh [$51], a
|
|
ld a, $00
|
|
ldh [$52], a
|
|
|
|
ld a, $90
|
|
ldh [$53], a
|
|
ld a, $00
|
|
ldh [$54], a
|
|
|
|
ld a, $7F
|
|
ldh [$55], a
|
|
|
|
waitTillTransferDone3:
|
|
ldh a, [$55]
|
|
and $80
|
|
jr z, waitTillTransferDone3
|
|
|
|
; Switch VRAM bank back
|
|
ld a, $00
|
|
ldh [$4F], a
|
|
|
|
; Switch the display back on, else the later code hangs
|
|
ld a, $80
|
|
ldh [$40], a
|
|
|
|
speedSwitchDone:
|
|
xor a
|
|
ldh [$70], a
|
|
|
|
; Check if we are running on a bad emulator
|
|
ldh [$02], a
|
|
ldh a, [$02]
|
|
and $7c
|
|
cp $7c
|
|
jr nz, badEmu
|
|
|
|
; Enable the timer to run 32 times per second
|
|
xor a
|
|
ldh [$06], a
|
|
ld a, $04
|
|
ldh [$07], a
|
|
|
|
; Set SB to $FF to indicate we have no data from hardware
|
|
ld a, $FF
|
|
ldh [$01], a
|
|
ret
|
|
badEmu:
|
|
xor a
|
|
ldh [$40], a ; switch display off
|
|
; Load some palette
|
|
ld a, $80
|
|
ldh [$68], a
|
|
xor a
|
|
ldh [$69], a
|
|
ldh [$69], a
|
|
ldh [$69], a
|
|
ldh [$69], a
|
|
|
|
; Load a different gfx tile for the first gfx
|
|
cpl
|
|
ld hl, $8000
|
|
ld c, $10
|
|
.loop:
|
|
ldi [hl], a
|
|
dec c
|
|
jr nz, .loop
|
|
|
|
ld a, $01
|
|
ld [$9800], a
|
|
ld [$9820], a
|
|
ld [$9840], a
|
|
ld [$9860], a
|
|
ld [$9880], a
|
|
|
|
ld [$9801], a
|
|
ld [$9841], a
|
|
ld [$9881], a
|
|
|
|
ld [$9822], a
|
|
ld [$9862], a
|
|
|
|
ld [$9824], a
|
|
ld [$9844], a
|
|
ld [$9864], a
|
|
ld [$9884], a
|
|
|
|
ld [$9805], a
|
|
ld [$9845], a
|
|
|
|
ld [$9826], a
|
|
ld [$9846], a
|
|
ld [$9866], a
|
|
ld [$9886], a
|
|
|
|
ld [$9808], a
|
|
ld [$9828], a
|
|
ld [$9848], a
|
|
ld [$9868], a
|
|
ld [$9888], a
|
|
|
|
ld [$9809], a
|
|
ld [$9889], a
|
|
|
|
ld [$982A], a
|
|
ld [$984A], a
|
|
ld [$986A], a
|
|
|
|
ld [$9900], a
|
|
ld [$9920], a
|
|
ld [$9940], a
|
|
ld [$9960], a
|
|
ld [$9980], a
|
|
|
|
ld [$9901], a
|
|
ld [$9941], a
|
|
ld [$9981], a
|
|
|
|
ld [$9903], a
|
|
ld [$9923], a
|
|
ld [$9943], a
|
|
ld [$9963], a
|
|
ld [$9983], a
|
|
|
|
ld [$9904], a
|
|
ld [$9925], a
|
|
ld [$9906], a
|
|
|
|
ld [$9907], a
|
|
ld [$9927], a
|
|
ld [$9947], a
|
|
ld [$9967], a
|
|
ld [$9987], a
|
|
|
|
ld [$9909], a
|
|
ld [$9929], a
|
|
ld [$9949], a
|
|
ld [$9969], a
|
|
ld [$9989], a
|
|
|
|
ld [$998A], a
|
|
|
|
ld [$990B], a
|
|
ld [$992B], a
|
|
ld [$994B], a
|
|
ld [$996B], a
|
|
ld [$998B], a
|
|
|
|
; lcd on
|
|
ld a, $91
|
|
ldh [$40], a
|
|
blockBadEmu:
|
|
di
|
|
jr blockBadEmu
|
|
|
|
"""))
|
|
|
|
# Copy all normal item graphics
|
|
rom.banks[0x3F][0x2800:0x2B00] = rom.banks[0x2C][0x0800:0x0B00] # main items
|
|
rom.banks[0x3F][0x2B00:0x2C00] = rom.banks[0x2C][0x0C00:0x0D00] # overworld key items
|
|
rom.banks[0x3F][0x2C00:0x2D00] = rom.banks[0x32][0x3D00:0x3E00] # dungeon key items
|
|
# Create ruppee for palettes 0-3
|
|
rom.banks[0x3F][0x2B80:0x2BA0] = rom.banks[0x3F][0x2A60:0x2A80]
|
|
for n in range(0x2B80, 0x2BA0, 2):
|
|
rom.banks[0x3F][n+1] ^= rom.banks[0x3F][n]
|
|
|
|
# Create capacity upgrade arrows
|
|
rom.banks[0x3F][0x2A30:0x2A40] = utils.createTileData("""
|
|
33
|
|
3113
|
|
311113
|
|
33311333
|
|
3113
|
|
3333
|
|
""")
|
|
rom.banks[0x3F][0x2A20:0x2A30] = rom.banks[0x3F][0x2A30:0x2A40]
|
|
for n in range(0x2A20, 0x2A40, 2):
|
|
rom.banks[0x3F][n] |= rom.banks[0x3F][n + 1]
|
|
|
|
# Add the slime key and mushroom which are not in the above sets
|
|
rom.banks[0x3F][0x2CC0:0x2D00] = rom.banks[0x2C][0x28C0:0x2900]
|
|
# Add tunic sprites as well.
|
|
rom.banks[0x3F][0x2C80:0x2CA0] = rom.banks[0x35][0x0F00:0x0F20]
|
|
|
|
# Add the bowwow sprites
|
|
rom.banks[0x3F][0x2D00:0x2E00] = rom.banks[0x2E][0x2400:0x2500]
|
|
|
|
# Zol sprites, so we can have zol anywhere from a chest
|
|
rom.banks[0x3F][0x2E00:0x2E60] = rom.banks[0x2E][0x1120:0x1180]
|
|
# Patch gel(zol) entity to load sprites from the 2nd bank
|
|
rom.patch(0x06, 0x3C09, "5202522254025422" "5200522054005420", "600A602A620A622A" "6008602862086228")
|
|
rom.patch(0x07, 0x329B, "FFFFFFFF" "FFFFFFFF" "54005420" "52005220" "56005600",
|
|
"FFFFFFFF" "FFFFFFFF" "62086228" "60086028" "64086408")
|
|
rom.patch(0x06, 0x3BFA, "56025622", "640A642A");
|
|
|
|
|
|
# Cucco
|
|
rom.banks[0x3F][0x2E80:0x2F00] = rom.banks[0x32][0x2500:0x2580]
|
|
# Patch the cucco graphics to load from 2nd vram bank
|
|
rom.patch(0x05, 0x0514,
|
|
"5001" "5201" "5401" "5601" "5221" "5021" "5621" "5421",
|
|
"6809" "6A09" "6C09" "6E09" "6A29" "6829" "6E29" "6C29")
|
|
# Song symbols
|
|
rom.banks[0x3F][0x2F00:0x2F60] = utils.createTileData("""
|
|
|
|
|
|
...
|
|
. .222
|
|
.2.2222
|
|
.22.222.
|
|
.22222.3
|
|
.2..22.3
|
|
.33...3
|
|
.33.3.3
|
|
..233.3
|
|
.22.2333
|
|
.222.233
|
|
.222...
|
|
...
|
|
""" + """
|
|
|
|
|
|
..
|
|
.22
|
|
.223
|
|
..222
|
|
.33.22
|
|
.3..22
|
|
.33.33
|
|
..23.
|
|
..233.
|
|
.22.333
|
|
.22..233
|
|
.. .23
|
|
..
|
|
""" + """
|
|
|
|
|
|
...
|
|
.222.
|
|
.2.332
|
|
.23.32
|
|
.233.2
|
|
.222222
|
|
.2222222
|
|
.2..22.2
|
|
.2.3.222
|
|
.22...22
|
|
.2333..
|
|
.23333
|
|
.....""", " .23")
|
|
|
|
# Ghost
|
|
rom.banks[0x3F][0x2F60:0x2FE0] = rom.banks[0x32][0x1800:0x1880]
|
|
|
|
# Instruments
|
|
rom.banks[0x3F][0x3000:0x3200] = rom.banks[0x31][0x1000:0x1200]
|
|
# Patch the egg song event to use the 2nd vram sprites
|
|
rom.patch(0x19, 0x0BAC,
|
|
"5006520654065606"
|
|
"58065A065C065E06"
|
|
"6006620664066606"
|
|
"68066A066C066E06",
|
|
"800E820E840E860E"
|
|
"880E8A0E8C0E8E0E"
|
|
"900E920E940E960E"
|
|
"980E9A0E9C0E9E0E"
|
|
)
|
|
|
|
# Rooster
|
|
rom.banks[0x3F][0x3200:0x3300] = rom.banks[0x32][0x1D00:0x1E00]
|
|
rom.patch(0x19, 0x19BC,
|
|
"42234023" "46234423" "40034203" "44034603" "4C034C23" "4E034E23" "48034823" "4A034A23",
|
|
"A22BA02B" "A62BA42B" "A00BA20B" "A40BA60B" "AC0BAC2B" "AE0BAE2B" "A80BA82B" "AA0BAA2B")
|
|
# Replace some main item graphics with the rooster
|
|
rom.banks[0x2C][0x0900:0x0940] = utils.createTileData(utils.tileDataToString(rom.banks[0x32][0x1D00:0x1D40]), " 321")
|
|
|
|
# Trade sequence items
|
|
rom.banks[0x3F][0x3300:0x3640] = rom.banks[0x2C][0x0400:0x0740]
|