Everything That I Know About Sonic the Hedgehog's Source Code

Discussion in 'Discussion & Q&A' started by Clownacy, Mar 30, 2022.

  1. Clownacy

    Clownacy Retired Staff lolololo Member

    Joined:
    Aug 15, 2014
    Messages:
    1,122
    (This is another cross-post from my blog, duplicated here because it's relevant, and for preservation in case the blog ever disappears).

    I've been meaning to write this for years:

    To my understanding, not much is commonly known about the source code of the original Sonic the Hedgehog games. As someone who's been obsessed with the programming of these games for almost ten years, I believe that I know a lot more than most people do. Unfortunately, my memory is awful, and I'm not going to be a Sonic hacker forever, so I want to preserve this information however I can before it's lost again.

    As of writing, the source code for the 'classic' Mega Drive Sonic the Hedgehog games has never been found. We do have an exhaustive list of disassemblies, however those do not capture all information that proper source code would give us. For example, while the logic of code is recovered by these disassemblies, the meaning of it might not be. Sometimes, the logic isn't all you need to understand code: it may do something that seems pointless or nonsensical, leaving nearby labels and comments to explain it fully. However, a disassembly cannot reproduce the original labels and comments: those are lost. Likewise, a disassembly cannot reproduce code that was never in the ROM to begin with, such as disabled (or "commented-out") prototype code. Because of this, a disassembly cannot truly replace source code.

    However, small snippets of source code have surfaced over the years. The most obvious example I can think of is a fully-intact copy of a single source file (likely "EDIT.ASM") in Sonic 2's "Nick Arcade" prototype.

    Sonic 2 "Nick Arcade" prototype's source file
    Inside one of Sonic 2's prototypes is a fully intact copy of the source file responsible for the game's "edit mode" (commonly known as "debug mode"):

    Code:
            addsym
            nolist
            include "equ.lib"
            include "macro.lib"
            list
    
            xref    colichgpat
            xref    ringpat,itempat,butapat,kanipat,hachipat,togepat
            xref    fishpat,fish2pat,mogurapat,shimapat2,jyamapat
            xref    musipat,sjumppat,kamerepat,arumapat,kagebpat,ballpat
            xref    firepat,fblockpat,signalpat,bobinpat,yoganpat,yogan2pat
            xref    usapat,yadopat,boxpat,bryukapat,daipat,break2pat,yogancpat
            xref    batpat,z5daipat,dai2pat,switch2pat,z4daipat
            xref    elevpat,pedalpat,steppat,funpat,sisoopat,hassyapat
            xref    brobopat,unipat,yaripat,udaipat,dai3pat,kazaripat,kassyapat
            xref    awapat,mizupat,boupat,benpat,fetamapat,mawarupat,hagurumapat
            xref    patapat,yukafpat,nokopat,dai4pat,doorpat,yukaepat,fire6pat
            xref    elepat,yukaipat,scolipat,imopat,savepat,bigringpat,btenpat
            xref    actionsub,actwkchk,frameout,playpat,dualmodesub
            xref    flicpat,usagipat,pengpat,azarpat,fbutapat,niwapat,risupat
    
            xref    kaitenpat,prodaipat,buranko0dpat
            xref    frntlitpat,gempat,wfallpat,pltfrmpat
            xref    takipat,banepat,dai00pat
    
            xref    redzpat,bfishpat,seahorsepat,horsepat
            xref    stegopat,wasppat,gatorpat,bbatpat,octpat,wfish2pat,snailpat
    
            xdef    edit
    
    ;------------------------------------------------------------------------------
    edit:
            moveq   #0,d0
            move.b  editmode,d0
            move.w  edit_move_tbl(pc,d0.w),d1
            jmp     edit_move_tbl(pc,d1.w)
    edit_move_tbl:
            dc.w    editinit-edit_move_tbl
            dc.w    editmove-edit_move_tbl
    editinit:
            addq.b  #word,editmode
            move.w  scralim_up,editstack
            move.w  scralim_n_down,editstack2
            move.w  #$0000,scralim_up
            move.w  #$0720,scralim_n_down
            andi.w  #$07ff,playerwk+yposi
            andi.w  #$07ff,scra_v_posit
            andi.w  #$03ff,scrb_v_posit
            move.b  #0,patno(a0)
            move.b  #0,mstno(a0)
            cmpi.b  #spgamemd,gmmode
            bne.b   .jump0
    *       move.b  #7-1,stageno
    *       move.w  #$000,rotspd
    *       move.w  #$000,rotdir
            moveq   #7-1,d0
            bra.b   .jump1
    .jump0:
            moveq   #0,d0
            move.b  stageno,d0
    .jump1:
            lea     edittbl,a2
            add.w   d0,d0
            adda.w  (a2,d0.w),a2
            move.w  (a2)+,d6
            cmp.b   editno,d6
            bhi.b   .jump
            move.b  #0,editno
    .jump:
            bsr.w   editpatchg
            move.b  #12,edittimer
            move.b  #1,edittimer+1
    editmove:
            moveq   #7-1,d0
            cmpi.b  #spgamemd,gmmode
            beq.b   .jump
            moveq   #0,d0
            move.b  stageno,d0
    .jump:
            lea     edittbl,a2
            add.w   d0,d0
            adda.w  (a2,d0.w),a2
            move.w  (a2)+,d6
            bsr.w   editwalk
    *       bsr.w   dirsprset
            jmp     actionsub
    editwalk:
            moveq   #0,d4
            move.w  #1,d1
            move.b  swdata1+1,d4
            andi.w  #$0f,d4
            bne.b   .jump0
            move.b  swdata1,d0
            andi.w  #$0f,d0
            bne.b   .jump
            move.b  #12,edittimer
            move.b  #$0f,edittimer+1
            bra.w   .lend
    .jump:
            subq.b  #1,edittimer
            bne.b   .jump1
            move.b  #1,edittimer
            addq.b  #1,edittimer+1
    *       cmpi.b  #255,edittimer+1
            bne.b   .jump0
            move.b  #255,edittimer+1
    .jump0:
            move.b  swdata1,d4
    .jump1:
            moveq   #0,d1
            move.b  edittimer+1,d1
            addq.w  #1,d1
            swap    d1
            asr.l   #4,d1
            move.l  yposi(a0),d2
            move.l  xposi(a0),d3
            btst.l  #0,d4                   *swdata+0
            beq.b   .jump2
            sub.l   d1,d2                   *yposi
            bcc.b   .jump2
            moveq   #0,d2
    .jump2:
            btst.l  #1,d4                   *swdata+0
            beq.b   .jump3
            add.l   d1,d2                   *yposi
            cmpi.l  #$7ff0000,d2
            bcs.b   .jump3
            move.l  #$7ff0000,d2
    .jump3:
            btst.l  #2,d4                   *swdata+0
            beq.b   .jump4
            sub.l   d1,d3                   *xposi
            bcc.b   .jump4
            moveq   #0,d3
    .jump4:
            btst.l  #3,d4                   *swdata+0
            beq.b   .jump5
            add.l   d1,d3                   *xposi
    .jump5:
            move.l  d2,yposi(a0)
            move.l  d3,xposi(a0)
    .lend:
            btst.b  #6,swdata1+0
            beq.b   .jump7
            btst.b  #5,swdata1+1            * c button check
            beq.b   .jump77
            subq.b  #1,editno
            bcc.b   .jump6
            add.b   d6,editno
            bra.b   .jump6
    .jump77:
            btst.b  #6,swdata1+1
            beq.b   .jump7
            addq.b  #1,editno
            cmp.b   editno,d6
            bhi.b   .jump6
            move.b  #0,editno
    .jump6:
            bra.w   editpatchg
    .jump7:
            btst.b  #5,swdata1+1            * c button check
            beq.b   .jump8
            jsr     actwkchk
            bne.b   .worknai                ;z=0:ok z=1:no
            move.w  xposi(a0),xposi(a1)
            move.w  yposi(a0),yposi(a1)
            move.b  patbase(a0),actno(a1)
            move.b  actflg(a0),actflg(a1)
            move.b  actflg(a0),cddat(a1)
            andi.b  #$7f,cddat(a1)
            moveq   #0,d0
            move.b  editno,d0
            lsl.w   #3,d0
            move.b  4(a2,d0.w),userflag(a1)
            rts
    .worknai:
    .jump8:
            btst.b  #4,swdata1+1            * b button check
            beq.b   .jump9
            moveq   #0,d0
            move.w  d0,editmode
            move.l  #playpat,playerwk+patbase
            move.w  #$0780,playerwk+sproffset
            tst.w   dualmode                ; dual mode check
            beq.b   .end
            move.w  #$0780/2,playerwk+sproffset
    .end:
            move.b  d0,playerwk+mstno
            move.w  d0,xposi+2(a0)
            move.w  d0,yposi+2(a0)
            move.w  editstack,scralim_up
            move.w  editstack2,scralim_n_down
            cmpi.b  #spgamemd,gmmode
            bne.b   .jump9
    *       clr.w   rotdir
    *       move.w  #$040,rotspd
    *       move.l  #playpat,playerwk+patbase
    *       move.w  #$0780,playerwk+sproffset
            move.b  #02,playerwk+mstno
            bset.b  #cd_ball,playerwk+cddat
            bset.b  #cd_jump,playerwk+cddat
    .jump9:
            rts
    editpatchg:
            moveq   #0,d0
            move.b  editno,d0
            lsl.w   #3,d0
            move.l  0(a2,d0.w),patbase(a0)
            move.w  6(a2,d0.w),sproffset(a0)
            move.b  5(a2,d0.w),patno(a0)
    *       move.b  4(a2,d0.w),userflag(a0)
            bsr.w   dualmodesub
            rts
    
    dcblw   macro   \1,\2,\3,\4,\5
            dc.l    (\1)*$1000000+(\2)
            dc.w    (\4)+(\5)*$100
            dc.w    (\3)
            endm
    
    edittbl:
            dc.w    edit1tbl-edittbl
            dc.w    edit2tbl-edittbl
            dc.w    edit3tbl-edittbl
            dc.w    edit4tbl-edittbl
            dc.w    edit5tbl-edittbl
            dc.w    edit6tbl-edittbl
            dc.w    edit7tbl-edittbl
    edit1tbl:
            dc.w    14
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
            dcblw   kani_act,kanipat,$0400,0,$00            ;3:
            dcblw   hachi_act,hachipat,$0444,0,$00          ;4:
            dcblw   fish_act,fishpat,$0470,0,$00            ;5:
            dcblw   toge_act,togepat,$04a0,0,$00            ;6:
            dcblw   shima_act,shimapat2,$4000,0,$00         ;7:
            dcblw   jyama_act,jyamapat,$66c0,0,$00          ;8:
            dcblw   musi_act,musipat,$04e0,0,$00            ;9:
            dcblw   sjump_act,sjumppat,$04a8,0,$00          ;10:
            dcblw   kamere_act,kamerepat,$249b,0,$00        ;11:
            dcblw   kageb_act,kagebpat,$434c,0,$00          ;12:
            dcblw   save_act,savepat,$26bc,0,$01            ;13:
            dcblw   colichg_act,colichgpat,$26bc,0,$00      ;14:
    
    edit2tbl:
    edit3tbl:
    ;zone0d
            dc.w    07
            dcblw   ring_act,ringpat,$26bc,0,$00            ;01:
            dcblw   item_act,itempat,$0680,0,$00            ;02:
            dcblw   sjump_act,sjumppat,$04a8,0,$00          ;03:
            dcblw   colichg_act,colichgpat,$07bc,0,$00      ;04:
            dcblw   kaiten_act,kaitenpat,$e000,0,$00        ;05:
            dcblw   prodai_act,prodaipat,$e418,0,$00        ;06:
            dcblw   buranko_act,buranko0dpat,$2418,0,$08    ;07:
    
    edit4tbl:
    ;zone00
            dc.w    18
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
            dcblw   save_act,savepat,$047c,0,$01            ;3:
    
            dcblw   colichg_act,colichgpat,$26bc,0,$00      ;6:
            dcblw   taki_act,takipat,$23ae,0,$00            ;7:
            dcblw   taki_act,takipat,$23ae,3,$02            ;7:
            dcblw   shima_act,dai00pat,$4000,0,$01          ;8:
            dcblw   shima_act,dai00pat,$4000,1,$0a          ;8:
            dcblw   toge_act,togepat,$2434,0,$00            ;10:
            dcblw   sisoo_act,sisoopat,$03ce,0,$00          ;9:
    
            dcblw   sjump_act,banepat,$045c,0,$80           ;3: banev
            dcblw   sjump_act,banepat,$0470,3,$90           ;3: baneh
            dcblw   sjump_act,banepat,$045c,6,$a0           ;3: banevr
            dcblw   sjump_act,banepat,$043c,7,$30           ;3: bane45
            dcblw   sjump_act,banepat,$043c,10,$40          ;3: bane45r
    
            dcblw   wasp_act,wasppat,$03e6,0,$00            ;25   ""    ""
            dcblw   snail_act,snailpat,$0402,0,$00          ;25   ""    ""
            dcblw   wfish2_act,wfish2pat,$041c,0,$00        ;21   ""    ""
    
    
    
            dcblw   redz_act,redzpat,$0500,0,$00            ;20: will change
            dcblw   bfish_act,bfishpat,$2530,0,$00          ;21   ""    ""
            dcblw   seahorse_act,horsepat,$2570,0,$00       ;22   ""    ""
            dcblw   skyhorse_act,horsepat,$2570,0,$00       ;23   ""    ""
            dcblw   stego_act,stegopat,$23c4,0,$00          ;24   ""    ""
            dcblw   wasp_act,wasppat,$032c,0,$00            ;25   ""    ""
            dcblw   gator_act,gatorpat,$2300,0,$00          ;26   ""    ""
            dcblw   bbat_act,bbatpat,$2350,0,$00            ;27   ""    ""
            dcblw   oct_act,octpat,$238a,0,$00              ;28   ""    ""
    
    edit5tbl:
    edit6tbl:
    edit7tbl:
    ;zone08
            dc.w    15
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
    
            dcblw   bgspr_act,frntlitpat,$e485,3,$21        ;3:
            dcblw   wfall_act,wfallpat,$e415,4,$04          ;4:
            dcblw   break_act,pltfrmpat,$4475,0,$00         ;5:
            dcblw   colichg_act,colichgpat,$26bc,0,$00      ;6:
    
            dcblw   redz_act,redzpat,$0500,0,$00            ;20: will change
            dcblw   bfish_act,bfishpat,$2530,0,$00          ;21   ""    ""
            dcblw   seahorse_act,horsepat,$2570,0,$00       ;22   ""    ""
            dcblw   skyhorse_act,horsepat,$2570,0,$00       ;23   ""    ""
            dcblw   stego_act,stegopat,$23c4,0,$00          ;24   ""    ""
            dcblw   wasp_act,wasppat,$032c,0,$00            ;25   ""    ""
            dcblw   gator_act,gatorpat,$2300,0,$00          ;26   ""    ""
            dcblw   bbat_act,bbatpat,$2350,0,$00            ;27   ""    ""
            dcblw   oct_act,octpat,$238a,0,$00              ;28   ""    ""
    
    ;------------------------------------------------------------------------------
            align
    ;------------------------------------------------------------------------------
            end
    
    
    edit2tbl:
            dc.w    25
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
            dcblw   sjump_act,sjumppat,$0523,0,$00          ;3:
            dcblw   fish2_act,fish2pat,$2486,0,$08          ;4:
            dcblw   mogura_act,mogurapat,$84a6,2,$00        ;5:
            dcblw   yari_act,yaripat,$03cc,0,$00            ;6:
            dcblw   yari_act,yaripat,$03cc,3,$02            ;7:
            dcblw   box_act,boxpat,$43de,0,$00              ;8:
            dcblw   switch2_act,switch2pat,$0513,0,$00      ;9:
            dcblw   toge_act,togepat,$051b,0,$00            ;10:
            dcblw   dai_act,udaipat,$43bc,0,$04             ;11:
            dcblw   dai3_act,dai3pat,$43e6,0,$01            ;12:
            dcblw   dai3_act,dai3pat,$43e6,1,$13            ;13:
            dcblw   dai3_act,dai3pat,$43e6,0,$05            ;14:
            dcblw   kazari_act,kazaripat,$443e,0,$00        ;15:
            dcblw   dai3_act,dai3pat,$43e6,2,$27            ;16:
            dcblw   dai3_act,dai3pat,$43e6,3,$30            ;17:
            dcblw   kassya_act,kassyapat,$03f6,0,$7f        ;18:
            dcblw   uni_act,unipat,$0467,0,$00              ;19:
            dcblw   awa_act,awapat,$8348,19,$84             ;20:
            dcblw   mizu_act,mizupat,$c259,2,$02            ;21:
            dcblw   mizu_act,mizupat,$c259,9,$09            ;22:
            dcblw   bou_act,boupat,$43de,0,$00              ;23:
            dcblw   ben_act,benpat,$4328,0,$02              ;24:
            dcblw   save_act,savepat,$26bc,0,$01            ;25:
    
    *       dcblw   dai4_act,dai4pat,$41f0,4,$80            ;25:
    edit3tbl:
            dc.w    18
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
            dcblw   hachi_act,hachipat,$0444,0,$00          ;3:
            dcblw   toge_act,togepat,$051b,0,$00            ;4:
            dcblw   sjump_act,sjumppat,$0523,0,$00          ;5:
            dcblw   mfire_act,firepat,$0345,0,$00           ;6:
            dcblw   fblock_act,fblockpat,$4000,0,$00        ;7:
            dcblw   myogan_act,yoganpat,$63a8,0,$00         ;8:
            dcblw   yogan2_act,yogan2pat,$63a8,0,$00        ;9:
            dcblw   box_act,boxpat,$42b8,0,$00              ;10:
            dcblw   yado_act,yadopat,$247b,0,$00            ;11:
            dcblw   bryuka_act,bryukapat,$42b8,0,$00        ;12:
            dcblw   dai_act,daipat,$02b8,0,$00              ;13:
            dcblw   break2_act,break2pat,$62b8,0,$00        ;14:
            dcblw   yoganc_act,yogancpat,$8680,0,$00        ;15:
            dcblw   bat_act,batpat,$04b8,0,$00              ;16:
            dcblw   imo_act,imopat,$24ff,0,$00              ;17:
            dcblw   save_act,savepat,$26bc,0,$01            ;18:
    edit4tbl:
            dc.w    15
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
            dcblw   elev_act,elevpat,$4000,0,$00            ;3:
            dcblw   break2_act,break2pat,$44e0,2,$00        ;4:
            dcblw   shima_act,z4daipat,$4000,0,$00          ;5:
            dcblw   pedal_act,pedalpat,$4000,0,$00          ;6:
            dcblw   step_act,steppat,$4000,0,$00            ;7:
            dcblw   fun_act,funpat,$43a0,0,$00              ;8:
            dcblw   sisoo_act,sisoopat,$0374,0,$00          ;9:
            dcblw   sjump_act,sjumppat,$0523,0,$00          ;10:
            dcblw   mfire_act,firepat,$0480,0,$00           ;11:
            dcblw   bgspr_act,hassyapat,$44d8,0,$00         ;12:
            dcblw   brobo_act,brobopat,$0400,0,$00          ;13:
            dcblw   uni_act,unipat,$2429,0,$00              ;14:
            dcblw   save_act,savepat,$26bc,0,$01            ;15:
    edit5tbl:
            dc.w    15
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
            dcblw   toge_act,togepat,$051b,0,$00            ;3:
            dcblw   sjump_act,sjumppat,$0523,0,$00          ;4:
            dcblw   aruma_act,arumapat,$04b8,0,$00          ;5:
            dcblw   signal_act,signalpat,$0000,0,$00        ;6:
            dcblw   bobin_act,bobinpat,$0380,0,$00          ;7:
            dcblw   kani_act,kanipat,$0400,0,$00            ;8:
            dcblw   hachi_act,hachipat,$0444,0,$00          ;9:
            dcblw   yado_act,yadopat,$247b,0,$00            ;10:
            dcblw   shima_act,z5daipat,$4000,0,$00          ;11:
            dcblw   dai2_act,dai2pat,$4000,0,$00            ;12:
            dcblw   switch2_act,switch2pat,$0513,0,$00      ;13:
            dcblw   imo_act,imopat,$24ff,0,$00              ;14:
            dcblw   save_act,savepat,$26bc,0,$01            ;15:
    edit6tbl:
            dc.w    29
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
            dcblw   brobo_act,brobopat,$0400,0,$00          ;3:
            dcblw   uni_act,unipat,$0429,0,$00              ;4:
            dcblw   imo_act,imopat,$22b0,0,$00              ;5:
            dcblw   buranko_act,fetamapat,$4391,2,$07       ;6:
            dcblw   haguruma_act,hagurumapat,$c344,00,$e0   ;7:
            dcblw   dai_act,daipat,$22c0,2,$28              ;8:
            dcblw   switch2_act,switch2pat,$0513,0,$00      ;9:
            dcblw   pata_act,patapat,$4492,0,$03            ;10:
            dcblw   pata_act,yukafpat,$04df,0,$83           ;11:
            dcblw   noko_act,nokopat,$43b5,0,$02            ;12:
            dcblw   break2_act,break2pat,$43f5,0,$00        ;13:
            dcblw   dai_act,daipat,$4460,3,$39              ;14:
            dcblw   dai4_act,dai4pat,$22c0,0,$00            ;15:
            dcblw   door_act,doorpat,$42e8,0,$00            ;16:
            dcblw   dai4_act,dai4pat,$22c0,1,$13            ;17:
            dcblw   noko_act,nokopat,$43b5,0,$01            ;18:
            dcblw   dai4_act,dai4pat,$22c0,1,$24            ;19:
            dcblw   noko_act,nokopat,$43b5,2,$04            ;20:
            dcblw   dai4_act,dai4pat,$22c0,1,$34            ;21:
            dcblw   yukae_act,yukaepat,$44c3,0,$00          ;22:
            dcblw   fire6_act,fire6pat,$83d9,0,$64          ;23:
            dcblw   fire6_act,fire6pat,$83d9,11,$64         ;24:
            dcblw   ele_act,elepat,$047e,0,$04              ;25:
            dcblw   yukai_act,yukaipat,$42f0,0,$00          ;26:
            dcblw   scoli_act,scolipat,$8680,0,$11          ;27:
            dcblw   buta_act,butapat,$2302,0,$04            ;28:
            dcblw   save_act,savepat,$26bc,0,$01            ;29:
    
    *       dcblw   ring_act,playpat,$0780,50,$00           ;28:
    *       dcblw   usa_act,usapat,$0448,0,$00              ;5:
    *       dcblw   mawaru_act,mawarupat,$4348,16,$00       ;7:
    
    edit7tbl:
            dc.w    02      *13
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   ring_act,ringpat,$26bc,8,$00            ;2:
    *       dcblw   bobin_act,bobinpat,$0380,0,$00          ;2:
    *       dcblw   usagi_act,flicpat,$05a0,0,$0a           ;3
    *       dcblw   usagi_act,flicpat,$05a0,0,$0b           ;4
    *       dcblw   usagi_act,flicpat,$05a0,0,$0c           ;5
    *       dcblw   usagi_act,usagipat,$0553,0,$0d          ;6
    *       dcblw   usagi_act,usagipat,$0553,0,$0e          ;7
    *       dcblw   usagi_act,pengpat,$0573,0,$0f           ;8
    *       dcblw   usagi_act,pengpat,$0573,0,$10           ;9
    *       dcblw   usagi_act,azarpat,$0585,0,$11           ;10
    *       dcblw   usagi_act,fbutapat,$0593,0,$12          ;11
    *       dcblw   usagi_act,niwapat,$0565,0,$13           ;12
    *       dcblw   usagi_act,risupat,$05b3,0,$14           ;13
    This source code contains everything: code, comments, labels, and even disabled prototype code that we never knew even existed before. Notably, these labels give the internal names of enemies and objects used throughout the game, while the comments elaborate on the intended level order. The source code snippet even gives some insight into the exact assembler used to build the source code into a ROM.

    That's not the only useful data in this prototype however...

    Sonic 2 "Nick Arcade" prototype's symbol list
    Starting at ROM address 0x418A8 is what appears to be a partial copy of the assembler's symbol table. Oddly, it doesn't appear to match the ROM, as labels that appear in the above source code are recorded in this symbol table at different addresses to where they are in the actual ROM. It can be assumed, based on this, that this symbol table is leftover from a previous execution of the assembler, rather than the one that produced the ROM that we have.

    From roughly 0x418A8 to 0x47B14, the symbol table follows this format:
    • The first four bytes denote the length of the symbol identifier divided by four, and rounded up. That is to say, it denotes the number of longwords needed to hold the identifier. Notably, this length is stored in big-endian format.
    • The following longwords contain the label. Unused bytes are set to 00.
    • The following four bytes contain the value that is assigned to that symbol. This value is also in big-endian.

    Here's an example:

    00 00 00 02 65 64 69 74 69 6E 69 74 00 01 AB 12

    The first four bytes are 00000002, indicating an identifier that is 2 longwords (or 8 bytes) long.

    The next eight bytes are 65646974696E6974. When interpreted as ASCII, it is "editinit", which is one of the labels seen in the above source code.

    The following four bytes are 0001AB12, which is the ROM address that was assigned to this label when the assembler that produced this symbol table was ran. In the ROM we have, however, "editinit" is located at 0001BABE.

    Past 0x47B14, the format of the symbol table changes. Unfortunately, the entries don't seem to specify what each symbol's value is, instead containing what appears to be three pointers. This format continues to 0x50000, when actual game data resumes.

    The symbol table begins again at 0x50A9C, but in another format that seems to just contain identifiers and pointers.

    [EDIT: I'm a dummy: apparently you *can* extract meaningful data from the later parts of the symbol table, as someone else was able to and produce this massive list.]

    While the later symbols don't contain any useful information, they are still useful for determining the original names of various bits of code. For example, the label 'random' is certainly what we've been calling 'RandomNumber' in the Sonic 2 disassembly. Additionally, 'bgmset' and 'soundset' are more than likely 'PlayMusic' and 'PlaySound'. What's notable about that last one is that it answers the question of whether 'PlayMusic' really was intended to play music, since sometimes it's used to play sounds instead, which caused people to question whether it actually was a dedicated music-playing function, or simply a generic 'play something' function.

    One might be wondering why there's an intact source file and a partial symbol table in the middle of a ROM. Well, the space that this data occupies is what would normally be padding: towards the end of the ROM, the game's data is spaced-out for some reason, leaving big gaps. My theory is that whatever tool the devs were using to produce the final ROM simply malloc'd a huge buffer, and pasted data where it was needed, never initialising the unused space. This resulted in the unused space containing garbage data, leftover in memory from other programs.

    This isn't the only time that symbol data appears in a Sonic game:

    Sonic & Knuckles Collection's symbol list
    Unfortunately, I can't comment too much on this due to not having a copy of Sonic & Knuckles Collection on hand. However, this game contains another instance of symbol data, inside its main EXE.

    For the most complete set of symbols, however, one need not look further than...

    Sonic CD's unstripped ELF files
    Sonic Gems is a compilation of various emulated classic Sonic titles. Its version of Sonic CD, however, is not emulated: rather, it is a port of Sonic CD's PC port.

    One might be wondering how a game written in Motorola 68000 assembly could have ever been ported to anything with a different CPU architecture. The answer to that is that its code was machine-converted from assembly to C. Notably, this process preserved the original labels, and possibly even the original comments.

    Within the files of Sonic Gems, you can find a series of ELF files, which parallel the DLL files of Sonic CD's original PC port. What's special about these ELF files is that they are unstripped, containing huge amounts of symbol data.

    When loaded into something like IDA or Ghidra, this symbol data is taken advantage of while disassembling or decompiling the code. This reverse-engineered code will have its original labels intact, giving a great look into the original source code. Unfortunately, the code you'll be looking at is the disassembled/decompiled output of PowerPC/MIPS assembly which was generated from C which was converted from 68k assembly. That is to say, it's hideous and practically unreadable. Still, if you're able to draw parallels between this code and the original 68k assembly, you effectively have a pre-labelled disassembly.

    These ELF files also contain some debug data, such as the paths of various source files. I was able to extract a bunch of them back in 2018:

    C:\project\GEMS\application\SonicCD\src\ps2\main\DLLMAIN.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\ACTION.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\ACTSET.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\DAI_K.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\DAI_RD1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\DIRCOL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\DUMMY.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\EDIT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\EMIE1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\EMIE1CG.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\ENEMY.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\EQU.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\ET1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\ETC.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\FCOL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\GAME.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\GOAL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\IO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\ITEM.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\PLAYER.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\PLAYPAT1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\PLAYSP.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\PLAYSUB.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\PLCHG.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\RIDECHK.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\RING.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SCORE.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SCRCHK.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPRING.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SUICIDE.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TAKI.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TBL0.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TBL1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TREE.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\ZONE.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\ZONETBL1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\ACT11A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\COL1A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV11A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL11A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KOWASI1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR11A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZURE.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR11A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SHOOT1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SIKAKE.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z11ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\BLOCK.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\LOADER2.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\BMP.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\COLI1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z11ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SAVE.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\FRIEND1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\MOVIE1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\ACT11B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\COL1B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV11B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL11B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR11B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR11B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z11BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV11C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR11C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z11CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL11C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR11C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\COL1C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV11D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL11D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR11D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z11DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\COL1D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR11D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\ACT12A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV12A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL12A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR12A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\BRANKO1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR12A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z12ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z12ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV12B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL12B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR12B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR12B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z12BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV12C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL12C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR12C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR12C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z12CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV12D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL12D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR12D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR12D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z12DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\ACT13C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV13C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL13C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR13C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z13ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z13CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\BOSS_1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV13D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR13D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z13DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\BANPA.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\BOBIN.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\BOBINB.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\COLI3.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL31A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ET3.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\FRIEND3.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\GA3.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\PLAYSP3.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\POCKET.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\TOGEBL3A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\TRAP_R3.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z31ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\MIRACLE.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\COL3A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR31A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z31ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV31A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ACT31A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\MECASNC.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\MSNCCG.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\TENTOU.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\KAMA.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\PLPAT6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\MOVIE3.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ZONETBL3.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ACT31B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\COL3B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV31B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL31B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z31BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR31B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\TOGEBL3B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\COL3C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV31C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL31C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z31CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR31C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\TOGEBL3D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\COL3D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV31D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL31D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z31DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR31D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV32A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL32A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z32ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z32ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR32A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ACT32A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV32B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL32B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z32BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR32B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV32C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL32C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z32CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR32C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV32D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL32D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z32DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR32D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ACT33C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV33C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL33C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z33CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z33ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SIKAKE33.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\LIGHT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\STOPPER.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\BOSS_3.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\GATE.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ROLLPLAT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR33C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV33D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z33DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR33D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT41A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\COL4A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\COLI4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV41A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL41A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ET4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR41A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCRCHK4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SW4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SWBLK4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z41ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z41ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ZONETBL4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\GAME4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\PLAYSUB4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\AWA.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\HARID4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TOBIRA4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\HARIR4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WALLS.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL41A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\FUNSUI4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WALL1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCREW_A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ESCAL4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\BRUNKO4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TONBO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\AMENBO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TAGAMEB4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\YAGO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\FRIEND4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TEKKYU.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\PLAYPAT4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\KUZURE4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\LRBLK4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\COL4B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR41B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT41B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL41B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV41B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\MOVIE4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\RBLK4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z41BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\UDBLK4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL41B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT41C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\COL4C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV41C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL41C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCREW_C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TEKKYU4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL41C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\RENKETU4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR41C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z41CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SWGUN4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\COL4D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR41D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV41D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z41DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR42A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV42A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL42A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z42ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL42A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TOBIRAS4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\OSUMIZU.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WALL4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT42A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\UKIDAI.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z42ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TEKKYU1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WALL42.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT42B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL42B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL42B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV42B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z42BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT42C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV42C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL42C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL42C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z42CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\BANEIWA.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DAID4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR42C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\KOWASI4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV42D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z42DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT43C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV43C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL43C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR43C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z43ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\BOSS_4.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\BOSS_4_2.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z43CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL43.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV43D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR43D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z43DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\ACT51A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\COL5A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\COLI5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV51A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\EDTBL5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\GAME5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\PLAYSP5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR51A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z51ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z51ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\ZONETBL5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\BELTSW5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\MOVIE5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\FRIEND5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\KEMUSI.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SHOOT5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\KUMO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\IWA5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\IWA5WAVE.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DENDEN.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\HASHI5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\HARI5F.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\HARIR5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\IWA5ROLL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\KOWASI5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\KUZURE5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SASORI.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\HASIRA5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\ET5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\BURANKO5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DAI_RD5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\COL5B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV51B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR51B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z51BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\COL5C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV51C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR51C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z51CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\COL5D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV51D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR51D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z51DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV52A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR52A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z52ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z52ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV52B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR52B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z52BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV52C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR52C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z52CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV52D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR52D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z52DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\ACT53.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV53C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR53C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z53ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z53CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\BOSS_5.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\EDTBL53.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV53D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR53D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z53DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\ACT61A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\COLI6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL61A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SW6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\TOBIRA6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\TRAP_R6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\KDAI6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\BEEM6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\BLOCK6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\COL6A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DAIR6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EGG6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\ET6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\FRIEND6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\HACHI6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\MINOMUSI.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\MOVIE6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\PISTON6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR61A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SEMI.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SHOOT6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\TOBIDAI6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\UDBLK6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z61ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z61ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV61A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\BATTA.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SEESAW6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\PLAYER6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\PLCHG6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\ZONETBL6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\COL6B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR61B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV61B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL61B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z61BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\COL6C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV61C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR61C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z61CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL61C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\COL6D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV61D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR61D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z61DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL62A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z62ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z62ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\TOGEBL6A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV62A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR62A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\ACT62A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV62B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL62B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR62B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z62BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\TOGEBL6B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV62C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL62C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z62CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\TOGEBL6D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR62C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV62D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL62D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR62D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z62DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\ACT63.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV63C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL63C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR63C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z63CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z63ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\BOSS_6.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV63D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR63D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z63DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\ACT71A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\CHGBAN.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\CHGWALL7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\COL7A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\COLI7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV71A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\EDTBL7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\PLAYSP7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR71A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z71ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z71ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\ZONETBL7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\WALL7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\TEKKYU7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\TEKKYU7J.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SLIGHT7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\FRIEND7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\BRANKO7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\ET7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\KANABUN.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DANGO7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\MOVIE7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\KABASIRA.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\HOTARU7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\COL7B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR71B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV71B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z71BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\COL7C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z71CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR71C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV71C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\COL7D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV71D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR71D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z71DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR72A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z72ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV72A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z72ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV72B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR72B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z72BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV72C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR72C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z72CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV72D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR72D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z72DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR73C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\ACT73.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\EDTBL73.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z73ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\GAITOU73.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\WALL73.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\EMIE7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z73CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV73C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\HARI73.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\EMIE7CG.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\BOSS_7.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR73D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV73D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z73DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\PLPAT8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\ACT81A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\COL8A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\COLI8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV81A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\EDTBL81.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR81A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z81ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z81ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\ZONETBL8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\TRAP_R81.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\KABUTO8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\KOMA8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SW8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\OKUSIESO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\TOBIRA.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\KONBEA.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCARAB.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\KUZURE8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\NOKOGIRI.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\PROPERA8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DAI8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\HACHI8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\ET8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\FRIEND8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\PISTON.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\HAGURUMA.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCRCHK8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\COL8B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR81B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z81BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV81B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\COL8C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR81C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z81CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV81C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\COL8D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR81D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z81DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV81D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\PLAYSP8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\ACT82A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\EDTBL82.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\TRAP_R82.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z82ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z82ATBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\BEAM.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SHUT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV82A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SHOOT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DANGO8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\LEGMECA8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\BIGBOM8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR82A.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\JETTOGE8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\PIPE8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV82B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR82B.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z82BTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV82C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR82C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z82CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV82D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR82D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z82DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\EDTBL83.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR83C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z83ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z83CTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\BOSS_8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV83C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\ACT83.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\EMIE8.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\KONBEA83.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\TRAP_R83.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\HOTA8C.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV83D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR83D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z83DTBL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\R8\HOTA8D.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\ACT_S.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\BACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\BMP.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\COLI_S.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\COMMON.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\DATA_S1.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\ENS.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\ETC_M.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\ETC_S.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\FADEIN.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\GAME.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\KAITEN.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\PLS.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\SPM_EQU.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\SPS_EQU.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\SIN.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\AVIGOOD\AVIGODDO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\AVIGOOD\AVIGODEN.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\AVIOPEN\AVIOPNDO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\AVIOPEN\AVIOPNEN.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESENTRY.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESTBMP.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESTDO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESTGRID.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESTITEM.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESTPALT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESTSPRT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\COMMON\HMX_OEEACTL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\OPENING\OPNBMP.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\OPENING\OPNDO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\OPENING\OPNENTRY.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\OPENING\OPNGRID.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\OPENING\OPNPALT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\ACTM.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\ASCIISET.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\ASCMAP.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\CHAMOV.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\DATA_M.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\ETC.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\FLASH.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\KAITEN.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\LPLMAIN.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\PALET.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\PLM.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\PLS.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\SPM_EQU.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\SPS_EQU.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDBMP.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDDO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDEDIT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDENTRY.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDFILE.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDGRID.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDMENU.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDPALT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDSPRT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SOUNDTST\SNDENTRY.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SOUNDTST\SNDBMP.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SOUNDTST\SNDDO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SOUNDTST\SNDGRID.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SOUNDTST\SNDPALT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SOUNDTST\SNDSPRT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGENTRY.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGBMP.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGDO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGGRID.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGITEM.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGPALT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGSPRT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\TA\TA.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\TA\FADEIN.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\TA\TACOLOR.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\TA\TAEACTRL.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\ACT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\BM_M.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\CHRSET.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\DATA_SP.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\ETC_M.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\FADE.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\GAME.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\IO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\SPM.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\SPRMOVE.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\VISUALMD\VMDBMP.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\VISUALMD\VMDDO.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\VISUALMD\VMDENTRY.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\VISUALMD\VMDGRID.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\VISUALMD\VMDPALT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\VISUALMD\VMDSPRT.C
    C:\project\GEMS\application\SonicCD\src\ps2\main\WARP\WARP.C

    This file list gives you a look at the layout of Sonic CD's source code. Notably, you can see 'EDIT.C', which is very likely the file that originally contained the code seen in Sonic 2's "Nick Arcade" prototype.

    Sonic Gems isn't the only game to contain unstripped executables like this. For instance, The Legend of Zelda Collector's Edition contains an unstripped executable for its Nintendo 64 emulator (or "simulator", as it calls itself. Yeah, sure, Nintendo).

    Yuji Naka's video
    A few years back, Yuji Naka found some old footage of him working on Sonic 1 back in February 1990. In this video, he scrolls through a portion of the game's source code, giving us yet another sighting of authentic source code:



    Sonic hackers looked into this footage, and were able to produce a transcription of the source code, 'FCOL3.ASM':

    Code:
    *cd_walk            equ 0*2
    *cd_jump            equ 1*2
    *cd_up              equ 2*2
    *cd_down            equ 3*2
    
    updotmax        equ -4
    downdotmax      equ 4
    jumpdotmax      equ 8
    
    ;sprvo          equ $1c
    ;sprho          equ $1d
    ;sprvs          equ $1e
    ;sprhs          equ $1f
    ;------------------------------------------------------------------------
    ;   foot colition
    ;
    ;col:
        move.w  yposi(a0),d4
        move.b  sprvo(a0),d1
        add.b   sprvs(a0),d1
        ext.w   d1
        add.w   d1,d4
        move.w  xposi(a0),d5
        move.b  sprho(a0),d1
        ext.w   d1
        add.w   d1,d5
        move.w  xspeed(a0),scrhithz
    ?loop:
        move.w  d4,d2
        move.w  d5,d3
        moveq   #0,d0
        move.b  sprhs(a0),d0
        tst.w   xspeed(a0)
        bpl.b   ?jump
    *   btst.b  #cd_right,cddot(a0)
    *   beq.b   ?jump
        neg.w   d0
    ?jump:
        add.w   d0,d3
        bsr.w   scdchk
        tst.w   d1
        beq.b   ?end
        bpl.b   ?down
    ?up:
        cmp.w   #updotmax,d1
        blt.b   ?nomove
        add.w   d1,yposi(a0)
    ?end:
        rts
    ?nomove:
        bsr.b   hoseihsub
        bra.b   ?loop
        move.w  #0,xspeed(a0)
        rts
    ?down:
        move.w  d1,d6
        swap    d6
    ?down2:
        move.w  d4,d2
        move.w  d6,d3
        moveq   #0,d0
        move.b  sprhs(a0),d0
        tst.w   xspeed(a0)
        bpl.b   ?jump3
    *   btst    #cd_left,cddot(a0)
    *   bne.s   ?jump3
        neg.w   d0
    ?jump3:
        add.w   d0,d3
        bsr.w   scdchk
        tst.w   d1
        beq.b   ?end2
        bpl.b   ?down1
    ?up2:
        cmp.w   #updotmax,d1
        blt.b   ?nomove2
    Also visible in the footage was a brief glance of a partial file list:

    Code:
                            ENEMY.ASM
                FCOL.ASM    FCOL.BAK
    FCOL3.ASM   GAME.ASM    INT.ASM
    LOGO.ASM    MACRO.LIB   MAIN.ASM
    ML.EVT      ML.S28      OBJ¥
    S           S.CMD       SCORE.ASM
    SOUND¥      TR¥
    Some of these filenames may seem familiar, as they survived into Sonic CD. Note that the items ending with the Yen symbol are actually directories, and not files.

    This footage is also noteworthy for showing that Sonic 1 was developed on DOS. This is something that I'll come back to later.

    Patent US5411272A
    A tiny snippet of source code can be found in a patent that Sega filed around the time of Sonic 2's release. It contains two tables that are responsible for Emerald Hill Zone's spiral loops. While it's not all that insightful, it does give you a look at the original formatting of these tables, and how the data was grouped.

    J2ME
    The developers of the J2ME version of Sonic 1 appear to have had access to Sonic 1's source code, or at least its assets: this is evident through how its filenames reflect labels found in the original source code. For instance, 'scdtblwk.scd', matches the label 'scdtblwk' that is found in Sonic 2's "Nick Arcade" prototype.

    Most notably, however, some of the files in this version appear to be 'raw', unprocessed versions of the data found in the ROM of the Mega Drive version. For example, there's an unused function in Sonic 2 that converts the collision data from a previously-unknown format to the format that is seen in the ROM itself, and it was discovered that the collision files in the J2ME version are in this mysterious format.

    There are other file format oddities as well, such as block priority being stored in its own file, instead of being embedded in the chunk data. It's possible that this too is how the data was originally formatted, before being converted into its final form for inclusion in the ROM.

    Assembler
    So we have all this information about the source code itself, and the game's assets, but what about the development environment? Well, for starters, from the footage we saw earlier, we can tell that Sonic 1 was developed on DOS computers.

    According to LazloPsylus, Sonic 1 was very evidently assembled with the 2500AD assembler, X68k, based partly on the fact that the syntax of the code snippet seen in Yuji Naka's footage is unusual, and unlikely to have built with any other assembler.

    However, it does not appear that Sonic 2 was assembled with X68k, as the "Nick Arcade" source code snippet uses a different syntax. It's plausible that Sonic 2 was assembled with SN 68k, also known as asm68k, however the presence of an 'addsym' directive, which is not supported by asm68k, calls this into question.

    Further complicating matters is something that I discovered while writing this very blog post: the "Nick Arcade" symbol table uses big-endian integers. DOS PCs are x86, and store their integers in little-endian. This suggests that Sonic 2 wasn't assembled on a DOS PC at all, unlike Sonic 1, and rather that it was assembled on a big-endian platform like a 68k-powered Macintosh. Another indication of this is that the "Nick Arcade" source snippet uses Unix-style line endings (0x0A), instead of DOS-style line endings (0x0D 0x0A).

    There's some evidence to suggest that Sonic 2 used a different assembler between REV01 and REV02: cross-object-file function calls behave differently, 'dc.b' directives are automatically padded, some 'addi' and 'subi' instructions were optimised to 'addq' and 'subq' instructions, and some 'lea' instructions were unoptimised from PC-relative addressing to absolute long addressing. The cross-object-file behaviour of REV00 and REV01 matches that of the "Nick Arcade" prototype, so it can be assumed that Sonic 2 used the same assembler throughout development up until REV02.

    Something I just discovered while writing this blog post is that Sonic 1's machine code is similar to Sonic 2 REV02: in code that is shared between Sonic 1 and Sonic 2, the same 'addi' and 'subi' instructions are 'addq' and 'subq' in both Sonic 1 and Sonic 2 REV02. Likewise, the same 'lea' instructions are unoptimised. With this in mind, it would appear that Sonic 2 was migrated back to X68k during the development of REV02, and it would continue to use this assembler as it was used to develop Sonic 3, Knuckles in Sonic 2, and the Mega Play arcade version of Sonic 2.

    Sonic 2's source file boundaries
    While we don't have an exact list of Sonic 2's source files, we do have a way of determining where its original source files began and ended: the assembler used by Sonic 2 before REV02 would resolve cross-object-file function calls in a clunky way, basically proxying them to little 'JmpTo' functions. To put it literally, a 'bsr' instruction that referenced a label which was outside of the current object file would instead branch to a single-instruction function that was appended to the end of the object file, which would itself jump to the 'bsr' instruction's original destination. Because these 'JmpTo' functions are inserted at the end of the object file, they can be used to tell where an object file (and thus a source file) ended.

    From this, we can determine things like that the ring object (object 0x25), the scattered ring object (object 0x37), the big Special Stage ring object leftover from Sonic 1, and the Casino Night Zone ring prize object (object 0xDC) were all stored in the same source file.

    Sonic 2 "Simon Wai" prototype's unassembled Kosinski file
    Like the "Nick Arcade" prototype before it, Sonic 2's "Simon Wai" prototype includes another source code file. This one, however, is not entirely complete, but it contains more than enough useful information:

    Code:
    ; 圧縮前 $8000  圧縮後 $2c00  圧縮率 34.4%  セル数 1024
       dc.b    $1d,$7f,$00,$ff,$f8,$7e,$04,$01,$fb,$02,$00,$03,$04,$05,$04,$80
       dc.b    $ff,$fa,$ff,$07,$54,$0b,$54,$0a,$50,$0c,$50,$ff,$8f,$0d,$54,$0f
       dc.b    $54,$0e,$50,$10,$50,$11,$52,$19,$52,$18,$ff,$ff,$fc,$1a,$52,$1b
       dc.b    $51,$8a,$51,$8b,$52,$1c,$02,$1e,$02,$1f,$02,$2a,$9f,$ff,$02,$2b
       dc.b    $01,$8c,$01,$8d,$f4,$1d,$02,$2c,$02,$2d,$01,$ff,$f4,$88,$01,$89
       dc.b    $01,$8e,$01,$8f,$02,$1a,$e4,$02,$2e,$02,$46,$c0,$2f,$e0,$ff,$1b
       dc.b    $ec,$fc,$dc,$00,$70,$02,$c4,$d4,$ee,$18,$02,$19,$01,$3f,$f6,$fd
       dc.b    $e4,$e6,$04,$2e,$04,$2d,$04,$9d,$fe,$77,$bd,$00,$be,$f9,$50,$31
       dc.b    $54,$30,$54,$2f,$7f,$f8,$56,$03,$56,$02,$56,$01,$05,$ff,$f0,$52
       dc.b    $1d,$52,$1e,$e1,$9f,$52,$1f,$fc,$50,$3e,$54,$3c,$56,$04,$54,$36
       dc.b    $09,$e0,$c4,$9c,$f8,$ea,$1a,$50,$48,$24,$41,$ba,$a4,$b2,$fc,$fc
       dc.b    $21,$9a,$f2,$80,$f6,$9c,$fc,$1d,$5e,$92,$68,$01,$8a,$01,$8b,$ee
       dc.b    $fc,$68,$f2,$fd,$d5,$fd,$ce,$f7,$f7,$80,$fd,$f0,$f8,$0f,$04,$35
       dc.b    $f0,$f8,$0d,$54,$3f,$54,$39,$7f,$fe,$54,$38,$01,$ff,$02,$00,$06
       dc.b    $00,$60,$1a,$54,$43,$54,$ff,$f3,$42,$55,$fe,$55,$fd,$55,$fc,$55
       dc.b    $fb,$54,$46,$a4,$1c,$ff,$11,$50,$49,$54,$44,$54,$52,$50,$51,$54
       dc.b    $50,$80,$b2,$12,$8e,$8f,$4e,$06,$fc,$f2,$f2,$3c,$90,$fa,$58,$5c
       dc.b    $80,$f8,$20,$60,$f8,$20,$40,$f3,$02,$0a,$02,$2c,$3c,$0b,$70,$40
       dc.b    $f6,$86,$2a,$54,$29,$52,$f4,$62,$f8,$11,$c0,$f1,$2a,$52,$2b,$bc
       dc.b    $f4,$fc,$1a,$62,$f1,$72,$6e,$f2,$f2,$78,$00,$16,$bd,$fe,$00,$17
       dc.b    $fc,$f8,$0c,$18,$00,$19,$fc,$f8,$0c,$e0,$f8,$2e,$54,$06,$54,$04
       dc.b    $50,$fb,$be,$08,$50,$09,$f8,$fe,$50,$12,$50,$13,$fc,$f8,$0b,$00
       dc.b    $14,$00,$15,$f7,$fc,$fc,$f8,$0c,$1e,$00,$1f,$fc,$f8,$0c,$20,$00
       dc.b    $21,$fc,$f4,$50,$f5,$f7,$07,$50,$f6,$50,$f7,$e8,$fe,$50,$f8,$50
       dc.b    $87,$52,$1b,$3c,$1f,$fd,$e0,$fc,$50,$f9,$50,$85,$40,$ae,$f1,$50
       dc.b    $fa,$50,$fb,$07,$e1,$50,$fc,$50,$8b,$f6,$86,$f1,$2a,$1c,$50,$2f
       dc.b    $b2,$8c,$50,$8d,$50,$8e,$24,$f1,$24,$ee,$0a,$24,$9a,$eb,$92,$f3
       dc.b    $7c,$f2,$0a,$f2,$e0,$ec,$af,$9f,$dc,$05,$6d,$ae,$ef,$60,$f2,$1a
       dc.b    $06,$25,$01,$89,$45,$94,$e4,$4e,$ed,$e0,$e8,$2a,$f3,$11,$ae,$e0
       dc.b    $f0,$c0,$28,$02,$29,$38,$f6,$00,$8c,$c0,$fd,$ce,$e4,$a0,$59,$44
       dc.b    $c0,$8d,$ce,$00,$ea,$bc,$e0,$0b,$a8,$d6,$fc,$1b,$dc,$e2,$f8,$f0
       dc.b    $68,$ec,$ea,$bd,$f8,$e5,$20,$f0,$15,$a0,$e8,$09,$20,$f0,$16,$50
       dc.b    $54,$0d,$20,$f5,$1b,$52,$1c,$92,$a0,$dc,$e4,$60,$e5,$a8,$6e,$e2
       dc.b    $80,$6e,$e4,$82,$28,$12,$fc,$4e,$e2,$80,$6e,$e2,$44,$ee,$e7,$fa
       dc.b    $00,$66,$8e,$fe,$56,$25,$51,$8c,$c0,$c2,$e4,$bc,$f0,$fe,$38,$02
       dc.b    $15,$d8,$80,$fc,$06,$f8,$9d,$59,$f0,$12,$02,$11,$02,$10,$80,$fc
       dc.b    $f6,$5a,$30,$fe,$e0,$ee,$13,$80,$2e,$52,$2f,$f9,$6d,$7f,$f5,$05
       dc.b    $f9,$02,$16,$00,$23,$00,$24,$e4,$f3,$f2,$f1,$80,$ea,$50,$2b,$20
       dc.b    $8c,$50,$76,$5a,$f3,$84,$51,$89,$40,$a0,$5c,$58,$60,$6e,$00,$f9
       dc.b    $11,$95,$ae,$f5,$1b,$5a,$f6,$6a,$e3,$6a,$fc,$02,$82,$e8,$10,$96
       dc.b    $ee,$ea,$47,$0f,$ce,$f2,$13,$02,$14,$76,$b2,$f2,$16,$02,$17,$44
       dc.b    $8c,$ee,$e4,$88,$ea,$33,$fa,$d4,$04,$23,$f2,$e4,$e6,$fc,$54,$27
       dc.b    $54,$4f,$e4,$94,$54,$93,$04,$92,$e0,$ea,$e4,$f2,$54,$af,$af,$85
       dc.b    $54,$97,$04,$98,$c6,$fd,$52,$f3,$54,$87,$54,$99,$bc,$fc,$ff,$ff
       dc.b    $00,$e8,$39,$50,$6b,$50,$6c,$50,$6d,$50,$73,$50,$74,$50,$75,$50
       dc.b    $76,$50,$ff,$8f,$77,$50,$78,$50,$79,$50,$15,$50,$7a,$50,$7b,$50
       dc.b    $7c,$5e,$51,$f8,$20,$ee,$12,$00,$13,$fc,$f8,$0c,$00,$e8,$0e,$08
       dc.b    $6e,$e2,$4d,$d2,$fc,$f2,$bc,$d2,$8a,$32,$ee,$f6,$60,$04,$f0,$fa
       dc.b    $22,$fa,$00,$23,$06,$5c,$32,$fc,$80,$f1,$26,$54,$25,$67,$c1,$50
       dc.b    $27,$f6,$58,$20,$80,$f2,$20,$60,$d1,$51,$55,$f1,$6d,$d8,$80,$f3
       dc.b    $cc,$f3,$28,$f1,$80,$f0,$09,$12,$dc,$2d,$a3,$04,$e1,$d8,$ea,$18
       dc.b    $84,$d6,$a0,$d8,$4f,$41,$80,$f4,$02,$25,$01,$24,$ae,$05,$c0,$80
       dc.b    $f4,$88,$23,$f0,$25,$92,$12,$05,$fa,$ab,$02,$d6,$e0,$ff,$92,$f3
       dc.b    $e0,$fc,$8a,$f1,$e0,$86,$a7,$88,$10,$88,$01,$f9,$01,$fa,$80,$5d
       dc.b    $21,$05,$fa,$60,$fc,$50,$28,$80,$fe,$e0,$e9,$fc,$2d,$1b,$94,$84
       dc.b    $bc,$c9,$52,$86,$c0,$ce,$64,$ea,$2a,$7c,$74,$19,$fa,$e9,$76,$d2
       dc.b    $58,$55,$05,$48,$01,$5d,$f9,$5e,$f2,$fc,$f4,$57,$05,$52,$85,$e9
       dc.b    $1b,$05,$49,$f4,$fe,$02,$d5,$ff,$f2,$f4,$f8,$09,$ff,$f8,$32,$32
       dc.b    $d6,$96,$ca,$ff,$d8,$38,$50,$39,$50,$3f,$a2,$49,$a2,$4a,$fc,$54
       dc.b    $ea,$fe,$7f,$af,$02,$0d,$02,$0e,$02,$0f,$06,$0d,$cc,$f8,$0a,$c1
       dc.b    $00,$c2,$bc,$f8,$0c,$d2,$f9,$f0,$f8,$2c,$c0,$e1,$f0,$07,$04,$05
       dc.b    $f1,$07,$51,$bf,$aa,$75,$50,$c1,$50,$c2,$54,$31,$a0,$c6,$ac,$da
       dc.b    $ee,$f5,$46,$f2,$aa,$20,$60,$f3,$e4,$f3,$dc,$de,$d2,$cc,$6e,$de
       dc.b    $d4,$52,$d8,$0c,$b2,$ac,$e2,$e8,$5c,$f3,$d8,$c8,$e2,$82,$b2,$20
       dc.b    $de,$34,$f3,$ec,$1a,$f2,$84,$db,$b8,$84,$6a,$e8,$fe,$c4,$b8,$c0
       dc.b    $b8,$49,$20,$fc,$c0,$b8,$10,$1b,$2d,$e8,$08,$f3,$00,$f1,$51,$fc
       dc.b    $da,$8a,$f2,$bd,$ae,$d7,$97,$01,$73,$06,$99,$fc,$fe,$98,$f6,$e4
       dc.b    $04,$0a,$fc,$f6,$f4,$9b,$7f,$46,$f6,$06,$9f,$02,$e2,$0a,$98,$0a
       dc.b    $f4,$e6,$38,$e9,$fe,$e3,$04,$00,$fa,$f4,$fc,$50,$f5,$93,$43,$e2
       dc.b    $06,$91,$02,$fe,$92,$f8,$f0,$07,$84,$98,$06,$96,$02,$fe,$b0,$f8
       dc.b    $91,$20,$06,$95,$f0,$c4,$fe,$9a,$8d,$87,$f8,$06,$9c,$f0,$e4,$02
       dc.b    $e5,$aa,$08,$fe,$02,$bc,$f8,$fa,$eb,$32,$50,$33,$50,$34,$9f,$ff
       dc.b    $50,$b4,$50,$b5,$50,$b6,$fc,$b7,$50,$b8,$50,$b9,$54,$e1,$fb,$b9
       dc.b    $f0,$fe,$ba,$f0,$bb,$f0,$bc,$68,$d2,$06,$19,$fc,$ff,$f4,$ae,$fc
       dc.b    $ad,$fc,$ac,$fc,$ab,$fc,$aa,$f0,$fc,$a6,$fc,$fb,$8b,$a5,$fc,$a4
       dc.b    $48,$d6,$30,$be,$3c,$a3,$3c,$a2,$38,$d0,$09,$c5,$56,$f0,$a1,$58
       dc.b    $c0,$0b,$f0,$a0,$f0,$f8,$0e,$9f,$40,$b0,$52,$58,$d5,$b5,$6e,$80
       dc.b    $f7,$58,$d5,$80,$f0,$0d,$f1,$72,$cc,$80,$f7,$01,$6d,$c0,$f8,$1e
       dc.b    $58,$45,$fd,$48,$f6,$bc,$fc,$c0,$c0,$ee,$9c,$ea,$18,$a1,$6d,$01
       dc.b    $4b,$f8,$48,$05,$55,$8e,$cc,$a6,$f0,$52,$05,$57,$d1,$a0,$05,$56
       dc.b    $ec,$38,$ea,$88,$a0,$32,$cb,$c0,$fe,$ec,$fe,$c6,$f0,$ec,$fe,$01
       dc.b    $1f,$02,$5d,$01,$ff,$bf,$0f,$01,$10,$02,$45,$02,$30,$02,$31,$c1
       dc.b    $da,$c2,$33,$c2,$32,$ff,$cf,$d2,$e2,$02,$34,$02,$35,$02,$32,$c1
       dc.b    $db,$c2,$3c,$02,$3d,$7f,$00,$f0,$47,$02,$36,$02,$37,$c1,$dc,$e0
       dc.b    $ea,$0e,$ff,$f0,$44,$ce,$c5,$d8,$c1,$d9,$02,$40,$02,$f0,$ff,$41
       dc.b    $f0,$c1,$d4,$c1,$d5,$c1,$d6,$c1,$d7,$02,$3e,$02,$ff,$3f,$3f,$02
       dc.b    $46,$c0,$c1,$c0,$c2,$c2,$3a,$c2,$3b,$02,$38,$02,$39,$01,$02,$d8
       dc.b    $f0,$d0,$c8,$02,$7e,$c0,$c4,$f8,$30,$01,$29,$01,$2a,$02,$44,$92
       dc.b    $d6,$aa,$c0,$a3,$aa,$80,$d3,$8b,$2e,$ca,$d3,$a0,$c9,$9a,$d2,$a4
       dc.b    $cd,$aa,$eb,$80,$cf,$a4,$cd,$66,$d2,$a8,$ce,$80,$d6,$04,$5e,$72
       dc.b    $ce,$60,$d5,$5d,$97,$f6,$54,$61,$54,$60,$e4,$fc,$ea,$52,$1c,$e0
       dc.b    $a9,$63,$54,$ff,$da,$62,$54,$67,$54,$66,$54,$65,$54,$64,$f2,$bc
       dc.b    $e0,$ac,$54,$e0,$a9,$7f,$e1,$51,$fb,$51,$fc,$51,$fd,$51,$fe,$80
       dc.b    $e8,$0f,$fc,$50,$ba,$5b,$50,$50,$bb,$50,$80,$e8,$14,$0c,$80,$e8
       dc.b    $0c,$f0,$80,$e8,$7b,$e0,$d8,$3f,$fd,$ef,$ec,$e9,$9a,$f2,$1e,$54
       dc.b    $9d,$54,$9c,$54,$90,$54,$8f,$92,$b7,$1c,$1f,$d5,$54,$8e,$54,$8d
       dc.b    $50,$50,$e0,$e8,$ba,$b2,$9e,$80,$9a,$aa,$aa,$1d,$9c,$bb,$c4,$da
       dc.b    $7c,$ea,$ba,$b2,$36,$db,$f8,$9d,$00,$be,$aa,$f4,$a0,$c8,$09,$8e
       dc.b    $a6,$0e,$a3,$92,$c6,$c0,$9a,$d4,$04,$24,$00,$c2,$ff,$5a,$32,$f0
       dc.b    $09,$e6,$54,$4f,$54,$4e,$54,$4d,$54,$4c,$54,$d5,$7e,$59,$54,$9c
       dc.b    $c3,$a8,$b1,$00,$ea,$1c,$80,$99,$57,$54,$56,$54,$5f,$11,$55,$60
       dc.b    $ff,$aa,$ea,$80,$9a,$a0,$fe,$06,$bc,$95,$54,$68,$d6,$5c,$d6,$12
       dc.b    $9c,$56,$dc,$e4,$9a,$ea,$84,$c4,$8f,$3f,$5c,$ac,$51,$09,$83,$f2
       dc.b    $62,$02,$63,$01,$88,$05,$7c,$a2,$f6,$51,$00,$91,$09,$24,$f2,$fc
       dc.b    $10,$25,$05,$64,$91,$f0,$96,$b2,$ee,$61,$1d,$92,$c1,$f2,$50,$91
       dc.b    $a8,$c2,$fc,$fe,$f0,$96,$ac,$b0,$f0,$48,$b1,$8d,$64,$e1,$20,$c3
       dc.b    $f0,$00,$9e,$8c,$aa,$92,$95,$78,$f2,$60,$f8,$09,$8e,$93,$92,$f3
       dc.b    $d1,$f5,$72,$90,$09,$1f,$36,$44,$ef,$00,$53,$40,$b1,$fa,$f1,$50
       dc.b    $4a,$ff,$ff,$50,$4b,$50,$4c,$50,$4d,$50,$4e,$50,$4f,$50,$55,$50
       dc.b    $56,$50,$57,$3d,$48,$50,$3d,$f8,$f5,$18,$50,$40,$f6,$fc,$f7,$2a
       dc.b    $a9,$2a,$20,$9a,$b6,$bb,$20,$90,$0a,$e8,$ee,$fe,$e8,$a4,$a4,$ff
       dc.b    $e4,$f4,$c6,$80,$de,$0e,$b5,$50,$46,$50,$47,$50,$48,$50,$3f,$c2
       dc.b    $3a,$50,$3b,$50,$42,$50,$43,$a0,$ff,$51,$5f,$55,$50,$52,$50,$44
       dc.b    $50,$45,$d8,$f1,$3c,$f2,$e4,$c3,$2e,$f8,$09,$a0,$8e,$95,$05,$a0
       dc.b    $fd,$80,$88,$0a,$e0,$ef,$0e,$b2,$c5,$ce,$55,$62,$00,$bb,$5c,$f8
       dc.b    $0a,$60,$f6,$5c,$8a,$3c,$5a,$2b,$2a,$d2,$fe,$01,$12,$a0,$09,$52
       dc.b    $f3,$f0,$5a,$f3,$8e,$fe,$30,$91,$f0,$b6,$f2,$ea,$8a,$32,$c0,$d1
       dc.b    $96,$fd,$2e,$bd,$f0,$b2,$fe,$12,$cb,$2c,$c0,$40,$fd,$0e,$a0,$5c
       dc.b    $8f,$be,$56,$a0,$a6,$4e,$a2,$51,$82,$b8,$09,$88,$a1,$53,$22,$b8
       dc.b    $2d,$c0,$82,$f5,$27,$f0,$f8,$0b,$a6,$b9,$c0,$81,$54,$34,$54,$33
       dc.b    $54,$32,$f0,$ed,$92,$40,$d1,$e0,$ea,$1a,$c0,$82,$54,$37,$c0,$81
       dc.b    $68,$68,$55,$72,$f2,$58,$aa,$81,$41,$00,$e0,$60,$8e,$b0,$0a,$c0
       dc.b    $80,$09,$7a,$b0,$0a,$bf,$28,$80,$c0,$40,$c0,$be,$cc,$a3,$cc,$00
       dc.b    $d8,$0a,$f0,$00,$d8,$0c,$8a,$ba,$f0,$00,$d8,$0c,$f0,$00,$d8,$0a
       dc.b    $88,$fe,$54,$b4,$7f,$fd,$cc,$f4,$f4,$bc,$f4,$bb,$f4,$ba,$f4,$80
       dc.b    $d1,$7c,$d1,$bf,$50,$c0,$f8,$ff,$fa,$aa,$f8,$ab,$f8,$ac,$f8,$ad
       dc.b    $f8,$ae,$d4,$91,$26,$b7,$f8,$b1,$f8,$fb,$dd,$b2,$f8,$b3,$16,$b0
       dc.b    $0b,$38,$af,$38,$b0,$30,$06,$b0,$0c,$38,$a9,$f0,$f8,$0e,$d6,$ed
       dc.b    $a8,$f0,$f8,$0e,$a7,$f0,$f8,$0d,$ff,$f8,$13,$f0,$d5,$f0,$f8,$0e
       dc.b    $d6,$f0,$f8,$0e,$d7,$fd,$ff,$05,$6e,$f2,$f8,$09,$f4,$d8,$f0,$d9
       dc.b    $55,$71,$55,$70,$55,$6f,$50,$dd,$7f,$7f,$f0,$de,$f0,$df,$f0,$e0
       dc.b    $f2,$18,$00,$f1,$72,$51,$73,$50,$ef,$f0,$d8,$f0,$ff,$f1,$f2,$00
       dc.b    $d9,$a2,$fe,$1f,$a1,$88,$7f,$70,$a1,$89,$a2,$2c,$a2,$2d,$a2,$1a
       dc.b    $f4,$f8,$c8,$67,$02,$59,$5d,$ef,$a0,$6c,$f0,$fe,$f2,$5a,$00,$d4
       dc.b    $9b,$f8,$4c,$2d,$00,$2e,$ac,$e8,$0a,$2f,$ff,$6d,$50,$30,$50,$31
       dc.b    $50,$36,$50,$37,$50,$3c,$40,$df,$1e,$40,$d9,$1b,$ad,$6a,$7c,$e7
       dc.b    $54,$e2,$8d,$88,$94,$f8,$d4,$a0,$8c,$92,$8e,$ee,$cb,$8f,$05,$19
       dc.b    $ee,$bf,$2a,$e2,$f4,$80,$88,$0a,$e6,$04,$14,$f2,$e0,$ba,$f6,$ee
       dc.b    $c0,$d3,$94,$f5,$e0,$c0,$d0,$15,$58,$85,$80,$84,$da,$
    'Kosinski' is the nickname of a compression format used by various Mega Drive games, and this source file contains data compressed in this format. The header, when translated, says...

    Code:
    ; Before compression $8000  After compression $2c00  Compression ratio 34.4%  Number of cells 1024
    'Cells' refers to Mega Drive tile graphics, which are 32 bytes each. It doesn't make such sense in this context, since it's not tiles that are being compressed, but rather Aquatic Ruin Zone's level chunk data.

    Anyway, what we can learn from this source file is that Kosinski-compressed data wasn't included into the ROM as binary data, but rather assembly data for the assembler to process. This is unusual, as every assembler that I've worked with supports including binary data directly, without requiring this odd shim.

    Regardless, this assembly file also possibly indicates why Kosinski files are always padded to 0x10 bytes: each 'dc.b' directive in the source file is 0x10 values long, so perhaps the tool that produced this assembly file was unable to output a 'dc.b' that was less than 0x10 values long, and so it would instead output dummy 0 values until the 'dc.b' was 'full'.

    Closing
    Aaaaaaand... that's it. I think that's all I know about Sonic the Hedgehog's source code. Hopefully this information is of use to someone.
     
    Last edited: Apr 1, 2022
    Selbi, Pacca, MarkeyJester and 8 others like this.
  2. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    I've been digging through the Sonic 2 Nick Arcade and Sonic CD Gems collection symbols for a bit, among other things, and gathered a little collection of what certain labels were called in the source code:
    • Sonic 1 debug font = ascii
    • PlaySound = bgmset
    • PlaySound_Special = soundset
    • ClearScreen = scrinit
    • QueueDMATransfer = dmactrset
    • EniDec = mapdevr
    • RandomNumber = random
    • CalcSine = sinset
    • CalcAngle = atan
    • PalLoad1 = colorset
    • PalLoad2 = colorset2
    • PalPointers = colortbl
    • Pal_FadeFromBlack = fadein
    • Pal_FadeToBlack = fadeout
    • Pal_FadeFromWhite = flashin
    • Pal_FadeToWhite = flashout
    • PalCycle_Load = clchgctr
    • ChangeRingFrame = syspatchg
    • LevelSizeLoad = scr_set
    • DeformBgLayer = scroll
    • RunDynamicLevelEvents = scrchk
    • loadZoneBlockMaps = mapinit
    • LoadTilesAsYouMove = scrollwrt
    • LoadTilesFromStart = mapwrt
    • LoadCollisionIndexes = scdset
    • ConvertCollisionArray = scdcnv
    • BuildSprites = patset
    • DrawSprite = spatset
    • RunObjects = action
    • Obj_Index = act_tbl
    • DisplaySprite = actionsub
    • DeleteObject = frameout
    • MarkObjGone = frameoutchk
    • MarkObjGone_P1 = frameoutchkd
    • AnimateSprite = patchg
    • SingleObjLoad = actwkchk
    • SingleObjLoad2 = actwkchk2
    • TouchResponse = pcol
    • HurtCharacter = playdamageset
    • KillCharacter = playdieset
    • Sonic_ResetOnFloor = jumpcolsub
    • DebugMode = edit
    • JmpTbl_DbgObjLists = edittbl
    • SolidObject = hitchk
    • ObjectMoveAndFall = speedset
    • ObjectMove = speedset2
    • Obj79_SaveData = playsave
    • Obj79_LoadData = playload
    • AddPoints = scoreup
    • HudUpdate = scoreset
    • Hud_InitRings = ringinit
    • Hud_Base = scoreinit
    • AniArt_Load = efectwrt
    • LevelArtPointers = mapinittbl
    • ArtLoadCues = divdevtbl
    • SonicDynPLC = playwrtpat
    • Sonic 1 ColArray = scdtbl1/scdtbl
    • Sonic 1 ColArray2 = scdtbl2
    • Sonic 2 ColArray = scdtbl3
    • Sonic 2 ColArray2 = scdtbl4
    • Sonic 1 ColCurveMap = scddirtbl1
    • Sonic 2 ColCurveMap = scddirtbl2
    • Kos_Z80 (Sonic 1 PCM driver) = pcm_top (followed by pcm_end at the end)
    Sonic 2 Nick Arcade objects (also referenced the leaked debug mode code):
    • Obj01/Sonic = play00
    • Obj02/Tails = fox (probably)
    • Obj03/Pathswapper = colichg
    • Obj06/EHZ corkscrew = sloop
    • Obj09/Sonic (special stage) = play01
    • Obj0B/Rotating CPZ floor = kaiten
    • Obj0C/Small CPZ platform = prodai
    • Obj10/Sonic (proto debug object) = play02
    • Obj12/HPZ emerald = gem
    • Obj13/HPZ waterfall = wfall
    • Obj14/HTZ seesaw = sisoo
    • Obj14/HTZ seesaw ball = sball
    • Obj18/Platform = shima
    • Obj1F/GHZ Crabmeat = kani
    • Obj21/HUD = score
    • Obj22/GHZ Buzz Bomber = hachi
    • Obj25/Ring = ring
    • Obj26/Monitor = item
    • Obj2B/GHZ Chopper = fish
    • Obj36/Spikes = toge
    • Obj38/Shield = baria
    • Obj38/Invincibility stars = muteki
    • Obj3B/GHZ purple rock = jyama
    • Obj3D/GHZ boss = boss1
    • Obj3E/Animal prison = masin
    • Obj41/Sonic 1 spring = sjump
    • Obj41/Sonic 2 spring = bane
    • Obj42/GHZ Newtron = kamere
    • Obj44/GHZ wall = kageb
    • Obj48/GHZ boss ball = btama
    • Obj49/EHZ waterfall = taki
    • Obj4A/Octopus = oct
    • Obj4B/Buzzer = wasp
    • Obj4C/Batbot = bbat/ba
    • Obj4D/Rhinobot = stego
    • Obj4E/Alligator bot = gator
    • Obj4F/Dinobot = redz
    • Obj50/Seahorse = seahorse
    • Obj51/Skyhorse = skyhorse
    • Obj52/Pirahna = bfish/bfish2/fish2
    • Obj54/Snail = snail
    • Obj55/Boss parent = bossba
    • Obj55/EHZ boss subtype = drillerguy
    • Obj56/Boss explosion = billbomb
    • Obj57/EHZ boss object 1 = bossdriller
    • Obj58/EHZ boss object 2 = driller
    • Obj79/Checkpoint = save
    • Obj8A/Sonic 1 credits = staff
    Variables:
    • MainCharacter = playerwk
    • Camera_X_pos = scra_h_posit
    • Camera_Y_pos = scra_v_posit
    • Camera_BG_X_pos = scrb_h_posit
    • Camera_BG_Y_pos = scrb_v_posit
    • Camera_Min_Y_pos = scralim_up
    • Camera_Max_Y_pos = scralim_n_down
    • Camera_Min_Y_pos_Debug_Copy = editstack
    • Camera_Max_Y_pos_Debug_Copy = editstack2
    • Game_Mode = gmmode
    • Ctrl_1_Held = swdata1
    • Ctrl_1_Press = swdata1+1
    • Current_ZoneAndAct = stageno
    • Current_Zone = stageno
    • Current_Act = stageno+1
    • Debug_object = editno
    • Debug_Accel_Timer = edittimer
    • Debug_Speed = edittimer+1
    • v_ssrotate (Sonic 1) = rotspd
    • v_ssangle (Sonic 1) = rotdir
    Object variables/SSTs:
    • id = actno
    • render_flags = actflg
    • art_tile = sproffset
    • mappings = patbase
    • x_pos = xposi
    • y_pos = yposi
    • x_vel = xspeed
    • y_vel = yspeed
    • mapping_frame = patno
    • anim = mstno
    • status = cddat
    • subtype = userflag
    Other information:
    • Some of these other symbols were found in other data that hasn't been really properly documented out there yet. There's a whole section other symbols and even older code (I found an earlier version of the Emerald Hill boss and documented it here).
    • Mappings and DPLCs were definitely done in assembly, possibly by hand. Sprite mappings are generally labelled as "XXXXXpat", with labels for each sprite frame generally being labelled as "XXXXXspNN".
    • Tile data is labelled as "XXXXXcg".
    • Sonic 1 special stage maps are labelled as 'rotmaptblN"
    • Zones are referred to by their ID, not their name.
    • PLC lists are just labelled as "ddevNN".
    • There's a function that would load the Sonic 1 collision data if it was in Green Hill Zone, but it relies on how their development hardware worked, hence why it doesn't work in the build we have.
    • An object's main routine index table is labelled as "XXXXX_move_tbl".
    • An object's initialization routine is labelled as "XXXXXinit".
    • An object's main update routine is labelled as "XXXXXmove".
    • A common local label used when a free object slot was not found is ".worknai".
    • There's actually a reference to a totally scrapped boss that appeared to initially been made for Chemical Plant. Said symbols are "vacumeguy" and "bossvac".
    • Due to the nature of them using linking and XREFs, there's actually a couple of reused labels that are, of course, not exported.
    • Sonic CD developers called the functions that refer to the animals being deleted with a bad future set and the badniks being destroyed with a good future set as "friend_suicide" and "enemy_suicide" respectively. I know that English wasn't their native tongue, but I found it amusing.
    • Amy was called "emie" in Sonic CD's source code.
    • The "I'm outta here" in Sonic CD routine is just called "bye".
    Of course, this isn't every symbol that's been leaked out, and I'm lacking on Sonic CD's for now, but it's a good chunk I have documented. This should be helpful on documenting the rest later on. A while ago, I did do a quick test of setting up every label in TouchResponse/pcol here. RAM and object variables aren't set up, though, just the code labels.
     
    Last edited: May 24, 2022
  3. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    Just wanted to add that running a Sonic CD ELF file through objdump with the "-l" option while disassembling adds in the filenames and line numbers. The information is there.

    Example:
    Code:
    813080c0 <action>:
    action():
    813080c0:       94 21 ff f0     stwu    r1,-16(r1)
    C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:40
    813080c4:       7c 08 02 a6     mflr    r0
    813080c8:       90 01 00 14     stw     r0,20(r1)
    813080cc:       93 e1 00 0c     stw     r31,12(r1)
    813080d0:       93 c1 00 08     stw     r30,8(r1)
    C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:44
    813080d4:       3c 60 81 36     lis     r3,-32458
    813080d8:       3b e3 c2 c4     addi    r31,r3,-15676
    C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:45
    813080dc:       3b c0 00 00     li      r30,0
    813080e0:       48 00 00 40     b       81308120 <action+0x60>
    C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:46
    813080e4:       88 1f 00 00     lbz     r0,0(r31)
    813080e8:       28 00 00 00     cmplwi  r0,0
    813080ec:       41 82 00 2c     beq     81308118 <action+0x58>
    C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:53
    813080f0:       7f e3 fb 78     mr      r3,r31
    813080f4:       88 9f 00 00     lbz     r4,0(r31)
    813080f8:       38 04 ff ff     addi    r0,r4,-1
    813080fc:       54 05 10 3a     rlwinm  r5,r0,2,0,29
    81308100:       3c 80 81 35     lis     r4,-32459
    81308104:       38 04 42 70     addi    r0,r4,17008
    81308108:       7c 80 2a 14     add     r4,r0,r5
    8130810c:       81 84 00 00     lwz     r12,0(r4)
    81308110:       7d 89 03 a6     mtctr   r12
    81308114:       4e 80 04 21     bctrl
    C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:56
    81308118:       3b de 00 01     addi    r30,r30,1
    8130811c:       3b ff 00 44     addi    r31,r31,68
    81308120:       2c 1e 00 80     cmpwi   r30,128
    81308124:       41 80 ff c0     blt     813080e4 <action+0x24>
    C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:57
    81308128:       83 e1 00 0c     lwz     r31,12(r1)
    8130812c:       83 c1 00 08     lwz     r30,8(r1)
    81308130:       80 01 00 14     lwz     r0,20(r1)
    81308134:       7c 08 03 a6     mtlr    r0
    81308138:       38 21 00 10     addi    r1,r1,16
    8130813c:       4e 80 00 20     blr
    
    Also, structure variables names are included in the .debug section, including the ones for objects, but I'm not quite sure how to get them extracted.
    [​IMG]
     
    Last edited: May 25, 2022
    Pacca, JGamer2151 and Clownacy like this.
  4. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    I know, double post and all, but if anyone would like to take a look at R11A's ELF file, extracted ".debug" section, and info generated from objdump, I have them here. The debug section appears to be nonstandard, and I'm not sure how I could go about figuring it out at all.

    EDIT: lol figured it out
     

    Attached Files:

    Last edited: Jun 12, 2022
    DeltaW likes this.
  5. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    Took another dive into R11A.ELF and organized the symbols by section and filename:
    Code:
    main\ACTION.C
        .text
            action
            speedset_0
            speedset2
            actionsub
            frameout
            patset
            spatset
    
    main\ACTSET.C
        .text
            flagwkclr
            actsetchk
            actsetinit
            actset
            tm_setchk
            actnoset
            actwkchk
            actwkchk2
            frameout_s
            frameout_s00
            frameout_s0
    
        .bss
            pAsetadr_dummy
            pAsetadr_w
            pAsetadrz_w
    
    main\DAI_K.C
        .text
            dai_k
            dai_k_init
            dai_k_move
            k_move
            jumpchk_d
    
        .data
            k_daipat0
            k_daipat1
            k_daipat2
            k_daipat
            k_daichg0
            k_daichg
            dai_k_move_tbl
            pattbl_20
    
    main\DAI_RD1.C
        .text
            dodai
            dodai_init
            dodai_move
            dodai_ud
            dodai_lr
            dodai_ride1
            dodai_ride2
            dodai_nA
            dodai_nB
            dodai_fix
            dodai_fal
            dodai_up
            dodai_upx
            dodai_rm
            dodai_lm
            dodai_sub
            dai_fout
            vfuta
            vfuta_init
            vfuta_move1
            vfuta_move2
    
        .data
            dai11a_pat1
            dai11a_pat2
            dai11a_pat3
            dai11a_pattbl
            dodai_acttbl
            dai_hstbl_13
            dai_mcnttbl_14
            dodai_mtype
            vfuta_pat0
            vfuta_pat1
            vfutapat
            vfuta_tbl
          
    main\DIRCOL.C
        .text
            dircolm
            dircol
            dircol2
            dircol_d
            dircol_d3
            dircol_r
            dircol_r2
            dircol_r3
            dircol_l
            dircol_l2
            dircol_l3
            dircol_u
            dircol_u2
            dircol_u3
            emycol_u
            emycol_d
            emycol_d2
            emycol_d3
            dircolchk
            dircolchk1
    
    main\DUMMY.C
        .text
            pa_set
            fadeout_s
    
    main\EDIT.C
        .text
            edit
    
        .bss
            CKeyTogle
    
    main\EMIE1.C
        .text
            emie1
            emie1_init
            emie1_matu
            emie1_dakii
            emie1_tobii
            emie1_tobim
            emie_play
            setdirect
            speedset
            speedsetx
            speedsety
            jumpchk_d_0
            pljumpset
            dakicheck
            empatchg
            emie1clrset
            emie1clrsetx
            heartset
            heart1
            heart1_init
            heart1_move
    
        .data
            em1_tbl
            emie1_clr
            ht1_tbl
    
    main\EMIE1CG.C
        .data
            pat0
            pat1
            pat2
            pat3
            pat4
            pat5
            pat6
            pat7
            pat8
            pat9
            patA
            patB
            patC
            patD
            patE
            patF
            pat10
            emie1pat
            moji_pchg
            run_pchg
            kiss_pchg
            stnd2_pchg
            moji2_pchg
            kyoro_pchg
            em_pchg
    
    main\ENEMY.C
        .text
            ene_ari
            ari_init
            ari_fall
            ari_move
            ene_chou
            chou_init
            chou_move
            ene_ka
            ka_init
            ka_move
            ka_turn
            ka_down
            ka_stop
            ene_kamemusi
            kamemusi_init
            kamemusi_fall
            kamemusi_move
            area
            kamemusi_stop
            kamemusi_stop1
            kamemusi_tama
            kamemusi_tama_init
            tama
            tama_init
            tama_move
            ene_tagame_a
            tagame_init
            tagame_wait
            tagame_wait1
            tagame_jump
            tagame_jump1
            ene_tama
    
        .data
            ari_pchg00
            ari_pchg01
            ari_pchg
            ari0
            ari1
            ari2
            ari3
            ari_pat
            chou_pchg00
            chou_pchg01
            chou_pchg
            chou1e
            chou2e
            chou3e
            chou1b
            chou2b
            chou3b
            e_chou_pat
            b_chou_pat
            pchg_e_0
            pchg_e_1
            pchg_e
            pchg_b_0
            pchg_b_1
            pchg_b
            ka1e
            ka2e
            ka3e
            ka4e
            ka5e
            ka1b
            ka2b
            ka3b
            ka4b
            ka5b
            b_ka_pat
            e_kamem_pchg00
            e_kamem_pchg01
            e_kamem_pchg
            b_kamem_pchg00
            b_kamem_pchg01
            b_kamem_pchg
            kamem_pat00e
            kamem_pat00b
            kamem_pat01
            kamem_pat02
            e_kamem_pat
            b_kamem_pat
            tama_pchg00
            tama_pchg
            tama_pat00
            tama_pat01
            tama_pat02
            tama_pat03
            tama_pat
            e_tagame_pchg00
            e_tagame_pchg01
            e_tagame_pchg
            b_tagame_pchg00
            b_tagame_pchg01
            b_tagame_pchg
            tagame_pat00
            tagame_pat01
            tagame_pat02
            tagame_pat03e
            tagame_pat04e
            tagame_pat05e
            tagame_pat03b
            tagame_pat04b
            tagame_pat05b
            tagame_pat06
            e_tagame_pat
            b_tagame_pat
    
    main\EQU.C
        .bss
            ta_flag
            clrspflg_save
            flagworkcnt
            flagworkcnt2
            pl_suu
            main_play
            pl_air
            pltimeover_f
            plring_f2
            pl_suu_f
            plring_f
            pltime_f
            plscore_f
            plring
            plscore
            play_start
            start_flag
            plpower_b
            plpower_m
            plpower_s
            plpower_a
            plflag
            plflag_s
            plxposi_s
            plyposi_s
            plring_s
            pltime_s
            time_flag
            scralim_down_s
            scra_h_posit_s
            scra_v_posit_s
            scrb_h_posit_s
            scrb_v_posit_s
            scrc_h_posit_s
            scrc_v_posit_s
            scrz_h_posit_s
            scrz_v_posit_s
            waterposi_m_s
            water_flag_s
            waterflag_s
            plring_f2_s
            generate_flag
            plsubchg_flag
            enkeino
            projector_flag
            special_flag
            conbine_flag
            enecgflg
            emie3end
            extrascore
            markerno
            gf_flag
            chibi_s
            tv_flag
            edittimer
            time_stop
            sys_pattim
            sys_patno
            sys_pattim2
            sys_patno2
            sys_pattim3
            sys_patno3
            sys_pattim4
            sys_patno4
            sys_ringtimer
            editstack
            editstack2
            mapcheck
            blkno
            edit_user
            sysdirec
            prio_flag
            init_flag
            boss_sound
            shut_flag
            st6clrchg
            chibi_flag
            mapwrt_cnt
            startcolor
            colorcnt
            int_flg
            linkdata
            cltbladr
            ranum
            cgwrtcnt
            cgwrttim
            dmastack
            waterposi
            waterposi_m
            watermoveposi
            waterspeed
            water_flag
            waterflag
            waterflag2
            scralim_n_left
            scralim_n_right
            scralim_n_up
            scralim_n_down
            scralim_left
            scralim_right
            scralim_up
            scralim_down
            scrar_no
            scra_h_keep
            scra_v_keep
            scra_hz
            scra_vz
            scra_vline
            scrh_flag
            scrv_flag
            scra_h_count
            scra_v_count
            scrb_h_count
            scrb_v_count
            scrc_h_count
            scrc_v_count
            scrz_h_count
            scrz_v_count
            limmoveflag
            playpatno1
            kusya_flag
            plmaxspdwk
            pladdspdwk
            plretspdwk
            playpatno
            playwrtflag
            asetposi
            time_item
            backto_cnt
            scr_cnt
            demo_adr
            demo_cnt
            swbufcnt
            scra_hline
            bossflag
            bossstart
            loopmapno
            loopmapno2
            ballmapno
            ballmapno2
            watercoliflag
            waterstop
            mizuflag
            sekichyuflag
            plautoflag
            specflag
            dai2rmvflag
            emyscorecnt
            timebonus
            ringbonus
            bonus_f
            edplayflag
            ms_wflg
            lpKeepWork
            lpFadeFlag
            lpcolorwk4
            lpcolorwk3
            lpcolorwk2
            lpcolorwk
            switchflag
            waterdirec
            clchgtim
            clchgcnt
            plposiwkadr
            scdadr
            byecnt1
            byecnt0
            asetadrz2
            asetadrz
            asetadr2
            asetadr
            actset_rno
            dirstk
            scrflagz
            scrflagc
            scrflagb
            scrflaga
            scr_timer
            scr_die
            scroll_start
            zone_flag
            scrz_v_posit
            scrz_h_posit
            scrc_v_posit
            scrc_h_posit
            scrb_v_posit
            scrb_h_posit
            scra_v_posit
            scra_h_posit
            divdevwk
            cgchgtim
            cgchgcnt
            pauseflag
            intcnt
            hscroll
            vscroll
            swdata2
            swdata1
            swdata
            gmmode
            actwk
            lphscrollbuff
            playposiwk
            pbuffer
            hscrollwork
            flowwk
            blockwk
            pmapwk
            linework
            col_x
            col_y
            scrflagzw
            scrflagcw
            scrflagbw
            scrflagaw
            scrz_v_posiw
            scrz_h_posiw
            scrc_v_posiw
            scrc_h_posiw
            scrb_v_posiw
            scrb_h_posiw
            scra_v_posiw
            scra_h_posiw
            systemtimer
            editmode
            editno
            flowercnt
            flowerposi
            debugflag
            demoflag
            debugwork
            pltime
            stageno
            gametimer
            gameflag
            flagwork
    
    main\ET1.C
        .text
            et
            m_init
            m_wait
            m_die
            m1wait
            a_hover
    
        .data
            tpat00
            tpat01
            tpat07
            tpat02
            tpat03
            tpat04
            tpat05
            tpat06
            pat_et
            tbl0sproffset
            tbl0
            pchg0
            pchg
    
    main\ETC.C
        .text
            sinset
            atan_sonic
    
    main\FCOL.C
        .text
            fcol
            fcol_d
            fcol_r
            fcol_u
            fcol_l
            scdend
            scdchk
            scdchk2
            scdend_r
            scdchk_r
            scdchk2_r
            scramapad
            dirchk
            scdcnv
            st_elseDataChk
            st_wackyDataChk
            st_starDataChk
            st_metalDataChk
            CCset
            CSset
    
    main\GAME.C
        .text
            DLL_meminit
            DLL_memfree
            Print_Msg
            Get_vscroll
            Get_scra_h_posiw
            Get_scrb_h_posiw
            SetDebugFlag
            game
            game_init
            play_act_set
            scdset
            syspatchg
            back_to_cnt
            bye_cnt
            sdfdout
            sdfdin
            da_set
            main
    
        .data
            da_tbl_189
    
        .bss
            Interupt_Counter
            PauseIcon
            SetGrid
            EAsprset
            ClrSpriteDebug
            WaveRequest
            CDPlay
            CDPause
            ChangeTileBmp
            WaveAllStop
            sMemSet
            sMemCpy
            sRandom
            sPrintf
            sOutputDebugString
            sOpenFile
            sReadFile
            sCloseFile
            lpghWnd
            sGetFileSize
    
    main\GOAL.C
        .text
            gene
            gene_init
            gene_move0
            gene_move1
            kira_set
            kira_move
            gene_coli
            bring2
            bring2init
            bring2move0
            bring2move1
            bigring
            bring_init
            bring_move0
            bring_move1
            bring_coli
            mosugu
            mosug_init
            mosug_move0
            mosug_move1
            offset_set
            goal
            goal_init
            goal_move0
            goal_move1
            goal_move2
            goal_move3
    
        .data
            gene_tbl
            bring2_tbl
            bigring_tbl
            mosugu_tbl
            goal_tbl
    
    main\IO.C
        .text
            SWdataSet
            scrinit
    
    main\ITEM.C
        .text
            timedisp
            td_init
            td_move
            t_item
            t_item_init
            t_item_move0
            t_item_move1
            t_item_move2
            flagwkadr
            ride_on_chk_i
            item
            iteminit
            itemmove
            itemmove2
            itemmove3
            itemget
            powerup_init
            item2
            item2init
            item2move
            item2die
            error_item
    
        .data
            itemchg0
            itemchg1
            itemchg2
            itemchg3
            itemchg4
            itemchg5
            itemchg6
            itemchg7
            itemchg8
            itemchg9
            itemchg
            ite00
            ite01
            ite02
            ite03
            ite04
            ite05
            ite06
            ite07
            ite08
            ite09
            ite0a
            ite0b
            ite0c
            ite0d
            ite0e
            ite0f
            ite10
            ite11
            ite12
            ite13
            itempat
            cor00
            cor01
            cor02
            cor03
            cor04
            cor05
            cor06
            cor07
            cor08
            cor09
            cor0a
            cor0b
            cor0c
            cor0d
            cor0e
            cor0f
            corepat
    
    main\PLAYER.C
        .text
            bye_chk
            play00
            muteki_set
            play00init
            mizuki_set
            mapno_chk
            scr_h
            play00move
            playpowercnt
            playposiwkset
            plwaterchk
            playsave
            backto_chk
            play00walk
            play00jump
            ball00walk
            ball00jump
            chk11
            levermove
            lmovecol
            plwalk_l
            plwalk_r
            balllmove
            ballwalk_l
            ballwalk_r
            jumpmove
            limitchk
            ballchk
            ballset
            jumpchk
            jumpchk2
            keispd
            keispd2
            fallchk
            direcchg
            jumpcolchk
            jumpcolsub
            jumpcolsub0
            play00damage
            play00damage_sub
            play00die
            play00die_sub
            play00erase
            loopchk
            st7_x
            patchgmain
            patchgmain2
            playrunchg
            playrunchg2
            playrunchg3
            platetc_chg
            little_runchg
            little_patchg
            frip_spd
    
        .bss
            WaveClear
            Brake_Req
            Brake_Sw
    
    main\PLAYPAT1.C
        .data
            pat00
            pat01
            pat02
            pat03
            pat04
            pat05
            pat06
            pat07
            pat08
            pat09
            pat0a
            pat0b
            pat0c
            pat0d
            pat0e
            pat0f
            pat10
            pat11
            pat12
            pat13
            pat14
            pat15
            pat16
            pat17
            pat18
            pat19
            pat1a
            pat1b
            pat1c
            pat1d
            pat1e
            pat1f
            pat20
            pat21
            pat22
            pat23
            pat24
            pat25
            pat26
            pat27
            pat28
            pat29
            pat2a
            pat2b
            pat2c
            pat2d
            pat2e
            pat2f
            pat30
            pat31
            pat32
            pat33
            pat34
            pat35
            pat36
            pat37
            pat38
            pat39
            pat3a
            pat3b
            pat3c
            pat3d
            pat3e
            pat3f
            pat40
            pat41
            pat42
            pat43
            pat44
            pat45
            pat46
            pat47
            pat48
            pat49
            pat4a
            pat4b
            pat4c
            pat4d
            pat4e
            pat4f
            pat50
            pat51
            pat52
            pat53
            pat54
            pat55
            pat56
            pat57
            pat58
            pat59
            pat5a
            pat5b
            pat5c
            pat5d
            pat5e
            pat5f
            pat60
            pat61
            pat62
            pat63
            pat64
            pat65
            pat66
            pat67
            pat68
            pat69
            pat6a
            pat6b
            pat6c
            pat6d
            pat6e
            pat6f
            pat70
            pat71
            pat72
            pat73
            pat74
            pat75
            pat76
            pat77
            pat78
            pat79
            pat7a
            pat7b
            pat7c
            pat7d
            pat7e
            pat7f
            pat80
            pat81
            pat82
            pat83
            pat84
            pat85
            pat86
            pat87
            pat88
            pat89
            pat8a
            pat8b
            pat8c
            pat8d
            pat8e
            pat8f
            pat90
            pat91
            pat92
            pat93
            pat94
            pat95
            pat96
            pat97
            pat98
            pat99
            pat9a
            pat9b
            pat9c
            pat9d
            pat9e
            pat9f
            pata0
            pata1
            pata2
            pata3
            pata4
            pata5
            pata6
            pata7
            pata8
            pata9
            pataa
            patab
            patac
            patad
            patae
            pataf
            patb0
            patb1
            patb2
            patb3
            patb4
            patb5
            patb6
            patb7
            patb8
            patb9
            patba
            patbb
            patbc
            patbd
            patbe
            patbf
            patc0
            patc1
            patc2
            patc3
            patc4
            patc5
            sncpat
    
    main\PLAYSP.C
        .text
            playsp
    
    main\PLAYSUB.C
        .text
            patchg
            playsave0
            marker
            marker_init
            marker_move0
            marker_move1
            marker_move2
            plairset
            tensuu_set
            tensuu0
            bakuha
            baku_init
            baku_move
            baku_die
            flower
            flow_init
            flow_move0
            flow_move1
            flow_sub
            flow_sub1
            flow_move2
            flow_move3
            mizukiri
            mizuki_init
            mizuki_move
            mizuki_move2
            futa
            ride_on_chk_f
            futa_init
            futa_move
            futa_move2
            futa_move3
            exit2_set
            col_chk
            exit2
            exit2_init
            exit2_move
            exit2_erase
            baria
            bariainit
            bariamove
            mutekimove
            backtomove
            muteki_sub
            actionsub0
            ball
            ball_init
            ball_move
            ball_ball
            ball_rd7
            ball_coli
    
        .data
            flowchg0
            flowchg1
            flowchg2
            flowchg3
            flowchg
            flo00
            flo01
            flo02
            flo03
            flo04
            flo05
            flo06
            flo07
            flow_pat
    
    main\PLCHG.C
        .data
            plchg00
            plchg01
            plchg02
            plchg03
            plchg04
            plchg05
            plchg06
            plchg07
            plchg08
            plchg09
            plchg10
            plchg11
            plchg12
            plchg13
            plchg14
            plchg15
            plchg16
            plchg17
            plchg18
            plchg19
            plchg20
            plchg21
            plchg22
            plchg23
            plchg24
            plchg25
            plchg26
            plchg27
            plchg28
            plchg29
            plchg30
            plchg31
            plchg32
            plchg33
            plchg34
            plchg35
            plchg36
            plchg37
            plchg38
            plchg39
            plchg40
            plchg41
            plchg42
            plchg43
            plchg44
            plchg45
            plchg46
            plchg47
            plchg48
            plchg49
            plchg50
            plchg51
            plchg52
            plchg53
            plchg54
            plchg55
            plchg56
            plchg57
            playchg
    
    main\RIDECHK.C
        .text
            ride_on_clr
            ride_on_set
            hitchk_u
            ridechk
            ride_on_chk
            hitchk
            hit_v
            hit_x
            push_set
            push_clr
            hit_y
            hit_yu
            hit_yu1
            hit_yu0
            hit_e
            side_coli
            hit_set
            hit_clr
    
    main\RING.C
        .text
            ring
            ringinit_0
            ringmove
            ringget
            ringgetsub
            ringdie
            ringerase
            flyring
            flyringinit
            flyringmove
            flyringget
            flyringdie
            flyringerase
    
        .data
            ringsp0
            ringsp1
            ringsp2
            ringsp3
            ringsp4
            ringsp5
            ringsp6
            ringsp7
            ringsp8
            ringpat
            ringchg0
            ringchg1
            ringchg2
            ringchg
    
    main\SCORE.C
        .text
            tensuu
            ten_init
            ten_move
            score
            score_init
            score_move
            scoreup
            scoreset
            ringinit
            scoreinit
            posiwrt
            bonuswrt
            ringwrt
            scorewrt
            scorewrt2
            posiwrt0
            playsuuwrt
            timewrt1
            timewrt
            timewrt0
    
        .data
            subtbl
            subtblh4
            tenpat0
            tenpat1
            tenpat2
            tenpat3
            tenpat4
            tenpat5
            tenpat
            scorepat0
            scorepat1
            scorepat2
            scorepat3
            scorepat
            scoreinittbl
            ringinittbl
    
    main\SCRCHK.C
        .text
            scrchk
            zone1chk
            zone11chk
            zone12chk
            zone13chk
            zone3chk
            zone31chk
            zone33chk
            zone6chk
            zone5chk
            zone51chk
            zone53chk
            zone8chk
            zone81chk
            zone83chk
            zone4chk
            zone41chk
            zone42chk
            zone4chk
            zone7chk
            zone71chk
            zone72chk
            zone73chk
            bossclr_scr
            bossclr_scrset
    
    main\SPRING.C
        .text
            iwa
            iwa_init
            iwa_move
            koma
            koma_init
            koma_move
            koma_move2
            spring_d
            spr_d_init
            spr_d_move
            spring
            sjumpinit
            ride_on_chk_s
            sjumpmove
            sjumpmove2
            sjumpmove3
            ride_on_chk_s1
            sdushmove
            sdushmove2
            sdushmove3
            ride_on_chk_s2
            sjump2move
            sjump2move2
            sjump2move3
            sjump3move
            sjump3move2
            sjump3move3
    
        .data
            spat00
            spat01
            spat02
            spat03
            spat04
            spat05
            spat06
            spat07
            spat08
            kpat00
            kpat01
            ipat00
            spat10
            spat11
            spat12
            spat13
            spat14
            spat15
            spat16
            spat17
            spat18
            springpat
            spring90pat
            spring45pat
            springpat2
            spring90pat2
            spring45pat2
            komapat
            iwapat
            springchg0
            springchg
            komachg0
            komachg
            sjump_move_tbl
    
    main\SUICIDE.C
        .text
            enemy_suicide
            friend_suicide
    
    main\TAKI.C
        .text
            taki
            taki_init
            taki_move
            jisin_set
            jisin
    
        .data
            shibukichg0
            shibukichg
            shibuki0
            shibuki1
            shibukipat
            taki_move_tbl
    
    main\TBL0.C
        .data
            genechg0
            genechg1
            genechg
            genepat0
            genepat1
            genepat2
            genepat3
            genepat4
            genepat5
            genepat6
            genepat7
            genepat8
            genepat
            bringchg0
            bringchg
            bringpat0
            bringpat1
            bringpat2
            bringpat3
            bringpat
            bring2chg0
            bring2chg
            bring2pat0
            bring2pat1
            bring2pat2
            bring2pat3
            bring2pat4
            bring2pat5
            bring2pat6
            bring2pat7
            bring2pat
            goalchg0
            goalchg
            goalsp0
            goalsp1
            goalsp2
            goalsp3
            goalsp4
            goalsp5
            goalpat
    
    main\TBL1.C
        .data
            bariachg0
            bariachg1
            bariachg2
            bariachg3
            bariachg4
            bariachg5
            bariachg6
            bariachg7
            bariachg8
            bariachg
            bar00
            bar01
            bar02
            bar03
            bar04
            bar05
            bar06
            bar07
            bar08
            bar09
            bar0a
            bar0b
            bar0c
            bariapat
            exit2chg0
            exit2chg1
            exit2chg2
            exit2chg
            exi00
            exi01
            exi02
            exi03
            exi04
            exi05
            exi06
            exit2pat
            futachg0
            futachg
            fut00
            fut01
            futapat
            mizukichg0
            mizukichg
            miz00
            miz01
            miz02
            mizukipat
            baku_chg0
            baku_chg1
            bakuchg
            bak00
            bak01
            bak02
            bak03
            bak04
            bak05
            bak06
            bakupat
            mkchg
            markerchg
            pat00_0
            pat01_0
            pat02_0
            pat03_0
            markerpat
    
    main\TREE.C
        .text
            hoshi
            hoshi_init
            hoshi_move
            kasoku0
            k0_init
            k0_move
            kasoku
            kasoku_init
            kasoku_move
    
        .data
            hoshi_tbl
            k0_tbl
            kasoku_tbl
            hoshipat0
            hoshipat1
            hoshipat
            kasokuchg0
            kasokuchg1
            kasokuchg2
            kasokuchg
            kasokupat_a
            kasokupat_b
            kasokupat_c
            kasokupat_d
            kasokupat_e
            kasokupat_f
            kasokupat_g
            kasokupat_h
            kasokupat_i
            kasokupat_j
            kasokupat
    
    main\ZONE.C
        .text
            over
            over_init
            over_move
            title
            title_init
            title_move0
            title_move1
            title_back0
            title_back1
            title_wait
            clear
            clear_init0
            clear_init
            clear_move0
            clear_move1
            clear_move2
            clear_wait
    
        .data
            game0
            game1
            gamepat
            time0
            time1
            timepat
            gotpat0
            gotpat1
            gotpat2
            gotpat3
            madepat0
            madepat1
            madepat2
            madepat3
            bonuspat
            bonuspat0
            gotpat
            gotpat_0
            madepat
            madepat_0
            cleartbl
    
        .bss
            ClearSountWait
            WaitCount
    
    main\ZONETBL1.C
        .data
            titletbl
            titlepat0
            titlepat1
            titlepat2
            titlepat3
            titlepat4
            titlepat5
            titlepat6
            titlepat7
            titlepat8
            title_pat
    
    main\R1\ACT11A.C
        .text
            noact
    
        .data
            act_tbl
    
    main\R1\COL1A.C
        .text
            clchgctr
            colchg11a
            clchg_sub0
            fadein0
            fadein0_new
            fadein1
            fadein2
            fadeout_new
            fadeout1
            fadeout2
            flashin
            flashin_new
            flashin1
            flashin2
            flashout_new
            flashout1
            flashout2
            colorset
            colorset2
            colorset00
            FadeProc
    
        .data
            clst1_1a0
            clst1_1a1
            advacolor
            advacolor2
            gamecolor
            zone1colora0
            zone1colora1
            zone1colora
            colortbl
            col1a0cnt
            col1a0col
            col1a1cnt
            col1a1col
            col1a2cnt
            col1a2col
            col1a3cnt
            col1a3col
            col1a4cnt
            col1a4col
            col1a5cnt
            col1a5col
    
        .bss
            FadeCount
    
    main\R1\DEV11A.C
        .data
            mapinittbl
    
    main\R1\EDTBL11A.C
        .data
            edit_tbl
    
    main\R1\KOWASI1.C
        .text
            kowasi
            m_init_0
            m_wait_0
            m_down
    
        .data
            spr_kowasi00
            spr_kowasi01
            spr_kowasi02
            spr_kowasi03
            spr_kowasi04
            spr_kowasi05
            spr_kowasi06
            spr_kowasi07
            spr_kowasi08
            spr_kowasi09
            spr_kowasi0a
            spr_kowasi0b
            spr_kowasi0c
            spr_kowasi0d
            pat_kowasi
    
    main\R1\KUZUR11A.C
        .data
            pata00
            patbase_kuzure_a
            tbla00
            tbla
            patc00
            patc01
            patc02
            patc03
            patc04
            patc05
            patc06
            patc
            patb00
            patb01
            patb02
            patb03
            patb04
            patbase_kuzure_b
            tblb00
            tblb01
            tblb02
            tblb03
            tblb04
            tblb
            patd00
            patd01
            patd02
            patd03
            patd04
            patd05
            patd
    
    main\R1\KUZURE.C
        .text
            kuzureru_tikei
            acta_init
            acta_check
            actb_wait
            actb_down
            actb_init_a
            actb_init_b
    
    main\R1\SCR11A.C
        .text
            enecginit
            divdevset
            scr_set
            playposiset
            scrbinit
            scroll
            scroll_h
            scrh_move
            right_check
            left_check
            scroll_v
            sv_move_main
            sv_move_main1
            sv_move_main2
            sv_move_sub2
            sv_move_sub
            sv_move_minus
            scrv_up_ch
            sv_move_plus
            scrv_down_ch
            scrv_move
            scrollb_v
            scrollb_h
            scrollc_h
            scrollz_h
            scrollwrt
            scrollwrtb
            hblockwrt
            hblockwrt1
            vblockwrt
            blockwrt
            mapadrset
            mapadrset1
            mapadrset99
            mapadrset2
            block_wrt
            block_chk
            vramadrset
            vramadrset1
            vramadrset0
            vramadrset99
            scr11a_test
            mapwrt
            mapwrt2
            mapwrt3
            mapwrt_z81a
            mapwrt_sub
            mapinit
            mapset
    
        .data
            z81awrttbl
            vblockwrtbtbl
            mapwrt_tbl
    
    main\R1\SHOOT1.C
        .text
            kage
            kage_init
            kage_move
            ana
            kage1_init
            kage1_move0
            kage1_move1
            kage1_chk
            kage1_clr
            shooter
            shooterinit
            shootermove
            shootermove2
            shootermove3
            shooterspdset
            mspd_set
    
        .data
            kag00
            kag01
            kagepat
            ana00
            kage1pat
            shooterposi_0
            shooterposi_1
            shooterposi_2
            shooterpositbl
          
    main\R1\SISAKE.C
        .text
            colli_pl_sikake_d
            colli_pl_sikake
            tobita1
            tobita_init
            tobita_stop_r
            tobita_stop_l
            tobita_ride_r
            tobita_ride_l
            tobita_yure_r
            tobita_yure_l
            hariyama
            hari_init
            hari_normal
    
        .data
            tobita1chg0
            tobita1chg1
            tobita1chg2
            tobitastop1
            tobitastop2
            tobita1chg
            tobita_a
            tobita_b
            tobita_c
            tobita_r_a
            tobita_r_b
            tobita_r_c
            tobita1_pat
            pat0_0
            hari12pat
    
    main\R1\Z11ACT.C
        .data
            dummyarea
            asettbl
            asettblz
    
    main\BLOCK.C
        .text
            block
            block_init
            block_move
            block_move2
            block_move3
            block_move4
            block_move5
            block_move6
            block_ride
            ride_on_chk_b
    
        .data
            block_tbl
            blockchg0
            blockchg1
            blockchg2
            blockchg
            block0
            block1
            block2
            block3
            block4
            block5
            blockpat
    
    main\LOADER2.C
        .text
            ShortSWAP
            GetRoundStr
            ReadBlockMap
            ReadScrolMap
            soundset
    
        .data
            SeToWavTbl
    
    main\BMP.C
        .bss
            SprBmp
    
    main\R1\COLI1.C
        .text
            pcol
            CollitblDataXchk
            CollitblDataYchk
            ColliHitChk
            pcolitem
            pcolnomal
            pcolplay2
            pcolplay
            pcole
            playdamagechk
            playdamageset
            playdieset
            pcolspecial
            eggman_chk
            yago
            main_attack
    
        .data
            escoretbl
            colitbl
    
        .bss
            bCarry
    
    main\R1\Z11ATBL.C
        .data
            scddirtbl
            scdtblwk
            scdtblwk2
            zone1scd
            mapwka
            mapwkb
    
    main\SAVE.C
        .text
            playloadb
            playload
    
    main\R1\FRIEND1.C
        .text
            t_roll
            rev_h
            set_sproffset
            friend
            t_init
            t_move
            t_movie
            p_init
            p_move
            p_movie
    
        .data
            pchg00
            pchg01
            pchg10
            pchg0_0
            pchg1
            spr_flicky1
            spr_flicky2
            spr_ricky1
            spr_ricky2
            spr_ricky3
            spr_ricky4
            spr_friend0
            spr_ricky5
            pat_friend0
            pat_friend1
            tbl0sproffset
          
    main\R1\MOVIE1.C
        .text
            move1
            die
            mm_init
            mm_wait
            mm_die
            m_baku
            mm1wait
            sub
            s_init
            s_move
    
        .data
            movie1_pchg00
            movie1_pchg01
            movie1_pchg
            spr_movie1
            spr_movie2
            spr_movie3
            spr_movie4
            spr_movie5
            spr_movie0
            pat_movie
            tbl0_0
    Code:
    main\ACTION.C
        RunObjects
        ObjectMoveAndFall
        ObjectMove
        DisplaySprite
        DeleteObject
        BuildSprites
     
    main\ACTSET.C
        ObjectsManager
        SingleObjLoad
        SingleObjLoad2
        MarkObjGone
     
    main\DAI_K.C
        Spinning Platform
     
    main\DAI_RD1.C
        Platform
        Vertical flapping door
     
    main\DIRCOL.C
        CalcRoomInFront
        CalcRoomOverHead
        CheckFloorDist
        ObjCheckFloorDist
        CheckRightWallDist
        ObjCheckRightWallDist
        CheckCeilingDist
        ObjCheckCeilingDist
        CheckLeftWallDist
        ObjCheckLeftWallDist
     
    main\DUMMY.C
        Routine to set object's tile ID
        Routine to fade out music
     
    main\EDIT.C
        DebugMode
     
    main\EMIE1.C
        Amy
     
    main\EMIE1CG.C
        Amy mappings and animations
     
    main\ENEMY.C
        Anton
        Pata-Bata
        Mosqui
        Kamemusi
        Tamabboh(?)
        Taga-Taga
     
    main\EQU.C
        Level variables
     
    main\ET1.C
        Robot generator
     
    main\ETC.C
        CalcSine
        CalcAngle
     
    main\FCOL.C
        AnglePos
        Find_Tile
        FindFloor
        FindWall
        ConvertCollisionArray
     
    main\GAME.C
        Main level routine
        Routine to spawn player
        LoadCollisionIndexes
        ChangeRingFrame
        Routine to update time warp timer
        Routine to update bored timer
        Routine to pause music
        Routine to unpause music
        Routine to play level music
     
    main\GOAL.C
        Flower capsule
        Big ring
        Goal post
        Signpost
     
    main\IO.C
        ReadJoypads
        ClearScreen
     
    main\ITEM.C
        Monitor/Time post
     
    main\PLAYER.C
        Sonic
     
    main\PLAYPAT1.C
        Sonic mappings
     
    main\PLAYSP.C
        Routine for handling special level collision
     
    main\PLAYSUB.C
        AnimateSprite
        Checkpoint
        ResumeMusic
        Test badnik
        Explosion
        Flower
        Spin tunnel waterfall splash
        Spin tunnel door
        Spin tunnel door splash
        Powerup (shield, invincibility stars, time warp stars)
        Spin tunnel tag
     
    main\PLCHG.C
        Sonic animations
     
    main\RIDECHK.C
        SolidObject
     
    main\RING.C
        Ring
        Lost rings from getting hurt
     
    main\SCORE.C
        HUD object
        AddPoints
        HudUpdate
        Hud_InitRings
        HudBase
     
    main\SCRCHK.C
        RunDynamicLevelEvents
     
    main\SPRING.C
        Moving spring with wheel object
        Spring object
     
    main\SUICIDE.C
        Time zone checks for animals and badniks
     
    main\TAKI.C
        Scrapped waterfall effect
        Scrapped earthquake effect
     
    main\TBL0.C
        Flower capsule animations and mappings
        Big ring animations and mappings
        Signpost animations and mappings
     
    main\TBL1.C
        Powerup animations and mappings
        Spin tunnel door splash animations and mappings
        Spin tunnel door animations and mappings
        Spin tunnel waterfall splash animations and mappings
        Explosion animations and mappings
        Checkpoint animations and mappings
     
    main\TREE.C
        3D star plant
        3D loop/ramp booster
     
    main\ZONE.C
        Game over
        Title card
        End results card
     
    main\ZONETBL1.C
        Title card mappings
     
    main\R1\ACT11A.C
        Null object
        ObjectIndex
     
    main\R1\COL1A.C
        PalCycle_Load
        Pal_FadeFromBlack
        Pal_FadeToBlack
        Pal_FadeFromWhite
        Pal_FadeToWhite
        PalLoad_ForFade
        PalLoad_Now
     
    main\R1\DEV11A.C
        LevelArtPointers
        ArtLoadCues(?)
     
    main\R1\EDTBL11A.C
        JmpTbl_DbgObjLists
     
    main\R1\KOWASI1.C
        Breakable wall
     
    main\R1\KUZUR11A.C
        Collapsing platform mappings
     
    main\R1\KUZURE.C
        Collapsing platform
     
    main\R1\SCR11A.C
        Routine to initialize object graphics
        LoadPLC
        LevelSizeLoad
        InitCameraValues
        DeformBgLayer
        ScrollHoriz
        ScrollVerti
        Bg_Scroll_Y
        BGScroll_Block1
        BGScroll_Block2
        BGScroll_Block3
        LoadTilesAsYouMove
        DrawBlocks_LR
        DrawBlocks_TB
        DrawBlock
        GetBlock
        Routine to place a block at a position
        Routine to check if a block is on screen
        CalcBlockVRAMPos
        DrawInitialBG
        loadZoneBlockMaps
        loadLevelLayout
     
    main\R1\SHOOT1.C
        Hollow log background
        Sonic shaped hole
        Hidden spin tunnel
     
    main\R1\SISAKE.C
        Springboard
        Spikes
     
    main\R1\Z11ACT.C
        Object layout data
     
    main\BLOCK.C
        Small platform
     
    main\LOADER2.C
        Gems Collection specific loading routines
        PlaySound
     
    main\R1\COLI1.C
        TouchResponse
     
    main\R1\Z11ATBL.C
        ColCurveMap
        ColArray
        ColArray2
        Level collision data
        Level layout data
     
    main\SAVE.C
        Routine for loading data saved at checkpoint
        Routine for loading data saved in time travel
     
    main\R1\FRIEND1.C
        Animal
     
    main\R1\MOVIE1.C
        Metal Sonic projector
     
    Last edited: Jun 5, 2022
    Nik Pi, Clownacy and DeltaW like this.
  6. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    I would like to add something regarding ROM sections.

    I've been taking a look at Sonic Jam, and I realized that each game has been split up into different files. In Sonic 1's case, there's "AC.SN1", "ACTTBL.SN1" (also ACTTBL_E.SN1" and "ACTTBL_N.SN1", because Jam has different difficulty settings), "DATA.SN1", and "TBL.SN1". "AC" is the game code, "DATA" holds compressed graphics, tilemaps, and stage blocks/chunks. "TBL" holds collision data, uncompressed graphics, and stage layouts (including special stages), and "ACTTBL" holds object layouts.

    I then took a look at the disassembly, and I noticed that the padding between sections corresponds to how the game was split up in Jam.

    "DATA" starts off with the Sega Logo graphics, and in the original ROM, you can see the padding placed before said graphics.
    Code:
           rept $300
               dc.b   $FF
           endm
    Nem_SegaLogo:   binclude   "artnem/Sega Logo (JP1).bin" ; large Sega logo
               even
    The last piece of data in the "DATA" file is the graphics for the logo in the ending, and look at that, another piece of padding right after it in the original ROM:
    Code:
    Nem_EndStH:   binclude   "artnem/Ending - StH Logo.bin"
           even
    
           if Revision=0
           rept $104
           dc.b $FF           ; why?
           endm
           else
           rept $40
           dc.b $FF
           endm
           endif
    After this bit of padding is the stage collision data, which so happens to be the "TBL" section
    Code:
           if Revision=0
           rept $104
           dc.b $FF           ; why?
           endm
           else
           rept $40
           dc.b $FF
           endm
           endif
    ; ---------------------------------------------------------------------------
    ; Collision data
    ; ---------------------------------------------------------------------------
    AngleMap:   binclude   "collide/Angle Map.bin"
           even
    CollArray1:   binclude   "collide/Collision Array (Normal).bin"
           even
           ...
    The last bit of data in the "TBL" file is the graphics for the special stage ring, and in the original ROM, you can see another bit of padding placed after it:
    Code:
    Art_BigRing:   binclude   "artunc/Giant Ring.bin"
           even
    
           align   $100
    And after that are the stage object layouts, aka "ACTTBL":
    Code:
           align   $100
    
    ; ---------------------------------------------------------------------------
    ; Sprite locations index
    ; ---------------------------------------------------------------------------
    ObjPos_Index:
           ; GHZ
           dc.w ObjPos_GHZ1-ObjPos_Index, ObjPos_Null-ObjPos_Index
           dc.w ObjPos_GHZ2-ObjPos_Index, ObjPos_Null-ObjPos_Index
           dc.w ObjPos_GHZ3-ObjPos_Index, ObjPos_Null-ObjPos_Index
           dc.w ObjPos_GHZ1-ObjPos_Index, ObjPos_Null-ObjPos_Index
    The "ACTTBL" file ends with the last object layout, and, of course, in the original ROM, after that is some more padding:
    Code:
    ObjPos_Null:   dc.b $FF, $FF, 0, 0, 0,   0
    
           if Revision=0
           rept $62A
           dc.b $FF
           endm
           else
           rept $63C
           dc.b $FF
           endm
           endif
    Which is then followed by the sound driver after.

    So, based on this info, you can see that the original game had multiple ROM sections: the code ("AC"), compressed graphics, tilemaps, and stage blocks and chunks ("DATA"), stage collision, layouts (both regular and special stages), and uncompressed graphics ("TBL"), stage object layouts ("ACTTBL"), and then finally the sound driver and data. This is why such "useless" padding exists. Each section was aligned.

    Sonic 2 works similarly, but it also adds the "RINGACT" (ring layouts) and "TBL2" (additional compressed graphics, placed between the sound driver + drum samples and music + SFX data) sections.
     
    Last edited: May 15, 2023
  7. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    So, I was taking a look at the Sonic 2 patent, and I saw this (fyi, yes I know this isn't anything new, but there's just some things I feel like pointing out for the sake of this thread)

    [​IMG]

    [​IMG]

    The patent has some pretty interesting things to note. Objects are indeed called sprites, with its structure of variables in RAM being a "sprite status table", which definitely shows where we got that name from. Stuff related to graphics and animation line up with the official variables names as well. The patent also goes into detail about how the corkscrew, pathswapping mechanism, and 2 player mode work, including detail on how the teleportation/swap monitor works.

    From what I can tell, 16x16 blocks are referred to as "graphics (path) blocks", which its associated collision IDs referring to "collision blocks". Chunks don't seem to be referenced, since with collision and path swapping, that all happens on the block level, not the chunk level, so chunks are irrelevant in this case. The loop used to demonstrate the system is basically just a generic image referred to as just an "overlay path". As such, the sectioning shown in these images are on the block level.

    [​IMG] [​IMG] [​IMG] [​IMG] [​IMG] [​IMG]

    [​IMG]
    [​IMG]

    Here's this tidbit from how the corkscrew works I wanna quickly mention. (sloop = the corkscrew in EHZ, called a "shuttle loop")

    [​IMG]

    [​IMG]

    The "ride flag" that it refers to is bit 3 in the status SST ($22) for player 1, or bit 4 for player 2. And sure enough, the corkscrew object (Obj06) makes use of this flag to indicate that the player is running on it. Not quite sure why they refer to it or the "hit" flag as separate bytes, though.
     
    Last edited: Sep 14, 2023
    ProjectFM, Clownacy and DeltaW like this.
  8. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    Okay, so this is my guess for what "div" means here. Maybe it means "divide", since the main function is to effectively split graphics data into chunks that are loaded gradually as the game plays, as to avoid freezing the entire game just to load new graphics.
     
  9. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    So, those unused variables related to camera scrolling in Sonic 1 and Sonic CD. I have their official names right here, taken from Sonic Gems Collection:
    • scrar_no = 0xFFF730 / v_unused1
      • Set to first word in stage's boundary data, which is always 4, but could be changed on a per stage basis
    • scra_h_keep = 0xFFF732 / v_limitleft
      • Set to the initial stage's left boundary + 0x240
    • scrh_flag = 0xFFF740 / v_unused
      • Cleared on initialization
    • scrv_flag = 0xFFF741 / v_unused
      • Cleared on initialization
    • scr_die = 0xFFF746 / v_unused
      • Cleared on initialization
    • scr_timer = 0xFFF748 / v_unused1
      • Cleared on initialization
    I think it's also worth reminding that scra_v_line (0xFFF73E / v_lookshift), the variable that tracks the camera's vertical focal point (for looking up and down), is set to the last word in the stage's boundary data, which is always 0x60, but could be changed on a per stage basis. Makes me wonder what they were planning...
     
    ProjectFM likes this.
  10. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    I took a look at the prototype Sonic 1 code, and these 2 do have some functionality. scrh_flag is set if the left and right stage boundaries are the same, and scrv_flag is set if the top and bottom stage boundaries are the same.

    [​IMG]

    While the stage is running, they get checked each frame. If scrh_flag is set, it jumps to loc_4258, and then comes back around to check scrv_flag, which jumps to loc_4276 if set, and then comes back around again to continue the scrolling function.

    [​IMG]

    loc_4258 simply just slowly scrolls the camera towards the left boundary's position.

    [​IMG]

    loc_4276 does the same thing, but vertically, and with the top boundary (plus 0x20, I assume this is might have been related to old HUD code that displayed on the top 32 pixels of the screen? There is unused code that draws a chain of life icons on the window plane, but it does it on the bottom 32 pixels of the screen instead...).

    [​IMG]

    Perhaps this is some sort of auto-scroll functionality that ended up getting removed in the final game? Interesting how it can basically do that for each individual axis, and not just none or both at the same time. And no, this code was not reused for later games that do have auto-scrolling.
     
    Last edited: Jan 2, 2025
    ProjectFM and vladikcomper like this.
  11. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    So, what's up with background Z in the Sonic 1 prototype? Let's start from the top

    So, there's a bit of code for testing something related to H-BLANK interrupts. If we look at its code, not only can we see that it affects the H-BLANK interrupt position, but it also shifts "scrz_v_posit", or background Z's Y position. This is the only part in the prototype in which scrz_v_posit is directly manipulated.

    [​IMG]

    Let's take a look at scrz_h_posit, background Z's X position and its relation to stage drawing. There are 3 functions related to drawing backgrounds: scrollwrtb, scrollwrtc, and scrollwrtz. scrollwrtb and scrollwrtc are used, but scrollwrtz is completely unreferenced. scrollwrtb and scrollwrtc call the normal VDP command calculation function vramadrset, but scrollwrtz calls an alternate function that is called vramadrset2. The difference between them is that vramadrset is for writing to VRAM range 0xC000-0xFFFF, while vramadrset2 is for writing to VRAM range 0x8000-0xBFFF.

    [​IMG]

    scrollwrtz's functionality is that it draws a stack of 3 blocks on either the left or right side of the screen, with the Y position being calculated from scrz_v_posit. The way it calculates this Y position explains the inverted movement of its value as seen in watercnt.

    [​IMG]

    On top of this, there is also an unused function for initializing background Z's drawing. What's notable is that it too uses vramadrset2, and unlike the drawing update function, this actually has a little setup code that gives a bit extra information.

    As established before, background Z's drawing range is always 3 blocks high, and on initialization, it draws 3 rows of blocks at the bottom of the screen. But, the most interesting part to me is the 2nd line, where d2 is set to 0x6000. So, with it using vramadrset2, that means the calculated VDP command is set to affect VRAM address range 0x8000-0xBFFF. d2 is used in the drawing code to effectively pick out which segment in that address range to work with. The foreground uses 0x4000, which means starting with 0xC000 when using vramadrset, and the background uses 0x6000, which means starting from 0xE000.

    In this case, with d2 being 0x6000, this means background Z's segment affects range 0xA000-0xAFFF.

    [​IMG]

    So, now let's take a look at the unused H-BLANK interrupt handler. Here, it changes the VRAM address of the plane B and the sprite table. The stuff with the sprite table doesn't seem to effectively do anything, as it just resets the address to the same default value that it always has and loads from the same standard sprite table buffer as used throughout the game. It probably would have evolved in some way. Regardless, it does lead me to believe that background Z object sprites would have overridden the general game sprites, too.

    However, I would like to point out that plane B's address gets set to... 0xA000! The same base address used for background Z drawing! Now it makes sense why scrz_v_posit was used for the H-BLANK interrupt positioning function.

    [​IMG]

    And look here, during initialization, the H-BLANK interrupt counter is set to around 3 blocks above the bottom of the screen, much like how 3 rows of blocks are drawn at the bottom of the screen for background Z!

    [​IMG]

    The only other tidbits that can be explored from here are the fact that background Z's X and Y position get stored into a couple of unused variables (presumably meant to be used while swapping out plane B's address), the option for certain objects to scroll along background Z (and also B and C) and an unfinished implementation of a background Z specific object layout manager. With the last one, all it was programmed to do was continually spawn objects whose X positions are less than (scrz_h_posit + 0x200) & 0xFF80.

    [​IMG]

    [​IMG]
    [​IMG]

    So, from what can be gathered here, background Z was going to be this separate plane, whose graphics are drawn in 3 block tall segments, and was designed to override plane B via H-BLANK interrupt at whatever Y position it is set to (scrz_v_posit). I could not tell you for certain what exactly it's for, especially since this was clearly left unfinished, but yeah.
     
  12. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    So, as it is documented, source code for the debug mode was found in the Sonic 2 Nick Arcade prototype. Some people have already noticed already, but Sonic 1's debug item lists are actually at the bottom, past the "end" directive (minus the one for Green Hill, but that's already normally in the ROM, so...), so if you want more Sonic 1 symbols, here you go:
    Code:
    edit1tbl:
            dc.w    14
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
            dcblw   kani_act,kanipat,$0400,0,$00            ;3:
            dcblw   hachi_act,hachipat,$0444,0,$00          ;4:
            dcblw   fish_act,fishpat,$0470,0,$00            ;5:
            dcblw   toge_act,togepat,$04a0,0,$00            ;6:
            dcblw   shima_act,shimapat2,$4000,0,$00         ;7:
            dcblw   jyama_act,jyamapat,$66c0,0,$00          ;8:
            dcblw   musi_act,musipat,$04e0,0,$00            ;9:
            dcblw   sjump_act,sjumppat,$04a8,0,$00          ;10:
            dcblw   kamere_act,kamerepat,$249b,0,$00        ;11:
            dcblw   kageb_act,kagebpat,$434c,0,$00          ;12:
            dcblw   save_act,savepat,$26bc,0,$01            ;13:
            dcblw   colichg_act,colichgpat,$26bc,0,$00      ;14:
    
            -----
    
    edit2tbl:
            dc.w    25
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
            dcblw   sjump_act,sjumppat,$0523,0,$00          ;3:
            dcblw   fish2_act,fish2pat,$2486,0,$08          ;4:
            dcblw   mogura_act,mogurapat,$84a6,2,$00        ;5:
            dcblw   yari_act,yaripat,$03cc,0,$00            ;6:
            dcblw   yari_act,yaripat,$03cc,3,$02            ;7:
            dcblw   box_act,boxpat,$43de,0,$00              ;8:
            dcblw   switch2_act,switch2pat,$0513,0,$00      ;9:
            dcblw   toge_act,togepat,$051b,0,$00            ;10:
            dcblw   dai_act,udaipat,$43bc,0,$04             ;11:
            dcblw   dai3_act,dai3pat,$43e6,0,$01            ;12:
            dcblw   dai3_act,dai3pat,$43e6,1,$13            ;13:
            dcblw   dai3_act,dai3pat,$43e6,0,$05            ;14:
            dcblw   kazari_act,kazaripat,$443e,0,$00        ;15:
            dcblw   dai3_act,dai3pat,$43e6,2,$27            ;16:
            dcblw   dai3_act,dai3pat,$43e6,3,$30            ;17:
            dcblw   kassya_act,kassyapat,$03f6,0,$7f        ;18:
            dcblw   uni_act,unipat,$0467,0,$00              ;19:
            dcblw   awa_act,awapat,$8348,19,$84             ;20:
            dcblw   mizu_act,mizupat,$c259,2,$02            ;21:
            dcblw   mizu_act,mizupat,$c259,9,$09            ;22:
            dcblw   bou_act,boupat,$43de,0,$00              ;23:
            dcblw   ben_act,benpat,$4328,0,$02              ;24:
            dcblw   save_act,savepat,$26bc,0,$01            ;25:
    
    *       dcblw   dai4_act,dai4pat,$41f0,4,$80            ;25:
    edit3tbl:
            dc.w    18
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
            dcblw   hachi_act,hachipat,$0444,0,$00          ;3:
            dcblw   toge_act,togepat,$051b,0,$00            ;4:
            dcblw   sjump_act,sjumppat,$0523,0,$00          ;5:
            dcblw   mfire_act,firepat,$0345,0,$00           ;6:
            dcblw   fblock_act,fblockpat,$4000,0,$00        ;7:
            dcblw   myogan_act,yoganpat,$63a8,0,$00         ;8:
            dcblw   yogan2_act,yogan2pat,$63a8,0,$00        ;9:
            dcblw   box_act,boxpat,$42b8,0,$00              ;10:
            dcblw   yado_act,yadopat,$247b,0,$00            ;11:
            dcblw   bryuka_act,bryukapat,$42b8,0,$00        ;12:
            dcblw   dai_act,daipat,$02b8,0,$00              ;13:
            dcblw   break2_act,break2pat,$62b8,0,$00        ;14:
            dcblw   yoganc_act,yogancpat,$8680,0,$00        ;15:
            dcblw   bat_act,batpat,$04b8,0,$00              ;16:
            dcblw   imo_act,imopat,$24ff,0,$00              ;17:
            dcblw   save_act,savepat,$26bc,0,$01            ;18:
    edit4tbl:
            dc.w    15
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
            dcblw   elev_act,elevpat,$4000,0,$00            ;3:
            dcblw   break2_act,break2pat,$44e0,2,$00        ;4:
            dcblw   shima_act,z4daipat,$4000,0,$00          ;5:
            dcblw   pedal_act,pedalpat,$4000,0,$00          ;6:
            dcblw   step_act,steppat,$4000,0,$00            ;7:
            dcblw   fun_act,funpat,$43a0,0,$00              ;8:
            dcblw   sisoo_act,sisoopat,$0374,0,$00          ;9:
            dcblw   sjump_act,sjumppat,$0523,0,$00          ;10:
            dcblw   mfire_act,firepat,$0480,0,$00           ;11:
            dcblw   bgspr_act,hassyapat,$44d8,0,$00         ;12:
            dcblw   brobo_act,brobopat,$0400,0,$00          ;13:
            dcblw   uni_act,unipat,$2429,0,$00              ;14:
            dcblw   save_act,savepat,$26bc,0,$01            ;15:
    edit5tbl:
            dc.w    15
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
            dcblw   toge_act,togepat,$051b,0,$00            ;3:
            dcblw   sjump_act,sjumppat,$0523,0,$00          ;4:
            dcblw   aruma_act,arumapat,$04b8,0,$00          ;5:
            dcblw   signal_act,signalpat,$0000,0,$00        ;6:
            dcblw   bobin_act,bobinpat,$0380,0,$00          ;7:
            dcblw   kani_act,kanipat,$0400,0,$00            ;8:
            dcblw   hachi_act,hachipat,$0444,0,$00          ;9:
            dcblw   yado_act,yadopat,$247b,0,$00            ;10:
            dcblw   shima_act,z5daipat,$4000,0,$00          ;11:
            dcblw   dai2_act,dai2pat,$4000,0,$00            ;12:
            dcblw   switch2_act,switch2pat,$0513,0,$00      ;13:
            dcblw   imo_act,imopat,$24ff,0,$00              ;14:
            dcblw   save_act,savepat,$26bc,0,$01            ;15:
    edit6tbl:
            dc.w    29
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   item_act,itempat,$0680,0,$00            ;2:
            dcblw   brobo_act,brobopat,$0400,0,$00          ;3:
            dcblw   uni_act,unipat,$0429,0,$00              ;4:
            dcblw   imo_act,imopat,$22b0,0,$00              ;5:
            dcblw   buranko_act,fetamapat,$4391,2,$07       ;6:
            dcblw   haguruma_act,hagurumapat,$c344,00,$e0   ;7:
            dcblw   dai_act,daipat,$22c0,2,$28              ;8:
            dcblw   switch2_act,switch2pat,$0513,0,$00      ;9:
            dcblw   pata_act,patapat,$4492,0,$03            ;10:
            dcblw   pata_act,yukafpat,$04df,0,$83           ;11:
            dcblw   noko_act,nokopat,$43b5,0,$02            ;12:
            dcblw   break2_act,break2pat,$43f5,0,$00        ;13:
            dcblw   dai_act,daipat,$4460,3,$39              ;14:
            dcblw   dai4_act,dai4pat,$22c0,0,$00            ;15:
            dcblw   door_act,doorpat,$42e8,0,$00            ;16:
            dcblw   dai4_act,dai4pat,$22c0,1,$13            ;17:
            dcblw   noko_act,nokopat,$43b5,0,$01            ;18:
            dcblw   dai4_act,dai4pat,$22c0,1,$24            ;19:
            dcblw   noko_act,nokopat,$43b5,2,$04            ;20:
            dcblw   dai4_act,dai4pat,$22c0,1,$34            ;21:
            dcblw   yukae_act,yukaepat,$44c3,0,$00          ;22:
            dcblw   fire6_act,fire6pat,$83d9,0,$64          ;23:
            dcblw   fire6_act,fire6pat,$83d9,11,$64         ;24:
            dcblw   ele_act,elepat,$047e,0,$04              ;25:
            dcblw   yukai_act,yukaipat,$42f0,0,$00          ;26:
            dcblw   scoli_act,scolipat,$8680,0,$11          ;27:
            dcblw   buta_act,butapat,$2302,0,$04            ;28:
            dcblw   save_act,savepat,$26bc,0,$01            ;29:
    
    *       dcblw   ring_act,playpat,$0780,50,$00           ;28:
    *       dcblw   usa_act,usapat,$0448,0,$00              ;5:
    *       dcblw   mawaru_act,mawarupat,$4348,16,$00       ;7:
    
    edit7tbl:
            dc.w    02      *13
            dcblw   ring_act,ringpat,$26bc,0,$00            ;1:
            dcblw   ring_act,ringpat,$26bc,8,$00            ;2:
    *       dcblw   bobin_act,bobinpat,$0380,0,$00          ;2:
    *       dcblw   usagi_act,flicpat,$05a0,0,$0a           ;3
    *       dcblw   usagi_act,flicpat,$05a0,0,$0b           ;4
    *       dcblw   usagi_act,flicpat,$05a0,0,$0c           ;5
    *       dcblw   usagi_act,usagipat,$0553,0,$0d          ;6
    *       dcblw   usagi_act,usagipat,$0553,0,$0e          ;7
    *       dcblw   usagi_act,pengpat,$0573,0,$0f           ;8
    *       dcblw   usagi_act,pengpat,$0573,0,$10           ;9
    *       dcblw   usagi_act,azarpat,$0585,0,$11           ;10
    *       dcblw   usagi_act,fbutapat,$0593,0,$12          ;11
    *       dcblw   usagi_act,niwapat,$0565,0,$13           ;12
    *       dcblw   usagi_act,risupat,$05b3,0,$14           ;13
     
    Last edited: Jan 3, 2025
    ProjectFM and Blue Gamer like this.
  13. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    So, in Sonic 1 (and also Sonic 2 Nick Arcade, where I got these symbols from), there's a label called "golepat" at the same location as other labels for various special stage blocks, right after the table that defines each block and its graphics. Now, I do believe that the signpost object was called "gole", and its sprite data was probably called "golepat"... so what's up with this one? My theory is that it's just some XDEF/XREF dickery happening here. For those not in the know, the Genesis Sonic games were built using an assembler and linker, and when you have a linker, source files are assembled/compiled individually, and then linked together to make the built program. An "XDEF" marks a symbol as visible to other modules when linking, and an "XREF" tells the assembler that the symbol being referenced comes from another module. In the case of this set of sprite data, what I am thinking is that there is a proper XDEF of the signpost version of "golepat" that can be XREF'd as desired, but here, I believe that the source file that holds the special stage sprite data and tables has its own contained "golepat" symbol specifically to be assigned with the rest of those other labels, and doesn't use an XREF to use the one from the signpost module.

    There are other examples of this sort of thing. For example, the ring object's initialization routine is called "ringinit", but so is the function that initializes the HUD's ring counter graphics. The leftover Chopper badnik's animation data is called "fishchg", but so is "bfish"'s. The stegosaurus badnik has a function called "checksonic", but so does the alligator badnik. The Emerald Hill boss has a function called "checkshoot", but so does the Buzzer badnik. Hell, in Sonic CD, Amy has her own version of "speedset", which is normally a global function that updates an object's movement, and also applies gravity, but in Amy's case, her own personal version just calls 2 separate functions called "speedsetx" and "speedsety", which just updates her movement, but on separate axes, and are also only visible to her.

    Last thing I will mention is that one of the other labels for the same set of sprites is called "warppat"... one of the blocks that uses it is the "W" block. Make of this info how you will.

    [​IMG]

    Also, here's what I think each label is supposed to represent:
    zonepat = unused ZONE blocks
    warppat = unused W block
    sprevpat = R (reverse) block
    golepat = GOAL block
    derupat = red/white ghost/gate block
    sp1uppat = unused 1-UP block
    sphashpat = red/white solid block
    koukapat = emerald sparkle
    breakpat = diamond block
    spuppat = UP block
    spdownpat = DOWN block
    metpat = ????????? (prototype leftover maybe?)
     
    Last edited: Jan 4, 2025
    ProjectFM, HipSnake and Blue Gamer like this.
  14. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    Bump, because I got this to share, from the Sonic 2 Nick Arcade ROM:
    Code:
    --------------------------------------------------------------------------
     Related assembler work data located around the assembled code (before?)
    --------------------------------------------------------------------------
    5410C - sisoo (assembler work)
    546F8 - wasp (assembler work)
    557B8 - seahorse, skyhorse (assembler work)
    56424 - redz (assembler work)
    5669C - wfish2 (assembler work)
    56CCC - gator (assembler work)
    57644 - bbat (assembler work)
    57FF8 - oct (assembler work)
    59304 - bossdriller, driller, drillerguy (assembler work)
    5A12C - snail (assembler work)
    5A718 - boss1, btama (assembler work)
    5B1FC - staff (assembler work)
    5C0B0 - bossba, billbomb (assembler work)
    --------------------------------------------------------------------------
    5C570 - staff (tail end of assembler work)
    5D000 - bossba, billbomb (assembler work)
    --------------------------------------------------------------------------
    5D781 - edit (source code)
    --------------------------------------------------------------------------
    60BE0 - Title screen logo mappings (tail end of data)
    60C20 - Title screen background mappings 1 (old version?)
    60EF8 - I have NO clue
    --------------------------------------------------------------------------
    62230 - pcol (assembler work)
    62C48 - masin (assembler work)
    65260 - sprscr, sprscractcnt, scrwkchk, scrcnt, sprmapset (assembler work)
    66548 - efectwrt, efectmove, efectblockset (assembler work)
    67894 - play01 (assembler work)
    68464 - edit (assembler work)
    69464 - score, scoreup, scoreset (assembler work)
    6B5C4 - mapinittbl, divdevtbl (assembler work)
    --------------------------------------------------------------------------
    Basically, a good chunk of the second "symbol table" is actually just scrap assembler work data for various source files. Any pointers listed as "assembler work" will point to assembled 68000 code, with related assembler data nearby (I think it's right before the assembled code). I did also find a tilemap at 0x60C20 that is meant to go with the title screen that doesn't match any other data in the ROM, or even like Sonic 1. It's also larger than the data that did get used for the ROM.

    But yeah, with this, you can find even more symbols, and also even earlier code! I did previously go through this and restored the earlier Emerald Hill boss with the weird janky bobbing animation that's handled by a small table:



    I also noticed that the earlier version of "efectwrt" found in this ROM segment actually calls the unused function for shifting Chemical Plant's background (called efectmove). I'll probably comb through more later, but if anyone would like to, I absolutely encourage anyone to take a look for themselves. You will need to go through the assembler work data in order to apply patches to the assembled 68000 code, but it can be reconstructed, as I have shown above.
     
    Last edited: Jan 9, 2025
    ProjectFM and Crimson Neo like this.
  15. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    So, I went ahead and extracted the older version of assembled code and assembler/linker data scraps that can be found in the second symbol table of Sonic 2 Nick Arcade. The data provided seems to be late into the build process, seeing as the assembled code already have their addresses resolved. Code and scrap work data are split out, and I did attempt to organize the scrap work data go with the modules they are supposed to go to.

    The scrap work data is made up of the following in this order:
    • Symbols located inside the module
    • Symbol XDEFs (symbols marked as visible to other modules)
    • Symbol XREFs (symbols referenced from other modules)
    The first one is simple, it's basically just a table of symbols and their offsets within the module. The last 2 are a bit more complex, but pretty easy to understand. You can differentiate them from the first one based on how much more info is packed with the symbol names.

    To find the XDEFs within the module, first go to the symbol name you wanna find, then scan back like 4 bytes, and then you'll find the offset.

    To find the XREFs within the module, first, go to the symbol name you wanna find. Then, you scan back past the list of longwords whose values are > 0x400000. From there, you will find the list of offsets, whose format is very simple: it starts with a count, and then it lists each offset in the module for that symbol.

    Symbol name lengths are stored in units of 4 bytes and are padded out accordingly (i.e. "sisoo", 5 characters, is padded to 8, with its length set to 8/4, or 2).

    I'm currently going through this myself and disassembling the code, while also figuring out the rest of the symbols that can be found here, and I do plan on posting my work on GitHub. But, if you wanna take a look for yourself, go crazy. I also made a couple of corrections to my address table for this ROM segment, as I accidentally left out the first 4 bytes in a couple of assembled code modules.
     
    ProjectFM and Crimson Neo like this.
  16. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    Presenting... an updated Sonic 2 Nick Arcade symbol dump!

    Turns out that the one that's easily accessible online, particularly on TCRF, is incomplete! I went ahead and went through the ROM myself and filled in the blanks the best I could. I also managed to figure out where certain parts of got cut-out, which allowed me to even correct an error or two. I did manage to find a couple more addresses at those cut-out spots, but they did not have names. However, through some pattern recognition, I was able to figure them out, except for one, which is 0x13606 (appears somewhere around (before?) kaiten).

    One interesting thing I found was that there's actually 2 versions of the "bossba" assembler/linker scrap work data hidden in the ROM. While the code is the same, the pointers are slightly different. As such, I've also updated their symbols as to document both versions. On top of that, I also found a section that contained several "JmpTo" instructions in groups at 0x4EA8C, which appears to have been created for yet another earlier build with slight address differences. Through further pattern recognition, I was able to find that one of them was for "actchkwk2", which is actually one of the symbols that was affected by the "bossba" thing, so it gets 3 unique values! Unfortunately, I could not figure out the names for 0x18A82 and 0x19A3C, as there's simply not enough context for them (both of them are in their own individual groups, all by themselves).

    Without further ado... enjoy!
    Code:
    bossvac             000000 (dummied out)
    vacumeguy           000000 (dummied out)
    explode             000000 (dummied out)
    ascii               0004E8
    bgmset              0012F6
    soundset            0012FC
    dmactrset           0013A0
    mapdevr             00170E
    random              002AF0
    sinset              002B16
    atan                002DAE
    burankoposiset      007D6A
    burankoposiset2     007DAE
    burankopat          007EAE
    buranko0dpat        007EDA
    ballpat             007F4A
    shimapat2           0084AE
    dai00pat            008556
    pltfrmpat           008C64
    frntlitpat          008E04
    kanipat             009C84
    hachipat            009FC2
    ringgetsub          00A236
    ringpat             00A54A
    itempat             00ABF0
    fishpat             00B11E
    togepat             00C17E
    jyamapat            00C202
    speedset            00C706
    speedset2           00C732
    actionsub           00C758
    frameoutchk         00C7AE
    frameoutchkd        00C81A
    frameout            00C88E
    patchg              00C89C
    spatsetsub          00CB26
    dualmodesub         00CFC2
    dualmodesub2        00CFDE
    ringcolchk          00D2F0
    actwkchk            00DAA2
    actwkchk2           00DAB8 | 00DAB0 | 00DAC8
    sjumppat            00E0B4
    banepat             00E12C
    kamerepat           00E4A8
    kagebpat            00E640
    goleset             00E80A
    musipat             00EA80
    atariridesub        00EB1C
    ridechksub_t        00EEC0
    jumpcolsub          00FDCC
    patchgmain          00FF82
    playwrt             01029A
    emycol_d            0128C6
    savepat             012D74
    bobinpat            013002
    colichg             01349C
    .jump$zdba          0134B6
    .frameoutd2$zdba    0134BE
    .frameout$zdba      0134D4
    .frameout2$zdba     0134E6
    colichg_move_tbl    0134EA
    colichgmove         01352A
    .loop$ceba          013556
    .jump2$ceba         013594
    .jump3$ceba         0135A2
    .jump4$ceba         0135C0
    .end2$ceba          0135D0
    .end1$ceba          0135D4
    .end$ceba           0135E0
    colichgtbl          0135E2
    colichgpat          013602
    kaiten              01364C
    kaiten_move_tbl     01365A
    kaiteninit          013660
    kaiteninit2         0136B4
    kaitenmove          0136C2
    .jump1$rdba         0136DA
    .jump2$rdba         0136E0
    kaitenmove2         0136EC
    .jump3$sdba         013706
    .jump4$sdba         01371E
    kaitenchg           013722
    kaitenchg0          013726
    kaitenchg1          01372E
    kaitenpat           013736
    kaitensp0           013740
    kaitensp1           01374A
    kaitensp2           013754
    kaitensp3           01375E
    kaitensp4           013768
    prodai              013774
    prodai_move_tbl     013782
    prodaiinit          013786
    prodaimove          0137E6
    .jump0$vdba         013806
    .jump$vdba          013824
    .jump2$vdba         013834
    .jump3$vdba         013838
    .jump4$vdba         01384A
    prodaipat           01385E
    prodaisp0           013860
    gem                 013874
    gem_move_tbl        013882
    geminit             013886
    gemmove             0138AE
    gemfoutchk          0138C2
    gempat              0138DA
    gemsp00             0138DC
    wfall               0138F0
    wfall_move_tbl      0138FE
    wfallinit           013904
    .sub$rdba           01396C
    .worknai$rdba       0139AE
    .end$rdba           0139B0
    wfallmove           0139CA
    .jump$sdba          0139E2
    .jump2$sdba         0139FC
    .jump5$sdba         013A14
    .jump4$sdba         013A1C
    .jump3$sdba         013A34
    wfallmove2          013A54
    wfallpat            013A6C
    wfallsp19           013AA4
    wfallsp00           013AA6
    wfallsp01           013AB0
    wfallsp02           013AC2
    wfallsp03           013AD4
    wfallsp04           013AEE
    wfallsp05           013B08
    wfallsp06           013B2A
    wfallsp07           013B4C
    wfallsp08           013B76
    wfallsp09           013BA0
    wfallsp10           013BD2
    wfallsp11           013C04
    wfallsp12           013C3E
    wfallsp13           013C78
    wfallsp14           013CBA
    wfallsp15           013CFC
    wfallsp16           013D46
    wfallsp17           013D46
    wfallsp18           013D46
    wfallsp20           013D58
    wfallsp21           013D62
    wfallsp22           013D6C
    wfallsp23           013D7E
    wfallsp24           013D90
    wfallsp25           013DAA
    wfallsp26           013DC4
    wfallsp27           013DE6
    sloop               013E08
    .frameoutd$wdba     013E1E
    .frameout$wdba      013E32
    sloop_move_tbl      013E38
    sloopinit           013E3C
    sloopmove           013E46
    .sub$zdba           013E54
    .left$zdba          013E7C
    .right$zdba         013E8A
    .jump$zdba          013E96
    .plrideon$zdba      013EAE
    .left2$zdba         013EBC
    .right2$zdba        013ECA
    .jump0$zdba         013ED6
    .end$zdba           013EEC
    .rideon$zdba        013EEE
    .jumps$zdba         013EF6
    .jump1$zdba         013F18
    .jump2$zdba         013F24
    sloopdirtbl         013F56
    slooptbl            013F8A
    sisoo               01412C
    sisoo_move_tbl      014152
    sisooinit           01415E
    .worknai$feba       0141B8
    .jump$feba          0141C6
    sisoomove           0141CC
    .rideon$geba        0141D8
    .jump$geba          0141EC
    .jump2$geba         0141F4
    .jump3$geba         014210
    .jump4$geba         014218
    .jump44$geba        014222
    .noride$geba        014226
    .jump5$geba         014242
    .jump6$geba         01424A
    .jump7$geba         01424A
    .jump8$geba         014262
    sisooride           01427E
    sisoosub            014280
    .jump$ieba          014294
    sisoosub2           01429C
    .jump2$ieba         01429C
    .jump3$jeba         0142A8
    .end$jeba           0142C6
    sballinit           0142C8
    .jump$keba          014328
    sballwait           014328
    .jump$leba          01433C
    .jump3$leba         014362
    .jump2$leba         014378
    .jump4$leba         01437E
    .jump0$leba         01439C
    sballmove           0143BC
    .up$meba            0143C2
    .end$meba           0143D8
    .down$meba          0143DA
    .jump0$meba         0143FA
    .jump$meba          014418
    .jump1$meba         014434
    .jump2$meba         014442
    .jump3$meba         01444E
    .sub$meba           014450
    sballtbl            014480
    sisootbl            01448A
    sisootbl2           0144BB
    sisoopat            0144EC
    sisoosp0            0144F4
    sisoosp1            014536
    sballpat            014578
    sballsp0            01457C
    sballsp1            01457C
    water               014588
    water_move_tbl      014596
    waterinit           01459A
    watermove           0145C2
    .jump0$ceba         0145E4
    .jump1$ceba         0145F4
    .jump2$ceba         0145F4
    waterpattbl         014614
    waterpat            014654
    watersp0            014660
    watersp1            01467A
    watersp2            014694
    watersp3            0146AE
    watersp4            0146E0
    watersp5            014712
    taki                014744
    taki_move_tbl       014752
    takiinit            014756
    takimove            014790
    .frameoutd$oeba     0147AA
    .jump$oeba          0147DC
    .end$oeba           0147EE
    takipat             0147F6
    takisp00            0147FE
    takisp01            014810
    takisp02            014882
    takisp03            014884
    stego               0148D0
    stego_move_tbl      0148DE
    stegoinit           0148E2
    .end$pdba           014930
    stegomove           014932
    stegomove_tbl       01494E
    stego_0             014952
    .jump$sdba          014974
    stego_1             014976
    .end$tdba           01499A
    .jump2$tdba         01499C
    checksonic          0149C0
    .lft$udba           0149CA
    .out$udba           0149E4
    .out0$udba          0149E6
    .rt$udba            0149F4
    .out1$udba          014A10
    stegochg            014A1E
    stegochg00          014A24
    stegochg01          014A32
    stegochg02          014A35
    stegopat            014A3A
    stegosp00           014A4A
    stegosp01           014A74
    stegosp02           014A9E
    stegosp03           014AC8
    stegosp04           014AF2
    stegosp05           014B1C
    stegosp06           014B46
    stegosp07           014B68
    bfish2              014BA0
    bfish               014BA0
    fish2_move_tbl      014BAE
    fish2init           014BB4
    fish2move           014C2C
    .jump$ydba          014C2C
    .skip$zdba          014C38
    .jump$zdba          014C5A
    fish2jump           014C9C
    .level$aeba         014CF4
    .below$aeba         014D08
    .join$aeba          014D22
    waterspeedset       014D4C
    .sub$beba           014D80
    .cnt$beba           014D88
    fishchg             014D9A
    fishchg0            014DA2
    fishchg1            014DA6
    fishchg2            014DAA
    fishchg3            014DAE
    bfish2pat           014DB2
    bfishpat            014DB2
    fish1sp0            014DBA
    fish1sp1            014DC4
    fish1sp2            014DCE
    fish1sp3            014DD8
    redz                014DF8
    redz_move_tbl       014E06
    redzinit            014E0C
    .end$pdba           014E60
    redzmove            014E62
    .frameout$qdba      014E92
    .frameout2$qdba     014EA4
    redzmove_tbl        014EA8
    redz_0              014EAC
    .jump$sdba          014ECE
    redz_1              014ED0
    .end$tdba           014EEA
    .jump2$tdba         014EEC
    redzdie             014F04
    redzchg             014F08
    redzchg0            014F0C
    redzchg1            014F0F
    redzpat             014F16
    redzsp0             014F1C
    redzsp1             014F26
    redzsp2             014F30
    seahorse            014F5C
    seahorse_move_tbl   014F6A
    seahorseinit        014F76
    .worknai$vdba       01502E
    seahorsemove        01502E
    seahorsemove_tbl    015054
    seahorsewings       01505A
    seahorseshot        015084
    seahorseswim        01509A
    seahorsefloat       0150AC
    seahorseattack      0150BA
    chkshot             0150CC
    .end$deba           0150D8
    .makeshot$deba      0150DA
    .ok$deba            01513A
    .worknai$deba       015146
    chkatkdone          015148
    .end$eeba           01516E
    chkatack            015170
    .toleft$feba        01519E
    .toright$feba       0151AE
    .edge$feba          0151BC
    .end$feba           0151D6
    chkfloat            0151D8
    .vel$geba           0151F4
    .end$geba           0151F8
    chkfltdone          0151FA
    .end$heba           015216
    .down$heba          015218
    fixwings            01522C
    .normal$ieba        01525C
    shotdrops           015266
    hitground           01527C
    .end$keba           015296
    oilslip             0152A2
    updatoil            0152A6
    .end$oeba           0152E2
    .done$oeba          0152E4
    landedyet           0152F2
    .end$peba           015330
    chkflip             015332
    .jump$qeba          01534E
    chkhit              015350
    .loop$reba          01535A
    .left$reba          0153B8
    .r1$reba            0153C6
    .worknai$reba       0153CC
    .out$reba           0153EE
    .end$reba           0153F2
    horsechg            0153F4
    seahorsechg0        015404
    seahorsechg1        015407
    horsechg2           01540F
    seahorsechg3        015415
    seahorsechg4        015419
    seahorsechg5        01541C
    skyhorsechg0        01541F
    skyhorsechg1        015423
    horsepat            01542C
    seahorsesp00        015446
    seahorsesp01        015460
    seahorsesp02        01546A
    seahorsesp03        015474
    seahorsesp04        015496
    horsesp05           0154B8
    horsesp06           0154C2
    horsesp07           0154CC
    horsesp08           0154D6
    skyhorsesp00        0154E0
    skyhorsesp01        015502
    skyhorsesp02        015524
    skyhorsesp03        01554E
    skyhorse            015578
    skyhorse_move_tbl   015586
    skyhorseinit        015592
    skyhorsemove        0155F0
    skyhorsemove_tbl    015610
    skyhorseshot        015614
    skyhorsefly         015628
    skyhorseattack      01563E
    shotstatus          015654
    .done$bgba          015668
    getposition         01567A
    .toleft$cgba        01569A
    .setbehind$cgba     0156A2
    .next$cgba          0156A6
    .above$cgba         0156C6
    .out$cgba           0156CA
    chkshoot            0156CC
    .end$dgba           0156F0
    makeshot            0156F2
    .ok$egba            01574E
    .worknai$egba       01575A
    seeksonic           01575C
    .above$fgba         015768
    .speed$fgba         015784
    .below$fgba         01578C
    .negspeed$fgba      0157A8
    .end$fgba           0157B0
    .out$fgba           0157BA
    wasp                0157E0
    wasp_move_tbl       0157F2
    waspshot            0157FA
    waspafterb          01580C
    .cnt$feba           01581E
    waspinit            015844
    .done$geba          0158E6
    waspmove            0158E8
    waspmove_tbl        015904
    waspfly             015908
    .here$jeba          015926
    .end$jeba           01592C
    .here2$jeba         01592E
    checkshoot          01594A
    .cnt$keba           015960
    .toleft$keba        01597A
    .sht$keba           015982
    .out$keba           015996
    waspshoot           015998
    .done$leba          0159AC
    .here$leba          0159B2
    .out$leba           015A16
    waspchg             015A18
    waspchg00           015A20
    waspchg01           015A23
    waspchg02           015A27
    waspchg03           015A2B
    wasppat             015A34
    waspsp00            015A42
    waspsp01            015A54
    waspsp02            015A6E
    waspsp03            015A88
    waspsp04            015A92
    waspsp05            015A9C
    waspsp06            015AA6
    oct                 015AC8
    oct_move_tbl        015AD6
    octshot             015ADE
    .cnt$pdba           015AE8
    octeye              015AFA
    octinit             015B06
    .end$rdba           015B64
    octmove             015B6C
    octmove_tbl         015B88
    octstand            015B90
    .done$udba          015BAE
    octfly              015BB0
    .end$vdba           015BD0
    octshoot            015BD2
    .end0$wdba          015C38
    .end$wdba           015C9C
    .out$wdba           015C9E
    octleave            015CA4
    .cnt$xdba           015CB2
    octchg              015CBA
    octchg00            015CC0
    octchg01            015CC3
    octchg02            015CC8
    octpat              015CCC
    octsp00             015CDA
    octsp01             015CEC
    octsp02             015D06
    octsp03             015D20
    octsp04             015D3A
    octsp05             015D44
    octsp06             015D4E
    bbat                015D78
    bat_move_tbl        015D86
    batinit             015D8C
    batmove             015DCA
    batmove_tbl         015DEA
    setposi             015DF0
    seekchk             015E0A
    .end$xdba           015E36
    batattack           015E38
    fixme               015E58
    .end$zdba           015E6A
    attackchk           015E6C
    .cnt$aeba           015E90
    .end$aeba           015EB6
    .gone$aeba          015EB8
    .norm$aeba          015EC4
    direcchg            015ED8
    .end$beba           015EF0
    .rt$beba            015EF2
    .done$beba          015F06
    moveset             015F36
    bathover            015F56
    .end$deba           015F8C
    batflap             015F8E
    .end$eeba           015F98
    batseek             015F9A
    .here$feba          015FC8
    .cnt$feba           015FE0
    batchg              015FE2
    batchg00            015FEA
    batchg01            015FEE
    batchg02            015FFD
    batchg03            01600E
    bbatpat             016016
    batsp00             016034
    batsp01             016056
    batsp02             016078
    batsp03             01609A
    batsp04             0160BC
    batsp05             0160D6
    batsp06             0160F8
    batsp07             01611A
    batsp08             01613C
    batsp09             01615E
    batsp10             016178
    batsp11             016192
    batsp12             0161AC
    batsp13             0161BE
    batsp14             0161D0
    gator               016200
    gator_move_tbl      01620E
    gatorinit           016212
    .end$pdba           016260
    gatormove           016262
    gatormove_tbl       01627E
    gator_0             016282
    .jump$sdba          0162A4
    gator_1             0162A6
    .end$tdba           0162C4
    .jump2$tdba         0162C6
    checksonic          0162DE
    .lft$udba           0162E8
    .rt$udba            0162F8
    .set$udba           016306
    .out$udba           01630E
    gatorchg            016316
    gatorchg00          01631C
    gatorchg01          016324
    gatorchg02          016327
    gatorpat            016330
    gatorsp00           016348
    gatorsp01           01636A
    gatorsp02           01638C
    gatorsp03           0163AE
    gatorsp04           0163D0
    gatorsp05           0163F2
    gatorsp06           016414
    gatorsp07           016436
    gatorsp08           016458
    gatorsp09           01647A
    gatorsp10           01649C
    gatorsp11           0164BE
    wfish2              0164F8
    wfish_move_tbl      01650A
    wfishinit           01650E
    wfishmove           016548
    .jump$beba          016570
    .jump2$beba         016592
    wfishchg            016594
    wfishchg0           01659A
    wfishchg1           01659E
    wfishchg2           0165A2
    wfish2pat           0165A6
    fishsp0             0165AA
    fishsp1             0165C4
    snail               0165F8
    snail_move_tbl      01660A
    snailinit           016614
    .out1$deba          016694
    .cnt$deba           0166A6
    snailmove           0166AC
    .jump$eeba          0166D8
    chkcharge           0166F4
    .toleft$feba        016712
    .toright$feba       01671C
    .doit$feba          016724
    .done$feba          016736
    makeafb             016738
    .out$geba           016790
    afbupdate           016792
    .cnt$heba           0167BA
    snailturn           0167CC
    updateparts         016804
    snailchg            01682C
    snailchg0           016830
    snailchg1           016834
    snailpat            016838
    snailsp0            01683E
    snailsp1            016850
    snailsp2            016862
    bossdriller         016890 | 016888
    bossdrillmove_tbl   01689E
    moveonscreen        0168AA
    .done$oeba          0168C2
    joincar             0168D0
    join_tbl            0168DE
    joinland            0168E2
    .joined$reba        0168F4
    joinadjust          016908
    movecar             01692C
    tbl                 01696C
    deathstart          016970
    .jump$veba          016978
    .end$veba           0169A4
    deathdrop           0169A6
    flyaway             0169C0
    flyaway_tbl         0169D2
    initrotors          0169D8
    takeoff             016A4C
    .end$afba           016A64
    runaway             016A66
    .out$bfba           016A7A
    checkflip           016A7C
    .off$cfba           016A8C
    .done$cfba          016A9C
    checkhit            016A9E
    .jump$dfba          016AC8
    .jump1$dfba         016AD6
    .jump2$dfba         016AE4
    .die$dfba           016AE6
    driller             016B00
    driller_tbl         016B0E
    growrotors          016B18
    sticktoboss         016B3C
    stick_tbl           016B4A
    normal              016B4E
    .cnt$ofba           016B72
    retract             016B98
    .done$pfba          016BB4
    carbody             016BC2
    tiremove            016C04
    tiremove_tbl        016C12
    tiresit             016C1A
    tireroll            016C38
    .cnt$ufba           016C5A
    tireexplode         016C70
    tirebounce          016CA0
    .end$wfba           016CBE
    drill               016CC2
    .cnt$xfba           016D10
    .movedrill$xfba     016D22
    .cnt3$xfba          016D30
    checkshoot          016D42
    .chkset$yfba        016D4C
    .right$yfba         016D56
    .left$yfba          016D60
    .set$yfba           016D6A
    makewheels          016D72
    .worknai1$zfba      016DE6
    .worknai2$zfba      016E5A
    .worknai3$zfba      016ECE
    .worknai4$zfba      016F2A
    drillerguy          016F2C | 016F24
    .worknai$cgba       016F70
    .worknai2$cgba      016FD0
    bosshelichg         016FD2
    bosshelichg0        016FD8
    bosshelichg1        016FDC
    bosshelichg2        016FF2
    bosshelipat         01700C
    bosshelisp00        01701A
    bosshelisp01        017024
    bosshelisp02        01704E
    bosshelisp03        017078
    bosshelisp04        017092
    bosshelisp05        0170AC
    bosshelisp06        0170C6
    bossdrillchg        0170E0
    bossdrillchg0       0170E6
    bossdrillchg1       0170EB
    bossdrillchg2       0170EF
    bossdrillpat        0170F4
    bossdrillsp0        017104
    bossdrillsp1        01711E
    bossdrillsp2        017128
    bossdrillsp3        017132
    bossdrillsp4        01713C
    bossdrillsp5        017146
    bossdrillsp6        017150
    bossdrillsp7        01715A
    bossba              017194 | 01718C
    bossba_move_tbl     0171A2 | 01719A
    bossbainit          0171AC | 0171A4
    .cnt$geba           0171F8 | 0171F0
    .cnt2$geba          01725C | 017254
    .worknai$geba       0172B0 | 0172A8
    bossbaappendage     0172C2 | 0172BA
    bossbamove          0172CA | 0172C2
    bossbamove_tbl      017300 | 0172F8
    bossbatop           017308 | 017300
    afbtbl              017336 | 01732E
    bossafb             01733A | 017332
    .cnt$neba           017378 | 017370
    .jump$neba          017382
    .hurt$neba          01738E | 017386
    .here$neba          01739C | 017394
    bosssm              0173D8 | 0173D0
    .jump$oeba          01741A
    billbomb            01741E | 017416
    billbomb_tbl        01742C | 017424
    billbombinit        017430 | 017428
    billbombmove        017468 | 017460
    .jump$seba          017482 | 01747A
    bossafbpat          017486 | 01747E
    afbsp00             01748A | 017482
    afbsp01             017494 | 01748C
    bosssmpat           01749E | 017496
    smbsp00             0174A6 | 01749E
    smbsp01             0174B0 | 0174A8
    smbsp02             0174BA | 0174B2
    smbsp03             0174C4 | 0174BC
    billbombpat         0174CE | 0174C6
    bossbmsp00          0174DC | 0174D4
    bossbmsp01          0174E6 | 0174DE
    bossbmsp02          0174F0 | 0174E8
    bossbmsp03          0174FA | 0174F2
    bossbmsp04          017504 | 0174FC
    bossbmsp05          01750E | 017506
    bossbmsp06          017518 | 017510
    bossbachg           017522 | 01751A
    bossbachg1          017526 | 01751E
    bossbachg2          017529 | 017521
    bossbapat           01752E | 017526
    bossbasp00          017534 | 01752C
    bossbasp01          017556 | 01754E
    bossbasp02          017578 | 017570
    staff               0175A8
    staff_move_tbl      0175B6
    staff_init          0175BA
    staff_move          017628
    .jump$ndba          017628
    staffpat            01762E
    staffsp00           017644
    staffsp01           0176B6
    staffsp02           017738
    staffsp03           01778A
    staffsp04           01784C
    staffsp05           0178EE
    staffsp06           0179C0
    staffsp07           017A7A
    staffsp08           017B74
    staffsp09           017BEE
    staffsp10           017C30
    boss1               017CC4
    boss1_move_tbl      017CD2
    boss1tbl            017CDA
    boss1init           017CE0
    .loop$kdba          017CEA
    .jump$kdba          017CF2
    .worknai$kdba       017D38
    boss1move           017D50
    boss1move_tbl       017D82
    boss1_0             017D90
    boss_ysub           017DAC
    .end$ndba           017DAC
    .jump$odba          017DF4
    .jump1$odba         017E02
    .jump2$odba         017E10
    .die$odba           017E12
    bossbomb            017E26
    .worknai$pdba       017E68
    .jump$pdba          017E68
    speedset_m          017E6A
    boss1_1             017E90
    .worknai$rdba       017ED6
    .end$rdba           017EDC
    boss1_2             017EE0
    .jump$sdba          017F0A
    .jump2$sdba         017F16
    boss1_3             017F1A
    .jump2$tdba         017F26
    .end$tdba           017F3C
    boss1_4             017F40
    .jump$udba          017F4A
    .end$udba           017F70
    boss1_5             017F72
    .falling$vdba       017F7A
    .turn$vdba          017F82
    .rise_up$vdba       017F88
    .go_up$vdba         017FA0
    .fire$vdba          017FA8
    .exit$vdba          017FB6
    boss1_6             017FBE
    .jump$wdba          017FD8
    .jump2$wdba         017FDE
    .frameout$wdba      017FE6
    boss1oyaji          017FEE
    .pass0$xdba         018008
    .pass1$xdba         018010
    .pass2$xdba         01801A
    .jump$xdba          018024
    .jump0$xdba         018038
    .frameout$xdba      01803A
    boss1fire           018040
    .jump0$ydba         018060
    .jump$ydba          01806C
    .frameout$ydba      01806E
    boss1sub            018074
    btama               0180AE
    btama_move_tbl      0180BC
    btamainit           0180C6
    .loop$jeba          0180F6
    .jump$jeba          018132
    .worknai$jeba       01815C
    btamalentbl         018188
    btamamove           01818E
    .loop$leba          01819A
    .jump$leba          0181B4
    .jump2$leba         0181CE
    .jump3$leba         0181DA
    btamamove2          0181EE
    btamasub            0181FE
    .pass$neba          018210
    .jump$neba          01823A
    btamakusari         01823C
    .jump$oeba          018252 | 017412
    btamatama           018258
    .jump0$peba         018262
    .jump$peba          01828A
    boss1chg            018290
    boss1chg0           0182A8
    boss1chg1           0182AB
    boss1chg2           0182AF
    boss1chg3           0182B3
    boss1chg4           0182B7
    boss1chg5           0182BB
    boss1chg6           0182BF
    boss1chg7           0182C3
    boss1chg8           0182C6
    boss1chg9           0182CA
    boss1chg10          0182CE
    boss1chg11          0182D1
    boss1pat            0182DC
    boss1sp0            0182F6
    boss1sp1            018328
    boss1sp2            01833A
    boss1sp3            01834C
    boss1sp4            018366
    boss1sp5            018380
    boss1sp6            01839A
    boss1sp7            0183B4
    boss1sp8            0183D6
    boss1sp9            0183E0
    boss1sp10           0183EA
    boss1sp11           0183EC
    boss1sp12           0183FE
    boss2pat            018410
    boss2sp0            018420
    boss2sp1            01842A
    boss2sp2            01843C
    boss2sp3            018446
    boss2sp4            018450
    boss2sp5            01845A
    boss2sp6            01847C
    boss2sp7            01848E
    masin               0184AC
    .frameout$edba      0184D2
    masin_move_tbl      0184D8
    masintbl            0184E8
    masininit           0184F8
    .end$hdba           018544
    masinmove           018546
    .jump$idba          018564
    .jump2$idba         01857A
    masinswitch         018582
    .jump$jdba          0185E8
    masinbomb           0185EA
    masincenter         0185EA
    masincenter2        0185EA
    .worknai$mdba       018628
    .jump$mdba          018628
    .end$mdba           01862E
    .bombend$mdba       018630
    .lp$mdba            018656
    .no_work_left$mdba  018680
    masinusagi          018682
    .pass$ndba          0186B6
    .worknai$ndba       0186C0
    .jump$ndba          0186C0
    .end$ndba           0186D0
    masinclear          0186D2
    .lp$odba            0186DC
    .end$odba           0186F2
    masinchg            0186F4
    masinchg0           0186F8
    masinchg1           0186F8
    masinpat            0186FC
    masinsp0            01870A
    masinsp1            018744
    masinsp2            01874E
    masinsp3            018780
    masinsp4            01878A
    masinsp5            01879C
    masinsp6            0187A6
    pcol                0187B0
    .jump0$ldba         0187DA
    .loop$ldba          0187E8
    .jump$ldba          0187EE
    .colitbl$ldba       0187FA
    .jump2$ldba         018842
    .jump3$ldba         018864
    .jump4$ldba         01886A
    .jump5$ldba         018882
    .atari$ldba         018888
    pcolitem            0188A2
    .ring$mdba          0188B0
    .ringe$mdba         0188C0
    .item$mdba          0188C2
    .item2$mdba         0188EE
    .iteme$mdba         018900
    pcolnomal           018902
    .jump$ndba          01891A
    .jump4$ndba         018942
    .jump0$ndba         018944
    .jump5$ndba         01895C
    .jump6$ndba         018976
    .jump3$ndba         018986
    .jump1$ndba         01899C
    .jump2$ndba         0189A4
    escoretbl           0189AC
    pcolplay2           0189B4
    pcolplay            0189BA
    pcolend             0189C0
    pcole               0189C4
    playdamageset       0189CE
    .worknai$tdba       0189F6
    .damage$tdba        0189F6
    .jump0$tdba         018A2C
    .jump$tdba          018A3A
    .jump2$tdba         018A60
    .end$tdba           018A66
    .die$tdba           018A6A
    playdieset          018A72
    .jump2$udba         018AC0
    .end$udba           018AC6
    pcolspecial         018ACA
    .imo$vdba           018AEC
    .yado$vdba          018AF0
    .yado1$vdba         018B0A
    .yado2$vdba         018B16
    .yado3$vdba         018B1A
    .yado4$vdba         018B1E
    .bobin$vdba         018B22
    .bobin2$vdba        018B2E
    .bou$vdba           018B34
    sprscr              018B48
    .loop$ndba          018B98
    .loop2$ndba         018BBA
    sprscre             018BDC
    sprscrset           018BDC
    .loop$pdba          018C06
    .loop2$pdba         018C0A
    .jump$pdba          018C62
    .end$pdba           018C82
    sprscractcnt        018C8A
    .loop$qdba          018C9E
    .jump2$qdba         018CC2
    .jump4$qdba         018CDE
    .jump5$qdba         018D20
    .jump3$qdba         018D4A
    scractofftbl        018E34
    scrwkchk            018EB4
    .loop$sdba          018EBE
    .jump$sdba          018EC8
    scrcnt              018ECA
    .loop$tdba          018ED4
    .jump$tdba          018EE2
    scracttbl           018EEA
    scr_ring            018F02
    .end$vdba           018F2A
    .jump$vdba          018F2A
    scr_ringtbl         018F2C
    scr_bobin           018F32
    .jump$xdba          018F5E
    .end$xdba           018F60
    scr_bobintbl        018F62
    scr_1up             018F68
    .end$zdba           018F90
    .jump$zdba          018F90
    scr_1uptbl          018F92
    scr_revers          018F98
    .jump$beba          018FC4
    .end$beba           018FC6
    scr_reverstbl       018FC8
    scr_houseki         018FCE
    .jump$deba          019006
    .end$deba           019006
    scr_housekitbl      019008
    scr_break           01900E
    .jump$feba          01903A
    .end$feba           01903A
    scr_breaktbl        01903C
    sprmapsettbl        019046
    sprplaypositbl      01905E
    sprmapset           019076
    .jump$jeba          01908E
    .loop0$jeba         0190A4
    .jump0$jeba         0190AC
    .jump2$jeba         0190B0
    .loop$jeba          0190DC
    .loop1$jeba         0190F0
    .loop2$jeba         0190F2
    scrpatset           019100
    .loop$keba          01910E
    scrcntclr           019120
    .loop$leba          01912A
    scrpattbl           019132
    metpat              019306
    sprevpat            019306
    zonepat             019306
    derupat             019306
    sp1uppat            019306
    golepat             019306
    warppat             019306
    golesp0             01930C
    golesp1             019312
    derusp2             019318
    sphashpat           01931A
    koukapat            01931A
    breakpat            01931A
    koukasp0            019322
    sphashsp0           019322
    koukasp1            019328
    sphashsp1           019328
    koukasp2            01932E
    koukasp3            019334
    spuppat             01933A
    spupsp0             01933E
    spupsp1             019344
    spdownpat           01934A
    spdownsp0           01934E
    spdownsp1           019354
    hous0pat            01935A
    hous1pat            01935E
    hous2pat            019362
    sphoussp0           019366
    sphoussp1           01936C
    sphoussp2           019372
    sphoussp3           019378
    play01              019380
    .jump$neba          01938E
    play01_move_tbl     01939C
    play01init          0193A4
    play01move          0193E4
    .jump5$qeba         0193F8
    play01move_tbl      01941C
    play01walk          019420
    play01jump          01942E
    play01sub           01943A
    splevermove         019460
    .jump5$veba         01946C
    .jump6$veba         019478
    .right$veba         01948A
    .right2$veba        019494
    .left$veba          01949A
    .left2$veba         0194A4
    .jump7$veba         0194A8
    .jump$veba          0194F2
    spplwalk_l          0194F8
    .left$weba          019506
    .left2$weba         019514
    .right$weba         01951A
    .right2$weba        019522
    spplwalk_r          019528
    .right$xeba         019534
    .right2$xeba        019542
    .left$xeba          019548
    .left2$xeba         019550
    .rightcol$xeba      019554
    spjumpchk           019556
    .end$yeba           019598
    spjumpchk2          01959A
    .end$zeba           0195B4
    playscr             0195B6
    .jump$afba          0195CE
    .jump2$afba         0195DE
    play01gole          0195E0
    .jump0$bfba         0195F4
    .jump$bfba          019612
    play01gole2         019634
    .end$cfba           019640
    rotspdset           019656
    .jump2$dfba         0196B0
    .jump3$dfba         0196C6
    .jump4$dfba         0196D4
    spcol               0196E8
    spcol2              0196E8
    spcolsub            019730
    .end$gfba           019744
    .jump2$gfba         019746
    spcol_ev            019752
    spcolsub_ev         01978C
    .worknai$ifba       0197A0
    .jump$ifba          0197C4
    .jump2$ifba         0197C8
    .worknai2$ifba      0197DC
    .jump3$ifba         0197F2
    .worknai3$ifba      01980C
    .jump33$ifba        01982A
    .jump4$ifba         019838
    .jump5$ifba         019844
    .jump6$ifba         019858
    derusub             01985C
    .loop1$jfba         01986C
    .loop2$jfba         01986E
    .jump$jfba          019878
    .end$jfba           019886
    bobinchk            01988E
    .jmp$kfba           0198A0
    .jmp2$kfba          0198AC
    .jump$kfba          0198AE
    .worknai$kfba       01991C
    .jump2$kfba         019926
    .jump3$kfba         01993C
    .jump33$kfba        019966
    .jump4$kfba         019970
    .jump44$kfba        01999A
    .jump5$kfba         0199A4
    .worknai2$kfba      0199CC
    .jump6$kfba         0199DA
    .jump66$kfba        0199F2
    .jump666$kfba       019A12
    .worknai3$kfba      019A16
    .end$kfba           019A20
    .jump7$kfba         019A20
    play02              019A22
    efectwrt            019A2C
    .end$wdba           019A4A
    efecttbl            019A4C
    efstagea            019A8C
    efstageb            019A8C
    efstagec            019A8C
    efstagee            019A8C
    efstagef            019A8C
    efstage1            019A8C
    efstage5            019A8C
    efstage6            019A8C
    efstage7            019A8C
    efstage9            019A8C
    efstage0            019A8E
    efstaged            019A90
    efstage2            019A90
    efstage3            019A90
    efstage4            019A90
    efstage8            019A90
    .loop$neba          019A96
    .jump$neba          019AAC | 01737A
    .jump1$neba         019ABA
    .jump2$neba         019ADC
    .jump3$neba         019AE6
    efecttbl0           019AF8
    efecttbl3           019AF8
    efecttbl4           019B56
    efecttbl8           019B56
    efecttbl1           019B82
    efecttbl2           019B82
    efecttbl5           019B82
    efecttbl6           019B82
    efecttbl7           019B82
    efecttbl9           019B82
    efecttbla           019B82
    efecttblb           019B82
    efecttblc           019B82
    efecttbld           019B82
    efecttble           019B82
    efecttblf           019B82
    efectmove           019BEA
    .end$efba           019BF2
    .jump$efba          019BF4
    .sub$efba           019C24
    .loop$efba          019C28
    efectblockset       019CBE
    .loop$ffba          019CE0
    .end$ffba           019CE6
    .loop2$ffba         019CE8
    efectblocktbl       019D00
    zone00pcblk         019D20
    zone03pcblk         019D20
    zone0apcblk         019D5C
    zone0bpcblk         019D5C
    zone0cpcblk         019D5C
    zone0epcblk         019D5C
    zone0fpcblk         019D5C
    zone09pcblk         019D5C
    zone07pcblk         019D5C
    zone01pcblk         019D5C
    zone05pcblk         019D5C
    zone06pcblk         019D5C
    zone0dpcblk         019E9A
    zone02pcblk         019E9A
    zone08pcblk         019F7E
    zone04pcblk         019F7E
    score               01A074
    score_move_tbl      01A082
    score_init          01A086
    score_move          01A0B4
    .jump0$udba         01A0CE
    .jump$udba          01A0D8
    .jump2$udba         01A0EE
    scorepat            01A0F8
    scoresp0            01A100
    scoresp1            01A152
    scoresp2            01A1A4
    scoresp3            01A1F6
    scoreup             01A248
    .jump$aeba          01A260
    .jumpus$aeba        01A288
    .jump0$aeba         01A288
    scoreset            01A28A
    .jump$beba          01A2B2
    .jump1$beba         01A2BE
    .jump2$beba         01A2D2
    .jump3$beba         01A30E
    .jump4$beba         01A32E
    .jump5$beba         01A33C
    .jump6$beba         01A364
    .timeover$beba      01A366
    scoreset2           01A37C
    .jump1$ceba         01A38C
    .jump2$ceba         01A3A0
    .jump3$ceba         01A3B0
    .jump4$ceba         01A3BE
    .jump5$ceba         01A3E6
    ringinit            01A3E8
    scoreinit           01A3FC
    scoreinitsub        01A418
    .loop$feba          01A41C
    .loop1$feba         01A42C
    .jump$feba          01A432
    .loop2$feba         01A438
    .spaceset$feba      01A438
    scoreinittbl        01A444
    ringinittbl         01A450
    posiwrt             01A454
    hexwrtw             01A47C
    .loop$jeba          01A484
    .jump$jeba          01A496
    .jump5$jeba         01A4AC
    ringwrt             01A4B4
    scorewrt            01A4BE
    scorewrt2           01A4C6
    .loop$meba          01A4CC
    .jump2$meba         01A4D0
    .jump3$meba         01A4D8
    .jump4$meba         01A4E2
    .jump5$meba         01A510
    contwrt             01A51C
    .loop$neba          01A53A
    .jump2$neba         01A53E
    .jump3$neba         01A546
    subtbl              01A574
    subtbl4             01A57C
    subtbl3             01A580
    subtbl2             01A584
    subtbl1             01A588
    timewrt1            01A58C
    timewrt             01A594
    timewrt0            01A59A
    .loop$veba          01A5A0
    .jump2$veba         01A5A4
    .jump3$veba         01A5AC
    .jump4$veba         01A5B6
    bonuswrt            01A5EC
    .loop$weba          01A5F8
    .jump2$weba         01A5FC
    .jump3$weba         01A604
    .jump4$weba         01A60E
    .jump5$weba         01A638
    .jump7$weba         01A63E
    .loop2$weba         01A640
    playsuuwrt          01A64C
    .loop$xeba          01A664
    .jump2$xeba         01A66C
    .jump3$xeba         01A674
    .jump4$xeba         01A67E
    .jump5$xeba         01A682
    .jump6$xeba         01A698
    .jump7$xeba         01A6A4
    .loop2$xeba         01A6AA
    scorewrtcg          01A6B6
    playsuucg           01A9B6
    edit                01AB00
    edit_move_tbl       01AB0E
    editinit            01AB12
    .jump0$ydba         01AB58
    .jump1$ydba         01AB5E
    .jump$ydba          01AB78
    editmove            01AB88
    .jump$zdba          01AB98
    editwalk            01ABB0
    .jump$aeba          01ABDA
    .jump0$aeba         01ABF2
    .jump1$aeba         01ABF6
    .jump2$aeba         01AC16
    .jump3$aeba         01AC2C
    .jump4$aeba         01AC38
    .jump5$aeba         01AC40
    .lend$aeba          01AC48
    .jump77$aeba        01AC64
    .jump6$aeba         01AC7C
    .jump7$aeba         01AC80
    .worknai$aeba       01ACC4
    .jump8$aeba         01ACC4
    .end$aeba           01ACEC
    .jump9$aeba         01AD1E
    editpatchg          01AD20
    edittbl             01AD40
    edit1tbl            01AD4E
    edit2tbl            01ADC0
    edit3tbl            01ADC0
    edit4tbl            01ADFA
    edit5tbl            01AED4
    edit6tbl            01AED4
    edit7tbl            01AED4
    mapinittbl          01AF58
    divdevtbl           01AFC8
    ddev00              01B008
    ddev01              01B028
    ddev02              01B03C
    ddev03              01B044
    ddev04              01B04C
    ddev05              01B084
    ddev06              01B08C
    ddev08              01B08C
    ddev14              01B08C
    ddev10              01B0AC
    ddev11              01B0E4
    ddev12              01B0F8
    ddev13              01B12A
    ddev07              01B15C
    ddev09              01B15C
    ddev15              01B15C
    ddev16              01B170
    ddev17              01B178
    ddev18              01B1B0
    ddev19              01B1C4
    ddev20              01B1C4
    ddev21              01B1C6
    ddev22              01B1D4
    ddev23              01B1E2
    ddev24              01B1F0
    ddev25              01B1FE
    ddev26              01B20C
    ddev27              01B21A
    ddev28              01B21C
    ddev29              01B21E
    ddev30              01B220
    ddev31              01B222
    scddirtbl1          020000
    scddirtbl2          020100
    scdtbl              020200
    scdtbl1             020200
    scdtbl2             021200
    scdtbl3             022200
    scdtbl4             023200
    zone1scd            024200
    zone1scdb           02439A
    zone4scd            024534
    zone4scdb           024834
    zone6scd            024B34
    zone3scd            024B34
    zone2scd            024B34
    zone6scdb           024E34
    zone3scdb           024E34
    zone2scdb           024E34
    zone5scd            025134
    zone5scdb           025434
    rotmaptbl0          025734
    rotmaptbl1          0259AE
    rotmaptbl2          025DC0
    rotmaptbl3          02611C
    rotmaptbl4          0265F6
    rotmaptbl5          026AA6
    efect00acg          026D98
    efect00bcg          026E18
    efect00ccg          026E98
    efect00dcg          026F18
    efect00ecg          026F98
    efect08acg          027098
    efect08bcg          027498
    efect0dacg          027798
    efect0dbcg          027898
    efect0dccg          027B98
    efect0ddcg          027C58
    efect0decg          027D18
    efect0dfcg          027DD8
    efect0dgcg          027F58
    efect0dhcg          028198
    zonemaptbl          028218
    zone1_1a            0282C0
    zone1_2a            0283B2
    zone1_3a            02847A
    zone1_3b            02859C
    zone1_2b            02859C
    zone1_1b            02859C
    zone4_1a            0285BE
    zone4_2a            028DC0
    zone4_3a            0295C2
    zone4_4a            029DC4
    zone4_4b            02A5C6
    zone4_3b            02A5C6
    zone4_2b            02A5C6
    zone4_1b            02A5C6
    zone7_4a            02A5D0
    zone6_4a            02A5D0
    zone3_4a            02A5D0
    zone2_4a            02A5D0
    zone1_4a            02A5D0
    zone7_3a            02A5D0
    zone6_3a            02A5D0
    zone3_3a            02A5D0
    zone2_3a            02A5D0
    zone7_2a            02A5D0
    zone6_2a            02A5D0
    zone3_2a            02A5D0
    zone2_2a            02A5D0
    zone7_1a            02A5D0
    zone6_1a            02A5D0
    zone3_1a            02A5D0
    zone2_1a            02A5D0
    zone5_4a            02ADD2
    zone5_3a            02ADD2
    zone5_2a            02ADD2
    zone5_1a            02ADD2
    zone7_4b            02B5D4
    zone6_4b            02B5D4
    zone3_4b            02B5D4
    zone2_4b            02B5D4
    zone1_4b            02B5D4
    zone7_3b            02B5D4
    zone6_3b            02B5D4
    zone3_3b            02B5D4
    zone2_3b            02B5D4
    zone7_2b            02B5D4
    zone6_2b            02B5D4
    zone3_2b            02B5D4
    zone2_2b            02B5D4
    zone7_1b            02B5D4
    zone6_1b            02B5D4
    zone3_1b            02B5D4
    zone2_1b            02B5D4
    zone5_4b            02B666
    zone5_3b            02B666
    zone5_2b            02B666
    zone5_1b            02B666
    zone7_4z            02B6B0
    zone6_4z            02B6B0
    zone5_4z            02B6B0
    zone4_4z            02B6B0
    zone3_4z            02B6B0
    zone2_4z            02B6B0
    zone1_4z            02B6B0
    zone7_3z            02B6B0
    zone6_3z            02B6B0
    zone5_3z            02B6B0
    zone4_3z            02B6B0
    zone3_3z            02B6B0
    zone2_3z            02B6B0
    zone1_3z            02B6B0
    zone7_2z            02B6B0
    zone6_2z            02B6B0
    zone5_2z            02B6B0
    zone4_2z            02B6B0
    zone3_2z            02B6B0
    zone2_2z            02B6B0
    zone1_2z            02B6B0
    zone7_1z            02B6B0
    zone6_1z            02B6B0
    zone5_1z            02B6B0
    zone4_1z            02B6B0
    zone3_1z            02B6B0
    zone2_1z            02B6B0
    zone1_1z            02B6B0
    bigringcg           02B6B4
    asettbl             040000
    asettbl10           040096
    asettbl11           0403A8
    asettbl12           040798
    asettbl20           040C8A
    asettbl21           040C90
    asettbl23           040C96
    asettbl22           040C96
    kassya10            040C9C
    kassya11            040CCE
    kassya20            040D00
    kassya21            040D32
    kassya30            040D64
    kassya31            040DAE
    asettbl30           040DEC
    asettbl31           040E5E
    asettbl32           040E64
    asettbl40           040E6A
    asettbl41           041080
    asettbl42           0412AE
    asettbl50           0412B4
    asettbl51           0413BC
    asettbl52           0413C2
    asettbl60           0413C8
    asettbl61           0413CE
    asettbl62           0413D4
    beltc10             0413E6
    beltc11             041418
    beltc12             04144A
    beltc13             04147C
    beltc14             0414AE
    beltc15             0414E0
    asettbl70           041518
    asettbl70z          041674
    asettbl60z          041674
    asettbl10z          041674
    asettbl50z          041674
    asettbl40z          041674
    asettbl30z          041674
    asettbl20z          041674
    ringacttbl          050000
    ringact11           050030
    ringact12           05017A
    ringact13           0502A4
    ringact21           0503CE
    ringact22           05045C
    ringact23           0504BA
    ringact80           050538
    ringact00           0506AA
    ringact01           05080C
    ringact02           05099A
    ringact03           05099C
    sound               071B4C
    pcm_top             072E7C
    pcm_end             0745DC
    playcg              080000
    playpat             0914C0
    ply000              09160E
    ply001              091610
    ply002              091632
    ply003              091644
    ply004              09166E
    ply005              091698
    ply006              0916C2
    ply007              0916E4
    ply008              091706
    ply009              091718
    ply010              09172A
    ply011              09173C
    ply012              09175E
    ply013              091780
    ply014              091792
    ply015              0917A4
    ply016              0917BE
    ply017              0917D8
    ply018              0917F2
    ply019              091814
    ply020              091836
    ply021              091850
    ply022              09186A
    ply023              091884
    ply024              09189E
    ply025              0918C0
    ply026              0918EA
    ply027              091914
    ply028              091936
    ply029              091958
    ply030              09197A
    ply031              09199C
    ply032              0919BE
    ply033              0919E8
    ply034              091A0A
    ply035              091A2C
    ply036              091A4E
    ply037              091A68
    ply038              091A7A
    ply039              091A8C
    ply040              091A9E
    ply041              091AB8
    ply042              091AD2
    ply043              091AEC
    ply044              091AFE
    ply045              091B10
    ply046              091B22
    ply047              091B34
    ply048              091B4E
    ply049              091B70
    ply050              091B92
    ply051              091BBC
    ply052              091BDE
    ply053              091C00
    ply054              091C22
    ply055              091C44
    ply056              091C66
    ply057              091C88
    ply058              091CAA
    ply059              091CCC
    ply060              091CEE
    ply061              091D00
    ply062              091D12
    ply063              091D24
    ply064              091D36
    ply065              091D48
    ply066              091D5A
    ply067              091D6C
    ply068              091D7E
    ply069              091D90
    ply070              091DA2
    ply071              091DB4
    ply072              091DC6
    ply073              091DD8
    ply074              091DEA
    ply075              091DFC
    ply076              091E0E
    ply077              091E20
    ply078              091E32
    ply079              091E44
    ply080              091E56
    ply081              091E68
    ply082              091E7A
    ply083              091E8C
    ply084              091E9E
    ply085              091EB0
    ply086              091EC2
    ply087              091ED4
    ply088              091EE6
    ply089              091EF8
    ply090              091F0A
    ply091              091F1C
    ply092              091F2E
    ply093              091F40
    ply094              091F52
    ply095              091F64
    ply096              091F76
    ply097              091F88
    ply098              091F9A
    ply099              091FAC
    ply100              091FBE
    ply101              091FD0
    ply102              091FE2
    ply103              091FF4
    ply104              092006
    ply105              092018
    ply106              09202A
    ply107              09203C
    ply108              09204E
    ply109              092058
    ply110              092062
    ply111              09206C
    ply112              092076
    ply113              092080
    ply114              09208A
    ply115              092094
    ply116              09209E
    ply117              0920A8
    ply118              0920B2
    ply119              0920BC
    ply120              0920D6
    ply121              0920F0
    ply122              09210A
    ply123              092124
    ply124              092146
    ply125              092168
    ply126              09218A
    ply127              0921A4
    ply128              0921AE
    ply129              0921B8
    ply130              0921D2
    ply131              0921EC
    ply132              092206
    ply133              092220
    ply134              092232
    ply135              092244
    ply136              092256
    ply137              092268
    ply138              09228A
    ply139              09229C
    ply140              0922B6
    ply141              0922D0
    ply142              0922E2
    ply143              0922F4
    ply144              092306
    ply145              092318
    ply146              09233A
    ply147              09235C
    ply148              09237E
    ply149              092398
    ply150              0923B2
    ply151              0923D4
    ply152              0923EE
    ply153              092410
    ply154              092432
    ply155              09244C
    ply156              092466
    ply157              092480
    ply158              092492
    ply159              09249C
    ply160              0924AE
    ply161              0924C8
    ply162              0924E2
    ply163              0924FC
    ply164              09250E
    ply165              092520
    ply166              09253A
    foxcg               09254C
    playwrtpat          09DA4C
    plwpat              09DA4C
    plw000              09DB9A
    plw001              09DB9C
    plw002              09DBA6
    plw003              09DBAC
    plw004              09DBB8
    plw005              09DBC4
    plw006              09DBD0
    plw007              09DBDA
    plw008              09DBE4
    plw009              09DBEA
    plw010              09DBF0
    plw011              09DBF6
    plw012              09DC00
    plw013              09DC0A
    plw014              09DC10
    plw015              09DC16
    plw016              09DC1E
    plw017              09DC26
    plw018              09DC2E
    plw019              09DC38
    plw020              09DC42
    plw021              09DC4A
    plw022              09DC52
    plw023              09DC5A
    plw024              09DC62
    plw025              09DC6C
    plw026              09DC78
    plw027              09DC84
    plw028              09DC8E
    plw029              09DC98
    plw030              09DCA2
    plw031              09DCAC
    plw032              09DCB6
    plw033              09DCC2
    plw034              09DCCC
    plw035              09DCD6
    plw036              09DCE0
    plw037              09DCE8
    plw038              09DCEE
    plw039              09DCF4
    plw040              09DCFA
    plw041              09DD02
    plw042              09DD0A
    plw043              09DD12
    plw044              09DD18
    plw045              09DD1E
    plw046              09DD24
    plw047              09DD2A
    plw048              09DD32
    plw049              09DD3C
    plw050              09DD46
    plw051              09DD52
    plw052              09DD5C
    plw053              09DD66
    plw054              09DD70
    plw055              09DD7A
    plw056              09DD84
    plw057              09DD8E
    plw058              09DD98
    plw059              09DDA2
    plw068              09DDAC
    plw064              09DDAC
    plw060              09DDAC
    plw069              09DDB2
    plw065              09DDB2
    plw061              09DDB2
    plw070              09DDB8
    plw066              09DDB8
    plw062              09DDB8
    plw071              09DDBE
    plw067              09DDBE
    plw063              09DDBE
    plw080              09DDC4
    plw076              09DDC4
    plw072              09DDC4
    plw081              09DDCA
    plw077              09DDCA
    plw073              09DDCA
    plw082              09DDD0
    plw078              09DDD0
    plw074              09DDD0
    plw083              09DDD6
    plw079              09DDD6
    plw075              09DDD6
    plw092              09DDDC
    plw088              09DDDC
    plw084              09DDDC
    plw093              09DDE2
    plw089              09DDE2
    plw085              09DDE2
    plw094              09DDE8
    plw090              09DDE8
    plw086              09DDE8
    plw095              09DDEE
    plw091              09DDEE
    plw087              09DDEE
    plw104              09DDF4
    plw100              09DDF4
    plw096              09DDF4
    plw105              09DDFA
    plw101              09DDFA
    plw097              09DDFA
    plw106              09DE00
    plw102              09DE00
    plw098              09DE00
    plw107              09DE06
    plw103              09DE06
    plw099              09DE06
    plw108              09DE0C
    plw109              09DE10
    plw110              09DE14
    plw111              09DE18
    plw112              09DE1C
    plw113              09DE20
    plw114              09DE24
    plw115              09DE28
    plw116              09DE2C
    plw117              09DE30
    plw118              09DE34
    plw119              09DE38
    plw120              09DE40
    plw121              09DE48
    plw122              09DE50
    plw123              09DE58
    plw124              09DE62
    plw125              09DE6C
    plw126              09DE76
    plw127              09DE7E
    plw128              09DE82
    plw129              09DE86
    plw130              09DE8E
    plw131              09DE96
    plw132              09DE9E
    plw133              09DEA6
    plw134              09DEAC
    plw135              09DEB2
    plw136              09DEB8
    plw137              09DEBE
    plw138              09DEC8
    plw139              09DECE
    plw140              09DED6
    plw141              09DEDE
    plw142              09DEE4
    plw143              09DEEA
    plw144              09DEF0
    plw147              09DEF6
    plw145              09DEF6
    plw146              09DF00
    plw149              09DF06
    plw148              09DF06
    plw150              09DF0E
    plw151              09DF18
    plw152              09DF20
    plw153              09DF2A
    plw154              09DF34
    plw155              09DF3C
    plw156              09DF44
    plw157              09DF4C
    plw158              09DF52
    plw159              09DF56
    plw160              09DF5C
    plw161              09DF64
    plw162              09DF6C
    plw163              09DF74
    plw164              09DF7A
    plw165              09DF80
    plw166              09DF88
    bariacg             09DF8E
    mutekicg            09E114
    stopfxcg            09E1FC
    spinsfxcg           09E3FC
    exit2cg             09ED3C
    foxpat              09FB3C
    foxsp000            09FC46
    foxsp001            09FC48
    foxsp002            09FC5A
    foxsp003            09FC6C
    foxsp004            09FC7E
    foxsp005            09FC90
    foxsp006            09FC9A
    foxsp007            09FCA4
    foxsp008            09FCB6
    foxsp009            09FCC8
    foxsp010            09FCD2
    foxsp011            09FCDC
    foxsp012            09FCE6
    foxsp013            09FCF0
    foxsp014            09FCFA
    foxsp015            09FD14
    foxsp016            09FD2E
    foxsp017            09FD48
    foxsp018            09FD62
    foxsp019            09FD7C
    foxsp020            09FD96
    foxsp021            09FDB0
    foxsp022            09FDCA
    foxsp023            09FDE4
    foxsp024            09FDFE
    foxsp025            09FE18
    foxsp026            09FE32
    foxsp027            09FE4C
    foxsp028            09FE66
    foxsp029            09FE80
    foxsp030            09FE9A
    foxsp031            09FEB4
    foxsp032            09FECE
    foxsp033            09FEE8
    foxsp034            09FF02
    foxsp035            09FF1C
    foxsp036            09FF36
    foxsp037            09FF50
    foxsp038            09FF6A
    foxsp039            09FF7C
    foxsp040            09FF96
    foxsp041            09FFA8
    foxsp042            09FFC2
    foxsp043            09FFD4
    foxsp044            09FFEE
    foxsp045            0A0000
    foxsp046            0A001A
    foxsp047            0A002C
    foxsp048            0A003E
    foxsp049            0A0050
    foxsp050            0A0062
    foxsp051            0A0074
    foxsp052            0A0086
    foxsp053            0A00A0
    foxsp054            0A00BA
    foxsp055            0A00D4
    foxsp056            0A00EE
    foxsp057            0A0108
    foxsp058            0A0122
    foxsp061            0A013C
    foxsp059            0A013C
    foxsp060            0A0156
    foxsp062            0A0170
    foxsp063            0A018A
    foxsp064            0A01A4
    foxsp065            0A01BE
    foxsp066            0A01D8
    foxsp067            0A01F2
    foxsp068            0A020C
    foxsp069            0A0226
    foxsp070            0A0240
    foxsp071            0A024A
    foxsp072            0A0254
    foxsp073            0A025E
    foxsp074            0A0268
    foxsp075            0A0272
    foxsp076            0A027C
    foxsp077            0A0286
    foxsp078            0A0290
    foxsp079            0A029A
    foxsp080            0A02A4
    foxsp081            0A02AE
    foxsp082            0A02B8
    foxsp083            0A02C2
    foxsp084            0A02CC
    foxsp085            0A02D6
    foxsp086            0A02E0
    foxsp087            0A02EA
    foxsp088            0A02F4
    foxsp089            0A02FE
    foxsp090            0A0310
    foxsp091            0A0322
    foxsp092            0A032C
    foxsp093            0A0336
    foxsp094            0A0340
    foxsp095            0A0352
    foxsp096            0A0364
    foxsp097            0A036E
    foxsp098            0A0378
    foxsp099            0A0382
    foxsp100            0A0394
    foxsp101            0A03A6
    foxsp102            0A03B8
    foxsp103            0A03CA
    foxsp104            0A03DC
    foxsp105            0A03EE
    foxsp106            0A0400
    foxsp107            0A0412
    foxsp108            0A041C
    foxsp109            0A042E
    foxsp110            0A0440
    foxsp111            0A0452
    foxsp112            0A0464
    foxsp113            0A0476
    foxsp114            0A0488
    foxsp115            0A049A
    foxsp116            0A04AC
    foxsp117            0A04B6
    foxsp118            0A04C0
    foxsp119            0A04D2
    foxsp120            0A04DC
    foxsp121            0A04E6
    foxsp122            0A04F0
    foxsp123            0A04FA
    foxsp124            0A0504
    foxsp125            0A050E
    foxsp126            0A0518
    foxsp127            0A0522
    foxsp128            0A0534
    foxsp129            0A0546
    foxsp130            0A0550
    foxsp131            0A055A
    foxsp132            0A0564
    foxwrtpat           0A056E
    foxw000             0A0678
    foxw001             0A067A
    foxw002             0A0680
    foxw003             0A0686
    foxw004             0A068C
    foxw005             0A0692
    foxw006             0A0696
    foxw007             0A069A
    foxw008             0A06A0
    foxw009             0A06A6
    foxw010             0A06AA
    foxw011             0A06AE
    foxw012             0A06B2
    foxw013             0A06B6
    foxw014             0A06BA
    foxw015             0A06C2
    foxw016             0A06CA
    foxw017             0A06D2
    foxw018             0A06DA
    foxw019             0A06E2
    foxw020             0A06EA
    foxw021             0A06F2
    foxw022             0A06FA
    foxw023             0A0702
    foxw024             0A070A
    foxw025             0A0712
    foxw026             0A071A
    foxw027             0A0722
    foxw028             0A072A
    foxw029             0A0732
    foxw030             0A073A
    foxw031             0A0742
    foxw032             0A074A
    foxw033             0A0752
    foxw034             0A075A
    foxw035             0A0762
    foxw036             0A076A
    foxw037             0A0772
    foxw038             0A077A
    foxw039             0A0780
    foxw040             0A0788
    foxw041             0A078E
    foxw042             0A0796
    foxw043             0A079C
    foxw044             0A07A4
    foxw045             0A07AA
    foxw046             0A07B2
    foxw047             0A07B8
    foxw048             0A07BE
    foxw050             0A07C4
    foxw051             0A07CA
    foxw052             0A07D0
    foxw053             0A07D8
    foxw054             0A07E0
    foxw055             0A07E8
    foxw056             0A07F0
    foxw057             0A07F8
    foxw058             0A0800
    foxw061             0A0808
    foxw059             0A0808
    foxw060             0A0810
    foxw062             0A0818
    foxw063             0A0820
    foxw064             0A0828
    foxw065             0A0830
    foxw066             0A0838
    foxw067             0A0840
    foxw068             0A0848
    foxw069             0A0850
    foxw070             0A0858
    foxw071             0A085C
    foxw072             0A0860
    foxw129             0A0864
    foxw073             0A0864
    foxw130             0A0868
    foxw074             0A0868
    foxw131             0A086C
    foxw075             0A086C
    foxw132             0A0870
    foxw076             0A0870
    foxw077             0A0874
    foxw078             0A0878
    foxw079             0A087C
    foxw080             0A0880
    foxw081             0A0884
    foxw082             0A0888
    foxw083             0A088C
    foxw084             0A0890
    foxw085             0A0894
    foxw086             0A0898
    foxw087             0A089C
    foxw088             0A08A0
    foxw089             0A08A4
    foxw090             0A08AA
    foxw091             0A08B0
    foxw092             0A08B4
    foxw093             0A08B8
    foxw095             0A08BC
    foxw094             0A08BC
    foxw096             0A08C2
    foxw097             0A08C6
    foxw098             0A08CA
    foxw099             0A08CE
    foxw100             0A08D4
    foxw101             0A08DA
    foxw102             0A08E0
    foxw103             0A08E6
    foxw104             0A08EC
    foxw105             0A08F2
    foxw106             0A08F8
    foxw107             0A08FE
    foxw108             0A0902
    foxw109             0A0908
    foxw112             0A090E
    foxw110             0A090E
    foxw111             0A0914
    foxw114             0A091A
    foxw113             0A091A
    foxw115             0A0920
    foxw116             0A0926
    foxw117             0A092A
    foxw118             0A092E
    foxw119             0A0934
    foxw120             0A0938
    foxw121             0A093C
    foxw122             0A0940
    foxw123             0A0944
    foxw124             0A0948
    foxw125             0A094C
    foxw126             0A0950
    foxw127             0A0954
    foxw128             0A095A
    logocg              0A0960
    logomap             0A0DD0
    titleamap           0A0ECC
    titlebmap           0A1024
    titlecg             0A12FC
    titlespcg           0A2CA6
    greencg             0A37EA
    burankocg           0A3834
    hashicg             0A394E
    movecg              0A3A3A
    tamacg              0A3A82
    togehcg             0A3C20
    togehcg2            0A3E34
    jyamacg             0A3F60
    brkabecg            0A408E
    kagebcg             0A412C
    fire00cg            0A418C
    moekasucg           0A42C4
    taki00cg            0A43D2
    fball00cg           0A44D8
    hashi00cg           0A4626
    cablecarcg          0A46FE
    door00cg            0A49F2
    cso00cg             0A4A6A
    brig08cg            0A4C02
    falls08cg           0A4D7A
    gem08cg             0A50DC
    pltfrm08cg          0A534E
    frntlite08cg        0A540E
    cork08cg            0A564A
    kemuri0dcg          0A57E4
    dai0dcg             0A5904
    nami0dcg            0A5BF0
    swichcg             0A5D60
    banevcg             0A5E38
    banehcg             0A5F54
    bane45cg            0A601E
    scorecg             0A61F2
    playnocg            0A62FA
    ringcg              0A6410
    itemcg              0A6504
    togecg              0A692E
    tencg               0A697E
    savecg              0A6A58
    gatorcg             0A6AFE
    waspcg              0A6EA0
    bbatcg              0A7086
    octcg               0A73DC
    stegocg             0A76FC
    redzcg              0A7AF8
    billfishcg          0A7ECE
    seahorsecg          0A83C6
    bballcg             0A8814
    mamabubcg           0A8AAA
    bubblercg           0A8CD6
    snailcg             0A8EF8
    sandcrabcg          0A90F4
    bfishcg             0A9476
    bossbacg            0A9682
    zdbcg               0A9DBE
    bossbmcg            0AA31C
    bossafbcg           0AA9A4
    bosssmcg            0AAA22
    boss00cg            0AAB08
    bosshcg             0AB2F4
    butacg              0AB3E8
    kanicg              0AB7A8
    hachicg             0ABC96
    bakuhacg            0AC03C
    moguracg            0AC224
    fishcg              0AC90E
    fish2cg             0ACB76
    arumacg             0ACE00
    musicg              0AD324
    kamerecg            0AD5AE
    yadocg              0ADBCC
    batcg               0ADFB4
    usacg               0AE2B0
    brobocg             0AE4F8
    unicg               0AE790
    imocg               0AE96E
    zonecg              0AEAFC
    yararecg            0AF10A
    overcg              0AF770
    jumpcg              0AF902
    jump2cg             0AFA04
    golecg              0AFAE0
    ebigringcg          0AFF5C
    btencg              0B00D0
    contcg              0B03D2
    sdsoniccg           0B0682
    usagicg             0B08BC
    niwacg              0B0A14
    pengcg              0B0B70
    azarcg              0B0CEC
    fbutacg             0B0E08
    fliccg              0B0F3E
    risucg              0B1078
    zone00blk           0B11D4
    zone00cg            0B2174
    zone00map           0B4FAC
    zone08blk           0BCFAC
    zone08cg            0BE58C
    zone08pccg          0C129A
    zone08map           0C140E
    zone0dblk           0C940E
    zone0dcg            0CA3AE
    zone0dpccg          0CCD56
    zone0dmap           0CCFB2
    zone1blk            0D4FB2
    zone1cg             0D5DB2
    enkeicg             0D936E
    zone1map            0DA9CE
    scdtblwk            FE0000
    scdtblwk2           FE2000
    scddirtbl           FE4000
    For those curious, these are the new symbols that I extracted. I do recall seeing a few of these being discussed on various pages, but I don't think I've seen it properly documented, so here you go:
    Code:
    bossvac             000000 (dummied out)
    vacumeguy           000000 (dummied out)
    explode             000000 (dummied out)
    burankoposiset      007D6A
    burankoposiset2     007DAE
    burankopat          007EAE
    buranko0dpat        007EDA
    ballpat             007F4A
    shimapat2           0084AE
    fishpat             00B11E
    speedset            00C706
    frameoutchk         00C7AE
    frameoutchkd        00C81A
    dualmodesub         00CFC2
    dualmodesub2        00CFDE
    ringcolchk          00D2F0
    kamerepat           00E4A8
    musipat             00EA80
    ridechksub_t        00EEC0
    jumpcolsub          00FDCC
    emycol_d            0128C6
    zone1scd            024200
    zone1scdb           02439A
    zone4scd            024534
    zone4scdb           024834
    zone6scd            024B34
    zone3scd            024B34
    zone2scd            024B34
    zone6scdb           024E34
    zone3scdb           024E34
    zone2scdb           024E34
    zone5scd            025134
    zone5scdb           025434
    efect08acg          027098
    zone1_1a            0282C0
    zone1_2a            0283B2
    zone1_3a            02847A
    zone1_3b            02859C
    zone1_2b            02859C
    zone1_1b            02859C
    zone4_1a            0285BE
    zone4_2a            028DC0
    zone4_3a            0295C2
    zone4_3b            02A5C6
    zone4_2b            02A5C6
    zone4_1b            02A5C6
    zone7_3a            02A5D0
    zone6_3a            02A5D0
    zone3_3a            02A5D0
    zone2_3a            02A5D0
    zone7_2a            02A5D0
    zone6_2a            02A5D0
    zone3_2a            02A5D0
    zone2_2a            02A5D0
    zone7_1a            02A5D0
    zone6_1a            02A5D0
    zone3_1a            02A5D0
    zone2_1a            02A5D0
    zone5_3a            02ADD2
    zone5_2a            02ADD2
    zone5_1a            02ADD2
    zone7_3b            02B5D4
    zone6_3b            02B5D4
    zone3_3b            02B5D4
    zone2_3b            02B5D4
    zone7_2b            02B5D4
    zone6_2b            02B5D4
    zone3_2b            02B5D4
    zone2_2b            02B5D4
    zone7_1b            02B5D4
    zone6_1b            02B5D4
    zone3_1b            02B5D4
    zone2_1b            02B5D4
    zone5_3b            02B666
    zone5_2b            02B666
    zone5_1b            02B666
    zone7_2z            02B6B0
    zone6_2z            02B6B0
    zone5_2z            02B6B0
    zone4_2z            02B6B0
    zone3_2z            02B6B0
    zone2_2z            02B6B0
    zone1_2z            02B6B0
    zone7_1z            02B6B0
    zone6_1z            02B6B0
    zone5_1z            02B6B0
    zone4_1z            02B6B0
    zone3_1z            02B6B0
    zone2_1z            02B6B0
    zone1_1z            02B6B0
    kassya10            040C9C
    kassya11            040CCE
    kassya20            040D00
    kassya21            040D32
    kassya30            040D64
    kassya31            040DAE
    beltc10             0413E6
    beltc11             041418
    beltc12             04144A
    beltc13             04147C
    beltc14             0414AE
    beltc15             0414E0
    asettbl50z          041674
    asettbl40z          041674
    asettbl30z          041674
    sound               071B4C
    playcg              080000
    plwpat              09DA4C
    spinsfxcg           09E3FC
    foxsp127            0A0522
    foxwrtpat           0A056E
    foxw000             0A0678
    foxw001             0A067A
    foxw002             0A0680
    foxw003             0A0686
    foxw004             0A068C
    foxw005             0A0692
    foxw006             0A0696
    foxw007             0A069A
    foxw008             0A06A0
    foxw009             0A06A6
    foxw010             0A06AA
    foxw011             0A06AE
    foxw012             0A06B2
    foxw013             0A06B6
    foxw014             0A06BA
    foxw015             0A06C2
    foxw016             0A06CA
    foxw017             0A06D2
    foxw018             0A06DA
    foxw019             0A06E2
    foxw020             0A06EA
    foxw021             0A06F2
    foxw022             0A06FA
    foxw023             0A0702
    foxw024             0A070A
    foxw025             0A0712
    foxw026             0A071A
    foxw027             0A0722
    foxw028             0A072A
    foxw029             0A0732
    foxw030             0A073A
    foxw031             0A0742
    foxw032             0A074A
    foxw033             0A0752
    foxw034             0A075A
    foxw035             0A0762
    foxw036             0A076A
    foxw037             0A0772
    foxw038             0A077A
    foxw039             0A0780
    foxw040             0A0788
    foxw041             0A078E
    foxw042             0A0796
    foxw043             0A079C
    foxw044             0A07A4
    foxw045             0A07AA
    foxw046             0A07B2
    foxw047             0A07B8
    foxw048             0A07BE
    logomap             0A0DD0
    titleamap           0A0ECC
    titlebmap           0A1024
    titlecg             0A12FC
    tamacg              0A3A82
    togehcg2            0A3E34
    moekasucg           0A42C4
    fball00cg           0A44D8
    cablecarcg          0A46FE
    octcg               0A73DC
    seahorsecg          0A83C6
    butacg              0AB3E8
    kanicg              0AB7A8
    hachicg             0ABC96
    bakuhacg            0AC03C
    fish2cg             0ACB76
    yadocg              0ADBCC
    batcg               0ADFB4
    brobocg             0AE4F8
    zone00blk           0B11D4
    zone08blk           0BCFAC
    zone08pccg          0C129A
    zone0dblk           0C940E
    zone0dcg            0CA3AE
    zone1blk            0D4FB2
    scdtblwk            FE0000
    scddirtbl           FE4000
     
    Last edited: Jan 6, 2025
    ProjectFM likes this.
  17. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    So, I managed to track a couple more labels from the Sonic CD Gems Collection decompilation, related to stage data.

    Sonic CD calls the pointer to chunk data "pmapwk", and calls the buffer for block data "blockwk". This actually checks out with the Sonic 2 labels. For example, Emerald Hill's blocks are called "zone00blk" and its chunks are called "zone00map". I do think it's possible that the "p" in "pmapwk" stands for "pointer" in Sonic CD, since the palette buffer is called "lpcolorwk", and the horizontal scroll buffer is called "lphscrollbuff", and they all point to memory located outside of the core game code:
    Code:
      pmapwk = (unsigned short*)**pBufTbl++;
      lpcolorwk = (PALETTEENTRY*)**pBufTbl++;
      lpcolorwk2 = (PALETTEENTRY*)**pBufTbl++;
      lpcolorwk3 = (PALETTEENTRY*)**pBufTbl++;
      lpcolorwk4 = (PALETTEENTRY*)**pBufTbl++;
      lphscrollbuff = (int_union*)**pBufTbl++;
    Confusingly, Sonic CD also refers to the foreground layout buffer as "mapwka", and the background layout buffer as "mapwkb". In Sonic 2, the labels for the actual data in ROM are just "zoneZ_AL", with "Z" being the zone number (GHZ = "1"), "A" being the act number (act 1 = "1"), and "L" being the layer type ("a" = foreground, "b" = background). GHZ1's foreground data is called "zone1_1a", for example. The index table for these layouts is called "zonemaptbl".

    Personally, I think the chunk buffer is called "mapwk", with "mapwka" and "mapwkb" referring to the layouts, considering they are arrays of chunk IDs. I don't think it's unheard of, honestly, because there's "waterflag", the flag for when the water palette takes up the entire screen, and then "water_flag", the water events routine ID.
     
    Last edited: Jan 7, 2025
    ProjectFM likes this.
  18. Devon

    Devon Do not contact me. Member

    Joined:
    Aug 26, 2013
    Messages:
    1,482
    I have a hunch on what this could be. In Sonic 2 Nick Arcade, a good chunk of the special stage graphics were removed, including the sprite data for the walls, because they were grouped with the graphics data in Sonic 1. However, the sprite table for the special stage still includes the entries for the walls, except they all point to where "goalpat" and co. are instead. So, I think "metpat" refers to the walls, with the data removed, and its label moved in with the rest of the block sprites.

    Also...

    I present, an extraction of scraps of earlier code from the Sonic 2 Nick Arcade prototype ROM, including linker work data, with disassemblies, using official symbol names where possible.
     
    Last edited: Apr 26, 2025
    ProjectFM and Clownacy like this.