Sonic Jam 6/ROM Editing
From Sonic Retro
|SCHG: Sonic Jam 6|
|0x1430||Array which contains music numbers for each map (WORD ARRAY).|
|0x0ad2||Demo properties (structure array, 0xe bytes long).||
|0x0dde||Level map world-level number (structure array, 0x4 bytes long).||
Title Screen functions
|ROM:0000781A||cmpi.w #2,(word_FF0042).l||Compare 2 with current level map number|
|ROM:00007822||beq.w loc_7836||If level map number is 2, branch|
|ROM:00007826||cmpi.w #5,(word_FF0042).l||Compare 5 with current level map number|
|ROM:0000782E||beq.w loc_7836||If level map number is 5, branch|
As you can clearly see, level map number 2 and 5 are respectively the Level 1-1 bonus, and the Level 1-2 bonus. This makes the level not restart after exiting out of this level and returning to the main one, making it appear as a single level. Adding another level to the list should be as simple as adding a cmp instruction and branching accordingly.
Sound Driver functions
The first two routines described below are easy to use subroutines which can be used respectively to play a background music or a sound effect. They handle calling the sound driver for you.
The BGM one is used by loading a word containing a music number from 0x0000 to 0x00FF into the address $ff6c00, and by jumping to it with a jump or branch to subroutine.
The SFX one works the same as the BGM one, but a sfx number is loaded into address $ff6c02.
The first line of the functions is their starting address.
|ROM:000EE76C||move.w d0,-(sp)||Save d0 onto stack|
|ROM:000EE76E||move.w #0,d0||Move 0 into d0|
|ROM:000EE772||move.b (word_FF6C00+1).l,d0||Move lower byte of word at ff6c00 into lower byte of d0|
|ROM:000EE778||move.w d0,(word_FF6D00).l||Move d0 into address $ff6d00|
|ROM:000EE77E||jsr sound_driver_play||Go to sub_F004C subroutine|
|ROM:000EE784||move.w (sp)+,d0||Load d0 from stack|
|ROM:000EE786||rts||Return (from this Subroutine)|
|ROM:000EE788||move.w d0,-(sp)||Save d0 onto stack|
|ROM:000EE78A||move.w #$8000,d0||Move $8000 into d0|
|ROM:000EE78E||move.b (word_FF6C02+1).l,d0||Move lower byte of word at $ff6c02 into lower byte of d0|
|ROM:000EE794||move.w d0,(word_FF6D00).l||Move d0 into word at address $ff6d00 (sound driver related)|
|ROM:000EE79A||jsr sound_driver_play||Jump to (sound driver play?) subroutine|
|ROM:000EE7A0||move.w (sp)+,d0||Load d0 from stack|
|ROM:000EE7A2||rts||Return (from this Subroutine)|