/	DECMATE II ROM CONTENTS

/	DECODED AND DISASSEMBLED BY CHARLES J. LASNER.

/	LAST EDIT:	02-DEC-1991	02:00:00	CJL

/	MAY BE ASSEMBLED WITH '/J' (PAL8 '/F') SWITCH SET.

/	THIS IS THE CODE  USED  IN  THE DECMATE II PRIMARY CONTROL ROM.  IT RESIDES IN
/	THREE 2716 PACKAGES  KNOWN  AS  E113,  E114, E115.  THE THREE ROMS ARE ENCODED
/	INTO  A 12-BIT IMAGE  OF  AN  ENTIRE  FIELD  IN  THE  PARTICULAR  ORGANIZATION
/	ILLUSTRATED BELOW.  FOR ALL  ROM  CONTENTS:  0.X=BIT X IN THE SPACE 0000-3777,
/	4.X=BIT X IN THE SPACE 4000-7777.

/	E113:	0	1	2	3	4	5	6	7

/	BIT:	0.0	0.1	0.2	0.3	0.4	0.5	0.6	0.7

/	E114:	0	1	2	3	4	5	6	7

/	BIT:	4.0	4.1	4.2	4.3	4.4	4.5	4.6	4.7

/	E115:	0	1	2	3	4	5	6	7

/	BIT:	0.8	4.8	0.9	4.9	0.10	4.10	0.11	4.11

/	THIS IS THE ASSEMBLY OF THE RELEASED ROM SET KNOWN AS 358E2, 359E2, 360E2.

/	WHEN THE DECMATE II IS FIRST POWERED UP, ROM CONTROL IS ENABLED FOR ALL DIRECT
/	(IF)  AND  INDIRECT  (DF)  REFERENCES  TO CP MEMORY, THUS THE  CPU  STARTS  AT
/	ROM-BASED ADDRESS CP07777.  THE ROM CODE MOVES A LOADING PROGRAM  TO PAGE ZERO
/	OF  THE CORRESPONDING RAM IN FIELD ZERO OF CP MEMORY, WHICH IS  THEN  STARTED.
/	TO ACCOMPLISH THE INITIAL MOVE OF THE LOADER, THE DF CONTROL IS CHANGED TO RAM
/	WHILE RETAINING IF CONTROL IN THE ROM.

/	THE LOADER MOVES THE BULK OF THE ROM CODE TO CP FIELD SEVEN AND THEN STARTS IT
/	THERE.  NO CODE IS MOVED  TO ANY ADDRESS LOWER THAN 0100, SINCE THE CODE IMAGE
/	IS STORED OFFSET BY 100.  THIS  MEANS THAT ROM LOCATION 0000 WINDS UP IN FIELD
/	7 LOCATION 0100 AND SO ON.  DURING  THE  LOAD  OPERATION,  THE  IF  CONTROL IS
/	ALWAYS SET TO RAM BECAUSE AT THIS POINT THE  LOADER  IS  RUNNING.    THE DF IS
/	SWITCHED  BETWEEN ROM AND RAM AS NECESSARY TO ACCOMPLISH THE  LOAD  OPERATION.
/	AFTER LOADING IS COMPLETE, THE ROM IS TOTALLY DISABLED.
/	DEFINITIONS.

/	OPERATE INSTRUCTIONS.

	R3L=	7014			/ROTATE AC LEFT THREE WITHOUT AFFECTING LINK

/	COMBINED OPERATE INSTRUCTIONS.

	NL0001=	CLA IAC			/LOAD AC WITH 0001
	NL0002=	CLA CLL CML RTL		/LOAD AC WITH 0002
	NL002A=	CLA CLL IAC RAL		/LOAD AC WITH 0002 ON 8/I OR NEWER
	NL0003=	CLA CLL CML IAC RAL	/LOAD AC WITH 0003
	NL0004=	CLA CLL IAC RTL		/LOAD AC WITH 0004
	NL0006=	CLA CLL CML IAC RTL	/LOAD AC WITH 0006
	NL0010=	CLA IAC R3L		/LOAD AC WITH 0010
	NL0100=	CLA IAC BSW		/LOAD AC WITH 0100
	NL2000=	CLA CLL CML RTR		/LOAD AC WITH 2000
	NL3777=	CLA CLL CMA RAR		/LOAD AC WITH 3777
	NL4000=	CLA CLL CML RAR		/LOAD AC WITH 4000
	NL5777=	CLA CLL CMA RTR		/LOAD AC WITH 5777
	NL6000=	CLA CLL CML IAC RTR	/LOAD AC WITH 6000
	NL7775=	CLA CLL CMA RTL		/LOAD AC WITH 7775
	NL7776=	CLA CLL CMA RAL		/LOAD AC WITH 7776
	NL7777=	CLA CMA			/LOAD AC WITH 7777

/	PROCESSOR I/O INSTRUCTIONS.

	CPD=	6266			/FORCE DF TO REFER TO MAIN MEMORY
	GCF=	6256			/GET CURRENT FIELDS
	PEX=	6004			/EXIT FROM CP TO MAIN MEMORY
	PG0=	6003			/RESET HLTFLG FLIP-FLOP
	PRQ3=	6236			/TYPE 3 PANEL REQUEST
	PRS=	6000			/READ PANEL STATUS
	RSP1=	6207			/READ FIRST STACK POINTER
	RSP2=	6227			/READ SECOND STACK POINTER
	SPD=	6276			/FORCE DF TO REFER TO CP MEMORY
	WSR=	6246			/WRITE SWITCH REGISTER (ROM CONTROL), CLEAR AC

/	INTERNAL I/O INSTRUCTIONS.

	KEY=	03			/KEYBOARD DEVICE CODE
	TTY=	04			/SCREEN DEVICE CODE

/	VIDEO INTERRUPT INSTRUCTIONS.

	VIDINT=	06			/VIDEO INTERRUPT DEVICE CODE

	VFL=	VIDINT^10+6000		/SET VIDEO INTERRUPT FLAG
	VSF=	VIDINT^10+6001		/SKIP ON, CLEAR VIDEO INTERRUPT FLAG
	VCL=	VIDINT^10+6002		/NOP (CLEAR THE AC?)
	VNOP1=	VIDINT^10+6003		/(NOP?)
	VDUMM1=	VIDINT^10+6004		/(NOP?)
	VIE=	VIDINT^10+6005		/WRITE INTERRUPT ENABLE PER AC[11]
	VDUMM2=	VIDINT^10+6006		/(NOP?)
	VDUMM3=	VIDINT^10+6007		/(NOP?)
/	VIDEO CONTROLLER INSTRUCTION.

	VIDDEV=	12			/VIDEO CONTROLLER DEVICE CODE

	APTFL=	VIDDEV^10+6000		/SET APT INTERRUPT FLAG
	APTSKP=	VIDDEV^10+6001		/SKIP ON, CLEAR APT INTERRUPT FLAG
	LSCREG=	VIDDEV^10+6002		/LOAD VIDEO REGISTER SELECT
	CGLOAD=	VIDDEV^10+6003		/LOAD CHARACTER GENERATOR ADDRESS/DATA
	VLOAD=	VIDDEV^10+6004		/LOAD SELECTED REGISTER FROM AC[4-11]
	APTIE=	VIDDEV^10+6005		/WRITE INTERRUPT ENABLE PER AC[11]
	VIDCON=	VIDDEV^10+6006		/AC TO VIDEO CONTROL
	VREAD=	VIDDEV^10+6007		/READ SELECTED REGISTER

/	PRINTER INTERFACE INSTRUCTIONS.

	PRICON=	32			/PRINTER INPUT DEVICE CODE

	PRIFL=	PRICON^10+6000		/SET PRINTER INPUT FLAG
	PRISKP=	PRICON^10+6001		/SKIP ON, CLEAR PRINTER INPUT FLAG
	PRICLR=	PRICON^10+6002		/CLEAR THE AC
	PRINO1=	PRICON^10+6003		/NOP
	PRIRS=	PRICON^10+6004		/OR INPUT BUFFER WITH AC
	PRIIE=	PRICON^10+6005		/WRITE INTERRUPT ENABLE PER AC[11]
	PRIRB=	PRICON^10+6006		/LOAD INPUT BUFFER INTO AC
	PRINO2=	PRICON^10+6007		/NOP

	PROCON=	33			/PRINTER OUTPUT DEVICE CODE

	PROFL=	PROCON^10+6000		/SET PRINTER OUTPUT FLAG
	PROSKP=	PROCON^10+6001		/SKIP ON, CLEAR PRINTER OUTPUT FLAG
	PRONO1=	PROCON^10+6002		/NOP
	PRSB=	PROCON^10+6003		/LOAD BAUD RATE PER AC[8-11]
	PROPC=	PROCON^10+6004		/OUTPUT CHARACTER FROM AC[4-11]
	PROIE=	PROCON^10+6005		/WRITE INTERRUPT ENABLE PER AC[11]
	PROLS=	PROCON^10+6006		/OUTPUT CHARACTER FROM AC[4-11], CLEAR AC
	PRONO2=	PROCON^10+6007		/NOP

/	RD51D I/O INSTRUCTIONS.

	RDNOP=	6700			/RESERVED INSTRUCTION
	RDSR=	6701			/SKIP ON, CLEAR DATA REQUEST FLAG
	RDSC=	6702			/SEND COMMAND PER AC
	RDSD=	6703			/SKIP ON, CLEAR DONE FLAG
	RDTD=	6704			/TRANSFER DATA TO/FROM AC
	RDWE=	6705			/WRITE INTERRUPT ENABLE PER AC[11]
	RDSE=	6706			/SKIP ON, CLEAR ERROR FLAG
	RDTEST=	6707			/RESERVED TEST INSTRUCTION THAT CLEARS THE AC
					/ONLY IF THE RD51D IS INSTALLED.
/	COMMUNICATIONS PORT DEFINITIONS.

	PORTIN=	30			/COMMUNICATIONS PORT INPUT DEVICE CODE

	IFL=	PORTIN^10+6000		/SET COMMUNICATIONS PORT INPUT/OUTPUT FLAG
	ISF=	PORTIN^10+6001		/SKIP ON, CLEAR PORT INPUT/OUTPUT FLAG
	ICF=	PORTIN^10+6002		/NOP (CLEAR THE AC?)
	INOP1=	PORTIN^10+6003		/(NOP?)
	IRS=	PORTIN^10+6004		/READ COMMUNICATIONS PORT RECEIVE BUFFER
	IIE=	PORTIN^10+6005		/PORT I/O INTERRUPT ENABLE PER AC[11]
	IRB=	PORTIN^10+6006		/READ COMMUNICATIONS PORT RECEIVE BUFFER
	INOP2=	PORTIN^10+6007		/(NOP?)

	PORTOUT=31			/COMMUNICATIONS PORT OUTPUT DEVICE CODE

	DUMBFL=	PORTOUT^10+6000		/SET COMMUNICATIONS PORT DUMMY FLAG
	DUMBSF=	PORTOUT^10+6001		/SKIP ON, CLEAR COMMUNICATIONS PORT DUMMY FLAG
	DUMBCF=	PORTOUT^10+6002		/NOP (CLEAR THE AC?)
 	ONOP1=	PORTOUT^10+6003		/(NOP?)
	OPC=	PORTOUT^10+6004		/LOAD COMMUNICATIONS PORT TRANSMIT BUFFER
	DUMBIE=	PORTOUT^10+6005		/PORT DUMMY INTERRUPT ENABLE PER AC[11]
	OLS=	PORTOUT^10+6006		/LOAD COMMUNICATIONS PORT TRANSMIT BUFFER
	ONOP2=	PORTOUT^10+6007		/(NOP?)

	PORTCON=36			/COMMUNICATIONS PORT CONTROL DEVICE CODE

	MFL=	PORTCON^10+6000		/SET MODEM CHANGE FLAG
	MSF=	PORTCON^10+6001		/SKIP ON, CLEAR MODEM CHANGE FLAG
	MLC=	PORTCON^10+6002		/LOAD MODEM CONTROL REGISTER
	MSB=	PORTCON^10+6003		/LOAD BAUD RATE REGISTER
	MRS=	PORTCON^10+6004		/READ MODEM STATUS REGISTER
	MIE=	PORTCON^10+6005		/MODEM CHANGE INTERRUPT ENABLE PER AC[11]
	MPSCC=	PORTCON^10+6006		/ACCESS MULTIPROTOCOL SERIAL CONTROLLER
	MPRESET=PORTCON^10+6007 	/RESET MULTIPROTOCOL SERIAL CONTROLLER
/	TTY: TRAP DEFINITIONS.

	TTYCON=	07			/DEVICE CODE FOR TTY: TRAP

	TTYFL=	TTYCON^10+6000		/SET TTY: TRAP FLAG
	TTYSF=	TTYCON^10+6001		/SKIP ON, CLEAR TTY: TRAP FLAG
	TTYCLR=	TTYCON^10+6002		/CLEAR THE AC
	TTNOP1=	TTYCON^10+6003		/NOP
	TTNOP2=	TTYCON^10+6004		/NOP
	TTYIE=	TTYCON^10+6005		/WRITE INTERRUPT ENABLE PER AC[11]
	TTNOP3=	TTYCON^10+6006		/NOP
	TTNOP4=	TTYCON^10+6007		/NOP

/	CLOCK DEFINITIONS.

	CLKCON=	13			/REAL-TIME CLOCK DEVICE CODE

	CLFL=	CLKCON^10+6000		/SET CLOCK FLAG
	CLSK=	CLKCON^10+6001		/SKIP ON, CLEAR CLOCK FLAG
	CLNOP1=	CLKCON^10+6002		/NOP
	CLNOP2=	CLKCON^10+6003		/NOP
	CLNOP3=	CLKCON^10+6004		/NOP
	CLIE=	CLKCON^10+6005		/WRITE INTERRUPT ENABLE PER AC[11]
	CLNOP4=	CLKCON^10+6006		/NOP
	CLNOP5=	CLKCON^10+6007		/NOP

/	KEYBOARD DEFINITIONS.

	KBICON=	11			/KEYBOARD INPUT DEVICE CODE

	KBIFL=	KBICON^10+6000		/SET KEYBOARD INPUT FLAG
	KBISF=	KBICON^10+6001		/SKIP ON, CLEAR KEYBOARD INPUT FLAG
	KBICLR=	KBICON^10+6002		/CLEAR THE AC
	KINOP1=	KBICON^10+6003		/NOP
	KBIRS=	KBICON^10+6004		/OR AC WITH KEYBOARD INPUT DATA
	KBIIE=	KBICON^10+6005		/WRITE INTERRUPT ENABLE PER AC[11]
	KBIRB=	KBICON^10+6006		/READ KEYBOARD INPUT DATA INTO AC
	KINOP2=	KBICON^10+6007		/NOP

	KBOCON=	05			/KEYBOARD OUTPUT DEVICE CODE

	KBOFL=	KBOCON^10+6000		/SET KEYBOARD OUTPUT FLAG
	KBOSF=	KBOCON^10+6001		/SKIP ON, CLEAR KEYBOARD OUTPUT FLAG
	KONOP1=	KBOCON^10+6002		/NOP
	KONOP2=	KBOCON^10+6003		/NOP
	KBOPC=	KBOCON^10+6004		/OUTPUT AC TO KEYBOARD
	KBOIE=	KBOCON^10+6005		/WRITE INTERRUPT ENABLE PER AC[11]
	KBOLS=	KBOCON^10+6006		/OUTPUT AC TO KEYBOARD, CLEAR AC
	KONOP3=	KBOCON^10+6007		/NOP
/	RX50/RX01/RX02 DEFINITIONS.

	RXCON=	75			/RX50 DEVICE CODE

	SEL=	RXCON^10+6000		/SELECT DISKETTE PAIR PER AC[0] AND AC[11]
	LCD=	RXCON^10+6001		/LOAD COMMAND REGISTER, CLEAR AC
	XDR=	RXCON^10+6002		/TRANSFER DATA
	STR=	RXCON^10+6003		/SKIP ON TRANSFER FLAG, CLEAR TRANSFER FLAG
	SER=	RXCON^10+6004		/SKIP ON ERROR FLAG, CLEAR ERROR FLAG
	SDN=	RXCON^10+6005		/SKIP ON DONE FLAG, CLEAR DONE FLAG
	INTR=	RXCON^10+6006		/WRITE INTERRUPT ENABLE PER AC[11]
	RXINIT=	RXCON^10+6007		/INITIALIZE CONTROLLER AND DRIVES

/	MRI DEFINITIONS.

	JMPIC=	JMP I	.		/CURRENT PAGE JMP I

/	OTHER DEFINITIONS.

	A=	0			/EVEN HALF OF COMMUNICATIONS CHIP
	APUCON=	14			/APU/XPU DEVICE CODE
	B=	1			/ODD HALF OF COMMUNICATIONS CHIP
	DTIME=	400			/DISK WAIT TIME-OUT FACTOR
	ROWADR=	3660			/ROWTABLE ADDRESS IN FIELD 1
	T0S3BUF=5350			/TRACK 0, SECTOR 3 BUFFER IN FIELD 1
	FIELD	7			/MOST OF THE CODE EXECUTES IN FIELD 7

	PAGE	37			/STARTUP PAGE

/	THE ROM  STARTS  UP  HERE  (JUMPED TO FROM THE END OF THE PAGE).  SINCE WE ARE
/	STARTING FROM POWERUP,  BOTH  CONTROL BITS ARE CLEARED.  THE ROM IS REFERENCED
/	WHEN MEMORY  IS  READ  VIA  BOTH  THE  INSTRUCTION  AND DATA FIELDS INITIALLY.
/	FURTHER, FORCE-ZERO MODE  IS  IN  EFFECT WHICH MUST BE CLEARED TO USE EXTENDED
/	MEMORY.

	ROMGO=	.			/ROM STARTS HERE

ROMGO,	CIF	00			/SET OUR OWN FIELD; START CLEARING FZ MODE
	JMP	.+1			/THIS JUST LOADS OUR FIELD, BUT CLEARS FZ MODE
	NL4000				/SETUP PATTERN FOR RAM DATA FIELD
	WSR				/ROM IS ONLY IF NOW, DF IS RAM

/	APPARENTLY THE RAM MAY NOT YET BE WORKING, SO VARIOUS TESTS ARE  DONE UNTIL IT
/	RESPONDS CORRECTLY.

MEMTST,	CLA STL				/CLEAN UP AND SET A STOP BIT
WATLUP,	ISZ I	ATABLE+0/(L4001)	/BUMP UP TEST LOCATION
	NOP				/IN CASE IT SKIPS
	RAL				/MOVE PATTERN OVER
	SMA				/DONE ENOUGH?
	JMP	WATLUP			/NO, KEEP GOING
	CLA				/CLEAN UP
	SPD				/FORCE INDIRECT REFERENCES TO CP MEMORY

/	TRY TO STORE ALL ZEROES INTO THE RAM TEST LOCATION.

	DCA I	ATABLE+0/(L4001)	/ATTEMPT TO STORE CLEAR PATTERN
	TAD I	ATABLE+0/(L4001)	/GET IT BACK
	SZA CLA				/SKIP IF ACTUALLY CLEAR
	JMP	MEMTST			/GO BACK IF IT FLUNKS

/	TRY TO STORE ALTERNATING ZEROES AND ONES INTO THE RAM TEST LOCATION.

	TAD	L2525/(2525)		/GET A DATA PATTERN
	DCA I	ATABLE+0/(L4001)	/ATTEMPT TO STORE IT
	TAD I	ATABLE+0/(L4001)	/GET IT BACK
	TAD	L5252/(5252)		/ADD ON NEGATED PATTERN
	IAC				/ADD ONE TO FINISH THE COMPARISON
	SZA CLA				/SKIP IF IT MATCHES
	JMP	MEMTST			/GO DO IT AGAIN IF IT FLUNKS

/	TRY TO STORE ALTERNATING ONES AND ZEROES INTO THE RAM TEST LOCATION.

	TAD	L5252/(5252)		/GET A DATA PATTERN
	DCA I	ATABLE+0/(L4001)	/ATTEMPT TO STORE IT
	TAD I	ATABLE+0/(L4001)	/GET IT BACK
	TAD	L2525/(2525)		/ADD ON NEGATED PATTERN
	IAC				/ADD ONE TO FINISH THE COMPARISON
	SZA CLA				/SKIP IF IT MATCHES
	JMP	MEMTST			/GO DO IT AGAIN IF IT FLUNKS
/	TRY TO STORE ALL ONES INTO THE RAM TEST LOCATION.

	NL7777				/SET DATA PATTERN
	DCA I	ATABLE+0/(L4001)	/ATTEMPT TO STORE IT
	NL0001 CLL			/SET NEGATED PATTERN FOR COMPARISON
	TAD I	ATABLE+0/(L4001)	/ADD ON TEST VALUE
	SZA CLA				/SKIP IF IT MATCHES
	JMP	MEMTST			/GO DO IT AGAIN IF IT FLUNKS

/	MOVE THE IMAGE OF THE LOADING PROGRAM TO PAGE ZERO OF RAM.

	TAD	LPROGM+0/(4001)		/GET A WORD
	DCA I	ATABLE+0/(L4001)	/PUT A WORD
	TAD	LPROGM+1/(CODEXC-1)	/GET A WORD
	DCA I	ATABLE+1/(XR6)		/PUT A WORD
	TAD	LPROGM+2/(-ROMGO+1)	/GET A WORD
	DCA I	ATABLE+2/(MOVCNT)	/PUT A WORD
	TAD	LPROGM+3/(NL7777 CLL)	/GET A WORD
	DCA I	ATABLE+3/(LOADIT+0)	/PUT A WORD
	TAD	LPROGM+4/(DCA	XR1)	/GET A WORD
	DCA I	ATABLE+4/(LOADIT+1)	/PUT A WORD
	TAD	LPROGM+5/(CDF	00)	/GET A WORD
	DCA I	ATABLE+5/(LOADLP+0)	/PUT A WORD
	TAD	LPROGM+6/(NL0001)	/GET A WORD
	DCA I	ATABLE+6/(LOADLP+1)	/PUT A WORD
	TAD	LPROGM+7/(WSR)		/GET A WORD
	DCA I	ATABLE+7/(LOADLP+2)	/PUT A WORD
	TAD	LPROGM+10/(TAD I XR1)	/GET A WORD
	DCA I	ATABLE+10/(LOADLP+3)	/PUT A WORD
	TAD	LPROGM+11/(MQL)		/GET A WORD
	DCA I	ATABLE+11/(LOADLP+4)	/PUT A WORD
	TAD	LPROGM+12/(TAD	L4001)	/GET A WORD
	DCA I	ATABLE+12/(LOADLP+5)	/PUT A WORD
	TAD	LPROGM+13/(WSR)		/GET A WORD
	DCA I	ATABLE+13/(LOADLP+6)	/PUT A WORD
	TAD	LPROGM+14/(CLA MQA)	/GET A WORD
	DCA I	ATABLE+14/(LOADLP+7)	/PUT A WORD
	TAD	LPROGM+15/(CDF	70)	/GET A WORD
	DCA I	ATABLE+15/(LOADLP+10)	/PUT A WORD
	TAD	LPROGM+16/(DCA I XR6)	/GET A WORD
	DCA I	ATABLE+16/(LOADLP+11)	/PUT A WORD
	TAD	LPROGM+17/(ISZ	MOVCNT)	/GET A WORD
	DCA I	ATABLE+17/(LOADLP+12)	/PUT A WORD
	TAD	LPROGM+20/(JMP	LOADLP)	/GET A WORD
	DCA I	ATABLE+20/(LOADLP+13)	/PUT A WORD
	TAD	LPROGM+21/(CIF	70)	/GET A WORD
	DCA I	ATABLE+21/(LOADLP+14)	/PUT A WORD
	TAD	LPROGM+22/(JMP I .+1)	/GET A WORD
	DCA I	ATABLE+22/(LOADLP+15)	/PUT A WORD
	TAD	LPROGM+23/(CODESTART)	/GET A WORD
	DCA I	ATABLE+23/(LOADLP+16)	/PUT A WORD
/	NOW STARTUP THE LOADER TO MOVE THE CODE TO RAM.

	NL0001				/SETUP FOR
	WSR				/RAM IF AND ROM DF
	JMP	LOADIT			/GO START IT UP

L2525,	2525				/DATA
L5252,	5252				/PATTERNS

	LPROGM=	.			/IMAGE OF LOADING PROGRAM HERE

	RELOC	11			/FOOL THE ASSEMBLER

XR1,					/AUTO-INDEX USED FOR MOVING THE ROM

	RELOC	15			/FOOL THE ASSEMBLER SOME MORE

	LOADER=	.			/LOADER EXECUTES FROM HERE

L4001,	4001				/ROM DISABLE CONSTANT
XR6,	CODEXC-1			/RAM STORE POINTER
MOVCNT,	-ROMGO+1			/MOVE COUNTER

/	THE LOADER  STARTS  HERE.   ALL IF REFERENCES ARE NOW IN RAM.  THE CODE IN THE
/	ROM WILL BE MOVED TO FIELD 7.

LOADIT,	NL7777 CLL			/SET (AUTO-INCREMENTED) POINTER
	DCA	XR1			/TO LOWEST ROM LOCATION
LOADLP,	CDF	00			/ROM CODE IS IN FIELD ZERO
	NL0001				/SETUP FOR
	WSR				/RAM IF AND ROM DF
	TAD I	XR1			/GET A ROM WORD
	MQL				/SAVE IT FOR NOW
	TAD	L4001/(4001)		/SETUP FOR
	WSR				/RAM IF AND RAM DF
	CLA MQA				/GET THE ROM VALUE
	CDF	70			/CODE LOADS INTO FIELD SEVEN
	DCA I	XR6			/STORE INTO RAM
	ISZ	MOVCNT			/DONE YET?
	JMP	LOADLP			/NO, KEEP GOING
	CIF	70			/GOTO NEW EXECUTION FIELD
	JMP I	.+1/(CODESTART)		/GO START IT UP
	CODESTART			/THROUGH HERE

	RELOC				/UN-FOOL THE ASSEMBLER
ATABLE,	LOADER+00			/TABLE OF LOADING ADDRESSES FOR MOVED LOADER
	LOADER+01			/
	LOADER+02			/
	LOADER+03			/
	LOADER+04			/
	LOADER+05			/
	LOADER+06			/
	LOADER+07			/
	LOADER+10			/
	LOADER+11			/
	LOADER+12			/
	LOADER+13			/
	LOADER+14			/
	LOADER+15			/
	LOADER+16			/
	LOADER+17			/
	LOADER+20			/
	LOADER+21			/
	LOADER+22			/
	LOADER+23			/LAST ADDRESS OF MOVED LOADER CODE

	ZBLOCK	7776-.			/EMPTY SPACE

/	WHEN THE  CODE  IS IN RAM, THESE LOCATIONS IN CP FIELD 0 ARE USED AS THE START
/	OF THE CP  INTERRUPT  HANDLER.  THE MAIN MEMORY INTERRUPTED PC IS STORED IN CP
/	00000 AND CONTROL IS  REGAINED  AT CP 07777.  INVARIABLY, THE INSTRUCTION USED
/	THERE IS JMP I .-1.  THE POINTER ADDRESS IS THEREFORE STORED HERE AT CP 07776.

ROMSP,	.-.				/USED LATER AS CP INTERRUPT POINTER

/	THE ROM PROGRAM GAINS CONTROL HERE.  ALSO USED LATER FOR CP INTERRUPTS.

ROMST,	JMP	ROMGO			/CONTINUE THERE
/	START OF  PAGE  ZERO WHILE RUNNING IN FIELD 7.  THESE LOCATIONS ARE NOT LOADED
/	BY THE ROM'S LOADING PROGRAM BUT ARE USED BY THE MOVED CODE AS TEMPORARIES.

	*0				/START AT THE BEGINNING

	NOPUNCH				/DON'T GENERATE BINARY

RIMADR,					/APT RIM-LOADER TEMPORARY
INTADR,					/CP-INTERRUPTS PC STORED HERE

/	THE FOLLOWING ARE DEFINITIONS FOR MAIN MEMORY INTERRUPTS IN FIELD 0.

INTADR,	.-.				/MAIN-MEMORY INTERRUPTS PC STORED HERE
INT1,	JMP I	INT2			/WHAT'S PUT HERE IN MAIN MEMORY FIELD 0
INT2,	INTHND				/POINTER TO MAIN MEMORY INTERRUPT HANDLER
TIMEOUT,.-.				/TIME-OUT COUNTER FOR LOOPBACK TEST
CLKTICK,.-.				/CLOCK TICK COUNTER FOR LOOPBACK TEST
CSTATUS,.-.				/COUNT PATTERN PROGRESS STATUS
PATTERN,.-.				/COUNT PATTERN TEMPORARY
TSTATUS,.-.				/LOOPBACK CP TEST STATUS

	*10				/GET TO AUTO-INDEX AREA

XR0,	.-.				/AUTO-INDEX REGISTER 0
XR1,	.-.				/AUTO-INDEX REGISTER 1
XR2,	.-.				/AUTO-INDEX REGISTER 2
XR3,	.-.				/AUTO-INDEX REGISTER 3
XR4,	.-.				/AUTO-INDEX REGISTER 4
XR5,	.-.				/AUTO-INDEX REGISTER 5
XR6,	.-.				/AUTO-INDEX REGISTER 6
XR7,	.-.				/AUTO-INDEX REGISTER 7

	*20				/GET PAST AUTO-INDEX AREA

CTMP1,	.-.				/OUTPUT COUNTING TEMPORARY FOR LOOPBACK TEST
CTMP2,	.-.				/INPUT COUNTING TEMPORARY FOR LOOPBACK TEST
CNTLO,	.-.				/LOW-ORDER COUNTER FOR LOOPBACK TESTING
CNTHI,	.-.				/HIGH-ORDER COUNTER FOR LOOPBACK TESTING
TEMP1,	.-.				/TEMPORARY
TEMP2,	.-.				/TEMPORARY
TEMP3,	.-.				/TEMPORARY

	ZBLOCK	1			/EMPTY SPACE

/	THESE SIX ARE PRINTED AS A GROUP.

TM0,	.-.				/TEMPORARY
COMTM1,	.-.				/COMMUNICATIONS PORT TESTING TEMPORARY
MTM1,	.-.				/TEMPORARY
MTM2,	.-.				/TEMPORARY
SP1SAVE,.-.				/FIRST STACK POINTER SAVED HERE
SP2SAVE,.-.				/SECOND STACK POINTER SAVED HERE
MTM5,	.-.				/TEMPORARY
MTM6,	.-.				/TEMPORARY
MTM7,	.-.				/TEMPORARY
TINC,	.-.				/TEMPORARY
T0,	.-.				/TEMPORARY
T1,	.-.				/TEMPORARY
T2,	.-.				/TESTING TEMPORARY
T3,	.-.				/TEMPORARY
T4,	.-.				/TEMPORARY
T5,	.-.				/TEMPORARY
T6,	.-.				/TEMPORARY
T7,	.-.				/TEMPORARY
T8,	.-.				/TEMPORARY
RXCMD,	.-.				/LATEST RX50 COMMAND
ESTATUS,.-.				/CUMULATIVE ERROR STATUS
LCHAR,	.-.				/LATEST COMMAND CHARACTER IN SETUP ROUTINE
ROW,	.-.				/ROW POSITION FOR CHARACTER ROUTINES
COLUMN,	.-.				/COLUMN POSITION FOR CHARACTER ROUTINES
CCNT,	.-.				/DELIMITER CHARACTER SEARCH COUNT
PSTATUS,.-.				/STATUS AT POWER-ON

	ENPUNCH				/RESTORE BINARY
/	START OF ROM-BASED CODE.

	*0				/START AT THE BEGINNING

	ROMADR=	.			/WHERE IT IS LOADED WHILE IN ROM

	RELOC	100			/FOOL THE ASSEMBLER

	CODEXC=	.			/WHERE IT RUNS IN FIELD 7

	3732				/THIS LOCATION IS PROBABLY A VERSION NUMBER

PCHRPRT,CHRPRT				/POINTER TO SCREEN CHARACTER OUTPUT ROUTINE
PPPTABL,PPTABLE				/POINTER TO PROGRAMMING TABLE POINTER
PROWLOA,ROWLOAD				/POINTER TO ROWTABLE AND REGISTER LOAD ROUTINE
Z7,	7				/CONSTANT 0007
Z10,	10				/CONSTANT 0010
Z12,	12				/CONSTANT 0012
Z17,	17				/CONSTANT 0017
Z20,	20				/CONSTANT 0020
Z102,	102				/CONSTANT 0102
Z200,	200				/CONSTANT 0200
Z237,	237				/CONSTANT 0237
Z0301,	0301				/CONSTANT 0301
Z377,	377				/CONSTANT 0377
Z400,	400				/CONSTANT 0400
Z2525,	2525				/CONSTANT 2525
Z3777,	3777				/CONSTANT 3777
JMPIM1,	ROMSP&177+JMPIC			/JMP I .-1 CONSTANT FOR RESTART ADDRESS
ZCDF,	CDF	00			/CONSTANT 6201
PWRIBUF,WRIBUFFER			/POINTER TO WRITE BUFFER
PAPTROU,APTROUTINE			/POINTER TO APT ROUTINE

	6777				/CONSTANT 6777 (UNUSED?)

Z7766,	7766				/CONSTANT 7766
Z7760,	7760				/CONSTANT 7760
Z7741,	7741				/CONSTANT 7741
Z7400,	7400				/CONSTANT 7400
DTIMOUT,-DTIME				/DISK WAIT TIMEOUT FACTOR
Z7775,	7775				/CONSTANT 7775
CPIADDR,/ROMSP				/POINTER ADDRESS FOR CP-INTERRUPTS
Z7776,	7776				/CONSTANT 7776
PROMST,	ROMST				/ROM (RE)START ADDRESS FOR INTERRUPTS, ETC.
LBLADR,	LBLOAD-1			/LOOPBACK TEST CODE ADDRESS (-1)
LBMCNT,	LBTEST-LBTEND			/LENGTH OF LOOPBACK TEST CODE TO BE MOVED
CPLADR,	CPLOAD-1			/CP-INTERRUPT CODE ADDRESS (-1)
CPMCNT,	CPLOAD-CPEND2			/LENGTH OF CP-INTERRUPT CODE TO BE MOVED
PCOMLOA,COMLOAD				/=> COMMUNICATIONS CHIP REGISTER LOAD ROUTINE
PCOMREA,COMREAD				/=> COMMUNICATIONS CHIP REGISTER READ ROUTINE
PCLR23,	CLR23				/POINTER TO FIELD 2, 3 CLEAR ROUTINE
PRXCOMD,RXCOMD				/POINTER TO RXCOMD ROUTINE
PSSTRIN,SSTRING				/POINTER TO SSTRING ROUTINE
/	THE FOLLOWING  LOCATION  IS UNREFERENCED;  PERHAPS THERE IS A CONVENTION ABOUT
/	WHERE TO RESTART THE ROM PROGRAM?

	PRGDONE				/POINTER TO PRGDONE ROUTINE (UNUSED?)

PMEMCOM,MEMCOMP				/POINTER TO MEMORY COMPARE ROUTINE
PKBDIN,	KBDIN				/POINTER TO KEYBOARD INPUT ROUTINE
PCALLSU,CALLSUB				/POINTER TO TEST (SUBROUTINE) LOCATION
Z205,	205				/CONSTANT 0205

	ZBLOCK	21			/EMPTY SPACE

/	********

	SUBR				/POINTER TO SUBR
SUB176,	.-.				/ENTRY HERE
	JMP I	.-2/[SUBR]		/GO THERE
	PAGE

/	THIS IS WHERE THE  CODE  STARTS  AFTER  THE  LOADER HAS MOVED IT FROM 00000 TO
/	70100.  AT THIS POINT  THE  ROM  IS  TOTALLY  DISABLED.   IF AUTOMATIC PRODUCT
/	TESTING IS IN PROGRESS, IT IS  POSSIBLE  THAT  A PREVIOUSLY LOADED MAIN MEMORY
/	TEST PROGRAM HAS EXITED VIA A PANEL REQUEST INSTRUCTION.  THIS ACTION CAUSES A
/	TOTAL RESTART TO THIS LOCATION.

	CODESTA=.			/THE CODE STARTS HERE

CODESTA,CLA CLL				/CLEAN UP
	PRS				/GET (POWER-ON) STATUS NOW
	DCA	PSTATUS			/SAVE FOR LATER
	PG0				/RESET THE HLTFLG FLIP-FLOP

/	THE PIE CHIPS HAVE TO BE PROGRAMMED BEFORE THEY CAN BE USED.  UP UNTIL NOW ALL
/	IOTS HAVE BEEN INTERNAL;  AN UNIMPLEMENTED EXTERNAL IOT (6777) WILL BE USED TO
/	LOAD IN THE DEVICE-SPECIFIC INFORMATION.

	TAD I	PPPTABLE/[PPTABLE]	/GET PROGRAMMING TABLE POINTER
	DCA	XR0			/STASH THE POINTER
PRGLUP,	TAD I	XR0			/GET THE LATEST
	SNA				/SKIP IF NOT AT END
	JMP	PRGDONE			/CONTINUE THERE IF DONE
	6777				/UN-IMPLEMENTED EXTERNAL IOT TO SETUP CHIPS
	CLA				/CLEAN UP
	JMP	PRGLUP			/KEEP GOING

/	COMES HERE WHEN I/O PORT INITIALIZING IS DONE.

PRGDONE,TAD	Z237/[237]		/GET PORT ENABLE VALUE
	MLC				/ENABLE ALL OUTPUT LINES
	JMS I	PROWLOAD/[ROWLOAD]	/CALL ROWTABLE AND REGISTER LOAD ROUTINE
	JMS I	PCLR23/[CLR23]		/CLEAR FIELDS 2, 3 (AND BITS IN 13705, 13707)
	CDF	70			/BACK TO OUR FIELD
	NL7776				/-2
	DCA	XR0			/SETUP COUNTER
VAGAIN,	DCA	XR1			/CLEAR TIME-OUT COUNTER
VWATLP,	VSF				/VIDEO RETRACE FLAG UP?
	SKP				/SKIP IF NOT
	JMP	VPAST			/JUMP IF SO
	ISZ	XR1			/WAITING TOO LONG?
	JMP	VWATLP			/NO, KEEP GOING
	JMP	PRGDONE			/YES, GO DO IT ALL OVER AGAIN

VPAST,	TAD	L72/(72)		/GET VALUE FOR REGISTER 3A
	LSCREG				/LOAD THE REGISTER
	VREAD				/GET THE STATUS THERE, CLEAR INTERNAL FLAGS
	CLA				/CLEAN UP
	ISZ	XR0			/DONE IT ENOUGH TIMES?
	JMP	VAGAIN			/NO, GO DO IT AGAIN
/	FOR SOME PURPOSE, WE NEED TO STORE 0100 INTO CP20301.

	NL0100 CLL			/GET VALUE
	CDF	20			/GOTO BUFFER FIELD
	DCA I	Z0301/[0301]		/STORE IN BUFFER
	CDF	70			/BACK TO OUR FIELD

/	IF  THE PRINTER PORT HAS THE APTEN LINE GROUNDED, WE GO IMMEDIATELY  INTO  THE
/	AUTOMATIC PRODUCT TEST DOWNLOAD MODE.  THIS COULD  BE  A SECONDARY CALL TO THE
/	DOWNLOAD  ROUTINE IF A PREVIOUSLY LOADED ROUTINE EXITED VIA  A  PANEL  REQUEST
/	INSTEAD OF HLT.

	APTSKP				/AUTOMATIC PRODUCT TEST REQUESTED?
	JMP	MEMTEST			/NO, JUST KEEP GOING
	JMS I	.+1;	DOWNLOAD	/YES, GO DOWNLOAD SOME STUFF.

L72,	72				/CONSTANT 0072

/	MEMORY TESTING.  ALTERNATING ONES AND  ZEROES  ARE  STORED  INTO ALL FIELDS IN
/	MAIN MEMORY AND FIELDS 2-6 IN CP MEMORY.  CHECK IF THE PATTERN WORKED AND THEN
/	REVERSE ALL PARAMETERS EACH PASS FOR SEVERAL ITERATIONS.

MEMTEST,CPD				/INDIRECT TO MAIN MEMORY FROM NOW ON
	CDF	70			/RESET TO OUR FIELD FIRST (WHY?)
	DCA	T2			/CLEAR FIELD COUNTER

/	EXECUTE CDF TO LATEST TEST FIELD.

MLODLP,	TAD	T2			/GET LATEST FIELD
	AND	Z7/[7]			/JUST FIELD BITS
	R3L				/MOVE UP
	TAD	ZCDF/[CDF]		/MAKE IT A CDF INSTRUCTION
	DCA	.+1			/STORE IN-LINE
	HLT+.-.				/WILL BE CDF TEST FIELD INSTRUCTION
	DCA	T1			/CLEAR ADDRESS POINTER

/	STORE TEST PATTERN IN LATEST TEST FIELD.

FILLIT,	TAD	Z2525			/GET ALTERNATING TEST PATTERN
	DCA I	T1			/STASH INTO TEST MEMORY
	ISZ	T1			/BUMP TO NEXT
	JMP	FILLIT			/GO BACK FOR MORE

/	BUMP TO NEXT FIELD AND CHECK WHICH MEMORY BANK WE ARE TESTING.

	ISZ	T2			/BUMP TO NEXT FIELD
	TAD	T2			/GET LATEST FIELD
	AND	Z10/[10]		/JUST GROUP BIT
	SNA CLA				/SKIP IF FIRST GROUP DONE
	JMP	MLODLP			/GO BACK AGAIN
/	CP MEMORY IS BEING TESTED; CHECK IF WE JUST LOADED FIELD 6.

	TAD	T2			/GET LATEST FIELD
	IAC				/LOOK AT NEXT TENTATIVE FIELD
	AND	Z20/[20]		/CHECK IF AT LAST MEMBER (WHICH WOULD BE US!)
	SZA CLA				/SKIP IF NOT THERE YET	
	JMP	MEMLOADED		/JUMP IF AT END

/	CHECK IF WE ARE JUST FINISHED LOADING MAIN MEMORY.

	TAD	T2			/GET LATEST FIELD
	AND	Z7/[7]			/JUST FIELD BITS
	SZA CLA				/SKIP IF GROUP DONE
	JMP	MLODLP			/GO BACK AGAIN

/	SWITCH INDIRECTS BACK TO CP MEMORY. AVOID TESTS IN FIELDS 0 AND 1.

	SPD				/WILL BE CP INDIRECTS FROM NOW ON
	ISZ	T2			/BUMP LATEST FIELD
	ISZ	T2			/DO IT TWICE
	JMP	MLODLP			/KEEP GOING

/	COMES HERE WHEN ALL TESTABLE FIELDS ARE FILLED WITH THE TEST PATTERN.

MEMLOAD,DCA	T1			/CLEAR ADDRESS POINTER
	DCA	T2			/CLEAR FIELD COUNTER
	TAD	Z2525/[2525]		/GET TEST VALUE
	CMA				/INVERT FOR CHECKING LATER
	DCA	T0			/STASH IT
	CPD				/MAIN MEMORY INDIRECTS FROM NOW ON
	NL0001				/SETUP FOR SINGLE
	DCA	TINC			/FIELD INCREMENT
	NL7775				/SETUP FOR THREE
	DCA	XR1			/COMPLETE TEST PASSES
MTSTLP,	JMS I	PMEMCOMP/[MEMCOMP]	/CHECK LATEST FIELD FOR PROPER TEST VALUE
	JMP	MEMTEST			/MEMORY FAILED TO MATCH, GO BACK FOR MORE
	TAD	TINC			/GET INCREMENT
	TAD	T2			/UPDATE FIELD
	DCA	T2			/STORE BACK
	TAD	TINC			/GET INCREMENTAL FACTOR
	SPA CLA				/SKIP IF STILL ADDING
	JMP	CDWNTST			/JUMP IF NOT

/	FOUND OUT IF WE ARE FINISHED (JUST TESTED CP FIELD 6) WHILE COUNTING FORWARD.

	TAD	T2			/GET CURRENT FIELD
	IAC				/TENTATIVELY ADD ONE
	AND	Z20/[20]		/CHECK IF AT LAST FIELD
	SNA CLA				/SKIP IF SO
	JMP	CPMTST			/JUMP IF NOT
/	BACKUP TO FIELD 6 TO START NEXT TEST PASS.

	NL7777				/BACKUP
	TAD	T2			/ADD ON LATEST FIELD
BACKEND,DCA	T2			/STORE BACK
	JMP	PASSEND			/CONTINUE THERE

/	COUNTING FIELDS DOWN; CHECK IF WE JUST FINISHED A PASS.

CDWNTST,TAD	T2			/GET CURRENT FIELD
	SPA CLA				/SKIP IF STILL VALID
	JMP	BACKEND			/JUMP IF NOT

/	CHECK IF WE ARE ABOUT TO START TESTING CP MEMORY.

CPMTST,	TAD	T2			/GET CURRENT FIELD
	AND	Z10/[10]		/CHECK IF INTO CP GROUP
	SNA CLA				/SKIP IF SO
	JMP	MTSTLP			/KEEP GOING
	TAD	TINC			/GET INCREMENTAL FACTOR
	SPA CLA				/SKIP IF STILL POSITIVE
	JMP	NEGTST			/JUMP IF NOT

/	CHECK IF  FIRST  TIME  IN  CP  MEMORY;  SWITCH OVER TO CP INDIRECTS AND BYPASS
/	TESTING OF FIELD 0 AND FIELD 1.

	TAD	T2			/GET LATEST FIELD
	AND	Z7/[7]			/JUST FIELD BITS
	SNA CLA				/SKIP IF NOT AT ZERO
	NL002A				/ELSE START HERE
	TAD	T2			/ADD ON CURRENT FIELD
	DCA	T2			/STORE BACK
	SPD				/PANEL INDIRECTS FROM NOW ON
	JMP	MTSTLP			/CONTINUE THERE

/	IF COUNTING FIELDS DOWN, WE MUST AVOID FIELD 0 AND FIELD 1;  IF CP FIELD 2 WAS
/	JUST FINISHED, THEN SWITCH OVER TO MAIN FIELD 7.

NEGTST,	NL7777				/-1
	TAD	T2			/COMPARE TO LATEST FIELD
	AND	Z7/[7]			/JUST FIELD BITS
	SZA CLA				/SKIP IF WE ARE AT FIELD 1
	JMP	MTSTLP			/JUST KEEP GOING
	CPD				/MAIN MEMORY INDIRECTS FROM NOW ON
	TAD	Z7/[7]			/SETUP FOR FIELD 7
	DCA	T2			/STASH IN FIELD COUNTER
	JMP	MTSTLP			/CONTINUE THERE
/	COMES HERE AT THE END OF A TEST PASS OVER ALL TESTED FIELDS.

PASSEND,TAD	TINC			/GET INCREMENT FACTOR
	CIA				/INVERT IT
	DCA	TINC			/STORE BACK
	TAD	T0			/GET TEST PATTERN COMPARE VALUE
	CMA				/INVERT THE BITS
	DCA	T0			/STORE BACK
	TAD	TINC			/GET INCREMENT AGAIN
	SPA CLA				/SKIP IF POSITIVE
	NL7777				/ELSE SET -1
	DCA	T1			/STORE EITHER WAY
	ISZ	XR1			/DONE ENOUGH PASSES?
	JMP I	PMTSTLP/(MTSTLP)	/NO, KEEP GOING
	JMS I	PCLR23/[CLR23]		/CLEAR FIELDS 2, 3 (AND BITS IN 13705, 13707)
	CDF	70			/BACK TO OUR FIELD
	APTSKP				/AUTOMATIC PRODUCT TESTING?
	SKP				/SKIP IF NOT
	JMS I	PAPTROUTINE/[APTROUTINE]/CALL ROUTINE IF SO

/	MOVE CP 72600-72746 TO MAIN 00200-00346.  THIS IS THE MAIN MEMORY  ROUTINE AND
/	INTERRUPT HANDLER FOR THE PRINTER LOOPBACK TEST.

	TAD	LBLADR/[LBLOAD-1]	/SETUP THE
	DCA	XR0			/SOURCE POINTER
	TAD	LBMCNT/[LBTEST-LBTEND]	/SETUP THE
	DCA	XR1			/MOVE COUNTER
	TAD	LBADR/(LBTEST-1)	/SETUP THE
	DCA	XR2			/DESTINATION POINTER
LBMVLP,	TAD I	XR0			/GET A WORD
	CDF	00			/GOING TO FIELD 0
	CPD				/GOING TO MAIN MEMORY
	DCA I	XR2			/PUT A WORD
	SPD				/INDIRECTS BACK TO CP MEMORY AGAIN
	CDF	70			/BACK TO OUR FIELD
	ISZ	XR1			/DONE YET?
	JMP	LBMVLP			/NO, GO BACK
/	MOVE CP 73000-75600 TO CP 04000-06600.  THIS  IS  THE CP-INTERRUPT HANDLER FOR
/	THE PRINTER LOOPBACK TEST.

/	PROGRAMMING  NOTE:   THE LENGTH OF EXECUTABLE CODE REQUIRED TO BE RELOCATED IS
/	APPARENTLY MUCH  SMALLER  THAN  THE  ACTUAL  AMOUNT OF CODE MOVED.  THE LENGTH
/	SHOULD BE CPEND-CPINT  INSTEAD  OF  CPEND2-CPLOAD.   THIS LENGTH MAY INTERFERE
/	WITH AUTOMATIC PRODUCT TESTING  OR  CAUSE  SOME OTHER BUG.  IT IS NOT KNOWN AT
/	THIS TIME IF THE ORIGINAL PROGRAMMER'S INTENTION WAS TO OVERLAY ANY OTHER CODE
/	BEYOND THE INTERRUPT HANDLER, BUT THIS  SOURCE  CODE FOLLOWS THE ROM CONTENTS,
/	BUGS AND ALL :-).

	TAD	CPLADR/[CPLOAD-1]	/SETUP THE
	DCA	XR0			/SOURCE POINTER
	TAD	CPMCNT/[CPLOAD-CPEND2]	/SETUP THE
	DCA	XR1			/MOVE COUNTER
	NL3777/TAD (CPINT-1)		/SETUP THE
	DCA	XR2			/DESTINATION POINTER
CPMVLP,	TAD I	XR0			/GET A WORD
	CDF	00			/GOING TO FIELD 0
	DCA I	XR2			/PUT A WORD
	CDF	70			/BACK TO OUR FIELD
	ISZ	XR1			/DONE YET?
	JMP	CPMVLP			/NO, KEEP GOING

/	NOW WE HAVE TO MOVE JMP I .-1 TO CP 07777 AND 4000 TO CP 07776 TO COMPLETE THE
/	INTERRUPT HANDLER.

	NL4000/TAD (CPINT)		/GET INTERRUPT HANDLING ADDRESS
	CDF	00			/GOING TO FIELD 0
	DCA I	CPIADDRESS/[ROMSP]	/STORE IN POINTER LOCATION
	TAD	JMPIM1/[ROMSP&177+JMPIC]/GET JMP I .-1 INSTRUCTION
	DCA I	PROMST/[ROMST]		/STORE IN RESTART ADDRESS
	CIF CDF	00			/GOING TO FIELD 0
	CPD				/INDIRECTS TO MAIN MEMORY
	PEX				/LEAVING CP MEMORY
	JMP I	Z200/[200]		/GO START IT UP

LBADR,	LBTEST-1			/LOOPBACK TEST ADDRESS (-1)
PMTSTLP,MTSTLP				/POINTER TO LOOP BRANCH
/	COMES HERE  WHEN  THE  PRINTER  LOOPBACK  TEST IS DONE TO TEST THE KEYBOARD IN
/	LOOPBACK MODE.

LBDONE,	DCA	ESTATUS			/SAVE (POSSIBLE ERROR) RESULTS
	TAD	L16/(16)		/GET 9600 BAUD VALUE
	PRSB				/SET BAUD RATE
	CLA				/CLEAN UP
	DCA	CTMP1			/CLEAR OUTPUT TEST VALUE
	DCA	CTMP2			/CLEAR INPUT TEST VALUE
	DCA	CNTLO			/CLEAR LOW-ORDER COUNTER
	TAD	M52/(-52)		/SETUP THE
	DCA	CNTHI			/HIGH-ORDER COUNTER
	APTSKP				/AUTOMATIC PRODUCT TESTING?
	TAD	Z20/[20]		/NO, GET LOOPBACK MODE VALUE
	VIDCON				/LOAD NEW MODE EITHER WAY
	KBIRB				/READ KEYBOARD DATA TO SET UART
	CLA				/THROW IT AWAY
	KBOPC				/OUTPUT <NUL> TO UART NOW
LUPLUP,	KBISF				/KEYBOARD INPUT FLAG UP?
	SKP				/SKIP IF NOT
	JMP	LUPIN			/JUMP IF SO
	KBOSF				/KEYBOARD OUTPUT FLAG UP?
	SKP				/SKIP IF NOT
	JMP	LUPOUT			/JUMP IF SO
	ISZ	CNTLO			/DONE WAITING?
	JMP	LUPLUP			/NO, KEEP GOING
	ISZ	CNTHI			/ENOUGH TIMES?
	JMP	LUPLUP			/NO, KEEP GOING
	JMP	LUPTIMOUT		/YES, CONTINUE THERE

LUPIN,	KBISF				/SKIP ON, CLEARING THE INPUT FLAG
L16,	16				/9600 BAUD RATE VALUE; HERE IN CASE IT SKIPS
	KBIRB				/GET THE INPUT VALUE
	AND	Z377/[377]		/JUST 8-BIT CHARACTER
	CIA				/INVERT FOR TEST
	TAD	CTMP2			/COMPARE TO TEST VALUE
	SZA CLA				/SKIP IF IT MATCHES
	VIDCON				/CLEAR LOOPBACK IF NOT
	TAD	CTMP2			/GET INPUT PATTERN VALUE
	JMS I	PCOUNTUP/(COUNTUP)	/BUMP TO NEXT VALUE
	JMP	LUPDONE			/ALL VALUES USED
	DCA	CTMP2			/SAVE UPDATED VALUE
	JMP	LUPLUP			/KEEP GOING

LUPOUT,	KBOSF				/SKIP ON, THUS CLEARING OUTPUT FLAG
	NOP				/JUST IN CASE IT SKIPS
	TAD	CTMP1			/GET COUNT PATTERN VALUE
	JMS I	PCOUNTUP/(COUNTUP)	/BUMP TO NEXT VALUE
	JMP	LUPLUP			/ALL VALUES USED; KEEP GOING FOR INPUT'S SAKE
	DCA	CTMP1			/SAVE UPDATED VALUE
	TAD	CTMP1			/GET IT BACK
	KBOLS				/OUTPUT IT
	CLA				/CLEAN UP
	JMP	LUPLUP			/KEEP GOING
M52,	-52				/CONSTANT 7726
PCOUNTU,COUNTUP-LBTEST+LBLOAD		/POINTER TO COUNTUP ROUTINE
L375,	375				/CONSTANT 0375
PTSTBUF,TSTBUFFER-1			/POINTER TO TEST BUFFER
PKBTEND,KBTEND				/POINTER TO END OF KEYBOARD TEST

/	COMES HERE WHEN THE LOOPBACK TEST TIMES OUT.

LUPTIMO,NL0010 CLL			/INDICATE TIME-OUT ENDED THE TEST

/	COMES HERE WHEN THE COUNT PATTERN IS FINISHED TO (POSSIBLY) TEST THE KEYBOARD.

LUPDONE,TAD	ESTATUS			/GET TEST ERROR STATUS
	DCA	ESTATUS			/STORE (POSSIBLY) UPDATED VALUE
	VIDCON				/CLEAR VIDEO CONTROL
	APTSKP				/AUTOMATIC PRODUCT TESTING?
	SKP				/SKIP IF NOT
	JMP I	PKBTEND/(KBTEND)	/JUMP IF SO TO BYPASS TEST
	DCA	XR2			/CLEAR RECEIVED CHARACTER COUNT
	KBIRB				/READ BUFFER NOW TO RESET UART
	CLA				/CLEAN UP
	TAD	L375/[375]		/GET "JUMP TO POWER UP" VALUE
	KBOLS				/OUTPUT TO KEYBOARD
	KBOSF				/WAIT FOR IT
	JMP	.-1			/'TIL DONE
	KBOSF				/SKIP ON, THUS CLEARING THE FLAG
	40/NOP				/HERE IN CASE IT SKIPS (UNREFERENCED?)
	CLA				/CLEAN UP
	TAD	Z7766/[-12]		/SETUP THE
	DCA	CNTHI			/HIGH-ORDER COUNT
	DCA	CNTLO			/CLEAR LOW-ORDER COUNT
	TAD	PTSTBUFF/(TSTBUFFER-1)	/SETUP THE
	DCA	XR1			/BUFFER POINTER
KEYLUP,	KBISF				/FLAG UP?
	SKP				/SKIP IF NOT
	JMP	GOTKEY			/JUMP IF SO
	ISZ	CNTLO			/WAITING TOO LONG?
	JMP	KEYLUP			/NO, KEEP TRYING
	ISZ	CNTHI			/TOO MANY TIMES?
	JMP	KEYLUP			/NO, KEEP TRYING

/	NO (FURTHER) KEYBOARD INPUT.

	JMP	KBTIMOUT		/CONTINUE THERE
/	COMES HERE WHEN A KEYBOARD CHARACTER IS RECEIVED.

GOTKEY,	KBISF				/SKIP ON, THUS CLEARING THE FLAG
	NOP				/IN CASE IT SKIPS
	KBIRB				/GET THE CHARACTER
	AND	Z377/[377]		/JUST 8 BITS
	DCA I	XR1			/STORE INTO THE BUFFER
	ISZ	XR2			/BUMP CHARACTER COUNT
	JMP	KEYLUP			/KEEP GOING

/	COMES HERE WHEN KEYBOARD INPUT TIMES OUT.

KBTIMOU,TAD	L7774/(-4)		/GET EXPECTED COUNT
	TAD	XR2			/COMPARE TO ACTUAL
	SNA				/SKIP IF OTHER THAN EXPECTED
	TAD I	PTSTBEND/(TSTBEND)	/ELSE LOOK AT LAST CHARACTER RECEIVED
	SZA CLA				/SKIP IF LAST CHARACTER WAS A <NUL>
	TAD	Z20/[20]		/ELSE ADD ON KEYBOARD ERROR VALUE
	TAD	ESTATUS			/GET CUMULATIVE STATUS
	DCA	ESTATUS			/STORE BACK
KBTEND,	JMP I	.+1/(COMTEST)		/CONTINUE THERE
	COMTEST				/THROUGH HERE

PTSTBEN,TSTBEND-1			/POINTER TO END OF TEST KEYBOARD BUFFER
L7774,	7774				/CONSTANT 7774
L342,	342				/CONSTANT 0342
L320,	320				/CONSTANT 0320
A7740,	7740				/CONSTANT 7740
PAPTSTR,APTSTRT				/STARTING ADDRESS FOR DOWNLOAD
/	DIRECT DOWN-LOAD ROUTINE.  CALLED VIA JMS I .+1;DOWNLOAD IF APTEN IS SET.  THE
/	FORMAT IS STANDARD PAPER-TAPE RIM FORMAT WITHOUT A LEADER.  LOADING IS TO MAIN
/	MEMORY FIELD 7.  THE  ROUTINE  IS  ALSO  CALLABLE  AFTER  A  PREVIOUSLY LOADED
/	PROGRAM EXITS VIA A PANEL REQUEST INSTEAD OF A HLT INSTRUCTION.  THIS CAUSES A
/	TOTAL RESTART OF ALL CODE INITIALLY MOVED FROM THE ROM TO CP FIELD 7.  IN THIS
/	SITUATION,  CODE  LOADED  INTO MAIN MEMORY 76000-77777 WILL  BE  MOVED  TO  CP
/	76000-7777  TO  BECOME  THE  NEXT  CP-INTERRUPT HANDLER, ETC.   EXIT  VIA  HLT
/	INSTRUCTION RETURNS TO A DESIGNATED ENTRY POINT TO LOAD MORE CODE.

DOWNLOA,.-.				/DOWN-LOAD ROUTINE
	ISZ	DOWNLOAD		/BUMP PAST CALL POINTER
	CDF	70			/ENSURE OUR FIELD
	TAD	Z400/[400]		/SET POWER-ON MASK
	AND	PSTATUS			/GET POWER-ON BIT
	SNA CLA				/SKIP IF SET
	JMP	DWNAGN			/JUMP IF NOT
	DCA	CMSW			/INDICATE MOVABLE CODE NOT LOADED YET

/	THE CODE IS REJOINED HERE WHEN DOWN-LOADED CODE EXITS WITH A HLT INSTRUCTION.

DWNENTR,CDF	70			/GOTO MAIN MEMORY LOADING FIELD
	TAD	PBAUD			/GET BAUD RATE
	PRSB				/SETUP 9600 BAUD RATE
	CLA				/CLEAN UP
	PRISKP				/SKIP ON, THUS CLEARING INPUT FLAG
PBAUD,	16				/RATE VALUE FOR 9600 BAUD; ALSO SKIP PROTECT
	TAD	L342/(342)		/GET CHARACTER CODE
	PROLS				/OUTPUT IT
	PRIRB				/READ KEYBOARD BUFFER NOW FOR CHARACTERS LATER
	CPD				/MAIN MEMORY INDIRECTS FROM NOW ON
RIMLUP,	PRISKP				/FLAG UP
	JMP	RIMLUP			/NO, WAIT FOR IT
	PRISKP				/YES, MAKE SURE IT CLEARS
	NOP				/IN CASE IT SKIPS AGAIN
	PRIRB				/READ IN THE CHARACTER
	CLL RTL;RTL			/MOVE UP
	SPA				/SKIP IF NOT AT TRAILER
	JMP	RIMEND			/JUMP IF DONE
	RTL				/MOVE UP TO HIGH-ORDER
	PRISKP				/WAIT FOR
	JMP	.-1			/NEXT CHARACTER
	PRISKP				/MAKE SURE IT CLEARS
	NOP				/IN CASE IT SKIPS AGAIN
	PRIRS				/OR IN LATEST CHARACTER
	SNL				/SKIP IF ORIGIN SETTING
	DCA I	RIMADR			/STORE THE DATA
	DCA	RIMADR			/STORE AS NEW ORIGIN
	JMP	RIMLUP			/KEEP GOING
/	COMES HERE AT THE END OF THE RIM LOADING.

RIMEND,	CLA				/CLEAN UP
	TAD	L320/(320)		/GET THIS VALUE
	DCA I	A7740/(7740)		/SOMEONE NEEDS THIS THERE
	SPD				/CP MEMORY INDIRECTS
	DCA	XR0			/CLEAR INDEX (WHY?)
	CDF	00			/GOING TO FIELD 0
	TAD	PCPIHND/(CPIHND)	/GET INTERRUPT HANDLER ADDRESS
	DCA I	CPIADDR/[ROMSP]		/STORE IN INTERRUPT POINTER
	TAD	JMPIPM/(ROMSP&177+JMPIC)/GET JMP I .-1
	DCA I	PROMST/[ROMST]		/STORE IN RESTART ADDRESS
	NL7777				/BACKUP
	TAD	PCPIHND/(CPIHND)	/NOW HAVE AUTO-INCREMENT LOADING ADDRESS
	DCA	XR0			/STASH THE POINTER
	TAD	XR0			/GET IT AGAIN
	DCA	XR1			/STASH FOR MOVING ALSO
	CDF	70			/GOTO OUR FIELD
RCPLUP,	TAD I	XR0			/GET A WORD
	SNA				/END OF LIST?
	JMP	RIMST			/JUMP IF SO
	CDF	00			/GOTO FIELD 0
	DCA I	XR1			/PUT A WORD
	CDF	70			/BACK TO OUR FIELD
	JMP	RCPLUP			/KEEP GOING

RIMST,	CIF CDF 70			/GOING TO FIELD 7
	PEX				/LEAVING PANEL MEMORY
	JMP I	PAPTSTRT/(APTSTRT)	/GO THERE

/	COMES  HERE  IF  A PREVIOUSLY LOADED ROUTINE EXITED VIA A PANEL REQUEST  WHICH
/	CAUSES A TOTAL RESTART OF THE FORMERLY ROM-BASED CODE MOVED TO FIELD 7.   CODE
/	LOADED INTO MAIN MEMORY 76000-77777 SHOULD BE MOVED TO CP 76000-77777.

DWNAGN,	TAD	CMSW			/GET LOAD SWITCH
	SZA CLA				/SKIP IF NOT LOADED YET
	JMP I	DOWNLOAD		/RETURN TO CALLER
	NL7777				/INDICATE CODE MOVED
	DCA	CMSW			/FOR NEXT TIME
	TAD	PAPTSTRT/(APTSTRT)	/GET STARTING ADDRESS
	DCA	RIMADR			/STASH THE POINTER
MCLUP,	CPD				/MAIN MEMORY INDIRECTS
	TAD I	RIMADR			/GET A WORD
	SPD				/CP MEMORY INDIRECTS
	DCA I	RIMADR			/PUT A WORD
	ISZ	RIMADR			/BUMP TO NEXT
	JMP	MCLUP			/KEEP GOING
	JMP I	DOWNLOAD		/RETURN TO CALLER
CMSW,	.-.				/CODE MOVED SWITCH
JMPIPM,	ROMSP&177+JMPIC			/JMP I .-1 CONSTANT FOR RESTART ADDRESS
PCPIHND,CPIHND				/CP-INTERRUPT HANDLING ADDRESS

/	VALIDATION PATTERN FOR TRACK ZERO, SECTOR 4 DATA.

T0S4DAT,-1
	-"H!200
	-"L!200
	-"T!200
	-"F!200
	-"L!200
	-"G!200
	-2
	0				/THIS ENDS THE LIST

/	DATA PATTERN USED TO TEST RX50 SILO BUFFER.

TPATTRN,000
	252
	125
	063
	017
	377

	ZBLOCK	1			/EMPTY SPACE

DINDEX,	.-.				/TEST DATA INDEX
DCNT,	.-.				/TEST DATA COUNTER
DPTR,	.-.				/TEST DATA POINTER
M5,	-5				/CONSTANT 7773
M1000,	-1000				/CONSTANT 7000
PTPATTR,TPATTRN				/POINTER TO SILO TEST DATA
PRDTWAI,RDTWAIT				/POINTER TO RDTWAIT ROUTINE
/	COMES HERE AFTER DEALING WITH THE COMMUNICATIONS PORT.

COMDONE,JMS I	PRDTWAIT/(RDTWAIT)	/TIME OUT RD51 (IF PRESENT)
	LCD				/SEND A FILL BUFFER COMMAND
	CAF				/CLEAN UP; SELF-TEST SHOULD RAISE THE FLAG
	NL7777				/SETUP AN
	DCA	XR0			/INDEX REGISTER (EXTRANEOUS?)
	TAD	DTIMOUT/[-DTIME]	/SETUP THE
	DCA	T6			/TIME-OUT COUNTER
	DCA	T7			/CLEAR INNER TIME-OUT COUNTER
DONWAIT,SDN				/DONE FLAG UP?
	JMP	NOTDONE			/NO, GO THERE TO WAIT
	SER				/YES, ANY ERRORS?
	JMP	DONEOK			/NO, CONTINUE THERE
	JMP	RXERROR			/GO THERE BECAUSE OF ERRORS

NOTDONE,ISZ	T7			/WAITED ENOUGH?
	JMP	DONWAIT			/NO, KEEP GOING
	ISZ	T6			/WAITING TOO LONG?
	JMP	DONWAIT			/NO, KEEP GOING
	JMP	RXERROR			/GO THERE BECAUSE IT TIMED OUT

DONEOK,	APTSKP				/AUTOMATIC PRODUCT TESTING?
	SKP				/SKIP IF NOT
	JMS I	PAPTROUTINE/[APTROUTINE]/CALL ROUTINE IF SO
	CLA CLL				/CLEAN UP
	DCA	DINDEX			/CLEAR DATA INDEX
	DCA	DCNT			/CLEAR DATA COUNTER
	NL0100 CLL			/GET FILL BUFFER COMMAND (8-BIT) VALUE
	LCD				/LOAD THE COMMAND
	JMS	RXWAIT			/CALL WAIT ROUTINE
	JMP	CMNDOK			/TRANSFER FLAG UP
	JMP	RXERROR			/DONE FLAG UP, ERROR
	JMP	RXERROR			/ERROR OR TIME-OUT

CMNDOK,	XDR				/FINISH THE COMMAND
FILLUP,	JMS	RXWAIT			/CALL WAIT ROUTINE
	JMP	TRNSUP			/TRANSFER FLAG UP
	JMP	DONEUP			/DONE FLAG CAME UP, SO FINISH THERE
	JMP	RXERROR			/ERROR OR TIME-OUT

TRNSUP,	TAD	DINDEX			/GET DATA INDEX
	TAD	PTPATTRN/(TPATTRN)	/POINT TO PROPER ELEMENT IN LIST
	DCA	DPTR			/STASH THE POINTER
	TAD I	DPTR			/GET THE DATA VALUE
	XDR				/SEND TO SILO
	CLA				/CLEAN UP
	ISZ	DCNT			/BUMP DATA COUNTER
	ISZ	DINDEX			/BUMP DATA INDEX
	TAD	DINDEX			/GET DATA INDEX
	TAD	M5/(-5)			/COMPARE TO LARGEST VALUE
	SMA SZA CLA			/SKIP IF NOT PAST
	DCA	DINDEX			/ELSE RESET DATA INDEX
	JMP	FILLUP			/KEEP GOING
/	DONE FLAG IS UP; CHECK IF PROPER BYTE COUNT.

DONEUP,	TAD	DCNT			/GET DATA COUNTER
	TAD	M1000/(-1000)		/COMPARE TO EXPECTED VALUE
	SZA CLA				/SKIP IF IT MATCHES
	JMP	RXERROR			/ELSE COMPLAIN
	CLA CLL				/CLEAN UP
	DCA	DINDEX			/CLEAR DATA INDEX
	DCA	DCNT			/CLEAR DATA COUNTER
	TAD	Z102/[102]		/GET EMPTY BUFFER COMMAND (8-BIT) VALUE
	LCD				/LOAD THE COMMAND
	JMS	RXWAIT			/CALL WAIT ROUTINE
	JMP	CMDOK			/TRANSFER FLAG CAME UP
	JMP	RXERROR			/DONE FLAG CAME UP, COMPLAIN
	JMP	RXERROR			/ERROR OR TIME-OUT

CMDOK,	CLA				/CLEAN UP
	XDR				/FINISH THE COMMAND
EMPTLUP,JMS	RXWAIT			/CALL WAIT ROUTINE
	SKP				/TRANSFER FLAG CAME UP
	JMP	DONUP			/DONE FLAG CAME UP

/	OOPS! FORGOT THE "JMP RXERROR" IF IT GETS AN ERROR OR TIMES OUT.

	TAD	DINDEX			/GET DATA INDEX
	TAD	PTPATTRN/(TPATTRN)	/POINT TO PROPER ELEMENT IN LIST
	DCA	DPTR			/STASH THE POINTER
	TAD I	DPTR			/GET THE DATA
	DCA	DPTR			/SAVE IT
	XDR				/GET THE BYTE
	CIA				/INVERT FOR TESTING
	TAD	DPTR			/COMPARE TO TEST VALUE
	SZA CLA				/SKIP IF IT MATCHES
	JMP	RXERROR			/ELSE COMPLAIN
	ISZ	DCNT			/BUMP DATA COUNTER
	ISZ	DINDEX			/BUMP DATA INDEX
	TAD	DINDEX			/GET DATA INDEX
	TAD	M5/(-5)			/COMPARE TO LARGEST VALUE
	SMA SZA CLA			/SKIP IF NOT TOO FAR
	DCA	DINDEX			/ELSE RESET DATA INDEX
	JMP	EMPTLUP			/KEEP GOING

/	DONE FLAG IS UP; CHECK IF PROPER BYTE COUNT.

DONUP,	TAD	DCNT			/GET DATA COUNTER
	TAD	M1000/(-1000)		/COMPARE TO EXPECTED VALUE
	SZA CLA				/SKIP IF IT MATCHES
	JMP	RXERROR			/ELSE COMPLAIN
	JMP I	.+1/(RXOK)		/CONTINUE THERE
	RXOK				/THROUGH HERE
/	RX50 WAIT ROUTINE.  TAKES  IMMEDIATE  RETURN  IF  TRANSFER FLAG RAISES.  TAKES
/	SKIP RETURN IF DONE FLAG RAISES.   TAKES DOUBLE-SKIP RETURN IF AN ERROR OCCURS
/	OR THE HARDWARE TIMES OUT.

RXWAIT,	.-.
	TAD	DTIMOUT/[-DTIME]	/SETUP THE
	DCA	T6			/TIME-OUT COUNTER
	DCA	T7			/CLEAR INNER TIME-OUT COUNTER
RXWATLP,STR				/TRANSFER FLAG UP?
	SKP				/SKIP IF NOT
	JMP I	RXWAIT			/YES, TAKE IMMEDIATE RETURN
	SDN				/DONE FLAG UP?
	JMP	RXWATING		/NO, KEEP TRYING
	SER				/YES, WERE THERE ERRORS?
	JMP	RXSKIP			/NO, TAKE SKIP RETURN
	JMP	RXSKP2			/YES, TAKE DOUBLE SKIP RETURN

RXWATIN,ISZ	T7			/WAITING TOO LONG?
	JMP	RXWATLP			/NO, KEEP TRYING
	ISZ	T6			/WAITED TOO LONG?
	JMP	RXWATLP			/NO, KEEP TRYING
RXSKP2,	ISZ	RXWAIT			/YES, TAKE DOUBLE-SKIP RETURN
RXSKIP,	ISZ	RXWAIT			/SET SKIP RETURN FOR DONE FLAG UP CONDITION
	JMP I	RXWAIT			/RETURN AS NECESSARY

M100,	-100				/CONSTANT 7700

TIMOUT,	.-.				/GENERAL TIME-OUT ROUTINE
	DCA	T6			/CLEAR INNER COUNTER
	TAD	M100/(-100)		/SETUP THE
	DCA	T7			/OUTER COUNTER
TIMLUP,	ISZ	T6			/WAITING LONG ENOUGH?
	JMP	TIMLUP			/NO, KEEP GOING
	ISZ	T7			/WAITED TOO LONG?
	JMP	TIMLUP			/NO, KEEP GOING
	JMP I	TIMOUT			/YES, RETURN TO CALLER

L40,	40				/CONSTANT 0040

RXERROR,TAD	L40/(40)		/GET RX50 ERROR VALUE
	TAD	ESTATUS			/UPDATE CUMULATIVE ERROR STATUS
	DCA	ESTATUS			/STORE BACK
RXOK,	NL0010 CLL			/SET CRT VALUE
	VIDCON				/LOAD ECHRMOD
	CLA				/CLEAN UP
	JMS I	PENDUP/(ENDUP)		/FINISH UP SCREEN DISPLAY (POSSIBLY ERRORS)
	JMS I	PRDSETUP/(RDSETUP)	/GET RD STARTUP CODE READ IN (IF PRESENT)
	JMS I	PRXRDY/(RXRDY)		/WAIT UNTIL DRIVE ZERO IS READY
	JMP	.-1			/WAIT FOR IT TO BE READY INDEFINITELY
	JMS I	PCLR23/[CLR23]		/CLEAR FIELDS 2, 3 (AND BITS IN 13705, 13707)
RTRK1,	NL7777				/SETUP THE
	DCA	XR0			/STORAGE POINTER
	CDF	00			/STORING IN FIELD 0
	TAD	Z102/[102]		/GET EMPTY SILO (8-BIT) COMMAND
	DCA	RXCMD			/STASH IT
/	CLA				/CALL WITH AC CLEAR (1-1)
	JMS	FREAD			/CALL FLOPPY READ ROUTINE
	-1-1				/ONE SECTOR
	1				/ON TRACK 1
	JMP	RTRK1			/ERROR, TRY AGAIN
	JMS I	PVALID8/(VALID8)	/VALIDATE THE PREFERENCE SETTINGS
	JMP	FLPBAD			/FLOPPY IS BAD, GO COMPLAIN
SLSHAGN,JMS	RXLOAD			/LOAD IN VARIOUS SLUSHWARE ITEMS
	JMP	SLSHBAD			/COULDN'T DO IT
	JMS I	PCLR23/[CLR23]		/CLEAR FIELDS 2, 3 (AND BITS IN 13705, 13707)
	CLA				/CLEAN UP
	CIF CDF	00			/GOING TO FIELD 0
	JMP I	Z200/[200]		/GO START IT UP

PVALID8,VALID8				/POINTER TO VALIDATION ROUTINE
PFBLINK,FBLINK				/POINTER TO FBLINK ROUTINE
PRXRDY,	RXRDY				/POINTER TO RX50 READY CHECK ROUTINE
PRDSETU,RDSETUP				/POINTER TO RD51 SETUP ROUTINE

/	COMES HERE  TO  DISPLAY  A BLINKING BIG FLOPPY PATTERN IF THE CURRENT DISKETTE
/	HAS AN INVALID BOOT BLOCK IN TRACK 1, SECTOR 1.

FLPBAD,	JMS I	PFBLINK/(FBLINK)	/GO DISPLAY THE PATTERN ONCE
	JMP	RTRK1			/TRY AGAIN

/	COMES HERE TO  DISPLAY  THE BIG FLOPPY PATTERN IF THE SLUSHWARE STUFF CAN'T BE
/	COMPLETELY READ IN.

SLSHBAD,JMS I	PFBLINK/(FBLINK)	/GO DISPLAY THE PATTERN ONCE
	JMP	SLSHAGN			/TRY AGAIN

PRXWAIT,RXWAIT				/POINTER TO RX50 WAIT ROUTINE
PENDUP,	ENDUP				/POINTER TO ENDUP ROUTINE
RXLOAD,	.-.				/MULTIPLE RX50 LOADING ROUTINE
	NL7777				/SETUP THE
	DCA	XR0			/STORAGE POINTER
	TAD	Z102/[102]		/SETUP THE
	DCA	RXCMD			/EMPTY BUFFER COMMAND (8-BIT)
	JMS I	PT0S3RD/(T0S3RD)	/READ AND VALIDATE TRACK 0, SECTOR 3
	JMP I	RXLOAD			/COULDN'T DO IT, TAKE FAILURE RETURN
	JMS I	PDOCG/(DOCG)		/READ AND LOAD CHARACTER GENERATOR RAM DATA
	NL002A				/SETUP 12-BIT EMPTY SILO COMMAND VALUE
	DCA	RXCMD			/STASH THE COMMAND
	NL7777				/SETUP THE
	DCA	XR0			/DATA POINTER
	CDF	00			/SETUP THE DATA FIELD
/	CLA				/CALL WITH AC CLEAR (1-1)
	JMS	FREAD			/CALL FLOPPY READ ROUTINE
	-12-1				/READ 10 SECTORS (1-10)
	116				/TRACK 78
	JMP I	RXLOAD			/COULDN'T DO IT, TAKE FAILURE RETURN
	CDF	00			/SETUP THE DATA FIELD
/	CLA				/CALL WITH AC CLEAR (1-1)
	JMS	FREAD			/CALL FLOPPY READ ROUTINE
	-6-1				/READ 6 SECTORS (1-6)
	117				/TRACK 79
	JMP I	RXLOAD			/COULDN'T DO IT, TAKE FAILURE RETURN
	CDF	10			/SETUP THE DATA FIELD
	NL0006				/SETUP FOR SECTOR 7 FIRST
	JMS	FREAD			/CALL FLOPPY READ ROUTINE
	-12-1				/READ 4 SECTORS (7-10)
	117				/TRACK 79
	JMP I	RXLOAD			/COULDN'T DO IT, TAKE FAILURE RETURN
	CDF	00			/BACK TO PRIMARY CODE FIELD
	DCA	XR0			/CLEAR THE POINTER
	JMS I	PSLCHECK/(SLCHECK)	/GO VALIDATE THE DATA
	JMP I	RXLOAD			/BAD DATA, TAKE FAILURE RETURN
	ISZ	RXLOAD			/GOOD DATA, BUMP RETURN ADDRESS
	JMP I	RXLOAD			/TAKE SKIP RETURN TO CALLER

PSLCHEC,SLCHECK				/POINTER TO SLUSHWARE VALIDATION ROUTINE
PT0S3RD,T0S3RD				/POINTER TO TRACK 0, SECTOR 3 READ ROUTINE
PDOCG,	DOCG				/POINTER TO DOCG ROUTINE
/	RX50 READ ROUTINE.  CALL WITH AC CONTAINING RELATIVE OFFSET  ON  THE  TRACK OF
/	FIRST  SECTOR TO TRANSFER.  THIS IS ONE LESS THAN THE  ACTUAL  SECTOR  NUMBER.
/	THE FIRST IN-LINE ARGUMENT IS THE LIMIT ON THE SECTOR COUNT, I.E.,  THE  TWO'S
/	COMPLEMENT  OF  THE  SECTOR  VALUE  ONE HIGHER THAN DESIRED AS THE LAST SECTOR
/	TRANSFERRED.  THE DATA IS TRANSFERRED INTO THE  SAME FIELD AS THE CURRENT DATA
/	FIELD.  XR0 SHOULD BE SET TO THE DATA STORAGE ADDRESS -1.  RXCMD SHOULD BE SET
/	TO A SILO EMPTY COMMAND, EITHER 8-BIT OR 12-BIT AS REQUIRED.  THE COMMAND WILL
/	BE ISSUED CORRECTLY EITHER WAY.  CONTROL IS RETURNED TO JUST  PAST  THE SECOND
/	ARGUMENT IF THERE IS AN ERROR.  AN EXTRA SKIP RETURN IS  PERFORMED IF THE READ
/	WAS OK.

FREAD,	.-.				/FLOPPY READ ROUTINE
	DCA	TINC			/SAVE PASSED VALUE (SECTOR OFFSET ON TRACK)
	RDF				/GET CALLING FIELD
	TAD	ZCDF/[CDF]		/FORM CDF CALLING FIELD
	DCA	TRNCDF			/STORE IN-LINE
	CDF	70			/BACK TO OUR FIELD
	TAD I	FREAD			/GET FIRST ARGUMENT (COUNT LIMIT)
	DCA	T0			/STASH IT
	ISZ	FREAD			/BUMP TO NEXT
	TAD I	FREAD			/GET SECOND ARGUMENT (TRACK)
	DCA	T1			/STASH IT
	ISZ	FREAD			/BUMP PAST ARGUMENT
FNXTSCT,CDF	70			/BACK TO OUR FIELD
	ISZ	TINC			/BUMP SECTOR OFFSET TO LATEST SECTOR
	TAD	TINC			/GET THE LATEST OFFSET
	TAD	T0			/COMPARE TO COUNT LIMIT
	SPA CLA				/SKIP IF FINISHED
	JMP	FNEXT			/ELSE KEEP GOING
	ISZ	FREAD			/BUMP RETURN ADDRESS
	JMP I	FREAD			/TAKE SUCCESSFUL RETURN

FNEXT,	NL0006				/GET READ FUNCTION VALUE
	JMS I	PRXCOMD/[RXCOMD]	/CALL READ COMMAND ROUTINE
	SKP				/SKIP IF COMMAND FINISHED
	JMP I	FREAD			/ELSE TAKE FAILURE RETURN
	SER				/ANY ERRORS?
	JMP	FRDOK			/JUMP IF NOT
FERR,	JMS I	PSSTRING/[SSTRING]	/STORE PATTERN FOR BIG FLOPPY
	BIGFLPY				/SCREEN DATA POINTER
	JMP I	FREAD			/TAKE FAILURE RETURN

FRDOK,	TAD	RXCMD			/GET SILO EMPTY COMMAND
	LCD				/LOAD THE COMMAND
	NL0100 CLL			/SET THE 8-BIT MASK
	AND	RXCMD			/ISOLATE THE BIT
	SNA CLA				/SKIP IF SET
	JMP	TRNCDF			/JUMP IF NOT
	JMS I	PRXWAIT/(RXWAIT)	/CALL FLAG WAIT ROUTINE
	JMP	COMFINISH		/TRANSFER FLAG UP AS EXPECTED
	JMP	FERR			/DONE FLAG CAME UP, ERROR
	JMP	FERR			/TIME-OUT, ERROR
COMFINI,XDR				/FINISH THE COMMAND
TRNCDF,	HLT+.-.				/WILL BE CDF XX INSTRUCTION TO BUFFER FIELD
	CLA				/CLEAN UP
FRDLUP,	STR				/TRANSFER FLAG UP?
	JMP	TRYDONE			/NO, TRY DONE FLAG
	XDR				/YES, GET THE LATEST
	DCA I	XR0			/STORE IT
TRYDONE,SDN				/DONE FLAG UP?
	JMP	FRDLUP			/NO, TRY TRANSFER
	SER				/YES, ANY ERRORS?
	JMP	FNXTSCT			/NO, GO DO NEXT SECTOR
	JMP	FERR			/YES, GO COMPLAIN

	ZBLOCK	4			/EMPTY SPACE
	PAGE

/	AUTO-INDEXED POINTER TO PIE CHIP PROGRAMMING TABLE (TABLE FOLLOWS).

PPTABLE,PTABLE-1			/POINTER TO PROGRAMMING TABLE.

/	PROGRAMMING  NOTE:   BY PLACING THIS POINTER HERE,  AN  EXTRANEOUS  PAGE  ZERO
/	REFERENCE TO THE POINTER IS REQUIRED, INSTEAD OF MERELY A POINTER TO THE TABLE
/	ON PAGE ZERO ITSELF.

/	PIE CHIP PROGRAMMING TABLE.

	PTABLE=	.			/PROGRAMMING TABLE HERE

/	FIRST CHIP.

	KEY^10+1004			/DEVICE 03
	TTY^10+1004			/DEVICE 04
	CLKCON^10+3000			/DEVICE 13
	PRICON^10+3002			/DEVICE 32
	PROCON^10+3007			/DEVICE 33

/	SECOND CHIP.

	PORTIN^10+1002			/DEVICE 30
	PORTOUT^10+1003			/DEVICE 31
	PORTCON^10+3004			/DEVICE 36
	RXCON^10+0004			/DEVICE 75
	APUCON^10+1004			/DEVICE 14

/	THIRD CHIP (CP INTERRUPTS ONLY).

	TTYCON^10+1000			/DEVICE 07
	VIDINT^10+3000			/DEVICE 06
	KBOCON^10+7003			/DEVICE 05
	KBICON^10+7002			/DEVICE 11
	VIDDEV^10+4004			/DEVICE 12

	0				/THIS ENDS THE LIST
/	MEMORY COMPARE ROUTINE.

/	THIS  ROUTINE  CHECKS IF THE CURRENT TEST FIELD MATCHES THE  TEST  PATTERN  IN
/	EVERY WORD.  ALL MATCHING WORDS ARE INVERTED FOR THE NEXT TEST.  THE IMMEDIATE
/	RETURN IS TAKEN ON A MATCH FAILURE; SKIP RETURN IS TAKEN IF ALL WORDS MATCH.

MEMCOMP,.-.				/MEMORY COMPARE ROUTINE
	TAD	T2			/GET LATEST FIELD
	AND	Z7/[7]			/JUST FIELD BITS
	R3L				/MOVE UP
	TAD	ZCDF/[CDF]		/FORM CDF INSTRUCTION
	DCA	.+1			/STORE IN-LINE
	HLT+.-.				/WILL BE CDF XX INSTRUCTION
MCHKLP,	TAD I	T1			/GET A WORD
	TAD	T0			/COMPARE TO TEST VALUE
	IAC				/SHOULD BE ZERO
	SZA CLA				/SKIP IF IT MATCHES
	JMP I	MEMCOMPARE		/TAKE IMMEDIATE RETURN IF IT FAILS
	TAD	T0			/GET INVERTED TEST VALUE
	DCA I	T1			/STORE BACK
	TAD	T1			/GET ADDRESS
	TAD	TINC			/BUMP UP
	DCA	T1			/STORE BACK
	ISZ	XR0			/DONE ALL IN THIS FIELD
	JMP	MCHKLP			/NO, GO BACK FOR MORE
	ISZ	MEMCOMPARE		/YES, BUMP RETURN ADDRESS
	JMP I	MEMCOMPARE		/TAKE SKIP RETURN TO CALLER

PROWTAB,ROWTABLE-1			/POINTER TO HIGH-ORDER ROW TABLE
PREGLIS,REGLIST-1			/POINTER TO REGISTER AND CONTENTS LIST
PROWADR,ROWADR-1			/POINTER TO ROWTABLE ADDRESS

ROWLOAD,.-.  				/ROUTINE TO LOAD ROWTABLE AND VIDEO REGISTERS
	CLA CLL				/CLEAN UP
	VIDCON				/CLEAR SCREEN CONTROL REGISTER
	CDF	70			/ENSURE OUR FIELD
	TAD	PROWADR/(ROWADR-1)	/GET ROWTABLE TABLE POINTER
	DCA	XR0			/STASH THE POINTER
	TAD	PROWTABLE/(ROWTABLE-1)	/GET HIGH-ORDER ROW ADDRESS TABLE VALUE
	DCA	XR1			/STASH THE POINTER
ROWLUP,	TAD I	XR1			/GET A LIST ELEMENT
	SPA				/SKIP IF NOT AT END OF LIST
	JMP	FHERE			/JUMP IF AT END OF LIST
	MQL				/STASH IT FOR NOW
	CDF	10			/GOTO TABLE FIELD
	TAD	Z205/[205]		/GET LOW-ORDER BITS VALUE
	DCA I	XR0			/STASH IN TABLE
	CLA MQA				/GET HIGH-ORDER AND ATTRIBUTES
	DCA I	XR0			/STASH IN TABLE
	CDF	70			/BACK TO OUR FIELD
	JMP	ROWLUP			/KEEP GOING
FHERE,	CLA CLL				/CLEAN UP
	TAD	PREGLIST/(REGLIST-1)	/POINT TO
	DCA	XR0			/REGISTER LIST
REGLUP,	CDF	70			/BACK TO OUR FIELD
	TAD I	XR0			/GET A LIST ITEM
	SPA				/SKIP IF NOT END OF LIST
	JMP	REGDONE			/JUMP IF DONE
	LSCREG				/LOAD REGISTER SELECT
	CLA				/CLEAN UP
	TAD I	XR0			/GET THE VALUE
	VLOAD				/LOAD THE REGISTER WITH DESIRED VALUE
	CLA CLL				/CLEAN UP
	JMP	REGLUP			/KEEP GOING

REGDONE,CLA CLL				/CLEAN UP
	JMP I	ROWLOAD			/RETURN

/	ROUTINE TO CLEAR CP FIELD 2  AND  3;   ALSO CLEARS HIGH-ORDER HALF OF CP 13705
/	AND 13707 TO MAKE THOSE LINES HAVE NORMAL ATTRIBUTES.

CLR23,	.-.				/CLEAR FIELD 2, FIELD 3 ROUTINE
	CLA				/CLEAN UP
	DCA	T2			/CLEAR EVEN/ODD FIELD FLAG
ZERNXT,	NL7777				/SETUP FOR STORING
	DCA	XR0			/INTO LOCATION 0000 OF THE LATEST FIELD
	JMS	CDFSETUP		/SETUP PROPER FIELD
	TAD	Z7760/[-20]		/SETUP THE
	DCA	T3			/BUFFER COUNT
BUFLUP,	TAD	Z7400/[-400]		/SETUP FOR TWO PAGES WORTH
	DCA	T4			/IN EACH BUFFER
ZERLUP,	DCA I	XR0			/CLEAR A WORD
	ISZ	T4			/DONE YET?
	JMP	ZERLUP			/NO, GO BACK
	ISZ	T3			/DONE ENOUGH BUFFERS?
	JMP	BUFLUP			/NO, GO BACK
	TAD	T2			/GET FLAG
	SZA CLA				/SKIP IF ZERO
	JMP	CLRFINISH		/ELSE FINISH THERE
	NL7777				/SET THE FLAG
	DCA	T2			/FOR NEXT FIELD
	JMP	ZERNXT			/GO DO IT AGAIN

CDFSETU,.-.				/CDF SETTING ROUTINE
	TAD	T2			/GET THE FLAG
	SZA CLA				/SKIP IF EVEN FIELD
	JMP	SETODD			/JUMP IF ODD
	CDF	20			/SETUP FOR FIELD 2
	JMP I	CDFSETUP		/RETURN

SETODD,	CDF	30			/SETUP FOR FIELD 3
	JMP I	CDFSETUP		/RETURN

CLRFINI,JMS I	PCLR2/(CLR2)		/CLEAR ATTRIBUTE BITS OF 13705 AND 13707
	JMP I	CLR23			/RETURN
PCLR2,	CLR2				/POINTER TO CLR2 ROUTINE
PTIMOUT,TIMOUT				/POINTER TO TIME-OUT ROUTINE

FBLINK,	.-.				/BIG FLOPPY DISPLAY ROUTINE
	NL0010 CLL			/SET EXTENDED CHARACTER MODE
	VIDCON				/LOAD NEW CONTROL VALUE
	CLA				/CLEAN UP
	TAD	BL40/(" &177)		/GET SPACE CODE
	JMS I	PSSTRING/[SSTRING]	/CLEAR ALL ITEMS OF
	BIGFLPY				/THE BIG FLOPPY PATTERN
	JMS I	PTIMOUT/(TIMOUT)	/GO WAIT FOR AWHILE	
	JMS I	PSSTRING/[SSTRING]	/GO DISPLAY ALL ITEMS OF
	BIGFLPY				/THE BIG FLOPPY PATTERN
	JMS I	PTIMOUT/(TIMOUT)	/GO WAIT FOR AWHILE
	JMP I	FBLINK			/RETURN

BL40,	" &177				/CONSTANT 0040

	ZBLOCK	7			/EMPTY SPACE
	PAGE

/	ROUTINE TO  VALIDATE  THE  CONTENTS  OF  TRACK  ONE,  SECTOR ONE AS A BOOTABLE
/	FLOPPY.  THE FIRST FEW BYTES OF THIS SECTOR  HAVE  TO  BE  A  VALID PREFERENCE
/	SETTING BLOCK IN ORDER TO ALLOW FURTHER BOOTING.  NON-SKIP  RETURN IS TAKEN IF
/	THE BYTES ARE BAD, SKIP RETURN IF THEY ARE GOOD.

VALID8,	.-.				/TRACK ONE VALIDATION ROUTINE
	CDF	70			/RESET TO OUR FIELD (WHY?)
	NL7777				/SETUP POINTER TO 0000
	DCA	XR0			/STASH THE POINTER
	CDF	00			/GOTO THE DATA FIELD
	TAD I	XR0			/GET THE FIRST BYTE
	TAD I	XR0			/ADD TO THE SECOND BYTE
	CDF	70			/BACK TO OUR FIELD

/	THE  SUM SHOULD BE ZERO MEANING THE TWO WORDS ARE THE TWO'S COMPLEMENT OF EACH
/	OTHER (OR ARE BOTH ZERO).

	SZA CLA				/SKIP IF OK
	JMP I	VALID8			/TAKE BAD RETURN IF NOT
	CDF	00			/GOTO THE DATA FIELD

/	THE NEXT BYTE IS TREATED AS A POINTER FOR LATER.

	TAD I	XR0			/GET THE NEXT BYTE
	CLL RAL				/*2
	TAD	XR0			/ADD 2
	DCA	XR1			/STASH THE POINTER FOR LATER

/	THE NEXT BYTE HAS TO BE 001.

	NL7777				/GET -1
	TAD I	XR0			/ADD ON NEXT BYTE
	CDF 	70			/BACK TO OUR FIELD
	SZA CLA				/SKIP IF IT MATCHES
	JMP I	VALID8			/ELSE TAKE BAD RETURN
/	THE  REST  OF  THE TESTED BYTES ARE POINTED TO THE THIRD BYTE.  THE FOUR BYTES
/	SHOULD SUM  TO  377.   THE POINTER WAS INCREMENTED BY TWO INITIALLY, SO WE MAY
/	HAVE TO SUBTRACT TWO TO LOCATE THE PROPER FOUR BYTE SEQUENCE.

VALAGN,	DCA	XR2			/SET TO 0000 (OR 7776)
	NL7777				/BACKUP
	TAD	XR1			/ADD ON POINTER
	TAD	XR2			/ADD 0000 OR 7776
	DCA	XR0			/STASH THE POINTER
	CDF	00			/GOTO THE DATA FIELD
	TAD I	XR0			/\
	TAD I	XR0			/ \GET THE NEXT
	TAD I	XR0			/ /FOUR BYTES
	TAD I	XR0			//
	CDF	70			/BACK TO OUR FIELD
	IAC				/ADD ONE
	AND	Z377/[377]		/JUST LOW-ORDER BITS
	SZA CLA				/SKIP IF ALL TOGETHER IT'S ZERO
	JMP	VALALT			/JUMP IF NOT

/	HAVING LOCATED THE CORRECT FOUR BYTE SEQUENCE, CONFIRM THAT THE FIRST TWO HAVE
/	BIT[8] SET.

	NL7777				/BACKUP
	TAD	XR1			/ADD ON POINTER
	TAD	XR2			/ADD ON 0000 OR 7776
	DCA	XR0			/STASH THE POINTER
	CDF	00			/GOTO THE DATA FIELD
	NL0010 CLL			/SET THE BIT MASK
	AND I	XR0			/GET THE FIRST ONE'S BIT
	AND I	XR0			/AND THE SECOND ONE'S BIT
	CDF	70			/BACK TO OUR FIELD
	SZA CLA				/SKIP IF OFF
	ISZ	VALID8			/BUMP TO GOOD RETURN
	JMP I	VALID8			/RETURN EITHER WAY

VALALT,	TAD	XR2			/GET THE OFFSET
	SZA CLA				/SKIP IF ZERO
	JMP I	VALID8			/RETURN IF 7776 WAS ALSO UNSUCCESSFUL
	NL7776				/SET -2 VALUE
	JMP	VALAGN			/TRY IT AGAIN
/	THIS IS THE LIST OF VALUES USED WITH LSCREG AND VLOAD IN PAIRS.

REGLIST,26				/REGISTER 16
	000				/DUMMY VALUE (DO A RESET)
	00				/REGISTER 0
	144-1				/100 CHARACTERS PER HORIZONTAL PERIOD
	01				/REGISTER 1
	120-1				/80 CHARACTERS PER DATA ROW
	02				/REGISTER 2
	016				/14 IS HORIZONTAL DELAY
	03				/REGISTER 3
	007				/7 IS HORIZONTAL SYNC WIDTH
	04				/REGISTER 4
	003				/3 IS VERTICAL SYNC WIDTH
	05				/REGISTER 5
	025				/21 IS VERTICAL DELAY
	06				/REGISTER 6
	022				/PINS 00, CURSOR SKEW 2, BLANK SKEW 2
	07				/REGISTER 7
	30-1				/24 VISIBLE DATA ROWS PER FRAME
	10				/REGISTER 8
	051				/SCAN LINES/FRAME 1, SCAN LINES/DATA ROW 9
	11				/REGISTER 9
	011				/9 SCAN LINES PER FRAME
	12				/REGISTER A
	160				/DMA BURST DELAY 7, DMA BURST COUNT 0
	13				/REGISTER B
	010				/OPERATION MODE 4 ****
	0014				/REGISTER C
	ROWADR&377			/LOW-ORDER 8-BITS OF 13660
	0015				/REGISTER D
	ROWADR%400+0220			/CONTIGUOUS ROW TABLE AT 13660
	16				/REGISTER E
	000				/LOW-ORDER AUXILIARY ADDRESS REGISTER
	17				/REGISTER F
	000				/HIGH-ORDER AUXILIARY ADDRESS REGISTER
	20				/REGISTER 10
	077 				/SEQUENTIAL BREAK REGISTER DISABLE VALUE
	21				/REGISTER 11
	000 				/PAGE BLANK, SMOOTH SCROLL CAN START AT 000
	22				/REGISTER 12
	030				/DATA ROW END PAST LINE 23
	27				/REGISTER 17
	000				/NO SMOOTH SCROLL OFFSET
	30				/REGISTER 18
	000				/CURSOR APPEARS VERTICAL AT 000
	31				/REGISTER 19
	000				/CURSOR APPEARS HORIZONTALLY AT 000
	32				/REGISTER 1A
	100				/ENABLE VERTICAL RETRACE INTERRUPTS
	25				/REGISTER 15
	000				/ISSUE START COMMAND
	4000				/THIS ENDS THE LIST
/	THIS TABLE IS USED  TO LOAD THE HIGH-ORDER BYTES OF THE CONTIGUOUS ROW ADDRESS
/	TABLE.  THE FORMAT IS  TWO ATTRIBUTE BITS AND SIX ADDRESS BITS.  THE LOW-ORDER
/	ADDRESS BYTE IS ALWAYS 205.   THE  ATTRIBUTE  BITS  ARE:   00=NORMAL DATA ROW,
/	01=SINGLE  HEIGHT,  DOUBLE  WIDTH;  10=TOP OF  DOUBLE  HEIGHT,  DOUBLE  WIDTH;
/	11=BOTTOM OF DOUBLE HEIGHT, DOUBLE WIDTH.

ROWTABL,0141				/LINE 00 DATA STARTS AT 20605 (DOUBLE WIDTH)
	0042				/LINE 01 DATA STARTS AT 21205
	0043				/LINE 02 DATA STARTS AT 21605
	0044				/LINE 03 DATA STARTS AT 22205
	0045				/LINE 04 DATA STARTS AT 22605
	0046				/LINE 05 DATA STARTS AT 23205
	0047				/LINE 06 DATA STARTS AT 23605
	0050				/LINE 07 DATA STARTS AT 24205
	0051				/LINE 08 DATA STARTS AT 24605
	0052				/LINE 09 DATA STARTS AT 25205
	0053				/LINE 10 DATA STARTS AT 25605
	0054				/LINE 11 DATA STARTS AT 26205
	0055				/LINE 12 DATA STARTS AT 26605
	0056				/LINE 13 DATA STARTS AT 27205
	0057				/LINE 14 DATA STARTS AT 27605
	0072				/LINE 15 DATA STARTS AT 35205
	0061				/LINE 16 DATA STARTS AT 30605
	0062				/LINE 17 DATA STARTS AT 31205
	0063				/LINE 18 DATA STARTS AT 31605
	0064				/LINE 19 DATA STARTS AT 32205
	0065				/LINE 20 DATA STARTS AT 32605
	0066				/LINE 21 DATA STARTS AT 33205
	0067				/LINE 22 DATA STARTS AT 33605
	0070				/LINE 23 DATA STARTS AT 34205
	7777				/THIS ENDS THE LIST
	PAGE

/	STORE  DISPLAY  STRING  ROUTINE.    CALL WITH CLEAR AC TO  DISPLAY  VALUES  IN
/	ARGUMENT LIST OR WITH 0040 IN AC TO BLANK THE FIELD.    IN-LINE  ARGUMENT IS A
/	POINTER TO THE ARGUMENT LIST.  LIST FORMAT IS 0000 IF ITEMS  ARE  FOR FIELD 2,
/	OR  4000  IF  ITEMS ARE FOR FIELD 3.  RELATIVE STORAGE ADDRESS FOR  SUBSEQUENT
/	ITEMS  FOLLOWS  THE  0000  OR  4000.  ALL OTHER ITEMS ARE SEQUENTIAL VALUES TO
/	STORE INTO  THE  BUFFER  STARTING  AT  THE  GIVEN  ADDRESS.  ALL ADDRESSES ARE
/	RELATIVE TO THE ABSOLUTE  VALUE  0205,  NOT  THE  ACTUAL  ROW ADDRESS WHICH IS
/	ALWAYS SOME NUMBER OF WHOLE  PAGES  DIFFERENT.    ADDRESSES  NEAR THE END OF A
/	FIELD WILL NOT BE CORRECTED TO  THE  NEXT  FIELD.  THE ARGUMENT LIST ENDS WITH
/	7777.  CONTROL RETURNS PAST THE IN-LINE POINTER ARGUMENT.

SSTRING,.-.				/STORE STRING FOR DISPLAY ROUTINE
	CDF	70			/ENSURE OUR FIELD
	DCA	SPACSW			/SAVE PASSED VALUE
	NL7777				/BACKUP FOR AUTO-INDEX
	TAD I	SSTRING			/GET ARGUMENT ADDRESS
	ISZ	SSTRING			/BUMP PAST ARGUMENT
	DCA	XR7			/STASH THE POINTER
SSLUP,	TAD I	XR7			/GET A WORD
	MQL				/STASH IT FOR NOW
	CLA MQA				/GET IT BACK
	IAC				/ADD ONE FOR TEST
	SNA CLA				/SKIP IF NOT AT END OF LIST (7777)
	JMP I	SSTRING			/RETURN IF AT END
	CLA MQA				/GET THE VALUE AGAIN
	AND	Z3777/[3777]		/IGNORE HIGH-ORDER BIT FOR NOW
	SNA CLA				/SKIP IF SOMETHING SET
	JMP	SSADR			/JUMP IF NOT
	TAD	SPACSW			/GET PASSED ARGUMENT
	SNA				/SKIP IF IT WAS SET (A SPACE CHARACTER)
	CLA MQA				/USE PASSED VALUE
CDFINST,HLT+.-.				/WILL BE CDF XX INSTRUCTION
	DCA I	T5			/STORE IN BUFFER
	ISZ	T5			/BUMP TO NEXT
	NOP				/JUST IN CASE IT SKIPS
	CDF	70			/BACK TO OUR FIELD
	JMP	SSLUP			/KEEP GOING

 SSADR,	TAD I	XR7			/GET NEXT WORD AFTER FLAG WORD
	DCA	T5			/STASH AS ADDRESS
	CLA MQA				/GET THE WORD
	SPA CLA				/SKIP IF IT FLAG WORD IS ZERO
	TAD	Z10/[10]		/MAKE IT CDF 30
	TAD	CDF20/(CDF 20)		/GET CDF 20
	DCA	CDFINST			/STORE CDF 20 OR CDF 30 IN-LINE
	TAD	T5			/GET ADDRESS WORD
	TAD	Z205/[205]		/ADD OFFSET
	DCA	T5			/STORE BACK
	JMP	SSLUP			/KEEP GOING

CDF20,	CDF	20			/CONSTANT 6221
SPACSW,	.-.				/PASSED SPACE PARAMETER
/	DATA PATTERN THAT LOOKS LIKE A BIG FLOPPY (USED FOR ERROR DISPLAY).

BIGFLPY,0000				/FIELD 2
	1445				/ADDRESS
	0015
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0014
	0000				/FIELD 2
	2045				/ADDRESS
	0031
	0000				/FIELD 2
	2070				/ADDRESS
	0015
	0022
	0022
	0022
	0022
	0022
	0014
	0031
	0000				/FIELD 2
	2445				/ADDRESS
	0031
	0000				/FIELD 2
	2470				/ADDRESS
	0031
	0000				/FIELD 2
	2476				/ADDRESS
	0031
	0031
	0000				/FIELD 2
	3045				/ADDRESS
	0031
	0000				/FIELD 2
	3070				/ADDRESS
	0031
	0000				/FIELD 2
	3076				/ADDRESS
	0031
	0031
	0000				/FIELD 2
	3445				/ADDRESS
	0031
	0000				/FIELD 2
	3462				/ADDRESS
	4025
	0000				/FIELD 2
	3470				/ADDRESS
	0016
	0022
	0022
	0022
	0022
	0022
	0013
	0031
	0000				/FIELD 2
	4045				/ADDRESS
	0031
	0000				/FIELD 2
	4060				/ADDRESS
	4026
	4031
	0000				/FIELD 2
	4063				/ADDRESS
	4031
	4026
	0000				/FIELD 2
	4072				/ADDRESS
	0015
	0022
	0022
	0022
	0014
	0031
	0000				/FIELD 2
	4445				/ADDRESS
	0031
	0050
	" +200
	" +200
	" +200
	" +200
	" +200
	0051
	0000				/FIELD 2
	4460				/ADDRESS
	4027
	0000				/FIELD 2
	4464				/ADDRESS
	4027
	0000				/FIELD 2
	4472				/ADDRESS
	0031
	0000				/FIELD 2
	4476				/ADDRESS
	0031
	0031
	0000				/FIELD 2
	5045				/ADDRESS
	0031
	0000				/FIELD 2
	5061				/ADDRESS
	4030
	4027
	4030
	0000				/FIELD 2
	5072				/ADDRESS
	0031
	0000				/FIELD 2
	5076				/ADDRESS
	0031
	0031
	0000				/FIELD 2
	5445				/ADDRESS
	0031
	0000				/FIELD 2
	5460				/ADDRESS
	0007
	0000				/FIELD 2
	5472				/ADDRESS
	0031
	0000				/FIELD 2
	5476				/ADDRESS
	0031
	0031
	0000				/FIELD 2
	6045				/ADDRESS
	0031
	0000				/FIELD 2
	6072				/ADDRESS
	0031
	0000				/FIELD 2
	6076				/ADDRESS
	0031
	0031
	0000				/FIELD 2
	6445				/ADDRESS
	0031
	0000				/FIELD 2
	6472				/ADDRESS
	0031
	0000				/FIELD 2
	6476				/ADDRESS
	0031
	0031
	0000				/FIELD 2
	7045				/ADDRESS
	0031
	0000				/FIELD 2
	7070				/ADDRESS
	0015
	0014
	0016
	0022
	0022
	0022
	0013
	0031
	0000				/FIELD 2
	7445				/ADDRESS
	0016
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0022
	0013
	0016
	0022
	0022
	0022
	0022
	0022
	0013
	7777				/END OF LIST
/	ERROR NUMBER DISPLAY LIST.

EDISPLI,0000				/FIELD 2
	5422				/ADDRESS
	.-.				/HIGH-ORDER ERROR DIGIT
	.-.				/LOW-ORDER ERROR DIGIT
	0000				/FIELD 2
	6022				/ADDRESS
J00,	0040+.-.			/HIGH-ORDER ERROR DIGIT
J01,	0040+.-.			/LOW-ORDER ERROR DIGIT
	7777				/END OF LIST

/	NON-ERROR (DECMATE II LOGO) DISPLAY LIST.

DMLOGO,	0000				/FIELD 2
	5415				/ADDRESS
	" +200
	"D+200
	"E+200
	"C+200
	"M+240
	"A+240
	"T+240
	"E+240
	" +200
	"I+200
	"I+200
	" +200
	0000				/FIELD 2
	6015				/ADDRESS
	" +200
	"D+200
	"E+200
	"C+200
	"M+240
	"A+240
	"T+240
	"E+240
	" +200
	"I+200
	"I+200
	" +200
	7777				/END OF LIST

L23,	23				/CONSTANT 0023
L247,	247				/CONSTANT 0247
L202,	202				/CONSTANT 0202
L460,	"0+200				/CONSTANT 0460
ENDUP,	.-.				/FINISH UP ROUTINE
	CLA CLL				/CLEAN UP
	JMS I	PSET2/(SET2)		/SET ATTRIBUTE BITS IN 13705, 13707
	TAD	ESTATUS			/GET ERROR STATUS
	SNA CLA				/SKIP IF ANY PROBLEMS
	JMP	NOERRORS		/JUMP IF NONE
	DCA	XR0			/CLEAR QUOTIENT
	TAD	ESTATUS			/GET ERROR STATUS
	APTSKP				/AUTOMATIC PRODUCT TEST?
	SKP				/SKIP IF NOT
	JMP I	PAPT2/(APTRO2)		/ELSE GO THERE
SUBLUP,	TAD	Z7766/[7766]		/SUBTRACT 10
	SPA				/GONE TOO FAR?
	JMP	ADDFIX			/YES, GO THERE TO FIX UP
	ISZ	XR0			/NO, BUMP QUOTIENT
	JMP	SUBLUP			/KEEP GOING

ADDFIX,	TAD	Z12/[12]		/RESTORE VALUE
	TAD	L460/("0+200)		/MAKE IT ASCII WITH ATTRIBUTES SET
	DCA I	LOW1/(EDISPLIST+3)	/STORE IN BUFFER
	TAD I	LOW1/(EDISPLIST+3)	/GET IT BACK
	DCA I	LOW2/(EDISPLIST+7)	/STORE THERE ALSO
	TAD	XR0			/GET QUOTIENT
	TAD	L460/("0+200)		/MAKE IT ASCII WITH ATTRIBUTES SET
	DCA I	HIGH1/(EDISPLIST+2)	/STORE IN BUFFER
	TAD I	HIGH1/(EDISPLIST+2)	/GET IT BACK
	DCA I	HIGH2/(EDISPLIST+6)	/STORE THERE ALSO
	TAD	L23/(23)		/GET KEYBOARD CODE TO LIGHT LEDS
	KBOLS				/SEND IT TO KEYBOARD
	DCA	XR2			/CLEAR WAIT COUNTER
	ISZ	XR2			/WAITING LONG ENOUGH?
	JMP	.-1			/NO, KEEP GOING
	TAD	L202/(202)		/GET KEYBOARD CODE FOR LED PATTERN
	KBOLS				/SEND IT TO KEYBOARD
	CLA				/CLEAN UP
	JMS I	PSSTRING/[SSTRING]	/CALL STRING STORE FOR DISPLAY ROUTINE
	EDISPLIST			/ERROR DIGITS DISPLAY LIST POINTER
	KBISF				/KEYBOARD FLAG UP?
	JMP	.-1			/NO, WAIT FOR IT
	KBIRB				/YES, READ IN THE CHARACTER
	CLA				/THROW IT AWAY
	JMP I	ENDUP			/RETURN

/	COMES HERE IF NO ERRORS FOUND EARLIER.

NOERROR,APTSKP				/AUTOMATIC PRODUCT TESTING?
	JMP	NOTAPT			/JUMP IF NOT
	JMS I	PAPTROUTINE/[APTROUTINE]/CALL ROUTINE IF SO
	JMP I	.+1/(PRGDONE)		/GO THERE
	PRGDONE				/THROUGH HERE
NOTAPT,	TAD	L247/(247)		/GET KEYBOARD CODE FOR THE BEEPER
	KBOLS				/SEND IT
	CLA				/CLEAN UP
	JMS I	PSSTRING/[SSTRING]	/DISPLAY THE
	DMLOGO				/DECMATE II LOGO
	JMP I	ENDUP			/RETURN

PSET2,	SET2				/POINTER TO 2-WORD ATTRIBUTE BITS SET ROUTINE
LOW1,	EDISPLIST+3			/POINTER TO LOW-ORDER DIGIT STORAGE (1)
LOW2,	EDISPLIST+7			/POINTER TO LOW-ORDER DIGIT STORAGE (2)
HIGH1,	EDISPLIST+2			/POINTER TO HIGH-ORDER DIGIT STORAGE (1)
HIGH2,	EDISPLIST+6			/POINTER TO HIGH-ORDER DIGIT STORAGE (2)
PAPT2,	APTRO2				/POINTER TO APTROUTINE ERROR HANDLING ENTRY

/	CP-INTERRUPT HANDLER FOR DOWN-LOADED CODE.  THE  DOWNLOADED  CODE  EXITS VIA A
/	HLT INSTRUCTION OR PANEL REQUEST.  HLT ENDS  THE EXECUTION AND RETURNS CONTROL
/	TO OUR CODE; PANEL REQUEST CAUSES A TOTAL RESTART OF ALL MOVED ROM CODE.

CPIHND,	DCA	XR7			/SAVE AC
	GCF				/GET CURRENT FIELDS, ETC. STATUS
	DCA	XR6			/STASH IT
	PRS				/GET PANEL STATUS
	DCA	XR0			/STASH IT
	SPD				/CP INDIRECTS FROM NOW ON
	TAD	XR0			/GET STATUS BACK
	SMA				/SKIP IF BOOTSTRAP (CPREQ) SET
	JMP	HALTEST			/JUMP IF NOT
	CLA				/CLEAN UP
	VSF				/SKIP ON, CLEAR VIDEO INTERRUPT FLAG
	NOP				/IN CASE IT SKIPS
	TTYSF				/SKIP ON, CLEAR TTY: TRAP FLAG
	NOP				/IN CASE IT SKIPS
	KBISF				/SKIP ON, CLEAR KEYBOARD INPUT FLAG
	NOP				/IN CASE IT SKIPS
	KBOSF				/SKIP ON, CLEAR KEYBOARD OUTPUT FLAG
	NOP				/IN CASE IT SKIPS
	TAD	XR6			/GET FIELDS BACK
	RTF				/RESTORE THEM
	TAD	XR7			/RESTORE AC
	PEX				/LEAVING PANEL MEMORY
	JMP I	INTADR			/RETURN TO INTERRUPTED MAIN MEMORY  PROGRAM

HALTEST,CIF CDF	70			/STAYING IN OUR FIELD
	AND	L200/(200)		/JUST HLTFLG BIT
	SNA CLA				/SKIP IF SET
	JMP I	L200/(CODESTART)	/JUMP IF NOT (PANEL REQUEST)
	PG0				/RESET RUN FLIP-FLOP
	JMP I	.+1/(DWNENTRY)		/GO THERE
	DWNENTRY			/THROUGH HERE

L200,	200/CODESTART			/CONSTANT 0200

	0000				/THIS ENDS THE LIST OF INSTRUCTIONS TO MOVE

	ZBLOCK	2			/EMPTY SPACE
	PAGE

/	INTERRUPT-DRIVEN LOOPBACK TEST ROUTINE.  MOVED TO MAIN MEMORY FIELD 0.

	LBLOAD=	.			/WHERE WE ARE NOW

	RELOC	0200			/WHERE THIS EXECUTES IN MAIN MEMORY FIELD 0

LBTEST,	CAF				/CLEAN UP
	PRIRB				/READ PRINTER INPUT NOW
	HLT				/STOP NOW
HLTPC,	NL0004				/THIS SHOULD BE SKIPPED BECAUSE OF CP ROUTINES
	VFL				/SET VIDEO INTERRUPT FLAG
VIDPC,	NL0004				/THIS SHOULD BE SKIPPED BECAUSE OF CP ROUTINES
	KRS				/DO A TRAPPED KEYBOARD INSTRUCTION
TTYPC,	NL0004				/THIS SHOULD BE SKIPPED BECAUSE OF CP ROUTINES
	KBOFL				/SET KEYBOARD OUTPUT FLAG
KBOIPC,	NL0004				/THIS SHOULD BE SKIPPED BECAUSE OF CP ROUTINES
	KBIFL				/SET KEYBOARD INPUT FLAG
KBIPC,	NL0004				/THIS SHOULD BE SKIPPED BECAUSE OF CP ROUTINES
	DCA	TSTATUS			/SAVE AC TEST STATUS
	TAD	LB20/(20)		/GET LOOPBACK ENABLE VALUE
	VIDCON				/MAKE THE INTERFACES LOOP BACK
	CLA				/CLEAN UP
	NL0001				/SET INTERRUPT ENABLE BIT
	CLIE				/ENABLE CLOCK INTERRUPTS
	DCA	CSTATUS			/SET INITIAL COUNT STATUS
	TAD	L17/(17)		/GET BAUD RATE VALUE FOR 19200 BAUD
	PRSB				/SET BAUD RATE
	CLA CLL				/CLEAN UP
	DCA	CTMP1			/CLEAR INITIAL OUTPUT CHARACTER
	TAD	JMPI2/(JMP I INT2)	/GET INTERRUPT INSTRUCTION
	DCA	INT1			/STORE IN INTERRUPT STARTUP
	TAD	PINTHND/(INTHND)	/GET INTERRUPT ADDRESS
	DCA	INT2			/STORE IN INTERRUPT POINTER
	DCA	TIMEOUT			/CLEAR TIME-OUT COUNTER
	DCA	CLKTICK			/CLEAR CLOCK-TICK COUNTER
	TAD	CTMP1			/GET OUTPUT CHARACTER
	PROPC				/OUTPUT TO PRINTER PORT
	DCA	CTMP2			/SAVE AS INITIAL INPUT TEST VALUE ALSO
	ION				/TURN ON INTERRUPTS
	ISZ	TIMEOUT			/DONE WAITING YET?
	JMP	.-1			/NO, KEEP WAITING
	JMP	TIMCHK			/WE'RE DONE, FINISH IT THERE

PINTHND,INTHND				/POINTER TO INTERRUPT HANDLER
JMPI2,	JMP I	INT2			/INTERRUPT STARTUP INSTRUCTION
L377,	377				/CONSTANT 0377
LB20,	20				/LOOPBACK ENABLE VALUE
/	INTERRUPTS COME HERE.

INTHND,	CLSK				/CLOCK FLAG UP?
	SKP				/SKIP IF NOT
	JMP	DOCLK			/JUMP IF SO
	PROSKP				/PRINTER OUTPUT FLAG UP?
	SKP				/SKIP IF NOT
	JMP	PROINT			/JUMP IF SO
	PRISKP				/PRINTER INPUT FLAG UP?
	JMP	INTXIT			/JUMP IF NOT
	PRISKP				/SKIP ON, CLEARING THE FLAG
	NOP				/HERE IN CASE IT SKIPS
	PRIRB				/GET THE CHARACTER
	CIA				/INVERT FOR TESTING
	TAD	CTMP2			/COMPARE TO TEST VALUE
	AND	L377/(377)		/JUST DATA BITS
	SZA CLA				/SKIP IF IT MATCHES
	PRIIE				/PREVENT FURTHER PRINTER INPUT INTERRUPTS
	TAD	CTMP2			/GET LATEST COUNT PATTERN VALUE
	JMS	COUNTUP			/GET NEXT IN THE PATTERN
	JMP	COUNTDONE		/AT END OF COUNT PATTERN
	DCA	CTMP2			/STORE UPDATED VALUE
	DCA	TIMEOUT			/RESET TIME-OUT COUNTER
INTXIT,	ION				/RE-ENABLE INTERRUPTS
	JMP I	INTADR			/BACK TO INTERRUPTED CODE

DOCLK,	CLSK				/MAKE SURE CLOCK FLAG CLEARS
	NOP				/IN CASE IT SKIPS
	ISZ	CLKTICK			/COUNT THIS TICK
L17,	17				/19200 BAUD RATE VALUE; HERE IN CASE IT SKIPS
	JMP	INTXIT			/CONTINUE THERE

PROINT,	PROSKP				/SKIP ON, CLEARING PRINTER OUTPUT FLAG
	NOP				/JUST IN CASE IT SKIPS
	TAD	CTMP1			/GET COUNT PATTERN VALUE
	JMS	COUNTUP			/GET NEXT IN THE PATTERN
	SKP				/AT END OF COUNT PATTERN
	JMP	NEXTOUT			/JUMP IF NOT AT END
	PROIE				/PREVENT FURTHER PRINTER OUTPUT INTERRUPTS
	JMP	INTXIT			/CONTINUE THERE

NEXTOUT,DCA	CTMP1			/SAVE NEW VALUE
	TAD	CTMP1			/GET IT BACK
	PROLS				/OUTPUT IT
	JMP	INTXIT			/CONTINUE THERE

/	COMES HERE WHEN ALL CHARACTER VALUES USED.

COUNTDO,DCA	CSTATUS			/CLEAR COUNT STATUS
/	COMES HERE WHEN NULL JOB TIMES OUT.

TIMCHK,	NL7776				/SETUP VALUE
	TAD	CLKTICK			/COMPARE TO CLOCK TICK COUNT
	SPA CLA				/SKIP IF >=2
	NL002A				/SET STATUS BIT IF NOT
	TAD	CSTATUS			/GET COUNT STATUS EITHER WAY
	DCA	CSTATUS			/STORE BACK
	CAF				/CLEAR ALL FLAGS NOW
	TAD	CSTATUS			/GET COUNT STATUS
	TAD	TSTATUS			/GET CP TEST STATUS
	PRQ3				/DO A PANEL REQUEST TO EXIT
	JMP	.			/WILL HANG HERE IF IT FAILS!

COUNTUP,.-.				/PATTERN COUNT ROUTINE
	DCA	PATTERN			/SAVE PASSED VALUE
	TAD	PATTERN			/GET IT BACK
	IAC				/ADD ONE
	AND	L377/(377)		/JUST GOOD BITS
	SNA				/SKIP IF NOT AT END
	JMP I	COUNTUP			/TAKE IMMEDIATE RETURN IF AT END
	DCA	PATTERN			/SAVE UPDATED VALUE
	ISZ	COUNTUP			/BUMP RETURN ADDRESS
	TAD	PATTERN			/GET NEW PATTERN VALUE
	JMP I	COUNTUP			/TAKE SKIP RETURN TO CALLER

	LBTEND=	.			/END OF CODE TO BE MOVED

	RELOC	LBTEND-LBTEST+LBLOAD	/RE-ESTABLISH ORIGIN

/	SUBROUTINE  TO  SET HIGH-ORDER BITS IN CP 13705 AND 13707.  BIT[4] IS  SET  IN
/	13705;   BITS[4-5] ARE SET IN 13707.  THIS MAKES THE LINES INTO DOUBLE-HEIGHT,
/	DOUBLE WIDTH UPPER AND LOWER HALVES RESPECTIVELY.  THIS ROUTINE DEPENDS ON THE
/	PREVIOUS CONTENTS OF THE BITS BEING ZERO.

SET2,	.-.				/SET HIGH BITS IN 2 WORDS ROUTINE
	CDF	10			/GOTO BUFFER FIELD
	TAD I	L3705/(3705)		/GET CURRENT CONTENTS OF 13705
	TAD	Z200/[200]		/ADD ON A HIGH-ORDER BIT
	DCA I	L3705/(3705)		/STORE BACK
	TAD I	L3707/(3707)		/GET CURRENT CONTENTS OF 13707
	TAD	L300/(300)		/ADD ON HIGH-ORDER BITS
	DCA I	L3707/(3707)		/STORE BACK
	CDF	70			/BACK TO OUR FIELD
	JMP I	SET2			/RETURN

L3705,	3705				/CONSTANT 3705
L3707,	3707				/CONSTANT 3707
L300,	300				/CONSTANT 0300
L77,	77				/CONSTANT 0077
/	SUBROUTINE TO CLEAR THE ATTRIBUTE BITS OF CP  13705 AND 13707.  THIS MAKES THE
/	CORRESPONDING LINES NORMAL WIDTH AND HEIGHT.

CLR2,	.-.				/CLEAR BITS IN TWO WORDS ROUTINE.
	CDF	10			/GOTO BUFFER FIELD
	TAD I	L3705/(3705)		/GET CURRENT CONTENTS OF 13705
	AND	L77/(77)		/JUST KEEP LOW-ORDER HALF
	DCA I	L3705/(3705)		/STORE BACK
	TAD I	L3707/(3707)		/GET CURRENT CONTENTS OF 13707
	AND	L77/(77)		/JUST KEEP LOW-ORDER HALF
	DCA I	L3707/(3707)		/STORE BACK
	CDF	70			/BACK TO OUR FIELD
	JMP I	CLR2			/RETURN

	ZBLOCK	1			/EMPTY SPACE
	PAGE

/	CP-INTERRUPT HANDLER FOR MAIN MEMORY LOOPBACK TEST.

	CPLOAD=	.			/CP-INTERRUPT HANDLER LOADS HERE

	RELOC	4000			/WHERE THIS EXECUTES IN FIELD 0

	CPINT=	.			/CP-INTERRUPT HANDLER CODE EXECUTES HERE

CPINT,	DCA	XR7			/SAVE AC
	PRS				/GET STATUS
	DCA	XR0			/SAVE IT
	SPD				/WANT OUR OWN INDIRECTS
	CIF CDF	00			/SET OUR OWN FIELD
	TAD	XR0			/GET STATUS
	RAL				/MOVE UP
	SZL				/SKIP IF BOOTSTRAP NOT SET
	JMP	TESTCP			/JUMP IF IT IS
	SPA				/SKIP IF PANEL REQUEST NOT SET
	JMP	PRQEXIT			/JUMP IF IT IS SET
	R3L				/MOVE UP
	SPA CLA				/SKIP IF HALT TRAP NOT SET
	JMP	TESTHLT			/JUMP IF IT IS SET
	CDF CIF	70			/BACK TO OUR FIELD
	JMP I	PLBDONE/(LBDONE)	/RETURN TO CALLER

PLBDONE,LBDONE				/POINTER TO CALLER OF TEST

/	AT THIS POINT, THE SO-CALLED "BOOTSTRAP" CONDITION IS SET,  WHICH  MEANS  THAT
/	ONE OF THE CPREQ'S FROM THE THIRD PIE CHIP HAS OCCURRED.

TESTCP,	CLA				/CLEAN UP
	VSF				/VIDEO INTERRUPT?
	JMP	TSTTRAP			/NO, TRY OTHERS
	CLA				/CLEAN UP
	VIE				/PREVENT FURTHER VIDEO INTERRUPTS
	TAD	PVIDPC/(VIDPC)		/GET EXPECTED INTERRUPTED ADDRESS
	CIA				/INVERT FOR COMPARISON
	TAD	INTADR			/COMPARE TO ACTUAL INTERRUPT PC
	SNA CLA				/SKIP IF OTHER THAN EXPECTED
	JMP	BUMPIT			/JUMP IF OK

/	INTERRUPT PC WRONG.

	JMP	JUSTEXIT		/CONTINUE THERE
TSTTRAP,TTYSF				/DEVICE 03, 04 TRAP FLAG SET?
	JMP	TSTKYIN			/JUMP IF NOT
	TTYIE				/PREVENT FURTHER TTY: TRAP INTERRUPTS
	TAD	PTTYPC/(TTYPC)		/GET EXPECTED INTERRUPTED ADDRESS
	CIA				/INVERT FOR COMPARISON
	TAD	INTADR			/COMPARE TO ACTUAL INTERRUPT PC
	SNA CLA				/SKIP IF OTHER THAN EXPECTED
	JMP	BUMPIT			/JUMP IF OK

/	INTERRUPT PC WRONG.

	JMP	JUSTEXIT		/CONTINUE THERE

TSTKYIN,KBISF				/KEYBOARD INPUT FLAG SET?
	JMP	TSTKYOUT		/NO, TRY OUTPUT
	KBIIE				/PREVENT FURTHER KEYBOARD INPUT INTERRUPTS
	TAD	PKBIPC/(KBIPC)		/GET EXPECTED INTERRUPTED ADDRESS
	CIA				/INVERT FOR COMPARISON
	TAD	INTADR			/COMPARE TO ACTUAL INTERRUPT PC
	SNA CLA				/SKIP IF OTHER THAN EXPECTED
	JMP	BUMPIT			/JUMP IF OK

/	INTERRUPT PC WRONG.

	JMP	JUSTEXIT		/CONTINUE THERE

TSTKYOU,KBOSF				/KEYBOARD OUTPUT FLAG SET?
	JMP	JUSTEXIT		/NO, FORGET IT
	KBOIE				/PREVENT FURTHER KEYBOARD OUTPUT INTERRUPTS
	TAD	PKBOIPC/(KBOIPC)	/GET EXPECTED INTERRUPTED ADDRESS
	CIA				/INVERT FOR COMPARISON
	TAD	INTADR			/COMPARE TO ACTUAL INTERRUPT PC
	SNA CLA				/SKIP IF OTHER THAN EXPECTED

/	COMES HERE TO BUMP THE PC PAST THE NL0004 INSTRUCTIONS IF THE PROPER INTERRUPT
/	ADDRESS WAS PRESENT AT THE POINT OF INTERRUPT.

BUMPIT,	ISZ	INTADR			/BUMP INTERRUPTED ADDRESS

/	SKIPS PREVIOUS TO EXIT NORMALLY; THIS COULD POSSIBLY BE CONSIDERED AN ERROR.

JUSTEXI,PEX				/EXITING FROM PANEL MEMORY
	JMP I	INTADR			/BACK TO INTERRUPTED MAIN MEMORY PROGRAM
/	COMES HERE IF THE HALT FLAG WAS SET

TESTHLT,CLA				/CLEAN UP
	PG0				/RESET THE HALT FLAG
	TAD	PHLTPC/(HLTPC)		/GET EXPECTED INTERRUPTED ADDRESS
	CIA				/INVERT FOR COMPARISON
	TAD	INTADR			/COMPARE TO ACTUAL INTERRUPT PC
	SNA CLA				/SKIP IF OTHER THAN EXPECTED
	JMP	BUMPIT			/JUMP IF OK

/	INTERRUPT PC WRONG.

	JMP	JUSTEXIT		/CONTINUE THERE

/	COMES HERE IF MAIN MEMORY PROGRAM EXITED VIA PANEL REQUEST.

PRQEXIT,CLA				/CLEAN UP
	TAD	XR7			/RESTORE EXITING AC
	CIF CDF	70			/BACK TO OUR FIELD
	JMP I	PLBDONE/(LBDONE)	/RETURN TO CALLER

PVIDPC,	VIDPC				/EXPECTED PC FOR VIDEO INTERRUPT
PTTYPC,	TTYPC				/EXPECTED PC FOR TTY: TRAP INTERRUPT
PKBIPC,	KBIPC				/EXPECTED PC FOR KEYBOARD INPUT INTERRUPT
PKBOIPC,KBOIPC				/EXPECTED PC FOR KEYBOARD OUTPUT INTERRUPT
PHLTPC,	HLTPC				/EXPECTED PC FOR HALT INTERRUPT

	CPEND= .			/END OF CP-INTERRUPT HANDLER CODE THAT OUGHT
					/TO BE MOVED

	RELOC	CPEND-CPINT+CPLOAD	/RE-ESTABLISH ORIGIN
/	THIS  ROUTINE READS IN TRACK 0, SECTOR 3 INTO CP 15350-16347.  THE FIRST EIGHT
/	BYTES ARE  VALIDATED AGAINST A KNOWN PATTERN.  ALL ELEMENTS READ IN AS 377 ARE
/	REPLACED WITH 4000 IN THE RUNNING COPY.

T0S3RD,	.-.				/TRACK 0, SECTOR 3 READ ROUTINE
	TAD	PT0S3BUFF/(T0S3BUFFER-1)/SETUP THE
	DCA	XR0			/DATA STORAGE POINTER
	CDF	10			/SET THE DATA FIELD FOR THE TRANSFER
	NL002A				/SET SECTOR OFFSET (3-1)
	JMS I	PFREAD/(FREAD)		/CALL FLOPPY READ ROUTINE
	-3-1				/SECTOR THREE IS THE LAST ONE
	0				/TRACK 0000
	JMP I	T0S3RD			/ERROR, TAKE NON-SKIP RETURN
	TAD	PT0S3DATA/(T0S3DATA-1)	/SETUP THE VALIDATION LIST VALUE
	DCA	XR0			/STASH THE POINTER
	TAD	PT0S3BUFF/(T0S3BUFFER-1)/POINT TO THE
	DCA	XR1			/READ-IN DATA
LISTLUP,TAD I	XR0			/GET A TEST VALUE
	SNA				/END OF LIST?
	JMP	LISTOK			/JUMP IF SO
	CDF 	10			/GOTO DATA FIELD
	TAD I	XR1			/COMPARE TO READ-IN VALUE
	CDF	70			/BACK TO OUR FIELD
	SZA CLA				/SKIP IF IT MATCHES
	JMP I	T0S3RD			/TAKE FAILURE RETURN IF NOT
	JMP	LISTLUP			/KEEP GOING

LISTOK,	JMS I	PRUBCHK/(RUBCHK)	/REPLACE ALL 377 CODES WITH 4000
	ISZ	T0S3RD			/BUMP TO SUCCESSFUL RETURN
	JMP I	T0S3RD			/TAKE SKIP-RETURN TO CALLER

PFREAD,	FREAD				/POINTER TO FLOPPY READ ROUTINE
PT0S3DA,T0S3DATA-1			/POINTER TO TEST DATA FOR TRACK 0, SECTOR 3
PT0S3BU,T0S3BUFFER-1			/POINTER TO TRACK 0, SECTOR 3 LOADING ADDRESS
PRUBCHK,RUBCHK				/POINTER TO RUBCHK ROUTINE
/	COMES BACK HERE AFTER LOADING THE CHARACTER GENERATOR RAM TO EXIT.

CGDONE,	JMP I	DOCG			/RETURN TO ORIGINAL CALLER

PT0S7DA,T0S7DATA-1			/POINTER TO TEST DATA FOR TRACK 0, SECTOR 7
PUSEDAT,USEDATA				/POINTER TO USE DATA ROUTINE
PNODATA,NODATA				/POINTER TO NO DATA ROUTINE

/	THE CHARACTER GENERATOR RAM LOAD ROUTINE IS ENTERRED HERE.

DOCG,	.-.				/CHARACTER GENERATOR RAM LOAD ROUTINE
	NL7777				/SETUP THE
	DCA	XR0			/STORE POINTER
	CDF	00			/GOTO DATA FIELD
	NL0006				/SET OFFSET FOR SECTOR 7 (7-10)
	JMS I	PFREAD/(FREAD)		/CALL FLOPPY READ ROUTINE
	-12-1				/WANT SECTORS 7-10
	0				/ON TRACK 0
	JMP I	PNODATA/(NODATA)	/ERROR, TRY TO KEEP GOING

/	THE DATA READ IN OK, SO VALIDATE IT.

	TAD	PT0S7DATA/(T0S7DATA-1)	/SETUP THE
	DCA	XR0			/TEST DATA POINTER
	NL7777				/SETUP THE
	DCA	XR1			/DATA POINTER
TSTDLUP,TAD I	XR0			/GET A TEST WORD
	SNA				/SKIP IF NOT AT END OF LIST
	JMP I	PUSEDATA/(USEDATA)	/END OF LIST, GO USE GOOD DATA
	CDF	00			/GOTO DATA FIELD
	TAD I	XR1			/COMPARE DATA TO TEST WORD
	CDF	70			/BACK TO OUR FIELD
	SNA CLA				/SKIP IF NO MATCH
	JMP	TSTDLUP			/KEEP GOING IF IT MATCHES

/	THE DATA ISN'T VALID, SO IGNORE IT AS IF IT HAD BEEN AN I/O ERROR.

	JMP I	PNODATA/(NODATA)	/CONTINUE THERE
	PAGE

/	COMES HERE TO CLEAR THE DATA WHICH WAS EITHER INVALID OR COULDN'T GET READ IN.
/	BETTER TO CLEAR THE TABLE THAN LEAVE IT AT RANDOM.

NODATA,	DCA	CGPTR			/CLEAR THE DATA POINTER
CLRLUP,	CDF 	00			/GOTO DATA FIELD
	DCA I	CGPTR			/CLEAR A WORD
	ISZ	CGPTR			/DONE ALL YET?
	JMP	CLRLUP			/NO, GO BACK

/	COMES HERE TO  LOAD  THE  CHARACTER GENERATOR RAM FROM (HOPEFULLY) THE READ-IN
/	DATA (OR JUST ZEROES IF IT WASN'T READABLE).

USEDATA,CDF 	70			/GOTO OUR FIELD

/	WE HAVE TO CLEAR  THE  FIRST ROW OF DATA BECAUSE IT ISN'T A PART OF THE USEFUL
/	DATA (VERIFICATION HEADER AND OTHER JUNK).

	NL7777				/SETUP THE
	DCA	XR0			/DATA POINTER
	TAD	Z7760/[-20]		/SETUP THE
	DCA	XR1			/ROW COUNTER
	CDF	00			/GOTO THE DATA FIELD
CLRIT,	DCA I	XR0			/CLEAR A WORD
	ISZ	XR1			/DONE ENOUGH?
	JMP	CLRIT			/NO, GO BACK
	TAD	L110/(110)		/DISABLE SCREEN AND ENABLE CG RAM
	VIDCON				/LOAD VIDEO CONTROL
	NL7777				/SETUP THE
	DCA	XR0			/DATA POINTER
	DCA	CGPTR			/CLEAR CG RAM ADDRESS POINTER

CGLDLP,	TAD	PCGINDX/(CGINDX-1)	/SETUP THE
	DCA	XR2			/INDEX POINTER
	TAD	Z7760/[-20]		/SETUP THE
	DCA	XR1			/LINE COUNT
NXTLINE,CDF	70			/BACK TO OUR (ODD) FIELD
	TAD I	XR2			/GET AN INDEX
	TAD	CGPTR			/ADD ON CURRENT CHARACTER BASE
	CGLOAD				/LOAD CHARACTER GENERATOR ADDRESS
	CLA				/CLEAN UP
	CDF	00			/GOTO (EVEN) FIELD 0
	TAD I	XR0			/GET LATEST CELL DATA LINE
	CGLOAD				/LOAD CHARACTER GENERATOR VALUE
	CLA				/CLEAN UP
	ISZ	XR1			/DONE ALL LINES YET?
	JMP	NXTLINE			/NO, GO BACK
	TAD	Z20/[20]		/SETUP CHARACTER UPDATE
	TAD	CGPTR			/ADD TO CHARACTER ADDRESS
	DCA	CGPTR			/STORE BACK
	TAD	CGPTR			/GET THE POINTER
	SMA CLA				/SKIP IF DONE ALL 2048 LINES
	JMP	CGLDLP			/JUMP IF NOT DONE YET
	NL0010 CLL			/SETUP RAM ENABLE AND SCREEN ENABLE
	VIDCON				/LOAD NEW CONTROL VALUE
	CLA				/CLEAN UP
	JMP I	.+1/(CGDONE)		/GO THERE
	CGDONE				/THROUGH HERE

L110,	110				/CONSTANT 0110
PCGINDX,CGINDX-1			/POINTER TO CG INDEX TABLE

/	TABLE OF CG CELL LINE INDICES; (THE FOUR BITS ARE READ BACKWARDS).

CGINDX,	00				/LINE 00
	10				/LINE 01
	04				/LINE 02
	14				/LINE 03
	02				/LINE 04
	12				/LINE 05
	06				/LINE 06
	16				/LINE 07
	01				/LINE 08
	11				/LINE 09
	05				/LINE 10
	15				/LINE 11
	03				/LINE 12
	13				/LINE 13
	07				/LINE 14
	17				/LINE 15

CGPTR,	0000				/CHARACTER GENERATOR DATA POINTER

/	NOTE:  ALL  ROUTINES  AND  DATA BEYOND THIS POINT MARKED WITH ******** ARE NOT
/	ACCESSED BY THE NORMAL  USAGE  OF THE ROM EXCEPT POSSIBLY INDIRECTLY THROUGH A
/	DOWN-LOADED AUTOMATIC PRODUCT TEST ROUTINE.  ALL OF THE CODE IS SUBORDINATE TO
/	THE SUBROUTINE ENTERRED VIA JMS 0176,  WHICH  IS  ITSELF  NOT  CALLED  BY  ANY
/	EXISTING ROM ROUTINES.
/	********

GETPARM,.-.				/ROUTINE TO GET SELECTED PARAMETERS
	NL7777				/SETUP THE
	DCA	XR0			/DATA POINTER
	CDF	00			/GOTO DATA FIELD
	TAD I	XR0			/GET A WORD
	DCA	COMTM1			/STASH IT
	NL0003				/SETUP THE
	DCA	XR0			/DATA POINTER
	NL7777				/BACKUP FOR AUTO-INDEX
	TAD I	XR0			/GET ADDRESS POINTER
	DCA	XR1			/STASH IT
	TAD I	XR0			/GET FIELD VALUE
	TAD	ZCDF/[CDF]		/FORM CDF INSTRUCTION
	DCA	.+1			/STORE IN-LINE
	HLT+.-.				/WILL BE CDF XX INSTRUCTION
	TAD I	XR1			/GET ADDRESS
	DCA	TM0			/STASH IT
	TAD I	XR1			/GET FIELD
	DCA	MTM5			/STASH IT
	TAD I	XR1			/GET ADDRESS
	DCA	MTM1			/STASH IT
	TAD I	XR1			/GET FIELD
	DCA	MTM6			/STASH IT
	TAD I	XR1			/GET ADDRESS
	DCA	MTM2			/STASH IT
	TAD I	XR1			/GET FIELD
	DCA	MTM7			/STASH IT
	RSP1				/GET FIRST STACK POINTER
	DCA	SP1SAVE			/SAVE IT
	RSP2				/GET SECOND STACK POINTER
	DCA	SP2SAVE			/SAVE IT
	TAD	MTM5			/GET FIELD
	TAD	ZCDF/[CDF]		/FORM CDF INSTRUCTION
	DCA	.+1			/STORE IN-LINE
	HLT+.-.				/WILL BE CDF XX INSTRUCTION
	TAD I	TM0			/GET VALUE
	CDF	70			/BACK TO OUR FIELD
	DCA	TM0			/SAVE IT
	TAD	MTM6			/GET FIELD
	TAD	ZCDF/[CDF]		/FORM CDF INSTRUCTION
	DCA	.+1			/STORE IN-LINE
	HLT+.-.				/WILL BE CDF XX INSTRUCTION
	TAD I	MTM1			/GET VALUE
	CDF	70			/BACK TO OUR FIELD
	DCA	MTM1			/SAVE IT
	TAD	MTM7			/GET FIELD
	TAD	ZCDF/[CDF]		/FORM CDF INSTRUCTION
	DCA	.+1			/STORE IN-LINE
	HLT+.-.				/WILL BE CDF XX INSTRUCTION
	TAD I	MTM2			/GET VALUE
	CDF	70			/BACK TO OUR FIELD
	DCA	MTM2			/SAVE IT
	JMP I	GETPARM			/RETURN TO CALLER
/	********

/	COUNT FOR FIELDS PRIOR TO HIGHLIGHTED RATE FIELD.

CLIST,	-1				/50 BAUD
	-1				/75 BAUD
	-1				/110 BAUD
	-1				/134.5 BAUD
	-1				/150 BAUD
	-1				/300 BAUD
	-2				/600 BAUD
	-3				/1200 BAUD
	-4				/1800 BAUD
	-4				/2000 BAUD
	-4				/2400 BAUD
	-5				/3600 BAUD
	-5				/4800 BAUD
	-6				/7200 BAUD
	-6				/9600 BAUD
	-6				/19200 BAUD

/	********

CIDF,	CIF CDF	00			/CONSTANT 6203
AFREAD,	FREAD				/POINTER TO FLOPPY READ ROUTINE
PPRMPRT,PRMPRT				/POINTER TO SETUP PARAMETER PRINT ROUTINE
PLOC36,	LOC36				/POINTER TO 36 OR 37 LOCATOR ROUTINE
PT0S1DA,T0S1DAT-1 			/TRACK 0 SECTORS 1-2 VALIDATION DATA POINTER
/	********

/	CONTINUATION OF SUBROUTINE CALL FROM 0176.

SUBR,	DCA	SUBAC			/SAVE PASSED AC
	SEL				/SELECT FIRST RX50 PAIR
	SDN				/SKIP ON, CLEARING DONE FLAG
P24,	24				/POINTER TO 0024; THIS CAN BE SKIPPED
	SER				/SKIP ON, CLEARING ERROR FLAG
P26,	26				/POINTER TO 0026; THIS CAN BE SKIPPED
	STR				/SKIP ON, CLEARING TRANSFER FLAG
P25,	25				/POINTER TO 0025; THIS CAN BE SKIPPED
	RDF				/GET DATA FIELD
	TAD	CIDF/(CIF CDF 00)	/TURN INTO CIF CDF INSTRUCTION
	DCA	SUBCDF			/STORE IN-LINE
	DCA	CCNT			/CLEAR DELIMITER CHARACTER SEARCH COUNT
	CDF	70			/GOTO OUR FIELD
	TAD	Z102/[102]		/SETUP 8-BIT SILO EMPTY
	DCA	RXCMD			/STASH THE COMMAND
	JMS	VERHLT			/CALL HLT PANEL VERIFY, ETC. ROUTINE
	JMP	SUBCDF			/ERROR RETURN, WE EXIT

/	NOW VERIFY THAT SETUP DATA IS VALID.

	TAD	PCALLSUB/[CALLSUB]	/SETUP THE
	DCA	XR0			/DATA STORAGE POINTER
/	CLA				/WANT SECTOR 1 FIRST (1-1)
	JMS I	AFREAD/(FREAD)		/CALL FLOPPY READ ROUTINE
	-2-1				/TWO SECTORS (1-2)
	0				/TRACK 00
	JMP	SUBCDF			/COULDN'T DO IT
	TAD	PCALLSUB/[CALLSUB]	/SETUP THE
	DCA	XR0			/READ-IN DATA POINTER
	TAD	PT0S1DAT/(T0S1DAT-1)	/SETUP THE
	DCA	XR1			/VALIDATION DATA POINTER
SETVLUP,TAD I	XR1			/GET A TEST WORD
	SNA				/END OF LIST
	JMP	SETOK			/YES, WE'RE DONE
	TAD I	XR0			/COMPARE TO READ-IN DATA
	SZA CLA				/SKIP IF IT MATCHES
	JMP	SUBCDF			/JUMP IF IT'S DIFFERENT
	JMP	SETVLUP			/KEEP GOING

SETOK,	JMS I	PROWLOAD/[ROWLOAD]	/CALL ROWTABLE AND REGISTER LOAD ROUTINE
	JMS I	PVIDCLR/(VIDCLR)	/CLEAR VIDEO DATA
	CDF	00			/GOTO DATA FIELD
	TAD I	P24/(0024)		/GET 00024
	DCA	TEMP1			/SAVE IT
	TAD I	P25/(0025)		/GET 00025
	DCA	TEMP2			/SAVE IT
	TAD I	P26/(0026)		/GET 00026
	DCA	TEMP3			/SAVE IT
NEXTPRM,CDF	70			/BACK TO OUR FIELD
	JMS I	PLOC36/(LOC36)		/LOCATE A (36 OR 37) DELIMITER
	JMS I	PPRMPRT/(PRMPRT)	/PRINT CURRENT PARAMETER VALUES
NEXTCHR,JMS I	PKBDIN/[KBDIN]		/GET A CHARACTER
METRENT,DCA	SUBAC			/SAVE LATEST CHARACTER
	TAD	PCOMTABLE/(COMTABLE-1)	/SETUP THE
	DCA	XR0			/TABLE POINTER
COMSRCH,TAD I	XR0			/GET A WORD
	SNA				/SKIP IF NOT AT END OF LIST
	JMP	NEXTCHR			/END OF LIST, IGNORE AND GET ANOTHER
	TAD	SUBAC			/COMPARE TO CHARACTER
	SNA CLA				/SKIP IF NOT A MATCH
	JMP	FINDIT			/JUMP IF IT MATCHES
	ISZ	XR0			/BUMP PAST DISPATCH ADDRESS
	JMP	COMSRCH			/TRY AGAIN

FINDIT,	TAD I	XR0			/GET DISPATCH ADDRESS
	DCA	DISPADR			/STASH IT
	TAD	SUBAC			/GET THE CHARACTER ITSELF AS AN ARGUMENT
	JMS I	DISPADR			/DISPATCH TO ROUTINE
	JMP	NEXTCHR			/NO-CHANGE RETURN, GO THERE
	JMP	NEXTPRM			/POSSIBLE-CHANGE RETURN, GO THERE
SUBCDF,	HLT+.-.				/DOUBLE-SKIP RETURN; WILL BE CIF CDF RETURN
	JMP I	SUB176			/RETURN TO CALLER

SUBAC,	.-.				/AC DATA SAVED HERE
DISPADR,.-.				/DISPATCH ADDRESS TEMPORARY
PCOMTAB,COMTABLE-1			/POINTER TO COMMAND DISPATCH TABLE
PVIDCLR,VIDCLR				/POINTER TO VIDEO CLEAR ROUTINE
/	********

VERHLT,	.-.				/READ AND VERIFY HALT PANEL DATA
	TAD	SUBAC			/GET PASSED ARGUMENT
	SNA CLA				/SKIP IF SET
	JMP	VERPOK			/JUMP IF NOT
	TAD	PCALLSUB/[CALLSUB]	/SETUP THE
	DCA	XR0			/DATA STORAGE POINTER
	NL0003				/SET OFFSET FOR SECTOR 4
	JMS I	AFREAD/(FREAD)		/CALL FLOPPY READ ROUTINE
	-4-1				/ONE SECTOR (4)
	0				/TRACK 0
	JMP	VERPOK			/COULDN'T DO IT; JUST IGNORE THE PROBLEM
	CDF	70			/BACK TO OUR FIELD
	TAD	PT0S4DAT/(T0S4DAT-1)	/SETUP THE VALIDATION LIST ADDRESS
	DCA	XR0			/STASH THE POINTER
	TAD	PCALLSUB/[CALLSUB]	/SETUP THE POINTER TO
	DCA	XR1			/THE READ-IN HALT PANEL DATA
VERLUP,	TAD I	XR0			/GET A TEST WORD
	SNA				/SKIP IF NOT AT END OF LSIT
	JMP	VERMATCH		/JUMP IF IT MATCHES
	TAD I	XR1			/COMPARE TO READ-IN WORD
	SZA CLA				/SKIP IF IT MATCHES
	JMP	VERPOK			/IGNORE THE DATA IF NO MATCH
	JMP	VERLUP			/GO DO NEXT COMPARE

VERMATC,JMS I	PROWLOAD/[ROWLOAD]	/CALL ROWTABLE AND REGISTER LOAD ROUTINE
	JMS I	PVIDCLR/(VIDCLR)	/CLEAR VIDEO DATA
KAGN,	JMS I	PGETPARM/(GETPARM)	/GET THE PARAMETER VALUES
	JMS I	PPRINTP/(PRINTP)	/PRINT THE PARAMETERS IN OCTAL
	JMS I	PKBDIN/[KBDIN]		/GET A KEYBOARD CHARACTER
	TAD	M175/(-175)		/COMPARE TO DO KEY
	SNA				/SKIP IF DIFFERENT
	JMP I	VERHLT			/TAKE FAILURE RETURN
	TAD	L45/(45)		/COMPARE TO BREAK KEY
	SZA CLA				/SKIP IF IT MATCHES
	JMP	KAGN			/JUMP IF NOT
VERPOK,	ISZ	VERHLT			/BUMP TO SUCCESSFUL RETURN
	JMP I	VERHLT			/TAKE SKIP RETURN TO CALLER

M175,	-175				/CONSTANT 7603
L45,	45				/CONSTANT 0045
PGETPAR,GETPARM				/POINTER TO GETPARM ROUTINE
PPRINTP,PRINTP				/PARAMETER PRINTOUT POINTER
PT0S4DA,T0S4DAT-1			/POINTER TO TRACK 0, SECTOR 4 VALIDATION LIST

	ZBLOCK	7			/EMPTY SPACE
	PAGE

/	********

/	HANDLER FOR SELECT KEY IN SETUP ROUTINE.

SELCT,	.-.				/SELECT LATEST ITEM
	CLA				/CLEAN UP
	TAD	CCNT			/GET SEARCH POSITIION LIMIT
	TAD	M16/(-16)		/COMPARE TO LIMIT
	SMA CLA				/SKIP IF LESS THAN THIS MAXIMUM
	JMP	TRYPRATE		/JUMP IF NOT
	TAD	CCNT			/GET POSITION
	CLL RAR				/%2
	CMA				/INVERT IT
	DCA	SELSHFT			/SAVE AS COUNTER
	STL				/SET A STOP BIT JUST IN CASE
SHFTLUP,RAL				/MOVE UP
	ISZ	SELSHFT			/DONE ENOUGH?
	JMP	SHFTLUP			/NO, GO BACK
	MQL				/SAVE FOR NOW
	CLA MQA				/GET IT BACK
	CMA				/INVERT IT
	AND	TEMP1			/SAVE THE OTHER BITS
	DCA	TEMP1			/STORE BACK FOR NOW
	TAD	CCNT			/GET THE POSITION COUNT
	CLL RAR				/%2
	CLA				/CLEAN UP
	TAD	TEMP1			/GET THE OTHER BITS
	SZL				/SKIP IF BIT IS OFF
	MQA				/ELSE OR IN SELECTED VALUE
	DCA	TEMP1			/SAVE COMPOSITE VALUE
SELXIT,	ISZ	SELCT			/TAKE SKIP RETURN
	JMP I	SELCT			/RETURN TO COMMAND ROUTINE

TRYPRAT,TAD	CCNT			/GET POSITION
	TAD	M16/(-16)		/ADD ON UPPER LIMIT
	TAD	L7773/(-5)		/ADD ON EXTRA LIMIT
	SMA SZA				/SKIP IF IN THIS RANGE
	JMP	DOCOMRATE		/JUMP IF NOT
	TAD	L5/(5)			/SUBTRACT RELATIVE LIMIT
	TAD	PBTABLE/(BTABLE)	/ADD ON TABLE BASE
	DCA	TEMP2			/STASH THE POINTER
	TAD I	TEMP2			/GET THE PROPER BAUD RATE VALUE
	DCA	TEMP2			/STASH IT
	JMP	SELXIT			/FINISH THERE

DOCOMRA,DCA	TEMP3			/SAVE RELATIVE POSITION
	NL7777				/-1
	TAD	TEMP3			/NOW HAVE PROPER RELATIVE VALUE
	TAD	PBTABLE/(BTABLE)	/ADD ON TABLE ADDRESS
	DCA	TEMP3			/STASH THE POINTER
	TAD I	TEMP3			/GET THE PROPER BAUD RATE VALUE
	DCA	TEMP3			/STASH IT
	JMP	SELXIT			/CONTINUE THERE
/	********

SELSHFT,.-.				/SELECT ROUTINE COUNTER
M16,	-16				/CONSTANT 7762
L7773,	-5				/CONSTANT 7773
L5,	5				/CONSTANT 0005
PBTABLE,BTABLE				/POINTER TO BAUD RATE TABLE

/	BAUD RATE TABLE FOR SUPPORTED RATES.

BTABLE,	05				/300 BAUD
	06				/600 BAUD
	07				/1200 BAUD
	12				/2400 BAUD
	14				/4800 BAUD
	16				/9600 BAUD

/	********

KBDIN,	.-.				/COMMAND INPUT ROUTINE
	KBISF				/FLAG UP?
	JMP	.-1			/NO, WAIT FOR IT
	KBIRB				/YES, READ IT IN
	AND	Z377/[377]		/JUST EIGHT BITS
	JMP I	KBDIN			/RETURN

ARXWAIT,RXWAIT				/POINTER TO RX50 WAIT ROUTINE

RXRDY,	.-.				/DRIVE READY CHECK ROUTINE
	TAD	Z12/[12]		/GET READ STATUS VALUE
	LCD				/LOAD THE COMMAND
	JMS I	ARXWAIT/(RXWAIT)	/WAIT FOR IT
	JMP I	RXRDY			/TRANSFER FLAG CAME UP, FORGET IT
	SKP				/DONE FLAG CAME UP, THERE'S HOPE
	JMP I	RXRDY			/ERROR OR TIME-OUT
	XDR				/GET STATUS
	AND	Z200/[200]		/JUST DRIVE READY BIT
	SZA CLA				/SKIP IF NOT READY
	ISZ	RXRDY			/ELSE TAKE SKIP RETURN
	JMP I	RXRDY			/RETURN EITHER WAY
/	********

VIDCLR,	.-.				/VIDEO CLEAR (?) ROUTINE
	NL6000				/SET BOTH CONTROL BITS
	VIDCON				/LOAD CONTROL REGISTER
	CLA				/CLEAN UP
	DCA	XR0			/CLEAR INNER COUNTER
	NL7775				/SET THE
	DCA	XR1			/OUTER COUNTER
VIDWAIT,ISZ	XR0			/WAITING ENOUGH?
	JMP	VIDWAIT			/NO, KEEP GOING
	ISZ	XR1			/WAITED TOO LONG?
	JMP	VIDWAIT			/NO, KEEP GOING
	VIDCON				/RESET TO NORMAL VIDEO MODE
	JMP I	VIDCLR			/RETURN

/	SLUSHWARE TEST VALIDATION DATA.

SLTDAT,	-6201
	-0033
	-0077
	0				/THIS ENDS THE LIST

/	********

/	COMMAND DISPATCH TABLE FOR BUILT-IN COMMANDS.

COMTABL,-214;	BOOTIT			/REMOVE
	-215;	SELCT			/SELECT
	-175;	DOKEY			/DO
	-247;	MOVLEFT			/LEFT ARROW
	-250;	MOVRITE			/RIGHT ARROW
	-275;	RETURN			/RETURN
	-264;	METRONOME		/METRONOME
	0				/THIS ENDS THE LIST
/	********

/	VALIDATION DATA FOR TRACK 0, SECTORS 1-2.

T0S1DAT,-1
	-"S!200
	-"E!200
	-"T!200
	-"U!200
	-"P!200
	0				/THIS ENDS THE LIST

/	VALIDATION DATA FOR TRACK 0, SECTORS 7-10.

T0S7DAT,-1
	-"U!200
	-"C!200
	-"G!200
	-"R!200
	-"A!200
	-"M!200
	-2
	0				/THIS ENDS THE LIST

/	VALIDATION DATA FOR TRACK 0, SECTOR 3.

T0S3DAT,-1
	-"K!200
	-"B!200
	-"D!200
	-"B!200
	-"R!200
	-"D!200
	-2
	0				/THIS ENDS THE LIST
/	********

M7,	-7				/CONSTANT 7771

PRMPRT,	.-.				/SETUP PARAMETER OUTPUT ROUTINE
	CDF	70			/BACK TO OUR FIELD
	DCA	ROW			/CLEAR ROW
	DCA	COLUMN			/CLEAR COLUMN
	TAD	TEMP1			/GET FIRST PARAMETER VALUE
	DCA	PRMTM1			/SAVE IT
	TAD	PCALLSUB/[CALLSUB]	/SETUP THE
	DCA	XR0			/BUFFER POINTER
	TAD	M7/(-7)			/SETUP THE
	DCA	XR1			/BUFFER COUNT
HEDLUP,	TAD I	XR0			/GET A CHARACTER
	TAD	Z7776/[-2]		/COMPARE TO HEADER END CODE
	SZA CLA				/SKIP IF IT MATCHES
	JMP	HEDLUP			/ELSE KEEP GOING
NXTPRM,	TAD	XR1			/GET CURRENT COUNT
	SNA CLA				/SKIP IF STILL SOME LEFT
	JMP	PRTRATE			/JUMP IF NOT
	TAD	PRMTM1			/GET FIRST PARAMETER VALUE
	CLL RAR				/MOVE OVER
	DCA	PRMTM1			/STORE BACK
	SNL				/SKIP IF SET
	NL0001				/ELSE SET INCREMENT
	TAD	Z7741/[-37]		/NOW HAVE -36 IF CLEAR, -37 IF SET
	DCA	PRMTM2			/SAVE IT
PRMLUP,	TAD I	XR0			/GET A CHARACTER
	MQL				/LOAD IT FOR PRINTING LATER
	CLA MQA				/GET IT BACK
	TAD	PRMTM2			/COMPARE TO DESIRED DELIMITER
	SNA CLA				/SKIP IF OTHER
	JMP	ATDELIM			/JUMP IF IT MATCHES
	JMS I	PCHRPRT/[CHRPRT]	/PRINT THE CHARACTER
	JMP	PRMLUP			/KEEP GOING

ATDELIM,ISZ	XR1			/COUNT THIS ONE
	NOP				/IN CASE IT SKIPS
PRTIT,	JMS I	PCHRPRT/CHRPRT]		/PRINT THE CHARACTER
	TAD I	XR0			/GET THE NEXT CHARACTER
	MQL				/LOAD IT FOR PRINTING
	CLA MQA				/GET IT BACK
	TAD	Z7741/[-37]		/COMPARE TO DELIMITER
	SMA SZA CLA			/SKIP IF THAT OR LESS
	JMP	REVIT			/JUMP IF NOT
	JMS I	PCHRPRT/[CHRPRT]	/PRINT THE CHARACTER
	JMP	NXTPRM			/GO DO NEXT PARAMETER

REVIT,	TAD	Z400/[400]		/ADD ON REVERSE VIDEO BIT
	JMP	PRTIT			/CONTINUE THERE
PRTRATE,TAD	TEMP2			/GET SECOND PARAMETER
	JMS	NPRT			/OUTPUT IT
	TAD	TEMP3			/GET THIRD PARAMETER
	JMS	NPRT			/OUTPUT IT
OUTLUP,	TAD I	XR0			/GET A CHARACTER
	MQL				/LOAD FOR PRINTING
	CLA MQA				/GET IT BACK
	TAD	Z7775/[7775]		/COMPARE TO END CHARACTER
	SNA CLA				/SKIP IF NOT AT END
	JMP I	PRMPRT			/RETURN IF AT END
	JMS I	PCHRPRT/[CHRPRT]	/PRINT THE CHARACTER
	JMP	OUTLUP			/GO DO ANOTHER

/	UNREFERENCED  LOCATION.  PERHAPS ERRONEOUS NOTION THAT  CHRPRT  ROUTINE  MIGHT
/	SKIP OR OTHER OBSOLETE CONVENTION?

	JMP I	PRMPRT			/RETURN

PRMTM1,	.-.				/TEMPORARY
PRMTM2,	.-.				/TEMPORARY

/	********

/	PRINT NUMERICAL  PARAMETER  ROUTINE.    THE SELECTED PARAMETER IS A BAUD RATE.
/	THE (CLOSEST TO THE) SELECTED RATE IS HIGHLIGHTED.

NPRT,	.-.
	DCA	NTMP			/SAVE THE PASSED VALUE
	TAD	NTMP			/GET IT BACK
	AND	Z17/[17]		/JUST RATE BITS
	TAD	PCLIST/(CLIST)		/ADD ON TABLE BASE
	DCA	NTMP			/STASH THE POINTER
	TAD I	NTMP			/GET THE PROPER COUNT
	DCA	NTMP			/STASH IT
NPLUP,	TAD I	XR0			/GET A CHARACTER
	MQL				/LOAD IT FOR PRINTING
	CLA MQA				/GET IT BACK
	TAD	Z7741/[-37]		/COMPARE TO FIELD DELIMITER
	SNA				/SKIP IF NOT A MATCH
	JMP	FNDDELIM		/JUMP IF IT IS
	IAC				/COMPARE TO ALTERNATE DELIMITER VALUE
	SNA CLA				/SKIP IF NOT A MATCH THERE EITHER
	JMP	FNDDELIM		/JUMP IF IT IS A MATCH
NEXTREG,JMS I	PCHRPRT/[CHRPRT]	/PRINT THE CHARACTER
	JMP	NPLUP			/GO DO NEXT

MOREPRM,JMS I	PCHRPRT/[CHRPRT]	/PRINT THE CHARACTER
	CLA MQA				/GET THE CHARACTER
	TAD	Z7766/[7766]		/COMPARE TO MASTER DELIMITER
	SNA CLA				/SKIP IF NOT AT END
	JMP I	NPRT			/RETURN IF AT END
	TAD I	XR0			/GET NEXT CHARACTER
	MQL				/LOAD IT FOR PRINTING
	JMP	MOREPRM			/KEEP GOING
/	COMES HERE IF FIELD DELIMITER FOUND.

FNDDELI,ISZ	NTMP			/FOUND ENOUGH REGULAR FIELDS?
	JMP	NEXTREG			/NO, KEEP GOING
BOLDLP,	JMS I	PCHRPRT/[CHRPRT]	/PRINT THE CHARACTER
	TAD I	XR0			/GET ANOTHER CHARACTER
	MQL				/LOAD IT FOR PRINTING
	CLA MQA				/GET IT BACK
	TAD	Z7741/[-37]		/COMPARE TO FIELD DELIMITER
	SPA SNA CLA			/SKIP IF HIGHER
	JMP	MOREPRM			/JUMP IF NOT
	TAD	Z400/[400]		/GET REVERSE VIDEO BIT
	JMP	BOLDLP			/GO DO NEXT

NTMP,	.-.				/TEMPORARY
PCLIST,	CLIST				/POINTER TO REGULAR FIELD COUNT LIST

/	SLUSHWARE CODE VALIDATION ROUTINE.

SLCHECK,.-.				/SLUSHWARE VALIDATION ROUTINE
	RDF				/GET DATA FIELD
	TAD	ZCDF/[CDF]		/FORM CDF INSTRUCTION
	DCA	SLUCDF			/STORE IN-LINE
	TAD	PSLTDAT/(SLTDAT-1)	/SETUP THE
	DCA	XR1			/VALIDATION POINTER
	CDF	70			/BACK TO OUR FIELD
SLNEXT,	TAD I	XR1			/GET A TEST WORD
	SNA				/SKIP IF NOT AT END OF LIST
	JMP	SLGOOD			/JUMP IF AT END
SLUCDF,	CDF	00+.-.			/WILL BE CDF XX INSTRUCTION
	TAD I	XR0			/COMPARE TO READ-IN DATA
	CDF	70			/BACK TO OUR FIELD
	SNA CLA				/SKIP IF NOT A MATCH
	JMP	SLNEXT			/JUMP IF IT MATCHES
	JMP I	SLCHECK			/TAKE FAILURE RETURN

SLGOOD,	ISZ	SLCHECK			/BUMP TO GOOD RETURN
	JMP I	SLCHECK			/TAKE SKIP RETURN TO CALLER

PSLTDAT,SLTDAT-1			/POINTER TO SLUSHWARE TEST DATA

	ZBLOCK	2			/EMPTY SPACE
	PAGE

/	********

HIGHROW,ROWADR+1			/POINTER TO ROWTABLE (HIGH-ORDER)
L2030,	2030				/CONSTANT 2030
L31,	31				/CONSTANT 0031
M31,	-31				/CONSTANT 7747

CHRPRT,	.-.				/CHARACTER PRINT ROUTINE
	DCA	ATTRVAL			/SAVE PASSED ATTRIBUTE VALUE
	CLA MQA				/GET THE CHARACTER
	TAD	Z7766/[-"J!300]		/COMPARE TO <LF>
	SNA				/SKIP IF OTHER
	JMP	JUSTPOS			/JUMP IF IT MATCHES
	TAD	Z7775/[-"M+"J]		/COMPARE TO <CR>
	SNA CLA				/SKIP IF NO MATCH
	JMP	JUSTPOS			/JUMP IF IT MATCHES
	TAD	ROW			/GET DESIRED ROW NUMBER
	CLL RAL				/*2
	TAD	HIGHROW/(ROWADR+1)	/POINT TO PROPER HIGH-ORDER ADDRESS
	DCA	CHARADR			/STASH THE POINTER
	CDF	10			/GOTO ROWTABLE FIELD
	TAD I	CHARADR			/GET THE HIGH-ORDER ROW ADDRESS
	CDF	70			/BACK TO OUR FIELD
	DCA	CHARADR			/STASH THE POINTER
	TAD	CHARADR			/GET HIGH-ORDER ROW ADDRESS
	CLL RAR				/MOVE OVER
	AND	L2030/(30)		/JUST FIELD BITS (CLOSE ENOUGH)
	TAD	ZCDF/[CDF]		/FORM CDF INSTRUCTION
	DCA	CHARCDF			/STORE IN-LINE
	TAD	CHARADR			/GET HIGH-ORDER ROW ADDRESS AGAIN
	AND	Z17/[17]		/JUST QUARTER-FIELD BITS
	CLL RTL;BSW			/*400
	TAD	COLUMN			/ADD ON DESIRED COLUMN
	TAD	Z205/[205]		/ADD ON LINE BASE
	DCA	CHARADR			/STASH THE POINTER
	CLA MQA				/GET THE CHARACTER
	TAD	M40/(-40)		/COMPARE TO <SPACE>
	SMA SZA CLA			/SKIP IF <SPACE> OR CONTROL CHARACTER
	CLA MQA				/ELSE GET THE CHARACTER
	SZA				/SKIP IF NOT DISPLAYABLE
	TAD	ATTRVAL			/ELSE ADD ON PASSED ATTRIBUTES
CHARCDF,HLT+.-.				/WILL BE CDF 20 (OR 30) INSTRUCTION
	DCA I	CHARADR			/STORE IN LINE BUFFER
	CDF	70			/BACK TO OUR FIELD
JUSTPOS,JMS	SCRPOS			/ADVANCE SCREEN POSITION
	JMP I	CHRPRT			/RETURN

ATTRVAL,.-.				/PASSED ATTRIBUTE BITS SAVED HERE
CHARADR,.-.				/ADDRESS TEMPORARY
M40,	-" !200				/CONSTANT 7740
/	********

SCRPOS,	.-.				/SCREEN POSITION ADVANCE ROUTINE
	CLA MQA				/GET THE CHARACTER
	TAD	Z7766/[-"J!300]		/COMPARE TO <LF>
	SZA				/SKIP IF IT MATCHES
	JMP	SCRCHK			/JUMP IF NOT
	ISZ	ROW			/BUMP TO NEXT ROW
	JMP I	SCRPOS			/RETURN

SCRCHK,	TAD	Z7775/[-"M+"J]		/COMPARE TO <LF>
	SZA CLA				/SKIP IF IT MATCHES
	JMP	SCREGULAR		/JUMP IF NOT
	DCA	COLUMN			/CLEAR COLUMN
	JMP I	SCRPOS			/RETURN

SCREGUL,ISZ	COLUMN			/BUMP TO NEXT COLUMN
	JMP I	SCRPOS			/RETURN

/	********

/	HANDLER FOR LEFT ARROW KEY IN SETUP ROUTINE.

MOVLEFT,.-.				/MOVE BACK ONE POSITION ROUTINE
	DCA	LCHAR			/SAVE OUR CHARACTER FOR OTHERS
	TAD	PCALLSUB/[CALLSUB+1-1]	/GET BUFFER POINTER
	DCA	XR0			/STASH THE POINTER
	CDF 	70			/GOTO OUR FIELD
	NL7777				/TRY TO BACKUP
	TAD	CCNT			/COMPARE TO CURRENT SELECT
	SPA				/SKIP IF IT CAN BACKUP
	CLA				/ELSE FORGET IT
	DCA	CCNT			/SAVE NEW POSITION
	JMS	LOC36			/LOCATE NEW DELIMITER
	JMP I	MOVLEFT			/RETURN

/	********

/	HANDLER FOR RIGHT ARROW KEY IN SETUP ROUTINE.

MOVRITE,.-.				/MOVE FORWARD ONE POSITION ROUTINE
	DCA	LCHAR			/SAVE OUR CHARACTER FOR OTHERS
	TAD	CCNT			/GET CURRENT POSITION
	TAD	M31/(-31)		/COMPARE TO UPPER LIMIT
	SPA CLA				/SKIP IF TOO FAR
	ISZ	CCNT			/ELSE BUMP TO NEXT
	JMS	LOC36			/LOCATE NEW DELIMITER
	JMP I	MOVRITE			/RETURN
/	********

/	THIS ROUTINE  LOCATES  DELIMITER  (36  OR  37)  CODES  IN  THE  BUFFER.   CCNT
/	DETERMINES HOW MANY.

LOC36,	.-.				/DELIMITER SEARCH ROUTINE
	DCA	ROW			/CLEAR ROW
	DCA	COLUMN			/CLEAR COLUMN
	TAD	PCALLSUB/[CALLSUB]	/SETUP THE
	DCA	XR0			/BUFFER POINTER
	DCA	XR1			/CLEAR CHARACTER COUNTER
SRCHLUP,TAD I	XR0			/GET A CHARACTER
	MQL				/STASH IT THERE
	CLA MQA				/GET IT BACK
	TAD	Z7741/[-37]		/COMPARE TO 37 CODE
	SNA				/SKIP IF OTHER
	JMP	IS37			/JUMP IF IT MATCHES
	IAC				/COMPARE TO 36 CODE
	SZA CLA				/SKIP IF IT MATCHES
	JMP	NOTOURS			/JUMP IF NOT
IS37,	TAD	XR1			/GET CHARACTER COUNT
	CIA				/INVERT FOR TEST
	TAD	CCNT			/COMPARE TO LIMIT
	SZA CLA				/SKIP IF SEARCHED ENOUGH
	JMP	ISOURS			/JUMP IF NOT
	ISZ	COLUMN			/BUMP TO NEXT COLUMN
	JMS	CUPDATE			/PLACE CURSOR THERE
	JMP I	LOC36			/RETURN

ISOURS,	ISZ	XR1			/BUMP CHARACTER COUNT
NOTOURS,JMS	SCRPOS			/ADVANCE SCREEN POSITION
	JMP	SRCHLUP			/KEEP GOING

/	********

CUPDATE,.-.				/CURSOR UPDATE ROUTINE
	TAD	L2030/(2030)		/GET VERTICAL CURSOR REGISTER VALUE
	LSCREG				/LOAD REGISTER SELECT
	CLA				/CLEAN UP
	TAD	ROW			/GET CURRENT ROW
	VLOAD				/LOAD CURSOR VERTICAL POSITION
	CLA				/CLEAN UP
	TAD	L31/(31)		/GET HORIZONTAL CURSOR REGISTER VALUE
	LSCREG				/LOAD REGISTER SELECT
	CLA				/CLEAN UP
	TAD	COLUMN			/GET CURRENT COLUMN
	VLOAD				/LOAD CURSOR HORIZONTAL POSITION
	CLA				/CLEAN UP
	JMP I	CUPDATE			/RETURN

	ZBLOCK	7			/EMPTY SPACE
	PAGE

/	********

PCUPDAT,CUPDATE				/POINTER TO CURSOR UPDATE ROUTINE

/	HANDLER FOR REMOVE KEY IN SETUP ROUTINE.

BOOTIT,	.-.				/REMOVE KEY ROUTINE
	CLA				/CLEAN UP
	JMS I	AVIDCLR/(VIDCLR)	/CLEAR VIDEO DATA
	CDF	70			/GOTO OUR FIELD
	DCA	ROW			/CLEAR ROW
	DCA	COLUMN			/CLEAR COLUMN
	JMS I	PCUPDATE/(CUPDATE)	/UPDATE CURSOR POSITION
	TAD	PCALLSUB/[CALLSUB]	/SETUP THE
	DCA	XR0			/DATA POINTER
	NL7775				/SETUP THE
	DCA	XR1			/DATA COUNTER
LOOKLP,	TAD I	XR0			/GET A WORD
	TAD	Z7776/[7776]		/COMPARE TO VALIDATION FIELD DELIMITER
	SZA CLA				/SKIP IF IT MATCHES
	JMP	LOOKLP			/ELSE KEEP GOING
	ISZ	XR1			/FOUND ENOUGH OF THEM?
	JMP	LOOKLP			/NO, KEEP GOING
PLUP,	TAD I	XR0			/GET A CHARACTER
	MQL				/LOAD FOR PRINTING ROUTINE
	CLA MQA				/GET IT BACK
	TAD	Z7775/[-3]		/COMPARE TO MESSAGE END CHARACTER
	SNA CLA				/SKIP IF NOT THERE YET
	JMP	PEND			/JUMP IF AT END
	JMS I	PCHRPRT/[CHRPRT]	/PRINT THE CHARACTER
	JMP	PLUP			/KEEP GOING

PEND,	JMS I	PKBDIN/[KBDIN]		/GET A KEYBOARD CHARACTER
	TAD	L7603/(-175)		/COMPARE TO VALUE FOR DO KEY
	SNA CLA				/SKIP IF IT DOESN'T MATCH
	JMP I	PRXOK/(RXOK)		/JUMP IF IT DOES
	DCA	CCNT			/CLEAR POSITION COUNT
	JMS I	AVIDCLR/(VIDCLR)	/CLEAR VIDEO DATA
	ISZ	BOOTIT			/TAKE SKIP RETURN
	JMP I	BOOTIT			/RETURN TO COMMAND ROUTINE

L7603,	-175				/CONSTANT 7603
PRXOK,	RXOK				/POINTER TO RXOK ROUTINE
C23,	23				/CONSTANT 0023
AVIDCLR,VIDCLR				/POINTER TO VIDEO CLEAR ROUTINE
/	********

/	HANDLER FOR DO KEY IN SETUP ROUTINE.

DOKEY,	.-.				/DO KEY ROUTINE
	DCA	LCHAR			/SAVE CHARACTER VALUE FOR OTHERS
	TAD	C23/(23)		/SETUP FOR THE
	DCA	ROW			/HIGHEST ROW
	DCA	COLUMN			/CLEAR COLUMN
	TAD	CM5/(-5)		/SETUP THE
	DCA	XR1			/ROW COUNT
P1LUP,	TAD	M120/(-120)		/SETUP THE
	DCA	XR2			/COLUMN COUNT
P2LUP,	JMS I	PCHRPRT/[CHRPRT]	/PRINT THE CHARACTER
	ISZ	XR2			/DONE A LINE YET?
	JMP	P2LUP			/NO, KEEP GOING
	DCA	COLUMN			/YES, CLEAR COLUMN
	ISZ	ROW			/BUMP TO NEXT ROW
	ISZ	XR1			/DONE ENOUGH ROW?
	JMP	P1LUP			/NO, KEEP GOING
	TAD	PCALLSUB/[CALLSUB+1-1]	/SETUP THE
	DCA	XR0			/DATA POINTER
FNDIT,	TAD	Z7775/[-3]		/GET DELIMITER VALUE
	TAD I	XR0			/COMPARE TO LATEST
	SZA CLA				/SKIP IF IT MATCHES
	JMP	FNDIT			/ELSE KEEP GOING
	ISZ	XR0			/BUMP PAST DELIMITER
	TAD	C23/(23)		/SETUP FOR
	DCA	ROW			/HIGHEST ROW
	DCA	COLUMN			/CLEAR COLUMN
PNEXT,	TAD I	XR0			/GET A CHARACTER
	MQL				/LOAD FOR PRINTING
	CLA MQA				/GET IT BACK
	TAD	Z7775/[-3]		/COMPARE TO DELIMITER
	SNA CLA				/SKIP IF NOT THERE YET
	JMP	ATEND			/JUMP IF AT END OF BLURB
	JMS I	PCHRPRT/[CHRPRT]	/PRINT THE CHARACTER
	JMP	PNEXT			/KEEP GOING

ATEND,	JMS I	PKBDIN/[KBDIN]		/GET A KEYBOARD CHARACTER
	CIA				/INVERT IT
	TAD	LCHAR			/COMPARE TO OUR VALUE (DO KEY)
	SNA CLA				/SKIP IF OTHER
	JMP	DOIT			/JUMP IF IT MATCHES
BMPRET,	JMS I	AVIDCLR/(VIDCLR)	/CLEAR VIDEO DATA
NOCRET,	ISZ	DOKEY			/BUMP RETURN ADDRESS
	JMP I	DOKEY			/TAKE SKIP RETURN ON USER ABORT
DOIT,	TAD	PWRIBUFF/[WRIBUFFER+1-1]/SETUP THE
	DCA	XR0			/DATA POINTER
	NL002A				/SETUP 12-BIT EMPTY SILO COMMAND VALUE
	DCA	RXCMD			/STASH THE COMMAND
	CDF	30			/GOTO DATA FIELD
/	CLA				/SET AC T0 1-1 FOR FIRST SECTOR
	JMS I	LFREAD/(FREAD)		/CALL FLOPPY READ ROUTINE
	-1-1				/WANT ONE SECTOR
L116,	116				/TRACK 78
	JMP	NOCRET			/COULDN'T DO IT, FORGET IT
	TAD	PWRIBUFF/[WRIBUFFER+1-1]/GET BUFFER POINTER
	IAC				/MOVE TO NEXT POSITION
	DCA	XR0			/STASH THE POINTER
	CDF	30			/GOTO BUFFER FIELD
	JMS I	ASLCHECK/(SLCHECK)	/ENSURE SLUSHWARE IS VALID
	JMP	SLUBAD			/FORGET IT, BAD SLUSHWARE
	DCA	XR0			/SETUP POINTER TO 0001
	JMS I	PPARMOVE/(PARMOVE)	/MOVE IN THE NEW PARAMETERS
/	CLA				/SET 12-BIT FILL VALUE
	LCD				/LOAD THE COMMAND FOR FILLING
LODLUP,	JMS I	LRXWAIT/(RXWAIT)	/CALL RX50 WAIT ROUTINE
	JMP	LDTRANS			/TRANSFER FLAG CAME UP
	JMP	LDDONE			/DONE FLAG CAME UP
	JMP I	PFERR/(FERR)		/ERROR, GO COMPLAIN THERE

LDTRANS,CDF	30			/GOTO BUFFER FIELD
	TAD I	XR0			/GET A WORD
	XDR				/FILL IT
	JMP	LODLUP			/KEEP GOING

LDDONE,	TAD	L116/(116)		/SETUP TRACK 78
	DCA	T1			/STASH IT
	NL0001 CLL			/SETUP THE
	DCA	TINC			/SECTOR NUMBER
	NL0004				/SET WRITE FUNCTION
	CDF	70			/BACK TO OUR FIELD
	JMS I	PRXCOMD/[RXCOMD]	/GO DO THE WRITE COMMAND
	SKP				/SKIP IF IT WAS OK
	JMP	BMPRET			/JUMP IF NOT
	SER				/ANY ERRORS?
	SKP				/SKIP IF NOT
	JMP	BMPRET			/JUMP IF SO
SLUBAD,	ISZ	DOKEY			/TAKE THE
	ISZ	DOKEY			/DOUBLE-SKIP
	JMP I	DOKEY			/RETURN

ASLCHEC,SLCHECK				/POINTER TO SLUSHWARE VALIDATION ROUTINE
LFREAD,	FREAD				/POINTER TO FREAD ROUTINE
CM5,	-5				/CONSTANT 7773 
M120,	-120				/CONSTANT 7660
PPARMOV,PARMOVE				/POINTER TO PARAMETER MOVE ROUTINE
LRXWAIT,RXWAIT				/POINTER TO RX50 WAIT ROUTINE
PFERR,	FERR				/POINTER TO ERROR ROUTINE
	PAGE

/	********

/	HANDLER FOR METRONOME CHARACTER IN SETUP ROUTINE.

METRONO,.-.				/METRONOME KEY ROUTINE
	CLA				/CLEAN UP
	TAD	LCHAR			/GET PREVIOUS CHARACTER
	JMP I	.+1/(METRENTRY)		/GO THERE
	METRENTRY			/THROUGH HERE

LVIDCLR,VIDCLR				/POINTER TO VIDEO CLEAR ROUTINE

/	********

/	HANDLER FOR RETURN CHARACTER IN SETUP ROUTINE.

RETURN,	.-.				/RETURN KEY ROUTINE
	JMS I	LVIDCLR/(VIDCLR)	/CLEAR VIDEO OUT
	JMS	PARMOVE			/SETUP THE PARAMETERS
	ISZ	RETURN			/TAKE THE
	ISZ	RETURN			/DOUBLE-SKIP
	JMP I	RETURN			/RETURN

/	********

A14,	24				/POINTER TO 0024
A15,	25				/POINTER TO 0025
A16,	26				/POINTER TO 0026

PARMOVE,.-.				/PARAMETER MOVE ROUTINE
	CDF	00			/SETUP DATA FIELD
	TAD	TEMP2			/GET SECOND PARAMETER
	DCA I	A15/(0025)		/STORE IT
	TAD	TEMP1			/GET FIRST PARAMETER
	DCA I	A14/(0024)		/STORE IT
	TAD	TEMP3			/GET THIRD PARAMETER
	DCA I	A16/(0026)		/STORE IT
	CDF	70			/BACK TO OUR FIELD
	DCA	XR0			/SETUP SOURCE POINTER
	TAD	PWRIBUFF/[WRIBUFFER+1-1]/SETUP THE
	DCA	XR1			/DESTINATION POINTER
	ISZ	XR1			/BUMP PAST HEADER
	TAD	M377/(-377)		/SETUP THE
	DCA	MVCNT			/MOVE COUNTER
MVLUP,	CDF	00			/GOTO DATA FIELD
	TAD I	XR0			/GET A WORD
	CDF	30			/GOTO BUFFER FIELD
	DCA I	XR1			/PUT A WORD
	ISZ	MVCNT			/DONE ENOUGH?
	JMP	MVLUP			/NO, GO BACK
	TAD	PWRIBUFF/[WRIBUFFER+1-1]/SETUP THE
	DCA	XR0			/DISK DATA POINTER
	JMP I	PARMOVE			/RETURN
MVCNT,	.-.				/MOVE COUNTER
M377,	-377				/CONSTANT 7401
BAUD17,	17				/CONSTANT 0017

/	COMES HERE AFTER  TESTING THE KEYBOARD (OR JUST AFTER THE TEST WAS BYPASSED IF
/	APTEN IS IN EFFECT) TO SETUP THE COMMUNICATIONS CHIP.

COMTEST,TAD	BAUD17/(17)		/GET BAUD RATE VALUE FOR 19200 BAUD
	MSB				/SETUP COMMUNICATIONS CHIP RATE
	CLA				/CLEAN UP
	MPRESET				/RESET THE COMMUNICATIONS CHIP
	APTSKP				/AUTOMATIC PRODUCT TESTING?
	SKP				/SKIP IF NOT
	JMP	TESTCOM			/JUMP IF SO
COMEXIT,TAD	Z7/[7]			/GET 1200 BAUD RATE VALUE
	MSB				/SETUP COMM CHIP FOR 1200 BAUD
	CLA				/CLEAN UP
	JMS I	PREGINIT/(REGINIT)	/INITIALIZE THE REGISTERS
	JMP I	.+1/(COMDONE)		/GO BACK TO MAIN-LINE CODE
	COMDONE				/THROUGH HERE

PREGINI,REGINIT				/POINTER TO REGISTER INITIALIZATION ROUTINE

TESTCOM,JMS I	PREGINIT/(REGINIT)	/INITIALIZE THE REGISTERS
	DCA	TM0			/CLEAR OUTPUT TEST VALUE
	DCA	COMTM1			/CLEAR INPUT TEST VALUE
	DCA	T6			/CLEAR LOW-ORDER TIME-OUT COUNTER
	TAD	Z7741/[-37]		/SETUP THE
	DCA	T7			/HIGH-ORDER TIME-OUT COUNTER
	CDF	00			/SET EVEN FIELD TO ACCESS "A" SIDE
	OLS				/OUTPUT A NULL CHARACTER
	CDF	70			/BACK TO OUR FIELD
	ISZ	TM0			/BUMP OUTPUT VALUE
COMWAIT,ISF				/COMMUNICATIONS PORT FLAG UP?
	SKP				/SKIP IF NOT
	JMP	COMCHK			/JUMP IF SO
	ISZ	T6			/WAITING TOO LONG?
	JMP	COMWAIT			/NO, KEEP TRYING
	ISZ	T7			/WAITING TOO MANY TIMES?
	JMP	COMWAIT			/NO, KEEP TRYING
COMBAD,	TAD	L100/(100)		/GET COMMUNICATIONS PORT ERROR BIT
	TAD	ESTATUS			/UPDATE CUMULATIVE ERROR STATUS
	DCA	ESTATUS			/STORE BACK
	JMP	COMEXIT			/STOP TESTING
COMCHK,	JMS I	PCOMREAD/[COMREAD]	/READ CONTENTS OF
	B^10+2				/REGISTER 2B
	AND	Z17/[17]		/JUST LOW-ORDER BITS AFFECTING "A" HALF
	TAD	M6/(-6)			/RECEIVE CHARACTER AVAILABLE?
	SZA				/SKIP IF AS EXPECTED
	JMP	CCHKMORE		/JUMP IF NOT
	CDF	00			/NEED EVEN FIELD TO ACCESS "A" SIDE
	IRB				/GET THE CHARACTER
	CDF	70			/BACK TO OUR FIELD
	AND	Z377/[377]		/JUST DATA BITS
	CIA				/INVERT FOR COMPARISON
	TAD	COMTM1			/COMPARE TO EXPECTED VALUE
	SNA CLA				/SKIP IF DIFFERENT
	JMP	CREADOK			/JUMP IF IT MATCHES
	JMS I	PCOMLOAD/[COMLOAD]	/CALL REGISTER LOAD ROUTINE
	A^10+0				/REGISTER 0A
	030				/CHANNEL RESET
	JMP	COMBAD			/FORGET IT

CREADOK,ISZ	COMTM1			/BUMP INPUT TEST VALUE
	TAD	COMTM1			/GET THE VALUE
	AND	Z400/[400]		/JUST TOO-FAR BIT
	SZA CLA				/SKIP IF STILL GOING	
	JMP	COMEXIT			/JUMP IF FINISHED
CINTCLR,JMS I	PCOMLOAD/[COMLOAD]	/CALL REGISTER LOAD ROUTINE
	A^10+0				/0A
	070				/END OF INTERRUPT
	JMP	COMWAIT			/GO BACK FOR MORE

CCHKMOR,TAD	L2/(-4+6)		/TRANSMITTER BUFFER EMPTY?
	SZA CLA				/SKIP IF IT MATCHES
	JMP	COMBAD			/JUMP IF NOT
	TAD	TM0			/GET OUTPUT TEST VALUE
	AND	Z400/[400]		/JUST TOO-FAR BIT
	SNA CLA				/SKIP IF NOW TOO FAR
	JMP	OUTMORE			/JUMP IF NOT
	JMS I	PCOMLOAD/[COMLOAD]	/CALL REGISTER LOAD ROUTINE
	A^10+0				/0A
	050				/CLEAR TRANSMITTER INTERRUPT
	JMP	CINTCLR			/CONTINUE THERE

OUTMORE,TAD	TM0			/GET OUTPUT VALUE
	CDF	00			/SET EVEN FIELD TO ACCESS "A" HALF
	OLS				/OUTPUT THE CHARACTER
	CDF	70			/BACK TO OUR FIELD
	CLA				/CLEAN UP
	ISZ	TM0			/BUMP TEST VALUE
	JMP	CINTCLR			/CONTINUE THERE

L100,	100				/CONSTANT 0100
M6,	-6				/CONSTANT 7772
L2,	-4+6				/CONSTANT 0002

	ZBLOCK	3			/EMPTY SPACE
	PAGE

/	RD TEST  AND  SETUP  ROUTINE.  CHECKS IF RD51 HARDWRE IS PRESENT.  IF PRESENT,
/	WILL WAIT MAY SECONDS UNTIL THE SELF-TEST FINISHES AND RAISES THE DONE FLAG OR
/	IT TIMES  OUT.    THEN  THE  STARTUP  SECTOR  IS  READ  IN  AND  EXECUTED AS A
/	SUBROUTINE LOADED IN A DESIGNATED PLACE.

RDSETUP,.-.				/RD TEST AND SETUP ROUTINE
	NL7777				/SET TEST PATTERN
	RDTEST				/DO TEST IOT THAT SHOULD CLEAR THE AC
	SZA CLA				/SKIP IF RD51 HARDWARE ACTUALLY PRESENT
	JMP I	RDSETUP			/ELSE JUST RETURN
	TAD	M12/(-12)		/GET OUTER TIME-OUT CONSTANT
	DCA	T8			/STASH THE OUTER COUNTER
RDWLP1,	TAD	M30/(-30)		/GET MIDDLE TIME-OUT CONSTANT
	DCA	T7			/STASH THE MIDDLE COUNTER
RDWLP2,	RDSD				/DONE FLAG SET FROM SELF-TEST?
	SKP				/SKIP IF NOT
	JMP	RDFIN			/JUMP IF SO
	ISZ	T6			/WAIT AWHILE?
	JMP	RDWLP2			/KEEP WAITING
	ISZ	T7			/WAITED ENOUGH?
	JMP	RDWLP2			/KEEP GOING
	ISZ	T8			/WAITED TOO LONG?
	JMP	RDWLP1			/NO, KEEP GOING
	JMP I	RDSETUP			/YES, JUST RETURN

RDFIN,	RDSE				/ANY ERRORS?
	SKP				/SKIP IF NOT
	JMP I	RDSETUP			/JUST RETURN
	TAD	PCALLSUB/[CALLSUB+1-1]	/SETUP THE
	DCA	XR0			/STORAGE POINTER
	TAD	L32/(32)		/GET READ STARTUP SECTOR COMMAND
	RDSC				/SEND THE COMMAND
DTRLUP,	JMS	RDWAIT			/WAIT FOR FLAGS
	JMP I	RDSETUP			/ERROR OR TIME-OUT, FORGET IT
	SKP				/TRANSFER REQUEST UP
	JMP	SSDONE			/JUMP THERE IF DONE
	RDTD				/TRANSFER DATA
	DCA I	XR0			/STORE THE WORD IN THE SUBROUTINE BODY
	JMP	DTRLUP			/KEEP GOING

SSDONE,	TAD	PCALLSUB/[CALLSUB+1-1]	/SETUP THE POINTER
	DCA	XR0			/TO THE READ-IN DATA
	TAD	PTSTDATA/(TSTDATA-1)	/SETUP THE TEST DATA POINTER
	DCA	XR1			/STASH THE POINTER
TSTLUP,	TAD I	XR1			/GET AN INVERTED TEST VALUE
	SNA				/SKIP IF NOT AT END OF LIST
	JMS I	PCALLSUB/[CALLSUB]	/CALL THE READ-IN CODE
	TAD I	XR0			/COMPARE TO READ-IN VALUE
	SZA CLA				/SKIP IF IT MATCHES
	JMP I	RDSETUP			/RETURN IF NOT
	JMP	TSTLUP			/KEEP TESTING
M30,	-30				/MIDDLE TIME-OUT CONSTANT
L32,	32				/CONSTANT 0032
M12,	-12				/OUTER TIME-OUT CONSTANT

	6				/AN UNUSED CONSTANT 0006

PTSTDAT,TSTDATA-1			/POINTER TO TEST DATA TABLE (-1)

/	TEST CONTENTS OF CALLABLE  SUBROUTINE.    ALL VALUES ARE INVERTED.  THE ACTUAL
/	READ-IN CODE IS EXECUTABLE AS AND INSTRUCTIONS.

TSTDATA,-1
	-"R!200
	-"D!200
	-"5!200
	-"1!200
	-2
	0				/THIS ENDS THE LIST

/	RD51 WAIT ROUTINE.    TAKES IMMEDIATE RETURN ON ERROR OR TIME-OUT;  TAKES SKIP
/	RETURN ON TRANSFER REQUEST FLAG; TAKES DOUBLE-SKIP RETURN ON DONE FLAG.

RDWAIT,	.-.				/RD51 WAIT ROUTINE
	TAD	DTIMOUT/[-DTIME]	/SETUP THE
	DCA	T7			/TIME-OUT COUNTER
	DCA	T6			/CLEAR INNER TIME-OUT COUNTER
RDWATLP,RDSR				/DATA REQUEST FLAG UP?
	SKP				/SKIP IF NOT
	JMP	RDTRAN			/JUMP IF SO
	RDSD				/DONE FLAG UP?
	SKP				/SKIP IF NOT
	JMP	RDDONE			/JUMP IF SO
	ISZ	T6			/WAITED ENOUGH?
	JMP	RDWATLP			/NO, KEEP GOING
	ISZ	T7			/WAITING TOO LONG?
	JMP	RDWATLP			/NO, KEEP GOING
	JMP I	RDWAIT			/YES, TAKE IMMEDIATE RETURN

RDDONE,	RDSE				/ANY ERRORS?
	SKP				/SKIP IF NOT
	JMP I	RDWAIT			/TAKE IMMEDIATE RETURN IF SO
	ISZ	RDWAIT			/TAKE DOUBLE-SKIP RETURN ON DONE FLAG RAISE
RDTRAN,	ISZ	RDWAIT			/TAKE SKIP RETURN ON TRANSFER FLAG RAISE
	JMP I	RDWAIT			/RETURN EITHER WAY
/	MPSCC REGISTER READ ROUTINE.  CALLED WITH IN-LINE  ARGUMENT  OF EVEN/ODD FIELD
/	IN  BITS[6-8]  AND  SPECIFIED  REGISTER IN BITS[9-11].  THE  CONTENTS  OF  THE
/	SPECIFIED REGISTER ARE RETURNED IN THE AC.

COMREAD,.-.				/MPSCC CHIP REGISTER READ ROUTINE
	TAD I	COMREAD			/GET THE IN-LINE ARGUMENT
	ISZ	COMREAD			/BUMP PAST IT
	DCA	CTMP1			/SAVE IT
	TAD	CTMP1			/GET IT BACK
	AND	L70/(70)		/JUST FIELD BITS
	TAD	ZCDF/[CDF]		/FORM CDF INSTRUCTION
	DCA	.+1			/STORE IN-LINE
	HLT+.-.				/WILL BE CDF XX INSTRUCTION
	TAD	CTMP1			/GET ARGUMENT AGAIN
	AND	Z7/[7]			/JUST REGISTER BITS
	TAD	L4000/(4000)		/ADD ON READ ACCESS BIT
	MPSCC				/SETUP TO READ THE SPECIFIED REGISTER
	CLA				/CLEAN UP
	MPSCC				/READ THE REGISTER
	CDF	70			/BACK TO OUR FIELD
	JMP I	COMREAD			/RETURN

L4000,	4000				/CONSTANT 4000

/	MPSCC REGISTER LOAD ROUTINE.  CALLED  WITH IN-LINE ARGUMENTS OF EVEN/ODD FIELD
/	IN  BITS[6-8]  AND SPECIFIED REGISTER IN BITS[9-11]  OF  THE  FIRST  ARGUMENT,
/	FOLLOWED BY VALUE TO LOAD INTO THE SPECIFIED REGISTER IN THE SECOND ARGUMENT.

COMLOAD,.-.				/COMMUNICATIONS CHIP REGISTER LOAD ROUTINE
	CLA				/CLEAN UP
	TAD I	COMLOAD			/GET THE FIRST ARGUMENT
	ISZ	COMLOAD			/BUMP PAST IT
	DCA	CTMP1			/STASH IT
	TAD I	COMLOAD			/GET THE SECOND ARGUMENT
	ISZ	COMLOAD			/BUMP PAST IT
	DCA	CTMP2			/STASH IT
	TAD	CTMP1			/GET THE FIRST ARGUMENT
	AND	L70/(70)		/JUST FIELD BITS
	TAD	ZCDF/[CDF]		/FORM CDF INSTRUCTION
	DCA	.+1			/STORE IN-LINE
	HLT+.-.				/WILL BE CDF XX INSTRUCTION
	TAD	CTMP1			/GET THE FIRST ARGUMENT AGAIN
	AND	Z7/[7]			/JUST REGISTER BITS
	SZA				/DON'T NEED TO POINT IF ACCESSING REGISTER 0
	MPSCC				/POINT TO DESIRED REGISTER NEXT TIME
	CLA				/CLEAN UP
	TAD	CTMP2			/GET THE NEW REGISTER CONTENTS
	MPSCC				/LOAD THE NEW VALUE
	CLA				/CLEAN UP
	CDF	70			/BACK TO OUR FIELD
	JMP I	COMLOAD			/RETURN TO CALLER

L70,	70				/CONSTANT 0070

	ZBLOCK	11			/EMPTY SPACE
	PAGE

/	RX50 READ COMMAND  ROUTINE.  THE COMMAND (TYPICALLY 0006 FOR A READ) IS PASSED
/	IN THE AC.  THE SECTOR IS IN TINC, AND THE TRACK IN T1.  TAKE IMMEDIATE RETURN
/	IF THE COMMAND SUCCEEDS;  TAKE SKIP RETURN IF IT TIMES OUT.

RXCOMD,	.-.				/RX50 READ COMMAND ROUTINE
	LCD				/LOAD PASSED COMMAND
	TAD	TINC			/GET THE SECTOR
	STR				/TRANSFER FLAG UP?
	JMP	.-1			/NO, WAIT FOR IT
	XDR				/YES, SEND THE SECTOR
	CLA				/CLEAN UP
	TAD	T1			/GET THE TRACK
	STR				/TRANSFER FLAG UP?
	JMP	.-1			/NO, WAIT FOR IT
	XDR				/YES, SEND THE TRACK
	CLA				/CLEAN UP
	TAD	DTIMOUT/[-DTIME]	/SETUP THE
	DCA	T6			/TIME-OUT COUNTER
	DCA	T7			/CLEAR INNER TIME-OUT COUNTER
DNWAIT,	SDN				/DONE FLAG UP?
	SKP				/SKIP IF NOT
	JMP I	RXCOMD			/TAKE SUCCESSFUL RETURN IF SO
	ISZ	T7			/WAITING LONG ENOUGH?
	JMP	DNWAIT			/NO, KEEP WAITING
	ISZ	T6			/WAITING TOO LONG?
	JMP	DNWAIT			/NO, KEEP WAITING
	ISZ	RXCOMD			/BUMP TO FAILURE RETURN
	JMP I	RXCOMD			/TAKE SKIP RETURN TO CALLER
REGINIT,.-.				/REGISTER INITIALIZE ROUTINE
	JMS I	PCOMLOAD/[COMLOAD]	/LOAD REGISTER
	A^10+0				/0A
	030				/CHANNEL RESET
	JMS I	PCOMLOAD/[COMLOAD]	/LOAD REGISTER
	B^10+0				/0B
	030				/CHANNEL RESET
	JMS I	PCOMLOAD/[COMLOAD]	/LOAD REGISTER
	A^10+2				/2A
	020				/LOW-ORDER BITS ARE AFFECTED, NO DMA
	JMS I	PCOMLOAD/[COMLOAD]	/LOAD REGISTER
	B^10+2				/2B
	000				/INTERRUPT VECTOR IS ALL ZEROES
	JMS I	PCOMLOAD/[COMLOAD]	/LOAD REGISTER
	A^10+4				/4A
	104				/16X CLOCK RATE, 1 STOP BIT ASYNCHRONOUS
	JMS I	PCOMLOAD/[COMLOAD]	/LOAD REGISTER
	A^10+1				/1A
	022				/RECEIVE AND TRANSMIT INTERRUPT ENABLE
	JMS I	PCOMLOAD/[COMLOAD]	/LOAD REGISTER
	B^10+1				/1B
	004				/CONDITION AFFECTS VECTOR, NO B INTERRUPTS
	JMS I	PCOMLOAD/[COMLOAD]	/LOAD REGISTER
	A^10+3				/3A
	301				/8 BITS, ENABLE RECEIVER
	JMS I	PCOMLOAD/[COMLOAD]	/LOAD REGISTER
	A^10+5				/5A
	150				/8 BITS, ENABLE TRANSMITTER
	JMP I	REGINIT			/RETURN
/	********

PRINTP,	.-.				/SIX PARAMETERS PRINT ROUTINE
	CDF	70			/RESET TO OUR FIELD
	DCA	ROW			/CLEAR COLUMN
	DCA	COLUMN			/CLEAR COLUMN
	TAD	PCALLSUB/[CALLSUB]	/SETUP THE
	DCA	XR0			/DATA POINTER
	TAD	L7772/(-6)		/SETUP THE
	DCA	XR1			/PARAMETER COUNT
	TAD	PTM0/(TM0-1)		/SETUP THE
	DCA	PADR			/PARAMETER ADDRESS
HDLOOP,	TAD I	XR0			/GET A WORD
	TAD	Z7776/[7776]		/COMPARE TO MESSAGE END
	SZA CLA				/SKIP IF IT MATCHES
	JMP	HDLOOP			/ELSE GO BACK
PRLOOP,	TAD I	XR0			/GET A CHARACTER
	MQL				/LOAD IT FOR PRINTING
	CLA MQA				/GET IT BACK
	TAD	Z7741/[-37]		/COMPARE TO DELIMITER
	SNA				/SKIP IF OTHER
	JMP	ATDEL			/JUMP IF A MATCH
	IAC				/COMPARE TO ALTERNATE DELIMITER VALUE
	SNA				/SKIP IF OTHER
	JMP	ATDEL			/JUMP IF A MATCH
	TAD	L4/(4)			/COMPARE TO END OF DATA VALUE
	SNA CLA				/SKIP IF OTHER
	JMP I	PRINTP			/RETURN IF IT MATCHES
	JMS I	PCHRPRT/[CHRPRT]	/PRINT THE CHARACTER
	JMP	PRLOOP			/KEEP GOING

ATDEL,	JMS I	PCHRPRT/[CHRPRT]	/PRINT THE CHARACTER
	TAD	XR1			/GET PARAMETER COUNT
	SNA CLA				/SKIP IF NOT DONE
	JMP	PRLOOP			/JUST PRINT THE FIELD
	ISZ	XR1			/COUNT THIS ONE
	NOP				/IN CASE IT SKIPS
	ISZ	PADR			/BUMP TO NEXT ADDRESS
	TAD	M4/(-4)			/SETUP THE
	DCA	XR2			/DIGIT COUNTER
	TAD I	PADR			/GET THE VALUE
	DCA	DIGTMP			/STASH IT
DIGLUP,	TAD	DIGTMP			/GET VALUE BACK
	R3L				/MOVE UP
	DCA	DIGTMP			/STORE IT BACK
	TAD	DIGTMP			/GET IT AGAIN
	AND	Z7/[7]			/JUST LATEST DIGIT
	TAD	L60/("0&177)		/MAKE IT ASCII
	MQL				/STASH IT
	JMS I	PCHRPRT/[CHRPRT]	/PRINT THE CHARACTER
	ISZ	XR2			/DONE ALL DIGITS YET?
	JMP	DIGLUP			/NO, KEEP GOING
	JMP	PRLOOP			/KEEP GOING
/	*********

L4,	4				/CONSTANT 0004
M4,	-4				/CONSTANT 7774
L7772,	-6				/CONSTANT 7772
L60,	"0&177				/ASCII NUMERIC CONSTANT 0060
PADR,	.-.				/PARAMETER ADDRESS TEMPORARY
DIGTMP,	.-.				/OUTPUT VALUE STORED HERE
PTM0,	TM0-1				/POINTER TO DATA BLOCK

/	RD51 TEST AND WAIT ROUTINE.  IF RD51 IS PRESENT, THEN WAIT AWHILE.

RDTWAIT,.-.				/RD51 TEST AND WAIT ROUTINE
	NL7777				/SET TEST PATTERN
	RDTEST				/AC WILL CLEAR IF RD51 IS PRESENT
	SZA CLA				/SKIP IF RD51 INSTALLED
	JMP I	RDTWAIT			/RETURN IF NOT
	TAD	M2260/(-2260)		/SETUP THE
	DCA	T6			/OUTER LOOP COUNTER
	DCA	T7			/CLEAR THE INNER LOOP COUNTER
WAITLUP,ISZ	T7			/WAIT FOR AWHILE
	JMP	WAITLUP			/KEEP WAITING
	ISZ	T6			/WAITED ENOUGH
	JMP	WAITLUP			/NO, KEEP GOING
	JMP I	RDTWAIT			/YES, RETURN TO CALLER

M2260,	-2260				/CONSTANT 5520

	ZBLOCK	4			/EMPTY SPACE
	PAGE

/	THIS ROUTINE  CHECKS  FOR  BYTES LOADED AS 0377 TO BE REPLACED WITH 4000.  THE
/	AFFECTED DATA CONSISTS OF THE FRESHLY READ-IN (IN BYTE MODE) CONTENTS OF TRACK
/	1, SECTOR 3 PAST THE VALIDATED HEADER BYTES, LOCATIONS 15360-15777 ONLY.

RUBCHK,	.-.				/377 CODE REPLACE ROUTINE
	TAD	RUBPTR/(T0S3BUFFER+10)	/SETUP THE LIST POINTER PAST THE HEADER
	DCA	VPTR			/STASH THE POINTER
VLUP,	CDF	10			/GOTO DATA FIELD
	TAD I	VPTR			/GET A WORD
	IAC				/ADD ONE
	AND	Z377/[377]		/LOW-ORDER BITS ONLY
	SZA CLA				/SKIP IF THEY WERE ALL SET
	JMP	VAROUND			/ELSE RETAIN THIS WORD
	NL4000				/GET REPLACEMENT VALUE
	DCA I	VPTR			/STORE OVER LIST ELEMENT
VAROUND,CDF	70			/BACK TO OUR FIELD
	ISZ	VPTR			/BUMP TO NEXT
	NL2000				/GET ADDRESS MASK
	AND	VPTR			/JUST QUADRANT BIT
	SNA CLA				/SKIP IF JUST FINISHED
	JMP	VLUP			/JUMP IF NOT
	JMP I	RUBCHK			/RETURN TO CALLER

RUBPTR,	T0S3BUFFER+10			/POINTER TO DATA PAST THE HEADER
VPTR,	.-.				/DATA POINTER
/	WHILE  THERE IS NO MORE ACTUAL  CODE,  THE  FOLLOWING  LINES  ARE  PRESENT  TO
/	CALCULATE  THE  MOVE  LENGTH  FOR THE CP-INTERRUPT  HANDLER  USED  DURING  THE
/	LOOPBACK TEST  IN  MAIN  MEMORY.    THIS CALCULATION IS PROBABLY INCORRECT AND
/	MOVES TOO MUCH  CODE.    THE  ONLY  POSSIBLE  PROBLEM  IS INTERACTION WITH APT
/	DOWNLOADED PROGRAM CONVENTIONS.

	ZBLOCK	.&7600+200-.		/EMPTY SPACE IN THE REST OF THE PAGE

/	THIS IS WHERE THE STARTUP SECTOR CODE IS READ IN AS A CALLED SUBROUTINE.

CALLSUB,.-.				/TEST SUBROUTINE LOCATION

	CPEND2=	.			/MOVED CP INTERRUPT HANDLER CODE ENDS HERE?

TSTBUFF,ZBLOCK	4			/KEYBOARD TEST BUFFER

	TSTBEND=.			/END OF KEYBOARD TEST BUFFER

	RELOC	6000			/EMPTY SPACE

	APTSTRT=.			/APT ROUTINE STARTS HERE

	RELOC	6400			/EMPTY SPACE

	WRIBUFF=.			/WRITE BUFFER FOR SETUP

	RELOC	6500			/EMPTY SPACE

	APTROUT=.			/APT ROUTINE LOADS HERE

	RELOC	.+20			/EMPTY SPACE

	APTRO2=	.			/SECONDARY APT ADDRESS HERE

	RELOC				/UN-FOOL THE ASSEMBLER

	ZBLOCK	ROMGO-.			/EMPTY SPACE

	$				/THAT'S ALL FOLK!
