bang
[williams-soundroms.git] / VSNDRM2.SRC
1         NOGEN
2         NAM     STARGATE SOUNDS REV. 1.0 Y PHRED 9/81 
3 *COPYRIGHT WILLIAMS ELECTRONICS INC. 1981
4 *PROGRAMMER: PHRED JARVIS, PSAM DICKER
5 *
6 *SYSTEM CONSTANTS
7 *
8 ROM     EQU     $F800
9 SOUND   EQU     $400
10 CKORG   EQU     $F700   CHECKSUM PROG ORG
11 ENDRAM  EQU     $7F
12 VECTOR  EQU     $FFF8   RESET,INT VECTORS
13 WVELEN  EQU     72
14 BG2MAX  EQU     29      
15 SP1SND  EQU     $0E     SPINNER SOUND #1 CODE
16 B2SND   EQU     $12     BONUS SOUND #2 CODE
17 SP1MAX  EQU     32
18 NIN     EQU     5
19 FIF     EQU     6
20 TAF     EQU     34715!>1        NOTE TIMES
21 TA      EQU     36780!>1
22 TBF     EQU     38967!>1
23 TB      EQU     41284!>1
24 TC      EQU     43739!>1
25 TCS     EQU     46340!>1
26 TD      EQU     49096!>1
27 TEF     EQU     52015!>1
28 TE      EQU     55108!>1
29 TF      EQU     58385!>1
30 TFS     EQU     61857!>1
31 TG      EQU     65535!>1
32 *
33 * TALKING EQUATES
34 *
35 TALK    EQU     $EFFD   ENTRY TO TALKING
36 TALKD   EQU     $EFFA   ENTRY FOR DIAGNOSTICS
37 *
38 * SCREAM EQUATES
39 *
40 ECHOS   EQU     4
41 FREQ    EQU     0               
42 TIMER   EQU     1
43 *
44 *GLOBALS
45 *
46         ORG     0
47 TLKGL   RMB     4       TALKING GLOBALS
48 BG1FLG  RMB     1       BACKGROUND SOUND 1
49 BG2FLG  RMB     1       BACKGROUND SOUND 2
50 SP1FLG  RMB     1       SPINNER FLAG
51 B2FLG   RMB     1       BONUS #2 FLAG
52 ORGFLG  RMB     1       ORGAN FLAG
53 HI      RMB     1       RANDOM SEED
54 LO      RMB     1       RANDOM SEED
55 *
56 *TEMPORARIES
57 *
58 TMPRAM  EQU     *       TEMPORARY RAM
59 TEMPX   RMB     2       X TEMPS
60 XPLAY   RMB     2
61 XPTR    RMB     2
62 TEMPA   RMB     1       ACCA TEMP
63 TEMPB   RMB     1
64 LOCRAM  EQU     *
65 *
66 *GWAVE PARAMETERS
67 *
68         ORG     LOCRAM
69 GECHO   RMB     1       ECHO FLAG
70 GCCNT   RMB     1       CYCLE COUNT
71 GECDEC  RMB     1       # OF DECAYS PER ECHO
72 GDFINC  RMB     1       DELTA FREQ INC
73 GDCNT   RMB     1       DELTA FREQ COUNT
74 GWFRM   RMB     2       WAVEFORM ADDRESS
75 *TEMPORARY OR COMPUTED PARAMETERS
76 PRDECA  RMB     1       PRE-DECAY FACTOR
77 GWFRQ   RMB     2       FREQ TABLE ADDR
78 FRQEND  RMB     2       END ADDR FREQ TABLE
79 WVEND   RMB     2       WAVE END ADDR
80 GPER    RMB     1       PERIOD
81 GECNT   RMB     1       # OF ECHOES COUNTER
82 FOFSET  RMB     1       FREQUENCY OFFSET
83 *
84 *GWAVE TABLES
85 *
86 GWTAB   RMB     WVELEN  WAVE TABLE
87 *
88 *VARIWAVE PARAMETERS
89 *
90         ORG     LOCRAM
91 LOPER   RMB     1       LO PERIOD
92 HIPER   RMB     1       HIPERIOD
93 LODT    RMB     1       PERIOD DELTAS
94 HIDT    RMB     1
95 HIEN    RMB     1       END PERIOD
96 SWPDT   RMB     2       SWEEP PERIOD
97 LOMOD   RMB     1       BASE FREQ MOD
98 VAMP    RMB     1       AMPLITUDE
99 LOCNT   RMB     1       PERIOD COUNTERS
100 HICNT   RMB     1
101 *
102 *NOISE ROUTINE PARAMETERS
103 *
104         ORG     LOCRAM
105 DECAY   RMB     1
106 NAMP    RMB     1
107 CYCNT   RMB     1
108 NFRQ1   RMB     2
109 NFFLG   RMB     1
110 LFREQ   RMB     1
111 DFREQ   RMB     1
112 *
113 *FILTERED NOISE ROUTINE PARAMETERS
114 *
115         ORG     LOCRAM
116 FMAX    RMB     1       MAXIMUM_FREQUENCY
117 FHI     RMB     1       FREQUENCY
118 FLO     RMB     1 
119 SAMPC   RMB     2       SAMPLE COUNT
120 FDFLG   RMB     1       FREQUENCY DECREMENT FLAG
121 DSFLG   RMB     1       DISTORTION FLAG
122 *
123 *SCREAM TABLES
124 *
125         ORG     LOCRAM
126 STABLE  RMB     2*ECHOS SCREAM TABLE
127 SRMEND  EQU     *
128 *
129 *ORGAN PARAMETERS
130 *
131         ORG     LOCRAM
132 DUR     RMB     2       NOTE DURATION
133 OSCIL   RMB     1       OSCILLATORS
134 RDELAY  RMB     60      RAM DELAY LOAD
135 *
136 * CHECKSUM CALCULATOR & RELOCATOR
137 *
138         ORG     CKORG
139 CKSUM   LDX     #$FFFF  INDEX TO END OF ROM
140         CLRB            ZERO CHECKSUM
141 CKSUM1  ADCB    0,X     ADD IN PROGRAM BYTE
142         DEX             TO NEXT BYTE
143         CPX     #$F800  DONE YET?
144         BNE     CKSUM1  NOPE...
145         STAB    0,X     SAVE CHECKSUM AT BEGINNING
146         WAI             TURN OFF LEDS
147 FROM    RMB     2       FOR POINTER
148 TO      RMB     2       FOR POINTER
149 *
150 * MAIN PROGRAM
151 *
152         ORG     ROM
153         FCB     $DF     CHECKSUM BYTE
154 SETUP   SEI             SET INTERRUPT MASK
155         LDS     #ENDRAM INITIALIZE STACK POINTER
156         LDX     #SOUND  INDEX TO PIA
157         CLR     1,X     ACCESS DDRA
158         CLR     3,X     ACCESS DDRB
159         LDAA    #$FF    PA0-PA7
160         STAA    0,X     SET SIDE A AS OUTPUTS
161         CLR     2,X     SET B SIDE AS INPUTS
162         LDAA    #$37    CB2 LOW, IRQ ALLOWED
163         STAA    3,X     PROGRAM B CONTROL REG
164         LDAA    #$3C    CA2 SET INIT HIGH, NO IRQS
165         STAA    1,X     PROGRAM A SIDE
166         STAA    HI      START RANDOM GENERATOR
167         CLRA
168         STAA    B2FLG
169         STAA    BG1FLG
170         STAA    BG2FLG
171         STAA    SP1FLG
172         STAA    ORGFLG
173         CLI             CLEAR INTERRUPTS
174         BRA     *       WAIT FOR INTERRUPT
175 *
176 *VARI LOADER
177 *
178 VARILD  TAB
179         ASLA            X2
180         ASLA            X4
181         ASLA            X8
182         ABA             X9
183         LDX     #LOCRAM
184         STX     XPTR    SET XSFER
185         LDX     #VVECT
186         JSR     ADDX
187         LDAB    #9      GET COUNT
188 VTRAN   JMP     TRANS
189 *
190 *VARIABLE DUTY CYCLE SQUARE WAVE ROUTINE
191 *
192 VARI    LDAA    VAMP
193         STAA    SOUND
194 VAR0    LDAA    LOPER
195         STAA    LOCNT
196         LDAA    HIPER
197         STAA    HICNT
198 V0      LDX     SWPDT
199 V0LP    LDAA    LOCNT   LO CYCLE
200         COM     SOUND
201 V1      DEX
202         BEQ     VSWEEP
203         DECA
204         BNE     V1
205         COM     SOUND
206         LDAA    HICNT   HI CYCLE
207 V2      DEX
208         BEQ     VSWEEP
209         DECA
210         BNE     V2
211         BRA     V0LP    LOOP BACK
212 VSWEEP  LDAA    SOUND
213         BMI     VS1
214         COMA
215 VS1     ADDA    #0
216         STAA    SOUND   OUTPUT
217         LDAA    LOCNT
218         ADDA    LODT
219         STAA    LOCNT
220         LDAA    HICNT
221         ADDA    HIDT
222         STAA    HICNT
223         CMPA    HIEN
224         BNE     V0
225         LDAA    LOMOD
226         BEQ     VARX
227         ADDA    LOPER
228         STAA    LOPER
229         BNE     VAR0
230 VARX    RTS
231 *
232 *LIGHTNING
233 *
234 LITE    LDAA    #1
235         STAA    DFREQ
236         LDAB    #3
237         BRA     LITEN
238 *
239 *APPEAR
240 *
241 APPEAR  LDAA    #$FE
242         STAA    DFREQ
243         LDAA    #$C0
244         LDAB    #$10
245         BRA     LITEN
246 *
247 *LIGHTNING+APPEAR NOISE ROUTINE
248 *
249 LITEN   STAA    LFREQ
250         LDAA    #$FF    HIGHEST AMP
251         STAA    SOUND
252         STAB    CYCNT
253 LITE0   LDAB    CYCNT
254 LITE1   LDAA    LO      GET RANDOM
255         LSRA
256         LSRA
257         LSRA
258         EORA    LO
259         LSRA
260         ROR     HI
261         ROR     LO
262         BCC     LITE2
263         COM     SOUND
264 LITE2   LDAA    LFREQ   COUNT FREQ
265 LITE3   DECA
266         BNE     LITE3
267         DECB            COUNT CYCLES
268         BNE     LITE1
269         LDAA    LFREQ
270         ADDA    DFREQ
271         STAA    LFREQ
272         BNE     LITE0
273         RTS
274 *
275 *TURBO
276 *
277 TURBO   LDAA    #$20
278         STAA    CYCNT
279         STAA    NFFLG
280         LDAA    #$1
281         LDX     #1
282         LDAB    #$FF
283         BRA     NOISE
284 *
285 *WHITE NOISE ROUTINE
286 *X=INIT PERIOD, ACCB=INIT AMP, ACCA DECAY RATE
287 *CYCNT=CYCLE COUNT, NFFLG= FREQ DECAY FLAG
288 *
289 NOISE   STAA    DECAY
290 NOISE0  STX     NFRQ1
291 NOIS00  STAB    NAMP
292         LDAB    CYCNT
293 NOISE1  LDAA    LO      GET RANDOM BIT
294         LSRA
295         LSRA
296         LSRA
297         EORA    LO
298         LSRA
299         ROR     HI
300         ROR     LO
301         LDAA    #$0
302         BCC     NOISE2
303         LDAA    NAMP
304 NOISE2  STAA    SOUND
305         LDX     NFRQ1   INCREASING DELAY
306 NOISE3  DEX
307         BNE     NOISE3
308         DECB            FINISH CYCLE COUNT?
309         BNE     NOISE1  NO
310         LDAB    NAMP    DECAY AMP
311         SUBB    DECAY
312         BEQ     NSEND
313         LDX     NFRQ1   INC FREQ
314         INX
315         LDAA    NFFLG   DECAY FREQ?
316         BEQ     NOIS00  NO
317         BRA     NOISE0
318 NSEND   RTS             
319 *
320 *BACKGROUND 1 ROUTINE
321 *
322 BG1     LDAB    #1
323         STAB    BG1FLG  
324         CLRA
325         STAA    DSFLG
326         BRA     FNOISE
327 *
328 *THRUST
329 *
330 THRUST  CLRA    
331         STAA    DSFLG
332         LDAB    #3
333         BRA     FNOISE  
334 *
335 *CANNON
336 *
337 CANNON  LDAA    #1      
338         STAA    DSFLG
339         LDX     #1000   
340         LDAA    #1      
341         LDAB    #$FF    
342         BRA     FNOISE 
343 *
344 *FILTERED NOISE ROUTINE
345 *X=SAMPLE COUNT, ACCB=INITIAL MAX FREQ
346 *ACCA=FREQ DECAY FLAG ,DSFLG=DISTORTION FLAG
347 *
348 FNOISE  STAA    FDFLG
349         STAB    FMAX
350         STX     SAMPC
351         CLR     FLO
352 FNOIS0  LDX     SAMPC
353         LDAA    SOUND
354 FNOIS1  TAB             NEXT RANDOM NUMBER
355         LSRB
356         LSRB
357         LSRB
358         EORB    LO
359         LSRB
360         ROR     HI
361         ROR     LO
362         LDAB    FMAX    SET FREQ
363         TST     DSFLG
364         BEQ     FNOIS2
365         ANDB    HI      DISTORT FREQUENCY
366 FNOIS2  STAB    FHI
367         LDAB    FLO
368         CMPA    LO
369         BHI     FNOIS4
370 FNOIS3  DEX             SLOPE UP
371         BEQ     FNOIS6
372         STAA    SOUND
373         ADDB    FLO
374         ADCA    FHI
375         BCS     FNOIS5
376         CMPA    LO
377         BLS     FNOIS3
378         BRA     FNOIS5
379 FNOIS4  DEX             SLOPE DOWN
380         BEQ     FNOIS6
381         STAA    SOUND
382         SUBB    FLO
383         SBCA    FHI
384         BCS     FNOIS5
385         CMPA    LO
386         BHI     FNOIS4
387 FNOIS5  LDAA    LO
388         STAA    SOUND
389         BRA     FNOIS1
390 FNOIS6  LDAB    FDFLG
391         BEQ     FNOIS1
392         LDAA    FMAX    DECAY MAX FREQ
393         LDAB    FLO
394         LSRA
395         RORB
396         LSRA
397         RORB
398         LSRA
399         RORB
400         COMA
401         NEGB
402         SBCA    #-1
403         ADDB    FLO
404         ADCA    FMAX
405         STAB    FLO
406         STAA    FMAX
407         BNE     FNOIS0
408         CMPB    #7
409         BNE     FNOIS0
410         RTS
411 *
412 *RADIO
413 *
414 RADIO   LDAA    #RADSND/$100 SOUND TABLE
415         STAA    XPTR
416         LDX     #100    STARTING FREQ
417         STX     TEMPX
418 RADIO1  ADDB    TEMPX+1 ADD FREQ TO TIMER
419         LDAA    TEMPA
420         ADCA    TEMPX
421         STAA    TEMPA
422         LDX     TEMPX
423         BCS     RADIO2  
424         BRA     *+2     EQUALIZE TIME
425         BRA     RADIO3
426 RADIO2  INX             CARRY?, RAISE FREQ
427         BEQ     RADIO4  DONE?
428 RADIO3  STX     TEMPX
429         ANDA    #$F     SET POINTER
430         ADDA    #RADSND!.$FF
431         STAA    XPTR+1
432         LDX     XPTR
433         LDAA    ,X
434         STAA    SOUND   PLAY SOUND
435         BRA     RADIO1
436 RADIO4  RTS     
437 *
438 *HYPER
439 *
440 HYPER   CLRA
441         STAA    SOUND   
442         STAA    TEMPA   ZERO PHASE
443 HYPER1  CLRA            ZERO TIME COUNTER
444 HYPER2  CMPA    TEMPA   
445         BNE     HYPER3
446         COM     SOUND   PHASE EDGE?, COMPLEMENT SOUND
447 HYPER3  LDAB    #18     DELAY
448 HYPER4  DECB
449         BNE     HYPER4
450         INCA            ADVANCE TIME COUNTER
451         BPL     HYPER2  
452         COM     SOUND   CYCLE DONE?, CYCLE EDGE
453         INC     TEMPA   NEXT PHASE
454         BPL     HYPER1  DONE?
455         RTS
456 *
457 *SCREAM
458 *
459 SCREAM  LDX     #STABLE ZERO FREQS AND TIMES
460 SCREM1  CLR     ,X
461         INX
462         CPX     #SRMEND
463         BNE     SCREM1
464         LDAA    #$40    START FIRST ECHO
465         STAA    STABLE+FREQ
466 SCREM2  LDX     #STABLE INITIALIZE COUNTER
467         LDAA    #$80    INITIALIZE AMPLITUDE
468         STAA    TEMPA
469         CLRB            ZERO OUTPUT BUFFER
470 SCREM3  LDAA    TIMER,X ADD FREQ TO TIMER
471         ADDA    FREQ,X
472         STAA    TIMER,X
473         BPL     SCREM4  ADD AMPLITUDE IF MINUS
474         ADDB    TEMPA
475 SCREM4  LSR     TEMPA   DECAY AMPLITUDE
476         INX             NEXT ECHO
477         INX
478         CPX     #SRMEND LAST ECHO?
479         BNE     SCREM3  
480         STAB    SOUND   OUTPUT SOUND
481         INC     TEMPB   ADVANCE TIMER
482         BNE     SCREM2  
483         LDX     #STABLE LOWER NON-ZERO FREQUENCIES
484         CLRB            ALL ZERO NOT FLAG
485 SCREM5  LDAA    FREQ,X  
486         BEQ     SCREM7  
487         CMPA    #$37    
488         BNE     SCREM6
489         LDAB    #$41    START NEXT ECHO
490         STAB    FREQ+2,X
491 SCREM6  DEC     FREQ,X
492         INCB            SET FLAG
493 SCREM7  INX 
494         INX
495         CPX     #SRMEND
496         BNE     SCREM5
497         TSTB            DONE?
498         BNE     SCREM2
499         RTS
500 *
501 *ORGAN TUNE
502 *
503 ORGANT  DEC     ORGFLG  MINUS ORGAN FLAG
504         RTS             
505 ORGNT1  BSR     ORGASM
506         JMP     IRQ3
507 ORGASM  CLR     ORGFLG
508         STAA    TEMPA   TUNE NUMBER
509         LDX     #ORGTAB 
510 ORGNT2  LDAA    ,X      TUNE TABLE LENGTH
511         BEQ     ORGNT5  INVALID TUNE
512         DEC     TEMPA
513         BEQ     ORGNT3  
514         INCA
515         JSR     ADDX
516         BRA     ORGNT2
517 ORGNT3  INX
518         STX     XPTR    NOTE POINTER
519         JSR     ADDX
520         STX     XPLAY   TUNE END
521         LDX     XPTR    
522 ORGNT4  LDAA    ,X      TUNE LOOP 
523         STAA    OSCIL
524         LDAA    1,X
525         LDX     2,X
526         STX     DUR     
527         BSR     ORGANL
528         LDX     XPTR
529         INX
530         INX     
531         INX
532         INX
533         STX     XPTR
534         CPX     XPLAY
535         BNE     ORGNT4  
536 ORGNT5  RTS             
537 *
538 *ORGAN NOTE
539 *4 BYTES(MODE,OSCILLATOR MASK HI+1,LO+1,NOTE#)
540 ORGANN  RTS                                     
541 *
542 *ORGAN LOADER
543 *OSCIL=OSCILLATOR MASK, ACCA=DELAY, DUR=DURATION
544 *
545 ORGANL  LDX     #RDELAY
546         SUBA    #2
547 LDLP    BLS     LD1
548         CMPA    #3
549         BEQ     LD2
550         LDAB    #1      NOP
551         STAB    ,X
552         INX
553         SUBA    #2
554         BRA     LDLP
555 LD2     LDAB    #$91    CMPA 0
556         STAB    ,X
557         CLR     1,X
558         INX
559         INX
560 LD1     LDAB    #$7E    JMP START2
561         STAB    ,X
562         LDAB    #ORGAN1!>8 MSB
563         STAB    1,X
564         LDAB    #ORGAN1!.$FF LSB
565         STAB    2,X
566 *
567 *ORGAN ROUTINE
568 *DUR=DURATION, OSCILLATOR MASK
569 *
570 ORGAN   LDX     DUR
571 ORGAN1  CLRA            
572         FCB     $F6     LOAD B EXTND TEMPB
573         FDB     TEMPB   
574         INCB            
575         STAB    TEMPB   
576         ANDB    OSCIL   MASK OSCILLATORS
577         LSRB
578         ADCA    #0
579         LSRB
580         ADCA    #0
581         LSRB
582         ADCA    #0
583         LSRB
584         ADCA    #0
585         LSRB
586         ADCA    #0      
587         LSRB
588         ADCA    #0
589         LSRB
590         ADCA    #0      
591         ABA             
592         ASLA
593         ASLA
594         ASLA
595         ASLA            
596         ASLA
597         STAA    SOUND   
598         DEX             
599         BEQ     ORGAN2  NOTE OVER?
600         JMP     RDELAY  
601 ORGAN2  RTS
602 *
603 *PARAMETER TRANSFER
604 *
605 TRANS   PSHA
606 TRANS1  LDAA    0,X
607         STX     XPLAY
608         LDX     XPTR
609         STAA    0,X
610         INX
611         STX     XPTR
612         LDX     XPLAY
613         INX
614         DECB
615         BNE     TRANS1
616         PULA
617         RTS
618 *
619 *BACKGROUND END ROUTINE
620 *
621 BGEND   CLRA 
622         STAA    BG1FLG  
623         STAA    BG2FLG  
624         RTS
625 *
626 *BACKGROUND SOUND #2 INCREMENT
627 *
628 BG2INC  CLR     BG1FLG  KILL BG1
629         LDAA    BG2FLG  ACTIVATE BG2
630         ANDA    #$7F    REMOVE OVERRIDE
631         CMPA    #BG2MAX
632         BNE     BG2I0
633         CLRA
634 BG2I0   INCA
635         STAA    BG2FLG
636         RTS
637 *
638 *BACKGROUND 2 ROUTINE
639 *
640 BG2     LDAA    #(TRBV-SVTAB)/7 GET SOUND#
641         JSR     GWLD
642         LDAA    BG2FLG
643         ASLA
644         ASLA
645         COMA
646         JSR     GEND60
647 BG2LP   INC     GDCNT
648         JSR     GEND61
649         BRA     BG2LP
650 *
651 *SPINNER #1 SOUND
652 *
653 SP1     LDAA    #(CABSHK-VVECT)/9
654         JSR     VARILD
655         LDAB    SP1FLG
656         CMPB    #SP1MAX-1
657         BNE     SP1A
658         CLRB
659 SP1A    INCB
660         STAB    SP1FLG
661         LDAA    #SP1MAX
662         SBA
663         CLRB
664 SP11    CMPA    #20
665         BLS     SP12
666         ADDB    #14
667         DECA
668         BRA     SP11
669 SP12    ADDB    #5
670         DECA
671         BNE     SP12
672         STAB    LOPER
673 SP1LP   JSR     VARI    DO IT
674         BRA     SP1LP
675 *
676 *LASER BALL BONUS #2
677 *
678 BON2    LDAA    B2FLG
679         BNE     BON21
680         INC     B2FLG
681         LDAA    #(BONV-SVTAB)/7
682         BSR     GWLD
683         BRA     GWAVE
684 BON21   JMP     GEND50
685 *
686 *GWAVE LOADER
687 *
688 GWLD    TAB             MULKT BY 7
689         ASLB
690         ABA
691         ABA
692         ABA
693         LDX     #SVTAB  SOUND VECTOR TABLE
694         JSR     ADDX
695         LDAA    ,X
696         TAB
697         ANDA    #$F
698         STAA    GCCNT   GET CYCLE COUNT
699         LSRB
700         LSRB
701         LSRB
702         LSRB
703         STAB    GECHO   GET #ECHOS
704         LDAA    1,X
705         TAB
706         LSRB
707         LSRB
708         LSRB
709         LSRB
710         STAB    GECDEC
711         ANDA    #$F     WAVE #
712         STAA    TEMPA   SAVE
713         STX     TEMPX   SAVE INDEX
714         LDX     #GWVTAB CALC WAVEFORM ADDR
715 GWLD2   DEC     TEMPA   WAVE FORM #
716         BMI     GWLD3   FINIS
717         LDAA    ,X
718         INCA
719         JSR     ADDX
720         BRA     GWLD2
721 GWLD3   STX     GWFRM
722         JSR     WVTRAN  XSFER WAVE TO RAM
723         LDX     TEMPX   RESTORE INDEX
724         LDAA    2,X     GET PREDECAY
725         STAA    PRDECA
726         JSR     WVDECA  DECAY IT
727         LDX     TEMPX
728         LDAA    3,X     GET FREQ INC
729         STAA    GDFINC
730         LDAA    4,X     GET DELTA FREQ COUNT
731         STAA    GDCNT
732         LDAA    5,X     GET PATTERN COUNT
733         TAB             SAVE
734         LDAA    6,X     PATTERN OFFSET
735         LDX     #GFRTAB
736         JSR     ADDX
737         TBA             GET PATTERN LENGTH
738         STX     GWFRQ   FREQ TABLE ADDR
739         CLR     FOFSET
740         JSR     ADDX
741         STX     FRQEND
742         RTS
743 *
744 *GWAVE ROUTINE
745 *ACCA= FREQ PATTERN LENGTH, X= FREQ PAT ADDR
746 *
747 GWAVE   LDAA    GECHO
748         STAA    GECNT
749 GWT4    LDX     GWFRQ
750         STX     XPLAY
751 GPLAY   LDX     XPLAY   GET NEW PERIOD
752         LDAA    ,X
753         ADDA    FOFSET
754         STAA    GPER
755         CPX     FRQEND
756         BEQ     GEND    FINISH ON ZERO
757         LDAB    GCCNT   CYCLE COUNT
758         INX
759         STX     XPLAY
760 GOUT    LDX     #GWTAB  SETUP WAVEFORM POINTER
761 GOUTLP  LDAA    GPER
762 GPRLP   DECA            WAIT FOR PERIOD
763         BNE     GPRLP
764         LDAA    ,X      OUTPUT SOUND
765         STAA    SOUND
766 GPR1    INX
767         CPX     WVEND   END OF WAVE?
768         BNE     GOUTLP
769         DECB
770         BEQ     GPLAY
771         INX
772         DEX
773         INX
774         DEX
775         INX
776         DEX
777         INX
778         DEX
779         NOP
780         NOP
781         BRA     GOUT    SYNC 36
782 GEND    LDAA    GECDEC
783         BSR     WVDECA
784 GEND40  DEC     GECNT   ECHO ON?
785         BNE     GWT4    YES
786         LDAA    B2FLG   STOP BONUS
787         BNE     GEND1
788 GEND50  LDAA    GDFINC  CONTINUE FOR FREQ MOD SOUNDS
789         BEQ     GEND1   NO
790         DEC     GDCNT   DELTA FREQ OVER?
791         BEQ     GEND1   YES...
792         ADDA    FOFSET  UPDATE FREQ OFFSET
793 GEND60  STAA    FOFSET
794 GEND61  LDX     GWFRQ   GET INDEX
795         CLRB            START FOUND FLAG INIT CLEAR
796 GW0     LDAA    FOFSET  INC OR DEC?
797         TST     GDFINC
798         BMI     GW1     DEC
799         ADDA    ,X      INC
800         BCS     GW2     CARRY=OVERFLOW
801         BRA     GW2A
802 GW1     ADDA    ,X      DEC
803         BEQ     GW2     OVERFLOW ON EQ
804         BCS     GW2A    OVERFLOW IF CARRY CLEAR
805 GW2     TSTB            FOUND START YET?
806         BEQ     GW2B    NO
807         BRA     GW3     YES, THIS IS THE END
808 GW2A    TSTB
809         BNE     GW2B    ALREADY FOUND START
810         STX     GWFRQ   FOUND START
811         INCB
812 GW2B    INX
813         CPX     FRQEND
814         BNE     GW0     NOT OVER YET
815         TSTB            FOUND START?
816         BNE     GW3     YES
817         RTS             ALL OVER
818 GW3     STX     FRQEND
819         LDAA    GECDEC  RE:XSFER WAVE?
820         BEQ     GEND0   NO
821         BSR     WVTRAN  XSFER WAVE
822         LDAA    PRDECA
823         BSR     WVDECA
824 GEND0   JMP     GWAVE
825 GEND1   RTS             TERMINATE
826 *
827 *WAVE TRANSFER ROUTINE
828 *
829 WVTRAN  LDX     #GWTAB
830         STX     XPTR
831         LDX     GWFRM
832         LDAB    ,X      GET WAVE LENGTH
833         INX
834         JSR     TRANS
835         LDX     XPTR
836         STX     WVEND   GET END ADDR
837         RTS
838 *
839 *WAVE DECAY ROUTINE/ DECAY AMOUNT IN ACCA(1/16 PER DECAY)
840 *
841 WVDECA  TSTA
842         BEQ     WVDCX   NO DECAY
843         LDX     GWFRM   ROM WAVE INDEX
844         STX     XPLAY
845         LDX     #GWTAB
846         STAA    TEMPB   DECAY FACTOR
847 WVDLP   STX     XPTR
848         LDX     XPLAY
849         LDAB    TEMPB
850         STAB    TEMPA   DECAY FACTOR TEMP
851         LDAB    1,X     OFFSET FOR WAVE LENGTH
852         LSRB
853         LSRB
854         LSRB
855         LSRB            CALC 1/16TH
856         INX
857         STX     XPLAY
858         LDX     XPTR
859         LDAA    ,X
860 WVDLP1  SBA             DECAY
861         DEC     TEMPA
862         BNE     WVDLP1
863         STAA    ,X
864         INX
865         CPX     WVEND   END OF WAVE?
866         BNE     WVDLP   NO
867 WVDCX   RTS
868 *
869 * INTERRUPT PROCESSING
870 *
871 IRQ     LDS     #ENDRAM RE-INITIALIZE STACK
872         LDAA    SOUND+2 GET INPUT TRIGGER
873         CLI             NOW ALLOW IRQS
874         COMA            INVERT INPUT
875         ANDA    #$1F    MASK GARB
876         LDAB    ORGFLG
877         BEQ     IRQ00
878         JSR     ORGNT1  ORGAN TUNE
879 IRQ00   CLRB
880         CMPA    #SP1SND
881         BEQ     IRQ00A
882         STAB    SP1FLG
883 IRQ00A  CMPA    #B2SND  
884         BEQ     IRQ000
885         STAB    B2FLG
886 IRQ000  TSTA
887         BEQ     IRQ3    INVALID INPUT
888         DECA            REMOVE OFFSET
889         CMPA    #$C
890         BHI     IRQ10
891         JSR     GWLD    GWAVE SOUNDS
892         JSR     GWAVE
893         BRA     IRQ3
894 IRQ10   CMPA    #$1B    SPECIAL SOUND?
895         BHI     IRQ20   VARI SOUND
896         SUBA    #$D     SUB OFFSET
897         ASLA            DOUBLE FOR ADDRESSING
898         LDX     #JMPTBL INDEX TO JUMP TABLE
899         BSR     ADDX    GET CORRECT INDEX
900         LDX     0,X     GET ADDRESS TO INDEX
901         JSR     0,X     PERFORM IT
902         BRA     IRQ3
903 IRQ20   SUBA    #$1C
904         JSR     VARILD
905         JSR     VARI
906 IRQ3    LDAA    BG1FLG  BGROUND ACTIVE?
907         ORAA    BG2FLG  
908         BEQ     *       NOPE
909         CLRA
910         STAA    B2FLG   KILL BONUSES
911         LDAA    BG1FLG
912         BEQ     IRQXX
913         JMP     BG1
914 IRQXX   JMP     BG2
915 *
916 * ADD A TO INDEX REGISTER
917 *
918 ADDX    STX     XPLAY
919         ADDA    XPLAY+1
920         STAA    XPLAY+1
921         BCC     ADDX1
922         INC     XPLAY   
923 ADDX1   LDX     XPLAY
924         RTS
925 *
926 * DIAGNOSTIC PROCESSING HERE
927 *
928 NMI     SEI
929         LDS     #ENDRAM RESET THE STACK
930         LDX     #$FFFF
931         CLRB
932 NMI1    ADCB    0,X
933         DEX
934         CPX     #$F800
935         BNE     NMI1
936         CMPB    0,X
937         BEQ     NMI2
938         WAI
939 NMI2    LDAA    #1      
940         JSR     VARILD
941         JSR     VARI
942         LDAA    #2
943         JSR     ORGASM
944         LDAA    #1
945         JSR     ORGASM
946         BRA     NMI     KEEP LOOPING
947 *
948 *SPECIAL ROUTINE JUMP TABLE
949 *
950 JMPTBL  FDB     SP1,BG1,BG2INC,LITE
951         FDB     BON2,BGEND,TURBO,APPEAR
952         FDB     THRUST,CANNON,RADIO,HYPER
953         FDB     SCREAM,ORGANT,ORGANN
954 *
955 *VARI VECTORS
956 *
957 VVECT   EQU     *
958 SAW     FCB     $40,$01,$00,$10,$E1,$00,$80,$FF,$FF
959 FOSHIT  FCB     $28,$01,$00,$08,$81,$02,$00,$FF,$FF
960 QUASAR  FCB     $28,$81,$00,$FC,$01,$02,$00,$FC,$FF
961 CABSHK  FCB     $FF,$01,$00,$18,$41,$04,$80,$00,$FF
962 *
963 *RADIO SOUND WAVEFORM
964 *
965 RADSND  FCB     $8C,$5B,$B6,$40,$BF,$49,$A4,$73
966         FCB     $73,$A4,$49,$BF,$40,$B6,$5B,$8C
967 *
968 * NOTE DEFINITIONS AND ALL THAT JAZZ
969 *
970 AF1     EQU     $F847
971 A1      EQU     $F83F
972 BF1     EQU     $F837
973 B1      EQU     $F830
974 C1      EQU     $F829
975 CS1     EQU     $F823
976 D1      EQU     $F81D
977 EF1     EQU     $F817
978 E1      EQU     $F812
979 F1      EQU     $F80D
980 FS1     EQU     $F808
981 G2      EQU     $F804
982 AF2     EQU     $7C47
983 A2      EQU     $7C3F
984 BF2     EQU     $7C37
985 B2      EQU     $7C30
986 C2      EQU     $7C29
987 CS2     EQU     $7C23
988 D2      EQU     $7C1D
989 EF2     EQU     $7C17
990 E2      EQU     $7C12
991 F2      EQU     $7C0D
992 FS2     EQU     $7C08
993 G3      EQU     $7C04
994 AF3     EQU     $3E47
995 A3      EQU     $3E3F
996 BF3     EQU     $3E37
997 B3      EQU     $3E30
998 C3      EQU     $3E29
999 CS3     EQU     $3E23
1000 D3      EQU     $3E1D
1001 EF3     EQU     $3E17
1002 E3      EQU     $3E12
1003 F3      EQU     $3E0D
1004 FS3     EQU     $3E08
1005 G4      EQU     $3E04
1006 AF4     EQU     $1F47
1007 A4      EQU     $1F3F
1008 BF4     EQU     $1F37
1009 B4      EQU     $1F30
1010 C4      EQU     $1F29
1011 CS4     EQU     $1F23
1012 D4      EQU     $1F1D
1013 EF4     EQU     $1F17
1014 E4      EQU     $1F12
1015 F4      EQU     $1F0D
1016 FS4     EQU     $1F08
1017 RS      EQU     $0004
1018 TR      EQU     TG
1019 *
1020 *ORGAN TUNE TABLE
1021 *OSCILLATOR MASK(1),DELAY(1),DURATION(2)
1022 *
1023 ORGTAB  EQU     *
1024         FCB     NINTH-FIFTH-1
1025 FIFTH   EQU     *
1026         FDB     G2,TG/FIF/4
1027         FDB     RS,TR/FIF/4
1028         FDB     G2,TG/FIF/4
1029         FDB     RS,TR/FIF/4
1030         FDB     G2,TG/FIF/4
1031         FDB     RS,TR/FIF/4
1032         FDB     EF1,TEF/FIF/2*7
1033         FCB     TUNEND-NINTH
1034 NINTH   EQU     *
1035         FDB     D4,TD/NIN/4
1036         FDB     RS,TR/NIN/4
1037         FDB     D3,TD/NIN/4
1038         FDB     RS,TR/NIN/4*5
1039         FDB     A3,TA/NIN/4
1040         FDB     RS,TR/NIN/4
1041         FDB     A2,TA/NIN/4
1042         FDB     RS,TR/NIN/4*5
1043         FDB     D2,TD/NIN/4
1044         FDB     RS,TR/NIN/4
1045         FDB     D1,TD/NIN/4
1046         FDB     RS,TR/NIN/4
1047         FDB     A2,TA/NIN/4
1048         FDB     RS,TR/NIN/4
1049         FDB     A1,TA/NIN/4
1050         FDB     RS,TR/NIN/4*7
1051         FDB     A2,TA/NIN/4
1052         FDB     D2,TD/NIN/4
1053         FDB     E2,TE/NIN/4
1054         FDB     F2,TF/NIN/4
1055         FDB     E2,TE/NIN/4
1056         FDB     F2,TF/NIN/4
1057         FDB     G3,TG/NIN/4
1058         FDB     F2,TF/NIN/4
1059         FDB     E2,TE/NIN/4
1060         FDB     D2,TD/NIN/4
1061         FDB     BF3,TBF/NIN/4
1062         FDB     A3,TA/NIN/4
1063         FDB     G3,TG/NIN/4
1064         FDB     F2,TF/NIN/4
1065         FDB     E2,TE/NIN/4
1066         FDB     D2,TD/NIN/4
1067         FDB     CS2,TCS/NIN/4
1068         FDB     D2,TD/NIN/4
1069         FDB     E2,TE/NIN/4
1070         FDB     D3,TD/NIN/4
1071         FDB     RS,TR/NIN/4
1072         FDB     D2,TD/NIN/4
1073         FDB     RS,TR/NIN/4
1074         FDB     A3,TA/NIN/4
1075         FDB     RS,TR/NIN/4
1076         FDB     A2,TA/NIN/4
1077         FDB     RS,TR/NIN/4*5
1078         FDB     D1,TD/NIN/2*5
1079 TUNEND  FCB     0       LAST TUNE
1080 *
1081 *ORGAN NOTE TABLE
1082 *SCALE          AF      A       BF      B       C       CS
1083 NOTTAB  FCB     $47,$3F,$37,$30,$29,$23
1084 *               D       EF      E       F       FS      G
1085         FCB     $1D,$17,$12,$0D,$08,$04 
1086 *
1087 *WAVE TABLE
1088 *1ST BYTE= WAVELENGTH
1089 *
1090 GWVTAB  EQU     *
1091 GS2     FCB     8,127,217,255,217,127,36,0,36
1092 GSSQ2   FCB     8,0,64,128,0,255,0,128,64
1093 GS1     FCB     16,127,176,217,245,255,245,217,176
1094         FCB     127,78,36,9,0,9,36,78
1095 GS12    FCB     16,127,197,236,231,191,141,109,106
1096         FCB     127,148,146,113,64,23,18,57
1097 GSQ22   FCB     16,$FF,$FF,$FF,$FF,0,0,0,0
1098         FCB     $FF,$FF,$FF,$FF,0,0,0,0
1099 GS72    FCB     72,138,149,160,171,181,191,200,209
1100         FCB     218,225,232,238,243,247,251,253,254,255
1101         FCB     254,253,251,247,243,238,232,225,218
1102         FCB     209,200,191,181,171,160,149,138,127
1103         FCB     117,106,95,84,74,64,55,46,37,30,23,17,12
1104         FCB     8,4,2,1,0
1105         FCB     1,2,4,8,12,17,23,30,37,46,55,64,74,84
1106         FCB     95,106,117,127
1107 GS1.7   FCB     16,89,123,152,172,179,172,152,123
1108         FCB     89,55,25,6,0,6,25,55
1109 *
1110 *GWAVE SOUND VECTOR TABLE
1111 *VECTOR FORMAT
1112 *BYTE 0: GECHO,GCCNT
1113 *BYTE 1: GECDEC,WAVE#
1114 *BYTE 2: PREDECAY FACTOR
1115 *BYTE 3: GDFINC
1116 *BYTE 4: VARIABLE FREQ COUNT
1117 *BYTE 5: FREQ PATTERN LENGTH
1118 *BYTE 6: FREQ PATTERN OFFSET
1119 *
1120 SVTAB   EQU     *
1121 HBDV    FCB     $81,$24,0,0,0,22,HBDSND-GFRTAB 1
1122 STDV    FCB     $12,$05,$1A,$FF,0,39,STDSND-GFRTAB 2
1123 DP1V    FCB     $11,$05,$11,1,15,1,SWPAT-GFRTAB 3
1124 XBV     FCB     $11,$31,0,1,0,13,SPNSND-GFRTAB 4
1125 BBSV    FCB     $F4,$12,$0,0,0,20,BBSND-GFRTAB 5
1126 HBEV    FCB     $41,$45,0,0,0,15,HBESND-GFRTAB 6
1127 PROTV   FCB     $21,$35,$11,$FF,0,13,SPNSND-GFRTAB 7
1128 SPNRV   FCB     $15,$00,0,$FD,0,1,SPNR-GFRTAB 8
1129 CLDWNV  FCB     $31,$11,0,1,0,3,COOLDN-GFRTAB 9
1130 SV3     FCB     $01,$15,1,1,1,1,BBSND-GFRTAB 10
1131 ED10    FCB     $F6,$53,3,0,2,6,ED10FP-GFRTAB 11
1132 ED12    FCB     $6A,$10,2,0,2,6,ED13FP-GFRTAB 12
1133 ED17    FCB     $1F,$12,0,$FF,$10,4,SPNR-GFRTAB 13
1134 BONV    FCB     $31,$11,0,$FF,0,13,BONSND-GFRTAB
1135 TRBV    FCB     $12,$06,$0,$FF,1,9,TRBPAT-GFRTAB
1136 *
1137 *GWAVE FREQ PATTERN TABLE
1138 *
1139 GFRTAB  EQU     *
1140 *BONUS  SOUND
1141 BONSND  FCB     $A0,$98,$90,$88,$80,$78,$70,$68
1142         FCB     $60,$58,$50,$44,$40
1143 *HUNDRED POINT SOUND
1144 HBTSND  FCB     1,1,2,2,4,4,8,8,$10,$10,$30,$60,$C0,$E0
1145 *SPINNER SOUND
1146 SPNSND  FCB     1,1,2,2,3,4,5,6,7,8,9,$A,$C
1147 *TURBINE START UP
1148 TRBPAT  FCB     $80,$7C,$78,$74,$70,$74,$78,$7C,$80
1149 *HEARTBEAT DISTORTO
1150 HBDSND  FCB     1,1,2,2,4,4,8,8,$10,$20,$28
1151         FCB     $30,$38,$40,$48,$50,$60,$70,$80,$A0,$B0,$C0
1152 *SWEEP PATTERN
1153 SWPAT   EQU     *
1154 *BIGBEN SOUNDS
1155 BBSND   FCB     8,64,8,64,8,64,8,64,8,64
1156         FCB     8,64,8,64,8,64,8,64,8,64
1157 *HEARTBEAT ECHO
1158 HBESND  FCB     1,2,4,8,9,$A,$B,$C,$E,$F,$10
1159         FCB     $12,$14,$16
1160 *SPINNER SOUND "DRIP"
1161 SPNR    FCB     $40
1162 *COOL DOWNER
1163 COOLDN  FCB     $10,8,1
1164 *START DISTORTO SOUND
1165 STDSND  FCB     1,1,1,1,2,2,3,3,4,4,5,6,8,$A,$C,$10
1166         FCB     $14,$18,$20,$30,$40,$50,$40,$30
1167         FCB     $20,$10,$C,$A,8,7,6,5,4,3,2,2,1,1,1
1168 *ED'S SOUND 10
1169 ED10FP  FCB     7,8,9,$A,$C,8
1170 *ED'S SOUND 13
1171 ED13FP  FCB     $17,$18,$19,$1A,$1B,$1C
1172         FCB     0,0,0,0 FILLER
1173 *
1174 * VECTORS HERE
1175 *
1176         ORG     VECTOR
1177 IRQV    FDB     IRQ
1178 SWIV    FDB     SETUP
1179 NMIV    FDB     NMI
1180 RESETV  FDB     SETUP
1181         END     CKSUM