Happy C3 guys!
Unlike my past C3s, I'm just going to cut to the chase and immediately show what I'm going to show off:
-----------------------------------------------
- My WIP SMW Disassembly
My WIP disassembly of Super Mario World. More info about this down below.
-----------------------------------------------
- Hammer Bro Fix
Bug Fix patch that allows you to have more than 1 hammer bro loaded in memory.
Note: Currently breaks with the SA-1 patch, and I don't know why.
-----------------------------------------------
- Bonus Game Midpoint Fix
Bug Fix patch that fixes the bug where dying in the bonus game sets the midpoint flag. Also frees up $7E1DE9 on the overworld.
-----------------------------------------------
- Fireball Conveyor Slope Fix
Bug Fix patch that fixes the bug where shooting a fireball at a conveyor slope causes the fireball to teleport.
(Note: Thomas already made a patch for this. However, I made this one before I realized that. My patch uses a different hijack location and takes up fewer bytes than Thomas's, though, but Thomas's might still be better).
-----------------------------------------------
- Yoshi Egg Fix
Bug Fix patch that fixes the bug where spawning 2 or more Yoshi eggs from blocks before the first egg hatches causes all of them to hatch into adult Yoshis.
Note: Currently breaks with the SA-1 patch, and I don't know why.
-----------------------------------------------
- Vertical Camera Panning Patch
Patch that adds the ability to scroll the screen vertically by holding up/down.
(Note: I posted this in a previous C3, but I'm now officially releasing it. It's also been updated to support the SA-1).
-----------------------------------------------
- Spike Swim Fix Update
Update to Alcaro's version of this bug fix patch, which truly fixes the bug. Alcaro's version doesn't fix the root cause of it, and it's still possible to trigger the bug (it's caused by swimming on the same frame you touch a hurt block. Holding down has nothing to do with it, it just makes it easier to trigger).
Here is a .gif showing me triggering this bug without pressing down in any way:
-----------------------------------------------
- WIP ASM Tutorial
For the past several months, I've been tutoring Final Theory on ASM coding. Here is an archive of the lessons I gave him ripped straight from the Discord chat with some slight changes. At the time of this writing, I've given Final Theory 5 lessons (Binary, Hexadecimal, SNES Memory map, Loading/Storing, Branching)
-----------------------------------------------
- My Discord Server
A link to my Discord server. If you have a Discord account, you're a fan of my work, are a fan of Yoshi or like ROM hacking, you're free to join.
-----------------------------------------------
Bonus:
HDMA Fade Fix
This patch will make HDMA gradients fade out during level end by buffering them into the RAM (which also means you can make your gradients dynamic if you know what you're doing). It also fixes a couple issues that cause HDMA gradients to disappear as well as prevent them from appearing on the Mario Start! screen. Must be used in conjunction with UberASM and is not SA-1 compatible yet.
-----------------------------------------------
Now that I've shown off everything I planned on showing off, for those of you that want to learn more about what I've posted just now, get your mountain climbing gear ready! : P
Alright, regarding the disassembly, some of you guys are aware of the update to my hack, Yoshi's Strange Quest, where I added the entirety of Mario's Strange Quest to it. That would not have happened without using galaxyhaxz's SMW source code. However, by April 2018, the incompleteness of it along with some bad decisions on my part (like not properly keeping track of where I made changes to SMW's code) was starting to become a problem. Since galaxyhaxz has pretty much lost interest in working on the source code, I've decided to take over this project and pick up where he left off. Here is a list of things I've done to the disassembly so far:
-----------------------------------------------
- Every known WRAM/SRAM/VRAM address reference uses a define.
- RAM addresses with multiple purposes other than scratch RAM get their own labels for each purpose
- Lots of different notes regarding glitches, code that can be optimized, and other things to note.
- Isolated the code/data for lots of routines to make it easier to tell what code/data belongs to which routine.
+ The vast majority of the various sprites types have been isolated. The only exceptions are bounce, scroll and cutscene sprites.
+ Every object has been isolated.
+ Everything executed during NMI/IRQ has been isolated.
+ Most of the ending code has been isolated (Credits/Enemy Rollcall/The End).
+ Banks 0, 1, 2, 4, 5, and C have at least half of all their contents isolated. Bank 3 is very close to being fully isolated, and banks D, E, and F have their entire contents isolated.
- Added a system where code/data that belongs to a given routine can be grouped together while being able to be inserted at seperate locations.
- Changed some of the label names to be more descriptive (ex. "NintenDMAINIT" to "UpdateEntirePalette").
- Various tables have been modified to better reflect how they're handled in game.
- Various Lunar Magic hijack locations are noted (none of this information is more detailed than what one would expect from the hijack map).
- A system to integrate asar patches into the disassembly with minimal changes to the original disassembly
- Fixed some oddities with the disassembly (ex. The weird spacing towards the end of bank 2, "DATA_02AABD" is not a table).
- Added two extra steps to assembling the ROM, one to generate a blank ROM that's the size you specify (needed to prevent asar from thinking there is no freespace when applying patches that need freespace and to prevent odd sized ROMs) and one to display the checksum of the generated ROM.
-----------------------------------------------
Here is a list of planned features:
- Every single routine being isolated into a macro.
- Support for all SNES versions of SMW (Japan, USA, Pal 1.0, Pal 1.1, SMAS+W USA, SMAS+W Pal). The latter two may only include the SMW portion of them (and hacked a bit to get the SMW portion running by itself) if I don't feel up to fully disassembling SMAS.
- Ability to tell asar to assemble a custom version of a given code/data macro.
- Ability to define a custom routine list.
- More defines for things
- A way to import data from a Lunar Magic hacked ROM
- A feature to warn you if your generated hacked ROM might not be compatible with Lunar Magic.
- A feature that hardcodes routines to their usual ROM location so that surrounding code/data doesn't get moved when moving a routine elsewhere.
- Adding more information regarding Lunar Magic hijacks, glitches, and other things.
-----------------------------------------------
This is something I feel will help out with the SMW hacking scene, especially once it's done. It's nowhere near done, but I still would like people to use it to give me suggestions to improve it. In it's current state, it will help with improving the ROM/RAM/Hijack maps, since I've documented things that aren't mentioned. It will also help with the sprite disassembly project since I've isolated the code for tons of sprites.
Also, as I've been working on this, I've been posting updates to it on my Discord server and sharing some of the discoveries I've made (some of which were turned into patches, hence why a lot of the stuff I posted for this C3 are bug fixes). Here is a sample of some of the things I found while working on my disassembly:
-----------------------------------------------
Did you know...
- That I found unused tile number data that corresponds to the positioning of the coin sprites in this image? (See $00FBA8-$00FBAB)
- That the Pokey shown during the enemy rollcall has two extra segments you can't see because they're drawn at the same position as its other segments?
- That there are turn blocks under the sumo bro on the enemy rollcall screen that are hidden under the used blocks?
- That there is partial data for a level tileset F? (Forcing a level to use it will cause the game to crash though).
- That the bonus game loading letters has data for two extra letters to be displayed? (though setting the bytes to anything besides $FF will cause garbage to display as the equivalent property bytes don't exist.)
- That the fact that you need to set $7E13CE to a non-zero value when entering the overworld to allow overworld events to run is due to a coding error/questionable coding choice? (See $048F35)
- That the Pal 1.1 ROM's graphics are compressed in a slightly different format from the other versions of SMW? (There's an extra XBA instruction in the decompression routine for whatever strange reason).
- That tile 2E in GFX 10 (loaded on the overworld in SP1) may have originally been a shadow tile? (See $04FE15)
- That loading the candle flame generator will cause the sprite in slot 03 to disappear? (See $02AA6E)
- That the glitch where bouncing on a note block can allow you to collect a coin positioned 16 screens away and one block above (as seen on screen 0B of Funky) is caused by a case of copy-pasted code? (To fix, change the $F0 at $0292AC, $0292BD, $0292FF and $029310 into $10)
- That the exploding turn block sprites may have originally spawned music notes before breaking? (Insert 2 NOPs at $02E427)
- That the layer 1 data seen on the enemy rollcall screens is actual level data that can be opened in Lunar Magic? (Use PC offsets 0x62E29, 0x62E3E, 0x62E53, 0x62E77, 0x62E9E, 0x62EC8, 0x62EDA, 0x62EEF, 0x62F04, 0x62F1F, 0x62F31, 0x62F3D, 0x62F52)
- That Bowser has a "default" palette you can't see without disabling his palette animations?
- That there is some unused castle destruction movement data? (See $00C6B6-$00C6C0)
- That the levels on the overworld are hardcoded in a very specific pattern? (Each 16x16 chunk is internally stored going from left to right, top to bottom. Within these chunks, the tiles assigned a level ID increase going from left to right, top to bottom. The fact you're not limited to placing levels this way is due to Lunar Magic's ASM)
- That the bonus game loading letters load their graphics differently from the other loading messages? This is why "TIME UP !" looks like this:
...and "GAME OVER" looks like this:
...when dying in during the bonus game. (This is caused by the SMW developers not allocating an extra 64 bytes to the loading letter decompression buffer even though they had plenty of spare RAM).
- That some things Lunar Magic displays are not hardcoded as one might initially think (ex. LM actually reads from the ROM to determine if a given level mode should display a level as horizontal/vertical)?
- That the reason the game crashes if you try to use generator D2 to stop the layer 3 smasher is because of the RTS at $02D421? (Should be changed to RTL ($6B))
- That the head of the green koopa seen during the enemy rollcall uses the wrong palette, but you can't see that due to the koopa head tile not using any of the palette specific colors of palettes A-D?
- That while THANK YOU appears on screen during the ending, the THANK gets cut off by the left edge of the screen due to not handling the high X Bit properly?
-----------------------------------------------
And that's about it. I hope you guys liked what I have shown off!
Oh, wait, there is one last thing. Here's a sneak peek at a small feature I plan on adding to MYSQ:
(Also, I wonder if anyone has figured out what all my ASM Showoff thread titles have been referencing?)
My Hacks:
Mario's Strange Quest V1.6
Yoshi's Strange Quest V1.3 / V1.3.1 Beta 4.6
Mario & Yoshi's Strange Quests (2/10/2023 Build)
Other stuff:
My SMW/SMAS/SMAS+W disassembly
Yoshifanatic's Discord Server: A place for fans of my stuff and/or Yoshi to chat with others.
Unlike my past C3s, I'm just going to cut to the chase and immediately show what I'm going to show off:
-----------------------------------------------
- My WIP SMW Disassembly
My WIP disassembly of Super Mario World. More info about this down below.
-----------------------------------------------
- Hammer Bro Fix
Bug Fix patch that allows you to have more than 1 hammer bro loaded in memory.
Note: Currently breaks with the SA-1 patch, and I don't know why.
-----------------------------------------------
- Bonus Game Midpoint Fix
Bug Fix patch that fixes the bug where dying in the bonus game sets the midpoint flag. Also frees up $7E1DE9 on the overworld.
-----------------------------------------------
- Fireball Conveyor Slope Fix
Bug Fix patch that fixes the bug where shooting a fireball at a conveyor slope causes the fireball to teleport.
(Note: Thomas already made a patch for this. However, I made this one before I realized that. My patch uses a different hijack location and takes up fewer bytes than Thomas's, though, but Thomas's might still be better).
-----------------------------------------------
- Yoshi Egg Fix
Bug Fix patch that fixes the bug where spawning 2 or more Yoshi eggs from blocks before the first egg hatches causes all of them to hatch into adult Yoshis.
Note: Currently breaks with the SA-1 patch, and I don't know why.
-----------------------------------------------
- Vertical Camera Panning Patch
Patch that adds the ability to scroll the screen vertically by holding up/down.
(Note: I posted this in a previous C3, but I'm now officially releasing it. It's also been updated to support the SA-1).
-----------------------------------------------
- Spike Swim Fix Update
Update to Alcaro's version of this bug fix patch, which truly fixes the bug. Alcaro's version doesn't fix the root cause of it, and it's still possible to trigger the bug (it's caused by swimming on the same frame you touch a hurt block. Holding down has nothing to do with it, it just makes it easier to trigger).
Here is a .gif showing me triggering this bug without pressing down in any way:
-----------------------------------------------
- WIP ASM Tutorial
For the past several months, I've been tutoring Final Theory on ASM coding. Here is an archive of the lessons I gave him ripped straight from the Discord chat with some slight changes. At the time of this writing, I've given Final Theory 5 lessons (Binary, Hexadecimal, SNES Memory map, Loading/Storing, Branching)
-----------------------------------------------
- My Discord Server
A link to my Discord server. If you have a Discord account, you're a fan of my work, are a fan of Yoshi or like ROM hacking, you're free to join.
-----------------------------------------------
Bonus:
HDMA Fade Fix
This patch will make HDMA gradients fade out during level end by buffering them into the RAM (which also means you can make your gradients dynamic if you know what you're doing). It also fixes a couple issues that cause HDMA gradients to disappear as well as prevent them from appearing on the Mario Start! screen. Must be used in conjunction with UberASM and is not SA-1 compatible yet.
-----------------------------------------------
Now that I've shown off everything I planned on showing off, for those of you that want to learn more about what I've posted just now, get your mountain climbing gear ready! : P
Alright, regarding the disassembly, some of you guys are aware of the update to my hack, Yoshi's Strange Quest, where I added the entirety of Mario's Strange Quest to it. That would not have happened without using galaxyhaxz's SMW source code. However, by April 2018, the incompleteness of it along with some bad decisions on my part (like not properly keeping track of where I made changes to SMW's code) was starting to become a problem. Since galaxyhaxz has pretty much lost interest in working on the source code, I've decided to take over this project and pick up where he left off. Here is a list of things I've done to the disassembly so far:
-----------------------------------------------
- Every known WRAM/SRAM/VRAM address reference uses a define.
- RAM addresses with multiple purposes other than scratch RAM get their own labels for each purpose
- Lots of different notes regarding glitches, code that can be optimized, and other things to note.
- Isolated the code/data for lots of routines to make it easier to tell what code/data belongs to which routine.
+ The vast majority of the various sprites types have been isolated. The only exceptions are bounce, scroll and cutscene sprites.
+ Every object has been isolated.
+ Everything executed during NMI/IRQ has been isolated.
+ Most of the ending code has been isolated (Credits/Enemy Rollcall/The End).
+ Banks 0, 1, 2, 4, 5, and C have at least half of all their contents isolated. Bank 3 is very close to being fully isolated, and banks D, E, and F have their entire contents isolated.
- Added a system where code/data that belongs to a given routine can be grouped together while being able to be inserted at seperate locations.
- Changed some of the label names to be more descriptive (ex. "NintenDMAINIT" to "UpdateEntirePalette").
- Various tables have been modified to better reflect how they're handled in game.
- Various Lunar Magic hijack locations are noted (none of this information is more detailed than what one would expect from the hijack map).
- A system to integrate asar patches into the disassembly with minimal changes to the original disassembly
- Fixed some oddities with the disassembly (ex. The weird spacing towards the end of bank 2, "DATA_02AABD" is not a table).
- Added two extra steps to assembling the ROM, one to generate a blank ROM that's the size you specify (needed to prevent asar from thinking there is no freespace when applying patches that need freespace and to prevent odd sized ROMs) and one to display the checksum of the generated ROM.
-----------------------------------------------
Here is a list of planned features:
- Every single routine being isolated into a macro.
- Support for all SNES versions of SMW (Japan, USA, Pal 1.0, Pal 1.1, SMAS+W USA, SMAS+W Pal). The latter two may only include the SMW portion of them (and hacked a bit to get the SMW portion running by itself) if I don't feel up to fully disassembling SMAS.
- Ability to tell asar to assemble a custom version of a given code/data macro.
- Ability to define a custom routine list.
- More defines for things
- A way to import data from a Lunar Magic hacked ROM
- A feature to warn you if your generated hacked ROM might not be compatible with Lunar Magic.
- A feature that hardcodes routines to their usual ROM location so that surrounding code/data doesn't get moved when moving a routine elsewhere.
- Adding more information regarding Lunar Magic hijacks, glitches, and other things.
-----------------------------------------------
This is something I feel will help out with the SMW hacking scene, especially once it's done. It's nowhere near done, but I still would like people to use it to give me suggestions to improve it. In it's current state, it will help with improving the ROM/RAM/Hijack maps, since I've documented things that aren't mentioned. It will also help with the sprite disassembly project since I've isolated the code for tons of sprites.
Also, as I've been working on this, I've been posting updates to it on my Discord server and sharing some of the discoveries I've made (some of which were turned into patches, hence why a lot of the stuff I posted for this C3 are bug fixes). Here is a sample of some of the things I found while working on my disassembly:
-----------------------------------------------
Did you know...
- That I found unused tile number data that corresponds to the positioning of the coin sprites in this image? (See $00FBA8-$00FBAB)
- That the Pokey shown during the enemy rollcall has two extra segments you can't see because they're drawn at the same position as its other segments?
- That there are turn blocks under the sumo bro on the enemy rollcall screen that are hidden under the used blocks?
- That there is partial data for a level tileset F? (Forcing a level to use it will cause the game to crash though).
- That the bonus game loading letters has data for two extra letters to be displayed? (though setting the bytes to anything besides $FF will cause garbage to display as the equivalent property bytes don't exist.)
- That the fact that you need to set $7E13CE to a non-zero value when entering the overworld to allow overworld events to run is due to a coding error/questionable coding choice? (See $048F35)
- That the Pal 1.1 ROM's graphics are compressed in a slightly different format from the other versions of SMW? (There's an extra XBA instruction in the decompression routine for whatever strange reason).
- That tile 2E in GFX 10 (loaded on the overworld in SP1) may have originally been a shadow tile? (See $04FE15)
- That loading the candle flame generator will cause the sprite in slot 03 to disappear? (See $02AA6E)
- That the glitch where bouncing on a note block can allow you to collect a coin positioned 16 screens away and one block above (as seen on screen 0B of Funky) is caused by a case of copy-pasted code? (To fix, change the $F0 at $0292AC, $0292BD, $0292FF and $029310 into $10)
- That the exploding turn block sprites may have originally spawned music notes before breaking? (Insert 2 NOPs at $02E427)
- That the layer 1 data seen on the enemy rollcall screens is actual level data that can be opened in Lunar Magic? (Use PC offsets 0x62E29, 0x62E3E, 0x62E53, 0x62E77, 0x62E9E, 0x62EC8, 0x62EDA, 0x62EEF, 0x62F04, 0x62F1F, 0x62F31, 0x62F3D, 0x62F52)
- That Bowser has a "default" palette you can't see without disabling his palette animations?
- That there is some unused castle destruction movement data? (See $00C6B6-$00C6C0)
- That the levels on the overworld are hardcoded in a very specific pattern? (Each 16x16 chunk is internally stored going from left to right, top to bottom. Within these chunks, the tiles assigned a level ID increase going from left to right, top to bottom. The fact you're not limited to placing levels this way is due to Lunar Magic's ASM)
- That the bonus game loading letters load their graphics differently from the other loading messages? This is why "TIME UP !" looks like this:
...and "GAME OVER" looks like this:
...when dying in during the bonus game. (This is caused by the SMW developers not allocating an extra 64 bytes to the loading letter decompression buffer even though they had plenty of spare RAM).
- That some things Lunar Magic displays are not hardcoded as one might initially think (ex. LM actually reads from the ROM to determine if a given level mode should display a level as horizontal/vertical)?
- That the reason the game crashes if you try to use generator D2 to stop the layer 3 smasher is because of the RTS at $02D421? (Should be changed to RTL ($6B))
- That the head of the green koopa seen during the enemy rollcall uses the wrong palette, but you can't see that due to the koopa head tile not using any of the palette specific colors of palettes A-D?
- That while THANK YOU appears on screen during the ending, the THANK gets cut off by the left edge of the screen due to not handling the high X Bit properly?
-----------------------------------------------
And that's about it. I hope you guys liked what I have shown off!
Oh, wait, there is one last thing. Here's a sneak peek at a small feature I plan on adding to MYSQ:
(Also, I wonder if anyone has figured out what all my ASM Showoff thread titles have been referencing?)
My Hacks:
Mario's Strange Quest V1.6
Yoshi's Strange Quest V1.3 / V1.3.1 Beta 4.6
Mario & Yoshi's Strange Quests (2/10/2023 Build)
Other stuff:
My SMW/SMAS/SMAS+W disassembly
Yoshifanatic's Discord Server: A place for fans of my stuff and/or Yoshi to chat with others.