AgentSkillsCN

S2disasm Guide

S2 disasm 指南

SKILL.md

s2disasm Navigation Guide

This skill provides guidance on finding, identifying, and interpreting items in the Sonic 2 disassembly (docs/s2disasm/).

Directory Structure

The disassembly is organized into these major directories:

DirectoryContentsNotes
art/Graphics dataCompressed sprite/tile art
art/kosinski/Kosinski-compressed level tilesZone pattern data
art/nemesis/Nemesis-compressed sprite artObjects, badniks, HUD
art/enigma/Enigma-compressed mappingsBlock mappings
art/palettes/Uncompressed palette files.bin files, 32 bytes each
collision/Collision dataHeight arrays, collision indices
level/Level layoutsForeground/background layouts
mappings/Tile arrangement data16x16 and 128x128 mappings
mappings/16x16/Block (chunk) mappings.bin files
mappings/128x128/Metatile (block) mappings.bin files
mappings/sprite/Sprite frame mappingsObject animation frames
sound/Audio dataSMPS music and SFX
startpos/Player start positionsPer-zone starting coordinates
misc/Miscellaneous dataDemo data, credits, etc.

Compression Types

ExtensionTypeTool FlagDescription
.nemNemesisnemSprite art, HUD graphics
.kosKosinskikosLevel tiles, large graphics
.eniEnigmaeniBlock/chunk mappings
.saxSaxmansaxSpecial stage data
.binUncompressedbinPalettes, collision data

Compression Selection Guidelines

  • Nemesis: Best for sprite art with many repeated patterns
  • Kosinski: Best for level tiles, larger data sets
  • Enigma: Optimized for tile mappings with incremental pattern IDs
  • Saxman: Used specifically for special stage track data

Finding Items with RomOffsetFinder

The RomOffsetFinder tool searches the disassembly and calculates ROM offsets:

Search Command (Most Common)

bash
# Search by partial name - finds labels and calculates ROM offset
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="search Ring" -q

# Search for zone-specific items
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="search EHZ" -q

# Search for palettes
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="search Pal_" -q

List Command

bash
# List all Nemesis-compressed items
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="list nem" -q

# List all palettes (uncompressed)
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="list bin" -q

# List all compression types
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="list" -q

Test Decompression

bash
# Test if data at offset is Nemesis-compressed
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="test 0xDD8CE nem" -q

# Auto-detect compression type
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="test 0x3000 auto" -q

Verify and Export

bash
# Verify a single offset
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="verify ArtNem_SpecialHUD" -q

# Batch verify all Nemesis items
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="verify-batch nem" -q

# Export as Java constants
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="export nem ART_" -q

Label Naming Conventions

Labels follow consistent prefixes that indicate data type and compression:

PrefixMeaningExample
ArtNem_Nemesis artArtNem_Buzzer
ArtKos_Kosinski artArtKos_EHZ
ArtUnc_Uncompressed artArtUnc_Ings
Pal_PalettePal_EHZ
MapEni_Enigma mappingsMapEni_EHZ
MapUnc_Uncompressed mappingsMapUnc_Sonic
Obj_Object codeObj_Monitor
loc_Code locationloc_1B4A2
off_Offset tableoff_Rings
word_Word dataword_1B4A0
byte_Byte databyte_1B4A1
PLC_Pattern Load CuePLC_EHZ

Zone Abbreviations

AbbrevFull NameZone ID
EHZEmerald Hill Zone0x00
CPZChemical Plant Zone0x0D
ARZAquatic Ruin Zone0x0F
CNZCasino Night Zone0x0C
HTZHill Top Zone0x07
MCZMystic Cave Zone0x0B
OOZOil Ocean Zone0x08
MTZMetropolis Zone0x04
SCZSky Chase Zone0x10
WFZWing Fortress Zone0x11
DEZDeath Egg Zone0x12
HPZHidden Palace Zone0x02 (unused)
GHZGreen Hill Zone0x16 (S1 leftover)

File Parsing Patterns

BINCLUDE Directive

Used to include binary data files:

asm
ArtNem_Buzzer:  BINCLUDE "art/nemesis/Buzzer.bin"

Format: LABEL: BINCLUDE "path/to/file.ext"

Palette Macro

Palettes use a special macro format:

asm
Pal_EHZ:    palette Emerald Hill Zone.bin

These are located in art/palettes/ as uncompressed .bin files (32 bytes each = 16 colors × 2 bytes).

Include Directives

Assembly includes for code:

asm
    include "s2.macrosetup.asm"

Object System Reference

Object Status Table Offsets

Common offsets used in object code (a0 = object pointer):

OffsetNameSizeDescription
0x00idlongObject ID
0x08x_poswordX position (center)
0x0Cy_poswordY position (center)
0x10x_velwordX velocity
0x12y_velwordY velocity
0x22mapping_framebyteCurrent frame
0x24routinebyteCurrent routine
0x28subtypebyteObject subtype

Object Routine Pattern

Objects typically follow this routine structure:

asm
Obj_Example:
    moveq   #0,d0
    move.b  routine(a0),d0
    move.w  Obj_Example_Index(pc,d0.w),d1
    jmp     Obj_Example_Index(pc,d1.w)

Obj_Example_Index:
    dc.w Obj_Example_Init - Obj_Example_Index   ; routine 0
    dc.w Obj_Example_Main - Obj_Example_Index   ; routine 2

Sprite Mappings Format

Sprite mappings define how patterns are arranged into frames:

code
Frame header:
  dc.w  <piece_count>

Per piece:
  dc.b  <y_offset>
  dc.b  <size>       ; bits 0-1: width, bits 2-3: height (in 8px units - 1)
  dc.w  <pattern>    ; pattern index + flags (priority, palette, flip)
  dc.w  <x_offset>

Size byte encoding:

  • 0x00 = 1×1 (8×8 pixels)
  • 0x05 = 2×2 (16×16 pixels)
  • 0x0F = 4×4 (32×32 pixels)

Resource Overlay System

Some zones share base resources with overlays. HTZ is the primary example:

ResourceBaseOverlayOffset
PatternsEHZ_HTZ.binHTZ_Supp.bin0x3F80
BlocksEHZ.binHTZ.bin0x0980
ChunksEHZ_HTZ.bin(shared)-
CollisionEHZ and HTZ*.bin(shared)-

The overlay is applied at the specified byte offset after decompressing the base data.

Common Search Patterns

Finding Badnik Art

bash
# Search for specific badnik
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="search Buzzer" -q

# Find all badnik mappings
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="search MapUnc_" -q

Finding Zone Data

bash
# All EHZ resources
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="search EHZ" -q

# Zone palette
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="search Pal_CPZ" -q

Finding Object Code

bash
# Monitor object
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="search Obj_Monitor" -q

# Spring object
mvn exec:java -Dexec.mainClass="uk.co.jamesj999.sonic.tools.disasm.RomOffsetFinder" -Dexec.args="search Obj_Spring" -q

Troubleshooting

"Item not found"

  • Check spelling and case sensitivity
  • Try partial names (e.g., "Buzz" instead of "Buzzer")
  • Use list command to see all items of a type

Offset Mismatch

  • ROM revision matters (tool expects REV01)
  • Use verify to check calculated vs actual offset
  • Some items have multiple definitions

Decompression Fails

  • Verify the offset is correct
  • Try auto detection to identify compression type
  • Check if data is actually compressed (some .bin files are raw)

RAM Address Reference

Key RAM addresses for understanding disassembly:

AddressNameDescription
0xFFB000Object_RAMObject status table (64 slots × 64 bytes)
0xFFFE10Camera_X_posCamera X position
0xFFFE14Camera_Y_posCamera Y position
0xFFFE20Level_LayoutPointer to level layout
0xFFFFD0Vint_routineV-int routine counter
0xFFFFF0Demo_mode_flagDemo mode indicator

Quick Reference Card

code
Search:  search <pattern>      Find items by name
List:    list [type]           List items (nem/kos/eni/sax/bin)
Test:    test <offset> <type>  Test decompression
Verify:  verify <label>        Check calculated offset
Export:  export <type> [prefix] Generate Java constants