Start to change the sound code to wait for the doc to be free and to write and then read to verify that the register write succeeded or try again. That seems to cleanup the sound on real HW. I have only done this for the bonus and the firing sound but probably all register writes should be done this way.

This commit is contained in:
Jeremy Rand 2021-01-22 00:34:07 -05:00
parent cf85ec4cb3
commit a4a4b9ae4d
4 changed files with 63 additions and 35 deletions

View File

@ -7,7 +7,7 @@
<key>Binary.xcscheme_^#shared#^_</key> <key>Binary.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>3</integer> <integer>2</integer>
</dict> </dict>
<key>BuGS.xcscheme_^#shared#^_</key> <key>BuGS.xcscheme_^#shared#^_</key>
<dict> <dict>
@ -17,12 +17,12 @@
<key>DiskImage.xcscheme_^#shared#^_</key> <key>DiskImage.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>2</integer> <integer>1</integer>
</dict> </dict>
<key>doNotBuild.xcscheme_^#shared#^_</key> <key>doNotBuild.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>1</integer> <integer>3</integer>
</dict> </dict>
</dict> </dict>
</dict> </dict>

View File

@ -108,6 +108,27 @@ SCORPION_FREQ_LOW equ 214
SCORPION_CONTROL equ SOUND_SWAP_MODE SCORPION_CONTROL equ SOUND_SWAP_MODE
SCORPION_SIZE equ $2d SCORPION_SIZE equ $2d
; Y has the register to write to (16 bit mode)
; A has the value to write (8 bit mode)
; Assuming not in increment mode
writeReg entry
sta registerValue
writeReg_loop anop
tya
sta >SOUND_ADDR_LOW
_docWait
lda registerValue
sta >SOUND_DATA_REG
tya
sta >SOUND_ADDR_LOW
_docWait
lda >SOUND_DATA_REG
lda >SOUND_DATA_REG
cmp registerValue
bne writeReg_loop
rts
soundInit entry soundInit entry
; Spider sound ; Spider sound
@ -641,31 +662,28 @@ playBonusSound entry
short m short m
lda >SOUND_SYSTEM_VOLUME lda >SOUND_SYSTEM_VOLUME
and #$0f and #$0f
ora #$20
sta >SOUND_CONTROL_REG sta >SOUND_CONTROL_REG
lda bonusSoundOscReg _writeReg bonusSoundOscReg,#BONUS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
sta >SOUND_ADDR_LOW iny
lda #BONUS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
sta >SOUND_DATA_REG
lda #BONUS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER lda #BONUS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
sta >SOUND_DATA_REG jsr writeReg
lda bonusSoundOscReg lda bonusSoundOscReg
and #$1f and #$1f
ora #SOUND_REG_VOLUME ora #SOUND_REG_VOLUME
sta >SOUND_ADDR_LOW tay
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x lda tileRightVolume,x
sta >SOUND_DATA_REG
eor #$ff eor #$ff
sta >SOUND_DATA_REG jsr writeReg
lda bonusSoundOscReg _writeReg bonusSoundOscReg,#BONUS_CONTROL+SOUND_RIGHT_SPEAKER
sta >SOUND_ADDR_LOW iny
lda #BONUS_CONTROL+SOUND_RIGHT_SPEAKER
sta >SOUND_DATA_REG
lda #BONUS_CONTROL+SOUND_LEFT_SPEAKER lda #BONUS_CONTROL+SOUND_LEFT_SPEAKER
sta >SOUND_DATA_REG jsr writeReg
long m long m
lda bonusSoundOscReg lda bonusSoundOscReg
@ -758,31 +776,25 @@ playKillSound entry
playFireSound entry playFireSound entry
short m short m
_docWait
lda >SOUND_SYSTEM_VOLUME lda >SOUND_SYSTEM_VOLUME
and #$0f and #$0f
ora #$20
sta >SOUND_CONTROL_REG sta >SOUND_CONTROL_REG
lda #SOUND_REG_CONTROL+FIRE_OSC_NUM _writeReg #SOUND_REG_CONTROL+FIRE_OSC_NUM,#FIRE_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
sta >SOUND_ADDR_LOW _writeReg #SOUND_REG_CONTROL+FIRE_OSC_NUM+1,#FIRE_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
lda #FIRE_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
sta >SOUND_DATA_REG
lda #FIRE_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
sta >SOUND_DATA_REG
lda #SOUND_REG_VOLUME+FIRE_OSC_NUM ldy #SOUND_REG_VOLUME+FIRE_OSC_NUM
sta >SOUND_ADDR_LOW lda tileRightVolume,x
jsr writeReg
ldy #SOUND_REG_VOLUME+FIRE_OSC_NUM+1
lda tileRightVolume,x lda tileRightVolume,x
sta >SOUND_DATA_REG
eor #$ff eor #$ff
sta >SOUND_DATA_REG jsr writeReg
lda #SOUND_REG_CONTROL+FIRE_OSC_NUM _writeReg #SOUND_REG_CONTROL+FIRE_OSC_NUM,#FIRE_CONTROL+SOUND_RIGHT_SPEAKER
sta >SOUND_ADDR_LOW _writeReg #SOUND_REG_CONTROL+FIRE_OSC_NUM+1,#FIRE_CONTROL+SOUND_LEFT_SPEAKER
lda #FIRE_CONTROL+SOUND_RIGHT_SPEAKER
sta >SOUND_DATA_REG
lda #FIRE_CONTROL+SOUND_LEFT_SPEAKER
sta >SOUND_DATA_REG
long m long m
rtl rtl
@ -1314,5 +1326,6 @@ fleaVolume dc i2'0'
segmentSoundIsPlaying dc i2'1' segmentSoundIsPlaying dc i2'1'
spiderSoundIsPlaying dc i2'1' spiderSoundIsPlaying dc i2'1'
scorpionSoundIsPlaying dc i2'1' scorpionSoundIsPlaying dc i2'1'
registerValue dc i2'0'
end end

View File

@ -253,3 +253,18 @@ _incrementScore_noExtraMan&SYSCNT anop
_incrementScore_no2000&SYSCNT anop _incrementScore_no2000&SYSCNT anop
sta scoreWithin20000,x sta scoreWithin20000,x
mend mend
; Wait for the DOC to be ready
macro
_docWait
_docWait_&SYSCNT anop
lda >SOUND_CONTROL_REG
bmi _docWait_&SYSCNT
mend
macro
_writeReg &reg,&value
ldy &reg
lda &value
jsr writeReg
mend

View File

@ -29,7 +29,7 @@ then
fi fi
# This magic ensures that clicking stop in Xcode results in the emulator terminating. # This magic ensures that clicking stop in Xcode results in the emulator terminating.
if true if false
then then
cd make cd make
sed -i "" "s:^s7d1 *=.*$:s7d1 = $BOOTIMAGE: sed -i "" "s:^s7d1 *=.*$:s7d1 = $BOOTIMAGE: