|
MusicSega Master System / Mark III / Game Gear |
Home - Forums - Games - Scans - Maps - Cheats - Credits |
It is a common problem when ripping VGMs from a game to find that you are unable to rip them without sound effects (SFX) playing. This page describes a general-purpose hack which will allow most Master System games' music to be ripped without SFX playing.
You want to rip that music. But it is impossible, due to the nature of the game, to stop SFX playing. You don't know how to hack games - you read the guides here and here and they are too hard for you - and you can't get someone who can to do it for you,
Here you go:
[*] ROM[0066] = FB, 18, FE
Too technical? Here's a simple guide...
That's enabled the hack. Now to test if it works.
The game should freeze, but the music should keep playing.
It is important not to save your game when it's in this frozen state. If you do, it's hard to get it out again. So be careful and always save your game before you press Pause.
When you finish, go back to the meka.pat file and re-add those semicolons. This will disable the hack and allow you to pause your games as normal.
Check you removed the right semicolons. Check you saved the meka.pat file. Note that this only works for Master System games (and the few MS mode GG games), that is games with extension .sms. It doesn't work with GG games.
If this happens, sorry, the hack doesn't work. It works with almost all games, just not the one you chose.
Then you have to remove the hack (re-add the semicolons and save), reload Meka, play to the bit where you want to log some music, save, quit Meka, put it back (remove the semicolon and save), load Meka, load the game. Hopefully that makes sense.
All SMS games have to have a pause button handler at offset 0x0066 in the file - when Pause is pressed, execution goes there, and the game has no choice in the matter (it can't turn it off). So I know that this is somewhere I can put code and it will always run when Pause is pressed.
Almost all games use the Vertical Blanking Interrupt (VBlank) for timing, with the VBlank code doing everything that has to happen every frame (updating the screen, updating the sound, reading the controller inputs) and some code elsewhere running the game engine (which might end up taking more than one frame to do everything). If we can kill off the game engine then nothing can happen to trigger any sound effects or stop the music.
So, if I put some code at offset 0x0066 that turns on VBlank interrupts and then hangs the game, it'll (hopefully) give me constantly updating sound (music) without any SFX being triggered (hung gameplay). Here's some code to do that:
When converted to machine code, that's:
fb ; ei 18 fe ; jr -2
So, we can write fb 18 fe
at offset 0x0066 using the meka.pat entry described above.
Things to note:
ei
though, because it is quite common for a game to di
in the VBlank handler but ei
out of it.
jr
or rst
to redirect to the pause handler, or just has a retn
).