From 8d2eb9bd16f1184be21b0bfcc41ee4fdb05f19a6 Mon Sep 17 00:00:00 2001 From: Adam Sampson Date: Mon, 18 Jun 2018 16:04:57 +0100 Subject: [PATCH] MONIT - lightweight ATSIGN HACTRN replacement. Jack Haverty wrote on its-hackers: > On MIT-DM, the most commonly used top-level program was called > "monit". It was used by most people instead of DDT because it required > less memory, which was a very scarce and precious commodity in the > early 70s before paging and swapping. In fact there was a lot of peer > pressure to use monit unless you had a very good reason to use DDT. This is a very old source file -- AI: SYSENG; MONIT 114 is listed in MAPS in 1971-04. Development happened on DM; "Scenarios for Using Arpanet at the International Conference on Computer Communication" has a 1972-09 transcript showing MONIT 192 on DM. The binary SYS; TS MONIT is listed on AI, MC and ML from 1971 to 1983 in MAPS, although it doesn't survive in the AI/MC KS10 dumps. A 1981 message to BUG-ITS from ED@MIT-ML suggests it was an old version: > ML:SYS;TS MONIT [...] does not have symbols nor the correct start > address (1300). It is pretty badly broken, but great fun to play with > nevertheless. --- build/misc.tcl | 4 + doc/programs.md | 1 + src/syseng/monit.114 | 893 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 898 insertions(+) create mode 100644 src/syseng/monit.114 diff --git a/build/misc.tcl b/build/misc.tcl index 020deab0..630db857 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -1110,3 +1110,7 @@ expect ":KILL" # GEORGE respond "*" ":midas sys3;ts george_syseng;george\r" expect ":KILL" + +# MONIT +respond "*" ":midas sys;ts monit_syseng;monit\r" +expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index d3f10d67..7b9e4c86 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -143,6 +143,7 @@ - MLDEV/MLSLV, allows access to remote systems as devices (e.g. DB:). - MLIFE, Mike Speciner's Conway Life. - MODEMS, modems dragon. +- MONIT, lightweight ATSIGN HACTRN replacement without debugging support. - MSEND, send to many users. - MSPLIT, split a file into smaller parts. - MTBOOT, make bootable tapes. diff --git a/src/syseng/monit.114 b/src/syseng/monit.114 new file mode 100644 index 00000000..e311a224 --- /dev/null +++ b/src/syseng/monit.114 @@ -0,0 +1,893 @@ + 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) + .LOGIN B, + 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 + +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