Trailing-Edge
-
PDP-10 Archives
-
BB-T573C-DD_1986
-
10,7/who.mac
There are 4 other files named who.mac in the archive. Click here to see a list.
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