 |
|
 |
|
| Disassembling Yoshi's Island |
|
Forum Index - Non-SMW Hacking - Yoshi's Island - Disassembling Yoshi's Island |
|
|
|
|
| Posted on 2009-01-19 02:34:12 PM |
Link | Quote |
|
LINKS:
Disassembly - always updated!
Updated ROM Map - May 3, 2009
Romi's RAM Map
Other
1-UP Routine
If you folks have been following me on IRC, you may know that for the past several days, I have been working on what I wish to make my main focus - that is, a disassembly of Yoshi's Island (or as much as I possibly can before I get bored and go play with a ball in a cup or something). This also means I'll have to learn the dreaded SuperFX, but that will come in due time.
Anyway, the first sprite I have been working on disassembling is the giant sewer ghost, and I've managed to make some interesting results with it. Below are two minor experiments:


I have a tech demo right now, but it's in ROM format and I am too lazy to make an IPS. Perhaps I will just show a video later on tonight instead.
Please note that these are my personal notes, so they may not exactly be in the nicest format - some may also be incorrect. If you spot a mistake in my mess, please point it out to me so I can make the correction. If you are a new hacker in here/looking for a quick edit of the ghost, I have pulled easily editable values out and posted them below.
-----------------------
x35B1C: [12 60] Change to EA EA to make the sewer ghost immune to eggs.
x36247: [BD 02 79 85 0E] Change to EA EA EA EA EA to allow the ghost to start small rather than full size.
x3625A: [A5 0E 9D 02 79] Change to EA EA EA EA EA and you can run right through the ghost (he will not hurt you).
x36348: [01] Change to 00 to make the ghost always face away from you. Use in conjunction with x36353.
x36353: [00] Change to 01 to make the ghost always face away from you. Use in conjunction with x36348.
x3635D: [A5 0E] Change to EA EA to make eggs and sprites shatter upon hitting the ghost, rendering him invincible.
x36365: [79 00] Sound made when the ghost is hit with an egg. Please refer to this list for values.
x36379: [20 00] Affects how much the ghost will shrink when hit with an egg. Set it to 00 to make him never shrink, or F0 to make him shrink fully in one hit. (Warning: Do not use values that are too high, or you'll screw up the sprite.)
x3637C: [30 00] Affects how many HITS the ghost will take to shrink to it's lowest point.
x36381: [30 00] How large the ghost will be upon the final hit.
x36386: [08 00] Affects the size of the 'feedback' the ghost will give when hit (you know how he grows a little when he's hit BEFORE he shrinks? That.) Don't go over 18.
x364BD: [77 00] Sound effect the tunnel ghost makes when spitting.
x364C4: [1E 00] The sprite generated by the ghost. Default is 1E - A Shy Guy. Check the values in EggVine to get the value you want. Note that not all sprites work.
x364D6: [10 00] Y-Position of the Shy Guys as they come out of the ghost's mouth. The lower the number, the higher the Shy Guy will come out.
x364E0: [08 00] X-Position of the Shy Guys as they come out of the ghost's mouth. The higher the number, the further left the ghost pops out.
x364FF: [FD] Arc height when the Shy Guys are spit. Lower then FD = higher height. FE or FF = lower height. (Y-Speed?)
x36518: [48 00] Rate that the ghost will spit his sprite. The lower the number, the faster he will spit.
NEW:
x363AE: [03 00] Rate that the ghost grows back to full size. Change to 00 00 to make the ghost stay small forever once hit with eggs.
NEWER:
x363D5: [78 00] Determines the amount of time it takes for the ghost to start spitting again after it has been shrunk fully.
x36406: [06 00] Number of sprites the ghost will shoot, relative to eggs. Set to 01 for two sprites, and set to FF for infinite.
x3642C: [01 00] Speed that the ghost shrinks after being hit. Don't go over 18, or it starts acting wacky.
As you can see, I have a pretty good chunk of it disassembled. I will work on finishing it, and providing some more images, or something to show.
That's all for now. If anyone has any info they'd like to input, any tips, or anything in general, you are more than welcome to post.
Thanks!
|
| Last edited on 2012-12-31 06:14:55 AM by Ultimaximus. |
|
| Posted on 2009-01-19 04:15:47 PM |
Link | Quote |
|
1.
Baby Mario: AHHH! A GIANT GHOST! RUN, YOSHI, RUN!
The Sewer Ghost: Doesn't mean I can spit Shy-Guys at you!
2.
Yoshi: HAHA! You can't spit me, you lousy jerk!
The Sewer Ghost: Mmmmhhhhpppp Mhp MHP!
Anyways, that is heavily awesome! I'm going to try this out soon. Great job. =D
|
| Last edited on 2009-01-19 04:19:17 PM by Mippish. |
|
| Posted on 2009-01-19 08:17:19 PM |
Link | Quote |
|
I can make invincible sewer ghosts as blockages!
Good job 
Anyway, after finishing with the Sewer Ghost, do you have any idea what sprite you will be working on next?
|
|
| Posted on 2009-01-19 08:51:53 PM |
Link | Quote |
|
Originally posted by Count BleckAnyway, after finishing with the Sewer Ghost, do you have any idea what sprite you will be working on next?
Projectile sprites seem to be the easiest to trace for me, because I can find out where the sprite they generate is (shared subroutine, apparently), and then go from there. I was thinking something a little more simple, like the Snifit.
In more disassembly related news, I found a couple more addresses which some of you might find amusing.
x363D5: [78 00] Determines the amount of time it takes for the ghost to start spitting again after it has been shrunk fully.
x36406: [06 00] Number of sprites the ghost will shoot, relative to eggs. Set to 01 for two sprites, and set to FF for infinite.
x3642C: [01 00] Speed that the ghost shrinks after being hit. Don't go over 18, or it starts acting wacky.
|
|
| Posted on 2009-01-20 12:35:13 AM |
Link | Quote |
|
Ah, there we go. Here is a video of what I've managed to do with this using the info I found.
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/h5Xouyy3svQ&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/h5Xouyy3svQ&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
I'd also like to thank smkdan for letting me know that $7E E44 is the SuperFX initialization routine. I'm currently looking into SuperFX (god what a pain in the ass it is), so hopefully I can get something up sooner or later.
Also, the link in the first post as been updated to includes some more of the disassembly. Enjoy.
|
|
| Posted on 2009-01-20 01:18:22 AM |
Link | Quote |
|
LOL HE EXTENDS WHEN YOU SHOOT HIM! Nice SNN I love it. Keep up the good work! (Insert thumbs up pic here)
|
|
| Posted on 2009-01-20 01:29:49 AM |
Link | Quote |
|
That's amazing, especially the speed that the ghost shoots in!
And i notice your making sewer levels - that must be a pain in the ass ;)
|
|
| Posted on 2009-01-20 07:38:21 PM |
Link | Quote |
|
Update:
Did a bit more work with the sewer ghost, and learned a bit more on SuperFX. I recently found another routine that I wanted to note here, which I'm actually almost done disassembling. At the same time, I believe I found the 'draw' routine or something (allows the "1-UP" along with other animations to be drawn, I guess).
Here are a couple easily editable values.
x01A6A3: [01 00] Amount of lives received after collecting 100 coins.
x01A6BA: [08 00] Sound to play when getting a 1-UP.
I have also updated the disassembly link. Data for the routine begins at x01A6A2.
EDIT: There we go! This should cover the 1-UP routine!
Link
The STA $0006 is called from a routine elsewhere in the ROM. I'll work on figuring that one out.
|
| Last edited on 2009-01-21 12:24:09 AM by S.N.N.. |
|
| Posted on 2009-01-21 11:13:04 PM |
Link | Quote |
|
Today's rather minor update:
I was playing with the ROM initialization routines a bit, mostly trying to familiar myself with how the SNES/DMA registers worked. Found a couple routines which I guess 'enable' DMA for the game. Here's one:
$0082AB
x0004AB = 8D = STA ;abs
x0004AC = 05 = 05
x0004AD = 43 = 43 ;STA $4305 ;number of bytes to transfer (Low Byte)(DMA)
x0004AE = 8C = STY ;abs
x0004AF = 1B = 1B
x0004B0 = 21 = 21 ;STY $211B ;store 00 into Mode 7 Matrix Parameter A
x0004B1 = A2 = LDX ;8-bit
x0004B2 = 00 = 00 ;LDX #$00
x0004B3 = 8E = STX ;abs
x0004B4 = 1B = 1B
x0004B5 = 21 = 21 ;STX $211B ;store 00 into Mode 7 Matrix Parameter A
x0004B6 = E8 = INX ;increment X
x0004B7 = 8E = STX ;abs
x0004B8 = 1C = 1C
x0004B9 = 21 = 21 ;STX $211C ;store 01 into Mode 7 Matrix Parameter B
x0004BA = A9 = LDA ;16-bit
x0004BB = 80 = 80
x0004BC = 34 = 34 ;LDA #$3480
x0004BD = 8D = STA ;abs
x0004BE = 00 = 00
x0004BF = 43 = 43 ;STA $4300 ;parameters for DMA Table
x0004C0 = A5 = LDA ;dp
x0004C1 = 20 = 20 ;LDA $20
x0004C2 = 8D = STA ;abs
x0004C3 = 02 = 02
x0004C4 = 43 = 43 ;STA $4302 ;A Address Low Byte
x0004C5 = A6 = LDX ;dp
x0004C6 = 22 = 22 ;LDX $22 ;should be 00
x0004C7 = 8E = STX ;abs
x0004C8 = 04 = 04
x0004C9 = 43 = 43 ;STX $4304 ;A Address bank - in this case, $00:XXXX
x0004CA = A2 = LDX ;8-bit
x0004CB = 01 = 01 ;LDX #$01
x0004CC = 8E = STX ;abs
x0004CD = 0B = 0B
x0004CE = 42 = 42 ;STX $420B ;enable DMA in channel 0
x0004CF = 6B = RTL
I've updated it in the disassembly, which is now 32 KB.
-----------
EDIT: Added a table of music to the disassembly .. but if you're too lazy to click the updated link:
$00852E ;music table
x00072E = FF = FF
x00072F = 0C = 0C ;track used for the 'flower garden' theme
x000730 = 10 = 10 ;track used for the 'Touch Fuzzy Get Dizzy' theme
x000731 = 18 = 18 ;track used for the castle theme
x000732 = 1C = 1C ;track used for ?
x000733 = 14 = 14 ;track used for the cave theme
x000734 = 1C = 1C ;track used for ?
x000735 = 20 = 20 ;track used for the 'bonus challenge' games (roulette, etc.)
x000736 = 24 = 24 ;track used for the 'Touch Fuzzy Get Dizzy' theme (2)
x000737 = 24 = 24 ;track used for the 'Touch Fuzzy Get Dizzy' theme (3)
x000738 = 24 = 24 ;track used for the 'Touch Fuzzy Get Dizzy' theme (4)
x000739 = 28 = 28 ;track used for the athletic theme
x00073A = 28 = 28 ;track used for the athletic theme (2)
x000738 = 2C = 2C ;track used for ?
x000739 = 1C = 1C ;track used for ?
x00073A = 04 = 04 ;end of table
x00073B = 00 = 00 ; " "
x00073C = 00 = 00 ; " "
This is still incomplete, but it's there for your enjoyment.
|
| Last edited on 2009-01-22 01:44:56 AM by S.N.N.. |
|
| Posted on 2009-01-23 01:06:04 PM |
Link | Quote |
|
I wish I had a more eventful update today, but sadly, this is all you're getting. I mean, this sprite was pretty useless in the original, so now you can at least make it useful .
x02CA2C = 20 = 20 ;sprite generated from the ? bucket with a bandit (Low Byte)
x02CA2D = 00 = 00 ;sprite generated from the ? bucket with a bandit (High Byte)
Right. Obviously, sprites that don't move will not drop, so don't bother trying. (i.e. static red coin, etc). However, you can generate quite a few things, such as a red-coined Bandit, a door, and even a middle ring!
(note: remember to change the high byte to 01 if the sprite number is over 100.)
|
| Last edited on 2009-01-23 01:06:14 PM by S.N.N.. |
|
| Posted on 2009-01-24 12:47:51 AM |
Link | Quote |
|
Originally posted by S.N.N. I wish I had a more eventful update today, but sadly, this is all you're getting. I mean, this sprite was pretty useless in the original, so now you can at least make it useful  .
x02CA2C = 20 = 20 ;sprite generated from the ? bucket with a bandit (Low Byte)
x02CA2D = 00 = 00 ;sprite generated from the ? bucket with a bandit (High Byte)
Right. Obviously, sprites that don't move will not drop, so don't bother trying. (i.e. static red coin, etc). However, you can generate quite a few things, such as a red-coined Bandit, a door, and even a middle ring!
(note: remember to change the high byte to 01 if the sprite number is over 100.)
That's really interesting information. how did you find all that in the ROM? does that mean there's one that changes what comes out if a cloud too, do you know? I tried changing the one you said to 84 and then I changed the screen exit to CB, and after I went forward, under the bucket, it let me to Raphael the Raven so it can take you to other rooms. Also, I was wondering, it might be interesting if there was a way to make it random like with the door w/numbers in Bowser's castle. do you know if there is a way to control what room each number takes you to? that would be good to use in my game.
Thanks for finding that information again.
Lespna1.
oh, I was trying to quote you above. Tag (span) was not closed. Tag (div) was not closed. Tag (div) was not closed.
|
| Last edited on 2009-01-24 12:48:40 AM by Lespna1. |
|
| Posted on 2009-01-24 01:15:42 AM |
Link | Quote |
|
Actually, that is something I'd like to look into. The original room numbers were hardcoded on to the rotating door set .. but now that I think of it, they really shouldn't be too hard to trace. I'll see if I can find something tomorrow and get back to you on that.
Also, those values ONLY work on the bucket with the Bandit for now. I'll be providing more information in the near future.
In other news, disassembly updated, though it's filled with a lot of my general notes/debugger crap.
EDIT: ROM map link readded. I haven't updated it in months, so I'll do a bit of catching up on it very soon.
|
| Last edited on 2009-01-24 01:20:13 AM by S.N.N.. |
|
| Posted on 2009-01-24 06:21:37 AM |
Link | Quote |
|
0x78B1F - Screen Exit information for rotating doors, 4 bytes each
[B8 05 77 00] [C6 07 7A 00] [CD 05 5B 00] [D3 00 77 06]
1st byte : destination level
2nd byte : X position
3rd byte : Y position
4th byte : entrance type
|
|
| Posted on 2009-01-24 09:41:03 PM |
Link | Quote |
|
That's great Romi, thank you! I added those to the disassembly in full detail, and uploaded it.
As for today`s update .. just some messing with gradient tables.


Expect more exciting updates tomorrow.
|
| Last edited on 2009-01-24 09:41:22 PM by S.N.N.. |
|
| Posted on 2009-01-24 09:56:37 PM |
Link | Quote |
|
1st:
Yoshi: O_o That's not right at all.
2nd:
Baby Mario: That' ; s juste pas même du tout.
Awesome job! How did you do that?
|
|
| Posted on 2009-01-24 10:59:29 PM |
Link | Quote |
|

I can't wait to see how this all turns out. Graphic updates are interesting, and it will be awesome once YI has fully been disassembled.
I'll wait and see what the next "exciting" update is.
|
| Last edited on 2009-01-24 11:01:42 PM by Troopa. |
|
| Posted on 2009-01-24 11:01:50 PM |
Link | Quote |
|
Guys, it's an upside-down Netherlands, not France 
Also, the gradient tables are towards the end of the ROM. I actually realized shortly after that Romi posted the pointers already in the useful offsets thread, so to simplify my search, I'll probably use the formula he posted and trace all of them. After that, I should be able to post a gradient table for every level.
As for tomorrow's update .. expect one of the useless sprites in the game to suddenly have some use. Heh...
|
|
| Posted on 2009-01-25 11:19:43 AM |
Link | Quote |
|
|
wow awesome how did u do all that?
|
|
| Posted on 2009-01-25 09:49:36 PM |
Link | Quote |
|
Tonight's update: Rotation tables for the ? bucket.
$05C6FD ;table of bucket rotation speeds/shakes
x02C8FD = 20 = 20 ;amount that the bucket will shake when struck with an enemy from the right
x02C8FE = 00 = 00 ;anything higher than 00 will cause the bucket to fully rotate when struck with an enemy.
x02C8FF = 40 = 40 ;how fast the bucket will rotate when being struck with an egg from the right. Higher = slower,
lower = faster. Setting it above 40 will cause it to not be fast enough to make a rotation.
x02C900 = 00 = 00 ;similar to above
x02C901 = C0 = C0 ;how fast the bucket will rotate when being struck with an egg from the left. Higher = faster,
lower = slower. Values are inversed from x02C8FF.
x02C902 = FF = FF ;similar to above
x02C903 = E0 = E0 ;amount that the bucket will shake when struck with an enemy from the left
x02C904 = FF = FF ;how fast the bucket will spin upon reaching it's highest point when spinning clockwise
(hit with an egg from the right)
I should probably note that this is only half of the table, meaning there are more goodies waiting to be found. Basically, you can use it to make it so that spitting an enemy at the ? bucket will make it rotate, rather than shake. You could also make it spin super fast (looks pretty hilarious when you do it), and more.
Also, here is an offset involving the bucket that you all may enjoy.
x02CA6D: [15 01] Affects what the bucket with 8 coins drops.
I haven't tested it, but I know 100% this is the address. I am not sure if it will generate five of whatever sprite you pick, or one.
That's all for tonight. Disassembly link has been updated.
|
|
| Posted on 2009-01-26 03:12:26 AM |
Link | Quote |
|
Im guessing the bucket was the useless sprite?
So your saying that you can make the bucket drop anything? To enemies? Red coins? Clouds?
|
|
|
|
|
|
|
Forum Index - Non-SMW Hacking - Yoshi's Island - Disassembling Yoshi's Island |
|
|
 |
|
 |
The purpose of this site is not to distribute copyrighted material, but to honor one of our favourite games.
Copyright © 2005 - 2013 - SMW Central Legal Information - Link To UsTotal queries: 27
|
|
|
|