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 /