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,020
    (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
    Pacca, MarkeyJester, Painto and 7 others like this.
  2. Devon

    Devon I'm a loser, baby, so why don't you kill me? Member

    Joined:
    Aug 26, 2013
    Messages:
    1,376
    Location:
    your mom
    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 I'm a loser, baby, so why don't you kill me? Member

    Joined:
    Aug 26, 2013
    Messages:
    1,376
    Location:
    your mom
    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 I'm a loser, baby, so why don't you kill me? Member

    Joined:
    Aug 26, 2013
    Messages:
    1,376
    Location:
    your mom
    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
    DeltaWooloo likes this.
  5. Devon

    Devon I'm a loser, baby, so why don't you kill me? Member

    Joined:
    Aug 26, 2013
    Messages:
    1,376
    Location:
    your mom
    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 DeltaWooloo like this.
  6. Devon

    Devon I'm a loser, baby, so why don't you kill me? Member

    Joined:
    Aug 26, 2013
    Messages:
    1,376
    Location:
    your mom
    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 I'm a loser, baby, so why don't you kill me? Member

    Joined:
    Aug 26, 2013
    Messages:
    1,376
    Location:
    your mom
    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 DeltaWooloo like this.