;<135-TENEX>MONJS.MAC;12    12-DEC-75 11:10:25    EDIT BY PLUMMER
; MAKE EXTERN OF CPUSED BE UNDER IFN PIESLC
; ADD EXTERN ON MSTKOV AFTER SNMJFN
;<135-TENEX>MONJS.MAC;11    10-DEC-75 12:55:58    EDIT BY ROSENBERG
; FIX THE MKPGSA OPRFN TO PERMIT THE PAGE WHOSE PAGE NUMBER IS EQUAL
; TO THE VALUE OF SWPCOR, TO BE MADE AVAILABLE.
;<134-TENEX>MONJS.MAC;9    17-OCT-75 14:40:02    EDIT BY ROSENBERG
; IMPROVE COMMENTS IN GETAB JSYS (AND ADD COMMENTED OUT CODE)
;<134-TENEX>MONJS.MAC;8    17-OCT-75 11:32:18    EDIT BY CLEMENTS
; Remove check of SUBSYS/SYSTEM/HACKS from SETNM. If insist type,
;  it gets set, else it doesn't, regardless of directory.
;<134-TENEX>MONJS.MAC;7    17-SEP-75 13:35:48    EDIT BY PLUMMER
; LH(3) TO HSYS CONTAINS USER NUMBER
;<134-TENEX>MONJS.MAC;6    15-AUG-75 18:48:04    EDIT BY CLEMENTS
; Fix typo in .hsys mod
;<134-TENEX>MONJS.MAC;5    11-AUG-75 17:52:26    EDIT BY CLEMENTS
; HSYS writes 3 words into <system>hsys.times file
;<134-TENEX>MONJS.MAC;4    15-JUL-75 15:55:32    EDIT BY CLEMENTS
; ADD IMPDRQ AND HSTINI TO OPRFN JSYS
; ADD "INSIST" FLAG TO SETNM JSYS. IF LH(1) IS 1, THEN ARG IS IN 2
;  AND IT GOES INTO TABLE IF POSSIBLE. ELSE, IT'S .OTHER .
;<134-TENEX>MONJS.MAC;3    28-APR-75 12:10:57    EDIT BY CLEMENTS
;<134-TENEX>MONJS.MAC;2    24-APR-75 12:39:57    EDIT BY CLEMENTS
;<134-TENEX>MONJS.MAC;2    24-APR-75 12:27:48    EDIT BY CLEMENTS
;<134-TENEX>MONJS.MAC;1    23-APR-75 14:51:32    EDIT BY CLEMENTS
;SPLITTING SWPMON INTO FINITE SIZE PIECES. THIS IS MONJS.MAC

	SEARCH PROLOG
	TITLE MONJS

	SWAPCD

;THIS MODULE CONTAINS JSYS CODE FROM SWPMON FOR MISC
; JSYSES, INFO-OBTAINING JSYSES... ALSO ROUTINES CALLED AT JSYS LEVEL.

INTERNAL	.HSYS,GETPAT,.GJINF,.TIME,.JOBTM,.RUNTM
INTERNAL	.GTRPI,.GTDAL,.SYSGT,.GETAB,.SETNM,.GETNM
INTERNAL	.SWTCH,.LITES,.USRIO,.PEEK,CAPX,WHEELX
INTERNAL	.GET,.SAVE,.SSAVE,.OPRFN

EXTERNAL	BHC,BLOCK1,BUGCHK,BUGHLT,CAPENB,CAPMSK
EXTERNAL	CLFRET,CLRLFK,CVTAD,DBUGSW,DCHKSW
EXTERNAL	DDTFSH,DDTRCL,DRMCFE,DRMFRE,DSKRCE
EXTERNAL	FKDIR,FKHPTN,FORKX,FPTA,HSYST2,HSYST3
EXTERNAL	ITRAP1,JB0FLG,JFNOFN,JOBNAM,JOBONT,JOBPT,JOBRT
EXTERNAL	JOBRTT,LOGDES,MAPDIR,MKPGSA,MKPGSU,MONDSC,MRPACS
EXTERNAL	NDRMEW,NDSKEW,NLGDES,NMNDSC,NNAMES,R,RSKP
EXTERNAL	SBLKTM,SBSNMS,SETJFK,SETLF1,SETLFK,SETMPG
EXTERNAL	SETPT,SKMRTN,SNAMES,SPC1,SPFLTS,SPTC,STIMES
EXTERNAL	SVN,SVNN,SVNUM,SWAKES,SWPCOR,TODCLK,TTFORK
IFN PIESLC,<
EXTERNAL	GRPLOK,NJBGRP,SSHARE,TOTSHR
>
IFDEF IMPCHN,<
EXTERNAL	HSTSTS,IMPHRT,IMPLBT,IMPLT1,IMPLT2,IMPLT3,IMPLT4
EXTERNAL	IMPNLK,IMPRDY,NLHOST
>

EXTERNAL	MENTR,MRETN

;HALT SYSTEM - REQUIRES MAINT (OR WHEEL ETC.) CAPABILITY
; ACCEPTS A GTAD-STYLE DATE AND TIME IN 1, AT WHICH TIME TENEX
;WILL BE SHUT DOWN. JOB 0 NOTIFIES USERS AND DOES THE SHUTDOWN.
; AND ACCEPTS A GTAD TIME IN 2 WHEN SYSTEM IS EXPECTED UP AGAIN
; ACCEPTS 4-BIT CODE FOR REASON FOR DOWNAGE IN 3.
; REQUIRES WHEEL, MAINT, OR OPER CAPABILITY.

.HSYS:	JSYS MENTR		;SET UP AC BLOCK
	MOVE 2,CAPENB		;SEE IF USER ALLOWED TO HALT TENEX.
	HLL 2,0(P)		;OR IF PC SAYS CALLED FROM MONITOR
	TLNE 2,UMODF		;CALL FROM MON SPACE?
	TRNE 2,WHEEL+OPER+MAINT	; OR PRIVILEGED?
	SKIPA			; YES. OK TO DO IT.
	JRST CAPXR		;NO. RETURN CAPX ERROR
	JUMPG 1,HSYS1		;JUMP UNLESS ABORTING THE SHUTDOWN
	SETZM HSYST1		;ABORTING. KILL FLAGS.
	SETZM HSYST2		; ..
	SETZM HSYST3		; ..
	JRST SKMRTN		;SKIP RETURN TO USER

HSYS1:	PUSH P,1		;HOLD THE DESIRED SHUTDOWN.
	CALL CVTAD		; LINEARIZE
	PUSH P,1
	GTAD			;GET CURRENT TIME AND DATE
	CALL CVTAD		; LINEARIZE
	SUB 1,0(P)		;DIFFERENCE IN TIMES
	SKIPGE 1		; NOW MUST BE BEFORE SHUTDOWN
	SKIPGE 1,[^D<7*24*60*60>]
	RETERR TIMEX1		;YES. GIVE BAD TIME FAILURE
	POP P,HSYST2		; LINEAR TAD OF SHUTDOWN
	POP P,HSYST1		; GTAD OF SHUTDOWN
	UMOVE 1,2		; TIME BACK UP, GTAD FORMAT
	CAMG 1,HSYST1		; LATER THAN SHUTDOWN? (IGNORING SIGN)
	MOVEI 1,0		; NO. ASSUME JUNK - UNKNOWN RETURN
	MOVEM 1,HSYST4		; STORE FOR GETAB, IMPHLT.
	SETZM HSYST3		; NO MSG TYPED YET
	UMOVE 2,3		; GET REASON FOR DOWN TIME
	MOVEM 2,HSYST5		;STORE WHO,,WHY
	AOS JB0FLG		;WAKE JOB 0 TO SEE THIS
HSYS2:	SKIPN JOBNO		;CALLED FROM BACKGROUND?
	JRST HSYS2A		;YES. DON'T NEED TO WRITE FILE.
	PUSH P,CAPENB		;GIVE US WHEEL PRIVILEGES SO CAN
	NOINT			; WRITE ON SYSTEM
	MOVEI A,WHEEL		; ..
	IORM A,CAPENB		; ..
	MOVSI A,400001		;CREATE FILE TO HOLD SHUTDOWN TIME
	HRROI B,[ASCIZ /<SYSTEM>HSYS.TIMES;1/]
	GTJFN			; ..
	  JRST HSYS2F		;FAILED?
	MOVE C,A		;COPY JFN IN CASE FAILS
	MOVE 2,[440000,,100000]	;WRITE AT BEGINNING
	OPENF
	  JRST [MOVE A,C	;GET JFN BACK. FAILED.
		RLJFN
		 JFCL
		JRST HSYS2F]
	MOVE B,HSYST1		;NOW PUT OUT TIME GOING DOWN
	BOUT
	MOVE B,HSYST4		;AND TIME BACK UP
	BOUT			; ..
	MOVE B,HSYST5		;AND REASON
	BOUT
	CLOSF			;CLOSE THE FILE
HSYS2F:	  BUG(CHK,<HSYS - TROUBLE WITH <SYSTEM>HSYS.TIMES FILE>)
	POP P,CAPENB		;RESTORE CORRECT CAPABILITIES
	OKINT
HSYS2A:	JRST SKMRTN		;AND GIVE SUCCESS RETURN TO USER.

EXTERN HSYST1,HSYST4		;GTAD FORMAT, IN SYSTAT GETAB TABLE

;POINTS (IN MINUTES BEFORE SHUTDOWN) AT WHICH TO DO NOTIFICATION

CTIMS::	^D<BYTE (9) 60,30,15,10>
	^D<BYTE (9) 5,1,0>

;GET 10/50 COMPATIBILITY FILE ON FIRST USE OF UUO IN A GIVEN FORK

GETPAT:	JSYS MENTR		;GETS HERE FROM UUO HANDLER
	PUSH P,ENTVEC		;SAVE CURRENT ENTRY VECTOR
	MOVSI 1,(1B2+1B17)
	HRROI 2,[ASCIZ /<SUBSYS>PA1050.SAV/]
	GTJFN
	ITERR ILINS3		;NO FILE
	HRLI 1,400000		;LOAD IT INTO THIS FORK
	GET
	MOVE 1,ENTVEC		;COMPATIBILITY ENTRY VECTOR
	MOVEM 1,PATADR		;PUT IT IN RESERVED PLACE
	POP P,ENTVEC		;RESTORE REGULAR VECTOR
	UMOVE 2,3(1)		;VIRTUAL 40 FOR PAT
	HRRM 2,PATU40
	UMOVE 2,4(1)		;PC WORD FOR PAT
	HRRM 2,PATUPC
	AOJ 1,			;INITIAL ENTRY IS 1, REGULAR 0
	HRLI 1,UMODF
	EXCH 1,0(P)		;SET NEW PAC, GET OLD ONE
	XCTUU PATUPC
	MOVE 1,40
	XCTUU PATU40
	JRST MRETN		;GO TO COMPATIBILITY

IFN PIESLC,<

;ROUTINE TO ASSIGN DSHARE VALUES. WINDFALL GOES TO LEAST COST-EFFECTIVE GROUP
ASGDSH:: ADD P,BHC+12		;MAKE ROOM FOR 0-12 ON STACK
	JUMPGE P,MSTKOV##			;ERROR IF NO ROOM
	MOVEM 12,0(P)			;SAVE LAST AC
	HRRZI 12,-11(P)			;MAKE UP POINTER FOR BLT
	BLT 12,-1(P)

	NOINT
	LOCK GRPLOK

	MOVSI 6,(1.0)			;INITIALIZE 6 TO ACCUMULATE WINDFALL
	SETZ 12,			;12 USED TO MAINTAIN ACTUAL INDEX
					;TO PIE-SLICE-GROUP.DATA ENTRIES

	HRRZI 7,^D<24*60*60>		;NUMBER OF SECONDS IN A DAY

	MOVSI 5,-NGRPS			;LOOP OVER ALL GROUPS
	SETZ 10,		;INITIALIZE COST-EFFECTIVENESS

ASGDS1:	SKIPN NJBGRP(5)			;ANYBODY USING THIS GROUP?
	 JRST ASGDS2			;NO, GO ON TO NEXT ONE

	MOVE 2,SSHARE(12)		;YES, GET NUMBER OF SHARES
	FDVR 2,TOTSHR			;COMPUTE FRACTION
	MOVEM 2,DSHARE(5)		;AND STASH IN DSHARE

	FSBR 6,2			;MAINTAIN WINDFALL

	SKIPN 3,CPUSED##(12)		;GET CPU TIME FOR THIS GROUP
	 JRST [HRLOI 10,377777		;FAKE SMALL COST EFFECTIVENESS
		JRST ASGDS4]
	ASH 3,-^D8			;MAKE SURE WE DON'T LOSE SIGNIFICANT
					;BITS WHEN WE FSC
	FSC 3,233			;CONVERT TO FLOATING
	GTAD				;GET DATE AND TIME
;	CAMN 1,[-1]			;SHOULD REALLY DO THIS
;	JRST ASGDS3
	JUMPL 1,ASGDS3			;RETURN IF NO DATE
;FALL THRU

;FALLS THRU
	SUB 1,BEGDAT##(12)		;LESS START DATE OF THIS GROUP
	CAIL 7,0(1)			;OVERFLOW IN RH?
	SUB 1,[-1,,^D<24*60*60>]	;YES, ADJUST
	LSH 1,-^D9			;MAKE SURE IT FITS IN 27 BITS
	FSC 1,233			;FLOAT IT
	FMPR 2,1			;COMPUTE 1/COST EFFECTIVENESS
	FDVR 2,3			;WHICH IS =(DSHARE*(NOW-BEGDATE))/CPUSED
	CAML 2,10			;LARGEST YET?
	SKIPA 10,2			;YES, REMEMBER IT
	CAIA
ASGDS4:	MOVEI 11,0(5)			;AND REMEMBER GROUP

ASGDS2:	ADDI 12,NWDGRP			;MAINTAIN ACTUAL INDEX
	AOBJN 5,ASGDS1			;ON TO NEXT GROUP

	FMPR 6,KFACT			;MULTIPLICATIVE FACTOR FOR WINDFALL
	FADRM 6,DSHARE(11)		;GIVE WINDFALL TO NEEDIEST GROUP

ASGDS3:	UNLOCK GRPLOK
	OKINT
	HRLZI 12,-11(P)
	BLT 12,12
	SUB P,BHC+12
	RET

;PIE-SLICE GROUP FILE PARAMETER GETAB TABLE (DO NOT SEPARATE ENTRIES)

GRPDES:	NGRPPG
	NWDGRP
	NGRPS
NGRPD=.-GRPDES

>;END PIE-SLICE SCHEDULER CONDITIONAL

;INFO JSYS'S

.GJINF:	MOVE 3,JOBNO
	HRRZ 1,JOBDIR(3)
	HLRZ 2,JOBDIR(3)
	MOVE 4,CTRLTT
	XCT MJRSTF

.TIME:	MOVE 1,TODCLK		;TIME SINCE SYSTEM STARTED
RTIM:	MOVEI 2,^D1000		;DIVISOR FOR SECONDS
	XCT MJRSTF

.JOBTM:
	MOVE 1,JOBNO
	MOVE 1,JOBRT(1)
	ADD 1,JOBRTT
	XCT MJRSTF

.RUNTM:	JSYS MENTR
	XCTUU [HRRZ 1,1]	;FORK HANDLE
	CAIN 1,-5		;WHOLE JOB?
	JRST RUNTM1		;YES
	CALL SETJFK
	CALL SETLF1
	MOVE 1,FKRT(1)		;FORK RUN TIME FROM PSB
	ADD 1,JOBRTT
	JRST RUNTM2

RUNTM1:	NOINT
	MOVE 1,JOBNO
	MOVE 1,JOBRT(1)
RUNTM2:	MOVE 3,TODCLK		;CURRENT TIME
	SUB 3,CONSTO		;LESS TIME ON, FOR CONSOLE TIME USED
	MOVEI 2,^D1000		;MILLISECONDS
RETA3:	UMOVEM 1,1		;RETURN VALUES IN 1,2,3
	UMOVEM 2,2
	UMOVEM 3,3
	JRST CLFRET

.GTRPI:	JSYS MENTR
	CALL SETLFK
	MOVE 1,UTRPCT
	MOVE 2,USWPCT
	MOVE 3,PTTIM
	JRST RETA3

;GET DIRECTORY ALLOCATION
; TAKES A DIRECTORY NUMBER IN 1. 0 MEANS CURRENT CONNECTED DIR
; RETURNS ALLOCATION IN 1, USED IN 2. IF NO SUCH DIRECTORY,
; RETURNS 0 IN 1 AND 2
;
.GTDAL:	JSYS MENTR
	JUMPLE 1,GTDAL1
	PUSHJ P,HSHLUK##	; DIR SUPPLIED. SEE IF IT EXISTS
	  JRST GTDAL3		; NOPE.
	PUSHJ P,USTDIR##	; YES. UNLOCK IT.
	JRST GTDAL2		; AND USE THAT DIRECTORY NUMBER

GTDAL1:	MOVE 1,FORKX
	SKIPGE 1,FKDIR(1)
	MOVE 1,FKDIR(1)		;1=CONN DIR,,USER DIR
	HLRZS 1
GTDAL2:	SETO 2,
	CALL MAPDIR
	HLRZ 1,DIRDSK		; GET MAXIMUM ALLOCATION
	UMOVEM 1,1
	HRRZ 1,DIRDSK		;CURRENT IN-USE COUNT
				;(DOESN'T INCLUDE PAGES CREATED FOR
				; FILES WHICH ARE STILL OPEN)
	UMOVEM 1,2
	JRST MRETN

GTDAL3:	PUSHJ P,USTDIR##	; UNLOCK DIRECTORY
	MOVEI 1,0		; RETURN 0 AS ANSWER FOR USED AND ALLOC
	UMOVEM 1,2
	UMOVEM 1,1
	JRST MRETN


;GET NUMBER OF TABLE AND FIRST WORD GIVEN SIXBIT SYMBOL

.SYSGT:	JSYS MENTR
	MOVSI 4,-GTBSIZ
	CAMN 1,SYMTAB(4)
	JRST SYSGT1
	AOBJN 4,.-2
	XCTUU [SETZM 2]		;NOT FOUND RETURN 0
	JRST MRETN

SYSGT1:	HLRZ 2,GTTAB(4)		;SIZE
	MOVN 2,2		;NEGATE IT
	HRLI 4,0(2)		;COMBINE WITH TABLE NUMBER
	UMOVEM 4,2		;GIVE TO USER
	HRRZ 1,GTTAB(4)		;ADDRESS OF FIRST WORD

;TEMPORARILY PROVIDE AN EXTRA LEVEL OF ADDRESSING FOR SYSSTAT
;TABLE WHICH WILL GO AWAY SOON.
	MOVEI 4,0(4)		;CLEAR LEFT HALF
	CAIN 4,SYSSTN		;IS THIS THE SYSSTAT TABLE?
	MOVE 1,0(1)		;YES

	MOVE 1,0(1)
	UMOVEM 1,1		;GIVE FIRST WORD TO USER
	JRST MRETN

.GETAB:	JSYS MENTR
	MOVSI 2,(1B1)
	TDNN 2,CAPMSK		;GETAB CAPABILITY EXISTS?
	RETERR GTABX3		;NO
	HLRE 2,1		;INDEX OR -1
	MOVEI 3,0(1)		;TABLE NUMBER
	CAIL 3,GTBSIZ		;LEGAL NUMBER?
	RETERR GTABX1		;NO
	HLRZ 1,GTTAB(3)		;GET SIZE OF TABLE
	JUMPL 2,RETN1		;IS INDEX LESS THAN ZERO?
	CAIL 2,0(1)		;NO. INDEX WITHIN BOUNDS?
GETAB1:	RETERR GTABX2		;NO
	ADD 2,GTTAB(3)		;COMPUTE ADDRESS OF DESIRED WORD

;ADD LEVEL OF ADDRESSING FOR SYSSTAT AS PER COMMENT IN SYSGT
	CAIN 3,SYSSTN		;SYSSTAT?
	MOVE 2,0(2)

	MOVE 1,0(2)		;GET WORD
RET1:	UMOVEM 1,1		;RETURN IT TO USER
URSKP:	AOS 0(P)		;SKIP RETURN
	JRST MRETN

RETN1:
;;;;;;;;AOJL 2,GETAB1		;"UNCOMMENT" TO ENFORCE RESTRICTION
				;AGAINST INDEX VALUES LESS THAN -1
	XCTUU [MOVNM 1,1]	;RETURN NEG OF LENGTH
	JRST URSKP		;SKIP RETURN

;TABLE OF TABLES

	EXTERN NDEV,DEVNAM,DEVCHR,DEVUNT,JOBDIR
	EXTERN TOTRC,MAXQ,QSUM,NTASKT,SOLD,NLOADT,RJTSUM,NEVENT,DRMRD

GTTAB:	XWD NJOBS,JOBPT		;CONTROL TTY,,TOP FORK
	XWD NJOBS,JOBRT		;JOB RUN TIME
	XWD 1,[^D1000]		;DIVISOR FOR SECONDS
	XWD NJOBS,JOBDIR	;DIRECTORY BEING USED
	XWD NLINES,TTFORK
	XWD 1,TOTRC
	XWD NDEV,DEVNAM
	XWD NDEV,DEVCHR
	XWD NDEV,DEVUNT
	XWD NDSKEW,DSKRCE
	XWD NDRMEW,DRMCFE
	XWD SVNN,SVN
	XWD 1,SVNUM
	XWD 3,UTRPCT
SYSSTN==.-GTTAB
	XWD NSTAT,SYSST
	XWD MAXQ+1,QSUM
	XWD NJOBS,JOBNAM
	XWD NNAMES,SNAMES
	XWD NNAMES,STIMES
	XWD NNAMES,SPFLTS
	XWD NNAMES,SWAKES
	XWD NNAMES,SBLKTM
	XWD 2,DBUGSW		;DBUGSW AND DCHKSW
	XWD NLGDES,LOGDES
	XWD GTBSIZ,SYMTAB	;THE 6BIT SYMBOLS
	XWD GTBSIZ,GTTAB	;AND THE POINTERS
	XWD 1,ENTFLG		;ENTRY ALLOWED IF NON-ZERO
	XWD 1,DRMFRE		;TEMP TILL MOUNTABLE PACKS/NEW SWAPPER
	XWD NTASKT,SOLD
	XWD NLOADT,RJTSUM
	XWD NEVENT,DRMRD
	XWD 2,LGNPAR##		;LOGIN FAILURE CODE IF SYSTEM FULL
				; AND LAST LOGIN DATE.
	XWD NDSKPR##,DSKPAR##	; DSK PARAMETERS
	XWD 1,FDFMTF##		; DIRECTORY FORMAT FLAG
	XWD NJOBS,JOBONT	;JOB OWNERSHIP TABLE
	XWD NJOBS,JOBNM2	;REAL JOB NAME EVEN IF ".OTHER"
;MORE

;MORE OF ABOVE
IFDEF IMPCHN,<		;NETWORK RELATED TABLES
	EXTERN NHOSTS,HOSTN,LSKT,FSKT,NETAWD,NETBAL,NETSTS,NETBUF
	EXTERN NHSTN,HSTNAM,NETBTC,IMPGTN
	XWD IMPGTN,IMPRDY
	XWD IMPLBT,IMPHRT
	XWD 200,HSTSTS
GTBNHN::XWD NHSTN,HSTNAM
GTBHST::XWD NHOSTS,HOSTN
	XWD NSKT,LSKT
	XWD NSKT,FSKT
	XWD NSKT,NETAWD
	XWD NSKT,NETBAL
	XWD NSKT,NETSTS
	XWD NSKT,NETBUF
	XWD NSKT,NETBTC
	XWD IMPNLK,IMPLT1
	XWD IMPNLK,IMPLT2
	XWD IMPNLK,IMPLT3
	XWD IMPNLK,IMPLT4
	XWD 2,NLHOST		;HOST NUMBER, NVT COUNTER
>

IFN PIESLC,<
	XWD NGRPS,NAPROC##
	XWD NGRPS,DSHARE##
	XWD NJOBS,PIEGRP##
	XWD NGRPS,NJBGRP
	XWD NGRPD,GRPDES
> ; END PIE-SLICE SCHEDULER CONDITIONAL

	XWD NMNDSC,MONDSC

GTBSIZ==.-GTTAB
	BLOCK 10

;SYMBOL TABLE PARALLEL TO ABOVE

SYMTAB:	SIXBIT /JOBTTY/
	SIXBIT /JOBRT/
	SIXBIT /TICKPS/
	SIXBIT /JOBDIR/
	SIXBIT /TTYJOB/
	SIXBIT /NCPGS/
	SIXBIT /DEVNAM/
	SIXBIT /DEVCHR/
	SIXBIT /DEVUNT/
	SIXBIT /DSKERR/
	SIXBIT /DRMERR/
	SIXBIT /SYSVER/
	SIXBIT /VERNUM/
	SIXBIT /PGSTAT/
	SIXBIT /SYSTAT/
	SIXBIT /QTIMES/
	SIXBIT /JOBNAM/
	SIXBIT /SNAMES/
	SIXBIT /STIMES/
	SIXBIT /SPFLTS/
	SIXBIT /SWAKES/
	SIXBIT /SBLKTM/
	SIXBIT /DBUGSW/
	SIXBIT /LOGDES/
	SIXBIT /SYMTAB/
	SIXBIT /GETTAB/
	SIXBIT /ENTFLG/
	SIXBIT /DRMFRE/
	SIXBIT /TASKTB/
	SIXBIT /LOADTB/
	SIXBIT /EVENTS/
	SIXBIT /LGNPAR/
	SIXBIT /DSKPAR/
	SIXBIT /FDFMTF/
	SIXBIT /JOBONT/
	SIXBIT /JOBNM2/
;MORE

;MORE OF ABOVE
IFDEF IMPCHN,<
	SIXBIT /NETRDY/
	SIXBIT /IMPHRT/
	SIXBIT /HSTSTS/
	SIXBIT /HSTNAM/
	SIXBIT /HOSTN/
	SIXBIT /NETLSK/
	SIXBIT /NETFSK/
	SIXBIT /NETAWD/
	SIXBIT /NETBAL/
	SIXBIT /NETSTS/
	SIXBIT /NETBUF/
	SIXBIT /NETBTC/
	SIXBIT /IMPLT1/
	SIXBIT /IMPLT2/
	SIXBIT /IMPLT3/
	SIXBIT /IMPLT4/
	SIXBIT /LHOSTN/
>

IFN PIESLC,<
	SIXBIT /NAPROC/
	SIXBIT /DSHARE/
	SIXBIT /PIEGRP/
	SIXBIT /NJBGRP/
	SIXBIT /GRPDES/

> ; END PIE-SLICE SCHEDULER CONDITIONAL

	SIXBIT /MONDSC/

IFN GTBSIZ-<.-SYMTAB>,<	PRINTX  GETAB SYMBOL TABLE INCORRECT
>
	BLOCK 10


;TEMPORARY SYSTAT TABLE CONTAINING ADDRESSES OF DATA WHICH
;USED TO BE FOUND IN PREVIOUS SYSTAT TABLE
SYSST:	IDLE##
	SWAPWT##
	GCCR##
	PTRAP##
	DRMRD
	DRMWR##
	DSKRD##
	DSKWR##
	WAKEUP##
	TTINTS##
	BSTSUM##
	RJTSUM##
	RJAV##
	RJAV+1
	RJAV+2
	[0]
	[0]
	NTTYIN##
	NTTYOT##
	GCCR+1
	PPG##
	NREMJ##
	[0]
	HSYST1##
	HSYST4##
	HSYST5##
NSTAT==.-SYSST


;SUBSYSTEM STATISTICS LOGIC

GS SNMPT,1			;NEG COUNT OF ENTRIES IN SNAMES
GS SNMLCK,1			;LOCK FOR SNAMES TABLE

.SETNM:	JSYS MENTR
	PUSH P,ZERO##		;ASSUME NOT THE "INSIST" CASE
	TLNE A,-2		;WHICH CASE IS IT?
	JRST SNM2		;ORDINARY SIXBIT
	TLZN A,(1B17)		;INSIST FLAG ON?
	JRST SNMJFN		;NO, JFN BUT NOT INSIST.
	UMOVE A,2		;INSIST. AC2 HAS SIXBIT OR JFN
	SETOM 0(P)		;SET THE "INSIST" FLAG ON STACK
	TLNN A,-2		;SIXBIT OR JFN?
	JRST SNMJFN		;JFN IN AC A
SNM2:	NOINT			;SIXBIT IN A, INSIST FLAG AT 0(P)
	AOSE SNMLCK		;LOCK TABLE
	JSYS BLOCK1		;OR WAIT TILL LOCKABLE
	HRLZ 3,SNMPT		;NEG COUNT OF ENTRIES
	CAMN 1,SNAMES(3)	;DESIRED NAME?
	JRST SNM1		;YES
	AOBJN 3,.-2		;NO, LOOKED AT ALL?
	MOVEI 3,0(3)
	MOVE 2,1		;COPY SUPPLIED NAME. WILL IT FIT?
	SKIPE 0(P)		;INSIST FLAG OFF, OR FULL TABLE?
	CAIL 3,NNAMES-1		; ..
	SKIPA 2,[SIXBIT /.OTHER/] ;YES, USE CATCH-ALL NAME
	SOSA SNMPT		;UPDATE POINTER
	MOVEI 3,NNAMES-1	;PUT .OTHER AT THE END
	MOVEM 2,SNAMES(3)	;ADD NAME TO TABLE
SNM1:	MOVE 2,JOBNO
	MOVEM 1,JOBNM2##(2)	;SAVE REAL NAME EVEN IF .OTHER
	HRRM 3,JOBNAM(2)	;PUT INDEX IN JOB TABLE
	SETOM SNMLCK		;UNLOCK TABLE
	OKINT
	POP P,(P)		;DISCARD THE "INSIST" FLAG
	JRST MRETN

SNMJFN:	HRRZ D,A		;SAVE THE JFN IN D
	GTSTS			;IS IT GOOD?
	TLNN B,(1B10)		; ..
	JRST SNMPRV		;NO, JUNK. SET TO PRIV.
	HRROI A,1(P)		;SPACE FOR DIRECTORY NAME
	ADD P,BHC+10		; ..
	JUMPGE P,MSTKOV##
SNMJF1:	HRROI 1,-7(P)		;NOW GET THE NAME FIELD
	HRRZ B,D		;GET THE JFN AGAIN
	MOVSI C,001000		;NAME FIELD
	JFNS
	MOVEI A,-10(P)		;WORD BEFORE NAME
	HRLOI B,003777		;TRUNCATE TO 6 CHARS
	ANDCAM B,2(A)		; ..
	PUSHJ P,ASCSIX##
	  JRST SNMPR1		;FAILED?
	SUB P,BHC+10		;RESTORE STACK
	JRST SNM2		;STORE SIXBIT NOW IN A
SNMPR1:	SUB P,BHC+10		;RESTORE STACK
SNMPRV:	MOVE A,SBSNMS+1		;GET SIXBIT FOR (PRIV)
	JRST SNM2		;AND GO SET IT.

.GETNM:	MOVE 1,JOBNO
	MOVE 1,JOBNM2(1)
	XCT MJRSTF

.SWTCH:
	DATAI APR,1
	XCT MJRSTF

.LITES:	JSYS MENTR
	MOVE 2,CAPENB
	TRNN 2,WHEEL+OPER+MAINT	;REQUIRES STATUS
	JRST WHEELX
	DATAO PI,1		;DISPLAY
	JRST MRETN

.USRIO:	JSYS MENTR
	MOVEI 1,WHEEL+OPER+MAINT
	TDNN 1,CAPENB		;REQUIRES STATUS
CAPXR:	RETERR CAPX1
	MOVSI 1,(1B6)		;USER IO BIT
	IORM 1,0(P)		;PUT IT ON
	JRST SKMRTN

;PEEK - AC1:  N,,MONLOC
;       AC2:     USRLOC

.PEEK:	JSYS MENTR
	MOVEI 3,WHEEL+OPER+MAINT
	TDNN 3,CAPMSK		;HAS NECESSARY CAPS?
CAPX:	ITERR CAPX1		;NO.
	MOVSI 5,0(1)		;SETUP BLT ARGS - FROM
	HRRI 5,0(2)		; .. TO
	MOVEI 6,0(2)
	HLRZ 3,1		;COUNT
	ADDI 6,-1(3)		; .. TO LIMIT
	ADDI 3,-1(1)		;FROM LIMIT
	XORI 3,0(1)		;SEE IF BLOCK CROSSES PAGE BOUNDARY
	TRNE 3,777000
	RETERR PEEKX1		;CAN'T CROSS PAGE BOUNDARY
	MOVEI 1,0(1)
	MRPAC			;GET ACCESS OF PAGE
	TLNN 2,READB		;READ ALLOWED?
	RETERR PEEKX2		;NO
	XCTMU [BLT 5,0(6)]	;TRANSFER WORD(S)
	AOS 0(P)
	JRST MRETN

;ERROR - WHEEL OR OPER REQUIRED BUT NOT ENABLED

WHEELX:	ITERR WHELX1

;GET AND SAVE ROUTINES

;AC USAGE IN GET ROUTINE:
; 4 - PAGE NUMBER IN USER SPACE CURRENTLY MAPPED TO FTPG1
; 5 - POINTER TO ADDRESS IN FTPG1 CORRESPONDING TO AC 6
; 6 - AOBJN (NOT IOWD) POINTER TO USER SPACE WHERE CURRENTLY READING
;14 - SETPT ARGUMENT FOR FTPG1
;15 - FORK HANDLE BEING GET'ED INTO
;16 - JFN BEING READ FROM

.GET:	JSYS MENTR
	CALL GTSVI		;CHECK PARAMETERS, ETC.
	HRRI 2,1B19		;READ BIT
	TLNN 3,777		;DISK?
	HRRI 2,5B21+1B25	;YES, REQUEST RD,XCT ACCESS AND THAWED
	PUSH P,2		;SAVE THE DESIRED OPENING BITS
	GTSTS			;SEE IF THE FILE IS OPEN ALREADY
	TLNN 2,(1B0)		; ..
	JRST GET2A		;NO. GO OPEN IT.
	TLNE 3,777		;IT'S OPEN. IS IT A DISK?
	JRST GET2B		;NO. ASSUME HE OPENED IT RIGHT
	TLC 2,(1B0+1B1+1B3)	;SEE IF RD & XCT BOTH ON
	TLNE 2,(1B0+1B1+1B3)	; ..
	JRST GETE2		;NO.
GET2B:	RFBSZ			;AND CORRECT BYTE SIZE?
	CAIE 2,44		; ..
	JRST GETE2		;NO
	POP P,2			;OK. CLEAR STACK
	JRST GET2C		;AND GO READ THE OPEN FILE.

GET2A:	POP P,2			;RETRIEVE OPENING MODE BITS
	OPENF			;OPEN FILE FOR INPUT
	JRST ITRAP1		;WON'T OPEN
GET2C:	MOVEI 1,FTPG1A
	CALL FPTA		;GET HANDLE OF TEMP PAGE FOR LATER
	MOVE 14,1
;FALL THRU

;FALLS THRU
GET2:	TSTINT			;INTERRUPT PENDING?
	CALL GETINT		;YES, GO ALLOW IT
	MOVEI 1,0(16)		;JFN
	BIN			;GET IOWD COUNT,ADR
	JUMPE 2,[GTSTS		;ZERO. PROBABLY EOF.
		TLNE 2,(1B8)	;IS IT?
		JRST GETE1	;YES. TRUNCATED FILE.
		MOVEI 2,0	;NO, A ZERO ENTRY VECTOR.
		JRST .+1]	;HANDLE IT
	MOVE 6,2
	HLRZ 2,2
	CAIL 2,1000		;LEFT HALF IMPLYING SSAVE?
	CAIL 2,10000
	JRST .+2		; NO
	JRST SGET		; YES.
	JUMPGE 6,GET1		;POSITIVE MEANS END
	ADDI 6,1		; CHANGE IOWD TO AOBJN POINTER
GET5:	CALL GET3		;SET MAP FOR THIS PAGE, SET AC 5
	MOVEI 2,0(6)		;ADDRESS IN USER SPACE
	ORCMI 2,777		;MINUS NUMBER OF WORDS IN THAT PAGE
	HLRE 3,6		;LENGTH OF THE IOWD
	CAMLE 2,3		;WILL IT FIT IN THE WINDOW PAGE?
	MOVE 3,2		;NO. JUST READ WHAT WILL FIT
	MOVM 2,3		;POSITIVE FOR UPDATING POINTERS
	HRL 2,2			;IN BOTH HALVES. THIS IS +N,,+N
	ADD 6,2			;UPDATE THE AOBJN WORD. MAY OR MAY NOT GO +
	MOVE 2,5		;ADDRESS IN WINDOW PAGE
	HRLI 2,444400		;BYTE POINTER TO IT.
	SUB 5,3			;3 IS ALREADY -N FOR SIN. COUNT WINDOW ADDR.
	SIN			;NOW READ INTO THE WINDOW
	JUMPL 6,GET5		;JUMP IF POINTER CROSSED PAGE BOUNDARY
	JRST GET2		;DONE THIS POINTER. READ NEXT ONE.

GET1:	MOVEI 1,0(15)		;FORK HANDLE
	CALL SETLFK		;MAP PSB
	MOVEM 6,ENTVEC(1)	;STORE ENTRY VECTOR DATA
	MOVEI 1,0(16)		;JFN
	JRST SAVER

SGET:	CAIE 2,1000		;CORRECT TYPE NUMBER?
	JRST GETE1		;NO, STRANGE FILE
	MOVEI 13,0(6)		;SAVE COUNT
	MOVE 1,16
	DVCHR
	TLNE 2,777		;DISK FILE?
SSAVE1:	ITERR SSAVX1		;NO, CAN'T DO IT
SGET1:	MOVE 1,SPTC		;SPT USE COUNT
	CAML 1,SPC1		;RUNNING LOW?
	ITERR GETX2		;YES, BOMB OUT
	MOVE 1,16
	BIN
	MOVEI 1,0(2)		;FILE PAGE NUMBER
	LDB 3,[POINT 9,2,8]	;ACCESS
	LDB 2,[POINT 9,2,17]	;MEMORY PAGE
	ROT 3,-^D9
	TLZE 3,(1B0)		;WRITE COPY REQUEST?
	TLO 3,COPYB		;YES, SET APPROPRIATE BITS
	HRLI 1,0(16)
	HRLI 2,0(15)
	PMAP			;MAP FILE PAGE INTO FORK
	SOJG 13,SGET1
	JRST GET2

GETINT:	SETZ 1,
	MOVEI 2,FTPG1A		;UNMAP STUFF
	CALL SETMPG
	CALL CLRLFK		;THIS DOES OKINT, INTERRUPT HAPPENS HERE
	MOVEI 1,0(15)
	CALL SETLFK		;REESTABLISH STATE
	SETO 4,
	RET

GTSVI:	MOVEI 16,0(1)		;JFN
	HLRZ 15,1		;FORK HANDLE
	MOVEI 1,0(16)		;JFN
	DVCHR			;GET DEVICE CHARACTERISTICS
				;DO THIS FIRST IN CASE OF ITRAP
	HLRZ 3,2		;SEE WHAT KIND OF DEVICE. PREVENT
	ANDI 3,777		; TTY'S, CAUSE FORK HANDLES ARE OFTEN
	CAIN 3,12		; MISPLACED INTO JFN AND LOOK LIKE TTY.
	ITERR (DESX4)		; THEN JOB HANGS NOINT ON TTY BIN
	PUSH P,2
	MOVEI 1,0(15)
	CALL SETLFK		;MAKE SURE FORK IS LEGAL
	MOVEI 1,0(16)		;JFN
	POP P,3			;DEVICE BITS
	MOVSI 2,^D36B23		;BYTE SIZE FOR BIN/BOUT XFER
	SETO 4,
	RET

;CHECK AND REMAP PAGE - 4/ CURRENT PAGE (-1 FIRST TIME)
; SET FTPG1 TO POINT INDIRECT TO USER PAGE ADDRESSED BY AC6

GET3:	TSTINT
	CALL GETINT
	LDB 2,[POINT 9,6,26]	;PAGE NUMBER NEXT REFERENCE
	CAIN 2,0(4)		;SAME AS CURRENT
	JRST GET3A		;YES
	MOVEI 4,0(2)		;REMEMBER IS CURRENT
	HRLI 2,0(15)		;FORK HANDLE
	MOVE 1,2
	CALL FKHPTN		;CONVERT TO INTERNAL FORM
	MOVE 2,14
	MOVSI 3,RWX
	CALL SETPT		;SETUP INDIRECT POINTER TO PAGE
GET3A:	MOVEI 5,0(6)		;SETUP ADDRESS FOR MON REFERENCES
	ANDI 5,777
	ADDI 5,FTPG1A
	MOVEI 1,0(16)		;RESTORE JFN TO 1
	RET

GETE2:	MOVEI 1,GETX3##		;FILE NOT PROPERLY OPENED
	JRST GETE0		;RETURN THIS ERROR CODE
GETE1:	MOVEI 1,GETX1##		;RETURN ERROR CODE
GETE0:	PUSH P,1		;SAVE THE ERROR CODE
	MOVEI 1,0(16)
	CLOSF
	JFCL
	SETZ 1,
	MOVEI 2,FTPG1A
	CALL SETMPG
	CALL CLRLFK
	POP P,1
	JRST ITRAP1		;RETURN ERROR CODE WITH ITRAP

;SAVE, GIVEN LIST OF BLOCK DESCRIPTORS OR ONE BLOCK DESCRIPTOR
;
; AC USAGE IN THIS ROUTINE --
; 16/ JFN BEING SAVED ONTO
; 15/ FORK HANDLE BEING SAVED FROM
; 10/ USER'S AC2 -- A SINGLE +N,,ADDR OR A
;     POINTER TO A LIST OF THEM, COUNTED AS THEY ARE PROCESSED.
;  7/ CURRENT +N,,ADDR FROM USER TABLE. MADE -N,,ADDR AT SAVEB
;  6/ -N,,ADDR FOR A GROUP OF NON-ZERO WORDS, OR WORDS UP TO PAGE END
;  5/ POINTER TO WINDOW PAGE (FTPG1), OFFSET VERSION OF RH OF 6

.SAVE:	JSYS MENTR
	MOVE 10,2		;SAVE DESCRIPTOR
	CALL GTSVI
	HRRI 2,1B20		;WRITE FILE
	OPENF
	JRST ITRAP1
	MOVEI 2,31
	MOVEI 3,2
	MTOPR			; SET BLOCK SPACING TO 2 IF DTA
	TLNE 10,-1		;SOMETHING IN LH?
	JRST SAVE3		;YES, IT'S ONE DESCRIPTOR
SAVE2:	UMOVE 7,0(10)		;GET NEXT DESCRIPTOR
	JUMPE 7,SAVE1		;CHECK FOR END OF LIST OF DESCRIPTORS
	CALL SAVEB		;WRITE BLOCK
	AOJA 10,SAVE2

SAVE3:	MOVE 7,10
	CALL SAVEB
SAVE1:	MOVEI 1,0(15)		;FORK HANDLE
	CALL SETLFK
	MOVE 2,ENTVEC(1)	;GET ENTRY VECTOR POINTER
	MOVEI 1,0(16)		;JFN
	BOUT			;WRITE ENTRY VECTOR POINTER
SAVER:	CLOSF
	JFCL
	SETZ 1,
	MOVEI 2,FTPG1A		;CLEAR TEMP MAPPINGS
	CALL SETMPG
	JRST CLFRET

;SAVE, PROCESS ONE BLOCK
; ARGUMENT IS +N,,ADDR IN 7 . SEE AC USAGE COMMENT ABOVE

SAVEB:	HLRZ 6,7		;MAKE LH COUNT NEGATIVE
	TRZE 6,400000		;LARGER THAN 377777?
	PUSH P,[SAVEBL]		;YES, DO IN TWO PARTS
	MOVNI 6,0(6)
	HRLI 7,0(6)
SAVEB1:	TSTINT
	CALL GETINT
	JUMPGE 7,R		;DONE?
	MOVE 6,7		;SETUP TO SCAN FOR NON-0'S
	LDB 1,[POINT 9,6,26]	;GET PAGE NUMBER
	CAIN 1,0(4)		;DIFFERENT FOR CURRENT MAPPING?
	JRST SAVE3A		;NO, SAME
	MOVEI 4,0(1)
	HRLI 1,0(15)		;FORK HANDLE
	CALL FKHPTN
	PUSH P,1
	CALL MRPACS		;SEE IF PAGE EXISTS
	POP P,2
	TLNN 1,READB		;CAN IT BE READ?
	JRST SAVE3B		;NO, FORGET IT
	MOVE 1,2
	MOVE 2,[XWD RWX,FTPG1A]
	CALL SETMPG		;MAP PAGE
SAVE3A:	CALL GET3A		;SETUP REFERENCE ADDRESS
	JRST SAVE8

SAVE3B:	ANDI 6,777000
	ADDI 6,1000		;TO NEXT PAGE
	SUBI 6,0(7)
	HRLI 6,0(6)		;COUNT OF WORDS SKIPPED IN BOTH HALVES
	ADD 7,6			;UPDATE COUNT AND ADDRESS
	JRST SAVEB1

SAVEBL:	HRLI 7,400000		;DID N-400000 BEFORE, DO LAST 400000 NOW
	JRST SAVEB1

SAVE12:	TRNN 6,777		;NEW PAGE?
	JRST SAVE5		;YES
SAVE8:	SKIPN 0(5)		;NON-0 WORD?
	JRST SAVE6		;NO, GO CHECK FOR MORE
SAVE7:	ADDI 5,1
	AOBJN 6,SAVE12
	MOVE 6,7		;END OF BLOCK. 6/ -N,,ADDR

;WRITE ALL OR PART OF ONE PAGE. ARGS ARE -N,,ADDR IN 6 AND
; OFFSET ADDR IN 5. ALSO -N',,ADDR IN 7.
;VALUES ARE UPDATED 5 AND 7


SAVED:	HLRE 2,6		;COUNT OF WORDS JUST SCANNED
	ADD 5,2			;RESET WINDOW POINTER
	MOVEI 1,0(16)		;JFN
	MOVE 2,6
	SUBI 2,1		;OUTPUT IOWD CNT,ADR
	BOUT
	MOVEI 2,(5)		;FORM BYTE POINTER TO WINDOW
	HRLI 2,444400		; FOR 36 BIT SOUT
	HLRO 3,6		;NEGATIVE COUNT
	SOUT			;OUTPUT THIS BLOCK OF DATA
	HLRO 6,6		;NOW UPDATE THE POINTERS. - NUM WDS SENT
	MOVM 6,6		;POSITIVE NUMBER OF WORDS SENT
	ADDI 5,(6)		;UPDATE POINTER TO WINDOW
	HRLI 6,(6)		;PLUS N IN BOTH HALVES
	ADD 7,6			;UPDATE MAJOR AOBJN CTR. MAY BE SOME LEFT
	RET

;FOUND 0 WORD, CHECK FOR MORE

SAVE6:	MOVEI 2,0(6)
	CAIN 2,0(7)		;FIRST WORD OF BLOCK OR PAGE?
	JRST SAVE9		;YES
	HLRZ 2,6
	SETCMI 3,0(6)
	CAIE 2,-1		;END OF BLOCK, OR
	TRNN 3,777		;END OF PAGE?
	JRST SAVE5		;YES, FINISH BLOCK
	SKIPE 1(5)		;SUCCESSIVE 0?
	JRST SAVE7		;NO, CONTINUE SCAN
SAVE5:	MOVNI 6,0(6)		;COMPUTE NUMBER OF WORD TO DUMP
	ADDI 6,0(7)		;(-CURRENT)+OLD = -DIFFERENCE
	MOVSI 6,0(6)
	HRRI 6,0(7)		;FIRST ADDRESS
	CALL SAVED		;WRITE BLOCK
	JRST SAVEB1

;SCAN OVER BLOCK OF 0'S

SAVE10:	TRNE 6,777		;END OF PAGE?
	SKIPE 0(5)		;OR NON-0 WORD?
	JRST SAVE11		;YES
SAVE9:	ADDI 5,1
	AOBJN 6,SAVE10
SAVE11:	MOVE 7,6		;UPDATE POINTER
	JRST SAVEB1		;RECHECK PAGE, ETC.

;SHARED SAVE

.SSAVE:	JSYS MENTR
	MOVE 10,2		;OUTPUT DESCRIPTOR
	CALL GTSVI
	TLNE 3,777		;DISK?
	JRST SSAVE1		;GOTTA BE
	HRRI 2,1B20		;WRITE
	OPENF
	JRST ITRAP1
	MOVSI 13,2		;START MAPPING INTO FILE PAGE 2
	JUMPL 10,SSAV3		;SINGLE DESCRIPTOR
SSAV2:	UMOVE 7,0(10)		;GET NEXT DESCRIPTOR
	JUMPE 7,SSAV1		;DONE
	CALL SSAVB		;OUTPUT THE STUFF
	AOJA 10,SSAV2

SSAV3:	MOVE 7,10
	CALL SSAVB
SSAV1:	MOVEI 1,0(15)		;FORK HANDLE
	CALL SETLFK
	MOVE 2,ENTVEC(1)	;PUT ENTRY VECTOR IN FILE
	MOVEI 1,0(16)		;JFN
	BOUT
	HLRZ 2,13		;NEXT FREE PAGE IN FILE
	ASH 2,^D9		;FIRST WORD OF THAT PAGE
	SFPTR			;SET EOF AFTER ALL EXISTING PAGES
	BUG(CHK,<SSAVE - UNEXPECTED BAD RETURN FROM SFPTR>)
	JRST SAVER		;REGULAR FINISH UP

;SAVE PAGES ACCORDING TO AC7, XWD -NPAGES,,ACCESS,FIRST PAGE

SSAVB:	PUSH P,10
	TLC 7,777000		;MAKE SURE COUNT .L. 1000 PAGES
	TLCE 7,777000		;I.E. BITS 0-8 SHOULD BE 0
	ITERR SSAVX2		;LOSE
	HLLZ 13,13		;CLEAR COUNT FOR PAGES IN THIS BLOCK
	SETZ 1,
	MOVEI 2,FTPG1A
	CALL SETMPG		;CLEAR TEMP PAGE
SSAVB2:	MOVSI 1,0(15)
	HRRI 1,0(7)
	ANDCMI 1,777000		;FLUSH ACCESS BITS FROM HERE
	RPACS			;GET STATE OF THIS MEM PAGE
	JUMPE 2,SSAVB1		;DOESN'T EXIST
	TLNN 2,(1B2)		;READABLE?
	JRST SSAVB1		;NO, SKIP IT
	TRNE 7,1B19		;ACCESS FROM SOURCE PAGE REQUESTED?
	JRST [	TSC 7,2		;YES
		TRZ 7,1B18+RWX+TRAPUB ;MOVE THESE BITS INTO ACCESS WD
		TSC 7,2		;FROM RPACS OF SOURCE PAGE
		TLNE 2,WRITEB+COPYB ;SOURCE HAS SOME KIND OF WRITE?
		TRO 7,1B18	;YES, GIVE WRITE-COPY
		JRST .+1]
	CALL FKHPTN
	MOVE 2,[XWD RWX,FPG2A]
	CALL SETMPG		;SETUPT INDIRECT PTR TO USER PAGE
	MOVSI 1,0(16)		;JFN
	HLR 1,13		;FILE PAGE NUMBER
	PUSH P,13
	CALL JFNOFN
	BUG(HLT,<SSAVE - JFNOFN FAILED>)
	POP P,13
	MOVE 2,[XWD RWX,FPG3A]
	CALL SETMPG		;MAP THE FILE PAGE
	HRLI 2,FPG2A
	BLT 2,FPG3A+777		;COPY USER'S PAGE TO FILE
	HLRZ 2,13		;PAGE IN FILE TO USE
	HRLI 2,0(7)		;MEM PAGE IN LH, FILE PAGE IN RH
	TLZ 2,(1B1+7B7)		;FLUSH UNSPECIFIED BITS
	MOVEM 2,FTPG1A(13)	;SAVE FOR LATER OUTPUT
	AOBJP 13,.+1		;INCREMENT FILE PAGE NUMBER AND COUNT
SSAVB1:	AOBJN 7,SSAVB2		;COUNT MEM PAGES
	MOVEI 2,0(13)		;NUMBER OF FILE PAGES DONE
	JUMPE 2,SSAVB3
	HRLI 2,1000		;TYPE NUMBER
	MOVEI 1,0(16)
	BOUT
	MOVNI 7,0(13)		;GET NEG COUNT FOR THIS BLOCK
	MOVSI 7,0(7)		;SETUP AOBJN WORD
	MOVE 2,FTPG1A(7)	;GET WORD FOR ONE PAGE
	BOUT
	AOBJN 7,.-2
SSAVB3:	SETZ 1,			;CLEAR TEMP PAGE
	MOVEI 2,FTPG1A
	CALL SETMPG
	MOVEI 2,FPG2A
	CALL SETMPG
	MOVEI 2,FPG3A
	CALL SETMPG
	POP P,10
	RET

;OPERATOR FUNCTION CALL JSYS "OPRFN". THIS JSYS EXISTS TO BE
;USED BY THE EXEC OR EPHEMERONS TO DO OPERATOR TASKS, SO THE OP
;DOES NOT NEED TO GET INTO MDDT MOST OF THE TIME.
;
;THE FUNCTIONS ARE CALLED BY SIXBIT NAME, WHICH REQUIRES A TABLE
;SEARCH BUT IS OK BECAUSE THESE FUNCTIONS SHOULD ONLY BE CALLED
;ONCE A DAY OR SO. 
;
;FIELD SITES NOTE -- BBN WILL NEVER ADD ANY SIXBIT NAMES STARTING WITH
;THE LETTER "X". FIELD SITES CAN USE THAT CLASS OF NAMES WITHOUT 
;NEEDING TO WORRY ABOUT CONFLICT WITH FUTURE BBN FUNCTIONS.

;CALL - MOVE 1,[SIXBIT .FUNCTION-NAME.]
;	MOVE 2,ARGUMENT DEPENDENT ON FUNCTION. (MORE IN 3 &4...)
;	OPRFN
;	  FAIL RETURN, ERROR CODE IN 1
;	GOOD RETURN

INTERN .OPRFN

.OPRFN:	JSYS MENTR		;ESTABLISH MONITOR CONTEXT
	MOVSI F,-NOPRFS		;COUNT THRU NAME TABLE
	CAMN A,OPRFTB(F)	;SEARCH. THIS ONE?
	JRST OPRFN1		;YES.
	AOBJN F,.-2		;NO, SEARCH ONWARDS.
	MOVEI A,OPRFX1##	;NOT IN TABLE.
	JRST MRETNE##		;FAIL, NONSKIP, CODE TO LSTERR AND 1

OPRFN1:	HLRZ E,OPRFT2(F)	;SEE WHAT CAPABILITIES ARE NEEDED
	TDNN E,CAPENB		;ARE THEY ON IN THIS FORK?
	JRST CAPX		;NO. FAIL.
	HRRZ E,OPRFT2(F)	;YES. GO DO THE FUNCTION
	PUSHJ P,0(E)		; ..
	  JRST MRETNE		;FAILED. ERROR CODE IN 1
	JRST SKMRTN		;SUCCESS RETURN.

;HERE ARE THE FUNCTIONS DEFINED SO FAR. ARGS TO THE "X" MACRO
; ARE SIXBIT NAME, CAPABILITIES NEEDED, TAG TO CALL.

DEFINE OPRFNS <
IFN PIESLC,<
	X(KFACT,WHEEL+OPER,OPRKFC)>
IFDEF IMPCHN,<
	X(IMPDRQ,WHEEL+OPER+MAINT,OPRICY)
	X(HSTINI,WHEEL+OPER,OPRHIN)
	X(NETON,WHEEL+OPER+MAINT,OPRNTN)>
IFN JTRPSW,<
	X(JTRPON,WHEEL+OPER,OPRJTN)>
	X(ENTFLG,WHEEL+OPER+MAINT,OPRENT)
	X(MKPGSA,WHEEL+OPER+MAINT,OPRMPA)
	X(MKPGSU,WHEEL+OPER+MAINT,OPRMPU)
	X(DDTRCL,WHEEL+OPER,OPRRCD)
	X(DDTFSH,WHEEL+OPER,OPRFSD)
	X(DBUGSW,WHEEL+OPER,OPRBSW)
	X(DCHKSW,WHEEL+OPER,OPRCSW)
	X(USRSPC,WHEEL+OPER,OPRUSP)
	X(SYSSPC,WHEEL+OPER,OPRSSP)
	X(ACTINI,WHEEL+OPER,OPRACT)
;ADD MORE HERE
>

DEFINE X(NAME,CAPS,ROUTIN)<	<SIXBIT \NAME\>>
OPRFTB:	OPRFNS
NOPRFS==.-OPRFTB

DEFINE X(NAME,CAPS,ROUTIN)<	XWD CAPS,ROUTIN>
OPRFT2:	OPRFNS

IFN PIESLC,<

OPRKFC:	FMPRI B,(1.0)		;MAKE SURE IT'S A NORMALIZED FP NUMBER
	CAIL B,0		;AND IN RANGE 0 THRU 1
	CAMLE B,[1.0]
	JRST OPRFXX		;NO GOOD.
	MOVEM B,KFACT##		;OK, SET IT.
	JRST RSKP		;GOOD RETURN.
>
IFDEF IMPCHN,<
OPRNTN:	SKIPE C,B		;SET NETON TO 0 OR -1
	AOJN C,OPRFXX		;JUMP IF NOT LEGAL VALUE
	MOVEM B,NETON##		;OK, SET IT.
	JRST RSKP
>

OPRENT:	SKIPE C,B		;SET ENTFLG TO 0 OR -1
	AOJN C,OPRFXX		;JUMP IF NOT 0 OR -1
	MOVEM B,ENTFLG##	;OK, SET IT.
	JRST RSKP
IFN JTRPSW,<
OPRJTN:	SKIPE C,B		;SET JTRPON TO 0 OR -1
	AOJN C,OPRFXX		;JUMP IF NOT LEGAL VALUE
	MOVEM B,JTRPON##	;OK, SET IT.
	JRST RSKP
>
OPRRCD:	PUSHJ P,DDTRCL		;RECLAIM DDT
	JRST RSKP

OPRFSD:	PUSHJ P,DDTFSH		;FLUSH DDT
	JRST RSKP

OPRBSW:	CAIL B,0		;SET DEBUGSWITCH TO 0 THRU 2
	CAILE B,2		; ..
	JRST OPRFXX		;BAD VALUE
	MOVEM B,DBUGSW		;OK. SET IT
	JRST RSKP

OPRCSW:	CAIE B,0		;0 OR 1 TO DCHKSW
	CAIN B,1
	JRST OPRCS1		;OK
OPRFXX:	MOVEI A,OPRFX2##		;BAD ARG ERROR CODE
	POPJ P,0		;NON-SKIP RETURN
OPRCS1:	MOVEM B,DCHKSW		;STORE GOOD DCHKSW
	JRST RSKP

OPRMPA:	MOVE A,B		;MOVE ARGUMENTS OVER TO 1 AND 2
	MOVE B,C
	CAMLE A,B		;PAGES IN RIGHT ORDER?
	JRST OPRFXX
	CAML A,SWPCOR		;AND IN REASONABLE AREA?
	CAIL B,MAXCOR		; ..
	JRST OPRFXX		;NO
	PUSHJ P,MKPGSA		;PUT PAGES ON LINE
	JRST RSKP

OPRMPU:	MOVE A,B		;TAKE PAGES OFF LINE
	MOVE B,C
	CAMLE A,B
	JRST OPRFXX
	CAML A,SWPCOR
	CAIL B,MAXCOR
	JRST OPRFXX
	PUSHJ P,MKPGSU
	JRST RSKP

OPRUSP:	JUMPL B,OPRFXX		;LEGAL FOR .GE. 0
	MOVEM B,USRSPC##	;SET USER DISK LIMIT
	JRST RSKP

OPRSSP:	JUMPL B,OPRFXX		;LEGAL FOR .GE. 0
	MOVEM B,SYSSPC##	;SET SYSTEM DISK LIMIT
	JRST RSKP

OPRACT:	CALL ACTIN1##		; PUT NEW UACHK.FILE OUT
	 RET				; FAILED
	JRST RSKP			; OK

IFDEF IMPCHN,<
OPRHIN:	CALL HSTINI##		;LOAD NEW HOST NAME FILE
	  POPJ P,0		;FAILED
	JRST RSKP		;OK.

OPRICY:	MOVEI B,1		;SET IMPDRQ TO CYCLE THE NET
	MOVEM B,IMPDRQ##	; ..
	JRST RSKP		;RETURN.
>

	END ; OF MONJS.MAC

