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