Add README.md
[pdp8.git] / sw / music / prog / MUSIC.PA
CommitLineData
81e70d48
PH
1\f
2\f
3/MUSIC COMPILER
4/RICH WILSON, 1975
5/FOR CCL USE: SAVE SYS MUSIC;201=400
6
7VERSION=3
8
9/CONFIGURATION SECTION:
10/ THE FOLLOWING MUST BE FILLED IN TO CUSTOMIZE THE
11/ MUSIC COMPILER/PLAYER AS DESIRED.
12/ OF THE MANY POSSIBLE CONFIGURATIONS, ONLY SOME
13/ HAVE BEEN TRIED, AND OTHERS ARE NOT GUARANTEED
14/ TO ASSEMBLE OR FUNCTION PROPERLY.
15
16IFNDEF CPU <CPU=1>
17 /FILL IN 1 FOR PDP-8/E (ALSO 8/F, 8/M)
18 /FILL IN 2 FOR PDP-8/A (WITH CORE MEMORY)
19 /FILL IN 4 FOR PDP-8/I OR OLD PDP-8
20
21IFNDEF OS8 <OS8=10>
22 /FILL IN 10 TO RUN UNDER OS/8
23 /FILL IN 20 FOR PAPER TAPE INPUT ONLY
24
25IFNDEF CORE <CORE=400>
26 /FILL IN 100 FOR 4K SYSTEM (PAPER TAPE ONLY)
27 /FILL IN 200 FOR 8K OR LARGER SYSTEM
28 /FILL IN 400 FOR 12K OR LARGER SYSTEM
29 /(ENABLES SPECIAL PLAYER)
30
31IFNDEF NOISE <NOISE=CAF>
32 /FILL IN THE SINGLE CYCLE INSTRUCTION WHICH IS
33 /TO BE USED TO CREATE NOISE. FOR 8/E OR 8/A WITHOUT
34 /AN RX01, TRY CAF. FOR OTHER SYSTEMS, TRY IOF.
35 /DO NOT USE AN INSTRUCTION WHICH TAKES LONGER
36 /THAN 1.5 MICROSECONDS.
37
38IFZERO OS8+CORE-110 <ILLEGAL CONFIGURATION>
39IFNZRO CPU-1<IFNZRO CPU-2<IFNZRO CPU-4<
40ILLEGAL CONFIGURATION>>>
41IFNZRO OS8-10<IFNZRO OS8-20<ILLEGAL CONFIGURATION>>
42IFNZRO CORE-100<IFNZRO CORE-200<IFNZRO CORE-400<
43ILLEGAL CONFIGURATION>>>
44
45IFZERO CORE-400 <
46IFNZRO CPU-4 <WOW=10>>
47
48MARGIN=4 /DO WE CATCH FIELD CHANGES IN TIME?
49AC7776=CLL STA RAL
50AC4000=CLA STL RAR
51AC0002=STL CLA RTL
52BRANCH=JMS I [BRAN0
53IFZERO OS8-10 <
54DECODE=5
55FETCH=1
56>
57\f
58*20
59WSA, 0
60WSB, 0
61WSC, 0
62
63CHAR, 0
64NOTE, 0 /-1 FOR REST THROUGH 6 FOR G
65NOTEV, 0 /POINTER TO #! TABLE:KEYTAB
66THIRD, 0 /-1 FOR 1/THIRD TIME
67PAREN, 0 /-1 WHEN ( FOUND
68OCTAVE, 0 /REMEMBER + AND -
69THISLE, 0 /LENGTH THIS TIME
70TOTLEN, 0 /LENGTH OF NOTE
71ACC, 0 /REMEMBER ACCIDENTALS
72NOTCNT, 0 /COUNT OF NOTES TO PRODUCE
73OUTBUF, -1
74PROTAB,
75TIMA, ZBLOCK 3
76TIMB, ZBLOCK 3
77TIMC, ZBLOCK 3
78TIMD, ZBLOCK 3
79Y, 0 /# OF Y'S SO FAR
80L, 0 /# OF LINE FEEDS SINCE Y
81TFLAG, 0 /-1 TO PRINT LINE
82MINFLG, 0 /-1 TO SUBTRACT NOTES
83TRANSP, 0
84RTRAN, 0
85OUTFLG, 0
86PROTND, /THE END OF WORKING LOCATIONS TO BE ZEROED
87IFZERO OS8-10 <
88INCHCT, -1 /-# CHARACTERS IN BLOCK
89INEOF, 1 /NON-ZEOR FOR EOF
90INFPTR, 7617 /PNTR TO INPUT INFO
91INCTR, 0 /-LENGTH IN BLOCKS
92INPTR, 0 /BUFFER POINTER
93INSAVE, 0 /HALF OF CHAR 3
94>
95\f
96/WORKING STORAGE FOR MUSIC MAKER
97
98DECIMAL
99/THE FOLLOWING NUMBERS ALL REPRESENT TENTHS OF A MICROSECOND
100IFDEF WOW <
101IFZERO CPU-1 <
102JIFFY=50
103T1=316
104T2=290
105T3=3044 /DIVIDE TIME
106TIM6=7
107T6A=4
108>
109IFZERO CPU-2 <
110JIFFY=60
111T1=375
112T2=330
113T3=3600
114TIM6=10
115T6A=55 /TIM6*64-(DOIT TIME)
116>>
117OCTAL
118IFNDEF WOW <
119IFZERO CPU-1 <TIM6=26>
120IFZERO CPU-2 <TIM6=26>
121IFZERO CPU-4 <TIM6=36>>
122MDEFAULT=30^74%2 /C=60
123T64=0
124IFDEF WOW <T64=1>
125IFZERO CPU-1 <T64=1>
126\f
127/WORKING LOCATIONS
128*10
129AXA, VERSION
130LINE=AXB
131AXB, 0
132AXC, 0
133LOWAIT, 0
134OOPS, 0
135LIMIT, 0
136BUFTAB, 0
137
138*20
139WSA, 0
140WSB, 0
141
142SAVE, 0
143CHAR, 0
144FLG, 0
145GETPTR, 0
146LOSAVE, 0
147HOSAVE, 7777
148LOLONG, 0
149HOLONG, 7700
150LOTIM, 0
151HOTIM, 0
152BUFGET, 0
153TRAN, 0
154
155NOTTAB,
156AC, 0
157AR, 0
158AT, 0
159RTOT, 0
160BC, 0
161BR, 0
162BT, 0
163OLDS, 0
164CC, 0
165CR, 0
166CT, 0
167SAVS, 0
168DC, 0
169DR, 0
170DT, 0
171OLDE, 0
172\f
173*77
174
175/SOME MAGIC NUMBERS
176/USED TO FIGURE METER: HOW MANY 6.4US UNITS
177/ARE THERE IN ONE MINUTE DIVIDED BY TWO?
178IFNZRO T64 <
179LOFUDG, 3214
180HOFUDG, 2170
181>
182/AND IN 6.0US UNITS?
183IFZERO T64 <
184LOFUDG, 5500
185HOFUDG, 2304
186>
187IFDEF WOW <
188
189/AND THE MAGIC SUBROUTINE
190DOIT, 0
191 TAD I DOIT /HOW LONG 'TILL NEXT CALL?
192 DCA LIMIT /REMEMBER
193 CDF 10
194DOIT1, TAD LIMIT
195 CLL
196 TAD LOWAIT /IS THERE ENOUGH TIME TO RETURN
197 SNL /AND GET BACK IN TIME?
198 JMP DOIT5 /YES
199 ISZ I BUFGET /HOW ABOUT HIGH ORDER TIME?
200 JMP DOIT6 /YES, TIME
201 CLA CLL /NOT ENOUGH TIME
202 TAD LOWAIT /HOW LONG WE HAVE TO WAIT
203 TAD OOPS /ERROR LAST TIME
204 SZL /HAVE WE WAITED OUR TIME?
205 JMP .+3 /YES
206 TAD (JIFFY /NO, UPDATE AC
207 JMP .-3 /AND TRY AGAIN
208 DCA OOPS /SAVE ERROR
209IFZERO CPU-1 <
210 ISZ BUFGET /NOW HOW MANY SPIKES?
211 JMP .+3
212 JMP .+2 /COVER SKIP
213NOISA, NOISE /MAKE A SPIKE
214 ISZ I BUFGET
215 JMP .-2 /ANOTHER SPIKE
216 ISZ BUFGET
217 SKP /COVER ISZ SKIP
218 NOP /MAKING UP FOR TIMING ERROR
219>
220IFZERO CPU-2 <
221 ISZ BUFGET
222 SKP
223 NOP
224 TAD I BUFGET
225 DCA LOWAIT
226 ISZ BUFGET
227 JMP .+3
228 JMP .+2
229NOISA, NOISE
230 ISZ LOWAIT
231 JMP .-2
232>
233 TAD I BUFGET /LOW ORDER TIME
234 DCA LOWAIT /SAVE IT
235 ISZ BUFGET /POINT TO HO TIME
236 JMP DOIT1
237 JMP DOIT1 /COVER ISZ SKIP
238
239DOIT5, TAD [0 /TIMING CORRECTOR
240 NOP
241DOIT6, DCA LOWAIT
242 CDF
243 ISZ DOIT
244 JMP I DOIT
245>
246\f
247/ALTERNATE RESTART ADDRESS TO BEGIN PLAYING
248*0
249 NOP
250 JMP PLAY /GO PLAY
251 NOISA /ADDRESS OF NOISE, FOR CONVENIENCE
252FIX, -TIM6
253 CPU+OS8+CORE /FOR CONVENIENCE
254
255*200
256/BEGINNING OF EVERYTHING
257
258START,
259IFZERO OS8-10 <
260IFDEF WOW <SKP;SKP> /LEAVE ROOM FOR RESTORE TRAP
261 JMS OSDEC /CALL COMMAND DECODER
262>
263START1, TLS /BRING UP PRINTER FLAG
264 JMS KEYC /DEFAULT TO KEY OF C
265 TAD (BUFTBL-1
266 DCA BUFTAB
267 TAD I BUFTAB /AUTO-INDEX
268 DCA OUTBUF /BEGINNING OF BUFFER
269 TAD I BUFTAB
270 DCA LIMIT /END OF BUFFER
271IFNZRO CORE-100 <
272 TAD I BUFTAB
273 DCA OUTCDF /FIELD OF BUFFER
274CORINI, JMS INIT /INITIALIZE CORE SIZE, ETC.
275>
276 TAD [LINBUF-1
277 DCA LINE
278 TAD (PROTAB-PROTND /CLEAR OUT ALL THE NOTES
279 DCA WSA /AND OTHER THINGS
280 TAD (PROTAB-1
281 DCA AXA
282 DCA I AXA
283 ISZ WSA
284 JMP .-2
285
286/INITIALIZE AFTER ; OR CR
287
288START2, DCA NOTCNT
289
290/INITIALIZE FOR NEXT NOTE
291
292 DCA THIRD
293 DCA PAREN
294 DCA TOTLEN
295 DCA MINFLG
296
297/INITIALIZE FOR NEXT NOTE IN CHORD
298
299START5, BRANCH /JMP BASED ON NEXT INPUT CHAR
300 BRANA
301\f
302NEXNOT, ISZ PAREN /ARE WE IN A CHORD?
303 SKP
304 JMP DEFCH2 /YES
305 DCA TOTLEN /NO-ANOTHER LENGTH
306TIE, BRANCH
307 BRANB
308
309TRIPLE, STA
310 DCA THIRD /REMEMBER IT'S A TRIPLET
311 JMP TIE
312
313MINUS, STA /SUBTRACT NOTE DURATIONS
314 DCA MINFLG
315 JMP TIE
316
317KEYF, AC7776 /DEFINE FLATS
318KEYS, IAC /DEFINE SHARPS
319 DCA WSC
320 JMS GETEQ /BUMP PAST =
321 JMP BADLINE
322 JMS KEYC /RESET TO KEY OF C
323KEYL, JMS GETNOTE /IS THERE A NOTE?
324 JMP BADLINE /NO
325 TAD WSC
326 DCA I NOTEV /REMEMBER SHARP/FLAT
327 JMS IN
328 TAD (-",
329 SNA CLA /IS THERE ANOTHER?
330 JMP KEYL /YES
331 TAD CHAR /NO
332 JMP START5 /DO SOMETHING ELSE
333
334LENG, IAC /GRACE NOTE!
335 ISZ THIRD /DID HE SAY TRIPLET?
336 JMP ADDLEN /NO
337 JMS BADSTAR /YES-THAT'S NO GOOD
338 JMP LENG
339
340LENB, IAC /SEMI-BREVE
341LENM, IAC /MINIM
342LENC, IAC /CROTCHET
343LENQ, IAC /QUAVER
344LENS, IAC /SEMI-QUAVER
345LEND, CMA
346 DCA WSA
347 STL RAL
348 ISZ THIRD /THIRD TIME?
349 STL
350 RAL
351 ISZ WSA
352 JMP .-2
353ADDLEN, ISZ MINFLG /DO WE SUBTRACT?
354 SKP /NO
355 CIA /YES
356 DCA THISLEN /LENGTH THIS NOTE
357 TAD THISLEN
358 TAD TOTLEN
359 SPA SNA /DID HE SUBTRACT TOO MUCH?
360 JMP ADDNEG /YES
361 DCA TOTLEN /TOTAL LENGTH
362 JMS GETNOTE /IS THERE A NOTE YET?
363 JMP .+3 /NO, SOMETHING ELSE I GUESS
364NMODS, BRANCH /YES, NOW WHAT?
365 BRANE
366 TAD CHAR
367 BRANCH
368 BRAND
369
370PUTNO, JMS BADSTA /OUT OF CORE!
371 JMS MSG /PRINT LAST LINE
372 JMS CRLF
373 TAD ("$
374 JMS TYPE
375 JMS CRLF
376 JMP ENDM /NOW PLAY IT
377
378/DOTTED NOTES:
379DOT, TAD THISLEN
380 STL
381 SMA /FIX LINK TO SIGN OF NUMBER
382 CLL
383 RAR /DIVIDE BY TWO
384 SZL /VALID?
385ADDNEG, JMS BADSTA /NO
386 JMP ADDLEN
387
388PAGE
389\f
390/DEFINE METER:
391/METER IS SAVED AS 12 BIT LENGTH*METER/2
392
393DEFM, ISZ PAREN /DEFINE METER
394 SKP
395 JMP BADLINE /OOPS--INSIDE A (?
396 JMS DECIN /GET METER
397 SNA
398 JMP BADLINE /MUST BE VALID
399 DCA DEFM2
400 TAD TOTLEN /LENGTH OF NOTE
401 CLL RAR
402 DCA WSB
403 JMS MUL /MULTIPLY
404DEFM2, .-.
405 DCA WSB
406 TAD (4 /DEFINE METER CODE
407 JMS OUT
408 TAD WSB
409 RTR
410 RTR
411 RTR
412 JMS OUT /HIGH ORDER
413 TAD WSB
414 JMS OUT /LOW ORDER
415 JMS LIMTST /TEST FOR END OF BUFFER AREA
416 JMP DEFV
417
418/LEFT PAREN FOUND (
419DEFCHO, ISZ PAREN
420 SKP
421 JMS BADSTA /NESTED ((
422DEFCH2, STA
423 DCA PAREN
424 JMS GETNOTE /WE SHOULD HAVE A NOTE
425 JMP BADLINE /OOPS
426 JMP NMODS /NOW TRY FOR "!+=
427
428/ACCIDENTALS
429ACCF, CLL STA RTL /FLAT
430ACCS, TAD (2 /SHARP
431 TAD ACC
432 DCA ACC
433 JMP NMODS
434ACCN, IAC /NATURAL
435 DCA ACC
436OCTMOR, BRANCH /LOOK FOR +-
437 BRANF
438
439OCTUP, TAD (30 /FOUND +
440OCTDN, TAD (-14 /FOUND -
441 TAD OCTAVE
442 DCA OCTAVE
443 JMP OCTMOR /ARE THERE MORE?
444\f
445PPRODU, ISZ PAREN /WE SHOULD BE INSIDE ) HERE
446 JMS BADSTA
447 BRANCH
448 BRANG
449
450SPRODU, ISZ PAREN /WAS THERE A PAREN?
451 JMP PRODUCE /NO, OK
452 JMS BADSTA /YES--NO ) THOUGH
453PRODUC, TAD NOTE
454 SPA CLA /REST?
455 JMP PRO7 /YES
456 TAD ACC
457 SMA /FLAT?
458 CLL RAR /NO, DIVIDE BY TWO
459 SNA /MAYBE ZERO IF NATURAL
460 SZL /NON-ZERO LINK IF NATURAL
461 SKP
462 TAD I NOTEV /GET DEFAULT #!"
463 DCA ACC /-1 FOR !,1 FOR #
464 TAD NOTE
465 TAD (BASTAB
466 DCA NOTE
467 TAD I NOTE /GET NOTE NUMBER
468 TAD ACC /#!
469 TAD OCTAVE /+-
470 TAD TRANSPOSE /DID HE REQUEST TRANSPOSE
471PRO3, SMA /MAKE SURE IT IS WITHIN RANGE
472 JMP PRO4
473 TAD (14
474PRO3A, DCA WSB
475 JMS BADSTA /OUT OF RANGE
476 TAD WSB
477 JMP PRO3
478PRO4, TAD (-117
479 SPA
480 JMP PRO6
481 TAD (117-14 /OUT OF RANGE
482 JMP PRO3A
483PRO6, TAD (117
484 DCA NOTE
485PRO7, TAD (PROTAB
486 DCA WSA
487 TAD (-4
488 DCA WSB
489PRO8, TAD I WSA
490 SNA CLA /SPACE IN THE TABLE?
491 JMP PRO9 /YES
492 ISZ WSA /GO TO NEXT ENTRY
493 ISZ WSA
494 ISZ WSA
495 ISZ WSB /END?
496 JMP PRO8 /NO
497 JMS BADSTA /TRYING TO PLAY 5 NOTES
498 JMP PROA
499
500PAGE
501\f
502PRO9, ISZ NOTCNT /COUNT HOW MANY
503 TAD TOTLEN
504 DCA I WSA
505 ISZ WSA
506 STA
507 DCA I WSA /SET FLAG SO WE WILL
508 ISZ WSA /PROCESS NOTE LATER
509 TAD NOTE
510 DCA I WSA /REMEMBER PITCH
511 TAD CHAR
512PROA, TAD (-",
513 SNA CLA /DO WE EXPECT MORE NOTES?
514 JMP NEXNOT /YES
515PROB, TAD NOTCNT
516 SNA
517 JMP START2 /THERE ARE NO NOTES TO WORRY ABOUT
518 CIA
519 DCA NOTCNT
520 TAD (PROTAB
521 DCA WSA
522 TAD (-4
523 DCA WSB
524
525/FIRST WORRY ABOUT NOTES WHICH MUST BE CHANGED TO RESTS
526PUT0, TAD I WSA
527 ISZ WSA
528 ISZ WSA
529 SZA CLA /IS THIS A TIMED OUT NOTE?
530 JMP PUT2 /NO
531 ISZ I WSA /IS IT A REST?
532 JMP PUT3 /NO-BETTER MAKE IT ONE
533PUT1, STA
534 DCA I WSA /REMEMBER IT IS REST
535PUT2, JMS LIMTST /TEST FOR END OF BUFFER AREA
536 ISZ WSA
537 ISZ WSB
538 JMP PUT0 /GO FOR MORE
539 TAD (PROTAB /START OVER AGAIN
540 DCA WSA
541 TAD (-4
542 DCA WSB
543
544/NOW WORRY ABOUT OUR NEW NOTES
545PUT4, TAD I WSA
546 ISZ WSA
547 SZA CLA /ACTIVE NOTE?
548 JMP PUT6 /YES
549PUT5, ISZ WSA /GO TO NEXT ENTRY
550 ISZ WSA
551 ISZ WSB
552 JMP PUT4
553 HLT /HLT HERE MEANS BUG
554\f
555PUT3, TAD (10 /DEFINE A REST
556 TAD WSB /NOTE #
557 STL RAL
558 JMS OUT
559 JMP PUT1
560
561PUT6, ISZ I WSA /FLAG SET?
562 JMP PUT5 /NO, IGNORE IT
563 JMS LIMTST /TEST FOR END OF BUFFER AREA
564 ISZ WSA
565 TAD I WSA
566 SPA CLA /REST?
567 JMP PUT7 /YES
568 TAD RTRAN /GET AUTOMATIC TRANSPOSE
569 TAD I WSA /AND NOTE
570/THERE ARE MORE THAN 64 NOTES, BUT ONLY 6 BITS
571/TO REMEMBER WITH. SO WE DO THIS:
572 AND [7700 /IN RANGE?
573 SNA
574 JMP PUT6A /NOTHING TO DO
575 SMA CLA
576 TAD (10
577 TAD I WSA /TAD IN PITCH
578 AND (70 /GET TRANSPOSE AMOUNT
579 DCA RTRAN /SAVE IT
580 TAD RTRAN
581 TAD (6 /PUT IN FUNCTION CODE
582 JMS OUT /STASH IT IN BUFFER
583 TAD RTRAN
584 CIA
585 DCA RTRAN
586PUT6A, TAD (10
587PUT7, ISZ NOTCNT /LAST NOTE?
588 TAD (4
589 TAD (4
590 TAD WSB /NOTE #
591 STL RAL
592 JMS OUT
593 TAD I WSA
594 TAD RTRAN /AUTOMATIC TRANSPOSE
595 SMA /REST?
596 JMS OUT /NO, REMEMBER PITCH
597 CLA CLL
598 TAD NOTCNT
599 SZA CLA /LAST NOTE?
600 JMP PUT5+1 /NO, GO FOR MORE
601 JMP PUT9
602\f
603/CHECK FOR THE END OF THE BUFFER SPACE
604LIMTST, 0
605 CLA CLL
606 TAD OUTBUF
607 TAD LIMIT
608 SNL CLA /AT OR NEAR END?
609 JMP I LIMTST /OK
610IFNZRO CORE-100 <
611 TAD I BUFTAB /AUTO-INDEX
612 SNA /IS THERE MORE BUFFER AREA?
613 JMP PUTNO /NO
614 DCA LIMIT /LIMIT OF BUFFER IN THIS FIELD
615 TAD (14 /CODE FOR FIELD SWITCH
616 JMS OUT
617 TAD I BUFTAB /CDF NEW FIELD
618 DCA OUTCDF
619 DCA OUTBUF /START AT LOCATION ZERO
620 DCA OUTFLG
621 JMP I LIMTST
622>
623IFZERO CORE-100 <
624 JMP PUTNO
625>
626
627PAGE
628\f
629PUT9, AC4000
630 DCA THISLEN
631
632/NOW FIGURE OUT WHAT THE SHORTEST TIME LEFT
633/IS OF THE FOUR NOTES, AND SUBTRACT THAT
634/TIME FROM ALL NOTES
635 TAD TIMA
636 JMS SMALL
637 TAD TIMB
638 JMS SMALL
639 TAD TIMC
640 JMS SMALL
641 TAD TIMD
642 JMS SMALL
643 TAD TIMA
644 SZA
645 TAD THISLEN
646 DCA TIMA
647 TAD TIMB
648 SZA
649 TAD THISLEN
650 DCA TIMB
651 TAD TIMC
652 SZA
653 TAD THISLEN
654 DCA TIMC
655 TAD TIMD
656 SZA
657 TAD THISLEN
658 DCA TIMD
659 TAD THISLEN
660 CIA
661 JMS OUT /OUTPUT LENGTH
662
663/NOW IF IT WAS LONGER THAN 64, WE NEED TO REMEMBER THAT
664 TAD THISLEN
665 RTR
666 RTR
667 RTR
668 AND [77
669 TAD [7700
670 DCA WSA
671 JMS LIMTST /CHECK FOR END OF BUFFER AREA
672 AC0002
673 ISZ WSA /WAS IT TOO LONG?
674 JMS OUT /YES--CREATE LONGER NOTE
675 SNA CLA
676 JMP .-5
677 JMP START2 /GO FOR MORE
678
679NEXLIN, ISZ TFLAG /ERROR?
680 SKP
681 JMS MSG /YES-PRINT LINE
682 TAD [LINBUF-1
683 DCA LINE /RESET BUFFER POINTER
684 ISZ L /COUNT LINES
685 JMP START5
686 JMP START5
687\f
688DEFY, TAD TIMA /WE FOUND A Y
689 TAD TIMB /ARE ALL NOTES TIMED OUT?
690 TAD TIMC
691 TAD TIMD
692 SZA CLA
693 JMS BADSTA /NOTES DID NOT FINISH TOGETHER
694 DCA TIMA /WHETHER THEY ARE OR NOT,
695 DCA TIMB /WE WILL MAKE THEM SO
696 DCA TIMC
697 DCA TIMD
698 ISZ Y
699 NOP
700 DCA L
701 JMS GETEQ /IS THERE AN =
702 JMP DEFV /NO
703 JMS DECIN /GET DECIMAL #
704 SZA
705 DCA Y /SAVE IT
706
707DEFV, TAD CHAR
708 BRANCH /LOOK FOR END OF LINE
709 BRANC
710
711DECIN, 0 /DECIMAL INPUT
712DECIN1, DCA WSB
713 JMS IN
714 TAD (-"9-1
715 CLL
716 TAD (12
717 DCA AXA
718 SNL
719 JMP DECIN2
720 JMS MUL
721 12
722 TAD AXA
723 JMP DECIN1
724DECIN2, TAD WSB
725 JMP I DECIN
726\f
727SPACE, 0
728 TAD [240
729 JMS TYPE
730 JMP I SPACE
731
732CRLF, 0
733 TAD (215
734 JMS TYPE
735 TAD (212
736 JMS TYPE
737 JMP I CRLF
738
739TYPE, 0
740 ISZ COFLG /CTRL/O?
741 JMP TYPENO /YES-NO PRINTING
742 TSF
743 JMP .-1
744 TLS /TYPE CHARACTER
745TYPENO, CLA
746 KRS /LASTLY TYPED CHARACTER
747 AND [177 /REMOVE PARITY
748 TAD (-"O+300
749 SNA CLA /IS IT CTRL/O?
750 KSF /AND IS FLAG SET?
751 STA
752 DCA COFLG /REMEMBER FLAG FOR NEXT TIME
753 JMP I TYPE
754COFLG, -1
755
756PAGE
757\f
758IFZERO OS8-20 < IFNDEF WOW <
759REMEM=.
760*HOFUDG+1
761>>
762SMALL, 0 /FIND SMALLEST LENGTH
763 SNA
764 JMP I SMALL /IGNORE ZEROES
765 TAD THISLEN
766 SMA
767 JMP SMALL2
768 CIA /FOUND A SMALLER ONE
769 TAD THISLEN
770 DCA THISLEN
771SMALL2, CLA
772 JMP I SMALL
773
774IFZERO OS8-10 <
775OSDEC, 0 /CALL OS8 COMMAND DECODER
776 CIF 10
777 JMS I C7700
778 DECODE
779 "M-300^100+"U-300 /.MU DEFAULT
780 STA
781 DCA INCHCT
782 IAC
783 DCA INEOF /CAUSE AN END OF FILE
784 TAD (7617 /INIT FILE POINTER
785 DCA INFPTR
786 JMP I OSDEC
787
788OSIN, 0
789INCHAR, ISZ INJMP /UNPACKING SWITCH
790 ISZ INCHCT /ANY MORE CHARACTERS?
791INJMPP, JMP INJMP /YES
792 TAD INEOF
793 SNA CLA /EOF?
794 JMP INGBUF /NO-GO READ
795GETNEW, JMS INNEWF /GO TO NEXT FILE
796 JMP ENDM /NO MORE FILES
797INGBUF, ISZ INCTR
798 SKP
799 ISZ INEOF /WE'RE ON LAST BLOCK
800 JMS I INHNDL /READ FROM INPUT
801 200 /ONE BLOCK
802INBUFP, INBUF
803INREC, 0
804 JMP INERRX
805INBREC, ISZ INREC /GO TO NEXT BLOCK
806 TAD (-600-1
807 DCA INCHCT
808 TAD INJMPP
809 DCA INJMP
810 TAD INBUFP
811 DCA INPTR
812 JMP INCHAR
813INERRX, ISZ INEOF
814C7700, SMA CLA /FATAL ERROR?
815 JMP INBREC /END OF FILE
816 HLT /I/O ERROR
817INJMP, HLT /UNPACKING JUMP
818 JMP ICHAR1
819 JMP ICHAR2
820 TAD INJMPP
821 DCA INJMP
822 TAD I INPTR
823 AND (7400
824 CLL RTR
825 RTR
826 TAD INSAVE
827 RTR
828 RTR
829 ISZ INPTR
830 JMP INCOMN
831ICHAR2, TAD I INPTR
832 AND (7400
833 DCA INSAVE
834 ISZ INPTR
835ICHAR1, TAD I INPTR
836INCOMN, AND [177
837 TAD (-32 /CTRL/Z?
838 SNA
839 JMP GETNEW /TIME FOR NEXT FILE
840 TAD (232
841 JMP I OSIN
842
843/GO TO NEXT INPUT FILE
844INNEWF, 0
845 TAD (INDEVH+1
846 DCA INHNDL
847 CDF 10
848 TAD I INFPTR
849 CDF
850 SNA
851 JMP I INNEWF /NO MORE INPUT FILES
852 CIF 10
853 JMS I C7700 /FETCH HANDLER
854 FETCH
855INHNDL, .-.
856 HLT
857 CDF 10
858 TAD I INFPTR
859 AND (7760
860 SZA
861 TAD (17
862 STL RTR
863 RTR
864 DCA INCTR
865 ISZ INFPTR
866 TAD I INFPTR
867 CDF
868 DCA INREC
869 ISZ INFPTR
870 DCA INEOF
871 STA
872 DCA INCHCT
873 ISZ INNEWF
874 JMP I INNEWF
875IFDEF WOW <
876RESTR2, 0
877 JMS I [RESTOR
878 STA
879 TAD RESTR2
880 DCA RESTR2
881 JMP I RESTR2
882>>
883IFNZRO OS8-10 <
884OSIN, 0
885CH1, TAD [-20 /SET FOR DELAY OF A WHILE
886 DCA CHAR
887CH2, KSF /ANYTHING AT LOW SPEED?
888 JMP CH3 /NO
889 KRB /YES-GET IT
890 JMP I OSIN /AND RETURN
891
892CH3, RSF /ANYTHING AT HIGH SPEED?
893 JMP CH4 /NO
894 RRB RFC /YES, GET IT
895 JMP I OSIN /AND RETURN
896
897CH4, ISZ CH5
898 JMP CH2
899 ISZ CHAR
900 JMP CH2
901 LAS
902 SNA CLA
903 RFC /TRY TO START THE READER
904 CLA /IN CASE OF FUNNY INTERFACES
905 JMP CH1
906CH5, 0
907>
908
909PAGE
910IFZERO OS8-20 < IFNDEF WOW <
911*REMEM
912>>
913\f
914BRAN0, 0 /BRANCH BASED ON CHARACTER
915 DCA CHAR /MAYBE USE CHAR IN AC
916 STA
917 TAD I BRAN0
918 DCA AXA
919 TAD CHAR
920 SNA
921 JMS IN
922 CLA SKP
923BRAN1, ISZ AXA
924 TAD I AXA
925 SMA
926 SKP CLA
927 TAD CHAR
928 SZA CLA
929 JMP BRAN1
930 TAD I AXA
931 DCA WSA
932 JMP I WSA /BRANCH!
933
934GETEQ, 0 /SKIP IF NEXT CHAR IS =
935 JMS IN
936 TAD (-"=
937 SNA CLA
938 ISZ GETEQ
939 JMP I GETEQ
940
941KEYC, 0 /SET TO KEY OF C
942 TAD (KEYTAB-1
943 DCA AXA
944 TAD (-10
945 DCA WSA
946 DCA I AXA
947 ISZ WSA
948 JMP .-2
949 JMP I KEYC
950
951GETNOT, 0 /GET A NOTE
952 JMS IN
953 TAD (-"G-1
954 CLL
955 TAD ("G-"A+1
956 SNL
957 JMP GETNR
958GETN2, DCA NOTE
959 TAD NOTE
960 TAD (KEYTAB+1
961 DCA NOTEV
962 DCA OCTAVE /CLEAR OUT +-
963 DCA ACC /CLEAR ACCIDENTALS
964 ISZ GETNOTE
965 JMP I GETNOTE
966\f
967GETNR, TAD ("A-"R
968 SZA CLA
969 JMP I GETNOTE /NO NOTE
970 STA
971 JMP GETN2
972
973/GET A CHARACTER, AND REMEMBER IN CASE OF ERROR
974IN, 0
975 JMS OSIN
976 AND [177
977 TAD [200
978 DCA CHAR
979 TAD CHAR
980 TAD (-212
981 SZA
982 TAD (-3
983 SNA
984 JMP IN2 /CR OR LF
985 TAD (215-340
986 CLL
987 TAD (340-240
988 SNL CLA
989 JMP IN+1 /INVALID CHARACTER-IGNORE
990IN2, TAD LINE
991 TAD (-LINBUF-100+2
992 SPA CLA /SOMEWHAT LONG?
993 JMP .+3
994 TAD [LINBUF-1 /YES, START OVER
995 DCA LINE
996 TAD CHAR
997 DCA I LINE /SAVE IN LINE BUFFER
998 TAD CHAR
999 TAD (-240
1000 SNA CLA
1001 JMP IN+1 /IGNORE(BUT PRINT) SPACES
1002 TAD CHAR
1003 JMP I IN
1004
1005BADLIN, JMS BADSTA /PRINT "*"
1006 JMP DEFV /FIND NEXT LINE
1007
1008BADSTA, 0
1009 CLA
1010 TAD LINE
1011 DCA WSA
1012 TAD I WSA /GET LAST CHARACTER
1013 DCA I LINE /MOVE IT OVER
1014 TAD ("*
1015 DCA I WSA /PUT * IN LINE
1016 STA
1017 DCA TFLAG /PRINT THIS LINE
1018 JMP I BADSTA /RETURN
1019\f
1020/T= : TRANSPOSE
1021DEFT, JMS GETEQ /BUMP OVER EQUAL
1022 JMP BADLINE /OOPS, NONE
1023 JMS DECIN /GET DECIMAL NUMBER
1024 TAD (-144 /T=100 IS NO TRANSPOSE
1025 DCA TRANSPOSE
1026 JMP DEFV /IGNORE REST OF LINE
1027
1028PAGE
1029\f
1030ENDM, JMS OUT /OUTPUT END CODE (0)
1031 JMP I [PLAY /NOW GO AND PLAY
1032IFDEF WOW < IFZERO OS8-10 <
1033*.-1 /UNLESS THIS IS ASSEMBLED
1034 TAD [7600 /SINCE WE USE FIELD ONE AS A
1035 DCA WSA /4K BUFFER, WE MUST SAVE THE
1036 TAD (SAVBUF-1
1037 DCA AXA /OS/8 STUFF WHICH IS THERE.
1038SAVEL, CDF 10
1039 TAD I WSA
1040 CDF
1041 DCA I AXA
1042 ISZ WSA
1043 JMP SAVEL
1044 TAD I [7600
1045 DCA MSG
1046 TAD (JMS I [RESTR2
1047 DCA I [7600 /SET RESTART TRAP
1048 TAD (JMS I [RESTR2
1049 DCA I [START
1050 JMP I [PLAY /NOW, WE CAN PLAY MUSIC!
1051
1052RESTOR, 0 /SUBROUTINE TO RESTORE THE
1053 TAD [7600 /TOP PAGE OF FIELD ONE
1054 DCA WSA
1055 TAD (SAVBUF-1
1056 DCA AXA
1057RESTOL, TAD I AXA
1058 CDF 10
1059 DCA I WSA
1060 CDF
1061 ISZ WSA
1062 JMP RESTOL
1063 TAD MSG /RESTORE 7600
1064 DCA I [7600
1065 TAD (SKP
1066 DCA I [START
1067 JMP I RESTOR
1068>>
1069
1070MSG, 0 /PRINT LINE
1071 TAD Y
1072 JMS DECOUT /PRINT Y NUMBER
1073 JMS SPACE
1074 TAD L
1075 JMS DECOUT /PRINT L NUMBER
1076 JMS SPACE
1077 TAD [LINBUF-1
1078 DCA AXA
1079MSG1, TAD (-76
1080 DCA WSA
1081MSG2, TAD I AXA
1082 JMS TYPE
1083 TAD AXA
1084 CIA
1085 TAD LINE
1086 SNA CLA
1087 JMP I MSG
1088 ISZ WSA
1089 JMP MSG2
1090 JMS CRLF
1091 JMP MSG1
1092
1093OUT, 0
1094IFNZRO CORE-100 <
1095OUTCDF, CDF 00 >
1096 AND [77
1097 ISZ OUTFLG
1098 JMP OUT2
1099 TAD I OUTBUF
1100 DCA I OUTBUF
1101 ISZ OUTBUF
1102 JMP OUT3
1103OUT2,
1104IFNZRO CPU-4 <BSW>
1105IFZERO CPU-4 <
1106 CLL RTL
1107 RTL
1108 RTL
1109>
1110OUT3, DCA I OUTBUF
1111IFNZRO CORE-100 < CDF >
1112 TAD OUTFLG
1113 CIA
1114 DCA OUTFLG
1115 JMP I OUT
1116
1117DECOUT, 0
1118 SNA
1119 JMP DECO2
1120 DCA WSB
1121 TAD (DECO9
1122 DCA WSA
1123 JMS DECO6
1124 SNA
1125 JMP .-2
1126 TAD ("0
1127 JMS TYPE
1128 JMS DECO6
1129 JMP .-3
1130DECO2, TAD ("0
1131 JMS TYPE
1132 JMP I DECOUT
1133
1134DECO6, 0
1135 DCA WSC
1136DECO7, TAD I WSA
1137 SNA
1138 JMP I DECOUT
1139 STL
1140 TAD WSB
1141 SZL
1142 JMP DECO8
1143 DCA WSB
1144 ISZ WSC
1145 JMP DECO7
1146DECO8, CLA
1147 ISZ WSA
1148 TAD WSC
1149 JMP I DECO6
1150
1151/MULTIPLY:AC=WSB*(JMS+1)
1152MUL, 0
1153 TAD (-14
1154 DCA WSA
1155 TAD I MUL
1156 ISZ MUL
1157MUL2, CLL RAL
1158 SZL
1159 TAD WSB
1160 ISZ WSA
1161 JMP MUL2
1162 JMP I MUL
1163
1164PAGE
1165\f
1166/THE START OF THE PLAYING PART OF THE COMPILER
1167PLAY, DCA FLG /RESET PACKING FLAG
1168 TAD (BFR1
1169 DCA TRAN
1170IFDEF WOW <
1171 CDF 10
1172 DCA AXB /START OFF WITH A LONG
1173 DCA BUFGET /PAUSE (.84 SEC)
1174 STL RAR
1175 DCA I BUFGET
1176 STA
1177 DCA I AXB
1178 CDF
1179 DCA OOPS
1180>
1181IFNDEF WOW <
1182 STA
1183>
1184 DCA SAVS /DON'T START WITH POP
1185 TAD (BUFTBL-1
1186 DCA BUFTAB
1187 TAD I BUFTAB
1188 DCA GETPTR
1189IFNZRO CORE-100 <
1190 ISZ BUFTAB
1191 TAD I BUFTAB
1192 DCA GETCDF
1193>
1194 TAD (MDEFAULT
1195 JMP DOM1 /SET METER DEFAULT
1196RESTM,
1197IFDEF WOW <DECIMAL
1198 JMS DOIT /A REST...
1199IFZERO CPU-1 < T1+158 >
1200IFZERO CPU-2 < T1+180 >
1201OCTAL>
1202 TAD (2000 /LOW FREQUENCY
1203 DCA I AXA
1204 DCA I AXA /NO SPIKES
1205NEXT1, STA
1206 DCA I AXA /KEEP SIMULTANEOUS NOTES
1207NEXT,
1208IFDEF WOW <DECIMAL
1209 JMS DOIT /IN PHASE
1210IFZERO CPU-1 < T1+T2+190 >
1211IFZERO CPU-2 < T1+T2+225 >
1212OCTAL>
1213 JMS I [GET /WHAT DO WE DO?
1214 CLL RAR
1215 SNL
1216 JMP SPECIAL /SOMETHING SPECIAL
1217 RTR
1218 AND (7 /WHAT DO?
1219 TAD (JMPTAB
1220 DCA WSA
1221 TAD I WSA /GET DISPATCH ADDRESS
1222 DCA WSA
1223IFDEF WOW <DECIMAL
1224 NOP
1225 JMS DOIT
1226IFZERO CPU-1 < T1+140 >
1227IFZERO CPU-2 < T1+165 >
1228OCTAL >
1229 TAD CHAR
1230 AND (6 /WHICH NOTE?
1231 CLL RAL
1232 TAD (NOTTAB-1
1233 DCA AXA
1234 JMP I WSA /NOW DISPATCH
1235
1236REST,
1237IFDEF WOW <DECIMAL
1238 JMS DOIT /DO A REST
1239IFZERO CPU-1 < T1+158 >
1240IFZERO CPU-2 < T1+180 >
1241OCTAL>
1242 TAD (2000
1243 DCA I AXA /LOW FREQUENCY
1244 DCA I AXA /NO SPIKES
1245NEXT2, STA
1246 DCA I AXA /KEEP SIMULTANEOUS NOTES
1247IFDEF WOW <DECIMAL
1248 JMS DOIT /IN PHASE
1249IFZERO CPU-1 < T1+T2+12 >
1250IFZERO CPU-2 < T1+T2+15 >
1251OCTAL>
1252 JMS I [GET /GET DURATION
1253 SNA CLA
1254 JMP NEXHOL /IT'S A LONG ONE
1255IFDEF WOW <DECIMAL
1256 JMS DOIT
1257IFZERO CPU-1 < T1+2678 >
1258IFZERO CPU-2 < T1+3135 >
1259OCTAL>
1260 TAD CHAR /NOW WE WANT TO MULTIPLY DURATION
1261IFNZRO CPU-4 <BSW>
1262IFZERO CPU-4 <
1263 CLL RTL /BY LENGTH OF A "G" IN
1264 RTL /HOSAVE,LOSAVE (IN UNITS OF A
1265 RTL > /6.4 MICROSECOND)
1266 DCA WSB
1267 TAD (-6
1268 DCA WSA
1269 DCA LOTIM
1270 DCA HOTIM
1271 JMP NEXLUP
1272/NOW WE'RE ALL SET TO MULTIPLY
1273NEXSH, TAD LOTIM
1274 CLL RAL
1275 DCA LOTIM
1276 TAD HOTIM
1277 RAL
1278 DCA HOTIM
1279NEXLUP, TAD WSB
1280 RAL
1281 DCA WSB /BIT OF MULTIPLIER IN L
1282 SNL
1283 JMP NEXNO2 /NO ADDING TO DO
1284 TAD LOSAVE
1285 TAD LOTIM
1286 DCA LOTIM
1287 CML RAL /REMEMBER CARRY!
1288 TAD HOSAVE
1289 TAD HOTIM
1290 DCA HOTIM
1291IFNDEF WOW <NEXNO2,>
1292NEXNO, ISZ WSA
1293 JMP NEXSH
1294 JMP NEXINI /DONE MULTIPLYING
1295IFDEF WOW <
1296NEXNO2, TAD /WASTE TIME
1297 DCA
1298 TAD
1299 DCA
1300 AND I AXA /NEED AUTO-INDEX FOR EXTRA .2US
1301 JMP NEXNO
1302>
1303
1304NEXHOL,
1305IFDEF WOW <DECIMAL
1306 JMS DOIT /HOLD FOR 64 "G"S
1307IFZERO CPU-1 < T1+270 >
1308IFZERO CPU-2 < T1+315 >
1309OCTAL>
1310 TAD LOLONG
1311 DCA LOTIM
1312 TAD HOLONG
1313 DCA HOTIM
1314NEXINI, TAD AR /REMEMBER HOW MANY
1315 TAD BR /SPIKES IN ALL
1316 TAD CR
1317 TAD DR
1318IFDEF WOW <CIA>
1319IFNDEF WOW <CMA>
1320 DCA RTOT
1321IFNDEF WOW <
1322 KRB /WHAT WAS THE LAST CHARACTER TYPED?
1323 AND (177 /MASK PARITY
1324 TAD (-3 /CHECK FOR CTRL/C
1325 SNA /IS IT?
1326IFZERO OS8-10 < JMP I [7600 > /YES, RETURN TO MONITOR
1327IFNZRO OS8-10 < JMP START> /YES, READ ANOTHER TAPE
1328 TAD ("C-"Q
1329 SNA CLA /IS IT A CTRL/Q?
1330IFZERO OS8-10 < JMP DOEND2 > /YES, GO TO NEXT PIECE
1331IFNZRO OS8-10 < JMP START > /YES, GO TO READ ANOTHER TAPE
1332>
1333 JMP PLAY2 /AND GO PLAY!
1334
1335PAGE
1336\f
1337DIVP=LOLONG
1338DIVM=HOLONG
1339
1340/GIVEN THE DESIRED SPEED (12 BITS) AND
1341/(HOFUDG,LOFUDG) (24 BITS), CALCULATE
1342/HOW LONG A "G" IS (24 BITS) AND PUT
1343/IT IN (HOSAVE,LOSAVE)
1344DOMETE,
1345IFDEF WOW <DECIMAL
1346 JMS DOIT
1347IFZERO CPU-1 < T1+T2+T2+232 >
1348IFZERO CPU-2 < T1+T2+T2+270 >
1349OCTAL >
1350 JMS I [GET
1351IFNZRO CPU-4 <BSW>
1352IFZERO CPU-4<
1353 CLL RTL
1354 RTL
1355 RTL >
1356 DCA DIVP
1357 JMS I [GET /GET RIGHT HALF
1358 TAD DIVP
1359DOM1, DCA DIVP
1360 TAD DIVP
1361 CIA
1362 DCA DIVM /- LENGTH
1363 TAD HOFUDG
1364 DCA LOTIM
1365 DCA HOTIM
1366IFDEF WOW <DECIMAL
1367 JMS DOIT
1368IFZERO CPU-1 < T1+T3+78 >
1369IFZERO CPU-2 < T1+T3+90 >
1370OCTAL >
1371 JMS DIV /DIVIDE
1372 DCA HOSAVE
1373 TAD LOFUDG
1374 DCA LOTIM
1375IFDEF WOW <DECIMAL
1376 JMS DOIT
1377IFZERO CPU-1 < T1+T3+26 >
1378IFZERO CPU-2 < T1+T3+30 >
1379OCTAL>
1380 JMS DIV /DIVIDE LO
1381 DCA LOSAVE
1382IFDEF WOW <DECIMAL
1383 JMS DOIT
1384IFZERO CPU-1 < T1+1124 >
1385IFZERO CPU-2 < T1+1320 >
1386OCTAL>
1387 TAD (-6
1388 DCA WSA /WE MUST NOW SHIFT IT 6
1389 TAD HOSAVE /PLACES TO THE LEFT
1390 DCA HOLONG /FOR LONG NOTES
1391 TAD LOSAVE
1392 SKP
1393DOM2, TAD LOLONG
1394 CLL RAL
1395 DCA LOLONG
1396 TAD HOLONG
1397 RAL
1398 DCA HOLONG
1399 ISZ WSA
1400 JMP DOM2
1401 JMP I [NEXT
1402
1403
1404DIV, 0 /HOTIM,LOTIM/DIVP(DIVM)
1405 TAD (-15 /REM IN HOTIM, QUO IN LOTIM
1406 DCA WSA /SET UP DIVIDE COUNT
1407 JMP DIVB /AND GO DO IT
1408
1409DIVA, RAL /SHIFT DIVIDEND
1410IFDEF WOW < NOP > /FOR TIMING
1411 TAD DIVM /MINUS DIVISOR
1412 DCA HOTIM
1413 SNL /DID WE OVER-SUBTRACT?
1414 JMP DIVD /YES, WE'LL START ADDING DIVISOR
1415IFDEF WOW < NOP > /FOR TIMING
1416DIVB, TAD LOTIM /SHIFT DIVIDEND
1417 CML RAL
1418 DCA LOTIM
1419 TAD HOTIM
1420 ISZ WSA /ARE WE THROUGH?
1421 JMP DIVA /NO, CONTINUE SUBTRACTING
1422 DCA HOTIM /SAVE REMAINDER
1423IFDEF WOW<AND>
1424 TAD LOTIM /GET QUOTIENT
1425 JMP I DIV /AND RETURN
1426
1427DIVC, RAL /SHIFT DIVIDEND
1428 CML /MAKE IT WORK
1429 TAD DIVP /POSITIVE DIVISOR
1430 DCA HOTIM
1431 SZL /HAVE WE ADDED ENOUGH?
1432 JMP DIVB /YES, GO SUBTRACT FOR A WHILE
1433IFDEF WOW < NOP > /FOR TIMING
1434DIVD, TAD LOTIM /SHIFT DIVIDEND
1435 CML RAL
1436 DCA LOTIM
1437 TAD HOTIM
1438 ISZ WSA /ARE WE THROUGH?
1439 JMP DIVC /NO, GO ADD SOME MORE
1440 TAD DIVP /YES, CORRECT REMAINDER
1441 DCA HOTIM /AND SAVE IT
1442 TAD LOTIM /GET QUOTIENT
1443 JMP I DIV /AND RETURN
1444
1445DOTRAN,
1446IFDEF WOW <DECIMAL
1447 JMS DOIT /DO TRANSPOSE
1448IFZERO CPU-1 < T1+128 >
1449IFZERO CPU-2 < T1+150 >
1450OCTAL>
1451 TAD CHAR
1452 AND (70
1453 TAD (BFR1
1454 DCA TRAN
1455 JMP I [NEXT
1456
1457/GET A BYTE FROM THE INFO BUFFER
1458GET, 0
1459IFNZRO CORE-100 <
1460GETCDF, CDF 00 >
1461 TAD I GETPTR
1462IFNZRO CORE-100 <CDF>
1463 ISZ FLG
1464 JMP GETL
1465 ISZ GETPTR
1466 AND [77
1467 DCA CHAR
1468IFDEF WOW <
1469 NOP
1470 NOP
1471>
1472 JMP GET2
1473
1474GETL,
1475IFNZRO CPU-4< BSW >
1476IFZERO CPU-4 <
1477 RTR
1478 RTR
1479 RTR
1480>
1481 AND [77
1482 DCA CHAR
1483 STA
1484 DCA FLG
1485GET2, TAD CHAR
1486 JMP I GET
1487
1488PAGE
1489\f
1490/THE FIRST TASK IS TO FIGURE OUT WHICH NOTE
1491/WILL BE NEXT TO FINISH ONE CYCLE.
1492PLAYIT,
1493IFDEF WOW <DECIMAL
1494 JMS DOIT
1495IFZERO CPU-1 < T1+1128 >
1496IFZERO CPU-2 < T1+1335 >
1497OCTAL>
1498 TAD AT
1499 CIA CLL
1500 TAD BT
1501 SZL
1502 CLA SKP
1503 CIA
1504 TAD BT
1505 CIA CLL
1506 TAD CT
1507 SZL
1508 CLA SKP
1509 CIA
1510 TAD CT
1511 CIA CLL
1512 TAD DT
1513 SZL
1514 CLA SKP
1515 CIA
1516 TAD DT
1517 CIA CLL
1518 DCA SAVE
1519
1520/WELL, WE DON'T REALLY KNOW WHICH ONE, BUT
1521/WE DO KNOW HOW LONG IT IS. SO WE MOVE UP
1522/ALL FOUR COUNTERS, RESETTING ANY WHICH
1523/REACH ZERO, AND REMEMBERING HOW MANY
1524/SPIKES WE SHOULD DO.
1525 TAD RTOT
1526IFZERO CPU-4 <DCA SAVS>
1527IFNZRO CPU-4 <MQL>
1528 TAD AT
1529 TAD SAVE
1530 SNA
1531 JMP DELA
1532 DCA AT
1533IFNZRO CPU-4 <
1534 MQA
1535 TAD AR
1536 MQL >
1537IFZERO CPU-4 <
1538 TAD SAVS
1539 TAD AR
1540 DCA SAVS >
1541
1542RA, TAD BT
1543 TAD SAVE
1544 SNA
1545 JMP DELB
1546 DCA BT
1547IFNZRO CPU-4 <
1548 MQA
1549 TAD BR
1550 MQL >
1551IFZERO CPU-4 <
1552 TAD SAVS
1553 TAD BR
1554 DCA SAVS >
1555
1556RB, TAD CT
1557 TAD SAVE
1558 SNA
1559 JMP DELC
1560 DCA CT
1561IFNZRO CPU-4 <
1562 MQA
1563 TAD CR
1564 MQL >
1565IFZERO CPU-4 <
1566 TAD SAVS
1567 TAD CR
1568 DCA SAVS>
1569
1570RC, TAD DT
1571 TAD SAVE
1572 SNA
1573 JMP DELD
1574 DCA DT
1575IFNZRO CPU-4 <
1576 MQA
1577 TAD DR
1578 MQL >
1579IFZERO CPU-4 <
1580 TAD SAVS
1581 TAD DR
1582 DCA SAVS >
1583RD, IFNZRO CPU-4 <
1584 MQA
1585 DCA SAVS >
1586
1587/AND NOW FOR A BUNCH OF FUNNY CALCULATIONS.
1588/HOLD ON TO YOUR HAT....
1589 TAD SAVE /HOW MANY SPIKES THIS TIME
1590 CLL
1591 TAD LOTIM
1592 DCA LOTIM /UPDATE NOTE LENGTH
1593 SNL
1594 AND /TIMING CORRECTOR
1595 SZL
1596 ISZ HOTIM /UPDATE HIGH ORDER
1597 SKP
1598 JMP I [NEXT /FINISHED WITH THIS NOTE
1599IFDEF WOW <DECIMAL
1600 NOP
1601PLAY2, JMS DOIT
1602IFZERO CPU-1 < T1+216 >
1603IFZERO CPU-2 < T1+255 >
1604OCTAL >
1605IFNDEF WOW <
1606 IAC
1607PLAY2, >
1608 TAD OLDE /CORRECTION FACTOR FROM LAST TIME
1609 TAD FIX /HOW LONG IT IS THRU "DOIT"
1610 TAD SAVS /AND HOW MANY SPIKES WE HAVE
1611 SPA
1612 STL
1613 SMA /SET UP LINK FOR +/-
1614 CLL
1615 TAD SAVE
1616 SZL /DO WE HAVE TIME?
1617 JMP TRYAGN /NO
1618
1619IFDEF WOW <
1620/WE HAVE BEEN DEALING IN UNITS OF 6.4US.
1621/NOW WE CONVERT IT TO UNITS OF .1US
1622/BY MULTIPLYING BY 64 (SHIFT 6 PLACES)
1623 CIA
1624 TAD [7700
1625 DCA WSA
1626DECIMAL
1627 JMS DOIT
1628IFZERO CPU-1 < T1+674 >
1629IFZERO CPU-2 < T1+810 >
1630OCTAL
1631 TAD WSA
1632 BSW
1633 MQL
1634 MQA
1635 AND [7700 /JUST LOW ORDER BYTE*64
1636 DCA WSA
1637 JMP SAVIT
1638
1639/SINCE THERE ISN'T ENOUGH TIME BETWEEN SETS OF
1640/SPIKES TO GET AROUND DOIT, WE CAN'T DO THEM
1641/AT THE RIGHT TIME.
1642TRYAGN, TAD (+TIM6
1643 DCA OLDE /SAVE RETRY FUDGE
1644DECIMAL
1645 JMS DOIT
1646IFZERO CPU-1 < T1+268 >
1647IFZERO CPU-2 < T1+315 >
1648OCTAL
1649/NOW PUT THE EXTRA SPIKES ALONG WITH
1650/THE PREVIOUS BATCH
1651 TAD AXB
1652 DCA WSA
1653 TAD SAVS
1654 CDF 10
1655 TAD I WSA
1656 DCA I WSA
1657 TAD SAVS
1658 CDF
1659 TAD OLDS
1660 DCA OLDS
1661 JMP PLAYIT
1662>
1663IFNDEF WOW <
1664 CMA
1665 DCA SAVE
1666IFNZRO CPU-1 <NOP>
1667IFZERO CPU-1 <AND>
1668 ISZ SAVE
1669 JMP .-2
1670TRYAGN, DCA OLDE
1671 SKP
1672NOISA, NOISE
1673IFZERO CPU-1 <NOP>
1674 ISZ SAVS
1675IFNZRO CPU-1 <JMP .-2>
1676IFZERO CPU-1 <JMP .-3>
1677 JMP PLAYIT
1678>
1679
1680
1681DELA, TAD AC
1682 DCA AT
1683IFZERO CPU-4 <AND>
1684 JMP RA
1685DELB, TAD BC
1686 DCA BT
1687IFZERO CPU-4 <AND>
1688 JMP RB
1689DELC, TAD CC
1690 DCA CT
1691IFZERO CPU-4 <AND>
1692 JMP RC
1693DELD, TAD DC
1694 DCA DT
1695IFZERO CPU-4 <AND>
1696 JMP RD
1697
1698PAGE
1699\f
1700SPECIA, TAD XJMPT /JUMP TO SPECIAL ROUTINE
1701 DCA AXA
1702 TAD I AXA
1703 DCA WSA
1704 JMP I WSA
1705
1706SETN,
1707IFDEF WOW <DECIMAL
1708 JMS DOIT /SET NOTE
1709IFZERO CPU-1 < T1+T2+488 >
1710IFZERO CPU-2 < T1+T2+570 >
1711OCTAL>
1712 STA /REMEMBER NO MORE NOTES NOW
1713IFNDEF WOW <SETNM, >
1714SETN2, DCA WSB
1715 JMS I [GET /GET PITCH
1716 TAD TRAN
1717 DCA WSA
1718 TAD I WSA /PERIOD IN UNITS OF 6.4 US
1719 DCA I AXA
1720 LAS /CHECK LOUDNESS
1721 CMA
1722 AND [77
1723 TAD WSA /LOWER NOTES NEED EMPHASIS
1724 CLL RAR
1725 TAD XB
1726 DCA WSA
1727 TAD I WSA /HOW MANY SPIKES?
1728 DCA I AXA
1729 ISZ WSB /CHECK FLAG
1730 JMP I XNEXT1
1731 JMP I XNEXT2
1732
1733IFDEF WOW < DECIMAL
1734SETNM, JMS DOIT
1735IFZERO CPU-1 < T1+T2+488 >
1736IFZERO CPU-2 < T1+T2+570 >
1737 JMP SETN2
1738OCTAL>
1739
1740IFZERO CORE-100 <DOFLD, >
1741ERR0, HLT /PROGRAM BUG
1742
1743DOEND,
1744IFDEF WOW < DECIMAL
1745 JMS DOIT /WE'RE AT THE END!
1746IFZERO CPU-1 < T1+114 >
1747IFZERO CPU-2 < T1+135 >
1748OCTAL
1749 TAD BUFGET /WE MUST WAIT FOR THE
1750 CIA /END OF THE MUSIC TO PLAY
1751 TAD AXB
1752 AND X7760
1753 SZA CLA
1754 JMP DOEND
1755>
1756 LAS
1757 SPA CLA /REPEAT?
1758 JMP I [PLAY /YES
1759DOEND2,
1760IFZERO OS8-10 <
1761IFDEF WOW <
1762 JMS I [RESTOR > /RESTORE TOP PAGE OF FIELD 1
1763 JMS I XINNEWF /IS THERE ANOTHER INPUT FILE?
1764 SKP
1765 JMP I XST1 /YES, PLAY IT
1766 CDF 10
1767 TAD I X7642 /ALT-MODE FLAG?
1768 CDF
1769 SPA CLA
1770 JMP I [7600 /RETURN TO MONITOR
1771>
1772 JMP I [START /RETURN TO COMMAND DECODER
1773
1774IFNZRO CORE-100 <
1775/CHANGE TO A NEW FIELD FOR INPUT INFO
1776DOFLD,
1777IFDEF WOW < DECIMAL
1778 JMS DOIT
1779IFZERO CPU-1 < T1+168 >
1780IFZERO CPU-2 < T1+195 >
1781OCTAL >
1782 ISZ BUFTAB
1783 TAD I BUFTAB /GET NEW FIELD
1784 DCA I XGETCDF /SAVE IT
1785 DCA FLG /RESET PACKING FLAG
1786 DCA GETPTR /START AT ADDRESS 0
1787 JMP I [NEXT
1788XGETCD, GETCDF
1789>
1790XA=BFR1%2
1791XB, BFR2-XA
1792XJMPT, JMPTB2-1
1793XNEXT1, NEXT1
1794XNEXT2, NEXT2
1795IFZERO OS8-10 <
1796XINNEW, INNEWF
1797XST1, START1
1798X7642, 7642
1799>
1800IFDEF WOW <
1801X7760, 7760
1802SAVIT, TAD OLDS /CORRECT: SPIKES TAKE
1803 TAD SAVS /6.2US, NOT 6.4 US, AND
1804IFZERO CPU-2 <CLL RAL >
1805 TAD FUDGE /DOIT DOESN'T REALLY TAKE
1806 CLL RAL /TIM6*6.4US
1807 TAD WSA
1808 CDF 10
1809 DCA I AXB /SAVE LOW ORDER
1810 TAD [7700
1811 MQA /NOW WE HAVE HIGH ORDER
1812 SZL /BYTE ON RIGHT SIDE OF AC
1813 NOP
1814 SNL
1815 IAC /BORROW FROM LOW ORDER?
1816 DCA I AXB /SAVE AWAY HIGH ORDER
1817 STA
1818 TAD SAVS
1819 DCA I AXB /SAVE NO. OF SPIKES
1820 CDF
1821 DCA OLDS /RESET RETRY COUNTERS
1822 DCA OLDE
1823WAIT1, CLL STA RTL
1824 TAD BUFGET
1825 CIA
1826 TAD AXB
1827 SZA CLA /BUFFER FULL?
1828 JMP I [PLAYIT /NO
1829 MQL /ZERO TO MQ FOR SHOW
1830 NOP
1831DECIMAL
1832 JMS DOIT
1833IFZERO CPU-1 < T1+238 >
1834IFZERO CPU-2 < T1+285 >
1835OCTAL
1836 KRB /LAST CHARACTER TYPED?
1837 AND C1 /MASK PARITY
1838 TAD C2 /CTRL/C?
1839 SNA
1840 JMP WAIT2 /YES
1841 TAD C4 /CTRL/Q?
1842 SNA CLA
1843 JMP I C5 /YES, NEXT INPUT
1844 JMP WAIT1
1845WAIT2,
1846IFZERO OS8-10 <
1847 JMS I [RESTOR > /RESTORE TOP OF FIELD 1
1848 JMP I C3 /JUMP OUT
1849
1850C1, 177
1851C2, -"C+300
1852C3,
1853IFZERO OS8-10 <7600>
1854IFNZRO OS8-10 <START>
1855C4, "C-"Q
1856C5,
1857IFZERO OS8-10 <DOEND2>
1858IFNZRO OS8-10 <START>
1859IFZERO CPU-1 <
1860FUDGE, -2 /HALF OF 4
1861>
1862IFZERO CPU-2 <
1863FUDGE, -33 /ABOUT HALF OF 55
1864>>
1865\f
1866BRANA, -"# ;KEYS /DEFINE SHARP
1867 -"! ;KEYF /DEFINE FLATS
1868 -"V ;DEFV
1869 -"Y ;DEFY
1870 -"T ;DEFT
1871 -215 ;START2
1872 -212 ;NEXLIN
1873 -"; ;START2
1874 -"$ ;ENDM /END MUSIC
1875BRANB, -"G ;LENG
1876 -"D ;LEND
1877 -"S ;LENS
1878 -"Q ;LENQ
1879 -"C ;LENC
1880 -"M ;LENM
1881 -"B ;LENB
1882 -"3 ;TRIPLET
1883 0 ;BADLINE
1884
1885BRANC, -"; ;PROB
1886 -215 ;PROB
1887 0 ;DEFV+1
1888
1889BRAND, -"= ;DEFM
1890 -"( ;DEFCHORD
1891 -"T ;TIE
1892 -"- ;MINUS
1893 -". ;DOT
1894 0 ;BADLINE
1895
1896BRANE, -"" ;ACCN
1897 -"# ;ACCS
1898 -"! ;ACCF
1899BRANF, -"+ ;OCTUP
1900 -"- ;OCTDN
1901 -", ;PRODUCE
1902 -"; ;SPRODUCE
1903 -215 ;SPRODUCE
1904 -") ;PPRODUCE
1905 0 ;BADLINE
1906
1907BRANG, -", ;PRODUCE
1908 -"; ;PRODUCE
1909 -215 ;PRODUCE
1910 0 ;BADLINE
1911
1912
1913KEYTAB, ZBLOCK 10
1914
1915DECO9, DECIMAL;-1000;-100;-10;-1;0;OCTAL
1916
1917/TABLE: WHERE ARE THE WHITE KEYS, A THROUGH G?
1918BASTAB, 36;40;41;43;45;46;50
1919\f
1920/TABLE OF BUFFER AREAS
1921BUFTBL, MUSBUF
1922IFZERO OS8-10 < MARGIN-INBUF>
1923IFZERO OS8-20 < MARGIN-7600 >
1924IFNZRO CORE-100 <
1925 CDF 00
1926IFNDEF WOW<
1927 MARGIN-7600
1928 CDF 10>
1929 MARGIN-7600
1930 CDF 20
1931CORTAB=.
1932 MARGIN-7600
1933 CDF 30
1934 MARGIN-7600
1935 CDF 40
1936 MARGIN-7600
1937 CDF 50
1938 MARGIN-7600
1939 CDF 60
1940 MARGIN-7600
1941 CDF 70
1942 0
1943>
1944*.+1&7776
1945BFR1,
1946DECIMAL
1947
1948IFNZRO T64 <
1949
1950/PERIOD OF NOTES IN UNITS OF 6.4US
1951/USING EQUAL TEMPERAMENT
1952-4018;-3792;-3579;-3378;-3189;-3010
1953/A--
1954-2841;-2681;-2531;-2389;-2255;-2128
1955-2009;-1896;-1790;-1689;-1594;-1505
1956/A-
1957-1420;-1341;-1265;-1194;-1127;-1064
1958-1004;-948;-895;-845;-797;-752
1959/A
1960-710;-670;-633;-597;-564;-532;-502;-474;-447;-422;-399;-376
1961/A+
1962-355;-335;-316;-299;-282;-266;-251;-237;-224;-211;-199;-188
1963/A++
1964-178;-168;-158;-149;-141;-133;-126;-119;-112;-106;-100;-94
1965/A+++
1966-89;-84;-79;-75;-70;-67;-63;-59;-56;-53;-50;-47
1967-44 /A++++!!
1968>
1969IFZERO T64 <
1970/PERIOD OF NOTES IN 6.0 MICROSECOND UNITS
1971/USING EQUAL TEMPERAMENT
1972
1973-2143;-4045;-3818;-3604;-3401;-3210
1974/A--
1975-3030;-2860;-2700;-2548;-2405;-2270
1976-2143;-2022;-1909;-1802;-1701;-1605
1977/A-
1978-1515;-1430;-1350;-1274;-1203;-1135
1979-1071;-1011;-954;-901;-850;-803
1980/A
1981-758;-715;-675;-637;-601;-568
1982-536;-506;-477;-450;-425;-401
1983/A+=A440
1984-379;-358;-337;-319;-301;-284
1985-268;-253;-239;-225;-213;-201
1986/A++
1987-189;-179;-169;-159;-150;-142
1988-134;-126;-119;-113;-106;-100
1989/A+++
1990-95;-89;-84;-80;-75;-71
1991-67;-63;-60;-56;-53;-50
1992-47 /A++++!!!
1993>
1994/NUMBER OF PULSES GENERATED DETERMINE LOUDNESS
1995BFR2,
1996104;97;91;84;79;74;69
199764;60;56;52;48;45;42;39
199837;34;32;30;28;26;24;23
199921;20;18;17;16;15;14;13
200012;11;10;9;9;8;8;7
20017;6;6;6;5;5;5;4
20024;4;3;3;3;3;3;2
20032;2;2;2;2;2;2;1
20041;1;1;1;1;1;1;1
2005OCTAL
2006\f
2007JMPTAB, REST
2008 RESTM
2009 SETN
2010 SETNM
2011 ERR0
2012 ERR0
2013 ERR0
2014 ERR0
2015
2016JMPTB2, DOEND
2017 NEXHOL
2018 DOMETER
2019 DOTRANSPOSE
2020 ERR0;ERR0
2021 DOFLD
2022 DOTRANSPOSE;
2023 ERR0;ERR0;ERR0;DOTRANSPOSE
2024 ERR0;ERR0;ERR0;DOTRANSPOSE
2025 ERR0;ERR0;ERR0;ERR0;ERR0;ERR0;ERR0;ERR0
2026 ERR0;ERR0;ERR0;ERR0;ERR0;ERR0;ERR0;ERR0
2027NOPUNCH
2028LINBUF, ZBLOCK 100 /SAVE INPUT TO PRINT ERROR MESSAGE
2029MUSBUF=. /BEGINNING OF MUSIC BUFFER
2030IFZERO OS8-10 <
2031*6600
2032IFDEF WOW < SAVBUF, > /SAVE FOR TOP OF FIELD 1
2033INBUF, ZBLOCK 400 /OS/8 I/O BUFFER
2034INDEVH, ZBLOCK 400 /OS/8 DEVICE HANDLER SPACE
2035>
2036ENPUNCH
2037\f
2038IFNZRO CORE-100 < /INITIALIZATION CODE
2039*LINBUF+177&7600
2040INIT, 0
2041COR0, CDF 0
2042 TAD CORSIZ
2043 RTL
2044 RAL
2045 AND COR70
2046 TAD COREX /MAKE CDF FOR FIELD
2047 DCA .+1 /TO BE TESTED
2048COR1, CDF .-.
2049 TAD I CORLOC
2050COR2, NOP
2051 DCA COR1
2052 TAD COR2
2053 DCA I CORLOC
2054COR70, 70
2055 TAD I CORLOC
2056CORX, 7400
2057 TAD CORX
2058 TAD CORV
2059 SZA CLA
2060 JMP COREX
2061 TAD COR1
2062 DCA I CORLOC
2063 ISZ CORSIZ
2064 JMP COR0
2065
2066CORLOC, CORX
2067CORV, 1400
2068CORSIZ, 1
2069COREX, CDF 00
2070
2071IFZERO OS8-10 <
2072 TAD I BATFLG
2073 AND COR70 /ARE WE RESTRICTED IN CORE?
2074 CLL RTR
2075 SZA
2076 JMP .+4> /YES, IGNORE ACTUAL CORE SIZE
2077 STA
2078 TAD CORSIZ /TOP FIELD
2079 CLL RAL
2080 TAD CORTBA
2081 DCA WSA
2082IFZERO OS8-10 <
2083 TAD I BATFLG /ARE WE RUNNING UNDER BATCH?
2084 RTL
2085 SNL CLA
2086 JMP COR3 /NO, OK
2087 TAD BATPRO /YES, DON'T WIPE OUT MONITOR
2088 DCA I WSA
2089>
2090COR3, ISZ WSA
2091 ISZ WSA
2092 DCA I WSA /DON'T USE FIRST NONEXISTANT FIELD
2093 TAD COR2 /NOP
2094 DCA I CORINA /DON'T RETURN HERE
2095IFDEF WOW <
2096 STA
2097 TAD CORSIZ
2098 SPA SNA CLA
2099 HLT /NOT ENOUGH CORE!!
2100>
2101 JMP I INIT
2102
2103CORINA, CORINI
2104BATFLG, 7777
2105CORTBA, CORTAB-6
2106BATPRO, MARGIN-5000
2107>
2108$