;
;
IF L.SND = OFF ;-------------------------------------------
LIST -L ;-- SOUND --------------------------------
ENDIF ;-------------------------------------------
;
;
;
;
; SOUND-EFFECT HANDLER
; ====================
;
SETDP $D0
; ===== ===
;
FWAIT JSR FRWAIT ; WAIT FOR FRAME BOUNDARY
PSHS DP ; .
SETDP $D0 ; .
;
JSR DEFLOK ; PREVENT SCAN COLLAPSE
;
LDA SBTN ; INPUT CONSOLE SWITCHES
JSR DBNCE ; .
LDD SJOY ; READ JOYSTICK
STD EPOT0 ; . ENABLE BOTH POTS ON JOYSTICK #1
STD EPOT2 ; . ENABLE BOTH POTS ON JOYSTICK #2
JSR JOYBIT ; .
;
LDA #$C8 ; SET "DP" REGISTER TO RAM
TFR A,DP ; .
SETDP $C8 ; .
;
LDA FRAME ; CREATE FRAME FLAGS
ANDA #$07 ; .
STA FRAM7 ; .
ANDA #$03 ; .
STA FRAM3 ; .
ANDA #$01 ; .
STA FRAM1 ; .
;
LDA TMR1 ; DOWN-COUNT TIMER #1
BEQ FWAIT1 ; . IS TIMER PENDING ?
DEC TMR1 ; .
BNE FWAIT1 ; .
JSR [TMR1+1] ; . EXECUTE THE USER PROGRAM
;
FWAIT1 LDA TMR2 ; DOWN-COUNT TIMER #2
BEQ FWAIT2 ; . IS TIMER PENDING ?
DEC TMR2 ; .
BNE FWAIT2 ; .
JSR [TMR2+1] ; . EXECUTE THE USER PROGRAM
;
FWAIT2 LDA TMR3 ; DOWN-COUNT TIMER #3
BEQ SOUND ; . IS TIMER PENDING ?
DEC TMR3 ; .
BNE SOUND ; .
JSR [TMR3+1] ; . EXECUTE THE USER PROGRAM
;
;
;
SOUND LDA TSTAT ; IS A TUNE PENDING ?
BEQ SND1 ; .
CLR BOXSQK ; . RESET OTHER SOUND EFFECTS
CLR STEPS ; . .
CLR THRSND ; . .
CLR EXPBRG ; . .
CLR EXPWAR ; . .
JSR REPLAY ; . IF SO, UPDATE
JMP SNUP0 ; . .
;
SND1 LDA #$80 ; CLEAR-OUT SOUND
JSR CLRSND ; .
;
LDA STEPS ; IS WARRIOR FOOTSTEP PENDING ?
BNE FOTSTP ; .
;
LDA BOXSQK ; IS BOX SQUEAK PENDING ?
BNE SBXSQK ; .
;
LDA EXPWAR ; IS WARRIOR EXPLOSION PENDING ?
LBMI WEXPL1 ; .
LBNE WEXPL2 ; .
;
LDA EXPBRG ; IS BRIGAND EXPLOSION PENDING ?
LBMI BEXPL1 ; .
;
LDA THRSND ; IS FLAMOID THROWING SOUND PENDING ?
LBMI THRSN1 ; .
LBNE THRSN2 ; .
;
JMP SNUPDT ; UPDATE EXPLOSION SOUND EFFECTS
;
;
;
; HANDLE FOOTSTEPS
; ----------------
;
; REQUIRES CHANNEL 'A' & 'B'
;
FOTSTP LDA #$03
JSR CLRSND
;
DEC STEPS
LDB STEPS
;
CMPB #$04
BGE ST0
;
LSLB
BRA ST1
;
ST0 LDB #$0C
SUBB STEPS
;
ST1 ADDB #$02
ANDB #$0F
;
STB $C844
STB $C843
;
LDD #$E708
ANDA REQ6
SUBB $C844
STD REQ6
;
JMP SNUP0
;
;
;
; HANDLE BOX OPENING / CLOSING SQUEAK
; -----------------------------------
;
; REQUIRES CHANNEL 'A'
;
SBXSQK LDA #$01
JSR CLRSND
;
DEC BOXSQK
LDB BOXSQK
;
CMPB #$0F
BLS SQ2
;
LDB #$0F
SQ2 STB REQ5
;
LDX #$0700
LDB FRAME
LSRB
LDB BOXSQK
BCC SQ0
;
;
LDX #$0000
NEGB
SQ0 SEX
;
LSLB
ROLA
;
LSLB
ROLA
;
LSLB
ROLA
;
LSLB
ROLA
;
LEAX D,X
STX REQC
;
LDA #$FE
ANDA REQ6
STA REQ6
;
BRA SNUP0
;
;
;
; HANDLE FLAMOID THROWING SOUND
; -----------------------------
;
; REQUIRES ALL CHANNELS
;
THRSN1 LDA #$FF ; RESET SOUND GENERATOR
BSR CLRSND ; .
;
LDA #$01 ; RESET THROWING FLAG
STA THRSND ; .
;
CLR XACON ; ENABLE EXPLOSION
LDA #$80 ; .
STA SATUS ; .
LDU #THREXP ; START BLASTER EXPLOSION
JSR EXPLOD ; .
;
THRSN2 CLR EXPBRG ; RESET PENDING SOUND EFFECTS
BRA SNUPDT ; .
;
;
;
; HANDLE BRIGAND EXPLOSION
; ------------------------
;
; REQUIRES CHANNEL 'A'
;
BEXPL1 LDA #$FF ; RESET SOUND GENERATOR
JSR CLRSND ; .
;
LDA #$01 ; RESET EXPLOSION FLAG
STA EXPBRG ; .
;
CLR XACON ; ENABLE EXPLOSION
LDA #$80 ; .
STA SATUS ; .
LDU #EXP01 ; START GUARDIAN EXPLOSION
JSR EXPLOD ; .
;
BRA SNUPDT
;
;
;
; HANDLE WARRIOR EXPLOSION
; ------------------------
;
; REQUIRES ALL CHANNELS
;
WEXPL1 LDA #$FF ; RESET SOUND GENERATOR
BSR CLRSND ; .
;
LDA #$01 ; RESET EXPLOSION FLAG
STA EXPWAR ; .
;
CLR XACON ; ENABLE EXPLOSION
LDA #$80 ; .
STA SATUS ; .
LDU #EXP02 ; START BLASTER EXPLOSION
JSR EXPLOD ; .
;
WEXPL2 CLR EXPBRG ; RESET PENDING SOUND EFFECTS
;
;
;
;
; UPDATE SOUND GENERATOR
; ----------------------
;
SNUPDT JSR EXPLOD ; UPDATE EXPLOSION SOUND
;
LDA XACON ; ARE EXPLOSIONS DONE ?
BNE SNUP0 ; .
;
CLR EXPBRG ; . RESET EXPLOSION FLAGS
CLR EXPWAR ; . .
CLR THRSND ; . .
CLR SATUS ; . .
;
SNUP0 PULS DP ; UPDATE SOUND GENERATOR
SETDP $D0 ; . SET 'DP' = I/O
JSR REQOUT ; . UPDATE SOUND CHIP
RTS ; . RETURN TO CALLER
;
;
;
;
; CLEAR SOUND GENERATION PARAMETERS
; ---------------------------------
;
; ENTRY VALUES
; ------------
; A = BIT 7 = CLEAR ALL SOUND REGISTERS
; 2 = CLEAR CHANNEL 'C' ONLY
; 1 = CLEAR CHANNEL 'B' ONLY
; 0 = CLEAR CHANNEL 'A' ONLY
;
SETDP $C8
; ===== ===
;
CLRSND TSTA ; IF A < 0, THEN CLEAR ALL REGISTERS
BMI C999 ;
BNE C000
;
CLR TSTAT
CLR STEPS
CLR BOXSQK
CLR THRSND
CLR EXPBRG
CLR EXPWAR
;
C999 JSR INTREQ ; RESET ALL REGISTERS
RTS ; RETURN
;
C000 ANDA #00000111B ; LOWER THREE BITS SIGNIFICANT
TFR A,B ;
PSHS D ; SAVE 2 COPIES ON STACK
LSLA ; SHIFT LEFT 3 TIMES TO SET CORROSPONDING
LSLA ; NOISE CONTROL BIT
LSLA ;
ORA S+ ; REASSEMBLE WHOLE BYTE
ORA REQ6 ;
STA REQ6 ; SET BITS IN CONTROL REGISTER
LDX #REQ0 ; X --> SOUND CHIP MIRROR REGISTERS
CLR X+ ; CLEAR ENVELOPE TYPE (ALL CHANNELS)
CLR X+ ; CLEAR ENVELOPE PERIOD (MSB) (ALL CHANNELS)
CLR X+ ; CLEAR ENVELOPE PERIOD (LSB) (ALL CHANNELS)
CLR REQ7 ; CLEAR NOISE PERIOD
LDU #REQ8 ; U --> CHANNEL C PITCH (MSB)
PULS A ; RETRIEVE OTHER COPY OF ENTRY BIT MASK
LDB #2 ; B = 2 -- COUNTER AND INDEX OFFSET VALUE
;
C010 LSRA ; CHECK FOR BITS SET
BCC C020 ;
CLR B,X ; CLEAR AMPLITUDE
LSLB ; * 2 FOR OFFSET
CLR B,U ; CLEAR PITCH (MSB)
INCB ; - NEXT -
CLR B,U ; CLEAR PITCH (LSB)
DECB ; FASTER THAN A PUSH AND PULL
LSRB ;
;
C020 DECB ; AGAIN FOR ALL 3 BITS (CHANNELS)
BPL C010 ;
;
RTS ; RESTORE ENTRY X REG AND RETURN
;
;
;
;
; EXPLOSION PARAMETERS
; --------------------
;
EXP01 DB $08,$FF,$00,$02 ; BRIGAND EXPLOSION
;
EXP02 DB $3F,$00,$00,$01 ; WARRIOR EXPLOSION
;
THREXP DB $33,$11,$7F,$08 ; FLAMOID THROWING SOUND
;
;
;
;
; OPENING TUNE
; ============
;
TEMPO 64,2
;
OPNING DW OPNFAD
DW $FEB6
;
DB A4 OR $80
DB E4 OR $80
DB CS5,:8TH
;
DB GS4 OR $80
DB E4 OR $80
DB CS5,:TRPLT/2
;
DB GS4 OR $80
DB E4 OR $80
DB CS5,:TRPLT/2
;
DB GS4 OR $80
DB E4 OR $80
DB CS5,:TRPLT/2
;
DB FS4 OR $80
DB A4 OR $80
DB CS5,:8TH
;
DB E4 OR $80
DB A4 OR $80
DB B4,:8TH
;
DB A4 OR $80
DB E4 OR $80
DB CS5,:8TH
;
DB A4 OR $80
DB E4 OR $80
DB CS5,:8TH
;
DB A4 OR $80
DB A3 OR $80
DB E5,:DOT8
;
DB GS4 OR $80
DB B3 OR $80
DB D5,:16TH
;
DB A4 OR $80
DB E4 OR $80
DB CS5,:8TH
;
DB GS4 OR $80
DB E4 OR $80
DB CS5,:TRPLT/2
;
DB GS4 OR $80
DB E4 OR $80
DB CS5,:TRPLT/2
;
DB GS4 OR $80
DB E4 OR $80
DB CS5,:TRPLT/2
;
DB FS4 OR $80
DB A4 OR $80
DB CS5,:8TH
;
DB E4 OR $80
DB A4 OR $80
DB B4,:8TH
;
DB A4 OR $80
DB E4 OR $80
DB CS5,:8TH
;
DB A4 OR $80
DB E4 OR $80
DB CS5,:8TH
;
DB A4 OR $80
DB E4 OR $80
DB CS5,:16TH
;
DB A4 OR $80
DB E4 OR $80
DB B4,:16TH
;
DB A4 OR $80
DB E4 OR $80
DB A4,:16TH
;
DB A4 OR $80
DB E4 OR $80
DB B4,:16TH
;
DB A3 OR $80
DB E3 OR $80
DB CS5,$7F
;
DW $0080
;
;
OPNFAD DB $0F,$FF,$FE,$ED,$DC,$CB,$BA,$A9
DB $98,$88,$88,$88,$87,$76,$65,$54
;
;
;
;
; FAN-FARE FOR BRIGANDS SEQUENCE
; ==============================
;
TEMPO 40,6
;
BRGFAN DW $FDC3 ; FADE CONTROL
DW VIBENL ; VIBRATO CONTROL
DB B4 OR $80
DB B3 OR $80
DB B2,:HALF
DB B4 OR $80
DB B3 OR $80
DB B2,:HALF
DB B4 OR $80
DB B3 OR $80
DB B2,:QRTR
DB B4 OR $80
DB B3 OR $80
DB B2,:QRTR
DB B4 OR $80
DB B3 OR $80
DB B2,:HALF
DB D5 OR $80
DB D4 OR $80
DB D3,:HALF
DB CS5 OR $80
DB CS4 OR $80
DB CS3,:QRTR
DB CS5 OR $80
DB CS4 OR $80
DB CS3,:QRTR
DB B4 OR $80
DB B3 OR $80
DB B2,:QRTR
DB B4 OR $80
DB B3 OR $80
DB B2,:QRTR
DB A4 OR $80
DB A3 OR $80
DB A2,:QRTR
DB B4 OR $80
DB B3 OR $80
DB B2,:HALF
DB B2,$80
;
;
;
;
; FOG TUNE
; ========
;
TEMPO 80,4
;
FOGTUN DW $FEE8
DW $FD79
;
DB CS5,:QRTR
DB C5,:QRTR
DB D4,:QRTR
;
DB C5,:QRTR
DB B4,:QRTR
DB FS4,:QRTR
;
DB B4,:QRTR
DB AS4,:QRTR
DB F4,:QRTR
;
DB AS4,:QRTR
DB A4,:QRTR
DB E4,$7F
;
DW $0080
;
;
;
;
; TREASURE TUNE
; =============
;
TEMPO 64,2
;
TRSTUN DW OPNFAD
DW $FEB6
;
DB A5 OR $80
DB E5 OR $80
DB CS6,:8TH
;
DB GS5 OR $80
DB E5 OR $80
DB CS6,:TRPLT/2
;
DB GS5 OR $80
DB E5 OR $80
DB CS6,:TRPLT/2
;
DB GS5 OR $80
DB E5 OR $80
DB CS6,:TRPLT/2
;
DB FS5 OR $80
DB A5 OR $80
DB CS6,:8TH
;
DB E5 OR $80
DB A5 OR $80
DB B5,:8TH
;
DB A4 OR $80
DB E4 OR $80
DB CS4,$7F
;
DW $0080
;
;
;
;
; WARRIOR DEAD TUNE
; =================
;
TEMPO 70,4
;
DEDTUN DW $FEE8
DW $FEB6
;
DB G2 OR $80
DB D3 OR $80
DB E4,:QRTR
;
DB G2 OR $80
DB C4 OR $80
DB E4,:DOT8
;
DB G2 OR $80
DB C4 OR $80
DB E4,:16TH
;
DB G2 OR $80
DB B3 OR $80
DB E4,:QRTR
;
DB G2 OR $80
DB C4 OR $80
DB G4,:DOT8
;
DB A2 OR $80
DB A3 OR $80
DB FS4,:16TH
;
DB B2 OR $80
DB G3 OR $80
DB FS4,:8TH
;
DB B2 OR $80
DB G3 OR $80
DB E4,:8TH
;
DB B2 OR $80
DB FS3 OR $80
DB E4,:8TH
;
DB B2 OR $80
DB FS3 OR $80
DB DS4,:8TH
;
DB B2 OR $80
DB G3 OR $80
DB E4,$70
;
DW $0080
;
;
IF L.SND = OFF ;-------------------------------------------
LIST * ;-------------------------------------------
ENDIF ;-------------------------------------------
|