bang
[williams-soundroms.git] / VSNDRM4.SRC
1         NAM     JOUST SOUND ROM STARTED 06/15/1982
2         SUBTTL   
3 *COPYRIGHT WILLIAMS ELECTRONICS INC. 1982
4 *PROGRAMMERS: EUGENE P. JARVIS, SAM DICKER,RANDY PFEIFFER,JOHN KOTLARIK
5 *               PAUL G. DUSSAULT,CARY W. KOLKER,TIM  MURPHY
6 *                       AND A CAST OF THOUSANDS......
7 *
8 *
9 *SYSTEM CONSTANTS
10 *
11 ROM     EQU     $F000
12 SOUND   SET     $400
13 CKORG   EQU     $EF00   CHECKSUM PROG ORG
14 ENDRAM  SET     $7F
15 VECTOR  EQU     $FFF8   RESET,INT VECTORS
16 WVELEN  EQU     72
17 *
18 * SCREAM EQUATES
19 *
20 ECHOS   EQU     4
21 FREQ    EQU     0               
22 TIMER   EQU     1
23 *
24 *GLOBALS
25 *
26         ORG     0
27 HI      RMB     1       RANDOM SEED
28 LO      RMB     1       RANDOM SEED
29 XDECAY  RMB     2
30 AMP0    RMB     1
31 *
32 *
33 *TEMPORARIES
34 *
35 TMPRAM  EQU     *       TEMPORARY RAM
36 TEMPX   RMB     2       X TEMPS
37 XPLAY   RMB     2
38 XPTR    RMB     2
39 TEMPA   RMB     1       ACCA TEMP
40 TEMPB   RMB     1
41 LOCRAM  EQU     *
42 *
43 *GWAVE PARAMETERS
44 *
45         ORG     LOCRAM
46 GECHO   RMB     1       ECHO FLAG
47 GCCNT   RMB     1       CYCLE COUNT
48 GECDEC  RMB     1       # OF DECAYS PER ECHO
49 GDFINC  RMB     1       DELTA FREQ INC
50 GDCNT   RMB     1       DELTA FREQ COUNT
51 GWFRM   RMB     2       WAVEFORM ADDRESS
52 *TEMPORARY OR COMPUTED PARAMETERS
53 PRDECA  RMB     1       PRE-DECAY FACTOR
54 GWFRQ   RMB     2       FREQ TABLE ADDR
55 FRQEND  RMB     2       END ADDR FREQ TABLE
56 WVEND   RMB     2       WAVE END ADDR
57 GPER    RMB     1       PERIOD
58 GECNT   RMB     1       # OF ECHOES COUNTER
59 FOFSET  RMB     1       FREQUENCY OFFSET
60 *
61 *GWAVE TABLES
62 *
63 GWTAB   RMB     WVELEN  WAVE TABLE
64 *
65 *VARIWAVE PARAMETERS
66 *
67         ORG     LOCRAM
68 LOPER   RMB     1       LO PERIOD
69 HIPER   RMB     1       HIPERIOD
70 LODT    RMB     1       PERIOD DELTAS
71 HIDT    RMB     1
72 HIEN    RMB     1       END PERIOD
73 SWPDT   RMB     2       SWEEP PERIOD
74 LOMOD   RMB     1       BASE FREQ MOD
75 VAMP    RMB     1       AMPLITUDE
76 LOCNT   RMB     1       PERIOD COUNTERS
77 HICNT   RMB     1
78 * BOMB RAM
79         ORG     LOCRAM
80 TIME    RMB     1
81 TABLE   RMB     2
82 FREQZ   RMB     1
83 *
84 * KNOCKER RAM
85 *
86         ORG     LOCRAM
87 PERIOD  RMB     1
88 AMP     RMB     1
89 SNDTMP  RMB     2       INDEX TMEP
90 *
91 * FLASH LOCAL RAM
92         ORG     LOCRAM
93 FREQ1   RMB     1       FREQUENCY CONSTANT 1
94 FREQ2   RMB     1       FREQUENCY CONSTANT 2
95 FREQ3   RMB     1       FREQUENCY CONSTANT 3
96 FREQ4   RMB     1       FREQUENCY CONSTANT 4
97 DELTA1  RMB     1       DELTA AMPLITUDE 1
98 DELTA2  RMB     1       DELTA AMPLITUDE 2
99 DELTA3  RMB     1       DELTA AMPLITUDE 3
100 DELTA4  RMB     1       DELTA AMPLITUDE 4
101 FREQ1$  RMB     1       FREQUENCY COUNTER 1
102 FREQ2$  RMB     1       FREQUENCY COUNTER 2
103 FREQ3$  RMB     1       FREQUENCY COUNTER 3
104 FREQ4$  RMB     1       FREQUENCY COUNTER 4
105 CYCLE1  RMB     1       CYCLE CONSTANT 1
106 CYCLE2  RMB     1       CYCLE CONSTANT 2
107 CYCLE3  RMB     1       CYCLE CONSTANT 3
108 CYCLE4  RMB     1       CYCLE CONSTANT 4
109 DFREQ1  RMB     1       DELTA FREQUENCY 1
110 DFREQ2  RMB     1       DELTA FREQUENCY 2
111 DFREQ3  RMB     1       DELTA FREQUENCY 3
112 DFREQ4  RMB     1       DELTA FREQUENCY 4
113 EFREQ1  RMB     1       END FREQUENCY 1
114 EFREQ2  RMB     1       END FREQUENCY 2
115 EFREQ3  RMB     1       END FREQUENCY 3
116 EFREQ4  RMB     1       END FREQUENCY 4
117 CYCL1$  RMB     1       CYCLE COUNTER 1
118 CYCL2$  RMB     1       CYCLE COUNTER 2
119 CYCL3$  RMB     1       CYCLE COUNTER 3
120 CYCL4$  RMB     1       CYCLE COUNTER 4
121 SNDX1   RMB     1
122
123 RANDOM  EQU     LO      SINGLE BYTE RANDOM
124         ORG     LOCRAM+1
125 FREQ$   RMB     1       START FREQUENCY
126 C$FRQ   RMB     1       CYCLES AT FREQUENCY
127 D$FRQ   RMB     1       DELTA FREQUENCY
128 E$FRQ   RMB     1       END FREQUENCY
129 C$AMP   RMB     1       CYCLES AT AMPLITUDE
130 D$AMP   RMB     1       DELTA AMPLITUDE
131 C$AMP$  RMB     1       CYCLE COUNTER
132 C$FRQ$  RMB     1       CYCLE COUNTER
133 *
134 *
135 *FILTERED NOISE ROUTINE PARAMETERS
136 *
137         ORG     LOCRAM
138 FMAX    RMB     1       MAXIMUM_FREQUENCY
139 FHI     RMB     1       FREQUENCY
140 FLO     RMB     1 
141 LOFRQ   RMB     1
142 SAMPC   RMB     2       SAMPLE COUNT
143 FDFLG   RMB     1       FREQUENCY DECREMENT FLAG
144 DSFLG   RMB     1       DISTORTION FLAG
145 *
146 *
147 *
148 *NOISE/CROWD ROAR ROUTINE PARAMETERS
149 *
150         ORG     LOCRAM
151 DECAY   RMB     1
152 NAMP    RMB     1
153 CYCNT   RMB     1
154 NFRQ1   RMB     2
155 NFFLG   RMB     1
156 LFREQ   RMB     1
157 DFREQ   RMB     1
158 GALPAM  EQU     *
159 CYCNT2  RMB     1
160 NAMP2   RMB     1
161 DECAY2  RMB     1
162 NFFLG2  RMB     1
163 NFR2    RMB     1
164 GALCNT  RMB     1
165 WHIS    RMB     1       CROWD ROAR AMP
166 WFRQ    RMB     1       CROWD WHISTLE FREQ
167 WCNT    RMB     1       WHISTLE PASSCOUNTER
168 PTRHI   RMB     2       WHIS ADR PTR
169 WFRQ2   RMB     1
170 WCNT2   RMB     1
171 CURVAL  RMB     1       WHISTLING NOISE OUTPUT
172 ATP     RMB     1       INTERM NOISE VAL
173 MINWIS  RMB     1       MIN WHISTLE FREQ
174 CY2     RMB     1       NOISE CYCLE COUNTER
175 DFRQ    RMB     1       WHISTLE FREQ CHANGE
176 DFRQ2   RMB     1       INIT WHISTLE FREQ CHANGE
177 NNOIS   RMB     1       NEXT NOISE VALUE
178 NFRQ    RMB     1       NOISE FREQ
179 NFRQ2   RMB     1       INIT NOISE FREQ
180 RCNT2   RMB     1
181
182 * CHECKSUM CALCULATOR & RELOCATOR
183 *
184         ORG     CKORG
185 CKSUM   LDX     #$FFFF  INDEX TO END OF ROM
186         CLRB            ZERO CHECKSUM
187 CKSUM1  ADCB    0,X     ADD IN PROGRAM BYTE
188         DEX             TO NEXT BYTE
189         CPX     #$F000  DONE YET?
190         BNE     CKSUM1  NOPE...
191         STAB    0,X     SAVE CHECKSUM AT BEGINNING
192         WAI             TURN OFF LEDS
193 FROM    RMB     2
194         RMB     2       FOR POINTER
195 *
196 * MAIN PROGRAM
197 *
198         ORG     ROM
199         FCB     $74     CHECKSUM BYTE
200 *
201 *
202 SETUP   SEI             SET INTERRUPT MASK
203         LDS     #ENDRAM INITIALIZE STACK POINTER
204         LDX     #SOUND  INDEX TO PIA
205         CLR     1,X     ACCESS DDRA
206         CLR     3,X     ACCESS DDRB
207         LDAA    #$FF    PA0-PA7
208         STAA    0,X     SET SIDE A AS OUTPUTS
209         CLR     2,X     SET B SIDE AS INPUTS
210         LDAA    #$37    CB2 LOW, IRQ ALLOWED
211         STAA    3,X     PROGRAM B CONTROL REG
212         LDAA    #$3C    CA2 SET INIT HIGH, NO IRQS
213         STAA    1,X     PROGRAM A SIDE
214         STAA    HI      START RANDOM GENERATOR
215         CLI             CLEAR INTERRUPTS
216         BRA     *       WAIT FOR INTERRUPT
217 *
218 *
219 * THREE OSCILLATOR SOUND GENERATOR
220 *
221 PLAY    STX     XPLAY   SAVE CURRENT INDEX
222         LDX     #DECAYZ SET TO MAXIMUM AMPLITUDE
223         STX     XDECAY  AND SAVE
224         LDAA    #$80    LOAD ZERO AMPLITUDE
225 PLAY1   LDAB    FREQ4   CHECK WHITE NOISE COUNTER
226         BPL     PLAY3   NOT IN WHITE MODE
227         LDAB    RANDOM  GET RANDOM NUMBER
228         LSRB            REDUCE IT
229         LSRB
230         LSRB
231         INCB            NOW NON-ZERO
232 PLAY2   DECB            TIME OUT COUNT
233         BNE     PLAY2
234 PLAY3   DEC     FREQ1$  COUNT DOWN OSC. 1
235         BEQ     PLAY7   DO AN UPDATE
236         DEC     FREQ2$  COUNT DOWN OSC. 2
237         BEQ     PLAY8   DO AN UPDATE
238         DEC     FREQ3$  COUNT DOWN OSC. 3
239         BEQ     PLAY9   DO AN UPDATE
240         DEC     FREQ4$  COUNT DOWN WHITE NOISE
241         BNE     PLAY1   DO THEM AGAIN
242         LDAB    FREQ4   CHECK WHITE NOISE CONSTANT
243         BEQ     PLAY1   FORGET IT
244         ANDB    #$7F    STRIP FLAG BIT
245         STAB    FREQ4$  SAVE WHITE NOISE COUNT
246         LDAB    RANDOM  GET CURRENT RANDOM
247         ASLB            DOUBLE
248         ADDB    RANDOM  TRIPLE
249         ADDB    #$0B    ADD IN 11
250         STAB    RANDOM  VOILA...NEW RANDOM NUMBER
251         DEC     CYCL4$  COUNT DOWN DECAY
252         BNE     PLAY6   DON'T DECAY
253         LDAB    CYCLE4  RELOAD COUNT
254         STAB    CYCL4$  AND SAVE
255         LDX     XDECAY  GET DECAY JUMP POINTER
256         DEX             MOVE TO LESS AMPLITUDE
257         CPX     #RDECAY+1  DONE?
258         BEQ     PLAY12  YUP...BYE BYE
259         STX     XDECAY  SAVE NEW POINTER
260 PLAY6   LDAB    RANDOM  GET RANDOM AMPLITUDE
261         BMI     PLAY6A  SKIP IF NEGATIVE
262         ANDB    DELTA4  REDUCE AMPLITUDE
263         ANDB    #$7F    STRIP SIGN BIT
264         BRA     PLAY6B
265 PLAY6A  ANDB    DELTA4  REDUCE AMPLITUDE
266         ANDB    #$7F    REMOVE SIGN BIT
267         NEGB    NEGATE
268 PLAY6B  PSHA
269         ABA             ADD WHITE NOISE
270         TAB
271         PULA
272         LDX     XDECAY  GET DECAY POINTER
273         JSR     0,X     OUTPUT NOISE
274         BRA     PLAY1   DO SOME MORE
275 PLAY7   LDX     #FREQ1  INDEX TO SET 1
276         BRA     PLAY10
277 PLAY8   LDX     #FREQ2  INDEX TO SET 2
278         BRA     PLAY10
279 PLAY9   LDX     #FREQ3  INDEX TO SET 3
280 PLAY10  TST     24,X    CHECK CYCLES AT FREQUENCY
281         BEQ     PLAY11  ZERO, DON'T CHANGE
282         DEC     24,X    COUNT DOWN 
283         BNE     PLAY11  NOT TIME TO CHANGE...
284         LDAB    12,X    LOAD CYCLES AT FREQUENCY
285         STAB    24,X    SAVE IN COUNTER
286         LDAB    00,X    GET CURRENT FRQUENCY
287         ADDB    16,X    ADD DELTA
288         CMPB    20,X    COMPARE TO END
289         BEQ     PLAY12  DONE...
290         STAB    00,X    SAVE NEW CURRENT FREQUENCY
291 PLAY11  LDAB    0,X     GET CURRENT FREQUENCY
292         STAB    8,X     SAVE IN FREQUENCY COUNTER
293         ADDA    4,X     ADD IN AMPLITUDE
294         NEG     4,X     NEGATE AMPLITUDE
295         TAB             SAVE DATA
296         LDX     XDECAY  INDEX TO DECAY
297         JSR     0,X     OUTPUT SOUND
298         JMP     PLAY1   REPEAT
299 PLAY12  LDX     XPLAY   RESTORE INDEX
300         RTS
301 *
302 * ECHO AND DECAY ROUTINE
303 *
304 RDECAY  LSRB
305         LSRB
306         LSRB
307         LSRB
308         LSRB
309         LSRB
310         LSRB
311         LSRB
312 DECAYZ  STAB    SOUND
313         RTS
314 *
315 * 3 OSCILLATOR CALLING ROUTINES
316 *
317 THNDR   LDX     #VEC01  THUNDER SOUND
318 THNDR1  LDAB    #28     NEED TO TRANSFER
319         JSR     TRANS   28 BYTES FOR PLAY
320         JSR     PLAY    NOW PLAY IT
321         RTS
322 SND4    LDX     #VEC04  SOUND 4
323         BRA     THNDR1
324 SND5    LDX     #VEC05  SOUND 5
325         BRA     THNDR1
326 *
327 *
328 *
329 * THE BOMB OOOOOH NOOOOO!
330 WHIST   LDAA    #$80
331         STAA    FREQZ
332         LDAA    #SINTBL/$100
333         STAA    TABLE
334 WHIST0  LDAA    #$80
335         STAA    TEMPA
336 WHIST1  LDAA    #18
337 WHIST2  DECA
338         BNE     WHIST2
339         LDAA    TIME
340         ADDA    FREQZ
341         STAA    TIME
342         LSRA
343         LSRA
344         LSRA
345         ADDA    #SINTBL!.$FF
346         STAA    TABLE+1
347         LDX     TABLE
348         LDAA    ,X
349         STAA    SOUND
350         DEC     TEMPA
351         BNE     WHIST1
352         DEC     FREQZ
353         LDAA    FREQZ
354         CMPA    #$20
355         BNE     WHIST0
356         RTS
357 *     SINE TABLE
358 SINTBL  FCB     $80,$8C,$98,$A5,$B0,$BC,$C6,$D0
359         FCB     $DA,$E2,$EA,$F0,$F5,$FA,$FD,$FE
360         FCB     $FF,$FE,$FD,$FA,$F5,$F0,$EA,$E2
361         FCB     $DA,$D0,$C6,$BC,$B0,$A5,$98,$8C
362         FCB     $80,$73,$67,$5A,$4F,$43,$39,$2F
363         FCB     $25,$1D,$15,$0F,$0A,$05,$02,$01
364         FCB     $00,$01,$02,$05,$0A,$0F,$15,$1D
365         FCB     $25,$2F,$39,$43,$4F,$5A,$67,$73
366 *
367 * KNOCKER ROUTINE
368 *
369 KNOCK   CLR     SOUND+2 FULL BLAST
370         LDX     #KNKTAB
371         STX     SNDTMP
372 SQLP    LDX     SNDTMP  RESTORE X REG
373         LDAA    ,X      GET PERIOD
374         BEQ     END     END ON ZERO
375         LDAB    1,X     GET AMP
376         ANDB    #$F0
377         STAB    AMP
378         LDAB    1,X
379         INX
380         INX
381         STX     SNDTMP  SAVE X
382         STAA    PERIOD
383         ANDB    #$F
384 LP0     LDAA    AMP
385         STAA    SOUND
386         LDAA    PERIOD
387 LP1     LDX     #5      DELAY
388 LP11    DEX
389         BNE     LP11
390         DECA
391         BNE     LP1
392         CLR     SOUND
393         LDAA    PERIOD
394 LP2     LDX     #5      DELAY
395 LP22    DEX
396         BNE     LP22
397         DECA
398         BNE     LP2
399         DECB
400         BNE     LP0
401         BRA     SQLP
402 END     LDAA    #$80    OVERRIDE OFF
403         STAA    SOUND+2
404         RTS
405 *
406 *
407 * KNOCKER PATTERN
408 *
409 KNKTAB  FDB     $01FC,$02FC,$03F8,$04F8,$06F8,$08F4,$0CF4
410         FDB     $10F4,$20F2,$40F1,$60F1,$80F1,$A0F1,$C0F1,0
411 *
412 *
413 * SINGLE OSCILLATOR SOUND CALLS
414 *
415 PERK1   JSR     MOVE
416         JSR     SING
417         RTS
418 ATARI   LDX     #VEC02X
419         BRA     PERK1
420
421 PERK$1  BSR     PERK1
422         BSR     ECHO
423         BRA     PERK$1
424
425 PERK$$  LDAA    #$FF
426         STAA    AMP0
427         LDX     #VEC06X
428         BRA     PERK$1
429 *
430 *       RANDOM SQUIRTS
431 *
432 SQRT    LDAB    #$30
433 SQRT1   LDX     #VEC09X
434         BSR     MOVE
435 SQRT2   LDAA    RANDOM
436         ASLA
437         ADDA    RANDOM
438         ADDA    #$0B
439         STAA    RANDOM
440         LSRA
441         LSRA
442         ADDA    #$0C
443         STAA    FREQ$
444         BSR     SING
445         DECB
446         BNE     SQRT2
447         RTS
448 *
449 *       ECHO FUNCTION
450 *
451 ECHO    LDAA    AMP0
452         SUBA    #$08
453         BPL     ECHO1
454         STAA    AMP0
455         RTS
456 ECHO1   PULA
457         PULA
458         RTS
459 *
460 *       MOVE PARAMETERS
461 *
462 MOVE    LDAA    0,X
463         STAA    FREQ$
464         LDAA    1,X
465         STAA    C$FRQ
466         LDAA    2,X
467         STAA    D$FRQ
468         LDAA    3,X
469         STAA    E$FRQ
470         LDAA    4,X
471         STAA    C$AMP
472         LDAA    5,X
473         STAA    D$AMP
474         RTS
475 *
476 *       DELTA F, DELTA A ROUTINE
477 *
478 SING    LDAA    AMP0    GET STARTING AMPLITUDE
479 SING$   PSHB            SAVE B
480         LDAB    C$AMP   GET CYCLES AT AMPLITUDE
481         STAB    C$AMP$  SAVE AS COUNTER
482         LDAB    C$FRQ   GET CYCLES AT FREQUENCY
483         STAB    C$FRQ$  SAVE AS COUNTER
484 SING1   COMA            INVERT AMPLITUDE
485         LDAB    FREQ$   GET FREQUENCY COUNTER
486         STAA    SOUND   OUTPUT TO D/A
487 SING2   DECB
488         BNE     SING2
489         COMA            INVERT AMPLITUDE
490         LDAB    FREQ$   GET FREQUENCY COUNTER
491         BRA     *+2     -I
492         INX             -I
493         DEX             -I--- SYNC, 20 CYCLES
494         INX             -I
495         DEX             -I
496         STAA    SOUND   OUTPUT TO D/A
497 SING3   DECB
498         BNE     SING3
499         DEC     C$FRQ$  CHECK CYCLES AT FREQUENCY
500         BEQ     SING4   GO CHANGE FREQUENCY
501         DEC     C$AMP$  CHECK CYCLES AT AMPLITUDE
502         BNE     SING1   ALL OK, GO OUTPUT
503         COMA            INVERT AMPLITUDE
504         LDAB    C$AMP   GET CYCLES AT AMPLITUDE
505         STAA    SOUND   OUTPUT TO D/A
506         STAB    C$AMP$  SAVE AS COUNTER
507         LDAB    FREQ$   GET FREQUENCY COUNT
508         ADDA    D$AMP   ADD AMPLITUDE DELTA
509         BMI     SING6   RETURN FROM SUBROUTINE
510         NOP             SYNC, 2 CYCLES
511         BRA     SING5
512 SING4   INX             -I
513         DEX             -I--- SYNC, 10 CYCLES
514         NOP             -I
515         COMA            INVERT AMPLITUDE
516         LDAB    C$FRQ   GET CYCLES AT FREQUENCY
517         STAA    SOUND   OUTPUT TO D/A
518         STAB    C$FRQ$  SAVE AS COUNTER
519         LDAB    FREQ$   GET FREQUENCY COUNT
520         SUBB    D$FRQ   SUBTRACT FREQUENCY DELTA
521         CMPB    E$FRQ   COMPARE TO END FREQUENCY
522         CMPB    E$FRQ   SYNC, 3 CYCLES
523         BEQ     SING6   RETURN FROM SUBROUTINE
524 SING5   STAB    FREQ$   SAVE FREQUENCY COUNT
525         SUBB    #$05    SYNC TO FREQUENCY COUNTDOWN
526         BRA     SING2   JUMP INTO COUNTDOWN LOOP
527 SING6   PULB            RESTORE B
528         RTS
529 *
530 *
531 SNDTBL  FCB     $DA,$FF,$DA,$80,$26,$01,$26,$80
532         FCB     $07,$0A,$07,$00,$F9,$F6,$F9,$00
533 NOTTBL  FCB     $3A,$3E,$50,$46,$33,$2C,$27,$20
534         FCB     $25,$1C,$1A,$17,$14,$11,$10,$33
535 WAVFRM  FCB     $08,$03,$02,$01,$02,$03,$04,$05
536         FCB     $06,$0A,$1E,$32,$70,$00
537 VEC01   FDB     $FFFF,$FF90,$FFFF,$FFFF,$FFFF
538         FDB     $FF90,$FFFF,$FFFF,$FFFF,$FFFF
539         FDB     $0000,$0000,$0000,$0000
540 VEC02   FDB     $4801,$0000,$3F3F,$0000,$4801
541         FDB     $0000,$0108,$0000,$8101,$0000
542         FDB     $01FF,$0000,$0108,$0000
543 VEC03   FDB     $0110,$0000,$3F3F,$0000,$0110
544         FDB     $0000,$0505,$0000,$0101,$0000
545         FDB     $31FF,$0000,$0505,$0000
546 VEC04   FDB     $3000,$0000,$7F00,$0000,$3000
547         FDB     $0000,$0100,$0000,$7F00,$0000
548         FDB     $0200,$0000,$0100,$0000
549 VEC05   FDB     $0400,$0004,$7F00,$007F,$0400
550         FDB     $0004,$FF00,$00A0,$0000,$0000
551         FDB     $0000,$0000,$FF00,$00A0
552 VEC06   FDB     $0C68,$6800,$071F,$0F00,$0C80
553         FDB     $8000,$FFFF,$FF00,$0000,$0000
554         FDB     $0000,$0000,$FFFF,$FF00
555 VEC016  FDB     $0104,$0000,$3F7F,$0000,$0104
556         FDB     $0000,$05FF,$0000,$0100,$0000
557         FDB     $4800,$0000,$05FF,$0000
558 VEC017  FDB     $0280,$0030,$0A7F,$007F,$0280
559         FDB     $0030,$C080,$0020,$0110,$0015
560         FDB     $C010,$0000,$C080,$0000
561 VEC01X  FDB     $FF01,$02C3,$FF00
562 VEC02X  FDB     $0103,$FF80,$FF00
563 VEC03X  FDB     $2003,$FF50,$FF00
564 VEC04X  FDB     $5003,$0120,$FF00
565 VEC05X  FDB     $FE04,$0204,$FF00
566 VEC06X  FDB     $4803,$010C,$FF00
567 VEC07X  FDB     $4802,$010C,$FF00
568 VEC08X  FDB     $E001,$0210,$FF00
569 VEC09X  FDB     $50FF,$0000,$6080
570 VEC10X  FDB     $FF02,$0106,$FF00
571 *
572 *VARI LOADER
573 *
574 VARILD  TAB
575         ASLA            X2
576         ASLA            X4
577         ASLA            X8
578         ABA             X9
579         LDX     #LOCRAM
580         STX     XPTR    SET XSFER
581         LDX     #VVECT
582         JSR     ADDX
583         LDAB    #9      GET COUNT
584 VTRAN   JMP     TRANS
585 *
586 *VARIABLE DUTY CYCLE SQUARE WAVE ROUTINE
587 *
588 VARI    LDAA    VAMP
589         STAA    SOUND
590 VAR0    LDAA    LOPER
591         STAA    LOCNT
592         LDAA    HIPER
593         STAA    HICNT
594 V0      LDX     SWPDT
595 V0LP    LDAA    LOCNT   LO CYCLE
596         COM     SOUND
597 V1      DEX
598         BEQ     VSWEEP
599         DECA
600         BNE     V1
601         COM     SOUND
602         LDAA    HICNT   HI CYCLE
603 V2      DEX
604         BEQ     VSWEEP
605         DECA
606         BNE     V2
607         BRA     V0LP    LOOP BACK
608 VSWEEP  LDAA    SOUND
609         BMI     VS1
610         COMA
611 VS1     ADDA    #0
612         STAA    SOUND   OUTPUT
613         LDAA    LOCNT
614         ADDA    LODT
615         STAA    LOCNT
616         LDAA    HICNT
617         ADDA    HIDT
618         STAA    HICNT
619         CMPA    HIEN
620         BNE     V0
621         LDAA    LOMOD
622         BEQ     VARX
623         ADDA    LOPER
624         STAA    LOPER
625         BNE     VAR0
626 VARX    RTS
627
628 *
629 *TURBO
630 *
631 TURBO   LDX     #TRBO
632         JMP     NOISLG
633 TRBO    FCB     $10,$FF,1,1,1
634 *CROWD ROAR
635 CDR     LDX     #WS1    1ST WHISTLE PARAMS
636         STX     PTRHI
637         JSR     WISLD
638         LDX     #$A500  SEED
639         STX     HI
640         LDX     #CR1    1ST CROWD ROAR NOISE PARAMS
641         JSR     NOISLD
642         JSR     NINIT
643         LDX     #CR2
644         JSR     NOISLD
645         JMP     NINIT2
646 *WHISTLE PARAMS
647 WS1     FCB     $90,$10,2,$14,$40
648         FCB     $B4,$40,$FF,$14,$30
649         FCB     $D0,$32,$2,$10,$60
650         FCB     $EE,$20,2,8,$54
651         FCB     $E9,$54,$FF,$20,$28
652         FCB     $C0,$30,2,$14,$58
653         FCB     $AC,$20,$2,$8,$58
654         FCB     $A6,$58,$FF,$18,$22
655         FCB     0
656 CR1     FCB     $30,$10,$FC,0,1
657 CR2     FCB     $30,$FC,1,0,1
658 GALMD   FCB     $10,$F0,$F0,1,$30
659 *
660 *MAIN GALLOP LOOP
661 *
662 MGAW    LDX     #GALMD
663         BSR     NOISLD
664 GLP     BSR     GP1
665         BSR     GP1
666         LDAA    #$28
667         STAA    NFRQ2
668         COM     NFFLG
669         BSR     NOIN
670         COM     NFFLG
671         LDAA    #$1E
672         BSR     DELAY
673         BRA     GLP
674 GP1     LDAA    #$30
675         STAA    NFRQ2
676         BSR     NOIN
677         LDAA    #2
678         BSR     DELAY
679         RTS
680 DELAY   TAB
681         LDX     #$400
682 DLP1    TBA
683 DLP     DECA
684         BNE     DLP
685         DEX
686         CPX     #0
687         BNE     DLP1
688         LDAA    #$F0
689         STAA    NAMP
690         RTS
691 *
692 *WHITE NOISE ROUTINE
693 *NFRQ=INIT PERIOD, NAMP=INIT AMP, DECAY AMPLITUDE RATE
694 *CYCNT=CYCLE COUNT, NFFLG= FREQ DECAY FLAG
695 *NFFLG=0 NO FREQ CHANGE;=POS DECAY;=MINUS INC FREQ
696 *NOISE LOAD PROG-ENTER WITH XREG POINTING TO DATA
697 *
698 NOISLD  LDAA    X
699         STAA    CY2
700         LDAA    1,X
701         STAA    NAMP
702         LDAA    2,X
703         STAA    DECAY
704         LDAA    3,X
705         STAA    NFFLG
706         LDAA    4,X
707         STAA    NFRQ2
708 NEND    RTS
709 *
710 *LOAD NOISE AND GO
711 *
712 NOISLG  BSR     NOISLD
713 *
714 *NOISE INIT
715 *
716 NOIN    BSR     NSUB    CY2&NFRQ2 TO CYCNT&NFRQ
717 *
718 *NOISE LOOP
719 *
720 NO1     BSR     RNT     FREQ CHECK
721         LDAA    NFRQ    FREQ REINITED?
722         CMPA    NFRQ2
723         BNE     NO1     IF NOT KEEEP DELAYING
724         ROLB            RESTORE MAX AMPLITUDE TO NOISE
725         STAB    SOUND   OUTPUT TO DAC
726         BSR     NOISE1  PREPARE NEXT RAND NO
727         BSR     NOISE2
728         BSR     RNA     AMPLITUDE &CYCL3 COUNT CECK
729         TST     NAMP    SEE IF DONE
730         BEQ     NEND    RTS IF FINISHED
731         TST     CYCNT   SEE IF NEXT FREQ
732         BNE     NO1     IF NOT GO FREQ DELAY LOOP
733         TST     NFFLG   SEE IF SWEEP MODE
734         BEQ     NO1     IF NO SWEEP GO DELAY
735         BMI     NO3     SWEEP DOWN
736         INC     NFRQ2
737         BRA     NO1
738 NO3     DEC     NFRQ2
739         DEC     NFRQ
740         BRA     NO1
741 NSUB    CLR     CYCNT
742         LDAA    NFRQ2
743         STAA    NFRQ    NOISE FREQ
744         CLR     NNOIS
745         RTS
746 * 23 CYCLES FOR EACH SUBROUTINE PLUS CALLING OVERHEAD
747 *
748 *
749 NOISE1  LDAA            LO GET RANDOM BIT
750         LSRA
751         LSRA
752         LSRA
753         EORA    LO
754         STAA    ATP     INTERMED RAND NO
755         INX
756         ANDA    #$7     FOR 3 BIT RANDOM NO
757 *
758         RTS
759 *
760 NOISE2  LDAA    ATP
761         LSRA
762         ROR     HI
763         ROR     LO
764         LDAA    #$0
765         BCC     NOISE3
766         LDAA    NAMP
767 NOISE3  STAA    NNOIS   NEXT NOISE VALUE
768 *
769         RTS
770 *
771 RNT     LDAA    NFRQ2   NOISE FREQ
772         DEC     NFRQ
773         BEQ     NW0
774         INX
775         DEX     TEQ
776         BRA     NNW1
777 NW0     STAA    NFRQ    REINIT FREQ
778         LDAB    NNOIS   SAVE NEXT NOISE VAL IN B REG
779         LSRB            HALF AMPLITUDE
780         INC     CYCNT   NOISE CYCLE COUNT AT NAMP
781 *
782 NNW1    RTS
783 *
784 RNA     LDAA    CY2     NOISE AMPL CHANGE
785         CMPA    CYCNT
786         BEQ     NW2
787         INX
788         DEX
789         BRA     NW3     TEQ
790 NW2     CLR     CYCNT
791         LDAA    NAMP
792         SUBA    DECAY
793         STAA    NAMP
794 *
795 NW3     RTS
796 *
797 * NOISE WITH WHISTLE MAIN LOOP
798 NINIT   CLR     WFRQ
799         CLR     DFRQ
800         LDAA    #$E     CYCLE OFFSET FOR WHISTLE
801         STAA    WCNT
802         CLR     CURVAL  CLR WHISTLE VALUES
803 NINIT2  BSR     NSUB    CLR CYCNT AND INIT FREQ
804 WIN     BSR     NOISE1
805         JSR     TRIDR
806         BSR     NOISE2
807         JSR     TRIDR
808         BSR     RNT
809         BSR     TRIDR
810         BSR     RNA
811         BSR     TRIDR
812         BSR     TRICNT
813         BSR     TRIDR
814         BSR     TRIFRQ
815         BSR     TRIDR
816         BSR     NNW
817         BRA     WIN
818 *
819 TRICNT  LDAA    WCNT2   #CYCLES AT WHISTLE FREQ
820         DEC     WCNT
821         BEQ     NW4
822         FCB     $B6     LDAA EXTENDED
823         FDB     NAMP
824         BNE     NW5     TEQ
825         BRA     NSEND   END NOISE
826 NW4     STAA    WCNT
827         LDAA    WFRQ
828         ADDA    DFRQ
829         STAA    WFRQ
830 *
831 NW5     RTS
832 *
833 TRIFRQ  LDAA    WFRQ    WHISTLE END TEST
834         CMPA    MINWIS
835         BEQ     NW6
836         INX     TEQ
837         LDAA    NAMP    END TEST
838         BNE     NW7     TEQ
839         BRA     PEND    END NOISE
840 NW6     CLR     WFRQ    TURN OFF WHISTLE
841         CLR     DFRQ
842         CLR     CURVAL
843         LDX     PTRHI   SET UP FOR NEXT WHISTLE
844 WISLD   LDAA    X
845         STAA    WHIS
846         BEQ     NW7
847         LDAA    1,X
848         STAA    WFRQ2
849         LDAA    2,X
850         STAA    DFRQ2
851         LDAA    3,X
852         STAA    WCNT2
853         LDAA    4,X
854         STAA    MINWIS
855         LDAA    #5
856         JSR     ADDX
857         STX     PTRHI
858 *
859 NW7     RTS
860 PEND    PULA
861         PULA            STACK ADJ
862         RTS
863 *
864 NNW     LDAA    WHIS    WHISTLE INIT
865         BEQ     NW8     ALREADY INITED
866         CMPA    NAMP
867         BNE     NW9
868         BRA     WINIT   GO INIT WHISTLE
869 NW8     INX
870         DEX     TEQ
871 NW9     RTS
872 WINIT   CLR     WHIS
873         LDAA    WFRQ2
874         STAA    WFRQ
875         LDAA    DFRQ2
876         STAA    DFRQ
877         RTS
878 ******************
879 TRIDR   LDAA    CURVAL
880         ADDA    WFRQ
881         STAA    CURVAL
882         BPL     GO
883         COMA
884 GO      ABA
885         STAA    SOUND
886 NSEND   RTS
887 *
888
889 *
890 *LIGHTNING
891 *
892 LITE    LDAA    #1
893         STAA    DFREQ
894         LDAB    #3
895         BRA     LITEN
896 *
897 *LIGHTNING+APPEAR NOISE ROUTINE
898 *
899 LITEN   STAA    LFREQ
900         LDAA    #$FF    HIGHEST AMP
901         STAA    SOUND
902         STAB    CYCNT
903 LITE0   LDAB    CYCNT
904 LITE1   LDAA    LO      GET RANDOM
905         LSRA
906         LSRA
907         LSRA
908         EORA    LO
909         LSRA
910         ROR     HI
911         ROR     LO
912         BCC     LITE2
913         COM     SOUND
914 LITE2   LDAA    LFREQ   COUNT FREQ
915 LITE3   DECA
916         BNE     LITE3
917         DECB            COUNT CYCLES
918         BNE     LITE1
919         LDAA    LFREQ
920         ADDA    DFREQ
921         STAA    LFREQ
922         BNE     LITE0
923         RTS
924 *
925 *
926 *WHITE NOISE ROUTINE
927 *X=INIT PERIOD, ACCB=INIT AMP, ACCA DECAY RATE
928 *CYCNT=CYCLE COUNT, NFFLG= FREQ DECAY FLAG
929 *
930 MOISE   STAA    DECAY
931 MOISE0  STX     NFRQ1
932 MOIS00  STAB    NAMP
933         LDAB    CYCNT
934 MOISE1  LDAA    LO      GET RANDOM BIT
935         LSRA
936         LSRA
937         LSRA
938         EORA    LO
939         LSRA
940         ROR     HI
941         ROR     LO
942         LDAA    #$0
943         BCC     MOISE2
944         LDAA    NAMP
945 MOISE2  STAA    SOUND
946         LDX     NFRQ1   INCREASING DELAY
947 MOISE3  DEX
948         BNE     MOISE3
949         DECB            FINISH CYCLE COUNT?
950         BNE     MOISE1  NO
951         LDAB    NAMP    DECAY AMP
952         SUBB    DECAY
953         BEQ     MSEND
954         LDX     NFRQ1   INC FREQ
955         INX
956         LDAA    NFFLG   DECAY FREQ?
957         BEQ     MOIS00  NO
958         BRA     MOISE0
959 MSEND   RTS     
960 *
961 *
962 *PARAMETER TRANSFER
963 *
964 TRANS   PSHA
965 TRANS1  LDAA    0,X
966         STX     XPLAY
967         LDX     XPTR
968         STAA    0,X
969         INX
970         STX     XPTR
971         LDX     XPLAY
972         INX
973         DECB
974         BNE     TRANS1
975         PULA
976         RTS
977 *
978 *
979 *GWAVE LOADER
980 *
981 GWLD    TAB             MULKT BY 7
982         ASLB
983         ABA
984         ABA
985         ABA
986         LDX     #SVTAB  SOUND VECTOR TABLE
987         JSR     ADDX
988         LDAA    ,X
989         TAB
990         ANDA    #$F
991         STAA    GCCNT   GET CYCLE COUNT
992         LSRB
993         LSRB
994         LSRB
995         LSRB
996         STAB    GECHO   GET #ECHOS
997         LDAA    1,X
998         TAB
999         LSRB
1000         LSRB
1001         LSRB
1002         LSRB
1003         STAB    GECDEC
1004         ANDA    #$F     WAVE #
1005         STAA    TEMPA   SAVE
1006         STX     TEMPX   SAVE INDEX
1007         LDX     #GWVTAB CALC WAVEFORM ADDR
1008 GWLD2   DEC     TEMPA   WAVE FORM #
1009         BMI     GWLD3   FINIS
1010         LDAA    ,X
1011         INCA
1012         JSR     ADDX
1013         BRA     GWLD2
1014 GWLD3   STX     GWFRM
1015         JSR     WVTRAN  XSFER WAVE TO RAM
1016         LDX     TEMPX   RESTORE INDEX
1017         LDAA    2,X     GET PREDECAY
1018         STAA    PRDECA
1019         JSR     WVDECA  DECAY IT
1020         LDX     TEMPX
1021         LDAA    3,X     GET FREQ INC
1022         STAA    GDFINC
1023         LDAA    4,X     GET DELTA FREQ COUNT
1024         STAA    GDCNT
1025         LDAA    5,X     GET PATTERN COUNT
1026         TAB             SAVE
1027         LDAA    6,X     PATTERN OFFSET
1028         LDX     #GFRTAB
1029         JSR     ADDX
1030         TBA             GET PATTERN LENGTH
1031         STX     GWFRQ   FREQ TABLE ADDR
1032         CLR     FOFSET
1033         JSR     ADDX
1034         STX     FRQEND
1035         RTS
1036 *
1037 *GWAVE ROUTINE
1038 *ACCA= FREQ PATTERN LENGTH, X= FREQ PAT ADDR
1039 *
1040 GWAVE   LDAA    GECHO
1041         STAA    GECNT
1042 GWT4    LDX     GWFRQ
1043         STX     XPLAY
1044 GPLAY   LDX     XPLAY   GET NEW PERIOD
1045         LDAA    ,X
1046         ADDA    FOFSET
1047         STAA    GPER
1048         CPX     FRQEND
1049         BEQ     GEND    FINISH ON ZERO
1050         LDAB    GCCNT   CYCLE COUNT
1051         INX
1052         STX     XPLAY
1053 GOUT    LDX     #GWTAB  SETUP WAVEFORM POINTER
1054 GOUTLP  LDAA    GPER
1055 GPRLP   DECA            WAIT FOR PERIOD
1056         BNE     GPRLP
1057         LDAA    ,X      OUTPUT SOUND
1058         STAA    SOUND
1059 GPR1    INX
1060         CPX     WVEND   END OF WAVE?
1061         BNE     GOUTLP
1062         DECB
1063         BEQ     GPLAY
1064         INX
1065         DEX
1066         INX
1067         DEX
1068         INX
1069         DEX
1070         INX
1071         DEX
1072         NOP
1073         NOP
1074         BRA     GOUT    SYNC 36
1075 GEND    LDAA    GECDEC
1076         BSR     WVDECA
1077 GEND40  DEC     GECNT   ECHO ON?
1078         BNE     GWT4    YES
1079         BNE     GEND1
1080 GEND50  LDAA    GDFINC  CONTINUE FOR FREQ MOD SOUNDS
1081         BEQ     GEND1   NO
1082         DEC     GDCNT   DELTA FREQ OVER?
1083         BEQ     GEND1   YES...
1084         ADDA    FOFSET  UPDATE FREQ OFFSET
1085 GEND60  STAA    FOFSET
1086 GEND61  LDX     GWFRQ   GET INDEX
1087         CLRB            START FOUND FLAG INIT CLEAR
1088 GW0     LDAA    FOFSET  INC OR DEC?
1089         TST     GDFINC
1090         BMI     GW1     DEC
1091         ADDA    ,X      INC
1092         BCS     GW2     CARRY=OVERFLOW
1093         BRA     GW2A
1094 GW1     ADDA    ,X      DEC
1095         BEQ     GW2     OVERFLOW ON EQ
1096         BCS     GW2A    OVERFLOW IF CARRY CLEAR
1097 GW2     TSTB            FOUND START YET?
1098         BEQ     GW2B    NO
1099         BRA     GW3     YES, THIS IS THE END
1100 GW2A    TSTB
1101         BNE     GW2B    ALREADY FOUND START
1102         STX     GWFRQ   FOUND START
1103         INCB
1104 GW2B    INX
1105         CPX     FRQEND
1106         BNE     GW0     NOT OVER YET
1107         TSTB            FOUND START?
1108         BNE     GW3     YES
1109         RTS             ALL OVER
1110 GW3     STX     FRQEND
1111         LDAA    GECDEC  RE:XSFER WAVE?
1112         BEQ     GEND0   NO
1113         BSR     WVTRAN  XSFER WAVE
1114         LDAA    PRDECA
1115         BSR     WVDECA
1116 GEND0   JMP     GWAVE
1117 GEND1   RTS             TERMINATE
1118 *
1119 *WAVE TRANSFER ROUTINE
1120 *
1121 WVTRAN  LDX     #GWTAB
1122         STX     XPTR
1123         LDX     GWFRM
1124         LDAB    ,X      GET WAVE LENGTH
1125         INX
1126         JSR     TRANS
1127         LDX     XPTR
1128         STX     WVEND   GET END ADDR
1129         RTS
1130 *
1131 *WAVE DECAY ROUTINE/ DECAY AMOUNT IN ACCA(1/16 PER DECAY)
1132 *
1133 WVDECA  TSTA
1134         BEQ     WVDCX   NO DECAY
1135         LDX     GWFRM   ROM WAVE INDEX
1136         STX     XPLAY
1137         LDX     #GWTAB
1138         STAA    TEMPB   DECAY FACTOR
1139 WVDLP   STX     XPTR
1140         LDX     XPLAY
1141         LDAB    TEMPB
1142         STAB    TEMPA   DECAY FACTOR TEMP
1143         LDAB    1,X     OFFSET FOR WAVE LENGTH
1144         LSRB
1145         LSRB
1146         LSRB
1147         LSRB            CALC 1/16TH
1148         INX
1149         STX     XPLAY
1150         LDX     XPTR
1151         LDAA    ,X
1152 WVDLP1  SBA             DECAY
1153         DEC     TEMPA
1154         BNE     WVDLP1
1155         STAA    ,X
1156         INX
1157         CPX     WVEND   END OF WAVE?
1158         BNE     WVDLP   NO
1159 WVDCX   RTS
1160 *
1161 * INTERRUPT PROCESSING
1162 *
1163 IRQ     LDS     #ENDRAM RE-INITIALIZE STACK
1164         LDAA    SOUND+2 GET INPUT TRIGGER
1165         LDX     #DECAYZ RANDY'S BRAIN DAMAGE
1166         STX     XDECAY
1167         LDX     #FREQ1
1168         STX     XPTR
1169         LDAB    #$AF
1170         STAB    AMP0
1171         CLI             NOW ALLOW IRQS
1172         COMA            INVERT INPUT
1173         ANDA    #$3F    MASK GARB
1174         TSTA
1175         BEQ     IRQ3
1176         DECA
1177         CMPA    #$12+2
1178         BHI     1$
1179         JSR     GWLD
1180         JSR     GWAVE
1181         BRA     IRQ3
1182 *
1183 1$      CMPA    #$1D+2
1184         BHI     3$
1185         SUBA    #$13+2
1186         LDX     #JMPTBL
1187         ASLA
1188         JSR     ADDX
1189         LDX     ,X
1190         JSR     ,X
1191         BRA     IRQ3
1192
1193 3$      CMPA    #$20+2
1194         BHI     4$
1195         SUBA    #$1E+2          NOISE REQUEST
1196         JSR     JKNOIS
1197         BRA     IRQ3
1198
1199 4$      CMPA    #$24+2
1200         BHI     IRQ3
1201         SUBA    #$21+2
1202         JSR     WALSH
1203
1204 IRQ3    BRA     *
1205 *
1206 * ADD A TO INDEX REGISTER
1207 *
1208 ADDX    STX     XPLAY
1209         ADDA    XPLAY+1
1210         STAA    XPLAY+1
1211         BCC     ADDX1
1212         INC     XPLAY   
1213 ADDX1   LDX     XPLAY
1214         RTS
1215 *
1216 * DIAGNOSTIC PROCESSING HERE
1217 *
1218 NMI     SEI
1219         LDS     #ENDRAM RESET THE STACK
1220         LDX     #$FFFF
1221         CLRB
1222 NMI1    ADCB    0,X
1223         DEX
1224         CPX     #$F000
1225         BNE     NMI1
1226         CMPB    0,X
1227         BEQ     NMI2
1228         WAI
1229 NMI2    JSR     KNOCK
1230         BRA     NMI     KEEP LOOPING
1231 *
1232 *SPECIAL ROUTINE JUMP TABLE
1233 *
1234 JMPTBL  FDB     LITE                            $14
1235         FDB     SND4,SND5,THNDR,ATARI            15,16,17,18
1236         FDB     PERK$$,SQRT                      19,1A
1237         FDB     KNOCK,WHIST                      1B,1C
1238         FDB     SETUP,WINGDN                     1D,1E
1239 *
1240 *VARI VECTORS
1241 *
1242 VVECT   EQU     *
1243 *       NONE AS OF YET
1244 *
1245 *
1246 *WAVE TABLE
1247 *1ST BYTE= WAVELENGTH
1248 *
1249 GWVTAB  EQU     *
1250 GS2     FCB     8,127,217,255,217,127,36,0,36
1251 GSSQ2   FCB     8,0,64,128,0,255,0,128,64
1252 GS1     FCB     16,127,176,217,245,255,245,217,176
1253         FCB     127,78,36,9,0,9,36,78
1254 GS12    FCB     16,127,197,236,231,191,141,109,106
1255         FCB     127,148,146,113,64,23,18,57
1256 GSQ22   FCB     16,$FF,$FF,$FF,$FF,0,0,0,0
1257         FCB     $FF,$FF,$FF,$FF,0,0,0,0
1258 GS72    FCB     72,138,149,160,171,181,191,200,209
1259         FCB     218,225,232,238,243,247,251,253,254,255
1260         FCB     254,253,251,247,243,238,232,225,218
1261         FCB     209,200,191,181,171,160,149,138,127
1262         FCB     117,106,95,84,74,64,55,46,37,30,23,17,12
1263         FCB     8,4,2,1,0
1264         FCB     1,2,4,8,12,17,23,30,37,46,55,64,74,84
1265         FCB     95,106,117,127
1266 GS1.7   FCB     16,89,123,152,172,179,172,152,123
1267         FCB     89,55,25,6,0,6,25,55
1268 *****************************************************
1269 GSQ2    FCB     8,$FF,$FF,$FF,$FF,$00,$00,$00,$00
1270 GS1234  FCB     16,118,255,184,208,157,230,106,130
1271         FCB     118,234,129,134,78,156,50,99
1272 MW1     FCB     16,0,$F4,0,$E8,0,$DC,0,$E2
1273         FCB     0,$DC,0,$E8,0,$F4,0,0
1274 SIN3.SR FCB     36                                      WAVE C
1275         FCB     $7F,$B0,$D6,$E8,$E3,$C9,$A3,$7B,$5E,$54,$5E,$7B
1276         FCB     $A3,$C9,$E3,$E8,$D6,$B0,$7F,$4C,$26,$14,$19,$33
1277         FCB     $5A,$81,$9E,$A8,$9E,$81,$5A,$33,$19,$14,$26,$4C
1278
1279 *
1280 *GWAVE SOUND VECTOR TABLE
1281 *VECTOR FORMAT
1282 *BYTE 0: GECHO,GCCNT
1283 *BYTE 1: GECDEC,WAVE#
1284 *BYTE 2: PREDECAY FACTOR
1285 *BYTE 3: GDFINC
1286 *BYTE 4: VARIABLE FREQ COUNT
1287 *BYTE 5: FREQ PATTERN LENGTH
1288 *BYTE 6: FREQ PATTERN OFFSET
1289 *
1290 SVTAB   EQU     *
1291 DP1V    FCB     $11,$05,$11,1,15,1,SWPAT-GFRTAB         1
1292 PROTV   FCB     $21,$35,$11,$FF,0,13,SPNSND-GFRTAB      2
1293 SPNRV   FCB     $15,$00,0,$FD,0,1,SPNR-GFRTAB           3
1294 CLDWNV  FCB     $31,$11,0,1,0,3,COOLDN-GFRTAB           4
1295 ED10    FCB     $F6,$53,3,0,2,6,ED10FP-GFRTAB           5
1296 HUNV    FCB     $14,$17,$00,$00,$00,14,HBTSND-GFRTAB    6
1297 STRT    FCB     $13,$10,$00,$FF,$00,09,YUKSND-GFRTAB    7
1298 BMPV    FCB     $F2,$19,$00,$00,$00,22,BWSSND-GFRTAB    8
1299 SF10    FCB     $41,$02,$D0,$00,$00,39,STDSND-GFRTAB    9
1300 SV0     FCB     $52,$36,$00,$00,$00,$10,HBDSND-GFRTAB   A
1301 SV1     FCB     $73,$29,$03,$00,$00,$10,GVA1-GFRTAB     B
1302 SV2     FCB     $11,$40,$03,$ED,$09,$09,TRBPAT-GFRTAB   C
1303 SVA     FCB     $16,$82,$03,$0E,$01,$0E,GV27-GFRTAB     D
1304 SVB     FCB     $11,$29,$00,$F0,$05,$08,GVB1-GFRTAB     E
1305 SVF     FCB     $63,$26,$06,$00,$00,$10,GVA1-GFRTAB     F
1306         FCB     $21,$25,$00,$03,$0A,03,COOLDN-GFRTAB    10
1307         FCB     $43,$0A,$00,$04,$02,13,SPNSND-GFRTAB    11
1308 ED17    FCB     $1F,$12,$00,$FF,$10,04,SPNR-GFRTAB      12
1309 CYNEW   FCB     $11,$10,$00,$0A,$00,01,YUKSND-GFRTAB    13
1310 WIRDV   FCB     $21,$30,$00,$FF,$00,27,HBTSND-GFRTAB    14
1311 WIRDV2  FCB     $22,$21,$00,$FE,$00,27,HBTSND-GFRTAB    15
1312
1313 *GWAVE FREQ PATTERN TABLE
1314 *
1315 GFRTAB  EQU     *
1316 *HUNDRED POINT SOUND
1317 HBTSND  FCB     1,1,2,2,4,4,8,8,$10,$10,$30,$60,$C0,$E0
1318 *SPINNER SOUND
1319 SPNSND  FCB     1,1,2,2,3,4,5,6,7,8,9,$A,$C
1320 *TURBINE START UP
1321 TRBPAT  FCB     $80,$7C,$78,$74,$70,$74,$78,$7C,$80
1322 *HEARTBEAT DISTORTO
1323 HBDSND  FCB     1,1,2,2,4,4,8,8,$10,$20,$28
1324         FCB     $30,$38,$40,$48,$50,$60,$70,$80,$A0,$B0,$C0
1325 *SWEEP PATTERN
1326 SWPAT   EQU     *
1327 *BIGBEN SOUNDS
1328 BBSND   FCB     8,64,8,64,8,64,8,64,8,64
1329         FCB     8,64,8,64,8,64,8,64,8,64
1330 *SPINNER SOUND "DRIP"
1331 SPNR    FCB     $40
1332 *COOL DOWNER
1333 COOLDN  FCB     $10,8,1
1334 *START DISTORTO SOUND
1335 STDSND  FCB     1,1,1,1,2,2,3,3,4,4,5,6,8,$A,$C,$10
1336         FCB     $14,$18,$20,$30,$40,$50,$40,$30
1337         FCB     $20,$10,$C,$A,8,7,6,5,4,3,2,2,1,1,1
1338 *ED'S SOUND 10
1339 ED10FP  FCB     7,8,9,$A,$C,8
1340 GV27    FCB     $0C
1341 YUKSND  FCB     $8,$80,$10,$78,$18,$70,$20,$60,$28,$58,$30
1342         FCB     $50,$40,$48,$00
1343 BWSSND  FCB     $01,$40,$02,$42,$3,$43,$4,$44,$5,$45,$6,$46,$7,$47
1344         FCB     $8,$48,$9,$49,$A,$4A,$B,$4B,$00
1345 GVA1    FCB     $14,$18,$20,$30,$40,$50,$40,$30
1346         FCB     $20,$10,$0C,$0A,$08,$07,$06,$05
1347 GVB1    FCB     $CC,$BB,$60,$10,$EE,$AA,$50,$00
1348
1349 *       AND THE EVER POPULAR COPYRIGHT MESSAGE
1350         FCC     "(C)1982 WILLIAMS ELECTRONICS"
1351
1352 *       NAM     WALSH FUNCTION SOUND MACHINE V2
1353
1354 * T. MURPHY  11/10/81
1355
1356 MINPER  EQU     25      6*25 = 150 MICROSECS IS MIN SAMPLE PERIOD
1357 SOUND   SET     $400
1358
1359 WORG
1360         ORG     0
1361
1362         RMB     8       GLOBALS
1363
1364 FCMDPT  RMB     2       PTR TO CURRENT FILTER COMMAND (USER INITIALIZED)
1365 PCMDPT  RMB     2       SAME FOR PITCH PROGRAM
1366 SMPPER  RMB     2       HI BYTE * 6 IS SAMPLE DELAY
1367 HRMTBL  RMB     2       PTR TO HARMONIC FN VALUE TABLE
1368
1369 WAVSRT  RMB     16      WAVEFORM
1370
1371 PERVEL  RMB     2       ADDED TO SMPPER EACH WAVE (PITCH CONTROL)
1372 GLBPRO  RMB     1       GLOBAL PERIOD OFFSET
1373 TMPPER  RMB     1       = SMPPER + GLBPRO
1374 PERACM  RMB     1       USED TO CALCULATE SMALL PITCH ADJUSTS
1375
1376 PWVCNT  EQU     *       #OF WAVES TO PLAY BEFORE NEXT PITCH CMD (P PROGRAM)
1377 PSTK    RMB     2       TOP OF PITCH RETURN/COUNT STACK
1378 PWAVPT  RMB     2       PTR TO CURRENT SAMPLE BEING PLAYED
1379 PCMD    RMB     1       CURRENT PITCH CMD
1380 PTEMP   RMB     2
1381
1382 FVECT   RMB     3       JUMP TO CURRENT FILTER STATE (FILTER PGM CONTROL)
1383 FCNT    EQU     *       MISC CTR, WAVE DELAY IF <0
1384 FSTK    RMB     2       TOP OF FILTER RETURN/COUNT STACK
1385 HAPTR   RMB     2       PTR TO AMPLITUDE OF CURRENT HARMONIC
1386
1387 FWVPTR  RMB     2       PTS TO WAVE PT BEING ALTERED (FILTER GUTS)
1388 HAMP    RMB     1       CURRENT HARMONIC AMPLITUDE
1389 FMSK    RMB     1       BIT MASK SELECTS HARMONIC FN VALUE
1390 *                       NEXT 3 MUST BE IN ORDER
1391 FNHI    RMB     1       HOLDS CURRENT HARMONIC FN VALUES AS BITS
1392 FNLO    RMB     1       ALSO USED AS TEMPORARIES
1393 FCMD    RMB     1       CURRENT INSTRUCTION BEING EXECUTED
1394
1395 FBTM    EQU     *-3     FILTER STACK GROWS UP
1396         ORG     95
1397 PBTM    EQU     *       PITCH STACK GROWS DOWN
1398
1399         RMB     1       ADD2HA FOR CONST WAVE
1400 ADD2HA  RMB     8       ADD ADD2HA(8-I)*HARM(I) TO WAVE
1401 CNAMP   RMB     1       CURRENT AMP OF CONST FUNCTION
1402 CURHA   RMB     8       CURHA(8-I) = <WAVE!HARM(I)>
1403
1404 ENDRAM  SET     127
1405
1406         ORG     WORG
1407
1408         SUBTTL  WAVE PLAYER AND PITCH MODIFICATION
1409
1410 * PLAY A SAMPLE, REMAINING DELAY IN B.  TOTAL DELAY = MIN (60,B*6) MICS.
1411
1412 NTHRVC  SUBB    #13             LOOP DELAY IS 78 CYCLES
1413         PSHB
1414         JSR     FVECT   (62)
1415         PULB
1416
1417 NXTSMP  CMPB    #20             CALL HERE
1418         BHI     NTHRVC          MODIFY WAVE IF WE HAVE ENOUGH TIME
1419
1420         NOP
1421         LDAA    PERACM
1422         ADDA    PERVEL+1
1423         STAA    PERACM
1424         ADCB    #-10            MINIMUM DELAY + FRACTION
1425
1426         DECB                    WASTE SMALL TIME
1427         BPL     *-1
1428
1429         LDAA    PWAVPT+1        PT TO NEXT BYTE OF 16 BYTE WAVE
1430         INCA
1431         ANDA    #15
1432         ORAA    #WAVSRT         ! WAVSRT MUST BE DIVISIBLE BY 16 !
1433         STAA    PWAVPT+1
1434
1435         LDX     PWAVPT
1436         LDAB    ,X
1437         STAB    SOUND
1438
1439         ANDA    #15             0 IFF RESTARTING WAVE
1440         RTS
1441
1442 * PLAYS WAVE AND ALTERS PITCH ACCORDING TO PITCH CMDS.
1443 * SMPPER IS INITIAL PITCH,  PCMDPT IS START PITCH PROGRAM,
1444 * FCMDPT IS START WAVE MODIFIER (FILTER) PROGRAM.
1445
1446 WSM     CLRA
1447         LDX     #WAVSRT
1448         LDAB    #CURHA+8-WAVSRT
1449 1$      STAA    ,X
1450         INX
1451         DECB
1452         BNE     1$
1453         LDAB    #PBTM
1454         STAB    PSTK+1
1455         LDAB    #FBTM
1456         STAB    FSTK+1
1457         LDAB    #126
1458         STAB    FVECT
1459         LDX     #NXTFCM
1460         STX     FVECT+1
1461         LDAB    SMPPER
1462         STAB    TMPPER
1463
1464 PPLPE1  SUBB    #3
1465 PPLPE2  JSR     NXTSMP
1466         INX
1467
1468 PPLP    LDAB    TMPPER
1469         SUBB    #2              LOOP DELAY IS 18-6 = 12
1470         JSR     NTHRVC
1471         BNE     PPLP            ESCAPE ON WAVE BOUNDARY
1472
1473         LDAB    PERVEL  7 (ALL TIMES ARE SINCE RTS FROM LAST NXTSMP)
1474         LDAA    PERVEL+1
1475         ADDA    SMPPER+1        UPDATE SAMPLE RATE ONCE EACH WAVE PLAY
1476         ADCB    SMPPER
1477         STAA    SMPPER+1
1478         STAB    SMPPER  24
1479
1480         ADDB    GLBPRO
1481         LDAA    #MINPER         AVOID SYNC ERRORS BY LIMITING PITCH.
1482         CBA                     MAX. PITCH ALLOWS AT LEAST 1 FILTER
1483         BCC     *+3             CALL PER SAMPLE.
1484         FCB     129
1485         TAB
1486         STAB    TMPPER  41
1487         NOP
1488         SUBB    #9
1489         JSR     NXTSMP  54
1490
1491         LDAA    FCNT            COUNT WAVE PLAYS FOR FILTER
1492         TAB                     (ONLY IF <0)
1493         ASLA
1494         ADCB    #0
1495         STAB    FCNT    13
1496
1497         LDAB    TMPPER
1498         SUBB    #5
1499         LDAA    PWVCNT
1500         BPL     PAWAKE
1501
1502         INC     PWVCNT          UPDATE DELAY COUNT IF <0
1503         NOP
1504         BRA     PPLPE1  37
1505
1506 PAWAKE  DECB                    ELSE WE ARE ALIVE
1507         JSR     NXTSMP  36
1508
1509         LDX     PCMDPT
1510         LDAA    ,X
1511         BPL     PPLP1           MOST CMDS ARE >0
1512
1513         CMPA    #128
1514         BEQ     STOPR   19      EXCEPT FOR END = 128
1515
1516         INCA
1517         STAA    PWVCNT          OR A NEGATIVE NUMBER -N
1518         INX                     WHICH WAITS N WAVE PLAYS
1519         FCB     -1,0,PCMDPT     BEFORE FETCHING THE NEXT COMMAND
1520
1521 PPLP35  LDAB    TMPPER
1522         SUBB    #6
1523         JMP     PPLPE1  43
1524
1525 PPLP1   INX
1526         LDAB    ,X              GET NEXT CMD STRING BYTE ON STACK
1527         PSHB
1528         INX
1529         STX     PCMDPT  35
1530
1531         STAA    PCMD
1532         ANDA    #$70
1533         LSRA
1534         LSRA
1535         LSRA
1536         CLRB
1537
1538         ADDA    #PCMDJT!.255
1539         ADCB    #PCMDJT/256
1540         STAA    PTEMP+1
1541         STAB    PTEMP   61
1542
1543         LDAB    TMPPER
1544         LDAB    TMPPER
1545         SUBB    #13
1546         JSR     NXTSMP  78
1547
1548         CLRB
1549         LDX     PTEMP           EXECUTE CMD
1550         LDX     ,X
1551         JMP     ,X      16
1552
1553 * PITCH COMMAND ROUTINES.  UNLESS OTHERWISE STATED, N IS A SIGNED 8 BIT
1554 * NUMBER = BYTE FOLLOWING OPCODE.
1555
1556 * LDP N  IS  SMPPER := N,  ADP N  IS SMPPER := SMPPER + N
1557
1558 LDPR    LDAA    PCMD            BIT 0 = 1 FOR LOAD
1559         ASRA
1560         SBCB    #0
1561         ANDB    SMPPER
1562         PULA
1563         SBA
1564         ADDA    SMPPER
1565         STAA    SMPPER  39
1566         INX
1567 LDPRE   LDAB    TMPPER
1568         SUBB    #10
1569         JMP     PPLPE2  51
1570
1571 * LDO N IS  GLBPRO := N,  ADO N IS  GLBPRO := GLBPRO + N
1572
1573 LDOR    LDAA    PCMD            BIT 0 = 1 FOR LOAD
1574         ASRA
1575         SBCB    #0
1576         ANDB    GLBPRO
1577         PULA
1578         SBA
1579         ADDA    GLBPRO
1580         STAA    GLBPRO
1581         BRA     LDPRE
1582
1583 * ESC EXECUTES MACHINE LANGUAGE IMMEDIATELY FOLLOWING
1584
1585 ESCR    PULA
1586         LDX     PCMDPT
1587         DEX
1588         JMP     ,X      32
1589
1590 * STOP EITHER REPEATS A CALL, RETURNS FROM A CALL, OR ENDS SOUND.
1591
1592 STOPR   LDAA    PSTK+1
1593         CMPA    #PBTM
1594         BMI     *+3     28
1595         RTS
1596
1597         LDAB    TMPPER
1598         SUBB    #7
1599         JSR     NXTSMP  42
1600  
1601         LDX     PSTK
1602         DEC     2,X
1603         BMI     PRET    15      DONE
1604
1605         LDX     ,X              ELSE REPEAT
1606         LDAA    ,X
1607         PSHA
1608         INX
1609         STX     PCMDPT  39
1610
1611         FCB     -10,0,TMPPER
1612         SUBB    #9
1613         JSR     NXTSMP  54
1614
1615         BRA     PTORE1
1616
1617 PRET    LDX     ,X
1618         INX
1619         STX     PCMDPT
1620         LDAA    PSTK+1
1621         ADDA    #3
1622         STAA    PSTK+1
1623
1624         LDAB    TMPPER
1625         SUBB    #7
1626         NOP
1627         JMP     PPLPE1  49
1628
1629 * LDV N IS  PERVEL := N,  ADV N IS  PERVEL := PERVEL + N
1630 * IN THIS CASE  N IS A 12 BIT NUMBER, THE UPPER 4 BITS OF WHICH
1631 * ARE LO 4 BITS OF THE OPCODE BYTE.
1632
1633 ADVR    INX
1634         BRA     *+6
1635
1636 LDVR    STAB    PERVEL          CLEAR PERVEL FOR LOAD
1637         STAB    PERVEL+1 24
1638
1639         LDAB    PCMD
1640         ANDB    #15             SIGN EXTEND
1641         ADDB    #-8
1642         EORB    #-8     34
1643
1644         PULA
1645         ADDA    PERVEL+1
1646         ADCB    PERVEL
1647         STAA    PERVEL+1
1648         STAB    PERVEL  52
1649
1650         FCB     -10,0,TMPPER
1651         SUBB    #9
1652         JMP     PPLPE1  61      
1653
1654 * DO R,N  CALLS RTN AT *+N  R TIMES.
1655
1656 PDOR    LDAA    PSTK+1
1657         SUBA    #3
1658         STAA    PSTK+1  25
1659
1660         LDX     PSTK
1661         LDAA    PCMDPT+1        STACK ENTRY PTS TO DISPLACEMENT
1662         LDAB    PCMDPT
1663         ADDA    #-1
1664         ADCB    #-1
1665         STAB    ,X
1666         STAA    1,X     53
1667         LDAB    PCMD            LO OPCODE BITS ARE REPEAT CNT
1668         ANDB    #15
1669         STAB    2,X     64
1670
1671         LDAB    TMPPER
1672         SUBB    #12
1673         JSR     NXTSMP  78
1674
1675         INX                     SYNC W/NEXT RTN
1676 PTORE1  INX
1677         INX
1678         CLRB
1679         NOP
1680
1681 * TO N  SETS LOC TO BE *+N.
1682
1683 PTOR    PULA            20
1684         ASRA
1685         ROLA
1686         SBCB    #0
1687         ADDA    PCMDPT+1
1688         ADCB    PCMDPT  
1689         STAA    PCMDPT+1
1690         FCB     -9,0,PCMDPT 41
1691
1692         LDAB    TMPPER
1693         SUBB    #7
1694         JMP     PPLPE1  49
1695
1696
1697 PCMDJT  FDB     LDPR,LDOR,LDVR,ADVR,LDPR,ESCR,PDOR,PTOR
1698 *                  0    1    2    3    4    5    6    7
1699 FCMDJT  FDB     ADHR,LDTR,ETBR,HIDR,FINR,ZTBR,FDOR,FTOR
1700
1701
1702         SUBTTL  WAVE MODIFICATION
1703
1704 * FENDR OVERLAY GETS RETURN ADDR FROM STACK.
1705
1706 FRTURN  LDX     FSTK
1707         LDX     3,X
1708         INX                     NEXT INSTR IS AFTER DISPLACEMENT BYTE
1709         STX     FCMDPT  19
1710         JSR     FCMDNX  41
1711         INX
1712         RTS
1713
1714 * REPEAT CALL.
1715
1716 FDOAGN  LDX     ,X              PT TO DISPLACEMENT BYTE
1717         STX     FCMDPT  35
1718         LDX     #FTOR           JUMP RTN IS NEXT
1719         STX     FVECT+1
1720         NOP
1721         RTS             50
1722
1723 * FIN DOES  REPEAT CALL, RETURN TO CALLER, STOP RTN DEPENDING ON STACK.
1724
1725 FINR    LDAA    FSTK+1
1726         CMPA    #FBTM
1727         BLS     ALLDON  9       LAST END STATEMENT
1728
1729         LDX     FSTK
1730         DEC     2,X             NO, CHECK TOP OF STACK
1731         BPL     FDOAGN  24      STILL REPEATING
1732
1733         SUBA    #3
1734         STAA    FSTK+1
1735         LDX     #FRTURN         ELSE RETURN
1736         STX     FVECT+1 38
1737         TST     ,X
1738         RTS
1739
1740 ALLDON  LDX     #WAST50
1741         STX     FVECT+1
1742         NOP             19
1743         BRA     WAST27
1744
1745 WAST50  INX
1746         INX
1747         NOP
1748 WAST40  BSR     WAST5
1749 WAST27  BSR     WAST5
1750 WAST14  TST     ,X
1751 WAST7   NOP
1752 WAST5   RTS
1753
1754 * CALL WITH REPEAT. REPEAT CNT 0(=1) TO 15 (=16) IS LO 4 BITS OF OPCODE.
1755 * NEXT BYTE IS DISPLACEMENT AS IN GO INSTRUCTION.  THE CTR AND RETURN
1756 * ADDRESS ARE SAVED ON A STACK.
1757
1758 FDOR    LDX     FSTK
1759         LDAA    FCMDPT          SAVE ADDR OF DISPLACEMENT BYTE
1760         STAA    3,X
1761         LDAA    FCMDPT+1
1762         STAA    4,X
1763         LDAA    FCMD
1764         ANDA    #15
1765         STAA    5,X     33
1766
1767         INX
1768         LDX     #1$
1769         STX     FVECT+1
1770         RTS             50
1771
1772 * OVERLAY FOR CALL RTN.
1773
1774 1$      LDAA    FSTK+1
1775         ADDA    #3
1776         STAA    FSTK+1
1777         LDX     #FTOR
1778         STX     FVECT+1 17      GET READY TO JUMP
1779         NOP
1780         BRA     WAST27
1781
1782 * GET NEXT FILTER COMMAND
1783
1784 NXTFCM  TST     FCNT
1785         BNE     WAST40          IN A DELAY
1786
1787         LDX     FCMDPT
1788         LDAA    ,X
1789         INX
1790         STX     FCMDPT
1791         STAA    FCMD
1792         BPL     1$      36
1793
1794         STAA    FCNT            NEGATIVE CMD IS NEG OF WAVE DELAY
1795         LDAA    ,X
1796         RTS             50
1797
1798 1$      LDX     #EXFCMD         POSITIVE IS FROM TABLE
1799         FCB     -1,0,FVECT+1
1800         RTS             50
1801
1802
1803 EXFCMD  CLRB
1804         LDAA    FCMD
1805         ANDA    #$70            B4 - B7 IS INSTRUCTION
1806         LSRA
1807         LSRA
1808         LSRA
1809         ADDA    #FCMDJT!.255
1810         ADCB    #FCMDJT/256
1811         STAB    FNHI
1812         STAA    FNLO    25
1813
1814         LDX     FNHI    
1815         LDX     ,X
1816         STX     FVECT+1
1817         STX     FVECT+1
1818         RTS             50
1819
1820 * SET UP FOR REPEATED TABLE ADD.
1821
1822 ETBR    LDAA    FCMD
1823         ANDA    #15
1824         INCA
1825         INCA
1826         STAA    FCNT
1827         BRA     FHA1    17
1828
1829 * LOOK FOR A NONZERO HARMONIC CHANGE AND PERFORM IT.  IF ENTIRE TABLE
1830 * IS ZERO WE HAVE FINISHED THE LAST COMMAND AND PICK UP THE NEXT ONE.
1831
1832 FINDHA  INC     HAPTR+1
1833         LDX     HAPTR
1834         CPX     #CNAMP          END TABLE?
1835         BEQ     FHA1    17
1836
1837         LDAA    ,X              NO, LOOK AT CURRENT ENTRY
1838         LDX     #ADDINI
1839         STAA    HAMP
1840         BEQ     *+5
1841         JMP     *+6
1842         LDX     #FINDHA         LOOK AGAIN IF 0
1843         STX     FVECT+1         SET FOR ADD IF <>0
1844         INX
1845         RTS
1846
1847 FHA1    LDAA    #ADD2HA-2       RESTART TABLE
1848         FCB     $B7,0,HAPTR+1
1849         LDX     #FINDHA         MAYBE REPEAT
1850         DEC     FCNT
1851         BEQ     *+5
1852         JMP     *+6
1853 FCMDNX  LDX     #NXTFCM 40
1854         STX     FVECT+1
1855         RTS
1856
1857 * RELATIVE JUMP.
1858
1859 FTOR    LDX     FCMDPT
1860         CLRB
1861         LDAA    ,X
1862         INCA                    DISPLACEMENT IS FROM NEXT INSTRUCTION
1863         ASRA
1864         ROLA
1865         SBCB    #0
1866         ADDA    FCMDPT+1
1867         ADCB    FCMDPT
1868         STAA    FCMDPT+1
1869         STAB    FCMDPT
1870
1871         BRA     FCMDNX  37
1872
1873 * SET UP FOR ADD OF HAMP * HARMONIC TO WAVE.
1874
1875 ADDINI  LDAA    HAPTR+1
1876         SUBA    #ADD2HA-1
1877         ASLA
1878         CLRB
1879         ADDA    HRMTBL+1        GET PTR TO HARMONIC IN FNHI, FNLO
1880         ADCB    HRMTBL
1881         STAB    FNHI
1882         STAA    FNLO    23
1883
1884         LDAA    #128
1885         STAA    FMSK
1886         
1887         LDX     #2$
1888         STX     FVECT+1 37
1889         LDX     #WAVSRT
1890         STX     FWVPTR
1891         RTS
1892
1893 2$      LDX     FNHI            GET HARMONIC FN TO FNHI,FNLO
1894         LDX     ,X
1895         STX     FNHI
1896         LDX     #ADDLP
1897         STX     FVECT+1 23
1898
1899         LDX     HAPTR
1900         LDAA    9,X
1901         ADDA    HAMP
1902         STAA    9,X     41      RECORD CHANGE
1903         INX
1904         RTS
1905
1906 * ADD HAMP * HARMONIC FN TO WAVEFORM.
1907
1908 ADDLP   LDAA    FMSK            MSK PTS TO CURRENT HARMONIC VALUE
1909         BEQ     1$              NEED NEW MASK AFTER 8 SAMPLES
1910
1911         LSR     FMSK
1912         LDX     FWVPTR
1913         LDAB    ,X
1914         ANDA    FNHI            ADD/SUBTRACT HAMP FROM SAMPLE ON
1915         BNE     2$      29      SIGN OF HARMONIC.
1916         FCB     -5,0,HAMP
1917         STAB    ,X
1918         INC     FWVPTR+1
1919         RTS             50
1920
1921 2$      FCB     -16,0,HAMP
1922         STAB    ,X
1923         INC     FWVPTR+1
1924         RTS
1925
1926 1$      LDAB    FWVPTR+1
1927         CMPB    #WAVSRT+16
1928         BEQ     3$      16      DONE
1929         LDAB    FNLO
1930         STAB    FNHI            ELSE SET FOR NEXT 8 SAMPLES
1931         LDAB    #128
1932         FCB     -9,0,FMSK
1933         BRA     16$     34
1934
1935 3$      LDX     #NXTFCM         RETURN TO THE RIGHT PLACE
1936         LDAB    FCNT
1937         BNE     *+5             FCNT <>0 MEANS IN TABLE LOOP
1938         JMP     *+6             FCNT = 0 MEANS EXECUTING COMMANDS
1939         LDX     #FINDHA
1940         STX     FVECT+1 34
1941
1942 16$     TST     ,X
1943         INX
1944         RTS
1945
1946 * ADH H,N  LDH H,N  USE SAME RTN
1947
1948 ADHR
1949 LDHR    LDAA    FCMD
1950         ANDA    #7              HARMONIC #
1951         ADDA    #ADD2HA
1952         STAA    HAPTR+1
1953
1954         LDX     FCMDPT
1955         LDAA    ,X
1956         INX
1957         STX     FCMDPT
1958         STAA    HAMP    33      SAVE VALUE
1959
1960         LDX     #1$
1961         STX     FVECT+1
1962         INX
1963         RTS
1964
1965 1$      LDX     HAPTR
1966         CLRB
1967         LDAA    FCMD
1968         ADDA    #-8             CARRY IF LD
1969         SBCB    #0
1970         ANDB    9,X             LD NEW = SUB OLD + ADD NEW
1971         NEGB
1972         ADDB    HAMP
1973         
1974 ADHRE   STAB    HAMP    27
1975         LDX     #ADDINI
1976         STX     FVECT+1
1977         INX
1978         INX
1979         NOP
1980         RTS     
1981
1982 * HARMONIC INCREMENT OR DECREMENT
1983
1984 HIDR    LDAB    FCMD
1985         LSRB
1986         ANDB    #7
1987         ORAB    #ADD2HA         ! ADD2HA MUST BE DIVISIBLE BY 8 !
1988         STAB    HAPTR+1         PT TO THIS HARMONIC
1989
1990         LDAB    #-1             CARRY IF INCREMENT (BIT 0 OF FCMD = 1)
1991         ADCB    #0
1992         ADCB    #0
1993         BRA     ADHRE   23
1994
1995 * CLEAR ADD2HA OR ALTER 0TH AMPLITUDE.
1996
1997 ZTBR    LDAA    FCMD            LO BIT 0 IF ZT
1998         ASRA
1999         BCS     ADCR
2000
2001         LDX     #0
2002         STX     ADD2HA
2003         STX     ADD2HA+2
2004         STX     ADD2HA+4
2005         STX     ADD2HA+6 32
2006         INX
2007
2008 ATBRE   LDX     #NXTFCM
2009         FCB     -1,0,FVECT+1
2010 ATBRE1  RTS
2011
2012 ADCR    BITA    #2
2013         BNE     ESC1    15      BIT 2 FCMD =1 FOR ESCAPE
2014         LDAB    #ADD2HA-1
2015         STAB    HAPTR+1 21
2016         LDX     #ADCRO
2017 ADCRE   STX     FVECT+1
2018         JMP     WAST14
2019
2020 ESC1    FCB     -2,0,FCMDPT
2021         BRA     ADCRE   24      
2022
2023 ADCRO   CLRB
2024         LDAA    FCMD
2025         ADDA    #-82            CARRY IF LDH
2026         SBCB    #0
2027         ANDB    CNAMP
2028         LDX     FCMDPT
2029         LDAA    ,X
2030         INX
2031         STX     FCMDPT  30
2032         SBA
2033         STAA    HAMP
2034         LDX     #ADDINI
2035         FCB     -1,0,FVECT+1
2036         RTS
2037
2038 * CHANGE SOME ADD2HA ENTRIES.
2039
2040 LDTR    LDAB    #ADD2HA         ASSUME FIRST ENTRY IS H #8
2041         STAB    HAPTR+1
2042         LDX     FCMDPT
2043         LDAB    ,X              EACH BIT INDICATES PRESENCE OF ENTRY
2044         STAB    FNHI
2045         INX
2046         STX     FCMDPT  28
2047         LDAB    FCMD            LO BIT 1 IF ENTRY FOR 0 IS PRESENT
2048         LSRB
2049         BCC     5$
2050         LDX     #6$
2051         STX     FVECT+1
2052         RTS
2053
2054 4$      CLRB
2055         LDAA    FNLO            LO BIT 0 IF REPLACE, 1 IF ADD TO CURRENT
2056         ASRA
2057         SBCB    #0
2058         LDX     HAPTR
2059         ANDB    ,X
2060         ABA
2061         STAA    ,X      26
2062         INC     HAPTR+1         PT TO NEXT GUY
2063         LDAA    ,X
2064
2065 5$      LDX     #1$
2066         STX     FVECT+1
2067         RTS
2068
2069 1$      ASL     FNHI
2070         BCS     2$
2071         BEQ     3$              NO MORE IF 0
2072         INC     HAPTR+1
2073         JMP     WAST27
2074
2075 3$      JSR     FCMDNX  36
2076         TST     ,X
2077         NOP
2078         RTS
2079
2080 6$      DEC     HAPTR+1         SET FOR 0TH ENTRY
2081         INX
2082
2083 2$      LDAA    ,X
2084         LDX     FCMDPT
2085         LDAA    ,X
2086         INX
2087         STX     FCMDPT  33
2088         STAA    FNLO
2089         LDX     #4$
2090         STX     FVECT+1
2091         RTS
2092                         
2093
2094 * FILTER TIMING
2095 * COMMAND       # OF FILTER CALLS TO EXECUTE
2096
2097 * LDH, ADH      24
2098
2099 * LDT, ADT      3+(2*N)  (N = # OF ENTRIES ALTERED)
2100
2101 * ZT            3
2102
2103 * DT  R         3+(R*{ 9+(22*NZH)})  WHERE
2104 *               R IS # OF TABLE REPEATS
2105 *               NZH IS # OF NONZERO ADD2HA ENTRIES
2106
2107 * IH, DH        23
2108
2109 * FIN           4  ( SAME FOR REPEAT AND RETURN)
2110
2111 * DO            5
2112
2113 * TO            3
2114
2115 * WAIT N        1+ (N* WAVE PERIOD)
2116
2117  NLIST
2118 * MACROS FOR PITCH AND FILTER COMMANDS MAKE DULL READING.
2119
2120 C MACRO "C
2121  LIST
2122 *                       "C
2123  NLIST
2124  ENDM
2125
2126 LBL MACRO "L,"C
2127  LIST
2128
2129 "L      EQU *           "C
2130  NLIST
2131  ENDM
2132
2133 ESC MACRO
2134  LIST
2135  FCB $55                ESC
2136  NLIST
2137  ENDM
2138
2139 WAIT MACRO "N
2140  LIST
2141  FCB     -"N            WAIT    "N
2142  NLIST
2143  ENDM
2144
2145 DO MACRO "R,"A
2146  LIST
2147  FCB 95+"R,"A-*-2       DO      "R,"A
2148  NLIST
2149  ENDM
2150
2151 TO MACRO "A
2152  LIST
2153  FCB 112,"A-*-2 TO      "A
2154  NLIST
2155  ENDM
2156
2157 * PITCH COMMANDS
2158
2159 LDP MACRO "N
2160  LIST
2161  FCB 1,"N               LDP     "N
2162  NLIST
2163  ENDM
2164
2165 ADP MACRO "N
2166  LIST
2167  FCB 0,"N               ADP     "N
2168  NLIST
2169  ENDM
2170
2171 LDV MACRO "N
2172 ZQ0 SET $2000+("N!.$FFF)
2173  LIST
2174  FDB ZQ0                LDV     "N
2175  NLIST
2176  ENDM
2177
2178 ADV MACRO "N
2179 ZQ0 SET $3000+("N!.$FFF)
2180  LIST
2181  FDB ZQ0                ADV     "N
2182  NLIST
2183  ENDM
2184
2185 LDO MACRO "N
2186  LIST
2187  FCB 17,"N              LDO     "N
2188  NLIST
2189  ENDM
2190
2191 ADO MACRO "N
2192  LIST
2193  FCB 16,"N              ADO     "N
2194  NLIST
2195  ENDM
2196
2197 STOP MACRO
2198  LIST
2199  FCB 128                STOP
2200  NLIST
2201  ENDM
2202
2203 NOT MACRO "N
2204  LIST
2205  FCB    "N              NOT     "N
2206  NLIST
2207  ENDM
2208
2209 * FILTER COMMANDS
2210
2211 FIN MACRO
2212  LIST
2213  FCB 64                 FIN
2214  NLIST
2215  ENDM
2216
2217 ADH MACRO "H,"N
2218  IFE "H
2219  LIST
2220  FCB    81,"N           ADH     0,"N
2221  NLIST
2222  ELSE
2223  LIST
2224  FCB 8-"H,"N            ADH     "H,"N
2225  NLIST
2226  ENDIF
2227  ENDM
2228
2229 LDH MACRO "H,"N
2230  IFE "H
2231  LIST
2232  FCB    83,"N           LDH     0,"N
2233  NLIST
2234  ELSE
2235  LIST
2236  FCB 16-"H,"N           LDH     "H,"N
2237  NLIST
2238  ENDIF
2239  ENDM
2240
2241 DT MACRO "R
2242  IFB <"R>
2243  LIST
2244  FCB 32                 DT
2245  NLIST
2246  ELSE
2247  LIST
2248  FCB 31+"R              DT      "R
2249  NLIST
2250  ENDIF
2251  ENDM
2252
2253 IH MACRO "H
2254  LIST
2255  FCB 65-"H-"H           IH      "H
2256  NLIST
2257  ENDM
2258
2259 DH MACRO "H
2260  LIST
2261  FCB 64-"H-"H           DH      "H
2262  NLIST
2263  ENDM
2264
2265 ZT MACRO
2266  LIST
2267  FCB 80                 ZT
2268  NLIST
2269  ENDM
2270
2271 LT MACRO "C,"0,"1,"2,"3,"4,"5,"6,"7,"8
2272 ZQ1 SET 16
2273 ZQ2 SET 0
2274  IRPC %I,012345678
2275 ZB%I SET 0
2276  ENDR
2277  LTA 0,"0
2278  LTA 1,"1
2279  LTA 2,"2
2280  LTA 3,"3
2281  LTA 4,"4
2282  LTA 5,"5
2283  LTA 6,"6
2284  LTA 7,"7
2285  LTA 8,"8
2286  LIST
2287  FCB ZQ1,ZQ2            LT <"0>,<"1>,<"2>,<"3>,<"4>,<"5>,<"6>,<"7>,<"8>
2288  NLIST
2289  LT"C
2290  ENDM
2291
2292 LTA MACRO "I,"H,"A,"P
2293 ZQ3 SET 0
2294  IFNB <"P>
2295 ZQ3 SET 1
2296  ENDIF
2297  IFNB <"H>
2298   IFE "H
2299 ZQ1 SET 17
2300   ELSE
2301 ZQ2 SET ZQ2!+(2!^("H-1))
2302   ENDIF
2303 ZB"I SET "A+"A+ZQ3
2304  ENDIF
2305  ENDM
2306
2307 LT0 MACRO
2308  LIST
2309  FCB ZB0
2310  NLIST
2311  ENDM
2312
2313 LT1 MACRO
2314  LIST
2315  FCB ZB0,ZB1
2316  NLIST
2317  ENDM
2318
2319 LT2 MACRO
2320  LIST
2321  FCB ZB0,ZB1,ZB2
2322  NLIST
2323  ENDM
2324
2325 LT3 MACRO
2326  LIST
2327  FCB ZB0,ZB1,ZB2
2328  FCB ZB3
2329  NLIST
2330  ENDM
2331
2332 LT4 MACRO
2333  LIST
2334  FCB ZB0,ZB1,ZB2
2335  FCB ZB3,ZB4
2336  NLIST
2337  ENDM
2338
2339 LT5 MACRO
2340  LIST
2341  FCB ZB0,ZB1,ZB2
2342  FCB ZB3,ZB4,ZB5
2343  NLIST
2344  ENDM
2345
2346 LT6 MACRO
2347  LIST
2348  FCB ZB0,ZB1,ZB2
2349  FCB ZB3,ZB4,ZB5
2350  FCB ZB6
2351  NLIST
2352  ENDM
2353
2354 LT7 MACRO
2355  LIST
2356  FCB ZB0,ZB1,ZB2
2357  FCB ZB3,ZB4,ZB5
2358  FCB ZB6,ZB7
2359  NLIST
2360  ENDM
2361
2362 LT8 MACRO
2363  LIST
2364  FCB ZB0,ZB1,ZB2
2365  FCB ZB3,ZB4,ZB5
2366  FCB ZB6,ZB7,ZB8
2367  NLIST
2368  ENDM
2369
2370  LIST
2371  NCLIST
2372
2373  SUBTTL SOUND PROGRAMS
2374
2375 * OPCODES ( ! SEPERATES NYBBLES  SPACES SEPERATE BYTES)
2376
2377 * COMMON
2378 * WAIT N        -N              ( 1<= N<= 127)
2379 * DO R,RTN      $6!(R-1)  RTN - NEXT LOC
2380 * TO RTN        $70   RTN - NEXT LOC
2381 * ESC           $55
2382
2383 * FREQUENCY CONTROL
2384 * STOP          $80
2385 * LDP N         $01 N
2386 * ADP N         $00 N
2387 * LDV N         $2!(N&$F00) N&255
2388 * ADV N         $3!(N&$F00) N&255
2389 * LDO N         $11 N
2390 * ADO N         $10 N
2391
2392 * WAVE CONTROL
2393 * FIN           $40
2394 * ZT            $50
2395 * ADH 0,N       $51 N
2396 * LDH 0,N       $53 N
2397 *       ( IN WHAT FOLLOWS 1<=H<=8  HHH = 8-H, A 3 BIT NUMBER)
2398 * ADH H,N       $0!0HHH
2399 * LDH H,N       $0!1HHH
2400 * IH H          $3!HHH1
2401 * DH H          $3!HHH0
2402 * DT R          $2!(R-1)
2403 * LT A0,...,A8  $1!000C 8765!4321 B0,...,B8
2404 *               WHERE C=1 IF ENTRY 0 IS ALTERED
2405 *                     N=1 IF ENTRY N IS ALTERED (N=1,...,8)
2406 *               BN=AN+AN+P WHERE P=1 IF AN IS TO BE ADDED TO ENTRY N
2407 *                                P=0 IF AN REPLACES ENTRY N
2408 *               BN IS PRESENT ONLY IF ENTRY N IS TO BE ALTERED
2409
2410 * HARMONIC FUNCTIONS.  EACH BIT POSITION CORRESPONDS TO A WAVEFORM
2411 * POSITION.  IF THE BIT = 0, THE VALUE IS +1  IF THE BIT = 1, THE
2412 * VALUE IS -1.
2413
2414 * THE HARMONICS ARE TREATED IN ORDER OF DECREASING AVERAGE FREQUENCY.
2415
2416 ODDTBL
2417  FDB %0000000000000000          0  CONSTANT IS WEIRDO FOR NOW
2418  FDB %0101010101010101          8
2419  FDB %1010101001010101          7
2420  FDB %0101101001011010          6
2421  FDB %1001011001101001          5
2422  FDB %0110011001100110          4
2423  FDB %1100110000110011          3
2424  FDB %0011110000111100          2
2425  FDB %0000111111110000          1
2426
2427 * WAVE PROGRAMS
2428
2429  NLIST
2430
2431  LBL SCREMW,<FPF>
2432  LT 7,<8,1>,<7,1>,<6,1>,<5,1>,<4,1>,<3,1>,<2,1>,<1,1>
2433  DT 16
2434  DT 16
2435  ZT
2436  LT 0,<8,-1>
2437  DT 16
2438  LT 0,<7,-1>
2439  DT 16
2440  LT 1,<8,0>,<6,-1>
2441  DT 16
2442  LT 1,<7,0>,<5,-1>
2443  DT 16
2444  LT 1,<6,0>,<4,-1>
2445  DT 16
2446  LT 1,<5,0>,<3,-1>
2447  DT 16
2448  LT 1,<4,0>,<2,-1>
2449  DT 16
2450  LT 1,<3,0>,<1,-1>
2451  DT 16
2452  LT 0,<2,0>
2453  DT 16
2454  LT 0,<1,0>
2455  DT 16
2456  TO SCREMW
2457
2458  LBL PPLD
2459  ADP 1
2460  ADP -1
2461  ADP -1
2462  ADP 1
2463  STOP
2464
2465  LBL SCREMP
2466  NOT 60
2467  LDV -512
2468  WAIT 16
2469  LDV 0
2470  WAIT 100
2471  LBL SCRMA
2472  LDV 80
2473  DO 13,PPLD
2474  LDV 64
2475  DO 4,PPLD
2476  STOP
2477
2478  LBL SCDNP
2479  NOT 28
2480  TO SCRMA
2481
2482  LBL SKIDW
2483  LDH 3,32
2484  LDH 4,48
2485  FIN
2486
2487  LBL PPVA
2488  ADP 2
2489  WAIT 1
2490  ADP -2
2491  WAIT 2
2492  STOP
2493
2494  LBL SKIDP
2495  NOT 48
2496  DO 4,PPVB
2497  LBL PPVC
2498  LDV -32
2499  DO 8,PPVA
2500  STOP
2501
2502  LBL PPVB
2503  ADV 2
2504  WAIT 2
2505  ADP -2
2506  WAIT 2
2507  ADP 2
2508  WAIT 2
2509  ADP -2
2510  WAIT 2
2511  ADP 2
2512  WAIT 2
2513  ADP -2
2514  WAIT 2
2515  ADP 6
2516  WAIT 3
2517  ADV -256
2518  WAIT 5
2519  ADV 256
2520  ADP 2
2521  STOP
2522
2523  LBL SKIDEP
2524  NOT 49
2525  LDV 6
2526  DO 1,PPVB
2527  TO PPVC
2528
2529  LIST
2530
2531 JNOIST  FCB 13,64,-16,-1,18     $1F WING UP
2532         FCB 8,168,24,1,8         20 CLIP
2533         FCB 4,168,24,1,16        21 CLOP
2534         FCB 4,32,-8,-1,32        1E WING DOWN PART 1
2535         FCB 16,-16,16,1,1       "               "  2
2536
2537 WINGDN  LDAA    #3
2538         BSR     JKNOIS
2539         LDAA    #4
2540
2541 JKNOIS  LDX     #$D939          GOOD SEED
2542         STX     HI
2543         TAB
2544         ASLA
2545         ASLA
2546         ABA
2547         LDX     #JNOIST
2548         JSR     ADDX
2549         JMP     NOISLG
2550
2551 WALSHT  FDB     SCREMW,SCREMP   $22 PTERODACTYL SCREAM
2552         FDB     SCREMW,SCDNP     23 END OF ABOVE
2553         FDB     SKIDW,SKIDP      24 OSTRICH STOP
2554         FDB     SKIDW,SKIDEP     25 END SKID FOR SHORT ONES
2555
2556 WALSH   CLRB
2557         STAB    SMPPER+1
2558         ASLA
2559         ASLA
2560         ADDA    #WALSHT!.255
2561         ADCB    #WALSHT/256
2562         STAB    PCMDPT
2563         STAA    PCMDPT+1
2564         LDX     PCMDPT
2565         LDX     X
2566         STX     FCMDPT
2567         LDX     PCMDPT
2568         LDX     2,X
2569         LDAB    X
2570         STAB    SMPPER
2571         INX
2572         STX     PCMDPT
2573         LDX     #ODDTBL
2574         STX     HRMTBL
2575         JMP     WSM
2576
2577
2578 *
2579 * VECTORS HERE
2580 *
2581         ORG     VECTOR
2582 IRQV    FDB     IRQ
2583 SWIV    FDB     SETUP
2584 NMIV    FDB     NMI
2585 RESETV  FDB     SETUP
2586         END     CKSUM