diff --git a/patches/ips/map_area.ips b/patches/ips/map_area.ips index 072e1cceb..92c3ae557 100644 Binary files a/patches/ips/map_area.ips and b/patches/ips/map_area.ips differ diff --git a/patches/ips/split_speed.ips b/patches/ips/split_speed.ips index 555e573b1..b8ec5a14e 100644 Binary files a/patches/ips/split_speed.ips and b/patches/ips/split_speed.ips differ diff --git a/patches/rom_map/Bank 82.txt b/patches/rom_map/Bank 82.txt index 0a3866fda..b27e301d2 100644 --- a/patches/rom_map/Bank 82.txt +++ b/patches/rom_map/Bank 82.txt @@ -16,7 +16,7 @@ FE00 - FE70: load_plms_early.asm FE70 - FE80: fast_reload.asm FE80 - FF00: zebes_asleep_music.asm FF00 - FF20: reserve_hud.asm -FF20 - FF30: [FREE] +FF20 - FF30: split_speed.asm FF30 - FF80: reserve_hud.asm FF80 - FFFA: pause_menu_objectives.asm FFFA - FFFC: room name/map_area diff --git a/patches/rom_map/Bank 90.txt b/patches/rom_map/Bank 90.txt index 848cf8b83..0da5f2293 100644 --- a/patches/rom_map/Bank 90.txt +++ b/patches/rom_map/Bank 90.txt @@ -9,4 +9,4 @@ $FA00 - $FC00: map_progress_maintain.asm (list of cross-area tiles to reveal) $FC00 - $FC10: Fake Lava.asm $FC10 - $FC20: vanilla_bugfixes.asm $FC20 - $FC40: remove_spikesuit.asm -$FC40 - $FCC0: split_speed.asm \ No newline at end of file +$FC40 - $FCE0: split_speed.asm \ No newline at end of file diff --git a/patches/rom_map/Bank B6.txt b/patches/rom_map/Bank B6.txt index 32cd45820..102f4cc7d 100644 --- a/patches/rom_map/Bank B6.txt +++ b/patches/rom_map/Bank B6.txt @@ -1,4 +1,6 @@ F200-F660: pause_menu_objectives.asm -F660-FE60: [FREE] +F660-FC00: [FREE] +FC00-FE00: split_speed.asm +FE00-FE60: [FREE] FE60-FE80: disable_etanks.asm FE80-FFFF: map_area.asm diff --git a/patches/src/map_area.asm b/patches/src/map_area.asm index 47b3d9b4a..ac033bf36 100644 --- a/patches/src/map_area.asm +++ b/patches/src/map_area.asm @@ -258,7 +258,7 @@ dw $3C33, $3C46, org $8291F9 jsr load_map_screen_wrapper -org $8291D0 +org $8291B1 jsr load_equipment_screen_wrapper ;;; Put new code in free space at end of bank $82: @@ -276,7 +276,7 @@ load_map_screen_wrapper: load_equipment_screen_wrapper: jsl load_equipment_screen - rts + jmp $AB47 load_area_wrapper: jsl load_area @@ -564,9 +564,6 @@ load_map_screen: rtl load_equipment_screen: - ; run hi-jacked instruction: - sta $0725 - ; Fix color used for pink doors on map screen lda #$6E7A sta $7EC0CE @@ -617,9 +614,11 @@ load_equipment_screen: lda #$6000 sta $4315 ; transfer size = $6000 bytes + php sep #$30 lda #$02 sta $420B ; perform DMA transfer on channel 1 + plp rtl load_target_palette_hook: diff --git a/patches/src/split_speed.asm b/patches/src/split_speed.asm index 065eb8abd..6d2f5cd3d 100644 --- a/patches/src/split_speed.asm +++ b/patches/src/split_speed.asm @@ -1,9 +1,15 @@ !bank_90_free_space_start = $90FC40 -!bank_90_free_space_end = $90FCC0 +!bank_90_free_space_end = $90FCE0 !bank_91_free_space_start = $91F7F4 !bank_91_free_space_end = $91F88C +!bank_82_free_space_start = $82FF20 +!bank_82_free_space_end = $82FF30 + +!bank_B6_free_space_start = $B6FC00 +!bank_B6_free_space_end = $B6FE00 + !equipped_items = $09A2 !fake_shinecharge = $7EF597 @@ -13,6 +19,34 @@ !speed_booster = $2000 !any_booster = !blue_booster|!spark_booster|!speed_booster +; Fine. Hijack the ENTIRE THING. +org $8291D0 + jsr hook_setup_speedbooster_menu_tile_wrapper + +org $82B5AE + jsr hook_equip_enable + +org $82C066 +; Speedbooster bitset + dw !any_booster + +org !bank_82_free_space_start + +hook_setup_speedbooster_menu_tile_wrapper: + sta $0725 ; run hi-jacked instruction + jsl hook_setup_speedbooster_menu_tile + rts + +hook_equip_enable: + ; X = equipment bitmask + ; Y = equipment bitset + ; A = loaded with previously equipped items + ora $0000,x ; Hijacked code (sets the bitmask) + and $0002,y ; AND with collected items + rts + +warnpc !bank_82_free_space_end + ; Accelerate Samus' animation with any booster item: org $908502 bit #!any_booster @@ -194,4 +228,92 @@ hook_update_speed_echoes: lda $0b3e ; run hi-jacked instruction rts +hook_setup_speedbooster_menu_tile: + php + + rep #$30 + lda $09A4 + and #!any_booster + beq .no ; No boosters + bit #!speed_booster + bne .no ; Full speedbooster + + cmp #!blue_booster|!spark_booster + beq .no ; Blue+Spark = Speed + + ; Prepare VRAM for copy + ldx #$1240 + stx $2116 + sep #$10 ; X = 8-bit + ldx #$80 ; Auto-increment, 1 word + stx $2115 + + cmp #!blue_booster + beq .blue + + ; Spark booster + jsl $8091A9 + db $01, $01, $18 + dl menu_tiles_spark_booster + dw menu_tiles_spark_booster_end-menu_tiles_spark_booster + + bra .dma + +.blue + jsl $8091A9 + db $01, $01, $18 + dl menu_tiles_blue_booster + dw menu_tiles_blue_booster_end-menu_tiles_blue_booster + +.dma + sep #$30 + lda #$02 + sta $420B ; DMA execute + +.no + plp + rtl +warnpc !bank_90_free_space_end assert pc() <= !bank_90_free_space_end + +org !bank_B6_free_space_start + +menu_tiles_blue_booster: + db $FF, $FF, $FF, $FF, $8D, $FF, $B5, $FF, $8D, $FF, $B5, $FF, $8C, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $DA, $FF, $DA, $FF, $DA, $FF, $DA, $FF, $66, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $1C, $FF, $FD, $FF, $3C, $FF, $FD, $FF, $1C, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $73, $FF, $AD, $FF, $6D, $FF, $AD, $FF, $73, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $9C, $FF, $6B, $FF, $68, $FF, $6F, $FF, $98, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $44, $FF, $ED, $FF, $6C, $FF, $6D, $FF, $EC, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $23, $FF, $ED, $FF, $63, $FF, $ED, $FF, $2D, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF +.end + +menu_tiles_spark_booster: + db $FF, $FF, $FF, $FF, $C4, $FF, $BD, $FF, $84, $FF, $F5, $FF, $8D, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $73, $FF, $AD, $FF, $6D, $FF, $E1, $FF, $ED, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $1B, $FF, $6A, $FF, $19, $FF, $6A, $FF, $6B, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $71, $FF, $F6, $FF, $F1, $FF, $F6, $FF, $71, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $CE, $FF, $B5, $FF, $B5, $FF, $B5, $FF, $CE, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $71, $FF, $AF, $FF, $A1, $FF, $BD, $FF, $63, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $10, $FF, $B7, $FF, $B1, $FF, $B7, $FF, $B0, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF + db $FF, $FF, $FF, $FF, $8F, $FF, $B7, $FF, $8F, $FF, $B7, $FF, $B7, $FF, $FF, $FF + db $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF +.end + +warnpc !bank_B6_free_space_end \ No newline at end of file