diff --git a/Makefile b/Makefile
index bca86889..b6049127 100644
--- a/Makefile
+++ b/Makefile
@@ -11,7 +11,7 @@ SRC = system syseng sysen1 sysen2 sysen3 sysnet kshack dragon channa \
jim jm jpg macrak maxdoc maxsrc mrg munfas paulw reh rlb rlb% share \
tensor transl wgd zz graphs lmlib pratt quux scheme gsb ejs mudsys \
draw wl taa tj6 budd sharem ucode rvb kldcp math as imsrc gls demo \
- macsym lmcons
+ macsym lmcons dmcg
DOC = info _info_ sysdoc sysnet syshst kshack _teco_ emacs emacs1 c kcc \
chprog sail draw wl pc tj6 share _glpr_ _xgpr_ inquir mudman system \
xfont maxout ucode moon acount alan channa fonts games graphs humor \
diff --git a/build/misc.tcl b/build/misc.tcl
index 630db857..301d05b2 100644
--- a/build/misc.tcl
+++ b/build/misc.tcl
@@ -1112,5 +1112,7 @@ respond "*" ":midas sys3;ts george_syseng;george\r"
expect ":KILL"
# MONIT
-respond "*" ":midas sys;ts monit_syseng;monit\r"
+# The ERROR lines printed during assembly are locations of unlikely
+# runtime errors (e.g. not being able to open TTY:).
+respond "*" ":midas sys;ts monit_dmcg;monit\r"
expect ":KILL"
diff --git a/src/dmcg/monit.200 b/src/dmcg/monit.200
new file mode 100644
index 00000000..168cc62b
--- /dev/null
+++ b/src/dmcg/monit.200
@@ -0,0 +1,1144 @@
+ 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/
+ <&<777777000000>>+<&<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
+
\ No newline at end of file
diff --git a/src/syseng/monit.ats115 b/src/syseng/monit.ats115
deleted file mode 100644
index 3c85200e..00000000
--- a/src/syseng/monit.ats115
+++ /dev/null
@@ -1,897 +0,0 @@
- TITLE MONITOR AND MERRY MAKING
-
-;ACCUMULATOR DEFS
-FF==0 ;FLAG AC
-A=1
-B=2
-C=3
-D=4
-P=17 ;PUSH DOWN POINTER
-
-;FLAGS FOR FF REG
-USRUN==1 ;INFERIOR EXISTS
-VALCM==10 ;LOOKING AT .VALUE FROM INFERIOR
-CRLF==40 ;CR WAS LAST CHARACTER OUTPUT TO TTY
-RDF==200 ;READING COMMANDS FROM FILE
-ECHF==400 ;ECHO TYPING
-TTYGN==1000 ;TTY GIVEN AWAY
-INFIL==2000 ;FILE INPUT FOR LOAD OPEN
-OUTFLS==4000 ;OUTPUT STOPPED BY ^S
-
-;CHANNELS FOR I/O
-TYIC==1 ;TTY INPUT
-TYOC==2 ;TTY OUTPUT
-SYSI==3 ;INPUT OF PROGRAMS
-USRO==4 ;OUTPUT TO INFERIOR
-USRT==5 ;TEMPORARY SECOND INFERIOR
-PRTC==6 ;PRINT AND LISTF INPUT AND ERROR DEVICE
-CLAC==7 ;CLA INPUT
-CLIC==10 ;CLI OUTPUT
-
-PDLLNG==30
-COMLNG==24 ;WDS FOR COMMANDS
-BUFLNG==200 ;IO BUFF LNG
-
-ZZZ==.
- LOC 41
- JSR UUOH
- JSR TSINT
- LOC ZZZ
-
-DEFINE FATAL MESS
- JSP A,XFATAL
- INFOR2 \.,MESS
-TERMIN
-
-DEFINE INFORM N,MESS
- IF1,[PRINTC / N MESS
-/] TERMIN
-
DEFINE INFOR2 N,MESS
- IF2,[PRINTC / N MESS
-/] TERMIN
-
-FFSAV=5
-STARTA=6
-COMPTR=7
-LCMCHR=10
-LOGNAM=11
-LPOS=12
-BASE=13
-NOATTY: PSIXI (SIXBIT /ATY/) ;CFT - UNABLE TO GIVE CONSOLE TO INFERIOR
-QBEG: PASCR [ASCIZ /?/]
-QBUST: TLZ FF,RDF+ECHF+VALCM ;IN CASE _G'ED
-BEG: TLZ FF,OUTFLS
- .SUSET [.SPICL,,[-1]] ;? ? MAKE ME INTERUPT-PRONE
- MOVE P,[-PDLLNG,,PDL-1] ;FLUSH OUT PDL
- TLNN FF,VALCM ;VALRETED FROM PREV
- PUSHJ P,RCMD ;READ STRING IN
- PUSHJ P,SCMD ;SCAN COMMAND
- JUMPE B,.-2 ;COMMAND BLANK, TRY AGAIN
- PASCI ^M
- MOVE A,[-NUMCOM,,MYCOM]
- CAMN B,(A) ;CHECK FOR LOCAL COMMANDS
- JRST @1(A) ;FOUND
- AOBJN A,.+1
- AOBJN A,.-3 ;GET ANOTHER
-
- MOVEM B,SYSF+2 ;STORE SYS FILE NAME
- CAMN B,USRF+2
- PUSHJ P,USRCLO ;KILL CURRENT ONE FIRST
- MOVEM B,USRF+2 ;AND NAME TO CREATE
- TLZ FF,INFIL ;SHOW NO INFILE OPEN (IN CASE RE-OWN JOB)
-UOPEN: MOVEI A,7 ;SET MODE FOR USER FILE
- HRLM A,USRF ;IMAGE, BLOCK, OUTPUT
- TLNN FF,INFIL
- PUSHJ P,USROPE ;SEE IF DISOWNED - AND OPEN THE USER
- PUSHJ P,ALD ;LOAD THE FILE - SKIPPED IF RE-OWNED JOB
- .USET USRO,[.SUPC,,STARTA] ;SET INF PC TO START - MAY BE SKIPPED TOO
- .CLOSE SYSI,
- PUSHJ P,ATTY ;GIVE HIM THE CONSOLE
- .USET USRO,[.SUSTP,,BLANK] ;START INF
- JRST QBUST
-
-; MOVSI A,200000
-; .SLEEP A, ;RIP VAN WINKLE
-; JRST .-2 ;IN CASE 40 YRS PASS
-
-RCMD: SETZM LCMCHR
- TLNN FF,RDF ;READING
- JRST RCMD2 ;NO, TYPE
- TLNN FF,ECHF
- JRST RCMD3 ;NOT ECHO => NO TYPE
-RCMD2: .IOT TYOC,[15] ;CR IF (RDF OFF) OR (ECHF ON)
- .IOT TYOC,[";] ;PROMPT CHARACTER
-RCMD3: MOVE B,[440700,,COMMND] ;BEG INPUT
- MOVEM B,COMPTR ;SET COMMAND PTR
- MOVEI C,0 ;COUNTER
-RCMD1: .IOT TYIC,A ;GET CHAR
- CAIN A,33 ;ALT MODE
- JRST QBEG
- CAIN A,"?
- JUMPE C,PHELP ;INIT ? MEANS HELP
- TLNN A,-1 ;MAGIC EOF CONDITION
- CAIN A,^C ;EOF ON READ?
- JRST CLSRD ;YES, OPEN TTY
- CAIE A,^S
- CAIN A,^G ;BELL TO FLUSH LINE - DOESNT HAPPEN ON THIS LEVEL
- JRST RCMD1 ;IGNORE
- CAIN A,177 ;RUBOUT
- JRST RUB
- IDPB A,B ;STORE CHAR IN STRING
- CAML B,[350700,,COMMND+COMLNG-1] ;BYTE P TO END OF BUFF
- JRST RCFUL ;FULL BUFFER
- CAIL A,40 ;OUT FOR ANY CONTROL CHARACTER
- AOJA C, RCMD1 ;NO, GET MORE
-RCMDX: MOVEI A,0 ;YES, TERM WITH NULL FOR TYPE
- IDPB A,B
- TLZ FF,OUTFLS
- POPJ P, ;RETURN BEFORE POSSIBLE END OF FILE
-
-CLSRD: MOVEM A,LCMCHR
- TLZ FF,ECHF+RDF ;END OF READ
- .OPEN TYIC,TYIF ;SWITCH BACK TO TTY INPUT OF COMMANDS
- JSP A,ANALER ;ENDS UP BEING FATAL
-RCFUL: MOVEI A,15 ;END UP COMMAND
- IDPB A,B
- JRST RCMDX ;MUST BE END OF COMM
-
-RUB: SOJL C,RCMD ;IF RUBBED OUT EVERYTHING
- LDB A,B ;GET LAST INSERTED
- .IOT TYOC,A ;ECHO IT OUT
- ADD B,[070000,,] ;BUMP CH POINTER
- TLNE B,400000 ;AT WORD BOUND
- ADD B,[347777777777]
- JRST RCMD1
-
-SCMD: MOVE A,COMPTR ;SCAN COMMAND
- ILDB A,A
- CAIE A,": ;WAS FIRST CHAR A :
- JRST GETSYL
- PUSHJ P,GETCAT ;YES, IGNORE IT
- IBP COMPTR
- JRST GETSYL
-
-GETCCA: ILDB A,COMPTR ;FETCH COMM CHAR TO A
- CAIE A,^L ;FLUSH FORM FEED
- CAIN A,^J ;FLUSH LF
- JRST GETCCA
- CAIE A,^C ;EOF
- SKIPN A ;NULL AT END OF ASCIZ
- TLZ FF,VALCM+ECHF ;TURN OFF .VALUE READING
-GETCAT: TLNE FF,VALCM+ECHF
- JRST IOTA ;ECHO IF VALRET OR ECHO FLAG
- POPJ P, ;ELSE JUST RETURN
-; 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]]"
-
-SCNAME: PUSH P,[SIXBIT /@/] ;WORK SCRATCH ON STACK
- PUSH P,[SIXBIT /@/] ;NAME1,NAME2
- PUSH P,BLANK ;DEV
- PUSH P,BLANK ;USR
- MOVEI C,-3(P) ;INIT PTR TO N1
-SCNGET: PUSHJ P,GETSYL ;RET A,B <= BRKCHR,6BIT SYL
- SKIPN B
- JUMPL A,POPIT ;EMPTY SYLLABLE AT END OF LINE
- CAIN A,': ;CHECK WHICH BREAK
- MOVEM B,-1(P) ;MOVE SYL: TO DEVICE
- CAIN A,'; ;MOVE SYL; TO USR
- MOVEM B,0(P)
- JUMPG A,SCNGET ;NOT SPACE, GET MORE SYL(NOT CTL EITHER)
- CAIN C,-2(P) ;POINT TO NAME2?
- EXCH B,-3(P) ;YES, MOVE SYL1 TO NAME1
- MOVEM B,(C)
- JUMPL A,POPIT ;CTL TERMINATES
- CAIGE C,(P) ;ALSO 4 SYLS DOES
- AOJA C,SCNGET ;UP PTR, GET MORE
-POPIT: POP P,D ;USR;
- POP P,C ;DEV:
- POP P,A ;N1
- JRST GETSX ;N2
-
-;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,BLANK ;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 ;CANT ^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, ;BREAK IS LEFT IN A
-
-ALDLOS: MOVEI A,(SIXBIT /DSK/)
- HRRM A,SYSF
- .OPEN SYSI,SYSF ;TRY DSK:TS
- SKIPA
- JRST USRCAS ;FLUSH OLD ONE, OPEN NEW ONE
- MOVEI A,(SIXBIT /SYS/)
- HRRM A,SYSF
- .OPEN SYSI,SYSF ;NOW SYS:TS
- JSP A,ANALER
- JRST USRCAS ;FLUSH OLD ONE, OPEN NEW ONE
-
-ALD: TLZN FF,INFIL ;IS FILE OPEN ?
- PUSHJ P,ALDLOS ;CROCK !
-ALDO: PUSHJ P,GTWD ;READ BEGIN FILE
- JUMPE B,PURE ;PURE PROCEDURE !!
- CAME B,[JRST 1] ;CHECK FOR END OF LOADER
- JRST ALDO
-
-ALD1: PUSHJ P,GTWD ;GET CTL WD
- JUMPGE B,ALDJ ;JRST OR CTL
- MOVE C,B ;-N,,ADR
-ALD2: MOVE D,B
- CAMGE B,[-BUFLNG,,] ;CHECK FIT IN BUFF
- HRLI B,-BUFLNG ;USE OWN SIZE
- HRRI B,UBUF ;INBUFFER
- PUSHJ P,ALDRD ;GET BLOCK
- MOVEI A,(D)
- .ACCESS USRO,A ;BEGIN OUTPUT AT LD ADR
- MOVE A,B
- .IOT USRO,A ;MOVE BLOCK THERE
- SUB B,[-1,,]
- SUB B,D ;CHECK IF MORE IN LD BLK
- JUMPL B,ALD2 ;GET ANOTHR BUFF
- PUSHJ P,GTWD ;END BLOCK, GET SUM
- CAMN C,B ;CHECK
- JRST ALD1 ;LOAD NEXT BLK
- PSIXI (SIXBIT /CKS/)
- SKIPA
-EOF: PSIXI (SIXBIT /EOF/)
- .CLOSE SYSI,
- PUSHJ P,USRCLO ;FLUSH OUT JOB
- JRST QBEG ;WILL SCRATCH PDL
-
-ALDJ: HRRZM B,STARTA ;START IN FILE
- POPJ P, ;RETURN
-
-ALDRD: MOVE A,B
- PUSHJ P,GTWD1 ;READ BUFF
- MOVE A,B
- ROT C,1 ;ACCUM CHECK SUM
- ADD C,(A)
- AOBJN A,.-2 ;FOR WHOLE BUFF
- POPJ P,
-
-GTWD: HRROI A,B ;SINGLE WORD TO B
-GTWD1: .IOT SYSI,A ;BLOCK IN
- JUMPL A,EOF ;UNABLE TO READ DESIRED CT
- POPJ P,
-
-PURE: SETZM BLK
- .CALL CBLK ;GET SYSTEM TO LOAD THIS PURE PROCEDURE
- PSIXI (SIXBIT /CBK/)
- JRST ALD1
-
-CBLK: 400000,,0
- SIXBIT /LOAD/
- [USRO]
- [SYSI]
- 400000,,ARG3
-
-ARG3: -3,,BLK
-
-BLK: 0
- 0
- 0
-DEATH: TLNE USRUN
- PUSHJ P,DISOW
- JRST DEAT
-
-XFATAL: POCTI (A) ;MAY VERY WELL NOT OUTPUT ANYTHING
- PASCR [ASCIZ / FATAL ERR/]
-DEAT: .VALUE ;?? - MAY CAUSE RELOADING OF MONIT
- PSIXI (SIXBIT /DTH/)
- JRST QBEG ;IN CASE
-
-ANALER: TLNN FF,RDF ;ERR DURING READING
- JRST ANAL1 ;NO
- .OPEN TYIC,TYIF ;SWITCH BACK TO TTY FOR INPUT OF COMMANDS
- FATAL CANT RE-OPEN TTY
-ANAL1: TLZ FF,RDF+ECHF+VALCM ;ERROR => NO TAPE IN OR VALRET
- MOVEI A,@-2(A)
- PSIX (A) ;POINTS TO OPEN BLOCK
- PASCI ":
- PSIX 1(A) ;NAME1
- PASCI " ;SPACE
- PSIX 2(A) ;NAME2
- PASCI 40 ;SP
-
-ERR: .OPEN PRTC,[SIXBIT / ERR !/] ;OPEN ERROR COMMENT
- FATAL CANT OPEN ERROR DEVICE
-XPRINT: .IOT PRTC,A
- TLNN A,-1 ;MAGIC EOF?
- CAIN A,^C
- JRST BEG ;YES, FINISHED
- CAIE A,^L ;IGNORE FF
- PUSHJ P,IOTA ;PRINT SYSTEM COMMENT
- TLZN FF,OUTFLS
- JRST XPRINT
- JRST BEG
-
-USROPE: PUSHJ P,CKLOG ;MUST BE LOGGED IN
- .OPEN USRT,USRF ;NAME PTR IN A
- JSP A,ANALER ;YOU LOST
- .USET USRT,[.RMEMT,,A] ;ATTEMPT TO SEE IF REOWNED JOB
- CAIE A,2000
- JRST USRAT1 ;CERTAINLY
- .USET USRT,[.RUPC,,A] ;??
- TRNN A,-1
- JRST USRILT ;NO, NO SUCH REOWNED JOB EXISTS
-USRAT1: AOS (P) ;TO SKIP LOAD - SINCE JOB ALREADY EXISTS
- AOS (P) ;TO SKIP GIVING IT PC
- .CLOSE USRT, ;CLOSE TEMPORARY INFERIOR
-USRCAS: PUSHJ P,USRCLO ;
- .OPEN USRO,USRF ;FINALLY OPEN ON RIGHT CHANNEL
- JSP A,ANALER
- TLO FF,USRUN ;INDICATE THERE EXISTS ONE
- POPJ P,
-
-USRILT: .UCLOSE USRT, ;FLUSH TEMPORARY INFERIOR
- POPJ P,
-
-USRCLO: PUSHJ P,DTTY ;MAKE SURE TTY IS UP
- TLZE FF,USRUN ;CHECK IF ACTUALLY OPEN
- .UCLOSE USRO, ;YES, WIPE IT OUT
- POPJ P,
-
-ATTY: TLNE FF,USRUN ;CANT IF NO USR OPEN
- .ATTY USRO, ;TRY TO GIVE IT UP
- JRST NOATTY ;LOST
- TLO FF,TTYGN ;FLAG TTY GONE
- POPJ P,
-
-DTTY: TLZN FF,TTYGN ;SEE IF TTY GIVEN AWAY
- POPJ P, ;I GOT IT ALREADY
- .DTTY USRO, ;GOBBLE IT BACK
- FATAL CANT GET TTY BACK FM INF
- POPJ P,
-
-LISTF: PUSHJ P,SCARE ;OUTPUT FILE DIRECTORY
- JUMPN C,.+3
- CAME B,[SIXBIT /@/]
- MOVE C,B ;1ST ARG IS DEV IF NO :
- MOVE A,[SIXBIT /.FILE./]
- MOVE B,[SIXBIT /(DIR)/]
- PUSHJ P,SCARE1
- SKIPE C
- HLRM C,PRTF ;SET DEV
- HRRZS PRTF
- JRST PRNCOM
-
-PRINT: PUSHJ P,SCARE ;GET A,B,C,D = N1,N2,DEV,USR
- PUSHJ P,COMTTT
-PRNCOM: .OPEN PRTC,PRTF
- JSP A,ANALER
- JRST XPRINT
-
-LOAD: PUSHJ P,SCARE ;GET FILE NAME
- CAME A,[SIXBIT /TS/]
- CAMN A,[SIXBIT /@/]
- MOVE A,B
- CAMN A,USRF+2
- PUSHJ P,USRCLO ;KILL OLD ONE FIRST
- MOVEM A,USRF+2 ;'@' OR 'TS' FIRST NAME => SECOND FOR JOB NAME
- PUSHJ P,COMTTT
- MOVSI C,6
- HLLM C,PRTF ;SET BLOCK IMAGE INPUT
- .OPEN SYSI,PRTF
- JSP A,ANALER
- TLO FF,INFIL
- PUSHJ P,USRCAS ;FLUSH OLD INFERIOR, OPEN NEW ONE
- JRST UOPEN
-
-DELETE: PUSHJ P,SCARE
- PUSHJ P,COMTTT
- .FDELE PRTF ;SYS CALL DELETE
- JRST CANNOT ;OOPS, ERROR RET
- JRST BEG ;OK
-
-XFILE: PUSHJ P,SCARE ;READ COMMANDS FROM FILE
- TLO FF,RDF+ECHF ;FLAG READING
- PUSHJ P,COMTTT
- .OPEN TYIC,PRTF
- JSP A,.+2
- JRST BEG
- .OPEN TYIC,TYIF ;GET BACK TTY - COULDNT OPEN COMMAND FILE
- JSP A,ANALER ;COULDNT GET TTY - WILL BE FATAL ??
- JRST ANALER
-
-
-SCARE: PUSHJ P,SCNAME
-SCARE1: CAMN B,[SIXBIT /@/]
- JRST UNCHN ;IF HE DIDNT GIVE FILE NAME,USE OLD ONE ????
- MOVEM A,PRTF+1
- MOVEM B,PRTF+2
-UNCHN: SKIPE D ;CHANGE SNAME
- .SUSET [.SSNAME,,D]
- POPJ P,
-
-COMTTT: SKIPE C
- HLRM C,PRTF ;SET DEV
- HRRZ C,PRTF
- MOVEM C,PRTF
- CAIE C,(SIXBIT /TTY/)
- POPJ P,
- PSIXI (SIXBIT /DEV/)
- JRST QBEG
-
-LOGIN: PUSHJ P,GETSYL
- MOVEM B,USRF+1 ;SET NEW UNAME (? SO CAN HACK OTHERS DISOWNED PROCEDURES)
- .CALL LBLK
- JRST CANNOT
- MOVEM B,LOGNAM
- MOVEM B,COMPF+1
- MOVEI B,(SIXBIT /COM/)
- HRRM B,COMPF
- .OPEN PRTC,COMPF
- JRST BEG ;NO COM:USER MAIL
- JRST XPRINT
-
-LBLK: 400000,,0
- SIXBIT /LOGIN/
- 400000,,B
-
-DISOWN: PUSHJ P,CKRUN
- PUSHJ P,DISOW
- JRST BEG
-
-DISOW: .DISOWN USRO, ;DSN
- FATAL WONT DISOWN INFERIOR
- SETOM USRF+2 ;TO AVOID LOSSAGE ON REOWNING
- TLZ FF,USRUN
- POPJ P,
-
-CONTIN: PUSHJ P,CKRUN
- PUSHJ P,ATTY ;GIVE UP THE TTY
-PROCED: PUSHJ P,CKRUN
- .USET USRO,[.SUSTP,,BLANK] ;SEE HIM RUN !
- JRST BEG
-
-KILL: PUSHJ P,CKRUN
- PUSHJ P,USRCLO ;FLUSH JOB IF ANY
- JRST BEG
-
-CKLOG: SKIPE LOGNAM ;CHECK IF LOGGED IN
- POPJ P,
- PASC [ASCIZ /LOGIN/]
- JRST QBEG
-
-CKRUN: TLNE FF,USRUN ;CHECK IF JOB CURRENTLY EXISTS
- POPJ P,
- PASCR [ASCIZ /NO PROGRAM RUN/] ;JOB
- JRST BEG
-
- DEFINE COMTAB A,B
- SIXBIT /A/
- SIXBIT /B/+A
- TERMIN
-
-MYCOM: COMTAB HELP
- COMTAB LOGOUT
- COMTAB DELETE
- COMTAB FLAP
- COMTAB DISOWN
- COMTAB CONTIN
- COMTAB PROCED
- COMTAB KILL
- COMTAB LOAD
- COMTAB LISTF
- COMTAB PRINT
- COMTAB ERR
- COMTAB XFILE
- COMTAB LOGIN
- COMTAB DEATH
- COMTAB SEND
- COMTAB DDT
-NUMCOM==.-MYCOM ;COUNT FOR TABLE USES
-
-PHELP: POP P,A ;HMM FOR ?
-HELP: PASC [ASCIZ /COMMANDS /]
- MOVE A,[-NUMCOM,,MYCOM]
- PASCI 40 ;SPACE
- PSIX (A) ;TABLE ENTRY
- AOBJN A,.+1
- AOBJN A,.-3
- PASCI ^M ;CR TO END IT
- JRST BEG
-
-LOGOUT: .LOGOUT ;IF AT TOP LEVEL
- .VALUE [ASCIZ /:LOGOUT /] ;OTHERWISE
- PSIXI (SIXBIT /LOG/)
- JRST QBEG ;IN CASE
-
-FLAP: MOVE B,[.UDISMT A,]
-ACOMM: PUSHJ P,GETCCA ;GETCOMM CHAR TO A
- SUBI A,"0 ;MAKE ASCII TO UNIT #
- JUMPLE A,.+3 ;CHECK FOR VALID
- CAIG A,8
- XCT B ;DO IT
- SKIPA ;HMM!
- JRST BEG
-
-CANNOT: PASC [ASCIZ /CAN'T /]
- MOVEI A,0
- IDPB A,COMPTR ;FUDGE FOR ASC PRT
- PASCR COMMND
- JRST BEG
-
-DDT: .TRANDL TBLOCK ;UNTRANSLATE TO ATSIGN HACTRN
- PSIXI (SIXBIT /TRN/)
- JRST DEATH ; DISOWN AND GET CLASS ONE INTERUPT TO RELOAD
-
-
-TBLOCK: 0 ;UNAME
- SIXBIT /*/ ;JNAME
-
-UUOCT==0
-UUOTAB: JRST ILUUO
- IRPS X,,[PDEC PDECI POCT POCTI PSIX PSIXI PASC PASCI PASCR]
- UUOCT==UUOCT+1
- X=UUOCT_33
- JRST U!X
- TERMIN
-
-UUOMAX==.-UUOTAB
-
-UUOH: 0
- PUSH P,A
- PUSH P,B
- PUSH P,C
- MOVE A,LPOS
- CAIGE A,35. ;CHECK LINE POS
- JRST .+3
- MOVEI A,^M
- PUSHJ P,IOTA
- LDB A,[270400,,40] ;GET UUO AC,
- HRRZ B,40 ;AND ADR
- LDB C,[330600,,40] ;OP CODE
- CAIL C,UUOMAX
- MOVEI C,0 ;GRT=>ILLEGAL
- TLNN FF,OUTFLS
- JRST @UUOTAB(C) ;GO TO PROPER ROUT
- SKIPE C
- JRST UUORET
-ILUUO: MOVEI B,[ASCIZ /ILLGL UUO/] ;ILUUO
-UPASCR: SKIPA C,[15] ;CR FOR END OF TYPE
-UPASC: MOVEI C,0 ;NO CR
- 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
-UUORET: POP P,C
- POP P,B
- POP P,A
- JRST 2,@UUOH
-
-UPASCI: MOVE A,B ;PRT ASCII IMMEDIATE
- PUSHJ P,IOTA
- JRST UUORET
-
-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
-IOTC: EXCH A,C
- PUSHJ P,IOTA
- EXCH A,C
- POPJ P,
-
-IOTA: CAIE A,^C
- TLNE FF,OUTFLS
- POPJ P,
- CAIN A,^J ;IS LF
- TLZN FF,CRLF ;IF AFTER CR
- .IOT TYOC,A ;TYPE OUT A
- AOS LPOS
- CAIE A,^M ;TYPE CR?
- POPJ P,
- .IOT TYOC,[^J] ;PUT OUT LF FOR CR
- TLO FF,CRLF ;AND FLG
- SETZM LPOS ;YES, ZERO
- POPJ P,
-TSINT: 0 ;MASK WD HERE
- 0 ;RETURN LOC
- PUSH P,A ;SAVE IN CASE
- MOVEM FF,FFSAV
- SKIPL A,TSINT ;IS IT INFERIOR PROBLEM ?
- JRST MONINT ;NO, MY OWN !
- .USET USRO,[.RPIRQ,,A] ;GET USER INT BITS
- .USET USRO,[.SPIRQ,,BLANK] ;FLUSH ALL ???
- TLO FF,USRUN ;IN CASE YOU DIDN'T KNOW !!
- TLZ FF,OUTFLS
- TRZE A,2 ;_Z TYPED AT INFERIOR
- TLO FF,TTYGN ;IN CASE YOU DIDN'T KNOW !!
- PUSHJ P,DTTY ;GET TTY BACK
- TRZE A,20 ;DISPLAY PROTECTION VIOLATION
- PSIXI (SIXBIT /DPV/)
- TRZE A,40 ;ILLEGAL INSTRUCTION
- PSIXI (SIXBIT /ILL/)
- TRZE A,200 ;.VALUE FROM INFERIOR
- JRST VALRET ;READ HIS STRING
- TRZE A,400 ;I/O CHANNEL ERROR
- PSIXI (SIXBIT /IOC/)
- TRZE A,2000 ;.BREAK
- PSIXI (SIXBIT /BRK/)
- TRZE A,20000 ;MEMORY PROTECTION VIOLATION
- PSIXI (SIXBIT /MPV/)
- TRNN A,-1
- JRST IFLUSH ;NOMORE INTS
- POCTI 6,(A) ;PRT RH ONLY
- PASC [ASCIZ / INTRPT FM INF/]
-IFLUSH: POP P,A ;GET OFF STACK
- .RESET TYIC,
- .DISMISS [QBEG] ;ALWAYS STOP HIM FOR INTERUPTING
-
-MONINT: PUSHJ P,DTTY
- TRZE A,2 ;_Z TYPED AT ME
- PASCI ^Z
- TRZE A,1 ;CHARACTER TYPED
- PUSHJ P,TYILK
- TRNE A,-1
- TLZ FF,OUTFLS ;IF ANY BUGS TO REPORT ABOUT
- TRZE A,100 ;FIVE MINUTES
- PUSHJ P,CKDIE ;PRINT DOWN MESS
- TRZE A,1000 ;NO INF CORE
- JRST NOCORA
- TRZE A,400000 ;CLI INTERUPT
- PUSHJ P,GULPMS
- TRNN A,-1
- JRST NOCORB
- POCTI 6,(A) ;PRINT ERROR BITS
- PASC [ASCIZ / INTRPT /]
- MOVE A,TSINT+1
- POCTI 6,(A)
- JRST IFLUSH ;YES, FLUSH-SINCE IT WASNT STANDARD INTERUPT
-
-NOCORB: MOVE A,FFSAV
- TLNE A,TTYGN ;WAS IT GONE AT INTERUPT TIME ?
- PUSHJ P,ATTY ;GIVE TTY BACK TO INF
- POP P,A
- .DISMISS TSINT+1 ;GO ON - I SERVICED IT OK
-
-NOCORA: PSIXI (SIXBIT /COR/)
- JRST IFLUSH
-
-GULPMS: .OPEN CLAC,[SIXBIT / "CLA/]
- POPJ P, ;MIGHT WANT TO BARF
- PUSH P,A
- PASCI ^M
- PASC [ASCIZ /MESSAGE FROM /]
- PUSHJ P,REDONE
- PSIX ONEWRD
- PASCI "
- PUSHJ P,REDONE
- PSIX ONEWRD
- PASCI ^M
-GULPM1: PUSHJ P,REDONE
- PASC ONEWRD
- JRST GULPM1
-
-REDONE: HRROI A,ONEWRD
- .IOT CLAC,A
- SKIPL A
- POPJ P,
- SUB P,[1,,1]
-CLOCRR: .CLOSE CLAC,
- PASCI ^M
- JRST POPAJ
-
-SEND: PUSHJ P,GETSYL ;GET LOSER NAME
- MOVEM B,CLIFN1
- MOVEM B,CLUFN1
- .OPEN CLIC,CLUFNB ;SEE IF LOGGED IN
- JRST CLSNDB ;NO
- .CLOSE CLIC,
- .OPEN CLIC,CLIFNB
- JSP A,ANALER
-SEND1: ILDB A,COMPTR ;SEND STUFF ON CLI
- .IOT CLIC,A
- CAIE A,^M
- JRST SEND1
- MOVE A,LCMCHR
- CAIN A,^C
- JRST DONCLI
- MOVE A,CLUFN1
- CAMN A,LOGNAM ;TO SELF ?
- JRST DONCLI ;BARF ! GROSS DANGER !
- PUSHJ P,RCMD ;GET MORE UNTIL GET EOF
- .IOT CLIC,[^M]
- JRST SEND1
-
-DONCLI: .CLOSE CLIC,
- JRST BEG
-
-CLSNDB: PASCR [ASCIZ /NOT LOGGED IN/]
- JRST BEG
-
-CLIFNB: 1,,(SIXBIT /CLI/)
-CLIFN1: .
- SIXBIT /HACTRN/
-
-CLUFNB: (SIXBIT /USR/)
-CLUFN1: .
- SIXBIT /HACTRN/
-ONEWRD: 0
-BLANK: 0 ;AND ANOTHER TO STOP ASCIZ
-
-TYILK: PUSH P,A
- MOVEI A,TYIC
- .ITYIC A,
- JRST POPAJ
- CAIN A,^G
- JRST FLSTYO
- CAIE A,^S
- JRST POPAJ
- TLO FF,OUTFLS ;INDICATE OUTPUT FLUSHAGE
- .RESET TYOC,
- JRST POPAJ
-
-FLSTYO: .RESET TYOC,
- .IOT TYOC,[7] ;ECHO THE CNTRL G
- JRST IFLUSH ;PDL WILL GET RESET LATER
-
-VALRET: .USET USRO,[.RSV40,,A]
- TRNN A,-1
- JRST VALRE2 ;ZERO ADDRESS
- MOVEI B,6
- HRLM B,USRF ;SET MODE TO IMAGE, BLOCK, INPUT
- .OPEN SYSI,USRF
- JSP A,ANALER
- .ACCES SYSI,A ;?
- MOVE B,[-COMLNG,,COMMND]
- .IOT SYSI,B ;MOVE STRING OVER
- TLO FF,VALCM ;SET TO SCAN
- MOVE B,[440700,,COMMND] ;RESET COMMAND SCANNER
- MOVEM B,COMPTR
- .CLOSE SYSI,
-VALRE1: POP P,A
- .RESET TYIC,
- .DISMISS [BEG] ;JRST BEG
-
-VALRE2: PSIXI (SIXBIT /VAL/)
- JRST IFLUSH
-
-CKDIE: PUSH P,A
- .DIETIM A, ;GET TIME TIL SYS DWN
- JUMPL A,POPAJ ;NO DYING NOW
- PUSH P,B
- PUSH P,C
- PUSH P,D
- 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
- PASCR [ASCIZ / UNTIL SYS DWN/]
-POPDJ: POP P,D
-POPCJ: POP P,C
-POPBJ: POP P,B
-POPAJ: POP P,A
-POPJP: POPJ P,
-
-COMPF: SIXBIT / SYSSYSTEMMAIL / ;FOR MAIL PRINT, SET FOR USER WHEN LOGIN
-SYSF: SIXBIT / &SYSTS /
-USRF: SIXBIT / 'USR /
-TYIF: SIXBIT / (TTYMONITRTTYIN /
-PRTF: SIXBIT / DSK / ;EXTRA LONG FOR DELETE
-
- CONSTANTS
- VARIABLES
-
-;OVERLAYED BY COMMANDS LATER ON AND PART OF I/O BUFFER (FOR LOADING PROGS)
-
-COMMND: ;HERE STARTS COMMND,I/O BUFFER
-
-STARTU: .CLOSE 3,
- .SUSET [.RJNAME,,A] ;THIS GETS OVERLAYED
- CAME A,[SIXBIT /HACTRN/]
- .VALUE [ASCII /:DDT ISYS ATSIGN HACTRN SYS TS MONITîU./]
- ;FLUSH UNLESS TOP LEVEL
- MOVE P,[-PDLLNG,,PDL-1]
- .OPEN TYOC,[SIXBIT / !TTYMONITRTTYOUT/]
- JRST LOGOUT ;FLUSH IMMEDIATE IF CANT TYPE
- .OPEN TYIC,TYIF
- FATAL CANT OPEN TTY INPUT
- TLZ FF,-1 ;RESET ALL FLAGS
- .STATUS TYIC,A
- TRNE A,2 ;IS IT GE-BITER ?
- PASCI ^L
- PASCI ^M
- PSIX [.FNAM1]
- PASCI ".
- PSIX [.FNAM2]
- .SUSET [.RUINDEX,,A] ;GIVE USER INDEX
- PASC [ASCIZ / U=/]
- POCTI (A)
- PASCI ^M ;CR
- PUSHJ P,CKDIE ;CHECK IF SYS GOING DOWN
- MOVEI A,621561 ;MASK WORDS FOR INTERRUPTS
-; CHRTYP DPMPV ILLINS SYSDIE IOCHNER MPVINF MPV PDLOV + BAD42 _Z .VALUE .BREAK _N CLI
- MOVSI A+1,1 ;BIT FOR INFERIOR
- .SETM2 A, ;SET MASKWDS
-
- .SUSET [.RUNAM,,B] ;GET USERS NAME
- AOJE B,STAR1 ;JUMP IF NOT LOGGED YET
- SOS B
- MOVEM B,LOGNAM ;ALREADY LOGGED IN IF NOT -1
- JRST BEG
-
-STAR1: .OPEN PRTC,COMPF
- JRST BEG ;NO SYS:SYSTEM MAIL
- JRST XPRINT ;YES, THERE IS, PRINT IT
-
- CONSTANTS
- VARIABLES
-
- INFORM \.-STARTU,STARTUP LENGTH
-
-;MIGHT WANT TO PUT UBUF IN TRANSIENT SECOND BLOCK OF CORE IF WE NEED MORE SPACE.
-
-UBUF=COMMND+COMLNG ;LEAVE COMMAND BUFF SEPARATE
-IFL .-UBUF-BUFLNG,LOC UBUF+BUFLNG
-
-PDL: BLOCK PDLLNG
-
- INFORM \NUMCOM/2,NUMBER OF COMMANDS
-
- INFORM \.,PROG LENGTH
-
- END STARTU
-.VALUE FROM INFERIOR
- JRST VALRET ;READ HIS STRING
- TRZE A,400 ;I/O CHANNEL ERROR
- PSIXI (SI
\ No newline at end of file