File MUSIC.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/MUSEX.PA 75.05.05

/MUSEX IS MUSIC.PA + EXPLST.PA

/MUSIC.PA

/DISASSEMBLED BY TIM CLARKE
/FROM JOHN SPIES MUSIC PROGRAMS

/	THIS PROGRAM PLAYS NOTES BY USE OF A RADIO NEXT TO
/	THIS ACCUMULATOR LIGHTS
/	THE THINGS YOU SHOULD KNOW ARE:
/
/	1.	SW2OR4		THIS CONTROLS WHETHER YOU WILL
/				HAVE A 2 OR A 4 NOTE CHORD
/				(IT STARTS OUT TO BE 4)
/	2.	THE NOTES ARE ARRANGED IN GROUPS OF 2 PER
/		WORD.
/	3.	THE VALUES FOR THE NOTE ARE DETERMINED BY THE TABLE
/		STARTING AT LOCATION 400. THE TWO LOW ORDER DIGITS
/		IN THE ADDRESS OF THE TABLE ARE THE NUMBERS USED AS
/		AN INDEX (THE ONES IN YOUR STACK).
/	4.	THE TIME VALUE FOR EACH BEAT IS SET RIGHT AFTER A 7777
/		THE HIGHER THE NUMBER THE SLOWER THE BEAT.
/	5.	TO CHANGE THE SW2OR4 SWITCH FOLLOW A 7777 WITH A 7776
/		THIS WILL COMPLEMENT THE SWITCH.
/	6.	TO EXIT THE PROGRAM MERELY FOLLOW A 7777 WITH ANOTHER 7777
/		THIS WILL RETURN THE PROGRAM TO MONITOR.
/	7.	THE PROGRAM MUST BE STARTED AT LOCATION 201.
/
/
/	PROGRAM NOTES BY FRANCIS UPTON JR.
/
/	EDITING FUNCTION BY JOHN B. YOUNG
/	TO WHOM I AM MOST GRATEFUL FOR EXPOSING ME TO THIS AGAIN.

	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 /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 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 OFCNT1 /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 $$$$



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search