Sonic the hedgehog CD
Sonic the hedgehog CD Beta 510 hacking guide
By Sonic 65 on June 29 2005.
Thanks to Nemesis and Erik JS.
For these notes, I am assuming you know the hexadecimal system and have
basic hacking skills. If you do not, I suggest you go to the SSRG and read the
SCD works differently from any other Sonic game. All of the level data
(level layout, compressed art, Sonic sprites, etc) is stored in its
respective *.MMD file. *.MMD files are contained within the ISO.
Thanks to this system, there is an astounding repetetiveness in each
*.MMD. Each *.MMD has its own Sonic sprite, even though Sonic looks the
same throughout the whole game. Each *.MMD has its own checkpoint
art, even though the checkpoints never change art. This means that
there are 70 versions of one common piece of art. If you want to edit
that art fully, you must comb through each level *.MMD and substitute
the regular art with the replaced art.
The level *.MMDs have the filename format RXYZ__.MMD:
X is the zone. R1 is zone 1.
Y is the act R12 is zone 1, act 2.
Z is the time period. There are 4 letters that can be put here; A,
B, C, or D. A is the present period. B is the past period. C is the bad
future period. D is the good future period. So R12D__.MMD would contain
act 2 of zone 1, in the good future period.
As said in the introduction, SCD consists if many files. This part of
the guide will tell you what offset each file is located at in the ISO.
Note that this list is incomplete; only 71 of the 88 files in SCD 510
are listed here.
Level *.MMD locations:
This list runs from B800 to 188B7FF.
PPZ1 Present: B800 - 4B7FF
PPZ1 Past: 4B800 - 8B7FF
PPZ1 Bad Future: 8B800 - CB7FF
PPZ1 Good Future: CB800 - 10B7FF
PPZ2 Present: 10B800 - 14B7FF
PPZ2 Past: 14B800 - 18B7FF
PPZ2 Bad Future: 18B800 - 1CB7FF
PPZ2 Good Future: 1CB800 - 20B7FF
PPZ3 Bad Future: 20B800 - 24B7FF
PPZ3 Good Future: 24B800 - 28B7FF
CCZ1 Present: 28B800 - 3CB7FF
CCZ1 Past: 3CB800 - 40B7FF
CCZ1 Bad Future: 40B800 - 44B7FF
CCZ1 Good Future: 44B800 - 48B7FF
CCZ2 Present: 48B800 - 4CB7FF
CCZ2 Past: 4CB800 - 50B7FF
CCZ2 Bad Future: 50B800 - 54B7FF
CCZ2 Good Future: 54B800 - 58B7FF
CCZ3 Bad Future: 58B800 - 5CB7FF
CCZ3 Good Future: 5CB800 - 60B7FF
TTZ1 Present: 60B800 - 64B7FF
TTZ1 Past: 64B800 - 68B7FF
TTZ1 Bad Future: 68B800 - 6CB7FF
TTZ1 Good Future: 6CB800 - 70B7FF
TTZ2 Present: 70B800 - 74B7FF
TTZ2 Past: 74B800 - 78B7FF
TTZ2 Bad Future: 78B800 - 7CB7FF
TTZ2 Good Future: 7CB800 - 80B7FF
TTZ3 Bad Future: 80B800 - 84B7FF
TTZ3 Good Future: 84B800 - 88B7FF
QQZ1 Present: 88B800 - 8CB7FF
QQZ1 Past: 8CB800 - 90B7FF
QQZ1 Bad Future: 60B800 - 94B7FF
QQZ1 Good Future: 94B800 - 98B7FF
QQZ2 Present: 98B800 - 9CB7FF
QQZ2 Past: 9CB800 - 100B7FF
QQZ2 Bad Future: 100B800 - 104B7FF
QQZ2 Good Future: 104B800 - 108B7FF
QQZ3 Bad Future: 108B800 - 10CB7FF
QQZ3 Good Future: 10CB800 - 110B7FF
WWZ1 Present: 110B800 - 114B7FF
WWZ1 Past: 114B800 - 118B7FF
WWZ1 Bad Future: 118B800 - 11CB7FF
WWZ1 Good Future: 11CB800 - 120B7FF
WWZ2 Present: 120B800 - 124B7FF
WWZ2 Past: 124B800 - 128B7FF
WWZ2 Bad Future: 128B800 - 12CB7FF
WWZ2 Good Future: 12CB800 - 130B7FF
WWZ3 Bad Future: 130B800 - 134B7FF
WWZ3 Good Future: 134B800 - 138B7FF
SSZ1 Present: 138B800 - 13CB7FF
SSZ1 Past: 13CB800 - 140B7FF
SSZ1 Bad Future: 140B800 - 144B7FF
SSZ1 Good Future: 144B800 - 148B7FF
SSZ2 Present: 148B800 - 14CB7FF
SSZ2 Past: 14CB800 - 150B7FF
SSZ2 Bad Future: 150B800 - 154B7FF
SSZ2 Good Future: 154B800 - 158B7FF
SSZ3 Bad Future: 158B800 - 15CB7FF
SSZ3 Good Future: 15CB800 - 160B7FF
MMZ1 Present: 160B800 - 164B7FF
MMZ1 Past: 164B800 - 168B7FF
MMZ1 Bad Future: 168B800 - 16CB7FF
MMZ1 Good Future: 16CB800 - 170B7FF
MMZ2 Present: 170B800 - 174B7FF
MMZ2 Past: 174B800 - 178B7FF
MMZ2 Bad Future: 178B800 - 17CB7FF
MMZ2 Good Future: 17CB800 - 180B7FF
MMZ3 Bad Future: 180B800 - 184B7FF
MMZ3 Good Future: 184B800 - 188B7FF
ATTACK.BIN: 1203000 - 1203A77
The object layout of an *.MMD starts at 7320. The object positioning of
a object is formatted as follows:
XXXX YYYY OOSS FFFF
I think this is the same type of positioning as S1. XXXX is 2 bytes
long, and is the X location of the object. YYYY is 2 bytes long as
well, and is the Y location of the object. OO is a byte long, and is
the primary object type. SS is also a byte long, and is the object's
subtype. An object's subtype is a value that is used to determine what
type of one object it is. For example, take the Orbinaut from LZ in S1.
If you changed its subtype to a certain value, it would never fire its
spikes like the Orbinaut in SLZ.
The level layout of an *.MMD begins at 3AB76. It's basically an array
of tile values. An array is just a huge collection of data, to put it
simply. The values go left to right for one row, and then after that
row is cleared go to the next row. Let's say I wanted to make the
following level layout.
00 00 00 00
00 00 00 12
09 09 11 10
Pretend that the 09 is normal ground, 10 is deeper ground, 11
is the first part of a slope going up, and 12 is the second part of a
slope going up. This would appear in a grid of tiles as:
This would appear in hex as 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 12 09 09 09 09 09 09 11 10. I hope that you understood this section.
The palletes are in the same format as the Genesis; 0BGR. For example,
068A would be blue to 6 lightness, green to 8 lightness, and red to A
lightness. Note that the colors can only be in increments of two.
So color 066C would be blue to 6 lightness, green to 6 lightness, and
red to C lightness. This would make this color. Hopefully
you understand this.
These are the palette locations in the *.MMDs:
5D0: Sonic 1 palette (line 1)
5F0: Sonic 1 palette (line 2)
610: Sonic 1 palette (line 3)
630: Sonic 1 palette (line 4)
650: Sonic 1 level select pallete (line 1)
670: Sonic 1 level select pallete (line 2)
690: Sonic 1 level select pallete (line 3)
6B0: Sonic 1 level select pallete (line 4)
6D0: Sonic's pallete
6F0: Zone Pallete (line 1)
710: Zone Pallete (line 2)
730: Zone Pallete (line 3)
750: Mirror of Zone Pallete (line 1)
770: Mirror of Zone Pallete (line 2)
790: Cycling Pallete of Level
EDE4: Amy's pallete (used to substitute zone pallete line 1)
This is an extremely (to the power of 9000) incomplete list of the
compressed art contained in SCD 510. Strangely, there are two instances
of one compressed item for each *.MMD; one in the *.MMD area and one in
the A***** area. This is soon going to be converted so it will
refer to the *.MMD area, but for now it refers to the A***** area. If I
continue this, the list will be completed in two months, but if I use
the *.MMD area, it will take only about half a month to finish.
Note that these locations are for the actual SCD ISO.
A036C8: PPZ Present 8x8s
A07B2A, A47B2A: Conveyor belt
A07C8A, A44DB8, A47C8A: Unknown; switch?
A07CDC, A07E9A: Animals (bird, squirrel)
A08AD4: Unknown; spiky bush?
A08B8A: Unknown; I have no idea
A08CCE: Rotund beetle badnik
A09BA0, A09F9C: Unknown; OMG ANOTHER ONE
A0B40A, A4B40A, A8B40A: Text that says '1000' when mapped
A0B42C, A4B42C, A8B42C: Bricks
A0B512, A4B512, A8B512: Unknown
A39E0A: Giant ring
A3A214, A7A214: GOAL sign
A3A3D4, A7A3D4: End-of-level spinning signpost
A3A9A0, A7A9A0: End-of-level text and HUD (in determining score)
A3B6AA, A7B6AA: Title card
A3C75A, A7C75A: Unknown
A3CA66, A7CA66: Springs
A3CC88, A7CC88: Monitors
A3D28C, A7D28C: Explosions
A3D774, A7D774: Rings
A3DDE8, A7DDE8: HUD, as used in level
A3DF14, A7DF14: Checkpoint
A3E06E, A7E06E: Unknown; flowers?
A3E290, A7E290: Big blocky letters; never seen them in the game
A44CD8: Unknown; ???
A44E0A: Unknown; ????
A44E88: Small metal platform with yellow and black stripes
A44F50: Unknown; platform?
A45B82: Spike balls
A45C44: Metal platform with multiple layers
A45D24: Garbled graphics; may be mappings
A45F7C: Machine using rockets
A46AB6: Metal Sonic's machine
A46C8E: Metal Sonic
It's tweaking time! This section will give you steps to do some general
tweaking of the ISO, and why that does what it does.
How many rings to lose when hit:
In your hex editor, search for 33 FC 00 00 00 FF 12 20. This basically
moves 000000 to 00FF12 (the offset in the RAM that contains how many
rings you have) when you get hit. Change the 0000 to whatever value you
want. If you want to lose no rings entirely, change 33 FC 00 00 00 FF
12 20 to 4E 71 4E 71 4E 71 4E 71. That tells the game to do nothing.
Note that this code appears in every *.MMD.
Back to: Sonic the hedgehog CD
Table of contents