Difference between revisions of "Fix the SEGA Sound"
From Sonic Retro
m (Fucked up something while I was fixing tabbing...) |
m (Text replacement - "\[\[Category:SCHG How-tos.*" to "") |
||
(25 intermediate revisions by 12 users not shown) | |||
Line 1: | Line 1: | ||
+ | {{GuideBy|Puto}} | ||
+ | |||
Let's fix a problem that causes a great deal of pain to anyone adding code to Sonic 1: The SEGA sound. | Let's fix a problem that causes a great deal of pain to anyone adding code to Sonic 1: The SEGA sound. | ||
− | So go to Sound_E1, and replace this: | + | ==The bug== |
− | <asm>Sound_E1: ; XREF: Sound_ExIndex | + | The bug is when sometimes when you build the ROM, at the very end of the "SEGA" sound is a static noise (probably the bat sound) so it sounds like, "SEGA-TS" . There is also another one, which sounds like "THOUGNGH-THOUGNGH" .So anyway, lets fix this! |
+ | |||
+ | ==Fixing the bug== | ||
+ | Go to "''segapcm:''" and you should see: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | SegaPCM: incbin sound\segapcm.bin | ||
+ | even | ||
+ | </syntaxhighlight> | ||
+ | now change it to this | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | SegaPCM: incbin sound\segapcm.bin | ||
+ | SegaPCM_end: even | ||
+ | </syntaxhighlight> | ||
+ | Then go to ''Sound_E1'', and replace all of this code: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | Sound_E1: ; XREF: Sound_ExIndex | ||
move.b #$88,($A01FFF).l | move.b #$88,($A01FFF).l | ||
move.w #0,($A11100).l ; start the Z80 | move.w #0,($A11100).l ; start the Z80 | ||
Line 13: | Line 30: | ||
dbf d1,loc_71FC0 | dbf d1,loc_71FC0 | ||
addq.w #4,sp | addq.w #4,sp | ||
− | rts</ | + | rts</syntaxhighlight> |
− | + | With this: | |
− | <asm>Sound_E1: | + | <syntaxhighlight lang="asm">Sound_E1: |
lea (SegaPCM).l,a2 ; Load the SEGA PCM sample into a2. It's important that we use a2 since a0 and a1 are going to be used up ahead when reading the joypad ports | lea (SegaPCM).l,a2 ; Load the SEGA PCM sample into a2. It's important that we use a2 since a0 and a1 are going to be used up ahead when reading the joypad ports | ||
− | move.l # | + | move.l #(SegaPCM_End-SegaPCM),d3 ; Load the size of the SEGA PCM sample into d3 |
move.b #$2A,($A04000).l ; $A04000 = $2A -> Write to DAC channel | move.b #$2A,($A04000).l ; $A04000 = $2A -> Write to DAC channel | ||
PlayPCM_Loop: | PlayPCM_Loop: | ||
Line 34: | Line 51: | ||
return_PlayPCM: | return_PlayPCM: | ||
addq.w #4,sp | addq.w #4,sp | ||
− | rts</asm> | + | rts</syntaxhighlight> |
− | + | Also you can change <syntaxhighlight lang="asm">move.w #$14,d0</syntaxhighlight> to get different sample rates. For example replacing 14 with 45 the PCM will play as 8khz. | |
+ | |||
+ | ==GitHub disassembly continuation== | ||
+ | If you are using the latest version of the GitHub community disassembly, the Sega PCM will always work and you don't need to apply the above fix. | ||
+ | |||
+ | If, however, you want the ability to stop the Sega sound by pressing start, then you will need to perform the steps on the previous section. You may skip the first part (defining ''SegaPCM_end'') as it is already done; on the remainder, search for ''PlaySega'' instead of ''Sound_E1''. At this point, the ''Sonic 1'' z80 sound driver does not allow interrupting the Sega PCM, which is why that is needed. In addition, you will have to go to the ReadJoypads function and change this: | ||
+ | <syntaxhighlight lang="asm">ReadJoypads: ; XREF: VBlank, HBlank | ||
+ | lea (v_jpadhold1).w,a0 ; address where joypad states are written | ||
+ | lea ($A10003).l,a1 ; first joypad port | ||
+ | bsr.s @read ; do the first joypad | ||
+ | addq.w #2,a1 ; do the second joypad | ||
+ | |||
+ | @read:</syntaxhighlight> | ||
+ | to this: | ||
+ | <syntaxhighlight lang="asm">ReadJoypads: ; XREF: VBlank, HBlank | ||
+ | lea (v_jpadhold1).w,a0 ; address where joypad states are written | ||
+ | lea ($A10003).l,a1 ; first joypad port | ||
+ | bsr.s Joypad_Read ; do the first joypad | ||
+ | addq.w #2,a1 ; do the second joypad | ||
+ | |||
+ | Joypad_Read:</syntaxhighlight> | ||
+ | |||
+ | or else you'll get an error when building. | ||
+ | {{S1Howtos}} | ||
+ | |Fix the SEGA Sound]] |
Latest revision as of 11:12, 25 August 2018
(Original guide by Puto)
Let's fix a problem that causes a great deal of pain to anyone adding code to Sonic 1: The SEGA sound.
The bug
The bug is when sometimes when you build the ROM, at the very end of the "SEGA" sound is a static noise (probably the bat sound) so it sounds like, "SEGA-TS" . There is also another one, which sounds like "THOUGNGH-THOUGNGH" .So anyway, lets fix this!
Fixing the bug
Go to "segapcm:" and you should see:
SegaPCM: incbin sound\segapcm.bin
even
now change it to this
SegaPCM: incbin sound\segapcm.bin
SegaPCM_end: even
Then go to Sound_E1, and replace all of this code:
Sound_E1: ; XREF: Sound_ExIndex
move.b #$88,($A01FFF).l
move.w #0,($A11100).l ; start the Z80
move.w #$11,d1
loc_71FC0:
move.w #-1,d0
loc_71FC4:
nop
dbf d0,loc_71FC4
dbf d1,loc_71FC0
addq.w #4,sp
rts
With this:
Sound_E1:
lea (SegaPCM).l,a2 ; Load the SEGA PCM sample into a2. It's important that we use a2 since a0 and a1 are going to be used up ahead when reading the joypad ports
move.l #(SegaPCM_End-SegaPCM),d3 ; Load the size of the SEGA PCM sample into d3
move.b #$2A,($A04000).l ; $A04000 = $2A -> Write to DAC channel
PlayPCM_Loop:
move.b (a2)+,($A04001).l ; Write the PCM data (contained in a2) to $A04001 (YM2612 register D0)
move.w #$14,d0 ; Write the pitch ($14 in this case) to d0
dbf d0,* ; Decrement d0; jump to itself if not 0. (for pitch control, avoids playing the sample too fast)
sub.l #1,d3 ; Subtract 1 from the PCM sample size
beq.s return_PlayPCM ; If d3 = 0, we finished playing the PCM sample, so stop playing, leave this loop, and unfreeze the 68K
lea ($FFFFF604).w,a0 ; address where JoyPad states are written
lea ($A10003).l,a1 ; address where JoyPad states are read from
jsr (Joypad_Read).w ; Read only the first joypad port. It's important that we do NOT do the two ports, we don't have the cycles for that
btst #7,($FFFFF604).w ; Check for Start button
bne.s return_PlayPCM ; If start is pressed, stop playing, leave this loop, and unfreeze the 68K
bra.s PlayPCM_Loop ; Otherwise, continue playing PCM sample
return_PlayPCM:
addq.w #4,sp
rts
move.w #$14,d0
GitHub disassembly continuation
If you are using the latest version of the GitHub community disassembly, the Sega PCM will always work and you don't need to apply the above fix.
If, however, you want the ability to stop the Sega sound by pressing start, then you will need to perform the steps on the previous section. You may skip the first part (defining SegaPCM_end) as it is already done; on the remainder, search for PlaySega instead of Sound_E1. At this point, the Sonic 1 z80 sound driver does not allow interrupting the Sega PCM, which is why that is needed. In addition, you will have to go to the ReadJoypads function and change this:
ReadJoypads: ; XREF: VBlank, HBlank
lea (v_jpadhold1).w,a0 ; address where joypad states are written
lea ($A10003).l,a1 ; first joypad port
bsr.s @read ; do the first joypad
addq.w #2,a1 ; do the second joypad
@read:
to this:
ReadJoypads: ; XREF: VBlank, HBlank
lea (v_jpadhold1).w,a0 ; address where joypad states are written
lea ($A10003).l,a1 ; first joypad port
bsr.s Joypad_Read ; do the first joypad
addq.w #2,a1 ; do the second joypad
Joypad_Read:
or else you'll get an error when building.
|Fix the SEGA Sound]]