Actions

SCHG How-to

Difference between revisions of "Fix the SEGA Sound"

From Sonic Retro

(SVN disassembly continuation: It plays slowly because you're calling the wrong routine)
(changed move.l #$6978,d3 to a sizeof so if the sample is changed you don't have to worry about finding the size of the new pcm value and pointed out that chaning a value gets differnet sample rates)
Line 2: Line 2:
  
 
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.  
 
+
Step1:
So go to ''Sound_E1'', and replace this:
+
go to segapcm:
 +
you should see
 +
<asm>
 +
SegaPCM: incbin sound\segapcm.bin
 +
even
 +
</asm>
 +
now change it to this
 +
<asm>
 +
SegaPCM: incbin sound\segapcm.bin
 +
SegaPCM_end: even
 +
</asm>
 +
Then go to ''Sound_E1'', and replace this:
 
<asm>Sound_E1: ; XREF: Sound_ExIndex
 
<asm>Sound_E1: ; XREF: Sound_ExIndex
 
move.b #$88,($A01FFF).l
 
move.b #$88,($A01FFF).l
Line 20: Line 31:
 
<asm>Sound_E1:    
 
<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 #$6978,d3 ; Load the size of the SEGA PCM sample into d3  
+
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 37: Line 48:
 
addq.w #4,sp  
 
addq.w #4,sp  
 
rts</asm>
 
rts</asm>
 
+
Also you can change <asm>move.w #$14,d0</asm> to get different sample rates.For example replacing 14 with 45 will play as 8khz
 
== SVN disassembly continuation ==
 
== SVN disassembly continuation ==
 
If you are using the SVN community disassembly you need to do the following steps as well.
 
If you are using the SVN community disassembly you need to do the following steps as well.

Revision as of 20:53, 24 December 2010

(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. Step1: go to segapcm: you should see <asm> SegaPCM: incbin sound\segapcm.bin even </asm> now change it to this <asm> SegaPCM: incbin sound\segapcm.bin SegaPCM_end: even </asm> Then go to Sound_E1, and replace this: <asm>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</asm>

With this: <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 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</asm> Also you can change <asm>move.w #$14,d0</asm> to get different sample rates.For example replacing 14 with 45 will play as 8khz

SVN disassembly continuation

If you are using the SVN community disassembly you need to do the following steps as well.

Firstly, go to ReadJoypads and change <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:</asm> to <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 ReadJoypad ; do the first joypad addq.w #2,a1 ; do the second joypad

ReadJoypad:</asm>

Then change the following line: <asm>jsr (Joypad_Read).w</asm> to: <asm>jsr (ReadJoypad).w</asm> or else you'll get an error when building.