* sound org = $ea00 lst off *------------------------------- * * S O U N D * *------------------------------- org org jmp PLAYBACK *------------------------------- savex ds 1 spkr = $c030 *------------------------------- put soundnames put gameeq put eq *------------------------------- * * L O O K U P * * Sound routine lookup table * *------------------------------- lookup :0 dw DoPlateDown :1 dw DoPlateUp :2 dw DoGateDown :3 dw DoSpecialKey1 :4 dw DoSpecialKey2 :5 dw DoSplat :6 dw DoMirrorCrack :7 dw DoLooseCrash :8 dw DoGotKey :9 dw DoFootstep :10 dw DoRaisingExit :11 dw DoRaisingGate :12 dw DoLowerGate :13 dw DoSmackWall :14 dw DoImpaled :15 dw DoGateSlam :16 dw DoFlashMsg :17 dw DoSwordClash1 :18 dw DoSwordClash2 :19 dw DoJawsClash endlook maxaddr = endlook-lookup *------------------------------- * * Z E R O S O U N D * * Zero sound table * *------------------------------- ZEROSOUND lda #0 ;# sounds in table sta soundtable rts *------------------------------- * * A D D S O U N D * * Add sound to sound table * (preserve registers) * * In: A = sound # * *------------------------------- ADDSOUND stx savex ldx soundtable cpx #maxsfx bcs :rts ;sound table full inx sta soundtable,x stx soundtable ;# sounds in table :rts ldx savex rts *------------------------------- * * P L A Y B A C K * * Playback all sounds listed in sound table * *------------------------------- PLAYBACK lda soundon beq :rts ;sound switched off? ldx soundtable beq :rts ;sound table empty? :loop lda soundtable,x stx savex jsr makesound ;make sound #A ;(may destroy registers) ldx savex dex bne :loop :rts rts *------------------------------- * * M A K E S O U N D * * In: A = sound # (0-127) * *------------------------------- makesound asl cmp #maxaddr bcs :rts ;don't exceed lookup table tax lda lookup,x sta :sm+1 lda lookup+1,x sta :sm+2 :sm jmp $ffff ;self-modifying code :rts rts *------------------------------- * * S O U N D R O U T I N E S * *------------------------------- * Kid steps on pressplate DoPlateDown ldy #70 ldx #0 lda #4 jmp tone *------------------------------- * Pressplate pops back up DoPlateUp ldy #90 ldx #0 lda #4 jmp tone *------------------------------- * Gate hits stone floor with an ominous CLANG DoGateDown ldy #70 ldx #0 lda #4 jmp tone *------------------------------- * Jaws clash DoJawsClash ldy #10 ldx #0 lda #50 jmp tone *------------------------------- * Acknowledge special keypress SK1Pitch = 15 SK1Dur = 50 SK2Pitch = 40 SK2Dur = 50 DoSpecialKey1 DoSwordClash1 DoSwordClash2 ldy #SK1Pitch ldx #>SK1Pitch lda #SK1Dur jmp tone DoSpecialKey2 ldy #SK2Pitch ldx #>SK2Pitch lda #SK2Dur jmp tone *------------------------------- * Splat SplatPitch = 1000 SplatDur = 3 DoSplat ldy #SplatPitch ldx #>SplatPitch lda #SplatDur jmp tone *------------------------------- * Mirror Crack DoMirrorCrack jmp DoSplat rts *------------------------------- * Loose Floor Crash DoLooseCrash jmp DoSplat *------------------------------- * Flash message ]HiPitch = 100 ]HiDur = 25 ]LoPitch = 500 ]LoDur = 15 DoGotKey DoFlashMsg lda #2 :loop pha ldy #]LoPitch ldx #>]LoPitch lda #]LoDur jsr tone ldy #]HiPitch ldx #>]HiPitch lda #]HiDur jsr tone pla sec sbc #1 bne :loop rts *------------------------------- * Footstep DoFootstep ldy #35 ldx #0 lda #3 jmp tone *------------------------------- * Raising Exit DoRaisingExit ldy #40 ldx #0 lda #6 jmp tone *------------------------------- * Raising Gate DoRaisingGate ldy #20 ldx #0 lda #2 jmp tone *------------------------------- * Lowering Gate DoLowerGate ldy #7 ldx #0 lda #8 jmp tone *------------------------------- * Smack Wall SWPitch = 1000 SWDur = 3 DoSmackWall ldy #SWPitch ldx #>SWPitch lda #SWDur jmp tone ]rts rts *------------------------------- * Impaled DoImpaled jmp DoSmackWall *------------------------------- * Gate Slam DoGateSlam jmp DoSmackWall *------------------------------- * * T O N E * * In: y-x = pitch lo-hi * a = duration * *------------------------------- tone sty :pitch stx :pitch+1 :outloop bit spkr ldx #0 :midloop ldy #0 :inloop iny cpy :pitch bcc :inloop inx cpx :pitch+1 bcc :midloop sec sbc #1 bne :outloop rts :pitch ds 2 *------------------------------- lst eof ds 1 usr $a9,20,$e00,*-org lst off