Prince-of-Persia-Apple-II/01 POP Source/Source/SOUND.S

361 lines
4.3 KiB
ArmAsm
Executable File

* 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