5 /FOR CCL USE: SAVE SYS MUSIC;201=400
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.
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
22 /FILL IN 10 TO RUN UNDER OS/8
23 /FILL IN 20 FOR PAPER TAPE INPUT ONLY
25 IFNDEF 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)
31 IFNDEF 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.
38 IFZERO OS8+CORE-110 <ILLEGAL CONFIGURATION>
39 IFNZRO CPU-1<IFNZRO CPU-2<IFNZRO CPU-4<
40 ILLEGAL CONFIGURATION>>>
41 IFNZRO OS8-10<IFNZRO OS8-20<ILLEGAL CONFIGURATION>>
42 IFNZRO CORE-100<IFNZRO CORE-200<IFNZRO CORE-400<
43 ILLEGAL CONFIGURATION>>>
46 IFNZRO CPU-4 <WOW=10>>
48 MARGIN=4 /DO WE CATCH FIELD CHANGES IN TIME?
64 NOTE, 0 /-1 FOR REST THROUGH 6 FOR G
65 NOTEV, 0 /POINTER TO #! TABLE:KEYTAB
66 THIRD, 0 /-1 FOR 1/THIRD TIME
67 PAREN, 0 /-1 WHEN ( FOUND
68 OCTAVE, 0 /REMEMBER + AND -
69 THISLE, 0 /LENGTH THIS TIME
70 TOTLEN, 0 /LENGTH OF NOTE
71 ACC, 0 /REMEMBER ACCIDENTALS
72 NOTCNT, 0 /COUNT OF NOTES TO PRODUCE
80 L, 0 /# OF LINE FEEDS SINCE Y
81 TFLAG, 0 /-1 TO PRINT LINE
82 MINFLG, 0 /-1 TO SUBTRACT NOTES
86 PROTND, /THE END OF WORKING LOCATIONS TO BE ZEROED
88 INCHCT, -1 /-# CHARACTERS IN BLOCK
89 INEOF, 1 /NON-ZEOR FOR EOF
90 INFPTR, 7617 /PNTR TO INPUT INFO
91 INCTR, 0 /-LENGTH IN BLOCKS
92 INPTR, 0 /BUFFER POINTER
93 INSAVE, 0 /HALF OF CHAR 3
96 /WORKING STORAGE FOR MUSIC MAKER
99 /THE FOLLOWING NUMBERS ALL REPRESENT TENTHS OF A MICROSECOND
115 T6A=55 /TIM6*64-(DOIT TIME)
119 IFZERO CPU-1 <TIM6=26>
120 IFZERO CPU-2 <TIM6=26>
121 IFZERO CPU-4 <TIM6=36>>
122 MDEFAULT=30^74%2 /C=60
176 /USED TO FIGURE METER: HOW MANY 6.4US UNITS
177 /ARE THERE IN ONE MINUTE DIVIDED BY TWO?
189 /AND THE MAGIC SUBROUTINE
191 TAD I DOIT /HOW LONG 'TILL NEXT CALL?
196 TAD LOWAIT /IS THERE ENOUGH TIME TO RETURN
197 SNL /AND GET BACK IN TIME?
199 ISZ I BUFGET /HOW ABOUT HIGH ORDER 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?
206 TAD (JIFFY /NO, UPDATE AC
207 JMP .-3 /AND TRY AGAIN
210 ISZ BUFGET /NOW HOW MANY SPIKES?
213 NOISA, NOISE /MAKE A SPIKE
215 JMP .-2 /ANOTHER SPIKE
218 NOP /MAKING UP FOR TIMING ERROR
233 TAD I BUFGET /LOW ORDER TIME
235 ISZ BUFGET /POINT TO HO TIME
237 JMP DOIT1 /COVER ISZ SKIP
239 DOIT5, TAD [0 /TIMING CORRECTOR
247 /ALTERNATE RESTART ADDRESS TO BEGIN PLAYING
251 NOISA /ADDRESS OF NOISE, FOR CONVENIENCE
253 CPU+OS8+CORE /FOR CONVENIENCE
256 /BEGINNING OF EVERYTHING
260 IFDEF WOW <SKP;SKP> /LEAVE ROOM FOR RESTORE TRAP
261 JMS OSDEC /CALL COMMAND DECODER
263 START1, TLS /BRING UP PRINTER FLAG
264 JMS KEYC /DEFAULT TO KEY OF C
267 TAD I BUFTAB /AUTO-INDEX
268 DCA OUTBUF /BEGINNING OF BUFFER
270 DCA LIMIT /END OF BUFFER
273 DCA OUTCDF /FIELD OF BUFFER
274 CORINI, JMS INIT /INITIALIZE CORE SIZE, ETC.
278 TAD (PROTAB-PROTND /CLEAR OUT ALL THE NOTES
279 DCA WSA /AND OTHER THINGS
286 /INITIALIZE AFTER ; OR CR
290 /INITIALIZE FOR NEXT NOTE
297 /INITIALIZE FOR NEXT NOTE IN CHORD
299 START5, BRANCH /JMP BASED ON NEXT INPUT CHAR
302 NEXNOT, ISZ PAREN /ARE WE IN A CHORD?
305 DCA TOTLEN /NO-ANOTHER LENGTH
310 DCA THIRD /REMEMBER IT'S A TRIPLET
313 MINUS, STA /SUBTRACT NOTE DURATIONS
317 KEYF, AC7776 /DEFINE FLATS
318 KEYS, IAC /DEFINE SHARPS
320 JMS GETEQ /BUMP PAST =
322 JMS KEYC /RESET TO KEY OF C
323 KEYL, JMS GETNOTE /IS THERE A NOTE?
326 DCA I NOTEV /REMEMBER SHARP/FLAT
329 SNA CLA /IS THERE ANOTHER?
332 JMP START5 /DO SOMETHING ELSE
334 LENG, IAC /GRACE NOTE!
335 ISZ THIRD /DID HE SAY TRIPLET?
337 JMS BADSTAR /YES-THAT'S NO GOOD
340 LENB, IAC /SEMI-BREVE
344 LENS, IAC /SEMI-QUAVER
348 ISZ THIRD /THIRD TIME?
353 ADDLEN, ISZ MINFLG /DO WE SUBTRACT?
356 DCA THISLEN /LENGTH THIS NOTE
359 SPA SNA /DID HE SUBTRACT TOO MUCH?
361 DCA TOTLEN /TOTAL LENGTH
362 JMS GETNOTE /IS THERE A NOTE YET?
363 JMP .+3 /NO, SOMETHING ELSE I GUESS
364 NMODS, BRANCH /YES, NOW WHAT?
370 PUTNO, JMS BADSTA /OUT OF CORE!
371 JMS MSG /PRINT LAST LINE
376 JMP ENDM /NOW PLAY IT
381 SMA /FIX LINK TO SIGN OF NUMBER
385 ADDNEG, JMS BADSTA /NO
391 /METER IS SAVED AS 12 BIT LENGTH*METER/2
393 DEFM, ISZ PAREN /DEFINE METER
395 JMP BADLINE /OOPS--INSIDE A (?
398 JMP BADLINE /MUST BE VALID
400 TAD TOTLEN /LENGTH OF NOTE
406 TAD (4 /DEFINE METER CODE
415 JMS LIMTST /TEST FOR END OF BUFFER AREA
421 JMS BADSTA /NESTED ((
424 JMS GETNOTE /WE SHOULD HAVE A NOTE
426 JMP NMODS /NOW TRY FOR "!+=
429 ACCF, CLL STA RTL /FLAT
436 OCTMOR, BRANCH /LOOK FOR +-
439 OCTUP, TAD (30 /FOUND +
440 OCTDN, TAD (-14 /FOUND -
443 JMP OCTMOR /ARE THERE MORE?
445 PPRODU, ISZ PAREN /WE SHOULD BE INSIDE ) HERE
450 SPRODU, ISZ PAREN /WAS THERE A PAREN?
452 JMS BADSTA /YES--NO ) THOUGH
458 CLL RAR /NO, DIVIDE BY TWO
459 SNA /MAYBE ZERO IF NATURAL
460 SZL /NON-ZERO LINK IF NATURAL
462 TAD I NOTEV /GET DEFAULT #!"
463 DCA ACC /-1 FOR !,1 FOR #
467 TAD I NOTE /GET NOTE NUMBER
470 TAD TRANSPOSE /DID HE REQUEST TRANSPOSE
471 PRO3, SMA /MAKE SURE IT IS WITHIN RANGE
475 JMS BADSTA /OUT OF RANGE
481 TAD (117-14 /OUT OF RANGE
490 SNA CLA /SPACE IN THE TABLE?
492 ISZ WSA /GO TO NEXT ENTRY
497 JMS BADSTA /TRYING TO PLAY 5 NOTES
502 PRO9, ISZ NOTCNT /COUNT HOW MANY
507 DCA I WSA /SET FLAG SO WE WILL
508 ISZ WSA /PROCESS NOTE LATER
510 DCA I WSA /REMEMBER PITCH
513 SNA CLA /DO WE EXPECT MORE NOTES?
517 JMP START2 /THERE ARE NO NOTES TO WORRY ABOUT
525 /FIRST WORRY ABOUT NOTES WHICH MUST BE CHANGED TO RESTS
529 SZA CLA /IS THIS A TIMED OUT NOTE?
531 ISZ I WSA /IS IT A REST?
532 JMP PUT3 /NO-BETTER MAKE IT ONE
534 DCA I WSA /REMEMBER IT IS REST
535 PUT2, JMS LIMTST /TEST FOR END OF BUFFER AREA
538 JMP PUT0 /GO FOR MORE
539 TAD (PROTAB /START OVER AGAIN
544 /NOW WORRY ABOUT OUR NEW NOTES
547 SZA CLA /ACTIVE NOTE?
549 PUT5, ISZ WSA /GO TO NEXT ENTRY
553 HLT /HLT HERE MEANS BUG
555 PUT3, TAD (10 /DEFINE A REST
561 PUT6, ISZ I WSA /FLAG SET?
562 JMP PUT5 /NO, IGNORE IT
563 JMS LIMTST /TEST FOR END OF BUFFER AREA
568 TAD RTRAN /GET AUTOMATIC TRANSPOSE
570 /THERE ARE MORE THAN 64 NOTES, BUT ONLY 6 BITS
571 /TO REMEMBER WITH. SO WE DO THIS:
574 JMP PUT6A /NOTHING TO DO
577 TAD I WSA /TAD IN PITCH
578 AND (70 /GET TRANSPOSE AMOUNT
581 TAD (6 /PUT IN FUNCTION CODE
582 JMS OUT /STASH IT IN BUFFER
587 PUT7, ISZ NOTCNT /LAST NOTE?
594 TAD RTRAN /AUTOMATIC TRANSPOSE
596 JMS OUT /NO, REMEMBER PITCH
600 JMP PUT5+1 /NO, GO FOR MORE
603 /CHECK FOR THE END OF THE BUFFER SPACE
608 SNL CLA /AT OR NEAR END?
611 TAD I BUFTAB /AUTO-INDEX
612 SNA /IS THERE MORE BUFFER AREA?
614 DCA LIMIT /LIMIT OF BUFFER IN THIS FIELD
615 TAD (14 /CODE FOR FIELD SWITCH
617 TAD I BUFTAB /CDF NEW FIELD
619 DCA OUTBUF /START AT LOCATION ZERO
632 /NOW FIGURE OUT WHAT THE SHORTEST TIME LEFT
633 /IS OF THE FOUR NOTES, AND SUBTRACT THAT
661 JMS OUT /OUTPUT LENGTH
663 /NOW IF IT WAS LONGER THAN 64, WE NEED TO REMEMBER THAT
671 JMS LIMTST /CHECK FOR END OF BUFFER AREA
673 ISZ WSA /WAS IT TOO LONG?
674 JMS OUT /YES--CREATE LONGER NOTE
677 JMP START2 /GO FOR MORE
679 NEXLIN, ISZ TFLAG /ERROR?
681 JMS MSG /YES-PRINT LINE
683 DCA LINE /RESET BUFFER POINTER
688 DEFY, TAD TIMA /WE FOUND A Y
689 TAD TIMB /ARE ALL NOTES TIMED OUT?
693 JMS BADSTA /NOTES DID NOT FINISH TOGETHER
694 DCA TIMA /WHETHER THEY ARE OR NOT,
695 DCA TIMB /WE WILL MAKE THEM SO
701 JMS GETEQ /IS THERE AN =
703 JMS DECIN /GET DECIMAL #
708 BRANCH /LOOK FOR END OF LINE
711 DECIN, 0 /DECIMAL INPUT
741 JMP TYPENO /YES-NO PRINTING
746 KRS /LASTLY TYPED CHARACTER
747 AND [177 /REMOVE PARITY
749 SNA CLA /IS IT CTRL/O?
750 KSF /AND IS FLAG SET?
752 DCA COFLG /REMEMBER FLAG FOR NEXT TIME
758 IFZERO OS8-20 < IFNDEF WOW <
762 SMALL, 0 /FIND SMALLEST LENGTH
764 JMP I SMALL /IGNORE ZEROES
768 CIA /FOUND A SMALLER ONE
775 OSDEC, 0 /CALL OS8 COMMAND DECODER
779 "M-300^100+"U-300 /.MU DEFAULT
783 DCA INEOF /CAUSE AN END OF FILE
784 TAD (7617 /INIT FILE POINTER
789 INCHAR, ISZ INJMP /UNPACKING SWITCH
790 ISZ INCHCT /ANY MORE CHARACTERS?
791 INJMPP, JMP INJMP /YES
794 JMP INGBUF /NO-GO READ
795 GETNEW, JMS INNEWF /GO TO NEXT FILE
796 JMP ENDM /NO MORE FILES
799 ISZ INEOF /WE'RE ON LAST BLOCK
800 JMS I INHNDL /READ FROM INPUT
805 INBREC, ISZ INREC /GO TO NEXT BLOCK
814 C7700, SMA CLA /FATAL ERROR?
815 JMP INBREC /END OF FILE
817 INJMP, HLT /UNPACKING JUMP
839 JMP GETNEW /TIME FOR NEXT FILE
843 /GO TO NEXT INPUT FILE
851 JMP I INNEWF /NO MORE INPUT FILES
853 JMS I C7700 /FETCH HANDLER
885 CH1, TAD [-20 /SET FOR DELAY OF A WHILE
887 CH2, KSF /ANYTHING AT LOW SPEED?
890 JMP I OSIN /AND RETURN
892 CH3, RSF /ANYTHING AT HIGH SPEED?
895 JMP I OSIN /AND RETURN
903 RFC /TRY TO START THE READER
904 CLA /IN CASE OF FUNNY INTERFACES
910 IFZERO OS8-20 < IFNDEF WOW <
914 BRAN0, 0 /BRANCH BASED ON CHARACTER
915 DCA CHAR /MAYBE USE CHAR IN AC
934 GETEQ, 0 /SKIP IF NEXT CHAR IS =
941 KEYC, 0 /SET TO KEY OF C
951 GETNOT, 0 /GET A NOTE
962 DCA OCTAVE /CLEAR OUT +-
963 DCA ACC /CLEAR ACCIDENTALS
969 JMP I GETNOTE /NO NOTE
973 /GET A CHARACTER, AND REMEMBER IN CASE OF ERROR
989 JMP IN+1 /INVALID CHARACTER-IGNORE
992 SPA CLA /SOMEWHAT LONG?
994 TAD [LINBUF-1 /YES, START OVER
997 DCA I LINE /SAVE IN LINE BUFFER
1001 JMP IN+1 /IGNORE(BUT PRINT) SPACES
1005 BADLIN, JMS BADSTA /PRINT "*"
1006 JMP DEFV /FIND NEXT LINE
1012 TAD I WSA /GET LAST CHARACTER
1013 DCA I LINE /MOVE IT OVER
1015 DCA I WSA /PUT * IN LINE
1017 DCA TFLAG /PRINT THIS LINE
1018 JMP I BADSTA /RETURN
1021 DEFT, JMS GETEQ /BUMP OVER EQUAL
1022 JMP BADLINE /OOPS, NONE
1023 JMS DECIN /GET DECIMAL NUMBER
1024 TAD (-144 /T=100 IS NO TRANSPOSE
1026 JMP DEFV /IGNORE REST OF LINE
1030 ENDM, JMS OUT /OUTPUT END CODE (0)
1031 JMP I [PLAY /NOW GO AND PLAY
1032 IFDEF 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
1037 DCA AXA /OS/8 STUFF WHICH IS THERE.
1047 DCA I [7600 /SET RESTART TRAP
1050 JMP I [PLAY /NOW, WE CAN PLAY MUSIC!
1052 RESTOR, 0 /SUBROUTINE TO RESTORE THE
1053 TAD [7600 /TOP PAGE OF FIELD ONE
1063 TAD MSG /RESTORE 7600
1072 JMS DECOUT /PRINT Y NUMBER
1075 JMS DECOUT /PRINT L NUMBER
1111 IFNZRO CORE-100 < CDF >
1151 /MULTIPLY:AC=WSB*(JMS+1)
1166 /THE START OF THE PLAYING PART OF THE COMPILER
1167 PLAY, DCA FLG /RESET PACKING FLAG
1172 DCA AXB /START OFF WITH A LONG
1173 DCA BUFGET /PAUSE (.84 SEC)
1184 DCA SAVS /DON'T START WITH POP
1195 JMP DOM1 /SET METER DEFAULT
1199 IFZERO CPU-1 < T1+158 >
1200 IFZERO CPU-2 < T1+180 >
1202 TAD (2000 /LOW FREQUENCY
1204 DCA I AXA /NO SPIKES
1206 DCA I AXA /KEEP SIMULTANEOUS NOTES
1210 IFZERO CPU-1 < T1+T2+190 >
1211 IFZERO CPU-2 < T1+T2+225 >
1213 JMS I [GET /WHAT DO WE DO?
1216 JMP SPECIAL /SOMETHING SPECIAL
1221 TAD I WSA /GET DISPATCH ADDRESS
1226 IFZERO CPU-1 < T1+140 >
1227 IFZERO CPU-2 < T1+165 >
1234 JMP I WSA /NOW DISPATCH
1239 IFZERO CPU-1 < T1+158 >
1240 IFZERO CPU-2 < T1+180 >
1243 DCA I AXA /LOW FREQUENCY
1244 DCA I AXA /NO SPIKES
1246 DCA I AXA /KEEP SIMULTANEOUS NOTES
1249 IFZERO CPU-1 < T1+T2+12 >
1250 IFZERO CPU-2 < T1+T2+15 >
1252 JMS I [GET /GET DURATION
1254 JMP NEXHOL /IT'S A LONG ONE
1257 IFZERO CPU-1 < T1+2678 >
1258 IFZERO CPU-2 < T1+3135 >
1260 TAD CHAR /NOW WE WANT TO MULTIPLY DURATION
1263 CLL RTL /BY LENGTH OF A "G" IN
1264 RTL /HOSAVE,LOSAVE (IN UNITS OF A
1265 RTL > /6.4 MICROSECOND)
1272 /NOW WE'RE ALL SET TO MULTIPLY
1281 DCA WSB /BIT OF MULTIPLIER IN L
1283 JMP NEXNO2 /NO ADDING TO DO
1287 CML RAL /REMEMBER CARRY!
1291 IFNDEF WOW <NEXNO2,>
1294 JMP NEXINI /DONE MULTIPLYING
1296 NEXNO2, TAD /WASTE TIME
1300 AND I AXA /NEED AUTO-INDEX FOR EXTRA .2US
1306 JMS DOIT /HOLD FOR 64 "G"S
1307 IFZERO CPU-1 < T1+270 >
1308 IFZERO CPU-2 < T1+315 >
1314 NEXINI, TAD AR /REMEMBER HOW MANY
1315 TAD BR /SPIKES IN ALL
1322 KRB /WHAT WAS THE LAST CHARACTER TYPED?
1323 AND (177 /MASK PARITY
1324 TAD (-3 /CHECK FOR CTRL/C
1326 IFZERO OS8-10 < JMP I [7600 > /YES, RETURN TO MONITOR
1327 IFNZRO OS8-10 < JMP START> /YES, READ ANOTHER TAPE
1329 SNA CLA /IS IT A CTRL/Q?
1330 IFZERO OS8-10 < JMP DOEND2 > /YES, GO TO NEXT PIECE
1331 IFNZRO OS8-10 < JMP START > /YES, GO TO READ ANOTHER TAPE
1333 JMP PLAY2 /AND GO PLAY!
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)
1347 IFZERO CPU-1 < T1+T2+T2+232 >
1348 IFZERO CPU-2 < T1+T2+T2+270 >
1357 JMS I [GET /GET RIGHT HALF
1368 IFZERO CPU-1 < T1+T3+78 >
1369 IFZERO CPU-2 < T1+T3+90 >
1377 IFZERO CPU-1 < T1+T3+26 >
1378 IFZERO CPU-2 < T1+T3+30 >
1384 IFZERO CPU-1 < T1+1124 >
1385 IFZERO CPU-2 < T1+1320 >
1388 DCA WSA /WE MUST NOW SHIFT IT 6
1389 TAD HOSAVE /PLACES TO THE LEFT
1390 DCA HOLONG /FOR LONG NOTES
1404 DIV, 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
1409 DIVA, RAL /SHIFT DIVIDEND
1410 IFDEF WOW < NOP > /FOR TIMING
1411 TAD DIVM /MINUS DIVISOR
1413 SNL /DID WE OVER-SUBTRACT?
1414 JMP DIVD /YES, WE'LL START ADDING DIVISOR
1415 IFDEF WOW < NOP > /FOR TIMING
1416 DIVB, TAD LOTIM /SHIFT DIVIDEND
1420 ISZ WSA /ARE WE THROUGH?
1421 JMP DIVA /NO, CONTINUE SUBTRACTING
1422 DCA HOTIM /SAVE REMAINDER
1424 TAD LOTIM /GET QUOTIENT
1425 JMP I DIV /AND RETURN
1427 DIVC, RAL /SHIFT DIVIDEND
1429 TAD DIVP /POSITIVE DIVISOR
1431 SZL /HAVE WE ADDED ENOUGH?
1432 JMP DIVB /YES, GO SUBTRACT FOR A WHILE
1433 IFDEF WOW < NOP > /FOR TIMING
1434 DIVD, TAD LOTIM /SHIFT DIVIDEND
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
1447 JMS DOIT /DO TRANSPOSE
1448 IFZERO CPU-1 < T1+128 >
1449 IFZERO CPU-2 < T1+150 >
1457 /GET A BYTE FROM THE INFO BUFFER
1462 IFNZRO CORE-100 <CDF>
1490 /THE FIRST TASK IS TO FIGURE OUT WHICH NOTE
1491 /WILL BE NEXT TO FINISH ONE CYCLE.
1495 IFZERO CPU-1 < T1+1128 >
1496 IFZERO CPU-2 < T1+1335 >
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.
1526 IFZERO CPU-4 <DCA SAVS>
1587 /AND NOW FOR A BUNCH OF FUNNY CALCULATIONS.
1588 /HOLD ON TO YOUR HAT....
1589 TAD SAVE /HOW MANY SPIKES THIS TIME
1592 DCA LOTIM /UPDATE NOTE LENGTH
1594 AND /TIMING CORRECTOR
1596 ISZ HOTIM /UPDATE HIGH ORDER
1598 JMP I [NEXT /FINISHED WITH THIS NOTE
1602 IFZERO CPU-1 < T1+216 >
1603 IFZERO CPU-2 < T1+255 >
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
1613 SMA /SET UP LINK FOR +/-
1616 SZL /DO WE HAVE TIME?
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)
1628 IFZERO CPU-1 < T1+674 >
1629 IFZERO CPU-2 < T1+810 >
1635 AND [7700 /JUST LOW ORDER BYTE*64
1639 /SINCE THERE ISN'T ENOUGH TIME BETWEEN SETS OF
1640 /SPIKES TO GET AROUND DOIT, WE CAN'T DO THEM
1643 DCA OLDE /SAVE RETRY FUDGE
1646 IFZERO CPU-1 < T1+268 >
1647 IFZERO CPU-2 < T1+315 >
1649 /NOW PUT THE EXTRA SPIKES ALONG WITH
1675 IFNZRO CPU-1 <JMP .-2>
1676 IFZERO CPU-1 <JMP .-3>
1700 SPECIA, TAD XJMPT /JUMP TO SPECIAL ROUTINE
1709 IFZERO CPU-1 < T1+T2+488 >
1710 IFZERO CPU-2 < T1+T2+570 >
1712 STA /REMEMBER NO MORE NOTES NOW
1713 IFNDEF WOW <SETNM, >
1715 JMS I [GET /GET PITCH
1718 TAD I WSA /PERIOD IN UNITS OF 6.4 US
1723 TAD WSA /LOWER NOTES NEED EMPHASIS
1727 TAD I WSA /HOW MANY SPIKES?
1735 IFZERO CPU-1 < T1+T2+488 >
1736 IFZERO CPU-2 < T1+T2+570 >
1740 IFZERO CORE-100 <DOFLD, >
1741 ERR0, HLT /PROGRAM BUG
1745 JMS DOIT /WE'RE AT THE END!
1746 IFZERO CPU-1 < T1+114 >
1747 IFZERO CPU-2 < T1+135 >
1749 TAD BUFGET /WE MUST WAIT FOR THE
1750 CIA /END OF THE MUSIC TO PLAY
1762 JMS I [RESTOR > /RESTORE TOP PAGE OF FIELD 1
1763 JMS I XINNEWF /IS THERE ANOTHER INPUT FILE?
1765 JMP I XST1 /YES, PLAY IT
1767 TAD I X7642 /ALT-MODE FLAG?
1770 JMP I [7600 /RETURN TO MONITOR
1772 JMP I [START /RETURN TO COMMAND DECODER
1775 /CHANGE TO A NEW FIELD FOR INPUT INFO
1779 IFZERO CPU-1 < T1+168 >
1780 IFZERO CPU-2 < T1+195 >
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
1802 SAVIT, TAD OLDS /CORRECT: SPIKES TAKE
1803 TAD SAVS /6.2US, NOT 6.4 US, AND
1804 IFZERO CPU-2 <CLL RAL >
1805 TAD FUDGE /DOIT DOESN'T REALLY TAKE
1809 DCA I AXB /SAVE LOW ORDER
1811 MQA /NOW WE HAVE HIGH ORDER
1812 SZL /BYTE ON RIGHT SIDE OF AC
1815 IAC /BORROW FROM LOW ORDER?
1816 DCA I AXB /SAVE AWAY HIGH ORDER
1819 DCA I AXB /SAVE NO. OF SPIKES
1821 DCA OLDS /RESET RETRY COUNTERS
1827 SZA CLA /BUFFER FULL?
1829 MQL /ZERO TO MQ FOR SHOW
1833 IFZERO CPU-1 < T1+238 >
1834 IFZERO CPU-2 < T1+285 >
1836 KRB /LAST CHARACTER TYPED?
1843 JMP I C5 /YES, NEXT INPUT
1847 JMS I [RESTOR > /RESTORE TOP OF FIELD 1
1853 IFZERO OS8-10 <7600>
1854 IFNZRO OS8-10 <START>
1857 IFZERO OS8-10 <DOEND2>
1858 IFNZRO OS8-10 <START>
1860 FUDGE, -2 /HALF OF 4
1863 FUDGE, -33 /ABOUT HALF OF 55
1866 BRANA, -"# ;KEYS /DEFINE SHARP
1867 -"! ;KEYF /DEFINE FLATS
1874 -"$ ;ENDM /END MUSIC
1915 DECO9, DECIMAL;-1000;-100;-10;-1;0;OCTAL
1917 /TABLE: WHERE ARE THE WHITE KEYS, A THROUGH G?
1918 BASTAB, 36;40;41;43;45;46;50
1920 /TABLE OF BUFFER AREAS
1922 IFZERO OS8-10 < MARGIN-INBUF>
1923 IFZERO OS8-20 < MARGIN-7600 >
1950 /PERIOD OF NOTES IN UNITS OF 6.4US
1951 /USING EQUAL TEMPERAMENT
1952 -4018;-3792;-3579;-3378;-3189;-3010
1954 -2841;-2681;-2531;-2389;-2255;-2128
1955 -2009;-1896;-1790;-1689;-1594;-1505
1957 -1420;-1341;-1265;-1194;-1127;-1064
1958 -1004;-948;-895;-845;-797;-752
1960 -710;-670;-633;-597;-564;-532;-502;-474;-447;-422;-399;-376
1962 -355;-335;-316;-299;-282;-266;-251;-237;-224;-211;-199;-188
1964 -178;-168;-158;-149;-141;-133;-126;-119;-112;-106;-100;-94
1966 -89;-84;-79;-75;-70;-67;-63;-59;-56;-53;-50;-47
1970 /PERIOD OF NOTES IN 6.0 MICROSECOND UNITS
1971 /USING EQUAL TEMPERAMENT
1973 -2143;-4045;-3818;-3604;-3401;-3210
1975 -3030;-2860;-2700;-2548;-2405;-2270
1976 -2143;-2022;-1909;-1802;-1701;-1605
1978 -1515;-1430;-1350;-1274;-1203;-1135
1979 -1071;-1011;-954;-901;-850;-803
1981 -758;-715;-675;-637;-601;-568
1982 -536;-506;-477;-450;-425;-401
1984 -379;-358;-337;-319;-301;-284
1985 -268;-253;-239;-225;-213;-201
1987 -189;-179;-169;-159;-150;-142
1988 -134;-126;-119;-113;-106;-100
1990 -95;-89;-84;-80;-75;-71
1991 -67;-63;-60;-56;-53;-50
1994 /NUMBER OF PULSES GENERATED DETERMINE LOUDNESS
1996 104;97;91;84;79;74;69
1997 64;60;56;52;48;45;42;39
1998 37;34;32;30;28;26;24;23
1999 21;20;18;17;16;15;14;13
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
2028 LINBUF, ZBLOCK 100 /SAVE INPUT TO PRINT ERROR MESSAGE
2029 MUSBUF=. /BEGINNING OF MUSIC BUFFER
2032 IFDEF WOW < SAVBUF, > /SAVE FOR TOP OF FIELD 1
2033 INBUF, ZBLOCK 400 /OS/8 I/O BUFFER
2034 INDEVH, ZBLOCK 400 /OS/8 DEVICE HANDLER SPACE
2038 IFNZRO CORE-100 < /INITIALIZATION CODE
2046 TAD COREX /MAKE CDF FOR FIELD
2047 DCA .+1 /TO BE TESTED
2073 AND COR70 /ARE WE RESTRICTED IN CORE?
2076 JMP .+4> /YES, IGNORE ACTUAL CORE SIZE
2078 TAD CORSIZ /TOP FIELD
2083 TAD I BATFLG /ARE WE RUNNING UNDER BATCH?
2087 TAD BATPRO /YES, DON'T WIPE OUT MONITOR
2092 DCA I WSA /DON'T USE FIRST NONEXISTANT FIELD
2094 DCA I CORINA /DON'T RETURN HERE
2099 HLT /NOT ENOUGH CORE!!