Google
 

Trailing-Edge - PDP-10 Archives - dec-10-omona-u-mc9 - syschk.mac
There are 6 other files named syschk.mac in the archive. Click here to see a list.
TITLE SYSCHK DECSYSTEM-10 LOADTIME DIAGNOSTICS - V027
SUBTTL SYSCHK.MAC - J.E. STUBBLEBINE	22 MAR 77
	SEARCH	F,S
	$RELOC
	$LOW
;***COPYRIGHT 1973,1974,1975,1976,1977 DIGITAL EQUIPMENT CORP., MAYNARD, MASS.***
XP VSYSCK,027



;MAINTAINER: PDP-10 DIAGNOSTIC GROUP
;AUTHOR: J.E. STUBBLEBINE


;LOADTIME DIAGNOSTICS CHECKS FOR THE ACCESSABILITY OF SYSTEM
;PERIPHERALS. CONTROL IS RECEIVED VIA A JSR SYSCHK. THE
;MONITOR "INTTAB" TABLE IS THEN SCANNED IN A MANNER SIMILAR
;TO THE METHOD USED IN "ONCE" TO DETERMINE THE SYSTEM DEVICES.
;THEN A PI ASSIGNMENT OF FOUR IS MADE TO EACH DEVICE AND VERIFIED.
;THE OPERATOR IS INFORMED OF ANY FAILING DEVICES.THIS
;PROGRAM IS DESIGNED TO SCAN FOR STANDARD DEVICES ONLY.



;SUBROUTINE PARAMETERS


EXCASB=1
KA10=1
KI10=1
PRINT=1
TYPIN=1
TOGGLE=1
MEMMAP=1
PGMEND=1
PSHLST=40
DEBUG=100
SIXOUT=1
INHPAG=0


SUBTTL	PERTINENT PROGRAM/SUBROUTINE PARAMETERS, X00R, DECEMBER 6, 1971
;OPERATOR DEFINITIONS, SUBROUTINE CALLS - SHORT COMMAND FORM
OPDEF	PGMINT	[JSP	0,$PGMIN]	;PROGRAM SUBROUTINE INITIALIZATION
OPDEF	ERRHLT	[JSR	$ERHLT]		;PROGRAM ERROR HALT
	IFDEF	PSHLST,<
OPDEF	GO	[PUSHJ	%P,]		;SUBROUTINE CALL
OPDEF	RTN	[POPJ	%P,]		;SUBROUTINE RETURN
	DEFINE	MOVMEM	(FROM,TO)<
	PUSH	P,FROM
	POP	P,TO	>>
	IFDEF	TOGGLE,<
OPDEF	SWITCH	[JSP	0,$SWTCH]	;INPUT CONSOLE SWITCHES>
	IFDEF	TYPIN,<
OPDEF	TTICHR	[JSP	0,$OPTLK]	;TTY, INPUT ANY CHARACTER
OPDEF	TTIYES	[JSP	0,$YESNO]	;TTY, NORMAL RETURN Y
OPDEF	TTINO	[JSP	0,$NOYES]	;TTY, NORMAL RETURN N
OPDEF	TTIOCT	[JSP	0,$TPOCT]	;TTY, INPUT OCTAL WORD
OPDEF	TTIDEC	[JSP	0,$TPDEC]	;TTY, INPUT DECIMAL WORD
OPDEF	TTICNV	[JSP	0,$TPCNV]	;TTY, INPUT CONVERTABLE WORD
OPDEF	TTLOOK	[JSP	0,$TTLK]	;TTY, KEYBOARD CHECK
OPDEF	TTALTM	[JSP	0,$TALTM]	;TTY, ALT-MODE CHECK>
	IFDEF	PRINT,<
OPDEF	PNTA	[JSR	0,$PRINT]	;PRINT ASCII WORD
OPDEF	PNTAF	[JSR	0,$PRNTF]	;FORCED
OPDEF	PNTAL	[JSR	17,$PRINT]	;PRINT ASCIZ LINE
OPDEF	PNTALF	[JSR	17,$PRNTF]
OPDEF	PNT1	[JSR	1,$PRINT]	;PRINT ONE OCTAL DIGIT
OPDEF	PNT1F	[JSR	1,$PRNTF]
OPDEF	PNT2	[JSR	2,$PRINT]	;PRINT TWO OCTAL DIGITS
OPDEF	PNT2F	[JSR	2,$PRNTF]
OPDEF	PNT3	[JSR	3,$PRINT]	;PRINT THREE OCTAL DIGITS
OPDEF	PNT3F	[JSR	3,$PRNTF]
OPDEF	PNT6	[JSR	6,$PRINT]	;PRINT SIX OCTAL DIGITS
OPDEF	PNT6F	[JSR	6,$PRNTF]
OPDEF	PNT10	[JSR	10,$PRINT]	;PRINT TEN OCTAL DIGITS
OPDEF	PNT10F	[JSR	10,$PRNTF]
OPDEF	PNTOCT	[JSR	14,$PRINT]	;PRINT FULL WORD OCTAL
OPDEF	PNTOTF	[JSR	14,$PRNTF]
OPDEF	PNTHW	[JSR	13,$PRINT]	;PRINT OCTAL HALF WORDS, 6 SP 6
OPDEF	PNTHWF	[JSR	13,$PRNTF]
OPDEF	PNTDEC	[JSR	15,$PRINT]	;PRINT DECIMAL, SUPRESS LEADING 0'S
OPDEF	PNTDCF	[JSR	15,$PRNTF]
OPDEF	PNTDS	[JSR	16,$PRINT]	;PRINT DECIMAL, SPACES FOR LD 0'S
OPDEF	PNTDSF	[JSR	16,$PRNTF]
	IFDEF	USRASB,<
OPDEF	DROPDV	[JSP	0,$DRPDV]	;CLOSE LOGICAL FILE, USER MODE>>
	IFDEF	SIXIN,<
OPDEF	TTSIXB	[GO	$TSIXB]		;TTY, INPUT SIXBIT WORD>
	IFDEF	SIXOUT,<
OPDEF	PNTSIX	[GO	$PNTSX]		;PRINT SIXBIT WORD
OPDEF	PNTSXF	[GO	$PTSXF]		;FORCED >
;STANDARD PROGRAM ASSIGNMENTS

;DATA SWITCHES

CYCL50==400000		;50 CYCLE POWER
RSTART==200000		;RESTART TEST, PRINT TOTALS
TOTALS==100000		;PRINT TOTALS, CONTINUE

NOPNT==	040000		;INHIBIT ALL PRINT/TYPE OUT (EXCEPT FORCED)
PNTLPT==020000		;PRINT ALL DATA ON LPT (LOGICAL DEVICE, USER MODE)
DING==	010000		;RING BELL ON ERROR

LOOPER==004000		;ENTER EXERCISE/CHECK LOOP ON ERROR
ERSTOP==002000		;HALT ON TEST ERROR
PALERS==001000		;PRINT ALL ERRORS

FSTCYL==000400		;FAST CYCLE
TXTINH==000200		;INHIBIT ERROR TEXT

;ACCUMULATORS

	IFDEF	PSHLST,<
%P=	17		;PUSHDOWN POINTER AC (IF PUSH LIST USED)>

;PDP-10 STANDARD PC CONTROL FLAGS

AROV==	400000			;ARITHMETIC OVERFLOW
CRY0==	200000			;CARRY 0
CRY1==	100000			;CARRY 1
FOV==	40000			;FLOATING POINT OVERFLOW
BIS==	20000			;BYTE INTERRUPT
USERF==	10000			;USER MODE
EXIOT==	4000			;USER PRIV I/O
FXU==	100			;FLOATING POINT UNDERFLOW
DCK==	40			;DIVIDE CHECK

;PDP-10 STANDARD ADDRESS ASSIGNMENTS

LUUO==	40			;UUO STORAGE, UUO 1-37
LUUOI==	41			;UUO SERVICE INSTRUCTION
;JOB DATA AREA EXTERNALS

JBESYM=36
JOBUUO=40
JOB41=41
JOBREL=44
JOBDDT=74
JOBSYM=116
JOBSA=120
JOBFF=121
JOBREN=124
JOBAPR=125
JOBCNI=126
JOBTPC=127
JOBOPC=130
JOBVER=137

;USER APR ASSIGNMENTS

PDLOVU==200000		;PUSHDOWN LIST OVERFLOW
MPVU==	20000		;MEMORY PROTECTION VIOLATION
NXMU==	10000		;NON-X-MEMORY
CLKU==	1000		;CLOCK
FOVU==	100		;FLOATING OVERFLOW
AROVU==	10		;ARITHMETIC OVERFLOW

;USER MODE PRINT OUTPUT CHANNEL ASSIGNMENTS

$TTYCH==17		;TELETYPE CHANNEL
$DEVCH==16		;LOGICAL DEVICE CHANNEL
$DVCH1==15		;LOGICAL DEV UPDATE INPUT CHANNEL

	XLIST
	IFDEF	EXCASB,<LIST
;PDP-10 STANDARD APR CONO ASSIGNMENTS

IOCLR==	200000			;CLEAR ALL I/O DEVICES
CLKDIS==4000			;DISABLE CLOCK INTERRUPTS
CLKENB==2000			;ENABLE CLOCK INTERRUPTS
CLKCLR==1000			;CLEAR CLOCK FLAG

;PDP-10 STANDARD APR CONI ASSIGNMENTS, RIGHT HALF

CLKENB==2000			;CLOCK INTERRUPT ENABLED
CLK==	1000			;CLOCK FLAG

;PDP-10 STANDARD PI CONO ASSIGNMENTS

PWFCLR==400000			;CLEAR POWER FAIL FLAG
PARCLR==200000			;CLEAR PARITY ERROR FLAG
PARDIS==100000			;DISABLE PARITY INTERRUPTS
PARENB==40000			;ENABLE PARITY INTERRUPTS
PICLR==	10000			;CLEAR PI SYSTEM
REQSET==4000			;SET PROGRAM PI REQUEST
CHNON==	2000			;TURN ON CHANNEL
CHNOFF==1000			;TURN OFF CHANNEL
PIOFF=	400			;TURN OFF PI SYSTEM
PION==	200			;TURN ON PI SYSTEM

;PDP-10 STANDARD PI CONI ASSIGNMENTS

PION==	200			;PI SYSTEM ON

;PDP-10 STANDARD PI CHANNEL ASSIGNMENTS

PICHN1==100			;PI CHANNEL 1
PICHN2==40			;PI CHANNEL 2
PICHN3==20			;PI CHANNEL 3
PICHN4==10			;PI CHANNEL 4
PICHN5==4			;PI CHANNEL 5
PICHN6==2			;PI CHANNEL 6
PICHN7==1			;PI CHANNEL 7
PICHNA==177			;ALL PI CHANNELS, 1 THRU 7

;PDP-10 SPECIAL COMPATABILITY ASSIGNMENTS

PAG==	010			;PAGING I/O DEVICE CODE - KI10

	XLIST
	IFDEF	KA10,<LIST
;KA10 APR CHANNEL ASSIGNMENTS

AAPRC1==1			;APR INTERRUPT CHANNEL

;KA10 APR CONO ASSIGNMENTS

APDCLR==400000			;CLEAR PUSHDOWN OVERFLOW
AABCLR==40000			;CLEAR ADDRESS BREAK
AMPCLR==20000			;CLEAR MEMORY PROTECTION
ANXCLR==10000			;CLEAR NON-X-MEMORY
AFODIS==400			;DISABLE FLOATING POINT OVERFLOW
AFOENB==200			;ENABLE FLOATING POINT OVERFLOW
AFOCLR==100			;CLEAR FLOATING POINT OVERFLOW
AOVDIS==40			;DISABLE OVERFLOW
AOVENB==20			;ENABLE OVERFLOW
AOVCLR==10			;CLEAR OVERFLOW

;KA10 APR CONI ASSIGNMENTS

APDLOV==200000			;PUSHDOWN OVERFLOW
AUSRIO==100000			;USER I/O
AADRBK==40000			;ADDRESS BREAK
AMPV==	20000			;MEMORY PROTECTION VIOLATION
ANXM==	10000			;NON-EXISTENT MEMORY
AFOENB==200			;FLT PT INTERRUPT ENABLED
AFOV==	100			;FLOATING POINT OVERFLOW
ATRPOS==40			;TRAPS OFFSET
AOVENB==20			;OVERFLOW INTERRUPT ENABLED
AOVFLO==10			;ARITHMETIC OVERFLOW

;KA10 PI CONI ASSIGNMENTS

APWRFL==400000			;POWER FAILURE
APARER==200000			;PARITY ERROR
APAREN==100000			;PARITY INTERRUPT ENABLED
>

	XLIST
	IFDEF	KI10,<LIST
;KI10 PC CONTROL FLAGS

LIP==	2000			;LAST INSTRUCTION PUBLIC
TN0==	400			;TN=00, NO TRAP ;TN=01, ARITH TRAP
TN1==	200			;TN=10, PDL OV  ;TN=11, TRAP 3

;KI10 SPECIAL EXEC MODE FLAGS

UOLIP==400000			;UUO OLD L.I.P.
UOUSR==4000			;UUO OLD USER

;KI10 APR CHANNEL ASSIGNMENTS

IAPRC1==1			;APR CLOCK CHANNEL
IAPRE1==10			;APR ERROR CHANNEL

;KI10 APR CONO ASSIGNMENTS

ITMSET==400000			;SET TIME OUT TIMER
ITMDIS==100000			;DISABLE TIME OUT
ITMENB==40000			;ENABLE TIME OUT
IASRTC==20000			;CLEAR AUTO RESTART
IASRTS==10000			;SET AUTO RESTART
IIOPFC==200			;CLEAR I/O PAGE FAIL
INXCLR==100			;CLEAR NON-X-MEM

;KI10 APR CONI ASSIGNMENTS, RIGHT HALF

ITMOUT==400000			;TIMER TIMED OUT
IPARER==200000			;PARITY ERROR
IPAREN==100000			;PARITY ENABLED
ITMOEN==40000			;TIME OUT ENABLED
IPWRFL==20000			;POWER FAIL
IASRTE==10000			;AUTO RESTART ENABLED
IIOPFL==200			;I/O PAGE FAIL
INXM==	100			;NON-X-MEMORY
;KI10 APR CONI ASSIGMENTS, LEFT HALF

IMLAPD==200000			;MEMORY OVERLAP DISABLED
IFMMAN==100000			;FAST MEMORY MANUAL
IMIPGD==40000			;MI PROGRAM DISABLE
ICNSLR==20000			;CONSOLE READ ONLY
ICNSLL==10000			;CONSOLE LOCKED
IP50HZ==4000			;50 HZ POWER
IMGINM==2000			;MANUAL MARGINS
IMAINT==1000			;MAINTENANCE MODE
IPWRLO==400			;POWER LOW
IMGNLO==200			;MARGIN COMPARATOR LOW
SENSE1==40			;SENSE SWITCHES		1
SENSE2==20			;			2
SENSE3==10			;			3
SENSE4==4			;			4
SENSE5==2			;			5
SENSE6==1			;			6

;KI10 APR DATAO ASSIGNMENTS

IEVNPR==20000			;WRITE EVEN PARITY
ISPDOF==10000			;SPEED MARGINS OFF
ISPDON==4000			;SPEED MARGINS ON
IMGNOF==2000			;MARGINS OFF - LH
IMGNON==1000			;MARGINS ON - LH

;KI10 PI CONO ASSIGNMENTS

IRQCLR==20000			;CLEAR PROGRAM PI REQUEST
;KI10 PI CONI ASSIGNMENTS

IINSTF==400000			;ADDRESS CONDITIONS, INST FETCH
IDATAF==200000			;	    	     DATA FETCH
IWRITE==100000			;		     WRITE
IADSTP==40000			;ADDRESS STOP
IADBRK==20000			;ADDRESS BREAK
IADEXC==10000			;ADDRESS SWITCHES EXEC
IADUSR==4000			;  "	  "       USER
IPRSTP==2000			;PARITY STOP
INXSTP==1000			;NON-X-MEM STOP

;KI10 PAG CONI ASSIGNMENTS

EXCMEM==400			;EXEC MEMORY SPACE
AMCLRB==40			;ASSOCIATIVE MEMORY CLEAR BIT

;KI10 PAG DATAO ASSIGNMENTS, LEFT HALF

LDUSRB==400000			;LOAD USER BASE REGISTER
SMLUSR==40000			;SMALL USER, 32K OR UNDER
USRCMP==20000			;USER ADR COMPARE ENABLE

;KI10 PAG DATAO ASSIGNMENTS, RIGHT HALF

LDEXCB==400000			;LOAD EXEC BASE REGISTER
TRPENB==20000			;ENABLE TRAPS

;KI10 PAG DATAI ASSIGNMENTS

SMLUSR==40000			;SMALL USER
USRCMP==20000			;USER ADR COMPARE ENABLED
TRPENB==20000			;RH, TRAPS ENABLED

;KI10 PTR DATAO ASSIGNMENTS

	;ADDRESS CONITIONS, ADDRESS BREAK ;AS ABOVE, PI CONI
	;ADDRESS SWITCHES, 14-35
;KI10 EXEC PAGE MAP PAGE ASSIGNMENTS

PGFTRP==420			;PAGE FAULT TRAP
AROVTP==421			;ARITHMETIC TRAP
PDOVTP==422			;PUSHDOWN OVERFLOW TRAP
TRP3TP==423			;TRAP 3 TRAP

;KI10 USER PAGE MAP PAGE ASSIGNMENTS

PGFTRP==420			;PAGE FAULT TRAP
AROVTP==421			;ARITHMETIC TRAP
PDOVTP==422			;PUSHDOWN OVERFLOW TRAP
TRP3TP==423			;TRAP 3 TRAP

MUUO==	424			;MUUO STORAGE
MUUOPC==425			;C(PC) OF MUUO STORAGE

EXCPFW==426			;EXEC PAGE FAIL WORD
USRPFW==427			;USER PAGE FAIL WORD

KNTRP==	430			;KERNAL	 	NO TRAP - NEW PC'S-
KTRP==	431			;"	 	TRAP
SNTRP==	432			;SUPERVISOR	NO TRAP
STRP==	433			;"		TRAP
CNTRP==	434			;CONCEAL 	NO TRAP
CTRP==	435			;"		TRAP
PNTRP==	436			;PUBLIC		NO TRAP
PTRP==	437			;"		TRAP

>>
	LIST
;KL10 DEFINITIONS

LNXM==2000			;NXM FLAG
LNXCLR==22000			;CLEAR NXM FLAG

LTRPEN==1B22			;TRAP ENABLE

PFNPCW==502			;PAGE FAIL NEW PC WORD

;DTE LOCATIONS AND COMMANDS

DTE==200			;DTE DEVICE CODE
DTEEPW==144			;EXAMINE PROTECTION WORD
DTEFLG==444			;SET BY FE WHEN COMMAND IS COMPLETE
DTEF11==450			;FROM 11 ARGUMENT
DTECMD==451			;COMMAND LOCATION
DTEMTD==455			;MONITOR OUTPUT COMPLETE FLAG (SET BY 11)
DTEMTI==456			;MONITOR INPUT READY FLAG (SET BY 11)

.DTMTO==10B27			;COMMAND TO DO MONITOR OUTPUT
.DTMMC==11B27			;COMMAND TO TURN ON MONITOR MODE CONSOLE

;DTE HARDWARE BITS

TO11DB==1B22			;TO 11 DOORBELL
PILDEN==1B31			;ENABLE LOAD PI
	SUBTTL	PROGRAM INTIALIZATION

MONFLG:	-1
MONCTL:	0
%AC0=0
%AC1=1
%AC2=2
%AC3=3
%AC4=4
%AC5=5
%AC6=6
%AC7=7
%AC10=10
%AC11=11
%AC12=12
%AC13=13
%AC14=14

ENTRY	SYSCHK

BEGIN=.
SYSCHK:	0
	MOVEI	T1,%EXIT-1	;SET UP EXIT POINT
	MOVEM	T1,RETCAL#
	SETZM	REPT#
	SETZM	SCOPE#
	SETOM	LASTPC#
	PGMINT			;INITIALIZE SUBROUTINES
	MOVE	%AC1,[200,,MONSV]
	BLT	%AC1,MONSV+537	;SAVE MONITOR TO SETUP EXEC PAGING
	JSP	$MEMMP
	JRST	%LTD02		;SCAN THE DDB'S
PGMNAM:	ASCIZ/
LOADTIME DIAGNOSTICS/

;EXIT ROUTINE
%EXIT:	MOVE	%AC1,[MONSV,,200]
	BLT	%AC1,200+537	;RESTORE MONITOR
	CONO	APR,200000	;CLEAR PI ASSIGNMENTS SO MONITOR WON'T LOOP
	MOVEI	%AC1,LDEXCB
	IOR	%AC1,SAVPG1#
	SKIPGE	KAILFL
	DATAO	PAG,%AC1
	SKIPG	KAILFL
	JRST	2,@SYSCHK
	DATAO	PAG,SAVPG1
	CONO	PAG,@SAVPAG#
	JRST	2,@SYSCHK

%LTD02:	MOVSI	T1,INTNUM##
X0:	HRRZ	T2,INTTAB##(T1)
	JUMPE	T2,X8
	SKIPGE	INTTB1##(T1)
	JRST	X8
	LDB	T3,[POINT 6,INTTB1##(T1),8]
	CAIE	T3,LOCSTA##
	JUMPN	T3,X8
	MOVE	T3,(T2)
	HLRZ	T4,T3
	ANDI	T4,(CONSO)
	CAIE	T4,(CONSO)
	JRST	X8
	AND	T3,[77400,,0]
	MOVEI	T4,NXDEVS
	CAME	T3,XDEVTB-1(T4)
	SOJG	T4,.-1
	JUMPE	T4,X1
	HRRZ	T4,INTTB1##(T1)
	JUMPE	T4,X8
	TLZ	T3,400
X1:	LDB	T4,PINTCH##
	HRLI	T4,(CONO)
	IOR	T4,T3
	XCT	T4
	HRRI	T4,T4
	TLC	T4,(<CONI>^!<CONO>)
	XCT	T4
	TRNE	T4,7
	JRST	X8
	HRRZ	T2,INTTB1##(T1)
	JUMPN	T2,X3
	MOVEI	T2,NNDEVS
	CAME	T3,NDEVTB-1(T2)
	SOJG	T2,.-1
	JUMPN	T2,X2
	MOVEI	%AC0,[ASCIZ /%DEVICE WITH DEVICE CODE /]
	PNTAL
	MOVE	%AC0,T3
	LSH	%AC0,-30
	PNT3
	JRST	X7
X2:	MOVEI	J,1
	MOVEI	T2,NDEVT1-1(T2)
	JRST	X4
X3:	LDB	J,DDBNUM##
	JUMPN	J,X4
IFN FTDISK,<
	HLRZ	T3,(T2)
	CAIE	T3,(SIXBIT .DSK.)
	JRST	X4
	MOVNI	J,KONINT##
	ADD	J,INTTAB##(T1)
	HLLZ	T2,@(J)
	JRST	X5
>
X4:	MOVE	T2,(T2)
	MOVEI	%AC0,[ASCIZ /%DEVICE /]
	CAIN	J,1
	JRST	X6
	HLLZS	T2
X5:	MOVEI	%AC0,[ASCIZ /%CONTROLLER /]
X6:	PNTAL
	MOVE	%AC0,T2
	PNTSXF
	MOVEI	%AC0,SPACE
	PNTAF
X7:	MOVEI	%AC0,[ASCIZ /IS INACCESSIBLE.
/]
	PNTALF
X8:	AOBJN	T1,.+1
	AOBJN	T1,X0
	JRST	%EXIT
XDEVTB:	<324>B11	;DTS
	<334>B11	;DTS FOR DTB
	<344>B11	;TMS
	<354>B11	;TMS FOR MTB
NXDEVS==.-XDEVTB

NDEVTB:	<0>B11		;APR
	<14>B11		;CCI
	<70>B11		;CLK
	<120>B11	;CTY
	<240>B11	;DLS0
	<244>B11	;DLS1
NNDEVS==.-NDEVTB

NDEVT1:	SIXBIT	/APR/
	SIXBIT	/CCI0/
	SIXBIT	/CLK0/
	SIXBIT	/CTY/
	SIXBIT	/DLS0/
	SIXBIT	/DLS1/
SUBTTL PDP-10 DIAGNOSTIC ERROR HANDLER, X03F, JULY 1, 1971

;THE DIAGNOSTIC ERROR HANDLER IS A SUBROUTINE CAPABLE OF REPORTING
;A STANDARD BUT FLEXIBLE FORMAT OF TEST DATA AND DIAGNOSTIC
;INFORMATION.  THE ERROR HANDLER ALSO INTERPRETS AND CONTROLS TEST
;SWITCHES SUCH AS TYPEOUT SUPPRESSION, CONTINUE/HALT OR LOOP ON
;ERROR, AND BELL ON ERROR.

	INTERN	%ERCAL,SCOPE,REPT,LASTPC,PASCTR

%ERCAL:	0
	MOVEM	0,%AC0#
	MOVEM	1,%AC1#
	MOVEM	2,%AC2#
	MOVEM	3,%AC3#
	MOVEM	4,%AC4#
	AOS	ERRCNT#		;INCREMENT ERROR COUNT
	MOVEI	1		;DON'T REPEAT LOOP SECTION
	MOVEM	REPT
	HRRZ	3,%ERCAL	;GET <ADDRESS+1> OF ERROR CALL.
	SWITCH
	CAME	3,LASTPC#	;SKIP IF SAME ERROR
	JRST	.+3
	TLNN	PALERS		;PRINT ALL ERRORS ?
	JRST	%ERSW1		;THIS ERROR ALREADY REPORTED ONCE.

;BYPASS ERROR REPORT IF NOPNT SWITCH IS SET
	TLNE	0,NOPNT
	JRST	%ERSW1+1
	MOVEM	3,LASTPC
	SETZM	%ERCNT#
	SKIPGE	MONCTL		;DIAG MON OR SYS EXER ?
	JRST	%ERPRA		;YES, GO PRINT TITLE
%ERPRB:	SKIPN	PASCTR
	JRST	.+5		;DON'T PRINT PASS COUNTER ON FIRST PASS
	MOVEI	0,[ASCIZ/
TEST PASS COUNT = /]
	PNTAL
	MOVE	0,PASCTR#
	PNTDEC			;PRINT TEST PASS COUNTER
	MOVEI	0,[ASCIZ/
PC=  /]
	PNTAL		
	MOVEI	0,-1(3)
	PNT6			;PRINT PC OF ERROR CALL.
	MOVE	0,CONSW
	TLNE	TXTINH		;TEXT INHIBITED ?
	JRST	%ERPR2		;YES
	MOVEI	0,[ASCIZ/
ERROR IN /]
	HLRZ	1,1(3)		;GET NAME OF FAILING TEST
	JUMPE	1,%ERPR1	;JUMP IF NO TEST NAME
	PNTAL		
	MOVE	0,1
	PNTAL			;REPORT NAME OF FAILING TEST
	MOVEI	0,[ASCIZ/ - /]
	JRST	.+2
%ERPR1:	MOVEI	0,CRLF
	HRRZ	1,1(3)		;GET NAME OF FUNCTION TESTED
	JUMPE	1,%ERPR2	;JUMP IF NO FUNCTION CALLED OUT.
	PNTAL		
	MOVE	0,1
	PNTAL			;REPORT FUNCTION BEING TESTED.

%ERPR2:	SETOM	%DISCR#		;SET 'DISCREPANCY FLAG'.

;GET X FROM JSR X,%ERCAL. PASS X ARGUMENT ONTO $PRINT.

	LDB	4,[POINT 4,-1(3),12]	;PICK UP X ARGUMENT
	MOVEI	2,14
	JUMPN	4,.+2		;PRINT 12 OCTAL DIGITS IF X=0
	MOVEM	2,4
	CAILE	4,14		;MAKE SURE THAT X IS A LEGAL ARGUMENT
	ERRHLT			;PROGRAM CALL ERROR
	LSH	4,^D<35-12>	;PUT X IN AC FIELD
	ADD	4,[JSR $PRINT]
	MOVEI	0,[ASCIZ/
CORRECT:  /]
	HLRZ	2,2(3)		;GET ADDRESS OF EXPECTED TEST RESULTS
	JUMPN	2,.+3
	SETZM	%DISCR		;NO 'CORRECT RESULT' TYPEOUT
	JRST	%ERPR3
	CAILE	2,4		;ARE TEST RESULTS IN AC THAT HAS BEEN SAVED?
	JRST	%ERP2A
	CAIN	2,1		;AC1?
	MOVE	1,%AC1
	CAIN	2,2		;AC2?
	MOVE	1,%AC2
	CAIN	2,3		;AC3?
	MOVE	1,%AC3
	CAIN	2,4		;AC4?
	MOVE	1,%AC4
	JRST	.+2
%ERP2A:	MOVE	1,(2)

;AC1 NOW CONTAINS THE CORRECT TEST RESULTS.
	PNTAL			;CORRECT RESULTS.
	MOVE	0,1
	MOVEM	4,.+1
	0			;JSR X,$PRINT. REPORT CORRECT DATA
	MOVEM	1,%COREC#	;SAVE CORRECT DATA
%ERPR3:	MOVEI	0,[ASCIZ/
ACTUAL:   /]
	HRRZ	2,2(3)		;GET ADDRESS OF ACTUAL TEST RESULTS.
	JUMPN	2,.+3
	SETZM	%DISCR		;NO 'ACTUAL RESULT' TYPEOUT.
	JRST	%ERPR4
	CAILE	2,4		;ARE ACTUAL TEST RESULTS IN AC THAT IS SAVED?
	JRST	%ERP3A
	CAIN	2,1		;AC1?
	MOVE	1,%AC1
	CAIN	2,2		;AC2?
	MOVE	1,%AC2
	CAIN	2,3		;AC3?
	MOVE	1,%AC3
	CAIN	2,4		;AC4?
	MOVE	1,%AC4
	JRST	.+2
%ERP3A:	MOVE	1,(2)

;AC1 CONTAINS THE ACTUAL TEST RESULTS.
	PNTAL			;ACTUAL RESULTS
	MOVE	0,1
	MOVEM	4,.+1
	0			;JSR X,$PRINT. REPORT ACTUAL DATA
	MOVEM	1,%ACTUL#	;SAVE ACTUAL DATA

%ERPR4:	MOVEI	0,[ASCIZ/
DISCREP:  /]
	SKIPN	%DISCR		;REPORT DATA DISCREPANCY IF BOTH CORRECT AND
	JRST	%ERPR5		;ACTUAL DATA REPORTED.
	MOVE	1,%COREC
	XOR	1,%ACTUL	;XOR CORRECT & ACTUAL DATA
	PNTAL		
	MOVE	0,1
	MOVEM	4,.+1
	0			;JSR X,$PRINT. REPORT DISC BETWEEN COR. & ACT.
;PICK UP AND REPORT DIAGNOSTIC COMMENT IF ANY.
%ERPR5:	MOVE	0,CONSW
	TLNE	TXTINH		;TEXT INHIBITED ?
	JRST	%ERPR6		;YES
	HRRZ	1,3(3)		;GET ADDRESS OF ASCIZ TEXT.
	JUMPE	1,%ERPR6	;EXIT FROM ERROR PRINT IF NO DIAGNOSTIC TEXT.
	MOVEI	0,CRLF
	PNTAL		
	MOVE	0,1
	PNTAL		
%ERPR6:	MOVEI	CRLF
	PNTA

ERMORE:	JRST	.+1		;TO ADD ROUTINE, PLACE JRST HERE

;EXAMINE DATA SWITCHES (OR SOFTWARE SWITCHES IF USER MODE).

%ERSW1:	SWITCH			;READ DATA SWITCHES
	MOVEM	0,4
	TLNN	4,ERSTOP	;IS 'HALT ON ERROR' SWITCH SET, (SWITCH ERSTOP)
	JRST	%ERSW2		;NO

;EXECUTE HALT IF SWITCH ERSTOP SET.

%ERS1A:	MOVE	0,%ERCAL	;SETUP FOR ERRHLT
	MOVEM	0,$ERHLT
	MOVE	0,%AC0		;RESTORE AC'S
	MOVE	1,%AC1
	MOVE	2,%AC2
	MOVE	3,%AC3
	MOVE	4,%AC4
	JRST	$ERHLT+1	;USE SUBROUTINE ERROR HALT

%ERPRA:	MOVEI	PGMNAM		;PRINT PROGRAM NAME
	SKIPN	%ERFST#		;ON FIRST ERROR ONLY
	PNTAL
	SETOM	%ERFST
	JRST	%ERPRB
;EXAMINE LOOPER SWITCH AND SCOPE LOOP ON ERROR IF SET.

%ERSW2:	TLNE	4,LOOPER
	JRST	.+3
	SETZM	SCOPE		;SCOPE PREVIOUSLY DEFINED .
	JRST	%ERSW3
	SETOM	SCOPE		;FORCE TEST TO LOOP.
	MOVE	0,%ERCAL
	SOS
	AOS	1,%ERCNT	;INCREMENT ERROR COUNT
	HRL	1,0
	SKIPN	USER		;USER MODE ?
	DATAO	PI,1		;DISPLAY ERROR PC,ERROR COUNT.

;RING TTY BELL IF DING SWITCH IS SET.
%ERSW3:	TLNN	4,DING
	JRST	%EXCAL
	MOVEI	0,BELL		;BELL CODE
	PNTAF

;RETURN TO ERROR CALL ADDRESS+1
%EXCAL:	MOVE	0,%AC0
	MOVE	1,%AC1
	MOVE	2,%AC2
	MOVE	3,%AC3
	MOVE	4,%AC4
	SKIPL	MONCTL		;UNDER DIAGNOSTIC MONITOR ?
	JRSTF	@%ERCAL		;NO, CONTINUE PROGRAM
	MOVE	0,ERRCNT	;YES
	CAIL	0,5		;PRINTED ALLOWED ERRORS ?
	JRST	.+3
	MOVE	0,%AC0
	JRSTF	@%ERCAL		;NO, CONTINUE PROGRAM
	AOS	17,RETCAL	;YES
	JRST	(17)		;RETURN TO CALLING PROGRAM
SUBTTL	PROGRAM SUBROUTINE INITIALIZATION, X00R, DECEMBER 6,1971

$PGMIN:	MOVEM	0,$ACA0#
	SETOM	USER#
	TLNN	0,USERF		;USER MODE ?
	SETZM	USER		;EXEC MODE
	SKIPN	MONFLG		;DIAG MON, SPECIAL USER MODE ?
	SETZM	USER		;YES, TREAT I/O AS EXEC
	SKIPE	USER		;EXEC ?
	JRST	.+3		;NO
	CONO	PI,10000	;CLEAR PI SYSTEM
	CONO	APR,200000	;CLEAR I/O
	CONO	DTE,PILDEN!0	;NO PI'S FROM DTE
	SKIPE	USER		;USER ?
	RESET			;YES, CLEAR I/O
	JRST	2,@.+1		;CLEAR PC FLAGS
	XWD	0,.+1
	MOVE	CONSW
	MOVEM	$SVCSW#		;SAVE PREVIOUS SWITCHES
	SETZM	CONSW#		;CLEAR SWITCH REGISTER
	MOVE	0,JOBSYM	;SETUP DDT SYMBOLS
	MOVEM	0,JBESYM
	XLIST
	IFDEF	PSHLST,<LIST
	MOVE	%P,PLIST		;INIT PUSH POINTER
	MOVEI	0,$PSHER
	PUSH	%P,0		;SET ERR FOR EXCESSIVE POP'S>
	XLIST
	IFDEF	PRINT,<LIST
	JSP	$PNTIN		;INIT PRINT SUBROUTINE>
	XLIST
	IFDEF	TYPIN,<LIST
	JSP	$TYPIN		;INIT TTY INPUT SUBROUTINE>
	XLIST
	IFDEF	TOGGLE,<LIST
	JSP	$SWTIN		;INIT SWITCH INPUT SUBROUTINE>
	LIST
	JSP	$CPUTP		;DETERMINE CPU TYPE
	XLIST
	IFDEF	UUOS,<LIST
	JSP	$UUOIN		;INIT UUO SUBROUTINE>
	XLIST
	IFDEF	INTRPT,<LIST
	JSP	$ITRIN		;INIT INTERRUPT SUBROUTINE>
	LIST
	SETOM	$ONETM#		;SET ONE TIME FLAG
	JRST	@$ACA0		;EXIT
;DETERMINE PROCESSOR TYPE
$CPUTP:	MOVEM	0,$ACB0#
	SETZM	KAILFL#		;KAILFL =0, KA10; =-1, KI10; =+1 KL10
	JFCL	17,.+1
	JRST	.+1
	JFCL	1,$PDP6		;PDP-6 HAS PC CHANGE FLAG
	MOVEI	0,0
	BLT	0,0		;NOOP BLT
	JUMPN	0,$CPUTL	;NON-ZERO IF A KL10
	MOVNI	0,1		;KA10, KI10 DO NOT
	AOBJN	0,.+1		;CARRY INTO BIT 17 DETERMINES CP
	JUMPN	0,$CPUTA	;KI10 IF (AC) = 0,,0
$CPUTI:	MOVEI	0,INXM		;KI NXM FLAG AND NXM CLEAR
	SOSA	KAILFL		;REMEMBER CPU IS A KI
$CPUTA:	MOVEI	0,ANXM		;KA NXM FLAG AND NXM CLEAR
	MOVEM	0,NXM#		;NXM FLAG
	JRST	$CPUT1		;STORE BIT TO CLEAR NXM AND EXIT
$CPUTL:	AOS	KAILFL		;REMEMBER CPU IS A KL
	MOVEI	0,LNXM		;KL NXM FLAG
	MOVEM	0,NXM		;REMEMBER THAT
	MOVEI	0,LNXCLR	;CLEAR KL NXM
$CPUT1:	MOVEM	0,CLRNXM#	;BITS WHICH CLEAR NXM
	JRST	@$ACB0
	IFNDEF	INTRPT,<$PDP6: ERRHLT>

;SUBROUTINE ERROR HALT
$ERHLT:	0
	MOVEM	0,$ERH0#	;SAVE AC0
	MOVEI	[ASCIZ/
ERROR HALT AT /]
	PNTALF
	MOVE	$ERHLT
	SOS
	PNT6F
	MOVEI	CRLF
	PNTAF
	MOVE	0,$ERH0
	SKIPE	USER		;USER MODE ?
	EXIT	1,
	SKIPL	MONCTL		;UNDER MONITOR CONTROL ?
	HALT	@$ERHLT		;NO
	MOVE	0,CONSW
	IFDEF	TOGGLE,<SWITCH>
	TLNE	0,ERSTOP	;HALT ON ERROR SWITCH SET ?
	JRST	.+3
	AOS	17,RETCAL#	;RETURN TO CALLING PROGRAM
	JRST	(17)
	MOVE	0,$ERH0
	HALT	@$ERHLT
	XLIST
	IFDEF	PSHLST,<LIST
;PUSH DOWN LIST EXCESSIVE POPJ ROUTINE
$PSHER:	MOVEI	PGMNAM
	SKIPGE	MONCTL
	PNTALF
	MOVEI	[ASCIZ/
**********
PUSHDOWN LIST UNDERFLOW ERROR/]
	PNTALF
	ERRHLT>
	XLIST
	IFDEF	INTRPT,<LIST
SUBTTL INTERRUPT HANDLING SUBROUTINE, X00R, DECEMBER 6,1971

;INITIALIZE FOR INTERRUPTS AND TRAPPING.
$ITRIN:	MOVEM	0,$ACB0#
	SKIPE	USER		;PROCESSOR IN USER MODE?
	IFNDEF	USRASB,<ERRHLT>
	IFDEF	USRASB,<JRST	$ITRUS		;YES>
	SKIPN	KAILFL
	IFNDEF	KA10,<ERRHLT>
	IFDEF	KA10,<JRST $KA10>
	IFNDEF	KI10,<ERRHLT>
	IFDEF	KI10,<JRST $KI10>
;PDP-6 INITIALIZATION
$PDP6:	SKIPE	USER		;USER MODE?
	JRST	$ITRUS		;YES
	MOVEI	[ASCIZ/
PDP-6 CODE NOT IMPLEMENTED/]
	PNTALF
	ERRHLT
	HALT	BEGIN

;USER MODE INITIALIZATION
$ITRUS:	MOVEI	ITRUSR		;SETUP USER APR TRAPPING
	MOVEM	JOBAPR
	MOVEI	PDLOVU!MPVU!NXMU
	CALL	[SIXBIT/APRENB/]
	JRST	@$ACB0
;USER MODE INTERRUPTS
ITRUSR:	MOVE	JOBTPC
	MOVEM	ITRCH1		;SAVE TRAPPED ADDRESS
	MOVE	JOBCNI
	MOVEM	$SVAPR#		;SAVE CAUSE
	SETZM	$SVPI#
	TRNE	PDLOVU
	JRST	$PDOVU		;PUSHDOWN OVERFLOW
	TRNE	MPVU
	JRST	$MPVU		;MEMORY PROTECTION VIOLATION
	TRNE	NXMU
	JRST	$NXMU		;NON-X-MEMORY
$USRHL:	JRST .+1		;TO HANDLE OTHERS, PLACE TRANSFER HERE
	JRST	$ITRHL+1	;ERROR

$PDOVU:	MOVEI	[ASCIZ/
PUSHDOWN OVERFLOW/]
	JRST	$ITR1A
$MPVU:	MOVEI	[ASCIZ/
MEMORY PROTECTION VIOLATION/]
	JRST	$ITR1A
$NXMU:	MOVEI	[ASCIZ/
NON-EXISTANT MEMORY/]
	JRST	$ITR1A
;COMMON INTERRUPT HANDLERS

$ITRHL:	JRST	.+1		;TO HANDLE OTHERS, PLACE TRANSFER HERE
	MOVEI	[ASCIZ/
ERROR INTERRUPT/]
	JRST	$ITR1A

$PARER:	MOVEI	[ASCIZ/
MEMORY PARITY INTERRUPT/]
	JRST	$ITR1A

;COMMON EXEC MODE POWER FAILURE ROUTINE

$PWRDN:	MOVEM	0,$ACD0#
	MOVE	[1,,POWER+1]
	BLT	POWER+17
	CONI	APR,$SVAPR	;SAVE APR SYSTEM
	CONI	PI,$SVPI	;SAVE PI SYSTEM
	SKIPE	KAILFL		;KI10?
	DATAI	PAG,$SVPAG#	;YES, SAVE PAG SYSTEM
	SETOM	$PWRF#
	HALT	BEGIN

;RESTORE PROCESSOR ON RESTART

RESRT1:	SKIPN	$PWRF		;DID POWER FAIL WORK?
	JRST	$PWRFL		;NO
	SKIPN	KAILFL
	IFNDEF	KA10,<JRST $PWRFL>
	IFDEF	KA10,<JRST $KARST>
	IFNDEF	KI10,<JRST $PWRFL>
	IFDEF	KI10,<JRST $KIRST>

$RSTCM:	MOVS	[1,,POWER+1]	;RESTORE AC'S
	BLT	17
	SETZM	$PWRF
$RSRTX:	JRST	.+1		;TO ADD ROUTINE, PLACE TRANSFER HERE
	JRST	@$ACD0

$PWRFL:	PGMINT
	MOVEI	[ASCIZ/
POWER INTERRUPT FAILED
/]
	PNTALF
	HALT	BEGIN
;PRINT CAUSE AND OTHER PERTINENT INFO

$ITR1A:	MOVEM	0,$ITAC0#
	MOVEI	PGMNAM
	SKIPGE	MONCTL		;PRINT PROGRAM NAME
	PNTALF			;IF UNDER DIAG MONITOR
	MOVE	0,$ITAC0
	PNTALF			;PRINT CAUSE
	MOVEI	[ASCIZ/
APR            PI             FLAGS  PC      PROG
/]
	PNTALF
	MOVE	$SVAPR
	PNTHWF			;PRINT APR CONI BITS
	MOVEI	SPACE
	PNTAF
	MOVE	$SVPI
	PNTHWF			;PRINT PI CONI BITS
	MOVEI	SPACE
	PNTAF
	MOVE	ITRCH1
	SOS
	PNTHWF			;PRINT FLAGS, PC
	IFDEF	PSHLST,<
	MOVEI	SPACE
	PNTAF
	HRRZ	0,(%P)
	SOS
	PNT6F			;PRINT LAST PUSHJ ENTRY>
	MOVEI	CRLF2
	PNTAF
$ITRX1:	JRST	.+1		;TO ADD ROUTINE, PLACE TRANSFER HERE
	ERRHLT
	HALT	BEGIN

;COMMON INTERRUPT ROUTINE

	IFNDEF	SLDCDE,<
ITRCH1:	0			;TO PROVIDE SOLID CODE, DEFINE SLDCDE>
$ITRC1:	MOVEM	0,$ACC0#
	SKIPN	KAILFL
	IFNDEF	KA10,<ERRHLT>
	IFDEF	KA10,<JRST $KAITR> ;KA10
	IFNDEF	KI10,<ERRHLT>
	IFDEF	KI10,<JRST $KIITR> ;KI10

	XLIST
	IFDEF	KA10,<LIST
;KA10 INTERRUPT ROUTINE

$KAITR:	CONSO	PI,APWRFL	;POWER FAILURE?
	JRST	$KAIT1		;NO
	JSP	$PWRDN		;YES, SAVE PROCESSOR STATE AND HALT

	MOVE	0,$ACC0
	JRSTF	@ITRCH1		;CONTINUE PROGRAM ON RESTART

$KAIT1:	CONI	APR,$SVAPR
	CONI	PI,$SVPI
	CONSZ	PI,APARER
$KAPAR:	JRST	$PARER		;PARITY ERROR
	CONSZ	APR,APDLOV
$KAPDL:	JRST	$PDOVU		;PUSHDOWN OVERFLOW
	CONSZ	APR,AMPV
$KAMPV:	JRST	$MPVU		;MEMORY PROTECTION VIOLATION
	CONSZ	APR,ANXM
$KANXM:	JRST	$NXMU		;NON-X-MEMORY
	JRST	$ITRHL		;REST COMMON

;KA10 POWER FAIL RESTART

$KARST:	CONO	APR,$KAINT
	CONO	PI,PWFCLR!PARCLR!PARDIS!PICLR!CHNOFF!PIOFF
	MOVE	1,$SVAPR
	TRZ	1,775550	;CLEAR MISC APR BITS
	CONO	APR,(1)		;RESET APR SYSTEM
	MOVE	1,$SVPI
	TRZ	1,777400	;CLEAR MISC PI BITS
	MOVE	2,$SVPI
	TRNE	2,APAREN	;WAS PARITY ENABLED
	TRO	1,PARENB	;YES
	TRO	1,CHNON		;SET PI CHANNEL ON BIT
	CONO	PI,(1)		;RESET PI SYSTEM
	JRST	$RSTCM		;REST COMMON
;KA10 INTERRUPT INITIALIZATION

$KAINT=APDCLR!IOCLR!AABCLR!AMPCLR!ANXCLR!CLKDIS!CLKCLR!AFODIS!AFOCLR!AOVDIS!AOVCLR

$KA10:	MOVE	[JSR ITRCH1]
	MOVEM	42		;SETUP INTERRUPT TRAP
	MOVEM	44
	MOVEM	46
	MOVEM	50
	MOVEM	52
	MOVEM	54
	MOVEM	56
	CONO	APR,$KAINT
	CONO	PI,PARCLR!PARDIS!PICLR!CHNOFF!PIOFF
	SETZM	$PWRF
$KA10A:	CONO	APR,AAPRC1	;ASSIGN CHANNEL 1
$KA10B:	CONO	PI,PARENB!CHNON!PION!PICHN1
	JRST	@$ACB0
>
	XLIST
	IFDEF	KI10,<LIST
;KI10 INTERRUPT ROUTINE

$KIITR:	CONSO	APR,IPWRFL	;POWER FAILURE?
	JRST	$KIIT1		;NO
	JSP	$PWRDN		;YES, SAVE PROCESSOR STATE AND HALT

	MOVE	0,$ACC0
	JRSTF	@ITRCH1		;CONTINUE PROGRAM ON RESTART

$KIIT1:	CONI	APR,$SVAPR
	CONI	PI,$SVPI
	CONSZ	APR,IPARER
$KIPAR:	JRST	$PARER		;PARITY ERROR
	CONSZ	APR,INXM
$KINXM:	JRST	$NXMU		;NON-X-MEMORY
	JRST	$ITRHL		;REST COMMON

;KI10 TRAP ROUTINE

PDLOV:	0
$PDLOV:	MOVE	PDLOV		;SAVE TRAPPED ADDRESS
	MOVEM	ITRCH1
	CONI	APR,$SVAPR
	CONI	PI,$SVPI
	JRST	$PDOVU

PGFAIL:	0
$PGFL:	MOVE	PGFAIL		;SAVE FAILED ADDRESS
	MOVEM	ITRCH1
	CONI	APR,$SVAPR
	CONI	PI,$SVPI
	MOVEI	[ASCIZ/
PAGE FAIL TRAP ERROR
PAGE FAIL WORD- /]
	PNTALF
	MOVE	EXCPFW
	PNTHWF
	SETZM	0
	JRST	$ITR1A
;KI10 TRAP 3 ROUTINE

TRAP3:	0
$TRP3:	MOVE	TRAP3
	MOVEM	ITRCH1
	CONI	APR,$SVAPR
	CONI	PI,$SVPI
	MOVEI	[ASCIZ/
TRAP 3 ERROR/]
	JRST	$ITR1A

;MONITOR UUO ERROR ROUTINE

MUUOER:	MOVE	MUUOPC
	MOVEM	ITRCH1
	CONI	APR,$SVAPR
	CONI	PI,$SVPI
	MOVEI	[ASCIZ/
MONITOR UUO ERROR
MUUO= /]
	PNTALF
	MOVE	MUUO
	PNTHWF			;PRINT MUUO
	SETZM	0
	JRST	$ITR1A
;KI10 POWER FAIL RESTART

$KIRST:	CONO	APR,IOCLR!ITMDIS!IASRTC!CLKDIS!CLKCLR!IIOPFC!INXCLR
	CONO	PI,PWFCLR!PARCLR!PARDIS!IRQCLR!PICLR!CHNOFF!PIOFF
	CONO	PAG,0
	DATAO	APR,[IMGNOF,,ISPDOF]
	MOVE	0,$SVPAG
	TLO	0,LDUSRB
	TRO	0,LDEXCB
	DATAO	PAG,0		;RESET PAG SYSTEM
	MOVE	1,$SVPI
	TRZ	1,777400	;CLEAR MISC PI BITS
	TRO	1,CHNON		;SET PI CHANNEL ON BIT
	MOVE	2,$SVAPR
	TRNE	2,IPAREN	;WAS PARITY ENABLED?
	TRO	1,PARENB	;YES
	MOVE	3,2
	TRZ	3,720700	;CLEAR MISC APR BITS
	TRNE	2,ITMOEN	;WAS TIME OUT ENABLED?
	TRO	3,ITMSET!ITMENB ;YES
	CONO	APR,(3)		;RESET APR SYSTEM
	CONO	PI,(1)		;RESET PI SYSTEM
	JRST	$RSTCM		;RESET COMMON
;KI10 INTERRUPT AND TRAP INITIALIZATION

$KI10:	MOVE	[JSR ITRCH1]
	MOVEM	42		;SETUP INTERRUPT TRAP
	MOVEM	44
	MOVEM	46
	MOVEM	50
	MOVEM	52
	MOVEM	54
	MOVEM	56
	MOVE	[JSR PGFAIL]
	MOVEM	PGFTRP		;SETUP PAGE FAIL TRAP
	MOVSI	(JFCL)
	MOVEM	AROVTP		;SETUP ARITHMETIC TRAP
	MOVE	[JSR PDLOV]
	MOVEM	PDOVTP		;SETUP PDL OV TRAP
	MOVE	[JSR TRAP3]
	MOVEM	TRP3TP		;SETUP TRAP 3
	MOVEI	MUUOER
	MOVEM	KNTRP		;SETUP MUUO AS ERROR
	MOVEM	KTRP
	MOVEM	SNTRP
	MOVEM	STRP
	MOVEM	CNTRP
	MOVEM	CTRP
	MOVEM	PNTRP
	MOVEM	PTRP
	CONO	PI,PWFCLR!PARCLR!PARDIS!IRQCLR!PICLR!CHNOFF!PIOFF
	SKIPL	MONCTL		;DIAGNOSTIC MONITOR?
	CONO	APR,IOCLR!ITMDIS!IASRTC!CLKDIS!CLKCLR!IIOPFC!INXCLR
	SKIPGE	MONCTL		;YES
	CONO	APR,IOCLR!CLKDIS!CLKCLR!INXCLR
	CONO	PAG,0
	SKIPL	MONCTL
	DATAO	APR,[IMGNOF,,ISPDOF]
	SKIPE	MONFLG
	DATAO	PAG,[LDUSRB,,LDEXCB!TRPENB]
$KI10A:	CONO	APR,IAPRE1	;ERROR CHANNEL 1
$KI10B:	CONO	PI,PARENB!CHNON!PION!PICHN1
	JRST	@$ACB0

>>
	XLIST
	IFDEF	MEMMAP,<LIST
SUBTTL	MEMORY MAPPING SUBROUTINE, X00R, DECEMBER 6,1971
 
;DETERMINE MEMORY SIZE AND PRINT MEMORY MAP

$MEMMP:	MOVEM	0,$ACB0
	SETZM	$SEGM#		;CLEAR NON-CONSEC FLAG
	SETZM	$ITRLV#		;CLEAR INTERLV ERROR FLAG
	MOVE	MEMSIZ
	MOVEM	$MSZSV#		;SAVE PREVIOUS MEMSIZE
	SETZM	MEMSIZ		;CLEAR MAP STORAGE
	MOVE	[MEMSIZ,,MEMSIZ+1]
	BLT	MEMSZ3+377
	SETZB	0,3
	SKIPN	USER		;EXEC MODE ?
	IFNDEF	EXCASB,<ERRHLT>
	IFDEF	EXCASB,<
	JRST	$MEMEX		;YES >

	IFNDEF	USRASB,<ERRHLT>
	IFDEF	USRASB,<
$USRMP:	HRRZ	JOBREL		;GET HIGHEST REL ADR
	MOVEM	MEMSIZ		;SAVE AS MEMORY SIZE
	JRST	$PMAP5		;GO PRINT	>
	XLIST
	IFDEF	EXCASB,<LIST
;KI10, KL10, SETUP PAGE MAP FOR 256K, RELOCATION = ACTUAL

	IFNDEF	INHPAG,<INHPAG==0>

$EPMPS:	0
	MOVE	0,CONSW		;GET SWITCHES
	TDNE	0,[INHPAG]	;IS PAGING INHIBITED ?
	JRST	$EPMP5		;YES
	SKIPN	MONFLG
	JRST	@$EPMPS		;SPECIAL USER MODE
	DATAI	PAG,SAVPG1
	SKIPLE	KAILFL
	CONI	PAG,SAVPAG
	MOVSI	2,-200
	MOVE	[500376,,500377]
$EPMP1:	ADD	[2,,2]
	MOVEM	200(2)
	AOBJN	2,$EPMP1
	MOVSI	2,-20
	MOVE	[500336,,500337]
$EPMP2:	ADD	[2,,2]
	MOVEM	400(2)
	AOBJN	2,$EPMP2	;EXEC PER-PROCESS
	SKIPG	KAILFL
	JRST	$EPMP4
	MOVSI	2,-140
	MOVE	[500000,,500001]
$EPMP3:	MOVEM	600(2)
	ADD	[2,,2]
	AOBJN	2,$EPMP3
	MOVEI	2,NXMLOC
	MOVEM	2,PFNPCW
	DATAO	PAG,[100000,,0]
	MOVEI	2,LTRPEN
	CONO	PAG,(2)
	CAIA
$EPMP4:	MOVEI	2,LDEXCB+TRPENB+0
	SKIPGE	KAILFL
	DATAO	PAG,2
	SKIPE	KAILFL
	MOVEM	2,CLRPM#
	JRST	@$EPMPS

$EPMP5:	MOVEI	2,337777	;PAGING INHIBITED
	JRST	$MEMX2		;START AT 112K-1
;EXEC MODE MEMORY MAPPING

$MEMEX:	SKIPE	KAILFL
	IFNDEF	KI10,<ERRHLT>
	IFDEF	KI10,<
	JSR	$EPMPS		;KI10, SETUP PAGE MAP >
$MEMX1:	HRLOI	2,17
	SKIPN	KAILFL
	MOVEI	2,-1		;START AT 256K
$MEMX2:	SKIPN	MONFLG		;SPECIAL USER MODE ?
	MOVEI	2,77777		;YES, START AT 32K
	MOVEM	2,$MEMAX#

;NON-X-MEMORY MAPPER
;INTERLEAVING ADDRESSES XXX7

$M1:	CONO	APR,@CLRNXM
	PUSHJ	%P,CHKWRD
	CONSO	APR,@NXM	;NON-X-MEM ?
	JRST	$M5		;NO
	CONO	APR,@CLRNXM	;YES, CLEAR FLAG
$M2:	SUBI	2,1000		;DECREMENT ADDRESS
	CAIL	2,17777		;LESS THAN 8K ?
	JRST	$M1		;NO
	JRST	$MERR		;YES, ERROR
;EXISTANT MEMORY MAPPER
;INTERLEAVING ADDRESSES XXX7

$M3:	PUSHJ	%P,CHKWRD
	CONSZ	APR,@NXM	;EXISTANT MEMORY ?
	AOJA	2,$M6		;NO
$M4:	SUBI	2,100		;YES, DECREMENT ADDRESS
	CAIL	2,0		;COMPLETED ?
	JRST	$M3		;NO
	AOJA	2,$M7		;YES

;SAVE MEMORY ADDRESSES

$M5:	MOVEM	2,MEMSIZ(3)
	JRST	$M3

$M6:	MOVEM	2,MEMSIZ+1(3)
	ADDI	3,2
	SOJA	2,$M1

$M7:	MOVEM	2,MEMSIZ+1(3)
	CAIE	3,0
	SETOM	$SEGM
$MMX1A:	SETZM	3
	MOVE	2,$MEMAX

;NON-X-MEMORY MAPPER
;INTERLEAVING ADDRESSES XXX6

$M1A:	CONO	APR,@CLRNXM
	PUSHJ	%P,CHKWM1
	CONSO	APR,@NXM	;NON-X-MEM ?
	JRST	$M5A		;NO
	CONO	APR,@CLRNXM	;YES, CLEAR FLAG
$M2A:	SUBI	2,1000		;DECREMENT ADDRESS
	CAIL	2,17777		;LESS THAN 8K ?
	JRST	$M1A		;NO
	JRST	$MERR		;YES, ERROR
;EXISTANT MEMORY MAPPER
;INTERLEAVING ADDRESSES XXX6

$M3A:	PUSHJ	%P,CHKWM1
	CONSZ	APR,@NXM	;EXISTANT MEMORY ?
	AOJA	2,$M6A		;NO
$M4A:	SUBI	2,100		;YES, DECREMENT ADDRESS
	CAIL	2,0		;COMPLETED ?
	JRST	$M3A		;NO
	AOJA	2,$M7A		;YES

;SAVE MEMORY ADDRESSES

$M5A:	MOVEM	2,MEMSZ1(3)
	JRST	$M3A

$M6A:	MOVEM	2,MEMSZ1+1(3)
	ADDI	3,2
	SOJA	2,$M1A

$M7A:	MOVEM	2,MEMSZ1+1(3)
	CAIE	3,0
	SETOM	$SEGM
$MMX1B:	SETZM	3
	MOVE	2,$MEMAX

;NON-X-MEMORY MAPPER
;INTERLEAVING ADDRESSES XXX5

$M1B:	CONO	APR,@CLRNXM
	PUSHJ	%P,CHKWM2
	CONSO	APR,@NXM	;NON-X-MEM ?
	JRST	$M5B		;NO
	CONO	APR,@CLRNXM	;YES, CLEAR THE FLAG
$M2B:	SUBI	2,1000		;DECREMENT ADDRESS
	CAIL	2,17777		;LESS THAN 8K ?
	JRST	$M1B		;NO
	JRST	$MERR		;YES, ERROR
;EXISTANT MEMORY MAPPER
;INTERLEAVING ADDRESSES XXX5

$M3B:	PUSHJ	%P,CHKWM2
	CONSZ	APR,@NXM	;EXISTANT MEMORY ?
	AOJA	2,$M6B		;NO
$M4B:	SUBI	2,100		;YES, DECREMENT ADDRESS
	CAIL	2,0		;COMPLETED ?
	JRST	$M3B		;NO
	AOJA	2,$M7B		;YES

;SAVE MEMORY ADDRESSES

$M5B:	MOVEM	2,MEMSZ2(3)
	JRST	$M3B

$M6B:	MOVEM	2,MEMSZ2+1(3)
	ADDI	3,2
	SOJA	2,$M1B

$M7B:	MOVEM	2,MEMSZ2+1(3)
	CAIE	3,0
	SETOM	$SEGM
$MMX1C:	SETZM	3
	MOVE	2,$MEMAX

;NON-X-MEMORY MAPPER
;INTERLEAVING ADDRESSES XXX4

$M1C:	CONO	APR,@CLRNXM
	PUSHJ	%P,CHKWM3
	CONSO	APR,@NXM	;NON-X-MEM ?
	JRST	$M5C		;NO
	CONO	APR,@CLRNXM	;YES, CLEAR THE FLAG
$M2C:	SUBI	2,1000		;DECREMENT ADDRESS
	CAIL	2,17777		;LESS THAN 8K ?
	JRST	$M1C		;NO
	JRST	$MERR		;YES, ERROR

;EXISTANT MEMORY MAPPER
;INTERLEAVING ADDRESSES XXX4

$M3C:	PUSHJ	%P,CHKWM3
	CONSZ	APR,@NXM	;EXISTANT MEMORY ?
	AOJA	2,$M6C		;NO
$M4C:	SUBI	2,100		;YES, DECREMENT ADDRESS
	CAIL	2,0		;COMPLETED ?
	JRST	$M3C		;NO
	AOJA	2,$M7C		;YES

;SAVE MEMORY ADDRESSES

$M5C:	MOVEM	2,MEMSZ3(3)
	JRST	$M3C

$M6C:	MOVEM	2,MEMSZ3+1(3)
	ADDI	3,2
	SOJA	2,$M1C
$M7C:	MOVEM	2,MEMSZ3+1(3)
	JRST	$PMAP
CHKWM3:	SUBI	2,3
	PUSHJ	%P,CHKWRD
	ADDI	2,3
	POPJ	%P,

CHKWM2:	SUBI	2,2
	PUSHJ	%P,CHKWRD
	ADDI	2,2
	POPJ	%P,

CHKWM1:	SUBI	2,1
	PUSHJ	%P,CHKWRD
	ADDI	2,1
	POPJ	%P,

CHKWRD:	SKIPE	KAILFL
	JRST	CHKWR1
	CAM	(2)
	POPJ	%P,
CHKWR1:	MOVE	1,2
	LSH	1,-^D9
	MOVEI	1,500000(1)
	HRLM	1,200
	SKIPGE	KAILFL
	DATAO	PAG,CLRPM
	SKIPLE	KAILFL
	CONO	PAG,@CLRPM
	MOVE	1,2
	ANDI	1,777
	IORI	1,400000
	CAM	(1)
NXMLOC:	POPJ	%P,
>
;PRINT MEMORY MAP
$PMAP:	MOVE	0,MEMSIZ	;COMPARE FIRST MAP WORD OF EACH INTERLV
	MOVE	1,MEMSIZ+1
	CAMN	0,MEMSZ1
	CAME	1,MEMSZ1+1
	SETOM	$ITRLV		;IF ALL SAME, NO INTERLV PROBLEM
	MOVE	0,MEMSZ1	;IF NOT, PRINT ALL 4 MAPS
	MOVE	1,MEMSZ1+1
	CAMN	0,MEMSZ2
	CAME	1,MEMSZ2+1
	SETOM	$ITRLV
	MOVE	0,MEMSZ2
	MOVE	1,MEMSZ2+1
	CAMN	0,MEMSZ3
	CAME	1,MEMSZ3+1
	SETOM	$ITRLV
	SKIPE	$SEGM		;IF NON-CONSEC ALWAYS PRINT
	JRST	$PMAP1
	SKIPE	$ITRLV		;IF INTERLV PROB ALWAYS PRINT
	JRST	$PMAP1
$PMAP5:	SKIPL	MONCTL		;UNDER DIAGNOSTIC MONITOR ?
	JRST	$PMAP3		;NO
	SKIPE	USER		;USER MODE ?
	JRST	$PMAP4		;YES
	HLRZ	MONCTL		;FIRST PASS ?
	CAIE	-1
	JRST	$PMAP4		;NO
$PMAP3:	MOVE	MEMSIZ		;SAME AS PREVIOUS ?
	CAMN	0,$MSZSV
	JRST	$PMAP4		;YES, MUST BE RESTART
$PMAP1:	MOVEI	[ASCIZ?
MEMORY MAP =
FROM   TO     SIZE/K?]
	SKIPE	KAILFL
	MOVEI	[ASCIZ?
MEMORY MAP =
FROM     TO       SIZE/K?]
	PNTAL
	MOVEI	CRLF
	SKIPE	$ITRLV
	MOVEI	[ASCIZ/	ADR SEQ
/]
	PNTAL
	SETZB	0,3
$PMAPL:	SKIPN	2,MEMSIZ(3)	;GET MAP COORDINATES
	JRST	$PMAP2
	MOVE	0,MEMSIZ+1(3)
	SKIPE	KAILFL
	JRST	$PMPL1
	HRLZS	0
	HRR	0,MEMSIZ(3)
	PNTHW
	JRST	$PMPL2
$PMPL1:	PNT10
	MOVE	0,MEMSIZ(3)
	PNT10
$PMPL2:	MOVE	0,2
	AOS
	SUB	0,MEMSIZ+1(3)
	IDIVI	^D1024
	PNTDEC			;PRINT DECIMAL SIZE
	MOVEI	CRLF
	SKIPE	$ITRLV
	MOVEI	$XXX7
	PNTAL
	AOS	3
	AOJA	3,$PMAPL	;GET NEXT IF ANY
$PMAP2:	SKIPN	$ITRLV		;INTERLEAVING ERROR ?
	JRST	$PMAP4		;NO
	SETZB	0,3
$PMP1:	SKIPN	2,MEMSZ1(3)
	JRST	$PMP2
	MOVE	0,MEMSZ1+1(3)
	SKIPE	KAILFL
	JRST	$PMPL3
	HRLZS	0
	HRR	0,MEMSZ1(3)
	PNTHW
	JRST	$PMPL4
$PMPL3:	PNT10
	MOVE	0,MEMSZ1(3)
	PNT10
$PMPL4:	MOVE	0,2
	AOS
	SUB	0,MEMSZ1+1(3)
	IDIVI	^D1024
	PNTDEC
	MOVE	4,3
	LSH	4,-3
	MOVEI	$ASPNT(4)
	PNTA
	MOVEI	CRLF
	PNTA
	AOS	3
	AOJA	3,$PMP1

$PMP2:	CAIE	3,1400
	JRST	.-2
	MOVEI	[ASCIZ/
MAPPING ERROR; MEMORY INTERLEAVING ?
/]
	PNTALF
	MOVEI	[ASCIZ/
MAPPING ERROR; NON-CONSECUTIVE MEMORY MODULES ?
/]
	SKIPE	$SEGM
	PNTALF
	ERRHLT
	HALT	BEGIN
$PMAP4:	SKIPN	$SEGM
	JRST	@$ACB0
	SOS	3
	MOVE	2,MEMSIZ(3)
	MOVEM	2,MEMSIZ
	MOVEI	[ASCIZ/
MAPPING ERROR; NON-CONSECUTIVE MEMORY MODULES ?
/]
	JRST	$MERR+1
$MERR:	MOVEI	[ASCIZ/
MAPPING ERROR; NON-X-MEMORY BELOW 8K ?
/]
	PNTALF
$MAPEX:	ERRHLT
	HALT	BEGIN

$ASPNT:	ASCII/	XXX6/
	ASCII/	XXX5/
	ASCII/	XXX4/
$XXX7:	ASCIZ/	XXX7
/
>
	XLIST
	IFDEF	UUOS,<LIST
SUBTTL	UUO HANDLING SUBROUTINE, X00R, DECEMBER 6,1971

	IFNDEF	SLDCDE,<
UUORTN:	0			;TO PROVIDE SOLID CODE MOVE THIS>
$UORTN:	SKIPE	$UOREC#		;A RECURSIVE UUO ?
	JRST	$UUOER		;YES, ILLEGAL
	SETOM	$UOREC		;SET DOING UUO FLAG
	MOVEM	0,$UOAC0#	;SAVE AC0
	MOVE	UUORTN
	MOVEM	$SVUPC#
	MOVE	JOBUUO
	MOVEM	$SVUUO#
	LSH	-^D27
	CAILE	37		;UUO IN CORRECT RANGE ?
	JRST	$UUOER		;NO
	ADD	[JRST @UUODIS]
	MOVEM	$UUOGO
	MOVE	$UOAC0
	IFDEF	PSHLST,<
	PUSH	%P,UUORTN	;MAKE RECURSIVE
	SETZM	$UOREC	>
$UUOGO:	JRST	@UUODIS		;DISPATCH TO UUO ROUTINE

;UUO EXIT ROUTINE

UUOSKP:	AOS	UUORTN		;SKIP RETURN, +2
	IFDEF	PSHLST,<
	AOS	(%P)	>

UUOEXT:	SETZM	$UOREC		;CLEAR DOING UUO FLAG
	IFDEF	PSHLST,<
	RTN		>
	JRST	2,@UUORTN	;RESTORE FLAGS AND EXIT
;ILLEGAL OR UNCODED UUO ROUTINE

$UUOER:	MOVEI	PGMNAM
	SKIPGE	MONCTL
	PNTALF
	MOVEI	[ASCIZ/
ILLEGAL UUO EXECUTED
UUO            FLAGS      PC    PROG
/]
	PNTALF			;PRINT HEADER
	MOVE	$SVUUO
	PNTHWF			;PRINT UUO
	MOVEI	SPACE
	PNTAF
	MOVE	$SVUPC
	SOS
	PNTHWF			;PRINT FLAGS, PC
	IFDEF	PSHLST,<
	MOVEI	SPACE
	PNTAF
	HRRZ	0,(%P)
	SUBI	0,1
	PNT6F			;PRINT LAST PUSHJ ENTRY>
	MOVEI	CRLF2
	PNTAF
$UORTX:	JRST	.+1		;TO ADD ROUTINE, PLACE JRST HERE
	ERRHLT
	JRST	@UUORTN
;UUO DISPATCH TABLE

UUODIS:	$UUOER			;ILL UUO, 0
	$UUOER			;UUO 1
	$UUOER			;UUO 2
	$UUOER			;UUO 3
	$UUOER			;UUO 4
	$UUOER			;UUO 5
	$UUOER			;UUO 6
	$UUOER			;UUO 7
	$UUOER			;UUO 10
	$UUOER			;UUO 11
	$UUOER			;UUO 12
	$UUOER			;UUO 13
	$UUOER			;UUO 14
	$UUOER			;UUO 15
	$UUOER			;UUO 16
	$UUOER			;UUO 17
	$UUOER			;UUO 20
	$UUOER			;UUO 21
	$UUOER			;UUO 22
	$UUOER			;UUO 23
	$UUOER			;UUO 24
	$UUOER			;UUO 25
	$UUOER			;UUO 26
	$UUOER			;UUO 27
	$UUOER			;UUO 30
	$UUOER			;UUO 31
	$UUOER			;UUO 32
	$UUOER			;UUO 33
	$UUOER			;UUO 34
	$UUOER			;UUO 35
	$UUOER			;UUO 36
	$UUOER			;UUO 37


;UUO INITIALIZATION

$UUOIN:	MOVEM	0,$ACB0
	MOVE	[JSR	UUORTN]
	MOVEM	JOB41		;SETUP UUO TRAP
	SETZM	$UOREC
	JRST	@$ACB0

>

	XLIST
	IFDEF	TOGGLE,<LIST
SUBTTL	CONSOLE DATA SWITCH INPUT SUBROUTINE, X00R, DECEMBER 6,1971

;INPUT CONSOLE SWITCHES IN EXEC MODE OR IN USER MODE IF NON-TTY SWITCH CONTROL

$SWTCH:	MOVEM	0,$SACA0#
	SETZ	0,
	JRST	@$SACA0

;SWITCH INITIALIZATION ROUTINE

$SWTIN:	MOVEM	0,$ACB0#
	SETZM	$USWTF#		;CLEAR TTY CONTROL FLAG
	SKIPN	USER		;USER MODE ?
	JRST	$SWIN1		;NO, EXEC MODE
	IFNDEF	USRASB,<ERRHLT >
	IFDEF	USRASB,<JRST $SWINT >

$SWIN1:	SWITCH
	TLNN	PNTLPT		;PRINT ON LPT/LOGICAL DEVICE ?
	JRST	@$ACB0		;NO
	MOVEI	PGMNAM
	PNTAL			;YES, IDENTIFY OUTPUT FILE
	MOVEI	[ASCIZ/
DATA SWITCHES = /]
	PNTAL
	MOVE	CONSW
	PNTHW			;PRINT PRESENT SWITCH SETTINGS
	MOVEI	CRLF2
	PNTA
	JRST	@$ACB0

	XLIST
	IFDEF	USRASB,<LIST
;SWITCH USER MODE INITIALIZATION ROUTINE

$SWINT:	SKIPGE	MONCTL		;SYS EXERCISER MODE ?
	JRST	$SWIN2		;YES
$SW1:	MOVEI	[ASCIZ/
TELETYPE SWITCH CONTROL ? - 0,S,Y OR N <CR> - /]
	PNTALF			;ASK FOR SWITCH CONTROL MODE
	TTICHR
	JRST	$SW1
	LSH	0,7		;POSITION 1ST CHAR
	MOVEM	$SW#
	TTICHR
	JRST	$SW1
	OR	0,$SW
	MOVEM	0,$SW
	CAIN	0,14015		;"0" (CR)
	JRST	$SW5
	CAIN	0,24615		;"S" (CR)
	JRST	$SW6
	CAIN	0,26215		;"Y" (CR)
	JRST	$SW2
	CAIN	0,23415		;"N" (CR)
	JRST	$SWIN1
	TTCALL	11,0		;ERROR, CLEAR TYPE-IN BUFFER
	JRST	$SW1

$SW6:	MOVE	0,$SVCSW	;"S", USE PREVIOUSLY SET SWITCHES
	JRST	$SW4

$SW2:	MOVEI	[ASCIZ/
SPECIFY LH SWITCHES IN OCTAL - /]
	PNTALF
	TTIOCT			;INPUT 6 OCTALS
	JRST	$SW2		;ERROR
	HRLZM	0,$SW#		;MOVE LH WORD TO SW
$SW3:	MOVEI	[ASCIZ/SPECIFY RH SWITCHES IN OCTAL - /]
	PNTALF
	TTIOCT			;INPUT 6 OCTALS
	JRST	$SW3		;ERROR
	HLL	0,$SW		;GET LH SWITCHES
$SW4:	MOVEM	0,CONSW		;SAVE SWITCHES IN CONSW
$SW5:	SETOM	$USWTF		;SET TTY INPUT SWITCH FLAG
	JRST	$SWIN1

$SWIN2:	MOVE	0,SWTEXR	;GET SYS EXER SWITCHES
	JRST	$SW4
>>
	XLIST
	IFDEF	TYPIN,<LIST
SUBTTL	TELETYPE INPUT SUBROUTINE, X00R, DECEMBER 6,1971
;CARRIAGE RETURN OR COMMA TERMINATES OCTAL, DECIMAL, OR CONVERT TYPE-IN.
;CHARACTER OR NUMBER RETURNED IN AC0.
;OPERATOR WAIT TIME (OPTIME) INITIALIZED
;AS NUMBER OF SECONDS OF WAIT TIME IN EXEC MODE.
;CALL SEQUENCE IS AS FOLLOWS:
;	JSP	NAME
;	NO/ERROR RESPONSE RETURN
;	NORMAL RESPONSE RETURN
;$OPTLK =	INPUT ANY CHARACTER
;$YESNO =	ASK QUESTION, CORRECT RESPONSE Y
;$NOYES =	ASK QUESTION, CORRECT RESPONSE N
;$TPOCT =	INPUT UP TO 12 OCTALS
;$TPDEC =	INPUT UP TO 11 DECIMALS
;$TPCNV =	INPUT UP TO 9 CONVERT'S
;$TTLK =	KEYBOARD CHECK, INPUT ANY CHARACTER
;$TALTM =	KEYBOARD, ALT-MODE CHECK

;TELETYPE INPUT INITIALIZATION

$TYPIN:	MOVEM	0,$ACB0
	MOVEI	^D180
	MOVEM	OPTIME#		;INIT OPERATOR WAIT TIME AS 180 SEC.
	SKIPG	KAILFL		;IF A KL10
	JRST	@$ACB0
	SETZM	DTEEPW		;INIT SECONDARY PROTOCALL
	SETZM	DTEMTI
	SETZM	DTEFLG
	MOVEI	0,.DTMMC
	MOVEM	0,DTECMD
	CONO	DTE,TO11DB	;TELL THE 11
	SKIPN	DTEFLG
	JRST	.-1		;WAIT UNTIL THE 11 KNOWS
	JRST	@$ACB0

;TELETYPE KEYBOARD CHECK ROUTINE
;CHECKS FOR ANY KEY STRUCK, RETURNS IMMEDIATELY
;RETURNS +1 IF NO TYPEIN, RETURNS +2 IF CHAR TYPED

$TTLK:	MOVEM	0,$TACA0
	SETZM	0
	SKIPGE	MONCTL		;NO CHECK IF MONITOR
	JRST	@$TACA0
	SKIPN	USER		;EXEC MODE ?
	JRST	$HEAR+3		;GO CHECK AND INPUT, EXEC MODE
$TTLK1:	TTCALL	2,0
	JRST	@$TACA0		;NO CHAR
	JRST	$TTUSR+1	;CHAR WAS TYPED

;TELETYPE ALT-MODE CHECK ROUTINE

$TALTM:	MOVEM	0,$TALT0#
	TTLOOK
	JRST	$TALT1+1	;NO TYPE-IN
	CAIE	175
	CAIN	176
	JRST	$TALT1		;ALT-MODE
	CAIE	33
	SKIPA
$TALT1:	AOS	$TALT0		;ALT-MODE, RETURN + 2
	JRST	@$TALT0
;TELETYPE INPUT OPERATOR RESPONSE ROUTINE
;ALLOWS WAIT OF N SECONDS FOR TYPE-IN
;IF NO RESPONSE, RETURNS +1, NORMAL RETURN +2
$OPTLK:	MOVEM	0,$TACB0#
	MOVEM	4,$TACB4#	;SAVE AC
	JSP	$HEAR		;NO, INPUT FROM TTY
	JRST	.-1		;NO RESPONSE, REPEAT
	AOS	$TACB0		;CHAR TYPED, RETURN +2
	MOVE	4,$TACB4
	JRST	@$TACB0

;TELETYPE INPUT CHARACTER ROUTINE
$HEAR:	MOVEM	0,$TACA0#
	SKIPE	USER		;EXEC MODE ?
	JRST	$TTUSR		;NO..USER MODE INPUT
	JSR	$TYI		;KEY BEEN STRUCK?
	JRST	@$TACA0		;NO
	JSR	$TYO		;ECHO CHAR
	ANDI	0,177
	CAIE	0,15		;IS IT CR ?
	JRST	.+4		;NO
	MOVEM	0,$CHRIN#	;SAVE CHAR
	MOVEI	0,012		;ECHO LF
	JSR	$TYO
	MOVE	0,$CHRIN	;RESTORE CHAR
	CAIN	0,003		;IS IT ^C ?
	JRST	$HEAR1		;YES, TERMINATE
$HEAR2:	JRST	.+3
$TTUSR:	TTCALL	0,0		;INPUT TTY, USER MODE
	ANDI	0,177		;CLEAR PARITY BIT
	CAIL	0,"A"+40	;CONVERT TO UPPER CASE
	CAILE	0,"Z"+40
	CAIA
	SUBI	0,40
	MOVEM	0,$CHRIN	;SAVE CHARACTER
	SKIPN	USER
	JRST	.+4
	CAIN	0,15		;IS IT CR ?
	TTCALL	0,0		;YES, GET RID OF LF
	MOVE	0,$CHRIN	;RESTORE CHARACTER
	AOS	$TACA0
	JRST	@$TACA0		;RETURN +2
	MOVEM	0,JOBOPC	;2-TERMINATED IN JOBOPC
	JRST	@CNTLC		;3-TERMINATE
$HEAR1:	JSP	0,.-2		;1-SAVE PC WHERE
	JRST	$HEAR2		;4-HERE IF CONTINUED
;YES/NO TYPE-IN ROUTINE
;ACCEPTS Y OR N
;FOR YESNO, Y IS SKIP RETURN, CARRAGE RETURN IS DIRECT RETURN
;FOR NOYES, N IS SKIP RETURN, CARRAGE RETURN IS DIRECT RETURN
;'Y OR N <CR> - ' ASKED UPON ENTRY

$NOYES:	MOVEM	0,$TACC0#
	MOVEI	0,1		;INIT FOR N ANSWER
	JRST	.+3
$YESNO:	MOVEM	0,$TACC0
	MOVEI	0,0		;INIT FOR Y ANSWER
	MOVEM	1,$TACC1#
	MOVEM	2,$TACC2#
	MOVE	2,0
$YN1:	SETZM	$PTINH
	TTICHR			;INPUT FROM TTY
	JRST	$YN2		;NO RESPONSE
	CAIN	0,"Y"		;IS IT A 'Y' ?
	TRCA	2,1	;YES-COMPLIMENT RETURN
	CAIN	0,"N"		;OR AN 'N' ?
	CAIA			;YES
	JRST	$YN5		;NEITHER, CR?
	TTICHR
	JRST	$YN2
$YN5:	CAIE	0,15
	JRST	$YN3
	ADDM	2,$TACC0
$YN2:	MOVE	2,$TACC2
	MOVE	0,1
	MOVE	1,$TACC1
	JRST	@$TACC0

$YN3:	SKIPE	USER
	TTCALL	11,0		;IF USER, CLEAR TYPE-IN BUFFER
	MOVEI	CRLF
	PNTAF
	MOVEI	[ASCIZ/Y OR N /]
	PNTALF
	JRST	$YN1

$YN4:	26215			;'Y' (CR)
	23415			;'N' (CR)
	26215			;'Y' (CR)
;OCTAL-DECIMAL-CONVERT TYPE-IN ROUTINE
;ACCEPTS 0 TO 12 OCTALS, 0 TO 11 DECIMALS, 0 TO 9 CONVERT CHARACTERS
;NUMBER RETURNED IN AC0.

$TPCNV:	MOVEM	0,$TACD0#
	MOVEI	2		;SET INDEX TO CONVERT
	JRST	.+6
$TPDEC:	MOVEM	0,$TACD0
	MOVEI	1		;SET INDEX TO DECIMAL
	JRST	.+3
$TPOCT:	MOVEM	0,$TACD0
	MOVEI	0		;SET INDEX TO OCTAL
	MOVEM	1,$TACD1#	;SAVE AC'S
	MOVEM	2,$TACD2#
	MOVEM	3,$TACD3#
	MOVE	3,0
	SETZB	1,2		;CLEAR DATA REG, CHAR COUNTER
	SETZM	$TYPNB#		;CLEAR ERR NUMBER
	SETZM	$NEGF#		;CLEAR NEGATE FLAG
	SETZM	$CNVD#		;CLEAR DECIMAL CONVERT FLAG

;INPUT AND COMPUTE NUMBER

$TYPLP:	TTICHR			;INPUT FROM TTY
	JRST	$TPERR		;NO RESPONSE, GO TO ERROR EXIT
	CAIN	0,"-"		;IS IT MINUS ?
	JRST	$NEGX		;YES
	CAIN	0,"."		;IS IT PERIOD ?
	JRST	$CNVX		;YES
	CAIN	0,15		;IS IT CR ?
	JRST	$TPEXT		;YES
	CAIN	0,","		;IS IT COMMA ?
	JRST	$TPEXT		;YES
	CAIL	0,"0"		;A VALID DIGIT ?
	XCT	$TPCK(3)
	JRST	$TPERR		;NO
	AOS	2		;INCREMENT CHARACTER COUNTER
	XCT	$TPMUL(3)	;MULT BY OCTAL/DECIMAL BASE, SHIFT CONVERT
	SUBI	60		;ADD IN NEW CHAR
	ADD	1,0
	JRST	$TYPLP		;REPEAT TILL CR OR COMMA
;CHECK FOR PROPER AMOUNT OF CHARACTERS

$TPEXT:	XCT	$TPNBR(3)	;PROPER NUMBER OF CHARACTERS
	JRST	$TPERR		;NO
	CAIN	3,2		;CONVERT ?
	JRST	$CNVX1		;YES
$TPEX1:	MOVE	3,$TACD3	;RESTORE AC'S
	MOVE	2,$TACD2
	MOVE	0,1		;PUT NUMBER IN AC0
	SKIPE	$NEGF		;NEGATE ?
	MOVN	0,1		;YES
	MOVE	1,$TACD1
	AOS	$TACD0
	JRST	@$TACD0		;RETURN +2

$TPERR:	MOVE	3,$TACD3	;ERROR EXIT
	MOVE	2,$TACD2
	MOVEM	1,$TYPNB	;SAVE NUMBER
	MOVE	1,$TACD1
	JRST	@$TACD0

;NUMBER COMPUTING CONSTANTS

$TPCK:	CAILE	0,"7"		;OCTAL NUMBER CHECK
	CAILE	0,"9"		;DECIMAL NUMBER CHECK
	CAILE	0,"9"		;CONVERT NUMBER CHECK
$TPMUL:	IMULI	1,^D8		;OCTAL BASE MULTIPLIER
	IMULI	1,^D10		;DECIMAL BASE MULTIPLIER
	LSH	1,4		;CONVERT SHIFT
$TPNBR:	CAILE	2,^D12		;ACCEPT UP TO 12 OCTALS
	CAILE	2,^D11		;ACCEPT UP TO 11 DECIMALS
	CAILE	2,^D9		;ACCEPT UP TO 9 CONVERT
$NEGX:	SKIPE	2		;1ST CHAR ?
	JRST	$TPERR		;NO, ERROR
	SETOM	$NEGF		;YES, SET NEGATE FLAG
	JRST	$TYPLP		;GET NEXT CHAR

$CNVX:	CAIE	3,2		;PERIOD, IN CONVERT ?
	JRST	$TPERR		;NO, ERROR
	SETOM	$CNVD		;YES, SET DECIMAL FLAG
	JRST	$TYPLP		;GET NEXT CHAR

;CONVERT CONVERSION ROUTINE

$CNVX1:	MOVEI	2,^D9		;NINE DIGITS
	SETZM	0
	SKIPE	$CNVD		;OCTAL OR DECIMAL ?
	JRST	$CNVX2		;DECIMAL
	TDNE	1,[421042104210]	;OCTAL
	JRST	$TPERR		;OCTAL ERROR, 8 OR 9 INPUT
	LSH	1,1		;SQUEEZE OUT 4TH BIT
	LSHC	0,3		;COMPACT INTO OCTAL
	SOJN	2,.-2		;COMPLETED ?
	MOVE	1,0
	JRST	$TPEX1

$CNVX2:	SETZM	3		;DECIMAL
	SETZM	0
	IMULI	3,^D10		;MULTIPLY BY DECIMAL BASE
	LSHC	0,4		;UNPACK NEXT DIGIT
	ADD	3,0		;ADD IN
	SOJN	2,.-4		;COMPLETED ?
	MOVE	1,3
	JRST	$TPEX1
>
	XLIST
	IFDEF	SIXIN,<LIST
SUBTTL	SIXBIT TYPE-IN SUBROUTINE, X00R, DECEMBER 6,1971

;TELETYPE SIXBIT INPUT ROUTINE
;INPUTS UP TO SIX CHARACTERS, TERMINATES WITH A CR OR COMMA.
;SIXBIT WORD RETURNED IN AC0

$TSIXB:	MOVEM	0,$TSX0#
	MOVEM	1,$TSX1#
	MOVEM	2,$TSX2#
	MOVE	2,[POINT 6,1]
	MOVEI	1,0
$TSXB1:	TTICHR
	JRST	$TSXB3		;NO RESPONSE
	CAIN	0,15
	JRST	$TSXB2		;CR, TERMINATE
	CAIN	0,","
	JRST	$TSXB2		;COMMA, TERMINATE
	CAIL	0,"0"
	CAILE	0,"Z"
	JRST	$TSXB3		;ERROR
	CAILE	0,"9"
	CAIL	0,"A"
	CAIA			;ALPHA-NUMERIC
	JRST	$TSXB3		;ERROR
	TRC	0,40		;CONVERT TO SIX-BIT
	TRNE	1,77
	JRST	$TSXB3		;TOO MANY CHAR'S
	IDPB	0,2		;PUT INTO WORD
	JRST	$TSXB1		;REPEAT

$TSXB2:	AOS	(P)		;RETURN + 2

$TSXB3:	MOVE	0,1		;SIXBIT WORD IN AC0
	MOVE	1,$TSX1
	MOVE	2,$TSX2
	RTN
>
	XLIST
	IFDEF	SIXOUT,<LIST
SUBTTL	SIXBIT PRINT SUBROUTINE, X00R, DECEMBER 6,1971

;PRINTS SIXBIT WORD IN AC0

$PTSXF:	MOVEM	2,$PTSX2#
	MOVEI	2,1		;SETUP FORCED PRINT INDEX
	JRST	.+3

$PNTSX:	MOVEM	2,$PTSX2
	MOVEI	2,0		;SETUP NORMAL PRINT INDEX
	MOVEM	1,$PTSX1#
	MOVE	1,0		;PUT SIXBIT WORD IN AC1

$PTSX4:	MOVEI	0,0
	LSHC	0,6		;GET NEXT CHAR INTO AC0
	ADDI	0,40		;CONVERT TO ASCII
	LSH	0,^D29		;POSITION
	MOVEM	0,$PTSX3#	;SAVE
	MOVEI	0,$PTSX3	;SETUP ADDRESS
	XCT	$PTSXI(2)	;PRINT
	JUMPN	1,$PTSX4	;LOOP TILL ALL PRINTED
	RTN			;EXIT

$PTSXI:	PNTA			;PRINT ASCII
	PNTAF			;PRINT ASCII FORCED

>
	XLIST
	IFDEF	PRINT,<LIST
SUBTTL	PRINT SUBROUTINE, X00R, DECEMBER 6,1971

;THIS IS A SUBROUTINE THAT PRINTS ASCII MESSAGES, DECIMAL NUMBERS
;OR A DESIGNATED AMOUNT OF OCTAL DIGITS.
;YOU ENTER THIS ROUTINE WITH AC0 CONTAINING THE ADDRESS OF THE ASCII
;MESSAGE OR THE OCTAL OR DECIMAL NUMBERS TO BE PRINTED.

;THE FOLLOWING MISCELLANEOUS PRINT CHARACTERS ARE INCLUDED
;TO FACILITATE PRINTING AND ARE CALLED AS FOLLOWS:
;	MOVEI	NAME
;	PNTA		;OR PNTAF
CRLF:	ASCII/
/
CRLF2:	ASCII/

/
COMMA:	ASCII/,/
PERIOD:	ASCII/./
SPACE:	ASCII/ /
TAB:	ASCII/	/
MINUS:
HYPEN:	ASCII/-/
PLUS:	ASCII/+/
AST:	ASCII/*/
ATSIN:	ASCII/@/
LFP:	ASCII/(/
RTP:	ASCII/)/
BELL:	XWD	034000,0
QUEST:	ASCII/?/
SLASH:	ASCII!/!
DOLLAR:	ASCII/$/

;PRINT SUBROUTINE INITIALIZATION
;INITIALIZES CONTROL WORDS, AND TTY IF IN USER MODE

$PNTIN:	MOVEM	0,$ACB0#
	SETZM	$TYOFF#		;CLEAR TTY INITED FLAG
	SETZM	$DVOFF#		;CLEAR DEVICE INITED FLAG
	SETZM	PDISF#		;CLEAR PRINT DISABLED FLAG
	SETZM	$PTINH#		;CLEAR PRINT 'TYPE-IN INHIBIT' FLAG
	SETZM	PNTFLG#		;CLEAR IN PRINT FLAG
	SETOM	PNTSPC#		;SET PRINT SPACE FLAG
	MOVNI	0,^D5000	;SET PRINT ENABLE TO 5000 LINES
	MOVEM	0,PNTENB
	SKIPE	USER		;EXEC MODE ?
	JSP	$USERM		;NO, USER MODE TTY INIT
	JRST	@$ACB0
	IFNDEF	SLDCDE,<
$PRNTF:	0			;TO PROVIDE SOLID CODE, MOVE THIS>
$PNTIF:	SETOM	PNTFLG		;SET IN PRINT FLAG
	MOVEM	0,$PACA0#	;FORCE PRINTOUT
	MOVE	0,$PRNTF
	MOVEM	0,$PRINT
	SETOM	$PNTTY#
	JRST	$PNTIA
	IFNDEF	SLDCDE,<
$PRINT:	0			;TO PROVIDE SOLID CODE, MOVE THIS>
$PNTIT:	SETOM	PNTFLG		;SET IN PRINT FLAG
	MOVEM	0,$PACA0	;SAVE AC 0
	SETZM	$PNTTY
	SKIPL	PNTENB#
	JRST	$PNTIB		;DON'T PRINT OVER 5000(10) LINES
	MOVE	0,CONSW
	IFDEF	TOGGLE,<
	SWITCH			;READ DATA SWITCHES >
	TLNN	0,NOPNT		;NO PRINT SWITCH SET
	JRST	.+3
	MOVE	0,$PACA0
	JRST	@$PRINT

;DETERMINE PRINT MODE
$PNTIA:	MOVEM	1,$PACA1#	;SAVE AC1.
	MOVEM	2,$PACA2#	;SAVE AC2.
	MOVEM	3,$PACA3#	;SAVE AC3.
	MOVEM	4,$PACA4#	;SAVE AC4.
	MOVE	0,$PACA0	;RESTORE AC0
	SETZM	$PNT#		;CLEAR PRINT HALF WORDS FLAG
	MOVE	1,$PRINT	;MOVE C(JSR+1) INTO AC1.
	MOVE	2,-1(1)		;MOVE THE JSR INTO AC2.
	ROT	2,15		;GET X
	ANDI	2,17		;OUT OF THE JSR.
	CAIN	2,17		;X=17?
	JRST	$ASCPN-1	;YES. PRINT MORE THAN 1 WORD.
	JUMPE	2,$ASCPN	;X=0? YES. GO PRINT 1 WORD.
	CAIN	2,15		;X=15?
	JRST	$DECPN		;YES, PRINT DECIMALS
	CAIN	2,16		;X=16?
	JRST	$DECSP		;YES, PRINT DECIMALS, LEADING SPACES
	CAIN	2,13		;X=13?
	JRST	$PNTI3		;YES, PRINT OCTALS, 6 SP 6
;OCTAL PRINTOUT ROUTINE
;PRINTS NUMBER IN AC0
$PNTI1:	MOVE	3,2		;MOVE X INTO AC3.
	ROT	0,-3		;ROT OCTAL NUM 3 PLACES
	SOJN	3,.-1		;X AMOUNT OF TIMES.
$PNTI2:	MOVEI	1,6		;PUT 6 INTO AC1 SO THAT
	ROTC	0,3		;C(AC1) AFTER THE ROTC WILL BE 60
	JSP	3,$TOUT		;PLUS NUMBER TO BE PRINTED..GO PNT NUM.
	SOJN	2,$PNTI2	;SUB 1 FROM X...PRINT UNTIL X=0.
	MOVEM	1,$PNTSV#	;SAVE NUMBER
	SKIPN	PNTSPC
	JRST	.+3
	MOVEI	1,40		;AT THIS POINT WE HAVE PRINTED
	JSP	3,$TOUT		;X AMOUNT OF NUMBER(S) AND NOW A SPACE.
	SKIPN	$PNT#		; PRINT 6 SP 6 FLAG SET?
	JRST	$PNTI4		;NO, EXIT
	MOVE	1,$PNTSV	;RESTORE NUMBER
	MOVEI	2,6		;SETUP FOR 2ND HALF
	SETZM	$PNT		;CLEAR PRINT SPACE FLAG
	JRST	$PNTI2		;PRINT REST OF NUMBER

$PNTI3:	MOVEI	3,14		;SETUP FOR LH WORD
	MOVEI	2,6		;SETUP FOR FIRST HALF
	SETOM	$PNT		;SET PRINT 6 SP 6 FLAG
	SETOM	PNTSPC
	JRST	$PNTI1+1	;PRINT FIRST HALF NUMBER

;PRINT ROUTINE EXIT
$PNTI4:	SETZM	$PNTTY
	MOVE	0,$PACA0	;RESTORE AC0.
	MOVE	1,$PACA1	;RESTORE AC1.
	MOVE	2,$PACA2	;RESTORE AC2.
	MOVE	3,$PACA3	;RESTORE AC3.
	MOVE	4,$PACA4	;RESTORE AC4.
	SETZM	PNTFLG		;CLEAR IN PRINT FLAG
	JRST	@$PRINT		;RETURN.

$PNTIB:	SKIPE	PDISF#		;FIRST TIME PRINT DISABLED
	JRST	@$PRINT		;NO
	SETOM	PDISF
	MOVEM	1,$PACA1	;SAVE AC'S
	MOVEM	2,$PACA2
	MOVEM	3,$PACA3
	MOVEM	4,$PACA4
	SETOM	$PNTTY
	MOVEI	[ASCIZ/
**********
EXCEEDED ALLOWED PRINTOUTS, ONLY FORCED PRINTOUTS FROM THIS POINT
**********
/]
	JRST	$ASCPN-1	;PRINT ASCII
;ASCII PRINTOUT ROUTINE
;PRINTS ASCII WHOSE ADDRESS IS IN AC0

	SETOM	$PNT#		;SET PRINT MORE THAN 1 WORD FLAG.
$ASCPN:	MOVEM	0,$POINT#	;SAVE ADDRESS OF ASCII MESSAGE.
$ASCP1:	MOVEI	2,5		;5 = NUM OF ASCII CHAR. IN A WORD.
	MOVE	0,@$POINT	;C(AC0) = FIRST WORD OF ASCII MESS.
$ASCP2:	SETZ	1,		;CLEAR AC1.
	ROTC	0,7		;C(AC1) = CHAR TO BE PRINTED.
	JUMPE	1,$PNTI4	;CHAR = 0?..NO MORE CHAR..LEAVE.
	JSP	3,$TOUT		;PRINT A CHAR.
	SOJN	2,$ASCP2	;PNT ALL CHAR FROM THIS WORD?
	AOS	$POINT		;YES. INC TO GET NEXT WORD.
	SKIPN	$PNT		;PNT MORE THAN ONE CHAR FLAG SET?
	JRST	$PNTI4		;NO..LEAVE.
	JRST	$ASCP1		;YES...RETURN TO PNT NEXT WORD.

;DECIMAL PRINTOUT ROUTINE
;PRINTS NUMBER IN AC0

$DECSP:	SETOM	$PNT		;SET LEADING SPACES PRINT CONTROL
$DECPN:	MOVEM	17,$PAC17#	;SAVE AC17
	MOVE	17,$PLST	;SETUP PUSH LIST
	PUSHJ	17,$RADIX	;GO TO DECIMAL-ASCII CONVERSION
	MOVE	17,$PAC17	;RESTORE AC17
	JRST	$PNTI4

$RADIX:	MOVEI	2,^D10		;SETUP DIGIT COUNTER
	LSHC	0,-^D35		;SHIFT RIGHT 35 BITS INTO AC1
	LSH	1,-1		;VACATE AC1 SIGN BIT
$DCCMP:	DIVI	0,^D10		;DIVIDE DOUBLE LENGTH INTERGER BY 10
	HRLM	1,(17)		;SAVE DIGIT
	SOS	2		;COUNT DIGIT
	JUMPE	0,$LDSPS	;ALL DIGITS FORMED?
	PUSHJ	17,$RADIX+1	;NO, COMPUTE NEXT ONE
$DECP1:	HLRZ	1,(17)		;YES, RETRIEVE DIGIT
	ADDI	1,60		;CONVERT TO ASCII
	JSP	3,$TOUT		;TYPE-OUT
	POPJ	17,		;GET NEXT/EXIT

$LDSPS:	SKIPN	$PNT		;LEADING SPACES PRINT SET?
	JRST	$DECP1		;NO
$DCSPS:	SOJL	2,$DECP1	;SPACES COMPLETE ?
	MOVEI	1,40		;NO, PRINT LEADING SPACE
	JSP	3,$TOUT
	JRST	.-3		;CHECK FOR NEXT

;COMPUTE CHARACTER PARITY, COUNT LINES

$TOUT:	MOVEM	0,$PACB0#	;SAVE AC0.
	SKIPE	USER
	JRST	$TOUTB		;DON'T COMPUTE PARITY IN USER MODE
	XLIST
	IFDEF	EXCASB,< LIST
	JSR	$TYI		;KEY STRUCK ?
	JRST	$TOUTX		;NO
	ANDI	0,177
	CAIN	0,003		;IS IT ^C ?
	JRST	$TUTX2		;YES, TERMINATE
	IFDEF	ALTGO,<
	JSP	4,$TUTX1	;GO CHECK IF ALT-MODE
	JRST	.+2		;NO
	JRST	$TUTX3		;YES, GO TO USER'S ROUTINE >
	MOVEI	0,336		;^
	JSR	$TYO
	MOVEI	0,317		;O
	JSR	$TYO
	MOVEI	0,15
	JSR	$TYO
	MOVEI	0,12
	JSR	$TYO
	SETOM	$PTINH
$TOUTX:	SETZ	0,		;CLEAR AC0..USE AS BIT CNTR.
	MOVE	4,1		;PUT CHAR INTO AC4.
	ANDI	4,-1(4)		;THIS WILL CLEAR 1 BIT AT A TIME.
	SKIPE	4		;ALL THE BITS?
	AOJA	0,.-2		;NO. RETURN TO DO ANDI AGAIN.
	TRNN	0,1		;BIT CNTR ODD?
	TRC	1,200		;COMP HI ORDER BIT..EVEN PAR. >
	LIST
$TOUTB:	MOVE	CONSW
	AOS	$CARCT#		;INC CHAR CNTR.
	CAIE	1,215		;CHAR A CR?
	JRST	.+4		;NO
	SETZM	$PTINH
	AOS	PNTENB		;COUNT LINES, TILL NO MORE
	SETZM	$CARCT		;CLR CHAR CNTR.
	CAIN	1,12		;IS CHAR A LF?
	SETZM	$CARCT		;YES. CLR CHAR CNTR.
	SKIPE	$PNTTY
	JRST	.+3		;DON'T CHEK NON-PNT SW IF FORCED PRINTOUT
	TLNE	0,NOPNT		;IS NON PNT SWITCH ON?
	JRST	(3)		;YES. RETURN.
	SKIPE	USER		;EXEC MODE ?
	JRST	$TOUT2		;NO..USER MODE GO DO OUTPUT.
	JRST	$TOUTC		;YES
$TOUTA:	MOVE	0,$PACB0	;RESTORE AC0
	JRST	(3)		;RETURN


	IFDEF	EXCASB,<
	IFDEF	ALTGO,<
$TUTX1:	MOVEM	4,$TALT0
	JRST	$TALTM+3	>
	MOVEM	0,JOBOPC	;2-TERMINATED IN JOBOPC
	JRST	@CNTLC		;3-TERMINATE
$TUTX2:	JSP	0,.-2		;1-SAVE PC WHERE
	JRST	$TOUTX		;4-HERE IF CONTINUED
	IFDEF	ALTGO,<
	MOVEM	0,JOBOPC	;2-TERMINATED IN JOBOPC
	JRST	@ALTMGO		;3-TERMINATE
$TUTX3:	JSP	0,.-2		;1-SAVE PC WHERE
	JRST	$TOUTX		;4-HERE IF CONTINUED	>>
	IFNDEF	EXCASB,<$TOUTC:	ERRHLT	>
	IFNDEF	USRASB,<$USERM:	ERRHLT
	$TOUT2:	ERRHLT	>
	XLIST
	IFDEF	EXCASB,<LIST
;EXEC MODE CHARACTER OUTPUT

$TOUTC:	TLNE	0,PNTLPT	;PRINT ON LINE PRINTER ?
	JRST	$TOUT1		;YES
$PNTY1:	SKIPE	$PTINH		;TYPE-IN INHIBIT ?
	JRST	$TOUTA		;YES
	CAIN	1,11		;IS CHAR A TAB?
	JRST	$TABS		;YES. TURN TAB INTO SPACES.
	EXCH	0,1
	CAIE	0,215		;IS CHAR A CR ?
	JRST	.+2		;NO
	JSR	$TYO		;YES, OUTPUT CR CR
	JSR	$TYO		;PRINT A CHAR.
	JRST	$TOUTA

;EXEC MODE LPT OUTPUT
$TOUT1:	MOVEM	1,$PNTYC#	;SAVE CHAR
	LSH	1,1		;C(AC1) HAS TO BE LEFT JUSTIFIED.
	ANDI	1,376		;CLEAR PARITY BIT
	DATAO	LPT,1		;PRINT CHAR ONTO LPT.
	MOVEI	1,^D<<1000*500>/7>		;ABOUT 500 MS.
	CONSO	LPT,100		;LPT DONE?
	SOJG	1,.-1		;NO.
	SKIPN	$PNTTY		;SKIP IF MSG ALSO FORCED TO TTY
	JUMPG	1,$TOUTA	;RETURN IF LPT NOT HUNG, ELSE ALL TO TTY
	MOVE	1,$PNTYC
	JRST	$PNTY1

;TELETYPE TABS CONVERSION

$TABS:	SOS	1,$CARCT	;PUT CHAR CNT - 1 TAB INTO AC1.
	SUBI	1,10		;DIVIDE
	JUMPGE	1,.-1		;BY 10.
	MOVN	1,1		;C(AC1) NOW = NO. OF SPACES TO PNT.
	MOVEM	0,$PNTYC
	MOVEI	0,240
$TABS1:	JSR	$TYO		;SEND A SPACE.
	AOS	$CARCT		;INCREMENT CHAR CNTR.
	SOJG	1,$TABS1	;DECREMENT SPACES CNTR.
	MOVE	0,$PNTYC
	JRST	$TOUTA		;RETURN.
;TYPE OUT A CHARACTER IN AC 0

$TYO:	0
	SKIPG	KAILFL		;A KL?
	JRST	$TYO1		;NO
	ANDI	0,377
	ADDI	0,.DTMTO	;ADD COMMAND
	SETZM	DTEMTD
	MOVEM	0,DTECMD
	CONO	DTE,TO11DB	;WAKE THE 11
	SKIPN	DTEMTD		;WAIT UNTIL THE 11 GETS IT
	JRST	.-1
	JRST	@$TYO		;RETURN
$TYO1:	DATAO	TTY,0		;OUTPUT CHAR KA/KI STYLE
	CONSZ	TTY,20		;WAIT FOR DONE
	JRST	.-1
	JRST	@$TYO		;RETURN

;INPUT A CHARACTER AND SKIP IF A CHARACTER IS AVAILABLE
; CHARACTER IN AC 0

$TYI:	0
	SKIPG	KAILFL		;A KL?
	JRST	$TYI1		;NO
	SKIPN	DTEMTI		;A CHARACTER AVAILABLE?
	JRST	@$TYI		;NO, NON-SKIP RETURN
	SETZM	DTEMTI		;CLEAR FLAG
	MOVE	0,DTEF11	;GET THE CHARACTER
	JRST	$TYI2		;AND RETURN
$TYI1:	CONSO	TTY,40		;A KEY STRUCK?
	JRST	@$TYI		;NO, NON-SKIP RETURN
	DATAI	TTY,0		;READ THE CHARACTER
$TYI2:	AOS	$TYI		;SKIP
	JRST	@$TYI		;RETURN>

	XLIST
	IFDEF	USRASB,<LIST
;USER MODE TELETYPE OUTPUT

$TOUT2:	TLNE	0,PNTLPT	;IS LPT PRINT SWITCH UP ?
	JRST	$TOUT3		;YES, GO PRINT ON LOGICAL DEVICE
	DROPDV			;CLOSE DEV IF SWITCH CHANGED
	SKIPN	$TYOFF		;TTY BEEN INITED YET ?
	JSP	$USERM		;NO, GO DO IT
	AOS	@$OUTTY+1	;SETUP SO IT LOOKS FOR ONE WORD
	AOS	$OUTTY+1	;THIS POINTS TO WHERE CHAR IS PUT
	MOVE	0,$CARCT
	CAIN	0,1		;FIRST CHAR IN LINE ?
	JRST	$TOUT4		;YES
$TOUT5:	ROT	1,-7		;MAKE C(AC1) FIRST CHAR IN WORD
	MOVEM	1,@$OUTTY+1	;PUT CHAR IN BUFFER
	OUTPUT	$TTYCH,		;DO OUTPUT
	JRST	$TOUTA		;GO RESTORE AC0 AND RETURN

$TOUT4:	SKIPL	MONCTL		;SYSTEM EXERCISER
	JRST	$TOUT5		;NO
	MOVE	QUEST
	MOVEM	0,@$OUTTY+1	;PRECEDE LINE WITH ?
	OUTPUT	$TTYCH,
	AOS	@$OUTTY+1
	AOS	$OUTTY+1
	JRST	$TOUT5

;USER MODE LOGICAL DEVICE OUTPUT
$TOUT3:	SKIPN	$DVOFF		;DEVICE BEEN INITED YET ?
	JSP	$INTDV		;NO, GO DO IT
	JSP	$PUTCR		;GO OUTPUT CHAR
	IFDEF	DSKUPD,<
	SKIPN	$CARCT
	JSP	$ITDV1		;UPDATE, SETUP FOR INPUT/OUTPUT >
	SKIPN	$PNTTY		;SKIP IF MESSAGE ALSO FORCED TO TTY
	JRST	$TOUTA
	JRST	$TOUT2+3

;OUTPUT TO LOGICAL DEVICE

$PUTCR:	MOVEM	0,$PACC0#
	SOSG	$OBUF+2		;INCREMENT BYTE COUNT
	JRST	$PUTBF		;NO MORE ROOM, OR FIRST CALL AFTER INIT
$PTNXT:	IDPB	1,$OBUF+1	;STORE CHAR IN AC1
	JRST	@$PACC0		;RETURN
$PUTBF:	OUT	$DEVCH,		;CALL MONITOR TO EMPTY BUFFER
	JRST	$PTNXT
;TELETYPE INITIALIZATION, USER MODE

$USERM:	MOVEM	0,$ACC0#
	HLRZ	JOBSA
	CAIL	END
	JRST	.+4
	MOVE	[XWD END,BEGIN]
	MOVEM	JOBSA		;SETUP JOB DATA AREA
	HLRZM	JOBFF
	MOVEI	EXIT
	MOVEM	JOBREN		;SETUP REENTER TO CLOSE PRINT FILE
	INIT	$TTYCH,0	;TTY CHANNEL, ASCII MODE
	SIXBIT	/TTY/
	XWD	$OUTTY,0
	JRST	.-3
	OUTBUF	$TTYCH,1
	OUTPUT	$TTYCH,
	SETOM	$TYOFF		;SET TTY INITED FLAG
	JRST	@$ACC0

;LOGICAL DEVICE INITIALIZATION, PHY DEV ASSIGNED AT RUN TIME

$INTDV:	MOVEM	0,$PACD0#
	SETZM	$UPDTF#
	MOVE	0,PNTNAM	;SETUP LOGICAL OUTPUT FILE NAME
	MOVEM	0,$OUTNM
	IFDEF	DSKUPD,<
	MOVEM	$INNM		;SETUP LOGICAL FILE INPUT NAME >
	INIT	$DEVCH,0	;ASCII MODE, DEV CHANNEL
	SIXBIT	/DEV/		;LOGICAL DEVICE, LPT,DSK,DTAX
	XWD	$OBUF,		;OUTPUT ONLY
	JRST	$OERR1		;DEV NOT AVAIL, ERROR
	OUTBUF	$DEVCH,1	;SETUP OUTPUT BUFFER
	ENTER	$DEVCH,$OUTNM	;INIT OUTPUT FILE
	JRST	$OERR2		;NO DIR ROOM, ERROR
	SETOM	$DVOFF		;SET DEVICE INITED FLAG
	IFDEF	DSKUPD,<
	MOVE	0,[SIXBIT/DEV/]
	CALL	0,[SIXBIT/DEVCHR/]
	TLC	0,200007
	TLNE	0,776737	;IS DEVICE A DSK ?
	JRST	@$PACD0		;NO
	SETOM	$UPDTF		;YES	>
	JRST	@$PACD0
;USER MODE CLOSE FILE

$DRPDV:	MOVEM	0,$PACE0#
	SKIPN	$DVOFF		;DEVICE INITED?
	JRST	@$PACE0		;RETURN
	CLOSE	$DEVCH,		;CLOSE FILE
	STATZ	$DEVCH,740000	;RECHECK FINAL ERROR BITS
	TTCALL	3,[ASCIZ/
**********
ERROR DURING PRINT CLOSE FILE
**********
/]
	RELEAS	$DEVCH,		;RELINQUISH DEVICE, WRITE DIRECTORY
	SETZM	$DVOFF
	JRST	@$PACE0 

$OUTER:	TTCALL	3,[ASCIZ/
**********
ERROR DURING PRINT OUTPUT
**********
/]
	CALL	1,[SIXBIT/EXIT/]	;ERROR, QUIT 

$OERR1:	TTCALL	3,[ASCIZ/
LOGICAL DEVICE 'DEV' NOT ASSIGNED/]
	JRST	$OUTER

$OERR2:	TTCALL	3,[ASCIZ/
NO DIRECTORY ROOM/]
	JRST	$OUTER

	XLIST
	IFDEF	DSKUPD,<LIST
;UPDATE, REINIT FOR INPUT & OUTPUT (ONLY IF DSK)

$ITDV1:	MOVEM	0,$PACG0#
	SKIPN	$UPDTF
	JRST	@$PACG0
	DROPDV
	INIT	$DVCH1,0
	SIXBIT	/DEV/
	$IBUF
	JRST	$OERR1		;ERROR, DEV NOT ASSGND/AVAIL
	INBUF	$DVCH1,1
	LOOKUP	$DVCH1,$INNM
	JRST	$OERR3
	JSP	$INTDV		;REINIT OUTPUT FILE
	JSP	$GETCR		;INPUT/OUTPUT TILL EOF
	JSP	$PUTCR
	JRST	.-2		;CONT FROM HERE ON EOF
$INEOF:	SETOM	$DVOFF
	JRST	@$PACG0

$GETCR:	MOVEM	$PACF0#
$GETNX:	SOSLE	$IBUF+2		;DECREMENT BYTE COUNT
	JRST	$GETOK
	IN	$DVCH1,		;GET NEXT BUFFER
	JRST	$GETOK
	STATZ	$DVCH1,740000
	JRST	$OERR4		;ERROR
	JRST	$INEOF		;ASSUME END-OF-FILE

$GETOK:	ILDB	1,$IBUF+1	;GET CHARACTER FROM BUFFER
	JUMPN	1,@$PACF0	;RETURN IF NOT NULL
	JRST	$GETNX		;IGNORE NULL, GET NEXT CHAR

$OERR3:	TTCALL	3,[ASCIZ?
UPDATE LOOKUP/ENTER FAILURE?]
	JRST	$OUTER

$OERR4:	TTCALL	3,[ASCIZ/
UPDATE INPUT ERROR/]
	JRST	$OUTER
>>>
	LIST
SUBTTL	RESERVED STORAGE, X00R, DECEMBER 6, 1971

;END OF PROGRAM CONSTANTS
	LIT
ENDSLD:	0

;END OF PROGRAM VARIABLES
	XLIST
	IFDEF	PRINT,<
	IFDEF	USRASB,< LIST
$OUTTY:	BLOCK	3		;TTY OUTPUT BUFFER HEADER
$OBUF:	BLOCK	3		;LOGICAL FILE OUTPUT BUFFER HEADER
$OUTNM:	SIXBIT	/PRINT/		;FILE NAME
	SIXBIT	/PNT/		;FILE NAME EXTENSION
	BLOCK	2
	IFDEF	DSKUPD,<
$IBUF:	BLOCK	3
$INNM:	SIXBIT	/PRINT/
	SIXBIT	/PNT/
	BLOCK	2	>>
	LIST
$PLST:	XWD	$PLST-$PLSTE,$PLST
$PLSTS:	BLOCK	20
$PLSTE:	0	>

CNTLC:	BEGIN			;CONTROL C TERMINATION ADDRESS
ALTMGO:	BEGIN			;ALTMODE TERMINATION ADDRESS
MONSV:	BLOCK	540

	XLIST
	IFDEF	PSHLST,<LIST
PLIST:	XWD PLIST-PLISTE,PLIST
PLISTS:	BLOCK	PSHLST	;40 MIN
PLISTE:	0	>
	XLIST
	IFDEF	MEMMAP,<LIST
MEMSIZ:	BLOCK	400		;XXX7 INTERLV MAP STORAGE
MEMSZ1:	BLOCK	400		;XXX6 INTERLV MAP STORAGE
MEMSZ2:	BLOCK	400		;XXX5 INTERLV MAP STORAGE
MEMSZ3:	BLOCK	400		;XXX4 INTERLV MAP STORAGE
	0	>
	XLIST
	IFDEF	INTRPT,<LIST
POWER:	BLOCK	20	>
	XLIST
	IFDEF	DEBUG,<LIST
PATCH:	BLOCK	DEBUG	>
	PURGE	DEBUG
	LIST
;PROGRAM VARIABLE WORDS
	VAR
	XLIST
	IFDEF	PGMEND,<LIST
END:	0
END	>
	LIST