;X1CMD.MAC;41 16-DEC-75 16:46:15 EDIT BY PLUMMER ; 1.54 ; ADD DOBE'S IN M..CHK AND P..CHK TO ENSURE MSG NOT LOST ;X1CMD.MAC;39 30-SEP-75 10:44:16 EDIT BY PLUMMER ; MAIL CHECK BUMPS CHECK TIME FOR MAIL WATCH ;X1CMD.MAC;37 19-SEP-75 10:22:26 EDIT BY PLUMMER ; REDO LOGIN NOTICES, AND SHUTDOWN WARNING CHECK STRATEGY ; FLUSH MESMES MESS ;X1CMD.MAC;33 17-SEP-75 16:02:36 EDIT BY PLUMMER ; MAIL, PRINTER, AND DOWNTIME CHECKS AT LOGOUT ; GIVE NICE ERROR FOR FAILING LGOUT(N) ; CHECK ENTRY VECTOR LENGTH OF IDDT/BDDT MORE CAREFULLY ;X1CMD.MAC;28 16-SEP-75 17:06:10 EDIT BY PLUMMER ; MAKE $START CHECK ENTRY VECTOR LENGTH TO AVOID SFRKV BLOW UP ; BEGIN WORRYING ABOUT LACK OF GETAB CAPABILITY ; PARC CHANGES ... ; DEFAULT DIRECTORY FOR CONNECT. ; SAVE USERS MODE BITS FOR WHATEVER USE YOU MAY WANT. ; DEFAULT TO "MAIL WATCH ON" ; STRINGS OF DIGITS ARE CONSIDERED NUMERIC ACCOUNT DESIGNATORS EVEN ; EVEN THOUGH IT MAY BE A STRING ACCT USER. (IS THIS RIGHT?) ; BETTER JOB COUNTER ;X1CMD.MAC;23 14-JUL-75 14:15:04 EDIT BY PLUMMER ; USE JOBNM2 IN "WHERE" ;X1CMD.MAC;22 4-JUN-75 11:09:51 EDIT BY PLUMMER ; ADD USRCHK ROUTINE IN LOGIN ;X1CMD.MAC;21 31-MAR-75 11:34:29 EDIT BY PLUMMER ; FLUSH CHECK FOR PIE SLICE SYSTEM IN ACCT2+ ;X1CMD.MAC;20 27-MAR-75 11:05:32 EDIT BY PLUMMER ; REPAIR ACCT. DEFAULT CASE WHEN NO DEFAULT EXISTS ;X1CMD.MAC;19 27-MAR-75 10:26:51 EDIT BY PLUMMER ; FIX A $RESET4 BACK TO RESET4 ;X1CMD.MAC;17 17-MAR-75 10:46:14 EDIT BY PLUMMER ; RESET BECOMES $RESET FOR MACRO 50 ; WAIT BECOMES $WAIT FOR MACRO 50 ; RFORK BECOMES LFORK FOR MACRO 50 ;X1CMD.MAC;16 5-MAR-75 14:08:37 EDIT BY PLUMMER ; MOVE IN ..LOGO FROM X4CMD ;X1CMD.MAC;12 30-JAN-75 18:00:11 EDIT BY PLUMMER ; "CHANGE PASSWORD" REQUIRES NEW PASSWORD TO BE INPUT TWICE ;X1CMD.MAC;10 13-JAN-75 12:06:02 EDIT BY PLUMMER ; CHANGE MSG FOR FORK TERMINATION DUE TO CHN 20. INTERRUPT ;X1CMD.MAC;2 5-JAN-75 20:28:53 EDIT BY PLUMMER ;1.53 ;X1CMD.MAC;7 31-DEC-74 10:46:02 EDIT BY PLUMMER ; USE SPRTR IN "ACCESS" (PARC) ; MESMES SETS DWNMSF (PARC) ;X1CMD.MAC;6 17-DEC-74 16:04:33 EDIT BY PLUMMER ; NEW "ACCT" ROUTINE ; "CHANGE ACCOUNT" TYPES PREVIOUS ACCOUNT ;X1CMD.MAC;3 17-DEC-74 10:13:18 EDIT BY PLUMMER ; REMOVE PRIVILEDGED COMMANDS TO X4 ;X1CMD.MAC;1 2-DEC-74 10:17:24 EDIT BY PLUMMER ; 1.52 ;X1CMD.MAC;52 25-NOV-74 11:39:45 EDIT BY PLUMMER ; CHANGE RECONF LOGIC IN ^ESET ;X1CMD.MAC;51 22-NOV-74 22:16:03 EDIT BY PLUMMER ; "BREAK" NO LONGER IMPLIES "REFUSE" ; "ENABLE" NO LONGER DOES "BREAK" OR "REFUSE" ;X1CMD.MAC;49 21-NOV-74 21:14:33 EDIT BY PLUMMER ; CONVERT TO $SYSGT ; CHECK OPNX3 IN GETILI ;X1CMD.MAC;47 18-SEP-74 14:20:41 EDIT BY PLUMMER ; ADD TEST FOR PIE SLICE IN ACCT ;X1CMD.MAC;46 11-SEP-74 16:09:12 EDIT BY PLUMMER ; EOL AT LOGIN7 ;X1CMD.MAC;45 5-SEP-74 17:41:22 EDIT BY PLUMMER ; CROCK PIE SLICE STUFF ;X1CMD.MAC;43 13-JUL-74 19:29:49 EDIT BY PLUMMER ; CHANGE ACCOUNT INVALID ERROR TEXT ; ADD "DUE TO" TO "HALT", AND CHANGE DWNTIM ROUTINE ; "ACCOUNT" TAKES LIST OF FILES ; 2 PLACES TO LOOK FOR SYSTEM LOGIN MESSAGES ; "MAIL CHECK" AND "PRINTER CHECK" DEFAULT TO LOGIN DIRECTORY ;X1CMD.MAC;39 25-JUN-74 22:19:04 EDIT BY PLUMMER ; FIX CALLS TO PASWD IN ATTACH AND CONNECT ;X1CMD.MAC;37 21-JUN-74 15:57:55 EDIT BY PLUMMER ; REDO PASSWORD STUFF FOR CHANGE PASSWORD ;X1CMD.MAC;12 19-JUN-74 22:58:27 EDIT BY PLUMMER ; JOB COUNT IN LOGIN AND LOGOUT ;X1CMD.MAC;10 19-JUN-74 17:43:23 EDIT BY PLUMMER ; "ACCESS" COMMAND ;X1CMD.MAC;32 18-JUN-74 14:08:12 EDIT BY PLUMMER ; "PRINTER WATCH/CHECK" ;X1CMD.MAC;30 17-JUN-74 23:11:56 EDIT BY PLUMMER ; PRINT "PREVIOUS LOGIN" MSG (AN INSECURITY CONSIDERATION) ; CALL BREAK2 IN LOGOUT ; "LOGOUT" FROM INFERIOR EXEC (PARC) ; "CHANGE ACCOUNT" AND "CHANGE PASSWORD" ; MAKE "DELETE" AVOID PERPETUAL FILES ; "PERPETUAL " AND "NOT PERP ..." ; "BREAK" DOES AUTOMATIC "REFUSE" ; "ENABLE" DOES AUTO "BREAK" AND "REFUSE" ;X1CMD.MAC;23 11-JUN-74 23:35:39 EDIT BY PLUMMER ; SPELL RFRKH RIGHT IN "RESET" ; "MAIL WATCH ON/OFF", "MAIL CHECK " ;X1CMD.MAC;21 3-JUN-74 16:55:06 EDIT BY PLUMMER ; SWITCH TO FOR ARCHIVE-LOOKUP PROGRAM ;X1CMD.MAC;20 23-APR-74 10:52:19 EDIT BY PLUMMER ; CHANGE HALF DUPLEX PASSWORD MASK TO HAVE SPACE AFTER CR FOR NVT'S ;X1CMD.MAC;19 10-APR-74 13:05:04 EDIT BY PLUMMER ; "EXPUNGE ALL" AND "EXPUNGE DELETED" FLUSH NON-EXISTENT FILES TOO ;X1CMD.MAC;1 22-MAR-74 16:53:46 EDIT BY PLUMMER ; MAKE QURE "RESET" ACTUALLY RELEASE ALL FORK HANDLES ; FIX "NO MESSAGES YOU HAVE A MESSAGE" BUG ;X1CMD.MAC;16 19-MAR-74 14:15:35 EDIT BY PLUMMER ; USED EVECL PARAMETER IN .EDDT ;X1CMD.MAC;15 11-FEB-74 15:01:08 EDIT BY PLUMMER ; TAGS, ETC FOR SRI-ARC ;X1CMD.MAC;12 24-JAN-74 10:51:22 EDIT BY PLUMMER ; LOGIN CHECK ;X1CMD.MAC;10 14-NOV-73 11:50:30 EDIT BY PLUMMER ; REQUIRE CONFIRMATION FOR ^E SET IF SUSPICIOUS ;X1CMD.MAC;9 8-NOV-73 14:09:35 EDIT BY PLUMMER ; "RESET" USES KFORK(-4), DOES STATUS CHECK ON IO REDIR. JFNS ;X1CMD.MAC;8 31-OCT-73 10:37:57 EDIT BY PLUMMER ; ADD TIMPSC ROUTINE FOR ^T REDO ;X1CMD.MAC;7 16-OCT-73 21:15:55 EDIT BY PLUMMER ; "EDIT" AVOIDS CHANGING AUTHOR ;X1CMD.MAC;6 12-OCT-73 13:45:03 EDIT BY PLUMMER ; NEW "IDDT", "BDDT" COMMANDS, CHANGES TO $RESET ;X1CMD.MAC;72 2-OCT-73 13:09:31 EDIT BY PLUMMER ; 1.51 ;X1CMD.MAC;36 28-SEP-73 15:30:11 EDIT BY PLUMMER ; "WHERE" TYPES UNKNOWN HOST NUMBER IN DECIMAL ; SWITCH TO NEW "INTERROGATE" CODE ; "ACCOUNT" DEFAULTS TO DEFAULT ACCT OF LOGIN DIR ; MAKE INVALID ACCOUNTS AN ERROR ; CHKDAT DOES GTJFN RATHER THAN CALL TRYGTJ SO ERROR ARE HANDLED RIGHT ; USE %M TO TYPE DEFAULT ACCOUNT ; ADD CHECK OF DATE INPUT VS FACT FILE WRITE IN ^E SET AND MAIN LOOP ; REPAIR STRING ACCT LOGIC ; FIX BUGS IN NEW USER-ACCT VALIDATION STUFF ; SWITCH TO .JBXXX FOR 10/50 JOB DATA AREA ; ^E EDDT PASSES UNDEFINED TABLE TO DDT ; INSERT "NO" ROUTINE ; MAKE "IDDT" ROUTINE LOOK AT F1 FOR "NO" ; ACCOUNT VALIDATION ; "BREAK" CLEARS ADVISE LINKS ALSO ; "QUIT" FROM TOP-LEVEL EXEC USES JSYS 777 TO CALL MINI-EXEC ; TEST OF INFERIORNESS USES GFRKH IF IMPLEMENTED ; MAX "FORK" NUMBER IS 17 (BUGFIX) ; INSTALL ADVISE STUFF ; MOVE TTY NUMBER STUFF OUT OF LINK AND INTO XSURBS ; ADDED GRACEFUL ERROR COMMENTS TO RENAME FAILURES ; ADD SUBCOMMANDS TO "EXPUNGE" ; ERROR MESSAGE FORK FAILING CFORK ; CHANGE NOISE ON "GET", "MERGE", AND "RUN" ; REDO "EXEC" TO USE EPHEMERAL MECHANISM ; ADD "EPHEMERAL", "NOT EPHEMERAL" ; ALL STUFF NEEDED FOR EPHEMERONS, SUCH AS IN $RESET ; INCLUDE ARCHIVE-PENDING CHECK IN "DELETE" (SHOULD BE DELF) ; UPDATE "INTERROGATE" ; "LOGOUT" DOES "EXPUNGE" BEFORE DISC ALLOCATION CHECK ; 1.50 ; CLEAN UP COMMENTS IN "GET" SO SOME INSTRUCTIONS SHOW THRU ; FIX LIMIT ON NUMBER OF RELATIVE FORK HANDLES IN "FORK" ; FIX FOR ^A AND ^R DURING OR AFTER PASSWORD INPUT ; MAKE "^E EDDT" RESET ENTRY VECTOR WITH LEN 3 ; TTY MODE CONTROL CHANGE ; FIX TYPEOUT IN "LINK" ; "IDDT" DOES A SETNM EVEN THOUGH PROBABLY NOT NEEDED ; GETAB LOSSAGE IN WHERE HANDLED GRACEFULLY ; BEFORE FOLDS LINE AT 65 INSTEAD OF 55 ; RESTORE TTY MODES AND SUBSYS NAME OF SUPERIOR AT "QUIT" ; CLEANUP XWD'S ; 1.49 ;X1CMD.MAC;12 14-JAN-73 15:06:09 EDIT BY PLUMMER ; ADDED UFORK TO REMEMBER WHICH INFERIOR HAS THE USER ; NEW "NO IDDT" ; "IDDT" AND "NO IDDT", MODS TO "RESET" AND $WAIT ROUTINES ; SETNM FOR PROGRAMS RUN FROM . FOR AUTO STARTUP ; FIXED EXTRANEOUS [CONFIRM] FROM SAVE AND SSAVE -- NEW ; GTJFN HANDLING OF EOL AGAIN. ; FIX "PROTECTION" ; DOWN TIME MESSAGE FORMAT CHANGES ; 1.48 ; DATE INPUT ROUTINE MOVED TO XSUBRS ; USE READMAIL.SAV TO PRINT SYSTEM LOGIN MESSAGE ; "YOU HAVE A MESSAGE" PRINTED ONLY IF WRITTEN SINCE LAST LOGIN ; "WHERE" NO LONGER SYSTEM DEPENDENT -- REQUIRES 'LHOSTN' GETAB ; "REWIND" AND "UNLOAD" COMMANDS ; A FEW NOISE WORDS ADDED ; HALT COMMAND -- AGAIN ; SHUTDOWN WARNING ROUTINE ; 1.47 ; "INTERROGATE" COMMAND ; 1.46 ; "WHERE" PRINTS FOREIGN HOST IF NET TTY. ; WIPE PASSWORD ON HALF DUPLEX SCOPE TERMINALS (LOGIN, ETC) ; EDIT COMMAND ; NEW LINK ROUTINE ; HALT COMMAND ; CONTROL-C TURNED OFF DURING $RESET ; LINK TO USER/TERMINAL ; WHERE UPDATED ; PDP-10 TENEX EXECUTIVE COMMANDS ROUTINES .DIRECTIVE XSRCVN %X1 %X1==%X1 ;ROUTINES TO DECODE AND EXECUTE SPECIFIC COMMANDS. ;DISPATCHED TO BY EXEC COMMAND INTERPRETER MAIN FILE (XMAIN.MAC). ;IN ALPHABETICAL ORDER BY COMMAND NAME. ;"ACCESS (TO FILES) (BY) SELF,GROUP,OTHERS (IS) READ,WRITE, ; EXECUTE,APPEND,PAGE-TABLE,UNUSED,ALL,NONE" .ACCES: NOISE CALL .INFG ;INPUT FILES LIST ALLOW TLPR!TALT!TSPC NOISE PUSH P,[0] ;TEMP ACCES1: TLO Z,NEOLF ;SAY DON'T ECHO EOLS KEYWD $ACCS1 T OTHERS,COMOK!NSPALT,000077 ;DEFAULT JRST CERR ANDI KWV,-1 ;FLUSH FLAGS IORM KWV,0(P) ;VALUE IS MASK ALLOW TCOM!TALT!TSPC TRNE CBT,TCOM ;SEPARATOR WAS COMMA? JRST ACCES1 ;COMMA, GET NEXT WORD ACCES2: ALTYPE ( ) NOISE PUSH P,[0] ;TEMP ACCE21: TLO Z,NEOLF KEYWD $ACCS2 T NORMAL,COMOK!EOLOK,52 JRST CERR ANDI KWV,-1 ;FLUSH FLAGS CAIE KWV,0 ;"NONE" CAIN KWV,52 ;"NORMAL" SETZM 0(P) ;CLEAR WHAT WAS SAID BEFORE IORM KWV,0(P) ;ACCUMULATE CALL SPRTR ;ANALYZE TERMINATOR JRST ACCE21 ;ANOTHER FIELD, PROCESS IT JRST ACCE21 ;COMMA, PROCESS NEXT FIELD CONFIRM ;EOL, GO ACCES3: POP P,E IMULI E,010101 POP P,F ;MASK MOVEI A,ACCE.T MOVEM A,ILIDSP ;SET TO CATCH BAD CHFDB CALL FRSTF ;TYPE FIRST FILE NAME ACCES4: HRRZ 1,@INIFH1 ;GET JFN DVCHR TLNN 2,(1B4) ;DISK? JRST [ ETYPE < %1H: DOES NOT HAVE PROTECTED FILES > JRST NEXTF] ;GET NEXT FILE, GO TO ACCES4 MOVSI 1,FDBPRT ;PROTECTION WORD HRR 1,@INIFH1 ;FORM INDEX,,JFN HRRZ 2,F ;ACCESS PATHS HRRZ 3,E ;PROTECTION TRNE 2,20000 ;TRYING TO CHANGE THIS BIT TO 0? TROE 3,20000 CAIA TYPE < 20000-BIT FORCED ON > HRLI 3,(5B2) ;MAKE IT NUMERIC CHFDB JRST NEXTF ;GET NEXT FILE, RETURN TO ACCES4 ;CHFDB WILL TRAP TO HERE ACCE.T: SETZM ILIDSP ;CANCEL THE TRAPPER ERROR $ACCS1: TABLE T ALL,COMOK,777777 T GROUP,COMOK,007700 T OTHERS,COMOK,000077 T SELF,COMOK,770000 TEND $ACCS2: TABLE T ALL,COMOK!EOLOK,77 T APPEND,COMOK!EOLOK,04 T EXECUTE,COMOK!EOLOK,10 T NONE,COMOK!EOLOK,00 T NORMAL,COMOK!EOLOK,52 T PAGE-TABLE,COMOK!EOLOK,02 T READ,COMOK!EOLOK,40 T UNUSED,COMOK!EOLOK!INVIS,01 T WRITE,COMOK!EOLOK,20 TEND ;ACCOUNT (OF FILE) (IS) .ACCOU: NOISE CALL .INFG ;INPUT FILE GROUP REPEAT 0,< ;SEE IF TARGET DIRECTORY SPECIFIES STRING OR NUMBER ACCOU0: MOVE A,CSBUFP MOVE B,CJFN1 HRLZI C,B5 ;DIRECTORY NAME ONLY, UNPUNCTUATED. JFNS ;GET STRING FOR DIRECTORY NAME> REPEAT 1,< ;SEE IF USER SPECIFIES STRING OR NUMERIC ACCT ACCOU1: GJINF MOVE B,A ;USER'S LOGIN DIRECTORY MOVE A,CSBUFP DIRST CALL SCREWUP> ACCOU2: MOVEI A,1 MOVE B,CSBUFP STDIR ;CONVERT BACK TO GET LEFT HALF BITS JRST CERR JRST CERR ALLOW TSPC!TALT!TLPR!TEOL NOISE CALL ACCT ;GET ACCOUNT NUMBER OR STRING, USING A. MOVE E,A ;SAVE THRU DVCHR'S CONFIRM CALL FRSTF ;PRINT NAME OF FIRST FILE IN GROUP ACCOU3: HRRZ 1,@INIFH1 ;GET THE JFN DVCHR HLRZS 1 CAIE 1,600000 ;DEVICE IS DSK: ? JRST [ UTYPE [ASCIZ / NOT A DISK FILE/] JRST NEXTF] ;DO NEXT, RETURN TO ACCOU3 HRRZ 1,@INIFH1 ;JFN MOVE 2,E ;ACCOUNT SACTF ;SET ACCOUNT OF FILE CALL [ CAIN 1,SACTX4 UERR [ASCIZ /NO ACCESS TO CHANGE ACCOUNT OF THAT FILE/] JRST SCREWUP] JRST NEXTF ;GNJFN, TYPE NAME, GO TO ACCOU3 ;"APPEND" IS WITH "COPY" IN X2CMD.MAC. ;ADVISE (USER) .ADVIS: NOISE (USER) CALL TTYNUM MOVEI 1,400000(1) ;FORM TTY DESIGNATOR TLO 1,(1B1) ;SET "ADVISE TO" FLAG ADVIZ CALL [ CAIN 1,ADVX4 ERROR CAIN 1,ADVX2 ERROR CAIN 1,ADVX1 ERROR JRST JERR] RET ;ASSIGN (AS) .ASSIG: NOISE (DEVICE) CALL DEVN ;READ DEVICE NAME, CHECK IT. ;ACCEPTS USUAL TERMINATORS, PLUS COLON PUSH P,A ;...RETURNS DEV DESGNATOR IN A, PUSH P,B ;...CHARACTERISTICS IN B, ;...JOB # ASS TO IN C. TLNN B,B3 ERROR <%1H: CANNOT BE ASSIGNED> TLNN B,B5 ;"AVAILABLE" BIT JRST [ TLNN B,B6 ;NOT AVAIL, ASSIGNED? UERR [ASCIZ /%1H: NOT AVAILABLE/] ;%H: DEV NAME UERR [ASCIZ /%1H: ALREADY ASSIGNED TO JOB %3Q/]] TLNE B,B6 $TYPE < [ALREADY ASSIGNED TO YOU] >; ADVISORY MSG, NOT ERROR LDB C,[POINT 9,A,17] CAIN C,12 ;DEVICE TYPE TTY? JRST [ MOVEI E,(A) ;MASK TTY # GJINF ;JOB'S CONT TTY # TO D CAMN D,E UERR [ASCIZ /YOU CAN'T ASSIGN YOUR CONTROLLING TERMINAL/] ;DVCHR B5 & B6 CLEAR FOR TTY THAT IS ANOTHER JOB'S ; CONTROLLING TTY. 11/25/70. MOVE A,['TTYJOB'] CALL $SYSGT ;GET # OF TABLE OF TTYS HRR A,B ;TABLE # HRL A,E ;TTY # IS TABLE INDEX GETAB ;GET TABLE WORD CALL JERR HLRZ C,A MOVE A,-1(P) ;DEV DESIG FOR ERROR MESSAGES CAIN C,-1 JRST .+1 ;TTY IS FREE IF -1 IN LH TBL WD JUMPG C,[UERR [ASCIZ /%1H: IS THE CONTROLLING TERMINAL FOR JOB %3Q/]] ;POSITIVE: JOB # UERR [ASCIZ /%1H: BUSY/]] ;-2: BEING ASSIGNED ;B0+JOB # ASSIGNED TO ALSO GETS THIS ;IF FOR SOME REASON ABOVE CHECKS FAIL. SETZ B, ;INDICATES NO SYNONYM TRNE CBT,TEOL JRST ASSIG3 ;CR, NO SYNONYM FIELD NOISE ;ASSIGN... ;NEXT FIELD, IF NOT NULL, IS LOGICAL NAME (SYNONYM). TLO Z,PUNCF CALL CSTR CAIG CNT,1 JRST [ TLO Z,BAKFF ;NULL, NO LOG NAME. B 0. JRST ASSIG3] ;MAKE SURE THE STRING IS NOT ALREADY A SYNONYM ;(ACCEPT PHYSICAL DEVICE NAMES). CALL BUFFF ;OR IS .BFP OK? MOVE B,A CAIN TRM,ALTM CALL UBP ALTYPE <:> ERROR ; _______ 8/28/70 ASSIG3: CONFIRM POP P,A ;DEVICE CHARACTERISTICS TLNN A,B7 ;"MOUNTABLE" BIT JRST ASSIG5 ;NOT MOUNTABLE MOVE A,(P) ;DEVICE DESIGNATOR ;TLO A,B3 ;SAY DON'T READ DIRECTORY MOUNT ;MIGHT BE NEEDED TO INVALIDATE DIR IN CORE ____ CALL JERR ASSIG5: MOVE A,(P) ;DEVICE DESIGNATOR ASND CALL JERR POP P,A ;DEVICE DESIG AGAIN JUMPE B,.+3 ;B CONTAINS 0 OR LOGICAL NAME PTR CSYNO CALL JERR JRST CMDIN4 ;ATTACH (USER) (PASSWORD) -- (TSS JOB #) <#> ;LIKE LOGIN, THIS COMMAND ALSO ACCEPTS THE FORM: ;ATTACH ;(USER) ;(PASSWORD) ---- ;(TSS JOB #) <#> ;PASSWORD IS NOT ECHOED IN FULL DUPLEX, TYPED OVER MASK ON ;FOLLOWING LINE IN HALF DUPLEX. ;TSS JOB # CAN BE OMITTED IF THERE IS ONLY ONE JOB FOR GIVEN USER. ;IF NOT LOGGED IN, CURRENT JOB GOES AWAY (HANDLED BY MONITOR), ;IF LOGGED IN IT IS DETACHED. .ATTAC: CALL SPECEOL ;SPECIAL HANDLING OF EOL TERMINATOR FOR ;OPTIONAL FANCY FORMAT. NOISE CALL USERN ;INPUT USER (DIRECTORY) NAME TLNE A,B0 ERROR MOVEI A,(A) ;MASK DIR # PUSH P,A ;SAVE DIR # CALL SPECEOL ;CHECK TERMINATOR & HANDLE EOL SPECIALLY HRRZ A,0(P) ;DIRNUM CALL PASWD ;INPUT AND CHECK PASSWORD (USES A) PUSH P,A ;SAVE PASSWORD STRING POINTER NOISE INHELP < NUMBER IF YOU HAVE MORE THAN ONE JOB> ALLOW TALT+TSPC+TEOL CAIN CNT,2 JRST [ MOVE B,.BFP ILDB B,B CAIN B,"-" JRST ATTAC5 ;NULL INDICATED WITH "-" JRST .+1] TLO Z,BAKFF CALL DECIN JRST [ UALTYP [ASCIZ /-/] ;NULL. TYPE "-" ON ALT MODE. JRST ATTAC5] PUSH P,A ;SAVE JOB # INPUT BY USER ;ATTACH... ;CHECK THAT USER-GIVEN JOB # IS IN LEGAL RANGE SETO D, GTB 3 ;GET MAX JOB # AS LENGTH OF SYSTEM TABLE 3 MOVN A,A ;LENGTH COMES BACK NEGATIVE SUBI A,1 ;SO VALUE COMES OUT RIGHT IN ERR MSG CAML A,(P) ;LENGTH MUST BE > GIVEN # SKIPGE D,(P) ;GIVEN JOB # TO D ERROR ;MAKE SURE GIVEN JOB # IS LOGGED IN W MATCHING DIR # AND IS ATTACHED GTB 1 ;ENTRY NEG IF NO SUCH JOB JUMPL A,[UERR[ASCIZ/NO JOB %4Q/]] GTB 0 ;LINE # OR NEGATIVE FOR DETACHED IN LH JUMPL A,ATAC4B HLRZ A,A ;TTY # ETYPE < [ATTACHED TO TTY%1O]> TLO KWV1,CONMAN ;REQUIRE CONFIRMATION IN THIS CASE ATAC4B: GTB 3 ;LOGIN DIR NO IN RH MOVEI A,(A) ;MASK DIR NO UNDER WH THIS JOB IS LOGGED IN JUMPE A,[UERR [ASCIZ /JOB %4Q NOT LOGGED IN/]] MOVE E,-2(P) ;DESIRED DIRECTORY #, FOR USE IN ERR MSG CAME A,E ERROR JRST ATTAC7 ;GO CONFIRM AND EXECUTE ;ATTACH... ;NO JOB # GIVEN, SEE IF THERE IS A UNIQUE ONE FOR GIVEN NAME. ATTAC5: ;SEARCH SYSTEM TABLE 3 FOR A MATCH MOVE E,-1(P) ;DIR # TO SEARCH FOR (USED IN ERR MSGS!) SETO D, GTB 3 ;SYSTEM TABLE 3: BY JOB #, LOGIN DIR # IN RH. HRLZ D,A ;SET UP LENGTH,,INDEX FOR AOBJN & GTB. ATA5A: GTB 3 MOVEI A,(A) ;MASK THIS JOB'S LOGIN DIR # CAME A,E ATA5B: JRST [ AOBJN D,ATA5A ;LOOP ENDTEST UERR [ASCIZ /NO DETACHED JOB LOGGED IN UNDER %5R/]] GTB 0 JUMPGE A,ATA5B ;IGNORE NON-DETACHED JOBS ;FOUND ONE, SEE IF ITS THE ONLY ONE. MOVEI B,(D) PUSH P,B ;SAVE JOB # OF JOB FOUND ATA5C: AOBJP D,ATTAC7 ;IF END OF TABLE, GO CONFIRM AND EXECUTE GTB 3 MOVEI A,(A) CAME A,E JRST ATA5C GTB 0 JUMPGE A,ATA5C ;IGNORE NON-DETACHED JOBS ERROR ;ATTACH... ATTAC7: CONFIRM ;EXECUTE THE COMMAND ;IF LOGGED IN, TYPE JOB # OF THIS JOB GJINF JUMPLE A,.+2 ETYPE < DETACHING JOB # %3Q > ;ATTACH POP P,A ;TSS JOB # TO ATTACH TO POP P,C ;PASSWORD STRING POINTER POP P,B ;RH: DIR # TO ATTACH TO ;B0 OFF SAYS DON'T STOP IT ATACH CALL [ CAIN A,ATACX4 UERR [ASCIZ /INCORRECT PASSWORD/] ;NOTE THAT BAD PASSWORD IS DETECTED ABOVE ;IF NOT LOGGED IN JRST JERR] ;THIS JOB CONTINUES RUNNING IF LOGGED IN. GJINF ;GET TSS JOB # IN A JUMPG A,CMDIN4 ;LOGGED IN, GO GET NEXT COMMAND ;NOT LOGGED IN, ATACH FAILED TO KILL JOB, DO SO IN EXEC. SETO A, ;SAY SELF LGOUT ;KILL JOB CALL JERR ;LGOUT FAILED ;AVAILABLE [LINES/DEVICES] .AVAIL: KEYWD $AVAIL T LINES,EOLOK,..TERM JRST CERR ;CAN'T CONFIRM HERE BECAUSE OF FUDGE-ENTRIES IN TABLE JRST (KWV) $AVAIL: TABLE T DEVICES,EOLOK T LINES,EOLOK,..TERM T T,NSPALT+EOLOK+INVIS,<[UALTYP [ASCIZ /ERMINALS /] JRST ..TERM]> ;"T" = "TERMINALS" T TE,NSPALT+EOLOK+INVIS,<[UALTYP [ASCIZ /RMINALS /] JRST ..TERM]> T TELETYPES,EOLOK+INVIS,..TERM T TERMINALS,EOLOK+INVIS,..TERM T TTYS,EOLOK+INVIS,..TERM TEND ;AVAILABLE TERMINALS ..TERM: CONFIRM SETO D, ;WORD -1 OF A TABLE IS ALWAYS LENGTH GTB 4 ;SYSTEM TABLE 4 IS LINE STATUSES HRLZ D,A ;D IS AOBJN COUNT,,LINE # ;TLZ Z,F1 ;CLEAR TO SAY NOTHING PRINTED YET TERMI1: GTB 4 ;LINE # = TABLE INDEX. GET A LINE'S STATUS. HLRZ A,A ;LEFT HALF OF TABLE WORD CAIE A,-1 ;IS -1 FOR FREE LINES JRST TERMI9 CALL BEFORE ;TYPE COMMA OR MAYBE EOL ;TYPE ; ;DESIREABLE? HRRZ B,D CALL TOCT ;TYPE LINE NUMBER TERMI9: AOBJN D,TERMI1 TLNN Z,F1 TYPE < ALL LINES IN USE> EOLRET: PRINT EOL ;COME HERE TO TYPE CRLF AND POPJ. RET ;AVAILABLE DEVICES ;DOES NOT LIST TTYS OR ANY NON-ASSIGNABLE DEVICES ;THIS LEAVES DTAS, MTAS, PTP, PTR, AND ANY OTHER DEVICES ADDED LATER. ;ALSO LISTS SEPARATELY DEVICES ALREADY ASSIGNED TO THIS JOB. .DEVIC: CONFIRM ;TLZ Z,F1 ;SAY NOTHING TYPED YET ;"DEVLUP" EXECUTES THE NEXT LOC FOR EACH DEVICE, WITH CALL DEVLUP ;...NAME IN A, DVCHR WORD IN B. CALL [ JUMPGE C,[RET] ;DONE IF ASSIGNED WITH ASND. TLNN B,B3 ;DONE IF NOT ASSIGNABLE RET LDB B,[POINT 9,B,17] ;EXTRACT DEVICE TYPE CAIN B,12 ;EXCLUDE TTYS ALSO RET CALL BEFORE ;SEPARATING CHARACTER(S) JRST SIXPRT] ;PRINT SIXBIT NAME TLNE Z,F1 PRINT EOL JRST ASTTJ ;LIST DEVS ASSIGNED TO THIS JOB. WITH FILSTAT. ;SUBROUTINE FOR FORMATTING A LIST OF ITEMS SEVERAL TO A LINE. ;USED FOR AVAILABLE TERMINALS, AVAILABLE DEVICES, AND FILSTAT. ;BEFORE EACH ITEM: COMMA EXCEPT CRLF IF TOO FAR TO RIGHT. BEFORE: PUSH P,A PUSH P,B MOVE A,COJFN RFPOS MOVEI B,(B) ;MASK COLUMN POSITION CAIL B,^D65 JRST [ PRINT EOL JRST .+3] TLOE Z,F1 ;SUPPRESS COMMA BEFORE FIRST ONE PRINT "," PRINT " " ;SPACE AFTER COMMA OR EOL JRST [ POP P,B POP P,A RET] ;SUBROUTINE TO LOOP OVER ALL DEVICES FOR "AVAIL DEVICES" AND "FILSTAT". ;FOR EACH DEVICE, EXECUTES LOCATION AFTER CALL WITH SIXBIT NAME IN A ; DEVICE CHARACTERISTICS WORD (A LA "DVCHR" EXCEPT B5) IN B, ; -1 OR JOB # ASSIGNED TO IN C. ;RETURNS +2. ;DESTROYS A, B, C, D. DEVLUP: SETO D, GTB 6 ;GET # DEVICES FROM TABLE 6 HRLZ D,A ;AOBJN COUNT,,ABLE INDEX DEVL1: GTB 7 ;GET DEVICE CHARACTERISTICS WORD FROM TABLE 7 MOVE B,A GTB 10 ;GET JOB # ASS TO, OR -1, FROM LH TABLE 8 HLRE C,A GTB 6 ;GET DEVICE NAME IN SIXBIT FROM TABLE 6 PUSH P,D XCT @-1(P) POP P,D AOBJN D,DEVL1 JRST [ AOS (P) RET] ;TYPE SIXBIT SYMBOL FROM A. ;USED IN "AVAILABLE DEVICES", "SYSTAT", "STATISTICS", AND "FILSTAT". SIXPRT: PUSH P,B PUSH P,C MOVE C,A SIXPR1: SETZ B, LSHC B,6 ADDI B,40 CALL CCHRO JUMPN C,SIXPR1 JRST [ POP P,C POP P,B RET] ;BREAK (LINKS) .BREAK: NOISE BREAK1: CONFIRM INTOFF HRLOI 1,(1B0+1B1) ;BREAK TO AND FROM CONTROLLING JRST BREAK3 ;BREAK2 IS CALL BY ^ECREATE AND ^EPRINT BREAK2: INTOFF ;BE SURE TO DO BOTH TLINK AND ADVIZ HRLOI 1,(1B0+1B1+1B4) ;BREAK TO AND FROM CONTROLLING BREAK3: MOVEI 2,-1 ;ALL REMOTES, AND "REFUSE" TLINK CALL JERR MOVSI A,(1B0) ;BREAK ADVISE LINKS ADVIZ CALL JERR INTON RET ;"CHANGE" COMMAND .CHANG: KEYWD $CHANG 0 JRST CERR JRST 0(KWV) $CHANG: TABLE T ACCOUNT,,C.ACCT T PASSWORD,,C.PSWD TEND ;"CHANGE ACCOUNT (TO) ..." C.ACCT: ;DETERMINE WHETHER LOGGED IN USER TAKES STRING OR NUMERIC ACCT ..ACNT: GJINF ;LOGIN DIR # TO A MOVE B,A MOVE A,CSBUFP ;STRING BUFFER PTR DIRST ;CONVERT DIR # TO STRING CALL SCREWUP MOVEI A,1 MOVE B,CSBUFP STDIR ;CONVERT BACK TO # PLUS BITS CALL SCREWUP CALL SCREWUP ;NOW B1 OF A ON FOR STRING ACCT. FINISH INPUTTING COMMAND. TLNN A,B1 ;NOISE DEPENDS ON WHETHER USER TAKES... NOISE <# TO> ;NUMERIC ACCOUNT, TLNE A,B1 NOISE ;OR STRING. CALL ACCT ;INPUT, CHK, CNVT ACCT INTO A (USES A ) CONFIRM CALL PIE.P ;SKIP IF PIESLICE SYSTEM JRST C.ACC2 PUSH P,A ;SAVE NEW ACCOUNT ADD P,[10,,10] ;NO CHECK FOR POV _____ MOVEI A,-7+0(P) ;WHERE TO PUT STRING ACCT SETO B, ;SAY THIS JOB GACTJ ;GET CURRENT ACCOUNT CALL JERR ETYPE < TIME USED ON ACCOUNT %1M: %B IN %C> SUB P,[10,,10] POP P,A ;NEW ACCOUNT JRST C.ACC3 C.ACC2: ETYPE < TIME USED ON PREVIOUS ACCT: %B IN %C> C.ACC3: SETZ B, ;NO SPECIAL FUNCTION BITS CACCT ;JSYS TO CHANGE ACCOUNT # CALL JERR RET ;"CHANGE PASSWORD (OF DIRECTORY) ... (FROM) ... (TO) ... (TO) ... " C.PSWD: CALL BREAK2 ;DO "BREAK" AND "REFUSE" CALL SPECEOL ;MAKE EOL FORCE NOISE NOISE CALL DIRNAM ;INPUT AND CHECK DIRECTORY NAME PUSH P,A ;BITS,,# FROM STDIR PUSH P,B ;POINTER TO BUFFERED NAME STRING ALLOW TSPC+TALT+TEOL ALTYPE ( ) CALL SPECEOL ANDI A,-1 ;KEEP ONLY DIR NUM MOVNS A ;SPECIAL NOISE & CHECK IT CALL PASWD ;INPUT AND CHECK PASSWORD PUSH P,A ;SAVE POINTER TO IT ALLOW TSPC+TALT SETZ A, ;SAY DON'T CHECK PASSWORD CALL PASWD ;INPUT NEW PASSWORD PUSH P,[0] ;CRDIR BLOCK BEGINS HERE PUSH P,A ;SAVE POINTER TO IT ALLOW TALT+TSPC ILDB B,A ;GET FIRST CHR OF NEW PASSWORD JUMPE B,CERR ;WILL BE HARD TO LOGIN IF PSWD IS NULL SETZ A, ;SAY DON'T CHECK PASSWORD CALL PASWD ;INPUT NEW PASSWORD (AGAIN) ALLOW TSPC+TALT+TEOL MOVE B,0(P) ;POINTER TO 1ST COPY ILDB C,A ;GET A CHR FROM 2ND STRING ILDB D,B ;AND ONE FROM 1ST STRING CAME C,D ;SAME? ERROR JUMPN C,.-4 ;LOOP THRU ASCIZ STRING CONFIRM C.PSW1: MOVEI A,C.PSWT MOVEM A,ILIDSP ;SET TRAP RETURN FOR CRDIR MOVE 1,-3(P) ;POINTER TO OLD NAME MOVSI 2,(1B1) ;"SET PASSWORD" BIT HRRI 2,-1(P) ;PARAMETER BLOCK LOCATION (PARTIAL) MOVE 4,-2(P) ;NEW PASSWORD CRDIR CALL JERR SETZM ILIDSP ;CANCEL ILLEGAL INSTR TRAP SUB P,[5,,5] ;FLUSH JUNK RET ;CRDIR TRAPS TO HERE C.PSWT: SETZM ILIDSP ;DISABLE TRAPPER CAIN 1,CRDIX1 ERROR JRST ILIPSI ;CLEAR (DIRECTORY OF DEVICE) ;FORCED CONFIRMATION .CLEAR: NOISE CALL DEVN LDB D,[POINT 9,A,17] ;DEVICE TYPE CAIE D,3 ERROR TLNN B,B5 ;AVAILABLE? JRST [ TLNN B,B6 ;ASSIGNED? UERR [ASCIZ /%1H: NOT AVAILABLE/] UERR [ASCIZ /%1H: ASSIGNED TO JOB %3O/]] TLNN B,B8 ERROR <%1H: NOT MOUNTED> CONFIRM INIDR ;INITILIZE DIRECTORY (DESIGNATOR IN A) CALL JERR RET ;CLOSE (FILE) .CLOSE: NOISE JRST NIYE ;_________________________ ;COMMANDS (FROM FILE) .COMMA: NOISE JRST NIYE ;_________________________ ;CONNECT (TO DIRECTORY) (PASSWORD) -- ;(IF A WAY IS PROVIDED TO FIND OUT WHETHER A GIVEN DIRECTORY ; REQUIES A PASSWORD, MAKE IT REQUEST PASWD ON NEXT LINE (LIKE LOGIN) ; INSTEAD OF ASSUMING NULL IF NAME IS TERMINATED WITH CR BUT THIS ; DIRECTORY REQUIRES A PASSWORD). .CONNE: NOISE HRRZ A,CUSRNO ;DEFAULT TO LOGIN DIRECTORY CALL DEFDIR ;INPUT & CHECK DIRECTORY NAME PUSH P,A ;DIR # ETC AS RETURNED BY "STDIR" ALTYPE ( ) ALLOW TSPC+TALT+TEOL ;PASSWORD IS SECOND, OPTIONAL ARGUMENT HRROI A,[ASCIZ //] ;USE NULL IF OMITTED TRNE CBT,TEOL JRST CONNE4 HRRZ A,0(P) ;DIR NUM CALL PASWD ;INPUT & CHECK PASSWORD CONNE4: ALLOW TALT+TSPC+TEOL CONFIRM PUSH P,A ;SAVE TEXT PTR TO PASSWD CALL CHKDAL ;CHECK CURRENT DIRECTORY BEFORE LEAVING POP P,B HRRZ A,(P) ;DIRECTORY # CNDIR CALL [ CAIN A,CNDIX1 UERR [ASCIZ /INCORRECT PASSWORD/] JRST JERR] CALL CHKDAL ;CHECK NEW DIRECTORY JRST CMDIN4 ;CONTINUE ;RESUMES FROZEN INFERIOR FORKS ;DECODE AND CHECK SUBROUTINE ALSO USED BY REDIRECT/DETACH $CONTI: SKIPGE FORK ;HANDLE OF AN INFERIOR FORK ERROR ; ;NO INFERIORS AT ALL ;"FORK" SAYS WHETHER A FORK EXISTS, AND SAYS WHICH FORK "START" AND ;"REENTER" USE, BUT SINCE IT CAN BE CHANGED WITH "FORK" COMMAND ;IT MAY NOT BE THE RIGHT ONE TO CONTINUE. SKIPGE A,LFORK ;HANDLE OF LAST RUN INFERIOR, IF ANY. ERROR ; NO FORK RUN SINCE RESET. RFSTS ;GET ITS STATUS (HANDLE IN A) TLNE A,077700 ;DISTINGUISH -1 FROM 0-5,400000-400005 ERROR ; ;-1 = UNASSIGNED HANDLE. ; JUMPGE A,[UERR [ASCIZ /NOT INTERRUPTED/]] ;B0 MEANS FROZEN RET ;"CONTINUE" COMMAND DISPATCHES HERE .CONTI: CALL $CONTI CONFIRM ;"REDIRECT/DETACH ... (AND) CONTINUE" JOINS HERE ..CONT: SETOM A CALL MAPPF ;UNMAP ANY PAGE OF USER MOVEI E,PTTYMD CALL LTTYMD ;LOAD USER'S TTY MODE TLO Z,RUNF ;SAY SO. MOVE A,LFORK ;FORK WHICH RAN LAST RFSTS ;FIND OUT WHY IT STOPPED HLRZ 3,1 TRZ 3,1B18 ;FLUSH FROZEN BIT MOVE 1,LFORK CAIE 3,2 ;FORK WAS HALTED OR FORCE TERM? CAIN 3,3 SFORK ;YES. START IT JRST $WAIT ;GO RESUME FORK AND WAIT FOR IT ;"COPY" IS IN X2CMD.MAC. ;DAYTIME ;THIS AND ALL ONE-WORD COMMANDS ARE CONFIRMED BEFORE DISPATCH. .DAYTI: PRINT " " MOVE A,COJFN ;DESTINATION SETOB B,C ;SAY CURRENT DATE AND TIME, SUPER-VERBOSE FORMAT ODTIM PRINT EOL RET ;DEFINE (NEW FILE) (AS) ;DECODER ONLY -- NOT TO BE IMPLEMENTED IN MINISYSTEM. .DEFIN: NOISE HRROI A, ;NO DEFAULT EXTENSION FOR FIRST FILE MOVEI B,B0+B1 ;"FOR OUTPUT USE" AND "MUST BE NEW" BITS CALL SPECFN ;GET FILE NAME USING GTJFN FLAGS IN B JRST CERR ;NO DEFAULT FOR "-" INPUT NOISE MOVE A,[2,,2] ;SAY DEFAULT NAME AND EXT TO THOSE OF 1ST FILE MOVEI B,B3 ;SAY "TYPE OLD/NEW" ;THESE GTJFN BITS ACCEPT AN OLD OR NEW NAME BUT DEFAULT ;VERSION TO HIEST OLD RATHER THAN NEXT HIGHER AS "COUTFN" DOES. CALL SPECFN JRST CERR CONFIRM JRST NIM ;TYPE "NOT IN MINISYSTEM" ;DELETE .DELET: MOVE A,[2,,2] ;SAY DEFAULT NAME & EXT TO PREVIOUS HRLI B,-2 ;DEFAULT VERSION TO LOWEST HRRI B,B2+B11+B15+B16 ;OLD FILE, *'S AND COMMA OK CALL SPECFN ;INPUT FILE GROUP DESCRIPTOR JRST CERR ALLOW TSPC+TALT+TEOL CONFIRM CALL FRSTF ;TYPE NAME IF A GROUP DELET0: HRRZ A,@INIFH1 ;JFN DVCHR TLNN B,(1B4) ;DISK? JRST DELET1 ;NO HRRZ A,@INIFH1 DELET2: MOVE B,[1,,FDBCTL] ;GET CONTROL BITS MOVEI C,C ;TO C CALL $GTFDB ;GET FDB OR DON'T SKIP ERROR TLNE C,(FDBUND) ;CHECK THE PERPETUAL BIT JRST [ UTYPE [ASCIZ / CANNOT DELETE PERPETUAL FILE /] JRST NEXTF] ;DO NEXT FILE DELET3: MOVE B,[1,,FDBBCK] ;GET BACKUP WORD MOVEI C,C ;TO C CALL $GTFDB ERROR <$GTFDB ERROR> TLNE C,FDBARC ;ARCHIVE BIT JRST [ UTYPE [ASCIZ / CANNOT DELETE ARCHIVE-PENDING FILE /] JRST NEXTF] ;RETURNS TO FRSTF CALL +1 DELET1: MOVE A,@INIFH1 ;JFN(FLAGS TELL DELF WHETHER TO RELEASE) DELF CALL [ CAIN A,DELFX1 UERR [ASCIZ /PROTECTION VIOLATION/] JRST JERR] JRST NEXTF ;GET NEXT FILE IF GROUP, TYPE NAME, ;RETURN TO WHERE FRSTF WAS CALLED. ;GO TO RLJFNS IF NO MORE FILES. ;"DDT" COMMAND. LOAD DDT IN INFERIOR FORK IF NECESSARY, ;TRANSMIT SYMBOL TABLE POINTER, START DDT. .DDT: SKIPGE DDTFLG ;DDT ALREADY LOADED? JRST DDT4 ;YES ;DETERMINE WHETHER THERE IS INFERIOR FORK WITH SYMBOL TABLE POINTER ;IF NOT, USE DDT THAT ALREADY CONTAINS STENEX SYMBOLS. SETZ C, ;SAYS NO SYM TAB PTR SKIPGE FORK JRST DDT2 ;NO FORK ;THERE IS A FORK, SEE IF IT ALREADY CONTAINS SOMETHING THAT LOOKS ;LIKE A DDT. IF SO, LEAVE IT, AS IT MAY CONTAIN BREAKPOINTS, ;MODIFIED SYM TAB PTR, ETC. MOVEI A,DDTORG ;DDT BEGINNING ADDRESS CALL MAPPF TLNN A,B5 ;PAGE EXISTS? JRST DDT1 ;NO, FORK DOESN'T HAVE DDT CALL LOADF ;YES, LOAD FIRST WORD CAME A,[JRST DDTORG+2] JRST DDT1 MOVEI A,DDTORG+1 CALL LOADF ;SECOND WORD IS 0,,PTR PTR CAIG A,-1 CAIG A,DDTORG JRST DDT1 JRST DDT3 ;ALREADY HAVE ACCEPTABLE DDT ;FORK DOESN'T HAVE DDT, SEE IF IT HAS SYM TAB PTR DDT1: MOVEI A,.JBSYM ;WHERE LOADER LEAVES SYM TAB PTR CALL MAPPF ;MAP PAGE OF FORK ;SETZ C, ;SAYS NO SYM TAB PTR TLNE A,B5 ;NO PAGE? TLNN A,B2 ;READ PROTECT? JRST DDT2 ;NO USEABLE PTR ;ANDI A,777 MOVE C,PAGEN(A) ;FETCH SYM TAB PTR WORD ;IF NEGATIVE, IT WILL BE ASSUMED TO BE PTR MOVE D,PAGEN+1(A) ;.JBUSY IS .JBSYM+1 ;NO CHECKING NEEDED, DDT WILL FIX IT UP. DDT2: PUSH P,C ;SAVE SYM TAB PTR OR 0 PUSH P,D ;SAVE UNDEF SYM PTR MOVE B,[POINT 7,[ASCIZ /SDDT.SAV/]] ;DDT WITH SYMBOLS JUMPGE C,.+2 ;SYM TAB PTR CANT BE .GE. 0 MOVE B,[POINT 7,[ASCIZ /UDDT.SAV/]] ;LOAD SELECTED DDT CALL $GTJFN ;ASSIGN JFN FOR STRING PTR IN B ;ENTRY TO "$LPT" SUBR NEAR "DIRECTORY" CALL $MERGE ;MERGE IT INTO FORK, CREATING FORK IF NONE, ;AND RELEASE JFN ;DDT... ;STORE SYMBOL TABLE POINTER POP P,D POP P,C JUMPGE C,DDT3 ;NOT A SYMBOL TABLE POINTER MOVEI A,DDTSYM CALL MAPPF ANDI A,777 HRRZ E,PAGEN+1(A) ;WHERE TO STORE UNDEF PTR HRRZ A,PAGEN(A) ;POINTER TO WHERE TO PUT POINTER CALL MAPPF ANDI A,777 MOVEM C,PAGEN(A) ;STORE POINTER HRRZ A,E ;WHERE TO PUT UNDEF PTR IN DDT CALL MAPPF ANDI A,777 MOVEM D,PAGEN(A) ;STORE IT DDT3: SETOM DDTFLG ;SAY DDT LOADED & SYM TAB PTR MOVED ;TRANSFER CONTROL TO DDT DDT4: MOVNI B,3 ;CODE FOR PA1050 IF ANY CALL CHKPAT ;PA1050 RUNNING IN FORK? JUMPG B,GOTO2 ;RETURNS RESTART ADDRESS IF YES MOVEI B,DDTORG ;DDT STARTS AT ITS FIRST LOCATION JRST GOTO2 ;JOIN "GOTO" COMMAND: UNMAP PAGE, START FORK. ;DEASSIGN ;ACCEPTS LOGICAL OR REAL DEVICE NAME .DEASS: NOISE (DEVICE) CALL DEVN ;INPUT DEVICE NAME ;NOW HAVE DEVICE DESGNATOR IN A, CHARACTERISTICS WORD IN B. TLNN B,B6 ERROR <%1H: NOT ASSIGNED> TLNN B,B5 ERROR <%1H: NOT ASSIGNED TO YOU> CONFIRM TLNE B,B8 ;MOUNTED? TLNN B,B7 ;MOUNTABLE? JRST .+3 ;NOT MOUNTED OR NOT MOUNTABLE DSMNT ;REDUCES CHANCES OF CLOBBEREING NEXT CALL JERR ;...USER'S DECTAPE. ;MAY ALSO WRITE DIRECTORY IN SOME CASES (?) RELD CALL JERR ;DO WE HAVE TO DO ANYTHING TO FLUSH SYNONYMS HERE? JRST CMDIN4 ;"DETACH" CODE IS WITH "REDIRECT" BELOW. ;DUMP (ON) . ;SAVES ENVIRONMENT. ;CAN'T BE FULLY IMPLEMENTED TIL ENVIRONMENT SAVE FILES ARE SPECIFIED. .DUMP: NOISE JRST NIYE ;____________________ ;EDIT (FILE) ;FIRES UP TECO AT CCL ENTRY WITH JFN OF FILE SPECIFED IN AC1 ; DEFAULT FILE IS MOST RECENT VERSION OF THE LAST ONE MENTIONED ; IN AN "EDIT" COMMAND. THE ACTUAL NAME OF THIS IS SAVED AWAY IN ; "EDFILE" SO THAT IT IS PRESERVED THROUGH RESETS. .EDIT: CALL CEDFN ;GET EDIT FILE NAME,DEFAULT=PREVIOUS JRST EDIT7 ;NO FILE SPECIFIED PUSH P,A ;SAVE THE JFN FOR STARTING TECO CONFIRM MOVE A,[EDFILE,,EDFILE+1] SETZM -1(A) ;CLEAR DEFAULT POINTERS WORD BLT A,EDFILE+EDFILL ;AND SAVED STRINGS EDIT1: HRROI A,EDFILE+1 ;BEG OF STRING STORAGE MOVE B,0(P) ;EDIT JFN HRLZM A,EDFILE ;SET NAME HALF OF POINTER WORD MOVSI C,(1B8) ;OUTPUT NAME OF JFN JFNS IBP A ;INSERT A NULL HRROI A,1(A) ;BUMP TO NEXT WORD HRRM A,EDFILE ;SET EXT HALF OF POINTER WORD MOVSI C,(1B11) ;OUTPUT EXT OF JFN JFNS EDIT2: MOVE A,0(P) ;GET EDIT JFN AGAIN MOVE B,[1,,FDBCTL] MOVEI C,C ;INTO C CALL $GTFDB ;GTFDB OR DON'T SKIP JRST CERR TLNN C,(1B4) ;SEE IF FIRST WRITE HAS BEEN DONE JRST EDIT3 ;IT HAS. DON'T CHANGE AUTHOR MOVE B,[7B5+1B22] ;7-BIT, APPEND OPENF ;MAKE SURE IT EXISTS JRST CERR TLO A,(1B0) ;DONT RELEASE THE JFN CLOSF ;TECO WILL OPEN IT CALL SCREWUP EDIT3: HRROI B,[ASCIZ /TECO.SAV/] CALL TRYGTJ ;GTJFN, STACK FOR RELEASE AT ERROR, ^C CALL CERR PUSH P,A ;SAVE FOR LATER EDIT4: CALL $RESET ;FLUSH OLD FORK, IF ANY CALL ECFORK ;GET A CLEAN ONE MOVE A,['TECO '] MOVEM A,SUBSYS SETZM PROPSF ;SET "GET2B" MOVEI B,GETILI ;SETUP TO CATCH MOVEM B,ILIDSP ;ILLEGAL GET JSYS POP P,A ;JFN ON TECO HRL A,FORK GET ;AND RELEASE JFN SETZM ILIDSP ;TURN OFF SPECIAL ILL INSTR HANDLING EDIT5: MOVEI A,1 ;REFERENCE AC1 CALL MAPPF POP P,PAGEN(A) ;JFN FOR TECO TO GOBBLE DOWN MOVE A,FORK MOVEI B,PAGEN SFACS ;MAPFF WON'T DO THIS EDIT6: MOVEI B,2 ;CCL ENTRY JRST START1 ;START UP THE TECO EDIT7: SKIPN A,EDFILE ;IS THERE A SAVED FILE NAME.EXT? CALL CERR ;NO MOVE B,[CJFNBK,,CJFNBK+1] SETZM -1(B) BLT B,CJFNBK+10 ;CLEAR DEFAULT BLOCK HLROM A,CJFNBK+4 ;DEFAULT NAME HRROM A,CJFNBK+5 ;DEFAULT EXTENTION MOVE B,[377777,,377777] MOVEM B,CJFNBK+1 ;NO IO MOVSI C,100000 MOVEM C,CJFNBK+0 ;OLD FILE ONLY, NO CONFIRM EDIT8: MOVEI A,CJFNBK ;DEFAULT BLOCK PTR MOVEI B,0 ;FORCE DEFAULTING GTJFN JRST [ SETZM EDFILE ;FORGET PAST FILE UERR [ASCIZ /EDIT FILE HAS BEEN DELETED/]] MOVE B,JBUFP PUSH B,A ;SAVE FOR RELEASING ON ERROR,ETC MOVEM B,JBUFP PUSH P,A ;WHERE REST OF EDIT WANTS THE JFN CONFIRM JRST EDIT3 ;FILE KNOWN TO EXIST, JUST GET TECO ;ENTRY (VECTOR LOCATION) (LENGTH) .ENTRY: SKIPGE FORK ERROR NOISE CALL OCTAL JRST CERR ALLOW TALT+TEOL+TSPC PUSH P,A MOVEI A,1 ;DEFAULT LENGTH TRNE CBT,TEOL JRST ENTRY5 NOISE CALL OCTAL ;OCTAL TO ALLOW 254000 FOR COMPATIBILITY JRST [ UALTYP [ASCIZ /1 /] ;NULL INPUT MOVEI A,1 ;DEFAULT LENGTH AGAIN JRST .+1] ALLOW TALT+TEOL+TSPC CAILE A,777 ;TOO LONG? JRST [ CAIN A,254000 ;ALLOW JRST FOR COMPATIBLE JRST .+1 JRST CERR] ;"?" ENTRY5: CONFIRM POP P,B ;LOCATION HRL B,A ;LENGTH MOVE A,FORK SEVEC RET ;"NOT EPHEMERAL" TURNS OFF FDBEPH BIT IN FDB .NOTEP: TDZA 1,1 ;0 FOR USE IN CHFDB ;"EPHEMERAL" TURNS ON THE FDBEPH BIT .EPHEM: SETOM 1 ;1 FOR USE IN CHFDB PUSH P,1 CALL $GET1 ;GET A PROGRAM JFN, LIKE "GET" OR "RUN" ALLOW TSPC+TALT+TEOL CONFIRM MOVE 1,CJFN1 ;JFN OF THE NAMED FILE DVCHR TLNN 2,(1B4) ERROR <%1H DOESN'T HAVE EPHEMERONS> HRR 1,CJFN1 HRLI A,FDBCTL ;FDB CONTROL BITS WORD MOVSI 2,(FDBEPH) POP P,3 CHFDB JRST RLJFNS ;RELEASE JFN AND RETURN ;'EXEC' - STARTS AN EXEC IN INFERIOR FORK SEPARATE FROM 'FORK' .EXEC: HRROI 2,[ASCIZ /EXEC.SAV/] CALL TRYGTJ ;GTJFN AND SAVE IT CALL JERR ALLOW TSPC+TEOL+TALT CONFIRM JRST CIN4 ;HANDLE AS AN EPHEMERON ;EXPUNGE (DELETED FILES) .EXPUN: KEYWD $EXPUN T DELETED,EOLOK+LPROK,..EXDL JRST CERR JRST (KWV) $EXPUN: TABLE T ALL,EOLOK+LPROK,..EXAL T DELETED,EOLOK+LPROK,..EXDL T PERMANENT,INVIS+CONMAN+WHLUO+OPRUO+EOLOK+LPROK,..EXPE T SCRATCH,EOLOK+LPROK,..EXSC T TEMPORARY,EOLOK+LPROK,..EXTM TEND ..EXAL: NOISE HRLZI 1,(1B12!1B13!1B15!1B16) JRST ..EXPU ..EXDL: NOISE HRLZI 1,(1B12!1B13) JRST ..EXPU ..EXPE: NOISE HRLZI B,WHLUO+OPRUO CALL PRVCK ;SEE THAT REQUIRED CAPS ARE ENABLED HRLZI 1,(1B14) JRST ..EXPU ..EXSC: NOISE HRLZI 1,(1B15) JRST ..EXPU ..EXTM: NOISE HRLZI 1,(1B16) ..EXPU: PUSH P,1 ALLOW TSPC+TALT+TEOL CONFIRM GJINF HRR 1,2 HLL 1,0(P) DELDF SUB P,[1,,1] RET ;FORK ;SETS FORK ACCESSED BY START, REENTER, GOTO, /, \, TEN50 DDT, SAVE. ;DOESN'T UPDATE SUBSYSTEM NAME (SUBSYS); MAYBE LATER IT SHOULD. .FORK: CALL OCTAL JRST CERR ALLOW TALT+TSPC+TEOL TRO A,400000 ;OK IF USER OMITS SIGN CAIN A,400000 ;"SELF" IS LEGAL ONLY FOR WHEELS. JRST [ HRLZI B,WHLUO ;INDICATE WHEEL PRIV MUST BE ENABLED CALL PRVCK ;TEST SPECIAL CAPABILITIES JRST FORK1 ;NO ENABLE OR NO WHEEL CAPABILITY JRST FORK2] CAIL A,400001 CAILE A,400017 FORK1: ERROR FORK2: PUSH P,A RFSTS ;SEE IF THIS FORK HANDLE IS ASSIGNED. TLNE A,077700 ;DISTINGUISH -1 FROM 0-5, 400000-400005. ERROR ;-1 = UNASSIGNED HANDLE. CONFIRM POP P,FORK ;SAVE HANDLE FOR OTHER COMMANDS TO USE JRST CMDIN4 ;MERGE COMMAND. ;GETS A FILE INTO CURRENT FORK WITHOUT RESETTING. ;PUTS BACK ENTRY VECTOR WORD THAT WAS THERE BEFORE COMMAND .MERGE: CALL $GET1 ;INPUT PROGRAM NAME ALLOW TSPC+TEOL+TALT CONFIRM ;SUBROUTINE ENTRY FOR "DDT" COMMAND. JFN IN CJFN1. $MERGE: SKIPGE A,FORK ;SKIP IF EXEC HAS INFERIOR FORK JRST $GET2 ;CREATE FORK, GET PROG, USE ITS ENTRY. GEVEC ;ALREADY HAVE A FORK PUSH P,B ;SAVE SAME CALL $GET2 ;GET PROGRAM POP P,B ;PREVIOUS ENTRY VECTOR MOVE A,FORK ;FORK HANDLE AGAIN JUMPE B,.+2 ;JUMP IF THERE WAS NO ENTRY VECTOR WD SEVEC ;SET ENTRY VECTOR TO OLD VALUE RET ;SUBROUTINE TO INPUT A PROGRAM NAME. ;FIRST PART OF GET, RUN, MERGE. $GET1: NOISE (FILE) $GET11: SETZ A, ;SAY DEFAULT TO CONNECTED DIRECTORY CALL CPFN ;INPUT PROGRAM NAME AND ASSIGN JFN JRST [ TRNE CBT,TEOL ;FAIL. JRST CERR ;AFTER CR TYPE "?" AND ABORT COMMAND. UTYPE [ASCIZ /? /] ;OTHER TERMINATORS, " ? " AND RETRY. MOVE BFP,.BFP ;BACK UP COMMAND BUFFER POINTER BTCHER ;STOP IF NON-INTERACTIVE JRST $GET11] ;GO RETRY. RET ;RUN COMMAND = GET + START .RUN: PUSH P,[..STRT] ;SET RETURN TO JOIN "START" COMMAND, ;FALL INTO "GET". ;GET COMMAND. ;RESETS THEN CREATES ONE FORK AND GETS PROGRAM INTO IT. ;CODED IN SUBROUTINES SO CODE CAN BE SHARED WITH "MERGE". .GET: CALL $GET1 ;INPUT PROGRAM NAME ; JOINS HERE AFTER CALLING CPFN AND SETTING ; RETURN TO JOIN START COMMAND (..STRT). GET1: ALLOW TSPC+TEOL+TALT CONFIRM CALL $RESET ;CLOSE FILES, KILL ALL INFERIOR FORKS. ;NOW FALL INTO $GET2, WHICH WILL RETURN ;TO COMMAND INPUT FOR "GET" BECAUSE ;DISPATCH WAS WITH "PUSHJ". ;GET... ;SUBROUTINE TO GET A PROGRAM INTO CURRENT FORK, FOR GET, RUN, AND MERGE. ;AT ENTRY CJFN1 MUST CONTAIN JFN OF FILE TO GET. $GET2: SKIPL FORK ;IS THERE A FORK? JRST GET2B ;YES (HAPPENS FOR "MERGE") CALL ECFORK ;CREATE A FORK MOVE B,CJFN1 ;JFN CALL SUBNAM ;SUBSYS NAME TO CELL "SUBSYS", ;FOR USE WHEN FORK IS RUN (LTTYMD) GET2B: SETZM PROPSF ;"PROPRIETARY" FLAG, MAY BE SET IF ;APPROPRIATE ;NOW WHAT? TEST FILE'S PROTECTION? _____ MOVEI A,GETILI ;SET SPECIAL IL INST TRAP DISPATCH MOVEM A,ILIDSP ;SO "GET" ERRORS CAN BE DETECTED HRR A,CJFN1 HRL A,FORK GET SETZM ILIDSP ;CLEAR IL INST SPECIAL DISPATCH ADDRESS CALL RLJFNS ;RELEASE JFNS ;ANYTHING ELSE? RET ;ILLEG INST TRAP DURING GET JSYS ;TYPE EXEC ERROR MESSAGES FOR CERTAIN ERRORS GETILI: PUSH P,A MOVE A,ERCOD ;SYSTEM ERROR CODE CAIN A,GETX1 ERROR CAIN A,GETX2 ERROR CAIN A,OPNX3 ERROR POP P,A JRST ILIPSI ;OTHER ERRORS TREATED IN GENERAL MANNER ;CREATE FORK FOR PROGRAM. USED HERE AND FOR "\" ECFORK: MOVEI A,-1 ;NO OPTIONS, REDICULOUS PC CFORK ERROR < NO FORKS AVAILABLE> MOVEM A,FORK ;HANDLE OF CURRENT INFERIOR FFORK ;LEAVE IT FROZEN ;TRANSMIT SPECIAL CAPABILITIES POSSIBLE TO NEW INFERIOR FORK, ; ENABLED IF ENABLED IN THIS EXEC. ;LATER SHOULD ONLY TRANSMIT RH, LH B0-B8 SHD COME FROM FILE __________ MOVE A,FORK MOVE B,[777000,,777777] ;XMIT WHEEL, ETC. BITS 0-8 ;WILL COME FROM FILE EVENTUALLY SKIPE LIMITC ;CAPABILITITES LIMITED? HLLZS B ;YES, DON'T PASS USER CAPABILITIES SKIPE C,PRVENF ;IF USER HAS "ENABLE"D IN THIS EXEC, MOVE C,B ;ENABLE TRANSMITTED CAPABILITIES EPCAP MOVE A,[INPTTY,,PTTYMD] BLT A,PTTYMD+NTTYMD-1 ;SETUP INITIAL TTY MODES RET ;SUBNAM ;SUBR THAT CONVERTS JFN IN B TO APPROPRIATE SUBSYSTEM NAME WORD ; FOR "SETNM" JSYS. ;STORES IN CELL "SUBSYS", DOESN'T "SETNM". ;TRANSPARENT, ONE USE IN "GET" CODE. SUBNAM: PUSH P,A PUSH P,B PUSH P,C PUSH P,D ;GET STRING FOR GIVEN JFN MOVE A,CSBUFP ;JFN IS IN B MOVE C,[1B2+1B5+1B8+1B35] JFNS ;DEVICE:NAME SETZ A, ;CONV DIR NAME TO SIXBIT IN A MOVEI B,6 MOVE D,[POINT 6,A,-1] ILDB C,CSBUFP CAIE C,"<" ;LOOK FOR START OF DIR NAME JRST .-2 ILDB C,CSBUFP CAIE C,">" ;END OF DIR NAME? JRST [ SUBI C,40 ;NO, CONV TO SIXBIT JUMPLE B,.-2 ;DON'T STORE IF ALREADY 6 CHARS IDPB C,D SOJA B,.-2] CAME A,['SUBSYS'] ;BELIEVE SUBSYS OR HACKS DIRECTORY CAMN A,['HACKS '] JRST SUBN4 CAMN A,['SYSTEM'] JRST SUBN4 ;BELIEVE SYSTEM, TOO MOVE A,['(PRIV)'] ;PRIVATE DIRECTORY, USE (PRIV) JRST SUBN5 ;COMPARE SUCCEEDED, PACK SUBSYSTEM FILE NAME INTO SIXBIT AND USE IT. SUBN4: SETZ A, MOVE B,[POINT 6,A,-1] MOVEI D,6 SUBN4A: ILDB C,CSBUFP JUMPE C,SUBN5 ;END OF NAME, DONE TRC C,40 ;CONVERT TO SIXBIT IDPB C,B SOJG D,SUBN4A ;ALSO STOP AT 6 CHARS SUBN5: MOVEM A,SUBSYS ;SUBSYS=PTTYMD+10 JRST [ POP P,D POP P,C POP P,B POP P,A RET] ;GOTO .GOTO: CALL OCTAL JRST CERR ALLOW TSPC+TALT+TEOL MOVE B,A ;ADDRESS INTO B FOR USE BELOW SKIPGE FORK ;CHECK HANDLE OF FORK KNOWN TO EXEC ERROR ; ;NONE AT ALL CALL MAPPF ;MAP PAGE CONTAINING ADDRESS. GETS ACCESS. TLNN A,B5 ERROR TLNN A,B4 ERROR CONFIRM CALL CHKPAT ;SETUP STUFF FOR PA1050 IF LOADED ;START FORK AT ADDRESS IN B ;"DDT" JOINS HERE GOTO2: SETO A, CALL MAPPF ;UNSHARE MAPPED PAGE, IF ANY MOVEI E,PTTYMD ;SET UP PROGRAM'S TELETYPE MODES CALL LTTYMD ;.. TLO Z,RUNF ;SAY PROGRAM'S TELETYPE MODES ARE IN EFFECT CALL IFORK ;PREPARE FORK(S) AND SETUP LFORK TLNN B,1 ;DON'T START IF LH NON-0 SFORK ;START FORK (USES A AND B) JRST $WAIT ;WAIT FOR IT TO TERMINATE ; "BDDT" COMMAND AND "NO BDDT" COMMANDS ;F1 IS CLEARED BY MAIN DISPATCH (TO .BDDT) AND SET BY "NO" .BDDT: TLNE Z,F1 ;"NO BDDT" COMMAND? JRST .NOBD SETOM A CALL MAPPF ;UNMAP ANY INFERIOR PAGE INTOFF ;WHILE THINGS ARE UP IN THE AIR MOVEI 1,BDFORK ;POINTER TO WHICH TO SETUP CALL CDBGFK ;CREATE DEBUGGER AND/OR USER FORKS JRST BDDT5 ;ALREADY EXISTS BDDT1: HRROI 2,[ASCIZ /BDDT.SAV/] MOVE 3,['BDDT '] CALL LDRUND ;LOAD AND RUN IT, DO INTON JRST $WAIT BDDT5: CALL RSPLIC ;RESPLICE UFORK UNDER (DBFORK), REENTER JRST $WAIT ; "NO BDDT" COMMAND .NOBD: INTOFF MOVEI 1,BDFORK ;OLD SUPERIOR MOVEI 2,IDFORK ;DESIRED NEW SUPERIOR CALL USPLIC ;DO THE UNSPLICE/RESPLICE INTON RET ; "IDDT" COMMAND AND "NO IDDT" COMMANDS ;F1 IS CLEARED BY MAIN DISPATCH (TO .IDDT) AND SET BY "NO" .IDDT: TLNE Z,F1 ;"NO IDDT" COMMAND? JRST .NOID SETOM A CALL MAPPF ;UNMAP ANY INFERIOR PAGE INTOFF ;WHILE THINGS ARE UP IN THE AIR MOVEI 1,IDFORK ;POINTER TO WHICH TO SETUP CALL CDBGFK ;CREATE DEBUGGER AND/OR USER FORKS JRST IDDT5 ;ALREADY EXISTS IDDT1: HRROI 2,[ASCIZ /IDDT.SAV/] MOVE 3,['IDDT '] CALL LDRUND ;LOAD AND RUN IT, DO INTON JRST $WAIT IDDT5: CALL RSPLIC ;RESPLICE UFORK UNDER (DBFORK), INTON JRST $WAIT ; "NO IDDT" COMMAND .NOID: INTOFF MOVEI 1,IDFORK ;OLD SUPERIOR MOVEI 2,BDFORK ;DESIRED NEW SUPERIOR CALL USPLIC ;DO THE UNSPLICE/RESPLICE INTON RET ;ROUTINES USED BY COMMANDS WHICH RUN PROGRAMS SUCH AS IDDT, BDDT, ; TENEX LOADERS, ETC. THESE ALL OPERATE ON A "USER FORK". WHEN ; THE COMMAND IS INVOKED, THE USER IS SPLICED UNDER THE FORK ; CONTAINING THE OPERATIONAL PROGRAM ;VARIABLES INVOLVED ARE: ; UFORK: CONTAINS -1 OR HANDLE OF USER FORK ; IDFORK: -1 OR HANDLE OF FORK CONTAINING IDDT ; BDFORK: -1 OR HANDLE OF FORK CONTAINING BDDT ; DBFORK: CONTAINS THE ADDRESS (IDFORK, BDFORK, ETC) OF THE ; DEBUGGER (OR WHATEVER) CURRENTLY SPLICED ABOVE THE USER. ; FORK: (NO CHANGE) THE FORK THE EXEC IS CURRENTLY CONSIDERING ; FOR THINGS LIKE ^T, MEMSTAT, ETC. ; LFORK: (NO CHANGE) FORK WHICH WILL BE RESUMED BY CONTINUE. ;CREATE THE DEBUGGER FORK AND/OR USER ; 1: POINTER TO CELL TO REMEMBER THE HANDLE ; SKIPS IF NEW FORK WAS CREATED FOR DEBUGGER CDBGFK: SKIPL 0(1) ;IS THERE A DEBUGGER ALREADY? RET ;YES, NO-SKIP RETURN PUSH P,1 SKIPGE FORK ;IS THERE AN INFERIOR? CALL ECFORK ;NO, MAKE ONE PUSH P,FORK ;SAVE INFERIOR CALL ECFORK ;GET A NEW FORK MOVE 1,FORK ;NEW FORK POP P,FORK ;USER FORK MOVEM 1,@0(P) ;SETUPT IDFORK OR BDFORK, ETC POP P,1 MOVEM 1,DBFORK ;REMEMBER AS SUPERIOR OF UFORK AOS 0(P) ;SKIP RETURN RET ;LOAD AND RUN THE DEBUGGER ; 1: POINTER TO LOCATION CONTAINING THE HANDLE ; 2: POINTER TO ASCIZ FILE NAME ; 3: SETNM WORD LDRUND: PUSH P,1 ;LOCATION CONTAINING HANDLE PUSH P,3 ;SIXBIT OF 2 MOVSI 1,(1B2!1B17) ;OLD, SHORT GTJFN JRST [ SETOM 1 EXCH 1,@-1(P) KFORK JRST CERR] HRL 1,@-1(P) ;FORM FORK.JFN GET MOVE 1,@-1(P) GEVEC HLRZS 2 ;GET LENGTH CAIGE 2,8 ;GENERAL SUSPICION CAIGE 2,3 JRST [ SETOM 1 EXCH 1,@-1(P) KFORK UERR [ASCIZ /BAD ENTRY VECTOR/]] LDRUN2: MOVE 1,@-1(P) MOVE 2,FORK MOVEM 2,UFORK ;REMEMBER WHERE THE USER IS SPLFK ;MAKE B INFERIOR TO A CALL [ PUSH P,1 ;SAVE ERROR CODE SETO 1, EXCH 1,@-2(P) KFORK POP P,1 JRST JERR] ;GO SAY ERROR FROM JSYS LDRUN3: MOVEM 1,PAGEN+1 ;HANDLE BY WHICH DEBUGGER WILL KNOW INF. POP P,SUBSYS ;SIXBIT SUBSYSTEM NAME MOVEI 2,PAGEN MOVE 1,@0(P) SFACS INTON MOVE 1,@0(P) MOVEI 2,2 MOVEI 3,SFVILI ;ROUTINE TO CATCH ILLEGAL INSTRUCTIONS MOVEM 3,ILIDSP ;TRAPS OUT OF SFRKV LDRUN4: SFRKV ;AT SPLICED ENTRY SETZM ILIDSP ;CANCEL TRAP MOVEM 1,LFORK ;FORK TO RUN IS DEBUGGER MOVEI E,PTTYMD ;RESTORE TTY MODES CALL LTTYMD TLO Z,RUNF ;TELL ^C ROUTINE WHAT TO DO POP P,1 RET ;UNSPLICE ; 1: POINTER TO CELL CONTAINING HANDLE OF OLD SUPERIOR ; 2: POINTER TO CELL CONTAINING OF DESIRED NEW SUPERIOR USPLIC: SKIPG 0(1) ;ANY OLD SUPERIOR? RET ;NO SKIPG UFORK CALL SCREWUP ;DEBUGGER WITH NO INFERIOR? PUSH P,1 SKIPG 1,0(2) ;NEW SUPERIOR SPECIFIED? MOVEI 1,400000 ;NO, USE THE EXEC ITSELF MOVE 2,UFORK ;GET HANDLE OF USER FORK MOVEM 2,FORK ;POINT THE EXEC AT HIM MOVEM 2,LFORK ;THAT IS THE FORK TO RESUME WITH A CONT. SPLFK CALL SCREWUP POP P,2 SETO 1, EXCH 1,0(2) KFORK RET ;RESPLICE THE USER FORK UNDER THE DEBUGGER FORK IF NEEDED ; 1: POINTER TO CELL CONTAINING DEBUGGER FORK HANDLE RSPLIC: PUSH P,1 ;SAVE POINTER TO HANDLE PUSH P,0(1) ;SAVE ACTUAL HANDLE CAMN 1,DBFORK ;USER ALREADY UNDER DEBUGGER? JRST RSPLI5 ;YES MOVE 1,0(P) ;GET DEBUGGER HANDLE MOVE 2,UFORK ;FORK CONTAINING THE USER SPLFK CALL SCREWUP RSPLI5: INTON POP P,1 MOVEI 2,1 ;REENTER ADDRESS MOVEI 3,SFVILI ;SET TO TRAP ILLEAL SFRKV'S MOVEM 3,ILIDSP SFRKV SETZM ILIDSP MOVEM 1,LFORK MOVEI E,PTTYMD CALL LTTYMD ;LOAD PROGRAM'S TTY MODES TLO Z,RUNF POP P,DBFORK ;POINT AT WHICH DEBUGGER IS IN USE RET ;INTERROGATE (THE ARCHIVE) ;NOTE: THE INTERROGATE PROGRAM EATS THE REST OF THE COMMAND LINE. .INTER: ALLOW TSPC+TALT HRROI 2,[ASCIZ /ARCHIVE-LOOKUP.SAV/] CALL TRYGTJ ERROR TLO KWV1,PROGX ;SAY CONFIRMATION TO BE DONE BY LOOKUP JRST CIN4 ;GO HANDLE AS AN EPHEMERON ;JFNCLOSE .JFNCL: CALL OCTAL JRST CERR ALLOW TSPC+TALT+TEOL CAIG A,77 CAIGE A,0 JRST CERR GTSTS TLNN B,B10 JRST CERR ;INVALID OR UNASSIGNED JFN CONFIRM MOVE B,JBUFP PUSH B,A ;PUT JFN IN STACK WHERE RLJFNS LOOKS MOVEM B,JBUFP JRST RLJFNS ;CLOSE IF OPEN, AND RELEASE JFN. ;LIMIT (ADDITIONAL) CORE/CPU/DISK/KILOCORESECS (TO) N .LIMIT: NOISE KEYWD $LIMIT T CPU,LPROK ;IS CPU THE RIGHT THING TO DEFAULT TO? JRST CERR NOISE CALL DECIN ;READ A NUMBER INTO A ALLOW TEOL+TALT+TSPC+TLPR JRST (KWV) ;DISPATCH $LIMIT: TABLE T CORE,LPROK T CPU,LPROK T DISK,LPROK T KILOCORESECS,LPROK TEND .CORE: NOISE CAILE A,1000 ERROR CONFIRM ;NOW WHAT? JRST NIYE .CPU: NOISE CAILE A,^D720 ERROR CONFIRM JRST NIYE .DISK: NOISE CAILE A,^D2000 ;? ERROR ; ;ETC CONFIRM JRST NIYE .KILOC: ALLOW TEOL+TALT+TSPC ;NO NOISE WORD CAILE A,^D1000 ;? ERROR CONFIRM JRST NIM ;SAY "NOT IN MINISYSTEM" ;LINK (TERMINAL/USER) .LINK: NOISE (TO) CALL TTYNUM ;GET LINE NUMBER, MAYBE FROM USER NAME MOVEI B,400000(A) ;FORM TTY DESIGNATOR HRLOI A,(1B2!1B3) ;TO AND FROM CONTROLLING TTY TLINK ERROR RET ;"LIST" IS WITH "TYPE" BELOW. ;LOGIN COMMAND ;LOGIN (USER) (PASSWORD) (ACCOUNT [#]) <#> .LOGIN: SKIPLE CUSRNO ERROR CALL LGNCHK ;TYPE MSG IF LOGINS ARE PROHIBITTED JUMPE A,LOGIN0 ;NOTHING WAS TYPED, PROCEDE TYPE < YOU MAY "ATTACH" TO AN EXISTING JOB> ;PROVIDE ADDITIONAL INFO RET ;DECODE ARGUMENTS ;TWO GENERAL FORMS ACCEPTED: ARGS ON SAME LINE, TERMINATED WITH ;SPACE OR ALT MODE, AND ARGS ON SEPARATE LINES, TERMINATED WITH EOL. ;SECOND FORM IS INCONSISTENT WITH REST OF EXEC LANGUAGE BUT WAS ADDED ;BECAUSE IT MAKES HDX LOGIN CLEANER: ON HALF DUPLEX TTY, PASSWORD ;IS INPUT ON A SEPARATE LINE WHERE A MASK HAS BEEN TYPED. ;SPECIAL HANDLING OF EOL AS A TERMINATOR IS DONE BY THE "SPECEOL" SUBR ;WHICH IMMEDIATELY FOLLOWS "LOGIN" IN THIS LISTING. LOGIN0: CALL SPECEOL ;HANDLE TERMINATOR FOR THE WORD "LOGIN" ;FIRST ARGUMENT: USER NAME NOISE ; ;SEE COMMENTS ON "SPECEOL" ABOUT "NOISE" CALL USERN ;INPUT USER NAME, XLATE TO USER # IN A ;USE "DIRNAM" IF RECOGNITION DESIRED PUSH P,A ;SAVE INFO RETURNED BY "STDIR" TLNE A,B0 ERROR CALL USRCHK ;FILTER OUT "ANONYMOUS" ETC. CALL SPECEOL ;HANDLE TERMINATOR OF "USER" FIELD ;2ND ARGUMENT: PASSWORD HRRZ A,(P) ;USER # CALL PASWD ;INPUT PASSWORD, RETURN POINTER IN A. PUSH P,A ;SAVE PTR FOR USE IN "LOGIN" JSYS CALL ;3RD ARGUMENT: ACCOUNT NUMBER MOVE A,-1(P) ;WHAT STDIR RETURNED:B1 SAYS STRING ACCT TLNN A,B1 NOISE ; IF USER REQUIRES NUMERIC ACCOUNT TLNE A,B1 NOISE ; IF USER REQUIRES STRING CALL ACCT ;INPUT AND DECODE ACCT # (USES A) PUSH P,A ;SAVE FOR LOGIN JSYS PUSH P,B ;SAVE PIE SLICE CONFIRM ;CONFIRM THE WHOLE COMMAND ;LOGIN... ;ALL ARGS DECODED, NOW LOG THE GUY IN SETOM MESMSF ;SAY TYPE "YOU HAVE A MESSAGE" IF ;APPROPRIATE, EVEN AFTER ^C'S POP P,D ;PIE SLICE POP P,C ;ACCT # OR PTR THERETO POP P,B ;PASSWORD PTR HRRZ A,(P) ;USER # LOGIN CALL [ CAIN A,LGINX1 ;CHECK FOR A FEW ERRORS NOT CHECKED B4. UERR [ASCIZ /ILLEGAL ACCOUNT/] JRST JERR] ;GNRL JSYS ERR RET ROUTINE (XSUBRS.MAC). MOVE B,(P) ;WHAT "STDIR" RETURNED HRRZM B,CUSRNO ;STORE USER NUMBER HLLZM B,MODES ;STORE USER MODE BITS PUSH P,A ;SAVE DATE & TIME OF LAST LOGIN ;UPDATE SPECIAL CAPABILITIES MOVEI A,B0 RPCAP HLLZ C,B SKIPE PRVENF HRR C,B EPCAP TRNE B,1B18!1B19!1B20 ;IF WHEEL, OPER, OR CONFI SETOM LIMITC ;DEFAULT TO LIMITED CAPS. ;LOGIN... ;KILL AUTOLOGOUT FORK WHICH WATCHES FOR ABANDONED JOB SKIPG ALOFH ;AUTOLOGOUT FORK HANDLE, OR 0 OR -1 JRST LOGIN6 ;NO AUTOLOGOUT FORK - EG STARTUP FAILED INTOFF MOVE A,ALOFH KFORK ;KILL THE FORK SETOM ALOFH ;SAY THE ALO FORK HAS BEEN KILLED INTON ;TYPE "JOB ON LINE N