From e2fe757d6aa9384f332da9d14d8c356eb6226ad5 Mon Sep 17 00:00:00 2001 From: Adam Sampson Date: Thu, 26 Jul 2018 15:24:22 +0100 Subject: [PATCH] MONIT 200. This version is dated 1972-12-21 in a comment, and works on current ITS without modification. --- Makefile | 2 +- build/misc.tcl | 4 +- src/dmcg/monit.200 | 1144 +++++++++++++++++++++++++++++++++++++++ src/syseng/monit.ats115 | 897 ------------------------------ 4 files changed, 1148 insertions(+), 899 deletions(-) create mode 100644 src/dmcg/monit.200 delete mode 100644 src/syseng/monit.ats115 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 / 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