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