williams-soundroms/VSNDRM3.SRC

2075 lines
35 KiB
Plaintext
Executable File

NAM ROBOTRON SOUNDS VERSION 1.0 3-8-82
*COPYRIGHT WILLIAMS ELECTRONICS INC. 2084
*PROGRAMMERS: EUGENE P. JARVIS, SAM DICKER,RANDY PFEIFFER,JOHN KOTLARIK
* PAUL G. DUSSAULT,CARY W. KOLKER,TIM MURPHY
* AND A CAST OF THOUSANDS......
*
NOGEN
*
*SYSTEM CONSTANTS
*
ROM EQU $F000
SOUND EQU $400
CKORG EQU $EF00 CHECKSUM PROG ORG
ENDRAM EQU $7F
VECTOR EQU $FFF8 RESET,INT VECTORS
WVELEN EQU 72
BG1MAX EQU 29 MAX BACKGROUND INCREMENT
HBLEN EQU 72
BG2MAX EQU 29
SP1SND EQU $0E SPINNER SOUND #1 CODE
B2SND EQU $12 BONUS SOUND #2 CODE
SP1MAX EQU 32
NIN EQU 5
FIF EQU 6
TAF EQU 34715!>1 NOTE TIMES
TA EQU 36780!>1
TBF EQU 38967!>1
TB EQU 41284!>1
TC EQU 43739!>1
TCS EQU 46340!>1
TD EQU 49096!>1
TEF EQU 52015!>1
TE EQU 55108!>1
TF EQU 58385!>1
TFS EQU 61857!>1
TG EQU 65535!>1
*
*
* SCREAM EQUATES
*
ECHOS EQU 4
FREQ EQU 0
TIMER EQU 1
*
*GLOBALS
*
ORG 0
BG1FLG RMB 1 BACKGROUND SOUND 1
BG2FLG RMB 1 BACKGROUND SOUND 2
SP1FLG RMB 1 SPINNER FLAG
B2FLG RMB 1 BONUS #2 FLAG
ORGFLG RMB 1 ORGAN FLAG
HI RMB 1 RANDOM SEED
LO RMB 1 RANDOM SEED
XDECAY RMB 2
AMP0 RMB 1
*
*
*TEMPORARIES
*
TMPRAM EQU * TEMPORARY RAM
TEMPX RMB 2 X TEMPS
XPLAY RMB 2
XPTR RMB 2
TEMPA RMB 1 ACCA TEMP
TEMPB RMB 1
LOCRAM EQU *
*
*GWAVE PARAMETERS
*
ORG LOCRAM
GECHO RMB 1 ECHO FLAG
GCCNT RMB 1 CYCLE COUNT
GECDEC RMB 1 # OF DECAYS PER ECHO
GDFINC RMB 1 DELTA FREQ INC
GDCNT RMB 1 DELTA FREQ COUNT
GWFRM RMB 2 WAVEFORM ADDRESS
*TEMPORARY OR COMPUTED PARAMETERS
PRDECA RMB 1 PRE-DECAY FACTOR
GWFRQ RMB 2 FREQ TABLE ADDR
FRQEND RMB 2 END ADDR FREQ TABLE
WVEND RMB 2 WAVE END ADDR
GPER RMB 1 PERIOD
GECNT RMB 1 # OF ECHOES COUNTER
FOFSET RMB 1 FREQUENCY OFFSET
*
*GWAVE TABLES
*
GWTAB RMB WVELEN WAVE TABLE
*
*VARIWAVE PARAMETERS
*
ORG LOCRAM
LOPER RMB 1 LO PERIOD
HIPER RMB 1 HIPERIOD
LODT RMB 1 PERIOD DELTAS
HIDT RMB 1
HIEN RMB 1 END PERIOD
SWPDT RMB 2 SWEEP PERIOD
LOMOD RMB 1 BASE FREQ MOD
VAMP RMB 1 AMPLITUDE
LOCNT RMB 1 PERIOD COUNTERS
HICNT RMB 1
* SIREN AND BOMB RAM
ORG LOCRAM
TOP RMB 2
SWEEP RMB 2
SLOPE RMB 1
END2 RMB 2
TIME RMB 1
TABLE RMB 2
FREQZ RMB 1
*
* KNOCKER RAM
*
ORG LOCRAM
PERIOD RMB 1
AMP RMB 1
SNDTMP RMB 2 INDEX TMEP
*
* FLASH LOCAL RAM
ORG LOCRAM
FREQ1 RMB 1 FREQUENCY CONSTANT 1
FREQ2 RMB 1 FREQUENCY CONSTANT 2
FREQ3 RMB 1 FREQUENCY CONSTANT 3
FREQ4 RMB 1 FREQUENCY CONSTANT 4
DELTA1 RMB 1 DELTA AMPLITUDE 1
DELTA2 RMB 1 DELTA AMPLITUDE 2
DELTA3 RMB 1 DELTA AMPLITUDE 3
DELTA4 RMB 1 DELTA AMPLITUDE 4
FREQ1$ RMB 1 FREQUENCY COUNTER 1
FREQ2$ RMB 1 FREQUENCY COUNTER 2
FREQ3$ RMB 1 FREQUENCY COUNTER 3
FREQ4$ RMB 1 FREQUENCY COUNTER 4
CYCLE1 RMB 1 CYCLE CONSTANT 1
CYCLE2 RMB 1 CYCLE CONSTANT 2
CYCLE3 RMB 1 CYCLE CONSTANT 3
CYCLE4 RMB 1 CYCLE CONSTANT 4
DFREQ1 RMB 1 DELTA FREQUENCY 1
DFREQ2 RMB 1 DELTA FREQUENCY 2
DFREQ3 RMB 1 DELTA FREQUENCY 3
DFREQ4 RMB 1 DELTA FREQUENCY 4
EFREQ1 RMB 1 END FREQUENCY 1
EFREQ2 RMB 1 END FREQUENCY 2
EFREQ3 RMB 1 END FREQUENCY 3
EFREQ4 RMB 1 END FREQUENCY 4
CYCL1$ RMB 1 CYCLE COUNTER 1
CYCL2$ RMB 1 CYCLE COUNTER 2
CYCL3$ RMB 1 CYCLE COUNTER 3
CYCL4$ RMB 1 CYCLE COUNTER 4
SNDX1 RMB 1
RANDOM EQU LO SINGLE BYTE RANDOM
ORG LOCRAM+1
FREQ$ RMB 1 START FREQUENCY
C$FRQ RMB 1 CYCLES AT FREQUENCY
D$FRQ RMB 1 DELTA FREQUENCY
E$FRQ RMB 1 END FREQUENCY
C$AMP RMB 1 CYCLES AT AMPLITUDE
D$AMP RMB 1 DELTA AMPLITUDE
C$AMP$ RMB 1 CYCLE COUNTER
C$FRQ$ RMB 1 CYCLE COUNTER
*
*NOISE/CROWD ROAR ROUTINE PARAMETERS
*
ORG LOCRAM
DECAY RMB 1
NAMP RMB 1
CYCNT RMB 1
NFRQ1 RMB 2
NFFLG RMB 1
LFREQ RMB 1
DFREQ RMB 1
GALPAM EQU *
CYCNT2 RMB 1
NAMP2 RMB 1
DECAY2 RMB 1
NFFLG2 RMB 1
NFR2 RMB 1
GALCNT RMB 1
WHIS RMB 1 CROWD ROAR AMP
WFRQ RMB 1 CROWD WHISTLE FREQ
WCNT RMB 1 WHISTLE PASSCOUNTER
PTRHI RMB 2 WHIS ADR PTR
WFRQ2 RMB 1
WCNT2 RMB 1
CURVAL RMB 1 WHISTLING NOISE OUTPUT
ATP RMB 1 INTERM NOISE VAL
MINWIS RMB 1 MIN WHISTLE FREQ
CY2 RMB 1 NOISE CYCLE COUNTER
DFRQ RMB 1 WHISTLE FREQ CHANGE
DFRQ2 RMB 1 INIT WHISTLE FREQ CHANGE
NNOIS RMB 1 NEXT NOISE VALUE
NFRQ RMB 1 NOISE FREQ
NFRQ2 RMB 1 INIT NOISE FREQ
RCNT2 RMB 1
*
*FILTERED NOISE ROUTINE PARAMETERS
*
ORG LOCRAM
FMAX RMB 1 MAXIMUM_FREQUENCY
FHI RMB 1 FREQUENCY
FLO RMB 1
LOFRQ RMB 1
SAMPC RMB 2 SAMPLE COUNT
FDFLG RMB 1 FREQUENCY DECREMENT FLAG
DSFLG RMB 1 DISTORTION FLAG
*
*SCREAM TABLES
*
ORG LOCRAM
STABLE RMB 2*ECHOS SCREAM TABLE
SRMEND EQU *
*
*ORGAN PARAMETERS
*
ORG LOCRAM
DUR RMB 2 NOTE DURATION
OSCIL RMB 1 OSCILLATORS
RDELAY RMB 60 RAM DELAY LOAD
*
* CHECKSUM CALCULATOR & RELOCATOR
*
ORG CKORG
CKSUM LDX #$FFFF INDEX TO END OF ROM
CLRB ZERO CHECKSUM
CKSUM1 ADCB 0,X ADD IN PROGRAM BYTE
DEX TO NEXT BYTE
CPX #$F000 DONE YET?
BNE CKSUM1 NOPE...
STAB 0,X SAVE CHECKSUM AT BEGINNING
WAI TURN OFF LEDS
FROM RMB 2 FOR POINTER
TO RMB 2 FOR POINTER
*
* MAIN PROGRAM
*
ORG ROM
FCB $76 CHECKSUM BYTE
*
FCC "(C)1982 WILLIAMS ELECTRONICS"
*
SETUP SEI SET INTERRUPT MASK
LDS #ENDRAM INITIALIZE STACK POINTER
LDX #SOUND INDEX TO PIA
CLR 1,X ACCESS DDRA
CLR 3,X ACCESS DDRB
LDAA #$FF PA0-PA7
STAA 0,X SET SIDE A AS OUTPUTS
CLR 2,X SET B SIDE AS INPUTS
LDAA #$37 CB2 LOW, IRQ ALLOWED
STAA 3,X PROGRAM B CONTROL REG
LDAA #$3C CA2 SET INIT HIGH, NO IRQS
STAA 1,X PROGRAM A SIDE
STAA HI START RANDOM GENERATOR
CLRA
STAA B2FLG
STAA BG1FLG
STAA BG2FLG
STAA SP1FLG
STAA ORGFLG
CLI CLEAR INTERRUPTS
BRA * WAIT FOR INTERRUPT
*
*
* THREE OSCILLATOR SOUND GENERATOR
*
PLAY STX XPLAY SAVE CURRENT INDEX
LDX #DECAYZ SET TO MAXIMUM AMPLITUDE
STX XDECAY AND SAVE
LDAA #$80 LOAD ZERO AMPLITUDE
PLAY1 LDAB FREQ4 CHECK WHITE NOISE COUNTER
BPL PLAY3 NOT IN WHITE MODE
LDAB RANDOM GET RANDOM NUMBER
LSRB REDUCE IT
LSRB
LSRB
INCB NOW NON-ZERO
PLAY2 DECB TIME OUT COUNT
BNE PLAY2
PLAY3 DEC FREQ1$ COUNT DOWN OSC. 1
BEQ PLAY7 DO AN UPDATE
DEC FREQ2$ COUNT DOWN OSC. 2
BEQ PLAY8 DO AN UPDATE
DEC FREQ3$ COUNT DOWN OSC. 3
BEQ PLAY9 DO AN UPDATE
DEC FREQ4$ COUNT DOWN WHITE NOISE
BNE PLAY1 DO THEM AGAIN
LDAB FREQ4 CHECK WHITE NOISE CONSTANT
BEQ PLAY1 FORGET IT
ANDB #$7F STRIP FLAG BIT
STAB FREQ4$ SAVE WHITE NOISE COUNT
LDAB RANDOM GET CURRENT RANDOM
ASLB DOUBLE
ADDB RANDOM TRIPLE
ADDB #$0B ADD IN 11
STAB RANDOM VOILA...NEW RANDOM NUMBER
DEC CYCL4$ COUNT DOWN DECAY
BNE PLAY6 DON'T DECAY
LDAB CYCLE4 RELOAD COUNT
STAB CYCL4$ AND SAVE
LDX XDECAY GET DECAY JUMP POINTER
DEX MOVE TO LESS AMPLITUDE
CPX #RDECAY+1 DONE?
BEQ PLAY12 YUP...BYE BYE
STX XDECAY SAVE NEW POINTER
PLAY6 LDAB RANDOM GET RANDOM AMPLITUDE
BMI PLAY6A SKIP IF NEGATIVE
ANDB DELTA4 REDUCE AMPLITUDE
ANDB #$7F STRIP SIGN BIT
BRA PLAY6B
PLAY6A ANDB DELTA4 REDUCE AMPLITUDE
ANDB #$7F REMOVE SIGN BIT
NEGB NEGATE
PLAY6B PSHA
ABA ADD WHITE NOISE
TAB
PULA
LDX XDECAY GET DECAY POINTER
JSR 0,X OUTPUT NOISE
BRA PLAY1 DO SOME MORE
PLAY7 LDX #FREQ1 INDEX TO SET 1
BRA PLAY10
PLAY8 LDX #FREQ2 INDEX TO SET 2
BRA PLAY10
PLAY9 LDX #FREQ3 INDEX TO SET 3
PLAY10 TST 24,X CHECK CYCLES AT FREQUENCY
BEQ PLAY11 ZERO, DON'T CHANGE
DEC 24,X COUNT DOWN
BNE PLAY11 NOT TIME TO CHANGE...
LDAB 12,X LOAD CYCLES AT FREQUENCY
STAB 24,X SAVE IN COUNTER
LDAB 00,X GET CURRENT FRQUENCY
ADDB 16,X ADD DELTA
CMPB 20,X COMPARE TO END
BEQ PLAY12 DONE...
STAB 00,X SAVE NEW CURRENT FREQUENCY
PLAY11 LDAB 0,X GET CURRENT FREQUENCY
STAB 8,X SAVE IN FREQUENCY COUNTER
ADDA 4,X ADD IN AMPLITUDE
NEG 4,X NEGATE AMPLITUDE
TAB SAVE DATA
LDX XDECAY INDEX TO DECAY
JSR 0,X OUTPUT SOUND
JMP PLAY1 REPEAT
PLAY12 LDX XPLAY RESTORE INDEX
RTS
*
* ECHO AND DECAY ROUTINE
*
RDECAY LSRB
LSRB
LSRB
LSRB
LSRB
LSRB
LSRB
LSRB
DECAYZ STAB SOUND
RTS
*
* 3 OSCILLATOR CALLING ROUTINES
*
THNDR LDX #VEC01 THUNDER SOUND
THNDR1 LDAB #28 NEED TO TRANSFER
JSR TRANS 28 BYTES FOR PLAY
JSR PLAY NOW PLAY IT
RTS
SND2 LDX #VEC02 SOUND 2
BRA THNDR1
SND3 LDX #VEC03 SOUND 3
BRA THNDR1
SND4 LDX #VEC04 SOUND 4
BRA THNDR1
SND5 LDX #VEC05 SOUND 5
BRA THNDR1
SND16 LDX #VEC016
BRA THNDR1
SND17 LDX #VEC017
BRA THNDR1
*
*
* PROGRESSIVE PITCH BONUS COUNTDOWN
*
BONUS$ LDX #$0060 PROGRESSIVE SINGLE FREQUENCY
LDAA 0,X GET CURRENT FREQUENCY
SUBA #$02 NOW HIGHER
STAA 0,X SAVE NEW FREQUENCY
JSR MOVE SET UP FOR SING
JMP SING PLAY IT
*
* DIVING PLANE SOUND
*
PLANE LDX #$0001 SET FOR SHORT HALF CYCLE
STX FREQ1 SAVE VALUE
LDX #$0380 SET FOR LONG HALF CYCLE
STX FREQ3 SAVE VALUE
PLANE1 CLR SOUND SEND OUT ZEROES
LDX FREQ1 GET LOW HALF CYCLE DATA
INX INCREASE HALF CYCLE
STX FREQ1 SAVE NEW VALUE
PLANE2 DEX COUNT DOWN
BNE PLANE2
COM SOUND SEND OUT ONES
LDX FREQ3 GET HIGH HALF CYCLE DATA
PLANE3 DEX COUNT DOWN
BNE PLANE3
BRA PLANE1
*
* SIREN AIR RAID
*
ZIREN LDAA #$FF
STAA TOP
LDX #$FEC0
STX SWEEP
LDAA #$20
LDX #$FFE0
BSR ZIREN0
LDAA #$1
LDX #$44
ZIREN0 STAA SLOPE
STX END2
ZIREN1 LDX #$10
ZIREN2 BSR ZIRLOP
LDAA TOP+1
ADDA SWEEP+1
STAA TOP+1
LDAA TOP
ADCA SWEEP
STAA TOP
DEX
BNE ZIREN2
LDAA SWEEP+1
ADDA SLOPE
STAA SWEEP+1
BCC ZIREN5
INC SWEEP
ZIREN5 LDX SWEEP
CPX END2
BNE ZIREN1
RTS
*FLAT TRIANGLE LOOP
ZIRLOP CLRA
ZIRLP1 STAA SOUND
ADDA #$20
BCC ZIRLP1
BSR ZIRT
LDAA #$E0
ZIRLP4 STAA SOUND
SUBA #$20
BCC ZIRLP4
ZIRT LDAB TOP
ZIRLP2 LDAA #$2
ZIRLP3 DECA
BNE ZIRLP3
DECB
BNE ZIRLP2
RTS
*
* THE BOMB OOOOOH NOOOOO!
WHIST LDAA #$80
STAA FREQZ
LDAA #SINTBL/$100
STAA TABLE
WHIST0 LDAA #$80
STAA TEMPA
WHIST1 LDAA #18
WHIST2 DECA
BNE WHIST2
LDAA TIME
ADDA FREQZ
STAA TIME
LSRA
LSRA
LSRA
ADDA #SINTBL!.$FF
STAA TABLE+1
LDX TABLE
LDAA ,X
STAA SOUND
DEC TEMPA
BNE WHIST1
DEC FREQZ
LDAA FREQZ
CMPA #$20
BNE WHIST0
RTS
* SINE TABLE
SINTBL FCB $80,$8C,$98,$A5,$B0,$BC,$C6,$D0
FCB $DA,$E2,$EA,$F0,$F5,$FA,$FD,$FE
FCB $FF,$FE,$FD,$FA,$F5,$F0,$EA,$E2
FCB $DA,$D0,$C6,$BC,$B0,$A5,$98,$8C
FCB $80,$73,$67,$5A,$4F,$43,$39,$2F
FCB $25,$1D,$15,$0F,$0A,$05,$02,$01
FCB $00,$01,$02,$05,$0A,$0F,$15,$1D
FCB $25,$2F,$39,$43,$4F,$5A,$67,$73
*
* KNOCKER ROUTINE
*
KNOCK CLR SOUND+2 FULL BLAST
LDX #KNKTAB
STX SNDTMP
SQLP LDX SNDTMP RESTORE X REG
LDAA ,X GET PERIOD
BEQ END END ON ZERO
LDAB 1,X GET AMP
ANDB #$F0
STAB AMP
LDAB 1,X
INX
INX
STX SNDTMP SAVE X
STAA PERIOD
ANDB #$F
LP0 LDAA AMP
STAA SOUND
LDAA PERIOD
LP1 LDX #5 DELAY
LP11 DEX
BNE LP11
DECA
BNE LP1
CLR SOUND
LDAA PERIOD
LP2 LDX #5 DELAY
LP22 DEX
BNE LP22
DECA
BNE LP2
DECB
BNE LP0
BRA SQLP
END LDAA #$80 OVERRIDE OFF
STAA SOUND+2
RTS
*
*
* KNOCKER PATTERN
*
KNKTAB FDB $01FC,$02FC,$03F8,$04F8,$06F8,$08F4,$0CF4
FDB $10F4,$20F2,$40F1,$60F1,$80F1,$A0F1,$C0F1,0
*
*
* FUNNY "ELECTRIC SOUND"
* SUPPOSED TO GENERATE A PHASED OUTPUT AT
* A CHANGING FREQUENCY. IT DOESN'T, AND
* I'M NOT SURE EXACTLY WHAT IT DOES DO.
* BEST LEAVE THIS ALONE.
*
BONUS DEC SNDX1
BRA SND1$
SND1 LDAB #$A0
STAB SNDX1
SND1$ LDAA #$04
STAA FREQ2
SND1$$ LDAA #$9F
LDAB SNDX1
SND1A LDX #$01C0
SND1B DEX
BEQ SND1E
FCB $F7 "STAB"
FDB FREQ1
STAA SOUND
SND1C DEX
BEQ SND1E
DEC FREQ1
BNE SND1C
DEX
BEQ SND1E
STAB FREQ1
COM SOUND
SND1D DEX
BEQ SND1E
DEC FREQ1
BNE SND1D
BRA SND1B
SND1E SUBB FREQ2
CMPB #$10
BHI SND1A
RTS
START LDAB #$11
STAB SNDX1
LDAA #$FE
STAA FREQ2
BRA SND1$$
*
* SINGLE OSCILLATOR SOUND CALLS
*
PERK LDX #VEC01X
BRA PERK$1
PERK1 JSR MOVE
JSR SING
RTS
ATARI LDX #VEC02X
BRA PERK1
SIREN LDAB #$FF
STAB AMP0
SIREN1 LDX #VEC03X
BSR PERK1
LDX #VEC04X
BSR PERK1
DECB
BNE SIREN1
RTS
ORRRR LDX #VEC05X
BRA PERK1
PERK$ LDX #VEC07X
PERK$1 BSR PERK1
BSR ECHO
BRA PERK$1
HSTD LDAA #$FF
STAA AMP0
LDX #VEC08X
BRA PERK$1
PERK$$ LDAA #$FF
STAA AMP0
LDX #VEC06X
BRA PERK$1
*
* RANDOM SQUIRTS
*
SQRT LDAB #$30
SQRT1 LDX #VEC09X
BSR MOVE
SQRT2 LDAA RANDOM
ASLA
ADDA RANDOM
ADDA #$0B
STAA RANDOM
LSRA
LSRA
ADDA #$0C
STAA FREQ$
BSR SING
DECB
BNE SQRT2
RTS
*
* ECHO FUNCTION
*
ECHO LDAA AMP0
SUBA #$08
BPL ECHO1
STAA AMP0
RTS
ECHO1 PULA
PULA
RTS
*
* MOVE PARAMETERS
*
MOVE LDAA 0,X
STAA FREQ$
LDAA 1,X
STAA C$FRQ
LDAA 2,X
STAA D$FRQ
LDAA 3,X
STAA E$FRQ
LDAA 4,X
STAA C$AMP
LDAA 5,X
STAA D$AMP
RTS
*
* DELTA F, DELTA A ROUTINE
*
SING LDAA AMP0 GET STARTING AMPLITUDE
SING$ PSHB SAVE B
LDAB C$AMP GET CYCLES AT AMPLITUDE
STAB C$AMP$ SAVE AS COUNTER
LDAB C$FRQ GET CYCLES AT FREQUENCY
STAB C$FRQ$ SAVE AS COUNTER
SING1 COMA INVERT AMPLITUDE
LDAB FREQ$ GET FREQUENCY COUNTER
STAA SOUND OUTPUT TO D/A
SING2 DECB
BNE SING2
COMA INVERT AMPLITUDE
LDAB FREQ$ GET FREQUENCY COUNTER
BRA *+2 -I
INX -I
DEX -I--- SYNC, 20 CYCLES
INX -I
DEX -I
STAA SOUND OUTPUT TO D/A
SING3 DECB
BNE SING3
DEC C$FRQ$ CHECK CYCLES AT FREQUENCY
BEQ SING4 GO CHANGE FREQUENCY
DEC C$AMP$ CHECK CYCLES AT AMPLITUDE
BNE SING1 ALL OK, GO OUTPUT
COMA INVERT AMPLITUDE
LDAB C$AMP GET CYCLES AT AMPLITUDE
STAA SOUND OUTPUT TO D/A
STAB C$AMP$ SAVE AS COUNTER
LDAB FREQ$ GET FREQUENCY COUNT
ADDA D$AMP ADD AMPLITUDE DELTA
BMI SING6 RETURN FROM SUBROUTINE
NOP SYNC, 2 CYCLES
BRA SING5
SING4 INX -I
DEX -I--- SYNC, 10 CYCLES
NOP -I
COMA INVERT AMPLITUDE
LDAB C$FRQ GET CYCLES AT FREQUENCY
STAA SOUND OUTPUT TO D/A
STAB C$FRQ$ SAVE AS COUNTER
LDAB FREQ$ GET FREQUENCY COUNT
SUBB D$FRQ SUBTRACT FREQUENCY DELTA
CMPB E$FRQ COMPARE TO END FREQUENCY
CMPB E$FRQ SYNC, 3 CYCLES
BEQ SING6 RETURN FROM SUBROUTINE
SING5 STAB FREQ$ SAVE FREQUENCY COUNT
SUBB #$05 SYNC TO FREQUENCY COUNTDOWN
BRA SING2 JUMP INTO COUNTDOWN LOOP
SING6 PULB RESTORE B
RTS
*
*
SNDTBL FCB $DA,$FF,$DA,$80,$26,$01,$26,$80
FCB $07,$0A,$07,$00,$F9,$F6,$F9,$00
NOTTBL FCB $3A,$3E,$50,$46,$33,$2C,$27,$20
FCB $25,$1C,$1A,$17,$14,$11,$10,$33
WAVFRM FCB $08,$03,$02,$01,$02,$03,$04,$05
FCB $06,$0A,$1E,$32,$70,$00
VEC01 FDB $FFFF,$FF90,$FFFF,$FFFF,$FFFF
FDB $FF90,$FFFF,$FFFF,$FFFF,$FFFF
FDB $0000,$0000,$0000,$0000
VEC02 FDB $4801,$0000,$3F3F,$0000,$4801
FDB $0000,$0108,$0000,$8101,$0000
FDB $01FF,$0000,$0108,$0000
VEC03 FDB $0110,$0000,$3F3F,$0000,$0110
FDB $0000,$0505,$0000,$0101,$0000
FDB $31FF,$0000,$0505,$0000
VEC04 FDB $3000,$0000,$7F00,$0000,$3000
FDB $0000,$0100,$0000,$7F00,$0000
FDB $0200,$0000,$0100,$0000
VEC05 FDB $0400,$0004,$7F00,$007F,$0400
FDB $0004,$FF00,$00A0,$0000,$0000
FDB $0000,$0000,$FF00,$00A0
VEC06 FDB $0C68,$6800,$071F,$0F00,$0C80
FDB $8000,$FFFF,$FF00,$0000,$0000
FDB $0000,$0000,$FFFF,$FF00
VEC016 FDB $0104,$0000,$3F7F,$0000,$0104
FDB $0000,$05FF,$0000,$0100,$0000
FDB $4800,$0000,$05FF,$0000
VEC017 FDB $0280,$0030,$0A7F,$007F,$0280
FDB $0030,$C080,$0020,$0110,$0015
FDB $C010,$0000,$C080,$0000
VEC01X FDB $FF01,$02C3,$FF00
VEC02X FDB $0103,$FF80,$FF00
VEC03X FDB $2003,$FF50,$FF00
VEC04X FDB $5003,$0120,$FF00
VEC05X FDB $FE04,$0204,$FF00
VEC06X FDB $4803,$010C,$FF00
VEC07X FDB $4802,$010C,$FF00
VEC08X FDB $E001,$0210,$FF00
VEC09X FDB $50FF,$0000,$6080
VEC10X FDB $FF02,$0106,$FF00
*
*VARI LOADER
*
VARILD TAB
ASLA X2
ASLA X4
ASLA X8
ABA X9
LDX #LOCRAM
STX XPTR SET XSFER
LDX #VVECT
JSR ADDX
LDAB #9 GET COUNT
VTRAN JMP TRANS
*
*VARIABLE DUTY CYCLE SQUARE WAVE ROUTINE
*
VARI LDAA VAMP
STAA SOUND
VAR0 LDAA LOPER
STAA LOCNT
LDAA HIPER
STAA HICNT
V0 LDX SWPDT
V0LP LDAA LOCNT LO CYCLE
COM SOUND
V1 DEX
BEQ VSWEEP
DECA
BNE V1
COM SOUND
LDAA HICNT HI CYCLE
V2 DEX
BEQ VSWEEP
DECA
BNE V2
BRA V0LP LOOP BACK
VSWEEP LDAA SOUND
BMI VS1
COMA
VS1 ADDA #0
STAA SOUND OUTPUT
LDAA LOCNT
ADDA LODT
STAA LOCNT
LDAA HICNT
ADDA HIDT
STAA HICNT
CMPA HIEN
BNE V0
LDAA LOMOD
BEQ VARX
ADDA LOPER
STAA LOPER
BNE VAR0
VARX RTS
*
*LAUNCH
*
LAUNCH LDAA #$FF
STAA DFREQ
LDAA #$60
LDAB #$FF
BRA LITEN
*
*LIGHTNING
*
LITE LDAA #1
STAA DFREQ
LDAB #3
BRA LITEN
*
*APPEAR
*
APPEAR LDAA #$FE
STAA DFREQ
LDAA #$C0
LDAB #$10
BRA LITEN
*
*LIGHTNING+APPEAR NOISE ROUTINE
*
LITEN STAA LFREQ
LDAA #$FF HIGHEST AMP
STAA SOUND
STAB CYCNT
LITE0 LDAB CYCNT
LITE1 LDAA LO GET RANDOM
LSRA
LSRA
LSRA
EORA LO
LSRA
ROR HI
ROR LO
BCC LITE2
COM SOUND
LITE2 LDAA LFREQ COUNT FREQ
LITE3 DECA
BNE LITE3
DECB COUNT CYCLES
BNE LITE1
LDAA LFREQ
ADDA DFREQ
STAA LFREQ
BNE LITE0
RTS
*
*TURBO
*
TURBO LDAA #$20
STAA CYCNT
STAA NFFLG
LDAA #$1
LDX #1
LDAB #$FF
BRA MOISE
*
*WHITE NOISE ROUTINE
*X=INIT PERIOD, ACCB=INIT AMP, ACCA DECAY RATE
*CYCNT=CYCLE COUNT, NFFLG= FREQ DECAY FLAG
*
MOISE STAA DECAY
MOISE0 STX NFRQ1
MOIS00 STAB NAMP
LDAB CYCNT
MOISE1 LDAA LO GET RANDOM BIT
LSRA
LSRA
LSRA
EORA LO
LSRA
ROR HI
ROR LO
LDAA #$0
BCC MOISE2
LDAA NAMP
MOISE2 STAA SOUND
LDX NFRQ1 INCREASING DELAY
MOISE3 DEX
BNE MOISE3
DECB FINISH CYCLE COUNT?
BNE MOISE1 NO
LDAB NAMP DECAY AMP
SUBB DECAY
BEQ MSEND
LDX NFRQ1 INC FREQ
INX
LDAA NFFLG DECAY FREQ?
BEQ MOIS00 NO
BRA MOISE0
MSEND RTS
*
*
*CROWD ROAR
CDR LDX #WS1 1ST WHISTLE PARAMS
STX PTRHI
JSR WISLD
LDX #$A500 SEED
STX HI
LDX #CR1 1ST CROWD ROAR NOISE PARAMS
JSR NOISLD
JSR NINIT
LDX #CR2
JSR NOISLD
JMP NINIT2
*WHISTLE PARAMS
WS1 FCB $90,$10,2,$14,$40
FCB $B4,$40,$FF,$14,$30
FCB $D0,$32,$2,$10,$60
FCB $EE,$20,2,8,$54
FCB $E9,$54,$FF,$20,$28
FCB $C0,$30,2,$14,$58
FCB $AC,$20,$2,$8,$58
FCB $A6,$58,$FF,$18,$22
FCB 0
CR1 FCB $30,$10,$FC,0,1
CR2 FCB $30,$FC,1,0,1
*
*
*WHITE NOISE ROUTINE
*NFRQ=INIT PERIOD, NAMP=INIT AMP, DECAY AMPLITUDE RATE
*CYCNT=CYCLE COUNT, NFFLG= FREQ DECAY FLAG
*NFFLG=0 NO FREQ CHANGE;=POS DECAY;=MINUS INC FREQ
*NOISE LOAD PROG-ENTER WITH XREG POINTING TO DATA
*
NOISLD LDAA X
STAA CY2
LDAA 1,X
STAA NAMP
LDAA 2,X
STAA DECAY
LDAA 3,X
STAA NFFLG
LDAA 4,X
STAA NFRQ2
NEND RTS
*
*LOAD NOISE AND GO
*
NOISLG BSR NOISLD
*
*NOISE INIT
*
NOIN BSR NSUB CY2&NFRQ2 TO CYCNT&NFRQ
*
*NOISE LOOP
*
NO1 BSR RNT FREQ CHECK
LDAA NFRQ FREQ REINITED?
CMPA NFRQ2
BNE NO1 IF NOT KEEEP DELAYING
ROLB RESTORE MAX AMPLITUDE TO NOISE
STAB SOUND OUTPUT TO DAC
BSR NOISE1 PREPARE NEXT RAND NO
BSR NOISE2
BSR RNA AMPLITUDE &CYCL3 COUNT CECK
TST NAMP SEE IF DONE
BEQ NEND RTS IF FINISHED
TST CYCNT SEE IF NEXT FREQ
BNE NO1 IF NOT GO FREQ DELAY LOOP
TST NFFLG SEE IF SWEEP MODE
BEQ NO1 IF NO SWEEP GO DELAY
BMI NO3 SWEEP DOWN
INC NFRQ2
BRA NO1
NO3 DEC NFRQ2
DEC NFRQ
BRA NO1
NSUB CLR CYCNT
LDAA NFRQ2
STAA NFRQ NOISE FREQ
CLR NNOIS
RTS
* 23 CYCLES FOR EACH SUBROUTINE PLUS CALLING OVERHEAD
*
*
NOISE1 LDAA LO GET RANDOM BIT
LSRA
LSRA
LSRA
EORA LO
STAA ATP INTERMED RAND NO
INX
ANDA #$7 FOR 3 BIT RANDOM NO
*
RTS
*
NOISE2 LDAA ATP
LSRA
ROR HI
ROR LO
LDAA #$0
BCC NOISE3
LDAA NAMP
NOISE3 STAA NNOIS NEXT NOISE VALUE
*
RTS
*
RNT LDAA NFRQ2 NOISE FREQ
DEC NFRQ
BEQ NW0
INX
DEX TEQ
BRA NNW1
NW0 STAA NFRQ REINIT FREQ
LDAB NNOIS SAVE NEXT NOISE VAL IN B REG
LSRB HALF AMPLITUDE
INC CYCNT NOISE CYCLE COUNT AT NAMP
*
NNW1 RTS
*
RNA LDAA CY2 NOISE AMPL CHANGE
CMPA CYCNT
BEQ NW2
INX
DEX
BRA NW3 TEQ
NW2 CLR CYCNT
LDAA NAMP
SUBA DECAY
STAA NAMP
*
NW3 RTS
*
* NOISE WITH WHISTLE MAIN LOOP
NINIT CLR WFRQ
CLR DFRQ
LDAA #$E CYCLE OFFSET FOR WHISTLE
STAA WCNT
CLR CURVAL CLR WHISTLE VALUES
NINIT2 BSR NSUB CLR CYCNT AND INIT FREQ
WIN BSR NOISE1
JSR TRIDR
BSR NOISE2
JSR TRIDR
BSR RNT
BSR TRIDR
BSR RNA
BSR TRIDR
BSR TRICNT
BSR TRIDR
BSR TRIFRQ
BSR TRIDR
BSR NNW
BRA WIN
*
TRICNT LDAA WCNT2 #CYCLES AT WHISTLE FREQ
DEC WCNT
BEQ NW4
FCB $B6 LDAA EXTENDED
FDB NAMP
BNE NW5 TEQ
BRA NSEND END NOISE
NW4 STAA WCNT
LDAA WFRQ
ADDA DFRQ
STAA WFRQ
*
NW5 RTS
*
TRIFRQ LDAA WFRQ WHISTLE END TEST
CMPA MINWIS
BEQ NW6
INX TEQ
LDAA NAMP END TEST
BNE NW7 TEQ
BRA PEND END NOISE
NW6 CLR WFRQ TURN OFF WHISTLE
CLR DFRQ
CLR CURVAL
LDX PTRHI SET UP FOR NEXT WHISTLE
WISLD LDAA X
STAA WHIS
BEQ NW7
LDAA 1,X
STAA WFRQ2
LDAA 2,X
STAA DFRQ2
LDAA 3,X
STAA WCNT2
LDAA 4,X
STAA MINWIS
LDAA #5
JSR ADDX
STX PTRHI
*
NW7 RTS
PEND PULA
PULA STACK ADJ
RTS
*
NNW LDAA WHIS WHISTLE INIT
BEQ NW8 ALREADY INITED
CMPA NAMP
BNE NW9
BRA WINIT GO INIT WHISTLE
NW8 INX
DEX TEQ
NW9 RTS
WINIT CLR WHIS
LDAA WFRQ2
STAA WFRQ
LDAA DFRQ2
STAA DFRQ
RTS
******************
TRIDR LDAA CURVAL
ADDA WFRQ
STAA CURVAL
BPL GO
COMA
GO ABA
STAA SOUND
NSEND RTS
*
*
*BACKGROUND 1 ROUTINE
*
BG1 LDAB #1
STAB BG1FLG
LDX #BG1TB
BRA FNLOAD
*
*THRUST
*
THRUST LDX #THTB
BRA FNLOAD
*
*CANNON
*
CANNON LDX #CANTB
BRA FNLOAD
*
FNTAB EQU *
BG1TB FCB 0,0,0,$01,0,00
THTB FCB 0,0,0,3,00,00
CANTB FCB 1,0,1,$FF,3,$E8 DEFENDER SND #$17
HBMBTB FCB 1,1,1,$40,$10,00
RAIN FCB 1,$80,1,$40,$FF
*
HBOMB LDX #HBMBTB
*
*LOADER
*
FNLOAD LDAA ,X
STAA DSFLG DISTORTION FLAG
LDAA 1,X
STAA LOFRQ
LDAA 2,X FREQ DECAY FLAG
LDAB 3,X INIT MAX FREQ
LDX 4,X SAMPLE COUNT
*
*FILTERED NOISE ROUTINE
*X=SAMPLE COUNT, ACCB=INITIAL MAX FREQ
*ACCA=FREQ DECAY FLAG ,DSFLG=DISTORTION FLAG
*
FNOISE STAA FDFLG
STAB FMAX
STX SAMPC
CLR FLO
FNOIS0 LDX SAMPC
LDAA SOUND
FNOIS1 TAB NEXT RANDOM NUMBER
LSRB
LSRB
LSRB
EORB LO
LSRB
ROR HI
ROR LO
LDAB FMAX SET FREQ
TST DSFLG
BEQ FNOIS2
ANDB HI DISTORT FREQUENCY
ADDB LOFRQ LO FREQ MIN
FNOIS2 STAB FHI
LDAB FLO
CMPA LO
BHI FNOIS4
FNOIS3 DEX SLOPE UP
BEQ FNOIS6
STAA SOUND
ADDB FLO
ADCA FHI
BCS FNOIS5
CMPA LO
BLS FNOIS3
BRA FNOIS5
FNOIS4 DEX SLOPE DOWN
BEQ FNOIS6
STAA SOUND
SUBB FLO
SBCA FHI
BCS FNOIS5
CMPA LO
BHI FNOIS4
FNOIS5 LDAA LO
STAA SOUND
BRA FNOIS1
FNOIS6 LDAB FDFLG
BEQ FNOIS1
LDAA FMAX DECAY MAX FREQ
LDAB FLO
LSRA
RORB
LSRA
RORB
LSRA
RORB
COMA
NEGB
SBCA #-1
ADDB FLO
ADCA FMAX
STAB FLO
STAA FMAX
BNE FNOIS0
CMPB #7
BNE FNOIS0
RTS
*
*RADIO
*
RADIO LDAA #RADSND/$100 SOUND TABLE
STAA XPTR
LDX #100 STARTING FREQ
STX TEMPX
RADIO1 ADDB TEMPX+1 ADD FREQ TO TIMER
LDAA TEMPA
ADCA TEMPX
STAA TEMPA
LDX TEMPX
BCS RADIO2
BRA *+2 EQUALIZE TIME
BRA RADIO3
RADIO2 INX CARRY?, RAISE FREQ
BEQ RADIO4 DONE?
RADIO3 STX TEMPX
ANDA #$F SET POINTER
ADDA #RADSND!.$FF
STAA XPTR+1
LDX XPTR
LDAA ,X
STAA SOUND PLAY SOUND
BRA RADIO1
RADIO4 RTS
*
*HYPER
*
HYPER CLRA
STAA SOUND
STAA TEMPA ZERO PHASE
HYPER1 CLRA ZERO TIME COUNTER
HYPER2 CMPA TEMPA
BNE HYPER3
COM SOUND PHASE EDGE?, COMPLEMENT SOUND
HYPER3 LDAB #18 DELAY
HYPER4 DECB
BNE HYPER4
INCA ADVANCE TIME COUNTER
BPL HYPER2
COM SOUND CYCLE DONE?, CYCLE EDGE
INC TEMPA NEXT PHASE
BPL HYPER1 DONE?
RTS
*
*SCREAM
*
SCREAM LDX #STABLE ZERO FREQS AND TIMES
SCREM1 CLR ,X
INX
CPX #SRMEND
BNE SCREM1
LDAA #$40 START FIRST ECHO
STAA STABLE+FREQ
SCREM2 LDX #STABLE INITIALIZE COUNTER
LDAA #$80 INITIALIZE AMPLITUDE
STAA TEMPA
CLRB ZERO OUTPUT BUFFER
SCREM3 LDAA TIMER,X ADD FREQ TO TIMER
ADDA FREQ,X
STAA TIMER,X
BPL SCREM4 ADD AMPLITUDE IF MINUS
ADDB TEMPA
SCREM4 LSR TEMPA DECAY AMPLITUDE
INX NEXT ECHO
INX
CPX #SRMEND LAST ECHO?
BNE SCREM3
STAB SOUND OUTPUT SOUND
INC TEMPB ADVANCE TIMER
BNE SCREM2
LDX #STABLE LOWER NON-ZERO FREQUENCIES
CLRB ALL ZERO NOT FLAG
SCREM5 LDAA FREQ,X
BEQ SCREM7
CMPA #$37
BNE SCREM6
LDAB #$41 START NEXT ECHO
STAB FREQ+2,X
SCREM6 DEC FREQ,X
INCB SET FLAG
SCREM7 INX
INX
CPX #SRMEND
BNE SCREM5
TSTB DONE?
BNE SCREM2
RTS
*
*ORGAN TUNE
*
ORGANT DEC ORGFLG MINUS ORGAN FLAG
RTS
ORGNT1 BSR ORGASM
JMP IRQ3
ORGASM CLR ORGFLG
STAA TEMPA TUNE NUMBER
LDX #ORGTAB
ORGNT2 LDAA ,X TUNE TABLE LENGTH
BEQ ORGNT5 INVALID TUNE
DEC TEMPA
BEQ ORGNT3
INCA
JSR ADDX
BRA ORGNT2
ORGNT3 INX
STX XPTR NOTE POINTER
JSR ADDX
STX XPLAY TUNE END
LDX XPTR
ORGNT4 LDAA ,X TUNE LOOP
STAA OSCIL
LDAA 1,X
LDX 2,X
STX DUR
BSR ORGANL
LDX XPTR
INX
INX
INX
INX
STX XPTR
CPX XPLAY
BNE ORGNT4
ORGNT5 RTS
*
*ORGAN NOTE
*4 BYTES(MODE,OSCILLATOR MASK HI+1,LO+1,NOTE#)
ORGANN RTS
*
*ORGAN LOADER
*OSCIL=OSCILLATOR MASK, ACCA=DELAY, DUR=DURATION
*
ORGANL LDX #RDELAY
SUBA #2
LDLP BLS LD1
CMPA #3
BEQ LD2
LDAB #1 NOP
STAB ,X
INX
SUBA #2
BRA LDLP
LD2 LDAB #$91 CMPA 0
STAB ,X
CLR 1,X
INX
INX
LD1 LDAB #$7E JMP START2
STAB ,X
LDAB #ORGAN1!>8 MSB
STAB 1,X
LDAB #ORGAN1!.$FF LSB
STAB 2,X
*
*ORGAN ROUTINE
*DUR=DURATION, OSCILLATOR MASK
*
ORGAN LDX DUR
ORGAN1 CLRA
FCB $F6 LOAD B EXTND TEMPB
FDB TEMPB
INCB
STAB TEMPB
ANDB OSCIL MASK OSCILLATORS
LSRB
ADCA #0
LSRB
ADCA #0
LSRB
ADCA #0
LSRB
ADCA #0
LSRB
ADCA #0
LSRB
ADCA #0
LSRB
ADCA #0
ABA
ASLA
ASLA
ASLA
ASLA
ASLA
STAA SOUND
DEX
BEQ ORGAN2 NOTE OVER?
JMP RDELAY
ORGAN2 RTS
*
*PARAMETER TRANSFER
*
TRANS PSHA
TRANS1 LDAA 0,X
STX XPLAY
LDX XPTR
STAA 0,X
INX
STX XPTR
LDX XPLAY
INX
DECB
BNE TRANS1
PULA
RTS
*
*BACKGROUND END ROUTINE
*
BGEND CLRA
STAA BG1FLG
STAA BG2FLG
RTS
*
*BACKGROUND SOUND #2 INCREMENT
*
BG2INC CLR BG1FLG KILL BG1
LDAA BG2FLG ACTIVATE BG2
ANDA #$7F REMOVE OVERRIDE
CMPA #BG2MAX
BNE BG2I0
CLRA
BG2I0 INCA
STAA BG2FLG
RTS
*
*BACKGROUND 2 ROUTINE
*
BG2 LDAA #(TRBV-SVTAB)/7 GET SOUND#
JSR GWLD
LDAA BG2FLG
ASLA
ASLA
COMA
JSR GEND60
BG2LP INC GDCNT
JSR GEND61
BRA BG2LP
*
*
*
*
*SPINNER #1 SOUND
*
SP1 LDAA #(CABSHK-VVECT)/9
JSR VARILD
LDAB SP1FLG
CMPB #SP1MAX-1
BNE SP1A
CLRB
SP1A INCB
STAB SP1FLG
LDAA #SP1MAX
SBA
CLRB
SP11 CMPA #20
BLS SP12
ADDB #14
DECA
BRA SP11
SP12 ADDB #5
DECA
BNE SP12
STAB LOPER
SP1LP JSR VARI DO IT
BRA SP1LP
*
*LASER BALL BONUS #2
*
BON2 LDAA B2FLG
BNE BON21
INC B2FLG
LDAA #(BONV-SVTAB)/7
BSR GWLD
BRA GWAVE
BON21 JMP GEND50
*
*GWAVE LOADER
*
GWLD TAB MULKT BY 7
ASLB
ABA
ABA
ABA
LDX #SVTAB SOUND VECTOR TABLE
JSR ADDX
LDAA ,X
TAB
ANDA #$F
STAA GCCNT GET CYCLE COUNT
LSRB
LSRB
LSRB
LSRB
STAB GECHO GET #ECHOS
LDAA 1,X
TAB
LSRB
LSRB
LSRB
LSRB
STAB GECDEC
ANDA #$F WAVE #
STAA TEMPA SAVE
STX TEMPX SAVE INDEX
LDX #GWVTAB CALC WAVEFORM ADDR
GWLD2 DEC TEMPA WAVE FORM #
BMI GWLD3 FINIS
LDAA ,X
INCA
JSR ADDX
BRA GWLD2
GWLD3 STX GWFRM
JSR WVTRAN XSFER WAVE TO RAM
LDX TEMPX RESTORE INDEX
LDAA 2,X GET PREDECAY
STAA PRDECA
JSR WVDECA DECAY IT
LDX TEMPX
LDAA 3,X GET FREQ INC
STAA GDFINC
LDAA 4,X GET DELTA FREQ COUNT
STAA GDCNT
LDAA 5,X GET PATTERN COUNT
TAB SAVE
LDAA 6,X PATTERN OFFSET
LDX #GFRTAB
JSR ADDX
TBA GET PATTERN LENGTH
STX GWFRQ FREQ TABLE ADDR
CLR FOFSET
JSR ADDX
STX FRQEND
RTS
*
*GWAVE ROUTINE
*ACCA= FREQ PATTERN LENGTH, X= FREQ PAT ADDR
*
GWAVE LDAA GECHO
STAA GECNT
GWT4 LDX GWFRQ
STX XPLAY
GPLAY LDX XPLAY GET NEW PERIOD
LDAA ,X
ADDA FOFSET
STAA GPER
CPX FRQEND
BEQ GEND FINISH ON ZERO
LDAB GCCNT CYCLE COUNT
INX
STX XPLAY
GOUT LDX #GWTAB SETUP WAVEFORM POINTER
GOUTLP LDAA GPER
GPRLP DECA WAIT FOR PERIOD
BNE GPRLP
LDAA ,X OUTPUT SOUND
STAA SOUND
GPR1 INX
CPX WVEND END OF WAVE?
BNE GOUTLP
DECB
BEQ GPLAY
INX
DEX
INX
DEX
INX
DEX
INX
DEX
NOP
NOP
BRA GOUT SYNC 36
GEND LDAA GECDEC
BSR WVDECA
GEND40 DEC GECNT ECHO ON?
BNE GWT4 YES
LDAA B2FLG STOP BONUS
BNE GEND1
GEND50 LDAA GDFINC CONTINUE FOR FREQ MOD SOUNDS
BEQ GEND1 NO
DEC GDCNT DELTA FREQ OVER?
BEQ GEND1 YES...
ADDA FOFSET UPDATE FREQ OFFSET
GEND60 STAA FOFSET
GEND61 LDX GWFRQ GET INDEX
CLRB START FOUND FLAG INIT CLEAR
GW0 LDAA FOFSET INC OR DEC?
TST GDFINC
BMI GW1 DEC
ADDA ,X INC
BCS GW2 CARRY=OVERFLOW
BRA GW2A
GW1 ADDA ,X DEC
BEQ GW2 OVERFLOW ON EQ
BCS GW2A OVERFLOW IF CARRY CLEAR
GW2 TSTB FOUND START YET?
BEQ GW2B NO
BRA GW3 YES, THIS IS THE END
GW2A TSTB
BNE GW2B ALREADY FOUND START
STX GWFRQ FOUND START
INCB
GW2B INX
CPX FRQEND
BNE GW0 NOT OVER YET
TSTB FOUND START?
BNE GW3 YES
RTS ALL OVER
GW3 STX FRQEND
LDAA GECDEC RE:XSFER WAVE?
BEQ GEND0 NO
BSR WVTRAN XSFER WAVE
LDAA PRDECA
BSR WVDECA
GEND0 JMP GWAVE
GEND1 RTS TERMINATE
*
*WAVE TRANSFER ROUTINE
*
WVTRAN LDX #GWTAB
STX XPTR
LDX GWFRM
LDAB ,X GET WAVE LENGTH
INX
JSR TRANS
LDX XPTR
STX WVEND GET END ADDR
RTS
*
*WAVE DECAY ROUTINE/ DECAY AMOUNT IN ACCA(1/16 PER DECAY)
*
WVDECA TSTA
BEQ WVDCX NO DECAY
LDX GWFRM ROM WAVE INDEX
STX XPLAY
LDX #GWTAB
STAA TEMPB DECAY FACTOR
WVDLP STX XPTR
LDX XPLAY
LDAB TEMPB
STAB TEMPA DECAY FACTOR TEMP
LDAB 1,X OFFSET FOR WAVE LENGTH
LSRB
LSRB
LSRB
LSRB CALC 1/16TH
INX
STX XPLAY
LDX XPTR
LDAA ,X
WVDLP1 SBA DECAY
DEC TEMPA
BNE WVDLP1
STAA ,X
INX
CPX WVEND END OF WAVE?
BNE WVDLP NO
WVDCX RTS
*
* INTERRUPT PROCESSING
*
IRQ LDS #ENDRAM RE-INITIALIZE STACK
LDAA SOUND+2 GET INPUT TRIGGER
LDX #DECAYZ RANDY'S BRAIN DAMAGE
STX XDECAY
LDX #FREQ1
STX XPTR
LDAB #$AF
STAB AMP0
CLI NOW ALLOW IRQS
COMA INVERT INPUT
ANDA #$3F MASK GARB
LDAB ORGFLG
BEQ IRQ00
JSR ORGNT1 ORGAN TUNE
IRQ00 CLRB
CMPA #SP1SND
BEQ IRQ00A
STAB SP1FLG
IRQ00A CMPA #B2SND
BEQ IRQ000
STAB B2FLG
IRQ000 TSTA
BEQ IRQ3 INVALID INPUT
DECA REMOVE OFFSET
CMPA #$1F
BLT IRQ001
CMPA #$3D
BGT IRQ00C
CMPA #$2A
BHI IRQ00B
SUBA #$10
BRA IRQ002
IRQ00C SUBA #$39
BRA IRQ21
IRQ00B SUBA #$1C
BRA IRQ2
IRQ001 CMPA #$0C
BHI IRQ10
IRQ002 JSR GWLD GWAVE SOUNDS
JSR GWAVE
BRA IRQ3
IRQ10 CMPA #$1B SPECIAL SOUND?
BHI IRQ20 VARI SOUND
SUBA #$D SUB OFFSET
IRQ2 ASLA DOUBLE FOR ADDRESSING
LDX #JMPTBL INDEX TO JUMP TABLE
BSR ADDX GET CORRECT INDEX
LDX 0,X GET ADDRESS TO INDEX
JSR 0,X PERFORM IT
BRA IRQ3
IRQ20 SUBA #$1C
IRQ21 JSR VARILD
JSR VARI
IRQ3 LDAA BG1FLG BGROUND ACTIVE?
ORAA BG2FLG
BEQ * NOPE
CLRA
STAA B2FLG KILL BONUSES
LDAA BG1FLG
BEQ IRQXX
JMP BG1
IRQXX JMP BG2
*
* ADD A TO INDEX REGISTER
*
ADDX STX XPLAY
ADDA XPLAY+1
STAA XPLAY+1
BCC ADDX1
INC XPLAY
ADDX1 LDX XPLAY
RTS
*
* DIAGNOSTIC PROCESSING HERE
*
NMI SEI
LDS #ENDRAM RESET THE STACK
LDX #$FFFF
CLRB
NMI1 ADCB 0,X
DEX
CPX #$F000
BNE NMI1
CMPB 0,X
BEQ NMI2
WAI
NMI2 JSR HBOMB
LDAA #2
JSR ORGASM
LDAA #1
JSR ORGASM
BRA NMI KEEP LOOPING
*
*SPECIAL ROUTINE JUMP TABLE
*
JMPTBL FDB SP1,BG1,BG2INC,LITE
FDB BON2,BGEND,TURBO,APPEAR
FDB THRUST,CANNON,RADIO,HYPER
FDB SCREAM,ORGANT,ORGANN
*
JMPTB1 FDB SND2,SND5,THNDR,HSTD,ATARI
FDB SIREN,ORRRR,PERK$$,SQRT,START
FDB PLANE,SND16,SND17,LAUNCH,CDR
FDB KNOCK,ZIREN,WHIST,HBOMB
*
*VARI VECTORS
*
VVECT EQU *
SAW FCB $40,$01,$00,$10,$E1,$00,$80,$FF,$FF
FOSHIT FCB $28,$01,$00,$08,$81,$02,$00,$FF,$FF
QUASAR FCB $28,$81,$00,$FC,$01,$02,$00,$FC,$FF
CABSHK FCB $FF,$01,$00,$18,$41,$04,$80,$00,$FF
CSCALE FCB $00,$FF,$08,$FF,$68,$04,$80,$00,$FF
MOSQTO FCB $28,$81,$00,$FC,$01,$02,$00,$FC,$FF
VARBG1 FCB $60,$01,$57,$08,$E1,$02,$00,$FE,$80
*
*RADIO SOUND WAVEFORM
*
RADSND FCB $8C,$5B,$B6,$40,$BF,$49,$A4,$73
FCB $73,$A4,$49,$BF,$40,$B6,$5B,$8C
*
* NOTE DEFINITIONS AND ALL THAT JAZZ
*
AF1 EQU $F847
A1 EQU $F83F
BF1 EQU $F837
B1 EQU $F830
C1 EQU $F829
CS1 EQU $F823
D1 EQU $F81D
EF1 EQU $F817
E1 EQU $F812
F1 EQU $F80D
FS1 EQU $F808
G2 EQU $F804
AF2 EQU $7C47
A2 EQU $7C3F
BF2 EQU $7C37
B2 EQU $7C30
C2 EQU $7C29
CS2 EQU $7C23
D2 EQU $7C1D
EF2 EQU $7C17
E2 EQU $7C12
F2 EQU $7C0D
FS2 EQU $7C08
G3 EQU $7C04
AF3 EQU $3E47
A3 EQU $3E3F
BF3 EQU $3E37
B3 EQU $3E30
C3 EQU $3E29
CS3 EQU $3E23
D3 EQU $3E1D
EF3 EQU $3E17
E3 EQU $3E12
F3 EQU $3E0D
FS3 EQU $3E08
G4 EQU $3E04
AF4 EQU $1F47
A4 EQU $1F3F
BF4 EQU $1F37
B4 EQU $1F30
C4 EQU $1F29
CS4 EQU $1F23
D4 EQU $1F1D
EF4 EQU $1F17
E4 EQU $1F12
F4 EQU $1F0D
FS4 EQU $1F08
RS EQU $0004
TR EQU TG
*
*ORGAN TUNE TABLE
*OSCILLATOR MASK(1),DELAY(1),DURATION(2)
*
ORGTAB EQU *
FCB NINTH-FIFTH-1
FIFTH EQU *
FDB G2,TG/FIF/4
FDB RS,TR/FIF/4
FDB G2,TG/FIF/4
FDB RS,TR/FIF/4
FDB G2,TG/FIF/4
FDB RS,TR/FIF/4
FDB EF1,TEF/FIF/2*7
FCB TUNEND-NINTH
NINTH EQU *
FDB D4,TD/NIN/4
FDB RS,TR/NIN/4
FDB D3,TD/NIN/4
FDB RS,TR/NIN/4*5
FDB A3,TA/NIN/4
FDB RS,TR/NIN/4
FDB A2,TA/NIN/4
FDB RS,TR/NIN/4*5
FDB D2,TD/NIN/4
FDB RS,TR/NIN/4
FDB D1,TD/NIN/4
FDB RS,TR/NIN/4
FDB A2,TA/NIN/4
FDB RS,TR/NIN/4
FDB A1,TA/NIN/4
FDB RS,TR/NIN/4*7
FDB A2,TA/NIN/4
FDB D2,TD/NIN/4
FDB E2,TE/NIN/4
FDB F2,TF/NIN/4
FDB E2,TE/NIN/4
FDB F2,TF/NIN/4
FDB G3,TG/NIN/4
FDB F2,TF/NIN/4
FDB E2,TE/NIN/4
FDB D2,TD/NIN/4
FDB BF3,TBF/NIN/4
FDB A3,TA/NIN/4
FDB G3,TG/NIN/4
FDB F2,TF/NIN/4
FDB E2,TE/NIN/4
FDB D2,TD/NIN/4
FDB CS2,TCS/NIN/4
FDB D2,TD/NIN/4
FDB E2,TE/NIN/4
FDB D3,TD/NIN/4
FDB RS,TR/NIN/4
FDB D2,TD/NIN/4
FDB RS,TR/NIN/4
FDB A3,TA/NIN/4
FDB RS,TR/NIN/4
FDB A2,TA/NIN/4
FDB RS,TR/NIN/4*5
FDB D1,TD/NIN/2*5
TUNEND FCB 0 LAST TUNE
*
*ORGAN NOTE TABLE
*SCALE AF A BF B C CS
NOTTAB FCB $47,$3F,$37,$30,$29,$23
* D EF E F FS G
FCB $1D,$17,$12,$0D,$08,$04
*
*WAVE TABLE
*1ST BYTE= WAVELENGTH
*
GWVTAB EQU *
GS2 FCB 8,127,217,255,217,127,36,0,36
GSSQ2 FCB 8,0,64,128,0,255,0,128,64
GS1 FCB 16,127,176,217,245,255,245,217,176
FCB 127,78,36,9,0,9,36,78
GS12 FCB 16,127,197,236,231,191,141,109,106
FCB 127,148,146,113,64,23,18,57
GSQ22 FCB 16,$FF,$FF,$FF,$FF,0,0,0,0
FCB $FF,$FF,$FF,$FF,0,0,0,0
GS72 FCB 72,138,149,160,171,181,191,200,209
FCB 218,225,232,238,243,247,251,253,254,255
FCB 254,253,251,247,243,238,232,225,218
FCB 209,200,191,181,171,160,149,138,127
FCB 117,106,95,84,74,64,55,46,37,30,23,17,12
FCB 8,4,2,1,0
FCB 1,2,4,8,12,17,23,30,37,46,55,64,74,84
FCB 95,106,117,127
GS1.7 FCB 16,89,123,152,172,179,172,152,123
FCB 89,55,25,6,0,6,25,55
*****************************************************
GSQ2 FCB 8,$FF,$FF,$FF,$FF,$00,$00,$00,$00
GS1234 FCB 16,118,255,184,208,157,230,106,130
FCB 118,234,129,134,78,156,50,99
MW1 FCB 16,0,$F4,0,$E8,0,$DC,0,$E2
FCB 0,$DC,0,$E8,0,$F4,0,0
HBPAT2 FCB 72,69,75,80,86,91,96,100,105
FCB 109,113,116,119,122,124,126,127,127,128
FCB 127,127,126,124,122,119,116,113,109
FCB 105,100,96,91,86,80,75,69,64
FCB 59,53,48,42,37,32,28,23,19,15,12,9,6
FCB 4,2,1,1,0
FCB 1,1,2,4,6,9,12,15,19,23,28,32,37,42
FCB 48,53,59,64
*
*GWAVE SOUND VECTOR TABLE
*VECTOR FORMAT
*BYTE 0: GECHO,GCCNT
*BYTE 1: GECDEC,WAVE#
*BYTE 2: PREDECAY FACTOR
*BYTE 3: GDFINC
*BYTE 4: VARIABLE FREQ COUNT
*BYTE 5: FREQ PATTERN LENGTH
*BYTE 6: FREQ PATTERN OFFSET
*
SVTAB EQU *
HBDV FCB $81,$24,0,0,0,22,HBDSND-GFRTAB 1
STDV FCB $12,$05,$1A,$FF,0,39,STDSND-GFRTAB 2
DP1V FCB $11,$05,$11,1,15,1,SWPAT-GFRTAB 3
XBV FCB $11,$31,0,1,0,13,SPNSND-GFRTAB 4
BBSV FCB $F4,$12,$0,0,0,20,BBSND-GFRTAB 5
HBEV FCB $41,$45,0,0,0,15,HBESND-GFRTAB 6
PROTV FCB $21,$35,$11,$FF,0,13,SPNSND-GFRTAB 7
SPNRV FCB $15,$00,0,$FD,0,1,SPNR-GFRTAB 8
CLDWNV FCB $31,$11,0,1,0,3,COOLDN-GFRTAB 9
SV3 FCB $01,$15,1,1,1,1,BBSND-GFRTAB 10
ED10 FCB $F6,$53,3,0,2,6,ED10FP-GFRTAB 11
ED12 FCB $6A,$10,2,0,2,6,ED13FP-GFRTAB 12
ED17 FCB $1F,$12,0,$FF,$10,4,SPNR-GFRTAB 13
BONV FCB $31,$11,0,$FF,0,13,BONSND-GFRTAB
TRBV FCB $12,$06,$0,$FF,1,9,TRBPAT-GFRTAB
****************************************************
HUNV FCB $14,$17,$00,$00,$00,14,HBTSND-GFRTAB
SPD FCB $F4,$11,$00,$00,$00,14,HBTSND-GFRTAB
SPNV FCB $21,$30,$00,$01,$00,13,SPNSND-GFRTAB
STRT FCB $13,$10,$00,$FF,$00,09,YUKSND-GFRTAB
SP1V FCB $F4,$18,$00,$00,$00,18,SP2SND-GFRTAB
SSPV FCB $82,$22,$00,$00,$00,24,SSPSND-GFRTAB
BMPV FCB $F2,$19,$00,$00,$00,22,BWSSND-GFRTAB
WIRDV FCB $21,$30,$00,$FF,$00,27,$0D
GDYUKV FCB $F1,$19,$00,$00,$00,14,YUKSND-GFRTAB
BK8 FCB $31,$19,$00,$01,$00,03,COOLDN-GFRTAB
SF10 FCB $41,$02,$D0,$00,$00,39,STDSND-GFRTAB
BIL30 FCB $03,$15,$11,$FF,$00,13,SPNSND-GFRTAB
*GWAVE FREQ PATTERN TABLE
*
GFRTAB EQU *
*BONUS SOUND
BONSND FCB $A0,$98,$90,$88,$80,$78,$70,$68
FCB $60,$58,$50,$44,$40
*HUNDRED POINT SOUND
HBTSND FCB 1,1,2,2,4,4,8,8,$10,$10,$30,$60,$C0,$E0
*SPINNER SOUND
SPNSND FCB 1,1,2,2,3,4,5,6,7,8,9,$A,$C
*TURBINE START UP
TRBPAT FCB $80,$7C,$78,$74,$70,$74,$78,$7C,$80
*HEARTBEAT DISTORTO
HBDSND FCB 1,1,2,2,4,4,8,8,$10,$20,$28
FCB $30,$38,$40,$48,$50,$60,$70,$80,$A0,$B0,$C0
*SWEEP PATTERN
SWPAT EQU *
*BIGBEN SOUNDS
BBSND FCB 8,64,8,64,8,64,8,64,8,64
FCB 8,64,8,64,8,64,8,64,8,64
*HEARTBEAT ECHO
HBESND FCB 1,2,4,8,9,$A,$B,$C,$E,$F,$10
FCB $12,$14,$16
*SPINNER SOUND "DRIP"
SPNR FCB $40
*COOL DOWNER
COOLDN FCB $10,8,1
*START DISTORTO SOUND
STDSND FCB 1,1,1,1,2,2,3,3,4,4,5,6,8,$A,$C,$10
FCB $14,$18,$20,$30,$40,$50,$40,$30
FCB $20,$10,$C,$A,8,7,6,5,4,3,2,2,1,1,1
*ED'S SOUND 10
ED10FP FCB 7,8,9,$A,$C,8
*ED'S SOUND 13
ED13FP FCB $17,$18,$19,$1A,$1B,$1C
FCB 0,0,0,0 FILLER
****************************************************
YUKSND FCB $8,$80,$10,$78,$18,$70,$20,$60,$28,$58,$30
FCB $50,$40,$48,$00
SP2SND FCB $01,$08,$10,$01,$08,$10,$01,$08,$10
FCB $01,$08,$10,$01,$08,$10,$01,$08,$10,$00
SSPSND FCB $10,$20,$40,$10,$20,$40,$10,$20,$40,$10,$20,$40
FCB $10,$20,$40,$10,$20,$40,$10,$20,$40,$10,$20,$40,$00
BWSSND FCB $01,$40,$02,$42,$3,$43,$4,$44,$5,$45,$6,$46,$7,$47
FCB $8,$48,$9,$49,$A,$4A,$B,$4B,$00
*
* VECTORS HERE
*
ORG VECTOR
IRQV FDB IRQ
SWIV FDB SETUP
NMIV FDB NMI
RESETV FDB SETUP
END CKSUM