Sonic 1 Prototype Mini Guides Thread

Discussion in 'Tutorials' started by Kilo, Jan 10, 2021.

  1. Kilo

    Kilo Foxy Fren Exiled

    Joined:
    Oct 9, 2017
    Messages:
    391
    Location:
    A warm and lovely place~
    Hey everyone! So at this point we've actually got a buildable disassembly, which means we can start writing guides. Today I've got a few small guides that I've all bundled together here, they're mostly just fixes and minor touch ups. These guides will work for the MDDC disassembly

    Using the full demo order
    This is something I already mentioned here, but here's a fix for it!
    In the prototype if you were to sit on the title screen you'd cycle through 6 demos
    Code:
    GHZ1 > Special Stage > MZ1 > Special Stage > SZ1 > Special Stage
    However, the actual data for the demo order has 12 entries
    Code:
    GHZ1 > Special Stage > MZ1 > Special Stage > SZ1 > Special Stage > SLZ1 > Special Stage > MZ1 > Special Stage > SZ1 > Special Stage
    The fix for this is fairly simple of course, under loc_282C, you'll see
    Code:
    loc_282C:
            tst.w    (GlobalTimer).w
            bne.w    loc_27FE
            move.b    #$E0,d0
            bsr.w    PlaySFX
            move.w    (DemoNum).w,d0
            andi.w    #7,d0
            add.w    d0,d0
            move.w    DemoLevels(pc,d0.w),d0
            move.w    d0,(curzone).w
            addq.w    #1,(DemoNum).w
            cmpi.w    #6,(DemoNum).w
            bcs.s    loc_2860
            move.w    #0,(DemoNum).w
    Now, you'll notice a check to see if the demo number is at 6. Obviously, you just need to change that to 12 (Or $C). Super easy fix!
    As a bonus, let's add the intended demo order. For some reason the list goes back to MZ and SZ even though they've already played. It was likely intended that it was actually supposed to play LZ and CWZ instead, but at this point in the prototype, those two stages were kind of being hidden by Sonic Team. To restore the intended demo order, let's look at DemoLevels

    Code:
    DemoLevels:    dc.w 0, $600, $200, $600, $400, $600, $300, $600, $200
            dc.w $600, $400, $600
    Aside from $600, we can notice 2 other values being duplicated, $200 and $400. We'll want to change the second instance of them to $100 and $500. And like that, the demo order is corrected!~

    Notice: For some reason, the demos refuse to go past SLZ, will investigate further

    Fixing the Marble Zone UFOs
    In the prototype, the UFOs in Marble Zone are actually broken, they fail to display a 6th frame.
    Here's how they do animate in the prototype
    MZUFO.gif
    And here's how they should actually animate

    MZUFOFix.gif
    To fix this issue, go to loc_11412
    Code:
    loc_11412:
            subq.b    #1,(unk_FFF7B5).w
            bpl.w    locret_11480
            move.b    #7,(unk_FFF7B5).w
            lea    (byte_6C398).l,a1
            moveq    #0,d0
            move.b    (unk_FFF7B4).w,d0
            addq.b    #1,d0
            cmpi.b    #5,d0
            bne.s    loc_11436
            moveq    #0,d0
    And change the line
    Code:
            cmpi.b    #5,d0
    From a 5 to 6. This was likely just an oversight by Naka, he probably thought that he was counting from 0 instead of 1.

    Unlock Clock Work Zone Act 3 in Level Select
    Here's the final mini guide of this thread, this will just be a simple fix so you can access CWZ3 via level select.
    Under LevSelOrder we'll find

    Code:
    LevSelOrder:    dc.w 0,    1,    2
            dc.w $100, $101, $102
            dc.w $200, $201, $202
            dc.w $300, $301, $302
            dc.w $400, $401, $402
            dc.w $500, $501,$8500
            dc.w $700, $700,$8000
    $8500 is the entry for CWZ3. $8500 is obviously a null entry the player can't select. So there's 2 routes we can take here. You could choose to load Sonic into LZ4, like the final game. Or you can load the player into literal CWZ3, Final Zone in the final game. Depending on which you want to do, replace $8500 with either of these
    Code:
    $103 = Labyrinth Zone Act 4
    $502 = Clock Work Zone Act 3

    And there's a few small fixes for you to try out!~
     
    Last edited: Jan 10, 2021
  2. RocketRobz

    RocketRobz Coolest of TWL, and Sonic fan Member

    Joined:
    Aug 20, 2009
    Messages:
    80
    Adding the TM symbol to the SEGA screen

    1. In "screens/sega/", replace "Main.nem" with the attached file below (with .bin removed from the name).
    2. In "main.asm", under these lines in "sSega":
    Code:
           lea   ((Chunks)&$FFFFFF).l,a1
           lea   (MapSega).l,a0
           move.w   #0,d0
           bsr.w   EnigmaDec
    
    add these lines of code:
    Code:
           tst.b   (ConsoleRegion).w
           bpl.s   @cont
           ; Display TM
           move.w   #$30,((Chunks+$14)&$FFFFFF).l
           move.w   #$31,((Chunks+$16)&$FFFFFF).l
    @cont:
    
    As a result, the TM symbol will be shown in the SEGA screen for USA and EUR consoles, like in the final Rev 01 build of Sonic 1.
     

    Attached Files:

    Angel X, JGamer2151, KCEXE and 2 others like this.
  3. DeltaWooloo

    DeltaWooloo The noob next door Member

    Joined:
    Aug 7, 2019
    Messages:
    373
    Hey you! Do you hate the limitations to the Sonic 1 prototype sound driver as it is based on an unmodified SMPS 68k/Type 1b (Golden Axe 2 sound driver). Well have no fear, I have the solution! Introducing the Sonic 1 sound driver port to the prototype! That's right, you have your random SMPSes shoved into the prototype. Also, if you want to stick with the prototype driver, you may notice a bug where the music cannot be paused when you pause the game, so the fix is below the driver installation.

    How to install the Sonic 1 final sound driver into the prototype

    Before modifying the code, we need to make a few changes to the disassembly. Firstly, download the .zip file, provided below, and insert the "s1.sounddriver.asm" in the root of the disassembly. Then, remove the sound folder, and its contents, in the disassembly and insert the new sound folder, from the .zip, in the root of the disassembly.

    Now, open up main.asm and go to mSoundPriorities and delete everything up to (and including):

    Code:
    sD2:        incbin "sound/sfx/D2.ssf"
            even
    From where the code was removed, insert:

    Code:
        include "s1.sounddriver.asm"
    Then go to dacinit and replace this:

    Code:
    dacInit:
            nop
            move.w    #$100,($A11100).l
            move.w    #$100,($A11200).l
            lea    (Z80Driver).l,a0
            lea    ($A00000).l,a1
            move.w    #$1C5B,d0
    
    loc_1156:
            move.b    (a0)+,(a1)+
            dbf    d0,loc_1156
            moveq    #0,d0
            lea    ($A01FF8).l,a1
            move.b    d0,(a1)+
            move.b    #$80,(a1)+
            move.b    #7,(a1)+
            move.b    #$80,(a1)+
            move.b    d0,(a1)+
            move.b    d0,(a1)+
            move.b    d0,(a1)+
            move.b    d0,(a1)+
            move.w    #0,($A11200).l
            nop
            nop
            nop
            nop
            move.w    #$100,($A11200).l
            move.w    #0,($A11100).l
            rts
    ; ---------------------------------------------------------------------------
            dc.b 3
            dc.b 0
            dc.b 0
            dc.b $14
            dc.b 0
            dc.b 0
            dc.b 0
            dc.b 0
    with this:

    Code:
    dacInit:
            nop  
            move.w    #$100,($A11100).l ; stop the Z80
            move.w    #$100,($A11200).l ; reset the Z80
            lea    (Kos_Z80).l,a0    ; load sound driver
            lea    ($A00000).l,a1
            bsr.w    KosinskiDec        ; decompress
            move.w    #0,($A11200).l
            nop  
            nop  
            nop  
            nop  
            move.w    #$100,($A11200).l ; reset the Z80
            move.w    #0,($A11100).l    ; start    the Z80
            rts   
    And it should work with any errors. However, however, when you pause, the music does not pause. So let's fix that. (works in the proto and final driver's)

    How to fix the pause bug

    Go to loc_11CC and add this below the label:

    Code:
            move.b    #1,($FFFFF003).w ; pause music
    To unpause, go to loc_1206 and add this:

    Code:
            move.b    #$80,($FFFFF003).w ; unpause music
    And there you have it, a stable Sonic 1 driver for the proto. Now add MegaPCM, Dual PCM or anything, I really don't care; it will most likely work!
     

    Attached Files:

    Last edited: Jan 13, 2021
    JGamer2151, Angel X and RocketRobz like this.
  4. Kilo

    Kilo Foxy Fren Exiled

    Joined:
    Oct 9, 2017
    Messages:
    391
    Location:
    A warm and lovely place~
    Make Splats Play a Sound Effect
    This is just something small and really only for thematic purposes, but if you'd like Splats play the spring sound effect when jumping, simply place
    Code:
            move.w    #$CC,d0
            jsr    (PlaySFX).l
    At the end of loc_D2A4.
     
    Crimson Neo, Angel X, Speems and 2 others like this.
  5. Speems

    Speems Well-Known Member Member

    Joined:
    Mar 14, 2017
    Messages:
    83
    Location:
    Rochester Hills, MI
    C9 is a more appropriate sound to me even if it gets cut off by each time it plays, just sounds cute when paired with Splats to me.

    Anyway, here's my easy mini-guide...

    Adding Music to the Sega Screen

    Something to make the plain palette cycling Sega logo a bit more interesting is to play a song on it. To demonstrate, we're using the 1-Up jingle. Right before loc_2528, plop the following code:
    If this sounds familiar, it is basically the same as my jingle guide for DeltaWooloo's import of this screen to the final Sonic 1, but with slightly different coding. Either way, helps to know how to implement even the smallest additions.
     
    JGamer2151, Angel X and DeltaWooloo like this.
  6. Speems

    Speems Well-Known Member Member

    Joined:
    Mar 14, 2017
    Messages:
    83
    Location:
    Rochester Hills, MI
    Restoring Music Pointer 92

    In the Sonic 1 prototype, pressing A/B/C on 92 in the level select's sound test will crash the game due to it being an invalid pointer. Suddenly this morning, a bit of self-made technical know-how somehow made this pointer fully functional. This was a very lucky thing to achieve, so here's how I managed to do it.

    1. Go to dMusicList and you'll see the following code
    Add ", mDrowning" after the Credits entry.

    2. Scroll down until you see the Z80Driver label. You'll see a list of the included songs. The drowning jingle is not there, therefore we get why the prototype crashes. Add the following code underneath the credits entry similar to the last step
    Don't build just yet! You will need to include a new SSF file that reads "Drowning.ssf" in the music subfolder of Sound. Two methods exist, one lazy and one with legit work. For the latter, use SMPSConv to convert the S1 SMPS file of the Drowning track to Golden Axe 2's format. For the former (the lazy method), copy the Game Over track and rename it as the Drowning file.
     
    Last edited: Jan 15, 2021
  7. Stdh

    Stdh Active Member Member

    Joined:
    Jan 11, 2021
    Messages:
    30
    Location:
    the netherlands
    how to restore the ballhog's art

    hi this is my first tutorial so if there are any mistakes please reply.

    first we need the ballhog's art so below you can download the art. and extract it in levels/shared

    once you did that go to plcghz1 then replace:

    Code:
    dc.l ArtCrabmeat
    dc.w $8000
    with
    Code:
     dc.l Artballhog
                 dc.w $8000
    now go to ArtSplats: And add under that add
    Code:
    Artballhog:    incbin "levels/shared/ballhog/Art.nem"
                                       even
    once you did that you can place the object the id is 1E
    (btw the ball and the explotions arent yet aded but im finding a way to add that.
    and alsothe crabmeat gets replaced so it wont look normal)
     

    Attached Files:

    Last edited: Jan 18, 2021
  8. Kilo

    Kilo Foxy Fren Exiled

    Joined:
    Oct 9, 2017
    Messages:
    391
    Location:
    A warm and lovely place~
    I'm pretty sure Ball Hog's tiles are already in the game?
    Edit: They are definitely in game, at ROM location 0x2A386. However, the disasm doesn't label it.
     
    Last edited: Jan 18, 2021
    RandomName and Pokepunch like this.
  9. Stdh

    Stdh Active Member Member

    Joined:
    Jan 11, 2021
    Messages:
    30
    Location:
    the netherlands
    Yep
     
  10. Kilo

    Kilo Foxy Fren Exiled

    Joined:
    Oct 9, 2017
    Messages:
    391
    Location:
    A warm and lovely place~
    Add Prototype Spike Behavior To Final
    I have no idea why anyone would want to use this but if you're a sadistic asshole, here you go.
    In the prototype, regardless if you have invincibility, Sonic will get hurt when you touch spikes, to add this to final do the following
    Under Obj36_Hurt you'll see
    Code:
    Obj36_Hurt:                ; XREF: Obj36_SideWays; Obj36_Upright
            tst.b    ($FFFFFE2D).w    ; is Sonic invincible?
            bne.s    Obj36_Display    ; if yes, branch
            move.l    a0,-(sp)
            movea.l    a0,a2
            lea    ($FFFFD000).w,a0
            cmpi.b    #4,$24(a0)
            bcc.s    loc_CF20
            move.l    $C(a0),d3
            move.w    $12(a0),d0
            ext.l    d0
            asl.l    #8,d0
            sub.l    d0,d3
            move.l    d3,$C(a0)
            jsr    HurtSonic
    Simply remove the first 2 lines.
    upload_2021-1-20_6-56-50.png
    Gross.