Actions

SCHG

Difference between revisions of "Sonic the Hedgehog (16-bit)/RAM Editing"

From Sonic Retro

m (Main System Memory Locations)
(Main System Memory Locations)
Line 77: Line 77:
 
| $F620-$F621
 
| $F620-$F621
 
| Value of $F718 for previous frame
 
| Value of $F718 for previous frame
 +
|-
 +
| $F64C
 +
| Water Level
 
|-
 
|-
 
| $F680
 
| $F680
Line 92: Line 95:
 
| $F70C-$F70D
 
| $F70C-$F70D
 
| Plane B y-position
 
| Plane B y-position
 +
|-
 +
| $F728
 +
| Levels Left Boundary
 +
|-
 +
| $F72A
 +
| Levels Right Boundary
 
|-
 
|-
 
| $F73E-$F73F
 
| $F73E-$F73F
 
| Y-camera position, based on Sonic ($60 = default)
 
| Y-camera position, based on Sonic ($60 = default)
 +
|-
 +
| $F742
 +
| Resize Level Routine Counter (Mainly Used For Act 3)
 
|-
 
|-
 
| $F744
 
| $F744
Line 113: Line 125:
 
| $F7AA
 
| $F7AA
 
| Screen Lock Flag (Set to lock screen)
 
| Screen Lock Flag (Set to lock screen)
 +
|-
 +
| $F7AC-$F7AF
 +
| Used by Sonic Loops Routine to Check if You Are in Any Chunk Written in Loopnums File (Used Mainly for Loops)
 
|-
 
|-
 
| $F7CC
 
| $F7CC
Line 118: Line 133:
 
|-
 
|-
 
| $F7C8
 
| $F7C8
| Ignore mode Flag (If set to else than 0, skip Obj01_Modes routine)
+
| Ignore Mode Flag (If set to else than 0, skip Obj01_Modes routine)
 
|-
 
|-
 
| $F800-$FA7F
 
| $F800-$FA7F
Line 137: Line 152:
 
| $FC00-$FD7F
 
| $FC00-$FD7F
 
| Destroyable object state table
 
| Destroyable object state table
 +
|-
 +
| $FC44
 +
| Error Message Shown
 +
|-
 +
| $FE00
 +
| Unknown (Needed to Start the Game)
 
|-
 
|-
 
| $FE02
 
| $FE02
Line 161: Line 182:
 
| $FE18
 
| $FE18
 
| Continues
 
| Continues
 +
|-
 +
| $FE1A
 +
| Time Over Flag (For checking if time is over when died) [I think this is supposed to be in word, instead of byte it is originally in]
 
|-
 
|-
 
| $FE1C
 
| $FE1C

Revision as of 12:23, 13 October 2012

SCHG: Sonic the Hedgehog

Main System Memory Locations

This is a map of 68k memory as used by the main gameplay engine. Note that any numbers entered (for example, score or number of rings) will have to be converted to hex first.

These are the offsets in RAM. To convert them to Genecyst savestate offsets, add $2478. For use in disassemblies, simply add $FF0000 for addresses below $8000 and $FFFF0000 for addresses above or equal to $8000, for example, Sonic's top speed here is $F760, but in the disassembly it is referenced as $FFFFF760. This is useful for finding what bits of code do what when the purpose of a RAM variable is known, or conversely for figuring out the purpose of a RAM variable by looking at the referencing code.

RAM offset Description
$0000 - $A3FF Chunk mappings
$A400 - $A7FF Level layout (1 byte per chunk, $40 bytes per line, lines for planes A and B interlaced)
$A800 - $A9FF 16 pixel scroll buffer primarily used for SLZ (4 bytes = one 16 pixel'd block scroll for FG and BG), this data is transfered/converter correctly to $CC00 - $CFFF (Scroll RAM cache).
$AA00 - $ABFF Nemesis decompression buffer
$AC00 - $AFFF Sprite table (2 bytes per sprite + 2 bytes per priority level, each priority level takes $80 bytes.)
$B000 - $C7FF Block mappings
$C800 - $CAFF Sonic's art buffer. Sonic's dynamic pattern reloading routine copies the relevant art over here, from where it is DMAed to VRAM every V-int.
$CB00 - $CBFF Sonic previous position array (used for invincibility stars and such)
$CC00 - $CF7F Scroll RAM cache (sent to VRAM every frame via DMA)
$CF80 - $CFFF Free RAM space
$D000 - $D7FF Reserved object SST space
$D800 - $EFFF Main SST space
$F000 - $F5FF Flags used by the sound engine
$F600 Screen Mode
  • $00 - Sega Screen
  • $04 - Title Screen
  • $08 - Demo Mode
  • $0C - Normal Level
  • $10 - Special Stage
  • $14 - Continue Screen
  • $18 - Ending Sequence
  • $1C - Credits
$F614-$F615 An universal counter, mainly used for time to display screens (like the title screen and the demo mode)
$F616-$F617 Plane A y-position for previous frame
$F618-$F619 Plane B y-position for previous frame
$F61A-$F61B Plane A x-position for previous frame
$F61C-$F61D Plane B x-position for previous frame
$F61E-$F61F Value of $F71C for previous frame
$F620-$F621 Value of $F718 for previous frame
$F64C Water Level
$F680 Address queue for Pattern Load Cues
$F700-$F701 Plane A x-position
$F704-$F705 Plane A y-position
$F708-$F709 Plane B x-position
$F70C-$F70D Plane B y-position
$F728 Levels Left Boundary
$F72A Levels Right Boundary
$F73E-$F73F Y-camera position, based on Sonic ($60 = default)
$F742 Resize Level Routine Counter (Mainly Used For Act 3)
$F744 Scroll Hold Flag (set to stop all scrolling dead)
$F754-$F755
$F756-$F757
$F758-$F759
$F75A-$F75B
Bitfields used by the scrolling engine
$F760-$F761 Sonic's Top Speed
$F762-$F763 Sonic's Acceleration
$F764-$F765 Sonic's Deceleration
$F7AA Screen Lock Flag (Set to lock screen)
$F7AC-$F7AF Used by Sonic Loops Routine to Check if You Are in Any Chunk Written in Loopnums File (Used Mainly for Loops)
$F7CC Joypad Control Lock Flag (Set to prevent joypad control of Sonic)
$F7C8 Ignore Mode Flag (If set to else than 0, skip Obj01_Modes routine)
$F800-$FA7F Sprite Table Buffer (sent to VRAM every frame via DMA)
$FA00-$FA7F Target underwater palette (is overwritten by the "BuildSprites" routine after being processed)
$FA80-$FAFF Normal underwater palette
$FB00-$FB7F Normal palette
$FB80-$FBFF Target palette (calling Pal_FadeTo will brighten the normal palette until it is the same as the target palette)
$FC00-$FD7F Destroyable object state table
$FC44 Error Message Shown
$FE00 Unknown (Needed to Start the Game)
$FE02 Restart Level Flag (Set to restart level)
$FE04 Level Timer
$FE08 Set if debug mode is being used
$FE10-$FE11 Zone/Act
$FE12 Lives
$FE14 Remaining Air (When underwater)
$FE16 Last Special Stage Entered
$FE18 Continues
$FE1A Time Over Flag (For checking if time is over when died) [I think this is supposed to be in word, instead of byte it is originally in]
$FE1C Lives Counter (Set to update lives total on screen)
$FE1D Ring Counter (Set to update rings total on screen)
$FE1E Time Counter (Set to update current time on screen)
$FE1F Score Counter (Set to update score total on screen)
$FE20-$FE21 Rings
$FE22-$FE25 Time
$FE26-$FE29 Score
$FE2C Shield Flag (Set to take a single hit without losing rings)
$FE2D Invincibility Flag (Set to make Sonic invincible)
$FE2E Speed Shoes Flag (Set to activate speed shoe physics)
$FE2F Unused flag (cleared when level starts but purpose is unknown)
$FE30 Lamppost Counter
$FE57 Emeralds
$FFF0 Demo mode flag
$FFF2 Demo number
$FFF4 Credits Index Number
$FFF8 Region (0 is USA, 1 Japanese (?))
$FFFA Debug Flag (Set to enable debug mode)
$FFFC Checksum flag ( 'init' is set when routine has ran)
$FFFE Unused

Unused/Used RAM Addresses starting from $FF00

RAM Adresses Size Status
$FF00 - $FF0F $10 Unused
$FF10 - $FF13 $04 Used
$FF14 - $FF17 $04 Unused
$FF18 - $FF37 $20 Used
$FF38 - $FF7F $48 Unused
$FF80 - $FF85 $06 Used
$FF86 - $FFB7 $32 Unused
$FFB8 - $FFBB $04 Used
$FFBC - $FFDF $24 Unused
$FFE0 - $FFE7 $08 Used
$FFE8 - $FFE9 $02 Unused
$FFEA - $FFF1 $08 Used
$FFF2 - $FFF4 $03 Used
$FFF5 - $FFF7 $03 Unused
$FFF8 - $FFFF $08 Used

Object Status Table Format

The Object 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 OST:

Offset Size Description
$00 byte Object type
$01 byte Render flags. The bitfield looks like this:
Bit Hex Description
0 $01 This is the horizontal mirror flag. If set, the object will be flipped on its horizontal axis.
1 $02 This is the vertical mirror flag.
2/3 $04/$08 These are the coordinate system. If 0, the object will be positioned by absolute screen coordinates. This is used for things like the HUD and menu options. If 1, the object will be positioned by the playfield coordinates, i.e. where it is in a level. If 2 or 3, the object will be aligned to the background somehow (perhaps this was used for those MZ UFOs).
4 $10 This is the assume height flag. The object will be drawn if it is vertically within x pixels of the screen where x is #$20 if this flag is clear or $16(a0) if it is set.
5 $20 This is the raw mappings flag. If set, just 5 bytes will be read from the object's mappings offset when the BuildSprites routine draws the object, and these will be interpreted in the normal manner to display a single Genesis sprite. This format is used for objects such as breakable wall fragments.
6 $40 This is Sonic's "Ride B" flag
7 $80 This is the on-screen flag. It will be set if the object is on-screen, and clear otherwise.
$02 word The lower 11 bits of this represent the starting art block. This is an index into an array of cells; to get the actual address, multiply by $20. Bits 14 and 13 are used to specify the default palette line the sprite uses, and bit 15 is the priority flag - if this is set, the sprite will be given high priority.
$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 word Ground velocity (inertia).
$16 byte Vertical radius of the object's hitbox.
$17 byte Horizontal radius of the object's hitbox.
$18 byte Sprite priority (00 = front, 03 = behind).
$19 byte Horizontal radius of the object's visible sprite.
$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 is "special", used for the starpole, caterkiller, yadrin and some other objects. 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
Sonic-specific variables
Offset Size Description
$22 byte 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 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.
$29-$2F Unused (scratch RAM)
$30-$31 word Remaining invulnerability time. Starts at $0078 after Sonic is hit, and seems to decrement every frame until it reaches $0000.
$32-$33 word Remaining time of invincibility.
$34-$35 word Remaining time of Speed Shoes.
$36 byte Angle of ground at Sonic's front collision hot spot ($03 is "edge of ground")
$37 byte Angle of ground at Sonic's rear collision hot spot
$39 byte Unused.
$3A-$3B word Unused.
$3C byte Set if jumping.
$3D byte OST index of object currently being stood on. (multiply by $40 and add $D000 to get the object's address).
$3E-$3F word Control lock timer. Set to lock left and right controls after hitting a spring or running down a slope.
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