Implement stereo sound. Sounds now come from the left or the right speaker depending on where the sound is coming from on the screen as much as possible.

This commit is contained in:
Jeremy Rand 2020-12-22 23:40:21 -05:00
parent d4d511ee4f
commit b432cf654b
8 changed files with 406 additions and 121 deletions

View File

@ -210,7 +210,6 @@ addFlea_fast anop
lda #SPRITE_SPEED_FAST
addFlea_setSpeed anop
jsl setFleaSpeed
jsl startFleaSound
lda #FLEA_STATE_FALLING
sta fleaState
@ -236,6 +235,9 @@ addFlea_setSpeed anop
sec
sbc #6*SCREEN_BYTES_PER_ROW+3
sta fleaScreenOffset
ldx fleaTileOffsets
jsl startFleaSound
addFlea_done anop
rtl
@ -291,6 +293,7 @@ shootFlea entry
beq shootFlea_faster
jsl explodeFlea
ldx fleaTileOffsets
jsl playKillSound
jmp scoreAddTwoHundred

View File

@ -78,8 +78,8 @@ resetMushrooms_keepChecking anop
sta tileType,x
lda #TILE_STATE_DIRTY
sta tileDirty,x
jsl scoreAddFive
jsl playBonusSound
jsl scoreAddFive
ldx mushroomToRefresh
lda #EXPLOSION_LAST_OFFSET
sta mushroomExplosionSprite

View File

@ -371,6 +371,7 @@ shootScorpion entry
inc a
inc a
sta scorpionScreenOffset
ldx scorpionTileOffsets+2
jsl playKillSound
jmp scoreAddOneThousand

View File

@ -1827,7 +1827,11 @@ isSegmentCollision_returnTrue anop
; Call this with the segment num * 2 in the X register
shootSegment entry
phx
ldy segmentPosOffset,x
ldx segmentCurrentTile,y
jsl playKillSound
plx
phx
lda segmentStates,x
cmp #SEGMENT_STATE_BODY
beq shootSegment_body

View File

@ -79,7 +79,6 @@ updateShot_shifted anop
updateShot_notNone anop
cmp #SHOT_STATE_START_SHOOTING
bne updateShot_shooting
jsl playFireSound
lda SHOT_STATE_SHOOTING
sta shotState
lda #1
@ -106,6 +105,7 @@ updateShot_findDirty anop
tax
lda tileBelow,x
sta shotTileOffsetBelow
jsl playFireSound
bra updateShot_drawShot
updateShot_shooting anop

View File

@ -13,7 +13,7 @@
gameSound start
using globalData
using tileData
using screenData
SOUND_REG_FREQ_LOW equ $0000
@ -26,65 +26,76 @@ SOUND_REG_SIZE equ $00c0
SOUND_HALTED equ 1
SOUND_STARTED equ 0
; According to all of the documentation I can find, $00 should be the right speaker and
; $10 should be the left. But based on GSPlus and mame, I see the opposite. Still need
; to check on my HW. But in the end, it could be that some HW demultiplexed them backwards
; so there could be either out there in the wild.
SOUND_RIGHT_SPEAKER equ $10
SOUND_LEFT_SPEAKER equ $00
; OSC 16 - 19 for L/R channels in swap mode
SPIDER_SOUND_ADDR equ $0000
SPIDER_OSC_NUM equ 8
SPIDER_OSC_NUM equ 16
SPIDER_FREQ_HIGH equ 0
SPIDER_FREQ_LOW equ 214
SPIDER_VOLUME equ 255
SPIDER_VOLUME equ 128
SPIDER_CONTROL equ 6
SPIDER_SIZE equ $36
; OSC 10 & 11 for L/R channels
DEATH_SOUND_ADDR equ $4000
DEATH_OSC_NUM equ 5
DEATH_OSC_NUM equ 10
DEATH_FREQ_HIGH equ 0
DEATH_FREQ_LOW equ 214
DEATH_VOLUME equ 255
DEATH_VOLUME equ 80
DEATH_CONTROL equ 2
DEATH_SIZE equ $36
; OSC 12 - 15 for L/R channels in swap mode
SEGMENTS_SOUND_ADDR equ $7000
SEGMENTS_OSC_NUM equ 6
SEGMENTS_OSC_NUM equ 12
SEGMENTS_FREQ_HIGH equ 0
SEGMENTS_FREQ_LOW equ 214
SEGMENTS_VOLUME equ 255
SEGMENTS_VOLUME equ 80
SEGMENTS_CONTROL equ 6
SEGMENTS_SIZE equ $24
; OSC 20 & 21 for L/R channels
EXTRA_LIFE_SOUND_ADDR equ $8000
EXTRA_LIFE_OSC_NUM equ 10
EXTRA_LIFE_OSC_NUM equ 20
EXTRA_LIFE_FREQ_HIGH equ 0
EXTRA_LIFE_FREQ_LOW equ 107
EXTRA_LIFE_VOLUME equ 255
EXTRA_LIFE_VOLUME equ 128
EXTRA_LIFE_CONTROL equ 2
EXTRA_LIFE_SIZE equ $36
; OSC 0 - 5 to have 3x L/R channels
BONUS_SOUND_ADDR equ $b000
BONUS_OSC_NUM equ 0
BONUS_FREQ_HIGH equ 0
BONUS_FREQ_LOW equ 214
BONUS_VOLUME equ 255
BONUS_CONTROL equ 2
BONUS_SIZE equ $24
; OSC 8 & 9 for L/R channels
KILL_SOUND_ADDR equ $c000
KILL_OSC_NUM equ 4
KILL_OSC_NUM equ 8
KILL_FREQ_HIGH equ 0
KILL_FREQ_LOW equ 214
KILL_VOLUME equ 255
KILL_CONTROL equ 2
KILL_SIZE equ $24
; OSC 6 & 7 for L/R channels
FIRE_SOUND_ADDR equ $d000
FIRE_OSC_NUM equ 3
FIRE_OSC_NUM equ 6
FIRE_FREQ_HIGH equ 0
FIRE_FREQ_LOW equ 214
FIRE_VOLUME equ 255
FIRE_CONTROL equ 2
FIRE_SIZE equ $1b
; OSC 22 - 25 for L/R channels in swap mode
FLEA_SOUND_ADDR equ $3a00
FLEA_OSC_NUM equ 12
FLEA_VOLUME equ 255
FLEA_OSC_NUM equ 22
FLEA_CONTROL equ 6
FLEA_SIZE equ $00
FLEA_FRAME_COUNT equ 5
@ -202,9 +213,33 @@ soundInit_writeRegLow anop
ldx #SOUND_REG_POINTER+SPIDER_OSC_NUM
jsl writeConsecSoundReg
lda #SPIDER_CONTROL+SOUND_HALTED
lda #SPIDER_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+SPIDER_OSC_NUM
jsl writeConsecSoundReg
lda #SPIDER_FREQ_LOW
ldx #SOUND_REG_FREQ_LOW+SPIDER_OSC_NUM+2
jsl writeConsecSoundReg
lda #SPIDER_FREQ_HIGH
ldx #SOUND_REG_FREQ_HIGH+SPIDER_OSC_NUM+2
jsl writeConsecSoundReg
lda #SPIDER_VOLUME
ldx #SOUND_REG_VOLUME+SPIDER_OSC_NUM+2
jsl writeConsecSoundReg
lda #SPIDER_SIZE
ldx #SOUND_REG_SIZE+SPIDER_OSC_NUM+2
jsl writeConsecSoundReg
lda #SPIDER_SOUND_ADDR/256
ldx #SOUND_REG_POINTER+SPIDER_OSC_NUM+2
jsl writeConsecSoundReg
lda #SPIDER_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+SPIDER_OSC_NUM+2
jsl writeConsecSoundReg
; Death sound
@ -213,26 +248,30 @@ soundInit_writeRegLow anop
lda #DEATH_FREQ_LOW
ldx #SOUND_REG_FREQ_LOW+DEATH_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #DEATH_FREQ_HIGH
ldx #SOUND_REG_FREQ_HIGH+DEATH_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #DEATH_VOLUME
ldx #SOUND_REG_VOLUME+DEATH_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #DEATH_SIZE
ldx #SOUND_REG_SIZE+DEATH_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #DEATH_SOUND_ADDR/256
ldx #SOUND_REG_POINTER+DEATH_OSC_NUM
jsl writeConsecSoundReg
lda #DEATH_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+DEATH_OSC_NUM
jsl writeSoundReg
lda #DEATH_CONTROL+SOUND_HALTED
ldx #SOUND_REG_CONTROL+DEATH_OSC_NUM
lda #DEATH_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+DEATH_OSC_NUM+1
jsl writeSoundReg
@ -260,9 +299,33 @@ soundInit_writeRegLow anop
ldx #SOUND_REG_POINTER+SEGMENTS_OSC_NUM
jsl writeConsecSoundReg
lda #SEGMENTS_CONTROL+SOUND_HALTED
lda #SEGMENTS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM
jsl writeConsecSoundReg
lda #SEGMENTS_FREQ_LOW
ldx #SOUND_REG_FREQ_LOW+SEGMENTS_OSC_NUM+2
jsl writeConsecSoundReg
lda #SEGMENTS_FREQ_HIGH
ldx #SOUND_REG_FREQ_HIGH+SEGMENTS_OSC_NUM+2
jsl writeConsecSoundReg
lda #SEGMENTS_VOLUME
ldx #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+2
jsl writeConsecSoundReg
lda #SEGMENTS_SIZE
ldx #SOUND_REG_SIZE+SEGMENTS_OSC_NUM+2
jsl writeConsecSoundReg
lda #SEGMENTS_SOUND_ADDR/256
ldx #SOUND_REG_POINTER+SEGMENTS_OSC_NUM+2
jsl writeConsecSoundReg
lda #SEGMENTS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+2
jsl writeConsecSoundReg
; Bonus sound
@ -271,74 +334,74 @@ soundInit_writeRegLow anop
lda #BONUS_FREQ_LOW
ldx #SOUND_REG_FREQ_LOW+BONUS_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #BONUS_FREQ_HIGH
ldx #SOUND_REG_FREQ_HIGH+BONUS_OSC_NUM
jsl writeSoundReg
lda #BONUS_VOLUME
ldx #SOUND_REG_VOLUME+BONUS_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #BONUS_SIZE
ldx #SOUND_REG_SIZE+BONUS_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #BONUS_SOUND_ADDR/256
ldx #SOUND_REG_POINTER+BONUS_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #BONUS_CONTROL+SOUND_HALTED
lda #BONUS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+BONUS_OSC_NUM
jsl writeSoundReg
lda #BONUS_FREQ_LOW
ldx #SOUND_REG_FREQ_LOW+BONUS_OSC_NUM+1
jsl writeSoundReg
lda #BONUS_FREQ_HIGH
ldx #SOUND_REG_FREQ_HIGH+BONUS_OSC_NUM+1
jsl writeSoundReg
lda #BONUS_VOLUME
ldx #SOUND_REG_VOLUME+BONUS_OSC_NUM+1
jsl writeSoundReg
lda #BONUS_SIZE
ldx #SOUND_REG_SIZE+BONUS_OSC_NUM+1
jsl writeSoundReg
lda #BONUS_SOUND_ADDR/256
ldx #SOUND_REG_POINTER+BONUS_OSC_NUM+1
jsl writeSoundReg
lda #BONUS_CONTROL+SOUND_HALTED
lda #BONUS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+BONUS_OSC_NUM+1
jsl writeSoundReg
lda #BONUS_FREQ_LOW
ldx #SOUND_REG_FREQ_LOW+BONUS_OSC_NUM+2
jsl writeSoundReg
jsl writeConsecSoundReg
lda #BONUS_FREQ_HIGH
ldx #SOUND_REG_FREQ_HIGH+BONUS_OSC_NUM+2
jsl writeSoundReg
lda #BONUS_VOLUME
ldx #SOUND_REG_VOLUME+BONUS_OSC_NUM+2
jsl writeSoundReg
jsl writeConsecSoundReg
lda #BONUS_SIZE
ldx #SOUND_REG_SIZE+BONUS_OSC_NUM+2
jsl writeSoundReg
jsl writeConsecSoundReg
lda #BONUS_SOUND_ADDR/256
ldx #SOUND_REG_POINTER+BONUS_OSC_NUM+2
jsl writeConsecSoundReg
lda #BONUS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+BONUS_OSC_NUM+2
jsl writeSoundReg
lda #BONUS_CONTROL+SOUND_HALTED
ldx #SOUND_REG_CONTROL+BONUS_OSC_NUM+2
lda #BONUS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+BONUS_OSC_NUM+3
jsl writeSoundReg
lda #BONUS_FREQ_LOW
ldx #SOUND_REG_FREQ_LOW+BONUS_OSC_NUM+4
jsl writeConsecSoundReg
lda #BONUS_FREQ_HIGH
ldx #SOUND_REG_FREQ_HIGH+BONUS_OSC_NUM+4
jsl writeConsecSoundReg
lda #BONUS_SIZE
ldx #SOUND_REG_SIZE+BONUS_OSC_NUM+4
jsl writeConsecSoundReg
lda #BONUS_SOUND_ADDR/256
ldx #SOUND_REG_POINTER+BONUS_OSC_NUM+4
jsl writeConsecSoundReg
lda #BONUS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+BONUS_OSC_NUM+4
jsl writeSoundReg
lda #BONUS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+BONUS_OSC_NUM+5
jsl writeSoundReg
; Kill sound
@ -347,26 +410,26 @@ soundInit_writeRegLow anop
lda #KILL_FREQ_LOW
ldx #SOUND_REG_FREQ_LOW+KILL_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #KILL_FREQ_HIGH
ldx #SOUND_REG_FREQ_HIGH+KILL_OSC_NUM
jsl writeSoundReg
lda #KILL_VOLUME
ldx #SOUND_REG_VOLUME+KILL_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #KILL_SIZE
ldx #SOUND_REG_SIZE+KILL_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #KILL_SOUND_ADDR/256
ldx #SOUND_REG_POINTER+KILL_OSC_NUM
jsl writeConsecSoundReg
lda #KILL_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+KILL_OSC_NUM
jsl writeSoundReg
lda #KILL_CONTROL+SOUND_HALTED
ldx #SOUND_REG_CONTROL+KILL_OSC_NUM
lda #KILL_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+KILL_OSC_NUM+1
jsl writeSoundReg
@ -376,26 +439,26 @@ soundInit_writeRegLow anop
lda #FIRE_FREQ_LOW
ldx #SOUND_REG_FREQ_LOW+FIRE_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #FIRE_FREQ_HIGH
ldx #SOUND_REG_FREQ_HIGH+FIRE_OSC_NUM
jsl writeSoundReg
lda #FIRE_VOLUME
ldx #SOUND_REG_VOLUME+FIRE_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #FIRE_SIZE
ldx #SOUND_REG_SIZE+FIRE_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #FIRE_SOUND_ADDR/256
ldx #SOUND_REG_POINTER+FIRE_OSC_NUM
jsl writeConsecSoundReg
lda #FIRE_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+FIRE_OSC_NUM
jsl writeSoundReg
lda #FIRE_CONTROL+SOUND_HALTED
ldx #SOUND_REG_CONTROL+FIRE_OSC_NUM
lda #FIRE_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+FIRE_OSC_NUM+1
jsl writeSoundReg
; Extra life sound
@ -404,36 +467,36 @@ soundInit_writeRegLow anop
lda #EXTRA_LIFE_FREQ_LOW
ldx #SOUND_REG_FREQ_LOW+EXTRA_LIFE_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #EXTRA_LIFE_FREQ_HIGH
ldx #SOUND_REG_FREQ_HIGH+EXTRA_LIFE_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #EXTRA_LIFE_VOLUME
ldx #SOUND_REG_VOLUME+EXTRA_LIFE_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #EXTRA_LIFE_SIZE
ldx #SOUND_REG_SIZE+EXTRA_LIFE_OSC_NUM
jsl writeSoundReg
jsl writeConsecSoundReg
lda #EXTRA_LIFE_SOUND_ADDR/256
ldx #SOUND_REG_POINTER+EXTRA_LIFE_OSC_NUM
jsl writeConsecSoundReg
lda #EXTRA_LIFE_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+EXTRA_LIFE_OSC_NUM
jsl writeSoundReg
lda #EXTRA_LIFE_CONTROL+SOUND_HALTED
ldx #SOUND_REG_CONTROL+EXTRA_LIFE_OSC_NUM
lda #EXTRA_LIFE_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+EXTRA_LIFE_OSC_NUM+1
jsl writeSoundReg
; Flea sound
pea FLEA_SOUND_ADDR
jsl loadFleaSound
lda #FLEA_VOLUME
ldx #SOUND_REG_VOLUME+FLEA_OSC_NUM
jsl writeConsecSoundReg
lda #FLEA_SIZE
ldx #SOUND_REG_SIZE+FLEA_OSC_NUM
jsl writeConsecSoundReg
@ -442,10 +505,22 @@ soundInit_writeRegLow anop
ldx #SOUND_REG_POINTER+FLEA_OSC_NUM
jsl writeConsecSoundReg
lda #FLEA_CONTROL+SOUND_HALTED
lda #FLEA_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+FLEA_OSC_NUM
jsl writeConsecSoundReg
lda #FLEA_SIZE
ldx #SOUND_REG_SIZE+FLEA_OSC_NUM+2
jsl writeConsecSoundReg
lda #FLEA_SOUND_ADDR/256
ldx #SOUND_REG_POINTER+FLEA_OSC_NUM+2
jsl writeConsecSoundReg
lda #FLEA_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+FLEA_OSC_NUM+2
jsl writeConsecSoundReg
rtl
@ -468,30 +543,67 @@ updateSounds_notDone anop
sty fleaSoundFreqOffset
lda fleaFreqs,y
pha
ldx #SOUND_REG_FREQ_LOW+FLEA_OSC_NUM
jsl writeConsecSoundReg
pla
ldx #SOUND_REG_FREQ_LOW+FLEA_OSC_NUM+2
jsl writeConsecSoundReg
ldy fleaSoundFreqOffset
lda fleaFreqs+1,y
pha
ldx #SOUND_REG_FREQ_HIGH+FLEA_OSC_NUM
jsl writeConsecSoundReg
pla
ldx #SOUND_REG_FREQ_HIGH+FLEA_OSC_NUM+2
jsl writeConsecSoundReg
updateSounds_done anop
rtl
playBonusSound entry
lda #BONUS_CONTROL+SOUND_HALTED
lda tileRightVolume,x
pha
lda #BONUS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx bonusSoundOscReg
jsl writeSoundReg
lda #BONUS_CONTROL
lda #BONUS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx bonusSoundOscReg
inx
jsl writeSoundReg
lda bonusSoundOscReg
and #$1f
ora #SOUND_REG_VOLUME
tax
pla
pha
phx
jsl writeSoundReg
plx
inx
pla
eor #$ff
jsl writeSoundReg
lda #BONUS_CONTROL+SOUND_RIGHT_SPEAKER
ldx bonusSoundOscReg
jsl writeSoundReg
lda #BONUS_CONTROL+SOUND_LEFT_SPEAKER
ldx bonusSoundOscReg
inx
jsl writeSoundReg
lda bonusSoundOscReg
inc a
cmp #SOUND_REG_CONTROL+BONUS_OSC_NUM+3
inc a
cmp #SOUND_REG_CONTROL+BONUS_OSC_NUM+6
blt playBonusSound_noWrap
lda #SOUND_REG_CONTROL+BONUS_OSC_NUM
playBonusSound_noWrap anop
@ -504,47 +616,122 @@ playDeathSound entry
jsl stopFleaSound
jsl stopScorpionSound
jsl stopSegmentSound
lda #DEATH_CONTROL+SOUND_HALTED
lda #DEATH_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+DEATH_OSC_NUM
jsl writeSoundReg
lda #DEATH_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+DEATH_OSC_NUM+1
jsl writeSoundReg
lda mouseAddress
sec
sbc #SCREEN_ADDRESS
and #$fffc
tax
lda >screenToTileOffset,x
tax
lda tileRightVolume,x
pha
ldx #SOUND_REG_VOLUME+DEATH_OSC_NUM
jsl writeSoundReg
pla
eor #$ff
ldx #SOUND_REG_VOLUME+DEATH_OSC_NUM+1
jsl writeSoundReg
lda #DEATH_CONTROL
lda #DEATH_CONTROL+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+DEATH_OSC_NUM
jsl writeSoundReg
lda #DEATH_CONTROL+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+DEATH_OSC_NUM+1
jsl writeSoundReg
rtl
playKillSound entry
lda #KILL_CONTROL+SOUND_HALTED
lda tileRightVolume,x
pha
lda #KILL_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+KILL_OSC_NUM
jsl writeSoundReg
lda #KILL_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+KILL_OSC_NUM+1
jsl writeSoundReg
pla
pha
ldx #SOUND_REG_VOLUME+KILL_OSC_NUM
jsl writeSoundReg
pla
eor #$ff
ldx #SOUND_REG_VOLUME+KILL_OSC_NUM+1
jsl writeSoundReg
lda #KILL_CONTROL
lda #KILL_CONTROL+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+KILL_OSC_NUM
jsl writeSoundReg
lda #KILL_CONTROL+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+KILL_OSC_NUM+1
jsl writeSoundReg
rtl
playFireSound entry
lda #FIRE_CONTROL+SOUND_HALTED
lda tileRightVolume,x
pha
lda #FIRE_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+FIRE_OSC_NUM
jsl writeSoundReg
lda #FIRE_CONTROL
lda #FIRE_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+FIRE_OSC_NUM+1
jsl writeSoundReg
pla
pha
ldx #SOUND_REG_VOLUME+FIRE_OSC_NUM
jsl writeSoundReg
pla
eor #$ff
ldx #SOUND_REG_VOLUME+FIRE_OSC_NUM+1
jsl writeSoundReg
lda #FIRE_CONTROL+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+FIRE_OSC_NUM
jsl writeSoundReg
lda #FIRE_CONTROL+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+FIRE_OSC_NUM+1
jsl writeSoundReg
rtl
playExtraLifeSound entry
lda #EXTRA_LIFE_CONTROL+SOUND_HALTED
lda #EXTRA_LIFE_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+EXTRA_LIFE_OSC_NUM
jsl writeSoundReg
lda #EXTRA_LIFE_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+EXTRA_LIFE_OSC_NUM+1
jsl writeSoundReg
lda #EXTRA_LIFE_CONTROL
lda #EXTRA_LIFE_CONTROL+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+EXTRA_LIFE_OSC_NUM
jsl writeSoundReg
lda #EXTRA_LIFE_CONTROL+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+EXTRA_LIFE_OSC_NUM+1
jsl writeSoundReg
rtl
@ -552,34 +739,77 @@ playExtraLifeSound entry
startSegmentSound entry
jsl stopSegmentSound
lda #SEGMENTS_CONTROL
lda #SEGMENTS_CONTROL+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM
jsl writeSoundReg
lda #SEGMENTS_CONTROL+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+2
jsl writeSoundReg
rtl
stopSegmentSound entry
lda #SEGMENTS_CONTROL+SOUND_HALTED
lda #SEGMENTS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM
jsl writeConsecSoundReg
lda #SEGMENTS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+2
jsl writeConsecSoundReg
rtl
startSpiderSound entry
lda tileRightVolume,x
pha
jsl stopSpiderSound
pla
pha
ldx #SOUND_REG_VOLUME+SPIDER_OSC_NUM
jsl writeConsecSoundReg
pla
eor #$ff
ldx #SOUND_REG_VOLUME+SPIDER_OSC_NUM+2
jsl writeConsecSoundReg
lda #SPIDER_CONTROL
lda #SPIDER_CONTROL+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+SPIDER_OSC_NUM
jsl writeSoundReg
lda #SPIDER_CONTROL+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+SPIDER_OSC_NUM+2
jsl writeSoundReg
rtl
updateSpiderSound entry
lda tileRightVolume,x
pha
ldx #SOUND_REG_VOLUME+SPIDER_OSC_NUM
jsl writeConsecSoundReg
pla
eor #$ff
ldx #SOUND_REG_VOLUME+SPIDER_OSC_NUM+2
jsl writeConsecSoundReg
rtl
stopSpiderSound entry
lda #SPIDER_CONTROL+SOUND_HALTED
lda #SPIDER_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+SPIDER_OSC_NUM
jsl writeConsecSoundReg
lda #SPIDER_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+SPIDER_OSC_NUM+2
jsl writeConsecSoundReg
rtl
@ -602,28 +832,54 @@ startFleaSound_doIt anop
stz fleaSoundIsPlaying
stz fleaSoundFreqOffset
lda tileRightVolume,x
pha
ldx #SOUND_REG_VOLUME+FLEA_OSC_NUM
jsl writeConsecSoundReg
pla
eor #$ff
ldx #SOUND_REG_VOLUME+FLEA_OSC_NUM+2
jsl writeConsecSoundReg
lda #FLEA_FRAME_COUNT
sta fleaSoundFrame
lda fleaFreqs
ldx #SOUND_REG_FREQ_LOW+FLEA_OSC_NUM
jsl writeConsecSoundReg
lda fleaFreqs
ldx #SOUND_REG_FREQ_LOW+FLEA_OSC_NUM+2
jsl writeConsecSoundReg
lda fleaFreqs+1
ldx #SOUND_REG_FREQ_HIGH+FLEA_OSC_NUM
jsl writeConsecSoundReg
lda #FLEA_CONTROL
lda fleaFreqs+1
ldx #SOUND_REG_FREQ_HIGH+FLEA_OSC_NUM+2
jsl writeConsecSoundReg
lda #FLEA_CONTROL+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+FLEA_OSC_NUM
jsl writeSoundReg
lda #FLEA_CONTROL+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+FLEA_OSC_NUM+2
jsl writeSoundReg
rtl
stopFleaSound entry
lda #FLEA_CONTROL+SOUND_HALTED
lda #FLEA_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
ldx #SOUND_REG_CONTROL+FLEA_OSC_NUM
jsl writeConsecSoundReg
lda #FLEA_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldx #SOUND_REG_CONTROL+FLEA_OSC_NUM+2
jsl writeConsecSoundReg
lda #1
sta fleaSoundIsPlaying
rtl

View File

@ -385,7 +385,9 @@ updateSpider_tilesRight_cont anop
stx spiderTileOffsets+4
lda tileRight,x
sta spiderTileOffsets
rtl
ldx spiderTileOffsets+6
jmp updateSpiderSound
updateSpider_tilesLeft anop
ldx spiderTileOffsets+4
@ -407,8 +409,9 @@ updateSpider_tilesLeft_cont anop
stx spiderTileOffsets+4
lda tileLeft,x
sta spiderTileOffsets+8
rtl
ldx spiderTileOffsets+6
jmp updateSpiderSound
updateSpider_tilesUp anop
lda spiderMaxShiftInTile
@ -446,7 +449,9 @@ updateSpider_tilesUpCont anop
stx spiderTileOffsets+8
lda tileAbove,x
sta spiderTileOffsets+10
rtl
ldx spiderTileOffsets+6
jmp updateSpiderSound
updateSpider_upChangeDir anop
lda #GAME_NUM_TILES_TALL-1
@ -521,7 +526,9 @@ updateSpider_tilesDownCont anop
stx spiderTileOffsets+10
lda tileBelow,x
sta spiderTileOffsets+8
rtl
ldx spiderTileOffsets+6
jmp updateSpiderSound
updateSpider_downChangeDir anop
lda spiderTargetRow
@ -570,7 +577,6 @@ addSpider entry
rtl
addSpider_checkSpeed anop
jsl startSpiderSound
lda gameScore+2
bne addSpider_fast
lda gameScore
@ -669,6 +675,9 @@ addSpider_left anop
tax
lda tileAbove,x
sta spiderTileOffsets+2
ldx spiderTileOffsets+6
jsl startSpiderSound
rtl
@ -703,7 +712,10 @@ addSpider_right anop
tax
lda tileAbove,x
sta spiderTileOffsets+10
ldx spiderTileOffsets+6
jsl startSpiderSound
rtl
@ -812,6 +824,7 @@ shootSpider entry
cmp #SPIDER_STATE_LEFT_DIAG_DOWN
blt shootSpider_done
ldx spiderTileOffsets+6
jsl playKillSound
jsl explodeSpider
cmp mouseAddress

View File

@ -92,6 +92,7 @@ our @gTileLeft = ("INVALID_TILE_NUM") x $gEquates{"TOTAL_NUM_TILES"};
our @gTileRight = ("INVALID_TILE_NUM") x $gEquates{"TOTAL_NUM_TILES"};
our @gTileBitOffset = (0) x $gEquates{"NUM_GAME_TILES"};
our @gTileBitMask = (0) x $gEquates{"NUM_GAME_TILES"};
our @gTileRightVolume = (0) x $gEquates{"TOTAL_NUM_TILES"};
our @gDirtyNonGameTiles = ("INVALID_TILE_NUM") x $gEquates{"NUM_NON_GAME_TILES"};
our $gNumDirtyNonGameTiles = 0;
@ -259,6 +260,8 @@ sub initTiles
$gTileRight[$lhsTileIndex] = lhsXYToTileOffset($tileX + 1, $tileY);
}
$gTileRightVolume[$lhsTileIndex] = 0;
$lhsTileIndex++;
$lastOffset += $gEquates{"TILE_BYTE_WIDTH"};
@ -307,6 +310,8 @@ sub initTiles
$gTileRight[$tileIndex] = gameXYToTileOffset($tileX + 1, $tileY);
}
$gTileRightVolume[$tileIndex] = $tileX * 255 / ($gEquates{"GAME_NUM_TILES_WIDE"} - 1);
$tileIndex++;
if ($bitMask == 0x8000)
@ -359,6 +364,8 @@ sub initTiles
$gTileRight[$rhsTileIndex] = rhsXYToTileOffset($tileX + 1, $tileY);
}
$gTileRightVolume[$rhsTileIndex] = 255;
$rhsTileIndex++;
$lastOffset += $gEquates{"TILE_BYTE_WIDTH"};
@ -503,6 +510,7 @@ printTileData($fh, "tileLeft", @gTileLeft);
printTileData($fh, "tileRight", @gTileRight);
printTileData($fh, "tileBitOffset", @gTileBitOffset);
printTileData($fh, "tileBitMask", @gTileBitMask);
printTileData($fh, "tileRightVolume", @gTileRightVolume);
printTileData($fh, "dirtyNonGameTiles", @gDirtyNonGameTiles);
printTileData($fh, "fleaFreqs", @gFleaFreqs);
printTileData($fh, "mouseYAddress", @gMouseYAddress);