/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 IF 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.)
/PARAMATERS 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 FOR 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			/ERP DISC 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 <

DBSZ=	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
DCLR=	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=	40		/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 INTERPRETOR
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 (100MS)
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 I/O
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
/FIP 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.
/FIP HANDLES ALL NON-RESIDENT FILE IOT'S

/RUNS IN AN UPPER FIELD IN PLACE OF USER IT IS SERVING

/RUNS IN EXEC MODE

FIELD 1				/FIP LOADS ONTO DISK TRACK 1

*0
	JMP I	.+1
	FIP0
LNS01,	LNS0
RETBK1,	RETBKS
LNK01,	LNK0
ZDS1,	DS1			/

*10
INDEX,	0			/ONLY REGISTER AVAILABLE IN FIP FOR INDEXING
P5400,	5400
P2000,	2000
P0077,	0077
P0007,	7
FIDEXP,				/TO REPLACE FIDEXP, FIPDEX WHERE FIPDEX=4
P0004,	4
FIPFLD,				/FIELD WE ARE RUNNING IN
C0020,	20
C002,
FILPRP,	FILPRO


FIPDAT=	155			/DATA REFERENCED BY FIP
*FIPDAT

FIPJOB,	.
C0400,	400
SEGSIZ=	C0400			/# WORDS PER SEGMENT
FIBASE,	SWDEX+JOBMAX		/BASE ADDRESS OF ALLOCATABLE DISC STORAGE
JOB,	.			/# OF CURRENT JOB
JOBDAT,	.			/ADDRESS OF CURRENT JOB DATA LIST. MUST RESIDE IN DATA FIELD.
P7000,
CORTBA,	CORTBL-1		/CORE ALLOCATION TABLE
DEVTBA,	DEVTBL			/DEVICE TABLE
DEVEND,	DEVTBE			/START OF ASSIGNABLE DEVICE TABLE
DSBUSY,	.			/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,	.
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 PRINITA
GETJT0,	GETJTB			/GET JOB DATA TABLE ADDRESS
GETJTA=	JMS I GETJT0
RETBA,	RETB			/RETURN BLOCK TO FREE STORAGE
RETBLK=	JMS I RETBA
WAITA,	WSCHED
WAIT=	JMP I WAITA
DEVOVR,	JOBTBL			/END OF DEVICE TABLE; START OF JOB TABLE

*20
FIUSAC,	0			/SAVED USER AC
FIJOB,	0			/JOB NUMBER FILE PHANTOM IS REPRESENTING
FIOPTR,	0			/POINTER TO FIELD 0 IOT
GDRETP,	0			/RETRIEVAL POINTER, SET BY GD0 ROUTINE
WNDREM,	0			/REMAINDER FROM DIVISION BY 7
BUFSTA,	0			/BUFFER STATUS, 7777 IF FULL
BUFMOD,	1			/BUFFER MODIFIED IF =0; UNCHANGED IF =1
SATSTA,	0			/SATSTATUS, 7777 IF CHANGED THIS RUN
TABSTA,	0			/TABLE STATUS, 7777 IF CHANGED THIS RUN

/POINTERS TO FILE PHANTOM'S INTERNAL TABLES

JOBTAB,	JTABLE			/TABLE OF PROJ,PROG NUMBERS FOR ALL ACTIVE JOBS
ENTEND,				/END OF ENTRY TABLE
UFDTBL,	UTABLE			/TABLE OF ALL ACCESSED UFD'S
UFDEND,				/TOP OF UFD TABLE
RETTBL,	RTABLE			/TABLE OF RETRIEVAL INFORMATION FOR ALL ACCESSED UUFD'S
ENTTBL,	ENTABL-10		/TABLE REFLECTING STATE OF ALL POSSIBLE FILE NUMBERS
BUFFER,	5400			/BUFFER FOR DIRECTORY MANIPULATIONS
SATBOT,	-SATSIZ			/BOTTOM OF STORAGE ALLOCATION TABLE
/SUBROUTINE POINTERS

DE01,	DE0			/GET A DIRECTORY ENTRY
DS01,	DS0			/DIRECTORY SEARCH
GE01,	GE0			/GET A DIRECTORY WORD INTO CORE
GD01,	GD0			/GET A FILE DIRECTORY ENTRY INTO CORE
WRT1,	WRITE			/MAKE SURE THE BUFFER IS EMPTY
DTE01,	DTE0
FIO01,	FIPIO			/COMMON DISC I/O ROUTINE
SATL1,	SATLOK			/GET A FREE SEGMENT FROM SAT
TF01,	TF0			/FREE AN ENTRY ON UFD TABLE
UC01,	UC0			/USER-OWNER FILE CHECK
UFO01,	UFO0			/OPEN A UFD
UTS01,	UTS0			/SEARCH UFD TABLE FOR PROJ,PROG NUMBER
CL01,	CL0			/CLOSE A FILE
WND201,	WND20			/DIVIDE BY SEVEN
FIEXIT,	FIX0			/EXIT ROUTINE
BLDP1,	BLDP			/BUILD A POINTER TO ENTTBL
ENR01,	ENR0
REL01,	REL00
WR01,	WR0
GTBLO1,	GTBLOK
EBLD0,	EBLD
JBLD0,	JBLD
FIX401,	FIX40
IFN01,	IFN0
LGI201,	LGI20			/-1 TO USER AC
FGETJT=	JMS I	.
	FGETJ0
DIRBAD,	BADDIR

/CONSTANTS

C0006,	6
C0200,	200
P0037,	37
P0003,	3
P6000,	6000
P0777,	777
C0605,	6605
C0005,	5
C0603,	6603
C7774,	-4
C4400,	4400
C7771,	7771
P7770,	7770
CFLD=	CDF 20			/FIP IS ALWAYS IN FIELD 2
EXQ1,
UTPRNU,	0			/USED BY UTS0 ROUTINE TO HAVE THE PTR TO UFD TABLE WHILE SEARCHING
CFH,	0			/THIS LOCATION IS USED FOR TEMP STORAGE BY MANY ROUTINES
ACC01,	ACT01			/SEE IF CALLING USER IS ACCOUNT 1
BASCO1,	BASCO0			/SEE IF THE FILE IS BASIC
BASSWT,	0			/SWITCH FOR BASIC
C0010,	10
C7700,	7700
BASWIN,	WINBAS			/FIELD 1 ADDRESS OF BASIC WINDOW
BAS1A,	BAS0			/CREATES A BASIC WINDOW
SEGLIM,	0
REWNDC,
REL6,	0



FIOSTK,	0			/STACK HOLDING IOT LINKAGE
	0
	0
	0
	0
	0
	0
	0

FLPARB,	0			/TABLE FOR READ OR WRITE PARAMETER CONSTRUCTION
	0
	0
	0
	0
	0
	OVERLA
	0

/ROUTINE TO RELEASE FREE BLOCK, (IF ANY), IF IT IS
/NECESSARY TO ABORT FIP FOR SOME REASON.
RETURN,	TAD	FIOSTK		/GET THE IOT THAT BROUGHT US HERE
	CMA			/IS THERE A PARAMETER BLOCK?
	AND	C4010
	SZA CLA
	JMP I	FIEXIT		/NONE, OK TO EXIT
	DATFLD
	TAD I	FIOPTR		/GET THE BLOCK
	JMS I	RETBK1		/RETURN IT SO IT WON'T BE LOST FOREVER
	CLA
	JMP I	FIEXIT		/NOW IT'S OK TO LEAVE

C4010,	4010			/MASK FOR FINF AND WHO
/FILE PHANTOM START
/FIP'S FIRST JOB IS TO PICK UP THE IOT WHICH IT IS TO PERFORM
/AND THE PARAMETERS WHICH GO ALONG WITH IT (IF ANY). THESE
/ARE MOVED INTO AN 8-WORD BLOCK CALLED 'FIOSTK.' THE FIRST REG-
/ISTER IN THIS BLOCK CONTAINS THE IOT, PARAMETERS FOLLOW
*200

FIP0,	CLL CLA IAC
	DCA	BUFMOD		/MARK BUFFER AS NOT MODIFIED
	DCA	SATSTA		/CLEAR SAT STATUS
	DCA	TABSTA		/CLEAR TABLE STATUS
	TAD	BUFSTA		/IS THERE VALID DATA IN THE BUFFER?
	SZA CLA
	IAC			/YES; RE-CALCULATE DISK PARAMETERS IF NEEDED
	DCA	BUFSTA
	6201			/CDF FIELD ZERO
	TAD I	JOB		/GLOBAL TO "JOB"
	AND	P0037
	DCA	FIJOB		/SAVE IT
	CFLD
	FGETJT			/SAVE USER AC
	JOBREG+2
	DCA	FIUSAC		/ADDRESS OF USER'S AC
	FGETJT
	JOBLNK			/IOT REQUEST WORD
	DCA	FIOPTR		/POINTER TO IOT LINKAGE
	DATFLD
	TAD I	FIUSAC
	DCA	FIUSAC		/USER'S AC
	TAD I	FIOPTR		/PICK UP LINKAGE
	AND	IC7400		/IS IT AN IOT? (IF IT IS, JOBLNK WILL HAVE BITS 0-3 CLEARED)
	SNA CLA
	JMP	FIP2		/IS AN IOT, SO GO MOVE IT INTO FIOSTK (AC IS PARAMETER)
	TAD I	FIOPTR		/IS A POINTER, PICK UP LINKAGE
	DCA	FIP6		/POINTER TO LINKAGE TABLE
	CFLD
	6202			/CIF FIELD 0
	BLT			/MOVE IOT PARAMETERS INTO FIOSTK
	DATFLD
FIP6,	0
	6221			/CDF THIS FIELD
	FIOSTK			/IOT LINKAGE BUFFER
	-10
	TAD	FIOSTK
	SPA CLA			/WILL THE IOT PARAMETER BLOCK BE NEEDED TO RETURN PARS?
	JMP	FIP4		/YES, SO DON'T RETURN IT
	TAD	FIP6
	JMS I	RETBK1		/RETURN THE IOT PARAMETER BLOCK TO FREE CORE
	CLA CLL
	DATFLD
	DCA I	FIOPTR		/CLEAR JOBLNK TO AVOID CONFUSION LATER
	CFLD
/COMES HERE WHEN IOT AND ITS PARAMETERS ARE COMFORTABLY
/NESTLED IN FIOSTK
FIP4,	TAD	IOTABL
	DCA	FITPTR		/TABLE POINTER
FIP5,	ISZ	FITPTR		/PICK UP IOT FROM TABLE
	TAD I	FITPTR
	SNA			/END OF TABLE?
	JMP I	LGI201		/DON'T KNOW WHAT TO DO SO PASS BACK AN ERROR AT LEAST
	CIA			/NO
	TAD	FIOSTK		/IOT FROM USER
	SZA CLA			/DISPATCH?
	JMP	FIP5		/NO
	TAD	IOTABL		/YES, FIND PROPER POINTER
	CIA
	TAD	FITPTR
	TAD	IODSPA
	DCA	FITPTR
	TAD I	FITPTR		/PICK UP DISPATCH ADDRESS
	DCA	FITPTR
	TAD	FIOSTK		/IS THIS AN IOT WHICH DOES REQUIRE PARAMETERS TO BE
				/RETURNED IN AN IOT PARAMETER BLOCK?
	SMA CLA			/...IF SO, USER AC CONTAINS A PTR TO WHERE THEY WILL GO
	DCA	FIUSAC		/CLEAR USER AC
	JMP I	FITPTR		/DISPATCH

/COMES HERE FOR A "SHORT" IOT. SAVED AC IS ONLY PARAMETER
/PUT IT IN FIOSTK+1
FIP2,	TAD I	FIOPTR		/PICK UP IOT
	DCA	FIOSTK		/PLACE ON STACK
	TAD	FIUSAC		/USER ACCUMULATOR
	DCA	FIOSTK+1	/SIMULATE LINKAGE
	JMP	FIP4-2
IOTABL,	.			/TABLE OF USER FILE IOT'S
	ASD			/ASSIGN A DEVICE
	REL			/RELEASE A DEVICE
	REN			/RENAME A FILE
	OPEN			/OPEN A FILE
	CLOS			/CLOSE A FILE
	RFILE			/FILE READ (WINDOW MOVE)
	PROT			/FILE PROTECTION
	WFILE			/FILE WRITE (WINDOW MOVE)
	CRF			/CREATE A FILE
	EXT			/EXTEND A FILE
	RED			/REDUCE A FILE
	FINF			/FILE INFORMATION
	LIN			/LOGIN
	LOUT			/LOGOUT
	WHO			/RETURN PASSWORD
	SEGS			/RETURN # OF DISK SEGMENTS AVAILABLE
	0

IODSPA,	IODISP-1
FITPTR,	0
IC7400,	7400
/ROUTINE TO GET A DIRECTORY ENTRY INTO CORE

/CALLING SEQUENCE:
/	TAD (INTERNAL FILE NUMBER)
/	JMS GD0
/	RETURN (BUFFER POINTER IN AC, 0=ERROR)

GD0,	0
	JMS I	EBLD0
	DCA	GDUFDP
	TAD I	GDUFDP		/RELATIVE POSITION IN UFD TABLE
	JMS I	BLDP1
	DCA	GDRETP		/POINTER TO UFD RETRIEVAL INFORMATION
	ISZ	GDUFDP
	TAD I	GDUFDP		/PICK UP ENTRY ADDRESS WITHIN UFD
	DCA	GD1
	TAD	GDRETP
	JMS I	GE01		/GET ENTRY INTO CORE
GD1,	0
	JMP I	GD0
GDUFDP,	0

IFN0,	0
	TAD	FIOSTK+1
	AND	P0003
	DCA	FIOSTK+1
	JMP I	IFN0

EBLD,	0
	DCA	CFH
	TAD	FIJOB
	CLL RTL
	TAD	CFH
	RAL
	TAD	ENTTBL
	JMP I	EBLD

WR0,	0			/WRITE OUT THE CONTENTS OF THE BUFFER
	TAD	C0605		/WRITE IOT
	DCA	FLPARB		/I/O PARAMETER BLOCK
	JMS I	FIO01		/PERFORM THE WRITE
	HLT			/ERROR ON WRITE, TOO BAD
	CLA IAC
	DCA	BUFMOD		/SET NOT-MODIFIED STATUS
	JMP I	WR0
/ROUTINE TO OPEN A FILE

OPN0,	JMS I	BASCO1		/IF BASIC SET BASSWT TO -1
	DCA	OPENTT		/PTR TO ENTTBL
	JMS I	JBLD0		/PROJ PROG # OF THIS JOB IN AC
	DCA	PRJPRO		/SAVE PROJ, PROG #
	TAD	FIOSTK+2
	SNA			/IF [S]HE OWNS THE FILE THEN FIOSTK+2 IS 0
	JMP	OPNOWN		/YES, [S]HE DOES
	CIA
	TAD	PRJPRO		/IF [S]HE HAS MENTIONED THE PROJ, PROG #
	SNA CLA			/CHECK IF [S]HE IS THE OWNER
	JMP	OPNOWN
	STA
	TAD	FIOSTK+2	/TRYING TO OPEN ACCOUNT 1 FILE?
	SZA CLA
	JMP	.+6		/NO, OK
	TAD	FIOSTK+3	/WHOSE UFD?
	CIA
	TAD	PRJPRO		/HIS/HER OWN?
	SZA CLA
	JMP	OPN3		/NO, TELL HIM/HER FILE NOT FOUND
	TAD	FIOSTK+2
	AND	C7700		/TAKE OUT JUST THE PROJ # OF THE FILE
	CIA
	TAD	PRJPRO		/DOES IT AGREE WITH JOB'S PROJ #?
	AND	C7700
	SNA CLA
	TAD	P0003		/4 IN AC SAME PROJ #
	CLL IAC			/1 IN AC DIFF PROJ #
	JMP	.+4
OPNOWN,	TAD	PRJPRO
	DCA	FIOSTK+2
	TAD	C0010		/10 IN AC IF [S]HE OWNS THE FILE
	DCA	PRJPRO		/STORE PROTECTIVE BITS FOR READ CASE
	TAD	FIOSTK+2	/PICK UP THE PROJ PROG # OF THE FILE
	JMS I	UTS01		/SEARCH OPEN UFD TABLE  RETURN WITH PTR IN AC
	JMP	OPN6		/UFD NOT OPEN, GO OPEN IT
OPN2,	DCA I	OPENTT		/SAVE ITS RELATIVE PTR IN ENTTBL
	TAD I	OPENTT		/GET RELATIVE ADDRESS OF UFD TBL
	JMS I	BLDP1		/BUILD A PTR TO RETTBL ENTRY
	DCA	FIOSTK+2	/SAVE IT
	JMS I	DS01		/3 WORD SEARCH
	FIOSTK+2
	JMP	OPN3		/NO SUCH FILE
	TAD	P0007		/PTR TO RETRIEVAL ENTRY IN BUFFER
	DCA	OPBUFP
	ISZ	OPENTT
	TAD I	ZDS1		/GET THIS FILE'S DIRECTORY ADDRESS
	DCA I	OPENTT		/SAVE IN SECOND WORD OF ENTTBL ENTRY
	CLL CMA RTL		/-3 IN AC
	TAD	OPBUFP		/PTR TO PROTECTION BIT
	JMS I	OPN11A		/CHECK PROTECTION OF THE FILE
PRJPRO,	0
	TAD I	OPBUFP		/ADD POINTER TO FIRST RETRIEVAL WINDOW AND
	DCA	PRJPRO		/SAVE WITH PROTECTION BIT
	TAD	OPNFI0		/JOB STATUS WORD FILE FOR FILE 0
	TAD	FIOSTK+1
	DCA	OPACSC		/FOR LINKING A BLOCK
	TAD I	OPBUFP		/GET RETRIEVAL WINDOW
	DCA	OPBUFP		/SAVE IT
	TAD	FIOSTK+2
	JMS I	GE01		/GET RETRIEVAL WINDOW IN CORE
OPBUFP,	0
	DCA	OPENTT		/SAVE THE BUFFER ADDRESS
	FGETJT			/GET THE ADDRESS OF JOB STATUS FOR THIS FILE
OPACSC,	0
	DCA	OPACSC		/SAVE POINTER
	TAD	OPACSC
	JMS I	GTBLO1		/GET A BLOCK LINKED FOR FILE CONTROL
	JMP	OPNOT		/NO FREE CORE; CAN'T OPEN THEN
	DCA	OPBUFP		/SAVE IT TO BUILD THE FILE CONTROL BLOCK
	ISZ	BASSWT
	JMP	OPN123
	TAD I	BASWIN		/IS BASIC WINDOW ALREADY SET UP?
	IAC
	SNA CLA			/YES THEN HAS -1
	JMP	OPRET1		/BASIC WINDOW ALREADY LOADED
	TAD	OPENTT		/BUFFER ADDRESS OF THE WINDOW
	JMS I	BAS1A		/CREATE BASIC WINDOW
OPRET1,	TAD	BASWIN		/PUT BASIC WINDOW POINTER IN CONTROL BLOCK
	DCA I	OPBUFP
OPRET,	CFLD
	CLA CMA			/ACCESS COUNT IN UFDTBL
	TAD I	UTPRNU		/INCREASE BY -1
	DCA I	UTPRNU
	DATFLD
	ISZ	OPBUFP
	ISZ	OPBUFP		/POINTS TO PROTECTION BIT
	TAD	PRJPRO
	DCA I	CPBUFP		/PUT IN THE WRITE PROT BIT CREATED BEFOREHAND
	JMP I	.+1		/EXIT AND WRITE OUT TABLES
	TABOUT

OPN123,	TAD	OPBUFP		/LINK A BLOCK
	JMS I	GTBLO1
	JMP	OPN4		/NO FREE CORE, CAN'T OPEN
	DCA	OPENTU
	CFLD
	CIF
	BLT
	CFLD			/SOURCE
OPENTT,	0
	DATFLD
OPENTU,	0
	-10
	JMP	OPRET
OPN5,	SNA			/DID THE ACCOUNT EXIST?
	JMP	OPNOT		/YES; LACK OF ROOM IN UFDTBL
OPN3,	STL CLA RTR		/NOT FOUND ERROR
OPNPRE,	TAD	P2000		/PROTECTED
	TAD	P2000
OPNOT,	CLL CML RAR		/NOT OPEN, LACK OF SYSTEM RESOURCES
	DCA	FIUSAC
	TAD	FIOSTK+1
	JMS I	EBLD0		/BE SURE TO REMOVE ALL THE POINTERS PUT IN BY OPEN
	DCA	OPENTT
	DCA I	OPENTT
	JMP I	FIEXIT

OPN4,	TAD I	OPACSC		/CONTROL BLOCK ADDR
	JMS I	RETBK1		/RETURN IT
	DATFLD
	DCA I	OPACSC		/CLEAR POINTER FROM JOB BLOCKS
	CFLD
	JMP	OPNOT		/TELL HIM/HER WE COULDN'T OPEN

OPN6,	TAD	FIOSTK+2	/PICK UP PROJ PROG #
	JMS I	UFO01		/OPEN UFD
	JMP	OPN5		/NO LUCK, ERROR
	JMP	OPN2		/OPENED RELATIVE POSITION IN AC


OPNFI0,	JOBF0
OPN11A,	OPN11



/ROUTINE TO CLOSE A FILE

*600

CLS0,	DCA	CLSIFN		/INTERNAL FILE NUMBER
	TAD	C7774
	DCA	CLCNTR		/COUNTER FOR BIT SCAN
CLS1,	TAD	FIOSTK+1	/PICK UP BIT PATTERN
	RAL
	DCA	FIOSTK+1
	SZL
	JMP	CLS3
CLS2,	ISZ	CLSIFN		/NEXT FILE NUMBER
	ISZ	CLCNTR		/DONE ALL FOUR?
	JMP	CLS1		/NO, KEEP AT IT
	JMP I	FIEXIT		/THROUGH
CLS3,	TAD	CLSIFN		/PICK UP INTERNAL FILE NUMBER
	JMS	CL0		/CLOSE THE FILE
	JMP	CLS2		/LOOK FOR MORE

CLSIFN,	0
CLCNTR,	0

/ROUTINE TO DO ACTUAL FILE CLOSE
CL0,	0
	JMS I	EBLD0
	DCA	CLENTP
	TAD	CFH
	JMS I	LNK01		/RETURNS WITH PTR TO FILE CONTROL BLOCK FROM JOB STATUS BLOCK
	SNA
	JMP	CL3		/FILE WAS NOT OPEN
	DCA	CLPARP		/SAVE IT
	DCA I	CFH		/CLEAR POINTER TO FILE CONTROL BLOCK --- INDICATES FILE CLOSED
	CFLD			/SET DATA FIELD TO THIS FIELD
	TAD	CLPARP		/POINTER TO PARAMETER BLOCK
	JMS I	CLOBA		/PROPERLY CLOSE TESTING FOR BASIC
	DCA	CLO3		/SWITCH SET TO -1 IF BASIC FILE
	CLA CMA CLL
	TAD I	CLENTP		/RELATIVE POINTER TO UFD RETRIEVAL TABLE
	CLL RTL
	IAC
	TAD	UFDTBL
	DCA	CLUFDP		/POINTER TO ACCESS COUNTER
	DCA I	CLENTP		/CLEAR PTR IN ENTTBL TO INDICATE FILE IS CLOSED
	CLA CMA
	DCA	TABSTA		/SET TABLE STATUS TO WRITE OUT
	ISZ I	CLUFDP		/REMOVE THIS JOB FROM ACCESS COUNT IN UFDTBL
	JMP I	CL0
/THIS WAS THE ONLY GUY USING THIS UFD, SO CLOSE IT OUT
	ISZ	CLO3		/IS IT BASIC FILE BEING CLOSED?
	JMP	CL11		/NO, PROCEED FURTHER
	DATFLD			/YES, JUST ZERO ONE LOC IN FIELD 1
	DCA I	BASWIN
	CFLD
CL11,	CLA CMA			/NO ONE IS NOW ACCESSING THIS UFD
	TAD	CLUFDP
	JMS I	TF01		/FREE A TABLE ENTRY
CL3,	CFLD
	JMP I	CL0

CLOBA,	CLOBAS
CLPARP,	0
CLENTP,	0
CLUFDP,	0

/SKIPS IF NO OTHER USER IS ACCESSING THIS FILE
ENR0,	0
	TAD	FIOSTK+1
	JMS I	EBLD0
	DCA	ENR1		/PTR INTO ENTTBL
	ISZ	ENR1
	TAD I	ENR1		/GET ADDR IN ENTTBL
	DCA	ENR1
	TAD	GDRETP		/RTABLE
	JMS I	ENS01		/HOW MANY PEOPLE HAVE THIS FILE OPEN?
ENR1,	0
	SKP			/FOUND THE SAME FILE OPEN
	ISZ	ENR0		/...ONLY ONE WHO HAS IT OPEN
	JMP I	ENR0

ENS01,	ENS0

/CHANGE THE PROTECTION OF A FILE

PRT0,	TAD	FIOSTK+1	/PICK UP INTERNAL FILE NUMBER
	RTR
	RTR
	RAR
	AND	P0003		/AND OFF PROTECTION BITS
	DCA	PRIFNU		/INTERNAL FILE NUMBER
	TAD	PRIFNU
	JMS I	UC01		/CHECK TO SEE IF USER IS OWNER
	JMP	PRT1		/ERROR RETURN, USER IS NOT OWNER
	JMS I	ACC01		/IS [S]HE UNDER ACCOUNT 1?
	JMP	PRT1+1		/YES; ERROR - [S]HE MUST USE #RENAME#
	TAD	PRIFNU
	JMS I	GD01		/GET THIS DIRECTORY ENTRY INTO CORE
	SNA
	JMP I	DIRBAD		/**************DEBUG*************
	TAD	P0004
	DCA	PRENTP		/POINTER TO PROTECTION BITS OF THIS FILE
	TAD	C7637
	AND	FIOSTK+1	/PICK UP NEW PROTECTION BITS
	DCA I	PRENTP		/RESTORE
	DCA	BUFMOD		/SCHEDULE WRITE
	JMP I	FIEXIT

PRT1,	SZA CLA			/ERROR
	CLL CML RAR
	CLL CML RAR
	DCA	FIUSAC
	JMP I	FIEXIT

CLO3,
PRIFNU,	0
PRENTP,	0
C7637,	7637


WHO0,	JMS I	JBLD0
	DCA	PAS1
	CMA			/ONE WORD SEARCH
	JMS I	DS01		/SEARCH THE MFD FOR THIS ACC'T #
	PAS0
	JMP I	DIRBAD		/************DEBUG ONLY***********
	DCA	PAS1
	TAD I	PAS1		/GET ACC'T # FROM UFD FILE NAME BLOCK
	ISZ	PAS1
	DCA	FIOSTK+1	/STORE ACC'T #
	TAD I	PAS1
	ISZ	PAS1
	DCA	FIOSTK+2	/STORE FIRST TWO CHRS OF PASSWORD
	TAD I	PAS1
	DCA	FIOSTK+3	/STORE LAST TWO CHARS OF PASSWORD
	JMP I	PAINF5		/GO STORE THIS INFORMATION FOR RETURN TO MONITOR

PAINF5,	INF5
PAS0,	RTABLE
PAS1,
JBLD,	0
	TAD	FIJOB
	TAD	JOBTAB
	CFLD
	DCA	CFH
	TAD I	CFH
	JMP I	JBLD

/ROUTINE TO MOVE THE RETRIEVAL WINDOW IN FIELD ZERO
*1000

WND0,	TAD	FIOSTK+2	/PICK UP INTERNAL FILE NUMBER
	AND	P0003		/AND OFF FIELD BITS
	JMS I	EBLD0
	DCA	WNENTP		/POINTER TO RETRIEVAL INFORMATION POINTER
	TAD I	WNENTP
	JMS I	BLDP1		/GENERATE ABSOLUTE PTR INTO RETTBL
	DCA	WNRETP		/RETRIEVAL POINTER
	TAD	FIOSTK+7
	DCA	WNFCBP		/PTR TO THIS FILE'S FILE CONTROL BLOCK
	TAD	FIOSTK+5
	DCA	WND5		/LOW ORDER DISK ADDRESS
	DCA	WNDCNT		/GET INTO CORE
	TAD	WNDCCT		/INITIALIZE COUNT
	DCA	WNDSCT
	TAD	C0177
	AND	FIOSTK+1	/GET HIGH ORDER FILE ADDRESS
	DCA	WNDIRP
	TAD	SEGSIZ		/GET RID OF ADDRESS WITHIN SEGMENT
	CLL CIA
	AND	WND5
	RAL
	TAD	WNDIRP		/NOW HAVE FILE SEGMENT #; NEED TO SHIFT IT
	SKP
	RAL
	ISZ	WNDSCT		/SHIFT SEGCCT TIMES?
	JMP	.-2
	DCA	WNSEGC
	DATFLD			/WNSEGC NOW HAS SEGMENT NUMBER TO GET
	TAD I	WNFCBP		/PICK UP FIELD 0 WINDOW POINTER
	DCA	WNDPTR		/PNTS TO FILE RETRIEVAL WINDOW FOR THIS FILE
	ISZ	WNFCBP
	TAD I	WNFCBP		/PICK UP NUMBER OF CURRENT SEGMENT IN WINDOW
	DCA	WNCURS		/CURRENT SEGMENT IN WINDOW
	TAD	WNSEGC		/SEGMENT TO GET
	JMS I	WND201		/DIVIDE BY 7 (IGNORE REMAINDER)
	JMS	WND30		/MULTIPLY BY 7
	DCA	WNSEGC		/FIRST SEGMENT IN PROPER WINDOW
	CLA CMA
	TAD I	WNDPTR		/GET FIRST WORD OF FILE RETRIEVAL WINDOW
	SNA CLA			/=7777?
	JMP	WND6		/INVALID WINDOW POINTER
	TAD	WNCURS		/CURRENT SEGMENT AT TOP OF CURRENT CORE WINDOW
	CIA
