Points of Required Attention™
Please chime in on a proposed restructuring of the ROM hacking sections.
Views: 88,506,419
Main | FAQ | Uploader | IRC chat | Radio | Memberlist | Active users | Latest posts | Calendar | Stats | Online users | Search 05-01-24 12:40 PM
Guest: Register | Login

0 users currently in ROM Hacking | 2 guests

Main - ROM Hacking - General SMB3 Hacking Thread New thread | New reply

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

TKB
Posted on 01-13-10 10:31 PM Link | Quote | ID: 125519


Micro-Goomba
Level: 9

Posts: 10/10
EXP: 2294
Next: 868

Since: 12-02-09
From: Somewhere

Last post: 5221 days
Last view: 4902 days
Does Reuben allow for the world order/themes to be changed? Like if I don't want the 2nd world Mario visits to be desert, I want that to be 4th.

binarycuberoots
Posted on 01-14-10 02:42 AM (rev. 2 of 01-15-10 07:29 PM) Link | Quote | ID: 125526


Goomba
Level: 15

Posts: 33/34
EXP: 14496
Next: 1888

Since: 09-10-09

Last post: 5096 days
Last view: 5096 days
Well the great thing about reuben (at least the betas I've helped to test) is the sense that it is extremely flexible in that sense. Levels and worlds are built from scratch, and pretty much any combination of level types is possible. For instance, you can have every level be ice related, or you can have a mixture of level types within the same world. It is even theoretically rumored that it's possible to have over 8 worlds with reuben as we know it. If one wants to have a desert theme in world 3 and an underwater/cave theme in world 4 or an ice themed world 5 and a grass themed world 6 and a forest themed world 7 and even a dark themed world 9 where bowser's castle is, it's possible with reuben. That's partly why I have been so anxious about it, but I am losing hope that it'll be finished and released.

mind you that it is also possible to have different overworld themes with workshop/map editor, but it's less flexible in the sense that you're pretty much stuck with the number of levels of specific level types in total unless you're clever enough to use the special additional level and enemy offset trick quick referred to, and more organization is required to come up with different overworld themes. Reuben will make that task easier.

Anyway I was wondering if there was a way to prevent anyone from accessing debug mode in SMB3 since that has been an issue somewhat previously. Whether that is to disable it altogether or to make it watered down so that power-ups and items no longer become accessible through it. Also I'm trying to remember if the debug code comes with a warp option or something.

____________________
I'm back

ShoFIZZLE
Posted on 01-20-10 02:46 AM Link | Quote | ID: 125746


Shyguy
Level: 22

Posts: 23/80
EXP: 51982
Next: 6368

Since: 11-18-09
From: Atlanta, GA

Last post: 4307 days
Last view: 4307 days
Im looking forward to the full release of this....so I can get cracking with it.

zbyte
Posted on 01-20-10 11:41 PM (rev. 2 of 01-21-10 12:01 AM) Link | Quote | ID: 125794


Boomerang Brother
Z is Superior!
Level: 66

Posts: 835/1016
EXP: 2388263
Next: 73588

Since: 06-10-09

Last post: 4437 days
Last view: 2916 days
How to edit SMB3 text...


You'll need FCEUXD and some text tables. To create a text table, all you have to do is copy the code for SMB3 text (E2=x) into Notepad and put .tbl at the end of your new text table. Make sure you select "All Files" when saving it. There are five tables used in SMB3, the main table, the credits table, the map table, the title screen table, and the course clear table. Some do not have all of the letters and numbers that are in the main and credits table. If you'd want to see better, then you may want to change the thing that represents the space from [ ] to [_]. You can make your own by copying them from Data Crystal, or you can download some I've all ready made.


Main,

Credits

Title Screen

Map

Course Clear

Open your ROM in FCEUXD, then the hex editor, then the .tbl files from the hex editor's menu. Go to the ROM File in the View option. Scroll down and you'll start seeing some text appear on the right side! Then you can start typing the text you want!

$05336: Toad Houses
$1404b: "World" (in the pop-up)
$14053: "Mario" (in pop-up)
$14129: "Continue" (for Game Over pop-up)
$14134: "End" (for Game Over pop-up)
$141E1: WELCOME TO WARP ZONE!
$14246: "Luigi" (in pop-up)
$14319: "Mario" (for Game Over pop-up)
$1431F: "Luigi" (for Game Over pop-up)
$2CA6E: Spade and N-Spade Rooms
$3012A: The King has been transformed...
$31AD9: Princess' Rescued Message
$32D95: Credits
$32B12: [c] 1988
$32B22: Player Options
$362C4: King's Message
$36793: Princess's Letters
$3C35D: COURSE CLEAR!
$3C36F: YOU GOT A CARD

Trel Edit: Fixed the links so that they work. "http://www.http://www" is a good way to make links fail.

____________________
No quotes found; we apologize for the inconvenience. Commas, question marks, and semicolons are available, though.








zand
(post deleted) ID: 126845

Hamtaro126
Posted on 02-23-10 10:09 PM (rev. 2 of 02-23-10 10:13 PM) Link | Quote | ID: 127507


Cheep-cheep
Level: 33

Posts: 127/194
EXP: 212925
Next: 16254

Since: 05-02-07
From: Shelton, WA

Last post: 2478 days
Last view: 2320 days
(This post is BIG because of the following code and data! Just a warning.)

*Sigh* Bumping, But for a good reason:

DahrkDaiz's Notes in 2004

from: http://acmlm.no-ip.org/archive2/thread.php?id=2380&ppp=20&page=0#46896:

=======================================

Super Mario Bros. 3 Hacking Notes:

Terminology: $ denotes a ram address in hex, 0x denotes a ROM address in the .nes file

Button Press Status Format, a 1 indicates it's pressed, 0 means it's not.

(NOTE from Hamtaro126: the controller data bits are 0-7, not 1-8. Just to make sense in a technical matter)

0123 4567
| | | | | | | |
| | | | | | | - Right
| | | | | | --- Left
| | | | | ----- Down
| | | | ------- Up
| | | --------- Start
| | ----------- Select
| ------------- B
--------------- A


Sound and music explanation:

4F1 through 4F6 are bytes used to initiate sound effects.
Each bite in these RAM bytes plays a different sound
(except for 4F2). A byte is stored in these locations, then the game
will reset them after the sound routines are initiated. So if you're ASM hacking
and would like to play a new sound, do 1 store to the appropriate location and the
game takes care of the rest.


RAM MAP:

$0E = Current level page.

$14 = Setting this byte to 1 ends a level
$15 = This byte is increased once every game cycle and used as a timer.

$17 = Controller status for held buttons.
$18 = Controller status for just pressed buttons.

$5E = PPU Buffer loading offset. This will determine where to read a pointer
in a table to load the PPU buffer from.

$69 & $6A = PPU Buffer pointer.

$75 = Vertical position on the map screen.

$79 = Horizontal position on the map screen.

$BD = Direction and speed of Mario. 00-7F is moving right, 80-FF (FF is slowest) is moving
left.

$CF = Direction and speed of Mario verticlaly. 00-7F is moving down, 80-FF (FF is slowest)
is moving up.

$E4 = The vertical tile offset in the current level page
$E5 = Current Tile Number Mario is on.

$ED = Current Power Up

$160 = Debug mode enable/disable. If it's $80, then debug controls are enabled (select
switches power-ups, B+select toggles Kuribo's shoe on/off, etc).

$300~$350 = PPU Buffer. The buffer works as follows. $300 is the current size of the
buffer. $301 and beyond is data for the PPU in the following format: AA AA SS XX XX XX 00
AA = address of PPU to write to, this is written in big endian format.
SS = Size of the data to write.
XX = The actual data itself
00 = End of the PPU Buffer.

When writing to the buffer, always end it with 00 and update the buffer size.

$3DD = This byte is the Turbo running speed. At FF, Mario can start flying.
This byte is also used to draw the P-Meter. Each bit depicts the tile type. There
are 8 tiles [|>|>|>|>|>|>(p)] the (p) is two tiles. Lets say $3DD were 0000 0101 then the
first and 3rd arrow tiles will light up.

$3EC = Coin addition byte. Any coin grabbing you do causes this to go up by 1.

$462 = This byte keeps track of the current level music for when invincibility or p-switch
music switches back to the level music

$4F1 = Another sound play switch byte.
01 = Deep jump sound
02 = Block bounce
04 = Swim sound
08 = Shell kicked
10 = Down a pipe
20 = Fireball throwing
40 = nothing
80 = high pitched jump sound.

$4F2 = This is the sound play switch byte. If it's 00, no sound effect plays, but
if it's not 00, then a sound effect will play.
01 = Coin sound.
02 = Power-up coming out/vine grow
04 = longer sound of 02
08 = Boom sound (cannon fireing)
10 = 'Tick' sound
20 = Powerup!
40 = 1-up
80 = Poof sound
90 = Odd "poof" sound
A0 = Lost Kuribo Shoe
B0 = Tail Wag
C0 = dragged out 1-up sound

$4F3 = Another sound byte
01 = broken bricks
02 = fire sound
04 = Going through Brush?
08 = Woosh! Sound Airship makes when it moves on map.
10 = Hammer Bros. moving on map.
20 = no sound
40 = no sound
80 = Skidding sound.

$4F4 = Fanfare music player.
01 = Death
02 = Game Over/Continue
04 = Classic Ending
08 = King Rescued
10 = Bowser Defeated
20 = Level Complete
40 = Time's running out!
80 = Play current level song.

$4F5 = This is the music change switch byte. If it's 00, the music doesn't change (current
music continues to play). But if it's not 00, then the music will change.

01 = World 1 Map Screen
02 = World 2 Map Screen
03 = World 3 Map Screen
04 = World 4 Map Screen
05 = World 5 Map Screen
06 = World 6 Map Screen
07 = World 7 Map Screen
08 = World 8 Map Screen
09 = World 9 Map screen/Coin heaven
0A = Star Power
0B = Warp Whistle
0C = Music Box
0D = Returning to Earth with the wand
0E = Game Theme
0F = Princess Saved
10 = Plains
20 = Underground
30 = Water
40 = Dungeon
50 = Boss Battle
60 = Doomship
70 = Hammer Bros. Stage
80 = Mushroom House
90 = Hilly Theme
A0 = P-Switch
B0 = Bowser Fight
C0 = Glitched Boss fight
D0 = Theme Song rotation (ends with music box infinite loop)
E0 = Underground to Song rotation
F0 = Water to Song rotation

$4F6 = Another Sound byte
01 = Sound made when Mario is generated on the start tile of a world map.
02 = Moved on the map
04 = Enter a level
08 = Status bar flip
10 = Secret revealed on the map
20 = nothing
40 = nothing
80 = Error sound

$4F7 = Another sound byte
01 = Pause (stops music)
02 = Resume music
All other values = pause.

$516 = This is the timer for multi-coin blocks. If $581 reaches 0 first, getting more coins
stops.

$552 = Invisibility timer for after you get hit.
$553 = Invincibility Timer

$566 = Enemy generator byte. This will generator a pre-set enemy based on the value.
$567 = P-switch effect timer

$56E = Flight timer for Racoon/Tanooki Mario
$56F = Pressing down indicator
$570 = Timer when holding down on a magical white block to let you go behind the bg.

$575 = Indicates you're in water and what you're doing in water (coming out of, going into,
swimming, just walking, etc). Not sure what values tell what though.

$577 = Kuribo Shoe indicator (0 = no shoe, 1 = shoe)
$578 = This is the transformation byte. When Mario gets a power-up or is injured, this
byte contains the power-up he will go to + 1. Thus, if he's going to be small, this
byte is 0x01. A value of 00 means there's no change. A value of 0x80 will give you the shoe.\

$57A = Tanooki's Statue Timer.

$581 = This is the max number of coins you can get in a multi-coin blocks. If $516 reaches 0
first, getting more coins stops.

$588 = Behind the background timer
$589 = Traction byte: 0 = no slip, 1 = slip, 2 = extra slip

$5EE = Hundreds place of timer
$5EF = Tens place of timer
$5F0 = Ones place of timer

$602 = Current tile to the left and above Mario
$603 = Current tile to the left and under Mario
$604 = Current tile to the right and under Mario
$605 = Current somewhere under Mario
$606 = Current tile to the right and above Mario

$676 = Power up sprite number. This byte is seperate from the other sprite buffer. When
another power-up appears, this byte is over written, thus the first power up disappears.

$69C & $69D = Score addition bytes. When these bytes are set, then that amount of the score
will be added to your main score. $69C = high byte, $69D = low byte

$70A = Current Object Set/Level Type

$711 = Timer used during World/Lives status screen before Mario generates onto
the map.

$713 = This is level beaten byte. 1 means that the level is being beaten. It's changed
to 0 when you die, so when you return to the map screen, the level you were on doesn't flip over.

$715-$717 = Score (24-bit value)

$719 = First 2K Bank of GFX (upper left of pattern table, $0000-$07FF)
$71A = Second 2K Bank of GFX (lower left of pattern table, $0800-$0FFF)
$71B = First 1K bank of GFX (upper right of pattern table, $1000-$13FF)
$71C = Second 1K bank of GFX (second from upper right of pattern table, $1400-$17FF)
$71D = Third 1K bank of GFX (second from lower right of pattern table, $1800-$1BFF)
$71E = Fourth 1K bank of GFX (lower right of pattern table, $1C00-$1FFF)
$71F = Current bank @ 0xA000
$720 = Current bank @ 0xC000

$726 = Current player (0 = player 1, 1 = player 2)
$727 = Current World

$736 = Player 1's Lives Counter
$737 = Player 2's Lives Counter

$73A = This is where the palette for the current level is stored. The palette is loaded
before the level is drawn, so changing this byte doesn't have any effect after the level
loads.

$7C1-$7E0 = This is where the palette current stored. Changing this won't have much effect on the
palette. To force a change, set $5E to 0x06

$6000-$794f = This is where the 16x16 block numbers are kept that corresponds directly to
the level. An example is that 0x40 is the value for a coin. This also applies to the map screen.

$7965 = White Mushroom House indicator, if it's 1, your coins are checked to see if they meet
the requirements
$7966 = Number of coins needed to make a white mushroom house appear
$7967 = Number of coins obtained in the current level

$7A0A and $7A0C = used in combination to determine the current scrolling point in an
autoscroll level.

$7CF4 = Frozen Mario byte. 01 = Mario can't move. 00 = Mario can move.

$7CFB = Flash timer, this will make the bg flash through rainbow colors. If it's above 80, then
the 9th palette instead.

$7B41 - $7C40 (?) = Sprite data buffer. All sprites found in a level are stored here for
easy reference.

$7D80-$7D9B = Player 1's item inventory
$7D9C-$7D9E = Goal cards for player 1. 00 = no card, 01 = mushroom, 02 = flower, 03 = star

$7DA2 = Player 1's Coin counter
$7DA3-7DBE = 2nd Player's Inventory box
$7DBF-$7DC1 = Goal cards for player 2. 00 = no card, 01 = mushroom, 02 = flower, 03 = star

$7DE0 - $7DFF = Current Palette.

$7EB6 = Stop scrolling byte (stops scrolling altogether).

$7F3E-$7F43 = Arrow tile numbers.
$7F44 and $7F45 = ( P ) Bar tile numbers.
$7F46 and $7F47 = Coin tiles (not the coins counter, but the tiles used to display it)
$7F48 and $7F49 = Lives counter tiles (not the lives counter, but the tiles used to display it)
$7F4A-$7F4F = Score tiles (note, not the score itself, just the tiles displayed for it)
$7F50-$F52 = Timer tiles (same for score tiles)

$7F9A = Seems to be the start of some buffer. Setting this to anything but 2 will prevent bricks
from animating when broken.

Lock Data:

I kept this seperate since everyone is so eager to get their hands on the data, thus
I kept this a seperate section for quicker reference.

0x14877 = Start of a table of tiles used to replace lock blocks.
0x1498E = Start of a table of locations used to determine where the lock block will
be (or any tile to replace).
Format: XXXX SSSS
X = X co-ordinate of the tile (relative to the current screen)
S = Screen to change it on.

0x14955 = Start of table of locations used to determine where the lock block will
be (or any tile to replace).
Format: YYYY 0000
Y = Y co-ordinate
0 = Nothing.

In ROM Data:

Some routines/data tables used the global item table, which is a table that indicates
an item number directly into your inventory.

00 = Nothing
01 = Mushroom
02 = Fire Flower
03 = Leaf
04 = Frog Suit
05 = Tanooki Suit
06 = Hammer Bros. Suit
07 = Jugem's Cloud
08 = P-Wing
09 = Starman
0A = Anchor
0B = Hammer
0C = Whistle
0D = Music Box

This is used for things like Mushroom House item values or Princess gift item values.

0x3F0-0x3F6 = This is a properties table for power-ups. The bits do the following:
xxxx xxSF

S = Sliding disabled. If this is 1, you can't slide on hills.
F = Flying ability. If this is 1, you can fly.

Each index into the table corresponds to a power-up status. Thus, if you change 0x3F2
to 03 (0000 0011), then Fire Mario (index here is 2, 2 is fire power) will be able to fly
and not be able to slide on hills.

The x's have no effect.

0x133C = Amount of stay-in-shell time for most enemies who have shells.

0x1A3E = What Mario turns into after getting hit while having a power above Super Mario.

0x24EE = Table of sprites to output from certain ? blocks.
0x24EF = Sprite to put out of blocks that normally output a Flower
0x24F0 = Sprite to put out of blocks that normally output a Leaf
0x24F1 = Sprite to put out of blocks that normally output a Star
0x24F2 = Sprite to put out of blocks that normally output a Mushroom
0x24F3 = Sprite to put out of blocks that normally output a Vine
0x24F4 = Sprite to put out of blocks that normally output a 1-Up

0x2A56 = The bounce force to the right when hitting a 4 way bouncing
note block from the left.

0x2A50 = The bounce force to the left when hitting a 4 way bouncing
noteblock from the right.

0x6EA9 = Sprite that Boom-boom will leave behind when he explodes.

0x80A4 = This is the sprite that a Green Koopa Para-Troopa will turn into when they
lose their wings.

0x80AE = This is the sprite that a Para-Goomba will turn into when it's wings are
destroyed.

0x9368 = Left speed of many enemies
0x9369 = Right speed of many enemies

0xA837 = Amount of time a Venus Fire Trap will take from going into a pipe
and going back into it divided by 2. (default is 30, but it's multiplied by 2
for a total time of 60).

0xBDC3 = ParaBeetle right flying speed (x2 for "fast" beetles)

0xBDCD = ParaBeetle left flying speed (x2 for "fast" beetles)

0xFD75 = Sprite number that's generated from a Goomba generator.

0x103F1 = Amount of time Tanooki Mario can be a statue.

0x104F8 = Maximum running speed (must be atleast 7F to be able to fly).

0x10CAA = Amount of time Raccoon/Tannoki Mario can fly

0x11618 = Which tile acts like a coin.

0x11634 = Which tile acts like a P-switch.

0x11653 = Amount of time the P-switch will last. (default: 0x80)

0x11657 = The song value to be played during the P-Switch effect. (default: 0xA0)

0x1167E = Amount of time needed for an ice block to melt.

0x118A5 = Max number of coins you can get from the multi block coin.

0x118BA = Amount of time you have to get coins from a multi block coin.

0x11E6A = Amount of time required to hold down on magic white blocks to take effect.

0x11E6F = Amount of time the Magic white blocks take effect for.

0x1451F = Amount of time delay between the start of a world and when
Mario generates onto the screen.

0x14DF8 = Sound used when Mario moves over the map screen. (4F1 sound byte useD)

0x14DFA = Sound byte used when Mario goes over a map screen.

0x16190 = Hammer Bros. Item table. Here there is a big chunk of 00s and a few bytes that
are not 00. The groups of bytes that are _not_ 00 represent the items you receive from a
Hammer Bros. Examples are the first byte, 09, is world 1's Hammer Bros. item (a star).
Next is 0D0B0C which is world 2's (music box, hammer, whistle) and so on. The item values
are the exact same for the item values listed above. Note, world 8 has NO Hammer Bros. item
groups. Instead, the items in the treasure chests found there are defined by enemy level
data. When using the Help Sprite as a Hammer Bros. the item control is 2 bytes before the
normal Hammer Bros. group for that world. The Airship sprite uses the one after that

0x1625B = Horizontal starting position on every map screen (applies to all maps).

0x17C35 = Table of graphics banks used to animate map screen tiles.

0x1D233-0x1D235 = 16x16 tile id's that are used to draw the mushroom, star and flower
background in some plains levels.

0x2D1AD-0x2D1b0 = Number of 1-Ups you will receive from the roulette game. There are two
bytes that are 02, this is because there are two mushroom pictures in the roulette you can
match up.

0x2D721-0x2D732 = N-Spade card matching game initial deck. The deck is always shuffled
from code, so there's only 1 deck you can modify without ASM hacking. The values for each
card is as follows:
00 = Mushroom
01 = Flower
02 = Star
03 = 1-Up
04 = 10 Coins
05 = 20 Coins

0x309B0 = This is the left side of the curtains tile. This must be an even number, then
the tile to the right of this one will be the right side of the curtain. You cannot change
the number of tiles used to draw the curtains without ASM hacking.

0x309D5 = Debug mode activation/deactivation
Activated = 0xCC
Deactivated = 0x35

0x30C68 = Button to press to change game type.

0x30C6C = Sound to play when you press select at title screen. (4F6 sound byte)

0x30C6E = Sound byte to write to when you press select.

0x30C99 = Button to Press to start the game.

0x30C9D = The Sound to play when you start the game. (4F2 Sound byte)

0x30C9F = The sound byte to write to when you start the game (can change to music bytes too).

0x34123 = Status Bar's palette on the map screen after returning from the inventory box.

0x3509B = Number of coins needed for a 1-Up.

0x350AB = Sound played when you receive 100 coins (1up sound) (4F2 sound byte used)

0x350AD = Sound byte used when 100 coins are obtained.

0x360DE = Table of items the Princess will give you after completing a world. There are
7 bytes in all, but the 7th byte is 00, you can change this so that you gain an item for
beating world 7. For values, see Global item table.

0x3B14B = Table of items used to create Mushroom House treasure chests.
Some bytes affect the "all same items" mushroom houses. Meaning, if all the chest have
the same items, then only 1 byte is needed to define the chests, rather than 3. The first
5 bytes affect these type of mushroom houses. The 3rd is for all Frogs, 4th is all
Tanooki, 5th is all Hammer. 1st is All Whistles (never seen in the game), 2nd is all
P-Wings (also never seen in the game).I believe these two are used for White Mushroom
houses. The rest are 3 item houses. One type is 0A 0A 0A, all three anchors. This is the
ONLY exception to the same-type house rule. And remember, the definitions come in groups
of three. Example: The second set (bytes 9, 10, and 11) is 01, 02, 03, a set of three
defining the Mushroom, Flower, and Leaf type houses. For item values, see global item table.

0x3C474 = Graphics bank used for the title screen (upper half, bg side)

0x3C479 = Graphics bank used for the title screen (lower half, bg side)

0x3C47E = Graphics bank used for the title screen (first 1/4th, sprite side)

0x3C483 = Graphics bank used for the title screen (second 1/4th, sprite side)

0x3C488 = Graphics bank used for the title screen (third 1/4th, sprite side)

0x3C47D = Graphics bank used for the title screen (fourthg 1/4th, sprite side)

Routine Explanations:

BG tile animation routine: Used for action stages (not maps) for animating common objects, such as
bricks, coins, munchers, water, lava, etc.
$8E35 (0x3C345)

$8E35:AC 1A 07 LDY $071A ; This loads the current bank from lower left corner of the pattern table
$8E38:C0 6A CPY #$6A ; 6A is the bank for the Airship, which doesn't have animated bg tiles
$8E3A:F0 21 BEQ $8E5D ; thus skip the animating routine
$8E3C:A5 15 LDA $15 ; This loads the constant timer
$8E3E:29 03 AND #$03 ; used for battleship animated tiles
$8E40: D0 1B BNE $8E5D ; but skips it on xxxx xx00 since there's only 3 frames of animation
$8E42:C8 INY
$8E43:C8 INY
$8E44:C0 76 CPY #$76 ; 74 is the last bank for the battle ship animated tile sequence (70, 72, 74)
$8E46: D0 02 BNE $8E4A ; a table isn't used here, thus, Y (from 71A) is increased twice
$8E48:A0 70 LDY #$70 ; if it reaches 76, loop back to the first animation sequence (70)
$8E4A:8C 1A 07 STY $071A ; and store it into the gfx bank
$8E4D: D0 0E BNE $8E5D
$8E4F:A5 15 LDA $15 ; this loads the constant timer and indexes it for the global
$8E51:29 18 AND #$18 ; animated tiles (coins, ? blocks, munchers, etc)
$8E53:4A LSR
$8E54:4A LSR
$8E55:4A LSR
$8E56:AA TAX
$8E57: BD FC 83 LDA $83FC,X ; Loads a bank from the animation sequence (60, 62, 64, 66)
$8E5A:8D 1A 07 STA $071A ; and finally stores it into the ram for the lower left gfx bank

Bank swapping routine
$FC6F (0x3FC7F)
$FC6F:A9 46 LDA #$46
$FC71:8D 00 80 STA $8000 = #$00 ; Set up the $8000 register for $A000 swapping
$FC74:AD 1F 07 LDA $071F = #$00
$FC77:8D 01 80 STA $8001 = #$60 ; swap $A000 bank with value in 71F
$FC7A:A9 47 LDA #$47
$FC7C:8D 00 80 STA $8000 = #$00 ; Set up the $8000 register for $C000 swapping
$FC7F:AD 20 07 LDA $0720 = #$1A
$FC82:8D 01 80 STA $8001 = #$60 ; swap $A000 bank with value in 720
$FC85:60 RTS

Curtain drawing routine:

$A990 (0x309A0)
$A990:AD 02 20 LDA $2002 = #$09 ; Set up the PPU for drawing
$A993:A9 20 LDA #$20
$A995:8D 06 20 STA $2006 = #$40
$A998:A9 00 LDA #$00
$A99A:8D 06 20 STA $2006 = #$40
$A99D:A2 02 LDX #$02 ; The routine goes through 512 times *
$A99F:A9 08 LDA #$08 ; This is the first tile (left side) used to draw the curtain
$A9A1:A0 FF LDY #$FF ; * which is 256 from Y and twice from X
$A9A3:8D 07 20 STA $2007 = #$00
$A9A6:49 01 EOR #$01 ; This toggles from 08 and 09 (0000 1000 and 0000 1001)
$A9A8:88 DEY ; Thus using this routine, you can only use 2 tiles, side
; by side
$A9A9: D0 F8 BNE $A9A3
$A9AB:8D 07 20 STA $2007 = #$00
$A9AE:49 01 EOR #$01
$A9B0:CA DEX
$A9B1:10 EE BPL $A9A1
$A9B3:60 RTS

==========================================

I hope this is very refreshing for most people, and Happy Hacking!

____________________
Mah boi, romhacking is what all true warriors strive for!

I wonder what's for dinner?

KP9000
Posted on 04-03-10 02:00 AM Link | Quote | ID: 129407


Boomboom

Level: 90

Posts: 1258/1975
EXP: 6956161
Next: 232448

Since: 02-19-07

Last post: 3585 days
Last view: 3209 days


I don't think I saw anything in there regarding title screen music... Is there a byte that controls what song is played so I can choose something other than silence?

____________________

JaSp
Posted on 04-05-10 11:35 PM Link | Quote | ID: 129533


Shyguy
Level: 24

Posts: 72/95
EXP: 73318
Next: 4807

Since: 03-02-07
From: Paris, France

Last post: 4355 days
Last view: 4150 days
Posted by KP9000
I don't think I saw anything in there regarding title screen music... Is there a byte that controls what song is played so I can choose something other than silence?
Nope, you'll have to manually add a small ASM hack to do so.
It shouldn't be too hard though, you just need to write the song number to $4F5 via a small JSR, and I believe there's plenty of unused space in the title screen-related PRG bank.

KP9000
Posted on 04-06-10 01:15 AM (rev. 2 of 04-06-10 04:25 AM) Link | Quote | ID: 129535


Boomboom

Level: 90

Posts: 1264/1975
EXP: 6956161
Next: 232448

Since: 02-19-07

Last post: 3585 days
Last view: 3209 days


So, I'm to hijack some code and JSR to some free space, use the correct STA operand for writing to $4F5 in RAM, then RTS? Where is this hijack point?

Edit: I suppose I could use the data logger to find out what code is executed and just hijack some code from there. Maybe. I'm still an ASM noob so we'll see.

____________________

JaSp
Posted on 04-06-10 07:49 PM Link | Quote | ID: 129569


Shyguy
Level: 24

Posts: 73/95
EXP: 73318
Next: 4807

Since: 03-02-07
From: Paris, France

Last post: 4355 days
Last view: 4150 days
You have to find an 'hijack point' that is executed once when the game starts. You can try to set an execute breakpoint with the debugger at the reset address (it's a fixed address stored at the end of the PRG banks iirc, search it on mmc3 related documents); or just try to see a RAM value that is changed at the beginning of the game; or, easier, use DahrkDaiz's data, specifically the "curtain drawing routine", set an execute breakpoint at the first address executed ($A990), see from where this routine is called (should be a JSR since it ends with a RTS), insert your custom code here and restore the original JSR A990, then set the RTS.
(I just did it, and you should find $A8FC as the calling address)
But you're right in the theory, just make sure to restore the instruction(s) you replace before inserting the RTS.

KP9000
Posted on 04-18-10 01:20 AM Link | Quote | ID: 130040


Boomboom

Level: 90

Posts: 1275/1975
EXP: 6956161
Next: 232448

Since: 02-19-07

Last post: 3585 days
Last view: 3209 days


Freaking sweet, got it working. didn't even have to use any execute breakpoints either.

Anyway, I'm gonna have a lot of fun with this table of data. I think I'm gonna try and make another ASM hack with it.

____________________

Quick Curly
Posted on 04-18-10 08:18 AM Link | Quote | ID: 130050


Giant Red Paratroopa
Level: 77

Posts: 859/1443
EXP: 4174180
Next: 16949

Since: 06-15-08
From: Earth

Last post: 26 days
Last view: 26 days
Hey guys. It's been a while, hasn't it? I'm hoping that I'll be active again within the next couple of weeks since I'll be finishing up my main schooling for good, so I'm definitely looking forward to getting back into things here.

During the little free time that I've found here and there though, I've been looking into a few things and it brings me to a question. According to the aforementioned notes:

$71F = Current bank @ 0xA000
$720 = Current bank @ 0xC000

However, given the following scenarios, things don't seem to match up (for me). See, I was trying to create some sort of reference to make identifying the banks easier to simplify working with them, but got confused when the banks were seemingly loading into RAM backwards.

As seen in the first image, $71F = #$0A, but $A000 matches ROM offset 0x16010, while $720 = #$0B and $C000 matches ROM offset 0x14010. So this made me think that the PRG-ROM banks were labelled backwards in pairs...

However, as seen in the second image, $71F = #$0A, but now $A000 matches ROM offset 0x34010, and $720 = #$1A with $C000 still matching ROM offset 0x14010. At this point, I started to believe that instead of:

$71F = Current bank @ 0xA000
$720 = Current bank @ 0xC000

...really, it might actually have been:

$71F = Current bank @ 0xC000
$720 = Current bank @ 0xA000

...all along. However, considering the bank swapping routine, I was wondering if maybe the banks could be getting switched between $71F and $720?

So for labelling the banks, which of the following would be more correct, considering they probably aren't 100% right either way because I obviously messed up somewhere here or there? If someone could possibly help clarify and better explain what I'm missing here, I would greatly appreciate it. Thank you in advance! Also, sorry for being such a bother.


(Click images to enlarge.)

+----+---------+     +----+---------+     +----+---------+     +----+---------+
| 00 | 0x00010 | | 08 | 0x10010 | | 10 | 0x20010 | | 18 | 0x30010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 01 | 0x02010 | | 09 | 0x12010 | | 11 | 0x22010 | | 19 | 0x32010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 02 | 0x04010 | | 0A | 0x14010 | | 12 | 0x24010 | | 1A | 0x34010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 03 | 0x06010 | | 0B | 0x16010 | | 13 | 0x26010 | | 1B | 0x36010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 04 | 0x08010 | | 0C | 0x18010 | | 14 | 0x28010 | | 1C | 0x38010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 05 | 0x0A010 | | 0D | 0x1A010 | | 15 | 0x2A010 | | 1D | 0x3A010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 06 | 0x0C010 | | 0E | 0x1C010 | | 16 | 0x2C010 | | 1E | 0x3C010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 07 | 0x0E010 | | 0F | 0x1E010 | | 17 | 0x2E010 | | 1F | 0x3E010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+

+----+---------+     +----+---------+     +----+---------+     +----+---------+
| 01 | 0x00010 | | 09 | 0x10010 | | 11 | 0x20010 | | 19 | 0x30010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 00 | 0x02010 | | 08 | 0x12010 | | 10 | 0x22010 | | 18 | 0x32010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 03 | 0x04010 | | 0B | 0x14010 | | 13 | 0x24010 | | 1B | 0x34010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 02 | 0x06010 | | 0A | 0x16010 | | 12 | 0x26010 | | 1A | 0x36010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 05 | 0x08010 | | 0D | 0x18010 | | 15 | 0x28010 | | 1D | 0x38010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 04 | 0x0A010 | | 0C | 0x1A010 | | 14 | 0x2A010 | | 1C | 0x3A010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 07 | 0x0C010 | | 0F | 0x1C010 | | 17 | 0x2C010 | | 1F | 0x3C010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+
| 06 | 0x0E010 | | 0E | 0x1E010 | | 16 | 0x2E010 | | 1E | 0x3E010 |
+----+---------+ +----+---------+ +----+---------+ +----+---------+


I was also thinking for the longest time what a board collaborative SMB3 hack would be like. I recall Trelior touching upon the idea a long time ago, but unfortunately it was short-lived.

This idea was encouraged by that barrage of new SMB3 hackers that were joining, and all of the posts and topics that resulted during that highly active period of time. Each individual attempting to tackle the task of completing an entire hack by themselves is likely why we haven't seen or heard anything from them ever since their short times here, and it's upsetting for me at the very least because I enjoy, for one, seeing others achieve success, and secondly, people hacking SMB3. Everyone waiting for Reuben to finish and as a result not really working on anything SMB3 hacking-related was also discouraging as well, and as a result it seems like there hasn't really been any in-depth SMB3 hacking for months, at least as advertised around here. When you think about it as well, what was the last complete SMB3 hack that was released in the last few months? Really all I can think of offhand are Binary's Torturous Roots of Doom.

If it was possible and a handful of dedicated SMB3 hackers were truly interested, there's no doubt in my mind that a powerful team of us could see such a project through to the end, which wouldn't be as far away as if everyone was trying to make a hack on their own, which seems to be everyone's first attempt at least. In my mind, the more people who were to actually get involved, the less work there would be for everyone involved, and hopefully the end result would be a new, fun and complete SMB3 hack that we can all enjoy, which would also hopefully better motivate and promote the completion of other individual SMB3 hacks out there, as well as possibly Reuben, the Music Inserter, and Mario Adventure 3, etc.

I know there will likely be the naysayers out there, but I just feel that this time that everyone is spending doing nothing could be better spent. For all of us who truly love SMB3 like I know you all do... why not?

All we'd really have to do is first, find out who and how many people would be interested in such a project, share information and that, divide beginning/starting ground tasks, and then the magic should happen. I already have a couple people that I've spoken with who would actually be interested in this if it could actually happen, and I've made an attempt to reach a couple of those who like me took a little break but might possibly want to get in on this as well, so I'll wait and see what comes of that too.

Anyway, thanks for reading this if you did - I appreciate it - and thanks in advance if the aforementioned banks-related issue can be better explained.

KP9000
Posted on 04-18-10 11:58 AM Link | Quote | ID: 130056


Boomboom

Level: 90

Posts: 1276/1975
EXP: 6956161
Next: 232448

Since: 02-19-07

Last post: 3585 days
Last view: 3209 days


You know, I've been looking for someone to help me out with levels in my hack. However, I'm not so sure... Ill have to see. If anyone is gonna help me though it's someone that already has the latest beta Reuben build and the ROM as well, which leaves me with Quick Curly and JaSp that I know of off hand.

By the way, JaSp, could you PM me some details on your music hack so maybe I can take a look at the code and see 1) how it works and 2) fix some bugs that exist with random stuff...

____________________

Quick Curly
Posted on 04-18-10 02:11 PM Link | Quote | ID: 130058


Giant Red Paratroopa
Level: 77

Posts: 864/1443
EXP: 4174180
Next: 16949

Since: 06-15-08
From: Earth

Last post: 26 days
Last view: 26 days
Actually KP, I don't have the latest beta build of Reuben. In fact, I've never done anything with Reuben.

*Incoming "crazy" chants...*

Although I do like your one thought. If there was one hack that such a team would join over starting a collaborative SMB3 hack from scratch, I think it would definitely be your hack, KP. Your graphics are pretty well covered (a lot better than what I could come up with, for sure) and I really like your overall hack themes as well. It would unquestionably make for an excellent build, I believe.

KP9000
Posted on 04-18-10 02:32 PM Link | Quote | ID: 130062


Boomboom

Level: 90

Posts: 1277/1975
EXP: 6956161
Next: 232448

Since: 02-19-07

Last post: 3585 days
Last view: 3209 days


Really? I could have sworn...

Anyway, I'm trying to get a hold of DahrkDaiz to maybe get permission to let someone (like you) help with this hack. I have very big plans for this hack. I already have some great ASM hacks planned, most of which I can actually do!

____________________

Quick Curly
Posted on 04-18-10 07:48 PM Link | Quote | ID: 130072


Giant Red Paratroopa
Level: 77

Posts: 865/1443
EXP: 4174180
Next: 16949

Since: 06-15-08
From: Earth

Last post: 26 days
Last view: 26 days
Well for the collaborative SMB3 hack idea, I was leaning more towards it being moreover a huge benefit for the newer SMB3 hackers. Like I mentioned, I already have a few who would be willing to be a part of it. To make everyone jump directly to Reuben might be too overwhelming for them. The idea of helping to familiarize them with SMB3 Workshop and the basics of SMB3 hacking, as well as working in a group situation (I had to do that over the course of this final semester with a huge group project and surprisingly there is a change that one goes through over the course of a few short months, especially if you are only really familiar with individual or short, minor group projects) to better help them prepare for additional future projects that they were to be involved in, whether individual or group, so that they are better managed; and perhaps make a possible transition to Reuben in the future once it is actually completed more simplified and better managed as well. The original reasoning for this, of course, as previously mentioned, being the fact that new SMB3 hackers trying to manage an entire project on their own with little to no experience from anything similar beforehand and as a result not getting far or quitting altogether, and an attempt to better improve their involvement and overall results. That was the motivation for reintroducing this idea.

Of course, with my increasing availability within the next couple of weeks, I would have more than enough time to prepare some sort of instructional starting ground for them to refer to in order to quickly familiarize them with the basic dos and do-nots, like what I actually wanted to do long before Reuben came around; I've made small, personal tutorials for others in the past that I could simply slap together and build off of to simplify this.

Besides - Reuben wouldn't work on my computer anyway, I'll tell you that right now. SMB3 Workshop is also a personal preference, to be perfectly honest. For the extra capabilities of Reuben and all of that extra room that it allows one to work with, depending on how many people work on a single project with it, it could possibly take way longer than a couple individuals working with the original SMB3 utilities and methods. For instance, with Luigi's Chronicles 2, having to focus on each thing by myself (levels, maps, graphics, ASM, etc.) becomes more and more frustrating as time goes on, and similar to some recent MM hackers, I've reached the point that I just want to get it out of my life and be done with it so that I can move on to something new and fresh, such as the aforementioned idea. It would be refreshing for me, and also help be a real starting ground for the ROM hacking careers of the new, potentially big-shot SMB3 hackers of the years to come once we've all become too busy with personal life matters to be able to enjoy this anymore, which I can sincerely say I would want to be a part of helping to accomplish.

KP9000
Posted on 04-19-10 11:21 AM Link | Quote | ID: 130094


Boomboom

Level: 90

Posts: 1278/1975
EXP: 6956161
Next: 232448

Since: 02-19-07

Last post: 3585 days
Last view: 3209 days


Well, I chose to go with Reuben because my most frustrating things to deal with were:

1) Space available for levels, enemies
2) Pointer oddities
3) Data positioning
4) Graphics & TSA constraints
5) Its the same damn thing as every other hack.

With Reuben, I do have certain limitations as well, such as:

1) Vertical levels are buggy
2) Door pointers are also buggy
3) World Map animation properties/pipes/locks are still unsupported
4) Reuben is still in beta, and I can't get a hold of DD to discuss bugs and distribution of materials (for possible assistance with my hack)
5) Probably more that I can't remember at the moment.

I can justify using Reuben because I get far greater satisfaction due to the sheer power of the features it has:

1) I can make levels look absolutely stunning. Graphics limitations have been blown wide open.
- Almost unlimited palettes
- More than one tileset available for each TSA set (one fortress TSA set, two or more tilesets for it!)
2) Having a hack in progress using Reuben gives you a feeling of uniqueness. Nobody else (as far as I know) has a hack of this scale in progress using Reuben.
3) I am completely motivated to work on this hack because the most difficult aspects of hacking the original game are lifted!

Needless to say, I think this hack will be the first real work I will have completed.

I also have a few different levels to show off, so maybe some screenies might show up in my thread soon enough!

____________________

Quick Curly
Posted on 04-19-10 01:45 PM Link | Quote | ID: 130095


Giant Red Paratroopa
Level: 77

Posts: 868/1443
EXP: 4174180
Next: 16949

Since: 06-15-08
From: Earth

Last post: 26 days
Last view: 26 days
I understand why Reuben is your own personal preference and that's totally cool. The limitations that you were mentioning that Reuben helps throw out the window don't exactly bother me, so I guess that's why I'm just not interested in using it, again, as confusing as that may sound to everyone else. Plus graphics have never been a big deal to me, so being able to use whatever graphics you want in any case honestly doesn't really appeal to me. As for stuff producing with the original utilities and not with Reuben being the "same" thing with every SMB3 hack, that's not entirely the case. Every SMB3 hack is unique in its own way, and one doesn't have to work off the special ROM with Reuben to be able to implement new stuff. As well, just another personal preference, aside from the normal SMB3 ROM being smaller, but I would rather not work off of such a special ROM/build created by someone else, because think about it - how will that be different between all of the hacks produced using it? It'll still be similarly "the same" among them, because Reuben helping to remove those limitations wasn't done by one's own hand, but by DahrkDaiz, from which everyone is just using to simplify their own level, etc. editing.

Also, as for the collaborative SMB3 hack idea, I actually don't feel it anymore after a recent turn of events, so yeah. I already have other projects on the "back burner" that need finishing, so adding another one to it would probably just discourage me even more.

JaSp
Posted on 04-22-10 08:04 PM Link | Quote | ID: 130360


Shyguy
Level: 24

Posts: 74/95
EXP: 73318
Next: 4807

Since: 03-02-07
From: Paris, France

Last post: 4355 days
Last view: 4150 days
Hey there! Just got back from Japan

Anyway, a community hack is a good idea, however, and I think we've all seen this a lot in different game-making/ROM hacking communities that group projects often don't make it to the end; it would require really motivated people, and a really good organization.
As for me, I've been eager to go back into ROM hacking these last few months, however I won't be able to get fully dedicated to it until...well I don't know; having graduated recently I need to think about making money, so I'm starting to create independent games alone, and my focus is entirely dedicated to this.

@Quick Curly: For your prg bank problem, I'm not sure to have understood everything (sorry, little tired from the time shift), but a reason for this *might* be that sometimes the banks are switched without using $71F & $720 - i.e. switching to some code in a bank and then return to the original bank before the vblank is called, since the bank switching code ($FC6F iirc) is executed every frame.

@KP: I'll send you the asm sources for the Music Inserter via PM.

KP9000
Posted on 04-22-10 10:57 PM Link | Quote | ID: 130376


Boomboom

Level: 90

Posts: 1286/1975
EXP: 6956161
Next: 232448

Since: 02-19-07

Last post: 3585 days
Last view: 3209 days


First off, I'd have to thank Hamtaro for providing DD's notes. I appreciate it.

I am having trouble finding where the level header is stored in RAM, as well as where the table of sprites (that appear when you hit blocks) is. Anyone know?

I'm interested in bringing a person on board with my hack, but I'm already eyeballing blackhole89 for the role. It's up to him if he wants to join in... If any of you are interested I'd pretty much have to be convinced of your capabilities and dedication before I bring you on board. That is, if blacky doesn't/can't do it.

And, that's if I decide to bring in a second guy to work on this at all.

____________________
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23


Main - ROM Hacking - General SMB3 Hacking Thread New thread | New reply

Acmlmboard 2.1+4δ (2023-01-15)
© 2005-2023 Acmlm, blackhole89, Xkeeper et al.

Page rendered in 0.038 seconds. (359KB of memory used)
MySQL - queries: 133, rows: 172/178, time: 0.025 seconds.