Actions

SCHG

Sonic the Hedgehog (8-bit)

From Sonic Retro

This is the Sonic Community Hacking Guide for Sonic the Hedgehog. The Guide is based on work by David Declerck[1][2], Kroc Camen and Penta Penguin. The Music Hacking Guide is based on notes by ValleyBell.

Community Help

A great deal is not yet understood about the ROM. In order to help with the building of tools (such as level / sprite editors), here is a list of some of the things that need investigating:

  • Sprite Mappings: How sprites are mapped from their object values to the actual sprite art tile indices is not known. Whilst we can load sprite art, we do not know how to read from the ROM where the enemy sprite is in the sprite art, how it is constructed and how the Object Layout relates to that. This knowledge is needed to create a level editor that allows changing of sprite sets for existing levels
  • Solidity Data: The Level Headers contain a "Solidity Pointer" -- an index to somewhere in the ROM where data defines which tiles are solid / passable. This data is most likely 256 bytes long (one byte for each tile) and will need to define various states such as sloped tiles, water tiles (with current) and possibly much more. It is not known where the solidity data is stored, nor what format it is in. This knowledge is needed to modify Level Art.
  • Level Headers: Various portions of the Level Headers are undocumented. Experiments are needed to work out the effects of the undocumented header bytes and to better understand existing ones. A full chart of the level header values is here. This knowledge is needed to create a level editor with the ability to work from a blank canvas
  • Disassembly: The ROM has not been fully disassembled. For a total understanding of the game to allow complete control over every facet, a full disassembly is recommended. Moderate Z80 skills are required for this. There are many reasons why a disassembly would be beneficial:
    • Fix bugs / slowdown
    • Add new features such as a spin dash
    • Move the ROM to 512K so that content can have room to grow
    • Add new badnicks, traps bosses and more

If you have anything to contribute regarding these unknowns:

  • Update this page, add to the discussion page or post on the forums if you have an account
  • Contact Kroc Camen here

ROM Map

Master System

Offset Description
$00000 – ? Main Game Code
$0024B$0026A Labyrinth Act 1-2 Underwater Palette
$0026B$0028A Labyrinth Act 3 Underwater Palette
$00F0E$00F2D Map Screen 1 Palette
$00F2E$00F4D Map Screen 2 Palette
$01209$0122C Zone Title Pointers:
Offset Description
$012090A Green Hill Act 1 (=$122D)
$0120B0C Green Hill Act 2 (=$122D)
$0120D0E Green Hill Act 3 (=$122D)
$0120F10 Bridge Act 1 (=$123C)
$0121112 Bridge Act 2 (=$123C)
$0121314 Bridge Act 3 (=$123C)
$0121516 Jungle Act 1 (=$124B)
$0121718 Jungle Act 2 (=$124B)
$012191A Jungle Act 3 (=$124B)
$0121B1C Labyrinth Act 1 (=$125A)
$0121D1E Labyrinth Act 2 (=$125A)
$0121F20 Labyrinth Act 3 (=$125A)
$0122122 Scrap Brain Act 1 (=$1269)
$0122324 Scrap Brain Act 2 (=$1269)
$0122526 Scrap Brain Act 3 (=$1269)
$0122728 Sky Base Act 1 (=$1278)
$012292A Sky Base Act 2 (=$1278)
$0122B2C Sky Base Act 3 (=$1278)
$0122D$01286 Zone Titles: (Text Format)
Offset Description
$0122D3B "GREEN HILL"
$0123C4A "BRIDGE"
$0124B59 "JUNGLE"
$0125A68 "LABYRINTH"
$0126977 "SCRAP BRAIN"
$0127886 "SKY BASE"
$013E1$01400 Title Screen Palette
$0197E$019AD Final Score Titles: (Text Format)
The text used for the score bonuses given on the completion of the game
Offset Description
$0197E8D "CHAOS EMERALD"
$0198E9D "SONIC LEFT"
$0199EAD "SPECIAL BONUS"
$01F9D$01FA8 Lightning Palette Control
$01B8D$01BAC "Sonic Has Passed" Screen Palette
$02905$02AD5 Credits Text (Text Format)
$02AD6$02AF5 Credits Screen Palette
$0626C$0627B End Sign Sprite Palette
$0627C$0628B Palette Pointers:
Offset Description
$0627CD 0: Green Hill (=$629E)
$0627EF 1: Bridge (=$62EE)
$062801 2: Jungle (=$633E)
$062823 3: Labyrinth (=$638E)
$062845 4: Scrap Brain (=$63DE)
$062867 5: Sky Base 1/2A (=$643E)
$062889 6: Sky Base 2B/3 (=$658E)
$0628AB 7: Special Stage (=$655E)
$0628C$0629D Palette Cycle Pointers:
Offset Description
$0628CD 0: Green Hill (=$62BE)
$0628EF 1: Bridge (=$630E)
$062901 2: Jungle (=$635E)
$062923 3: Labyrinth (=$63AE)
$062945 4: Scrap Brain (=$63FE)
$062967 5: Sky Base 1 (=$645E)
$062989 6: Sky Base 2-Interior / 3 (=$65AE)
$0629AB 7: Special Stage (=$657E)
$0629CD 8: Sky Base 2 (=$651E)
$0629E$065ED Palettes:
Offset Description
$0629E2BD Green Hill Palette
$062BE2ED Green Hill Cycle Palettes ×3
$062EE30D Bridge Palette
$0630E33D Bridge Cycle Palettes ×3
$0633E35D Jungle Palette
$0635E38D Jungle Cycle Palettes ×3
$0638E3AD Labyrinth Palette
$063AE3DD Labyrinth Cycle Palettes ×3
$063DE3FD Scrap Brain Palette
$063FE43D Scrap Brain Cycle Palettes ×4
$0643E45D Sky Base 1/2A Palette
$0645E49D Sky Base 1 Cycle Palettes ×4
$0649E4DD Sky Base 1 Lightning Cycle Palettes Part-1 ×4
$064DE51D Sky Base 1 Lightning Cycle Palettes Part-2 ×4
$0651E55D Sky Base 2 Cycle Palettes ×4
$0655E57D Special Stage Palette
$0657E58D Special Stage Cycle Palettes ×1
$0658E5AD Sky Base 2B/3 Palette
$065AE5ED Sky Base 2A/3 Cycle Palettes ×4
$0731C$0732B Boss Sprite Palette (including end capsule)
$0C7F0$0FFB0 Music, sounds, and other stuff
$0FFB1$0FFFF EMPTY SPACE
$10000$14C9F Block Mappings:
Offset Description
$10000$10B7F Green Hill (184 blocks)
$10B80$1147F Bridge (144 blocks)
$11480$11E7F Jungle (160 blocks)
$11E80$1297F Labyrinth (176 blocks)
$12980$1357F Scrap Brain (192 blocks)
$13580$142FF Sky Base 1-2 (216 blocks)
$14300$1497F Sky Base 3 (104 blocks)
$14980$1517F Bonus Stage (128 blocks)
$15180$1557F Blinking Items Art (Box, etc...)
$15580$155C9 Level Header Pointers:
Offset Description
$1558081 0: Green Hill Act 1
$1558283 1: Green Hill Act 2
$1558485 2: Green Hill Act 3
$1558687 3: Bridge Act 1
$1558889 4: Bridge Act 2
$1558A8B 5: Bridge Act 3
$1558C8D 6: Jungle Act 1
$1558E8F 7: Jungle Act 2
$1559091 8: Jungle Act 3
$1559293 9: Labyrinth Act 1
$1559495 10: Labyrinth Act 2
$1559697 11: Labyrinth Act 3
$1559899 12: Scrap Brain Act 1
$1559A9B 13: Scrap Brain Act 2
$1559C9D 14: Scrap Brain Act 3
$1559E9F 15: Sky Base Act 1
$155A0A1 16: Sky Base Act 2
$155A2A3 17: Sky Base Act 3
$155A4A5 18: End Sequence
$155A6A7 19: UNUSED (invalid data)
$155A8A9 20: Scrap Brain Act 2 (Emerald Maze), from corridor
$155AAAB 21: Scrap Brain Act 2 (Ballhog Area)
$155ACAD 22: Scrap Brain Act 2, from transporter
$155AEAF 23: Scrap Brain Act 2 (Emerald Maze), from transporter
$155B0B1 24: Scrap Brain Act 2, from Emerald Maze
$155B2B3 25: Scrap Brain Act 2, from Ballhog Area
$155B4B5 26: Sky Base Act 2 (Interior)
$155B6B7 27: Sky Base Act 2 (Interior), this one is identical
$155B8B9 28: Special Stage 1
$155BABB 29: Special Stage 2
$155BCBD 30: Special Stage 3
$155BEBF 31: Special Stage 4
$155C0C1 32: Special Stage 5
$155C2C3 33: Special Stage 6
$155C4C5 34: Special Stage 7
$155C6C7 35: Special Stage 8
$155C8C9 36: UNUSED (invalid data)
$155CA$15AB3 Level Headers:
Offset Description
$155CA$155EE Green Hill Act 1
$155EF$15613 Green Hill Act 2
$15614$15638 Green Hill Act 3
$15639$1565D End Sequence
$1565E$15682 Bridge Act 1
$15683$156A7 Bridge Act 2
$156A8$156CC Bridge Act 3
$156CD$156F1 Jungle Act 1
$156F2$15716 Jungle Act 2
$15717$1573B Jungle Act 3
$1573C$15760 Labyrinth Act 1
$15761$15785 Labyrinth Act 2
$15786$157AA Labyrinth Act 3
$157AB$157CF Scrap Brain Act 1
$157D0$157F4 Scrap Brain Act 2
$157F5$15819 Scrap Brain Act 2 (Emerald Maze), From Corridor
$1581A$1583E Scrap Brain Act 2 (Ballhog Area)
$1583F$15863 Scrap Brain Act 3
$15864$15888 Scrap Brain Act 2, From Emerald Maze
$15889$158AD Scrap Brain Act 2, From Ballhog Area
$158AE$158D2 Scrap Brain Act 2, From Transporter
$158D3$158F7 Scrap Brain Act 2 (Emerald Maze), From Transporter
$158F8$1591C Sky Base Act 1
$1591D$15941 Sky Base Act 2
$15942$15966 Sky Base Act 3
$15967$1598B Sky Base Act 2 (Interior)
$1598C$159B0 Special Stage 1
$159B1$159D5 Special Stage 2
$159D6$159FA Special Stage 3
$159FB$15A1F Special Stage 4
$15A20$15A44 Special Stage 5
$15A45$15A69 Special Stage 6
$15A6A$15A8E Special Stage 7
$15A8F$15AB3 Special Stage 8
$15AB4$15FFF Object Layout:
Offset Description
$15AB4$15AFF Green Hill Act 1 (26 Objects)
$15B00$15B42 Green Hill Act 2 (23 Objects)
$15B43$15B55 Green Hill Act 3 (7 Objects)
$15B56$15B9B Bridge Act 1 (24 Objects)
$15B9C$15BD5 Bridge Act 2 (20 Objects)
$15BD6$15BEB Bridge Act 3 (8 Objects)
$15BEC$15C43 Jungle Act 1 (30 Objects)
$15C44$15C8C Jungle Act 2 (25 Objects)
$15C8D$15CA2 Jungle Act 3 (8 Objects)
$15CA3$15CF1 Labyrinth Act 1 (27 Objects)
$15CF2$15D49 Labyrinth Act 2 (30 Objects)
$15D4A$14D68 Labyrinth Act 3 (11 Objects)
$15D69$15DAB Scrap Brain Act 1 (23 Objects)
$15DAC$15DE8 Scrap Brain Act 2 (21 Objects)
$15DE9$15E34 Scrap Brain Act 2, Emerald Maze (26 Objects)
$15E35$15E4D Scrap Brain Act 2, Ballhog Area (9 Objects)
$15E4E$15E99 Scrap Brain Act 3 (26 Objects)
$15E9A$15ED3 Sky Base Act 1 (20 Objects)
$15ED4$15F20 Sky Base Act 2 (23 Objects)
$15F21$15F16 Sky Base Act 2, Interior (2 Objects)
$15F17$15F25 Sky Base Act 3 (4 Objects)
$15F26$15F2B Special Stage 1 (3 Objects)
$15F2C$15F35 Special Stage 2 (4 Objects)
$15F36$15F3F Special Stage 3 (4 Objects)
$15F40$15F52 Special Stage 4 (7 Objects)
$15F53$15F65 Special Stage 5 (7 Objects)
$15F66$15F7E Special Stage 6 (9 Objects)
$15F7F$15F94 Special Stage 7 (8 Objects)
$15F95$15FB9 Special Stage 8 (13 Objects)
$15FBA$15FC3 End Sequence, Green Hill (4 Objects)
$15FC4$15FFF EMPTY SPACE
$16000$16DE9 Misc Mappings: (RLE Compressed)
Offset Description
$16000$1612E? Title Screen
$1627E$163F5 Map 1 Background
$163F6$1653A Map 1 Foreground
$1653B$166AA Map 2 Background (zoom on Robotnik's 'fortress')
$166AB$167FE? Map 2 Foreground (zoom on Robotnik's 'fortress')
$16830$169A9? Map 3 (when the game is finished)
$16C61$16DE9 Credits Screen
$16DEA$1FFFF Level Layout: (RLE Compressed)
Offset Description
$16DEA$17627 Green Hill Act 1 / End Sequence
$17628$17C88 Green Hill Act 2
$17C89$17FB5 Green Hill Act 3
$17FB6$18A61 Jungle Act 1
$18A62$1933C Jungle Act 2 / Special Stage 4 / 8
(The tall special stage is packed on top of the Jungle waterfall level! The level headers specify a different starting position, tileset, music &c.)
$1933D$199D6 Scrap Brain Act 1
$199D7$1A2DA Scrap Brain Act 2
$1A2DB$1ABD2 Scrap Brain Act 2 (Emerald Maze)
$1ABD3$1B281 Scrap Brain Act 2 (Ballhog Area)
$1B282$1BB33 Scrap Brain Act 3
$1BB34$1BED0 Sky Base Act 2
$1BED1$1C564 Bridge Act 1
$1C565$1CE26 Labyrinth Act 1
$1CE27$1DB39 Labyrinth Act 2
$1DB3A$1E2A7 Sky Base Act 1
$1E2A8$1E740 Bridge Act 2
$1E741$1EC00 Sky Base Act 2 (Interior) / Sky Base Act 3
$1EC01$1EFF5 Jungle Act 3
$1EFF6$1F300 Labyrinth Act 3
$1F301$1F440 Bridge Act 3
$1F441$1FBA0 Special Stage 1 / 2 / 3 / 5 / 6 / 7
$1FBA1$1FFFF UNUSED SPACE. Since the levels are compressed, the total space they occupy will vary as they are changed. The final level layouts leave 1'118 bytes of free space. This space contains a repeating copyright message to act as filler.
$20000$25FFF UNKNOWN
$26000$32FE5 Tile and Sprite Sets: (Compressed Art)
Offset Description
$26000$2751E Title Screen Tile Set (256 Tiles)
$2751F$28293 "Sonic Has Passed" Screen Tile Set (256 Tiles)
$28294$28B09 End Sign Sprite Set (128 Tiles)
$28B0A$2926A Title Screen Animated Finger Sprite Set (128 Tiles)
$2926B$29941 Map Screen 1 Sprite Set (128 Tiles)
$29942$2A129 Map Screen 2 Sprite Set (128 Tiles)
$2A12A$2AC3C Green Hill Sprites (128 tiles)
$2AC3D$2B7CC Bridge Sprites (128 tiles)
$2B7CD$2C3B5 Jungle Sprites (128 tiles)
$2C3B6$2CF74 Labyrinth Sprites (128 tiles)
$2CF75$2D9DF Scrap Brain Sprites (128 tiles)
$2D9E0$2E510 Sky Base Sprites (128 tiles)
$2E511$2EEB0 Special Stage Sprites (128 tiles)
$2EEB1$2F92D Boss Sprites (128 tiles)
$2F92E$2FD6F HUD Sprite Set (128 Tiles)
$2FD70$2FFEF Ring Animation (20 Tiles), UNCOMPRESSED
$2FFF0$2FFFF EMPTY SPACE
$30000$31800 Map Screen 1 Tile Set (256 Tiles)
$31801$32FE5 Map Screen 2 / Credits Screen Tile Set (256 Tiles)
$32FE6$3DA27 Level Art: (Compressed Art)
Offset Description
$32FE6$32FED Header For Green Hill Art
$32FEE$330ED Unique Rows List For Green Hill
$330EE$337A7 Duplicate Rows List For Green Hill
$337A8$34576 Art Data For Green Hill
$34578$3457F Header For Bridge Art
$34580$3467F Unique Rows List For Bridge
$34680$34C7F Duplicate Rows List For Bridge
$34C80$35AFF Art Data For Bridge
$35B00$35B07 Header For Jungle Art
$35B08$35C07 Unique Rows List For Jungle
$35C08$36176 Duplicate Rows List For Jungle
$36177$371BE Art Data For Jungle
$371BF$371C6 Header For Labyrinth Art
$371C7$372C6 Unique Rows List For Labyrinth
$372C7$37866 Duplicate Rows List For Labyrinth
$37867$3884A Art Data For Labyrinth
$3884B$38852 Header For Scrap Brain Art
$38853$38952 Unique Rows List For Scrap Brain
$38953$38FF1 Duplicate Rows List For Scrap Brain
$38FF2$39CED Art Data For Scrap Brain
$39CEE$39CF5 Header For Sky Base 1 / 2 Art
$39CF6$39DF5 Unique Rows List For Sky Base 1 / 2
$39DF6$3A3C8 Duplicate Rows List For Sky Base 1 / 2
$3A3C9$3B3B4 Art Data For Sky Base 1 / 2
$3B3B5$3B3BC Header For Sky Base 3 Art
$3B3BD$3B4BC Unique Rows List For Sky Base 3
$3B4BD$3BBB5 Duplicate Rows List For Sky Base 3
$3BBB6$3C7FD Art Data For Sky Base 3
$3C7FE$3C805 Header For Special Stages Art
$3C806$3C905 Unique Rows List For Special Stages
$3C906$3CF53 Duplicate Rows List For Special Stages
$3CF54$3DA27 Art Data For Special Stages
$3DA28$3FF20 Contains sprite art and/or sprite mappings
$3FF21$40000 EMPTY SPACE

Game Gear

Offset Description
$00000$10000 Main Game Code, musics, sounds...
$10000$14D00 Block Mappings
$14D00$15200 Unknown
$15200$15600 Blinking Items Art (Box, etc...)
$15600$1564A Level Headers Pointers
$1564A$15B34 Level Headers
$15B34$16200 Object Layout:
Offset Description
$15B34$15B7F Green Hill Act 1 (26 Objects)
$15B80$15BC2 Green Hill Act 2 (23 Objects)
$15BC3$15BD5 Green Hill Act 3 (7 Objects)
$15BD6$15C1B Bridge Act 1 (24 Objects)
$15C1C$15C4F Bridge Act 2 (20 Objects)
$15C50$15C65 Bridge Act 3 (8 Objects)
$15C66$15CC0 Jungle Act 1 (30 Objects)
$15CC1$15D03 Jungle Act 2 (25 Objects)
$15D04$15D19 Jungle Act 3 (8 Objects)
$15D1A$15D59 Labyrinth Act 1 (27 Objects)
$15D5A$15DB1 Labyrinth Act 2 (30 Objects)
$15DB2$14DD0 Labyrinth Act 3 (11 Objects)
$15DD1$15E9F Scrap Brain Act 1 (23 Objects)
$15E20$15E5F Scrap Brain Act 2 (21 Objects)
$15E60$15EAB Scrap Brain Act 2, Emerald Maze (26 Objects)
$15EAC$15ECD Scrap Brain Act 2, Ballhog Area (9 Objects)
$15ECE$15F19 Scrap Brain Act 3 (26 Objects)
$15F1A$15F53 Sky Base Act 1 (20 Objects)
$15F54$15FAC Sky Base Act 2 (23 Objects)
$15FAD$15FA2 Sky Base Act 2, Interior (2 Objects)
$15FA3$15FB0 Sky Base Act 3 (4 Objects)
$15FB1$15FC0 Special Stage 1 (3 Objects)
$15FC1$15FCA Special Stage 2 (4 Objects)
$15FCB$15FD1 Special Stage 3 (4 Objects)
$15FD2$15FE4 Special Stage 4 (7 Objects)
$15FE5$15FFD Special Stage 5 (7 Objects)
$15FFE$16013 Special Stage 6 (9 Objects)
$16014$16029 Special Stage 7 (8 Objects)
$1602A$16045 Special Stage 8 (13 Objects)
$16046$16052 End Sequence, Green Hill (4 Objects)
$16053$161FF EMPTY SPACE?
$16200$16738 UNKNOWN
$16738$17430 Misc Mappings
$17430$1F600 Level Layout
$1F600$20000 Sega Screen Art / Mappings
$20000$23440 Sonic Art / Mappings
$23400$23450 Palette Cycle Pointers:
Offset Description
$23400 Green Hill
$23402 Bridge
$23404 Jungle
$23406 Labyrinth
$23408 Scrap Brain
$2340A Sky Base 1/2A
$2340C Sky Base 2B/3
$2340E Special Stage

Palette Pointers:

Offset Description
$23440 Green Hill
$23442 Bridge
$23444 Jungle
$23446 Labyrinth
$23448 Scrap Brain
$2344A Sky Base 1/2A
$2344C Sky Base 2B/3
$2344E Special Stage
$23450$23C00 Palettes
$23C00$25500 'Sega' sound
$25500$30000 Art : Title Screen / Map / Levels / Stats / Sprites
$30000$40000 Art : Sega Screen / Map / Levels
$3DA28$40000 Contains sprite art and/or sprite mappings

Compressed Data

RLE Compression

Some data (level layouts, misc. mappings) in the ROM is compressed using a form of Run-Length-Encoding, where bytes that repeat themselves many times in a row are reduced by specifying the number of times to repeat a byte.

In practice, the ROM stores this data normally byte-for-byte but indicates a value to repeat by a duplicate byte followed by another byte that specifies the number of successive bytes to repeat.

A bug / oversight made by the developers means that the byte that specifies the number of times to repeat is off-by-one (causing an overflow (255 → 0). This means that a repeating-value of 01 means zero repeats (therefore wasting space!), 02 means 1 repeat, FF means 255 repeats, but 00 actually means 256 repeats! Be keenly aware of this when de/compressing!

Example:

06 7C 32 2E 2E 01 D106 7C 32 2E 2E D1
6B 3F 3F 02 51 2D C06B 3F 3F 3F 51 2D C0
05 07 5A 5A 03 08 B205 07 5A 5A 5A 5A 08 B2
05 07 5A 5A 03 08 B205 07 5A 5A 5A 5A 08 B2
29 EF 00 00 00 BB D229 EF 00 00 […00x256…] BB D2

As you can see, this format wastes one byte of space if a byte is only repeated twice. If a byte is repeated three times, there is no size difference. Only when a byte is repeated four or more times is there a savings in space usage.

Art Compression

WARNING: Here comes the science bit! If you want to understand how this works then read very carefully. First, some background info: The Master System uses character-based graphics, that is, 8×8 pixel tiles arranged into a 32×24 grid. The screen is not drawn to directly, instead up to 448 tiles can be defined and images are crafted by arranging different tiles on the grid.

The graphics for a level consist of 256 tiles and sprite sets are 128 tiles. Each tile consists of 8 rows (of 8 pixels), each row is 4 bytes (more on that later). The graphic art is compressed in a very complex, but effective, manner. The rows of all the tiles are divided into unique rows and duplicate rows. The data is stored like this:

Header

The 8-byte header is in the format of:

48 59 DR DR AD AD RC RC

(Note that dual-byte values "DR", "AD" and "RC" are Little-Endian, the lowest byte first. e.g. "08 01" = "0108")

  • DR: "Duplicate Rows". An offset from the start of the level art header, to the where the duplicate rows list begins. For tile sets this value is always "0108" (256 + 8 in hexadecimal). For sprite sets it's "0088" (128 + 8 in hexadecimal)
  • AD: "Art Data". An offset, from the beginning of the level art header (e.g.
    Sega Master System
    $32FE6), to the start of the Art Data section. This is critically important because the length of the duplicate rows list can vary
  • RC: "Row Count". The number of rows in the tileset; 0800 (2048, 256×8) for tile sets, 0400 (1024, 128×8) for sprite sets.

Unique Rows List

The list of unique rows is one byte for each tile we are defining (256 for tile sets, 128 for sprite sets). To process this data begin with the first byte of the unique rows list. Each bit in this byte refers to a row in the first tile of the tile set that we are decompressing.

Note that bits in a byte are ordered right to left, as such:

Bit# 8 7 6 5 4 3 2 1
Value: 1 1 0 1 0 0 1 1

Therefore bit #1 (on the right), refers to the first row of the current tile we are decoding and bit #8 (on the left) refers to the 8th row of the tile.

When a bit value is 0, it means that the tile row it corresponds to is a unique row. Read in 4 bytes from the Art Data section and decode into the 8 pixels for that row (see the Art Data heading below). In the example above, rows 3, 4 & 6 and of the tile are unique, and 4 bytes would be read from the Art Data for each.

Walk through the whole unique rows list decoding in this way and you should have a partial tile set with all the unique rows filled in.

Duplicate Rows List

The list of duplicate rows "fills in the blanks" in the rows missed by the unique list. For each row in the tile set that was missed by the unique rows list the duplicate rows list will contain an index value to where in the Art Data the row is.

Begin by walking the unique rows list again in the same order as before, but this time when a bit value is 1 it means that row is a duplicate: read a byte from the duplicate rows list. This value is an index to where in the art data the row is located, i.e. a value of 80 (hex) means:

$30000    Base address (Master System)
+ 2FE6    "Level Art" pointer in the level header, Green Hill for example
+  7C2    Art Data pointer in the level art header, again Green Hill
+   80*4  Skip to the 128th, decimal, row in the art data

For values 00 to EF (0 to 239), there is only one byte, indicating the row index in the Art Data. However, for values after EF, there are two bytes. The first one starts with an F, so the actual line number is the two bytes number minus F0 00. E.g.: F3 A2 is for art data row number 3A2. Note that you can also write line numbers 00 to EF using two bytes numbers, but this is a waste of space (that's why they are stored with one byte!).

Once you've walked the unique rows list a second time, reading the duplicate row list for each bit-value of 1 you see, all the blank rows in the title set should be filled in and you should have a complete tile set — if you've understood everything correctly!

Art Data

The SMS uses a palette of 16 colours for tiles, therefore the data that defines the tile graphics do not specify the actual R/G/B values, but just an index (0-15) to the palette colour to use. Therefore an 8-pixel row is stored as 4 bytes, where 4 bits (values 0-15) are assigned to each pixel.

However, instead of being stored as nybbles (4-bits in a row), the data is stored across 4 bit-planes. To understand what bit-planes are, imagine 4 bytes stacked on top of each other like layers in a cake. A bit plane would be a slice of the cake — 1 bit from each of the 4 bytes.

To decode the 4 bytes into 8 colour pixels, slice the bit-planes to get the index values (0-15) for each pixel and then look up the final colour from the palette.

In pseudo code, something like this:

input byte1, byte2, byte3, byte4
pixel = array (0 to 7)

for bit = 0 to 7
     if byte1 AND 2 ^ (7-bit) then pixel[bit] = pixel[bit] OR 1
     if byte2 AND 2 ^ (7-bit) then pixel[bit] = pixel[bit] OR 2
     if byte3 AND 2 ^ (7-bit) then pixel[bit] = pixel[bit] OR 4
     if byte4 AND 2 ^ (7-bit) then pixel[bit] = pixel[bit] OR 8

     pixel[bit] = palette-color-from-index: pixel[bit]
next bit

Level Headers / Level Headers Pointers

Each level has a header. This header contains several pieces of data, such as starting position, music location, etc. Each level header is 37 bytes long and is referenced by a pointer.

Level Headers Pointers

A level header pointer is comprised of two bytes. The data for the pointer is stored in little endian format. The value stored by this pointer specifies the number of bytes away a level header is from
Sega Master System
$15580
Sega Game Gear
$15600.

There are 37 Level Headers in total. Some levels have more than one pointer because they can be accessed from different locations, and Sonic's starting position differs at level start. Also two invalid level pointers exist that act as dividers between the main sequence of levels and the out-of-sequence levels (Scrap Brain's sub-maps and the Special Stages). See the ROM map for the full list of level pointers.

Example:

The two first bytes are 4A 00. So, at
Sega Master System
$15580 + $004A, we will find the level header for the first level (Green Hill 1).

Level Headers

The level headers are located at
Sega Master System
$155CA$15AB3
Sega Game Gear
$1564A$15B34.

Each level header use 37 bytes. Here is the format (partial):

SP FW FW FH FH LX LX ?? LW LY LY XH LH
SX SY FL FL FS FS BM BM LA LA 09 SA SA
IP CS CC CP OL OL SR UW TL 00 MU
SP: Solidity Pointer
Indicates what solidity data to use. The location of this data and its format is undocumented
FW, FH: Floor Width / Height (Little-Endian)
Number of blocks wide / high the Floor Layout is. Levels can share the same Floor Layout (such as the special stages), and the specific level can occupy a subset of the Floor Layout. The LX / LY / LW / LH values specify the offset and size of the level within the Floor Layout
LX: Level X Offset
Left-hand offset position of the level in the Floor Layout (see "FW" above), in pixels, i.e. where, horizontally, the left hand side of the level is. There is always effectively 8 added to this value due to the hidden scrolling zone on the left side of the screen
??: Unknown Byte
The 8th byte in the header appears to be some kind of flag-bits. Only Green Hill Act 1 & 2 use it, and changing the value appears to make no discernible difference to the level
LW: Level Width
Although named "Level Width", it is actually a little more complicated than that. This value sets the right hand limit of the level, and everything thereafter is cropped out. The value is multiplied by 8 and 14 is added on top (the minimum width of a Floor Layout is apparently 14 blocks) to determine the right-most limit (in blocks)
LY: Level Y Offset
Top offset position of the level in the Floor Layout (see "FH" above), in pixels, i.e. where, vertically, the top of the level is
XH: Extend Height
Due to the nature of the bottom of the level being at "6+(LH×8)" blocks this may not align desirably. This is notable in Green Hill Act 1 in which the level height is 2 blocks short of the Floor Layout and causes Sonic to die when hitting the jump ramp as it is now touching the bottom of the level. The Extend Height value adds a number of pixels to the height of the level to compensate, ideally this should be in multiples of 20 (hex), 32 (decimal)
LH: Level Height
This value sets the bottom-most limit of the level, and everything thereafter is cropped out. The value is multiplied by 8 and 6 is added on top (the minimum height of a Floor Layout is apparently 6 blocks — one screen height) to determine the bottom-most limit (in blocks)
SX, SY: Sonic starting position X/Y
Position, in blocks, where the player starts
FL: Floor Layout (Little Endian)
How many bytes away from
Sega Master System
$14000 the Floor Layout is located

FS: Floor Data Size (Little Endian)
Length, in bytes, of the compressed Floor Layout data

BM: Block Mapping (Little Endian)

How many bytes away from
Sega Master System
Sega Game Gear
$10000 the mappings for this level are located

LA: Level Art (Little Endian)

How many bytes away from
Sega Master System
$30000 the level art is located

SA: Sprite Art (Little Endian)

How many bytes away from
Sega Master System
$24000 is the sprite art located

09: Unknown Byte
The 24th byte in the header always has a value of 9, it's purpose is unknown

IP: Initial Palette
Indicates the number of the initial palette pointer to use, in the pointer order of appearance

CS: Cycle Speed
Determines the speed of the palette cycle. 0 = no cycle, 1 = change every frame, 2 = change every second frame, and so on

CC: Color Cycles
Indicates the number of color cycles for the level palette

CP: Cycle Palette
Indicates the number of the cyclic palette pointer to use, in the pointer order of appearance

OL: Object Layout (Little Endian)

How many bytes away from
Sega Master System
$15580
Sega Game Gear
$15600 the Object layout is located

SR Scrolling / Ring HUD Flags
Bit flags that control how the level scrolls and the presence of the ring count in the HUD.
Combine any of the hex values below:

  • 01 Sonic immediately dies, the game hangs and doesn't reload the level; purpose unknown
  • 02 The demo play data controls Sonic
  • 04 Shows ring count in HUD and rings are displayed. When this value is not included no rings are visible, even though the sparkle effect occurs when you collect them
  • 08 The level automatically scrolls to the right (ala Bridge Act 2)
  • 10 After a pause, the level automatically scrolls upwards! If you get caught at the bottom of the screen, you die
  • 20 The screen scrolls smoothly, allowing you to get ahead of it
  • 40 Slow up and down wave effect (ala Sky Base Act 2)
  • 80 Screen does not scroll down (ala Jungle Act 2). If you get caught at the bottom of the screen, you die

UW: Under Water Flag
Controls the under-water effect (slow movement / water colour / drowning) in Labyrinth (80 is on, 00 is off). The presence of Object $40 in the Object Layout sets the water height at its Y-level

TL: Time HUD / Lightning effect flags
Bit flags that control the presence of the time counter in the HUD, and the use of the lightning effect
Combine any of the hex values below:

  • 01 Centers the time display when on a special stage. Outside of the special stage causes the game to switch to the special stage
  • 02 Uses the lightning effect. This overrides the level's own palette
  • 04 / 08 No effect?
  • 10 Use the boss underwater palette (ala Labyrinth Act 3)
  • 20 Displays the time
  • 40 Locks the screen, no scrolling occurs
  • 80 No effect?

00: Unknown Byte
The 36th byte in the header always has a value of 0, it's purpose is unknown

MU: Music

  • 0005: Level Music
  • 06: Title Music
  • 08: Invincibility
  • 09: Level Complete
  • 0A: Dead
  • 0B/0C/0D: Boss
  • 0E: Credits
  • 10: Bonus Stage

This is a table of the complete level headers for the Master System version: (all values are hexadecimal)

Name SP FW FH LX  ?? LW LY XH LH SX SY FL FS BM LA 09 SA IP CS CC CP OL SR UW TL 00 MU
Green Hill Act 1 0 0100 0010 0040 C0 18 0020 40 01 08 0B 2DEA 083E 0000 2FE6 9 612A 0 A 3 0 0534 04 0 20 0 0
Green Hill Act 2 0080 0020 0001 A0 0C 0001 40 03 02 03 3628 0661 0580 04 20
Green Hill Act 3 0080 0020 0001 00 0A 00E8 40 03 07 16 3C89 032D 05C3 00 00
Bridge Act 1 1 0100 0010 0001 00 1F 0001 40 01 03 0C 7ED1 0694 0B80 4578 9 6C3D 1 8 3 1 05D6 04 0 20 0 1
Bridge Act 2 0080 0020 0F 0001 40 03 02 1C A2A8 0499 061C 0C 20
Bridge Act 3 0080 0020 0F 0300 40 03 06 1B B301 0140 0656 00 00
Name SP FW FH LX  ?? LW LY XH LH SX SY FL FS BM LA 09 SA IP CS CC CP OL SR UW TL 00 MU
Jungle Act 1 2 0100 0010 0001 00 1F 0001 20 01 02 0B 3FB6 0AAC 1480 5B00 9 77CD 2 5 3 2 066C 04 0 20 0 2
Jungle Act 2 0010 0100 01 0001 20 1F 02 FA 4A62 08DB 06C4 84 20
Jungle Act 3 0080 0020 0F 0300 40 03 06 1B B301 0140 0656 00 00
Labyrinth Act 1 3 0040 0040 0001 00 07 0001 40 07 02 05 8565 08C2 1E80 71BF 9 83B6 3 5 3 3 0723 04 80 20 0 3
Labyrinth Act 2 0040 0040 03 09 8E27 0D13 0772 04 20
Labyrinth Act 3 0040 0040 03 25 AFF6 030B 07CA 00 10
Name SP FW FH LX  ?? LW LY XH LH SX SY FL FS BM LA 09 SA IP CS CC CP OL SR UW TL 00 MU
Scrap Brain Act 1 4 0100 0010 0001 00 1E 0001 20 01 03 0B 533D 069A 2980 884B 9 8F75 4 6 4 4 07E9 04 0 20 0 4
Scrap Brain Act 2 0080 0020 0F 0001 40 03 04 16 59D7 0904 082C 20
Scrap Brain Act 3 0040 0040 07 0220 40 07 03 36 7282 08B2 08CE 00
Sky Base Act 1 5 0080 0020 0001 00 0F 0001 40 03 02 1D 9B3A 076E 3580 9CEE 9 99E0 5 6 4 5 091A 04 0 22 0 4
Sky Base Act 2 5 0040 0040 07 40 06 0A 17 7B34 039D 3580 9CEE 5 6 8 0954 40 20 5
Sky Base Act 3 7 0040 0040 07 20 01 02 01 A741 04C0 4300 B3B5 6 8 6 0997 00 00 4
End Sequence 0 0100 0010 1A40 00 1D 00E0 E8 00 D9 0A 2DEA 083E 0000 2FE6 9 AEB1 0 A 3 0 0A3A 00 0 00 0 FF
Name SP FW FH LX  ?? LW LY XH LH SX SY FL FS BM LA 09 SA IP CS CC CP OL SR UW TL 00 MU
Scrap Brain Act 2
(Emerald Maze), From Corridor
4 0040 0040 0001 00 07 0001 40 07 03 3D 62DB 08F8 2980 884B 9 8F75 4 6 4 4 0869 04 0 20 0 4
Scrap Brain Act 2
(Ballhog Area)
0020 0080 03 A0 0A 03 03 6BD3 06AF 08B5
Scrap Brain Act 2,
From Transporter
0080 0020 0F 40 03 50 10 59D7 0904 082C
Scrap Brain Act 2
(Emerald Maze), From Transporter
0040 0040 07 40 07 27 1C 62DB 08F8 0869
Scrap Brain Act 2,
From Emerald Maze
0080 0020 0F 40 03 7B 03 59D7 0904 082C
Scrap Brain Act 2,
From Ballhog Area
0080 0020 0F 40 03 7B 1B 59D7 0904 082C
Sky Base Act 2 (Interior) 7 0040 0040 0001 00 07 0001 40 07 03 3B A741 04C0 4300 B3B5 9 99E0 6 8 4 6 09A1 00 0 00 0 4
Name SP FW FH LX  ?? LW LY XH LH SX SY FL FS BM LA 09 SA IP CS CC CP OL SR UW TL 00 MU
Special Stage 1 6 0040 0040 0001 00 07 0001 40 02 02 06 B441 0760 4890 C7FE 9 A511 7 1 1 7 09A5 4 0 21 0 10
Special Stage 2 0040 0040 07 0320 C0 05 02 1E B441 0760 09AC
Special Stage 3 0040 0040 07 0680 40 07 03 3B B441 0760 09B6
Special Stage 4 0010 0100 01 0001 20 1F 06 40 4A62 08DB 09C0
Special Stage 5 0040 0040 07 0001 40 02 02 06 B441 0760 09D3
Special Stage 6 0040 0040 07 0320 C0 05 02 1E B441 0760 09E6
Special Stage 7 0040 0040 07 0680 40 07 03 3B B441 0760 09FF
Special Stage 8 0010 0100 01 0001 20 1F 06 04 4A62 08DB 0A15

Palettes

A palette of 32 colors is used, the first 16 reserved for the level and the second 16 for the sprites.

The Master System uses 6-bit colors, each colour in a palette is one byte (32 bytes for a full palette, 16 bytes for a half-palette). 2 bits are assigned to each color (R:0–2, G:0–2, B:0–2), for a total of 64 possible colors. The extra two bits in the byte are unused, therefore the format of the byte is: 00BBGGRR. The corresponding 24-bit color byte value for the 2-bit numbers are: 0 = 0, 1 = 80, 2 = 175, 3 = 255.

The Game Gear uses 9-bit colors, so each color use two bytes (the first nybble of the second byte is 0, and values for the color nybble are in steps of 2). This color can be defined like that : R(0–7), G(0–7), B(0–7). So, there are only 8 possible values for each primary color. Here are the RGB correspondence : 0/1 = 0, 2/3 = 36, 4/5 = 72, 6/7 = 109, 8/9 = 145, A/B = 182, C/D = 218, E/F = 255. So, you can have a maximum of 512 colors. The format for the two bytes is : GGGGRRRR 0000BBBB

Level Palettes

A table of Level Palette Pointers are located at:
Sega Master System
$0627C$0628B
Sega Game Gear
$23440$23450. Each pointer (2 bytes, little-endian) in the table points to the beginning of a palette in the ROM. On the Master System, these pointers are absolute (give the actual ROM address), but on the Game Gear, are relative, specifying how many bytes from
Sega Game Gear
$23400 the palette can be found. Each level palette is a full-palette (Tiles and Sprites) of 32-colours. The level palettes are located at:
Sega Master System
$0629E$065ED
Sega Game Gear
$23450$23C00. See the ROM map for a more detailed listing.

The Initial Palette ("IP") value of a Level Header is an index to the level palette pointers, i.e. 0–7, specifying which palette to load.

Level Cycle Palettes

To create a simple animation effect, such as flowing water, the palettes are "cycled" through a list of other palettes allowing the colours to rapidly change without having to change actual pixel data.

A table of cycle palette pointers exists at
Sega Master System
$0628C$0629D
Sega Game Gear
$23400$23450. Each pointer (2 bytes, little-endian) in the table points to the beginning of a cycle palette. Each cycle palette is a half-palette of 16 colours and the number of cycle palettes in a cycle is determined in the Level Header by the Cycle Count ("CC") value. The Cycle Palette ("CP") value in the Level Header is an index to the Cycle Palette Pointers table, determining which palette cycle to use.

Note that the Level Palettes and Cycle Palettes are intermixed, which is why the pointer tables are necessary. See the ROM Map for a detailed listing of the palette locations.

Labyrinth's Under Water Palettes

Labyrinth uses an under water effect created by a raster line trick, that is, the palette is changed as the TV's electron beam is half-way down the screen. Since a level can only specify one palette, the "under water" palette is stored elsewhere in the ROM.

For Labyrinth Acts 1 & 2 a full 32 color palette is located at
Sega Master System
$0024B. Labyrinth Act 3 is unusual in that the entire level is underwater but Sonic doesn't drown. Even though the Level Header specifies the normal Labyrinth palette, this is overridden by the palette stored at
Sega Master System
$0026B, which is necessary to include the under water coloured Boss sprite palette that is normally loaded in on-demand.

Sky Base Act 1 Lightning Palettes

Sky Base 1 has a unique feature in that, as well as the regular palette, a "lightning" flashing effect occurs every few seconds. This is managed entirely separately from the regular palette cycle (i.e. the lightning is not a very long palette cycle list).

Locations
Sega Master System
$01F9D$01FA8 control the different palettes used for the lightning effect and looks like this:
02 04 5E 64 02 04 9E 64 02 04 DE 64

This can be broken down into three stages:

  • 02 04 5E 64 (normal palette)
  • 02 04 9E 64 (pre-lightning flash)
  • 02 04 DE 64 (lightning flashing)

"02" controls the frequency of the palette swaps (flashing). Increasing this number will slow the flashing down.

"04" specifies the number of cycle palettes in the palette to be swapped. The next two bytes are a little-endian address to the palette to use.
Sega Master System
$645E is the default Sky Base 1 palette,
Sega Master System
$649E is the pre-lightning flash where the electricity beams appear and
Sega Master System
$64DE is the lightning flash.

On-Demand Sprite Palettes

The end sign and boss objects have their own palettes separate from the sprite palette used on a level. When these objects are near their palettes are automatically loaded into the level's sprite palette (the last 16 colors in the 32-color system palette).

The end sign palette is located at
Sega Master System
$0626C$0627B. The Boss palette, which also includes the Capsule, is located at
Sega Master System
$0731C$0732B

Block Mappings

The floor layout for each level is comprised of "blocks": prearranged 4×4 tile (32×32 px) patterns. This reduces the amount of memory required for storing levels ("Floor Layouts") as levels are constructed out of these larger blocks rather than storing every tile seen.

Each block is composed of 16 smaller 8×8 px tiles. The block is 16 bytes, each byte is an index to which tile to display in the Level Art. The bytes are arranged on screen in this order:

32x32.png

And the corresponding data is:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

Block Mappings are stored uncompressed in the ROM. The number of blocks in each mapping is apparently not stored in the ROM, so to determine the number of blocks in each mapping you need to compare the distance between "Mapping Location" Level Headers. For your convenience the size of the mappings are charted below.

Sega Master System
Offset
Sega Master System
Description
Sega Game Gear
Offset
Sega Game Gear
Description
$10000$10B80 Green Hill (184 blocks) $10000$10BB0 Green Hill (187 blocks)
$10B80$11480 Bridge (144 blocks) $10BB0$11510 Bridge (150 blocks)
$11480$11E80 Jungle (160 blocks) $11510$11FE0 Jungle (128 blocks)
$11E80$12980 Labyrinth (176 blocks) $11FE0$12A10 Labyrinth (208 blocks)
$12980$13580 Scrap Brain (192 blocks) $12A10$135B0 Scrap Brain (186 blocks)
$13580$14300 Sky Base 1-2 (216 blocks) $135B0$14330 Sky Base 1-2 (216 blocks)
$14300$14980 Sky Base 3 (104 blocks) $14330$149B0 Sky Base 3 (104 blocks)
$14980$1517F Bonus Stage (128 blocks) $149B0$14D00? Bonus Stage (53 blocks?)

Floor Layout

The floor layout is composed of multiple 4×4 tile blocks (See Block Mappings). Each byte indicates the index of the tile to which to use. However, the data is compressed, so you will have to decompress it first.

Floor layouts are located at:
Sega Master System
$16DEA$1FFFF
Sega Game Gear
$17430$1F600. You'll have to use the pointers (Level Headers), in order to determine their starting address.

Object Layout

Objects are special parts of a level. They can move, attack, give you rings, and do a lot of other things, even if they are not visible. Objects are distinct from "sprites" in that some objects are invisible (have no sprite associated) and have some meta effect (such as setting the water-level in Labyrinth), or load their sprite art on-demand.

Object Layout Data begins with one byte, which is the total number of objects in the zone plus one. Immediately following is the object data itself. Each object uses 3 bytes, in the format:

OO XX YY

XX and YY are the object's coordinates divided by 32. OO is one of the objects listed below. (Both the Game Gear and Master System versions share the same Object Layout Data). There are a total of 452 objects throughout the game's levels (though some of these are invalid — 00 / FF).

ID Description
00 NONE
01 Super Ring monitor
02 Power Sneakers monitor
03 One-Up monitor
04 Shield monitor
05 Invincibility monitor
06 Chaos Emerald
07 End sign
08 Badnik "Crabmeat" (GH)
09 Wooden platform - Swinging (GH)
0A Explosion
0B Wooden platform (GH)
0C Wooden platform - Falls when touched (GH)
0E Badnik "Buzz Bomber" (GH/B)
0F Wooden platform - Sliding left-right (GH)
10 Badnik "Moto Bug" (GH)
11 Badnik "Newtron" (GH)
12 Robotnik - Green Hill Boss (GH)
16 Flame Thrower (SB)
17 Door - Opens from left only (SB)
18 Door - Opens from right only (SB)
19 Door - Two ways (SB)
1A Electric sphere (SB)
1B Badnik "Ball Hog" (SB)
1C Unknown - Ball from the "Ball Hog" ?
1D Switch (SB, L, others ?)
1E Switch Activated Door (SB)
1F Badnik "Caterkiller" (SB)
21 Bumper - Sliding left-right (Bonus Stage ?)
22 Robotnik - Scrap Brain Boss (SB)
23 Free animal - Rabbit
24 Free animal - Bird
25 Animal Cell
26 Badnik "Chopper" (J, B)
27 Vertical Step - Falling from a waterfall (J)
28 Horizontal Step - Falling from a waterfall (J)
29 Floating Step - Sonic can travel with it (J)
2C Robotnik - Jungle Boss (J)
2D Badnik "Yadrin" (B)
2E Falling Bridge (B)
30 Passing Clouds (SKYB)
31 Propeller (SKYB)
32 Badnik "Bomb" (SKYB)
33 Large Cannons in Sky Base Act 2 (SKYB)
33 Cannon Ball (SKYB)
35 Badnik "Unidus" (SKYB)
37 Rotating cannon (SKYB)
38 Flying platform (SKYB)
39 Spiked wall slowly moving right (SKYB)
3A Small cannon in Sky Base Act 1 (SKYB)
3B Flying platform moving up-down (SKYB)
3C Badnik "Jaws" (L)
3D Rotating spiked ball (L)
3E Spear, shifting up-down (L)
3F Fire ball thrower (L)
40 Water Level Object (L)
41 Bubble Maker (L)
44 Badnik "Burrobot" (L)
45 Platform, move up when touched (L)
46 Electrical Hazard for the Sky Base Boss (SKYB)
48 Robotnik - Bridge Boss (SB)
49 Robotnik - Labyrinth Boss (L)
4A Robotnik - Sky Base Boss (SKYB)
4B Zone that makes you fall (like in GH2)
4C Flipper (Bonus Stage)
4D RESET!
4E Balance (B)
4F RESET!
50 Flower (GH)
51 Box - Starpost
52 Box - Continue
53 Final animation in GH, when Sonic falls on Robotnik (then, goes to the next level)
54 Emeralds animation (on the map), when Sonic has them all (and goes to the next level)
55 Makes Sonic blink for a short time
FF NONE

Misc Mappings

This section contains the mappings for some screens. It looks like the Blocks Mappings, except that the 8×8 tiles are written to the screen, so there is more than 16 tiles. Another thing is that they are compressed (see The compression format).

Mappings Offset Description
$16738$16865 Title Screen
$16962$163F6 Map 1 Background
$163F6$16AFD Map 1 Foreground

Blinking Items Art

In the game, there are some blinking items. The most common are the box items. You can easily edit them. Each of these items is 16×16, but you must understand that it is composed of four 8×8 tiles. The tiles are displayed from up to down and from left to right. The format is the same as the art in savestates (32 bytes for each 8×8 tile, 128 bytes for the item).

Blinking items are located at:
Sega Master System
$15180$1557F
Sega Game Gear
$15200$15600

Here are the items you can edit :

ID Description
1 Super Rings
2 Power Sneakers
3 One-Up
4 Shield
5 Invincible
6 Chaos Emerald
7 Starpost (Checkpoint)
8 Continue

Level Art

The level art starts at:
Sega Master System
$32FE6
Sega Game Gear
$32ED5. The "Level Art" value in the Level Header specifies how far from
Sega Master System
Sega Game Gear
$30000 the level art for that zone begins. See the ROM Map for a full list of level art addresses.

The graphics for a level consist of 256 tiles. Each tile consists of 8 rows (of 8 pixels). See the Art Compression section for how to fully read and decompress the tile graphics.

Game Text

Strings of text in the game are stored in a simple format that begins with an X / Y location on the screen to begin printing, are terminated with FF and may contain special control-codes, such as FE to move the cursor.

Note that the character codes used for the letters are dependent on the tile map currently being used! There are two tile maps used, one for each of the map screens in the game.

The first map screen shows the overview of the island and is used for the first three zones (Green Hill, Bridge & Jungle). These are the character codes used on this screen:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ©
34 35 36 37 44 45 46 47 40 41 42 43 50 51 52 60 61 62 70 80 81 54 3C 3D 3E 3F CF EB

The second map screen shows the close-up of the mountain top with Robotnik's fortress, and uses the following character codes:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ©
1E 1F 2E 2F 3E 3F 4E 4F 5E 5F 6E 6F 7E 7F 8E 8F 9E 9F AE AF BE BF CE CF DE DF AB EB

Zone Titles

The zone titles ("GREEN HILL", "BRIDGE", …) shown on the map screen are stored at
Sega Master System
$0122D$01286. Each title is padded with spaces so that all titles are always 12 bytes long.

The first three zones use the character codes from the first map screen, therefore the data looks like this:

Address Bytes Text
$0122D 10 13 46 62 44 44 51 EB 47 40 43 43 EB EB FF GREEN HILL
$0123C 10 13 35 62 40 37 46 44 EB EB EB EB EB EB FF BRIDGE
$0124B 10 13 41 81 51 46 43 44 EB EB EB EB EB EB FF JUNGLE

The next three zones use the second map screen, therefore the letters appear differently:

Address Bytes Text
$0125A 10 13 6F 1E 1F DE 9F 5E 7F AF 4F EB EB EB FF LABYRINTH
$01269 10 13 AE 2E 9F 1E 8F EB 1F 9F 1E 5E 7F EB FF SCRAP BRAIN
$01278 10 13 AE 6E DE EB 1F 1E AE 3E EB EB EB EB FF SKY BASE

Final Score Titles

Upon completion of the game, a final score screen is shown and bonuses are awarded for the number of emeralds, lives remaining and a "Special Bonus". These titles are stored at
Sega Master System
$0197E$019AD.

Each string is padded with spaces to be 13 characters in length. The first tile set is used.

Address Bytes Text
$0197E 08 0A 36 47 34 61 70 EB 44 50 44 62 34 43 37 FF CHAOS EMERALD
$0198E 08 0A 70 52 51 40 36 EB 43 44 45 80 EB EB EB FF SONIC LEFT
$0199E 08 0A 70 60 44 36 40 34 43 EB 35 52 51 81 70 FF SPECIAL BONUS

Credits Text

The text for the credits that roll at the end of the game is stored at
Sega Master System
$02905$02AD5.

Additional control codes appear in the credits:

FE XX YY: Moves the cursor to XX, YY on the screen
FD XX 00: Pauses for XX length. Values 3C, 4B & F0 are used in the credits roll
FC XX: Number of lines to scroll the credits screen

Note that the credits use the second tile map.

Here is a full decode of the credits roll:

$02905	14 03 AE 9E 7F 5E 2E				SONIC
	FE 15 04 AF 4F 3E				THE
	FE 13 05 4F 3E 2F 4E 3E 4F 9E 4E		HEDGEHOG
	FD 3C 00
	FE 12 0C 7E 1E AE AF 3E 9F			MASTER
	FE 13 0D AE DE AE AF 3E 7E			SYSTEM
	FE 14 0E BF 3E 9F AE 5E 9E 7F			VERSION
	FD 3C 00					
	FC 09					
	FE 14 0B AE 9E 7F 5E 2E				SONIC
	FE 15 0C AF 4F 3E				THE
	FE 13 0D 4F 3E 2F 4E 3E 4F 9E 4E		HEDGEHOG
	FD 3C 00					
	FE 12 0F 8E 9F 5E 4E 5E 7F 1E 6F		ORIGINAL
	FE 13 10 2E 4F 1E 9F 1E 2E AF 3E 9F		CHARACTER
	FE 14 11 2F 3E AE 5E 4E 7F			DESIGN
	FD 3C 00					
	FC 04					
	FE 14 10 AB AE 3E 4E 1E				©SEGA
	FD B4 00					
	FC 09
	FE 14 0E AE AF 1E 3F 3F				STAFF
	FD B4 00					
	FC 09
	FE 12 0B 4E 1E 7E 3E				GAME
	FE 13 0C 8F 9F 9E 4E 9F 1E 7E			PROGRAM
	FD 3C 00					
	FE 13 0E AE 4F 5E 7F 9E 1F BE			SHINOBU
	FE 14 0F 4F 1E DE 1E AE 4F 5E			HYASHI
	FD F0 00					
	FC 09					
	FE 12 0B 4E 9F 1E 8F 4F 5E 2E			GRAPHIC
	FE 14 0C 2F 3E AE 5E 4E 7F			DESIGN
	FD 3C 00					
	FE 13 0E 1E DE 1E 7F 9E				AYANO
	FE 14 0F 6E 9E AE 4F 5E 9F 9E			KOSHIRO
	FD 3C 00					
	FE 13 11 AF 1E CF 3E 3F BE 7F 5E		TAKEFUNI
	FE 14 12 DE BE 7F 9E BE 3E			YUNOUE
	FD F0 00					
	FC 09					
	FE 12 0B AE 9E BE 7F 2F				SOUND
	FE 13 0C 8F 9F 9E 2F BE 2E 3E			PRODUCE
	FD 3C 00					
	FE 13 0E 7E 1E AE 1E AF 9E			MASATO
	FE 14 0F 7F 1E CF 1E 7E BE 9F 1E		NAKAMURA
	FD F0 00					
	FC 09					
	FE 12 0B 9F 3E 1E 9F 9F 1E 7F 4E 3E		REARRANGE
	FE 15 0C 1E 7F 2F				AND
	FE 12 0D 9E 9F 5E 4E 5E 7F 1E 6F		ORIGINAL
	FE 16 0E 7E BE AE 5E 2E				MUSIC
	FD 3C 00					
	FE 13 10 DE BE DF 9E				YUZO
	FE 14 11 6E 9E AE 4F 5E 9F 9E			KOSHIRO
	FD F0 00					
	FC 09					
	FE 13 0D AE 8F 3E 2E 5E 1E 6F			SPECIAL
	FE 15 0E AF 4F 1E 7F 6E AE			THANKS
	FD B4 00					
	FC 02					
	FE 13 0E DE 8E AE 4F 5E 8E EB DE		YOSHIO Y
	FD 3C 00					
	FE 13 11 6F BE 7F 1E 9F 5E 1E 7F		LUNARIAN
	FE 1A 12 AE 4E					SG
	FD B4 00					
	FC 09					
	FE 12 0C 8F 9F 3E AE 3E 7F AF 3E 2F		PRESENTED
	FE 16 0E 1F DE					BY
	FE 15 10 AE 3E 4E 1E				SEGA
	FD B4 00					
	FE 19 13 3E 7F 2F				END
$02AD5	FF

RAM Editing

To convert offset values to Gens Plus 0.0.9.61 savestate values, add $00A4.

Offset Description
$0000 Tile Layout Data
$1400 Object Status Table (?)
$1403 Sonic's X speed
$1406 Sonic's Y speed
$202C Palette
$206C Tile Graphics Data

Tile Layout Data

Unlike in the ROM, the data here is uncompressed. Each byte directly corresponds to one 32×32 tile.

The number of tiles in a horizontal line before they wrap around differs depending on the width of the Zone. Here is table of the values.

Zone Tile Line Data Size in Bytes
Green Hill Act 1 256
Green Hill Act 2 128
Green Hill Act 3 128
Bridge Act 1 256
Bridge Act 2 128
Bridge Act 3 128
Jungle Act 1 256
Jungle Act 2 16
Jungle Act 3 64
Labyrinth Act 1 64
Labyrinth Act 2 64
Labyrinth Act 3 64
Scrap Brain Act 1 256
Scrap Brain Act 2 128
Scrap Brain Act 2 (Emerald Maze) 64
Scrap Brain Act 2 (Ballhog Area) 32
Scrap Brain Act 3 64
Sky Base Act 1 128
Sky Base Act 2 64
Sky Base Act 2 (Interior) 64
Sky Base Act 3 64

Music Hacking

Music Locations

  • Music Pointers (These add to $8000): $C716
    • Specifics...
Song ID Location (SMS) Location (GG) Song
00 C7D0 C7D0 Green Hill Zone
01 D74A D74A Bridge Zone
02 D24A D24A Jungle Zone
03 F60C F60C Labyrinth Zone
04 DB4F DB4F Scrap Brain Zone
05 E1A7 E1A7 Sky Base Zone
06 E4C3 E4C3 Title Screen
07 E63C E63C Map Screen (Act Intro)
08 E704 E704 Invincible
09 E8B4 E8B4 Act Complete
0A E991 E991 Death
0B EAC0 EAC0 Boss Theme
0C EAC0 EAC0 Boss Theme
0D EAC0 EAC0 Boss Theme
0E ED54 ED54 Ending
0F C7D0 C7D0 Green Hill Zone
10 F12C F12C Bonus Zone
11 C7D0 C7D0 Green Hill Zone
12 C7D0 C7D0 Green Hill Zone
13 F98C F98C Good Ending SFX
14 FA26 FA32 Chaos Emerald
-- CD0A CD0A Marble Zone (Unused and unreferenced)

The only difference in the music section of the SMS and GG version is, that the GG version of song 13 has an additional 83 (vibrato) command.

Song Format

All pointers in a song are absolute (i.e. relative to the beginning of the song) 16-bit pointers stored in Little Endian (Intel) format.

Song Header

Offset Size Description
00 Word Pointer to Channel 1 Data (usually points to 000A)
02 Word Pointer to Channel 2 Data
04 Word Pointer to Channel 3 Data
06 Word Pointer to Channel 4/Noise Data
08 Word Pointer to Channel 5/SFX data (always zero and ignored)

Channel Data

There's no header for channel data. Channel setup is done via commands.
The commands start directly at the offset specified in the header.

Command Description
007F xx Play Note with length xx
  • if dd is 0, the value set by 8A is used
  • Note Values:
    • Tone: first nibble is the octave, second nibble is the key
      Key is a signed value with A = -3 .. C = -0, C = +0 .. B = +11 (-0 is the same C as +0)
    • Noise: 70 - Bass Drum, 71 - Snare Drum, others read from the code section
    • 7F - Rest
80 aaaa bbbb Set song tempo (only present in channel 1)
  • aa = Tempo Divider
  • bb = Tempo Multipler
  • aa gets copied to $DC08 and bb gets copied to $DC0A and $DC0C
    collecting a Speed Shoe increases the Tempo Multipler at $DC0A by 1
  • BPM = 120 * aa / bb (120 for 30 Ticks per Quarter)
81 aa Set volume (0F = max, 00 = min)
82 aa bb cc dd ee ff Envelope Setup (only present in channels 1-3)
  • aa = attack rate (usually FF)
  • bb = decay 1 rate (00 - slow, FF - fast)
  • cc = decay 1 level (00 - min, FF - max)
  • dd = decay 2 rate
  • ee = decay 2 level
  • ff = decay 3/sustain rate
83 aa bb cc dddd Modulation (only present in channels 1-3)
  • aa = Delay
  • bb = Speed
  • cc = Step Count + 1
    • Note: Step 0 (dd=01) stops instead of reversing the counter's direction
  • dddd = Change per Step
84 aaaa Set Detune value to aaaa (aaaa is a signed byte that modifies the FNum)
  • positive value = higher FNum = lower note
85 aa does nothing (only present in channel 1)
  • aa is always FF (with very few excpetions)
86 Loop Start Marker
  • increases Loop Stack Pointer and initializes Loop Counter
87 aa bbbb Loop back
  • aa - number of times to repeat
  • bbbb - Position to loop back to (usually points to the byte after the 86 command)
  • Note: When leaving the loop, the Loop Stack Pointer is decreased.
88 Master Loop Start
  • sets the master loop address for this channel
89 aa Set Noise Mode to aa
  • Note: When a note is played, this value gets ORed with $E0 and is sent to the PSG chip.
8A aa Set default note length to aa
8B Increase volume by 1
8C Decrease volume by 1
8D no attack for next note
FE SFX Track End
  • Equal to FF, but resets the sound priority byte instead of checking for the master loop address.
FF Track End
  • When this command is enountered and the master loop address is set, the driver jumps back to the address set by the 88 command.

Note on 86/87

The 86 command is used the make nested loops possible.
Example: 86 86 ... 87 04 aaaa ... 87 02 bbbb

Note on 88/FF

There's no need for an 88 command in non-looping songs.
However every jingle (with exception of the Death-Jingle) has a master loop, consisting of a rest.


Sonic the Hedgehog (8-bit)






Sonic 1 MS title.png

Main page
Cheat codes


Manuals
Print advertisements
Magazine articles


Development
Secrets
Hacking guide


Sonic Community Hacking Guide
General
Sonic Music Hacking Guide | SonED2 Manual
Game-Specific
Sonic the Hedgehog (16-bit) | Sonic the Hedgehog (8-bit) | Sonic Eraser | Sonic CD (prototype 510) | Sonic CD | Sonic CD (PC) | Sonic 2 (Nick Arcade prototype) | Sonic 2 (Simon Wai prototype) | Sonic 2 (16-bit) | Sonic 2 (8-bit) | Sonic 2 & Knuckles | Dr. Robotnik's Mean Bean Machine | Sonic Triple Trouble | Sonic 3 | Sonic & Knuckles | Sonic 3 & Knuckles | Sonic & Knuckles Collection | Sonic Crackers | Sonic 3D: Flickies' Island | Chaotix | Sonic R PC | Sonic Jam 6 | Sonic Advance | Sonic Advance 2 | Sonic Advance 3 | Sonic Battle | 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 | Shadow the Hedgehog | Sonic Riders | Sonic the Hedgehog (2006) | Sonic & Sega All-Stars Racing | Sonic Unleashed (Xbox 360/PS3) | Sonic Generations
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 | Subroutine Equivalency List | 68000 Instruction Set | 68000 ASM-to-Hex Code Reference | VDP Documentation | Official Sega 32X Documentation | Official Mega-CD Documentation | Official Sega Mega Drive Documentation