BuGS/BuGS/gameSound.s

1038 lines
31 KiB
ArmAsm

;
; gameSound.s
; BuGS
;
; Created by Jeremy Rand on 2020-12-16.
;Copyright © 2020 Jeremy Rand. All rights reserved.
;
case on
mcopy gameSound.macros
keep gameSound
gameSound start
using globalData
using tileData
using screenData
SOUND_REG_FREQ_LOW equ $0000
SOUND_REG_FREQ_HIGH equ $0020
SOUND_REG_VOLUME equ $0040
SOUND_REG_POINTER equ $0080
SOUND_REG_CONTROL equ $00a0
SOUND_REG_SIZE equ $00c0
SOUND_HALTED equ 1
SOUND_STARTED equ 0
SOUND_SWAP_MODE equ 6
SOUND_ONE_SHOT_MODE equ 2
; 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.
;
; Now I am changing my mind about this. mame has been fixed. I think the 4soniq and GSplus
; are the only ones which are wrong. So, going with the Apple standard here.
SOUND_RIGHT_SPEAKER equ $00
SOUND_LEFT_SPEAKER equ $10
; OSC 16 - 19 for L/R channels in swap mode
SPIDER_SOUND_ADDR equ $0000
SPIDER_OSC_NUM equ 16
SPIDER_FREQ_HIGH equ 0
SPIDER_FREQ_LOW equ 214
SPIDER_CONTROL equ SOUND_SWAP_MODE
SPIDER_SIZE equ $36
; OSC 10 & 11 for L/R channels
DEATH_SOUND_ADDR equ $4000
DEATH_OSC_NUM equ 10
DEATH_FREQ_HIGH equ 0
DEATH_FREQ_LOW equ 214
DEATH_CONTROL equ SOUND_ONE_SHOT_MODE
DEATH_SIZE equ $2d
; OSC 12 - 15 for L/R channels in swap mode
SEGMENTS_SOUND_ADDR equ $7000
SEGMENTS_OSC_NUM equ 12
SEGMENTS_FREQ_HIGH equ 0
SEGMENTS_FREQ_LOW equ 214
SEGMENTS_VOLUME equ 128
SEGMENTS_CONTROL equ SOUND_SWAP_MODE
SEGMENTS_SIZE equ $24
; OSC 20 & 21 for L/R channels
EXTRA_LIFE_SOUND_ADDR equ $8000
EXTRA_LIFE_OSC_NUM equ 20
EXTRA_LIFE_FREQ_HIGH equ 0
EXTRA_LIFE_FREQ_LOW equ 107
EXTRA_LIFE_VOLUME equ 128
EXTRA_LIFE_CONTROL equ SOUND_ONE_SHOT_MODE
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_CONTROL equ SOUND_ONE_SHOT_MODE
BONUS_SIZE equ $24
; OSC 8 & 9 for L/R channels
KILL_SOUND_ADDR equ $c000
KILL_OSC_NUM equ 8
KILL_FREQ_HIGH equ 0
KILL_FREQ_LOW equ 214
KILL_CONTROL equ SOUND_ONE_SHOT_MODE
KILL_SIZE equ $24
; OSC 6 & 7 for L/R channels
FIRE_SOUND_ADDR equ $d000
FIRE_OSC_NUM equ 6
FIRE_FREQ_HIGH equ 0
FIRE_FREQ_LOW equ 214
FIRE_CONTROL equ SOUND_ONE_SHOT_MODE
FIRE_SIZE equ $1b
; OSC 22 - 25 for L/R channels in swap mode
FLEA_SOUND_ADDR equ $3a00
FLEA_OSC_NUM equ 22
FLEA_CONTROL equ SOUND_SWAP_MODE
FLEA_SIZE equ $00
; OSC 26 - 30 for L/R channels in swap mode
SCORPION_SOUND_ADDR equ $e000
SCORPION_OSC_NUM equ 26
SCORPION_FREQ_HIGH equ 0
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
; Y has the register to write to (16 bit mode)
; A has the value to write (8 bit mode)
; Assuming not in increment mode
writeRegNoRead entry
sta registerValue
tya
sta >SOUND_ADDR_LOW
_docWait
lda registerValue
sta >SOUND_DATA_REG
rts
soundInit entry
; Spider sound
pea SPIDER_SOUND_ADDR
jsl loadSpiderSound
; Death sound
pea DEATH_SOUND_ADDR
jsl loadDeathSound
; Segments sound
pea SEGMENTS_SOUND_ADDR
jsl loadSegmentsSound
; Bonus sound
pea BONUS_SOUND_ADDR
jsl loadBonusSound
; Kill sound
pea KILL_SOUND_ADDR
jsl loadKillSound
; Fire sound
pea FIRE_SOUND_ADDR
jsl loadFireSound
; Extra life sound
pea EXTRA_LIFE_SOUND_ADDR
jsl loadExtraLifeSound
; Flea sound
pea FLEA_SOUND_ADDR
jsl loadFleaSound
; Scorpion sound
pea SCORPION_SOUND_ADDR
jsl loadScorpionSound
; Set registers
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
ldx #soundRegDefaults
soundInit_loop anop
lda |$0,x
tay
lda |$1,x
jsr writeRegNoRead
inx
inx
cpx #soundRegDefaultsEnd
blt soundInit_loop
long m
rtl
updateSounds entry
lda gameState
beq updateSounds_done
lda fleaSoundIsPlaying
bne updateSounds_done
updateSounds_changeFreq anop
ldy fleaSoundFreqOffset
iny
iny
cpy #NUM_FLEA_FREQS*2
blt updateSounds_notDone
jmp stopFleaSound
updateSounds_notDone anop
sty fleaSoundFreqOffset
short m
lda >SOUND_SYSTEM_VOLUME
and #$0f
ora #$20
sta >SOUND_CONTROL_REG
lda #SOUND_REG_FREQ_LOW+FLEA_OSC_NUM
sta >SOUND_ADDR_LOW
lda fleaFreqs,y
sta >SOUND_DATA_REG
sta >SOUND_DATA_REG
sta >SOUND_DATA_REG
sta >SOUND_DATA_REG
lda #SOUND_REG_FREQ_HIGH+FLEA_OSC_NUM
sta >SOUND_ADDR_LOW
lda fleaFreqs+1,y
sta >SOUND_DATA_REG
sta >SOUND_DATA_REG
sta >SOUND_DATA_REG
sta >SOUND_DATA_REG
long m
updateSounds_done anop
rtl
playBonusSound entry
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg bonusSoundOscReg,#BONUS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
iny
lda #BONUS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
jsr writeReg
lda bonusSoundOscReg
and #$1f
ora #SOUND_REG_VOLUME
tay
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x
eor #$ff
jsr writeReg
_writeReg bonusSoundOscReg,#BONUS_CONTROL+SOUND_RIGHT_SPEAKER
iny
lda #BONUS_CONTROL+SOUND_LEFT_SPEAKER
jsr writeReg
long m
lda bonusSoundOscReg
inc a
inc a
cmp #SOUND_REG_CONTROL+BONUS_OSC_NUM+6
blt playBonusSound_noWrap
lda #SOUND_REG_CONTROL+BONUS_OSC_NUM
playBonusSound_noWrap anop
sta bonusSoundOscReg
rtl
playDeathSound entry
jsl stopSpiderSound
jsl stopFleaSound
jsl stopScorpionSound
jsl stopSegmentSound
lda mouseAddress
sec
sbc #SCREEN_ADDRESS
and #$fffc
tax
lda >screenToTileOffset,x
tax
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg #SOUND_REG_CONTROL+DEATH_OSC_NUM,#DEATH_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+DEATH_OSC_NUM+1,#DEATH_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldy #SOUND_REG_VOLUME+DEATH_OSC_NUM
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x
eor #$ff
jsr writeReg
_writeReg #SOUND_REG_CONTROL+DEATH_OSC_NUM,#DEATH_CONTROL+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+DEATH_OSC_NUM+1,#DEATH_CONTROL+SOUND_LEFT_SPEAKER
long m
rtl
playKillSound entry
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg #SOUND_REG_CONTROL+KILL_OSC_NUM,#KILL_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+KILL_OSC_NUM+1,#KILL_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
ldy #SOUND_REG_VOLUME+KILL_OSC_NUM
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x
eor #$ff
jsr writeReg
_writeReg #SOUND_REG_CONTROL+KILL_OSC_NUM,#KILL_CONTROL+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+KILL_OSC_NUM+1,#KILL_CONTROL+SOUND_LEFT_SPEAKER
long m
rtl
playFireSound entry
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_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
ldy #SOUND_REG_VOLUME+FIRE_OSC_NUM
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x
eor #$ff
jsr writeReg
_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
playExtraLifeSound entry
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg #SOUND_REG_CONTROL+EXTRA_LIFE_OSC_NUM,#EXTRA_LIFE_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+EXTRA_LIFE_OSC_NUM+1,#EXTRA_LIFE_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+EXTRA_LIFE_OSC_NUM,#EXTRA_LIFE_CONTROL+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+EXTRA_LIFE_OSC_NUM+1,#EXTRA_LIFE_CONTROL+SOUND_LEFT_SPEAKER
long m
rtl
startSegmentSound entry
lda segmentSoundIsPlaying
bne startSegmentSound_doIt
rtl
startSegmentSound_doIt anop
stz segmentSoundIsPlaying
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM,#SEGMENTS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+1,#SEGMENTS_CONTROL+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+2,#SEGMENTS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+3,#SEGMENTS_CONTROL+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM,#SEGMENTS_VOLUME
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+1,#SEGMENTS_VOLUME
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+2,#SEGMENTS_VOLUME
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+3,#SEGMENTS_VOLUME
long m
rtl
stopSegmentSound entry
lda segmentSoundIsPlaying
beq stopSegmentSound_doIt
rtl
stopSegmentSound_doIt anop
lda #1
sta segmentSoundIsPlaying
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM,#0
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+1,#0
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+2,#0
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+3,#0
_writeReg #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM,#SOUND_ONE_SHOT_MODE+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+1,#SOUND_ONE_SHOT_MODE+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+2,#SOUND_ONE_SHOT_MODE+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+3,#SOUND_ONE_SHOT_MODE+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM,#SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+1,#SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+2,#SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+3,#SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER
long m
rtl
startSpiderSound entry
lda spiderSoundIsPlaying
bne startSpiderSound_doIt
rtl
startSpiderSound_doIt anop
stz spiderSoundIsPlaying
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg #SOUND_REG_CONTROL+SPIDER_OSC_NUM,#SPIDER_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SPIDER_OSC_NUM+1,#SPIDER_CONTROL+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SPIDER_OSC_NUM+2,#SPIDER_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SPIDER_OSC_NUM+3,#SPIDER_CONTROL+SOUND_LEFT_SPEAKER
ldy #SOUND_REG_VOLUME+SPIDER_OSC_NUM
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x
eor #$ff
jsr writeReg
iny
lda tileRightVolume,x
eor #$ff
jsr writeReg
long m
rtl
updateSpiderSound entry
lda spiderSoundIsPlaying
beq updateSpiderSound_doIt
rtl
updateSpiderSound_doIt anop
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
ldy #SOUND_REG_VOLUME+SPIDER_OSC_NUM
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x
eor #$ff
jsr writeReg
iny
lda tileRightVolume,x
eor #$ff
jsr writeReg
long m
rtl
stopSpiderSound entry
lda spiderSoundIsPlaying
beq stopSpiderSound_doIt
rtl
stopSpiderSound_doIt anop
lda #1
sta spiderSoundIsPlaying
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg #SOUND_REG_VOLUME+SPIDER_OSC_NUM,#0
_writeReg #SOUND_REG_VOLUME+SPIDER_OSC_NUM+1,#0
_writeReg #SOUND_REG_VOLUME+SPIDER_OSC_NUM+2,#0
_writeReg #SOUND_REG_VOLUME+SPIDER_OSC_NUM+3,#0
_writeReg #SOUND_REG_CONTROL+SPIDER_OSC_NUM,#SOUND_ONE_SHOT_MODE+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SPIDER_OSC_NUM+1,#SOUND_ONE_SHOT_MODE+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SPIDER_OSC_NUM+2,#SOUND_ONE_SHOT_MODE+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SPIDER_OSC_NUM+3,#SOUND_ONE_SHOT_MODE+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SPIDER_OSC_NUM,#SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SPIDER_OSC_NUM+1,#SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SPIDER_OSC_NUM+2,#SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SPIDER_OSC_NUM+3,#SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER
long m
rtl
startScorpionSound entry
lda scorpionSoundIsPlaying
bne startScorpionSound_doIt
rtl
startScorpionSound_doIt anop
stz scorpionSoundIsPlaying
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg #SOUND_REG_CONTROL+SCORPION_OSC_NUM,#SCORPION_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SCORPION_OSC_NUM+1,#SCORPION_CONTROL+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SCORPION_OSC_NUM+2,#SCORPION_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SCORPION_OSC_NUM+3,#SCORPION_CONTROL+SOUND_LEFT_SPEAKER
ldy #SOUND_REG_VOLUME+SCORPION_OSC_NUM
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x
eor #$ff
jsr writeReg
iny
lda tileRightVolume,x
eor #$ff
jsr writeReg
long m
rtl
updateScorpionSound entry
lda scorpionSoundIsPlaying
beq updateScorpionSound_doIt
rtl
updateScorpionSound_doIt anop
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
ldy #SOUND_REG_VOLUME+SCORPION_OSC_NUM
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x
jsr writeReg
iny
lda tileRightVolume,x
eor #$ff
jsr writeReg
iny
lda tileRightVolume,x
eor #$ff
jsr writeReg
long m
rtl
stopScorpionSound entry
lda scorpionSoundIsPlaying
beq stopScorpionSound_doIt
rtl
stopScorpionSound_doIt anop
lda #1
sta scorpionSoundIsPlaying
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg #SOUND_REG_VOLUME+SCORPION_OSC_NUM,#0
_writeReg #SOUND_REG_VOLUME+SCORPION_OSC_NUM+1,#0
_writeReg #SOUND_REG_VOLUME+SCORPION_OSC_NUM+1,#0
_writeReg #SOUND_REG_VOLUME+SCORPION_OSC_NUM+1,#0
_writeReg #SOUND_REG_CONTROL+SCORPION_OSC_NUM,#SOUND_ONE_SHOT_MODE+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SCORPION_OSC_NUM+1,#SOUND_ONE_SHOT_MODE+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SCORPION_OSC_NUM+2,#SOUND_ONE_SHOT_MODE+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SCORPION_OSC_NUM+3,#SOUND_ONE_SHOT_MODE+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SCORPION_OSC_NUM,#SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SCORPION_OSC_NUM+1,#SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SCORPION_OSC_NUM+2,#SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+SCORPION_OSC_NUM+3,#SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER
long m
rtl
startFleaSound entry
lda fleaSoundIsPlaying
bne startFleaSound_doIt
rtl
startFleaSound_doIt anop
stz fleaSoundIsPlaying
stz fleaSoundFreqOffset
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg #SOUND_REG_FREQ_LOW+FLEA_OSC_NUM,fleaFreqs
_writeReg #SOUND_REG_FREQ_LOW+FLEA_OSC_NUM+1,fleaFreqs
_writeReg #SOUND_REG_FREQ_LOW+FLEA_OSC_NUM+2,fleaFreqs
_writeReg #SOUND_REG_FREQ_LOW+FLEA_OSC_NUM+3,fleaFreqs
_writeReg #SOUND_REG_FREQ_HIGH+FLEA_OSC_NUM,fleaFreqs+1
_writeReg #SOUND_REG_FREQ_HIGH+FLEA_OSC_NUM+1,fleaFreqs+1
_writeReg #SOUND_REG_FREQ_HIGH+FLEA_OSC_NUM+2,fleaFreqs+1
_writeReg #SOUND_REG_FREQ_HIGH+FLEA_OSC_NUM+3,fleaFreqs+1
_writeReg #SOUND_REG_CONTROL+FLEA_OSC_NUM,#FLEA_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+FLEA_OSC_NUM+1,#FLEA_CONTROL+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+FLEA_OSC_NUM+2,#FLEA_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+FLEA_OSC_NUM+3,#FLEA_CONTROL+SOUND_LEFT_SPEAKER
ldy #SOUND_REG_VOLUME+FLEA_OSC_NUM
lda tileRightVolume,x
sta fleaVolume
jsr writeReg
iny
lda fleaVolume
jsr writeReg
iny
lda fleaVolume
eor #$ff
jsr writeReg
iny
lda fleaVolume
eor #$ff
jsr writeReg
long m
rtl
stopFleaSound entry
lda fleaSoundIsPlaying
beq stopFleaSound_doIt
rtl
stopFleaSound_doIt anop
lda #1
sta fleaSoundIsPlaying
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg #SOUND_REG_VOLUME+FLEA_OSC_NUM,#$0
_writeReg #SOUND_REG_VOLUME+FLEA_OSC_NUM+1,#$0
_writeReg #SOUND_REG_VOLUME+FLEA_OSC_NUM+2,#$0
_writeReg #SOUND_REG_VOLUME+FLEA_OSC_NUM+3,#$0
_writeReg #SOUND_REG_CONTROL+FLEA_OSC_NUM,#SOUND_ONE_SHOT_MODE+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+FLEA_OSC_NUM+1,#SOUND_ONE_SHOT_MODE+SOUND_RIGHT_SPEAKER
_writeReg #SOUND_REG_CONTROL+FLEA_OSC_NUM+2,#SOUND_ONE_SHOT_MODE+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+FLEA_OSC_NUM+3,#SOUND_ONE_SHOT_MODE+SOUND_LEFT_SPEAKER
_writeReg #SOUND_REG_CONTROL+FLEA_OSC_NUM,#SOUND_ONE_SHOT_MODE+SOUND_RIGHT_SPEAKER+SOUND_HALTED
_writeReg #SOUND_REG_CONTROL+FLEA_OSC_NUM+1,#SOUND_ONE_SHOT_MODE+SOUND_RIGHT_SPEAKER+SOUND_HALTED
_writeReg #SOUND_REG_CONTROL+FLEA_OSC_NUM+2,#SOUND_ONE_SHOT_MODE+SOUND_LEFT_SPEAKER+SOUND_HALTED
_writeReg #SOUND_REG_CONTROL+FLEA_OSC_NUM+3,#SOUND_ONE_SHOT_MODE+SOUND_LEFT_SPEAKER+SOUND_HALTED
long m
rtl
pauseSound entry
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM,#0
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+1,#0
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+2,#0
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+3,#0
_writeReg #SOUND_REG_VOLUME+SPIDER_OSC_NUM,#$0
_writeReg #SOUND_REG_VOLUME+SPIDER_OSC_NUM+1,#$0
_writeReg #SOUND_REG_VOLUME+SPIDER_OSC_NUM+2,#$0
_writeReg #SOUND_REG_VOLUME+SPIDER_OSC_NUM+3,#$0
_writeReg #SOUND_REG_VOLUME+SCORPION_OSC_NUM,#0
_writeReg #SOUND_REG_VOLUME+SCORPION_OSC_NUM+1,#0
_writeReg #SOUND_REG_VOLUME+SCORPION_OSC_NUM+2,#0
_writeReg #SOUND_REG_VOLUME+SCORPION_OSC_NUM+3,#0
_writeReg #SOUND_REG_VOLUME+FLEA_OSC_NUM,#$0
_writeReg #SOUND_REG_VOLUME+FLEA_OSC_NUM+1,#$0
_writeReg #SOUND_REG_VOLUME+FLEA_OSC_NUM+2,#$0
_writeReg #SOUND_REG_VOLUME+FLEA_OSC_NUM+3,#$0
long m
rtl
unpauseSound entry
lda segmentSoundIsPlaying
bne unpauseSound_skipSegment
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM,#SEGMENTS_VOLUME
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+1,#SEGMENTS_VOLUME
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+2,#SEGMENTS_VOLUME
_writeReg #SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+3,#SEGMENTS_VOLUME
long m
unpauseSound_skipSegment anop
lda fleaSoundIsPlaying
bne unpauseSound_skipFlea
short m
_docWait
lda >SOUND_SYSTEM_VOLUME
and #$0f
sta >SOUND_CONTROL_REG
ldy #SOUND_REG_VOLUME+FLEA_OSC_NUM
lda fleaVolume
jsr writeReg
iny
lda fleaVolume
jsr writeReg
iny
lda fleaVolume
eor #$ff
jsr writeReg
iny
lda fleaVolume
eor #$ff
jsr writeReg
long m
unpauseSound_skipFlea anop
rtl
swapStereoChannels entry
ldx #SIZEOF_TILE_INFO*NUM_GAME_TILES-SIZEOF_TILE_INFO
swapStereoChannels_loop anop
lda tileRightVolume,x
eor #$ff
sta tileRightVolume,x
dex
dex
bpl swapStereoChannels_loop
rtl
bonusSoundOscReg dc i2'SOUND_REG_CONTROL+BONUS_OSC_NUM'
fleaSoundIsPlaying dc i2'1'
fleaSoundFreqOffset dc i2'0'
fleaVolume dc i2'0'
segmentSoundIsPlaying dc i2'1'
spiderSoundIsPlaying dc i2'1'
scorpionSoundIsPlaying dc i2'1'
registerValue dc i2'0'
soundRegDefaults anop
; Spider registers
dc i1'SOUND_REG_FREQ_LOW+SPIDER_OSC_NUM',i1'SPIDER_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+SPIDER_OSC_NUM+1',i1'SPIDER_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+SPIDER_OSC_NUM+2',i1'SPIDER_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+SPIDER_OSC_NUM+3',i1'SPIDER_FREQ_LOW'
dc i1'SOUND_REG_FREQ_HIGH+SPIDER_OSC_NUM',i1'SPIDER_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+SPIDER_OSC_NUM+1',i1'SPIDER_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+SPIDER_OSC_NUM+2',i1'SPIDER_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+SPIDER_OSC_NUM+3',i1'SPIDER_FREQ_HIGH'
dc i1'SOUND_REG_VOLUME+SPIDER_OSC_NUM',i1'0'
dc i1'SOUND_REG_VOLUME+SPIDER_OSC_NUM+1',i1'0'
dc i1'SOUND_REG_VOLUME+SPIDER_OSC_NUM+2',i1'0'
dc i1'SOUND_REG_VOLUME+SPIDER_OSC_NUM+3',i1'0'
dc i1'SOUND_REG_SIZE+SPIDER_OSC_NUM',i1'SPIDER_SIZE'
dc i1'SOUND_REG_SIZE+SPIDER_OSC_NUM+1',i1'SPIDER_SIZE'
dc i1'SOUND_REG_SIZE+SPIDER_OSC_NUM+2',i1'SPIDER_SIZE'
dc i1'SOUND_REG_SIZE+SPIDER_OSC_NUM+3',i1'SPIDER_SIZE'
dc i1'SOUND_REG_POINTER+SPIDER_OSC_NUM',i1'SPIDER_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+SPIDER_OSC_NUM+1',i1'SPIDER_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+SPIDER_OSC_NUM+2',i1'SPIDER_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+SPIDER_OSC_NUM+3',i1'SPIDER_SOUND_ADDR/256'
dc i1'SOUND_REG_CONTROL+SPIDER_OSC_NUM',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+SPIDER_OSC_NUM+1',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+SPIDER_OSC_NUM+2',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER'
dc i1'SOUND_REG_CONTROL+SPIDER_OSC_NUM+3',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER'
; Death registers
dc i1'SOUND_REG_FREQ_LOW+DEATH_OSC_NUM',i1'DEATH_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+DEATH_OSC_NUM+1',i1'DEATH_FREQ_LOW'
dc i1'SOUND_REG_FREQ_HIGH+DEATH_OSC_NUM',i1'DEATH_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+DEATH_OSC_NUM+1',i1'DEATH_FREQ_HIGH'
dc i1'SOUND_REG_SIZE+DEATH_OSC_NUM',i1'DEATH_SIZE'
dc i1'SOUND_REG_SIZE+DEATH_OSC_NUM+1',i1'DEATH_SIZE'
dc i1'SOUND_REG_POINTER+DEATH_OSC_NUM',i1'DEATH_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+DEATH_OSC_NUM+1',i1'DEATH_SOUND_ADDR/256'
dc i1'SOUND_REG_CONTROL+DEATH_OSC_NUM',i1'DEATH_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+DEATH_OSC_NUM+1',i1'DEATH_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER'
; Segments registers
dc i1'SOUND_REG_FREQ_LOW+SEGMENTS_OSC_NUM',i1'SEGMENTS_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+SEGMENTS_OSC_NUM+1',i1'SEGMENTS_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+SEGMENTS_OSC_NUM+2',i1'SEGMENTS_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+SEGMENTS_OSC_NUM+3',i1'SEGMENTS_FREQ_LOW'
dc i1'SOUND_REG_FREQ_HIGH+SEGMENTS_OSC_NUM',i1'SEGMENTS_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+SEGMENTS_OSC_NUM+1',i1'SEGMENTS_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+SEGMENTS_OSC_NUM+2',i1'SEGMENTS_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+SEGMENTS_OSC_NUM+3',i1'SEGMENTS_FREQ_HIGH'
dc i1'SOUND_REG_VOLUME+SEGMENTS_OSC_NUM',i1'0'
dc i1'SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+1',i1'0'
dc i1'SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+2',i1'0'
dc i1'SOUND_REG_VOLUME+SEGMENTS_OSC_NUM+3',i1'0'
dc i1'SOUND_REG_SIZE+SEGMENTS_OSC_NUM',i1'SEGMENTS_SIZE'
dc i1'SOUND_REG_SIZE+SEGMENTS_OSC_NUM+1',i1'SEGMENTS_SIZE'
dc i1'SOUND_REG_SIZE+SEGMENTS_OSC_NUM+2',i1'SEGMENTS_SIZE'
dc i1'SOUND_REG_SIZE+SEGMENTS_OSC_NUM+3',i1'SEGMENTS_SIZE'
dc i1'SOUND_REG_POINTER+SEGMENTS_OSC_NUM',i1'SEGMENTS_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+SEGMENTS_OSC_NUM+1',i1'SEGMENTS_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+SEGMENTS_OSC_NUM+2',i1'SEGMENTS_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+SEGMENTS_OSC_NUM+3',i1'SEGMENTS_SOUND_ADDR/256'
dc i1'SOUND_REG_CONTROL+SEGMENTS_OSC_NUM',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+1',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+2',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER'
dc i1'SOUND_REG_CONTROL+SEGMENTS_OSC_NUM+3',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER'
; Bonus registers
dc i1'SOUND_REG_FREQ_LOW+BONUS_OSC_NUM',i1'BONUS_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+BONUS_OSC_NUM+1',i1'BONUS_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+BONUS_OSC_NUM+2',i1'BONUS_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+BONUS_OSC_NUM+3',i1'BONUS_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+BONUS_OSC_NUM+4',i1'BONUS_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+BONUS_OSC_NUM+5',i1'BONUS_FREQ_LOW'
dc i1'SOUND_REG_FREQ_HIGH+BONUS_OSC_NUM',i1'BONUS_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+BONUS_OSC_NUM+1',i1'BONUS_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+BONUS_OSC_NUM+2',i1'BONUS_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+BONUS_OSC_NUM+3',i1'BONUS_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+BONUS_OSC_NUM+4',i1'BONUS_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+BONUS_OSC_NUM+5',i1'BONUS_FREQ_HIGH'
dc i1'SOUND_REG_SIZE+BONUS_OSC_NUM',i1'BONUS_SIZE'
dc i1'SOUND_REG_SIZE+BONUS_OSC_NUM+1',i1'BONUS_SIZE'
dc i1'SOUND_REG_SIZE+BONUS_OSC_NUM+2',i1'BONUS_SIZE'
dc i1'SOUND_REG_SIZE+BONUS_OSC_NUM+3',i1'BONUS_SIZE'
dc i1'SOUND_REG_SIZE+BONUS_OSC_NUM+4',i1'BONUS_SIZE'
dc i1'SOUND_REG_SIZE+BONUS_OSC_NUM+5',i1'BONUS_SIZE'
dc i1'SOUND_REG_POINTER+BONUS_OSC_NUM',i1'BONUS_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+BONUS_OSC_NUM+1',i1'BONUS_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+BONUS_OSC_NUM+2',i1'BONUS_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+BONUS_OSC_NUM+3',i1'BONUS_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+BONUS_OSC_NUM+4',i1'BONUS_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+BONUS_OSC_NUM+5',i1'BONUS_SOUND_ADDR/256'
dc i1'SOUND_REG_CONTROL+BONUS_OSC_NUM',i1'BONUS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+BONUS_OSC_NUM+1',i1'BONUS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER'
dc i1'SOUND_REG_CONTROL+BONUS_OSC_NUM+2',i1'BONUS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+BONUS_OSC_NUM+3',i1'BONUS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER'
dc i1'SOUND_REG_CONTROL+BONUS_OSC_NUM+4',i1'BONUS_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+BONUS_OSC_NUM+5',i1'BONUS_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER'
; Kill registers
dc i1'SOUND_REG_FREQ_LOW+KILL_OSC_NUM',i1'KILL_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+KILL_OSC_NUM+1',i1'KILL_FREQ_LOW'
dc i1'SOUND_REG_FREQ_HIGH+KILL_OSC_NUM',i1'KILL_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+KILL_OSC_NUM+1',i1'KILL_FREQ_HIGH'
dc i1'SOUND_REG_SIZE+KILL_OSC_NUM',i1'KILL_SIZE'
dc i1'SOUND_REG_SIZE+KILL_OSC_NUM+1',i1'KILL_SIZE'
dc i1'SOUND_REG_POINTER+KILL_OSC_NUM',i1'KILL_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+KILL_OSC_NUM+1',i1'KILL_SOUND_ADDR/256'
dc i1'SOUND_REG_CONTROL+KILL_OSC_NUM',i1'KILL_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+KILL_OSC_NUM+1',i1'KILL_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER'
; Fire registers
dc i1'SOUND_REG_FREQ_LOW+FIRE_OSC_NUM',i1'FIRE_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+FIRE_OSC_NUM+1',i1'FIRE_FREQ_LOW'
dc i1'SOUND_REG_FREQ_HIGH+FIRE_OSC_NUM',i1'FIRE_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+FIRE_OSC_NUM+1',i1'FIRE_FREQ_HIGH'
dc i1'SOUND_REG_SIZE+FIRE_OSC_NUM',i1'FIRE_SIZE'
dc i1'SOUND_REG_SIZE+FIRE_OSC_NUM+1',i1'FIRE_SIZE'
dc i1'SOUND_REG_POINTER+FIRE_OSC_NUM',i1'FIRE_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+FIRE_OSC_NUM+1',i1'FIRE_SOUND_ADDR/256'
dc i1'SOUND_REG_CONTROL+FIRE_OSC_NUM',i1'FIRE_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+FIRE_OSC_NUM+1',i1'FIRE_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER'
; Extra life registers
dc i1'SOUND_REG_FREQ_LOW+EXTRA_LIFE_OSC_NUM',i1'EXTRA_LIFE_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+EXTRA_LIFE_OSC_NUM+1',i1'EXTRA_LIFE_FREQ_LOW'
dc i1'SOUND_REG_FREQ_HIGH+EXTRA_LIFE_OSC_NUM',i1'EXTRA_LIFE_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+EXTRA_LIFE_OSC_NUM+1',i1'EXTRA_LIFE_FREQ_HIGH'
dc i1'SOUND_REG_VOLUME+EXTRA_LIFE_OSC_NUM',i1'EXTRA_LIFE_VOLUME'
dc i1'SOUND_REG_VOLUME+EXTRA_LIFE_OSC_NUM+1',i1'EXTRA_LIFE_VOLUME'
dc i1'SOUND_REG_SIZE+EXTRA_LIFE_OSC_NUM',i1'EXTRA_LIFE_SIZE'
dc i1'SOUND_REG_SIZE+EXTRA_LIFE_OSC_NUM+1',i1'EXTRA_LIFE_SIZE'
dc i1'SOUND_REG_POINTER+EXTRA_LIFE_OSC_NUM',i1'EXTRA_LIFE_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+EXTRA_LIFE_OSC_NUM+1',i1'EXTRA_LIFE_SOUND_ADDR/256'
dc i1'SOUND_REG_CONTROL+EXTRA_LIFE_OSC_NUM',i1'EXTRA_LIFE_CONTROL+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+EXTRA_LIFE_OSC_NUM+1',i1'EXTRA_LIFE_CONTROL+SOUND_HALTED+SOUND_LEFT_SPEAKER'
; Flea registers
dc i1'SOUND_REG_VOLUME+FLEA_OSC_NUM',i1'0'
dc i1'SOUND_REG_VOLUME+FLEA_OSC_NUM+1',i1'0'
dc i1'SOUND_REG_VOLUME+FLEA_OSC_NUM+2',i1'0'
dc i1'SOUND_REG_VOLUME+FLEA_OSC_NUM+3',i1'0'
dc i1'SOUND_REG_SIZE+FLEA_OSC_NUM',i1'FLEA_SIZE'
dc i1'SOUND_REG_SIZE+FLEA_OSC_NUM+1',i1'FLEA_SIZE'
dc i1'SOUND_REG_SIZE+FLEA_OSC_NUM+2',i1'FLEA_SIZE'
dc i1'SOUND_REG_SIZE+FLEA_OSC_NUM+3',i1'FLEA_SIZE'
dc i1'SOUND_REG_POINTER+FLEA_OSC_NUM',i1'FLEA_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+FLEA_OSC_NUM+1',i1'FLEA_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+FLEA_OSC_NUM+2',i1'FLEA_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+FLEA_OSC_NUM+3',i1'FLEA_SOUND_ADDR/256'
dc i1'SOUND_REG_CONTROL+FLEA_OSC_NUM',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+FLEA_OSC_NUM+1',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+FLEA_OSC_NUM+2',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER'
dc i1'SOUND_REG_CONTROL+FLEA_OSC_NUM+3',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER'
; Scorpion registers
dc i1'SOUND_REG_FREQ_LOW+SCORPION_OSC_NUM',i1'SCORPION_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+SCORPION_OSC_NUM+1',i1'SCORPION_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+SCORPION_OSC_NUM+2',i1'SCORPION_FREQ_LOW'
dc i1'SOUND_REG_FREQ_LOW+SCORPION_OSC_NUM+3',i1'SCORPION_FREQ_LOW'
dc i1'SOUND_REG_FREQ_HIGH+SCORPION_OSC_NUM',i1'SCORPION_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+SCORPION_OSC_NUM+1',i1'SCORPION_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+SCORPION_OSC_NUM+2',i1'SCORPION_FREQ_HIGH'
dc i1'SOUND_REG_FREQ_HIGH+SCORPION_OSC_NUM+3',i1'SCORPION_FREQ_HIGH'
dc i1'SOUND_REG_VOLUME+SCORPION_OSC_NUM',i1'0'
dc i1'SOUND_REG_VOLUME+SCORPION_OSC_NUM+1',i1'0'
dc i1'SOUND_REG_VOLUME+SCORPION_OSC_NUM+2',i1'0'
dc i1'SOUND_REG_VOLUME+SCORPION_OSC_NUM+3',i1'0'
dc i1'SOUND_REG_SIZE+SCORPION_OSC_NUM',i1'SCORPION_SIZE'
dc i1'SOUND_REG_SIZE+SCORPION_OSC_NUM+1',i1'SCORPION_SIZE'
dc i1'SOUND_REG_SIZE+SCORPION_OSC_NUM+2',i1'SCORPION_SIZE'
dc i1'SOUND_REG_SIZE+SCORPION_OSC_NUM+3',i1'SCORPION_SIZE'
dc i1'SOUND_REG_POINTER+SCORPION_OSC_NUM',i1'SCORPION_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+SCORPION_OSC_NUM+1',i1'SCORPION_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+SCORPION_OSC_NUM+2',i1'SCORPION_SOUND_ADDR/256'
dc i1'SOUND_REG_POINTER+SCORPION_OSC_NUM+3',i1'SCORPION_SOUND_ADDR/256'
dc i1'SOUND_REG_CONTROL+SCORPION_OSC_NUM',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+SCORPION_OSC_NUM+1',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_RIGHT_SPEAKER'
dc i1'SOUND_REG_CONTROL+SCORPION_OSC_NUM+2',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER'
dc i1'SOUND_REG_CONTROL+SCORPION_OSC_NUM+3',i1'SOUND_ONE_SHOT_MODE+SOUND_HALTED+SOUND_LEFT_SPEAKER'
soundRegDefaultsEnd anop
end