Language…
18 users online: Alex No, autisticsceptile1993, Dennsen86,  Eden_, Golden Yoshi, Hammerer, JezJitzu, MarkVD100, Metal-Yoshi94, MorrieTheMagpie, Nayfal, rafaelfutbal,  RussianMan, Rykon-V73, Sadistic Designer, SolveForX,  Telinc1, timeisart - Guests: 279 - Bots: 313
Users: 64,795 (2,369 active)
Latest user: mathew

[OBSOLETE] Disassembling SMAS (SMASH DIZ! Project)

Link Thread Closed
Roy, did you download Morroblivion or something? That's exactly what happened to my family's PC.
Let's milk Sunny Milk. Then she'll have enough money to fund Sunny Milk Real Estate.
Everypony's digging with a shovel
Originally posted by Wiimeiser
Roy, did you download Morroblivion or something? That's exactly what happened to my family's PC.


No.

Anyway, I've been waiting for some time already. We still haven't got our own computer here.

Actually, it's my own fault, it's been done for a week but I'm just too lazy to go and get it, dur.

At least this gave me some time to work on that semi-secret team hack - ASP - I had. I expect not to be lazy next Wednesday, which is hopefully when I'll have the titlescreen of this project done. (It's pretty huge.) Until then, don't expect any stuff either. And maybe it might take even longer. XD
--------> Don't follow "Find Roy's Dignity", my hack. Because it's pretty outdated. <--------
At least the SMB3 code should be very similar to the NES version, I've noticed many similarities in the RAM data. How far along are you?
I'm making no progress recently, due to my time being occupied by school. I'm not sure about Roy.

I should be able to disassemble stuff again after whenever I finish this 'profielwerkstuk' (some major school project and if I fail at it I can basically redo the whole year).
My blog. I could post stuff now and then

My Assembly for the SNES tutorial (it's actually finished now!)
I've obviously made no progress because of aforementioned reasons. Anyway, today we decided NOT to be lazy, and got the computer. But we'll install it tomorrow >_>. So you'll have to wait a little longer, hehsauce.

Also, on a side-note, I now have bought an external harddrive anyway, lulz. I actually got it as a present from somebody.
--------> Don't follow "Find Roy's Dignity", my hack. Because it's pretty outdated. <--------
Thats good news that you got an external hard drive ^_^

School always gets in the way of things Ersanio. You guys just take your time, you don't have to rush things.
So a few days ago I started disassembling SMB3 again... and got sick of it.

So I'm back to SMB2 again until I get motivation to help Ersan out with SMB3 again. Then again, it's not like Ersan is completely finished with SMB:TLL, so I'm not holding anything up.

This also means you'll see some c00lsauce pictures again. Or so I hope.
--------> Don't follow "Find Roy's Dignity", my hack. Because it's pretty outdated. <--------
I finally found what I had been looking for - the actual tilemap data for Layer 1 in Super Mario Bros. 2 (the actual tiles that you can see). And the reason I couldn't find it for such a long time, is because the data was actually in a table which I had not converted to db format yet... d'oh!

So now I found it, I came to the conclusion that I only seemed to have found data from Map16 page 0. Drats. Oh well.

For unknown reason, it seems to split those 256 tiles up in 4 chunks of 64 tiles. There's a pointer to each 'chunk' of these. I don't know why they simply didn't leave the tilemap as-is, but whatever. The difference isn't significant.
I also found out that tile $FF seems to conflict with a different table, so I think we cannot use that tile in the future without rearranging the Map16 table as a whole.

Without further ado, here's an example of what you can do now:



Basically changing palettes and tile data from those tiles. Just like you'd do in Lunar Magic's Map16 editor. Yep.

While looking at this code, I also found the code which flips the tiles of the room when you go to the dark potion room. As the Layer 1 tiles are being uploaded, the game loads the tiles and flips these around, with applying EOR #$4000 on the X-flipping bit of each tile (if you know how stripe images work, this should sound familiar to you). Additionally, it stores the tiles in a different order than regular.
This has as result that you have a mirrored room.
It wouldn't look good if you tried to disable the flipping only, however:



So using the routine I found ($14F24C) and disabling the appropiate part, only by itself it will not create a lot of good.
I might try to disable the 'room flipping' as a whole, though. It shouldn't be too difficult.
As you can see, the tiles themselves are flipped correctly, though.

With that, I found an interesting RAM address which I have to investigate later. When $0628 is #$02, you seem to go to the potion room, so...

To end the post for today, I also found a couple of bytes which seem to blank out the level.

Quote
TABLE_12F230: .dw $4040,$4040,$0000,$0000 ; Tiles with which the level is blanked out. $40 = low byte, $00 = high byte. Blank tile.

TABLE_12F238: .dw $2000,$5800,$9000,$C800 ; Which area of the Layer 1 tables is affected. $7E2000-$7E8FFF = low bytes, $7E9000-$7EFFFF = high bytes.


It only happens after a Game Over happens, so I'm not sure about the exact purpose of this routine.
Anyway, I pulled an Iceguy:



That is all.
--------> Don't follow "Find Roy's Dignity", my hack. Because it's pretty outdated. <--------
Sweet. This should...do...stuff...that...should...help....with...the...disassembling...of...smb2...
Nice update there Roy. That is a lot of POW's in the BG.

You guys are really doing well with this, all I can say is the best of luck to you both! :)
Originally posted by Rocket Sparkster
Nice update there Roy. That is a lot of POW's in the BG.


It actually is the FG. ;)
Also, thanks, and welcome back.

--------> Don't follow "Find Roy's Dignity", my hack. Because it's pretty outdated. <--------
I also found page 1's tilemap data, while actually looking for interaction data.
For some unknown reason, it's completely seperated from page 0, as I found it to be in bank 15:

Quote
POINTER_15A4C8: .dw CODE_15A4CE
.dw CODE_15A62E
.dw CODE_15A7AE


Curiously enough, there aren't even 256 tiles to make up for page 1.
My guess is that page 1 was actually not present in NES (didn't they use generic tiles for the grassy rock ground there, too? I'm referring to the ground at Birdo's room and such), and now it was made seperately from page 0. Another thing which makes this theory stronger is that a lot of new stuff (like Layer 3 data), which is SMAS-only, was added in bank 15. Older stuff all remain in banks 11-13, and possibly 14.

Other than this, not much.
--------> Don't follow "Find Roy's Dignity", my hack. Because it's pretty outdated. <--------
This here may be a slight bit more appealing to you guys than what I showed before : Layer 1 interaction data.

I found a couple of routines in SMB2 which handle Layer 1 interaction, and how to copy a Map16 tile over an existing other tile on the screen (parallel to SMW's method: LDA #$xx : STA $9C : JSL $00BEB0).
In SMW, however, $9C has a predefined number of Map16 tiles which can be selected. Getting, for example, a lava tile to show up (004/005) is impossible with this simple method - a simple JSL won't do.
In SMB2, however, this is not the case.
What SMB2 does to clear a tile (040), is simply this:

Code
CODE_12869F:        A9 40         LDA #$40                  ; \ Clear tile.
CODE_1286A1:        22 F4 8B 12   JSL CODE_128BF4           ; /


You simply load the 8-bit value of the tile into the accumulator, and then you JSL to $128BF4. You also need to prepare X (probably defines the player/sprite index) and $0212 (I'm unsure about the purpose of that one, unfortunately, but it seems to relate to the tile position).

Having this said, SMB2 has a much easier way of copying any tile on page 0 to the screen, than SMW does. Each tile on page 0 can be uploaded.
Unfortunately, with this specific JSL $128BF4 and nothing but that, tiles on page 1 cannot be uploaded. I don't think there even IS such a routine, as page 1 holds 'rock platform' tiles - see page 7 of this thread, I have the image posted there -, which are never uploaded mid-level. So it wouldn't make a lot of sense to code a seperate routine for page 1 only.

As for the specific code I just posted, that one's used for the cherry tile. If it's collected, this code is being run (clearing the tile out), along with a few other things such as sound effect generation and whether to generate a starman or not. Were you to change the code from LDA #$40 to LDA #$4E (cherry tile), then the cherry would never disappear - you'd keep collecting it, resulting in an unlimited starman supply.
Yeah... that's a little chaotic, though:



Knowing that [$01] (and $00 is a mirror of that) control which Map16 tile is touched, I could search for more interaction data.
So I found the data which makes you go inside a jar, be it a warp jar (but for that tile, it first checks if you're in the potion room), or just ye' regular one.
Changing this gives some results, which makes me think of cool puzzles for secret warp levels:



Basically use a regular grassy platform for secret warps, instead of a jar. Why not? At least it makes the whole thing a lot less predictable. {B)
Either way, by this code I found out that tile $6F is a warp jar, and tile $6E a regular jar. Very strange - $6A seems to be a jar also, but it's regarded as a different kind of jar than $6E.
Whereas #$00 is stored to $04EF when you're going down a warp jar (to activate 'warp' mode), #$01 is stored to $04EF with tile $6E, and #$02 is stored to $04EF with tile $6A.
I have yet to find their actual difference. So far, I've seen that in level 1-2, tile $6A makes you warp to the 'enclosed' jar room containing a Tweeter, a couple of bombs and some other things, while tile $6E makes you warp to the 'enclosed' jar room containing a couple of Phantos and a key.

Soon, I think I'll make a revision of the Map16 pages, that time with extra information added. It would probably be worth gold to me, and maybe some of you might be interested in it.
--------> Don't follow "Find Roy's Dignity", my hack. Because it's pretty outdated. <--------
In other news, I have just finished bank $0E: A table madness bank. Now I will proceed with bank $0F: A pointer madness bank.

sighhhhhhh. Oh well atleast I'm almost there!
My blog. I could post stuff now and then

My Assembly for the SNES tutorial (it's actually finished now!)
Ah, layer 1 interaction? very very interesting.

I like the hidden warp idea, makes it seem a lot harder to find the warp. Nicely done! :D
Extending a bit on what was showcased here a week ago, I came to the conclusion that I'm slowly getting the hang of block interaction. Like in SMW, it's a bit messy and the relevant codes do not only appear at the beginning of bank 12, but also in banks 13 and 14.

Strangely, ALL blocks on page 1 act like either tile 02C ('lego block', solid), 040 (air), 0AB (bombable brick?) and 0C0 (top of a vine, what's that for?).

Code
CODE_13F974:        A4 E7         LDY $E7                   ; Get index (position) to the corresponding Map16 tile.
CODE_13F976:        B7 0D         LDA [$0D],y               ; \ If Map16 page 0, branch.
CODE_13F978:        F0 09         BEQ CODE_13F983           ; /
CODE_13F97A:        B7 01         LDA [$01],y               ; \ All tiles on page 1 must act like...
CODE_13F97C:        AA            TAX                       ;  |
CODE_13F97D:        BF BD CC 14   LDA TABLE_14CCBD,x        ;  | $2C, $40, $AB or $C0...
CODE_13F981:        80 02         BRA CODE_13F985           ; / from page 0.

CODE_13F983:        B7 01         LDA [$01],y               ; This is for page 0, just act what it's supposed to act like.
CODE_13F985:        FA            PLX                       ; Pull X index back.


and

Code
TABLE_14CCBD:           .db $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C ; These values indicate what tiles on page 1 should act like.
			.db $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C ; The 'acts like' high byte is never considered...
			.db $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C ; ...and thus always 00.
			.db $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C ; This means that in SMB2 originally, every interaction code is from page 0.
			.db $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C ; 100-187
			.db $40,$40,$40,$40,$2C,$2C,$2C,$2C
			.db $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C
			.db $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C
			.db $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C
			.db $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C
			.db $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C
			.db $2C,$2C,$2C,$AB,$C0,$C0,$C0,$C0
			.db $C0,$C0,$C0,$C0,$C0,$C0,$C0,$C0
			.db $C0,$C0,$C0,$C0,$C0,$C0,$C0,$C0
			.db $C0,$C0,$C0,$C0,$C0,$C0,$C0,$C0
			.db $C0,$C0,$C0,$C0,$C0,$C0,$C0,$C0
			.db $C0,$C0,$C0,$C0,$C0,$C0,$C0,$C0


I seriously wonder if most of the tiles that use $C0 as interaction are used in SMB2, anyway. They're the obscure looking tiles.
--------> Don't follow "Find Roy's Dignity", my hack. Because it's pretty outdated. <--------
I'm finally done with the disassembly on my side! The ASM file currently contains the full disassembly of banks $00-$10, and they make up 112255 lines. The ASM file itself is 6,91 MB big too.

The only thing left is documentation now. It should get interesting; I might learn stuff about SMAS, and ASM itself! And after all of this, fix possible errors I might've overlooked.
My blog. I could post stuff now and then

My Assembly for the SNES tutorial (it's actually finished now!)
Good job. :o
I'd like to state that after 5 months of absence regarding SMAS Dis, I too am returning to this project again. I'll probably do some commenting on SMB2 dis before I try my hand at SMB3 again.
--------> Don't follow "Find Roy's Dignity", my hack. Because it's pretty outdated. <--------
Yeah, I'm actually making quite some nice progress. Right now I have about 137 ROM addresses, and have some small game select/presents screen/hall screen routines commented and documented, but it's going pretty slow as I expected.

...I might have this half-commented like all.log until I come up with an idea to comment stuff faster.
My blog. I could post stuff now and then

My Assembly for the SNES tutorial (it's actually finished now!)
Awesome work guys. I'll be supporting you guys the whole way :>.
Link Thread Closed