1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-15 04:16:21 +00:00
Files
PDP-10.its/src/dmcg/monit.200
Adam Sampson e2fe757d6a MONIT 200.
This version is dated 1972-12-21 in a comment, and works on current ITS
without modification.
2018-07-26 20:01:07 +01:00

1144 lines
28 KiB
Plaintext
Raw 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 MONIT 200 for paging ai sys, 12/21/72 mb
SHARE==0 ; 0 for 1 segment monit, 1 for 2 segment shareable monit
; ACCUMULATOR DEFS
FF==0 ; FLAG AC
A=1
B=2
C=3
D=4
COMPTR=5 ; COMMAND BYTE POINTER
USRF=6 ; FILE NAME FOR USR DEVICE
USRN1=USRF+1
USRN2=USRF+2
PRTF=11 ; PRINT FILE NAMES
PRTN1=PRTF+1 ; NAME 1
PRTN2=PRTF+2
COMSAV=15 ; AC TO HOLD SAVED COMPTR FOR INFERIOR START (GOES TO A)
XCTINS=16 ; AC TO XCT AN INSTR, FOR PURITY
P=17 ; PUSH DOWN POINTER
; FLAG DEFINITIONS
; FLAGS FOR FF REG
USRUN==1 ; INFERIOR EXISTS
; FATAL==2
LOGFLG==2 ; FLAG DURING LOGOUT, LOGOUT IF NO CORE
; NEG==4
VALCOM==10 ; LOOKING AT .VALUE FROM INFERIOR
LOGF==20 ; DOING 'LOGIN COMMAND'
CRLF==40 ; CR WAS LAST CHARACTER OUTPUT TO TTY
; JOBF==100
; RDF==200 ; READING COMMANDS FROM FILE
ECHF==400 ; ECHO TYPING
TTYGON==1000 ; TTY GIVEN AWAY
SILENC==2000 ; PRINTING BEING FLUSHED
; NVALUE==4000 ; 0=DO NOT INTERPRET VALRET STRING
RUNF==10000 ; 1=START UP INFERIOR
; MTTYF==20000 ; 1=KEEP TTY FROM INFERIOR
WASGON==40000 ; TTY WAS SNATCHED FROM INFERIOR (MONIT INTERRUPT)
SRCHF==100000 ; 1=DO SEARCH WHEN LOADING, SET BY FOO FOR TS FOO
IMLACF==200000 ; DEVICE TTY IS AN IMLAC
BRKFLG==400000 ; DOING MULTIPLE .BREAK 12,
; CHANNELS FOR I/O
TYIC==1 ; TTY INPUT
TYOC==2 ; TTY OUTPUT
SYSI==3 ; INPUT FROM SYS: OR USR:
USRO==4 ; OUTPUT TO INFERIOR
PRTC==5 ; PRINT AND LISTF INPUT ANDERROR DEVICE
LOC 20
PDLLNG==20 ; FROM 20 TO 37
PDL: BLOCK PDLLNG
LOC 40
0 ; UUO DEPOSITED HERE BY HARDWRE
JSR UUOH ; HANDLER FOR UUOS
JSR TSINT ; HANDLER FOR TS INTERRUPTS
0 ; STRING PASS PNTR FOR INFERIOR
DEFINE FATAL MESS
JSP A,XFATAL
INFORM \.,ERROR MESS
TERMIN
DEFINE INFORM N,MESS
IF1,[PRINTC /N MESSî/] TERMIN
PURITY==0
%HI==400000
DEFINE PURE
IFN PURITY,INFORM \.,EXTRA PURE
IFN SHARE,[IFE PURITY,[%LO==.
LOC %HI
]] PURITY==1
TERMIN
DEFINE IMPURE
IFE PURITY,INFORM \.,EXTRA IMPURE
IFN SHARE,[IFN PURITY,[%HI==.
LOC %LO
]] PURITY==0
TERMIN
; BEG. MAIN COMMAND SCAN LOOP
PURE
BEG: TLNE FF,VALCOM ; VALRET IN PROGRESS?
JRST BEGS ; YES, GO AHEAD
TLZ FF,SILENC ; UNSILENCE TTY
PASCI ^M ; CLEAR LINE
JRST BEGS ; GET COMMAND LINE AND PROCESS
BEGFND: MOVE B,(A) ; EXPAND ABREV TO ACTUAL
MOVEM B,SYSF+2
MOVEM B,USRF+2
HRRZ A,1(A) ; GET LOCAL COMMAND ADDRESS FROM BEGLOP
JRST (A) ; DISPATCH TO COMMAND
CANNOT: PSIX [SIXBIT / CAN'T/]
QBEG: PASCR [ASCIZ /?/]
.CLOSE SYSI,
TLZ FF,VALCOM ; RESET READING FROM VALRET STRING
; FALL THROUGH TO BEGS
BEGS: .SUSET [.SPICL,,[-1]] ; MAKE ME INTERUPT-PRONE
MOVE P,[-PDLLNG,,PDL-1] ; FLUSH OUT PDL
BEGR: TLNN FF,VALCOM ; VALRETED FROM PREV
PUSHJ P,RCMD ; READ STRING IN
PUSHJ P,SCMD ; SCAN COMMAND
JUMPE B,BEG ; COMMAND BLANK, TRY AGAIN
TLZA FF,LOGF+SRCHF+LOGFLG ; RESET LOGIN, KILL SEARCH
BEGA: SKIPA b,sysf+2 ; USE LAST COMMAND AGAIN
movem b,sysf+2
movem b,usrf+2
MOVE A,[-NUMCOM,,MYCOM]
BEGLOP: HLLZ C,1(A) ; FETCH ABBREV
CAME B,(A) ; CHECK FOR LOCAL COMMANDS
CAMN B,C ; ABBREV?
JRST BEGFND ; FOUND
AOS A
AOBJN A,BEGLOP ; GET ANOTHER
PUSHJ P,CKLOG ; MUST BE LOGGED IN HERE
TLO FF,RUNF+SRCHF ; SET TO RUN PROG AND SEARCH USER
SYSLG2: MOVEI A,SYSF ; SET FOR SYS FILES
; UOPEN. LOAD INFERIOR AND GO
UOPEN: PASCI ^M ; CLEAR LINE FOR LOSER
PUSHJ P,ALD ; LOAD THE FILE
TLNN FF,RUNF
JRST BEG ; WAIT IF NOT TO RUN
USTART: PUSHJ P,ATTY ; GIVE HIM THE CONSOLE
.USET USRO,[.SUSTP,,[0]] ; START INF
MOVSI D,200000
.SLEEP D, ; RIP VAN WINKLE
;****** JRST .-2 ; IN CASE 40 YRS PASS
; SCMD - SCAN COMMAND LINE FOR SOMETHING TO DO
SCMDL: IBP COMPTR ; SKIP OVER LEADING JUNK
SCMD: MOVE A,COMPTR ; ENTRY: LOOK AHEAD
ILDB A,A ; GET NEXT CHAR
;****** CAIE A,11 ; TAB IN LEAD IS IGNORED
;****** CAIN A,40 ; DITTO FOR SPACES
;****** JRST SCMDL ; PEEEL IT OFF
CAIE A,^J ; LINE FEEDS CHUCKED TOO
CAIN A,": ; STRIP LEADING COLONS
JRST SCMDL ; IGNORE LOSER
;****** CAIE A,^V ; VIEW?
;****** JRST .+3 ; NO, SKIP
;****** TLZ FF,SILENC ; YES, UNSILENCE
;****** JRST SCMDL ; IGNORE
CAIE A,^W ; WIPE?
JRST .+3 ; NO, SKIP
TLO FF,SILENC ; YES, SILENCE
JRST SCMDL ; IGNORE NOW
MOVEM COMPTR,43 ;SAVE FOR OLD STYLE LEECH
PUSHJ P,GETSYL ;GET COMMAND ARG
SKIPE A ;SKIP IF COMMAND TERMINATES WITH SPACE
TDZA COMSAV,COMSAV ;SET TO 0
MOVEM COMPTR,COMSAV ;SAVE CURRENT COMMAND LOC
POPJ P, ;RETURN FROM SCMD
; comment in valret, typed but ignored
GETCCC: PUSHJ P,GETCAT ; ECHO IF APPROPRIATE
GETCCS: ildb a,comptr ; get next command char
CAIE A,33 ; ALTMODE IS END OF COMMENT TOO
SKIPN A ; SO IS END OF VALRET
jrst getccz ; end
CAIE A,15 ; TERMINATING CR?
JRST GETCCC ; NO
PUSHJ P,GETCAT ; YES, ECHO
; GET CHAR FROM COMMAND BUFFER (FILTERING)
GETCCA: ILDB A,COMPTR ; FETCH COMM CHAR TO A
cain a,33 ; VALRET COMMENT STARTED WITH ALTMODE ":$"
jrst GETCCS ; ignore text to end-of-line
caie a,^C ; end-of-file?
skipn a ; null terminate strings
GETCCZ: TLZ FF,VALCOM+ECHF+SILENC ; END OF VALRET
caie a,^L ; flush formfeed
CAIN A,^J ; FLUSH LF
JRST GETCCA
GETCAT: TLNE FF,VALCOM+ECHF
JRST IOTA ; ECHO IF VALRET OR ECHO FLAG
POPJ P, ; ELSE JUST RETURN
; RCMD. READ COMMAND LINE INTO BUFFER
RCMD: PASCI "; ; PROMPT WITH ;
MOVE COMPTR,[440700,,COMMND] ; BEG INPUT
SETZB C,COMMND ; COUNTER AND COMMAND BUFFER
MOVE B,[COMMND,,COMMND+1]
BLT B,COMMND+COMLNG-1 ;ZERO OUT COMMAND BUFFER
MOVE B,COMPTR
RCMD1: .IOT TYIC,A ; GET CHAR
CAIN A,"?
JUMPE C,PHELP ; INIT ? MEANS HELP
CAIN A,"" ; DOUBLE QUOTE WORKS IMMEDIATE
JUMPE C,BEGA ; NOW! DO SAME COMMAND AGAIN
CAIE A,^G ; CTL G IGNORED
CAIN A,^S ; CTL S IGNORED
JRST KLINE ; YES
CAIN A,177 ; RUBOUT
JRST RUB
CAIN A,^L
PIMAGE [ASCIZ /C/] ;CLEAR SCREEN ON FF
CAIG A,^L ; SKIP IF GREATER THAN FF, NOT FUNNY CTL CHAR
JRST RCMDX ; JUMP TO END LINE ON FUNNY CTL CHAR
CAIN A,^M ; SKIP IF NOT CR
JRST RCMDY ; JUMP TO END LINE WITH CR
CAIL C,5*COMLNG-2 ; SKIP IF CHAR FITS IN BUFFER
JRST RCMD1 ; JUMP TO IGNORE OVERFLOW CHARACTER
IDPB A,B ; STORE CHAR AWAY
AOJA C,RCMD1 ; BACK FOR MORE
RCMDX: MOVEI A,^M ; CLEAR LINE WITH RETURN
PUSHJ P,IOTA
RCMDY: IDPB A,B ; STORE CHAR (CR)
MOVEI A,0 ; TERM WITH NULL FOR TYPE
IDPB A,B
TLO FF,CRLF ; MARK AS HAVING CLEARED LINE
POPJ P,
RUB: SOJL C,KLINE
LDB A,B ; GET LAST INSERTED
ADD B,[070000,,] ; BUMP CH POINTER
TLNE B,400000 ; AT WORD BOUND
ADD B,[347777777777]
tlne ff,imlacf ; imlac?
jrst rubiml ; yes
PUSHJ P,IOTA ; ECHO OUT RUBBED CHAR
JRST RCMD1
RUBIML: CAIGE A,33' ; WAS IT A CONTROL (^CHAR)
PIMAGE DELCH ;DELETE 2 IF CTL CHAR
PIMAGE DELCH ;DELETE CHAR
jrst rcmd1 ; next?
KLINE: TLZ FF,SILENC ; UNSILENCE AFTER CLEARING
tlnn ff,imlacf ; imlac?
jrst qbeg ; start over if just tty
PIMAGE DELIN ; KILL A LINE
JRST RCMD ; PROMPT WITH ";
;****** SCNAME - ROUTINE TO SCAN COMMAND LINE FROM CURRENT POSITION
;****** RETURNS A FILE NAME. A,B,C,D <= NAME1,NAME2,DEVICE,USER
;****** USING "[DEV:][USR;]NAME1 NAME2" OR "NAME1 NAME2 [DEV [USR]]"
;****** USING [USR;] WILL CAUSE DEVICE TO BE DSK.
SCNAME: SETZM SCN1 ;ZERO NAMES &C
SETZM SCN2
SKIPA C,[-4,,SCN1]
SCNDEV: MOVE C,[-2,,SCDEV]
SETZM SCDEV
SETZM SCUSR
SCNGET: PUSHJ P,GETSYL ;RET A,B <= BRKCHR,6BIT SYL
JUMPE B,SCNX ;NO MORE SYLS HERE
CAIN A,': ;CHECK WHICH BREAK
SCNPDV: MOVEM B,SCDEV ;MOVE :SYL TO DEVICE
CAIN A,'; ;MOVE SYL; TO USR
JRST SCNUSR ; SYL; BECOMES USR AND DEV DSK:
SCNCON: JUMPG A,SCNGET ;NOT SPACE, GET MORE SYL(NOT CTL EITHER)
MOVEM B,(C)
JUMPL A,SCNX ;CTL TERMINATES
AOBJN C,SCNGET ;UP PTR, GET MORE
SCNX: SKIPE SCUSR ;USR; SPECIFIED?
.SUSET [.SSNAM,,SCUSR] ;YES, SET IT
SKIPE A,SCDEV ;DEV:?
HLRZM A,PRTF ;Y, SET IT, ALSO OPEN MODE UNIT ASC@IN
TLZ PRTF,-1 ;SET TO ASCII UNIT INPUT ANYWAY
SKIPE A,SCN1
MOVEM A,PRTF+1 ;SET N1 IF GEVEN
SKIPE A,SCN2
MOVEM A,PRTF+2 ;SET N2 IF GIVYN
POPJ P,
SCNUSR: MOVEM B,SCUSR
HRLI B,(SIXBIT /DSK/) ; MAKE DEVICE DSK
SKIPN SCDEV ;DO NOT SET DEV TO DSK IF ALREADY SPECED
MOVEM B,SCDEV
JRST SCNCON ; CONTINUE SCAN
IMPURE
SCN1: 0
SCN2: 0
SCDEV: 0
SCUSR: 0
PURE
;GETSYL - ROUTINE TO GET SINGLE WORD OFF COMMAND LINE
;****** ONLY BRK CHAR ARE : ; SPACE AND CONTROLS EXCEPT ^Q WHICH
;****** QUOTES THE NEXT NON CTL CHAR (: ; SP)
GETSYL: PUSH P,[0] ;INIT SYL ON STACK
MOVE B,[440600,,0(P)] ;BYT PTR TO STACK
GETSLP: PUSHJ P,GETCCA ;GET CHAR
CAIN A,^Q ;IS IT "QUOTE"
JRST GETQOT ;YES
SUBI A,40 ;MAKE SIXBIT
JUMPL A,GETSX ;CTL=EXIT
JUMPE A,GETSP ;INIT SPACES FLUSHED
CAIE A,':
CAIN A,';
JRST GETSX ; ; OR : TERM
GETSPT: CAIL A,100 ;LC?
SUBI A,40 ;MAKE UC
TLNE B,770000 ;CHECK FIT
IDPB A,B ;STORE CHAR
JRST GETSLP
GETQOT: PUSHJ P,GETCCA ;GET CHAR TO QUOTE
SUBI A,40 ;6BIT
JUMPGE A,GETSPT ;CAN'T ^Q A CTL
JRST GETSX
GETSP: TLNE B,400000 ;IF NONE YET PUT IN
JRST GETSLP ;SPACE IGNORED
GETSX: POP P,B ;ASSEMBLED SYL TO B
POPJ P, ;BRK IS LEFT IN A
; LOAD LOSER
ALD: HRRM A,XCTINS ;STORE ADDRESS FOR LOAD OPEN
SETZM USRN1 ;WIPE ANY PREVIOUS USERNAME (FROM 'USER')
HRLI USRF,5 ;SET USER OPEN TO IMAGE UNIT OUTPUT
ALD6: TLNN FF,SRCHF ;SKIP IF SEARCH FLAG ON
JRST ALD7 ;ELSE GO LOAD REGULAR
MOVEI A,(SIXBIT /DSK/)
HRRM A,SYSF ;SET FOR USER FIRST
.SUSET [.RSNAM,,A] ;SAVE SNAME
.SUSET [.SSNAM,,DSKNAM] ;SET FOR SEARCH OF "USER" DIR
.OPEN SYSI,(XCTINS) ;MAY ACTUALLY BE SYSF
JRST .+3 ;FAIL, SET SYSF TO SYS
.SUSET [.SSNAM,,A] ;RESTORE SNAME
JRST ALD5 ;FOUND USER, LOAD IT
.SUSET [.SSNAM,,A] ;RESTORE SNAME
MOVEI A,(SIXBIT /SYS/)
HRRM A,SYSF ;FOO, SET SYS TO SYS
ALD7: .OPEN SYSI,(XCTINS) ;FILLED IN ADDRESS
JSP A,ANALER
ALD5: PUSHJ P,USRCLOSE
PUSHJ P,USROPEN ;FILE FOUND, OPEN USER INFERIOR
.RESET USRO, ; MAKE IMAGE FRESH, IF WAS REOWNED
.uset usro,[.ssnam,,dsknam] ;carry dsk to inferior
PLOAD: MOVE A,[USRO,,SYSI]
.CALL LDBLK
JRST PLOADR
.IOT SYSI,B ;READ START ADDRESS
ALDJ: HRRZM B,STARTA
.USET USRO,[.SUPC,,STARTA]
.CLOSE SYSI,
POPJ P, ;RETURN
PLOADR: PSIXI (SIXBIT /PLD/) ; ERROR ON PLOAD
.CLOSE SYSI,
PUSHJ P,USRCLOSE ;FLUSH OUT JOB
JRST QBEG ;WILL SCRATCH PDL
LDBLK: SETZ
SIXBIT /LOAD/
[USRO]
SETZ [SYSI]
; XFATAL AND ANALER ERROR HANDLERS
XFATAL: MOVE P,[-PDLLNG,,PDL-1] ; RESET PDL FOR WORKING ROOM
POCTI (A)
PASCR [ASCIZ / MONIT error/]
.VALUE
DANERR: .STATUS ERRF+2 ;GET STATUS FOR DELETE
JRST ANAL1
ANALER: HLLZ B,-2(A)
TLZ B,777037 ;SAVE ONLY AC FIELD
IOR B,DANERR ;GET .STATUS
XCT B ;DO IT,
ANAL1: TLZ FF,ECHF+VALCOM ;ERROR => NO TAPE IN OR VALRET
MOVEI A,@-2(A)
PSIX (A) ;POINTS TO OPEN BLOCK
PASCI ":
.SUSET [.RSNAM,,SCUSR] ;GET USERS SNAME
PSIX SCUSR
PASCI ";
PSIX 1(A)
PASCI " ;SPACE
PSIX 2(A) ;NAME2
PASCI 40 ;SP
.OPEN PRTC,ERRF ;OPEN ERROR COMMENT
FATAL CANT OPEN ERROR DEVICE (ANALYSE ERROR)
; (FALL THROUGH)
XPRINT: .IOT PRTC,A
TLNN A,-1 ;MAGIC EOF?
CAIN A,^C
JRST CLPRT ;YES, FINISHED
CAIE A,^L ;IGNORE FF
PUSHJ P,IOTA ;PRINT SYSTEM COMMENT
TLNN FF,SILENC
JRST XPRINT
CLPRT: .CLOSE PRTC,
JRST BEG ;KILLED BY ^S
USROPE:.OPEN USRO,USRF ;useropen (as it is affectionately called)
JSP A,ANALER ;YOU LOST
.USET USRO,[.RINTB,,A]
TLNN A,1 ;CHECK INTB IF THE RIGHT INFERIOR
FATAL OPENED SECOND INFERIOR (USEROPEN)
TLO FF,USRUN ;SET OPEN FLAG
POPJ P,
USRCLOSE: PUSHJ P,DTTY ;MAKE SURE TTY IS UP
TLNE FF,USRUN ;CHECK IF ACTUALLY OPEN
.UCLOSE USRO, ;YES, WIPE IT OUT
.CLOSE USRO,
TLZ FF,USRUN ;NOW RESET FLAG - IF KILL HANGS, IT WILL NOT BE FLAGGED YET
POPJ P,
ATTY:
;****** TLNE FF,USRUN ;CANT IF NO USR OPEN
.ATTY USRO, ;TRY TO GIVE IT UP
FATAL ATTY WITH NO INF OPEN (ATTY)
TLO FF,TTYGON ;FLAG TTY GONE
POPJ P,
DTTY: TLZ FF,WASGON ;SAVE STATE OF TTYGON HERE
TLZN FF,TTYGON ;SEE IF TTY GIVEN AWAY
POPJ P, ;I GOT IT ALREADY
.DTTY USRO, ;GOBBLE IT BACK
FATAL CAN'T GET TTY BACK FROM INF (DTTY)
TLO FF,WASGON ;MARK THAT TTY WAS GOTTEN FROM INF
POPJ P,
; LISTF PRINT RUN DELETE PCORE
SYSTAT: .OPEN PRTC,[SIXBIT / TTY.FILE.(DIR)/]
JSP A,ANALER
JRST XPRINT
LISTF: PUSHJ P,SCNDEV ;OUTPUT FILE DIRECTORY
SETOM B
LISTFM: MOVEM PRTF,LSTF
.OPEN PRTC,LSTF
JSP A,LISTFU
JRST XPRINT
LISTFU: AOJG B,ANALER ;A SET ALREADY, CHECK ONCE FLAG(B)
.SUSET [.SSNAM,,SCDEV] ;DEV NOT FOUND, SET USER TO DEV, DEV TO DSK
MOVEI PRTF,(SIXBIT /DSK/)
JRST LISTFM
PRINT: PUSHJ P,SCNAME ;GET A,B,C,D = N1,N2,DEV,USR
CAIN PRTF,(SIXBIT/TTY/) ; TTY?
MOVEI PRTF,(SIXBIT /DSK/) ; TTY GOES TO DSK
.OPEN PRTC,PRTF
JSP A,ANALER
JRST XPRINT
RUN: TLOA FF,RUNF ;SET TO RUN
LOAD: TLZ FF,RUNF ;SET TO NOT RUN
PUSHJ P,CKLOG
PUSHJ P,SCNAME ;GET FILE NAME
MOVEM PRTN1,USRF+2 ;JOBNAME=FILENAME
CAME PRTN1,SYSF+1 ;SKIP IF N1=TS
CAMN PRTN1,[SIXBIT /@/] ;SKIP IF NOT @
MOVEM PRTN2,USRF+2 ;USE JOBNAME=FILE NAME 2
CAIE PRTF,(SIXBIT /USR/) ;BAD DEVICES FOR LOADING
CAIN PRTF,(SIXBIT /TTY/)
MOVEI PRTF,(SIXBIT /DSK/) ; IF USR OR TTY MAKE DSK
HRLI PRTF,4 ;MODE IS IMAGE UNIT INPUT
MOVEI A,PRTF
TLZ FF,SRCHF ;OMIT SEARCH (REDUNDANT OPEN)
JRST UOPEN
DELETE: PUSHJ P,SCNAME ;GET FILE NAME
MOVEI PRTF+3,0 ;SET ARG FOR DELETE
.FDELE PRTF ;SYS CALL DELETE
JSP A,DANERR ;HMM ERROR
JRST BEG ;OK
; OWN. OWN A DISOWNED JOB
OWN: PUSHJ P,CKLOG ;MUST BE LOGGED IN
PUSHJ P,USRCLOSE
PUSHJ P,GETSYL ;GET FIRST NAME
JUMPE B,NLOG3 ;TYPE NAME? IF NOT GIVEN
MOVEM B,USRN2 ;STORE
PUSHJ P,GETSYL ;GET SECOND NAME IF ANY
SKIPE USRN1,B ;SKIP IF NO SECOND, MOVE TO FIRST
EXCH USRN1,USRN2 ;SWAP SECOND TO FIRST, V-V
HRLI USRF,16 ;IMAGE BLOCK INPUT, FAIL IF NOT FOUND
PUSHJ P,USROPEN
HRLI USRF,6 ;NOW SET TO IMAGE BLOCK INPUT ONLY
PUSHJ P,USROPEN ;TRY FOR REAL
.STATUS USRO,A
ANDI A,77 ;GET 'DEVICE' CODE
CAIE A,61 ;SKIP IF 'IMMEDIATE INFERIOR'
PASCR [ASCIZ /inf?/]
.USET USRO,[.RJNAM,,B] ;GET ACTUAL JNAME
CAMN B,USRN2 ;SKIP IF NAME ALTERED BY SYSTEM TO AVOID CONFLICT
JRST BEG ;NAME OK, RETURN
MOVEM B,USRN2 ;STORE NEW NAME
PSIX USRN2 ;PRINT IT
PASCR [ASCIZ / new name/]
JRST QBEG
USER: PUSHJ P,GETSYL ;GET AN ARG
MOVEM B,DSKNAM ;STORE AS DISK DIR NAME
.SUSET [.SSNAM,,DSKNAM] ; SET IT NOW
JRST BEG
LOGIN: .OPEN SYSI,SYSF ; LOOK FOR TS LOGIN
SKIPA ; OOPS, NOT FOUND
JRST SYSLG1 ; USE IT
STRLOG: PUSHJ P,GETSYL
SKIPE LOGNAM
JRST NLOG1 ;ALREADY LOGGED IN
JUMPE B,NLOG3 ;NO NAME GIVEN
.CALL LOGBLK
JRST NLOG2 ; FAIL, NAME ON ANOTHER TTY
MOVEM B,LOGNAM
MOVEM B,DSKNAM ;STORE FOR COMMAND LOAD SEARCH RULE
JRST BEG
NLOG1: PSIX LOGNAM
PASCR [ASCIZ / is here./]
JRST BEG
NLOG2: PASCR [ASCIZ /On another console./]
JRST BEG
NLOG3: PASC [ASCIZ /Name/]
JRST QBEG
LOGBLK: SETZ
SIXBIT /LOGIN/
B
SETZ [SIXBIT /MONIT/]
DISOWN: PUSHJ P,CKRUN
.DISOWN USRO,
FATAL WONT DISOWN INFERIOR (DISOWN)
.CLOSE USRO, ;FORGET, BUT DONT DESTROY
TLZ FF,USRUN
JRST BEG
; CONTIN START STOP PROCEED KILL
CONTIN: PUSHJ P,CKRUN ; RUNABLE?
JRST STARTP ; GO START IT
START: PUSHJ P,CKRUN
.USET USRO,[.SUPC,,STARTA] ; SET HIS START ADDRESS
STARTP: TLO FF,RUNF ; SET TO RUN
JRST USTART
STOP: PUSHJ P,CKRUN
.USET USRO,[.SUSTP,,[-1]]
JRST BEG
PROCEE:
PROCED: PUSHJ P,CKRUN
.USET USRO,[.SUSTP,,[0]] ; SEE HIM RUN !
JRST BEG
KILL: PUSHJ P,USRCLOSE ; FLUSH JOB IF ANY
JRST BEG
; CHECK TO SEE IF LOSER IS LOGGED IN.
CKLOG: SKIPE LOGNAM ; SKIP IF LOSER NOT LOGGED IN
POPJ P, ; RETURN, LOGGED IN, OK
PASC [ASCIZ/Login/] ; ASK FOR LOGIN
JRST QBEG
CKRUN: TLNE FF,USRUN ; CHECK IF JOB CURRENTLY EXISTS
POPJ P,
PASC [ASCIZ /No program/]
JRST QBEG
; TRANS UNTRAN
TRANS: SKIPA XCTINS,[.TRANAD TBLOCK]
UNTRAN: MOVE XCTINS,[.TRANDL TBLOCK]
PUSHJ P,CKLOG ; LOGGED IN?
MOVSI C,-8 ; COUNT OF ARGS
TARGS: PUSHJ P,GETSYL
JUMPE B,QBEG ;? IF NOT ENOUGH ARGS
MOVEM B,TBLOCK(C) ; STORE RAW ARG WORDDS
AOBJN C,TARGS
MOVE B,[440600,,TBLOCK] ; FIRST ARG, "AIO"
HLRZ C,TBLOCK+2
TMODE: ILDB A,B ; GET CHARS
CAIN A,'A ; IS IT "ATOMIC"
TLO C,400000 ; YES, SET BIT
CAIN A,'I ; IS IT INPUT
TLO C,1 ; SET INPUT BIT
CAIN A,'O ; IS IT OUTPUT
TLO C,2 ; SET OUTPUT BIT
TLNE B,770000 ; SKIP IF DONE WORD
JRST TMODE ; JUMP BACK IF NOT DONE
MOVEM C,TBLOCK+2
HLRZS TBLOCK+5
MOVE A,LOGNAM
MOVEM A,TBLOCK ; SET UNAME = MINE
XCT XCTINS
JRST CANNOT
JRST BEG
; ---------------------
; I command I
; I-------------------I
; I abbrev I ptr I
; ---------------------
DEFINE COMTAB COMMND,ABREV
SIXBIT /COMMND/
<<SIXBIT/ABREV/>&<777777000000>>+<<COMMND>&<000000777777>>
TERMIN
MYCOM: COMTAB ASSIGN,ASN
COMTAB CONTIN,CON
COMTAB DELETE,DEL
COMTAB DESIGN,DES
COMTAB DISOWN,DIS
;****** COMTAB ECHO
COMTAB FLAP
COMTAB FLUSH
COMTAB HELP,HOW
;****** COMTAB JOB
COMTAB KILL,K
COMTAB LISTF,LF
COMTAB LOAD,GET
COMTAB LOGIN,LOG
COMTAB LOGOUT,BYE
;****** COMTAB MONTTY
COMTAB OWN,JOB
COMTAB PRINT,TYP
COMTAB PROCED,P
COMTAB RUN,R
COMTAB START,GO
COMTAB STOP
COMTAB SYSTAT,WHO
COMTAB TIME,TI
COMTAB TRANS
COMTAB UINIT
COMTAB UNTRAN
COMTAB USER
;****** COMTAB VALUE
;****** COMTAB XFILE
NUMCOP==<.-MYCOM>/2 ; COUNT FOR PRINTING, FOLLOWING ARE INTERNAL
COMTAB ENDLOG
COMTAB STRLOG
NUMCOM==<.-MYCOM>/2 ;COUNT FOR TABLE USES
IFN NUMCOM*2+MYCOM-.,PRINTC / * * * COMMAND TABLE ODD
/
; HELP COMMAND
PHELP: PASCI ^M ; CLEAN LINE
HELP: PASCR [ASCIZ /Commands/]
MOVE A,[-NUMCOP,,MYCOM] ; do not give them endlog or strlog
HELPL: PSIX (A) ; TABLE ENTRY
HLLZ D,1(A) ; GET ABBREV
JUMPE D,HELPX ; JUMP IF NO ABBREV TO PRINT
PASCI ^I ; TAB FOR ABBREV
PSIX D
HELPX: PASCI ^M ; CR TO END IT
AOS A
AOBJN A,HELPL
JRST BEG
; LOGOUT DESIGN ASSIGN FLUSH ENDLOG
LOGOUT: SKIPN LOGNAM ; DONE A LOGIN?
JRST ENDLOG ; NO, JUST LOGEM OUT NOW
tlo ff,logflg ; set logout flag in case no core
.open sysi,sysf ; ts logout?
jrst endlog ; just logout
SYSLG1: TLZ FF,SRCHF ; NO SEARCH RULE
tlo ff,runf ; runit
jrst syslg2 ; runit
endlog: .LOGOUT
FLUSH: .VALUE
DESIGN: SKIPA XCTINS,[.DESIGN A,]
ASSIGN: MOVE XCTINS,[.ASSIGN A,]
PUSHJ P,CKLOG ; MUST BE LOGGED IN FOR THESE
ACOMM: PUSHJ P,GETSYL ; GET A SYL
MOVEI A,0
LSHC A,6
JUMPN B,.-2 ; GET ONLY TRAILING CHAR
SUBI A,'0 ; MAKE A DIGIT
JUMPLE A,CANNOT ; CHECK FOR VALID
CAIG A,8
XCT XCTINS ; DO IT
JRST CANNOT ; HMM!
JRST BEG
UINIT: SKIPA XCTINS,[.UINIT A,]
FLAP: MOVE XCTINS,[.UDISMT A,]
JRST ACOMM
UUOCT==0
UUOTAB: JRST ILUUO
IRPS X,,[PDEC PDECI POCT POCTI PSIX PSIXI PASC PASCI PASCR PIMAGE]
UUOCT==UUOCT+1
X=UUOCT_33
JRST U!X
TERMIN
UUOMAX==.-UUOTAB
UUOH: 0
PUSH P,A
PUSH P,B
PUSH P,C
LDB A,[270400,,40] ;GET UUO AC,
HRRZ B,40 ;AND ADR
CAIG B,C ;SKIP IF ADR > AC C
MOVEI B,-2(P) ;ALLOW ARG IN ACS (EXCEPT 0)
LDB C,[330600,,40] ;OP CODE
CAIL C,UUOMAX
MOVEI C,0 ;GRT=>ILLEGAL
JRST @UUOTAB(C) ;GO TO PROPER ROUT
ILUUO: MOVEI B,[ASCIZ /Illegal UUO/]
MOVEI A,QBEG ; RECOVER FROM ILLUUO AT QBEG
HRRM A,UUOH ; SETUP FOR UUORET
UPASC: SKIPA C,[0] ; NO RETURN
UPASCR: MOVEI C,15 ; RETURN
HRLI B,440700 ; MAKE ASCII POINTER
ILDB A,B ; GET CHAR
JUMPE A,.+3 ; FINISH?
PUSHJ P,IOTA ; TYPE "A"
JRST .-3 ; AND GET ANOTHER
SKIPE A,C ; GET SAVED CR?
PUSHJ P,IOTA
JRST UUORET
UPIMAGE: HRLI B,440700
ILDB A,B
JUMPE A,UUORET
.IOT TYOC,A
JRST .-3
UPASCI: MOVE A,B ; PRT ASCII IMMEDIATE
PUSHJ P,IOTA
UUORET: POP P,C
POP P,B
POP P,A ; RESTORE AC'S
JRST 2,@UUOH
UPSIX: SKIPA A,[440600,,0(B)] ;PRINT A SIXBIT WORD
UPSIXI: MOVE A,[220600,,40] ;PRT SIXBIT IMMEDIATE
UPSLA: ILDB C,A
ADDI C,40 ;MAKE TO ASCII(+40)
CAIE C,40 ;BUT SKIP IF SPACE
PUSHJ P,IOTC
TLNE A,770000 ;SEE IF FINISH
JRST UPSLA ;NOPE, MORE
JRST UUORET
UPDEC: SKIPA C,[10.] ;GET BASE FOR DECIMAL
UPOCT: MOVEI C,8. ;OCTAL BASE
MOVE B,(B) ;GET ACTUAL WORD TO PRT
JRST .+3 ;JOIN CODE
UPDECI: SKIPA C,[10.] ;DECIMAL
UPOCTI: MOVEI C,8.
MOVEM C,BASE'
SKIPN A
HRREI A,-1 ;A=DIGIT COUNT
PUSHJ P,UPNUM ;PRINT NUMBR
JRST UUORET
UPNUM: IDIV B,BASE
HRLM C,(P) ;SAVE DIGIT
SOJE A,UPNUM1 ;DONE IF 0
SKIPG A ;+ => MORE
SKIPE B ;- => B=0 => DONE
PUSHJ P,UPNUM ;ELSE MORE
UPNUM1: HLRZ C,(P) ;RETREIVE DIGITS
ADDI C,"0 ;MAKE TO ASCII
; CAILE C,"9 ;IS IT GOOD DIG
; ADDI C,"A-"9-1 ;MAKE HEX DIGIT
; FALL THROUGH
IOTC: EXCH A,C
PUSHJ P,IOTA
EXCH A,C
POPJ P, ;RET
; IOTA. CHAR TO TTY FROM A
IOTA: TLNE FF,SILENC ; IS SHUTUP FLAG ON?
POPJ P, ; YES, EXIT
caige a,40 ; control char?
JRST IOTAC ; PUT OUT UPARROW CHAR
IOTAA: .IOT TYOC,A ; TYPE OUT A
IOTAB: TLZ FF,CRLF ; MARK LINE UNCLEAR
IOUPAR: POPJ P,"^
IOTLF: TLZN FF,CRLF
.IOT TYOC,A
POPJ P,
IOTCR: TLON FF,CRLF ; AND FLG
.IOT TYOC,A ; OUT WITH CR
IOP: POPJ P,"P
IOTAC: CAIN A,^M ; SKIP IF NOT CARR RET
JRST IOTCR ; PUT OUT CARR RET, FLAG
CAIN A,^J ;SKIP IF NOT LF
JRST IOTLF
CAIE A,^P ; CTRL P IS MAGIC OUTPUT ESCAPE, MUST WATCH
JRST IOTAA ; NOT ^P, JUST OUTPUT
.IOT TYOC,IOUPAR ; OUTPUT UPARROW ^
.IOT TYOC,IOP ; OUTPUT LETTER P
JRST IOTAB ; EXIT FLAGGING NOISE
; TSINT - HANDLE THE INTERRUPTS
TSINT: 0 ; MASK WD HERE
0 ; RETURN LOC
EXCH A,TSINT ; SWAP AC AND FLAGS
CAIN A,200000 ; SKIP IF NOT PDL OVERFLOW
MOVE P,[-PDLLNG,,PDL-1] ; REINITIIALIZE PDL ON OVERFLOW
PUSHJ P,DTTY ; GET TTY IF GIVEN AWAY
JUMPGE A,MONINZ ; JUMP FOR OWN INTERRUPT IF 4.9 BIT OFF
.USET USRO,[.RPIRQ,,A] ; GET USER INT BITS
.USET USRO,[.SAPIRQ,,A] ; RESET THOSE READ
TRZE A,2 ; ^Z TYPED at INFERIOR
JRST CTLZEE
TRZE A,4
PSIXI (SIXBIT /B42/) ; BAD LOC 42
TRZE A,20
PSIXI (SIXBIT /DPY/) ; DISPLAY INTERRUPT
TRZE A,40 ; ILL INS
PSIXI (SIXBIT /ILL/)
TRZE A,200
.DISMISS [VALRET] ; READ HIS STRING
TRZE A,400
PSIXI (SIXBIT /IOC/) ; IOCHANNEL ERROR
TRZE A,2000 ; .BREAK
JRST BRKINT
TRZE A,20000
PSIXI (SIXBIT /MPV/)
SKIPE A
POCT A ; PRT REST OF BITS
PRTPC: PASC [ASCIZ / in /]
.USET USRO,[.RJNAME,,USRN2] ; GET INF JOB NAME
PSIX USRN2 ; PRINT IT
PASC [ASCIZ / pc=/]
.USET USRO,[.RUPC,,A] ; FETCH PC
POCTI (A)
IFLUSH: JRST FLSHI ; FLUSH INPUT AND DISMISS TO QBEG
BRKINT: .USET USRO,[.RJNAME,,USRF+2] ;GET REAL JNAME
HRLI USRF,5 ;IMAGE UNIT OUTPUT FOR USER DEV
.OPEN USRO,USRF ;OPEN FOR OUTPUT
FATAL Cant open INF output on .BREAK 12
HRLI USRF,4 ;IMAGE UNIT INPUT
.OPEN SYSI,USRF ;OPEN FOR INPUT
FATAL Cant open INF input on .BREAK 12
BRKIN1: .USET USRO,[.RSV40,,A] ;GET .BREAK INSTR
HLRZ B,A
CAIN B,(.BREAK 16,) ;SKIP IF NOT 16
JRST BRK16 ;JUMP TO HANDLE BREAK 16
CAIE B,(.BREAK 12,) ;SKIP IF .BREAK 12
JRST BRKERR ;ERROR, JUST SAY .BREAK
HRRZS A
; CHECK MEMORY ADR HERE
.ACCESS USRO,A ;FOR POSSIBLE REWRITE
.ACCESS SYSI,A ;ADDRESS THE POINTER
.IOT SYSI,A ;FETCH IT
TLNN A,200000 ;SKIP IF 4.8 ON, MAY BE AOBJN POINTER
JRST BRKONE ;ONLY ONE COMMAND, DO IT
JUMPGE A,BRKERR ;SIGN BIT NOT ON, ERROR NOT AOBJN PTR
AOBJP A,.+2 ;BUMP POINTER, SKIP IF COUNTS OUT
TRO FF,BRKFLG ;SET, IN AOBJN LOOP FOR .BREAK
.IOT USRO,A ;STORE BUMPED PTR BACK
MOVEI A,-1(A) ;GET PREVIOUS ADR
.ACCESS SYSI,A ;SET ADDRESS
.IOT SYSI,A ;FETCH COMMAND WORD
BRKONE: HRRZ B,A ;GET ADDRESS OF CMMMAND
.ACCESS SYSI,B ;INPUT ADDRESS
.ACCESS USRO,B ;OUTPUT ADDRESS SET TOO
LDB B,[222100,,A] ;GET CODE
CAIL B,NBRKS ;SKIP IF IN RANGE
MOVEI B,0 ;SET TO ERROR IF NOT
XCT BRKTBL(B) ;DO THING
BRKTBL: JRST BRKERR ;IF RETURN, IS ERROR
JRST BRKSA ;1 START ADR
JUMPGE A,BRKFN ;2 FILE NAME (READ ONLY)
JUMPGE A,BRKSMT ;3 SYMTAB PTR (READ ONLY)
JRST BRKSYM ;4 SYMBOL, READ OR WRITE
JRST BRKCOM ;5 COMMAND READ OR WRITE
NBRKS==.-BRKTBL
BRKSA: JUMPL A,BRKSAW ;WRITE IF 4.9 BIT
.IOT USRO,STARTA ;READ MY START ADR
JRST BRKXX ;OK, EXIT (OR LOOP)
BRKSAW: .IOT SYSI,STARTA ;WRITE MY START ADR
HRRZS STARTA ; FLUSH FLAG BITS
JRST BRKXX ;EXIT
BRKCOM: JUMPL A,BRKCMW ;TO FETCH COMMAND BACK FROM INF
JUMPE COMSAV,BRKNUL ;NONE TO SEND
MOVE B,[440700,,COMMND]
ILDB A,COMSAV
IDPB A,B
JUMPN A,.-2
MOVE COMSAV,[440700,,COMMND] ;REFLECT FACT THAT COMMAND MOVED
.IOT SYSI,A ;DUMMY, TO ADVANCE ACCESS FOR READ
MOVSI B,-COMLNG
.IOT USRO,COMMND(B)
.IOT SYSI,A
JUMPN A,.+3 ;END IF NEXT WORD IN INF NOT 0
SKIPE COMMND(B) ;END IF WORD JUST SENT WAS 0
AOBJN B,.-4 ;LOOP FOR NEXT WORD
BRKXX: TRZE FF,BRKFLG ;SKIP IF LOOP FLAG NOT SET
JRST BRKIN1 ;ELSE LOOP
.CLOSE SYSI,
.USET USRO,[.SUSTP,,[0]] ;ALLOW HIM TO RUN AGAIN
JRST MONO
BRKERR: PSIXI (SIXBIT /BRK/)
JRST PRTPC
BRKCMW: SETZM COMSAV ;CLEAR OUT COMMAND SAVER
BRKSYM: JUMPL A,BRKXX ;SYMBOL WRITE IS NOP
BRKSMT: ;SYMTAB, WRITE IS ERROR, READ 0
BRKFN: JUMPL A,BRKERR ;FILE NAME DITTO
BRKNUL: .IOT USRO,[0] ;SET ONE WORD OF ZERO
JRST BRKXX ;NOW RETURN
BRK16: TRNE A,-1#140000
JRST BRKERR ;ERROR IF ANY OTHER BITS
TRNN A,100000 ;BIT SAYS DONT RESET TYI
.RESET TYIC,
TRNN A,40000 ;BIT SAYS DO :KILL
.DISMISS [BEG] ;ELSE JUST RETURN TO SUP
.DISMISS [KILL]
; HANDLE INTS TO MONIT (NOT INF)
MONINT: POP P,A ; RESTORE FLAGS AFTER TYILK
MONINZ: TRZE A,1
JRST TYILK
TRZE A,100 ; FIVE MINUTES
PASCR [ASCIZ /îSystem going down./]
TRNN A,-1 ; ANY LEFT?
JRST MONO
POCTI 6,(A) ; PRINT BITS
PSIXI (SIXBIT /INT/)
MOVE A,TSINT+1
JRST XFATAL
;***** FATAL. UFO INT IN MONIT
MONO: TLNE FF,WASGON ; SKIP ATTY IF TTY WAS NOT GOBBLED FROM INF
PUSHJ P,ATTY ; GIVE TTY BACK TO INF
MOVE A,TSINT ; RESTORE AC STORED HERE
.DISMISS TSINT+1
TYILK: PUSH P,A ; STORE FLAGS
TYILK1: MOVEI A,PRTC ; CHECK CHARS FOR INPUT TTY
.ITYIC A,
SKIPA A,[TYIC]
JRST .-3
.ITYIC A,
JRST MONINT
CAIN A,^Z
JRST flshio ; cause question and command fetch
CAIE A,^G
CAIN A,^S ; ^S AND ^G THE SAME
TLOA FF,SILENC ; SET SILENCE FLAG
JRST TYILK1 ;GO BACK, SEE IF ANY MORE
.RESET TYOC, ; HERE ^S TO SHUT UP OUTPUT ONLY
JRST TYILK1
FLSHIO: .reset tyoc, ; empty output buffer
FLSHI: .reset tyic, ; likewise for input
.dismiss [qbeg] ; away from in level to reinit
; VALRET - HANDLE VALUE RETURN FROM INFEERIOR
VALRET: .USET USRO,[.RSV40,,A] ; GET ACTUAL .VALUE UUO FROM USERS 40
HRRZS A
JUMPE A,VALRE1
HRLI USRF,6 ;SET USRF FOR IMAGE BLOCK INPUT
.USET USRO,[.RJNAME,,USRF+2] ; GET LOSERS JNAME
.OPEN SYSI,USRF
FATAL VALRET OPEN OF INF FAILED (VALRET)
TLZ A,-1 ;ZERO LEFT HALF FOR ACCESSING
.ACCES SYSI,A ;SET ADDRESS TO READ VALRET STRING
.USET SYSI,[.RMEMT,,B] ; GET TOP OF INF CORE
SUB A,B ; GET -DIST FROM VAL TO TOP
CAMG A,[-COMLNG] ; KEEP LESSER OF THAT AND BUFLEN
MOVEI A,-COMLNG ; FORCE TO BUFFER SIZE
HRL B,A ; PUT IN LEFT HALF
HRRI B,COMMND ; POINT TO COMMAND BUFFER
.IOT SYSI,B ;MOVE STRING OVER
TLO FF,VALCOM ;SET TO SCAN
MOVE COMPTR,[440700,,COMMND] ;RESET COMMAND SCANNER
.CLOSE SYSI,
;****** .LISTEN TYIC, ;WAIT FOR TTY QUIET
;****** TLNN FF,RDF ;DO NOT RESET IF READING ILE
.RESET TYIC,
TLZ FF,CRLF ; MAKE NO ASSUMPTIONS
JRST BEG
VALRE1: PSIX [SIXBIT /.VALUE/]
JRST PRTPC
CTLZEE: TLZ FF,SILENC
PASC [ASCIZ / back to MONIT/]
JRST FLSHI ; FLUSH INPUT AND TYPE ?
CKDIE: .DIETIM A, ;GET TIME TIL SYS DOWN
JUMPL A,.+3 ;NO DYING NOW
pushj p,ptime ;convert and print time period
PASCR [ASCIZ / 'til sys down./]
POPJ P,
time: pasc [asciz /Today is /]
.rdate d,
psix d
pasc [asciz /îIt is now /]
.rtime d,
psix d
pasci ^M
.rdtime a,
pushj p,ptime
pascr [asciz / since sys up'd./]
pushj p,ckdie
jrst beg
ptime: IDIVI A,30.*60.*60. ;HOURS IN A
IDIVI A+1,30.*60. ;MINS IN A+1
IDIVI A+2,30. ;SEC IN A+2
PDECI (A) ;PRT HRS
PASCI ":
PDECI 2,(A+1) ;PRT MINS
PASCI ":
PDECI 2,(A+2) ;PRT SECS
popj p,
CONSTANTS
INFORM \.,TOP OF PURE
IMPURE
DELCH: ASCIZ / /
DELIN: ASCIZ /H]/
STARTA: 0
LOGNAM: 0
DSKNAM: 0 ;CURRENT USER FOR LOGIN, "USER"
SYSF: SIXBIT / $SYSTS /
LSTF: SIXBIT / DSK.FILE.(DIR) /
ERRF: SIXBIT / ERR # /
VARIABLES
COMMND: ;HERE STARTS COMMND,IO BUFFER
COMLNG==30 ;WDS FOR COMMAND
STARTU: MOVE P,[-PDLLNG,,PDL-1]
.OPEN TYOC,[SIXBIT / 1TTYMONITRTTYOUT/] ; DISPLAY, UNIT ASCII OUT
JRST ENDLOG ; NO TTY, LOGOUT IMMEDIATE
.OPEN TYIC,[SIXBIT / TTYMONITRTTYIN/]
FATAL CANT OPEN TTY INPUT (STARTUP)
MOVEI FF,0 ;RESET ALL FLAGS
.STATUS TYIC,A
TRNE A,2 ;IS IT GE-BITER ? (DISPLAY)
TLO FF,IMLACF ; SET CONSOLE AS IMLAC, FOR SEXY RUBOUT (SEE "RUB")
PASCI ^M ;CLEAR LINE
PSIX [SIXBIT /MONIT./]
PSIX [.FNAM2]
PASCI ^M ;CR
PUSHJ P,CKDIE ;CHECK IF SYS GOING DOWN
MOVEI A,221561 ;MASK WORDS FOR INTERRUPTS
;****** CHRTYP DPMPV ILLINS SYSDIE IOCHNER MPVINF MPV PDLOV + BAD42 _Z .VALUE .BREAK _N
MOVSI A+1,1 ;BIT FOR INFERIOR
.SETM2 A, ;SET MASKWDs
MOVEI USRF,(SIXBIT /USR/)
MOVEI PRTF,(SIXBIT /DSK/) ; SET UP INIT DEVICE
MOVSI PRTN1,(SIXBIT /@/)
MOVSI PRTN2,(SIXBIT /</)
.SUSET [.RUNAM,,LOGNAM] ; GET USER NAME
AOSE LOGNAM ; -1 NOT IN, SET TO ZERO
SOSA LOGNAM ; HERE IF LOGGED IN, RESTORE NAME, SKIP TO BEG
.OPEN PRTC,[SIXBIT / SYSSYSTEMMAIL/]
JRST BEG ; NO SYS MAIL
JRST XPRINT ; YES, THERE IS, PRINT IT
CONSTANTS
VARIABLES
TBLOCK=COMMND+COMLNG ; LEAVE COMMAND BUFF SEPARATE
IFL .-TBLOCK-8,LOC TBLOCK+8
INFORM \.,TOP OF IMPURE
END STARTU