/EDUSYSTEM 50 MONITOR FOR MELROSE HIGH SCHOOL #495AB
/COPYRIGHT 1975
/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/THIS SECTION DEFINES THE HARDWARE CONFIGURATION ON WHICH INDIVIDUAL
/EDUSYSTEM 50 MONITORS ARE TO RUN.
/FOR EACH STATEMENT, THE COMMENT INDICATES THE POSSIBLE RESPONSES.

CPU=2		/1 IF CPU IS PDP-8; 0 IF CPU IS PDP-8/I;
		/2 IF CPU IS PDP-8/E

CORMEM=70	/HIGHEST DATA FIELD SELECT. FOR 12K SYSTEM,
		/RESPOND 20. FOR 16K SYSTEM, RESPOND 30, ETC. (70 MAX)

PHONES=0	/1 IF DC08 INCLUDES 689AG;
		/0 IF IT DOES NOT OR IF TTY INTERFACING IS OTHER THAN DC08

EAE=0		/20 IF PROCESSOR INCLUDES EAE; 0 IF IT DOES NOT

RF08=0		/40 IF SYSTEM DISC IS DF32; 0 IF SYSTEM DISK IS RF08

RS08=1		/NUMBER OF DISCS ON THE SYSTEM, WHETHER DF/DS OR RF/RS.
		/RESPOND WITH 1, 2, 3, OR 4.

PUNCH=1		/1 IS SYSTEM INCLUDES PUNCH; 0 IF IT DOES NOT

TC01=1		/1 IF SYSTEM INCLUDES DECTAPE(S); 0 IF IT DOES NOT

RK05=1		/NUMBER OF RK05 CARTRIDGE DISK DRIVES ON THE SYSTEM; 0 TO 4

CDR=1		/1 IF SYSTEM INCLUDES CARD READER; 0 IF IT DOES NOT

LPT=1		/1 IF SYSTEM INCLUDES LINE PRINTER; 0 IF NO LINE PRINTER

DECIMAL	/MONITOR CAPACITY FOR THIS SYSTEM

JOBMAX=20	/NUMBER OF SIMULTANEOUS USERS (20 MAXIMUM)

/THE FOLLOWING ENTRIES DEFINE THE NUMBER OF TERMINALS
/ATTACHED TO THE SYSTEM, AND ALSO THE METHOD OF INTERFACING

CONTTY=1	/WE ALWAYS HAVE A CONSOLE ( K00 )

DC08A=0		/NUMBER OF TERMINALS INTERFACED VIA DC08A (PDP-8/I ONLY, 19 MAX.)

DC08LO=0	/LOWEST HARDWARE LINE NUMBER UTILIZED ON DC08A; USUALLY 0

PT08=0		/NUMBER OF TERMINALS INTERFACED VIA PT08 (PDP-8 & PDP-8/I ONLY)

KL8=16		/NUMBER OF ADDITIONAL TERMINALS INTERFACED VIA KL8 (PDP-8/E ONLY, 19 MAX.)
/PARAMETERS VERSION 8.24 (01-JANUARY-75)
/
/
/
/
/COPYRIGHT (C) 1975
/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/
/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY
/ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH
/THE	INCLUSION	OF	THE	ABOVE	COPYRIGHT NOTICE.	THIS
/SOFTWARE, OR ANY OTHER COPIES THEREOF,	MAY NOT BE PRO-
/VIDED OR OTHERWISE	MADE AVAILABLE TO ANY	OTHER PERSON
/EXCEPT FOR USE ON SUCH SYSTEM	AND TO ONE WHO AGREES TO
/THESE	LICENSE	TERMS.	TITLE TO AND	OWNERSHIP	OF THE
/SOFTWARE SHALL REMAIN IN DEC.
/
/THE	INFORMATION IN THIS	DOCUMENT IS SUBJECT TO CHANGE
/WITHOUT NOTICE AND SHOULD	NOT BE	CONSTRUED	AS A COM-
/MITMENT BY DIGITAL EQUIPMENT CORPORATION.
/
/DEC	ASSUMES	NO	RESPONSIBILITY	FOR	THE	USE	OR
/RELIABILITY	OF	ITS SOFTWARE ON EQUIPMENT WHICH IS NOT
/SUPPLIED BY DEC.
OCTAL
PLT=0
IFNZRO CPU < IFNZRO DC08A <ILLEGAL CONFIGURATION>>
IFNZRO 24-JOBMAX&4000 <ILLEGAL CONFIGURATION>
IFNZRO 23-KL8-PT08&4000 <ILLEGAL CONFIGURATION>
IFNZRO 24-DC08A&4000 <ILLEGAL CONFIGURATION>
IFZERO DC08A <D689=0>
IFNZRO DC08A < IFNZRO PHONES <D689=4>
	IFZERO PHONES <D689=0>>
NULINE=DC08A+PT08+KL8		/EVERY TERMINAL EXCEPT THE CONSOLE
SWDEX=5				/DISK TRACK OF THE FIRST USER SWAP TRACK
STOMIN=5			/MINIMUM # FREE STORAGE BLOCK FORR NEW JOB
IFZERO RF08-40 <
IFZERO RS08-1 <DSKSIZ=10>
IFZERO RS08-2 <DSKSIZ=20>
IFZERO RS08-3 <DSKSIZ=30>
IFZERO RS08-4 <DSKSIZ=40>
DSKEXT=DSKSIZ-1>
IFZERO RF08 <DSKSIZ=RS08^100	/# 4K DISC TRACKS
DSKEXT=RS08^100+77>
CLOCKR=144			/MILLISECONDS PER TICK
TICMIN=1130			/600 TICKS PER MINUTE
INCLK2=0322			/INITIAL CLOCK
INCLK1=7400
TICSPS=12			/NUMBER OF SYSTEM TICKS PER SECOND
INIDEX=10			/INIT DISC EXTENSION
TS8DEX=30			/FIELD 0 DISC EXTENSION*2^3
ERPDEX=0			/ERPDISK EXTENSION*4
ERPWC=0				/ERP WORD COUNT
FIPDEX=4			/FIP DISC EXTENSION*4
FIPWC=0				/FIP WORD COUNT
SIDEX=ERPDEX			/SI DISC EXTENSION*4
SIWC=ERPWC			/SI WORD COUNT
LIBACT=2			/LIBRARY ACCOUNT #
BRKINI=4000			/INITIAL USER BREAK MASK
/IOT DEFINITIONS

IFNZRO DC08A <			/DC08A,DL8I IOTS
TTIL=6401			/INCREMENT LINE REGISTER
TTI=6402			/TELETYPE INPUT COMMAND
TTO=6404			/TELETYPE OUTPUT COMMAND
TTCL=6411			/CLEAR LINE REGISTER
TTLL=6412			/LOAD LINE REGISTER, CLEAR AC
TTRL=6414			/READ LINE REGISTER
T1SKP=6421			/SKIP ON CLOCK FLAG
T1OFF=6422			/TURN CLOCK OFF
T1ON=6424			/TURN CLOCK ON
TTIR=6461			/INCREMENT THE R REG.
TTCR=6471			/CLEAR THE R REG.
TTLR=6472 >			/LOAD THE R REG.
/EXTENDED MEMORY

CDF=6201			/CHANGE TO DATA FIELD 0
CIF=6202			/CHANGE TO INSTRUCTION FIELD 0
CINT=6204			/CLEAR USER IOT

RDF=6214			/READ DATA FIELD
RIF=6224			/READ INSTRUCTION FIELD
RIB=6234			/READ INTERRUPT BUFFER
RMF=6244			/RESTORE MEMORY FIELD
SINT=6254			/SKIP ON USER IOT
CUF=6264			/USER FLAG OFF
SUF=6274			/USER FLAG ON


/EAE
MUY=7405			/MULTIPLY
DVI=7407			/DIVIDE
NMI=7411			/NORMALIZE
SHL=7413			/SHIFT ARITHMETIC LEFT
ASR=7415			/ARITHMETIC SHIFT RIGHT
LSR=7417			/LOGICAL SHIFT RIGHT
MQL=7421			/LOAD MQ
SCL=7403			/STEP COUNTER LOAD FROM MEMORY
SCA=7441			/STEP COUNTER TO AC
MQA=7501			/MQ TO AC

IFZERO CPU-2 <

DPSZ=7451			/MODE B ONLY - SKIP IF AC&MQ ARE CLEAR
SWBA=7447			/CHANGE MODE TO A
SWAB=7431			/CHANGE MODE TO B (ALSO DOES MQL)
ACS=7403			/AC(7:11) TO SC; AC CLEARED
SGT=6006			/SKIP ON GT FLAG
	>



/LINE PRINTER IOTS
LSF=6661			/SKIP ON CHAR FLAG SET
LCF=6662			/CLEAR CHAR FLAG
LSRP=6663			/SKIP ON NOT READY OR ON ERROR
LLC=6664			/TRANSMIT CHAR TO PRINTER
LSP=6665			/SET PROGRAM INTERRUPT; LP08/LE8
LPC=6666			/TRANSMIT CHAR & CLEAR FLAG
LCP=6667			/CLEAR PROGRAM INTERRUPT
LIE=6665			/AC11 TO INTERRUPT ENABLE; LS08/LS8E

/CTY

TPC=6044			/LOAD TELEPRINTER AND PRINT

/DISC (DF32)

DCMA=6601			/CLEAR
DMAR=6603			/READ
DMAW=6605			/WRITE
DCEA=6611			/CLEAR DISC EXTENDED ADDRESS
DEAL=6615			/LOAD EXTENDED ADDRESS
DFSE=6621			/SKIP ON ERROR
DFSC=6622			/SKIP ON COMPLETION
DEAC=6616			/READ EXTENDED ADDRESS

/DISC (RF08)

DSAC=6612
DORS=6614
DIML=6615
DIMA=6616
DCXA=6641
DXAL=6643

/CARD READER IOT'S
RCSF=6631
RCRA=6632
RCRB=6634
RCNO=6635			/8E ONLY
RCRC=6636			/8E ONLY
RCNI=6637			/8E ONLY
RCSD=6671
RCSE=6672
RCRD=6674
RCSI=6675			/8E ONLY
RCTF=6677			/8E ONLY

/RK05 IOT'S

IFZERO PHONES<
DSKP=	6741
CDLR=	6742
DLAG=	6743
DLCA=	6744
DRST=	6745
DLDC=	6746
DMAINT=	6747 >
IFNZRO PHONES <
DSKP=	6751
DCLR=	6752
DLAG=	6753
DLCA=	6754
DRST=	6755
DLDC=	6756
DMAINT=	6757 >

/DECTAPE

DTRA=6761
DTCA=6762
DTXA=6764
DTSF=6771
DTRB=6772
DTLB=6774


IFZERO CPU <
/KW8I		REAL TIME CLOCK

CECI=6137			/CLEAR AND ENABLE CLOCK AND INTERRUPT
CSCF=6133			/SKIP AND CLEAR FLAG IF FLAG
>
IFZERO CPU-1 <
CECI=6315			/CLOCK ENABLE
CSCF=6301			/SKIP ON CLOCK FLAG
CCF=6302			/CLEAR CLOCK FLAG, CLEAR ENABLE AND CLEAR BUFFER
CLB=6304 >			/LOAD BUFFER FROM AC

IFZERO CPU-2 <
CECI=6131			/CLOCK ENABLE
CSCF=6133			/SKIP AND CLEAR FLAG IF FLAG

/POWER FAIL IOT

SPL=6102			/SKIP IF POWER LOW

/ 8/E PROCESSOR IOT
SRQ=6003			/SKIP ON INTERRUPT REQUEST
GTF=6004			/LINK TO AC0, GT FLAG TO AC1
RTF=6005			/AC0 TO LINK, AC1 TO GT FLAG
CAF=6007 >			/CLEAR ALL FLAGS

IFZERO CPU-4 <
CLLE=6135			/AC11 TO INTERRUPT ENABLE FOR CLOCK
CLCL=6136			/CLEAR CLOCK FLAG
CLSK=6137			/SKIP ON CLOCK FLAG
SPL=6102			/SKIP POWER LOW
CAL=6133 >			/CLEAR AC LOW FLAG

	IFNZRO DC08A <

/689AG

SRF=6701			/SKIP IF RING FLAG
SCF=6711			/SKIP IF CARRIER FLAG
DFCRF=6742			/CLEAR RING FLAG
CTG=6721			/CLEAR GROUP COUNTER
RRS=6702			/READ RING STATUS
ITG=6731			/INCREMENT GROUP COUNTER
STR=6722			/SET TERMINAL READY
EDF=6704			/ENABLE DATAPHONE FEATURES
DDF=6714			/DISABLE DATAPHONE FEATURES
CTR=6724			/CLEAR TERMINAL FLAG
CCF=6741			/CLEAR CARRIER FLAG
RCS=6712			/READ CARRIER STATUS
	>
/FIP IOTS (IN ABBREVIATED FORM)

SEGS=0006			/RETURN NUMBER OF FREE SEGMENTS ON DISK
ASD=0040			/ASSIGN
REL=0042			/RELEASE
REN=0200			/RENAME
OPEN=0201			/OPEN
CLOS=0202			/CLOSE
RFILE=6603			/READ FILE
PROT=0204			/PROTECT
WFILE=6605			/WRITE FILE
CRF=0210			/CREATE
EXT=0211			/EXTEND
RED=0212			/REDUCE
FINF=6613			/FILE INFORMATION
LIN=0214			/LOGIN
LOUT=0215			/LOGOUT
WHO=6616			/WHO
/DEVICE DATA BLOCK

DDBSTS=0			/WORD 1, STATUS AND UNIT NUMBER
	DXON=2000		/XOFF SENT FLAG
	DSI=1000		/DESTINATION IS S.I. FLAG
	DFULL=400		/KEYBOARD BUFFER IS FULL
	DUPL=200		/CONSOLE IN DUPLEX MODE
	SICOM=100		/COMMAND WAITING
	DECHO=400		/CAUSE SI TO RE-ECHO CURRENT INPUT BUFFER

				/DEVICE UNIT NUMBER IS IN BITS 6-11

DDBJN=1				/WORD 2, JOB NUMBER IN 7-11
DDBBRK=2			/BREAK MASK
DDBTIM=3			/TIME THAT DEVICE WAS ASSIGNED
DDBINP=4			/BUFFER FILL POINTER
DDBINC=5			/BUFFER TOTAL COUNT
DDBOUC=6			/BUFFER EMPTY COUNT
DDBOUP=7			/BUFFER EMPTY POINTER
/JOB DATA AREA

JOBSTS=0			/STATUS
				/STR0
	JSRUN=4000		/RUN BIT
	JSEREN=2000		/USER ERROR ENABLE
	JCOMBD=1000		/LAST TIME THE JOB RAN AS COMPUTE BOUND
	JSPEEK=400		/ALLOW "PEEK" AND "LOGOUT" IOT'S
	JSACC=200		/JOB LOGGED IN UNDER PRIVILEGED ACCOUNT (1, 2, OR 3)
	JSIOT=100		/NON-RESIDENT IOT
	JSIOTC=40		/COPY IOT RESULT TO USER
	JSEXON=20		/EXECUTE ONLY
	JSINER=10		/INHIBIT ERROR REPORT FROM SI. (UNTIL NEXT COMMAND)
				/BITS 9-11 ARE SYSTEM ERROR CODE
	UUOERF=1		/IOT ERROR
	SWPRER=2		/SWAP READ ERROR
	SWPWER=3		/SWAP WRITE ERROR
	DSKERR=5		/DISC ERROR
	HUNGDV=6		/HUNG DEVICE

				/STR1
	JSTIME=4000		/TIME IS UP
	JSF0=2000		/FILE 0 IS NOT BUSY
	JSF1=1000		/FILE 1 IS NOT BUSY
	JSF2=400		/FILE 2 IS NOT BUSY
	JSF3=200		/FILE 3 IS NOT BUSY
	JSDEL=100		/KEYBOARD DELIMITER SEEN
	JSLPT=40		/LINE PRINTER BUFFER IN USE BUT NOT FULL
	JSTEL=20		/TELEPRINTER OUTPUT BUFFER IN USE BUT NOT FULL
	JSPTR=10		/CHARACTERS IN READER BUFFER
	JSPTP=4			/PUNCH BUFFER IN USE BUT IS NOT FULL
	JSERR=2			/SYSTEM ERROR DETECTED
	JSWAIT=1		/JOB NOT IN WAIT STATE


JOBSTB=2			/DEVICE STATUS REGISTER (FOR RK05, DECTAPE, AND CARD READER)
JOBWMK=3			/WAIT MASK
JOBSRA=5			/JOB RESTART ADDRESS
JOBERR=6			/JOB ERROR RESTART ADDRESS
JOBLNK=7			/IOT LINKAGE
JOBSWR=10			/SWITCH REGISTER
JOBREG=11			/PC LINK AC
JOBEAE=14			/MQ MODE GT SC
JOBACC=16			/ACCOUNT NUMBER
JOBF0=17			/POINTER TO FILE 0 CONTROL
JOBF1=20			/POINTER TO FILE 1 CONTROL
JOBF2=21			/POINTER TO FILE 2 CONTROL
JOBF3=22			/POINTER TO FILE 3 CONTROL
JOBRTM=23			/LOW ORDER RUN TIME
JOBRTH=24			/HI ORDER RUN TIME
/FILE CONTROL BLOCK - POINTED TO BY JOBFX, X=0,1,2,3
FILWPT=0			/POINTER TO FILE RETRIEVAL WINDOW
FILSCT=1			/SEGMENT NUMBER OF FIRST WINDOW ENTRY
FILPRO=2			/FILE PROTECTION - BIT 9
FILPAR=3			/POINTER TO RFILE OR WFILE PARAMETER BLOCK
FILDA=4				/DISC ADDRESS OF RFILE OR WFILE
FILWC=6				/-WORD COUNT OF RFILE OR WFILE
FILRES=7			/POINTER TO FILPIF IN USER AREA

/FILE RETRIEVAL WINDOW
/WORD 0:	UFD LINK TO NEXT GROUP OF 7 SEGMENT POINTERS
/WORDS 1-7:	SEVEN SEGMENT ADDRESSES

/RFILE OR WFILE PARAMETER BLOCK - POINTED AT BY FILPAR

FILPFN=0			/FUNCTION: 0603 OR 0605
FILPDX=1			/DISC EXTENSION
FILPIF=2			/INTERNAL FILE # (BITS 10-11) AND FIELD # (BITS 7-9)
FILPWC=3			/-WORD COUNT FOR THIS TRANSFER
FILPCA=4			/CORE ADDRESS FOR THIS TRANSFER
FILPDA=5			/DISC ADDRESS
FILPRA=6			/EXEC RETURN ADDRESS FOR THIS TRANSFER
FILPCT=7			/POINTER TO FILE CONTROL BLOCK


/CORE TABLE CONTROL FLAGS

SWAP=4000			/SWAP REQUEST
LOCK=2000			/LOCK IN CORE
NOTRUN=1000			/HAS NOT BEEN SCHEDULED TO RUN
FIP=400				/FILE PHANTOM
SI=200				/SYSTEM INTERPRETER
NOHOLD=140			/INHIBIT "NOTRUN" STATUS AFTER FOUR CONSECUTIVE FILE TRANSFERS
CJOB=37				/BITS 7-11 CONTAIN THE JOB #



/FIP TABLE DEFINITIONS

SATSIZ=530
JTABLE=6000
ENTABL=JTABLE+JOBMAX+1
UTABLE=ENTABL+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX
RTABLE=UTABLE+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX

/TABLES
CORTBL=7001			/CORE ASSIGNMENT TABLE
L2QTB=CORTBL+7
IFZERO DC08A	<DCSIZE=0>
IFNZRO DC08A	<DCSIZE=400>	/SIZE OF FIELD 1 DC08A CODE PLUS 689AG CODE

OUTREG=200			/ACTIVE OUTPUT REGISTERS (TTY'S, LPT & PTP)
SKPTBL=OUTREG+NULINE+3		/START OF IOT SKIP TABLE
SKPTP=SKPTBL+NULINE+NULINE+3	/POSITION OF PUNCH SKIP IN SKIP TABLE
RINGIN=SKPTP+3			/KEYBOARD INPUT RING BUFFER
ENDBUF=OUTREG+200		/END OF KEYBOARD INPUT BUFFER
INPUTS=ENDBUF-RINGIN%2		/NUMBER OF POSSIBLE ENTRIES IN THE KEYBOARD RING BUFFER

DATFLD=CDF 10			/MONITOR DATA FIELD SELECT

IFZERO EAE-20	<MQREG=1>
IFZERO EAE	<IFNZRO CPU&7776 <MQREG=1>
		 IFZERO CPU&7776 <MQREG=0>>
IFNZRO OUTREG&1	<YOU GOOFED>
/SUPER CRITICAL LOCATIONS
/THESE LOCATIONS ARE USED TO LINK TS8, TS8II, FIP, SI AND INIT.

/IT MAY BE NECESSARY TO ADJUST THEM ACCORDINGLY

/DEFINED IN TS8:

WSCHED=2573			/ADDRESS FOR WAIT
GETJTB=401			/GETJTA
CORSRC=1317			/SEARCH CORE TABLE
OVERLA=5171			/FILE STUFF
READFI=574			/MORE FILE STUFF
CONDBA=132			/DEVTBL POINTER USED BY "PRINT" ETC.
RETB=611			/RETURN A BLOCK TO FREE CORE
GETB=1405			/GET A BLOCK OF FREE CORE
GETDB0=1447			/GET A DDB
CLK1=51				/LOW ORDER DAYTIME CLOCK
CLK2=50				/HIGH ORDER DAYTIME CLOCK
DATE=166			/12 BIT DATE WORD
TTCHAR=31			/SAVE REG. FOR CONSOLE CHARACTERS
KBD00=3201			/PROCESS KEYBOARD INPUT
PRINT0=1205			/TYPE OUT A CHARACTER
OVRLA1=562			/MORE FILE STUFF
RUNFI=605			/SI FILE TRANSFER INITIALIZER
L2SF=103			/LEVEL 2 SAVED MODE AND FIELD
SICLR=6572			/SI CLEAR LINKED BUFFER
TIMSI=2421			/TIMER FOR SI "COMWAT"
SIWAIT=1702			/NUMBER OF SI COMMANDS BEING WAITED ON
TIMFIP=2423			/TIMER FOR FIPLOCK
FIPLOK=2724			/CORTBL STATUS CHECK FOR FORCE OUT
CLKINI=322			/CONVERT HARDWARE CLOCK TO SYSTEM-TICKS (100 MS)
BLT0=1602			/BLOCK TRANSFER FROM CORE TO CORE
KBDSQ=3213			/ADDRESS OF JMS TO ^S/^Q CODE

/DEFINED IN TS8II:

F1TCNT=175			/SI DDB CHARACTER COUNT
F1ECNT=176			/SI DDB EMPTY COUNT
F1BUF=177			/SI DDB EMPTY BLOCK POINTER
DTJOB=20			/JOB OWNING THE DECTAPE CONTROLLER
RKJOB=54			/JOB OWNING RK05 CONTROLLER
DTSI=1175			/SI TERMINATE A DECTAPE ON TIMER
DATA1=2200+DCSIZE
DEVTBL=DATA1+140
DEVTBE=DEVTBL+NULINE+NULINE+2
JOBTBL=DEVTBE+22
CLKTBL=JOBTBL+JOBMAX+1
TTYTBL=CLKTBL+JOBMAX+1
PRGTBL=TTYTBL+JOBMAX+1
DSUTBL=PRGTBL+JOBMAX+JOBMAX+JOBMAX-7
FIPBLK=7720			/FIXED BLOCK FOR FIP IO
WINBAS=7730			/ADDRESS OF THE BASIC WINDOW
OUTDIF=-OUTREG^2+DEVTBL		/FOR LINKING BETWEEN OUTREG AND DEVTBL
F1OFFJ=164			/FOR OFF/ON COMMANDS USED BY SI
IFNZRO DEVTBL&1 <YOU GOOFED>

/DEFINED IN SI

DTSIDT=7270			/RETURN FROM STOPPING A DECTAPE ON TIMER
VERBRK=7600			/START OF INSTALLATION DEFINED LOGIN MESSAGE
/TS8 VERSION 8.24 (01-JANUARY-75)
/
/
/
/
/COPYRIGHT (C) 1975
/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/
/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY
/ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH
/THE	INCLUSION	OF	THE	ABOVE	COPYRIGHT NOTICE.	THIS
/SOFTWARE, OR ANY OTHER COPIES THEREOF,	MAY NOT BE PRO-
/VIDED OR OTHERWISE	MADE AVAILABLE TO ANY	OTHER PERSON
/EXCEPT FOR USE ON SUCH SYSTEM	AND TO ONE WHO AGREES TO
/THESE	LICENSE	TERMS.	TITLE TO AND	OWNERSHIP	OF THE
/SOFTWARE SHALL REMAIN IN DEC.
/
/THE	INFORMATION IN THIS	DOCUMENT IS SUBJECT TO CHANGE
/WITHOUT NOTICE AND SHOULD	NOT BE	CONSTRUED	AS A COM-
/MITMENT BY DIGITAL EQUIPMENT CORPORATION.
/
/DEC	ASSUMES	NO	RESPONSIBILITY	FOR	THE	USE	OR
/RELIABILITY	OF	ITS SOFTWARE ON EQUIPMENT WHICH IS NOT
/SUPPLIED BY DEC.
	VERNUM=30
/PAGE 0
FIELD 3				/LOAD THIS INTO TRACK 3 ON DISK

*1
	JMP I	.+1

C0200,	200
WS0,	0			/WORKING STORAGE FOR MAIN FLOW
WS1,	0
JOBSWA,	0


*10
ACX10,	0			/FOR INTERRUPT SERVICE
ACX11,	RINGIN-1		/INPUT RING BUFFER POINTER (LEVEL 1)
DSPAR,	0			/DISK HANDLER
L2Q,	L2QTB-1			/LEVEL 2 QUEUE
L2QE,	L2QTB-1			/LEVEL 2 EMPTY POINTER
AXS1,	0			/MISCELLANEOUS LEVEL 2 AUTO-INDEX
AXS2,	0			/	"
DSKPTR,	DSUTBL+6		/DISK REQUEST QUEUE POINTER


SIDATA=20			/SYSTEM INTERPRETER DATA
*SIDATA

COMPTR,	DEVTBL			/POINTER TO LAST DEVTBL ENTRY SCANNED
SIBUF,	0			/BUFFER STATE
SICNT,	0
COMDSP,	0			/FIP RETURN DISPATCH
SIFLG,	0			/COMMAND FLAGS
SICHAR,	0			/SAVE LAST CHAR FROM COMMAND SCAN
SIREG,	0			/USER AC, LINK, PC
	0
	0
TTCHAR,	0			/TTY CHARACTER

CONSTANTS=SIDATA+12
*CONSTANTS
C0002,	2
C0003,	3
C0004,	4
C0007,	7
C0037,	37
C0100,	100
C1000,	1000
C7770,	7770

JOBCON=CONSTANTS+11		/JOB CONTROL
*JOBCON

JOBTIM,	0			/NUMBER OF TICKS RUN
JOBTBA,	JOBTBL			/JOB TABLE ADDRESS

FRSTOR=JOBCON+3
*FRSTOR

FREE,	0			/POINTER TO HEAD OF FREE STORAGE
FRECNT,	0			/# FREE BLOCKS AVAILABLE


TIMDAT=FRSTOR+2			/CLOCK AND DATE
*TIMDAT

/CLOCK
CLK2,	0
CLK1,	0


SCHDAT=TIMDAT+2
*SCHDAT				/SCHEDULING DATA

COMCNT,	0			/NUMBER OF COMMANDS AWAITING EXECUTION
SQREQ,	0			/SWAP REQUEST FLAG
FINISH,	0			/+(I)-(O) FIELD OF JOB BEING SWAPPED
FIT,	0			/JOB # TO BE SWAPPED IN
FORCE,	0			/FIELD TO BE SWAPPED OUT

DATEND=60			/END OF FIELD 0 PAGE 0 DATA



FIPDAT=155			/DATA REFERENCED BY FIP
*FIPDAT

FIPJOB,	0			/JOB NOW (OR SOON TO BE) RUNNING FIP
C0400,	400
SEGSIZ=C0400			/# WORDS PER SEGMENT
*160
JOB,	0			/# OF CURRENT JOB
JOBDAT,	.			/ADDRESS OF CURRENT JOB DATA LIST. MUST RESIDE IN DATA FIELD.
C7000,
CORTBA,	CORTBL-1		/CORE ALLOCATION TABLE
DEVTBA,	DEVTBL			/DEVICE TABLE
DSUTBA,	DSUTBL			/USER DISC REQUEST QUEUE
DSBUSY,	-1			/DISC BUSY COUNT

/THE DATE IS KEPT AS A 12 BIT NUMBER IN THE FORMAT
/DATE=((YEAR-1974)*12+(MONTH-1))*31+DAY-1

DATE,	0


FISUBL=400

BLTA,	BLT0			/BLOCK TRANSFER
BLT=JMS I	BLTA
CORSRA,	CORSRC
CORE=JMS I CORSRA
GETBA,	GETB
GETBLK=JMS I GETBA
GETDBA,	GETDB0			/GET A DATA BLOCK
GETDDB=JMS I GETDBA
PRINTA,	PRINT0			/TYPE OUT A CHARACTER
PRINT=JMS I PRINTA
GETJT0,	GETJTB			/GET JOB DATA TABLE ADDRESS
GETJTA=JMS I	GETJT0
GIRSCA,	GIRSC			/STORE CHARACTER IN BUFFER
STORE=JMS I	GIRSCA
RETBA,	RETB			/RETURN BLOCK TO FREE STORAGE
RETBLK=JMS I	RETBA
WAITA,	WSCHED
WAIT=JMP I WAITA
/SUBROUTINE DISPATCHES

SUBDSP=DATEND
*SUBDSP

IOR=JMS I .
	IOR0			/INCLUSIVE OR
UUOEXT=JMP I .
	UUDEX1			/UUO EXIT
FIUSER,	DSUSER			/QUEUE FILE REQUEST IN DSUBTL
ERROR=JMS I .
	SYSERR			/SYSTEM ERROR
TTYUSE=JMS I .
	TTYSRC			/FIND USER TTY
SCHED=JMP I .
SCHEDA,	SCHEDI			/SCHEDULE NEXT JOB NOW CORE RESIDENT
RSCHED=JMP I .
RSCHEA,	SCHED0			/FIND NEXT JOB TO BE RUN
EXIT=JMP I .
EXITA,	L2EXIT			/LEAVE LEVEL 2
REDO=JMP I .
	REDO0			/REPEAT IOT LATER WHEN (HOPEFULLY) IT CAN BE COMPLETED
KEY=JMS I .
	KBD00			/PROCESS KEYBOARD INPUT INTO A USER'S INPUT BUFFER
SAVJOB=JMS I .
	SAVJO0			/SAVE THE STATUS OF THE CURRENT JOB
RESJOB=JMS I .
	RESJO0			/RESTORE THE PREVIOUSLY SAVED STATUS
START=JMP I .			/START USER JOB
	SUJ
DSGO=JMS I .
	DSGO0			/START DISK REQUEST
GETJTW=JMS I .
	GETJW0			/GET CONTENT OF JOB STATUS WORD (CURRENT JOB)
GETJTI=JMS I .
	GETJI0			/GET CONTENT OF JOB STATUS WORD (ANY JOB)
DISMIS=JMP I .
	DISMI0			/DISMISS INTERRUPTS
RUNABL=JMS I .
	RUNTST			/TEST IF SPECIFIED JOB IS RUNNABLE

SETFLG,	PTSTAR

L2CON=SUBDSP+23			/LEVEL 2 (EXEC) CONTROL
*L2CON

L2SF,	100			/RELOCATION AND MODE
L2SV0,	NULJOB			/SAVED PC
L2SVLK,	0			/SAVED LINK
L2SA,	0			/SAVED ACCUMULATOR

FETCH=JMS I .
	TOF			/RETRIEVE A CHARACTER FROM A LINKED FREE CORE BLOCK
CLOCK,	-1			/NUMBER OF SYSTEM TICKS PENDING ON LEVEL 2 (MINUS 1)
DEAD,	0			/CORTBL-1 OF JOB THAT SHOULD BE PUSHED OUT
SCHNEW,	0			/-1 TO ALLOW FULL TIME SLICES
C0010,	10
IFNZRO	DC08A <
D6FLAG,	-1			/ALLOW 689 ANSWER ONLY ONE TIME IN L2Q
D6ANSR,	ANSWER >


/ROOM FOR PATCHES!!
*CONDBA
	0			/POINTER TO DEVTBL POSITION CURRENTLY UNDER CONSIDERATION
CONDDB,	0			/ADDRESS OF DDB UNDER CONSIDERATION
SEGLMK,	7400			/-WRDSEG
C7400=SEGLMK
BASWIN,	-WINBAS-1
CJOBDA=	JOBDAT
C0006,	6
C0070,	70
SEGSM1,				/WRDSEG-1
C0377,	377
C0005,	5
C0600,	600
C3777,	3777
C6203,	6203
QUANTM,
C7776,	7776
C0177,	177
CURJOB,	0			/NUMBER OF JOB INTERRUPTED BY FILE TRANSFER
*150
UDF=JMS .			/SELECT FIELD OF CURRENT JOB
WS2,	0
UUDF,	0			/DATA FIELD SELECT FOR FIELD OF CURRENT JOB
	JMP I	.-2
INTRC,	0			/TRACK # TO BE SWAPPED IN (DF32 0X00) (RF08 000X)
OUTTRC,	0			/TRACK # TO BE SWAPPED OUT
*42
FANCOR,	CORTBL+1		/FIELD OF PHANTOM  I.E. FIELD 2
*57
BONUS,	0			/JOB # JUST BROKEN OUT OF I/O WAIT

*157
SWPIOA,	SWPIO
*45
SWPREA,	SWPRET

/FIELD 0 PAGE DIRECTORY
IOTS=4000
DISC=IOTS+1400			/DISC CONTROL
	*200

/PRIORITY LEVEL 0 (HIGHEST PRIORITY)
/KEEPS TRACK OF REAL TIME
/ALWAYS ENTERED BY CLOCK FLAG
/DISMISSES TO LEVEL 1 IF INTERRUPT WAS NOT FROM LEVEL 1
/OTHERWISE, DISMISSES TO INTERRUPTED LOCATION.

INT,
IFZERO CPU-2 <
	SPL			/POWER FAILURE?
	JMP	INTX0		/NO
	JMP I	.+1		/YES, HURRY UP AND SERVICE IT
	POWINT
INTX0,	>
IFZERO CPU-4 <
	SPL			/POWER LOW
	SKP			/NO
	JMP	.-2		/WAIT FOR POWER
	CAL >			/CLEAR POWER LOW CONDITION
	SINT			/USER IOT? (HAS TO BE CHECKED FIRST!!!)
	IFZERO DC08A	<JMP INT0	>
	IFNZRO DC08A	<SKP	>/DC08?
	JMP I	UUOA		/YES, GO SAVE LEVEL 2 STUFF
	IFNZRO DC08A	<
	T1SKP			/CLOCK?
	JMP	INT0		/NO, KEEP LOOKING
	ISZ	CLKCNT		/YES, IS A SYSTEM TICK UP YET?
	JMP I	T8DISA		/NO, RUN DC08 INTERRUPT SERVICE
	DCA	CLKIT		/SAVE AC AT INTERRUPT
	TAD	L2TIMA		/SCHEDULE L2TIME ON L2QUE
	ISZ	CLOCK		/BUMP NUMBER OF TICKS TO COUNT AT LEVEL 2
	CLA SKP			/ALREADY SCHEDULED
	DCA I	L2Q
	TAD	CLKINI		/RESET TIMER FOR NEXT TICK
	DCA	CLKCNT
	TAD	CLKIT		/GET AC AT INTERRUPT
	JMP I	T8DISA		/RUN DC08 SERVICE
T8DISA,	T8DIS>
/INTERRUPTS OTHER THAN 680 (LEVEL 1)
/DISMISSES TO LEVEL 2 IF NOT FROM LEVEL 1 OR 2.

INTAC,	0			/AC AT LEVEL 1
INTLK,	0			/LINK AT LEVEL 1
UUOA,	UUO0



INT0,	DCA	INTAC		/SAVE AC AND LINK
	RAR
	DCA	INTLK

	IFZERO DC08A <
IFNZRO CPU-4 <CSCF>		/SKIP AND CLEAR FLAG IF FLAG
IFZERO CPU-4 <CLSK>		/SKIP IF CLOCK FLAG
	JMP	DTINT
IFZERO CPU-4 <CLCL>		/CLEAR CLOCK FLAG
		IFZERO CPU-1 <
		CLA CMA		/KW08
		CCF CLB		/CLEAR FLAG AND LOAD BUFFER
		CECI	>	/ENABLE

	ISZ	CLKCNT		/IT WAS CLOCK - WAS IT A SYSTEM TICK
	JMP	DISMI1		/NO - NOTHING TO DO THEN
	TAD	CLKINI		/YES - SET FOR NEXT SYSTEM TICK
	DCA	CLKCNT
	ISZ	CLOCK
	JMP	DISMI1
	TAD	L2TIMA		/SCHEDULE A SYSTEM TICK ON LEVEL 2
	JMP	DISMI0	>



DTINT,	JMS	DTCHK
	DISMIS
IFNZRO D689 <
	SRF
	JMP	D6CF
	DFCRF			/CLEAR THE RING FLAG
	ISZ	D6FLAG		/HAVE WE GOTTEN MORE THAN ONE FLAG?
	DISMIS			/YES! DON'T OVERFLOW L2Q
	TAD	D6ANSR
	DISMIS			/SCHEDULE PHONE ANSWERING ON L2Q
D6CF,	SCF
	JMP	RFINT
	CCF			/A CARRIER HAS CHANGED
	TAD	DFM4
	DCA I	TIM68A		/TAKE A LOOK AT IT IN FOUR SECONDS
	DISMIS
DFM4,	-4
TIM68A,	TIM689	>
RFINT,
IFZERO RF08-40	<DFSE		/DF32 DISK ERROR?
	JMP I	DSWAIT		/YES
	DFSC			/DF32 DISK COMPLETION FLAG?
	JMP I	INT2		/NOPE
		>
IFZERO RF08 <DFSC DFSE		/RF08 DISK?
	JMP I	INT2		/NO
	DFSE >			/RF08 ERROR?
	ISZ	DSWAIT		/NO ERROR - TRANSFER OK

	JMP I	DSWAIT
DSWAIT,	0			/SET BY DISK SERVICE
INT2,
IFNZRO CDR <INTCDR>		/CONTINUE IN THE INTERRUPT CHAIN
IFZERO CDR <RINT>
DTCHK,	0
IFNZRO CDR <RCSF	>	/CARD READER?
IFZERO CDR <JMP	.+6	>
	JMP	.+5
	CIF DATFLD-1
	CDF
	JMP I	.+1
	CDL11
IFNZRO RK05 <	DSKP	>	/RK05?
IFZERO RK05 <	JMP	.+5	>
	JMP	.+4
	CIF DATFLD
	JMP I	.+1
	RKL11
IFNZRO TC01 <DTSF	>	/DECTAPE?
IFZERO TC01 <JMP	.+11	>
	JMP	.+10
	DTRA
	AND	C0004
	SNA CLA
	JMP	.+4
	CIF DATFLD
	JMP I	.+1
	DTL11
	ISZ	DTCHK
F1RTN,	JMP I	DTCHK		/THESE 3 DEVICES RETURN HERE FROM FIELD 1
INT7,	TAD	CLKIT
	DCA I	L2Q		/QUEUE REQUEST
DISMI1,	TAD	INTLK		/RESTORE LINK AND AC
	CLL RAL
	TAD	INTAC
DISMI2,	RMF			/RESTORE IF, DF, & MODE
	ION
	JMP I	0		/BACK TO INTERRUPTED PROGRAM

L2TIMA,	L2TIME
REST0,
CLKIT,	0			/TEMPORARY FOR AC
CLKCNT,	-3			/WILL INITIALIZE ITSELF TO THE CORRECT VALUE

*322
CLKINI,	0			/SET BY INIT TO CAUSE 1 SYSTEM TICK TO = 100 M.S.
/DISMIS ROUTINE
/ENTERED FROM INTERRUPT HANDLER TO ENTER LEVEL 2 FROM LEVEL 1
/AC = ADDRESS OF LEVEL 2 SERVICE ROUTINE
/	OR 0 IF NO LEVEL 2 SERVICE REQUIRED

DISMI0,
C6201,	CDF
	SNA			/DISMISS INTERRUPTS?
	JMP	DISMI1		/NO - BACK TO WHATEVER WAS GOING ON BEFORE
	DCA	CLKIT		/SAVE DISPATCH
	RIB			/MODE BIT = 100
	AND	C0100
	SNA CLA			/FROM USER MODE?
	JMP	INT7		/NO - QUEUE REQUEST UNTIL LATER
	TAD	INTAC		/MOVE THE AC TO LEVEL 2
	DCA	L2SA
	TAD	INTLK		/MOVE LINK TO LEVEL 2
	DCA	L2SVLK
	TAD	0		/MOVE PC TO LEVEL 2
	DCA	L2SV0
	RIB
	DCA	L2SF		/FIELDS AND MODE TO LEVEL 2
	ION			/DISMISS TO EXEC MODE, FIELD 0, LEVEL 2
	JMP I	CLKIT


/RESTORE INTERRUPTED STATE

RESTOR,	DCA	REST0		/POINTER TO SAVED INFO
	TAD I	REST0		/SAVED FIELDS AND STATE
	AND	C0070		/GET INSTRUCTION FIELD
	TAD	C6203
	DCA	RCIF		/CIF FOR PROPER FIELD
	TAD I	REST0
	CLL RTL
	RAL
	AND	C0070		/CDF FOR RETURN
	TAD	C6201		/NOT NECESSARILLY EQUAL TO INSTRUCTION FIELD
	DCA	RCDF
	TAD I	REST0
	AND	C0100		/USER PROGRAM, FIP OR SI?
	SZA CLA
	SUF			/USER MODE; SET USER FLAG
	ISZ	REST0
	TAD I	REST0		/PC
	DCA	0
	ISZ	REST0
	TAD I	REST0		/LINK
	CLL RAL
	ISZ	REST0
	CLA
	TAD I	REST0		/AC
RCIF,	0
RCDF,	0
	ION
	JMP I	0		/BACK TO INTERRUPTED PROGRAM
/RETURN ADDRESS OF LINKED TABLE ENTRY
/CALL	TAD TABLE ENTRY ADDRESS
/	GETJTA
/	ENTRY NAME (NUMBER)
/	RETURN

GETJTB,	0
	DCA	GETJT1		/SAVE JOBTABLE ADDRESS
	TAD I	GETJTB		/ENTRY #
	DCA	GETJT2
	RDF			/FIELD CALLED FROM
	TAD	C6203
	DCA	GETJT3		/SO WE CAN GET BACK
	DATFLD			/CHANGE TO DATA FIELD
	DCA I	GETJTZ		/CLEAR FLD 1 LOC. 0
GETJ1,	TAD I	GETJT1		/GET JOBTBL ENTRY
	CLL			/TO LET CALLER KNOW IT DOESN'T EXIST
	SNA			/LINK 0?
	JMP	GETJ3		/YES - RETURN 0
	DCA	GETJT1		/NO, JOB DATA ADDRESS
	TAD	GETJM7
	TAD	GETJT2		/ARE WE IN PROPER BLOCK?
	SPA			/ENTRY<7?
	JMP	.+3		/YES
	DCA	GETJT2		/NO, LINK TO NEXT
	JMP	GETJ1		/AND TRY AGAIN
	STL CLA IAC		/SET LINK TO LET CALLER KNOW WE WERE SUCCESSFUL
	TAD	GETJT2		/INDEX INTO BLOCK
	TAD	GETJT1		/START OF BLOCK
GETJ3,	ISZ	GETJTB		/SKIP CALLING ARGUMENT
GIRSB,
GETJT3,	0			/BACK TO CALLING FIELD
	JMP I	GETJTB
GETJTZ,	0			/POINTER TO LOC. 0 OF FIELD 1 (NOT FOR TEMPORARY STORAGE)

GIRSCT,				/POINTER TO ITEM COUNT
GETJT1,	0
GIRST,
GETJT2,	0
GETJM7,	-7
/STORE CHARACTER
/CALL WITH ADDRESS OF DDB IN AC, CHARACTER IN TTCHAR
/	STORE
/	ADDRESS OF ROUTINE TO CHECK BUFFER SIZE
/	WON'T FIT
/	OK
EMPTY=WS1
DBINPA=C0004

GIRSC,	0
	TAD	DBINPA
	DCA	GIRSB		/POINTS TO ADDRESS OF BUFFER
	TAD I	GIRSB
	SNA			/IS BUFFER SET UP? (I.E. IS FILL POINTER NON ZERO?)
	JMP	GIRSC8		/NO - GO GET A BUFFER
	DCA	GIRSCT		/POINTER TO FILL COUNT
	ISZ I	GIRSCT		/ANY ROOM LEFT?
	JMP	GIRSC1		/YES
	CDF
	TAD I	GIRSC		/GET ADDRESS OF SIZE SUBROUTINE
	DATFLD
	DCA	GIRST
	TAD	GIRSB
	IAC			/POINT TO CHARACTER COUNT
	JMS I	GIRST		/GO CHECK BUFFER SIZE
	JMP	GIRSC0		/BUFFER ALREADY FULL - NO ROOM FOR THIS ENTRY
GIRS11,	CLL CLA CMA RTL		/IS THERE ENOUGH (I.E. 3 BLOCKS) FREE CORE LEFT?
	TAD	FRECNT
	SPA SNA CLA
	JMP	GIRSC0		/NO - DON'T GIVE HIM ANOTHER BUFFER NOW
	TAD	GIRSCT		/OK - GET A BUFFER
	CDF
	GETBLK			/NO, LINK NEW BUFFER
	JMP	GIRSC0		/NONE AVAILABLE
	DATFLD
	TAD I	GIRSCT		/POINTER TO HEAD OF NEW BUFFER
	DCA I	GIRSB		/BUFFERS NOW CHAINED TOGETHER
GIRSC7,	TAD I	GIRSB
	DCA	GIRSCT		/POINT TO NEW FILL COUNT
	TAD	GIRSIZ		/INITIALIZE CHAR COUNT TO -12
	DCA I	GIRSCT		/AND SAVE IN NEW BLOCK
GIRSC1,	TAD I	GIRSCT		/ARE WE DOING LAST THREE CHARACTERS IN BLOCK?
	TAD	C0003
	SMA
	STL RAL			/YES SO MULT. BY 2 THEN ADD 1
	SPA			/PACK?
	STL CIA			/NO - GET ADDRESS WITHIN BUFFER
	TAD I	GIRSB		/START OF BUFFER
	DCA	GIRSCT		/ADDRESS TO STORE CHARACTER
	TAD	TTCHAR
	SNL			/PACK?
	JMP	GIRSC4		/YES
	AND	C0377
GIRSC5,	DCA I	GIRSCT		/STORE CHARACTER
	ISZ	GIRSB		/POINT TO CHARACTER COUNT
	ISZ I	GIRSB		/COUNT THIS ENTRY
	ISZ	GIRSC		/INDICATE SUCCESS
GIRSC3,	ISZ	GIRSC		/TO SKIP PAST ARG.
	JMP I	GIRSC
GIRSC4,	RTL			/SHIFT BITS TO LEFT
	RTL
	AND	C7400
	TAD I	GIRSCT		/AND SAVE IN CURRENT LOCATION IN BUFFER
	DCA I	GIRSCT
	ISZ	GIRSCT		/NEXT LOCATION IN BUFFER
	TAD	TTCHAR		/GET LOW 4 BITS FROM CHARACTER
	RTR
	RTR
	RAR
	AND	C7400		/AND COMBINE WITH PREVIOUS CHARACTER
	TAD I	GIRSCT		/SAVE THE WHOLE MESS
	JMP	GIRSC5		/AND AWAY

GIRSC8,	CDF			/ATTACH A BUFFER TO FILL POINTER
	TAD	GIRSB		/LINK ADDRESS
	GETBLK
	JMP	GIRSC3		/CAN'T GET ONE - TOO BAD
	DATFLD			/OK - SET UP POINTERS
	STL RTL			/ 2 PLUS
	TAD	GIRSB		/ADDRESS OF FILL POINTER
	DCA	EMPTY		/ = ADDRESS OF EMPTY COUNT
	STA
	TAD	GIRSIZ		/-13 TO THE EMPTY COUNT
	DCA I	EMPTY
	ISZ	EMPTY		/NOW INITIALIZE THE EMPTY POINTER
	TAD I	GIRSB		/SET EMPTY POINTER EQUAL TO FILL POINTER
	DCA I	EMPTY		/SINCE IT'S THE ONLY BUFFER
	JMP	GIRSC7
GIRSC0,	DATFLD			/COULDN'T SQUEEZE CHARACTER IN
	STA			/BUT WE ALREADY BUMPED FILL COUNT
	DCA I	GIRSCT		/INDICATE CURRENT BLOCK IS STILL FULL
	JMP	GIRSC3		/AND EXIT WITHOUT SKIPPING

GIRSIZ,	-12			/10 (DECIMAL) CHARACTERS/BLOCK

OVRLA1,	JMS I	FIUSER
	WAIT

REMJOB,	0
	TAD	SCHNEW		/GET NEW JOB MASK
	AND	JOB		/AND THE CURRENT JOB
	DCA	CURJOB		/IF THERE'S A JOB; REMEMBER HIM/HER
	SAVJOB			/SAVE HIS/HER STATE
	STA
	DCA	SCHNEW		/SET MASK FOR FULL SLICE
	JMP I	REMJOB

READFI,	TAD	SIREG		/FIND RESIDENT FIELD FOR THIS JOB
FILCON,	DCA	WS0
	JMS	REMJOB		/BUMP OFF THE PRESENT USER - BUT MAYBE REMEMBER WHO [S]HE IS
	TAD	WS0
	CORE
	CJOB			/ANY FIELD WITH THIS JOB IN IT IS OK
	HLT			/IF IT'S NOT THERE IT'S DOOMS DAY FOR ALL
	DCA	L2SF		/RESTORE FOR THIS JOB
	TAD	WS0
RUNFI,	RESJOB			/RESTORE LEVEL TWO FOR THIS JOB
	GETJTW			/GET ADDRESS OF FILE PARAMETER BLOCK
	JOBLNK
	JMP I	SIFILA		/AND OFF TO THE FILE HANDLER
/RETURN BLOCK TO FREE LIST
/CALL	TAD BLOCK ADDRESS
/	RETBLK
/	RETURN WITH LINK IN AC

RETB,	0
	DCA	RETB1		/SAVE BLOCK ADDRESS
	RDF
	TAD	C6203
	DCA	RETF		/FOR RETURNING TO CALLER
	TAD	RETB1
	CLL
	TAD	RETEND		/SEE IF IT'S FIP'S BLOCK OR A FILL COUNT FOR A LINKED BUFFER
	SZL CLA
	JMP	RETF		/IT IS - DON'T RELEASE IT
	TAD	RETB1
	SNA
	HLT			/SHOULD NEVER RETURN 0000
	AND	C0007
	SZA
	HLT			/SHOULD ALWAYS BE XXX0
	DATFLD
	TAD I	RETB1		/NOW GET THE LINK, IF ANY
	DCA	RETBL		/SAVE IT
	TAD	FREE		/GET OLD START OF FREE LIST
	DCA I	RETB1		/PUT IT IN LINK
	TAD	RETB1		/PUT ADDRESS OF THIS BLOCK
	DCA	FREE		/AS START OF FREE LIST
	ISZ	FRECNT		/INCREMENT FREE
	TAD	RETBL
RETF,	0			/RETURN WITH LINK
	JMP I	RETB

RETEND,	-FIPBLK


SIFILA,	SIFILE
SJCOPY,	JSIOTC

SUJERR=	C0007
/RESTART USER JOB AT RESTART ADDRESS

GIR90,	CIA			/NEGATE THE JOB NUMBER
	TAD	JOB		/IS THE JOB CURRENTLY RUNNING?
	SZA CLA
	JMP	GIR91		/NO
	TAD I	WS0
	DCA	L2SV0		/SET PC=RESTART ADDRESS
	DCA	L2SVLK		/SET LINK=0
	DCA	L2SA		/SET AC=0
	JMP I	GIR0A		/LEAVE
GIR91,	TAD I	WS0
	DCA I	JOBSWA		/SET PC=RESTART ADD
	ISZ	JOBSWA
	STA
	DCA I	JOBSWA		/SET LINK=-1 SO WE'LL REMEMBER TO CLEAR HIS'HER LINK & AC LATER
	JMP I	GIR0A
GIR0A,	KBD01
CNOTR,	-NOTRUN-1

/START USER JOB

SUJ,	TAD	L2SF		/CLEAR NOTRUN FLAG SO JOB CAN BE SWAPPED
	AND	C0007		/GET CORTBL INDEX
	TAD	CORTBA
	DCA	SUJSRC		/POINTS TO ENTRY IN CORTBL FOR THIS JOB
	TAD I	SUJSRC		/GET CORTBL ENTRY
	AND	CNOTR		/CLEAR NOT RUN BIT
	DCA I	SUJSRC		/SAVE ENTRY
	TAD	JOB		/IS IT A PHANTOM?
	AND	C0600
SUJ2,	SZA CLA
	EXIT			/YES - WE'RE ALL SET
SUJ5,	GETJTW			/NO, IOT RESULTS TO USER?
	JOBSTS
	AND	SJCOPY		/IOTC BIT IN STR0
	DATFLD
	SNA
	JMP	SUJ4		/NO - WAS THERE A SYSTEM ERROR?
	CMA			/CLEAR THE BIT
	AND I	JOBSWA		/JSIOTC:=0
	DCA I	JOBSWA		/SAVE NEW STR0
	CDF			/GET # ARGUMENTS TO RETURN
	GETJTW
	JOBLNK
	DCA	SUJSRC		/POINTS TO WORD1 OF PARAMETER BLOCK
	DATFLD
	TAD I	SUJSRC		/IOT IN QUESTION
	CDF
	RAR			/SAVE "WHO FINF" INDICATOR IN LINK
	AND	C0004
	SNA CLA			/WAS BIT 8 ON?
	JMP	SUJ3		/NO - MUST HAVE BEEN AN RFILE OR WFILE WINDOW TURN
	CML CMA RAL
	CLL RTL			/CA=-3 FOR "WHO";  AC=-7 FOR "FINF"
	DCA	SUJCNT		/SAVE COUNT
	TAD	SUJSRC		/RETURN PARAMETER BLOCK
	RETBLK
	CLA
	ISZ	SUJSRC		/POINTS TO WORD 2 OF BLOCK
	TAD	UUDF		/TRANSFER RESULTS TO USER'S FIELD
	DCA	SUJDFS		/...SET FIELD IN BLT CALL
	TAD	L2SA		/POINTS TO USER'S PARAMETERS
	DCA	SUJDES		/SAVE FOR BLT
	DCA	L2SA		/CLEAR HIS/HER AC
	BLT			/MOVE RESULTS TO USER
	DATFLD			/FROM FIELD 1
SUJSRC,	0			/SOURCE ADDRESS
RETBL,
SUJDFS,	0			/TO USER FIELD
RETB1,
SUJDES,	0			/AT THIS ADDRESS
SUJCNT,	0			/-WORD COUNT
	TAD	JOB
	RUNABL			/IS [S]HE STILL RUNNABLE?
	WAIT			/NO - JUST NEEDED TO PASS THE INFO TO HIM/HER
	JMP	SUJ5

SUJ3,	TAD	SUJSRC		/UFILE RETURN
	JMP I	SIFILA

SUJ4,	ISZ	JOBSWA		/POINT AT STR1
	TAD I	JOBSWA
	STL RTR			/PLACE SYSTEM ERROR PENDING BIT IN LINK
	SNL			/IS THERE AN ERROR?
	JMP	SUJ2		/NO; GO CLEAR AC AND EXIT
/ROUTINE TO START USER JOB AT ERROR ADDRESS
/DOES A JMS TO ERROR ADDRESS
/USER PC AT TIME OF ERROR TO ADDRESS; JMP TO ADD+1
	CLL RTL			/CLEAR THE ERROR PENDING BIT
	DCA I	JOBSWA		/TO AVOID A SECOND JMS TO HIS ERROR ROUTINE
	TAD	JOBSWA
	TAD	C0005
	DCA	JOBSWA		/POINTS TO ERROR RESTART ADD
	TAD I	JOBSWA		/ERROR ADDRESS
	DCA	WS0
	TAD	L2SV0		/OLD PC
	UDF			/GET USER'S FIELD
	DCA I	WS0		/SAVE OLD PC
	IAC
	TAD	WS0		/ERROR ADDRESS + 1
	DCA	L2SV0		/NEW PC
	EXIT

/PAPER TAPE READER SERVICE FOR TSS/8

UPTR,	JMS I	PTRCHK		/DOES [S]HE OWN DEVICE?
PTRDEV,	DEVTBE			/POINTS TO READER ENTRY IN DEVTBL
	TAD	URCBI		/CHECK FOR "RCB"
	TAD	UUOCAL
	SNA CLA
	JMP	URCB		/IT IS!
	JMS I	PTRIOT		/ANALYZE IOT
	JMP	URRS		/READ A STRING
PTRFL,	JSPTR			/READER FLAG
	JMP I	PTRSKP		/WE ALWAYS SKIP
	SNL CLA			/RRB?
	UUOEXT			/NO - MUST HAVE BEEN RFC - SO WHAT!
	DCA	WS0		/SET READER'S BREAK MASK TO 0
	DATFLD
	TAD I	PTRDEV		/ADDRESS OF DDB
	FETCH			/FETCH A CHARACTER FROM READER BUFFER
	JMP	PSTWT0		/NONE AVAILABLE - START READER
	DCA	PTRCH		/SAVE FOR NEXT RRB
	CDF
	TAD	PTRACA		/POINTS TO L2SA
	IOR			/OR CHARACTER INTO L2SA
PTRCH,	0
	UUOEXT			/EXIT TO USER
PTRSKP,	UUOEX2

URRS,	DATFLD
	TAD I	PTRDEV		/GET DDB ADDRESS
	DCA	CONDDB
	JMS I	PSTRIN		/TRANSFER STRING TO USER
	JMP	PSTWT0		/INSUFFICIENT NUMBER OF CHARACTERS IN BUFFER
	UUOEXT

URCB,	DATFLD
	TAD I	PTRDEV		/CLEAR THE ENTIRE READER BUFFER
	JMS I	PTRCLR
	UUOEXT
PSTWT0,	STA
L2PTR1,	DCA	PTRSET		/REMEMBER WHY WE ARE HERE
	CDF CIF			/SELECT F0 AND INHIBIT INTERRUPTS
	TAD I	PTRTIM		/IS THE READER BUSY?
	SNA CLA
	RFC			/START THE READER
	CLL STA RAL		/AC=-2
	DCA I	PTRTIM		/SET READER TIMER
	DCA I	RCNTA		/NO LIMIT UNTIL IT'S READ AT LEAST ONE BLOCK WORTH
	ISZ	PTRSET		/FROM UUO OR LEVEL 2?
	EXIT			/LEVEL 2 - FINISHED
	STA
	TAD	L2SV0		/BACK UP HIS PC FOR A REDO
	DCA	L2SV0
	TAD	PTRFL
	UUOEXT			/NOW WAIT FOR THE READER

PTRSIZ,	0
	DCA	PTRSET		/SAVE POINTER TO CHARACTER COUNT
	ISZ	PTRSIZ		/WE ALWAYS SUCCEED
	CDF CIF			/NO INTERRUPTS WHILE WE CHECK THE READER'S STATUS
	TAD I	PTRTIM
	SMA CLA			/IS IT STILL RUNNING?
	JMP	PTRSI2		/NO - JUST MAKE SURE THE FLAG IS SET
	TAD	FRECNT		/HOW'S THE SUPPLY OF FREE CORE?
	TAD	C7770
	SMA SZA CLA
	TAD	PTRFUL		/MINUS NUMBER ALLOWED
	DATFLD
	TAD I	PTRSET		/PLUS CURRENT CHARACTER COUNT
	CDF
	SMA
	STA			/SHUT DOWN THE READER AFTER THE NEXT CHARACTER
	DCA I	RCNTA
	TAD I	RCNTA
	TAD	C0100
	SMA CLA
PTRSI2,	JMS	PTRSET		/SET THE READER FLAG IN STR1
	JMP I	PTRSIZ

L2PTR,	JMS	PTRSET		/WAKE HIM/HER UP - [S]HE'S HUNG
	TAD I	PTRDEV		/DDB?
	SNA
	EXIT			/NO
	DCA	AXS2		/YES - SAVE IT, WE'LL NEED THE JOB # FROM IT
	TAD	AXS2
	TAD	C0004
	DCA	WS0
	TAD I	WS0		/IS IT EMPTY?
	SZA CLA
	EXIT			/NO - SO IT ISN'T OFFICIALLY HUNG YET
	TAD I	AXS2		/JOB OWNING PTR
	CDF
	ERROR			/REPORT THE HUNG READER TO HIM/HER
	HUNGDV
	EXIT

PTRSET,	0
	DATFLD
	TAD	PTRDEV		/READER'S POSITION IN DEVTBL
	DCA	CONDBA
	TAD	PTRFL
	JMS I	SETFLG		/SET JSPTR IN STR1
	JMP I	PTRSET

PTRCHK,	DEVCHK
PTRIOT,	UKT1
PSTRIN,	UKREAD
PTRTIM,	TIMPTR
RCNTA,	RCNT
URCBI,	-6017
PTRCLR,	CLRBUF
PTRFUL,	-240
