/MUSEX.PA 75.05.05 /MUSEX IS MUSIC.PA + EXPLST.PA /MUSIC.PA /DISASSEMBLED BY TIM CLARKE /FROM JOHN SPIES MUSIC PROGRAMS NOTEBS=400 /BASE OF EXPONENTIAL LIST DATA0=600 /START LOC OF MUSIC DATA *0 7600 *5 SETDUR, TAD M14 /SET DURATION, GET LOOP COUNT DCA BITCTR /PUT IT INTO A WORKING LOC TAD DURATN /GET DURATION WORD CIA /NEGATE IT DCA DURATN /RETURN IT AS NEGATIVE /LOC 12 IS USED AS AN AUTO INDEX BASE POINTER /IT ONLY POINTS FROM 101-122, /SO IT IS ALWAYS EXECUTED AS AN AND PNOTE, 0 /ZAI12 IS USED AS A BASE POINTER /THE FOLLOWING IS A 12 X 12 TO 24 BIT MULTIPLY DCA DPACLO /CLEAR DPAC DCA DPACHI TAD I PDATA /GET NEXT DATA WORD DCA MULARG /SAVE IT DLOOP, TAD MULARG /GET IT AGAIN RAR DCA MULARG /SAVE VALUE/2 SZL /ADD IN MULTIPICAND? JMP DADD /YES MULOOP, TAD DPACLO /NO-ROTATE DPAC RAR CLA TAD DPACHI RAR DCA DPACHI TAD DPACLO RAR DCA DPACLO /ROTATION THRU ISZ BITCTR /ENUF LOOPS? (14 (12) OF THEM) JMP DLOOP TAD DPACHI /GET DPACHI, SAVE ABCD CLL AND MASK /AFTER MASKING, RTL RTL RTL DCA DPACHI /AS CD00 TAD DPACLO /LIKEWISE DPACLO RTR RTR RTR AND MASK /AFTER MASKING, 00AB TAD DPACHI /COMBINE WITH DPACHI /RESULT IS NOW MIDDLE 4 DIGITS (OF 8) CIA /NEGATE DCA DURATN JMP I PGTNEW DADD, CLL TAD DPACHI /ADD DPAC TAD DURATN /& MULTIPICAND DCA DPACHI /LO ORDER RAL /IF CARRY TAD DPACLO /ADD IT DCA DPACLO /INTO HI ORDER JMP MULOOP /RETURN M14, -14 /LOOP COUNTER FOR MULTIPLY PNOTEB, NOTEBS /POINTER TO NOTE LIST BASE /CHANGE P500B TO CHANGE 'KEY' P500B, 500 /POINTER TO 500 BASE DURAN0, -100 /INITIAL VALUE FOR INNER DURATION COUNTER DURAU0, -130 /INITIAL VALUE FOR OUTER DURATION COUNTER DURATN, 0 /BASIC DURATION VALUE DURANC, 0 /INNER DURATION COUNTER DURAUC, 0 /OUTER DURATION COUNTER * .+1 /77 SEEMS TO BE NOT USED LSTPTR, 0 /LIST POINTER * .+1 /101 NEVER SEEMS TO BE USED /THE NOTE TABLE FOLLOWS: 4 NOTES, 4 ENTRIES PER NOTE /THE ENTRIES HAVE THE FOLLOWING FUNCTIONS: / 0: INITIAL COUNTDOWN VALUE / 1: COUNTER LOC FOR ISZ COUNTDOWN FOR AC ON OR OFF / 2: RESET VALUE FOR AC ON COUNT / 3: ARGUMENT FOR AC OFF DURATION (NR OF LOOPS) PRSET0, -103 /CONSTANT DPACLO, /USED IN DP MULTIPLY ROUTINE CNTR0, 0 /EXPONENTIAL NOTE VALUE MULARG, ONCNT0, 0 /500 TABLE EVEN OFCNT0, 0 /500 TABLE ODD PRSET1, -63 DPACHI, /USED IN DP MULTIPLY ROUTINE CNTR1, 0 BITCTR, /USED IN DP MULTIPLY ROUTINE ONCNT1, 0 OFCNT1, 0 PRSET2, -43 CNTR2, 0 ONCNT2, 0 OFCNT2, 0 PRSET3, -23 CNTR3, 0 ONCNT3, 0 OFCNT3, 0 SW2OR4, 0 /SWITCH FOR 2 PARTS OR 4 PARTS PDATA0, DATA0-1 /POINTER TO START OF MUSIC DATA PDATA, 0 /MAIN DATA POINTER MASK, 0077 PNOTE0, PRSET0-1 /POINTER TO NOTE TABLE BASE TEMP, OFFCTR, 0 /AC OFF TIME COUNTER STNOTE, 0 /SETS NOTE TABLE FROM AC DATA WORD AND MASK /GET LOW ORDER DIGITS DCA TEMP /SAVE TAD TEMP /GET BACK & USE AS INDEX TAD PNOTEB /INTO NOTE EXPONENTIAL LIST DCA LSTPTR TAD I PNOTE /GET TABLE VALUE 0 DCA I PNOTE /PUT IT INTO TABLE VALUE 1 TAD I LSTPTR /GET NOTE EXPONENTIAL VALUE DCA I PNOTE /PUT IT INTO TABLE VALUE 2 TAD TEMP /GET ORIGINAL MASKED DATA TAD NR7 /ADD 7 AND MASK2 /MASK WITH 0170 CLL RTR /WHAT'S THIS RAR /INEFFICIENT CLL RAL /GARBAGE ? TAD P500B /ADD TO 500 BASE DCA LSTPTR TAD I LSTPTR /GET LIST VALUE DCA I PNOTE /PUT IT INTO TABLE VALUE 3 ISZ LSTPTR TAD I LSTPTR /GET NEXT 500 LIST VALUE TAD DURAUC /& ADD DCA DURAUC /TO OUTER DURATION COUNTER JMP I STNOTE /RETURN *175 MASK2, 0170 NR7, 7 PGTNEW, NWNOTE PAGE *200 JMP I 0 /RETURN TO SYST IF STARTED AT 200 TAD DURAN0 /INITIALIZE DURATION DCA DURATN TAD PDATA0 /INITIALIZE MUSIC DATA POINTER DCA PDATA DCA SW2OR4 /INIT 2 OR 4 PART SWITCH NWNOTE, ISZ PDATA /BUMP DATA POINTER TAD I PDATA /GET NEXT DATA WORD IAC /CHECK FOR 7777 SNA CLA /WAS IT 7777? JMP TSTBR /YES-CHECK FOR BRANCH CONDITIONS TAD DURATN /NO-SET DURATIONS DCA DURANC /INNER DURATION COUNTER TAD DURAU0 DCA DURAUC /OUTER DURATION COUNTER TAD PNOTE0 /GET NOTE TABLE BASE DCA PNOTE /PUT INTO AUTO INDEX POINTER /USE THE DATA TO SET NOTE TABLE - 4 TIMES TAD I PDATA /GET CURRENT DATA WORD JMS STNOTE /1 SET THE NOTE TAD I PDATA /GET CURRENT DATA WORD RTR RTR RTR JMS STNOTE /2 SET NOTE WITH HI ORDER DIGITS TAD SW2OR4 /GET SWITCH WORD SZA /4 NOTES, OR 2 NOTES? ISZ PDATA /4 NOTES-BUMP POINTER /IF ONLY 2 NOTES, DON'T BUMP POINTER AND I PDATA /IF 2, OPERATE ON 0 JMS STNOTE /3 TAD I PDATA AND SW2OR4 RTR RTR RTR JMS STNOTE /4 /THRU SETTING NOTES - NOW PLAY THEM EJECT /NUMBERS AFTER INSTRUCTIONS ARE MACHINE CYCLES STA STL /TURN ON THE AC FOR AC ON LOOP ONLOOP, AND 500 /START OF 500 TABLE (=7777) /3 3 ISZ CNTR0 /2 5 JMP .+5 /1 6 TAD ONCNT0 /IF COUNTER 0 OVERFLOWS DCA CNTR0 /RESET IT WITH ONCOUNT 0 & GO TO ACOFF TAD OFCNT0 /USE OFF COUNT0 AS AN ARG TO ACOFF JMS ACOFF ISZ CNTR1 /2 8 JMP .+5 /1 9 TAD ONCNT1 DCA CNTR1 TAD OFCNT1 JMS ACOFF ISZ CNTR2 /2 11 JMP .+5 /1 12 TAD ONCNT2 DCA CNTR2 TAD OFCNT2 JMS ACOFF ISZ CNTR3 /2 14 JMP .+5 /1 15 TAD ONCNT3 DCA CNTR3 TAD OFCNT3 JMS ACOFF /BUMP INNER DURATION COUNTER ISZ DURANC /2 17 LONG ENUF? JMP ONLOOP /1 18 NO-DO MORE WITH AC ON CLA /YES, LONG ENUF TAD DURATN /RESET DURANC DCA DURANC /INNER DURATION COUNTER STA STL /KEEP THE AC SET! ISZ DURAUC /BUMP OUTER DURATION COUNTER-LONG ENUF? JMP ONLOOP /NO-DO MORE WITH AC ON CLA /YES-LONG ENUF, THRU WITH THIS NOTE JMP NWNOTE /GET THE NEXT NOTE TO PLAY EJECT ACOFF, 0 /SUBROUTINE & LOOP FOR TIME THE AC IS OFF DCA OFFCTR /SET UP THE OFF TIME COUNTER & CLEAR AC OFFLOP, ISZ OFFCTR /2 2 THRU COUNT? SKP /1 3 NO JMP GOACON /YES-RETURN IOT 770 /IOT (3+) 6 IOT ? - REALLY! ISZ CNTR0 /2 8 TEST FOR NOTE 0 OVERFLOW JMP .+6 /1 9 TAD OFFCTR /THIS GROUP SEZ: IF ANY OTHER NOTE TAD OFCNT0 /OVERFLOWS (INDICATIONG THAT IT SHOULD TURN OFF DCA OFFCTR /THE AC), BACKUP THE OFF TIME COUNTER BY TAD ONCNT0 /THAT MUCH MORE, SO COLLIDING PULSES OF DCA CNTR0 /DURATIONS D1 & D2 WILL RESULT IN PULSE OF (D1+D2) ISZ CNTR1 /2 11 JMP .+6 /1 12 TAD OFFCTR /EACH OF THESE GROUPS IS TAD OFCNT3 /10 (DECIMAL) CYCLES LONG DCA OFFCTR TAD ONCNT1 DCA CNTR1 ISZ CNTR2 /2 14 JMP .+6 /1 15 TAD OFFCTR /EXTEND THE OFF TAD OFCNT2 / " DCA OFFCTR / " TAD ONCNT2 /RESET THE ON COUNT DCA CNTR2 / " ISZ CNTR3 /2 16 JMP OFFLOP /1 18 TAD OFFCTR TAD OFCNT3 DCA OFFCTR TAD ONCNT3 DCA CNTR3 JMP OFFLOP GOACON, STA STL /GO TO AC ON ROUTINE & LOOP JMP I ACOFF /TEST & BRANCH: CALLED ONLY WHEN NOTE SPECIFIED IS 7777 / (A HIGH UNISON), WHICH INDICATES A PARAMETER CHANGE TSTBR, ISZ PDATA /BUMP DATA POINTER TAD I PDATA /GET NEXT DATA WORD IAC /TEST IT FOR 7777 SNA /WAS IT 7777? JMP 200 /YES-RETURN TO SYSTEM IAC /TEST FOR 7776 SZA CLA /WAS IT 7600? JMP SETDUR /NO-SET DURATION WITH DATA POINT TAD SW2OR4 /YES-COMPLEMENT 2 OR 4 SWITCH CMA DCA SW2OR4 JMP NWNOTE /AND RETURN PAGE /EXPLST.MU 73.12.18 /LIST OF EXPONENTIAL TIME VALUES FOR MUSIC *400 1 -1240 /F0 -1172 -1126 /G0 -1065 -1025 /A0 -767 -733 /B0 -700 /C0 -647 -617 /D0 -570 -543 /E1 -517 /F1 -474 -452 /G1 -432 -412 /A1 -373 -355 /B1 -337 /C1 -323 -307 /D1 -273 -261 -247 -235 -224 -214 -204 -175 -166 -157 -151 -143 -135 -130 -123 -116 -111 -105 -101 -76 -72 -67 -64 -61 -56 -53 -51 -46 -44 -42 -40 -36 -34 -33 -31 -30 -26 -25 /E5 -24 /F5 -22 -21 /G5 /HERE STARTS THE SO-CALLED '500' TABLE *500 -1 0 -15 2 -11 2 -7 3 -5 3 -5 5 -4 6 -3 10 -3 15 /END OF '500' TABLE $$$$