1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-07 11:17:06 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

594 lines
19 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE WHO - Command routine and mainline for WHO
SEARCH WHOMAC
$SETUP (WHO)
Comment |
This module contains the mainline code and command dispatch for WHO.
A few other general routines are in this module also.
|
DEFINE ZZ(DEF),<
XLIST
IRP DEF,<
DEFINE XX(MOD,ABR,MAP,TXT,ERR),<
GLOB ABR''DEF
EXP ABR''DEF
>;END DEFINE XX
DEF'XXX::MODES
>;END IRP
LIST
>;END DEFINE
ZZ <SCN,NXT,INC,PRF,SET,MAM>
;XXXSCN is routine to apply mode specific SCAN defaults
; called with I=scan spec to fix up
;XXXNXT is routine to get next object in O
; called with O=last thing (-1 to start)
; skip return with next thing in O, non-skip when done
;XXXINC is routine to handle computation of incremental statistics
;XXXPRF is routine to print performance information for the mode
;XXXSET is routine to verify thing in O is valid
; skip return if thing good, non-skip if not
;XXXMAM is the routine to handle /MAP (Map Alternate Mode)
DEFINE XX(MOD,ABR,MAP,TXT,ERR),<EXP [ASCIZ/TXT/]>
TXTXXX::MODES
DEFINE XX(MOD,ABR,MAP,TXT,ERR),<EXP [ASCIZ/ERR/]>
ERRXXX::MODES
DEFINE XX(MOD,ABR,MAP,TXT,ERR),<EXP M%'MAP##>
MODXXX: MODES
; TABLE OF CONTENTS FOR WHO
;
;
; SECTION PAGE
; 1. Initialization............................................ 3
; 2. Command processing
; 2.1 Main command loop................................. 4
; 2.2 Process a single command.......................... 5
; 2.3 Process all specifications........................ 6
; 2.4 Process a single specification.................... 7
; 2.5 Process all 'things'.............................. 8
; 2.6 Handle /INCREMENTAL............................... 9
; 3. Mapping
; 3.1 Handle /MAP switch................................ 10
; 3.2 PRTMAP - Print a mapped line...................... 11
; 3.3 LINE to JOB mode.................................. 12
; 3.4 JOB to LINE mode.................................. 13
; 3.5 NODE to LINE mode................................. 14
; 3.6 USER to ????...................................... 15
; 4. Subroutines
; 4.1 DOSWP - Handle /SWAP.............................. 16
; 4.2 CCSET - Enable ^C trapping........................ 17
; 4.3 CCTRAP - Handle ^C trapping....................... 17
; 4.4 SETME - Setup my profile and privs................ 18
; 5. Storage................................................... 19
SUBTTL Initialization
WHO:: TDZA T1,T1 ;FLAG NORMAL ENTRY
MOVEI T1,1 ;FLAG CCL ENTRY
MOVEM T1,OFFSET ;STORE STARTING OFFSET
RESET ;RESET THE WORLD
MOVEI F,0 ;CLEAR FLAGS
SETOM DIEWRD ;SETUP DIEWRD
MOVE P,[IOWD LN$PDL,PDL] ;SETUP STACK
PUSHJ P,PSIINI ;INITIALIZE THE PSI SYSTEM
PUSHJ P,CCSET ;SETUP ^C BLOCK
PUSHJ P,W$INIT## ;INIT WHOGLX AND GLXLIB
MOVEI T1,'WHO' ;SET ERROR PREFIX
PUSHJ P,.ERXPF## ;TELL ERROR HANDLER
MOVEI T1,.FMSGE## ;SET FATAL ERROR ROUTINE
TXO T1,ER.FAT!ER.STP ;FLAG FATAL
PUSHJ P,.ERXDI## ;TELL ERROR HANDLER
MOVEI T1,ERRCHR## ;GET ERROR TYPER
PUSHJ P,.ERXAD## ;TELL ERROR ROUTINE
PUSHJ P,.TOINI## ;INIT BUFFERED OUTSTR ROUTINE
PUSHJ P,MAPDEF## ;SETUP DEFAULT MAP (MONITOR)
HRRZ T1,MAPMVR## ;GET MONITOR VERSION
CAIE T1,%VER ;CURRENT?
JRST OLDWHO ;NO--RUN PREVIOUS VERSION
PUSHJ P,SYSSET## ;SETUP SYSTEM VARIABLES
PUSHJ P,FETCHK## ;CHECK MONITOR FEATURES
PUSHJ P,SETME ;SET MY PROFILE
IFN FTSERV,<PUSHJ P,CHKSRV##> ;DETACH FRCLIN SERVER AND DON'T RETURN
MOVE T1,[LN$IBLK##,,ISBLK##] ;POINT TO .ISCAN BLOCK
PUSHJ P,.ISCAN## ;INITIALIZE COMMAND SCANNER
PUSHJ P,SETMOD ;SET UP AC 'M'
IFN FTSERV,<PUSHJ P,SRVINI##> ;INIT COMMAND BUFFER
SUBTTL Command processing -- Main command loop
CMDLOP::MOVE T1,TBLKX##(M) ;POINT TO .TSCAN BLOCK
PUSHJ P,.TSCAN## ;SCAN A COMMAND LINE
SETOM DIEWRD ;ALLOW ANOTHER FATAL ERROR
PUSHJ P,CLRSTK## ;CLEAR SWITCHES FOR OSCAN
MOVE T1,OBLKX##(M) ;POINT TO .OSCAN BLOCK
TLNE F,(FL.LOGIN) ;WE LOGGED IN?
PUSHJ P,.OSCAN## ;YES--READ SWITCH.INI
SKIPN HEAD$S## ;ANY SCAN SPECS YET?
PUSHJ P,[PUSHJ P,.CLRFL## ;NO--CLEAR FILE AREA
PUSHJ P,AIN## ;ALLOCATE A SPEC
PJRST .GTSPC##] ;AND FILL IT IN
PUSHJ P,VRSKEW## ;CHECK WHO/MONITOR VERSION SKEW
PUSHJ P,CHKLOG## ;SEE IF OK IF NOT LOGGED IN
PUSHJ P,WHOSCN## ;DO SCAN DEFAULTING
PUSHJ P,OUTDEF## ;DO OUTPUT DEFAULTING
PUSHJ P,SWTDEF## ;DO SWITCH DEFAULTING
PUSHJ P,CHKLST## ;CHECK OUTPUT DEVICE FOR TTY
PUSHJ P,DPINI## ;INIT DPY
PUSHJ P,DOCMD ;DO THE COMMAND
PUSHJ P,CLSLST## ;CLOSE LIST FILE IF NEEDED
PUSHJ P,DPXIT## ;FINISH UP IF /DPY
IFN FTSERV,<PUSHJ P,SRVCMD##> ;RESET COMMAND BUFFER
JRST CMDLOP ;AND LOOP
SUBTTL Command processing -- Process a single command
DOCMD: MOVEI T1,CHRLST## ;POINT TO SCAN'S CHARACTER LISTER
MOVEM T1,.TOUTZ## ;STORE
PUSHJ P,DPLIN## ;START DPY ON NEW LINES
IFE FTSERV,<TRZ F,FR.TYPE!FR.OPEN> ;NOTHING TYPED YET
IFN FTSERV,<
TRZ F,FR.TYPE ;NOTHING TYPED YET
PUSHJ P,SRVUSR## ;FIREUP USER HALF OF SERVER IF NEEDED
JRST DOCMD1 ;WE DID IT SO SKIP REST OF COMMAND LOOP
> ;END IFN FTSERV
PUSHJ P,SYSSET## ;SETUP FOR SYSTEM THINGS
SKIPE T1,S.INITAL## ;GET INITIAL FORMAT
PUSHJ P,PRTFMT## ;TYPE IF SPECIFIED
IFN FTLGNQ,<PUSHJ P,LGQINI##> ;INIT LOGINQ STUFF
PUSHJ P,DOSWP ;HANDLE /SWAP IF SET
PUSHJ P,INETWORK## ;HANDLE /NETWORK:CONNECT IF SET
PUSHJ P,DOINC ;HANDLE /INCREMENTAL
PUSHJ P,ALLSPC ;PROCESS ALL SPECS
SKIPE T1,S.FINAL## ;GET FINAL FORMAT
PUSHJ P,PRTFMT## ;TYPE IF SPECIFIED
PUSHJ P,MAPPRF## ;DO MAPPER PERFORMANCE STUFF
DOCMD1: PUSHJ P,DPCLR## ;CLEAN UP DPY
SKIPG S.REPEAT## ;GET REPEAT TIME
POPJ P, ;NONE
SKIPG S.DPY## ;IF NOT DPY
TRNN F,FR.TYPE ;AND SOMETHING TYPED
CAIA ;NO
PUSHJ P,.TCRLF## ;YES--START NEW LINE
SOSN S.REPEAT##+1 ;COUNT DOWN TIMES
POPJ P, ;DONE WITH REPEATS
TRNE F,FR.MYTTY ;CONTROLLING TERMINAL OPENED?
TRNN F,FR.DPY ;AND IN DPY MODE?
PUSHJ P,CLSLST## ;NO--CLOSE LIST FILE IF NEEDED
MOVE T1,S.REPEAT## ;GET REPEAT COUNT
PUSHJ P,DPSLP## ;GO SLEEP
JRST DOCMD ;AND REPEAT
SUBTTL Command processing -- Process all specifications
ALLSPC: PUSHJ P,S$FIRST## ;POSITION TO FIRST SCAN SPEC
SPCLOP: PUSHJ P,DOSPEC ;PROCESS THIS SPEC IN 'I'
MOVE T1,S.FRST## ;GET FIRST SPEC ADDR
SKIPE T1,.FZFOO##(T1) ;/FOOTING?
PUSHJ P,PRTFMT## ;YES--PRINT FORMAT
PUSHJ P,S$NEXT## ;GET NEXT SPEC ADDRESS
POPJ P, ;ALL DONE
MOVE T1,NMATCH## ;GET NUMBER OF MATCHES
MOVE T2,S.FRST## ;GET FIRST SPEC ADDR
CAILE T1,1 ;JUST ONE
SKIPE .FZFOO##(T2) ;OR /FOOTING
JRST SPCLOP ;YES--JUST LOOP
PUSHJ P,.TCRLF## ;NO--CRLF
JRST SPCLOP ;AND LOOP
SUBTTL Command processing -- Process a single specification
DOSPEC: PUSHJ P,SETSPC## ;SETUP CONCATINATED SPEC
MOVE I,S.FRST## ;POINT TO FIRST SPEC
MOVE T1,[ZERC0##,,ZERC0##+1] ;SET UP BLT
SETZM ZERC0## ;CLEAR FIRST WORD
BLT T1,ZERC1## ;CLEAR SUMMARY COUNTERS
PUSHJ P,I$DEALLOC## ;DEALLOCATE PER SPEC MEMORY
SKIPE T1,.FZHEA##(I) ;GET HEADING FORMAT
PUSHJ P,PRTFMT## ;TYPE IF SPECIFIED
PUSHJ P,CHKSTR## ;HANDLE /MOUNT:XXX
PUSHJ P,CHKNOD## ;HANDLE /NODE:XXX
PUSHJ P,CHKDEV## ;HANDLE /DEVICE:XXX
PUSHJ P,ALLMOD ;PROCESS ALL 'O's
SKIPE NMATCH## ;ANY MATCH?
JRST [PUSHJ P,WHOSUM## ;HANDLE /SUMMARY
SKIPG S.TOTALS## ;YES--/TOTALS?
POPJ P, ;NO--RETURN
MOVEI T1,[ASCIZ/Total of /];GET TEXT
PUSHJ P,.TSTRG## ;TYPE
MOVE T1,NMATCH## ;GET COUNT OF MATCHES
MOVE T2,TXTXXX(M) ;GET TEXT
PUSHJ P,.TPLRS##
PJRST .TCRLF##] ;CRLF AND RETURN
MOVX T1,FX.NOM ;GET /OK[ER]NONE BIT
TDNN T1,.FXMOM(I) ;SWITCH GIVEN?
JRST MODS.1 ;NO
TDNE T1,.FXMOD(I) ;YES--/OKNONE?
POPJ P, ;YES--NO MESSAGE
JRST MODS.E ;NO--/ERNONE
MODS.1: MOVEI T1,[ASCIZ/No one
/] ;SIMPLE MESSAGE
CAIN M,M%JOB## ;JOB MODE?
PJRST .TSTRG## ;YES--JUST TYPE AND RETURN
MODS.E: SKIPE NFOUND## ;ANY STARTED TO MATCH?
$FATAL (ARC,<All >,E.ARC)
$FATAL (NTM,<>,E.NTM) ;NO
E.NTM: MOVE T1,ERRXXX(M)
PJRST .TSTRG##
E.ARC: MOVE T1,TXTXXX(M)
PUSHJ P,.TSTRG##
MOVEI T1,[ASCIZ/s rejected by constraints/]
PJRST .TSTRG##
SUBTTL Command processing -- Process all 'things'
ALLMOD: SETO O, ;INDICATE FIRST THING
SETOM TTLFLG## ;INIT TITLE FLAG
MODLOP: PUSHJ P,@NXTXXX(M) ;GET NEXT THING
POPJ P, ;ALL DONE
PUSHJ P,WHOCHK## ;CHECK USER SWITCHES, ETC
JRST MODLOP ;REJECTED
PUSHJ P,WHOSTA## ;COUNT FOR SUMMARY
PUSHJ P,PRTMOD##
PUSHJ P,DOMAP
JRST MODLOP ;AND LOOP
SUBTTL Command processing -- Handle /INCREMENTAL
DOINC: SKIPG S.INCREMENTAL## ;/INCREMENTAL?
POPJ P, ;NO--JUST RETURN
PUSHJ P,@INCXXX(M) ;YES--HANDLE FOR PRIMARY MODE
PUSHJ P,S$FIRST## ;SETUP FOR FIRST SCAN SPEC
DOINC1: SKIPLE .FZMAP##(I) ;THIS SPEC HAVE /MAP
JRST DOINC2 ;YES--JUMP OUT
PUSHJ P,S$NEXT## ;GET NEXT SPEC
POPJ P, ;ALL DONE
JRST DOINC1 ;AND LOOP FOR NEXT
DOINC2: MOVE T1,MODXXX(M) ;GET ALTERNATE MODE FOR /MAP
PJRST @INCXXX(T1) ;AND HANDLE FOR ALTERNATE MODE
SUBTTL Mapping -- Handle /MAP switch
DOMAP: SKIPG .FZMAP##(I) ;SEE IF /MAP
POPJ P, ;NO
PUSH P,O ;SAVE OLD INDEX
PUSH P,M
PUSH P,S.PRINT##
MOVEI T1,YES
MOVEM T1,S.PRINT##
PUSHJ P,@MAMXXX(M) ;DISPATCH ON MODE
POP P,S.PRINT##
POP P,M
POP P,O
PJRST SETFC## ;RESTORE FORMAT AND RETURN
SUBTTL Mapping -- PRTMAP - Print a mapped line
PRTMAP: PUSHJ P,SETFM## ;SET FORMAT FOR /MAP MODE
CAIE M,M%JOB## ;GOING TO DO JOB MODE?
SKIPA T1,[2] ;NO--TWO SPACES
MOVEI T1,1 ;YES--JUST ONE SPACE
PUSHJ P,.TSPAN##
PJRST PRTMOD## ;PRINT THE INFO AND RETURN
SUBTTL Mapping -- LINE to JOB mode
LINMAM: PUSHJ P,LB$JOB## ;GET JOB
SKIPG O,T1 ;SKIP IF JOB AVAILABLE
POPJ P, ;NONE
MOVEI M,M%JOB## ;SET JOB MODE
PUSHJ P,JOBSET## ;SETUP FOR JOB
POPJ P, ;NOT ASSIGNED?
PJRST PRTMAP ;PRINT THE INFO AND RETURN
SUBTTL Mapping -- JOB to LINE mode
JOBMAM: PUSHJ P,JB$TLN## ;GET TERMINAL LINE NUMBER
SKIPGE O,T1 ;SKIP IF NOT DETACHED AND LOAD J
POPJ P, ;DETACHED--SKIP IT
MOVEI M,M%LINE## ;SET LINE MODE
PUSHJ P,LINSET## ;SETUP FOR LINE
POPJ P, ;NOT CONNECTED?
PJRST PRTMAP ;PRINT THE INFO AND RETURN
SUBTTL Mapping -- NODE to LINE mode
NODMAM: PUSHJ P,.SAVE1## ;SAVE P1
PUSHJ P,NB$NNU## ;GET NODE NUMBER
MOVE P1,T1 ;SAVE IT
MOVEI M,M%LINE## ;SET LINE MODE
SETO O, ;FIRST LINE
NODMA1: PUSHJ P,LINNXT## ;GET NEXT LINE
POPJ P, ;ALL DONE
PUSHJ P,LB$NNU## ;GET NODE NUMBER
CAMN T1,P1 ;MATCH WHAT WE WANT?
PUSHJ P,PRTMAP ;YES--PRINT THE INFO
JRST NODMA1 ;AND LOOP
SUBTTL Mapping -- STRUCTURE to UNIT
STRMAM: PUSHJ P,SB$STN## ;GET STR NAME
PUSHJ P,STRFUI## ;GET THE UNIT INDEX FOR FIRST UNIT
POPJ P, ;???
MOVEI M,M%UNIT## ;SET UNIT MODE
STRMA1: MOVE O,T1 ;COPY UNIT INDEX
PUSHJ P,UNISET## ;SETUP TO PROCESS THIS UNIT
POPJ P, ;SHOULDN'T FAIL
PUSHJ P,PRTMAP ;DISPLAY STUFF FOR THIS UNIT
MOVE T1,O ;GET INDEX BACK AGAIN
PUSHJ P,UNIASI## ;GET ALTERNATE PORT INDEX
JRST STRMA2 ;NO DUAL PORTING
MOVE O,T1 ;COPY UNIT INDEX
PUSHJ P,UNISET## ;SETUP TO PROCESS THIS UNIT
JRST STRMA2 ;ASSUME CAN'T GET SECOND PORT
PUSHJ P,PRTMAP ;DISPLAY STUFF FOR THIS UNIT
STRMA2: MOVE T1,O ;GET INDEX BACK AGAIN
PUSHJ P,UNINSI## ;GET INDEX FOR NEXT UNIT IN STR
POPJ P, ;END OF CHAIN
JRST STRMA1 ;LOOP BACK
SUBTTL Mapping -- UNIT to STRUCTURE
UNIMAM: PUSHJ P,UB$STR## ;GET STR NAME
PUSHJ P,STRNFS## ;CONVERT NAME TO FS NUMBER
POPJ P, ;UNIT NOT PART OF A STRUCTURE
MOVEI M,M%STRU## ;SET STRUCTURE MODE
MOVE O,T1 ;COPY FS NUMBER INDEX
PUSHJ P,STRSET## ;SETUP TO PROCESS THIS STRUCTURE
POPJ P, ;SHOULDN'T FAIL
PJRST PRTMAP ;DISPLAY STUFF FOR THIS STRUCTURE
SUBTTL Subroutines -- DOSWP - Handle /SWAP
DOSWP: PUSHJ P,S$FIRST## ;POSITION TO FIRST SCAN SPEC
;
;Here to apply job number if /SWAP:(FORCE,FIT,IN,OUT)
;
DOSW.1: SKIPG T4,.FZSWP##(I) ;SEE IF /SWAP:
JRST DOSW.2 ;NO
MOVE T1,[EXP %SWFRC,%SWFIT,%SWFIN,%SWFIN]-1(T4)
PUSHJ P,GTAB## ;GET THE JOB NUMBER
CAIN T4,SWAPIN## ;SEE IF /SWAP:IN
CAIL T1,0 ;YES--SEE IF COMING IN
CAIA ;
MOVEI T1,0 ;NO--CLEAR JOB
CAIN T4,SWAPOUT## ;SEE IF /SWAP:OUT
CAIG T1,0 ;YES--SEE IF GOING OUT
CAIA ;
MOVEI T1,0 ;NO--CLEAR JOB
MOVMM T1,.FZJOB##(I) ;NO--STORE NEW ONE
DOSW.2: PUSHJ P,S$NEXT## ;GET NEXT SCAN SPEC
POPJ P, ;ALL DONE
JRST DOSW.1 ;AND LOOP
SUBTTL Subroutines -- PSIINI - PSI initialization
PSIINI: MOVE T1,[VECTOR,,VECTOR+1] ;SET UP BLT
SETZM VECTOR ;CLEAR FIRST WORD
BLT T1,VECTOR+<VECNUM*4>-1 ;CLEAR OUT ALL VECTORS
MOVEI T1,VECTOR ;POINT TO BASE OF THE PSI VECTORS
PIINI. T1, ;INIT THE INTERRUPT SYSTEM
$STOP (CIP,<Can't initialize the PSI system; PIINI. error >,.TOCTW##)
POPJ P, ;RETURN
SUBTTL Subroutines -- CCSET - Enable ^C trapping
CCSET: MOVE T1,[4,,CCTRAP] ;GET TRAP ADDRESS
MOVEM T1,CCBLK+.ERNPC ;STORE
MOVX T1,ER.ICC!ER.EIJ ;TRAP ^C AND FATAL JOB ERROR
MOVEM T1,CCBLK+.ERCLS
SETZM CCBLK+.EROPC ;CLEAR PC
MOVEI T1,CCBLK ;POINT TO ^C BLOCK
MOVEM T1,.JBINT ;TELL MONITOR
POPJ P, ;AND RETURN
SUBTTL Subroutines -- CCTRAP - Handle ^C trapping
CCTRAP: PUSH P,CCBLK+.EROPC ;SAVE PC
SETZM CCBLK+.EROPC ;AND REENABLE
AOSE DIEWRD ;SEE IF NESTED
LOGOUT ;YES--DIE FAST!
PUSH P,T1 ;SAVE T1
HLRZ T1,CCBLK+.ERCCL ;GET REASON
CAIN T1,ER.EIJ ;ERROR IN JOB?
JRST CCERROR ;YES--HANDLE ERRORS
PUSHJ P,DPXIT## ;EXIT DPYPAK IF /DPY
POP P,T1 ;RESTORE T1
TLNN F,(FL.LOGIN) ;WE LOGGED IN?
PUSHJ P,.MONRT## ;NO--LET SCAN LOGOUT
EXIT 1, ;YES--JUST EXIT
POPJ P, ;AND RETURN IF CONTINUE
CCERROR:POP P,T1 ;RESTORE T1
TLNN F,(FL.WHOSRV) ;ARE WE A SERVER?
$STOP (FEJ,<Fatal error in job>)
$STOP (FES,<Fatal error in WHO server>)
SUBTTL Subroutines -- SETME - Setup my profile and privs
SETME:: PJOB T1, ;GET MY JOB
MOVEM T1,MYJOB ;SAVE
PUSHJ P,UGETLIN## ;GET MY TERMINAL LINE
MOVEM T1,MYTTY ;SAVE MY TTY NAME
GTNTN. T1, ;GET MY TERMINAL
MOVEI T1,0 ;FAILED
HLRZS T1 ;GET NODE NUMBER
PUSHJ P,ANODE## ;CONVERT TO NAME
SETO T1, ;FAILED
MOVEM T1,MYNOD ;AND SAVE MY NODE NAME
HRROI T1,.GTPRV ;GET MY PRIVS
PUSHJ P,MTAB## ;GET THEM
TXNE T1,JP.SPA!JP.SPM ;CAN I PEEK?
TLO F,(FL.PEEK) ;YES
TXNE T1,JP.POK ;CAN I POKE?
TLO F,(FL.POKE) ;YES
HRROI T1,.GTPPN ;GET JBTPPN
PUSHJ P,MTAB## ;..
MOVEM T1,MYPPN ;SAVE
CAMN T1,OPRPPN## ;GOD?
TLO F,(FL.GOD) ;YES
HRROI T1,.GTSTS ;GET JBTSTS
PUSHJ P,MTAB## ;..
TXNE T1,JS.JAC ;JACCT?
TLO F,(FL.JACCT) ;YES--FLAG
HRROI T1,.GTLIM ;GET BATCH STATUS
PUSHJ P,MTAB## ;GET IT
TXNE T1,JB.LBT ;SEE IF BATCH
TLOA F,(FL.BATCH) ;YES--FLAG
CAIA ;NO--SKIP
JRST SETM.1 ;YES--AND SKIP CTLJOB CHECK
MOVNI T1,1 ;GET MY JOB
PUSHJ P,UCTLJOB## ;FIND CONTROLLING JOB
MOVEI T1,0 ;NONE
JUMPLE T1,SETM.1 ;JUMP IF NONE
HRLI T1,.GTPPN ;GET PPN
MOVSS T1 ;POSITION
PUSHJ P,MTAB## ;GET FROM MONITOR
CAMN T1,OPRPPN## ;CONTROLLED BY OPR?
TLO F,(FL.GOD) ;YES--FLAG GOD
SETM.1: PUSHJ P,.ISLGI## ;SEE IF LOGGED IN
CAILE T1,0 ;NO
TLO F,(FL.LOGIN) ;YES
HRROI T1,.GTWCH ;GET WATCH BITS
PUSHJ P,MTAB## ;..
TXNE T1,JW.WCX!JW.WWT!JW.WRN!JW.WDR!JW.WDW ;ANY SET TO EFFECT EXIT?
TLO F,(FL.WATCH) ;YES--FLAG
POPJ P, ;AND RETURN
SUBTTL Subroutines -- SETMOD - Set up AC 'M'
; Set up AC 'M' and do defaulting if necessary
; Call: MOVE T1, command table index
; PUSHJ P,SETMOD
;
; On return, M will contain the mode index
;
SETMOD::CAIE T1,M%WHO## ;IF WHO
CAIGE T1,0 ;OR IF NO COMMAND FOUND
MOVEI T1,M%JOB## ;ASSUME JOB
CAIN T1,M%NETWORK## ;IF NETWORK COMMAND
MOVEI T1,M%NODE## ;IS REALLY NODE MODE
MOVEI M,(T1) ;SAVE MODE INDEX
POPJ P, ;RETURN
SUBTTL Subroutines -- OLDWHO - Run previous version of WHO
OLDWHO: MOVE T1,[RUNBLK,,RUNBLK+1] ;SET UP BLT
SETZM RUNBLK ;CLEAR FIRST WORD
BLT T1,RUNBLK+6-1 ;CLEAR ENTIRE BLOCK
MOVE T1,[RUNPTH,,RUNPTH+1] ;SET UP BLT
SETZM RUNPTH ;CLEAR FIRST WORD
BLT T1,RUNPTH+.PTMAX-1 ;CLEAR ENTIRE BLOCK
MOVEI T1,RUNPTH ;POINT TO PATH BLOCK
MOVEM T1,RUNBLK+.RNPPN ;SAVE IN RUN BLOCK
MOVE T2,[-RUNLEN,,RUNTAB] ;POINTER TO ARGUMENTS
PJOB T3, ;MYJOB ISN'T SET UP YET
OLDW.1: HLRZ T1,(T2) ;GET TABLE NUMBER
HRL T1,T3 ;INCLUDE OUR JOB NUMBER
PUSHJ P,GTAB## ;READ A MONITOR WORD
HRRZ T4,(T2) ;POINT TO STORAGE
MOVEM T1,(T4) ;SAVE WORD AWAY
AOBJN T2,OLDW.1 ;LOOP THROUGH TABLE
HLRZ T1,MAPMVR## ;GET SIXBIT MONITOR VERSION
SKIPN T1 ;HAVE SOMETHING HERE?
MOVEI T1,'OLD' ;MAKE IT "WHOOLD"
HRRM T1,RUNBLK+.RNNAM ;MERGE WITH OUR FILE NAME
MOVEI T1,RUNBLK ;POINT TO RUN UUO BLOCK
HRL T1,OFFSET ;INCLUDE CCL OFFSET IF ANY
RUN T1, ;RUN THE PREVIOUS VERION
$STOP (RLF,<Run linkage failure >,E.RUN)
E.RUN: PUSH P,T1 ;SAVE ERROR CODE
PUSHJ P,.TLPRN## ;TYPE OPEN PARANTHESIS
POP P,T1 ;GET ERROR CODE BACK
PUSHJ P,.TOCTW## ;PUT OUT ERROR CODE
PUSHJ P,.TRPRN## ;TYPE CLOSED PARANTHESIS
MOVEI T1,[ASCIZ | for |] ;TYPE
PUSHJ P,.TSTRG## ; SEPARATOR
MOVE T1,RUNBLK+.RNDEV ;DEVICE NAME
PUSHJ P,.TDEVN##
MOVE T1,RUNBLK+.RNNAM ;FILE NAME
PUSHJ P,.TSIXN##
PUSHJ P,.TDOT##
MOVSI T1,'EXE' ;EXTENSION
PUSHJ P,.TSIXN##
MOVE T1,[1,,RUNPTH+.PTPPN] ;PATH
PJRST .TDIRB##
RUNTAB: .GTRDV,,RUNBLK+.RNDEV ;DEVICE
.GTRFN,,RUNBLK+.RNNAM ;FILE NAME
.GTRDI,,RUNPTH+.PTPPN ;PPN
.GTRS0,,RUNPTH+.PTSFD+0 ;SFD #1
.GTRS1,,RUNPTH+.PTSFD+1 ;SFD #2
.GTRS2,,RUNPTH+.PTSFD+2 ;SFD #3
.GTRS3,,RUNPTH+.PTSFD+3 ;SFD #4
.GTRS4,,RUNPTH+.PTSFD+4 ;SFD #5
RUNLEN==.-RUNTAB ;LENGTH OF TABLE
SUBTTL AC save co-routines -- .SAVT1 - Save AC T1
.SAVT1::PUSH P,T1
PUSHJ P,@-1(P)
JRST .+2
AOS -2(P)
POP P,T1
SUB P,[1,,1]
POPJ P,
SUBTTL AC save co-routines -- .SAVT2 - Save AC T1 and T2
.SAVT2::ADD P,[2,,2]
DMOVEM T1,-1(P)
PUSHJ P,@-2(P)
JRST .+2
AOS -3(P)
DMOVE T1,-1(P)
SUB P,[3,,3]
POPJ P,
SUBTTL AC save co-routines -- .SAVT3 - Save ACs T1, T2, and T3
.SAVT3::ADD P,[3,,3]
DMOVEM T1,-2(P)
MOVEM T3,0(P)
PUSHJ P,@-3(P)
JRST .+2
AOS -4(P)
DMOVE T1,-2(P)
MOVE T3,0(P)
SUB P,[4,,4]
POPJ P,
SUBTTL AC save co-routines -- .SAVT4 - Save ACs T1, T2, T3, and T4
.SAVT4::ADD P,[4,,4]
DMOVEM T1,-3(P)
DMOVEM T3,-1(P)
PUSHJ P,@-4(P)
JRST .+2
AOS -5(P)
DMOVE T1,-3(P)
DMOVE T3,-1(P)
SUB P,[5,,5]
POPJ P,
SUBTTL Storage
$LOW
OFFSET::BLOCK 1
MYJOB:: BLOCK 1
MYTTY:: BLOCK 1
MYNOD:: BLOCK 1
MYPPN:: BLOCK 1
PDL:: BLOCK LN$PDL
VECTOR::BLOCK VECNUM*4 ;PSI INTERRUPT VECTORS
CCBLK: BLOCK 4
DIEWRD: BLOCK 1
RUNBLK: BLOCK 6 ;RUN UUO BLOCK
RUNPTH: BLOCK .PTMAX ;PATH BLOCK FOR RUN UUO
END