-
Notifications
You must be signed in to change notification settings - Fork 53
/
Copy pathvsndrm1.src
executable file
·1168 lines (1168 loc) · 30.4 KB
/
vsndrm1.src
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
* NOGEN
* NAM DEFENDER ;SOUNDS REV. 1.0 BY SAM D 10/80
*COPYRIGHT WILLIAMS ELECTRONICS 1980
*PROGRAM ORIGINATION DATE 10/24/80
*PROGRAM RELEASE 10/31/80
*PROGRAMMER: SAM DICKER
*
*SYSTEM CONSTANTS
*
ROM EQU $F800
SOUND EQU $400
CKORG EQU $F700 ;CHECKSUM PROG ORG
ENDRAM EQU $7F
VECTOR EQU $FFF8 ;RESET,INT VECTORS
WVELEN EQU 72
BG2MAX EQU 29
SP1SND EQU $0E ;SPINNER SOUND #1 CODE
B2SND EQU $12 ;BONUS SOUND #2 CODE
SP1MAX EQU 32
TACC EQU 4 ;TACCATA TEMPO CONSTANT
PHANC EQU 3 ;PHANTOM TEMPO CONTANT
TAF EQU 34715>>1 ;NOTE TIMES
TA EQU 36780>>1
TBF EQU 38967>>1
TB EQU 41284>>1
TC EQU 43739>>1
TCS EQU 46340>>1
TD EQU 49096>>1
TEF EQU 52015>>1
TE EQU 55108>>1
TF EQU 58385>>1
TFS EQU 61857>>1
TG EQU 65535>>1
*
* TALKING EQUATES
*
TALK EQU $EFFD ;ENTRY TO TALKING
TALKD EQU $EFFA ;ENTRY FOR DIAGNOSTICS
*
* SCREAM EQUATES
*
ECHOS EQU 4
FREQ EQU 0
TIMER EQU 1
*
*GLOBALS
*
ORG 0
TLKGL RMB 4 ;TALKING GLOBALS
BG1FLG RMB 1 ;BACKGROUND SOUND 1
BG2FLG RMB 1 ;BACKGROUND SOUND 2
SP1FLG RMB 1 ;SPINNER FLAG
B2FLG RMB 1 ;BONUS #2 FLAG
ORGFLG RMB 1 ;ORGAN FLAG
HI RMB 1 ;RANDOM SEED
LO RMB 1 ;RANDOM SEED
*
*TEMPORARIES
*
TMPRAM EQU * ;TEMPORARY RAM
TEMPX RMB 2 ;X TEMPS
XPLAY RMB 2
XPTR RMB 2
TEMPA RMB 1 ;ACCA TEMP
TEMPB RMB 1
LOCRAM EQU $0013
*
*GWAVE PARAMETERS
*
ORG LOCRAM
GECHO RMB 1 ;ECHO FLAG
GCCNT RMB 1 ;CYCLE COUNT
GECDEC RMB 1 ;# OF DECAYS PER ECHO
GDFINC RMB 1 ;DELTA FREQ INC
GDCNT RMB 1 ;DELTA FREQ COUNT
GWFRM RMB 2 ;WAVEFORM ADDRESS
*TEMPORARY OR COMPUTED PARAMETERS
PRDECA RMB 1 ;PRE-DECAY FACTOR
GWFRQ RMB 2 ;FREQ TABLE ADDR
FRQEND RMB 2 ;END ADDR FREQ TABLE
WVEND RMB 2 ;WAVE END ADDR
GPER RMB 1 ;PERIOD
GECNT RMB 1 ;# OF ECHOES COUNTER
FOFSET RMB 1 ;FREQUENCY OFFSET
*
*GWAVE TABLES
*
GWTAB RMB WVELEN ;WAVE TABLE
*
*VARIWAVE PARAMETERS
*
RORG LOCRAM
LOPER RMB 1 ;LO PERIOD
HIPER RMB 1 ;HIPERIOD
LODT RMB 1 ;PERIOD DELTAS
HIDT RMB 1
HIEN RMB 1 ;END PERIOD
SWPDT RMB 2 ;SWEEP PERIOD
LOMOD RMB 1 ;BASE FREQ MOD
VAMP RMB 1 ;AMPLITUDE
LOCNT RMB 1 ;PERIOD COUNTERS
HICNT RMB 1
REND
*
*NOISE ROUTINE PARAMETERS
*
RORG LOCRAM
DECAY RMB 1
NAMP RMB 1
CYCNT RMB 1
NFRQ1 RMB 2
NFFLG RMB 1
LFREQ RMB 1
DFREQ RMB 1
REND
*
*FILTERED NOISE ROUTINE PARAMETERS
*
RORG LOCRAM
FMAX RMB 1 ;MAXIMUM_FREQUENCY
FHI RMB 1 ;FREQUENCY
FLO RMB 1
SAMPC RMB 2 ;SAMPLE COUNT
FDFLG RMB 1 ;FREQUENCY DECREMENT FLAG
DSFLG RMB 1 ;DISTORTION FLAG
REND
*
*SCREAM TABLES
*
RORG LOCRAM
STABLE RMB 2*ECHOS ;SCREAM TABLE
SRMEND EQU *
REND
*
*ORGAN PARAMETERS
*
RORG LOCRAM
DUR RMB 2 ;NOTE DURATION
OSCIL RMB 1 ;OSCILLATORS
RDELAY RMB 60 ;RAM DELAY LOAD
REND
*
* CHECKSUM CALCULATOR & RELOCATOR
*
ORG CKORG
CKSUM LDS #$F7FF ;SET STACK POINTER
LDX #$FFFF ;INDEX TO END OF ROM
CLRB ;ZERO CHECKSUM
CKSUM1 ADCB 0,X ;ADD IN PROGRAM BYTE
DEX ;TO NEXT BYTE
CPX #$F800 ;DONE YET?
BNE CKSUM1 ;NOPE...
STAB 0,X ;SAVE CHECKSUM AT BEGINNING
STX FROM ;SAVE FOR RELO
LDX #$6800 ;DESTINATION
STX TO ;SAVE FOR LATER
RELO LDX FROM ;GET SOURCE
LDAA 0,X ;GRAB THE BYTE
INX ;UPDATE
STX FROM ;UPDATE SOURCE ADDRESS
LDX TO ;GET DESTINATION ADDRESS
STAA 0,X ;SAVE IT IN NEW LOCATION
INX ;UPDATE
STX TO ;UPDATE DESTINATION ADDRESS
LDX FROM ;GET THE SOURCE
BNE RELO ;KEEP MOVING
WAI ;TURN OFF LEDS
FROM RMB 2 ;FOR POINTER
TO RMB 2 ;FOR POINTER
*
* MAIN PROGRAM
*
ORG ROM
FCB $FF ;CHECKSUM BYTE
SETUP SEI ;SET INTERRUPT MASK
LDS #ENDRAM ;INITIALIZE STACK POINTER
LDX #SOUND ;INDEX TO PIA
CLR 1,X ;ACCESS DDRA
CLR 3,X ;ACCESS DDRB
LDAA #$FF ;PA0-PA7
STAA 0,X ;SET SIDE A AS OUTPUTS
CLR 2,X ;SET B SIDE AS INPUTS
LDAA #$37 ;CB2 LOW, IRQ ALLOWED
STAA 3,X ;PROGRAM B CONTROL REG
LDAA #$3C ;CA2 SET INIT HIGH, NO IRQS
STAA 1,X ;PROGRAM A SIDE
STAA HI ;START RANDOM GENERATOR
CLRA
STAA B2FLG
STAA BG1FLG
STAA BG2FLG
STAA SP1FLG
STAA ORGFLG
CLI ;CLEAR INTERRUPTS
BRA * ;WAIT FOR INTERRUPT
*
*VARI LOADER
*
VARILD TAB
ASLA ;X2
ASLA ;X4
ASLA ;X8
ABA ;X9
LDX #LOCRAM
STX XPTR ;SET XSFER
LDX #VVECT
JSR ADDX
LDAB #9 ;GET COUNT
VTRAN JMP TRANS
*
*VARIABLE DUTY CYCLE SQUARE WAVE ROUTINE
*
VARI LDAA VAMP
STAA SOUND
VAR0 LDAA LOPER
STAA LOCNT
LDAA HIPER
STAA HICNT
V0 LDX SWPDT
V0LP LDAA LOCNT ;LO CYCLE
COM SOUND
V1 DEX
BEQ VSWEEP
DECA
BNE V1
COM SOUND
LDAA HICNT ;HI CYCLE
V2 DEX
BEQ VSWEEP
DECA
BNE V2
BRA V0LP ;LOOP BACK
VSWEEP LDAA SOUND
BMI VS1
COMA
VS1 ADDA #0
STAA SOUND ;OUTPUT
LDAA LOCNT
ADDA LODT
STAA LOCNT
LDAA HICNT
ADDA HIDT
STAA HICNT
CMPA HIEN
BNE V0
LDAA LOMOD
BEQ VARX
ADDA LOPER
STAA LOPER
BNE VAR0
VARX RTS
*
*LIGHTNING
*
LITE LDAA #1
STAA DFREQ
LDAB #3
BRA LITEN
*
*APPEAR
*
APPEAR LDAA #$FE
STAA DFREQ
LDAA #$C0
LDAB #$10
BRA LITEN
*
*LIGHTNING+APPEAR NOISE ROUTINE
*
LITEN STAA LFREQ
LDAA #$FF ;HIGHEST AMP
STAA SOUND
STAB CYCNT
LITE0 LDAB CYCNT
LITE1 LDAA LO ;GET RANDOM
LSRA
LSRA
LSRA
EORA LO
LSRA
ROR HI
ROR LO
BCC LITE2
COM SOUND
LITE2 LDAA LFREQ ;COUNT FREQ
LITE3 DECA
BNE LITE3
DECB ;COUNT CYCLES
BNE LITE1
LDAA LFREQ
ADDA DFREQ
STAA LFREQ
BNE LITE0
RTS
*
*TURBO
*
TURBO LDAA #$20
STAA CYCNT
STAA NFFLG
LDAA #$1
LDX #1
LDAB #$FF
BRA NOISE
*
*WHITE NOISE ROUTINE
*X=INIT PERIOD, ACCB=INIT AMP, ACCA DECAY RATE
*CYCNT=CYCLE COUNT, NFFLG= FREQ DECAY FLAG
*
NOISE STAA DECAY
NOISE0 STX NFRQ1
NOIS00 STAB NAMP
LDAB CYCNT
NOISE1 LDAA LO ;GET RANDOM BIT
LSRA
LSRA
LSRA
EORA LO
LSRA
ROR HI
ROR LO
LDAA #$0
BCC NOISE2
LDAA NAMP
NOISE2 STAA SOUND
LDX NFRQ1 ;INCREASING DELAY
NOISE3 DEX
BNE NOISE3
DECB ;FINISH CYCLE COUNT?
BNE NOISE1 ;NO
LDAB NAMP ;DECAY AMP
SUBB DECAY
BEQ NSEND
LDX NFRQ1 ;INC FREQ
INX
LDAA NFFLG ;DECAY FREQ?
BEQ NOIS00 ;NO
BRA NOISE0
NSEND RTS
*
*BACKGROUND 1 ROUTINE
*
BG1 LDAB #1
STAB BG1FLG
CLRA
STAA DSFLG
BRA FNOISE
*
*THRUST
*
THRUST CLRA
STAA DSFLG
LDAB #3
BRA FNOISE
*
*CANNON
*
CANNON LDAA #1
STAA DSFLG
LDX #1000
LDAA #1
LDAB #$FF
BRA FNOISE
*
*FILTERED NOISE ROUTINE
*X=SAMPLE COUNT, ACCB=INITIAL MAX FREQ
*ACCA=FREQ DECAY FLAG ,DSFLG=DISTORTION FLAG
*
FNOISE STAA FDFLG
STAB FMAX
STX SAMPC
CLR FLO
FNOIS0 LDX SAMPC
LDAA SOUND
FNOIS1 TAB ;NEXT RANDOM NUMBER
LSRB
LSRB
LSRB
EORB LO
LSRB
ROR HI
ROR LO
LDAB FMAX ;SET FREQ
TST DSFLG
BEQ FNOIS2
ANDB HI ;DISTORT FREQUENCY
FNOIS2 STAB FHI
LDAB FLO
CMPA LO
BHI FNOIS4
FNOIS3 DEX ;SLOPE UP
BEQ FNOIS6
STAA SOUND
ADDB FLO
ADCA FHI
BCS FNOIS5
CMPA LO
BLS FNOIS3
BRA FNOIS5
FNOIS4 DEX ;SLOPE DOWN
BEQ FNOIS6
STAA SOUND
SUBB FLO
SBCA FHI
BCS FNOIS5
CMPA LO
BHI FNOIS4
FNOIS5 LDAA LO
STAA SOUND
BRA FNOIS1
FNOIS6 LDAB FDFLG
BEQ FNOIS1
LDAA FMAX ;DECAY MAX FREQ
LDAB FLO
LSRA
RORB
LSRA
RORB
LSRA
RORB
COMA
NEGB
SBCA #-1
ADDB FLO
ADCA FMAX
STAB FLO
STAA FMAX
BNE FNOIS0
CMPB #7
BNE FNOIS0
RTS
*
*RADIO
*
RADIO LDAA #RADSND/$100 ;SOUND TABLE
STAA XPTR
LDX #100 ;STARTING FREQ
STX TEMPX
RADIO1 ADDB TEMPX+1 ;ADD FREQ TO TIMER
LDAA TEMPA
ADCA TEMPX
STAA TEMPA
LDX TEMPX
BCS RADIO2
BRA *+2 ;EQUALIZE TIME
BRA RADIO3
RADIO2 INX ;CARRY?,RAISE FREQ
BEQ RADIO4 ;DONE?
RADIO3 STX TEMPX
ANDA #$F ;SET POINTER
ADDA #RADSND&$FF
STAA XPTR+1
LDX XPTR
LDAA 0,X
STAA SOUND ;PLAY SOUND
BRA RADIO1
RADIO4 RTS
*
*HYPER
*
HYPER CLRA
STAA SOUND
STAA TEMPA ;ZERO PHASE
HYPER1 CLRA ;ZERO TIME COUNTER
HYPER2 CMPA TEMPA
BNE HYPER3
COM SOUND ;PHASE EDGE?, COMPLEMENT SOUND
HYPER3 LDAB #18 ;DELAY
HYPER4 DECB
BNE HYPER4
INCA ;ADVANCE TIME COUNTER
BPL HYPER2
COM SOUND ;CYCLE DONE?, CYCLE EDGE
INC TEMPA ;NEXT PHASE
BPL HYPER1 ;DONE?
RTS
*
*SCREAM
*
SCREAM LDX #STABLE ;ZERO FREQS AND TIMES
SCREM1 CLR 0,X
INX
CPX #SRMEND
BNE SCREM1
LDAA #$40 ;START FIRST ECHO
STAA STABLE+FREQ
SCREM2 LDX #STABLE ;INITIALIZE COUNTER
LDAA #$80 ;INITIALIZE AMPLITUDE
STAA TEMPA
CLRB ;ZERO OUTPUT BUFFER
SCREM3 LDAA TIMER,X ;ADD FREQ TO TIMER
ADDA FREQ,X
STAA TIMER,X
BPL SCREM4 ;ADD AMPLITUDE IF MINUS
ADDB TEMPA
SCREM4 LSR TEMPA ;DECAY AMPLITUDE
INX ;NEXT ECHO
INX
CPX #SRMEND ;LAST ECHO?
BNE SCREM3
STAB SOUND ;OUTPUT SOUND
INC TEMPB ;ADVANCE TIMER
BNE SCREM2
LDX #STABLE ;LOWER NON-ZERO FREQUENCIES
CLRB ;ALL ZERO NOT FLAG
SCREM5 LDAA FREQ,X
BEQ SCREM7
CMPA #$37
BNE SCREM6
LDAB #$41 ;START NEXT ECHO
STAB FREQ+2,X
SCREM6 DEC FREQ,X
INCB ;SET FLAG
SCREM7 INX
INX
CPX #SRMEND
BNE SCREM5
TSTB ;DONE?
BNE SCREM2
RTS
*
*ORGAN TUNE
*
ORGANT DEC ORGFLG ;MINUS ORGAN FLAG
RTS
ORGNT1 CLR ORGFLG
STAA TEMPA ;TUNE NUMBER
LDX #ORGTAB
ORGNT2 LDAA 0,X ;TUNE TABLE LENGTH
BEQ ORGNT5 ;INVALID TUNE
DEC TEMPA
BEQ ORGNT3
INCA
JSR ADDX
BRA ORGNT2
ORGNT3 INX
STX XPTR ;NOTE POINTER
JSR ADDX
STX XPLAY ;TUNE END
LDX XPTR
ORGNT4 LDAA 0,X ;TUNE LOOP
STAA OSCIL
LDAA 1,X
LDX 2,X
STX DUR
BSR ORGANL
LDX XPTR
INX
INX
INX
INX
STX XPTR
CPX XPLAY
BNE ORGNT4
ORGNT5 JMP IRQ3
*
*ORGAN NOTE
*4 BYTES(MODE,OSCILLATOR MASK HI+1,LO+1,NOTE#)
ORGANN LDAA #3 ;SET ORGAN NOTE FLAG
STAA ORGFLG
RTS
ORGNN1 DEC ORGFLG
BEQ ORGNN2
LDAB OSCIL ;OSCILLATOR MASK
ASLB
ASLB
ASLB
ASLB
ABA
STAA OSCIL
CLRA
BRA * ;WAIT FOR NEXT CODE
ORGNN2 DECA ;DELAY
CMPA #11
BLS ORGNN3
CLRA
ORGNN3 LDX #NOTTAB
JSR ADDX
LDAA 0,X
LDX #$FFFF ;DURATION
STX DUR
BSR ORGANL
ORGNN4 BSR ORGAN ;KEEP PLAYING
BRA ORGNN4
*
*ORGAN LOADER
*OSCIL=OSCILLATOR MASK, ACCA=DELAY, DUR=DURATION
*
ORGANL LDX #RDELAY
LDLP CMPA #0
BEQ LD1
CMPA #3
BEQ LD2
LDAB #1 ;NOP
STAB 0,X
INX
SUBA #2
BRA LDLP
LD2 LDAB #$91 ;CMPA 0
STAB 0,X
CLR 1,X
INX
INX
LD1 LDAB #$7E ;JMP START2
STAB 0,X
LDAB #ORGAN1>>8 ;MSB
STAB 1,X
LDAB #ORGAN1&$FF ;LSB
STAB 2,X
*
*ORGAN ROUTINE
*DUR=DURATION, OSCILLATOR MASK
*
ORGAN LDX DUR
ORGAN1 CLRA
FCB $F6 ;LOAD B EXTND TEMPB
FDB TEMPB
INCB
STAB TEMPB
ANDB OSCIL ;MASK OSCILLATORS
LSRB
ADCA #0
LSRB
ADCA #0
LSRB
ADCA #0
LSRB
ADCA #0
LSRB
ADCA #0
LSRB
ADCA #0
LSRB
ADCA #0
ABA
ASLA
ASLA
ASLA
ASLA
STAA SOUND
DEX
BEQ ORGAN2 ;NOTE OVER?
JMP RDELAY
ORGAN2 RTS
*
*PARAMETER TRANSFER
*
TRANS PSHA
TRANS1 LDAA 0,X
STX XPLAY
LDX XPTR
STAA 0,X
INX
STX XPTR
LDX XPLAY
INX
DECB
BNE TRANS1
PULA
RTS
*
*BACKGROUND END ROUTINE
*
BGEND CLRA
STAA BG1FLG
STAA BG2FLG
RTS
*
*BACKGROUND SOUND #2 INCREMENT
*
BG2INC CLR BG1FLG ;KILL BG1
LDAA BG2FLG ;ACTIVATE BG2
ANDA #$7F ;REMOVE OVERRIDE
CMPA #BG2MAX
BNE BG2I0
CLRA
BG2I0 INCA
STAA BG2FLG
RTS
*
*BACKGROUND 2 ROUTINE
*
BG2 LDAA #(TRBV-SVTAB)/7 ;GET SOUND#
JSR GWLD
LDAA BG2FLG
ASLA
ASLA
COMA
JSR GEND60
BG2LP INC GDCNT
JSR GEND61
BRA BG2LP
*
*SPINNER #1 SOUND
*
SP1 LDAA #(CABSHK-VVECT)/9
JSR VARILD
LDAB SP1FLG
CMPB #SP1MAX-1
BNE SP1A
CLRB
SP1A INCB
STAB SP1FLG
LDAA #SP1MAX
SBA
CLRB
SP11 CMPA #20
BLS SP12
ADDB #14
DECA
BRA SP11
SP12 ADDB #5
DECA
BNE SP12
STAB LOPER
SP1LP JSR VARI ;DO IT
BRA SP1LP
*
*LASER BALL BONUS #2
*
BON2 LDAA B2FLG
BNE BON21
INC B2FLG
LDAA #(BONV-SVTAB)/7
BSR GWLD
BRA GWAVE
BON21 JMP GEND50
*
*GWAVE LOADER
*
GWLD TAB ;MULKT BY 7
ASLB
ABA
ABA
ABA
LDX #SVTAB ;SOUND VECTOR TABLE
JSR ADDX
LDAA 0,X
TAB
ANDA #$F
STAA GCCNT ;GET CYCLE COUNT
LSRB
LSRB
LSRB
LSRB
STAB GECHO ;GET #ECHOS
LDAA 1,X
TAB
LSRB
LSRB
LSRB
LSRB
STAB GECDEC
ANDA #$F ;WAVE #
STAA TEMPA ;SAVE
STX TEMPX ;SAVE INDEX
LDX #GWVTAB ;CALC WAVEFORM ADDR
GWLD2 DEC TEMPA ;WAVE FORM #
BMI GWLD3 ;FINIS
LDAA 0,X
INCA
JSR ADDX
BRA GWLD2
GWLD3 STX GWFRM
JSR WVTRAN ;XSFER WAVE TO RAM
LDX TEMPX ;RESTORE INDEX
LDAA 2,X ;GET PREDECAY
STAA PRDECA
JSR WVDECA ;DECAY IT
LDX TEMPX
LDAA 3,X ;GET FREQ INC
STAA GDFINC
LDAA 4,X ;GET DELTA FREQ COUNT
STAA GDCNT
LDAA 5,X ;GET PATTERN COUNT
TAB ;SAVE
LDAA 6,X ;PATTERN OFFSET
LDX #GFRTAB
JSR ADDX
TBA ;GET PATTERN LENGTH
STX GWFRQ ;FREQ TABLE ADDR
CLR FOFSET
JSR ADDX
STX FRQEND
RTS
*
*GWAVE ROUTINE
*ACCA= FREQ PATTERN LENGTH, X= FREQ PAT ADDR
*
GWAVE LDAA GECHO
STAA GECNT
GWT4 LDX GWFRQ
STX XPLAY
GPLAY LDX XPLAY ;GET NEW PERIOD
LDAA 0,X
ADDA FOFSET
STAA GPER
CPX FRQEND
BEQ GEND ;FINISH ON ZERO
LDAB GCCNT ;CYCLE COUNT
INX
STX XPLAY
GOUT LDX #GWTAB ;SETUP WAVEFORM POINTER
GOUTLP LDAA GPER
GPRLP DECA ;WAIT FOR PERIOD
BNE GPRLP
LDAA 0,X ;OUTPUT SOUND
STAA SOUND
GPR1 INX
CPX WVEND ;END OF WAVE?
BNE GOUTLP
DECB
BEQ GPLAY
INX
DEX
INX
DEX
INX
DEX
INX
DEX
NOP
NOP
BRA GOUT ;SYNC 36
GEND LDAA GECDEC
BSR WVDECA
GEND40 DEC GECNT ;ECHO ON?
BNE GWT4 ;YES
LDAA B2FLG ;STOP BONUS
BNE GEND1
GEND50 LDAA GDFINC ;CONTINUE FOR FREQ MOD SOUNDS
BEQ GEND1 ;NO
DEC GDCNT ;DELTA FREQ OVER?
BEQ GEND1 ;YES...
ADDA FOFSET ;UPDATE FREQ OFFSET
GEND60 STAA FOFSET
GEND61 LDX GWFRQ ;GET INDEX
CLRB ;START FOUND FLAG INIT CLEAR
GW0 LDAA FOFSET ;INC OR DEC?
TST GDFINC
BMI GW1 ;DEC
ADDA 0,X ;INC
BCS GW2 ;CARRY=OVERFLOW
BRA GW2A
GW1 ADDA 0,X ;DEC
BEQ GW2 ;OVERFLOW ON EQ
BCS GW2A ;OVERFLOW IF CARRY CLEAR
GW2 TSTB ;FOUND START YET?
BEQ GW2B ;NO
BRA GW3 ;YES, THIS IS THE END
GW2A TSTB
BNE GW2B ;ALREADY FOUND START
STX GWFRQ ;FOUND START
INCB
GW2B INX
CPX FRQEND
BNE GW0 ;NOT OVER YET
TSTB ;FOUND START?
BNE GW3 ;YES
RTS ;ALL OVER
GW3 STX FRQEND
LDAA GECDEC ;RE:XSFER WAVE?
BEQ GEND0 ;NO
BSR WVTRAN ;XSFER WAVE
LDAA PRDECA
BSR WVDECA
GEND0 JMP GWAVE
GEND1 RTS ;TERMINATE
*
*WAVE TRANSFER ROUTINE
*
WVTRAN LDX #GWTAB
STX XPTR
LDX GWFRM
LDAB 0,X ;GET WAVE LENGTH
INX
JSR TRANS
LDX XPTR
STX WVEND ;GET END ADDR
RTS
*
*WAVE DECAY ROUTINE/ DECAY AMOUNT IN ACCA(1/16 PER DECAY)
*
WVDECA TSTA
BEQ WVDCX ;NO DECAY
LDX GWFRM ;ROM WAVE INDEX
STX XPLAY
LDX #GWTAB
STAA TEMPB ;DECAY FACTOR
WVDLP STX XPTR
LDX XPLAY
LDAB TEMPB
STAB TEMPA ;DECAY FACTOR TEMP
LDAB 1,X ;OFFSET FOR WAVE LENGTH
LSRB
LSRB
LSRB
LSRB ;CALC 1/16TH
INX
STX XPLAY
LDX XPTR
LDAA 0,X
WVDLP1 SBA ;DECAY
DEC TEMPA
BNE WVDLP1
STAA 0,X
INX
CPX WVEND ;END OF WAVE?
BNE WVDLP ;NO
WVDCX RTS
*
* INTERRUPT PROCESSING
*
IRQ LDS #ENDRAM ;RE-INITIALIZE STACK
LDAA SOUND+2 ;GET INPUT TRIGGER
CLI ;NOW ALLOW IRQS
COMA ;INVERT INPUT
ANDA #$1F ;MASK GARB
LDAB ORGFLG
BEQ IRQ00
BPL IRQ0
JSR ORGNT1 ;ORGAN TUNE
IRQ0 DECA ;ORGAN NOTE
JSR ORGNN1
IRQ00 CLRB
CMPA #SP1SND
BEQ IRQ00A
STAB SP1FLG
IRQ00A CMPA #B2SND
BEQ IRQ000
STAB B2FLG
*
* CHECK FOR PRESENCE OF TALKING PROGRAM
*
IRQ000 LDAB TALK ;CHECK FOR PROGRAM TO BE THERE
CMPB #$7E ;IS IT?
BNE IRQ1 ;NO, SKIP THE TALKING
JSR TALK ;GO PLAY OUT 1 PHRASE
IRQ1 TSTA
BEQ IRQ3 ;INVALID INPUT
DECA ;REMOVE OFFSET
CMPA #$C
BHI IRQ10
JSR GWLD ;GWAVE SOUNDS
JSR GWAVE
BRA IRQ3
IRQ10 CMPA #$1B ;SPECIAL SOUND?
BHI IRQ20 ;VARI SOUND
SUBA #$D ;SUB OFFSET
ASLA ;DOUBLE FOR ADDRESSING
LDX #JMPTBL ;INDEX TO JUMP TABLE
BSR ADDX ;GET CORRECT INDEX
LDX 0,X ;GET ADDRESS TO INDEX
JSR 0,X ;PERFORM IT
BRA IRQ3
IRQ20 SUBA #$1C
JSR VARILD
JSR VARI
IRQ3 LDAA BG1FLG ;BGROUND ACTIVE?
ORAA BG2FLG
BEQ * ;NOPE
CLRA
STAA B2FLG ;KILL BONUSES
LDAA BG1FLG
BEQ IRQXX
JMP BG1
IRQXX JMP BG2
*
* ADD A TO INDEX REGISTER
*
ADDX STX XPLAY
ADDA XPLAY+1
STAA XPLAY+1
BCC ADDX1
INC XPLAY
ADDX1 LDX XPLAY
RTS
*
* DIAGNOSTIC PROCESSING HERE
*
NMI SEI
LDS #ENDRAM ;RESET THE STACK
LDX #$FFFF
CLRB
NMI1 ADCB 0,X
DEX
CPX #$F800
BNE NMI1
CMPB 0,X
BEQ NMI2
WAI
NMI2 LDAA #1
JSR VARILD
JSR VARI
LDAB TALKD ;TALKING PRESENT?
CMPB #$7E
BNE NMI
JSR TALKD
BRA NMI ;KEEP LOOPING
*