Nem s2b
From Sonic Retro
This historical hacking document is preserved here for archival purposes. It has not been revised since its original writing and may be outdated. For an SCHG-equivalent document, see SCHG:Sonic the Hedgehog 2 (Simon Wai prototype). |
Contents
- 1 Introduction
- 2 Address listing
- 3 Offset indexes
- 4 Main level load block
- 5 Pattern load cue's
- 6 Collision definitions
- 7 Level layout
- 8 Ring placement
- 9 Sprite placement
- 10 Main level block mappings
- 11 Uncompressed art
- 12 Mappings for Sonic/Tails
- 13 Sega intro sound
- 14 Art compression format
- 15 Dynamic pattern reloading
- 16 Animated pattern load cue's
- 17 Misc sprite definitions
- 18 Rasterised layer deformation
- 19 Palettes
- 20 Level size array
- 21 Character start location array
- 22 Music playlist for levels
- 23 Level order
- 24 Object debug list
- 25 Leftover data from previous builds
- 26 End of compressed ARZ 128x128 block mappings
- 27 large chunk of CNZ 128x128 block mappings
- 28 CPZ patterns/block mappings
- 29 Compressed ARZ 128x128 block mappings
- 30 lost Pattern load cue's
- 31 Sprite programming
- 32 References
Introduction
Here are my hacking notes on the Sonic 2 rom. If you use these notes I'd
appreciate it if you would mention it with your hack or your utility, so that other people can
find their way here. For hex editing I recommend you use a hex utility
called Hex workshop, and for emulators I recommend you get both Gens and Genecyst.
Genecyst may be old and kinda crap, but it has a whole heap of debug outputs
that really help when it comes to seeing exactly what it's doing and when.
First of all it's very important that you understand the basics. All data
stored on a computer is in the form of 1's and 0's. On a CD for example, a
laser hits the surface, and if the laser bounces back and hits the lens it's a
1, and if it doesn’t it's a zero. Each 1 or 0 is called a bit, and a bit cannot
have any other characters in it other that a 1 or a 0. Now the computer deals
with bits in groups of 4. There are 16 possible combinations for a group of
four 1's and 0's, so to make it simpler it deals with it as one value, rather
than 4 (Eg. 0110 becomes 6). Now as there are 16 possible combinations for a
group of 4 bits, this value to represent their values must have 16 values
itself, so rather than a simple 0-9, this value is 0-F (0123456789ABCDEF). This
value is called a hexadecimal value (hex value for short). Each hex value is
dealt with in groups of 2, called a byte, each byte having 128 possible
combinations. Now on a final output level the byte may be looked up on an ASCII
table, which will convert that value into a recognisable character (Eg. a byte
value of 73 becomes a lowercase s on an English ASCII table). You will
practically never touch the ASCII version of the code in hacking though.
Now one important thing to realise is that as one character of hex has 16
values and a decimal (real) value only has 10, it may be necessary to convert
the numbers between them from time to time. This is done with the use of a base
converter (included in hex workshop). Let's say you wanted to give Sonic 50
rings. If you enter 50 as the value, you will in fact end up with 80, because
that value you are entering is actually a hex value, but if you use the base converter
to convert it first, you merely enter the value of 50 into the decimal box, and
it will spit out a hex value of 32, which will in fact give you 50 rings in the
game. Another useful utility that you will need is a hex calculator (also
included in hex workshop). A hex calculator is the same as a normal calculator,
but it deals with hex values rather than decimal values.
Another thing you need to know is that each level in Sonic 2 has a value assigned to it, but this value does not correspond with each level's final position in the game. Here is a list of the level values in Sonic 2 beta:
00 | Emerald Hill zone |
02 | Wood zone |
04 | Metropolis zone |
05 | Metropolis zone act 3 |
07 | Hill Top zone |
08 | Hidden Palace zone |
0A | Oil Ocean zone |
0B | Dust Hill zone |
0C | Casino Night zone |
0D | Chemical Plant zone |
0E | Genocide City zone |
0F | Neo Green Hill zone |
10 | Death Egg zone |
One other thing you need to know is the way that the Mega Drive stores all
the art. All the art that is used in the game is stored in the form of 8x8
pixel blocks. These blocks do not actually store colours at all, they actually
only have one hex value per pixel. That value specifies what point on the palette
line the pixel will get its colour from. The palette has 4 lines, each with 16 colours
on them. Now the colours on the palette can be changed at any point during
play, and some palette colours may even automatically change colour each couple
of frames to make it look like the colour is flashing.
Now these 8x8 blocks are not what make up the level directly. 4 8x8 blocks are grouped together to form a 16x16 block, and it is at this point that the palette line to use for that 16x16 block is specified. The 8x8 patterns can also have their x, y, or x and y values reversed when placing them in a 16x16 block. Also it's at the 16x16 level that the collision definitions are specified. Now finally we get to a 128x128 block, and these are the things that the actual level info loads. It is made up of 64 16x16 blocks, and each block inside them can use a different palette line. You cannot place anything except a sprite or a 128x128
block directly into a level.
Now that you know all the basics, here's my breakdown:
Address listing
For the most part, there are no breaks in this list. If one address follows on
directly from another on this list, it does so in the rom, with the exception
of data that comes before 20000. All the compiled code that is used in the game
is stored in this section, and that's a pain in the ass to sort through, so there
will be many breaks there. The column on the left lists it's file location, the column in the middle
contains it's name and description, and the column on the right will contain
any special notes about it, such as compression format used if applicable, and
number of blocks an art tile uses. The right column will also contain a link
with the text further info, if that particular block requires it. That link
will jump to a detailed explanation of that thing. Anything linked like that
will also be listed in the contents at the top of the page.
To indicate sections containing leftover data from previous builds, a colour
coding system is in place. The address value for a block of data will be coloured
if that block of data is from a previous build. Different colours are used to indicate
layering of this data. Red is the first layer, green is the second, blue is the
third, yellow is the fourth, and pink is the fifth. This is not to indicate the build
that a block of data belongs to, so it doesn't mean that all lost data that's coloured
in red is from the same build. In many cases, it's impossible to relate any two blocks
of data from different sections to each other.
Also, any patterns that are not used anywhere in the game will be preceeded by this red
dot . Patterns located in sections of lost data will not be
marked in this way however.
0-FF | Vector table | |
100-200 | Header | |
15FA-???? | Programming to do wih decompression of art tiles to VRAM | Compiled |
5E8-B07 | Standard numbers/symbols | Uncompressed Further info |
2264-24A1 | Unknown palettes | Further info |
2516-2595 | Unknown palette | Further info |
28A6-28E1 | Unknown palette | Further info |
294E-2A15 | Palette pointers | Further info |
2A16 | SEGA screen palette (00) | Further info |
2A96 | Title screen palette (01) | Further info |
2B16 | Level select palette (02) | Further info |
2B96 | Primary palette line (03) | Further info |
2BB6 | EHZ level palette (04, 05, 07, 0D, 12, 14) | Further info |
2C16 | WZ level palette (06) | Further info |
2C76 | MTZ level palette (08, 09) | Further info |
2CD6 | HTZ level palette (0B) | Further info |
2D36 | HPZ level palette (0C) | Further info |
2D96 | HPZ underwater palette (15) | Further info |
2E16 | OOZ level palette (0E) | Further info |
2E76 | MCZ level palette (0F) | Further info |
2ED6 | CNZ level palette (10) | Further info |
2F36 | 06 level palette (0A) | Further info |
2F96 | CPZ level palette (11) | Further info |
2FF6 | CPZ underwater palette (15) | Further info |
3076 | ARZ level palette (13) | Further info |
30D6 | ARZ underwater palette (16) | Further info |
3156 | Sonic 1 special stage palette (17) | Further info |
3AD4-3B07 | Level select level order | Further info |
4140-4150 | Music playlist for levels | Further info |
4AAA-4ADB | Function to load collision index into ram | Compiled |
4ADC-4B63 | Pointers to collision indexes | Further info |
5986-5A95 | Level size array | Further info |
5A96-5B01 | Code for initial character and screen placement | Compiled |
5B02-5B89 | Character start location array | Further info |
5E16-5E37 | Offset index of rasterised layer deformation | Further info |
5E38 | Title screen layer deformation info | Further info |
5E5C | EHZ layer deformation info | Further info |
5F60 | EHZ 2 player splitscreen layer deformation info | Further info |
6098 | WZ layer deformation info | Further info |
60D0 | MTZ layer deformation info | Further info |
6108 | HTZ layer deformation info | Further info |
6236 | Unknown layer deformation info (foreground free moving, background fixed) | Further info |
62B4 | Unknown layer deformation info (splitscreen, background fixed vertically, no deformation) | Further info |
6344 | HPZ layer deformation info | Further info |
640A | OOZ layer deformation info | Further info |
6442 | MCZ layer deformation info | Further info |
6554 | Unknown layer deformation info (splitscreen, background fixed horizontally, no deformation) | Further info |
67AE | CNZ layer deformation info | Further info |
67F2 | Unknown layer deformation info (splitscreen, background fixed vertically, no deformation) | Further info |
687C | CPZ layer deformation info | Further info |
6982 | ARZ layer deformation info | Further info |
6A70 | 01, 03, 06, 09, 0E, 10 layer deformation info | Further info |
7FDC | Bridge (sprite) | |
85F8 | ??????? (sprite) | |
8B9C | ??????? (sprite) | |
8D38 | Fixed large platform from CPZ (sprite) | |
9128 | Collapsing platform from OOZ (sprite) | |
9274 | Breakaway platform made up of small blocks from MZ in S1 (sprite) | |
999C | ??????? (sprite) | |
9A54 | ??????? (sprite) | |
9C0C | ??????? (sprite) | |
9CE2 | ??????? (sprite) | |
A012 | ??????? (sprite) | |
A086 | Explosion giving off 100 points and an animal (sprite) | |
A11E | Red explosion (sprite) | |
A2B0 | ??????? (sprite) | |
A7C0 | 100 points (sprite) | |
AC28 | ??????? (sprite) | |
AD62 | Ring spray (sprite) | |
B29C | ??????? (sprite) | |
B46A | Contents of computer monitor flying up (sprite) | |
B7B4 | ??????? (sprite) | |
B83A | ??????? (sprite) | |
BB54 | ??????? (sprite) | |
BD76 | Game over text (sprite) | |
BE38 | ??????? (sprite) | |
BF9A-BFDD | Main game level order | Further info |
C944 | Spikes (sprite) | |
CD00 | Unknown (a block) | |
CD7C | ??????? (sprite) | |
D01A-D249 | Sprite programming pointers | Further info |
D24A | ??????? (sprite) | |
E7B8 | Horizontal red spring (sprite) | |
F10C | ??????? (sprite) | |
F1F4 | Signpost (sprite) | |
FC48 | Sonic (sprite) | |
10E38 | Tails (sprite) | |
11F96 | ??????? (sprite) | |
1207C | ??????? (sprite) | |
125CE | ??????? (sprite) | |
1264E | ??????? (sprite) | |
12B42 | ??????? (sprite) | |
13B54 | Starpoll (sprite) | |
13DFC | ??????? (sprite) | |
144B0 | ??????? (sprite) | |
148AC | ??????? (sprite) | |
149FC | ??????? (sprite) | |
14AFC | ??????? (sprite) | |
14B78 | ??????? (sprite) | |
15090 | ??????? (sprite) | |
15352 | ??????? (sprite) | |
155A0 | ??????? (sprite) | |
1561A | ??????? (sprite) | |
1572C | ??????? (sprite) | |
15B8C | See-saw (sprite) | |
1600C | Diagnally moving and falling platform from HTZ (sprite) | |
1621C | Large platform from CPZ moving from side to side (sprite) | |
16468 | Boosters from CPZ (sprite) | |
165B0 | ??????? (sprite) | |
16724 | Spin-tube from CPZ (sprite) | |
17174 | ??????? (sprite) | |
1747C | ??????? (sprite) | |
1768A | Cap on top of spin tubes in CPZ (sprite) | |
17A4C | ??????? (sprite) | |
17CA0 | Platform on top of oil burners from OOZ (sprite) | |
17F0C | Spikeball from OOZ (sprite) | |
180D0 | ??????? (sprite) | |
181A0 | Weird spring that you push back on from OOZ (sprite) | |
18ABE | Ball on weird spring from OOZ (sprite) | |
18D9C | Button (sprite) | |
18E78 | Block that propells sonic when he busts it from OOZ (sprite) | |
19250 | Spinball that shoots character out 90 degrees from entry from OOZ (sprite) | |
19660 | Arrow shooter from ARZ (sprite) | |
19850 | Piller that drops lower half in ARZ (sprite) | |
19A1E | Raising pillar from ARZ (sprite) | |
1A0C4 | ??????? (sprite) | |
1A30C | Weird spring from ARZ and CPZ (sprite) | |
1A5CC | Steam vent from MTZ (sprite) | |
1A8B4 | ??????? (sprite) | |
1AA74 | ??????? (sprite) | |
1AEBC | ??????? (sprite) | |
1B0C4 | Warp tube from MTZ (sprite) | |
1B520 | Block in MTZ with a spike coming out each side sequentially (sprite) | |
1B810 | Nut that character moves by running on in MTZ (sprite) | |
1BA30 | ??????? (sprite) | |
1BCEC | ??????? (sprite) | |
1BF6C | ??????? (sprite) | |
1B720 | Floor spike in MTZ (sprite) | |
1C2E4 | Platform moving in circle (sprite) | |
1C4F8 | Diagnally moving platform from MTZ (sprite) | |
1C850 | ??????? (sprite) | |
1CBCC | ??????? (sprite) | |
1CC54 | ??????? (sprite) | |
1CE48 | ??????? (sprite) | |
1D078 | Moving spikey arm from MCZ (sprite) | |
1D208 | ??????? (sprite) | |
1D3C0 | Lowering stairs from CPZ (sprite) | |
1D594 | ??????? (sprite) | |
1D74C | Spring on spin tube cap from CPZ (sprite) | |
1D984 | Driving badnick from EHZ (sprite) | |
1DC54 | ??????? (sprite) | |
1DEAC | Bubble enemy (sprite) | |
1E010 | ??????? (sprite) | |
1E62C | ??????? (sprite) | |
1E89C | Buzz bomber (sprite) | |
1EBB8 | Octopus badnick from OOZ (sprite) | |
1EE68 | Bat (sprite) | |
1F2F0 | Alligator (sprite) | |
1F5E8 | Jumping fish from EHZ (sprite) | |
1F6E8 | ??????? (sprite) | |
1F99C | ??????? (sprite) | |
1FC0A | ??????? (sprite) | |
2030C | ??????? (sprite) | |
205A6 | ??????? (sprite) | |
20740 | ??????? (sprite) | |
20E5C | ??????? (sprite) | |
21D40 | ??????? (sprite) | |
223E2 | ??????? (sprite) | |
22408 | Offset index of animated pattern and dynamic pattern load cue's | Double offset Further info |
2244C | 01/WZ/03/06/09/MCZ/CNZ/GCZ/DEZ dynamic pattern load cue | Further info |
2244E | HTZ dynamic pattern load cue | Further info |
22630 | EHZ/HPZ/MTZ/OOZ/CPZ/ARZ dynamic pattern load cue | Further info |
22698 | EHZ animated pattern load cue (4) | Further info |
226FC | MTZ animated pattern load cue (5) | Further info |
22754 | HTZ animated pattern load cue (4) | Further info |
227B8 | HPZ animated pattern load cue (2) | Further info |
227E4 | OOZ animated pattern load cue (4) | Further info |
2282A | CPZ animated pattern load cue (0) | Further info |
22866 | 01/WZ/03/06/09/MCZ/CNZ/GCZ/DEZ animated pattern load cue (empty) | Further info |
229A2 | Offset index of misc sprite definitions | Further info |
229C4 | EHZ/HTZ misc sprite definitions | Further info |
22A40 | MTZ misc sprite definitions | Further info |
22B14 | HPZ misc sprite definitions | Further info |
22C08 | OOZ misc sprite definitions | Further info |
22C6C | CNZ misc sprite definitions | Further info |
22D10 | CPZ misc sprite definitions | Further info |
22D1C | ARZ misc sprite definitions | Further info |
22D60 | 01/WZ/03/06/09/MCZ/GCZ/DEZ misc sprite definitions | Further info |
22DFC | Onscreen display (lives/score/time/rings) (sprite) | |
23448-23B67 | Large and small numbers used in game | Uncompressed Further info |
23DBE | Offset index of object debug lists | Further info |
23DE0 | 01/WZ/03/06/09/GCZ/DEZ object debug list | Further info |
23DF2 | EHZ object debug list | Further info |
23ECC | MTZ object debug list | Further info |
23FAE | HTZ object debug list | Further info |
24078 | HPZ object debug list | Further info |
240F2 | OOZ object debug list | Further info |
24194 | MCZ object debug list | Further info |
24216 | CNZ object debug list | Further info |
24228 | CPZ object debug list | Further info |
242C2 | ARZ object debug list | Further info |
24354 | Indexed main level load block | Further info |
24420 | Offset index of pattern load cue's | Further info |
2447A | Pattern load cue's | Further info |
24804 | Lost pattern load cue's from previous compilation | Further info |
24A30 | Leftover data from previous build | |
28000 | Animated cone shaped flower from EHZ and HTZ | Uncompressed Further info |
28080 | Animated bubble like flower from EHZ and HTZ | Uncompressed Further info |
28100 | Animated stringy flower from EHZ and HTZ | Uncompressed Further info |
28180 | Animated leafy flower from EHZ and HTZ | Uncompressed Further info |
28200 | Animated pulsing thing against checkered background in EHZ | Uncompressed Further info |
28300 | Hills in background from HTZ | Art compression 192 blocks |
28C2A | Clouds in background of HTZ | Uncompressed Further info |
2902A | Spinning metal cylinder from MTZ | Uncompressed Further info |
2A02A | Lava patterns from EHZ and MTZ | Uncompressed Further info |
2A62A | Animated section of MTZ background | Uncompressed Further info |
2A86A | Horizontal and vertical rotating screw | Uncompressed Further info |
2B06A | Weird peice of alpha HPZ background | Uncompressed Further info |
2B46A | Giant pulsing ball in HPZ | Uncompressed Further info |
2B76A | Tiny pulsing ball in OOZ | Uncompressed Further info |
2B94A | Square rotating around ball in OOZ | Uncompressed Further info |
2BD4A | Oil in OOZ | Uncompressed Further info |
2CCEA | Animated background section from CPZ and DEZ | Uncompressed Further info |
2CEEA | Waterfall patterns from ARZ | Uncompressed Further info |
2D1EA | Curve and resistance mapping | Further info |
2D2EA | Collision array | Further info |
2F2EA | EHZ and HTZ primary 16x16 collision index | Further info |
2F5EA | EHZ and HTZ secondary 16x16 collision index | Further info |
2F8EA | WZ primary 16x16 collision index | Further info |
2FBEA | MTZ primary 16x16 collision index | Further info |
2FEEA | HPZ primary 16x16 collision index | Further info |
301EA | HPZ secondary 16x16 collision index | Further info |
304EA | OOZ primary 16x16 collision index | Further info |
307EA | DHZ primary 16x16 collision index | Further info |
30AEA | CNZ primary 16x16 collision index | Further info |
30DEA | CNZ secondary 16x16 collision index | Further info |
310EA | CPZ primary 16x16 collision index | Further info |
313EA | CPZ secondary 16x16 collision index | Further info |
316EA | ARZ primary 16x16 collision index | Further info |
319EA | ARZ secondary 16x16 collision index | Further info |
31CEA-3334D | ????????? (something to do with special stage) | |
3334E | Level layout offset index | Unique offset Further info |
333D6 | EHZ act 1 foreground | Further info |
33BD8 | EHZ act 2 foreground | Further info |
343DA | EHZ act 1/2 background | Further info |
343E4 | 01 act 1/2 foreground/background | Further info |
343E8 | WZ act 1 foreground | Further info |
34BEA | WZ act 2 foreground | Further info |
353EC | WZ act 1 background | Further info |
35BEE | WZ act 2 background | Further info |
363F0 | 03 act 1/2 foreground/background | Further info |
363F4 | MTZ act 1 foreground | Further info |
36BF6 | MTZ act 2 foreground | Further info |
373F8 | MTZ act 1/2/3 background | Further info |
3741E | MTZ act 3 foreground | Further info |
37C20 | 06 act 1/2 foreground/background | Further info |
37C24 | HTZ act 1 foreground | Further info |
38426 | HTZ act 2 foreground | Further info |
38C28 | HTZ act 1 background | Further info |
3942A | HTZ act 2 background | Further info |
39C2C | HPZ act 1/2 foreground | Further info |
3A42E | HPZ act 1/2 background | Further info |
3A478 | 09 act 1/2 foreground/background | Further info |
3A47C | OOZ act 1 foreground | Further info |
3AC7E | OOZ act 2 foreground | Further info |
3B480 | OOZ act 1/2 foreground/background | Further info |
3B49A | DHZ act 1 foreground | Further info |
3BC9C | DHZ act 2 foreground | Further info |
3C49E | DHZ act 1/2 background | Further info |
3C4B0 | CNZ act 1 foreground | Further info |
3CCB2 | CNZ act 2 foreground | Further info |
3D4B4 | CNZ act 1 background | Further info |
3DCB6 | CNZ act 2 background | Further info |
3DCC0 | CPZ act 1 foreground | Further info |
3E4C2 | CPZ act 2 foreground | Further info |
3ECC4 | CPZ act 1 foreground | Further info |
3ECF0 | GCZ act 1/2 foreground/background | Further info |
3ECF4 | ARZ act 1 foreground | Further info |
3F4F6 | ARZ act 2 foreground | Further info |
3FCF8 | ARZ act 1 background | Further info |
404FA | ARZ act 2 background | Further info |
40CFC | DEZ act 1/2 foreground/background | Further info |
40D00 | Giant golden ring | Uncompressed Further info |
41940 | Blank space | |
42B7A | Giant golden ring... again (uncompressed) | |
437BC | Very end of palette | |
437C6 | ?????????? | |
44000 | Offset index of sprite locations | Further info |
4404A | EHZ act 1 sprite locations | Further info |
442C6 | EHZ act 2 sprite locations | Further info |
445C0 | MTZ act 1 sprite locations | Further info |
4488A | MTZ act 2 sprite locations | Further info |
44B30 | MTZ act 3 sprite locations | Further info |
44EFC | HTZ act 1 sprite locations | Further info |
45130 | HTZ act 2 sprite locations | Further info |
4554A | HPZ act 1 sprite locations | Further info |
45652 | HPZ act 2 sprite locations (empty) | Further info |
45658 | Unknown (empty) | Further info |
4565E | OOZ act 1 sprite locations | Further info |
457C0 | OOZ act 2 sprite locations | Further info |
459AC | DHZ act 1 sprite locations | Further info |
45A24 | DHZ act 2 sprite locations | Further info |
45A2A | CPZ act 1 sprite locations | Further info |
45CC4 | CPZ act 2 sprite locations | Further info |
4605A | ARZ act 1 sprite locations | Further info |
46216 | ARZ act 1 sprite locations | Further info |
46348 | 01, WZ, 03, 06, 09, CNZ, GCZ, DEZ sprite locations (empty) | Further info |
4634E | ?????????? | |
474AC | Lost palette | |
4760C | ?????????? | |
48000 | Offset index of ring locations | Further info |
48044 | EHZ act 1 ring locations | Further info |
481DE | EHZ act 2 ring locations | Further info |
483DC | 01 act 1 ring locations (empty) | Further info |
483DE | 01 act 2 ring locations (empty) | Further info |
483E0 | WZ act 1 ring locations (empty) | Further info |
483E2 | WZ act 2 ring locations (empty) | Further info |
483E4 | 03 act 1 ring locations (empty) | Further info |
483E6 | 03 act 2 ring locations (empty) | Further info |
483E8 | MTZ act 1 ring locations (empty) | Further info |
483EA | MTZ act 2 ring locations (empty) | Further info |
483EC | MTZ act 3 ring locations (empty) | Further info |
483EE | MTZ act 4 ring locations (empty) | Further info |
483F0 | 06 act 1 ring locations (empty) | Further info |
483F2 | 06 act 2 ring locations (empty) | Further info |
483F4 | HTZ act 1 ring locations | Further info |
484EA | HTZ act 2 ring locations | Further info |
48654 | HPZ act 1 ring locations | Further info |
487C6 | HPZ act 2 ring locations (empty) | Further info |
487C8 | 09 act 1 ring locations (empty) | Further info |
487CA | 09 act 2 ring locations (empty) | Further info |
487CC | OOZ act 1 ring locations | Further info |
4889E | OOZ act 2 ring locations | Further info |
48968 | DHZ act 1 ring locations (empty) | Further info |
4896A | DHZ act 2 ring locations (empty) | Further info |
4896C | CNZ act 1 ring locations (empty) | Further info |
4896E | CNZ act 2 ring locations (empty) | Further info |
48970 | CPZ act 1 ring locations | Further info |
48A3E | CPZ act 2 ring locations | Further info |
48B94 | GCZ act 1 ring locations (empty) | Further info |
48B96 | GCZ act 2 ring locations (empty) | Further info |
48B98 | ARZ act 1 ring locations | Further info |
48C76 | ARZ act 2 ring locations | Further info |
48DB0 | DEZ act 1 ring locations (empty) | Further info |
48DB2 | DEZ act 2 ring locations (empty) | Further info |
48DB4 | ?????????? | |
4B76C | Rock splashing into liquid (uncompressed) | |
4BAAC | Lost palette | |
4BC4C | ?????????? | |
4E54A | Grains of sand falling (uncompressed) | |
4E86A | Fire in bowl against stone background (uncompressed) | |
4EC6A | Data block acting as seperator | |
4EE00 | ?????????? (uncompressed data blocks with massive repetition) | |
4FB98 | Data block acting as seperator | |
50000 | Patterns for Sonic | Uncompressed Further info |
614C0 | Unknown offset index | Further info |
6160E | Unknown (Something to do with mappings for Sonic) | Further info |
62598 | Patterns for Tails | Uncompressed Further info |
6DA4C | Unknown offset index | Further info |
6DB9A | Unknown (Something to do with mappings for Sonic) | Further info |
6DF8E | Patterns for bubble | Art compression 32 blocks |
6E114 | Stars from invincibility | Art compression 00, 34 blocks |
6E1F6 | Patterns for smoke trails, dust, and splash in water | Uncompressed Further info |
6FB3C | Unknown offset index | Further info |
6FC46 | Unknown (Something to do with mappings for Tails) | Further info |
7056E | Unknown offset index | Further info |
70678 | Unknown (Something to do with mappings for Tails) | Further info |
70960 | SEGA patterns | Art compression 125 blocks |
71520 | Title patterns | Art compression 396 blocks |
72E82 | Sonic patterns in title screen | Art compression 193 blocks |
739C6 | Fireballs from HTZ and WZ | Art compression 20 blocks |
73B3C | Some waterfll tiles form WZ | Art compression 24 blocks |
73C42 | Another fireball from HTZ | Art compression 00, 16 blocks |
73D90 | Peices of bridge from EHZ | Art compression 00, 8 blocks |
73E68 | Flying fox system in HTZ | Art compression 48 blocks |
7415C | One way barrier from HTZ | Art compression 4 blocks |
741D4 | See-saw from HTZ | Art compression 24 blocks |
7436C | Fireball | Art compression 18 blocks |
7447A | Rock from HTZ | Art compression 20 blocks |
745B0 | badnick from HTZ with balls of flame spinning around him that he shoots at you | Art compression 4 blocks |
7461C | Spinning grey wheel from MTZ | Art compression 120 blocks |
74A74 | A ball shaped thing from MTZ patterns | Art compression 9 blocks |
74B1C | Spear block from MTZ | Art compression 00, 8 blocks |
74BEA | Steam from MTZ | Art compression 00, 15 blocks |
74CF4 | Spike from MTZ | Art compression 00, 8 blocks |
74DB6 | Unknown. Some similar shaded blocks | Art compression 54 blocks |
74E2C | Lava bubble from MTZ | Art compression 00, 9 blocks |
74EE2 | Something from MTZ patterns | Art compression 4 blocks |
74F52 | Unknown. A block of some kind. | Art compression 32 blocks |
751FE | Stuff from MTZ | Art compression 8 blocks |
752A0 | Mini rotating cog from MTZ | Art compression 12 blocks |
75382 | Four blocks from MTZ tiles. All of the blocks are just one colour | Art compression 00, 04 blocks |
7538E | Bridge from HPZ | Art compression 21 blocks |
75506 | Waterfall tiles for HPZ | Art compression 53 blocks |
75868 | The master emerald | Art compression 32 blocks |
75ADA | Platform thing from HPZ | Art compression 16 blocks |
75B9A | Pulsing light thing from HPZ | Art compression 34 blocks |
75DD6 | Another platform thing from HPZ and those green blocks | Art compression 22 blocks |
75F70 | Patterns from raising platform in OOZ | Art compression 12 blocks |
76060 | Spikeball thing from OOZ | Art compression 00, 32 blocks |
76258 | Patterns for stuff in OOZ | Art compression 6 blocks |
762EE | Some striped patterns from OOZ | Art compression 4 blocks |
7635A | Oil patterns from OOZ | Art compression 16 blocks |
764D6 | Some blocks of oil and stuff from OOZ | Art compression 14 blocks |
76602 | Unknown. Damn I wish I could make this out, because it looks quite interesting. | Art compression 20 blocks |
76722 | Unknown. Ditto. | Art compression 53 blocks |
76A12 | Unknown. Whatever they are, they look OOZ style. | Art compression 40 blocks |
76CA6 | Unknown. Also look OOZ in style. | Art compression 30 blocks |
76E68 | Swinging platform from OOZ | Art compression 28 blocks |
7708A | Wooden box from MCZ | Art compression 32 blocks |
772C8 | Collapsing platform from MCZ | Art compression 00, 26 blocks |
77472 | Vines around switch you pull on from MCZ | Art compression 16 blocks |
7756A | Vines from MCZ | Art compression 10 blocks |
77614 | A side on view of a log from WZ I suspect. | Art compression 00, 4 blocks |
77684 | Big moving platform in CPZ | Art compression 00, 16 blocks |
777D2 | Surface of water from HPZ and CPZ | Art compression 00, 24 blocks |
77942 | Unknown. It looks like a small cylinder kinda. | Art compression 00, 4 blocks |
779AA | Blue ball for enemy in CPZ | Art compression 00, 4 blocks |
77A1C | CPZ metal stuff | Art compression 33 blocks |
77C26 | Some blocks from CPZ | Art compression 4 blocks |
77C66 | Some diagnally striped blocks from CPZ | Art compression 8 blocks |
77CD2 | Little yellow moving platform from CPZ | Art compression 48 blocks |
77EB4 | Block from CPZ, but with something else as well. | Art compression 24 blocks |
78074 | Spring on top of pipe from CPZ, and something else further down. | Art compression 32 blocks |
78270 | Top of water from ARZ | Art compression 00, 16 blocks |
78356 | Leaves from ARZ | Art compression 00, 7 blocks |
783E2 | Arrow and arrow shooter from ARZ | Art compression 00, 17 blocks |
78540 | Splash from ARZ | Art compression 00, 4 blocks |
78580 | Button | Art compression 16 blocks |
78658 | Vertical red spring | Art compression 00, 20 blocks |
78774 | Horizontal red spring | Art compression 12 blocks |
7883E | Diagonal spring | Art compression 32 blocks |
78A12 | Score, rings, time patterns | Art compression 24 blocks |
78B1A | Sonic lives counter | Art compression 12 blocks |
78C30 | Ring patterns | Art compression 00, 14 blocks |
78D24 | Monitor patterns | Art compression 60 blocks |
7914E | Spikes | Art compression 8 blocks |
7919E | Numbers | Art compression 18 blocks |
79278 | Beta starpoll | Art compression 10 blocks |
7931E | Signpost for end of level | Art compression 82 blocks |
798F4 | Weird spring from CPZ and ARZ | Art compression 00, 28 blocks |
79A44 | Long horizontal spike | Art compression 00, 8 blocks |
79AC0 | Bubbles and numbers that count down when underwater | Art compression 00, 116 blocks |
7A11A | Crocodile | Art compression 00, 44 blocks |
7A4BC | Buzz bomber | Art compression 00, 28 blocks |
7A6A2 | Bat from HPZ | Art compression 00, 58 blocks |
7A9F8 | Octopus from OOZ | Art compression 00, 58 blocks |
7AD18 | Rhinobot | Art compression 00, 5 blocks |
7B114 | Dinobot | Art compression 00, 48 blocks |
7B4EA | Pirhana | Art compression 00, 64 blocks |
7B9E2 | Seahorse from OOZ | Art compression 00, 62 blocks |
7BE30 | Spinning ball thingy | Art compression 00, 27 blocks |
7C0C6 | Blinky | Art compression 24 blocks |
7C2F2 | Bubble monster | Art compression 00, 24 blocks |
7C514 | Ground based badnick from EHZ | Art compression 26 blocks |
7C710 | Bouncer badnick from CNZ | Art compression 00, 42 blocks |
7CA92 | Fish badnick from EHZ | Art compression 22 blocks |
7CC9E | Robotnic and his main ship | Art compression 96 blocks |
7D3DA | CPZ boss | Art compression 111 blocks |
7D938 | Some kind of large explosion | Art compression 00, 100 blocks |
7DFC0 | A small explosion | Art compression 00, 8 blocks |
7E03E | Some kind of trailing smoke | Art compression 00, 16 blocks |
7E124 | EHZ boss | Art compression 128 blocks |
7E910 | Chopper blades for EHZ boss | Art compression 00, 20 blocks |
7EA04 | Title card patterns for levels | Art compression 128 blocks |
7F012 | Regular in level explosion | Art compression 96 blocks |
7F678 | Game/time over tiles | Art compression 34 blocks |
7F80A | Vertical spring from S1 | Art compression 00, 16 blocks |
7F90C | Horizontal spring from S1 | Art compression 14 blocks |
7F9E8 | Flash from entering giant ring | Art compression 84 blocks |
7FB5C | Hidden end of level bonus points | Art compression 00, 36 blocks |
7FE5E | Patterns for continue screen from S1 | Art compression 37 blocks |
8010E | Patterns for recieveing continue at end of special stage from S1 | Art compression 30 blocks |
80348 | Rabbit | Art compression 00, 18 blocks |
804A0 | White bird | Art compression 14 blocks |
805FC | Black bird | Art compression 00, 18 blocks |
80778 | Seal | Art compression 00, 14 blocks |
80894 | Pig | Art compression 18 blocks |
809CA | Blue bird | Art compression 00, 14 blocks |
80B04 | Bear | Art compression 00, 18 blocks |
80C60 | 16x16 block mappings for EHZ | Further info |
81C00 | EHZ/HTZ main level patterns | Art compression 912 blocks |
84A50 | 16x16 block mappings for HTZ suppliment on EHZ tiles | Further info |
85200 | HTZ pattern suppliment to EHZ level patterns | Art compression 386 blocks |
86626 | Initial blocks for dynamically reloaded and animated patterns in HTZ | Art compression 46 blocks |
8692E | EHZ/HTZ 128x128 block mappings | Compressed Further info |
89B8E | WZ 16x16 block mappings | Further info |
8AB2E | WZ main level patterns | Art compression 798 blocks |
8E826 | WZ 128x128 block mappings | Compressed Further info |
90456 | MTZ 16x16 block mappings | Further info |
91716 | MTZ main level patterns | Art compression 783 blocks |
94C56 | MTZ 128x128 block mappings | Compressed Further info |
97596 | HPZ 16x16 block mappings | Further info |
98B76 | HPZ main level patterns | Art compression 725 blocks |
9B9F8 | HPZ 128x128 block mappings | Compressed Further info |
9D778 | OOZ 16x16 block mappings | Further info |
9ED58 | OOZ main level patterns | Art compression 693 blocks |
A1A58 | OOZ 128x128 block mappings | Compressed Further info |
A3F88 | MCZ 16x16 block mappings | Further info |
A5248 | MCZ main level patterns | Art compression 936 blocks |
A8B6A | MCZ 128x128 block mappings | Compressed Further info |
AB5CA | CNZ 16x16 block mappings | Further info |
ABF2A | CNZ main level patterns | Art compression 850 blocks |
AE746 | Leftover data from previous build | |
AEF3C | Some blocks from CNZ | Art compression 22 blocks |
AF026 | CNZ 128x128 block mappings | Compressed Further info |
B0F26 | CPZ/DEZ 16x16 block mappings | Further info |
B2506 | CPZ/DEZ main level patterns | Art compression 858 blocks |
B6058 | CPZ/DEZ 128x128 block mappings | Compressed Further info |
B8558 | ARZ 16x16 block mappings | Further info |
B9E58 | ARZ main level patterns | Art compression 1002 blocks |
BF408 | Waterfall patterns | Art compression 00, 11 blocks |
BF568 | ARZ 128x128 block mappings | Compressed Further info |
C2138 | End of compressed ARZ 128x128 block mappings | Further info |
C2148 | large chunk of CNZ 128x128 block mappings (uncompressed) | Further info |
C943C | CPZ 16x16 block mappings (Different to current beta) | Further info |
CAA1C | CPZ main level patterns (797 blocks) (Different to current beta) | Further info |
CE03A | CPZ 128x128 block mappings (uncompressed) (Different to current beta) | Further info |
D603A | ARZ 16x16 block mappings | |
D793A | ARZ main level patterns (1002 blocks) (Identical to current beta) | |
DCEEA | Waterfall patterns (00, 11 blocks) | |
DD04A | ARZ 128x128 block mappings (uncompressed) (Different to current beta) | |
E504A | Incomplete part of ARZ main level patterns (Identical to current beta) | |
E57E6 | Waterfall patterns (00, 11 blocks) | |
E5946 | Compressed ARZ 128x128 block mappings | Further info |
E8000 | Half of SEGA intro sound | Further info |
EC000-ECFFF | ?????????? | |
ED000-EFFFF | ?????????? (Something to do with music) | |
F0000-F1E8B | ?????????? (Something to do with music) | |
F1E8C-F7FFF | SEGA intro sound | 16000Hz mono 8-bit unsigned PCM raw audio Further info |
F8000-FEFFF | ?????????? (Something to do with music) | |
FF000-FFFFF | ?????????? (Something to do with sound fx) |
Offset indexes
An offset index is a handy way of keeping a block of data grouped together, and
also replacing a whole heap of pointers. The way it works is there is a list of
two byte vaues, and depending on the block of data the game wants to load, it
will take one of those values and add it to the starting address of the offset
index. The most common usage is for every act of every level value, there is an
offset that acts as the pointer to the block of data to use for it. Lets look at
an example:
E6800: 004A 037A 5552 5552 5552 5552 5552 5552 0734 0BC0 10EE 10EE 1748 1AFC
Now this is the beginning of the offset index for the sprite locations. Now,
can you see which values are the offset for MTZ act 2? They're 0BC0. All you
had to do to get that was to take the level value for MTZ, which is 04, and
count across four bytes for every value it is above 00, then across another two
because it's the second act. Now we take that value and using a hex calculator,
add it to the address of the offset table, which is E6800. That will give us a
value of E73C0, which is the address in the rom of the MTZ act 2 sprite
locations.
Also notice those 5552 values in there? Well those are for the unused level
values in the game. You'll see some damn weird values put in for them in many
places, and that's what causes the game to lockup in the final build of sonic 2
if you try and enter one of those levels.
There are other forms of an offset index such as the one where there's just one
offset per level value, and another type that actually uses a double offset index.
The first is easy enough, but a double offset index will specify two values per
level, but that's not for act one and two, but rather two blocks of data to use
for both acts.
Main level load block
This pointer table is what is used to load up the block mappings and main level
patterns for every level in the game. Here's a breakdown of the pointer table
in the S2B rom:
24354-2441F: Indexed main level load block (patterns/16x16/128x128)24354-2435F: Emerald Hill zone (00)24360-2436B: Unknown (01)24354: EHZ/HTZ main level patterns (81C00) [04]
2435C: EHZ/HTZ 128x128 block mappings (8692E) [04]
24358: EHZ/HTZ 16x16 block mappings (80C60) [05]
2436C-24377: Wood zone (02)24360: EHZ/HTZ main level patterns (81C00) [06]
24368: EHZ/HTZ 128x128 block mappings (8692E) [05]
24364: EHZ/HTZ 16x16 block mappings (80C60) [07]
24378-24383: Unknown (03)2436C: WZ main level patterns (8AB2E) [08]
24374: WZ 128x128 block mappings (9E926) [06]
24370: WZ 16x16 block mappings (89B8E) [09]
24384-2438F: Metropolis zone (04)24378: EHZ/HTZ main level patterns (81C00) [0A]
24380: EHZ/HTZ 128x128 block mappings (8692E) [07]
2437C: EHZ/HTZ 16x16 block mappings (80C60) [0B]
24390-2439B: Metropolis zone act 3 (05)42384: MTZ main level patterns (91716) [0C]
4238C: MTZ 128x128 block mappings (94C56) [08]
42388: MTZ 16x16 block mappings (90456) [0D]
2439C-243A7: Unknown (06)24390: MTZ main level patterns (91716) [0C]
24398: MTZ 128x128 block mappings (94C56) [08]
24394: MTZ 16x16 block mappings (90456) [0D]
243A8-243B3: Hill Top zone (07)2439C: EHZ/HTZ main level patterns (81C00) [10]
243A4: EHZ/HTZ 128x128 block mappings (8692E) [0A]
243A0: EHZ/HTZ 16x16 block mappings (80C60) [11]
243B4-243BF: Hidden Palace zone (08)243A8: EHZ/HTZ main level patterns (81C00) [12]
243B0: EHZ/HTZ 128x128 block mappings (8692E) [0B]
243AC: EHZ/HTZ 16x16 block mappings (80C60) [13]
243C0-243CB: Unknown (09)243B4: HPZ main level patterns (98B76) [14]
243BC: HPZ 128x128 block mappings (9B9F8) [0C]
243B8: HPZ 16x16 block mappings (97596) [15]
243CC-243D7: Oil Ocean zone (0A)243C0: EHZ/HTZ main level patterns (81C00) [16]
243C8: EHZ/HTZ 128x128 block mappings (8692E) [0D]
243C4: EHZ/HTZ 16x16 block mappings (80C60) [17]
243D8-243E3: Dust Hill zone (0B)243CC: OOZ main level patterns (9ED58) [18]
243D4: OOZ 128x128 block mappings (A1A58) [0E]
243D0: OOZ 16x16 block mappings (9D778) [19]
243E4-243EF: Casino Night zone (0C)243D8: DHZ main level patterns (A5248) [1A]
243E0: DHZ 128x128 block mappings (A8B6A) [0F]
243DC: DHZ 16x16 block mappings (A3F88) [1B]
243F0-243FB: Chemical Plant zone (0D)243E4: CNZ main level patterns (ABF2A) [1C]
243EC: CNZ 128x128 block mappings (AF026) [10]
243E8: CNZ 16x16 block mappings (AB5CA) [1D]
243FC-24407: Genocide City zone (0E)243F0: CPZ main level patterns (B2506) [1E]
243F8: CPZ 128x128 block mappings (B6058) [11]
243F4: CPZ 16x16 block mappings (B0F26) [1F]
24408-24413: Aquatic Ruin zone (0F)243FC: EHZ/HTZ main level patterns (81C00) [20]
24404: EHZ/HTZ 128x128 block mappings (8692E) [12]
24400: EHZ/HTZ 16x16 block mappings (80C60) [21]
24414-2431F: Death Egg zone (10)24408: ARZ main level patterns (B9E58) [22]
24410: ARZ 128x128 block mappings (BF568) [13]
2440C: ARZ 16x16 block mappings (B8558) [23]
24414: EHZ/HTZ main level patterns (81C00) [24]
2441C: EHZ/HTZ 128x128 block mappings (8692E) [14]
24418: EHZ/HTZ 16x16 block mappings (80C60) [25]
Now as you can see, these pointers specify the loading addresses in the rom for the
16x16 and 128x128 block mappings, as well as the main pattern block for that level.
The main pattern block will always be loaded into the VRAM at address 0000. These
loading addresses are all preceeded by a one byte value, so the address pointer only
uses three bytes rather than the standard four. The value that proceeds the 128x128
block mappings specifies a value on the palette index to load for that level. For
more information on the palette system, go <a href="#Palettes">here</a>. The values
preceeding the main level pattern and 16x16 block mapping pointers give the index
numbers of the pattern load cue's to use for that level. For more information on that
go here.
Pattern load cue's
The pattern load cue's are what loads all the peices of art into the VRAM that are not in the main level load block. Here's a breakdown of the pattern load cue's in the S2B rom:
00 | 2447A | Standard block 1 (starpoll/score\rings\time/lives/ring/numbers) | (4) |
01 | 2449A | Standard block 2 (monitor/bubble/stars) | (2) |
02 | 244AE | Unknown (explosion/rabbit/white bird) | (2) |
03 | 244C2 | Game\time over (game\time over text) | (0) |
04 | 244CA | EHZ (EHZ\HTZ patterns/waterfall/bridge/fireball/spikes/D spring/V spring/H spring) | (7) |
05 | 244FC | EHZ (buzz bomber/tire badnick/fish) | (2) |
06 | 24510 | WZ (WZ patterns) | (0) |
07 | 24518 | WZ (spikes/D spring/V spring/H spring) | (3) |
08 | 24532 | MTZ (MTZ patterns/4 blocks/wheel/ball/unknown/unknown/steam/spikeblock/spike) | (8) |
09 | 2456A | MTZ (button/spikes/D spring/V spring/H spring/unknown/lava bubble/unknown/cog) | (8) |
0A | 245A2 | HTZ (EHZ\HTZ patterns/HTZ patterns/fireball/rock/conveyor/orbit badnick/spikes/D spring/V spring/H spring) | (9) |
0B | 245E0 | HTZ (unknown/fireball/HTZ barrier) | (2) |
0C | 245F4 | HPZ (HPZ patterns/bridge/waterfall/platform/pulsing ball/HPZ stuff/master emerald/water) | (7) |
0D | 24626 | HPZ (dinosaur badnick/bat/crocodile/buzz bomber/bat/rhinobot/dinosaur badnick/pirahna) | (1)[7] |
0E | 24658 | OOZ (OOZ patterns/rising platform/spikeball/stuff/stuff/oil/oil) | (6) |
0F | 24684 | OOZ (unknown/unknown/unknown/unknown/swinging platform/button/spikes/D spring/V spring/H spring/) | (9) |
10 | 246C2 | MCZ (MCZ patterns/box/collapsing platform/pullswitch/vines) | (4) |
11 | 246E2 | MCZ (H spike/spikes/log/lever spring/V spring/H spring) | (5) |
12 | 24708 | CNZ (CNZ patterns/stuff) | (1) |
13 | 24716 | CNZ (spikes/D spring/V spring/H spring) | (3) |
14 | 24730 | CPZ (CPZ patterns/stuff/striped blocks/unknown/big platform/small platform/spring stopper/water/unknown/stuff) | (9) |
15 | 2476E | CPZ (bubbles\numbers/spikes/unknown/level spring/V spring/ H spring) | (5) |
16 | 24794 | ARZ (ARZ patterns/water/leaves/arrow shooter/splash) | (4) |
17 | 247B4 | ARZ (bubbles\numbers/spikes/lever spring/V spring/H spring) | (4) |
18 | 247D4 | Title card (title card patterns) | (0) |
19 | 247DC | End of signpost level (signpost/hidden bonuses/unknown) | (0)[2] |
1A | 247F0 | End of boss level (unknown boss/EHZ boss/unknown/unknown boss/unknown boss/small explosion/smoke trail/EHZ boss/unknown) | (2)[8] |
This pointer list has an offset index to locate the correct cue. Go
here for an explanation of how this works. Note that the
number in parenthesis is the recorded number of requests in the cue. If a number
follows it in brackets, it means the actual number that exists differs from the
recorded one. This means any load requests past the recorded number were not
being loaded, but still exist in the rom. Now, each load cue has a two byte
value before it that specifies how many addresses are in the cue, to avoid it
reading too far, and going into the next cue. This value is dead simple, just
enter the number of patterns on the cue in hex between the first two bytes, but
you have to count 00 as 1, so if there was 16 loading addresses in the cue, you'd
have 000F preceding it. After that, there are 6 bytes per load request. The first
four bytes are a pointer to the art block to use, and the two bytes after that
are the location in the VRAM to load them into. To change the pattern load cue's
being loaded for a level, you need to change the values in the main level load
block. For more information on that go here.
Collision definitions
Ok, I’m going to explain how collision works on objects that are not sprites in
the sonic games. First of all forget the image that the block contains. The
image has absolutely nothing to do with the collision. There's basically in
invisible collision box on top of every 16x16 block that sets what's solid and
what's not. This collision box has two parts to it. The main part of it is the
collision array (an array is basically a table of values). The collision array
stores the actual data that says that is a block is solid in certain places. It
does that through 16 bytes per collision box. To understand how those 16 bytes
set what's solid, imagine a 16x16 block. Now imagine that 16x16 block with the
numbers 1-10 (hex) down the side starting from the bottom and going up to the
top, and starting from the left and going up as it moves right along the top,
so that you can give an exact location of each pixel. (eg, the top left pixel
would be 10,00) Now, in this array the first two bytes define what's solid for
the row of pixels on the left side of that 16x16 block. Basically the first of
those two bytes says where to start making things solid, and the second byte
says where to stop making them solid. So if you entered the value 0010, the
first row would be solid from the very bottom of the block all the way up to
the top. If you were to enter the value 020E, there would be two pixels on
either side of the block that are not solid, and everything in the middle would
be. The next two bytes after that are for the next row, etc. After 16 bytes the
definitions for the next collision box begin.
Now, to specify which blocks use which collision boxes, there are collision
indexes, which give an array location for each 16x16 block. If you look at the
space used by the collision array, you can divide that by 16 (the number of
bytes used by each entry into the array) to give a one byte value, which
represents the maximum number of collision boxes that the array can hold in the
S2 platform, which is FF. Now, for each level there is at least one 16x16
collision index, and that index consists of a whole heap of array locations,
one for each 16x16 block. If for example you wanted the 9th 16x16 block to use
the collision box with an array location of 3E, you would give the 9th byte of
the collision index for that level a value of 3E.
It is through collision indexes that the loops work in the game. It's
commonly believed that there are layers, and that the sprite represented by 4
rings changes between them. This is partly true. For any levels that use
multiple layers like that, there is a secondary 16x16 collision index. That
object switches the 16x16 collision index in use. The pointers to these 16x16
collision indexes are stored at 4ADC-4B63. The first set of pointers in this
group specify the location of the primary collision index to use for each
level, and the second set specify the location of the secondary collision index
to use for each level.
Now just setting something as solid, doesn't give it the effect of having a
slope. There's an index in the rom, which has one byte in it for each collision
array location. To understand how this value works, think of two lines running
parallel to each other, both with the value 0-F along them. Now, the first
value of the byte gives a point on the right line, and the second value gives a
point on the left line. Now imagine drawing a line between these to points. If
the points are different, the resulting gradient will be taken to create the
effect of a slope and the resistance going up it on the box in the
corresponding collision array location.
Level layout
The level layout in S2B is stored in the rom in a way similar to how the level
layout is stored in the ram in S3&K. All the level data for a level is broken
into two peices, one for the foreground of the level, and one for the background.
When being read into the ram, this data is interleaved to give the entire level
layout. The offset index that proceeds the actual level data is a unique offset
index, and is similar to a double offset index. There are two offset values for each
act. The first offset is linking to the data for the foreground for that act, and the
second offset is linking to the background for that act. The level data itself
is not compressed however, so you can just edit it directly. For information on
how to edit it, check the savestate section.
Ring placement
The data for ring placement has an offset index to locate the correct group. Go
here for an explanation of how this works. Now, in the
rom each ring does not have to be stored individually. Instead you can place
one ring, and specify that a certain number of rings come after it. The
definitions for one ring takes up 4 bytes in the rom. Let's look at an example:
1234 5678
Now, in this example the ring will be placed at an x location of 1234, and a y
location of 678. With that value where the 5 was entered, if the value entered
is below 8, an additional ring will be placed next to the one before it for
every unit that the value entered is above 0. Entering a value above 8 will
place an additional ring below the one before it for each unit that the value
entered is above 8. When specifying a position as the start of a group of
rings, if the group is horizontal, the rings will go across to the right of
that point, and if the group is vertical the rings will go down from that
point. The value FFFF closes the group of ring locations, and it is essential
that this is at the end of the ring locations list, or else the game will keep
on reading past that point until it hits that value.
Sprite placement
Sprites are quite simple to define. It takes six bytes to define one sprite.
The first two bytes are the x location of the sprite, and the next two bytes
are the y location of the sprite. The 5th byte is the number on the sprite
array to lookup to get the location for the function to use for the programming
of that sprite, and the 6th byte is an optional declaration to use with the
function for that sprite. Go here for more info on what
exactly that means, and a list of all the sprites in the S2B rom.
Main level block mappings
In the S2B rom, the 128x128 block mappings are compressed, but the 16x16 block
mappings are not. This means you can edit the 16x16 block mappings directly,
but the 128x128 block mappings must be decomporessed to be edited effectively.
At this point in time, there is no untility that is capable of compressing
data into the format used by 128x128 block mappings, so the only thing that's
really possible for now is porting the block mappings from one level to another.
For information on what the block mappings do, and how to edit them, check the
savestate section.
Uncompressed art
Any art that needs to be updated on the fly will not be compressed in the rom.
This is because the game can't work with compressed data, and needs to extract
any data it wants to use to the ram. This decompression process takes a fair
bit of computation, and because of that it wouldn't be possible to create the
appearance of a smooth animation using compressed data. The same reason is true
as to why any data that is not loaded into the ram will always be uncompressed,
because otherwise they would have to load it into the ram just to read it.
Now, for example all of the blocks for Sonic and Tails are uncompressed, because
they of course need to be updated quickly. You can use basically any editing
utility to edit them, but you can only change what each block looks like
through this. In order to edit what blocks are placed where in each of Sonic's
animation frames, you need to edit the mappings for them, and for more
information on that go here. Now in their uncompressed form, you can edit them
just like you would in the VRAM, so for more information on that check the
sonic 2 savestate breakdown.
Mappings for Sonic/Tails
What the mappings do is they tell the game what patterns to display, and where
to put them for each of the frames that the sprite has. The mappings for most
sprites are contained within their function (go here for
more details), but with the Sonic and Tails sprites, to allow the programmers
to add a new frame easily without having to recompile the function, and hence
the whole game because of the size difference, they created a separate array
containing the mapping data for each frame. I haven't examined this to see how
it works yet, but when I do I’ll explain the format here.
Sega intro sound
The Sega intro sound is just an 16000HZ wav sound. Opening up the rom in any
sound editing program that supports raw audio with the settings listed next to
the location on the list will enable you to playback the sound effect. You
could also insert your own sound in the same place as long as it's at the same
bitrate. The bitrate is to do with the quality of the sound. The lower it is
the crappier it will sound, because that's to do with how often the output is
modified. Just think of the difference between long play and short play on a
VCR. Stuff recorded in long play does save space, but the quality of the
recording is worse.
Art compression format
The art compression format is a very dense compression format. It's only used
for art because the format relies on the data being in blocks of 64 bytes. This
format is used for all the compressed art in sonic 1 and sonic 2 beta, and all
the compressed art except for the main level pattern blocks in Sonic 2 and
S3&K. As I said this format is very dense, and as such it requires a hell
of a lot of computation to decompress. Because of this it also requires a hell
of a lot of time and effort to crack. I've had a go at it, but the lightning
has yet to strike. When I crack it I’ll post the format breakdown here, and
create a simple program to decompress it, but until then it is impossible to
directly edit any art using this format. The porting of a compressed block of
art is simple though, so if you want to transfer beta art to the final, you can
just tack it onto the end and enter the pointer into the pattern load cue of
the level or event you want it to appear at, along with a VRAM location to load
it into. Go Here for more information on that.
Dynamic pattern reloading
Dynamic pattern reloading is a method of loading patterns into the VRAM, but
unlike the other methods, this one has no limitations, because it uses actual
programmed code. Basically this is here for any effects to do with
patterns changing in game that isn't posible using the normal load cue system,
like the hills in the background of HTZ where the patterns to display are
determined by the position of the screen Becuase the programming for it is in
the form of compiled code, direct editing of it is not possible.
Animated pattern load cue's
Animated patterns require the art they are working with to be in an uncompressed
form, so if you are attempting to make an animated pattern, make sure the art
is uncompressed or it won't work. Now, the length of each load request on the
cue varies depending on the animation. The first byte specifies a value that
will determine how often to switch frames in the animation. If you use this
value you will not be able to specify a frame as having a different duration to
another. Setting this to FF will disable automatic frame control and allow the
user to input a manual duration for each frame. This will mean that for every
frame the user wants in the animation, they have to allow another byte at the
end of the load request. If you want automatic pattern control, which
you would use if you want all the animations frames to have the same duration.
Just enter how many screen refreshes to wait until the next frame of the
animation is displayed. Bytes 2,3, and 4 are the address in the rom to load the
patterns from. Bytes 5 and 6 are the location in VRAM to load the patterns into.
Byte 7 is the number of frames the animation has, and byte 8 is the number of
spaces in VRAM to use for each frame. The function of the bytes beyond this
point depend on whether or not automatic frame control is enabled, so refer to
appropriate section below.
With automatic frame control:
One byte per frame of animation. This byte simply specifies the image to use for
each frame of the animation. Based on the loading address entered, this value is
the offset in 8x8 blocks to load each frame from in the rom. So if for example
you were dealing with an animation that had 4 8x8 blocks per frame, and there
were 4 frames of that, and you wanted it to display each frame one by one, you
would enter the value 0004 080C.
Without automatic frame control:
Two bytes per frame of animation. The first byte is the offset of blocks in the
file to load the animation frame from. This byte simply specifies the image to
use for each frame of the animation. Based on the loading address entered, this
value is the offset in 8x8 blocks to load each frame from in the rom. The second
byte is the number of screen refreshes to keep that image loaded for, before
going on to the next animation frame.
Misc sprite definitions
It looks like there are some sprites that get thier mappings and whatnot from
this index, so they can reuse just a couple of sprites for some of the the
miscellaneous objects in a level that the character doesn't actually interact
with, but those objects can be completely different from one level to the next.
A handy way of avioding programming each one individually, and thus saving a
hell of a lot of space. As for how to edit them, well I haven't looked at that yet,
but when I do i'll post an explination of the format here.
Rasterised layer deformation
Raster effects are simply effects to do with deformation of an image based on lines
of pixels. In Sonic 2, these effects are used to create the movement effects for the
backgrounds of all the levels, as well as the 2 player splitscreen effect. Because
the programming for these effects are stored in the form of compiled code, you'll
have to learn 68K ASM in order to edit them. Switching between levels is easy enough
though, just change the corresponding value on the preceeding offset index to link
to the effect you wish to use.
Palettes
All the main palettes used in the game are linked in a pointer table at 294E. In this
pointer table there are 8 bytes per palette. The first four simply give a location in
the rom for the data to load. The fifth and sixth bytes give the location in the
system ram to load the data into, and the seventh and eighth bytes give the number of
four byte blocks being loaded. Here's a palette pointer:
0000 2942 FB20 0007
Now in this case the palette is being loaded from 00002942 in the rom into the
beginning of the second above water palette row (FB20), and it's loading 16 colours
(0007). Here's a listing of the palette pointers in the S2B rom:
00 | 294E | SEGA screen palette (2A16) |
01 | 2956 | Title screen palette (2A96) |
02 | 295E | Level select palette (2B16) |
03 | 2966 | Primary palette line (2B96) |
04 | 296E | EHZ level palette (2BB6) |
05 | 2976 | 01 level palette (2BB6) |
06 | 297E | WZ level palette (2C16) |
07 | 2986 | 03 level palette (2BB6) |
08 | 298E | MTZ level palette (2C76) |
09 | 2996 | 05 level palette (2C76) |
0A | 299E | 06 level palette (2F36) |
0B | 29A6 | HTZ level palette (2CD6) |
0C | 29AE | HPZ level palette (2D36) |
0D | 29B6 | 09 level palette (2BB6) |
0E | 29BE | OOZ level palette (2E16) |
0F | 29C6 | MCZ level palette (2E76) |
10 | 29CE | CNZ level palette (2ED6) |
11 | 29D6 | CPZ level palette (2F96) |
12 | 29DE | GCZ level palette (2BB6) |
13 | 29E6 | ARZ level palette (3076) |
14 | 29EE | DEZ level palette (2BB6) |
15 | 29F6 | HPZ underwater palette (2D96) |
16 | 29FE | CPZ underwater palette (2FF6) |
17 | 2A06 | ARZ underwater palette (30D6) |
18 | 2A0E | Sonic 1 special stage palette (3156) |
To change the palette being loaded for each level, you need to change the palette index
number in the main level load block. For more information on that go
here. The palettes themeslves are very easy to modify as they are
all uncompressed in the rom. Refer to the savestate hacking documents for information
on how to edit palettes.
Level size array
All the sizes of the levels are stored in a simple array, and can be easily modified to
change the boundaries of the level. This array is located at 5986, and for each act
there are four values. The first gives the X start location of the level, and the second
gives the X end location of the level. Likewise the third value gives the Y start location
of the level, and the fourth gives the Y end location of the level.
Character start location array
The start location for the characers and the camera for each level are stored in this array
at address 5B02. It couldn't be any simpler to modify, there's just two values per act, the
first being the X location, and the second being the Y location.
Music playlist for levels
This is actually part of a sub in the code, but it's editable all the same. Pretty simple,
just one byte per level. That one byte is the value of the song you wish to play. You must
enter the value in the form in which it is displayed in the beta version, which is with 80
as the starting value, not 00 as it is displayed in the final. You'll notice with the value
for death egg, it's 08 not 88, which is why there's no sound in the level.
Level order
There are several different sections in the game to do with the order of levels. The first
one is the one that determins which level the game loads when someone finishes a level. The
second one is the one which determins which level to load when you select a level from the
level select menu. The level select one is easy to modify, just enter the level value
followed by an act number for each of the levels you want to load, in the order you want
them to be loaded. For a list of the level values for all the different stages, look at the
beginning of the introduction to this page. Note that if you load the same level into the
level order twice, when you link to it via the level select, it will continue the sequence
from the last one in the list, not the first.
The second system for which level to load when one ends works slightly differently. There
is a list of values, with two bytes allocated to each act of each level. That two byte
value is simply the value of the level you wish to load when that level ends. So, if you
wanted ARZ act 1 to load up when you finish MTZ act 2, you would take the location of the
table, which in this case is BF9A, and you would add 18 bytes to that location, and then
you would replace the next two bytes from that point with 0F00. That's becuase you add four
bytes to the address for every level that comes before it, and in this case there are 4, and
then you would add another 2 bytes becuase you want to alter the level to load when you
finish the second act.
Also, note that when you want a level to be the last level in the game, you must enter the
value FFFF as the stage to load when it finishes. This tells the game to end and return to
the title screen.
Object debug list
This list is what determins what sprites you can place in debug mode, and in what levels.
An offset index is used to locate which object debug list to use for which level, so if you
want further info on that go <a href="#offset">here</a>. Now, there is a 2 byte value at the
start of each debug list. That 2 byte value is simply the number of sprites in the list.
After that there are 8 bytes per sprite. Here's an object that's present in an object debug
list from sonic 2:
2601 | 2D36 | 0800 | 0680 | ||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
And here's a quick referance sheet of what each byte does. For further info on each one,
refer to information below.
1 | Object number |
2-4 | Sprite mappings |
5 | Declaration |
6 | Frame to display |
7 and 8 | flip/mirror/palette/VRAM location |
Object number:
This value is what determins which object to use. For a list of all the sprites in the game, check out the sprite programming section of this document here. In the case of the above example the object number is 26, which is a monitor.
Sprite mappings:
This is a pointer to the location in the rom to load the mappings for that sprite. This will be located in the programming for the sprite itself. Do not change this unless porting between levels, or you're absolutely sure you know what you're doing, or the game will most likely hang. This only affects the preview picture, not the placed object itself. In this case, the sprite mappings are being loaded from the address 012D36 in the rom.
Declaration:
This is the declaration for the loading of the sprite. For information on exactly what that is, go here. In this example the declaration is 08, which switches the type of monitor it is in the case of this sprite.
Frame to display:
This is simply the frame of the sprite that will be displayed on the preview picture before you place an object. Right now it's set to 00, which is the first frame.
Flip/mirror/VRAM location:
The first hex value of the 7th byte is to do with flipping and mirroring of the sprite, as well as the palette line to use for it. Refer to the following table for an explination of what responce each value will create.
Value | palette line | flipped horizntally | flipped vertically |
0 | 1 | n | n |
1 | 1 | n | y |
2 | 2 | n | n |
3 | 2 | n | y |
4 | 3 | n | n |
5 | 3 | n | y |
6 | 4 | n | n |
7 | 4 | n | y |
8 | 1 | n | n |
9 | 1 | y | n |
A | 2 | n | n |
B | 2 | y | n |
C | 3 | n | n |
D | 3 | y | n |
E | 4 | n | n |
F | 4 | y | n |
In the case of our example, the value of 0 is used, so the preview image will use the first
palette line, and will not be flipped or mirrored.
The last hex value of the 7th byte, and all of the 8th byte in this block combine to give a
starting location in the VRAM to find the patterns to use for that sprite when displaying
the preview. This is not an actual location, but merely the number of blocks after which to
load the patterns from. After the value of 800 is passed, the block number resets to zero
but the image is mirrored. In this case, that block number is 680.
And that's about it. I've just realised that this is a rediculous amount of detail for such
a small thing, but at least you're sure to get it.
Leftover data from previous builds
All through the S2B rom, there are blocks of leftover data from earlier builds of the game.
You see, when sonic team were working on the game, they would compile beta versions of the
game onto flashcarts, for test purposes and distribution. Because the data was compiled directly
onto the cart, any locations that didn't have to be written to retained the data they posessed
before. On a final release cart, this simply would've resuled in blocks of data all contaning
the value of FF, but in the case of this flashcart, data for earlier versions of the game had
been written to these areas previously. Any areas of lost data that I have extra information
about will be noted here.
End of compressed ARZ 128x128 block mappings
This small reminant of a rather recent build indicates a minor change in the above
blocks of data, which resulted in a slightly shorter file size. This was most likely
just a minor amendment to the block mappings for a level, resulting in them not
compressing quite as well.
large chunk of CNZ 128x128 block mappings
This contains a large proportion of an earlier version of the CNZ 128x128 block
mappings. The block of data is missing the first 3340 (D0C) bytes. From this
we can see a massive chanage in CNZ between this compilation and the one in our
beta. These block mappings have been changed so radically, that only a pattern
in thier layout is recogniseable when compared to our current beta one. This
indicates a massive restructuring in the order of the 16x16 block mappings of
this build as well, but unfortunately that data was written over.
CPZ patterns/block mappings
These are the complete patterns and block mappings for an earlier version of CPZ.
There are a few minor changes in the patterns, and some fairly major changes in the
16x16 and 128x128 block mappings.
Compressed ARZ 128x128 block mappings
This lost data is in an uncompiled form, and at first I mistook it for code. Apart from the fact it is in this form, the data appears to be very close to that of our current beta. There is a commented line at the very start of the block, which contains further information about the block of compressed data. Thanks go out to Iceknight, who figured out that the text in this comment was in Kanji, and thanks go out to Kojichao and sth2k for translating it. The commented line reads:
Before compression $8000 After compression $2c00 Compression ratio 34.4% Cell number 1024
I had already guessed the purpose of the first three numbers, But I still can't figure
out the puropse of the last one, or at least not one that would be worth putting in a
comment. If anyone has any idea what the fourth number is used for, let me know.
lost Pattern load cue's
Due to changes in the structure of the rom, there are quite a few pattern load cue's
left from previous compilations. In fact, in this one small area in the rom, I have
identified six different layers of lost data from previous compilations, and these
compilations seem to be a lot newer than the remains of level data judging by some
of the link locations on the cue. Here's a breakdown of the lost pattern load cue's:
24804 | End of boss level (unknown boss/unknown boss/small explosion/smoke trail/EHZ boss/unknown) | (?)[5] |
24828 | ARZ (lever spring/V spring/H spring) | (?)[1/2+1] |
24838 | Title card (title card patterns) | (0) |
24840 | End of signpost level (signpost/hidden bonuses/unknown) | (0)[2] |
24854 | End of boss level (unknown boss/EHZ boss/unknown/unknown boss/unknown boss/small explosion/smoke trail/EHZ boss/unknown/) | (2)[8] |
2488C | End of boss level (smoke trail/EHZ boss/unknown) | (?)[1/2+1] |
2489C | MCZ (log/invalid pointer (7976C)/V spring/H spring) | (?)[3] |
248B4 | CNZ (invalid pointer (AB748)/invalid pointer (AE75A)) | (1) |
248C2 | CNZ (spikes/D spring/V spring/H spring) | (3) |
248DC | CPZ (invalid pointer (B1D24)/stuff/striped blocks/unknown/big platform/small platform/spring stopper/water/unknown/stuff) | (9) |
2491A | CPZ (spikes/unknown/invalid pointer (7976C)/V spring/H spring) | (4) |
2493A | ARZ (invalid pointer (B9686)/water/leaves/arrow shooter/splash) | (4) |
2495A | ARZ (spikes/invalid pointer (7976C)/V spring/H spring) | (3) |
24974 | Title card (invalid pointer (7E222)) | (0) |
2497C | End of signpost level (signpost/invalid pointer (7F37A)/invalid pointer (7F206)) | (2) |
24990 | End of boss level (invalid pointer (7C4BC)/invalid pointer (7D942)/invalid pointer (7E12E)/invalid pointer (7C4BC)/invalid pointer (7CBF8)/invalid pointer (7D7DE)/invalid pointer (7D85C)/invalid pointer (7D942)/invalid pointer (7E12E)) | (2)[8] |
249C8 | ARZ (invalid pointer (?AD00)/invalid pointer (7976C)/V spring/H spring) | (?)[1/2+2] |
249DC | Title card (invalid pointer (7E222)) | (0) |
249E4 | End of signpost level (signpost/invalid pointer (7F37A)/invalid pointer (7F206)) | (2) |
249F8 | End of boss level (invalid pointer (7C4BC)/invalid pointer (7D924)/invalid pointer (7E12E)/invalid pointer (7C4BC)/invalid pointer (7CBF8)/invalid pointer (7D7DE)/invalid pointer (7D85C)/invalid pointer (7D942)/invalid pointer (7E12E)) | (2)[8] |
If you want more info on the pattern load cue's, go here.
From these load cue's we can see that there were some changes in the locations of
some of the small blocks of compressed art, and that has resulted in some of the
older pointers linking to the wrong data. The thing that I find most interesting
about this deals with the load cue for the end of signpost level load cue. You'll
notice with this cue that the last two load requests were cutoff in our beta, which
link to those hidden bonues at the end of an act in Sonic 1, and more importantly,
the flash effect from entering the giant golden ring, that leads to a special stage.
The patterns for this ring are in the rom, but until I saw this I wasn't convinced
that it was ever implemented in the game. Now, if you look at the cue that's colour
coded yellow, you'll notice it isn't cutoff yet, but in the green compilation it
has been, so somewhere between those two compilations, the ideas they were using
for the method of entering the special stage, and the bonus points at the end of a
level were changed. If you compare the link locations of the main level patterns
for any of the levels in the yellow load cue's with the current link locations,
and the lost block mappings and art there, it's clear that all these cue's are for
compilations made after the compression methods for both 16x16 and 128x128 block
mappings were put in place, which either means that those blocks of data with the
block mappings and level patterns are from a much earlier compilation than I
figured, or the ideas for the end of a level were changed just before the time of
our beta.
Sprite programming
The programming for a sprite in the sonic games are stored as a function, and that function can take one declaration. People often confuse this declaration with a subtype value, but it's not really. What that basically means for the non programmers out there is that when the game places a sprite, you can enter a value along with the sprite number that may alter something about that sprite, but what it does varies depending on what sprite you're working with. Now because these functions are now compiled, the only way you can effectively edit them is to find the code for it and decompile it into assembly, alter it as necessary, and then recompile it and enter it back into the rom. This document will contain all the info necessary to enter a new sprite or replace an old one, but when it comes to the ASM you're on your own.<p>
Now, the value assigned to a sprite in the game is done by a pointer index at
D01A-D249. It’s pretty simple, just one pointer per address value. Here's the
pointer list in Sonic 2 beta:
01 | Sonic [FC48] |
02 | Tails [10E38] |
03 | Collision index switcher [144B0] |
04 | ??????? [15090] |
05 | Tails' tail [11F96] |
06 | Spiral loop in EHZ [1572C] |
07 | ??????? [180D0] |
08 | ??????? [12B42] |
09 | Sonic from S1 special stage [21D40] |
0A | Flashing number that gives air countdown [1207C] |
0B | Block that tips you off from CPZ [148AC] |
0C | Unknown (A small one way block. At set intervals the platform raises slightly then goes back down. Movement is slow and erattic, not smooth.) [149FC] |
0D | Signpost [F1F4] |
0E | Unknown (a huge block locked onscreen) [B7B4] |
0F | Unknown (very very weird. Using the blocks for a computer, every time you press jump another block for it appears locked onscreen int he top left corner) [B83A] |
10 | ??????? [223E2] |
11 | Bridge [7FDC] |
12 | The master emerald [14AFC] |
13 | Waterfall from HPZ [14B78] |
14 | See-saw [15B8C] |
15 | Unknown (crashes emulator) [85F8] |
16 | Diagnally moving and falling platform from HTZ [1600C] |
17 | Ball badnick from CPZ that goes up one tube and down another [8B9C] |
18 | Fixed large platform from CPZ [8D38] |
19 | Large platform from CPZ moving from side to side [1621C] |
1A | Collapsing platform from OOZ [9128] |
1B | Boosters from CPZ [16468] |
1C | ??????? [999C] |
1D | Enemy made up of small blue balls in CPZ [165B0] |
1E | Spin-tube from CPZ [16724] |
1F | Breakaway platform made up of small blocks from MZ in S1 [9274] |
20 | Unknown (An invincible object that drops two fireballs at a time, one on either side. object is fixed and cannot be hurt.) [17174] |
21 | Onscreen display (lives/score/time/rings) [22DFC] |
22 | Arrow shooter from ARZ [19660] |
23 | Piller that drops lower half in ARZ [19850] |
24 | Unknown (sprite cycles frames and then disappears) [A012] |
25 | Ring [AC28] |
26 | Monitor [B29C] |
27 | Explosion giving off 100 points and an animal [A086] |
28 | Unknown (some weird thing using some scrambled animal patterns bouncing up and down) [A2B0] |
29 | 100 points [A7C0] |
2A | Stomper from MCZ [9C0C] |
2B | Raising pillar from ARZ [19A1E] |
2C | Leaves from ARZ [1A0C4] |
2D | One way barrier from ARZ [9CE2] |
2E | Contents of computer monitor flying up [B46A] |
2F | Unknown (suspect it's the blocks you bust blocking the loops in HTZ) [1747C] |
30 | Unknown (a collision box the size of the screen) [17A4C] |
31 | Boundary block for lava [155A0] |
32 | Cap on top of spin tubes in CPZ [1768A] |
33 | Platform on top of oil burners from OOZ [17CA0] |
34 | ??????? [BB54] |
35 | ??????? [1264E] |
36 | Spikes [C944] |
37 | Ring spray [AD62] |
38 | ??????? [125CE] |
39 | Game over text [BD76] |
3A | End of act sprite (ends level) [BE38] |
3B | Unknown (a block) [CD00] |
3C | Bustable vertical barrier [CD7C] |
3D | Block that propells sonic when he busts it from OOZ [18E78] |
3E | Unknown (a block) [20E5C] |
3F | Red explosion [A11E] |
40 | Weird spring from ARZ and CPZ [1A30C] |
41 | Horizontal red spring [E7B8] |
42 | Steam vent from MTZ [1A5CC] |
43 | Spikeball from OOZ [17F0C] |
44 | Unknown (a vertical barrier) [F10C] |
45 | Weird spring that you push back on from OOZ [181A0] |
46 | Ball on weird spring from OOZ [18ABE] |
47 | Button [18D9C] |
48 | Spinball that shoots character out 90 degrees from entry from OOZ [19250] |
49 | Waterfall in EHZ [15352] |
4A | Octopus badnick from OOZ [1EBB8] |
4B | Buzz bomber [1E89C] |
4C | Bat [1EE68] |
4D | Rhinobot [1D984] |
4E | Alligator [1F2F0] |
4F | Dinobot [1DEAC] |
50 | Unknown badnick (rapidly changes direction in the air) [1E010] |
51 | Unknown badnick (Almost identical to above, but periodically shoots something to the left.) [1E62C] |
52 | Pirhana [1DC54] |
53 | Jumping fish from EHZ [1F5E8] |
54 | Land based driving badnick from EHZ [1F6E8] |
55 | Robotnic in his main ship [2030C] |
56 | Unknown (scrolls patterns then disappears. possibly new explosion effect) [205A6] |
57 | ??????? [1F99C] |
58 | EHZ boss [1FC0A] |
59 | ??????? [D24A] |
5A | ??????? [D24A] |
5B | ??????? [D24A] |
5C | ??????? [D24A] |
5D | ??????? [D24A] |
5E | ??????? [D24A] |
5F | ??????? [D24A] |
60 | ??????? [D24A] |
61 | ??????? [D24A] |
62 | ??????? [D24A] |
63 | ??????? [D24A] |
64 | Stompers from MTZ [1A8B4] |
65 | Unknown (a horizntal block) [1AA74] |
66 | Bouncers from MTZ [1AEBC] |
67 | Warp tube from MTZ [1B0C4] |
68 | Block in MTZ with a spike coming out each side sequentially [1B520] |
69 | Nut that character moves by running on in MTZ [1B810] |
6A | Unknown (a platform that moves when you jump off it) [1BA30] |
6B | Unknown (Same as above, but not moving) [1BCEC] |
6C | ??????? [1BF6C] |
6D | Floor spike in MTZ [1B720] |
6E | Platform moving in circle [1C2E4] |
6F | Diagnally moving platform from MTZ [1C4F8] |
70 | 8 points on giant cog from MTZ [1C850] |
71 | Pulsing ball in HPZ [9A54] |
72 | ??????? [1CBCC] |
73 | Unknown (sprite has the image of a fixed ring. Sprite acts as a barrier if collision occurs) [1CC54] |
74 | Unknown (a block with no image) [1561A] |
75 | ??????? [1CE48] |
76 | Moving spikey arm from MCZ [1D078] |
77 | Unknown (if character hits sprite it turns into a vertical barrier that then opens up, and immediately after makes emulator freeze.) [1D208] |
78 | Lowering stairs from CPZ [1D3C0] |
79 | Starpoll [13B54] |
7A | Small yellow moving platform from CPZ [1D594] |
7B | Spring on spin tube cap from CPZ [1D74C] |
7C | ??????? [D24A] |
7D | Unknown (if collision occurs, emulator freeses) [13DFC] |
7E | ??????? [D24A] |
7F | ??????? [D24A] |
80 | ??????? [D24A] |
81 | ??????? [D24A] |
82 | ??????? [D24A] |
83 | ??????? [D24A] |
84 | ??????? [D24A] |
85 | ??????? [D24A] |
86 | ??????? [D24A] |
87 | ??????? [D24A] |
88 | ??????? [D24A] |
89 | ??????? [D24A] |
8A | Unknown (some kind of single lined text on screen) [20740] |
8B | ??????? [D24A] |
8C | ??????? [D24A] |
References