Google
 

Trailing-Edge - PDP-10 Archives - bb-d868c-bm_tops20_v4_2020_distr - 4-sources/setspd.mac
There are 33 other files named setspd.mac in the archive. Click here to see a list.
;<4.UTILITIES>SETSPD.MAC.46,  3-Jan-80 15:26:50, EDIT BY R.ACE
;UPDATE COPYRIGHT DATE
; UPD ID= 102, SNARK:<4.UTILITIES>SETSPD.MAC.45,   6-Dec-79 11:05:53 by BLOUNT
;<4.UTILITIES>SETSPD.MAC.45,  6-Dec-79 10:55:56, EDIT BY BLOUNT
;TCO #4.2590 -CHANGE AT QUEDN1+7 TO FIX KS HALT STATUS BLOCK BUG
;<4.UTILITIES>SETSPD.MAC.44,  9-Oct-79 15:26:55, EDIT BY GRANT
;<4.UTILITIES>SETSPD.MAC.43, 25-May-79 13:02:47, EDIT BY MILLER
;FIX QUEBLK. IT WAS COMPUTING # OF PAGES TO DUMP OFF-BY-ONE
;<4.UTILITIES>SETSPD.MAC.42, 11-Apr-79 15:57:49, Edit by LCAMPBELL
; Fix up addressing of SYERR block at QUEDN1
;<4.UTILITIES>SETSPD.MAC.41, 13-Mar-79 08:50:11, EDIT BY KONEN
;UPDATE COPYRIGHT FOR RELEASE 4
;<4.UTILITIES>SETSPD.MAC.40, 13-Mar-79 06:50:04, EDIT BY R.ACE
;TAKE OUT TAPE-MOUNT-DEFAULT COMMAND
;ADD TAPE-RECOGNITION-ERRORS COMMAND
;<4.UTILITIES>SETSPD.MAC.39, 21-Feb-79 11:36:40, EDIT BY MURPHY
;ENABLE/DISABLE WORKING SET PRELOADING - DLM
;<4.UTILITIES>SETSPD.MAC.38, 20-Feb-79 17:43:04, EDIT BY BLOUNT
;CHANGE CLASS-SCHEDULER TO CLASS-SCHEDULING
;<4.UTILITIES>SETSPD.MAC.37, 19-Feb-79 14:22:43, Edit by MCLEAN
;FIX IT SO ECSKED WITH ARGUMENTS GIVES ERROR
;<4.UTILITIES>SETSPD.MAC.36, 19-Feb-79 13:24:27, Edit by MCLEAN
;CORRECT SPELLING OF WITHHELD
;<4.UTILITIES>SETSPD.MAC.35, 24-Jan-79 10:51:08, EDIT BY R.ACE
;MOVE TAPE-RECYCLE-PERIOD TO RIGHT PLACE, UPDATE EDIT#
;<4.UTILITIES>SETSPD.MAC.34, 11-Dec-78 06:52:19, EDIT BY R.ACE
;PUT ERJMP'S AFTER SYERR CALLS
;<4.UTILITIES>SETSPD.MAC.33, 28-Nov-78 08:04:16, EDIT BY R.ACE
;TCO 4.2098 - ADD TAPE-MOUNT-DEFAULT COMMAND
;ADD COMND JSYS ROUTINES FOR PARSING NEW SETSPD COMMANDS
;<ARC-DEC>SETSPD.MAC.3,  3-Oct-78 09:50:04, EDIT BY CALVIN
; Cause GTKEY to eat all of hypenated command name
;<ARC-DEC>SETSPD.MAC.1, 29-Sep-78 15:58:56, EDIT BY CALVIN
; Add ARCHIVE-TAPE-RECYCLE-PERIOD and TAPE-RECYCLE-PERIOD
;<4.UTILITIES>SETSPD.MAC.31, 20-Oct-78 19:16:54, EDIT BY MILLER
;<4.UTILITIES>SETSPD.MAC.30, 20-Oct-78 19:13:31, EDIT BY MILLER
;<4.UTILITIES>SETSPD.MAC.29, 20-Oct-78 19:12:53, EDIT BY MILLER
;TCO 4.2011. ADD BATCH-CLASS COMMAND
;<4.UTILITIES>SETSPD.MAC.28, 19-Oct-78 17:49:03, Edit by MCLEAN
;MAKE SKED JSYS BE SKED%
;<2MCLEAN>SETSPD.MAC.27, 24-Sep-78 21:56:05, Edit by MCLEAN
;<2MCLEAN>SETSPD.MAC.26, 21-Sep-78 21:22:18, Edit by MCLEAN
;<4.UTILITIES>SETSPD.MAC.25, 20-Sep-78 11:35:08, EDIT BY MILLER
;<4.UTILITIES>SETSPD.MAC.24, 19-Sep-78 12:57:51, EDIT BY MILLER
;<4.UTILITIES>SETSPD.MAC.23, 19-Sep-78 12:56:37, EDIT BY MILLER
;MORE OF TCO 4.2011
;<4.UTILITIES>SETSPD.MAC.22, 19-Sep-78 12:12:05, EDIT BY MILLER
;<4.UTILITIES>SETSPD.MAC.21, 19-Sep-78 12:10:50, EDIT BY MILLER
;TCO 4.2011. ADD ENABLE OPTIONS FOR CLASS SCHEDULER
;<4.UTILITIES>SETSPD.MAC.20, 19-Sep-78 11:27:50, EDIT BY MILLER
;<4.UTILITIES>SETSPD.MAC.19, 19-Sep-78 11:25:05, EDIT BY MILLER
;TCO 4.2011 AGAIN. ADD CREATE COMMAND
;<4.UTILITIES>SETSPD.MAC.18, 17-Sep-78 14:05:21, EDIT BY MILLER
;TCO 4.2011. IMPLEMENT "BATCH-BACKGROUND" COMMAND
;<4.UTILITIES>SETSPD.MAC.17, 24-Aug-78 12:07:17, EDIT BY R.ACE
;TCO 4.1993 - ADD COMMAND: ENABLE TAPE-DRIVE-ALLOCATION
;ADDED COMMENTING TO BEGINNING OF MODULE
;<R.ACE.LT>SETSPD.MAC.4, 23-Aug-78 16:44:38, EDIT BY R.ACE
;<R.ACE.LT>SETSPD.MAC.3, 23-Aug-78 13:19:33, EDIT BY R.ACE
;<R.ACE.LT>SETSPD.MAC.2, 23-Aug-78 12:12:30, EDIT BY R.ACE
;<2MCLEAN>SETSPD.MAC.17, 28-Jul-78 15:36:32, Edit by MCLEAN
;<3A.UTILITIES>SETSPD.MAC.16, 26-Jul-78 15:00:29, Edit by MCLEAN
;<4.UTILITIES>SETSPD.MAC.13, 18-Jul-78 14:10:12, EDIT BY MILLER
;CHANGE VERSION NUMBER TO 4
;<4.UTILITIES>SETSPD.MAC.12, 16-May-78 09:23:45, EDIT BY MILLER
;ADD MINOR VERSION TO CONFIG FILE NAME
;<4.UTILITIES>SETSPD.MAC.11,  6-May-78 22:17:11, Edit by MCLEAN
;<3A.UTILITIES>SETSPD.MAC.21,  4-Aug-78 13:13:02, Edit by MCLEAN
;<3A.UTILITIES>SETSPD.MAC.20,  4-Aug-78 13:11:23, Edit by MCLEAN
;<3A.UTILITIES>SETSPD.MAC.19,  3-Aug-78 17:12:20, Edit by MCLEAN
;<3A.UTILITIES>SETSPD.MAC.18, 28-Jul-78 15:33:15, Edit by MCLEAN
;<3A.UTILITIES>SETSPD.MAC.17, 27-Jul-78 14:41:21, EDIT BY MILLER
;INCREMENT EDIT NUMBER
;<3A.UTILITIES>SETSPD.MAC.16, 26-Jul-78 15:00:29, Edit by MCLEAN
;<3A.UTILITIES>SETSPD.MAC.15, 16-May-78 09:21:33, EDIT BY MILLER
;<3A.UTILITIES>SETSPD.MAC.14, 16-May-78 09:19:58, EDIT BY MILLER
;<3A.UTILITIES>SETSPD.MAC.13, 16-May-78 09:17:32, EDIT BY MILLER
;AND CHANGE VERSION TO 3A
;<3A.UTILITIES>SETSPD.MAC.12, 16-May-78 09:16:35, EDIT BY MILLER
;ADD MINOR VERSION TO CONFIG NAME
;<1MCLEAN>SETSPD.MAC.17,  4-May-78 18:31:02, Edit by MCLEAN
;<1MCLEAN>SETSPD.MAC.16,  4-May-78 18:24:33, Edit by MCLEAN
;<1MCLEAN>SETSPD.MAC.15,  4-May-78 17:37:31, Edit by MCLEAN

;<1MCLEAN>SETSPD.MAC.14,  4-May-78 17:22:55, Edit by MCLEAN
;<1MCLEAN>SETSPD.MAC.13,  4-May-78 17:22:03, Edit by MCLEAN
;<1MCLEAN>SETSPD.MAC.12,  4-May-78 16:22:12, Edit by MCLEAN
;<1MCLEAN>SETSPD.MAC.11,  4-May-78 16:16:56, Edit by MCLEAN
;TCO 1880 ADD SLAVE TYPES TO MTALN JSYS
;<4.UTILITIES>SETSPD.MAC.9,  9-Apr-78 13:24:57, EDIT BY MILLER
;MERGE IN CHANGES TO NODE COMMAND FROM 3A SOURCE
;<4.UTILITIES>SETSPD.MAC.8,  7-Apr-78 00:40:43, Edit by MCLEAN
;<3A.UTILITIES>SETSPD.MAC.9,  7-Apr-78 00:15:05, Edit by MCLEAN
;<3A.UTILITIES>SETSPD.MAC.8,  7-Apr-78 00:13:21, Edit by MCLEAN
;<3A.UTILITIES>SETSPD.MAC.7,  7-Apr-78 00:07:24, Edit by MCLEAN
;ADD HSB (HALT STATUS BLOCK) FOR KS10
;<4.UTILITIES>SETSPD.MAC.5,  2-Mar-78 15:04:19, Edit by PORCHER
;<4.UTILITIES>SETSPD.MAC.4, 28-Feb-78 14:35:36, Edit by PORCHER
;<4.UTILITIES>SETSPD.MAC.3, 28-Feb-78 14:25:25, Edit by PORCHER
;ADD "CHANGE" COMMAND FOR ACCOUNTING SHIFT CHANGES
;<4.UTILITIES>SETSPD.MAC.2, 31-Jan-78 00:41:13, Edit by MCLEAN
;MAGTAPE ONLINE ENTRY VECTOR UPDATES
;<4.UTILITIES>SETSPD.MAC.2, 16-Dec-77 14:01:29, EDIT BY MILLER
;<4.UTILITIES>SETSPD.MAC.1, 16-Dec-77 13:56:02, EDIT BY MILLER
;TCO 1879. ADD NODE COMMAND
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1976,1977,1978,1979,1980 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

	SEARCH MONSYM,MACSYM,SERCOD
	.REQUIRE SYS:MACREL,SERCOD
	TITLE SETSPD
	SALL
	.DIRECTIVE FLBLST	;SUPPRESS LENGTHY BINARY EXPANSIONS

; VERSION NUMBER DEFINITIONS

VMAJOR==4		;MAJOR VERSION OF SETSPD
VMINOR==0		;MINOR VERSION NUMBER
VEDIT==20		;EDIT NUMBER
VWHO==0			;GROUP WHO LAST EDITED PROGRAM (0=DEC DEVELOPMENT)

VSTSPD== <VWHO>B2+<VMAJOR>B11+<VMINOR>B17+VEDIT
; THIS PROGRAM IS RUN BY JOB 0 TO PERFORM VARIOUS USER-MODE
; FUNCTIONS THAT AFFECT THE OPERATION OF THE SYSTEM

; DEPENDING UPON THE DESIRED ACTION, THE PROGRAM IS STARTED AT
; ONE OF SEVERAL POSITIONS IN ITS ENTRY VECTOR.

; POS	DESCRIPTION
; ---	--------
;
;  0	CALLED ONCE DURING SYSTEM STARTUP BY RUNDD ROUTINE IN MEXEC.
;	READS FILE "SYSTEM:x-CONFIG.CMD" FOR COMMANDS:
;	  CHANGE - set accounting shift change times
;	  DEFINE - define system-wide logical names
;	  ENABLE/DISABLE account validation
;	  ENABLE/DISABLE directory-parameter setting by non-priv users
;	  ENABLE/DISABLE use of hardware disk optimization feature
;	  ENABLE/DISABLE magtape drive assignment by MTCON
;	  HOST - set ARPANET host number of this CPU
;	  MAGTAPE - logical magtape units (e.g. MTA3:) with
;		actual serial numbers
;	  NODE - set DECNET node name and number for this CPU
;	  PRINTER - load VFU and RAM files and set lowercase attribute
;	  TERMINAL - set auto-baud, nobell, remote, and speed
;		attributes of terminals
;	  TIMEZONE - set time zone for this site
;
;  1	THIS ENTRY IF FUNCTIONALLY EQUIVALENT TO POSITION 0,
;	BUT IT IS NOT USED BY THE MONITOR.
;
;  2 	CONTAINS PROGRAM VERSION NUMBER.
;
;  3	CALLED BY RUNDD ROUTINE IN MEXEC DURING SYSTEM
;	INITIALIZATION AFTER A CRASH TO:
;	1. Copy PS:<SYSTEM>DUMP.EXE to PS:<SYSTEM>DUMP.CPY
;	2. Extract unrecorded SYSERR entries from DUMP.EXE and
;	   log them using the SYERR JSYS
;
;  4	CALLED BY CHKR ROUTINE IN MEXEC WHILE SYSTEM IS RUNNING
;	WHENEVER PHYSIO DETECTS THAT A TAPE DRIVE HAS COME ONLINE
;	AND PHYSIO DIDN'T KNOW ABOUT THE DRIVE AT SYSTEM STARTUP.
;	THE CONFIG FILE IS READ AS IF ENTERED AT ENTRY VECTOR
;	POSITION 0, EXCEPT ONLY THE "MAGTAPE" COMMANDS IN THE
;	FILE ARE PROCESSED; ALL OTHER COMMANDS ARE IGNORED.
SUBTTL SETSPD DATA


CLSBLK:	3			;COUNT
	BLOCK 2			;DATA ARE
MTBLK:	3			;SIZE OF BLOCK
	BLOCK 2			;FOR OTHER ARGS
EOLF:	BLOCK 1
PDLEN=100			;LENGTH OF PUSH-DOWN STACK
PDL:	BLOCK PDLEN		;PUSH-DOWN STACK
FILNAM:	BLOCK ^D28		;NAME OF RAM OR VFU FILE PUT HERE
LINES:	BLOCK 1			;WORD TO HOLD LINES
STRBLK:	BLOCK .MSSLN		;BLOCK FOR STRUCTURE COMMAND
HSBBUF:	BLOCK HS%LEN		;LENGTH OF HSB AND HEADER
ASCTBL:	BLOCK <ASCTBZ==^D100>+1	;ACCOUNTING SHIFT CHANGE TABLE
SPDTBL==10000			;SPEED TABLE
REMTBL==20000			;REMOTE TABLE

	CPYPGS==^D10		;# OF PAGES TO COPY WITH EACH PMAP
	CPYWDS==CPYPGS_PGSFT	;NUMBER OF WORDS TO COPY
	PGSFT==11		;PAGE SHIFT VALUE
PG0PG==30			;PAGE 0 OF DUMP.EXE
	PG0ADR=PG0PG_PGSFT
TMPPG==31			;2 PAGES FOR TEMPORARY MAPPING
	TMPADR=TMPPG_PGSFT
DMPPG==40			;PAGE FOR MAPPING DUMP FILE
	DMPADR==DMPPG_PGSFT
CPYPG==DMPPG+CPYPGS		;PAGE FOR MAPPING COPY FILE
	CPYADR==CPYPG_PGSFT

;THE TEXTI ARG BLOCK

TEXT:	7
FLAGS:	RD%JFN!RD%PUN		;FLAGS
JFN:	0,,377777		;JFN'S
BUFPTR:	-1,,BUFFER		;BUFFER POINTER
COUNT:	SIZE			;SIZE OF BUFFER
	0
	0
BRKMAD:	0			;BREAK MASK ADDRESS
BRKMSK:	0			;MASK 0
	1B0			;SPACE
	0
	0
SIZE==100
SIZEB==SIZE*5		;# OF BYTES IN BUFFER

BUFFER:	BLOCK SIZE		;WORK BUFFER
ATMBFR:	BLOCK SIZE		;COMND JSYS ATOM BUFFER
CSB:	BLOCK 12		;COMND JSYS STATE BLOCK

;PROGRAM ENTRY VECTOR

ENTVEC:	JRST START		;STARTING LOCATION
	JRST START		;REENTER LOCATION
	VSTSPD			;VERSION NUMBER
	JRST START3		;ALTERNATE STARTING LOCATION
	JRST START4		;MTA ONLINE ENTRY VECTOR

ENVLEN==.-ENTVEC		;ENTRY VECTOR LENGTH
;COMMAND TABLES:

;****************************************************************
;
;	WARNING!!!
;
;	THESE TABLES MUST BE KEPT IN ALPHABETICAL ORDER FOR TBLUK
;
;****************************************************************

ALTLVT:	1,,1			;MAGTAPE ONLY
	XWD [ASCIZ /MAGTAPE/],MAGTAP

; ---- NOTE ----
;
; To all implementors of new SETSPD commands: The COMNDI and COMNDX
; routines permit you to parse commands using the COMND JSYS. Refer
; to the TRECER routine for an example of how to parse using COMND.

LEV1TB:	ELEVL1-.-1,,ELEVL1-.-1
	XWD [ASCIZ /ARCHIVE-TAPE-RECYCLE-PERIOD/],ARCHIV
	XWD [ASCIZ /BACKGROUND/],BATBGD
	XWD [ASCIZ /BATCH-CLASS/],BCHCLS
	XWD [ASCIZ /BIAS/],BIAS
	XWD [ASCIZ /CHANGE/],CHANGE
	XWD [ASCIZ /CREATE/],CREATE
	XWD [ASCIZ /DEFINE/],DEFINE
	XWD [ASCIZ /DISABLE/],DISABL
	XWD [ASCIZ /ENABLE/],ENABLE
	XWD [ASCIZ /HOST/],HOST
	XWD [ASCIZ /MAGTAPE/],MAGTAP
	XWD [ASCIZ /NODE/],NODNAM
	XWD [ASCIZ /PRINTER/],LPTLOD
	XWD [ASCIZ /TAPE-RECOGNITION-ERRORS/],TRECER
	XWD [ASCIZ /TAPE-RECYCLE-PERIOD/],TAPRCY
	XWD [ASCIZ /TERMINAL/],TERM
	XWD [ASCIZ /TIMEZONE/],TIMZON
ELEVL1:

;TABLE FOR TERMINAL CHARACTERISTICS

LEV2TB:	ELEVL2-.-1,,ELEVL2-.-1
	XWD [ASCIZ /AUTO-BAUD/],AUTO
	XWD [ASCIZ /NOBELL/],NOBELL
	XWD [ASCIZ /REMOTE/],REMOTE
	XWD [ASCIZ /SPEED/],SPEED
ELEVL2:

; TABLE OF OPTIONS FOR ENABLE COMMANDS

ENAOPT:	ENASIZ-1,,ENASIZ-1
	XWD [ASCIZ/ACCOUNT-VALIDATION/], ENACCT
	XWD [ASCIZ /CLASS-SCHEDULING/],ECSKED
	XWD [ASCIZ/DIRECTORY-PARAMETER-SETTING/], ENADIR
	XWD [ASCIZ/FULL-LATENCY-OPTIMIZATION/], ENAFLO
	XWD [ASCIZ/TAPE-DRIVE-ALLOCATION/], ENATDA
	XWD [ASCIZ/WORKING-SET-PRELOADING/], ENAWSP

	ENASIZ==.-ENAOPT

; TABLE OF OPTIONS FOR DISBLE COMMANDS

DISOPT:	DISSIZ-1,,DISSIZ-1
	XWD [ASCIZ/ACCOUNT-VALIDATION/], DISACT
	XWD [ASCIZ/DIRECTORY-PARAMETER-SETTING/], DISDIR
	XWD [ASCIZ/FULL-LATENCY-OPTIMIZATION/], DISFLO
	XWD [ASCIZ/WORKING-SET-PRELOADING/], DISWSP

	DISSIZ==.-DISOPT

; TABLE OF OPTIONS FOR LOADING PRINTERS

LPTTAB:	LPTBSZ-1,,LPTBSZ-1
	XWD [ASCIZ /LOWERCASE/], .MOSTS
	XWD [ASCIZ /RAM/], .MOLTR
	XWD [ASCIZ /VFU/], .MOLVF

	LPTBSZ==.-LPTTAB

SLAVT:	SLVBSZ-1,,SLVBSZ-1
	XWD [ASCIZ /TU45/],.MTT45	;TU45
	XWD [ASCIZ /TU70/],.MTT70	;TU70
	XWD [ASCIZ /TU71/],.MTT71
	XWD [ASCIZ /TU72/],.MTT72	;TU72
	SLVBSZ==.-SLAVT


;TABLE OF DAYS OF WEEK FOR "CHANGE" COMMAND

DOWTAB:	XWD DOWTBZ-1,DOWTBZ-1
	XWD [ASCIZ /ALL/],<1B0!1B1!1B2!1B3!1B5!1B6>_-^D18
	XWD [ASCIZ /FRIDAY/],<1B4>_-^D18
	XWD [ASCIZ /MONDAY/],<1B0>_-^D18
	XWD [ASCIZ /SATURDAY/],<1B5>_-^D18
	XWD [ASCIZ /SUNDAY/],<1B6>_-^D18
	XWD [ASCIZ /THURSDAY/],<1B3>_-^D18
	XWD [ASCIZ /TUESDAY/],<1B1>_-^D18
	XWD [ASCIZ /WEDNESDAY/],<1B2>_-^D18
	XWD [ASCIZ /WEEKDAYS/],<1B0!1B1!1B2!1B3!1B4>_-^D18
	XWD [ASCIZ /WEEKENDS/],<1B5!1B6>_-^D18

;TABLE FOR TYPE OF CLASS SCHEDULING DESIRED

SKDOPT:	SKDSIZ-1,,SKDSIZ-1
	XWD [ASCIZ /ACCOUNTS/],0
	XWD [ASCIZ /POLICY-PROGRAM/],1
SKDSIZ==.-SKDOPT

;TABLE FOR WINDFALL HANDLING

SKDOP0:	SKDSZ0-1,,SKDSZ0-1
	XWD [ASCIZ /ALLOCATED/],0
	XWD [ASCIZ /WITHHELD/],1
SKDSZ0==.-SKDOP0
DOWTBZ=.-DOWTAB
;DEFINE REGISTERS USED

A==1
B==2
C==3
D==4
T1=1
T2=2
T3=3
T4=4
Q1==5
Q2==6
Q3==7
P1==10
P2==11
P3==12
P4==13
P5==14
P==17

;USEFUL DEFINITIONS

DEFSTR SEBSIZ,0,17,12		;POINTER TO SIZE FIELD IN SYSERR BLOCK
DEFSTR SEBERC,HSBBUF,8,9

	SEBQOU=24		;ADDRESS OF POINTER TO SYSERR QUEUE
	SEBHED==2		;NUMBER OF HEADER WORDS IN SYSERR BLOCK

;DEFINE INTERRUPT SYSTEM TABLES

ADDR:	BLOCK 1
LEVTAB:	ADDR
CHNTAB:	1,,LPTINT

DEFINE EMSG (ETXT) <		;;ERROR-MESSAGE MACRO
	HRROI T1,[ASCIZ/
? SETSPD: ETXT
/]
	PSOUT>

	DEFINE BCONFIG (R)  <
	IFE VMINOR,<ASCIZ /SYSTEM:'R'-CONFIG.CMD/>
	IFG VMINOR,<
	 DEFINE BSP (R1,LETT) <
		IRPC LETT,<
		IFE "A"-"'LETT'"+VMINOR-1,<
			ASCIZ /SYSTEM:'R1'LETT'-CONFIG.CMD/
			STOPI>
		>
		>
	BSP (\VMAJOR,"ABCDEFGHIJKLMNOPQRSTUVWXYZ")>
	>

RCONFG:	BCONFIG (\VMAJOR)
SUBTTL SETSPD PROCEDURE

;ENTRY POINTS FOR READING CONFIG.CMD FILE

START4:	TDZA P5,P5		;INDICATE MTA ONLINE ENTRY
START:	SETOM P5		;INDICATE NORMAL ENTRY
	MOVE P,[IOWD PDLEN,PDL]	;SET UP PUSH DOWN LIST
	CALL INIT		;SET UP PSI, CAPABILITIES, ETC.

;NOW FIND THE COMMAND FILE

	MOVX A,GJ%SHT!GJ%OLD!GJ%PHY
	HRROI B,RCONFG		;SYSTEM:X-CONFIG.CMD
	GTJFN			;FIND THE FILE
	 JRST FINISH		;NOT THERE. GO DEFAULT EVERYTHING
	HRLM A,JFN		;STASH THE JFN IN THE TEXTI BLOCK
	MOVE B,[070000,,200000]	;READ ONLY
	OPENF			;GET IT
	 JRST [	MOVEI A,.PRIOU	;THE CTY NO DOUBT
		HRLOI B,.FHSLF	;THIS FORK
		SETZ C,		;NO FLAGS
		ERSTR		;OUTPUT SOMETHING
		 JFCL
		 JFCL
		JRST FINISH]	;AND GO DEFAULT EVERYTHING

;FOUND THE FILE. NOW PROCESS THE COMMANDS


CMND:	CALL PBLANK		;SKIP BLANKS
	 JRST .-1		;NULL LINE
	CAIE B,";"		;A COMMENT?
	CAIN B,"!"		;OR THIS TYPE
	JRST PURGE		;YES. SKIP ALL OF THE LINE
	SKIPN P5		;CHECK FOR MAGTAPE ENTRY
	SKIPA A,[ALTLVT]	;ALTERNATE TABLE
	MOVEI A,LEV1TB		;THE TABLE
	JRST GTKEY		;GO FIND AND DISPATCH ON KEY
; INIT - RESET PROCESS, SET UP SOFTWARE INTERRUPT SYSTEM,
;	 ENABLE CAPABILITIES
; RETURNS +1: ALWAYS

INIT:	RESET			;GET TO A KNOWN STATE
	MOVEI A,.FHSLF		;GET OWN ID
	RPCAP			;READ CAPABILITES
	MOVE C,B
	EPCAP			;ENABLE ALL CAPABILITIES
	MOVE B,[LEVTAB,,CHNTAB]
	SIR			;SET INTERRUPT TABLE ADDRESSES
	EIR			;TURN ON INTERRUPT SYSTEM
	MOVSI B,(1B0)
	AIC			;ENABLE LPT CHANNEL
	RET
;ROUTINE TO PURGE INVALID COMMAND

PURGE1:	HLRZ A,JFN
	BKJFN			;GO BACK ONE
	 JFCL
PURGE:	MOVX A,RD%BEL!RD%JFN	;FIND END OF COMMAND
	MOVEM A,FLAGS
	HRROI A,BUFFER		;WHERE TO PUT IT
	MOVEM A,BUFPTR
	MOVEI A,SIZEB		;SIZE OF BUFFER
	MOVEM A,COUNT		;TO THE ARG BLOCK
	MOVEI A,TEXT		;ARG BLOCK
	TEXTI			;PURGE THE COMMAND
	 JRST FINISH		;FILE SCREWED UP. GO FINISH UP
	MOVX A,RD%BTM		;CHECK FOR TERMINATOR FOUND
	TDNE A,FLAGS		;DID WE
	JRST CMND		;YES. GO TO NEXT COMMAND
	CALL SEEEOF		;SEE IF AT EOF
	 JRST PURGE		;NOT .CONTINUE PURGING
	JRST FINISH		;YES. ALL DONE

SEEEOF:	HLRZ A,JFN		;SEE IF AT EOF
	GTSTS			;GET STATUS
	TXNE B,GS%EOF		;AT EOF?
	AOS 0(P)		;YES
	RET			;RETURN

;ROUTINE TO SKIP BLANKS AND TABS
;WILL RETURN TERMINATING BYTE IN B

PBLANK:	HLRZ A,JFN
	BIN			;GET NEXT BYTE
	CAIN B,.CHLFD		;A LINE FEED?
	RET			;YES. TELL HIM EOL
	JUMPE B,[ CALL SEEEOF	;SEE IF EOF
		  JRST .+1	;NO
		 JRST FINISH]	;YES. BAD FILE
	CAIE B," "		;A BLANK
	CAIN B,"	"	;OR A TAB?
	JRST PBLANK		;YES. SKIP IT
	CAIN B,15		;A CR?
	JRST PBLANK		;YES. SKIP IT
	BKJFN
	 JFCL
	AOS (P)			;SKIP
	RET			;AND DONE
;CODE TO FIND THE NEXT KEY WORD IN THE COMMAND FILE AND DISPATCH
;TO THE ACTION ROUTINE. INPUT IS:
;	A/ ADDRESS OF TABLE


GTKEY:	PUSH P,A		;SAVE ARG
	MOVEI A,SIZEB		;SIZE OF BUFFER
	MOVEM A,COUNT		;TO ARG BLOCK
	HRROI A,BUFFER		;WHERE DATA IS GOING
	MOVEM A,BUFPTR
	MOVX A,RD%JFN!RD%PUN!RD%BEL ;FLAGS
	MOVEM A,FLAGS		;TO THE ARGS
GTKEY1:	MOVEI A,TEXT		;ARG BLOCK
	TEXTI			;READ KEY VALUE
	 JRST FINISH		;FILE IS SCREWED UP. GO FINISH
	MOVX A,RD%BTM		;SEE IF FOUND TERMIANTOR
	TDNN A,FLAGS		;DID WE?
	JRST [	CALL SEEEOF	;NO. AT EOF?
		 JRST PURGE	;NO. SKIP REST OF LINE
		JRST FINISH]	;YES. DONE
	LDB A,BUFPTR		;GET TERMINATOR
	SETZM EOLF		;NOT AN EOL
	CAIN A,.CHLFD		;WAS IT A LINE FEED?
	SETOM EOLF		;YES. REMEMBER THIS
	CAIN A,"-"		; Dash in command name?
	JRST GTKEY1		; Yes, eat the rest of it please

;FOUND KEY WORD. DO DISPATCH

	SETZ B,
	DPB B,BUFPTR		;TIE OFF STRING
	SKIPE EOLF		;AT END OF LINE?
	JRST [	MOVE A,BUFPTR	;YES
		BKJFN		;BACK UP BYTE POINTER
		 JFCL
		LDB C,A
		CAIN C,15	;A CR?
		DPB B,A		;YES. ZAP IT TOO
		JRST .+1]
	POP P,A			;TABLE
	HRROI B,BUFFER		;THE KEY WORD
	TBLUK			;LOOK UP THE ENTRY
	TXNN B,TL%ABR!TL%EXM	;GOT A GOOD MATCH?
	JRST [	SKIPE EOLF	;NO. FOUND EOL YET?
		JRST CMND	;SKIP IT
		JRST PURGE]	;GO PURGE
	HRRZ A,0(A)		;GET DISPACTH ADDRESS
	JRST 0(A)		;GO TO IT
; SUPPORT ROUTINES FOR PARSING USING THE COMND JSYS

; COMNDI - GET REMAINDER OF LINE BEING PARSED INTO "BUFFER"
;	   AND PREPARE COMND STATE BLOCK FOR PARSE
; RETURNS +1: COMMAND LINE NOT SUITABLE FOR PARSING
;	      CALLER SHOULD EXIT TO "PURGE1" ROUTINE
;	  +2: COMMAND LINE READY TO BE PARSED BY COMNDX ROUTINE

COMNDI:	MOVX T1,RD%BEL!RD%JFN	;FIND END OF COMMAND
	MOVEM T1,FLAGS
	HRROI T1,BUFFER		;WHERE TO PUT IT
	MOVEM T1,BUFPTR
	MOVEI T1,SIZEB		;SIZE OF BUFFER
	MOVEM T1,COUNT		;TO THE ARG BLOCK
	MOVEI T1,TEXT		;GET ADDRESS OF ARG BLOCK
	TEXTI			;READ THE REMAINDER OF THE COMMAND
	 RET			;FILE SCREWED UP
	MOVX T1,RD%BTM
	TDNN T1,FLAGS		;LINE-FEED HIT?
	RET			;NO

; SET UP COMND JSYS STATE BLOCK

	MOVX T3,CM%RAI+CM%XIF	;RAISE INPUT, NO INDIRECT FILE
	MOVEM T3,CSB+.CMFLG
	SETZM CSB+.CMIOJ	;SET BAD JFNS TO PREVENT TTY I/O
	HRROI T3,[0]
	MOVEM T3,CSB+.CMRTY	;CTRL/R BUFFER BYTE POINTER
	HRROI T1,BUFFER
	MOVEM T1,CSB+.CMBFP	;BEGINNING OF INPUT
	MOVEM T1,CSB+.CMPTR	;POINTER TO NEXT FIELD TO BE PARSED
	MOVEI T2,SIZEB
	MOVEM T2,CSB+.CMCNT	;SIZE OF AREA AFTER .CMPTR
	MOVEM T2,CSB+.CMINC	;# OF UNPARSED CHARS AFTER .CMPTR
	HRROI T3,ATMBFR
	MOVEM T3,CSB+.CMABP	;POINTER TO ATOM BUFFER
	MOVEI T3,SIZEB
	MOVEM T3,CSB+.CMABC	;SIZE OF ATOM BUFFER (CHARACTERS)
	SETZM CSB+.CMGJB	;GTJFN BUFFER ADDRESS
	RETSKP			;TAKE SUCCESSFUL RETURN


; COMNDX - EXECUTE COMND JSYS TO PARSE COMMAND LINE
;  T1/ ADDRESS OF FUNCTION DESCRIPTOR BLOCK
;  CSB/ COMND JSYS STATE BLOCK SET UP BY COMNDI SUBROUTINE
; RETURNS +1: PARSE FAILED
;	  +2: PARSE SUCCEEDED, T2/ T2 RETURNED BY COMND JSYS
;			       T3/ ADDRESS OF FDB ACTUALLY USED

COMNDX:	MOVE T2,T1		;COPY FBD ADDRESS TO T2 FOR COMND
	MOVEI T1,CSB		;GET ADDRESS OF COMND STATE BLOCK
	COMND			;CALL MONITOR
	 ERJMP R		;JSYS FAILED, MAKE LIKE PARSE ERROR
	TXNE T1,CM%NOP		;PARSE ERROR?
	RET			;YES, RETURN +1, ERROR CODE IN T2
	HRRZS T3		;GET ACTUAL FDB ADDRESS IN T3
	RETSKP
;COMMAND LEVEL ACTION ROUTINES.

;FIRST TERMINAL

TERM:	SKIPE EOLF		;HAVE MORE ARGS?
	JRST CMND		;NO. IGNORE LINE
	CALL PBLANK		;SKIP BLANKS
	 JRST CMND		;FORGET IT

;NOW READ OUT THE LINE NUMBERS

	HLRZ A,JFN		;GET JFN
	MOVEI C,10		;READ NUMNER IN OCTAL
	NIN			;GET THE NUMBER
	 JRST PURGE1		;PURGE LINE
	HRLZM B,LINES		;SAVE FIST LINE NUMBER
	BKJFN			;READ OUT TERMINATOR AGAIN
	 JFCL
	BIN			;GET IT
	CAIN B,"-"		;SPECIFYING A RANGE?
	JRST GTRNGE		;YES. GET RANGE
	HLRS LINES		;EXTEND LINE NUMBER	
	JRST LINKEY		;GO GET THE KEY

GTRNGE:	NIN			;GET SECOND PART
	 JRST PURGE1		;PURGE BAD COMMAND
	HRRM B,LINES		;STASH LAST LINE NUMBER
	; ..
;NOW READ OUT THE KEY WORD

LINKEY:	HLRZ A,JFN
	BKJFN			;GET TERMINATOR
	 JFCL
	BIN			;""
	CAIN B,.CHLFD		;A LINE FEED?
	JRST LNKEY1		;YES. END OF THIS ONE
LNKEY:	CALL PBLANK		;SKIP BLANKS
	 JRST LNKEY1		;NO KEY WORDS
	SETZB P1,P2		;ASSUME IS REMOTE
	MOVEI A,LEV2TB		;KEY WORD
	JRST GTKEY		;GET KEY WORD

LNKEY1:	SETZB P1,P2		;NO KEYWORDS
	SETOM EOLF		;MARK THAT THE EOL WS SEEN
	JRST REMOTE		;GO SET THIS LINE UP

;IF HERE, LINES ARE REMOTE

AUTO:	TXOA P2,MO%AUT		;SET THE AUTO BUAD BIT
REMOTE:	TXO P2,MO%RMT		;SET THE REMOTE BIT
	HRRZ A,LINES		;GET FIRST LINE
	HLRZ B,LINES		;GET LAST LINE
	SUBI B,1(A)		;GET # TO DO
	HRLI A,0(B)		;AN AOBJN WORD
	HLR A,LINES		;FIRST LINE AGAIN
DOLINE:	SKIPN P1		;SETTING SPEED?
	IORM P2,REMTBL(A)	;SAY IT IS REMOTE
	SKIPE P1		;SETTING REMOTE?
	MOVEM P1,SPDTBL(A)	;NO. SET SPEED
	SKIPN SPDTBL(A)		;HAVE A SPEED YET?
	SKIPE EOLF		;NO, IS THIS THE END OF LINE?
	SKIPA			;YES, SET THE SPEED
	JRST REMOT1		;NO. GO ON UNITIL ONE APPEARS
	PUSH P,A		;SAVE LINES
	CALL SPDSET		;GO SET THE SPEED
	POP P,A			;RESTORE AOBJN WORD
REMOT1:	AOBJN A,DOLINE		;GO DO ALL OF THEM
	SKIPE EOLF		;FOUND AN EOF?
	JRST CMND		;YES. GO DO COMMAND
	JRST LNKEY		;NO
; HERE TO SET THE "IGNORE INPUT" (NO BELLS) BIT

NOBELL:	HRRZ D,LINES		;GET LAST LINE NUMBER
	HLRZ B,LINES		;GET FIRST LINE NUMBER
	SUBI B,1(D)		;FORM - NUMBER IN RANGE
	HRLI D,(B)		;FORM AN AOBJN POINTER TO LOOP
	HLR D,LINES		; OVER ALL THE LINES IN THE RANGE

NOBEL1:	MOVEI A,400000(D)	;GET LINE DESIGNATOR
	MOVX B,.MOSIG		;SET "IGNORE INPUT" BIT
	MOVX C,1		;TURN THE BIT ON
	MTOPR			;SET THE LINE TO IGNORE CHARACTERS UNTIL OPENED
	 ERJMP .+1		;IGNORE FAILURE HERE
	AOBJN D,NOBEL1		;LOOP OVER ALL THE LINES IN THE INDICATED RANGE
	JRST LNKEY		;GO GET THE NEXT KEYWORD IN THE COMMAND
;SET LINE SPEEDS

SPEED:	CALL PBLANK		;SKIP BLANKS
	 JRST CMND		;GIVE IT UP
	HLRZ A,JFN		;THE FILE
	MOVEI C,^D10		;GET SPEED IN DECIMAL
	NIN			;GET IT
	 JRST PURGE1		;GIVE UP
	HRRZ P1,B		;SAVE SPEED
	HRLI P1,400000(B)	;IN CASE NO MORE
	BKJFN			;LOOK AT TERMINATOR
	 JFCL
	BIN			;GET IT
	CAIN B,.CHLFD		;A LINE FEED?
	SETOM EOLF		;YES. REMEMBER THIS
	SKIPE EOLF
	JRST REMOTE		;GO DO IT
	CALL PBLANK		;GO FIND OTHER SPEED
	 JRST [	SETOM EOLF	;REMEMBER EOL
		JRST REMOTE]	;GO SET THE SPEED
	MOVEI C,^D10
	NIN			;READ THE BYTE
	 JRST PURGE1		;BLEW IT
	HRRI P1,0(B)		;SAVE OUTPUT SPEED
	BKJFN
	 JFCL
	BIN
	CAIN B,.CHLFD		;A LINE FEED?
	SETOM EOLF		;REMEMBER EOL

	JRST REMOTE		;GO SET SPEEDS
;ROUTINE TO SET SPEED OF A LINE.
;INPUT IS :	A/ LINE NUMBER

SPDSET:	MOVEI A,0(A)		;CLEAN UP ARG
	SKIPE REMTBL(A)		;THIS A REMOTE SETTING?
	JRST SPDST1		;YES. ALWAYS USE FILE SETTING
	MOVEI A,400000(A)	;GET TTY DESIGNATOR
	MOVEI B,.MORSP		;GET SPEED FROM MONITOR
	MTOPR			;GET IT
	ERJMP REMOT2		;?
	TRZ A,400000
	SKIPG C			;GET IT?
SPDST1:	MOVE C,SPDTBL(A)	;NO. USE FILE'S VALUE
	TLZ C,(1B0)		;GET RID OF SIGN BIT
	MOVEI B,.MOSPD		;SPEED SETTING
	IOR B,REMTBL(A)		;ADD IN THE REMOTE AND AUTO BITS (IF ANY)
	TRO A,400000		;TTY DESIGNATOR
	MTOPR			;DO IT
	 ERJMP REMOT2		;IGNORE ERROR
	MOVEI B,.MORNT		;REQ MSG SUPPRESS STATUS FROM
	MTOPR			;MONITOR FOR TTY (A/ TTY#)
	 ERJMP REMOT2		;IGNORE ERROR
	MOVEI B,.MOSNT		;SET MSG SUPPRESS BIT FOR TTY
	MTOPR			;SAME AS BEFORE
	 ERJMP REMOT2		;IGNORE ERROR
REMOT2:	RET			;ALL DONE

;ROUTINE TO APPLY DEFAULT SPEEDS AT EOF

FINISH:	SETZM BRKMAD		;RESET BREAK MASK
	JUMPE P5,QUIT		;QUIT IF MTA ONLINE
	MOVE A,[SIXBIT /TTYJOB/] ;FIRST FIND # OF TTY'S
	SYSGT			;GET IT
	HLLZ P3,B		;MAKE AOBJN POINTER
FIN1:	SKIPE SPDTBL(P3)	;THIS ONE SET YET?
	JRST FIN2		;YES. GO ON
	MOVEI A,0(P3)		;NO. GET LINE #
	MOVE B,[^D300,,^D300]	;DEFAULT SPEED
	MOVEM B,SPDTBL(A)	;STORE IT
	CALL SPDSET		;GO SET THE SPEED
FIN2:	AOBJN P3,FIN1		;DO ALL LINES
	CALL REFILL		;GO LOAD THE CACHE REFILL ALGORITHM
QUIT:	HALTF			;AND DONE
;THIS CODE PROCESSES THE MAGTAPE CONFIGURATION COMMANDS. FORMAT
;OF A COMMAND LINE IS:
;	MAGTAPE "LUN" "SERIAL#" "SLAVE TYPE"

MAGTAP:	SKIPN EOLF		;AT EOL YET?
	CALL PBLANK		;NO. GET TO LUN THEN
	 JRST CMND		;NO MORE STUFF
	HLRZ A,JFN		;GET INPUT
	MOVEI C,10		;GET NUMBER IN OCTAL
	NIN			;GET LUN
	 JRST PURGE1		;BAD LINE
	MOVE P1,B		;SAVE LUN
	CALL PBLANK		;GET TO NEXT VALUE
	 JRST CMND		;BAD LINE. JUST GO SKIP IT
	MOVE D,P1		;RESOTRE LUN
	MOVEI C,12		;GET DECIMAL SERIAL NUMBER
	HLRZ A,JFN		;THE JFN
	NIN			;DO IT
	 JRST PURGE1		;BAD COMMAND
	HRRZ P2,B		;SAVE SERIAL NUMBER
	BKJFN			;LOOK FOR TERMINATOR
	HLRZ A,JFN		;READ A CHARACTER
	BIN			;GET IT
	CAIN B,.CHLFD		;LINEFEED?
	JRST MAGTP1		;YUP END
	CALL PBLANK		;REMOVE BLANKS
	JRST MAGTP1			;END OF COMMAND
	HRROI A,BUFFER		;READ REST
	MOVEM A,BUFPTR
	MOVEI A,SIZEB		;STORE SIZE
	MOVEM A,COUNT
	MOVX A,RD%JFN!RD%BEL!RD%PUN
	MOVEM A,FLAGS
	MOVEI A,TEXT		;FIND ARGUMENT
	TEXTI			;GET STRING
	JRST FINISH		;QUIT END OF FILE
	MOVX A,RD%BTM		;CHECK FOR CORRECT TERMINATION
	TDNN A,FLAGS
	JRST [CALL SEEEOF	;CHECK FOR EOF
		JRST PURGE
		JRST FINISH]	;DONE
	MOVE A,BUFPTR		;GET TERMINATOR
	LDB C,A			;GET TERMINATING CHARACTER
	CAIE C,.CHLFD		;LF?
	JRST MAGTP2
	BKJFN			;BACKUP OVER LF
	 JSERR			;UNEXPECTED ERROR
	MOVEM A,BUFPTR		;SAVE NEW STRING POINTER
MAGTP2:	SETZ A,			;STORE NUL
	DPB A,BUFPTR		;TERMINATE STRING
	MOVEI A,SLAVT		;GET SLAVE TABLE
	HRROI B,BUFFER		;CHECK FOR MATCH
	TBLUK
	TXNN B,TL%EXM!TL%ABR	;CORRECT MATCH?
	JRST [SKIPE EOLF	;NO AT END OFLINE?
		JRST CMND	;YES. GO ON TO NEXT ONE
		JRST PURGE1]	;NOPE PURGE JUNK
	HRL P1,(A)		;GET UNIT TYPE
MAGTP1:	MOVE A,P1		;SET LUN
	MOVE B,P2		;SET SERIAL #
	MTALN			;DO IT
	ERJMP [	JUMPE P5,PURGE1	;NO MESSAGE IF MTA ONLINE
		HRROI A,[ASCIZ /
? SETSPD: Could not set MTA /]
		PSOUT
		MOVEI A,.PRIOU	;TO THE CTY
		EXCH B,D	;GET MTA, SAVE SERIAL #
		MOVEI C,10	;IN OCTAL
		NOUT		;DO IT
		 JFCL
		HRROI A,[ASCIZ / SERIAL # /]
		PSOUT
		MOVEI A,.PRIOU
		MOVE B,D
		MOVEI C,12
		NOUT		;OUPUT THE SERIAL # AS WELL
		 JFCL
		JRST .+1]	;AND DONE
	JRST PURGE1		;GO SYNCH LINE
; TAPE-RECOGINITION-ERRORS COMMAND

TRECER:	CALL COMNDI		;SET UP FOR PARSING WITH COMND JSYS
	 JRST PURGE1		;ERROR
	MOVEI T1,[FLDDB. .CMKEY,,TRETB] ;GET FDB ADDRESS
	CALL COMNDX		;PARSE NEXT KEYWORD
	 JRST [	EMSG <Unknown keyword for TAPE-RECOGNITION-ERRORS>
		JRST CMND]
	HRRZ T4,(T2)		;GET BIT SETTING
	MOVEI T1,.SFTDF		;GET TMON FUNCTION CODE
	TMON			;GET CURRENT MOUNTR CONTROLS
	STOR T4,MT%UUT,T2	;SET OR CLEAR UNLOAD-UNREADABLE-TAPES
	SMON			;RESTORE CONTROL WORD
	JRST CMND		;EXIT TO GET NEXT SETSPD COMMAND

; KEYWORD TABLE FOR TAPE-RECOGNITION-ERRORS

TRETB:	TRETBL,,TRETBL
	XWD [ASCIZ/REGARD-AS-UNLABELED/],0
	XWD [ASCIZ/UNLOAD/],1
TRETBL==.-TRETB-1
; ENABLE COMMAND

DISABL:	TDZA P1,P1		;MARK THAT THIS IS A DISABLE COMMAND
ENABLE:	SETOM P1		;MARK THAT THIS IS AN ENABLE COMMAND
	SKIPE EOLF		;AT END OF COMMAND ?
	JRST CMND		;YES, GO GET NEXT LINE
	CALL PBLANK		;SKIP BLANKS
	 JRST CMND		;PUNT
	HRROI A,BUFFER		;WHERE TO STASH IT
	MOVEM A,BUFPTR		;TO THE ARG BLOCK
	MOVEI A,SIZEB		;THE SIZE OF IT
	MOVEM A,COUNT		;TO THE BLOCK
	MOVX A,RD%JFN!RD%BEL
	MOVEM A,FLAGS		;TO ARG BLOCK
	MOVEI A,BRKMSK		;SET BREAK MASK FOR SPACE ONLY
	MOVEM A,BRKMAD
	MOVEI A,TEXT		;THE ARG BLOCK
	TEXTI			;GET DEFINITION
	 JRST FINISH		;FILE IS SCREWED UP
	SETZM BRKMAD		;RESET FOR NO MASK
	MOVX A,RD%BTM		;SEE IF PROPERLY TERMINATED
	TDNN A,FLAGS		;IS IT?
	JRST [	CALL SEEEOF	;NO. SEE IF EOF THEN
		 JRST PURGE	;NOT. DO MORE PURGING
		JRST FINISH]	;YES. ALL DONE
	MOVE A,BUFPTR		;GET BYTE POINTER
	LDB C,A			;GET TERMINATING CHARACTER
	CAIE C,.CHLFD		;TERMINATED BY A LINE FEED ?
	JRST ENA010		;NO, GO ON
	BKJFN			;YES, BACK UP TO CARRIAGE RETURN
	 JSERR			;UNEXPECTED ERROR
	MOVEM A,BUFPTR		;SAVE NEW POINTER TO TERMINATOR
ENA010:	MOVEI A,.CHNUL		;GET A NULL
	DPB A,BUFPTR		;TERMINATE STRING
	MOVEI A,ENAOPT		;GET ADDRESS OF OPTION TABLE
	SKIPL P1		;IS THIS AN ENABLE COMMAND ?
	MOVEI A,DISOPT		;NO, USE DISABLE OPTION TABLE
	HRROI B,BUFFER		;GET POINTER TO OPTION REQUESTED
	TBLUK			;FIND OPTION IN TABLE
	TXNN B,TL%EXM!TL%ABR	;FOUND A MATCH ?
	JRST [	SKIPE EOLF	;NO, AT END OF LINE ?
		JRST CMND	;YES, GO ON TO NEXT COMMAND
		JRST PURGE1 ]	;NO, IGNORE REMAINDER OF LINE
	HRRZ A,(A)		;GET ADDRESS OF PROCESSING ROUTINE
	CALL (A)		;GO PERFORM INDICATED FUNCTION
	SKIPE EOLF		;AT END OF LINE YET ?
	JRST CMND		;YES, GO ON TO  NEXT COMMAND
	JRST PURGE1		;NO, IGNORE REMAINDER OF LINE
; HERE TO PERMIT CHANGING DIRECTORY PARAMETERS

DISDIR:	TDZA B,B		;TURN OFF THE PARAMETER
ENADIR:	MOVEI B,1		;TURN ON THE OPTION
	MOVEI A,.SFCRD		;GET FUNCTION CODE
	SMON			;TELL THE MONITOR
	RET			;RETURN

; HERE TO ENABLE ACCOUNT VALIDATION

DISACT:	TDZA B,B		;TURN OFF ACCOUNT VALIDATION
ENACCT:	MOVEI B,1		;TURN ON ACCOUNT VALIDATION
	MOVEI A,.SFAVR		;GET THE FUNCTION CODE
	SMON			;TELL THE MONITOR
	RET			;RETURN

; HERE TO ENABLE/DISABLE FULL LATENCY OPTIMIZATION

DISFLO:	TDZA B,B		;TURN OFF FULL LATENCY OPTIMIZATION
ENAFLO:	MOVEI B,1		;TURN ON FULL LATENCY OPTIMIZATION
	MOVEI A,.SFFLO		;GET THE SMON FUNCTION CODE
	SMON			;SET THE DESIRED STATE
	RET			;AND RETURN

; HERE TO ENABLE TAPE-DRIVE-ALLOCATION

ENATDA:	MOVEI B,1		;TURN ON TAPE DRIVE ALLOCATION
	MOVEI A,.SFMTA		;GET SMON SUNCTION CODE
	SMON
	RET

; HERE TO ENABLE/DISABLE WORKING SET PRELOADING

DISWSP:	TDZA B,B
ENAWSP:	MOVEI B,1
	MOVEI A,.SFWSP
	SMON
	RET
;DEFINE A LOGICAL NAME

DEFINE:	SKIPE EOLF		;AT EOL?
	JRST CMND		;YES. GET NEXT COMMAND
	CALL PBLANK		;GO FIND LOGICAL NAME
	 JRST CMND		;NO ARGS
	HRROI A,BUFFER		;WHERE TO STASH IT
	MOVEM A,BUFPTR		;TO THE ARG BLOCK
	MOVEI A,SIZEB		;THE SIZE OF IT
	MOVEM A,COUNT		;TO THE BLOCK
	MOVX A,RD%JFN!RD%PUN!RD%BEL
	MOVEM A,FLAGS		;TO ARG BLOCK
	MOVEI A,TEXT		;THE ARG BLOCK
	TEXTI			;GET DEFINITION
	 JRST FINISH		;FILE IS SCREWED UP
	MOVX A,RD%BTM		;SEE IF PROPERLY TERMINATED
	TDNN A,FLAGS		;IS IT?
	JRST [	CALL SEEEOF	;NO. SEE IF EOF THEN
		 JRST PURGE	;NOT. DO MORE PURGING
		JRST FINISH]	;YES. ALL DONE
	LDB A,BUFPTR		;LOOK AT TERMINATER
	CAIN A,.CHLFD		;A LINE FEED?
	JRST CMND		;YES. NOTHING TO DEFINE THEN
	SETZ A,			;GET RID OF THE TERMINATER
	DPB A,BUFPTR		;TIE IT OFF
	CALL PBLANK		;GET TO DEFINITION
	 JRST CMND		;NOTHING TO DEFINE
	PUSH P,BUFPTR		;SAVE START OF DEFINITION
	MOVX A,RD%JFN!RD%BEL	;GET REST OF COMMAND
	MOVEM A,FLAGS
	MOVEI A,TEXT		;THE BLOCK
	TEXTI			;GOBBLE DOWN THE DEFINITION
	 JRST FINISH		;BAD FILE
	POP P,C			;THE DEFINITION
	MOVX A,RD%BTM		;SEE IF PROPERLY TERMINATED
	TDNN A,FLAGS		;IS IT?
	JRST [	CALL SEEEOF	;NO. SEE IF EOF
		 JRST PURGE	;NOT. ILLEGAL THEN
		JRST FINISH]	;IS. ALL DONE
	HRROI B,BUFFER		;THE LOGICAL NAME
	MOVEI A,.CLNSY		;CREATE A SYSTEM NAME
	CRLNM			;DO IT
	 JRST [	TMSG <
? SETSPD: Failed to define logical name >
		HRROI A,BUFFER	;GET NAME
		PSOUT		;OUTPUT IT
		TMSG < BECAUSE:
>				;AND A REASON
		MOVEI A,.PRIOU	;THE OUTPUT PLACE
		HRLOI B,.FHSLF	;US
		SETZ C,
		ERSTR		;OUTPUT THE MESSAGE
		 JFCL
		 JFCL
		JRST CMND]	;GO DO MORE
	JRST CMND		;GO DO MORE

;SET LOCAL TIME ZONE; IT MUST BE A NUMBER FROM -12 TO 12

TIMZON:	SKIPN EOLF		;GET TO THE ARGUMENT
	CALL PBLANK		; ...
	JRST CMND		;NONE THERE
	HLRZ A,JFN		;NOW READ A NUMBER FOR THE TIMEZONE
	MOVEI C,12		; IN DECIMAL
	NIN
	 JRST PURGE1		;NOT A GOOD ARGUMENT
	MOVM D,B		;CHECK IT FOR RANGE
	CAILE D,^D12		;MUST BE FROM -12 TO 12 DECIMAL
	 JRST [ EMSG <Illegal time zone value>
		JRST PURGE1]	;GO RE-SYNCH LINE
	MOVEI A,.SFTMZ		;SET TIME ZONE
	SMON			;ARGUMENT IN B
	 ERJMP TZERR
	JRST PURGE1		;SUCCESS, ON TO NEXT COMMAND

;ATTEMPT TO SET TIME ZONE FAILED

TZERR:	TMSG <
? SETSPD: Unable to set time zone because:
	>
GENERR:	MOVEI A,.PRIOU		;TYPE OUT MONITOR ERROR
	HRLOI B,.FHSLF		; FOR THIS FORK
	ERSTR
	 JFCL
	 JFCL
	JRST PURGE1		;ON TO NEXT LINE

;SET LOCAL HOST NUMBER OF AN ARPANET SITE

HOST:	SKIPN EOLF		;GET TO THE ARGUMENT
	CALL PBLANK		; ...
	 JRST CMND		;NONE THERE
	HLRZ A,JFN		;READ A NUMBER FOR THE SITE ADDRESS
	MOVEI C,10		; IN OCTAL
	NIN
	 JRST PURGE1		;NOT A GOOD ARGUMENT
	MOVEI A,.SFLHN		;SET LOCAL HOST NUMBER
	SMON
	 ERJMP HSTERR		;FAILED?
	JRST PURGE1		;NO, ON TO NEXT COMMAND

HSTERR: TMSG <
? SETSPD: Unable to set ARPANET site address because:
	>
	JRST GENERR
ARCHIV:	SKIPN EOLF		;GET TO THE ARGUMENT
	CALL PBLANK		; ...
	 JRST CMND		;NONE THERE
	HLRZ A,JFN		;READ A NUMBER OF DAYS
	MOVEI C,^D10		; IN DECIMAL
	NIN
	 JRST PURGE1		;NOT A GOOD ARGUMENT
	MOVEI A,.SFACY		; SET ARCHIVE TAPE RECYCLE PERIOD
	SMON
	 ERJMP ARCERR		;FAILED?
	JRST PURGE1		;NO, ON TO NEXT COMMAND

ARCERR:	TMSG <
? SETSPD: Unable to set archive tape recycle period because:
	>
	JRST GENERR

TAPRCY:	SKIPN EOLF		;GET TO THE ARGUMENT
	CALL PBLANK		; ...
	 JRST CMND		;NONE THERE
	HLRZ A,JFN		;READ A NUMBER OF DAYS
	MOVEI C,^D10		; IN DECIMAL
	NIN
	 JRST PURGE1		;NOT A GOOD ARGUMENT
	MOVEI A,.SFMCY		; SET TAPE RECYCLE PERIOD
	SMON
	 ERJMP TAPERR		;FAILED?
	JRST PURGE1		;NO, ON TO NEXT COMMAND

TAPERR:	TMSG <
? SETSPD: Unable to set tape recycle period because:
	>
	JRST GENERR
;COMMAND TO DECLARE DECNET NODE NAME

NODNAM:	SKIPE EOLF		;AT THE END-OF-COMMAND?
NODNA1:	JRST [	EMSG <Invalid name given for NODE command>
		JRST PURGE1]	;AND DO IT AGAIN
	CALL PBLANK		;SKIP BLANKS
	 JRST NODNA1		;ERROR
	MOVEI A,SIZEB		;SIZE OF BUFFER
	MOVEM A,COUNT
	HRROI A,BUFFER		;WHERE NAME WILL GO
	MOVEM A,BUFPTR		;TO ARG BLOCK
	MOVX A,RD%JFN!RD%PUN!RD%BEL!RD%CRF ;FLAGS
	MOVEM A,FLAGS
	MOVEI A,TEXT		;ARG BLOCK
	TEXTI			;GET NAME
	 JRST FINISH		;FILE IS BAD. GO WRAP UP
	MOVX A,RD%BTM		;SEE IF FOUND TERMINATOR
	TDNN A,FLAGS		;DID WE?
	JRST NODNA1		;NO. ERROR THEN
	LDB A,BUFPTR		;GET TERMINATOR?
	CAIN A,.CHLFD		;EOL?
	SETOM EOLF		;YES. REMEMBER THIS
	MOVEI A,.CHNUL		;GET A NULL
	DPB A,BUFPTR		;ZAP POINTER
	SKIPN EOLF		;AT EOL?
	CALL PBLANK		;SKIP TO NEXT FIELD
	 JRST [	SETZM D		;AT THE END. DON'T SET NUMBER
		JRST NODNA2]
	HLRZ A,JFN		;GET FILE JFN
	MOVEI C,12		;GET DECIMAL NUMBER
	NIN			;""
NODNA3:	 JRST [	EMSG <Illegal node number in NODE command>
		JRST PURGE1]	;SKIP REMAINDER OF COMMAND
	MOVE D,B		;SAVE NUMBER
NODNA2:	MOVEI A,.NDSLN		;WANT TO SET NODE NAME
	MOVEI B,C		;ARG BLOCK
	HRROI C,BUFFER		;WHERE NAME IS
	NODE			;DO IT
	 ERJMP NODNA1		;IF FAILED, GO AWAY
	JUMPE D,PURGE1		;IF NO NUMBER, GO ON
	MOVEI A,.NDSNM		;SET NODE NUMBER
	MOVEI B,D		;WHERE THE NUMBER IS
	NODE			;SET IT
	 ERJMP NODNA3		;BAD!!
	JRST PURGE1		;NAME IS SET
; "CHANGE" COMMAND -- SET ACCOUNTING SHIFT TIMES
;
; COMMAND FORMAT:
;	CHANGE (ACCOUNT SHIFT AT) <TIME> (ON) <DAYS-OF-WEEK>

CHANGE:
	SKIPN EOLF		;END-OF-LINE HERE?
	CALL PBLANK		;NO-- SKIP BLANKS BEFORE TIME
	 JRST CMND		;EOL-- IGNORE COMMAND
	HLRZ A,JFN		;GET JFN OF CONFIG FILE
	MOVX T2,IT%NDA!IT%NTZ	;TIME ONLY, NO ZONES
	IDTNC			;GET TIME IN COMMAND
	 JRST PURGE1		;INVALID TIME, SKIP IT
	BKJFN			;BACK OVER TERMINATOR
	 JFCL
	HRRZ P1,D		;REMEMBER THE TIME
	CALL PBLANK
	 JRST CHANG7		;EOL-- ASSUME ALL DAYS OF WEEK

;LOOP FOR ALL DAYS-OF-WEEK SPECIFIED

CHANG2:
	CALL PBLANK		;SKIP TO NEXT NON-BLANK
	 JRST CHANG8		;EOL-- GO FINISH UP
	HRROI A,BUFFER		;WHERE TO STASH IT
	MOVEM A,BUFPTR		;TO THE ARG BLOCK
	MOVEI A,SIZEB		;THE SIZE OF IT
	MOVEM A,COUNT		;TO THE BLOCK
	MOVX A,RD%JFN!RD%BEL!RD%PUN
	MOVEM A,FLAGS		;TO ARG BLOCK
	MOVEI A,TEXT		;THE ARG BLOCK
	TEXTI			;GET DEFINITION
	 JRST FINISH		;FILE IS SCREWED UP
	MOVX A,RD%BTM		;SEE IF PROPERLY TERMINATED
	TDNN A,FLAGS		;IS IT?
	JRST [	CALL SEEEOF	;NO. SEE IF EOF THEN
		 JRST PURGE	;NOT. DO MORE PURGING
		JRST FINISH]	;YES. ALL DONE
	MOVE A,BUFPTR		;GET BYTE POINTER
	LDB C,A			;GET TERMINATING CHARACTER
	CAIN C,.CHLFD		;TERMINATED BY A LINE FEED ?
	BKJFN			;YES, BACK UP TO CARRIAGE RETURN
	 JFCL
	MOVEM A,BUFPTR		;SAVE NEW POINTER TO TERMINATOR
	MOVEI A,.CHNUL		;GET A NULL
	DPB A,BUFPTR		;TERMINATE STRING
	MOVEI A,DOWTAB		;GET DAY-OF-WEEK NAME TABLE
	HRROI B,BUFFER		;GET POINTER TO OPTION REQUESTED
	TBLUK			;FIND OPTION IN TABLE
	TXNN B,TL%EXM!TL%ABR	;FOUND A MATCH ?
	JRST [	SKIPE EOLF	;NO, AT END OF LINE ?
		JRST CMND	;YES, GO ON TO NEXT COMMAND
		JRST PURGE1 ]	;NO, IGNORE REMAINDER OF LINE
	HRLZ A,(A)		;GET DAY-OF-WEEK BITS FROM TABLE TO LH
	TDO P1,A		;SET SELECTED DAYS

	HLRZ A,JFN		;GET JFN
	BKJFN			;BACK UP TO TERMINATOR
	 JFCL
	CALL PBLANK		;SKIP BLANKS AFTER NAME
	 JRST CHANG8		;EOL-- SET SPECIFIED BITS
	HLRZ A,JFN		;GET JFN
	BIN			;GET NON-BLANK CHARACTER
	CAIE B,","		;LEGAL SEPERATOR?
	 JRST PURGE1		;NO-- EAT UP LINE
	JRST CHANG2		;YES-- LOOP FOR NEXT TERMINATOR

CHANG7:
	TXO P1,1B0!1B1!1B2!1B3!1B4!1B5!1B6 ;ASSUME ALL DAYS OF WEEK
CHANG8:
	MOVEI T1,ASCTBZ		;GET SIZE OF TABLE
	HRRZM T1,ASCTBL		;STORE AS MAX TABLE SIZE
	MOVX T1,.USRAS		;READ ACCOUNTING SHIFTS
	MOVEI T2,ASCTBL		; INTO ASCTBL
	USAGE			; . . .
	 ERCAL [JSERR
		RET]
	HLRZ T1,ASCTBL		;GET CURRENT SIZE OF TABLE
	ADDI T1,1		;BUMP BY ONE
	HRLM T1,ASCTBL		;STORE NEW SIZE
	MOVEM P1,ASCTBL(T1)	;STORE NEW ENTRY
	MOVX T1,.USSAS		;SET ACCOUNTING SHIFTS
	USAGE
	 ERCAL [JSERR
		RET]
	JRST CMND		;DONE WITH CHANGE, DO NEXT COMMAND
; ROUTINE TO LOAD A RAM OR VFU

LPTLOD:	SKIPE EOLF		;AT END-OF-COMMAND ?
	JRST CMND		;YES, GO GET NEXT LINE
	CALL PBLANK		;SKIP BLANKS
	 JRST CMND		;PUNT

; READ LPT UNIT NUMBER FROM FILE

	STKVAR <LODUNI,LODFNC,LODJFN,LODLCP,LPTJFN>
	SETZM LODJFN		;INIT THIS TO ZERO
	SETZM LODLCP		;ASSUME PRINTER IS NOT LOWER CASE
	HLRZ A,JFN		;GET JFN OF FILE TO READ
	MOVEI C,^D8		;USE OCTAL FOR UNIT NUMBER
	NIN			;INPUT THE PRINTER UNIT NUMBER
	 JRST PURGE1		;ERROR, IGNORE REMAINDER OF LINE
	MOVEM B,LODUNI		;SAVE LPT UNIT NUMBER

; SEE IF RAM OR VFU IS TO BE LOADED

LPLD20:	CALL PBLANK		;SKIP BLANKS
	 JRST PURGE1		;NO MORE ARGS, IGNORE REST OF LINE
	MOVEI A,SIZEB		;SIZE OF BUFFER
	MOVEM A,COUNT		;TO ARG BLOCK
	HRROI A,BUFFER		;WHERE DATA IS GOING
	MOVEM A,BUFPTR
	MOVX A,RD%JFN!RD%PUN!RD%BEL ;FLAGS
	MOVEM A,FLAGS		;TO THE ARGS
	MOVEI A,TEXT		;ARG BLOCK
	TEXTI			;READ KEY VALUE
	 JRST FINISH		;FILE IS SCREWED UP. GO FINISH
	MOVX A,RD%BTM		;SEE IF FOUND TERMIANTOR
	TDNN A,FLAGS		;DID WE?
	JRST [	CALL SEEEOF	;NO. AT EOF?
		 JRST PURGE	;NO. SKIP REST OF LINE
		JRST FINISH]	;YES. DONE
	LDB A,BUFPTR		;GET TERMINATOR
	SETZM EOLF		;NOT AN EOL
	CAIN A,.CHLFD		;WAS IT A LINE FEED?
	SETOM EOLF		;YES. REMEMBER THIS
	;..
	;..

	MOVEI A,.CHNUL		;GET A NULL CHARACTER
	DPB A,BUFPTR		;TERMINATE KEYWORD WITH A NULL
	MOVEI A,LPTTAB		;GET ADDRESS OF TABLE OF OPTIONS
	HRROI B,BUFFER		;GET POINTER TO TEXT ARGUMENT IN FILE
	TBLUK			;LOOK FOR OPTION SPECIFIED
	TXNN T2,TL%EXM!TL%ABR	;FOUND A MATCH ?
	JRST [	SKIPE EOLF	;NO, HAS END-OF-LINE BEEN SEEN ?
		JRST CMND	;YES, GO DO NEXT COMMAND
		JRST PURGE1 ]	;NO, IGNORE REMAINDER OF LINE
	HRRZ A,(A)		;GET FUNCTION TO PERFORM
	CAIN A,.MOSTS		;SET STATUS FUNCTION (DECLARE LOWER CASE LPT) ?
	JRST [	SETOM LODLCP	;YES, FLAG THAT PRINTER SHOULD BE LOWER CASE
		JRST LPLD20 ]	;GO GET NEXT ARGUMENT
	MOVEM A,LODFNC		;SAVE DESIRED FUNCTION (MTOPR CODE)

; READ FILENAME TO BE LOADED AND GET A JFN FOR IT

	CALL PBLANK		;SKIP ANY BLANKS
	 JRST PURGE1		;NO MORE DATA
	MOVX T1,GJ%SHT!GJ%FNS!GJ%OLD ;EXISTING FILE, PHYSICAL ONLY
	HLLZ T2,JFN		;GET JFN OF FILE TO READ NAME FROM
	HRRI T2,.NULIO		;NO EDITING OUTPUT JFN
	GTJFN			;GET A JFN FOR FILE TO BE LOADED
	 JRST LODERR		;FAILED
	MOVEM A,LODJFN		;SAVE JFN
	HLRZ A,JFN		;GET JFN FOR COMMAND FILE
	BKJFN			;BACK UP ONE CHARACTER
	 JFCL			;IGNORE ERRORS
	BIN			;GET LAST CHARACTER READ
	CAIN B,.CHLFD		;READ AN END-OF-LINE ?
	SETOM EOLF		;YES, INDICATE EOL SEEN
; OPEN THE PRINTER AND VERIFY THAT NO RAM OR VFU IS NOW LOADED

	HRROI A,FILNAM		;GET POINTER TO WHERE DEVICE STRING GOES
	MOVSI B,600007		;GET LPT DEVICE DESIGNATOR
	HRR B,LODUNI		;GET UNIT NUMBER
	DEVST			;GET DEVICE NAME STRING
	 JRST LODERR		;FAILED 
	MOVEI B,":"		;GET TERMINATOR FOR GTJFN
	IDPB B,A		;TERMINATE DEVICE NAME
	SETZ B,
	IDPB B,A		;TIE IT OFF
	MOVX A,GJ%SHT!GJ%FOU	;SHORT CALL, FOR OUTPUT USE
	HRROI B,FILNAM		;GET POINTER TO DEVICE NAME
	GTJFN			;GET A JFN FOR THE PRINTER
	 JRST ENDLPT		;ALREADY ASSIGNED
	MOVEM A,LPTJFN		;SAVE LPT JFN
	MOVX B,<FLD(7,OF%BSZ)+OF%WR> ;OPEN FOR WRITE
	OPENF			;OPEN THE PRINTER
	 JRST [	EXCH A,LPTJFN	;MUST BE OPEN ALREADY, GET BACK JFN
		RLJFN		;RELEASE THE JFN
		 JFCL		;IGNORE ERRORS HERE
		MOVE A,LPTJFN	;GET BACK ERROR CODE
		CAIE A,OPNX9	;ALREADY OPENED BY SOMEONE?
		JRST LODANY	;NO. LOAD ANYWAY
		JRST ENDLPT ]	;GO ON TO NEXT COMMAND
	MOVEI B,.MOPSI		;GET OFF-LINE INTS
	MOVEI C,P1		;SET UP ARGS IN REGISTERS
	MOVEI P1,3		;3 WORDS
	SETZB P2,P3		;CHANNEL 0, NO FLAGS
	MTOPR			;DO IT
	ERJMP .+1		;IN CASE SOMETHING TERRIBLE HAPPENED
	GDSTS			;GET CURRENT STATUS
	TXZ B,MO%LVU!MO%LCP!MO%EOF ;TURN OFF CONDITION BITS
	JUMPN B,INERR		;IF AN ERROR, PUNT IT
	MOVEI B,14		;IF NO ERROR, ALIGN FORMS
	BOUT			;DO IT
	 ERJMP .+1		;IGNORE FAILURE
INERR:	DMOVE B,[-1,,FILNAM
		5*^D28]		;ARGS
	DMOVEM B,MTBLK+1	;TO ARG BLOCK
	MOVE C,LODFNC		;GET FUNCTION TO PERFORM
	MOVX B,.MORTR		;GET READ-RAM FUNCTION CODE
	CAIE C,.MOLTR		;ARE WE LOADING THE RAM ?
	MOVX B,.MORVF		;NO, GET READ-VFU FUNTION
	MOVEI C,MTBLK		;GET ADDRESS OF BLOCK
	SETZM FILNAM		;MAKE IT LOOK AS IF IT IS NOT LOADED
	MTOPR			;READ FILENAME ALREADY LOADED
	 ERJMP .+1		;UNEXPECTED ERROR. LOAD RAM ANYWAY
	MOVE A,LPTJFN		;GET JFN FOR PRINTER
	CLOSF			;CLOSE THE FILE
FCLOSE:	 JRST [	MOVE A,LPTJFN	;FAILED. GET JFN AGAIN
		TXO A,CZ%ABT	;DO IT NOW WITH ABORT
		CLOSF		;DO IT
		 JFCL		;HAS TO WORK
		JRST .+1]	;ALL DONE
	LDB A,[POINT 7,FILNAM,6] ;GET FIRST BYTE RETURNED
	JUMPN A,ENDLPT		;IF NOT-NULL, GO ON TO NEXT COMMAND

; GET JFN, FUNCTION, AND UNIT # AND LOAD THE RAM OR VFU

LODANY:	MOVE B,LODFNC		;GET FUNCTION TO BE PERFORMED
	MOVE A,LODJFN
	MOVE C,LODUNI		;GET UNIT NUMBER OF PRINTER
	SKIPE LODLCP		;IS THIS PRINTER LOWER CASE ?
	TXO B,MO%LCP		;YES, MARK THAT PRINTER IS LOWER CASE
	LPINI			;LOAD RAM OR VFU
	 ERJMP LODERR		;ERROR - TELL SOMEONE

; HERE TO FINISH UP AND GO DO NEXT COMMAND

ENDLPT:	MOVE P,[IOWD 20,PDL]	;RESET STACK
	SKIPE EOLF		;AT END OF COMMAND YET ?
	JRST CMND		;YES, GO DO NEXT COMMAND
	JRST PURGE1		;NO, IGNORE REST OF LINE
; HERE ON AN ERROR LOADING THE RAM OR VFU

LODERR:	TMSG <
? SETSPD: Could not load the >
	HRROI A,[ASCIZ/VFU/]	;GET TEXT
	MOVE B,LODFNC		;GET FUNCTION BEING PERFORMED
	CAIE B,.MOLVF		;ARE WE LOADING THE VFU ?
	HRROI A,[ASCIZ/RAM/]	;NO, GET RAM TEXT
	PSOUT			;TELL USER WHAT WE ARE LOADING
	TMSG < for PLPT>	;GET UNIT NAME
	MOVEI A,.PRIOU		;GET PRIMARY OUTPUT JFN
	MOVE B,LODUNI		;GET UNIT NUMBER
	MOVEI C,^D8		;GET OCTAL RADIX
	NOUT			;OUTPUT THE UNIT NUMBER
	 JFCL			;IGNORE ERRORS HERE
	TMSG <
>				;END OF MESSAGE
	SKIPE A,LODJFN		;GET JFN FOR FILE TO HAVE BEEN LOADED
	CLOSF			;MAKE SURE IT IS REALLY CLOSED AND RELEASED
	 JFCL			;PROBABLY CLOSED BY MONITOR ALREADY ANYHOW
	JRST ENDLPT		;GO FINISH UP

;LPT OFF-LINE INTERRUPT ROUTINE

LPTINT:	MOVEI A,@FCLOSE		;REDIRECT CODE TO CLOSE AND ABORT DEVICE
	MOVEM A,ADDR		;ZAP THE OLD PC WORD
	DEBRK			;AND GO FINISH UP
;ROUTINES FOR SCHEDULER CONTROLS

;SET BIAS-CONTROL VALUE

BIAS:	SKIPN EOLF		;AT EOL ALREADY?
	CALL PBLANK		;GET LINE
	 JRST CMND		;NO MORE IN LINE
	HLRZ A,JFN		;GET JFN
	MOVEI C,^D10		;PARSE IN DECIMAL
	NIN			;GET VALUE
	 ERJMP [JSERR		;BAD
		JRST PURGE1]	;GIVE UP
	MOVE T4,T2		;COPY NUMBER
	MOVEI T1,.SKSBC		;SET BIAS CONTROL
	MOVEI T2,T3		;ARG BLOCK
	MOVEI T3,2		;LENGTH OF BLOCK
	SKED%			;SET IT
	 ERJMP [EMSG <Invalid value for bias control setting>
		JRST PURGE1]
	JRST PURGE1		;ALL SET

;SET BATCH BACKGROUND

BATBGD:	MOVEI T1,.SKBBG		;GET PROPER FUNCTION
	SETZM T2		;NO ARGS
	SKED%			;SET IT
	ERCAL [	EMSG <Could not set BATCH-BACKGROUND>
		RET]
	JRST PURGE1		;AND DONE
;SCHEDULER CONTROLS COMMANDS CONTINUED

;CREATE A CLASS. WILL DO NOTHING IF CLASS SCHEDULER NOW ON.

CREATE:	MOVX T1,.SKRCV		;READ CLASS PARAMETERS
	MOVEI T2,T3
	MOVEI T3,2
	SKED%			;READ OUT CLASS PARAMETERS
	ERJMP [	JSERR
		JRST PURGE1]	;ERROR OF SOME SORT
	TXNN T4,SK%STP		;NOW ON?
	JRST PURGE1		;YES. GO AWAY QUIETLY THEN

;CLASS SCHEDULING NOW OFF. SET THE CLASS SHARE

	SKIPE EOLF		;AT THE END OF THE COMMAND?
	JRST CMND		;YES
	CALL PBLANK		;SKIP BLANKS
	 JRST CMND		;NO MORE IN THE COMMAND

	HLRZ A,JFN		;GET JFN OF FILE
	MOVEI C,^D10		;IN DECIMAL
	NIN			;READ THE CLASS
	 JRST [	JSERR
		JRST PURGE1]	;ERROR
	MOVEM T2,CLSBLK+1	;SAVE CLASS
	CALL PBLANK		;GET TO PERCENTAGE
	 JRST [	EMSG <Could not set class share; percentage not given>
		JRST CMND]	;DONE
	HLRZ A,JFN		;GET JFN AGAIN
	FLIN			;GET FLOATING-POINT NUMBER
	 ERJMP [EMSG <Could not CREATE class. Floating point number invalid>
		JRST PURGE1]	;AND GIVE UP
	MOVEM T2,CLSBLK+2	;SAVE %
	MOVEI T2,CLSBLK
	MOVEI T1,.SKSCS		;PROPER FUNCTION
	SKED%			;DO IT
	ERJMP [	TMSG <
? SETSPD: Could not CREATE class: >
		JSERR
		JRST PURGE1]	;DONE
	JRST PURGE1		;AND DONE
;MORE SCHEDULER COMMANDS

;ENABLE CLASS-SCHEDULING. GOT TO HERE FROM ENABLE COMMAND

ECSKED:	ILDB T1,BUFPTR		;CHECK FOR NO LINE
	CAIN T1,12
	JRST ECERR1		;NO ARGUMENTS
	MOVEI T1,.SKRCV		;READ CLASS VALUES
	MOVEI T2,T3
	MOVEI T3,2
	SKED%			;READ VALUES
	ERJMP PURGE1
	TXNN T4,SK%STP		;NOW ON?
	JRST PURGE1		;YES. SKIP IT THEN

;CLASS SCHEDULER NOW OFF.

	CALL SETNXT		;SET UP NEXT COMMAND
	 JRST [	JUMPE A,PURGE	;IF NOT EOF, DONE
		JRST FINISH]	;SCREWED UP FILE
	MOVEI A,SKDOPT		;GET TABLE ADDRESS
	HRROI B,BUFFER		;THE COMMAND
	TBLUK			;LOOK IT UP
	TXNN B,TL%EXM!TL%ABR	;GOT A MATCH?
ECERR1:	JRST [	EMSG <Invalid keyword for scheduling type>
		JRST PURGE1]	;DONE
	HRRZ A,0(A)		;GET VALUE
	MOVX T4,SK%ACT		;ASSUME BY ACCOUNT
	SKIPE A			;IS IT?
	TXZ T4,SK%ACT		;NO
	CALL SETNXT		;GET NEXT KEYWORD
	 JRST SETNOW		;NO MORE. DO COMMAND THEN
	MOVEI A,SKDOP0		;NEXT SET
	HRROI B,BUFFER
	TBLUK			;LOOK IT UP
	TXNN B,TL%EXM!TL%ABR	;GOT A MATCH?
	JRST [	EMSG <Invalid windfall option>
		JRST PURGE1]
	HRRZ A,0(A)		;GET VALUE
	SKIPE A			;WANT TO WITHHOLD?
	TXO T4,SK%WDF		;YES
SETNOW:	MOVEI T1,.SKICS
	MOVEI T2,T3
	MOVEI T3,2		;COUNT
	SKED%			;START UP CLASS SCHEDULER
	ERJMP [JSERR		;ERROR
		JRST PURGE1]
	JRST PURGE1		;DONE
;SCHEDULER CONTROL ROUTINES CONTINUED

;LOCAL ROUTINE TO GET NEXT KEYWORD. PRESERVES T4

SETNXT:	SKIPN EOLF		;NOW AT THE END
	CALL PBLANK		;SKIP BLANKS
SETNX0:	 JRST [	SETZM A
		RET]
	HRROI A,BUFFER		;BUFFER ADDRESS
	MOVEM A,BUFPTR		;SAVE IT
	MOVEI A,SIZEB		;THE SIZE
	MOVEM A,COUNT
	MOVX A,RD%JFN!RD%PUN!RD%BEL
	MOVEM A,FLAGS
	MOVEI A,TEXT		;ARG BLOCK
	TEXTI			;GET KEYWORD
SETNX1:	 JRST [	SETOM A		;BAD FILE
		RET]
	MOVX A,RD%BTM		;SEE IF GOOD BREAK
	TDNN A,FLAGS		;IS IT?
	JRST [	CALL SEEEOF	;EOF?
		 JRST SETNX0	;NO
		JRST SETNX1]	;YES
	MOVE A,BUFPTR		;GET FINAL POINTER
	LDB C,A			;GET TERMINATOR
	CAIE C,.CHLFD		;LF?
	JRST SETNX2		;NO
	BKJFN
	 JFCL
	MOVEM A,BUFPTR		;FLUSH IT
SETNX2:	MOVEI A,.CHNUL		;GET A NULL
	DPB A,BUFPTR		;ZAP TERMINTOR
	RETSKP			;AND DONE
;MORE CLASS SCHEDULING COMMANDS

;SET BATCH CLASS

BCHCLS:	SKIPN EOLF		;AT THE END YET?
	CALL PBLANK		;SKIP OVER BLANKS
	 JRST CMND		;NO MORE ARGS
	HLRZ A,JFN		;GET FILE JFN
	MOVEI T3,^D10		;READ IN A NUMBER
	NIN			;DO IT
	 ERJMP [JSERR		;ERROR OF SOME SORT
		JRST PURGE1]	;AND DONE
	MOVE T4,T2		;COPY VALUE
	MOVEI T3,2		;ARG BLOCK
	MOVEI T1,.SKBCS		;SET BATCH CLASS
	MOVEI T2,T3		;POINT TO ARG BLOCK
	SKED%			;DO IT
	 ERJMP [EMSG <Could not set BATCH-CLASS>
		JSERR
		JRST PURGE1]	;ERROR
	JRST PURGE1		;AND DONE
;ENTRY POINT FOR PROCESSING CRASH DUMPS

START3:	MOVE P,[IOWD PDLEN,PDL]	;SET UP PUSH DOWN LIST
	CALL INIT		;SET UP PSI, CAPABILITIES, ETC.
	CALL QUEBLK
	HALTF


; QUEBLK - COPY DUMP.EXE TO DUMP.CPY AND LOG ANY UNLOGGED SYSERR
;	   BLOCKS THAT WERE FOUND IN THE DUMP FILE
; RETURNS +1: ALWAYS

QUEBLK:	MOVE T1,[SIXBIT /DBUGSW/] ;CHECK ON STATE OF SYSTEM
	SYSGT			;READ DBUGSW
	SKIPE T2		;FOUND IT?
	CAIGE T1,2		;YES. IS IT STAND-ALONE?
	SKIPA			;NO. DO THE DUMP
	RET			;YES. DON'T DO ANYTHING
	TRVAR <QUEJFN,QUEFRK,QUEPGS>
	SETZ T1,		;GET A FORK TO LOAD DUMP.EXE INTO
	CFORK
	 RET			;COULD NOT GET A FORK, SO JUST EXIT
	MOVEM T1,QUEFRK		;SAVE FORK HANDLE
	MOVX T1,GJ%OLD!GJ%SHT	;GET A JFN FOR <SYSTEM>DUMP.EXE
	HRROI T2,[ASCIZ/PS:<SYSTEM>DUMP.EXE/]
	GTJFN
	 JRST QUEKFK		;NO DUMP FILE, NOTHING TO DO
	MOVEM T1,QUEJFN		;SAVE JFN
	MOVE T2,[440000,,OF%RD!OF%WR!OF%THW]
	OPENF			;OPEN THE FILE FOR READ/WRITE THAWED
	 JRST [	MOVE T1,QUEJFN	;FAILED, CLEAN UP
		RLJFN
		 JFCL
		JRST QUEKFK]
	HRLI T1,.FBPRT		;SET THE PROTECTION OF DUMP.EXE TO 770000
	MOVEI T2,-1		;RIGHT HALF PROTECTION BITS
	MOVEI T3,770000		;MUCHO PROTECTION
	CHFDB			;THIS FILE MUST BE PROTECTED FOR SECURITY
	 ERJMP .+1
	HRLZ T1,QUEJFN		;NOW MAP IN DIR PAGE
	MOVE T2,[.FHSLF,,PG0PG]
	MOVX T3,PM%RD!PM%WT	;READ AND WRITE
	PMAP
	HRRZ T1,PG0ADR		;GET LENGTH OF DIRECTORY BLOCK
	HRRZ T2,PG0ADR-2(T1)	;GET STARTING FILE PAGE # OF LAST GROUP
	HLRZ T3,PG0ADR-1(T1)	;GET HALFWORD CONTAINING REPEAT COUNT
	LSH T3,-9		;RIGHT JUSTIFY REPEAT COUNT
	ADDI T2,1(T3)		;COMPUTE # OF FILE PAGES TO MAP
	MOVEM T2,QUEPGS		;SAVE NUMBER FOR CPYDMP
	HRRZ T1,PG0ADR		;GET LENGTH OF HEADER BLOCK OF DIR
	HLRZ T2,PG0ADR(T1)	;GET CODE OF NEXT BLOCK
	CAIE T2,1775		;ENTRY VECTOR?
	JRST QUEDON		;NO, GIVE UP
	HRRZ T2,PG0ADR(T1)	;GET LENGTH
	CAIGE T2,4		;CORRECT LENGTH?
	JRST QUEDON		;NO, GIVE UP
	SKIPE PG0ADR+3(T1)	;ALREADY LOOKED AT THIS DUMP?
	JRST QUEDON		;YES, GIVE UP
	SETOM PG0ADR+3(T1)	;NO, MARK THAT WE HAVE NOW SEEN IT
	SETO T1,		;AND UNMAP THE PAGE
	MOVE T2,[.FHSLF,,PG0PG]
	SETZ T3,
	PMAP
	HRRZ T1,QUEJFN		;GET JFN OF ORIGINAL DUMP FILE
	MOVE T2,QUEPGS		;GET HIGHEST PAGE NUMBER TO COPY
	CALL CPYDMP		;GO COPY THE DUMP FILE
	HRRZ T1,QUEJFN		;CLOSE THE JFN
	TXO T1,1B0		;BUT KEEP THE JFN
	CLOSF
	 JFCL
	HRLZ T1,QUEFRK		;NOW MAP DUMP.EXE INTO FORK
	HRR T1,QUEJFN
	GET
	SETZM QUEJFN		;JFN HAS BEEN RELEASED
;THE COPY IS EITHER DONE OR HAS BEEN DELETED BECAUSE SYSTEM IS
;STAND-ALONE. PROCEED WITH QUEUEING UP THE SYSERR BLOCKS

DMPDON:	HRLZ T1,QUEFRK		;NOW MAP IN PAGE 0
	MOVE T2,[.FHSLF,,PG0PG]
	MOVX T3,PM%RD
	PMAP
	SKIPG P1,PG0ADR+SEBQOU	;IS THERE ANYTHING IN THE QUEUE?
	JRST QUEDN1		;NO, GO MARK THAT THIS DUMP IS DN1E
QUELOP:	MOVEI P2,0(P1)		;GET ADDRESS OF NEXT BLOCK
	ANDI P2,777		;GET LOW ORDER BITS ONLY
	MOVEI T1,0(P1)		;NOW MAP IN THE PAGE WITH THE BLOCK
	LSH T1,-PGSFT
	HRL T1,QUEFRK
	MOVE T2,[.FHSLF,,TMPPG]
	MOVX T3,PM%RD+PM%CNT+2	;GET 2 PAGES IN CASE BLK CROSSES PAGE
	PMAP
	MOVEI T1,TMPADR(P2)	;GET ADDRESS OF START OF BLOCK
	LOAD T2,SEBSIZ,(T1)	;GET SIZE OF BLOCK
	ADDI T1,SEBHED		;DONT STORE HEADER
	SUBI T2,SEBHED
	SYERR			;PUT THIS BLOCK INTO ERROR LOG
	 ERJMP .+1		;IGNORE ERRORS
	HRRZ P1,TMPADR(P2)	;GET ADDRESS OF NEXT BLOCK
	JUMPN P1,QUELOP		;IF ONE THERE, GO PROCESS IT
QUEDN1:	MOVE T1,[SIXBIT /APRID/] ;GET APRID OF PROCESSOR
	SYSGT			;TO DETERMINE KS10
	CAIG T1,^D4096		;IF GT 4096. THEN KS12
	JRST QUEDON		;NO -- DON'T NEED HSB
	MOVEI T1,SEC%HS		;SET UP LOGGING CODE
	STOR T1,SEBERC
	DMOVE T1,PG0ADR		;GET FIRST TWO WORDS OF DUMP (PHYSICAL 0,1
	DMOVEM T1,HS%COD+4+HSBBUF	;STORE IN BUFFER
	MOVE T1,[-HS%HSZ,,HS%HDZ]	;POINTER TO BUFFER
	MOVEM T1,HS%PTR+4+HSBBUF	;BUFFER 
	MOVE T1,[PG0ADR+HSBADR,,HSBBUF+4+HS%HDZ] ;MOVE TO BUFFER
	BLT T1,HSBBUF+4+HS%HSZ	;BLT LOW CORE DATA
	MOVEI T1,HSBBUF		;SYSERR OUTPUT BUFFER
	MOVEI T2,HS%LEN
	SYERR			;OUTPUT ERROR
	 ERJMP .+1		;IGNORE ERRORS
QUEDON:	SETO T1,		;FIRST UNMAP PAGES
	MOVE T2,[.FHSLF,,PG0PG]	;DO PAGE 0
	SETZ T3,
	PMAP
	MOVE T2,[.FHSLF,,TMPPG]	;AND TEMP PAGES
	MOVX T3,PM%CNT+2
	PMAP
	HRRZ T1,QUEJFN		;SEE IF THERE IS A JFN STILL AROUND
	JUMPE T1,QUEKFK
	CLOSF			;YES, CLOSE IT
	 JFCL
QUEKFK:	MOVE T1,QUEFRK		;NOW KILL THE FORK
	KFORK
	RET			;ALL DONE
;CPYDMP - ROUTINE TO COPY <SYSTEM>DUMP.EXE TO <SYSTEM>DUMP.CPY
;
;ACCEPTS IN T1/	JFN OF ORIGINAL DUMP FILE
;	    T2/	# OF FILE PAGES TO COPY
;		CALL CPYDMP
;RETURNS: +1 ALWAYS



CPYDMP:	STKVAR <DMPJFN,DMPCNT,CPYJFN,CPYSIZ>
	MOVEM T1,DMPJFN		;SAVE JFN OF ORIGINAL DUMP FILE
	MOVEM T2,DMPCNT		;SAVE # OF FILE PAGES TO COPY
	IMULI T2,1000		;COMPUTE # OF WORDS TO BE COPIED
	SUBI T2,1		;COMPUTE # OF LAST WORD IN COPY FILE
	MOVEM T2,CPYSIZ		;SAVE # OF WORDS IN FILE
	MOVX T1,GJ%FOU!GJ%SHT	;GET A JFN TO MAKE THE COPY
	HRROI T2,[ASCIZ /PS:<SYSTEM>DUMP.CPY;P770000/]
	GTJFN			;GET IT
DMPERR:	 JRST [	HRROI T1,[ASCIZ /
? SETSPD: Failed to copy dump file because:
/]
		PSOUT
		MOVEI T1,.PRIOU	;THE DESTINATION
		HRLOI T2,.FHSLF	;US
		ERSTR		;OUTPUT THE ERROR
		 JFCL
		 JFCL
		CALL UMPPGS	;UNMAP DUMP PAGES
		RET]		;RETURN
	MOVEM T1,CPYJFN		;SAVE JFN OF DUMP.CPY
	MOVE T2,[440000,,OF%RD+OF%WR]
	OPENF			;OPEN THE COPY FILE
	 JRST DMPERR		;FAILED
	HRLI T1,.FBBYV		;CHANGE PROPER WORD
	MOVX T2,FB%RET		;SET THE RETENTION COUNT
	SETZ T3,		; TO INFINITY
	CHFDB			;DO IT
	ERJMP .+1		;IGNORE ANY ERRORS
	HRROI T1,[ASCIZ /
COPYING PREVIOUS SYSTEM DUMP TO:
/]
	PSOUT
	MOVEI T1,.PRIOU
	MOVE T2,CPYJFN		;GET JFN OF DUMP.CPY FILE
	SETZ T3,		;USE DEFAULT
	JFNS			;OUTPUT THE THE FILE NAME
	; ..
	; ..

; SET UP TO COPY THE FILE

	SETZM T4		;START WITH FILE PAGE 0
CPYD10:	MOVE T1,DMPCNT		;GET # OF PAGES TO COPY
	JUMPLE T1,CPYD20	;IF DONE, GO UNMAP THE PAGES
	SUBI T1,CPYPGS		;COMPUTE # OF PAGES LEFT TO COPY
	MOVEM T1,DMPCNT		;SAVE NEW # OF PAGES TO COPY
	HRL T1,DMPJFN		;GET JFN OF ORIGINAL DUMP FILE
	HRR T1,T4		;GET FILE PAGE NUMBER
	MOVE T2,[.FHSLF,,DMPPG]	;THIS FORK, FIRST PAGE TO MAP DUMP FILE
	MOVEI T3,CPYPGS		;GET # OF PAGES TO MAP
	SKIPGE DMPCNT		;NEED TO MAP LESS THAN THIS MANY ?
	ADD T3,DMPCNT		;YES, COMPUTE # REMAINING TO BE MAPPED
	TXO T3,PM%RD+PM%WR+PM%PLD+PM%CNT
	PMAP			;MAP THE PAGES FROM THE ORIGINAL FILE
	 ERJMP DMPERR		;JUST IN CASE
	HRL T1,CPYJFN		;GET JFN OF COPY FILE
	HRR T1,T4		;GET FILE PAGE NUMBER
	MOVE T2,[.FHSLF,,CPYPG]	;THIS FORK, FIRST PAGE OF COPY FILE DATA
	TXZ T3,PM%PLD		;NO PRE-LOADING
	PMAP			;MAP THE COPY FILE
	 ERJMP DMPERR		;JUST IN CASE
	MOVE T1,[DMPADR,,CPYADR] ;SET UP TO COPY DATA
	BLT T1,CPYADR+CPYWDS-1	;COPY DATA
	ERJMP DMPERR		;IN CASE DISK IS FULL.
	ADDI T4,CPYPGS		;COMPUTE ADDRESS OF NEXT FILE PAGE
	JRST CPYD10		;LOOP OVER ALL PAGES TO COPY

; HERE WHEN COPY IS COMPLETE

CPYD20:	CALL UMPPGS		;UNMAP DUMP PAGES
	HRRZ T1,CPYJFN		;GET JFN OF NEW FILE
	HRLI T1,.FBSIZ		;GET OFFSET TO EOF POINTER
	SETOM T2		;CHANGE ALL BITS IN THE WORD
	MOVE T3,CPYSIZ		;GET # OF LAST WORD IN FILE
	CHFDB			;SET THE EOF POINTER
	HRRZ T1,CPYJFN		;GET JFN OF COPY FILE
	CLOSF			;CLOSE NEW FILE
	 JRST DMPERR		;FAILED, REPORT ERROR
	RET			;RETURN
;COPY DUMP CONTINUED....

;ROUTINE TO UNMAP DUMP PAGES ON NORMAL COMPLETION OR ERROR

UMPPGS:	SETOM T1		;UNMAP THE PAGES
	MOVE T2,[.FHSLF,,DMPPG]	;PAGES MAPPED TO ORIGINAL FILE
	MOVE T3,[PM%CNT+CPYPGS]	;NUMBER OF PAGES TO UNMAP
	PMAP			;UNMAP THE PAGES
	MOVE T2,[.FHSLF,,CPYPG]	;PAGES MAPPED TO COPY FILE
	PMAP			;UNMAP THE PAGES
	RET			;AND DONE
; CACHE REFILL ALGORITHM RAM LOADING INSTRUCTIONS
; *** CURRENTLY PERFORMS NO FUNCTION ***

REFILL:	JFCL			;TURN ON USER IOT
	 RET			;FAILED
	BLKO APR,0
	BLKO APR,100004
	BLKO APR,200010
	BLKO APR,300014
	BLKO APR,400020
	BLKO APR,500024
	BLKO APR,600030
	BLKO APR,700034
	BLKO APR,300040
	BLKO APR,100044
	BLKO APR,200050
	BLKO APR,300054
	BLKO APR,200060
	BLKO APR,100064
	BLKO APR,200070
	BLKO APR,300074
	BLKO APR,700100
	BLKO APR,100104
	BLKO APR,200110
	BLKO APR,700114
	BLKO APR,100120
	BLKO APR,100124
	BLKO APR,200130
	BLKO APR,700134
	BLKO APR,600140
	BLKO APR,500144
	BLKO APR,600150
	BLKO APR,700154
	BLKO APR,500160
	BLKO APR,500164
	BLKO APR,600170
	BLKO APR,700174
	BLKO APR,000200
	BLKO APR,300204
	BLKO APR,200210
	BLKO APR,300214
	BLKO APR,000220
	BLKO APR,200224
	BLKO APR,200230
	BLKO APR,300234
	BLKO APR,000240
	BLKO APR,100244
	BLKO APR,200250
	BLKO APR,300254
	BLKO APR,400260
	BLKO APR,500264
	BLKO APR,600270
	BLKO APR,700274
	BLKO APR,000300
	BLKO APR,700304
	BLKO APR,700310
	BLKO APR,700314
	BLKO APR,000320
	BLKO APR,000324
	BLKO APR,000330
	BLKO APR,700334
	BLKO APR,400340
	BLKO APR,600344
	BLKO APR,600350
	BLKO APR,600354
	BLKO APR,400360
	BLKO APR,400364
	BLKO APR,600370
	BLKO APR,400374
	BLKO APR,300400
	BLKO APR,100404
	BLKO APR,300410
	BLKO APR,300414
	BLKO APR,100420
	BLKO APR,100424
	BLKO APR,100430
	BLKO APR,300434
	BLKO APR,000440
	BLKO APR,700444
	BLKO APR,700450
	BLKO APR,700454
	BLKO APR,000460
	BLKO APR,000464
	BLKO APR,000470
	BLKO APR,700474
	BLKO APR,000500
	BLKO APR,100504
	BLKO APR,200510
	BLKO APR,300514
	BLKO APR,400520
	BLKO APR,500524
	BLKO APR,600530
	BLKO APR,700534
	BLKO APR,400540
	BLKO APR,500544
	BLKO APR,500550
	BLKO APR,700554
	BLKO APR,400560
	BLKO APR,500564
	BLKO APR,400570
	BLKO APR,700574
	BLKO APR,000600
	BLKO APR,100604
	BLKO APR,200610
	BLKO APR,200614
	BLKO APR,000620
	BLKO APR,100624
	BLKO APR,200630
	BLKO APR,100634
	BLKO APR,000640
	BLKO APR,500644
	BLKO APR,600650
	BLKO APR,600654
	BLKO APR,000660
	BLKO APR,500664
	BLKO APR,600670
	BLKO APR,000674
	BLKO APR,400700
	BLKO APR,500704
	BLKO APR,600710
	BLKO APR,500714
	BLKO APR,400720
	BLKO APR,500724
	BLKO APR,600730
	BLKO APR,400734
	BLKO APR,000740
	BLKO APR,100744
	BLKO APR,200750
	BLKO APR,300754
	BLKO APR,400760
	BLKO APR,500764
	BLKO APR,600770
	BLKO APR,700774
	RET			;AND DONE
	END <ENVLEN,,ENTVEC>