Actions

SCHG

Sonic the Hedgehog (16-bit)

From Sonic Retro

Revision as of 23:04, 17 May 2007 by Upthorn (talk | contribs) (Sprite Status Table)
Sonicretro-round.svg This short article is in need of work. You can help Sonic Retro by adding to it.
Back to SCHG main page

ROM Hacking

Art Editing

There are several different tools that can be used to edit art besides the hex editor. SonED is probably the best tool to use for editing level art, and can also be used on palettes. HivePal is also a great tool for editing palettes. Sonik Sprite is useful for editing uncompressed art; it gets its name from its ability to edit Sonic's sprites. LOst Library is most likely the best choice for editing compressed art in the Nemesis format.

If, however, you still want to do it yourself, your best bet is to download the Sonic 1 Split disassembly. Decompress the archive into a new folder, and place your S1 ROM, in binary format and named "S1.bin", in that folder. Run the batch file "split.bat". This will split up all the art into its own binary files, which you can then decompress and edit. When you're done, run "combine.bat".

Uncompressed Art Locations

Most of this information was taken from Nemesis's guide. Please excuse any mistakes or misunderstandings, as that guide wasn't exactly well-written. A description is written in parentheses after the original name if I deem it necessary; if I don't know what it is, "Unknown" appears in that place. Please correct this if you know. It doesn't list the number of blocks taken up, so if you know, put it in. Otherwise, I'll find out eventually.

Uncompressed Art Locations

Offset Description # of blocks
Zone Independent
$1CADA Numbers used on counters in game ?
$21AFE Sonic ?
$6A324 Giant Ring ?
Green Hill Zone
$66AD6 Waterfall tiles ?
$66CD6 Flower with pointy petals ?
$670D6 Flower with curved petals ?
Marble Zone
$6755A Lava surface ?
$67836 Lava ?
$67E56 Flame torch against stone ?
Scrap Brain Zone
$68156 Steam in background ?

Compressed Art Locations - Nemesis

See SCHG:Sonic the Hedgehog/Nemesis Compressed Art.

Compressed Art Locations - Kosinski format

  • $3DCF2 - GHZ main level patterns
  • $414D4 - LZ main level patterns
  • $46016 - MZ main level patterns
  • $4A7FE - SLZ main level patterns
  • $510F0 - SYZ main level patterns
  • $57A66 - SBZ main level patterns

Palette Locations

Usually, it's not really necessary to edit a palette in hex. Palette editors give you instant feedback for each RGB value, and the palette can be easily saved as a separate binary and reimported into the ROM. However, it is sometimes desireable or necessary to do it in hex, and it can't hurt to know how it's done.

These are the ROM offsets of the palettes in Sonic 1, as listed by HivePal:

Name Offset
Sega Logo (Background) $2208
Sega Logo (SEGA) $20C0
Title Screen $2288
Title Screen - Water Cycle $1B66
Level Select $2308
Sonic $2388
Green Hill $23A8
Green Hill - Water Cycle $1B86
Labyrinth $2408
Labyrinth - Sonic Underwater $2828
Labyrinth - Sonic Underwater (Alt) $2468
Labyrinth - Underwater $2488
Labyrinth - Water Cycle $1BA6
Labyrinth - Conveyor Cycle $1BC6
Labyrinth - Conveyor Cycle Underwater $1BD8
Marble $24E8
Star Light $2548
Star Light lights $1C52
Spring Yard $25A8
Spring Yard - Cycle 1 $1C76
Spring Yard - Cycle 2 $1C96
Scrap Brain Act 1 $2608
Scrap Brain Act 2/Final $2668
Scrap Brain Act 3 $2748
Scrap Brain Act 3 - Sonic Underwater $2848
Scrap Brain Act 3 - Sonic Underwater (Alt) $27A8
Scrap Brain Act 3 - Underwater $27C8
Scrap Brain Act 1/Act 2 - Cycle 1 $1D0A
Scrap Brain Act 1/Act 2 - Cycle 2 $1D1A
Scrap Brain Act 1/Act 2 - Cycle 3 $1D2A
Scrap Brain Act 1/Act 2 - Cycle 4 $1D3A
Scrap Brain Act 1/Act 2 - Cycle 5 $1D46
Scrap Brain Act 1/Act 2 - Cycle 6 $1D56
Scrap Brain Act 1/Act 2 - Cycle 7 $1D66
Scrap Brain Act 1/Act 2 - Cycle 8 $1D86
Scrap Brain Act 2 - Cycle 1 $1D90
Scrap Brain Act 2 - Cycle 2 $1DA0
Scrap Brain Act 3 - Water Cycle $1BEA
Special Stage - Sonic $26C8
Special Stage No. 1 $26E8
Special Stage No. 2 $2708
Special Stage No. 3 $2728
Special Stage Title Card $2868
Special Stage Cycle 1 $4ACA
Special Stage Cycle 2 $4B12
Special Stage Cycle 3 $4B92
Continue - Sonic $28E8
Continue $2908
Ending - Sonic $2928
Ending $2948

Object Editing

Object Pointer List

Mappings Editing

Object Placement

RAM Hacking

Main System Memory Locations

Sprite Status Table

The Sprite Status Table is located at RAM address $D000. Each entry is $40 bytes long. Here is a list of all the values for one entry in the SST:

Offset Size Description
$00 byte Object type
$01 byte Action flags. The bitfield looks like this:
  • Bit 0 is the horizontal mirror flag. If set, the object will be flipped on its horizontal axis.
  • Bit 1 is the vertical mirror flag.
  • Bit 2 is the coordinate system flag. If clear, the object will be positioned by absolute screen coordinates. This is used for things like the HUD and menu options. If set, the object will be positioned by the playfield coordinates, i.e. where it is in a level. Sonic uses the playfield positioning system.
  • Bits 3, 4, and 5 are either unused, or their purpose is unknown.
  • Bit 6 is Sonic's "Ride B" flag
  • Bit 7 is the draw object flag. It will be set if the object was onscreen when it came time to draw things. Otherwise, it is clear. There should be no reason to edit this flag, but it's good to know what it does.
$02 word Starting art block.
  • First nybble: Palette line the sprite will use.
  • Latter 3 nybbles: Starting art block in VRAM for which the object reads from. Multiply by $20 to get VRAM address; divide VRAM address by $20 to get this value.
$04 long Mappings offset
$08 word
  • If in playfield positioning mode, it is the X playfield coordinate.
  • If in screen positioning mode, it is the X screen coordinate.
$0A word
  • If the object is in playfield positioning mode, this is the X subpixel coordinate.
  • If in screen positioning mode, it's the Y screen coordinate.
$0C word
  • If in playfield positioning mode, it is the Y playfield coordinate.
  • If in screen positioning mode, it is unused.
$0E word
  • If the object is in playfield positioning mode, this is the Y subpixel coordinate.
  • If in screen positioning mode, it is unused.
$10 word Horizontal (X) velocity
$12 word Vertical (Y) velocity
$14 byte Ground velocity (inertia).
$16 byte Height/2
$17 byte Width/2
$18 byte Sprite priority (00 = front).
$19 byte Width of the object, in pixels
$1A byte Current animation frame to display. i.e, the frame currently being displayed on-screen, according to the animation script (currently parsed mappings frame, in other words).
$1B byte Current frame in animation script. i.e, the frame entry IN the animation script being currently processed.
$1C byte Animation number. When an animation ID is moved here, it's processed and displayed.
$1D byte Restart animation flag (when $1D is not equal to $1C, animation restarts)
$1E byte Animation frame duration (time until next frame).
$20 byte Collision response bitfield. Tells what the object will do if hit by the character. The bitfield is in the format TTSS SSSS. TT is the type of collision - 00 is enemy, 01 increments the routine counter, 10 is harm, and 11 seems to be a special thing for the starpole. SSSSSS is the size, lifted from a lookup table in the collision response routine.
$21 byte Custom collision property, for special interaction with Sonic. This is used by bosses, badniks, bumpers and other objects. The way in which this byte is used is different for each object. Bosses use this byte as a hit counter.
$22 byte Status bitfield.

Counting from the least significant bit:

Bit Hex Description
0 $01 X Orientation. Clear is left and set is right.
1 $02 Y Orientation. Clear is right-side up, and set is upside-down
2 $04 Unknown or unused.
3 $08 Set if Sonic is standing on this object.
4 $10 Unknown or unused.
5 $20 Set if Sonic is pushing on this object.
6 $40 Unknown or unused.
7 $80 Unknown or unused.
Note that these bits have different meanings for Sonic (see below).
$23 byte Respawn index reference number, used by badniks, rings and monitors. Each destroyable object is assigned an index number (01, 02, 03 etc.) which refers to a list at $FC00 in the RAM.
$24 byte Routine counter.
$25 byte Second routine counter. This is used for some of the more complicated objects.
$26 word Angle.
$28 byte Object subtype. For example, the current monitor selected. See the Object List above for values. Has a different meaning for Sonic.
$29-$3F Object's scratch RAM
Object-specific variables
Offset Size Description
$22 byte Sonic: Special bitfield. Counting from the least significant bit:
Bit Hex Description
0 $01 Orientation. Clear is left and set is right.
1 $02 Set if Sonic is in the air (jump counts).
2 $04 Set if jumping or rolling.
3 $08 Set if Sonic isn't on the ground but shouldn't fall. (Usually when he is on a object that should stop him falling, like a platform or a bridge.)
4 $10 Set if jumping after rolling.
5 $20 Set if pushing something.
6 $40 Set if underwater.
7 $80 Unused.

You can add the hex values together to use multiple settings at once. Also notice that the first 3 bits (0-2) are used in the character object as a second routine counter.

$28 byte Sonic: Seconds of air left. Usually $1E; it decrements every second while the player is underwater. Beeps on $18, $13, and $0E. Countdown starts on $0B.
$2B byte Sonic: Unused
$30-$31 word Sonic: Remaining invulnerability time. Starts at $0078 after Sonic is hit, and seems to decrement every frame until it reaches $0000.
$32-$33 word Sonic: Remaining time of invincibility.
$34-$35 word Sonic: Remaining time of Speed Shoes.
$36 byte Sonic: Angle of ground at Sonic's front collision hot spot ($03 is "edge of ground")
$37 byte Sonic: Angle of ground at Sonic's rear collision hot spot
$39 byte Sonic: Unused.
$3A-$3B word Sonic: Unused.
$3C byte Sonic: Set if jumping.
$3D byte Sonic: SST index of object currently being stood on. (multiply by $40 and add $D000 to get the object's address).
Boss Variables
Offset Size Description
$21 byte Hit counter. Number of hits it takes to defeat a boss.
$30 word X position
$38 word Y position
$3E byte Number of times to flash when hit
Sonic Community Hacking Guide
General
SonED2 Manual | Subroutine Equivalency List
Game-Specific
Sonic the Hedgehog (16-bit) | Sonic the Hedgehog (8-bit) | Sonic CD (prototype 510) | Sonic CD | Sonic CD (PC) | Sonic CD (2011) | Sonic 2 (Simon Wai prototype) | Sonic 2 (16-bit) | Sonic 2 (Master System) | Sonic 3 | Sonic 3 & Knuckles | Chaotix | Sonic Jam | Sonic Jam 6 | Sonic Adventure | Sonic Adventure DX: Director's Cut | Sonic Adventure DX: PC | Sonic Adventure (2010) | Sonic Adventure 2 | Sonic Adventure 2: Battle | Sonic Adventure 2 (PC) | Sonic Heroes | Sonic Riders | Sonic the Hedgehog (2006) | Sonic & Sega All-Stars Racing | Sonic Unleashed (Xbox 360/PS3) | Sonic Colours | Sonic Generations | Sonic Forces
Technical information
Sonic Eraser | Sonic 2 (Nick Arcade prototype) | Sonic CD (prototype; 1992-12-04) | Dr. Robotnik's Mean Bean Machine | Sonic Triple Trouble | Tails Adventures | Sonic Crackers | Sonic 3D: Flickies' Island | Sonic & Knuckles Collection | Sonic R | Sonic Shuffle | Sonic Advance | Sonic Advance 3 | Sonic Battle | Shadow the Hedgehog | Sonic Rush | Sonic Classic Collection | Sonic Free Riders | Sonic Lost World
Legacy Guides
The Nemesis Hacking Guides The Esrael Hacking Guides
ROM: Sonic 1 | Sonic 2 | Sonic 2 Beta | Sonic 3

Savestate: Sonic 1 | Sonic 2 Beta/Final | Sonic 3

Sonic 1 (English / Portuguese) | Sonic 2 Beta (English / Portuguese) | Sonic 2 and Knuckles (English / Portuguese)
Move to Sega Retro
Number Systems (or scrap) | Assembly Hacking Guide | 68000 Instruction Set | 68000 ASM-to-Hex Code Reference | SMPS Music Hacking Guide | Mega Drive technical information