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

View File

@ -108,6 +108,27 @@ SCORPION_FREQ_LOW equ 214
SCORPION_CONTROL equ SOUND_SWAP_MODE
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
; Spider sound
@ -641,31 +662,28 @@ playBonusSound entry
short m
lda >SOUND_SYSTEM_VOLUME
and #$0f
ora #$20
sta >SOUND_CONTROL_REG
lda bonusSoundOscReg
sta >SOUND_ADDR_LOW
lda #BONUS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
sta >SOUND_DATA_REG
_writeReg bonusSoundOscReg,#BONUS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
iny
lda #BONUS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
sta >SOUND_DATA_REG
jsr writeReg
lda bonusSoundOscReg
and #$1f
ora #SOUND_REG_VOLUME
sta >SOUND_ADDR_LOW
tay
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x
sta >SOUND_DATA_REG
eor #$ff
sta >SOUND_DATA_REG
jsr writeReg
lda bonusSoundOscReg
sta >SOUND_ADDR_LOW
lda #BONUS_CONTROL+SOUND_RIGHT_SPEAKER
sta >SOUND_DATA_REG
_writeReg bonusSoundOscReg,#BONUS_CONTROL+SOUND_RIGHT_SPEAKER
iny
lda #BONUS_CONTROL+SOUND_LEFT_SPEAKER
sta >SOUND_DATA_REG
jsr writeReg
long m
lda bonusSoundOscReg
@ -758,31 +776,25 @@ playKillSound entry
playFireSound entry
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
ora #$20
sta >SOUND_CONTROL_REG
lda #SOUND_REG_CONTROL+FIRE_OSC_NUM
sta >SOUND_ADDR_LOW
lda #FIRE_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
sta >SOUND_DATA_REG
lda #FIRE_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
sta >SOUND_DATA_REG
_writeReg #SOUND_REG_CONTROL+FIRE_OSC_NUM,#FIRE_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+FIRE_OSC_NUM+1,#FIRE_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
lda #SOUND_REG_VOLUME+FIRE_OSC_NUM
sta >SOUND_ADDR_LOW
ldy #SOUND_REG_VOLUME+FIRE_OSC_NUM
lda tileRightVolume,x
jsr writeReg
ldy #SOUND_REG_VOLUME+FIRE_OSC_NUM+1
lda tileRightVolume,x
sta >SOUND_DATA_REG
eor #$ff
sta >SOUND_DATA_REG
jsr writeReg
lda #SOUND_REG_CONTROL+FIRE_OSC_NUM
sta >SOUND_ADDR_LOW
lda #FIRE_CONTROL+SOUND_RIGHT_SPEAKER
sta >SOUND_DATA_REG
lda #FIRE_CONTROL+SOUND_LEFT_SPEAKER
sta >SOUND_DATA_REG
_writeReg #SOUND_REG_CONTROL+FIRE_OSC_NUM,#FIRE_CONTROL+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+FIRE_OSC_NUM+1,#FIRE_CONTROL+SOUND_LEFT_SPEAKER
long m
rtl
@ -1314,5 +1326,6 @@ fleaVolume dc i2'0'
segmentSoundIsPlaying dc i2'1'
spiderSoundIsPlaying dc i2'1'
scorpionSoundIsPlaying dc i2'1'
registerValue dc i2'0'
end

View File

@ -253,3 +253,18 @@ _incrementScore_noExtraMan&SYSCNT anop
_incrementScore_no2000&SYSCNT anop
sta scoreWithin20000,x
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
# This magic ensures that clicking stop in Xcode results in the emulator terminating.
if true
if false
then
cd make
sed -i "" "s:^s7d1 *=.*$:s7d1 = $BOOTIMAGE: