SAVJO3,	TAD	JOB		/DO WE HAVE A JOB #?
	AND	C0037
	SNA CLA
	JMP	SAVJO2		/NOT YET
	CLA IAC			/CORRECT THE CLOCK SINCE IT'S ALWAYS ONE BEHIND
	TAD	CLOCK		/ADD IN ANY TIME [S]HE HASN'T BEEN CHARGED FOR YET
	TAD	JOBTIM		/TO THE NUMBER OF TICKS [S]HE HAS ACCUMULATED
	DCA	JOBTIM		/NOW IT'S OK TO PUT HIM/HER AWAY
	CDF			/GET POINTER TO LOW ORDER RUNTIME
	GETJTW
	JOBRTM
	CLL
	TAD	JOBTIM		/# TICKS [S]HE USED
	DATFLD
	DCA I	JOBSWA		/SAVE THE NEW CUMULATIVE TIME
	ISZ	JOBSWA
	SZL			/OVERFLOW INTO HIGH ORDER?
	ISZ I	JOBSWA		/BUMP IT; WOULD NEED 16777216 TICKS FOR THIS TO SKIP!!
	TAD	SCHNEW		/WAS THIS JOB TO HAVE A FULL SLICE?
	TAD	JOBTIM		/ANY PART OF HIS/HER TIME SLICE STILL LEFT?
	SPA SNA CLA
	JMP	SAVJO2		/YES, SO THIS JOB IS NOT A COMPUTE BOUND JOB AT THIS STAGE
	TAD I	CJOBDA
	IAC			/STR0
	IOR			/MAKE HIM/HER COMPUTE BOUND
	JCOMBD
SAVJO2,	DCA	JOB		/SIMULATE NULJOB
	DATFLD
	DCA I	CJOBDA		/CLEAR POINTER TO CURRENT JOB DATA AREA
	CDF
	JMP I	SAVJO0		/AND EXIT

RUNULL,	SCHNUL
DEBUG,				/RESTART FOR DEBUGGING
IFZERO DC08A	<
	IFZERO CPU-1	<	/SET PDP-8 CLOCK COUNT
	STA
	CCF CLB	>
IFNZRO CPU-4 <CECI>
IFZERO CPU-4 <IAC
	CLLE
	CLA>>
IFNZRO DC08A	< T1ON >	/TURN ON DC08 CLOCK
IFZERO D689-4	< EDF >		/REENABLE DATA PHONES
	DCA	SCHNEW		/ENABLE SCHEDULER TO BUMP NULL JOB
	JMP I	RUNULL
*3200

/PROCESS KEYBOARD INPUT CHARACTERS (MAY BE PSEUDO-INPUT)

/MULTI-FIELD ROUTINE
/CALL:	CHARACTER IN "TTCHAR"
/	JMS	KBD
/	DEVTBL POINTER
/	RETURN; NO ROOM - CHARACTER NOT STORED
/	RETURN; CHARACTER STORED
/
KBDCNT=WS2
KBDSIB,	-212			/DO NOT MOVE FROM BEGINNING OF A PAGE - SEE "DUPSI"
IFNZRO KBDSIB&177 <YOU GOOFED>

KBD00,	0
	TAD I	KBD00		/GET DEVTBL POINTER
	DCA	CONDBA
	RDF
	TAD	C6203
	DCA	KBDNSX		/REMEMBER FROM WHENCE WE CAME
	ISZ	KBD00
	DATFLD
	TAD I	CONDBA		/GET DDB ADDRESS
	DCA	CONDDB
KBDSQ,	JMS I	KBDCON		/CHECK ^S/^Q; (ISZ CONDBA IF FEATURE DISABLED)
	TAD I	CONDDB		/YES - GET DDB STATUS
	AND	C0100
	SZA CLA			/"SICOM" SET?
	JMP	KBDNSX		/YES - EXIT
	TAD	TTCHAR		/CHECK FOR ^B, ^C
	TAD	KBDMCB
	CLL RAR
	SZA CLA			/IS IT ^B OR ^C?
	JMP	KBD05		/NOTHING SPECIAL ABOUT THIS ONE
	TAD	CONDDB
	JMS I	KBDCLB		/CLEAR HIS/HER INPUT BUFFER
	TAD	TTCHAR
	RAR
	SNL CLA			/WAS IT ^B OR ^C?
	JMS I	KBDCHK		/WAS ^B TYPED IN USER MODE?
	JMP	KBD04		/CLEAR OUTPUT
	TAD I	CONDDB
	TAD	C1000		/PUT THIS TTY IN SI MODE
	DCA I	CONDDB
KBD02,	TAD	KBDUPA
	DCA	TTCHAR		/CHANGE TO ^
	CDF
	PRINT			/STASH "^" IN HIS/HER OUTPUT BUFFER
	"B			/WE DON'T CARE IF "PRINT" FAILS
	TAD	.-1
	DCA	TTCHAR		/CHANGE TO B
KBD01,	CLL STA RTR
	RTR
	DATFLD
	AND I	CONDDB		/CLEAR "FULL" STATUS
	DCA I	CONDDB
KBD03,	TAD I	CONDDB		/GET DDB STATUS BITS
	AND	DUPSI
	ISZ	CONDDB
	SZA CLA			/DUPLEX OR SI MODE?
	TAD I	CONDDB
	SNA CLA			/AND LOGGED IN?
	JMP	KBDXIT		/NO - SO DON'T ECHO
	CDF
	PRINT			/STASH (TTCHAR) IN HIS/HER OUTPUT BUFFER
KBDUPA,	"^			/WE DON'T CARE IF "PRINT" FAILS
KBDXIT,	ISZ	KBD00		/SHOW SUCCESS
KBDNSX,	.-.			/BACK TO THE CALLING FIELD
	JMP I	KBD00
KBD04,	TAD I	CONDBA
	JMS I	KBDCLB		/CLEAR THE OUTPUT BUFFER
	TAD	TTCHAR
	RAR
	SNL CLA			/WAS IT ^B OR, OR ^C?
	JMP	KBD02		/IT WAS ^B
	JMS I	KBDCHK		/USER MODE?
	JMP	KBDSSI		/NO, GO TO SI FOR DOT OR ^B
	JMP I	KBDCCA		/YES, GO DO ^C BUSINESS
KBD05,	TAD	C7770		/IS THERE PLENTY OF FREE CORE?
	TAD	FRECNT
	SPA CLA
	JMP	KBDNSX		/NO
	JMS I	KBDCHK		/WHICH MODE?
	JMS I	KBDLRA		/SI - CHECK FOR LINE-FEED AND RUBOUT
	TAD I	CONDDB
	AND	C0400		/"FULL" FLAG SET?
	SZA CLA
	JMP	KBDNSX		/YES - EXIT
	TAD	CONDDB
	STORE			/STASH (TTCHAR) IN HIS/HER INPUT BUFFER
	KBD06			/FOR SIZE CHECK
	JMP	KBDNSX		/STORE FAILED; BUFFER ALREADY FULL
	JMS I	KBDCHK		/WHICH MODE?
	JMP	KBD08		/SI
	STL RTL			/AC=2
	TAD	CONDDB		/POINT TO BREAK MASK
	DCA	KBDCNT
	TAD I	KBDCNT		/GET THE BREAK MASK
	JMS I	BRKTSA		/IS IT A BREAK CHARACTER?
	JMS I	KBDBRK		/GO SET DEL BIT IN STR1 AND PUT HIS/HER JOB NUMBER IN BONUS
	DATFLD
	JMP	KBD03		/SEE IF WE SHOULD ECHO
KBDBRK,	KBDDLM
KBDCCA,	GIR9
KBDLRA,	KBDLRB
DUPSI,
KBD08,	TAD	KBDSIB		/USED AS CONSTANT (MASK) SEE "KBD03+1"
	TAD	TTCHAR
	AND	KBDSIM
	SZA CLA			/IS THIS A BREAK FOR SI?
	JMP	KBD03		/NO
KBD11,	ISZ	COMCNT		/TO SCHEDULE "SI"
	TAD I	CONDDB
	TAD	C0100		/SET "SICOM"
	DCA I	CONDDB		/SAVE NEW KEYBOARD STATUS
	JMP	KBDXIT		/EXIT WITHOUT ECHOING THE DELIMITING CHARACTER

KBDCON,	CONSQ
BRKTSA,	BRKTST
KBDMCB,	-"B+100			/-^B
KBDCLB,	CLRBUF
KBDCHK,	KBDMOD
KBD09,	TAD	CONDDB
	TAD	C0005
	DCA	KBDCNT		/POINTS TO CHARACTER COUNT IN DDB
	TAD I	KBDCNT
	CIA
	DCA	KBDCNT		/NUMBER OF CHARACTERS TO SPIN THROUGH THE BUFFER
	DCA	WS0		/FAKE HIS/HER BREAK MASK TO ZERO
KBD10,	TAD	CONDDB
	FETCH			/FETCH A CHARACTER
	JMP	KBDSSI		/BUFFER EMPTY
	DCA	TTCHAR		/SAVE IT
	ISZ	KBDCNT		/RUB THIS ONE?
	SKP
	JMP	KBD03		/YES - PRINT IT
	TAD	CONDDB
	STORE			/NO - PUT IT BACK
	ALLOK			/NO LIMIT
KB0040,	DECHO			/NOP		/CAN'T FAIL
	JMP	KBD10

KBDSIM,	/THE FOLLOWING INSTRUCTION IS USED AS A CONSTANT
KBDSSI,	TAD	KB0040		/SET "DECHO"; SCHEDULE SI TO PRINT CURRENT LINE
	JMP	KBD11		/PRECEDED BY EITHER "." OR "^B"

IFNZRO KB0040&177-174 <CHANGE KBDSIM>
*3400

/KEYBOARD IOTS

/SEE IF THE USER IS GOING TO EXECUTE A "JMP .-1" AFTER A NON-SKIPPING "KSF"

JMPTST,	TAD	UUOADD		/ADDRESS OF THE "KSF"
	AND	C0177		/JUST THE PAGE ADDRESS BITS
	TAD	C5200		/MAKE UP THE REQUIRED "JMP" INSTRUCTION
	CIA
	UDF			/SELECTS USER'S FIELD
	TAD I	L2SV0		/USER'S INSTRUCTION
	DATFLD
	SNA
	JMP	JMPTS1		/WE CAUGHT HIM/HER!
	TAD	C0200		/MAYBE IT'S A PAGE 0 "JMP"
	SZA CLA
	JMP	JMPTS0		/NO - MUST BE SOMETHING ELSE - LET HIM/HER CONTINUE
	TAD	CC7600		/WILL WE BE ON PAGE 0?
	AND	UUOADD
	SNA CLA
JMPTS1,	TAD	UKEYFL		/PUT HIM/HER TO SLEEP - SO [S]HE DOESN'T WASTE OUR TIME
JMPTS0,	DCA	UKEYC		/SAVE WAIT CCONDITION
	STL RTR
	AND I	CONDDB
	SNA CLA			/NEED XON?
	JMP	JMPTS2		/NO
	TAD	UKXON
	DCA	TTCHAR
	ISZ	CONDBA		/POINT TO OUTPUT SIDE
	CDF
	PRINT			/SEND XON
	WAIT			/DIDN'T FIT - TRY AGAIN LATER
	CLL STA RTR
	DATFLD
	AND I	CONDDB		/CLEAR XOFF BIT
	DCA I	CONDDB
JMPTS2,	TAD	UKEYC		/WAIT FOR FLAG; EXCEPT KSF WITHOUT JMP .-1
	UUOEXT

IFNZRO JMPTST&4177 <YOU GOOFED>
UKL2SA,	L2SA
UKEY0A,	UKT0
UKEY1A,	UKT1

UKWAIT,	STA			/BACK UP HIS/HER PC
	TAD	L2SV0
	DCA	L2SV0
	JMP	JMPTS1		/SEE IF XON SHOULD BE SENT

UKXON,	221
UKEY,	JMS I	UKEY0A		/MAKE SURE [S]HE'S NOT IN SI MODE
	JMS I	UKEY1A		/WHAT DOES [S]HE WANT TO DO?
	JMP	UKEYRS		/READ STRING
UKEYFL,	JSDEL JSERR		/DELIMITER FLAG OR ERROR FLAG
C5200,	JMP	JMPTST		/MAKE SURE [S]HE'S NOT HANGING ON "JMP .-1"
	RAR
	SPA CLA
	DCA	L2SA		/KCC - CLEAR AC
	SNL CLA			/IS KRB OR KRS REQUESTED?
	UUOEXT			/NO - ALL DONE
	DATFLD
	TAD	CONDDB
	FETCH			/GET A CHARACTER FROM THE BUFFER
	JMP	UKWAIT		/NONE AVAILABLE
	DCA	UKEYC		/SAVE CHARACTER
	TAD	UKL2SA		/OR INTO USER'S AC
	CDF
	IOR			/IT WOULD PROBABLY BE ADEQUATE TO JAM IT INTO HIS/HER AC
UKEYC,	0
	UUOEXT			/AND BACK TO USER

UKREAD,	0
	DCA	WS0		/SAVE THE BREAK MASK
	TAD	L2SA		/POINTS TO PARAMETERS IN USER AREA
	IAC
	DCA	WS1		/ADDR OF USER BUFFER POINTER
	UDF
	TAD I	WS1		/USER BUFFER ADDRESS
	DCA	AXS2
UKEYR1,	DATFLD
	TAD	CONDDB
	FETCH			/GET A CHARACTER
	JMP I	UKREAD		/THEY'RE FRESH OUT
	UDF			/SELECT USER FIELD
	DCA	TTCHAR
	TAD	TTCHAR
	DCA I	AXS2
	ISZ I	WS1		/UPDATE USER POINTER
MRUB,	-377			/NOP
	TAD	WS0		/IS IT A DELIMITER?
	ISZ I	L2SA		/DONE?
	JMS	BRKTST
	CLA SKP			/WE'RE FINISHED
	JMP	UKEYR1		/BACK FOR MORE
	DCA	L2SA		/CLEAR AC
	ISZ	UKREAD		/SKIP ON RETURN
	JMP I	UKREAD
/READ INPUT STRING

UKEYRS,	DATFLD
	STL RTL
	TAD	CONDDB		/ADDRESS OF DDB
	DCA	WS0		/POINTS TO BREAK MASK
	TAD I	WS0		/GET BREAK MASK
	JMS	UKREAD		/READ STRING
	JMP	UKWAIT		/WAIT FOR HIM/HER TO TYPE SOME MORE
	UUOEXT

BRKTST,	0
	CDF
	SPA SNA
	JMP	BRKTS2
	DCA	WS0		/SAVE THE BREAK MASK
	TAD	BRKTBA		/ADDRESS OF BREAK TABLE
	DCA	AXS1
	TAD	TTCHAR		/CHARACTER TO COMPARE WITH TABLE
BRKTS1,	ISZ	AXS1		/SKIP OVER MASK
	TAD I	AXS1		/-HIGH END OF RANGE
	CLL
	TAD I	AXS1		/+NUMBER OF CHARACTERS IN THIS RANGE
	SNL
	JMP	BRKTS1		/NOT IN THIS GROUP
CC7600,	CLA 400			/WE FOUND IT
	TAD I	AXS1		/GET THE MASK
	AND	WS0		/COMPARE IT WITH OUR MASK
BRKTS2,	SNA CLA			/IS IT A BREAK CHARACTER?
	ISZ	BRKTST		/NO
	JMP I	BRKTST
BRKTBA,	BRKTBL-2

MLF,	377-212
KBD09A,	KBD09

KBDLRB,	0
	TAD	MRUB
	TAD	TTCHAR
	SNA
	JMP I	KBD09A		/RUBOUT
	TAD	MLF
	SZA CLA
	JMP I	KBDLRB		/NORMAL CHARACTER
	JMP I	.+1		/LINE-FEED
	KBDSSI
*3600

IFZERO CPU-2 <			/TEMPORARY POWER FAIL HANDLER FOR 8/E
POWINT,	CLA
	DCA	0		/CLEAR LOCATION 0 SO WE'LL FALL THROUGH IT

	TAD	POW2		/CLOBBER LOCATION 2 (C0200) SO WE'LL COME TO "POWST"
				/WHEN THE JUICE RETURNS

	DCA	2
	HLT			/POWER FAILURE; WILL START AT POWST WHEN POWER COMES UP

POW2,	POWST

POWST,	DCA	WS1
	ISZ	WS0		/WE DELAY ABOUT A MINUTE TO MAKE SURE
	JMP	.-1		/THE DISK IS UP TO SPEED
	ISZ	WS1
	JMP	.-3
	JMP I	.+1		/NOW GO CALL INIT
	BOOT

USGT,	SGT			/SKIP ON PDP-8/E GREATER THAN FLAG (EAE)
	UUOEXT
	JMP I	.+1		/CAUSE SKIP ON RETURN
	UUOEX2
>
IFNZRO CPU&7776 <
UGTF,	SGT			/PDP-8/E "GET FLAGS" SIMULATOR
	SKP
	STL RTR			/POSITION OF GT FLAG
	TAD	L2SVLK		/AND GIVE HIM/HER THE LINK
	DCA	L2SA
	UUOEXT

URTF,	CLA STL IAC RTR		/AC=6000
	AND	L2SA		/SAVE ONLY LINK AND GT BITS OF HIS/HER AC
	RTF			/RESTORE AS REQUESTED
	CLA RAR			/FETCH NEW LINK
	DCA	L2SVLK		/SAVE FOR THE USER
	UUOEXT
>
IFNZRO DC08A <
DC08B=	DC08A+4%5
T8FITH,	-DC08B
T8TTIA,	T8TTI
T8LC,	-1
T8SF,	0
T8SV0,	0
T8SVLK,	0
T8SA,	0
T8FLG,	0
T8CNT0,	-1			/SO IT WILL INITIALIZE ITSELF THE FIRST TIME IT'S USED
T8CNT1,	0
T8CNT2,	0
T8N5,	-5
T8OBA,	SKPTBL+PT08+KL8+2
T8OBF,	0
T8NLN,	-DC08A
T8LINE,	DC08LO-SKPTBL-PT08-KL8-2
RESTA,	RESTOR
T8SFA,	T8SF
T8BF2,	OUTREG-SKPTBL-1
T8TMP,	0
T83000,	3000
TTOFLD,	TTOFLG
T8RTN,	DISMI2
T8DIS,	T1ON			/RE-ENABLE THE CLOCK
	ISZ	T8LC
	JMP I	T8RTN		/ALREADY SERVICING DC08
	DCA	T8SA		/SAVE AC
	RAR
	DCA	T8SVLK		/AND LINK
	TAD	0
	DCA	T8SV0		/AND PC
	RIB
	DCA	T8SF		/FIELD & MODE
	DCA	T8FLG		/CLEAR DC08A LEVEL 2 SERVICE FLAG
T8IN,	TAD	T8FITH
	TTCR TTLR		/LIMIT INPUT TO 1/5 OF THE LINES
	DCA	T8CNT2		/SAVE ALSO AS THE OUTPUT LINE COUNT
	ION
	CIF DATFLD
	JMP I	T8TTIA		/TAKE A PASS THROUGH THE TTI STRING
/RETURNS HERE AFTER SERVICING INPUT SIDE (TTI'S)
T8OUT1,	ISZ	T8CNT0		/BUMP DIVIDE BY 5 COUNTER
	JMP	T8OUT2		/CONTINUE CURRENT PASS
	TAD	T8N5
	DCA	T8CNT0		/RESET MAJOR COUNTER
	TAD	T8OBA
	DCA	T8OBF		/RESET OUTPUT BUFFER POINTER
	TAD	T8NLN
	DCA	T8CNT1		/RESET TOTAL NUMBER OF LINES COUNTER
T8OUT2,	TAD	T8CNT1
	SMA CLA			/ANYTHING LEFT THIS PASS?
	JMP	T8EXT		/NO
	TAD	T8LINE		/LINE NUMBER TO START AT
	TAD	T8OBF		/COMPUTED FROM CURRENT BUFFER POSITION
	TTCL TTLL		/LOAD IT INTO THE DC08A
	CLA
T8OUT3,	TAD I	T8OBF		/BITS TO BE OUTPUT
	SZA
	JMP	T8OUT5		/MUST BE SOMETHING THERE
	TTIL			/NOTHING - JUST BUMP THE LINE NUMBER
T8OUT4,	ISZ	TIOBF		/BUMP THE BUFFER POINTER
	ISZ	T8CNT1		/AND THE TOTAL LINE COUNT
	SKP
	JMP	T8EXT		/FINISHED
	ISZ	T8CNT2		/CURRENT PASS COCUNT
	JMP	T8OUT3		/ONTO THE NEXT LINE
T8EXT,	IOF
	STL STA			/DECREMENT THE INTERRUPT COUNT
	TAD	T8LC
	DCA	T8LC
	SNL			/ALL ACCOUNTED FOR?
	JMP	T8IN		/NO - MAKE ANOTHER ROUND
	TAD	T8FLG		/DOES THE DC08 REQUIRE LEVEL 2
	TAD	L2Q		/OR SOMETHING ELSE?
	CIA
	TAD	L2QE
	AND	T8SF		/ALLOW "L2EXIT" ONLY IF FROM USER MODE
	AND	C0100
	SZA CLA			/HOW SHOULD WE EXIT?
	JMP	T8EXIT		/VIA L2EXIT
	TAD	T8SFA		/BACK TO WHERE WE CAME FROM
	CDF
	JMP I	RESTA
/MOVE THE ACTIVE REGISTERS OVER TO LEVEL 2
T8EXIT,	TAD	T8SVLK		/THE LINK
	DCA	L2SVLK
	TAD	T8SA		/THE AC
	DCA	L2SA
	TAD	T8SV0		/THE PC
	DCA	L2SV0
	TAD	T8SF		/FIELDS & MODE
	DCA	L2SF
	EXIT
T8OUT5,	TTO TTIL		/OUTPUT A BIT
	SZA
	JMP	T8OUT8		/SAVE THE REMAINING BITS FOR NEXT TIME
T8OUT6,	TAD	T8OBF		/OUR POSITION
	TAD	T8BF2		/MINUS THE OFFSET
	DCA	T8TMP		/SECOND BUFFER
	TAD I	T8TMP
	RAR
	SNL			/ANYTHING WAITING?
	JMP	T8OUT7		/NO
	AND	C0377
	CLL RAL
	TAD	T83000		/NOW THE STOP BITS & START BIT ARE IN PLACE
	DCA I	T8OBF		/SAVE IT TO BE OUTPUT NEXT TIME
	STL IAC RTR
	DCA I	T8TMP		/SET BOTH HARDWARE BUSY AND SERVICE FLAGS
	CDF
	DCA I	TTOFLD		/SET "CONOUT" FLAG
	DATFLD
	ISZ	T8FLG		/SCHEDULE LEVEL 2 FOR US
	JMP	T8OUT4
T8OUT7,	STL CLA RAR
	AND I	T8TMP
	DCA I	T8TMP		/CLEAR EVERYTHING EXCEPT SERVICE FLAG
T8OUT8,	DCA I	T8OBF
	JMP	T8OUT4

T8IN1,	0
	IOF
	DCA I	ACX11		/STASH IT IN THE RING BUFFER
	TTRL
	TAD	T8BASE		/MAKE DC08A LINE NUMBER = KXX
	JMS I	T8INPA		/FINISH HOUSE-CLEANING
	ISZ	T8FLG		/SCHEDULE LEVEL 2
	CIF DATFLD
	JMP I	T8IN1		/BACK TO FIELD 1
T8BASE,	PT08+KL8-DC08LO+1
T8INPA,	ACINT9
>/END OF FIELD 0 DC08A CODE
*4000

/	THIS WILL RUN A "ROUND ROBIN" OF CORE RESIDENT JOBS

NXTCO1,	DCA	SCHNEW		/ANY JOB STARTED FROM HERE MAY BE THROWN OFF
NXTCOR,	ISZ	NXTCNT		/HAVE WE CHECK ALL ENTRIES?
	TAD	NXTCNT
	SMA SZA CLA
	JMP I	NXTNUL		/YES; NOTHING RUNNABLE EXCEPT NULL JOB
NXTCO2,	ISZ	NXTCOP		/BUMP CORTBL POINTER
	TAD	NXTCOP		/ARE WE PAST THE END OF THE TABLE?
	TAD I	NXTEND
	SZA CLA			/?
	JMP	.+3		/NOT YET
	TAD	FANCOR		/YES, START AT THE BEGINNING AGAIN
	DCA	NXTCOP		/ALL SET
	TAD I	NXTCOP		/GET CORTBL ENTRY
	SNA			/IS THERE ANYTHING IN THERE?
	JMP	NXTCO4		/NO; CLEAR DEAD JOB POINTER (A FREE FIELD IS BETTER)
	AND	C6600		/IS IT BEING SWAPPED, LOCKED, OR A PHANTOM?
	SZA CLA
	JMP	NXTCOR		/YES - SO IT'S NOT A USEFULL FIELD NOW
	TAD I	NXTCOP
	AND	C0037
	RUNABL
	JMP	NXTCO3		/NOT RUNNABLE
	TAD I	NXTCOP		/TRY TO RUN THIS ONE
	AND	C0037		/GET JOBTBL INDEX
	TAD	JOBTBA		/GET POINTER TO JOB DATA
	GETJTI			/GET VALUE OF STR0
	JOBSTS
	AND	C0107		/DOES [S]HE WANT TO RUN FIP OR SI FOR ERROR?
	SZA CLA
	JMP	NXTCOR		/HAVE TO WAIT 'TIL LATER
	TAD I	NXTCOP
	JMP I	.+1		/GO RUN THIS ONE
	SCHEI2
NXTCO3,	STA
	TAD	NXTCOP		/POINTER-1 OF DEAD JOB
	DCA	DEAD		/SAVE IT
	TAD	NXTCOP
	TAD	NXTFLD		/FIELD INDEX ONLY
	JMS I	NXTDSK		/IS THERE DISK ACTIVITY IN THIS FIELD?
NXTCO4,	DCA	DEAD		/YES; SO [S]HE'S NOT REALLY DEAD-WOOD THEN
	JMP	NXTCOR		/KEEPLOOKING
NXTNUL,	SCHNUL
NXTFLD=	C1000			/-CORTBL+1
NXTDSK,	DSKACT
NXTCOP,	CORTBL+1		/ROUND ROBIN CORTBL POINTER
NXTEND,	CORTBE			/END OR CORTBL
C0107,	107
C6600,	SWAP+LOCK+FIP+SI
UHALSA,	L2SA
UHALT,	TAD	UUOCAL		/IS IT AN OSR?
	AND	C0004
	SNA CLA			/OSR?
	JMP	UHALT1		/NO
	CDF
	GETJTW			/YES, GET CURRENT VALUE OF SWITCHES
	JOBSWR
	DCA	UHALT2		/OR IT INTO AC
	TAD	UHALSA		/WHICH IS RIDICULOUS, SINCE OSR
	IOR			/IS UNIVERSALLY CODED AS LAS, AND
NXTCNT,
UHALT2,	0			/A SIMPLE "DCA L2SA" WOULD DO
UHALT1,	TAD	UUOCAL		/NOW SEE IF IT WAS MICROCODED
	AND	C0002		/HALT?
	SNA CLA
	UUOEXT
	JMS I	USBCSI		/LOCATE HIS/HER DDB AND SEE IF [S]HE'S IN SI MODE
	TAD	FRECNT		/USER HAS EXECUTED HLT
	TAD	C7770
	SPA SNA CLA		/IF WE'RE SHORT ON FREE CORE, TRY LATER
	REDO
	GETJTW			/CLEAR HIS/HER RUN BIT
	JOBSTS
	AND	C3777		/CLEAR JSRUN
	DATFLD
	DCA I	JOBSWA
	TAD	CONDBA		/CONDBA WAS SET UP BY THE JMS TO UKT0
	JMS	UHLTMS		/NOW TYPE ^BS FOR HIM/HER
	WAIT

UHLTMS,	0
	DCA	UHLTM1		/SET DEVTBL POINTER
	RDF
	TAD	UHMES		/EITHER TYPE ^BS OR ^BS;K
	DCA	AXS2
	CDF
UHLTM0,	TAD I	AXS2		/GET A CHARACTER
	SPA SNA
	JMP	UHLTM2		/END OF TEXT
	DCA	TTCHAR		/SAVE IT
	KEY			/RUN IT INTO HIS/HER INPUT BUFFER
UHLTM1,	.-.
	NOP
	JMP	UHLTM0		/GET ANOTHER ONE
UHLTM2,	SZA CLA			/WHERE DID WE COME FROM?
	CIF DATFLD		/BACK TO 689 SERVICE
	JMP I	UHLTMS

UHMES,	.
	"B-100
	"S
	";
	"K
	215
C7377,	7377
USBCLR,	CLRBUF
USBFLG,	CLSTR1
	"B-100
	"S
	213
	0
USBCSI,	UKT0

/SELECTIVE BUFFER CLEAR
USBC,	JMS I	USBCSI		/CHECK FOR SI MODE
	DATFLD
	TAD	L2SA
	CLL RAL
	SMA CLA			/CLEAR INPUT BUFFER?
	JMP	USBC3		/NO
	TAD	CONDDB		/INPUT DDB ADDRESS
	JMS I	USBCLR		/CLEAR INPUT BUFFER
	TAD	C0100
	JMS I	USBFLG		/CLEAR FLAG
	TAD I	CONDDB
	AND	C7377		/CLEAR FULL BIT
	DCA I	CONDDB
USBC3,	TAD	L2SA		/WHAT IS REQUESTED?
	SMA CLA			/CLEAR OUTPUT BUFFER?
	JMP	USBC4		/NO
	ISZ	CONDBA		/POINT TO OUTPUT SIDE
	TAD I	CONDBA
	JMS I	USBCLR		/CLEAR OUTPUT BUFFER
USBC4,	DCA	L2SA		/CLEAR HIS/HER AC
	UUOEXT







*4200

/STANDARD BOOTSTRAP AND RESTART ADDRESSES

	JMP I	.+2		/INIT BOOTSTRAP
	JMP I	.+2		/RESTART ADDRESS
	BOOT
	DEBUG
FILERC,	0			/ROUTINE TO RECOVER FROM DISK ERRORS
FILUSA,	0			/AND SET ERROR CODES FOR USER
FILEWC,	0			/ERROR CODES ARE:
FILER1=	WS2			/	1	PARITY
				/	2	END OF FILE
				/	3	FILE NOT OPEN
				/	4	PROTECTION VIOLATION
FJSF3,	-JSF3-1
FILECA=	C0004			/FILPCA
FILECT=	C0007			/FILPCT
FILEIF=	C0002			/FILPIF
C6000,	6000
FILERR,	0
	DCA	FILERC		/ERROR CODE
	CLL CLA CMA RAL		/AC:=-2
	TAD	FILERC		/ERROR CODE - .GT.2?
	SPA SNA CLA		/PROTECTED OR NOT OPEN?
	JMP	FILER2		/NO
	GETJTW			/GET ADDRESS OF PARAMETER BLOCK
	JOBLNK
	RETBLK			/RETURN IT TO FREE CORE
	CLA
	TAD	L2SA		/GET POINTER TO PARAMETERS IN USER AREA
	TAD	F0005
	DCA	FILERR		/POINTS TO SIXTH USER PARAMETER (ERROR CODE)
	TAD	FILERC		/GET ERROR
	UDF			/SELECT USER FIELD
	DCA I	FILERR		/PASS ERROR TO USER
	CDF
	DCA	L2SA		/CLEAR HIS/HER AC
	UUOEXT			/AND BACK TO HIM/HER

FILER2,	TAD I	FILERR		/END OF FILE OR PARITY ERROR...
	TAD	FILEIF		/GET ADDRESS OF FILE PARAMETER BLOCK
	DCA	FILER5		/POINTS TO WORD 3 OF BLOCK
	DATFLD
	TAD I	FILER5		/WAS FILE CALL ORIGINATED BY SI?
	AND	C6000		/BITS 0-1 WILL BE SET IF SO...
	SNA CLA
	JMP	FILER4		/NO - IT CAME FROM USER PROGRAM
	TAD I	FILER5		/YES - GET FIELD # FOR TRANSFER
	RTR
	AND	C0007		/MASK OUT FILE # BITS
	TAD	CORTBA		/INDEX INTO CORTBL
	DCA	FILUSA		/SAVE POINTER TO CORTBL ENTRY FOR THIS TRANSFER
	CDF
	TAD I	FILUSA		/GET CORTBL ENTRY
	AND	C0037		/EXTRACT JOB #
	DCA	FILUSA		/SAVE JOB #
	CLL CMA RAL		/AC=-2
	TAD	FILERC		/IS IT AN END OF FILE?
	SNA CLA
	JMP	FILER3		/YES; WE'RE ALMOST DONE THEN
	TAD	FILERC		/NO - WAS THERE ANY ERROR AT ALL?
	SNA CLA
	JMP	FILER3		/NO
	TAD	FILUSA		/PARITY ERROR - SET SYSTEM ERROR CODE IN STR0
	ERROR
F0005,	DSKERR
FILER3,	ISZ	FILERR		/INDEX PAST CALLING ARGUMENT
	CDF
	JMP I	FILERR		/AND BACK



FILER4,	TAD I	FILER5		/UPDATE USER CONTROL TO INDICATE ERROR CODE
	RAL			/SHIFT FIELD # INTO BITS 6-8
	AND	C0070		/SAVE IT
	TAD	FILCDF		/GENERATE "UDF"
	DCA	FILER5		/USER FIELD SELECT
	CDF
	TAD I	FILERR		/PARAMETER BLOCK ADDRESS
	DCA	FILEWC		/SAVE IT
	TAD	FILEWC
	DATFLD
	TAD	FILECA
	DCA	FILER1		/POINTS TO CORE ADDRESS IN PARAMETER BLOCK
	TAD I	FILER1		/GET CORE ADDRESS
	DCA	FILER1		/SAVE IT
	TAD	FILEWC		/START OF PARAMETERS
	TAD	FILECT		/+7
	DCA	FILUSA		/POINTS TO PTR TO FILE CONTROL
	TAD I	FILUSA		/GET ADDRESS OF FILE CONTROL
	TAD	C0006		/POINTS TO WORD COUNT IN FILE CONTROL
	DCA	FILEWC		/SAVE IT
	TAD	FILEWC
	IAC
	DCA	FILUSA		/POINTS TO POINTER TO USER PARAMETERS
	TAD I	FILUSA		/GET POINTER TO USER ARGUMENTS
	DCA	FILUSA		/SAVE
	TAD I	FILEWC		/GET WORD COUNT TO GO FROM CONTROL BLOCK
FILER5,	0			/SELECT USER FIELD
	DCA I	FILUSA		/SAVE IN USER AREA
	ISZ	FILUSA		/POINTS TO WORD 4 OF USER ARGUMENTS
	TAD	FILER1		/GET LATEST CORE XFER ADDRESS
	DCA I	FILUSA		/SAVE FOR USER
	ISZ	FILUSA
	ISZ	FILUSA		/POINTS TO WORD 6 (ERROR WORD)
	TAD	FILERC		/GET ERROR CODE
	DCA I	FILUSA		/PASS ON TO USER
FILCDF,	CDF
	JMP	FILER3		/AND BACK
BRKTBL,	-"Z-1			/LETTERS
	"Z-"A+1
	2000

	"A-"9-1			/NUMBERS
	"9-"0+1
	1000

	"0-211-1		/HORIZONTAL TAB
	211-211+1
	0400

	211-215-1		/LF, VT, FF, CR
	215-212+1
	0200

	212-";-1		/! @ # DOLLAR % & ' ( ) * + , - . / : ;
	";-"!+1
	0100

	"!-240-1		/SPACE
	240-240+1
	0040

	240-"@-1		/< = > ? @
	"@-"<+1
	0020

	"<-"_-1			/[ \ ] _
	"_-"[+1
	0010

	"[-377-1		/RUBOUT
	377-377+1
	0004

	377-376-1		/ALTMODE
	376-375+1
	0002

	375-377-1		/EVERYTHING ELSE
	377-0+1
	0001
*4400

/RFILE AND WFILE IOTS

UFILE,	TAD	UFILWA		/NO, GET USER PARAMETERS
	JMS I	UFPARM		/AND MOVE TO PARAMETER BLOCK
	TAD I	UFLNKA		/ADDRESS OF PARAMETER BLOCK
	TAD	UFIPIF
	DCA	UFPARA		/POINTS TO WORD 3 OF BLBOCK
	DATFLD
	TAD I	UFPARA		/CLEAR ALL BUT FILE # IN BLOCK
	AND	C0003
	DCA I	UFPARA		/SAVE IT
	TAD	L2SA		/ADDRESS OF USER PARAMETERS
	TAD	UFIPWC		/+2
	DCA	UFILE1		/POINTS TO WORD COUNT IN USER AREA
	TAD I	UFPARA		/FILE #
SIFIL1,	CDF
	TAD	UFJF0		/RELATIVE ADDRESS OF FILE 0 POINTER
	DCA	UFJOBF		/RELATIVE ADDR OF FILE POINTER FOR THIS FILE
	GETJTW
UFJOBF,	0			/POINTER TO FILE CONTROL INFO
	SNA
	JMP	UFILER+1	/FILE NOT OPEN
	DCA	UFJOBF		/SAVE POINTER TO FILE CONTROL
	DATFLD
	TAD I	UFPARA		/FILE #
	JMS I	UFIGJF		/GENERATE CORRESPONDING FILE BIT IN STR1
	DCA	UFIJSF		/FILE STATUS FLAG
	TAD	L2SF		/USER'S FIELD #
	AND	C0007
	CLL RTL			/*4
	DCA	JOBSWA		/SAVE
	TAD I	UFPARA		/GET FILE # + ORIGINATING STATUS INFO
	AND	C7743		/CLEAR FIELD #
	TAD	JOBSWA		/SET FIELD #
	DCA I	UFPARA		/SAVE IN PARAMETERS
	TAD	UFJOBF		/SAVE GLOBAL PARAMETERS
	IAC			/POINTS TO WORD 2 OF CONTROL BLOCK
	DCA	AXS1		/CONTROL INDEX
	CLL CLA CMA RTL		/AC:=-3
	TAD	UFPARA
	DCA	AXS2		/PARAMETER INDEX POINTS TO START OF PARAMETERS-1
	TAD I	AXS2		/WRITE AND PROTECTED?
	AND I	AXS1
	AND	C0004		/CHECK ONLY FOR WRITE PROTECT
	SZA CLA
	JMP	UFILER		/YES - ERROR
	TAD	AXS2		/NO, SET FILPAR = START OF PARAMETER BLOCK
	DCA I	AXS1
	TAD I	AXS2		/DISC EXTENSION FROM PARAMETERS
	DCA I	AXS1		/TO CONTROL BLOCK
	ISZ	AXS2		/SKIP FIELD
	TAD I	AXS2		/SAVE WC
	DCA	JOBSWA
	ISZ	AXS2		/SKIP CORE ADDRESS FOR NOW
	TAD I	AXS2		/DISC ADDRESS
	DCA I	AXS1		/TO CONTROL BLOCK
	TAD	UFIRET		/RETURN ADDRESS
	DCA I	AXS2		/TO PARAMETER BLOCK
	TAD	UFJOBF		/POINTER TO FILE CONTROL
	DCA I	AXS2		/TO PARAMETER BLOCK
	TAD	JOBSWA		/WORD COUNT
	DCA I	AXS1		/TO CONTROL BLOCK
	TAD	UFILE1		/POINTS TO WC IN USER AREA
	SNA			/IS THIS AN SI REQUEST?
	JMP	.+3		/YES
	DCA I	AXS1		/NO, SAVE POINTER TO WC IN CONTROL BLOCK
	DCA	L2SA		/CLEAR USER AC
	TAD	UFJOBF		/POINTER TO CONTROL BLOCK
	TAD	UFPAR2		/+3
	DCA	UFILPA		/POINTS TO POINTER IN CONTROL BLOCK POINTING TO PARAM. BLOCK
	TAD	UFJOBF		/POINTS TO FILE CONTROL
	JMS I	UFILIX		/GET SEGMENT INDEX
	JMP I	UFIL4A		/NOT IN CORE - DO A WINDOW TURN
	JMP	UFILE2		/NON-EXISTENT DISC ADDRESS
	JMS I	UFICTB		/OK, SET UP TRANSFER BLOCK - POINTER TO SEGMENT # IN AC
UFILPA,	0			/POINTER TO FILPAR
	TAD I	UFILPA		/ADDRESS OF PARAMETERS
	JMS I	UFIQUE		/QUEUE THE REQUEST IN DSUTBL
	ISZ	DSBUSY		/DISC BUSY?
	SKP			/YES
	JMS I	FIUSER		/NO, START TRANSFER
	TAD	UFIJSF		/CLEAR FILE STATUS BIT
	UUOEXT			/EXIT

SIFILE,	DATFLD			/HANDLE SI FILE TRANSFERS
	TAD	UFIPIF
	DCA	UFPARA		/POINTS TO FILE # IN PARAMETERS
	DCA	UFILE1
	TAD I	UFPARA		/GET FILE #
	AND	C0003		/ONLY FILE #
	JMP	SIFIL1		/REST IS SAME AS USER PROGRAMS
UFILE2,	GETJTW			/NON-EXISTENT DISK ADDRESS
	JOBLNK			/GET ADDRESS OF PARAMETERS
	DCA	UFILE1		/SAVE IT
	JMP	.+3
UFILER,	IAC			/PROTECTED
	IAC			/NOT OPEN
	TAD	C0002		/EOF
	CDF
	JMS I	UFERR		/FILE ERROR ROUTINE
UFILE1,	0			/POINTS TO PARAMETER BLOCK
	TAD	UFILE1
	RETBLK			/RETURN PARA BLK
	CLA
	TAD	CURJOB		/DID WE BUMP SOMEONE ELSE OFF?
	SZA CLA
	WAIT			/YES - GO BACK TO HIM/HER
	UUOEXT			/NO - BACK TO THIS USER

UFPARA=	WS0			/ADDR OF USER PARAMETERS
UFIJSF=	WS1			/FILE STATUS FLAG
C7743,	7743
UFILWA,	UFILCT
UFJF0,	JOBF0
UFPAR2=	C0003			/FILPAR
UFIPIF=	C0002			/FILPIF
UFIPWC=	C0002			/FILPWC

UFPARM,	GETUSP
UFLNKA,	UUOLNK
UFERR,	FILERR
UFILIX,	FILIX
UFIRET,	DSURET
UFICTB,	FILCTB
UFIGJF,	GETJFX
UFIQUE,	DSQUE
UFIL4A,	UFILE4

RKL20,	CIF DATFLD-1
	JMP I	.+1
	RKL21
/RETURN CONTENT OF JOB STATUS FOR CURRENT JOB
/CALL
/	GETJTW
/	RELATIVE ADDRESS OF WORD
/	RETURN (CONTENTS IN AC, ABSOLUTE ADD IN JOBSWA)

GETJW0,	0
	TAD I	GETJW0		/GET RELATIVE ADDRESS
	DCA	.+3		/SAVE IT
	TAD	CJOBDA		/POINTER TO CURRENT JOB STATUS
	GETJTI			/GETCONTENTS
	0
	ISZ	GETJW0		/INDEX RETURN
	JMP I	GETJW0



*4600

/RETURN NUMBER OF NEXT RUNNABLE JOB IN AC
/CALL	JMS NXTJOB
/	RETURN WITH JOB # IN AC

FILCDA,
NXTJCT,	0
NXTJBN,	0			/NEXT JOB #
NXTJMM,	-JOBMAX

FILCT2,
NXTJOB,	0
	DCA	FIT		/CLEAR FIT
	TAD	BONUS		/IS THERE ANY JOB BROKEN OUT OF KEYBOARD WAIT?
	RUNABL			/IS IT RUNNABLE?
	JMP	NXTJ1		/NO, GET THE NEXT JOB
	TAD	BONUS		/THIS JOB
	JMP I	NXTJOB
NXTJ1,	ISZ	NXTJCT		/HAVE WE TRIED ALL JOBS?
	SKP			/NO, KEEP GOING
	SCHED			/TRY FOR A RESIDENT JOB
	TAD	NXTJBN		/IS IT TIME TO WRAP AROUND TO JOB 1?
	TAD	NXTJMM
	SNA CLA
	DCA	NXTJBN		/YES
	ISZ	NXTJBN		/INCREMENT NUMBER OF JOB UNDER CONSIDERATION
NXTJ2,	TAD	NXTJBN		/IS THE JOB RUNNABLE?
	RUNABL
	JMP	NXTJ1		/NO, CONTINUE JOB TABLE ROUND ROBIN
	TAD	NXTJBN		/YES, RETURN WITH JOB NO. IN AC
	JMP I	NXTJOB
/CONSTRUCT TRANSFER BLOCK
/CALL	TAD SEGMENT WINDOW POINTER
/	JMS FILCTB
/	POINTER TO FILPAR

FILCPD=	C0004			/FILPDA-FILPDX
FILCWC=	C7776			/FILPWC-FILPDA
FILCSW=	JOBSWA			/POINTER TO SEGMENT WINDOW
FILCPA=	WS2			/POINTER TO FILPAR & FILDA
FILCWA,	0
FILCPX,	0			/POINTER TO FILPDX, FILPDA & FILPWC

FILCTB,	0
	DCA	FILCSW		/SAVE POINTER TO SEGMENT IN WINDOW
	TAD I	FILCTB
	DCA	FILCPA		/ADDRESS OF POINTER TO PARAMETER BLOCK
	ISZ	FILCTB		/SKIP ARGUMENT IN CALL
	DATFLD
	TAD I	FILCPA		/GET ADDRESS OF PARAMETERS
	IAC			/POINTS TO WORD 2 OF PARAMETERS
	DCA	FILCPX
	ISZ	FILCPA		/POINTS TO DISK EXTENSION IN CONTROL BLOCK
	CLA CMA
	TAD I	FILCSW		/GET SEGMENT #
	CLL RAR
	RTR
	RTR			/MULTIPLY BY 400 SEG SIZE
	DCA	FILCT2		/SAVE "PRODUCT"
	TAD	FILCT2
	RAL
	AND	SEGSM1		/THROW OUT CONTRIBUTION FROM HI ORDER BITS OF EXTENSION
	TAD	FIBAS1		/START OF LOGICAL FILE AREA
	CLL RTL
	DCA I	FILCPX		/SAVE IN DISK EXTENSION IN PARAMETER BLOCK
	TAD	FILCT2		/NOW GET LOW ORDER ADDRESS
	AND	SEGLMK
	DCA	FILCT2		/AND SAVE IT
	TAD	FILCPX		/SET DISC ADDRESS
	TAD	FILCPD
	DCA	FILCPX		/POINTS TO LOW ORDER ADDRESS IN PAR. BLOCK
	TAD	FILCPA
	IAC
	DCA	FILCDA		/POINTS TO LOW ORDER ADDRESS IN CONTROL BLOCK
	TAD I	FILCDA		/GET WORD ADDRESS SUPPLIED BY USER
	AND	SEGSM1		/(WORD IN SEGMENT)
	TAD	FILCT2		/+ WORD ADDRESS FROM SEGMENT ARITHMETIC
	DCA I	FILCPX		/SAVE IT IN PARAMETER BLOCK
	TAD	FILCPX		/SET WORD COUNT
	TAD	FILCWC
	DCA	FILCPX		/POINTS TO WORD COUNT IN PARAMETER BLOCK
	DCA I	FILCPX		/NOTHING TRANSFERRED YET
	TAD	FILCDA
	IAC
	DCA	FILCWA		/POINTS TO WORD COUNT IN CONTROL BLOCK
FILCT1,	TAD	SEGSM1		/SEGS12-1
	AND I	FILCDA		/LOW ORDER ADDRESS IN CONTROL BLOCK
	DCA	FILCT2		/DISC ADDRESS MOD SEGS!Z
	TAD I	FILCWA		/GET -WC FROM CONTROL BLOCK
	CLL CIA			/+WC
	TAD	FILCT2		/IF WE DO ENTIRE WC WILL WE GO INTO NEXT
	AND	SEGLMK		/  SEGMENT?
	SNA CLA
	SZL
	JMP	FILCT3
	TAD I	FILCWA		/NO
	JMP	.+3
FILCT3,	TAD	SEGLMK		/SUBTRACT SEGS12 FROM WC, SO WE STAY IN SAME SEGMENT
	TAD	FILCT2
	DCA	FILCT2		/WORD COUNT FOR TRANSFER
	TAD	FILCT2		/UPDATE WORD COUNT IN PARAMETER BLOCK
	TAD I	FILCPX		/OLD VALUE
	DCA I	FILCPX		/NEW VALUE
	TAD	FILCT2		/UPDATE WORD COUNT IN FILE CONTROL BLOCK
	CIA			/+WC
	TAD I	FILCWA		/OLD -WC
	DCA I	FILCWA		/NEW -WC
	TAD I	FILCWA		/ARE WE DONE?
	SNA CLA
	JMP I	FILCTB		/YES
	TAD	FILCT2		/INCREMENT DISC ADDRESS
	CLL CIA			/+WC
	TAD I	FILCDA		/OLD DISC ADDRESS
	DCA I	FILCDA		/NEW DISC ADDRESS
	SZL			/OVERFLOW?
	ISZ I	FILCPA		/YES - INDEX DISC EXTENSION
	TAD I	FILCSW		/GET CURRENT SEGMENT #
	CLL CMA			/-(SEGMENT # +1)
	DCA	FILCT2		/SAVE IT
	ISZ	FILCSW		/POINTS TO NEXT SEGMENT IN WINDOW
	TAD	FILCSW		/ARE WE STILL IN THE WINDOW?
	AND	C0007
	SZA CLA			/NEXT POINTER IN CORE?
	JMP	FILCT4		/YES, SEE IF NEXT SEGMENT IS CONTIGUOUS
	TAD	BASWIN		/NO, IS IT BASIC?
	TAD	FILCSW		/COMPARE THE WINDOW ADDRESS WITH BASIC WINDOW ADDRESS
	SNL CLA
	JMP I	FILCTB		/NO, RETURN
FILCT4,	TAD I	FILCSW		/GET THE NEXT SEGMENT
	TAD	FILCT2		/CONTIGUOUS SEGMENTS?
	SNA CLA
	JMP	FILCT1		/YES - CONTINUE THE TRANSFER
	JMP I	FILCTB		/RETURN
FIBAS1,	SWDEX+JOBMAX
/TAKE CARE OF DUPLEX AND UNDUPLEX IOT'S

UDUP,	TAD	C0200		/DUPLEX BIT IN DDB WORD 1
UUND,	DCA	WS0		/WS0 CONTAINS BIT TO ADD FOR BOTH IOT'S
	TAD	JOB
	TTYUSE			/FIND INPUT DDB
	DCA	WS1		/ADDRESS OF DDB
	DATFLD
	TAD I	WS1		/WORD ONE OF DDB
	AND	C7577		/CLEAR DUPLEX BIT
	TAD	WS0		/SET IT AS CALLED FOR
	DCA I	WS1
	UUOEXT

C7577,	7577
*5000

/TELEPRINTER IOT'S

UTELC=	WS0


UTEL,	JMS	UKT0		/FIND THE CONSOLE # ATTACHED TO JOB
	ISZ	CONDBA		/POINT TO OUTPUT SIDE
UULPT,	TAD	UJSTEL		/TTY FLAG
UUPTP,	DCA	UOUTFL		/SAVE THE DEVICE'S FLAG
	JMS	UKT1		/WHAT IS REQUESTED BY USER?
	JMP	UTELS		/SEND A STRING (6XX0)
UOUTFL,	JSTEL			/DEVICE FLAG POSITION IN STR1
	JMP I	UTELS1		/UNCONDITIONAL SKIP ON USER "TSF, PSF, OR LSF"
	SNA CLA			/6XX4 OR 6XX2
	UUOEXT			/6XX2 - IF WE CLEAR FLAGS WE MAY DIE
	TAD	L2SA		/6XX4
	DCA	TTCHAR
	PRINT			/OUTPUT THE CHARACTER
	SKP			/NO ROOM - REDO LATER
	UUOEXT			/OK - ALL DONE
	STA			/BACK UP HIS/HER PC
	TAD	L2SV0
	DCA	L2SV0
	JMP	UTELS6
UTELS5,	DCA	L2SA		/CLEAR USER'S AC
	TAD	UKT0		/KEEP HIM/HER RUNNING IF WE WERE ABLE TO ACCEPT ANY CHARACTERS
	SNA CLA
UTELS6,	TAD	UOUTFL		/MAKE HIM/HER WAIT FOR DEVICE FLAG
	UUOEXT			/AND AWAY
UJSTEL,	JSTEL

UKT0,	0
	TAD	JOB
	TTYUSE			/GET ADDR OF INPUT DDB
	DCA	CONDDB		/SAVE IT
	DATFLD			/GET CONTENTS OF FIRST WORD OF DDB
	TAD I	CONDDB		/UNIT # + FLAGS IN AC
	CDF
	AND	C1000
	SNA CLA			/CONSOLE IN SI MODE?
	JMP I	UKT0		/NO - OK TO CONTINUE
	GETJTW
	JOBWMK
	CLA
	DATFLD
	DCA I	JOBSWA		/CLEAR HIS/HER WAIT MASK TO HANG HIM/HER UP
	REDO			/SI WILL WAKE HIM/HER UP TO TRY AGAIN LATER
UJSPTP=	C0004
/ "SEND-A-STRING"


UTELS,	UDF			/SELECT USER'S FIELD
	TAD I	L2SA
	SNA CLA
	JMP	UTELS4		/USER'S W.C. IS ZERO - SO SEND NOTHING
	DCA	UKT0
	TAD	L2SA
	IAC
	DCA	UTELC		/POINTS TO ADDRESS OF STRING IN USER AREA
	TAD I	UTELC		/GET ADDRESS-1 OF STRING
	DCA	AXS2		/SAVE POINTER TO STRING
UTELS3,	TAD I	AXS2		/GET CHARACTER FROM USER
	CDF
	DCA	TTCHAR
	PRINT			/OUTPUT THE CHARACTER
	JMP	UTELS5		/BUFFER FULL
	UDF
	ISZ I	UTELC		/BUMP ADDRESS IN USER AREA
	ISZ	UKT0		/DOESN'T MATTER THAT WE MAY SKIP THIS
	ISZ I	L2SA		/BUMP USER'S WORD COUNT
	JMP	UTELS3		/KEEP GOING
UTELS4,	DCA	L2SA		/ALL DONE --- CLEAR USER AC
	JMP I	UTELS1		/EXIT AND SKIP
UTELS1,	UUOEX2

/LINE PRINTER UUO'S

ULPT,	JMS I	UPTLPA
	DEVTBE+3		/LINE PRINTER POSITION IN DEVTBL
	TAD	.-1
	DCA	CONDBA		/IT'S OK TO USE THE PRINTER
	TAD	UJSTEL		/LPT FLAG (20+20=40)
	JMP	UULPT

/PAPER TAPE PUNCH UUO'S

UPTP,	JMS I	UPTLPA		/OK TO USE PUNCH?
	DEVTBE+1		/PUNCH'S POSITION IN THE DEVTBL
	TAD	.-1
	DCA	CONDBA		/PASS ON THE PUNCH'S POSITION
	TAD	UJSPTP		/PUNCH FLAG
	JMP	UUPTP
UPTLPA,	DEVCHK
/ROUTINE TO ANALYZE IOT'S
/CALLING SEQUENCE:
/	IOT IN UUOCAL
/	JMS UKT1
/	RETURN FOR STRING IOT
/	FLAG TO CHECK IN STR1
/	RETURN FOR NON-SKIPPING FLAG TESTS
/	RETURN FOR EVENT TIMES 2 AND 4 (AC=BIT 9 OF IOT; LINK=BIT 10)
/	ILLEGAL MICRO-CODING RESULTS IN "NOP"
/	SKIPPING FLAG RESULTS IN INCREMENT OF USER PC
UKT1,	0
	TAD	UUOCAL
	AND	C0007
	SNA			/STRING?
	JMP I	UKT1		/YES
	ISZ	UKT1
	CLL RAR			/NO
	SNL			/SKIP TEST?
	JMP	UKT12		/NO
	SZA CLA			/YES - ANYTHING ELSE?
	UUOEXT			/YES - BAD MICRO-CODING
	GETJTW			/GET HIS/HER STR1
	JOBSTS+1
	AND I	UKT1		/FLAG TO CHECK
	CLL RTR			/IGNORE THE ERROR FLAG
	ISZ	UKT1		/INDEX PAST ARGUMENT
	SNA CLA			/FLAG SET?
	JMP I	UKT1		/NO - DON'T SKIP
	JMP I	UTELS1		/YES - SKIP ON EXIT
UKT12,	ISZ	UKT1
	ISZ	UKT1
	CLL RAR
	JMP I	UKT1		/INDEX RETURN
UUOERR,	CDF			/SET "ILLEGAL IOT" ERROR CODE
	TAD	JOB
	ERROR
	UUOERF			/CODE=1
USYN,	WAIT			/AND BACK TO THE SCHEDULER

USTMT1=	WS0
SLEEP,	TAD	JOB
	SNA CLA			/PROBABLE TROUBLE DUE TO EAE
	EXIT
	TAD	C0002
DOUSTM,	CIA			/NEGATE
	DCA	DDSTM1		/SAVE - # UNITS OF TIME
	TAD	JOB		/SET CLKTBBL ENTRY FOR THIS JOB
	TAD	CLKTBA
	DCA	USTMT1		/POINTS TO THIS JOB'S ENTRY
	TAD	DOSTM1
	DATFLD
	DCA I	USTMT1		/SET TABLE ENTRY
	STL RAR			/SET AC=JSTIME
	UUOEXT			/EXIT AND WAIT
DOSTM1,	0
CLKTBA,	CLKTBL			/JOB TIMER TABLE ADDRESS

*5171
OVERLA,	SKP			/ERROR
	JMP I	OVER1A		/OK, FINISH UP
	TAD I	FANCOR		/GET NUMBER OF JOB IN TROUBLE
	ERROR			/PASS ERROR TO USER
	DSKERR
	JMP I	OVER1A		/NOW FINISH UP
OVER1A,	OVERL1
/NULL JOB IS THE ONLY INSTRUCTION IN FIELD 0 WHICH
/IS EXECUTED IN USER MODE.
/IT IS RUN WHENEVER THERE IS NOTHING ELSE
/TO DO, OR NOTHING ELSE THAT CAN BE DONE.
/
/WHEN DEBUGGING THE MONITOR, IT IS POSSIBLE
/TO STOP (VIA THE PDP-8 OPERATOR CONSOLE) THE MONITOR
/TO ENTER XDDT. THIS MAY ONLY BE DONE
/WHEN THE SYSTEM IS IN NULJOB. IF THE
/SYSTEM IS STOPPED WHEN NOT IN NULJOB, IT MAY
/BE RESTARTED BY HITTING "CONTINUE," AND THEN
/STOPPED AGAIN. KEEP TRYING - EVENTUALLY YOU'LL CATCH IT.
/DO NOT STOP THE SYSTEM (AND EXPECT TO GET AWAY WITH IT)
/IF ANY I/O IS IN PROGRESS.

/IF THE SYSTEM IS STOPPED IN NULJOB, IT MAY BE
/RESTARTED AT LOCATION 4201 IN FIELD 0.



NULJOB,	JMP	.		/IT'S A BIGGY, ISN'T IT?
