Google
 

Trailing-Edge - PDP-10 Archives - bb-d868b-bm_tops20_v3a_2020_dist - 3a-sources/setspd.mac
There are 33 other files named setspd.mac in the archive. Click here to see a list.
;<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
;<3A.UTILITIES>SETSPD.MAC.10,  7-Apr-78 00:41:18, 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
;<3A.UTILITIES>SETSPD.MAC.6, 28-Feb-78 15:45:42, EDIT BY MILLER
;FIX NODNAM TO CHECK FOR EOL
;<3A.UTILITIES>SETSPD.MAC.5, 24-Feb-78 09:54:01, EDIT BY MILLER
;<3A.UTILITIES>SETSPD.MAC.4, 24-Feb-78 09:45:50, EDIT BY MILLER
;<3A.UTILITIES>SETSPD.MAC.3, 24-Feb-78 09:45:11, EDIT BY MILLER
;ADD NODE NUMBER TO NODE COMMAND
;<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
;<3-UTILITIES>SETSPD.MAC.16,  8-Nov-77 10:51:06, EDIT BY KIRSCHEN
;MORE COPYRIGHT UPDATING...
;<3-UTILITIES>SETSPD.MAC.15,  3-Nov-77 09:07:50, EDIT BY KIRSCHEN
;RECOVER IF BOUT TO ALIGN LPT FORMS FAILS
;<3-UTILITIES>SETSPD.MAC.14, 26-Oct-77 11:48:16, EDIT BY KIRSCHEN
;UPDATE COPYRIGHT FOR RELEASE 3
;<3-UTILITIES>SETSPD.MAC.13, 12-Oct-77 18:57:55, EDIT BY HURLEY
;ADDED THE COMMANDS TO ENABLE/DISABLE FULL LATENCY OPTIMIZATION
;<3-UTILITIES>SETSPD.MAC.12, 16-Aug-77 16:17:50, EDIT BY HURLEY
;<3-UTILITIES>SETSPD.MAC.11, 16-Aug-77 11:17:22, EDIT BY HURLEY
;ADD THE TERMINAL AUTO COMMAND
;<3-UTILITIES>SETSPD.MAC.10, 11-Aug-77 17:05:15, EDIT BY HURLEY
;MAKE SETSPD LOOKUP X-CONFIG WHERE X IS THE RELEASE NUMBER
;<3-UTILITIES>SETSPD.MAC.9, 11-Aug-77 09:21:45, EDIT BY HURLEY
;MAKE SETSPD LOOK ON SYSTEM: FOR CONFIG.CMD
;<3-UTILITIES>SETSPD.MAC.8,  3-Aug-77 00:05:43, EDIT BY CROSSLAND
;RESTORE HOST COMMAND
;<3-UTILITIES>SETSPD.MAC.7, 27-Jul-77 11:55:15, EDIT BY HURLEY
;<3-UTILITIES>SETSPD.MAC.6, 26-Jun-77 12:41:01, EDIT BY MILLER
;UNMAP DUMP PAGES AFTER ERROR
;<3-UTILITIES>SETSPD.MAC.5, 23-Jun-77 13:20:46, Edit by MACK
;TCO 1822 - DISABLE/ENABLE ACCOUNT VALIDATION
;<3-UTILITIES>SETSPD.MAC.4, 23-Jun-77 12:27:01, EDIT BY MILLER
;TCO 1686 AGGAIN. ADD ERJMP'S
;<3-UTILITIES>SETSPD.MAC.3, 23-Jun-77 11:35:38, EDIT BY KIRSCHEN
;TCO 1716 - ADD ENABLE/DISABLE DIRECTORY-PARAMETER-SETTING COMMANDS
;	ALSO REMOVE STRUCTURE COMMAND, NO LONGER APPLICABLE
;<3-UTILITIES>SETSPD.MAC.2, 25-May-77 13:53:35, EDIT BY KIRSCHEN
;TCO 1807 - ADD NOBELL OPTION TO THE TERMINAL COMMAND (SEE ALSO TCO 1802)
;<3-UTILITIES>SETSPD.MAC.1, 17-Jan-77 11:55:09, Edit by LCAMPBELL
;TCO 1714 - Fix LODANY to type error message if LPINI fails.
;<2-UTILITIES>SETSPD.MAC.14, 27-Dec-76 17:07:56, EDIT BY HURLEY
;<2-UTILITIES>SETSPD.MAC.13, 22-Dec-76 13:42:19, EDIT BY HURLEY
;<2-UTILITIES>SETSPD.MAC.12, 22-Dec-76 10:17:55, EDIT BY KIRSCHEN
;<2-UTILITIES>SETSPD.MAC.11, 20-Dec-76 12:19:25, EDIT BY KIRSCHEN
;TCO 1686 - MAKE SETSPD COPY DUMPS GREATER THAN 256 K
;<2-UTILITIES>SETSPD.MAC.10, 23-Nov-76 10:31:18, Edit by MACK
;<2-UTILITIES>SETSPD.MAC.9, 19-Nov-76 09:33:17, Edit by MACK
;TCO 1666 - MORE TIMEZONE EDITS
;<2-UTILITIES>SETSPD.MAC.8, 18-Nov-76 20:26:22, EDIT BY MILLER
;DISABLE CACHE REFILL CODE
;<2-UTILITIES>SETSPD.MAC.7, 16-Nov-76 11:32:27, Edit by MACK
;TCO 1666 - ADDED FUNCTIONS TO SET TIME ZONE AND ARPANET SITE ADDRESS
;<2-UTILITIES>SETSPD.MAC.4,  4-Nov-76 15:08:10, EDIT BY HURLEY
;TCO 1604- ADD CODE TO RESET TTY NO MSG BITS IN F.E.
;<2-UTILITIES>SETSPD.MAC.3, 25-Oct-76 17:27:57, EDIT BY HURLEY
;TAKE OUT CALL TO QUEBLK DURING NORMAL RUNNING OF SETSPD
;<2-UTILITIES>SETSPD.MAC.2, 21-Oct-76 14:56:33, Edit by MACK
;TCO 1615 - ADD ALTERNATE SETSPD ENTRY, START1:
;<2-UTILITIES>SETSPD.MAC.1,  2-Aug-76 14:12:05, EDIT BY KIRSCHEN
;TCO 1468 - ADD STRUCTURE COMMAND
;<1B-UTILITIES>SETSPD.MAC.8,  9-Jul-76 09:40:18, EDIT BY HURLEY
;INCREASED VERSION NUMBER FOR RELEASE 1B
;<1B-UTILITIES>SETSPD.MAC.7, 23-Jun-76 18:33:29, EDIT BY HURLEY
;<1B-UTILITIES>SETSPD.MAC.6, 16-Jun-76 16:26:47, EDIT BY MILLER
;TCO 1437. ADD SETSPD: TO ALL ERROR MESSAGES
;<1B-UTILITIES>SETSPD.MAC.5, 16-Jun-76 16:20:16, EDIT BY MILLER
;<1B-UTILITIES>SETSPD.MAC.4, 16-Jun-76 16:17:15, EDIT BY MILLER
;TCO 1435. IMPROVE ERROR MESSAGE FROM BAD DEFINE COMMAND
;<1B-UTILITIES>SETSPD.MAC.3, 16-Jun-76 16:04:45, EDIT BY MILLER
;TCO 1433. IMPROVE ERROR MESSAGE FOR RAM OR VFU LOAD ERROR
;<1B-UTILITIES>SETSPD.MAC.2, 23-MAY-76 10:58:55, EDIT BY HALL
;<1B-UTILITIES>SETSPD.MAC.1, 22-MAY-76 11:40:05, EDIT BY MILLER
;<1A-UTILITIES>SETSPD.MAC.69,  6-MAY-76 11:03:02, EDIT BY HURLEY
;<1A-UTILITIES>SETSPD.MAC.68,  6-MAY-76 10:45:25, EDIT BY HURLEY
;<1A-UTILITIES>SETSPD.MAC.65, 12-APR-76 10:46:11, EDIT BY MILLER
;TCO 1167 AGAIN. FIX OFF-LINE INTERRUPT
;<1A-UTILITIES>SETSPD.MAC.64,  8-APR-76 11:51:17, EDIT BY HURLEY
;TCO 1244 - ADD .DIRECT .XTABM FOR MACRO 50 ASSEMBLIES
;<1A-UTILITIES>SETSPD.MAC.63,  1-APR-76 18:37:26, EDIT BY HURLEY
;TCO # 1205 - SET PROTECTION OF <SYSTEM>DUMP.EXE TO 770000
;<1A-UTILITIES>SETSPD.MAC.62, 31-MAR-76 09:43:47, EDIT BY HURLEY
;TCO # 1227 - ADD TOPS-20 ENTRY VECTOR AND VERSION NUMBER
;<V-SOURCES>SETSPD.MAC.61, 27-MAR-76 12:22:23, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.60, 27-MAR-76 12:02:14, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.59, 27-MAR-76 12:01:37, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.58, 27-MAR-76 09:07:22, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.57, 27-MAR-76 09:05:33, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.56, 23-MAR-76 15:05:31, EDIT BY HURLEY
;TCO 1205 - MAKE PROTECTION OF DUMP.EXE BE 770000
;<V-SOURCES>SETSPD.MAC.55, 16-MAR-76 14:51:06, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.54, 15-MAR-76 14:12:49, EDIT BY MILLER
;TCO 1015. FIX UP CHFDB
;<V-SOURCES>SETSPD.MAC.53, 15-MAR-76 09:45:25, EDIT BY KIRSCHEN
;<V-SOURCES>SETSPD.MAC.52, 12-MAR-76 10:21:14, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.51, 12-MAR-76 10:13:48, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.50, 12-MAR-76 09:30:06, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.49, 11-MAR-76 19:29:33, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.48, 11-MAR-76 19:26:43, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.47, 11-MAR-76 19:25:48, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.46, 11-MAR-76 19:20:29, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.45, 11-MAR-76 19:16:49, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.44, 11-MAR-76 19:09:30, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.43, 11-MAR-76 12:37:59, EDIT BY KIRSCHEN
;<V-SOURCES>SETSPD.MAC.42, 11-MAR-76 09:22:07, EDIT BY KIRSCHEN
;<V-SOURCES>SETSPD.MAC.41, 10-MAR-76 21:35:51, EDIT BY KIRSCHEN
;<V-SOURCES>SETSPD.MAC.40,  9-MAR-76 13:24:00, EDIT BY KIRSCHEN
;<V-SOURCES>SETSPD.MAC.39,  9-MAR-76 13:23:16, EDIT BY KIRSCHEN
;TCO 1169 - CREATE DUMP.CPY FILES WITH PROTECTION 770000.
;<V-SOURCES>SETSPD.MAC.38,  9-MAR-76 09:53:58, EDIT BY KIRSCHEN
;TCO 1167 - ADD "PRINTER" COMMANDS TO INITIALIZE PRINTERS
;<V-SOURCES>SETSPD.MAC.37,  9-FEB-76 15:35:59, EDIT BY MILLER
;<V-SOURCES>SETSPD.MAC.37,  9-FEB-76 15:00:02, EDIT BY MILLER
;MCO 1066. LOAD CACHE REFILL ALGORITHM
;<V-SOURCES>SETSPD.MAC.36,  6-FEB-76 14:16:17, EDIT BY MILLER
;MORE EDITS FOR MCO 15
;<V-SOURCES>SETSPD.MAC.35, 21-JAN-76 12:13:58, EDIT BY MILLER
;MCO # 15. SET RETENTION COUNT OF DUMP.CPY AND CHECK DBUGSW
;<V-SOURCES>SETSPD.MAC.34, 12-JAN-76 10:25:44, EDIT BY MILLER

	TITLE SETSPD



;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 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

	SEARCH MONSYM,MACSYM,SERCOD
	.REQUIRE SYS:MACREL,SERCOD
	SALL
	IFNDEF .PSECT,<
	.DIRECT .XTABM>

; VERSION NUMBER DEFINITIONS

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

VSTSPD== <VWHO>B2+<VMAJOR>B11+<VMINOR>B17+VEDIT

;THIS ROUTINE IS RUN BY THE MONITOR AT SYSTEM START UP AND SETS
;VARIOUS PARAMETERS ABOUT THE SYSTEM. PRESENTLY IT WILL SET:
;	1. LINE SPEEDS AND REMOTE CHARACTERSITICS
;
;	2. SYSTEM LOGICAL NAMES
;
;	3. READ THE PREVIOUS DUMP AND QUEUE UP ANY SYSERR BLOCKS
;		THAT DID NOT GET QUEUED UP BEFORE THE CRASH
;
;	4. SET MAGTAPE LOGICAL TO PHYSICAL CORRESPONDENCE
;
;	5. LOAD RAM AND VFU FILES FOR LINEPRINTERS
;
;	6. ENABLE DIRECTORY-PARAMETER-SETTING
;
;	7. SET LOCAL TIME ZONE
;
;	8. SET THIS SITE'S ARPANET ADDRESS
;
;	9. ENABLE ACCOUNT-VALIDATION

;LOCAL STORAGE

MTBLK:	3			;SIZE OF BLOCK
	BLOCK 2			;FOR OTHER ARGS
EOLF:	BLOCK 1
PDL:	BLOCK 20		;THE PDL
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
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:	4
FLAGS:	RD%JFN!RD%PUN		;FLAGS
JFN:	0,,377777		;JFN'S
BUFPTR:	-1,,BUFFER		;BUFFER POINTER
COUNT:	SIZE			;SIZE OF BUFFER
SIZE==100
SIZEB==SIZE*5		;# OF BYTES IN BUFFER

BUFFER:	BLOCK SIZE		;WORK BUFFER

	RELOC 1000-140		;ALL THE REST IS PURE

;PROGRAM ENTRY VECTOR

ENTVEC:	JRST START		;STARTING LOCATION
	JRST START		;REENTER LOCATION
	VSTSPD			;VERSION NUMBER
	JRST START1		;ALTERNATE STARTING LOCATION

ENVLEN==.-ENTVEC		;ENTRY VECTOR LENGTH

;COMMAND TABLES:

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

LEV1TB:	ELEVL1-.-1,,ELEVL1-.-1
	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 /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/DIRECTORY-PARAMETER-SETTING/], ENADIR
	XWD [ASCIZ/FULL-LATENCY-OPTIMIZATION/], ENAFLO

	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

	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
;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

OPDEF CALL [PUSHJ P,]
OPDEF RET [POPJ P,]

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

	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 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)
;THE CODE

START:	RESET			;GET TO A KNOWN STATE
	MOVEI A,.FHSLF		;GET OWN ID
	RPCAP			;READ CAPABILITES
	MOVE C,B		;ENABLE ALL CAPABILITIES
	EPCAP			;DO IT
	MOVE P,[IOWD 20,PDL]	;SET UP PUSH DOWN LIST
	MOVE B,[LEVTAB,,CHNTAB]	;DEFINE INT SYSTEM
	SIR
	MOVSI B,(1B0)		;ENABLE LPT CHANNEL
	AIC
	EIR			;TURN ON INTS

;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
	MOVEI A,LEV1TB		;THE TABLE
	JRST GTKEY		;GO FIND AND DISPATCH ON KEY

;ALTERNATE SETSPD ENTRY

START1:	RESET			;GET TO A KNOWN STATE
	MOVEI A,.FHSLF		;GET OWN ID
	RPCAP			;READ CAPABILITIES
	MOVE C,B		;ENABLE ALL CAPABILITIES
	EPCAP			;DO IT
	MOVE P,[IOWD 20,PDL]	;SET UP PUSH DOWN LIST
	MOVE B,[LEVTAB,,CHNTAB]	;DEFINE INT SYSTEM
	SIR
	MOVSI B,(1B0)		;ENABLE LPT CHANNEL
	AIC
	EIR			;TURN ON INTERRUPTS
	CALL QUEBLK
	HALTF
;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
	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

;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
;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:	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
	HALTF			;AND DONE
;THIS CODE PROCESSES THE MAGTAPE CONFIGURATION COMMANDS. FORMAT
;OF A COMMAND LINE IS:
;	MAGTAPE "LUN" "SERIAL#" "SLAVE"

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 [	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
; 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,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
	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


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
;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 [ TMSG <
? setspd: 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
;COMMAND TO DECLARE DECNET NODE NAME

NODNAM:	SKIPE EOLF		;AT THE END-OF-COMMAND?
NODNA1:	JRST [	TMSG <
?SETSPD: 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 OCTAL NUMBER
	NIN			;""
NODNA3:	 JRST [	TMSG <
?SETSPD: 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
; 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
;ROUTINE TO PULL ANY UNQUEUED SYSERR BLOCKS OUT OF THE CRASH DUMP
;  AND QUEUE THEM UP TO SYSERR

QUEBLK:
;	SAVEP
	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
	ADD T2,T3		;COMPUTE # OF FILE PAGES TO MAP
	MOVEM T2,QUEPGS		;SAVE PAGE NUMBER
	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
	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%PC+3+HSBBUF	;STORE IN BUFFER
	MOVE T1,[-HS%HSZ,,HS%HDZ]	;OFFSET POINTER
	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
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

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>