Mega Man 2: Implement New Game (#3256)
* initial (broken) commit * small work on init * Update Items.py * beginning work, some rom patches * commit progress from bh branch * deathlink, fix soft-reset kill, e-tank loss * begin work on targeting new bhclient * write font * definitely didn't forget to add the other two hashes no * update to modern options, begin colors * fix 6th letter bug * palette shuffle + logic rewrite * fix a bunch of pointers * fix color changes, deathlink, and add wily 5 req * adjust weapon weakness generation * Update Rules.py * attempt wily 5 softlock fix * add explicit test for rbm weaknesses * fix difficulty and hard reset * fix connect deathlink and off by one item color * fix atomic fire again * de-jank deathlink * rewrite wily5 rule * fix rare solo-gen fill issue, hopefully * Update Client.py * fix wily 5 requirements * undo fill hook * fix picopico-kun rules * for real this time * update minimum damage requirement * begin move to procedure patch * finish move to APPP, allow rando boobeam, color updates * fix color bug, UT support? * what do you mean I forgot the procedure * fix UT? * plando weakness and fixes * sfx when item received, more time stopper edge cases * Update test_weakness.py * fix rules and color bug * fix color bug, support reduced flashing * major world overhaul * Update Locations.py * fix first found bugs * mypy cleanup * headerless roms * Update Rom.py * further cleanup * work on energylink * el fixes * update to energylink 2.0 packet * energylink balancing * potentially break other clients, more balancing * Update Items.py * remove startup change from basepatch we write that in patch, since we also need to clean the area before applying * el balancing and feedback * hopefully less test failures? * implement world version check * add weapon/health option * Update Rom.py * x/x2 * specials * Update Color.py * Update Options.py * finally apply location groups * bump minor version number instead * fix duplicate stage sends * validate wily 5, tests * see if renaming fixes * add shuffled weakness * remove passwords * refresh rbm select, fix wily 5 validation * forgot we can't check 0 * oops I broke the basepatch (remove failing test later) * fix solo gen fill error? * fix webhost patch recognition * fix imports, basepatch * move to flexibility metric for boss validation * special case boobeam trap * block strobe on stage select init * more energylink balancing * bump world version * wily HP inaccurate in validation * fix validation edge case * save last completed wily to data storage * mypy and pep8 cleanup * fix file browse validation * fix test failure, add enemy weakness * remove test seed * update enemy damage * inno setup * Update en_Mega Man 2.md * setup guide * Update en_Mega Man 2.md * finish plando weakness section * starting rbm edge case * remove * imports * properly wrap later weakness additions in regen playthrough * fix import * forgot readme * remove time stopper special casing since we moved to proper wily 5 validation, this special casing is no longer important * properly type added locations * Update CODEOWNERS * add animation reduction * deprioritize Time Stopper in rush checks * special case wily phase 1 * fix key error * forgot the test * music and general cleanup * the great rename * fix import * thanks pycharm * reorder palette shuffle * account for alien on shuffled weakness * apply suggestions * fix seedbleed * fix invalid buster passthrough * fix weakness landing beneath required amount * fix failsafe * finish music * fix Time Stopper on Flash/Alien * asar pls * Apply suggestions from code review Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> * world helpers * init cleanup * apostrophes * clearer wording * mypy and cleanup * options doc cleanup * Update rom.py * rules cleanup * Update __init__.py * Update __init__.py * move to defaultdict * cleanup world helpers * Update __init__.py * remove unnecessary line from fill hook * forgot the other one * apply code review * remove collect * Update rules.py * forgot another --------- Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
This commit is contained in:
861
worlds/mm2/src/mm2_basepatch.asm
Normal file
861
worlds/mm2/src/mm2_basepatch.asm
Normal file
@@ -0,0 +1,861 @@
|
||||
norom
|
||||
!headersize = 16
|
||||
|
||||
!controller_mirror = $23
|
||||
!controller_flip = $27 ; only on first frame of input, used by crash man, etc
|
||||
!current_stage = $2A
|
||||
!received_stages = $8A
|
||||
!completed_stages = $8B
|
||||
!received_item_checks = $8C
|
||||
!last_wily = $8D
|
||||
!deathlink = $8F
|
||||
!energylink_packet = $90
|
||||
!rbm_strobe = $91
|
||||
!received_weapons = $9A
|
||||
!received_items = $9B
|
||||
!current_weapon = $A9
|
||||
|
||||
!stage_completion = $0F70
|
||||
!consumable_checks = $0F80
|
||||
|
||||
!CONTROLLER_SELECT = #$04
|
||||
!CONTROLLER_SELECT_START = #$0C
|
||||
!CONTROLLER_ALL_BUTTON = #$0F
|
||||
|
||||
!PpuControl_2000 = $2000
|
||||
!PpuMask_2001 = $2001
|
||||
!PpuAddr_2006 = $2006
|
||||
!PpuData_2007 = $2007
|
||||
|
||||
!LOAD_BANK = $C000
|
||||
|
||||
macro org(address,bank)
|
||||
if <bank> == $0F
|
||||
org <address>-$C000+($4000*<bank>)+!headersize ; org sets the position in the output file to write to (in norom, at least)
|
||||
base <address> ; base sets the position that all labels are relative to - this is necessary so labels will still start from $8000, instead of $0000 or somewhere
|
||||
else
|
||||
org <address>-$8000+($4000*<bank>)+!headersize
|
||||
base <address>
|
||||
endif
|
||||
endmacro
|
||||
|
||||
%org($8400, $08)
|
||||
incbin "mm2font.dat"
|
||||
|
||||
%org($A900, $09)
|
||||
incbin "mm2titlefont.dat"
|
||||
|
||||
%org($807E, $0B)
|
||||
FlashFixes:
|
||||
CMP #$FF
|
||||
BEQ FlashFixTarget1
|
||||
CMP #$FF
|
||||
BNE FlashFixTarget2
|
||||
|
||||
%org($8086, $0B)
|
||||
FlashFixTarget1:
|
||||
|
||||
%org($808D, $0B)
|
||||
FlashFixTarget2:
|
||||
|
||||
%org($8015, $0D)
|
||||
ClearRefreshHook:
|
||||
; if we're already doing a fresh load of the stage select
|
||||
; we don't need to immediately refresh it
|
||||
JSR ClearRefresh
|
||||
NOP
|
||||
|
||||
%org($802B, $0D)
|
||||
PatchFaceTiles:
|
||||
LDA !received_stages
|
||||
|
||||
%org($8072, $0D)
|
||||
PatchFaceSprites:
|
||||
LDA !received_stages
|
||||
|
||||
%org($80CC, $0D)
|
||||
CheckItemsForWily:
|
||||
LDA !received_items
|
||||
CMP #$07
|
||||
|
||||
%org($80D2, $0D)
|
||||
LoadWily:
|
||||
JSR GoToMostRecentWily
|
||||
NOP
|
||||
|
||||
%org($80DC, $0D)
|
||||
CheckAccessCodes:
|
||||
LDA !received_stages
|
||||
|
||||
%org($8312, $0D)
|
||||
HookStageSelect:
|
||||
JSR RefreshRBMTiles
|
||||
NOP
|
||||
|
||||
%org($A315, $0D)
|
||||
RemoveWeaponClear:
|
||||
NOP
|
||||
NOP
|
||||
NOP
|
||||
NOP
|
||||
|
||||
;Adjust Password select flasher
|
||||
%org($A32A, $0D)
|
||||
LDX #$68
|
||||
|
||||
;Block password input
|
||||
%org($A346, $0D)
|
||||
EOR #$00
|
||||
|
||||
;Remove password text
|
||||
%org($AF3A, $0D)
|
||||
StartHeight:
|
||||
db $AC ; set Start to center
|
||||
|
||||
%org($AF49, $0D)
|
||||
PasswordText:
|
||||
db $40, $40, $40, $40, $40, $40, $40, $40
|
||||
|
||||
%org($AF6C, $0D)
|
||||
ContinueHeight:
|
||||
db $AB ; split height between 2 remaining options
|
||||
|
||||
%org($AF77, $0D)
|
||||
StageSelectHeight:
|
||||
db $EB ; split between 2 remaining options
|
||||
|
||||
%org($AF88, $0D)
|
||||
GameOverPasswordText:
|
||||
db $40, $40, $40, $40, $40, $40, $40, $40
|
||||
|
||||
%org($AFA5, $0D)
|
||||
GetEquippedPasswordText:
|
||||
db $40, $40, $40, $40, $40, $40, $40, $40
|
||||
|
||||
%org($AFAE, $0D)
|
||||
GetEquippedStageSelect:
|
||||
db $26, $EA
|
||||
|
||||
%org($B195, $0D)
|
||||
GameOverPasswordUp:
|
||||
LDA #$01 ; originally 02, removing last option
|
||||
|
||||
%org($B19F, $0D)
|
||||
GameOverPassword:
|
||||
CMP #$02 ; originally 03, remove the last option
|
||||
|
||||
%org($B1ED, $0D)
|
||||
FixupGameOverArrows:
|
||||
db $68, $78
|
||||
|
||||
%org($BB74, $0D)
|
||||
GetEquippedStage:
|
||||
JSR StageGetEquipped
|
||||
NOP #13
|
||||
|
||||
%org($BBD9, $0D)
|
||||
GetEquippedDefault:
|
||||
LDA #$01
|
||||
|
||||
%org($BC01, $0D)
|
||||
GetEquippedPasswordRemove:
|
||||
ORA #$01 ; originally EOR #$01, we always want 1 here
|
||||
|
||||
%org($BCF1, $0D)
|
||||
GetEquippedItem:
|
||||
ADC #$07
|
||||
JSR ItemGetEquipped
|
||||
JSR LoadItemsColor
|
||||
NOP ; !!!! This is a load-bearing NOP. It gets branched to later in the function
|
||||
LDX $FF
|
||||
|
||||
|
||||
%org($BB08, $0D)
|
||||
WilyProgress:
|
||||
JSR StoreWilyProgress
|
||||
NOP
|
||||
|
||||
%org($BF6F, $0D)
|
||||
GetEquippedStageSelectHeight:
|
||||
db $B8
|
||||
|
||||
%org($805B, $0E)
|
||||
InitalizeStartingRBM:
|
||||
LDA #$FF ; this does two things
|
||||
STA !received_stages ; we're overwriting clearing e-tanks and setting RBM available to none
|
||||
|
||||
%org($8066, $0E)
|
||||
BlockStartupAutoWily:
|
||||
; presumably this would be called from password?
|
||||
LDA #$00
|
||||
|
||||
%org($80A7, $0E)
|
||||
StageLoad:
|
||||
JMP CleanWily5
|
||||
NOP
|
||||
|
||||
%org($8178, $0E)
|
||||
Main1:
|
||||
JSR MainLoopHook
|
||||
NOP
|
||||
|
||||
%org($81DE, $0E)
|
||||
Wily5Teleporter:
|
||||
LDA $99
|
||||
CMP #$01
|
||||
BCC SkipSpawn
|
||||
|
||||
%org($81F9, $0E)
|
||||
SkipSpawn:
|
||||
; just present to fix the branch, if we try to branch raw it'll get confused
|
||||
|
||||
%org($822D, $0E)
|
||||
Main2:
|
||||
; believe used in the wily 5 refights?
|
||||
JSR MainLoopHook
|
||||
NOP
|
||||
|
||||
%org($842F, $0E)
|
||||
Wily5Hook:
|
||||
JMP Wily5Requirement
|
||||
NOP
|
||||
|
||||
%org($C10D, $0F)
|
||||
Deathlink:
|
||||
JSR KillMegaMan
|
||||
|
||||
%org($C1BC, $0F)
|
||||
RemoveETankLoss:
|
||||
NOP
|
||||
NOP
|
||||
|
||||
%org($C23C, $0F)
|
||||
WriteStageComplete:
|
||||
ORA !completed_stages
|
||||
STA !completed_stages
|
||||
|
||||
%org($C243, $0F)
|
||||
WriteReceiveItem:
|
||||
ORA !received_item_checks
|
||||
STA !received_item_checks
|
||||
|
||||
%org($C254, $0F)
|
||||
BlockAutoWily:
|
||||
; and this one is on return from stage?
|
||||
LDA #$00
|
||||
|
||||
%org($C261, $0F)
|
||||
WilyStageCompletion:
|
||||
JSR StoreWilyStageCompletion
|
||||
NOP
|
||||
|
||||
%org($E5AC, $0F)
|
||||
NullDeathlink:
|
||||
STA $8F ; we null his HP later in the process
|
||||
NOP
|
||||
|
||||
%org($E5D1, $0F)
|
||||
EnergylinkHook:
|
||||
JSR Energylink
|
||||
NOP #2 ; comment this out to enable item giving their usual reward alongside EL
|
||||
|
||||
%org($E5E8, $0F)
|
||||
ConsumableHook:
|
||||
JSR CheckConsumable
|
||||
|
||||
%org($F2E3, $0F)
|
||||
|
||||
CheckConsumable:
|
||||
STA $0140, Y
|
||||
TXA
|
||||
PHA
|
||||
LDA $AD ; the consumable value
|
||||
CMP #$7C
|
||||
BPL .Store
|
||||
print "Consumables (replace 7a): ", hex(realbase())
|
||||
CMP #$76
|
||||
BMI .Store
|
||||
LDA #$00
|
||||
.Store:
|
||||
STA $AD
|
||||
LDA $2A
|
||||
ASL
|
||||
ASL
|
||||
TAX
|
||||
TYA
|
||||
.LoopHead:
|
||||
CMP #$08
|
||||
BMI .GetFlag
|
||||
INX
|
||||
SBC #$08
|
||||
BNE .LoopHead
|
||||
.GetFlag:
|
||||
TAY
|
||||
LDA #$01
|
||||
.Loop2Head:
|
||||
CPY #$00
|
||||
BEQ .Apply
|
||||
ASL
|
||||
DEY
|
||||
BNE .Loop2Head
|
||||
.Apply:
|
||||
ORA !consumable_checks, X
|
||||
STA !consumable_checks, X
|
||||
PLA
|
||||
TAX
|
||||
RTS
|
||||
|
||||
GoToMostRecentWily:
|
||||
LDA !controller_mirror
|
||||
CMP !CONTROLLER_SELECT_START
|
||||
BEQ .Default
|
||||
LDA !last_wily
|
||||
BNE .Store
|
||||
.Default:
|
||||
LDA #$08 ; wily stage 1
|
||||
.Store:
|
||||
STA !current_stage
|
||||
RTS
|
||||
|
||||
StoreWilyStageCompletion:
|
||||
LDA #$01
|
||||
STA !stage_completion, X
|
||||
INC !current_stage
|
||||
LDA !current_stage
|
||||
STA !last_wily
|
||||
RTS
|
||||
|
||||
ReturnToGameOver:
|
||||
LDA #$10
|
||||
STA !PpuControl_2000
|
||||
LDA #$06
|
||||
STA !PpuMask_2001
|
||||
JMP $C1BE ; specific code that loads game over
|
||||
|
||||
MainLoopHook:
|
||||
LDA !controller_mirror
|
||||
CMP !CONTROLLER_ALL_BUTTON
|
||||
BNE .Next
|
||||
JMP ReturnToGameOver
|
||||
.Next:
|
||||
LDA !deathlink
|
||||
CMP #$01
|
||||
BNE .Next2
|
||||
JMP $E5A8 ; this kills the Mega Man
|
||||
.Next2:
|
||||
print "Quickswap:", hex(realbase())
|
||||
LDA #$00 ; slot data, write in enable for quickswap
|
||||
CMP #$01
|
||||
BNE .Finally
|
||||
LDA !controller_flip
|
||||
AND !CONTROLLER_SELECT
|
||||
BEQ .Finally
|
||||
JMP Quickswap
|
||||
.Finally:
|
||||
LDA !controller_flip
|
||||
AND #$08 ; this is checking for menu
|
||||
RTS
|
||||
|
||||
StoreWilyProgress:
|
||||
STA !current_stage
|
||||
TXA
|
||||
PHA
|
||||
LDX !current_stage
|
||||
LDA #$01
|
||||
STA !stage_completion, X
|
||||
PLA
|
||||
TAX
|
||||
print "Get Equipped Music: ", hex(realbase())
|
||||
LDA #$17
|
||||
RTS
|
||||
|
||||
KillMegaMan:
|
||||
JSR $C051 ; this kills the mega man
|
||||
LDA #$00
|
||||
STA $06C0 ; set HP to zero so client can actually detect he died
|
||||
RTS
|
||||
|
||||
Wily5Requirement:
|
||||
LDA #$01
|
||||
LDX #$08
|
||||
LDY #$00
|
||||
.LoopHead:
|
||||
BIT $BC
|
||||
BEQ .Skip
|
||||
INY
|
||||
.Skip:
|
||||
DEX
|
||||
ASL
|
||||
CPX #$00
|
||||
BNE .LoopHead
|
||||
print "Wily 5 Requirement:", hex(realbase())
|
||||
CPY #$08
|
||||
BCS .SpawnTeleporter
|
||||
JMP $8450
|
||||
.SpawnTeleporter:
|
||||
LDA #$FF
|
||||
STA $BC
|
||||
LDA #$01
|
||||
STA $99
|
||||
JMP $8433
|
||||
|
||||
CleanWily5:
|
||||
LDA #$00
|
||||
STA $BC
|
||||
STA $99
|
||||
JMP $80AB
|
||||
|
||||
LoadString:
|
||||
STY $00
|
||||
ASL
|
||||
ASL
|
||||
ASL
|
||||
ASL
|
||||
TAY
|
||||
LDA $DB
|
||||
ADC #$00
|
||||
STA $C8
|
||||
LDA #$40
|
||||
STA $C9
|
||||
LDA #$F6
|
||||
CLC
|
||||
ADC $C8
|
||||
STA $CA
|
||||
LDA ($C9), Y
|
||||
STA $03B6
|
||||
TYA
|
||||
CLC
|
||||
ADC #$01
|
||||
TAY
|
||||
LDA $CA
|
||||
ADC #$00
|
||||
STA $CA
|
||||
LDA ($C9), Y
|
||||
STA $03B7
|
||||
TYA
|
||||
CLC
|
||||
ADC #$01
|
||||
TAY
|
||||
LDA $CA
|
||||
ADC #$00
|
||||
STA $CA
|
||||
STY $FE
|
||||
LDA #$0E
|
||||
STA $FD
|
||||
.LoopHead:
|
||||
JSR $BD34
|
||||
LDY $FE
|
||||
CPY #$40
|
||||
BNE .NotEqual
|
||||
LDA $0420
|
||||
BNE .Skip
|
||||
.NotEqual:
|
||||
LDA ($C9), Y
|
||||
.Skip:
|
||||
STA $03B8
|
||||
INC $47
|
||||
INC $03B7
|
||||
LDA $FE
|
||||
CLC
|
||||
ADC #$01
|
||||
STA $FE
|
||||
LDA $CA
|
||||
ADC #$00
|
||||
STA $CA
|
||||
DEC $FD
|
||||
BNE .LoopHead
|
||||
LDY $00
|
||||
JSR $C0AB
|
||||
RTS
|
||||
|
||||
StageGetEquipped:
|
||||
LDA !current_stage
|
||||
LDX #$00
|
||||
BCS LoadGetEquipped
|
||||
ItemGetEquipped:
|
||||
LDX #$02
|
||||
LoadGetEquipped:
|
||||
STX $DB
|
||||
ASL
|
||||
ASL
|
||||
PHA
|
||||
SEC
|
||||
JSR LoadString
|
||||
PLA
|
||||
ADC #$00
|
||||
PHA
|
||||
SEC
|
||||
JSR LoadString
|
||||
PLA
|
||||
ADC #$00
|
||||
PHA
|
||||
SEC
|
||||
JSR LoadString
|
||||
LDA #$00
|
||||
SEC
|
||||
JSR $BD3E
|
||||
PLA
|
||||
ADC #$00
|
||||
SEC
|
||||
JSR LoadString
|
||||
RTS
|
||||
|
||||
LoadItemsColor:
|
||||
LDA #$7D
|
||||
STA $FD
|
||||
LDA $0420
|
||||
AND #$0F
|
||||
ASL
|
||||
SEC
|
||||
ADC #$1A
|
||||
STA $FF
|
||||
RTS
|
||||
|
||||
Energylink:
|
||||
LSR $0420, X
|
||||
print "Energylink: ", hex(realbase())
|
||||
LDA #$00
|
||||
BEQ .ApplyDrop
|
||||
LDA $04E0, X
|
||||
BEQ .ApplyDrop ; This is a stage pickup, and not an enemy drop
|
||||
STY !energylink_packet
|
||||
SEC
|
||||
BCS .Return
|
||||
.ApplyDrop:
|
||||
STY $AD
|
||||
.Return:
|
||||
RTS
|
||||
|
||||
|
||||
Quickswap:
|
||||
LDX #$0F
|
||||
.LoopHead:
|
||||
LDA $0420, X
|
||||
BMI .Return1 ; return if we have any weapon entities spawned
|
||||
DEX
|
||||
CPX #$01
|
||||
BNE .LoopHead
|
||||
LDX !current_weapon
|
||||
BNE .DoQuickswap
|
||||
LDX #$00
|
||||
.DoQuickswap:
|
||||
TYA
|
||||
PHA
|
||||
LDX !current_weapon
|
||||
INX
|
||||
CPX #$09
|
||||
BPL .Items
|
||||
LDA #$01
|
||||
.Loop2Head:
|
||||
DEX
|
||||
BEQ .FoundTarget
|
||||
ASL
|
||||
CPX #$00
|
||||
BNE .Loop2Head
|
||||
.FoundTarget:
|
||||
LDX !current_weapon
|
||||
INX
|
||||
.Loop3Head:
|
||||
PHA
|
||||
AND !received_weapons
|
||||
BNE .CanSwap
|
||||
PLA
|
||||
INX
|
||||
CPX #$09
|
||||
BPL .Items
|
||||
ASL
|
||||
BNE .Loop3Head
|
||||
.CanSwap:
|
||||
PLA
|
||||
SEC
|
||||
BCS .ApplySwap
|
||||
.Items:
|
||||
TXA
|
||||
PHA
|
||||
SEC
|
||||
SBC #$08
|
||||
TAX
|
||||
LDA #$01
|
||||
.Loop4Head:
|
||||
DEX
|
||||
BEQ .CheckItem
|
||||
ASL
|
||||
CPX #$00
|
||||
BNE .Loop4Head
|
||||
.CheckItem:
|
||||
TAY
|
||||
PLA
|
||||
TAX
|
||||
TYA
|
||||
.Loop5Head:
|
||||
PHA
|
||||
AND !received_items
|
||||
BNE .CanSwap
|
||||
PLA
|
||||
INX
|
||||
ASL
|
||||
BNE .Loop5Head
|
||||
LDX #$00
|
||||
SEC
|
||||
BCS .ApplySwap
|
||||
.Return1:
|
||||
RTS
|
||||
.ApplySwap: ; $F408 on old rom
|
||||
LDA #$0D
|
||||
JSR !LOAD_BANK
|
||||
; this is a bunch of boiler plate to make the swap work
|
||||
LDA $B5
|
||||
PHA
|
||||
LDA $B6
|
||||
PHA
|
||||
LDA $B7
|
||||
PHA
|
||||
LDA $B8
|
||||
PHA
|
||||
LDA $B9
|
||||
PHA
|
||||
LDA $20
|
||||
PHA
|
||||
LDA $1F
|
||||
PHA
|
||||
;but wait, there's more
|
||||
STX !current_weapon
|
||||
JSR $CC6C
|
||||
LDA $1A
|
||||
PHA
|
||||
LDX #$00
|
||||
.Loop6Head:
|
||||
STX $FD
|
||||
CLC
|
||||
LDA $52
|
||||
ADC $957F, X
|
||||
STA $08
|
||||
LDA $53
|
||||
ADC #$00
|
||||
STA $09
|
||||
LDA $08
|
||||
LSR $09
|
||||
ROR
|
||||
LSR $09
|
||||
ROR
|
||||
STA $08
|
||||
AND #$3F
|
||||
STA $1A
|
||||
CLC
|
||||
LDA $09
|
||||
ADC #$85
|
||||
STA $09
|
||||
LDA #$00
|
||||
STA $1B
|
||||
LDA $FD
|
||||
CMP #$08
|
||||
BCS .Past8
|
||||
LDX $A9
|
||||
LDA $9664, X
|
||||
TAY
|
||||
CPX #$09
|
||||
BCC .LessThanNine
|
||||
LDX #$00
|
||||
BEQ .Apply
|
||||
.LessThanNine:
|
||||
LDX #$05
|
||||
BNE .Apply
|
||||
.Past8:
|
||||
LDY #$90
|
||||
LDX #$00
|
||||
.Apply:
|
||||
JSR $C760
|
||||
JSR $C0AB ; iirc this is loading graphics?
|
||||
LDX $FD
|
||||
INX
|
||||
CPX #$0F
|
||||
BNE .Loop6Head
|
||||
STX $FD
|
||||
LDY #$90
|
||||
LDX #$00
|
||||
JSR $C760
|
||||
JSR $D2ED
|
||||
; two sections redacted here, might need to look at what they actually do?
|
||||
PLA
|
||||
STA $1A
|
||||
PLA
|
||||
STA $1F
|
||||
PLA
|
||||
STA $20
|
||||
PLA
|
||||
STA $B9
|
||||
PLA
|
||||
STA $B8
|
||||
PLA
|
||||
STA $B7
|
||||
PLA
|
||||
STA $B6
|
||||
PLA
|
||||
STA $B5
|
||||
LDA #$00
|
||||
STA $AC
|
||||
STA $2C
|
||||
STA $0680
|
||||
STA $06A0
|
||||
LDA #$1A
|
||||
STA $0400
|
||||
LDA #$03
|
||||
STA $AA
|
||||
LDA #$30
|
||||
JSR $C051
|
||||
.Finally:
|
||||
LDA #$0E
|
||||
JSR !LOAD_BANK
|
||||
PLA
|
||||
TAY
|
||||
.Return:
|
||||
RTS
|
||||
|
||||
RefreshRBMTiles:
|
||||
; primarily just a copy of the startup RBM setup, we just do it again
|
||||
; can't jump to it as it leads into the main loop
|
||||
LDA !rbm_strobe
|
||||
BNE .Update
|
||||
JMP .NoUpdate
|
||||
.Update:
|
||||
LDA #$00
|
||||
STA !rbm_strobe
|
||||
LDA #$10
|
||||
STA $F7
|
||||
STA !PpuControl_2000
|
||||
LDA #$06
|
||||
STA $F8
|
||||
STA !PpuMask_2001
|
||||
JSR $847E
|
||||
JSR $843C
|
||||
LDX #$00
|
||||
LDA $8A
|
||||
STA $01
|
||||
.TileLoop:
|
||||
STX $00
|
||||
LSR $01
|
||||
BCC .SkipTile
|
||||
LDA $8531,X
|
||||
STA $09
|
||||
LDA $8539,X
|
||||
STA $08
|
||||
LDX #$04
|
||||
LDA #$00
|
||||
.ClearBody:
|
||||
LDA $09
|
||||
STA !PpuAddr_2006
|
||||
LDA $08
|
||||
STA !PpuAddr_2006
|
||||
LDY #$04
|
||||
LDA #$00
|
||||
.ClearLine:
|
||||
STA !PpuData_2007
|
||||
DEY
|
||||
BNE .ClearLine
|
||||
CLC
|
||||
LDA $08
|
||||
ADC #$20
|
||||
STA $08
|
||||
DEX
|
||||
BNE .ClearBody
|
||||
.SkipTile:
|
||||
LDX $00
|
||||
INX
|
||||
CPX #$08
|
||||
BNE .TileLoop
|
||||
LDX #$1F
|
||||
JSR $829E
|
||||
JSR $8473
|
||||
LDX #$00
|
||||
LDA $8A
|
||||
STA $02
|
||||
LDY #$00
|
||||
.SpriteLoop:
|
||||
STX $01
|
||||
LSR $02
|
||||
BCS .SkipRBM
|
||||
LDA $8605,X
|
||||
STA $00
|
||||
LDA $85FD,X
|
||||
TAX
|
||||
.WriteSprite:
|
||||
LDA $8541,X
|
||||
STA $0200,Y
|
||||
INY
|
||||
INX
|
||||
DEC $00
|
||||
BNE .WriteSprite
|
||||
.SkipRBM:
|
||||
LDX $01
|
||||
INX
|
||||
CPX #$08
|
||||
BNE .SpriteLoop
|
||||
JSR $A51D
|
||||
LDA #$0C
|
||||
JSR $C051
|
||||
LDA #$00
|
||||
STA $2A
|
||||
STA $FD
|
||||
JSR $C0AB
|
||||
.NoUpdate:
|
||||
LDA $1C
|
||||
AND #$08
|
||||
RTS
|
||||
|
||||
ClearRefresh:
|
||||
LDA #$00
|
||||
STA !rbm_strobe
|
||||
LDA #$10
|
||||
STA $F7
|
||||
RTS
|
||||
|
||||
assert realbase() <= $03F650 ; This is the start of our text data, and we absolutely cannot go past this point (text takes too much room).
|
||||
|
||||
%org($F640, $0F)
|
||||
db $25, $4B, "PLACEHOLDER_L1"
|
||||
db $25, $6B, "PLACEHOLDER_L2"
|
||||
db $25, $8B, "PLACEHOLDER_L3"
|
||||
db $25, $EB, "PLACEHOLDER_PL"
|
||||
db $25, $4B, "PLACEHOLDER_L1"
|
||||
db $25, $6B, "PLACEHOLDER_L2"
|
||||
db $25, $8B, "PLACEHOLDER_L3"
|
||||
db $25, $EB, "PLACEHOLDER_PL"
|
||||
db $25, $4B, "PLACEHOLDER_L1"
|
||||
db $25, $6B, "PLACEHOLDER_L2"
|
||||
db $25, $8B, "PLACEHOLDER_L3"
|
||||
db $25, $EB, "PLACEHOLDER_PL"
|
||||
db $25, $4B, "PLACEHOLDER_L1"
|
||||
db $25, $6B, "PLACEHOLDER_L2"
|
||||
db $25, $8B, "PLACEHOLDER_L3"
|
||||
db $25, $EB, "PLACEHOLDER_PL"
|
||||
db $25, $4B, "PLACEHOLDER_L1"
|
||||
db $25, $6B, "PLACEHOLDER_L2"
|
||||
db $25, $8B, "PLACEHOLDER_L3"
|
||||
db $25, $EB, "PLACEHOLDER_PL"
|
||||
db $25, $4B, "PLACEHOLDER_L1"
|
||||
db $25, $6B, "PLACEHOLDER_L2"
|
||||
db $25, $8B, "PLACEHOLDER_L3"
|
||||
db $25, $EB, "PLACEHOLDER_PL"
|
||||
db $25, $4B, "PLACEHOLDER_L1"
|
||||
db $25, $6B, "PLACEHOLDER_L2"
|
||||
db $25, $8B, "PLACEHOLDER_L3"
|
||||
db $25, $EB, "PLACEHOLDER_PL"
|
||||
db $25, $4B, "PLACEHOLDER_L1"
|
||||
db $25, $6B, "PLACEHOLDER_L2"
|
||||
db $25, $8B, "PLACEHOLDER_L3"
|
||||
db $25, $EB, "PLACEHOLDER_PL"
|
||||
db $25, $4B, "PLACEHOLDER_L1"
|
||||
db $25, $6B, "PLACEHOLDER_L2"
|
||||
db $25, $8B, "PLACEHOLDER_L3"
|
||||
db $25, $EB, "PLACEHOLDER_PL"
|
||||
db $25, $4B, "PLACEHOLDER_L1"
|
||||
db $25, $6B, "PLACEHOLDER_L2"
|
||||
db $25, $8B, "PLACEHOLDER_L3"
|
||||
db $25, $EB, "PLACEHOLDER_PL"
|
||||
db $25, $4B, "PLACEHOLDER_L1"
|
||||
db $25, $6B, "PLACEHOLDER_L2"
|
||||
db $25, $8B, "PLACEHOLDER_L3"
|
||||
db $25, $EB, "PLACEHOLDER_PL"
|
||||
|
||||
%org($FFB0, $0F)
|
||||
db "MM2_BASEPATCH_ARCHI "
|
||||
BIN
worlds/mm2/src/mm2font.dat
Normal file
BIN
worlds/mm2/src/mm2font.dat
Normal file
Binary file not shown.
BIN
worlds/mm2/src/mm2titlefont.dat
Normal file
BIN
worlds/mm2/src/mm2titlefont.dat
Normal file
Binary file not shown.
Reference in New Issue
Block a user