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