TITLE COMCON - COMMAND DECODER AND SAVEGET ROUTINES - V433 SUBTTL /RCC 03 JUN 69 XP VCOMCN,433 ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB ENTRY COMCON ;ALWAYS LOAD COMCON IF LIBRARY SEARCH COMCON: ;CALLED FROM CLOCK ROUTINE WHEN 'COMCNT' IS GREATER THAN 0 ;AS SET BY TTY SERVICE ROUTINE ;ALL AC'S HAVE BEEN SAVED BY CLOCK CHANNEL ;THE COMMAND DECODER CALLS TTYCOM WHICH SCANS FOR TTY WHICH TYPED ;THE COMMAND AND THEN DISPATCHES(PUSHJ) TO APPROPRIATE ;COMMAND SETUP ROUTINE OF THE SAME NAME WITH AC'S SET AS: ;ITEM = JOB NUMBER ;TAC = BYTE POINTER TO COMMAND STRING(SPACE OR CR AFTER COMMAND NAME) ;DAT = BYTE POINTER TO LAST OUTPUT CHARACTER ;DEVDAT = ADDRESS OF DEVICE DATA BLOCK TYPING COMMAND ;JDAT = ADDRESS OF JOB AREA, = 0 IF NO JOB AREA ;PROG = ADDRESS OF PROGRAM AREA, 0 MEANS NOT IN CORE OR NO CORE ;IOS IS SET TO 0, USED FOR ADDRESS OF SUBSEQUENT CALLS ;DEVDAT IS ALSO PUSHED ON END OF PO LIST SO IT MAY BE DESTROYED ;UPON RETURN FROM COMMAND SETUP ROUTINE, A CR-LF IS ADDED TO ;MESSAGE AND TTY IS STARTED ON TTYP SPECIFIED BY -1(PDP) ;SEVERAL COMMAND FLAGS ARE CHECKED BEFORE DISPATCHING TO ;COMMAND SETUP ROUTINES TO SEE IF COMMAND IS LEGAL AT THIS TIME ;SEVERAL MORE FLAGS ARE CHECKED UPON RETURN FROM COMMAND SETUP ;ROUTINES(UNLESS AN ERROR HAS OCCURRED) FOR STANDARD ;COMMAND RESPONSE ;IF AN ERROR OCCURS, THE JOB NO.(ITEM) SHOULD BE 0 ON RETURN ;SO THAT JOB WILL NOT BE INITIALIZED IF FIRST COMMAND. ;ERRMES ROUTINE WILL SET ITEM TO 0 ;SINCE THE COMMAND DECODER IS CALLED FROM THE CLOCK ROUTINE ;COMMAND SETUP ROUTINE MUST RUN TO COMPLETION QUICKLY ;IF A COMMAND FUNCTION CANNOT DO THIS, IT MUST JUST SET ;THE JOB TO RUNABLE STATUS AND RETURN IMMEDIATELY ;OR DELAY THE COMMAND FOR LATER EXECUTION INTERNAL COMMAND INTERNAL FTLOGIN,FTSWAP,FTTIME EXTERNAL COMCNT,TTYCOM,JBTSTS,JOBMAX,JBTDAT,JBTADR,JOBHCU EXTERNAL CONFIG,HIGHJB EXTERNAL TTYSTR,TTYUSR,TTYATT EXTERNAL TTYTAB,PUNIT,TTYATI EXTERNAL ADRERR,ANYACT,ASSASG,CORE0,DAMESS,DEVLG,DEVPHY,DEVSRC EXTERNAL DLYCOM,ERNAM,ESTOP,GETWD1,GETWDU,KSTOP,CORE1,MONJOB,DECP1 EXTERNAL MONSTR,MSTART,OCTPNT,PHOLD,PRNAME,RADX10,RELEA5 EXTERNAL RELEA6,RESET,SETRUN,STOP1 EXTERNAL STOTAC,UPTIME,USRXIT,USTART,UUOERR T=BUFPNT ;TEMPORARY AC'S T1=BUFWRD T2=UUO T3=AC1 T4=AC2 COMMAND:PUSHJ PDP,TTYCOM ;SETUP DEVDAT,DAT,TAC,AND ITEM ; FOR ANY TTY WHICH HAS TYPED A COMMAND COM0: POPJ PDP, ;NONE FOUND PUSH PDP,DEVDAT ;SAVE TTY DEVICE DATA BLOCK ADDRESS PUSHJ PDP,CTEXT ;SCAN COMMAND NAME, RETURN IT IN TAC1 MOVE T,TAC1 ;COPY COMMAND. MOVNI T1,1 ;SET MASK ALL ONES LSH T1,-6 ;CLEAR OUT ONE MORE CHAR. LSH T,6 ;SHIFT 1 COMMAND CHAR OFF JUMPN T,.-2 ;IF NOT END OF COMMAND. GO AROUND MOVEI T4,0 ;CLEAR FLAG REGISTER MOVSI T,-DISPL ;SEARCH COMMAND TABLE FOR MATCH COMLP: MOVE T2,COMTAB(T) ;GET NEXT ENTRY FROM COMMAND TABLE TDZ T2,T1 ;MASK OUT CHAR 5 CAMN TAC1,COMTAB(T) ;EXACT MATCH? JRST COMFND ;YES, THIS IS IT. CAME TAC1,T2 ;MATCH? JRST COMNEQ ;NOT EVEN GOOD MASK TROE T4,1 ;MATCHES MASKED, IS THIS FIRST ONE TROA T4,2 ;NO, SET 2ND OCCUR FLAG MOVE T3,T ;YES, COPY CURRENT INDEX COMNEQ: AOBJN T,COMLP ;NO, KEEP LOOKING CAIN T4,1 ;DID ONE AND ONLY ONE COMMAND MATCH? MOVE T,T3 ;YES, GET ITS INDEX COMFND: MOVE TAC1,DISP(T) ;GET DISPATCH TABLE ENTRY, PUSH PDP,TAC1 ;SAVE RH(DISPATCH ADR,+BITS) MOVE T,JBTSTS(ITEM) ;JOB STATUS WORD FOR THIS JOB IFN FTLOGIN,< TLNN T,JLOG ;IS JOB LOGGED IN? TLNE TAC1,NOLOGIN ;NO, CAN COMMAND PROCEED WITH NO LOGIN? JRST CHKNO ;YES JSP TAC,COMER ;NO, TYPE "LOGIN PLEASE" ASCIZ /LOGIN PLEASE / > CHKNO: JUMPN ITEM,CHKRUN ;JOB NUMBER ALREADY ASSIGNED? TLNE TAC1,NOJOBN ;NO, DOES THIS COMMAND NEED A JOB NUMBER? JRST COMGO ;NO MOVEI ITEM,1 ;YES, SCAN FOR ONE STARTING WITH 1 NUMLOP: MOVE T,JBTSTS(ITEM) ;SCAN FOR FREE JOB NO. TLNN T,JNA+CMWB ;THIS NUMBER ASSIGNED? JRST NEWJOB ;NO, SO USE THIS NUMBER CAIGE ITEM,JOBMAX ;YES, IS THE MAX. JOB NO.? AOJA ITEM,NUMLOP ;NO, KEEP LOOKING JSP TAC,COMER ;YES, NONE LEFT, PRINT "JOB CAPACITY EXCEEDED" ASCIZ /JOB CAPACITY EXCEEDED / ; EVEN THROUGH THIS IS A NEW JOB NUMBER ; IT MAY HAVE CORE ASSIGNED NOW BECAUSE IT WAS DELAYED ; UNTIL IT COULD BE SWAPPED IN(LOGIN WITH CORE FULL) NEWJOB: MOVEI T1,ASSCON ;SET ASSIGNED BY CONSOLE BIT FOR TTY IORM T1,DEVMOD(DEVDAT) ;SO OTHER JOBS CAN NOT USE SETZM DEVLOG(DEVDAT) ;SET LOGICAL NAME TO ZERO ; "TTY" IS PUBLIC LOGICAL NAME IFN FTTIME,< SETZM RTIME(ITEM) ;CLEAR INCREMENTAL JOB RUNNING TIME SETZM TTIME(ITEM) ;CLEAR TOTAL JOB RUNNING TIME > IFN FTKCT,< EXTERN JBTKCT SETZM JBTKCT(ITEM) ;CLEAR CORE-RUNNING TIME CORE > CAMLE ITEM,HIGHJB ;HIGHEST JOB NUMBER ASSIGNED? MOVEM ITEM,HIGHJB ;YES,SAVE IT FOR SCHEDULER SCAN OF JOBS CHKRUN: TLNE T,RUN ;RUN BIT ON IN JOB STATUS? TLNN TAC1,NORUN ;YES, DOES THIS COMMAND REQUIRE A JOB? JRST CHKACT ;NO JSP TAC,COMER ;YES. ASCIZ /PLEASE TYPE ^C FIRST / CHKACT: IFN PROG-JDAT,< MOVE JDAT,JBTDAT(ITEM) ;ADDRESS OF JOB DATA AREA > MOVE PROG,JBTADR(ITEM) ;XWD PROTECTION,RELOCATION IFN FTSWAP,< TLNE TAC1,INCOR!NOTRAN ;MUST JUST NOT BE SWAPPING OR ; IF JOB HAS CORE ASSIGNED, MUST IT BE ; IN PHYSICAL CORE (RATHER THAN DISK OR ON ITS WAY) TLNN T,SWP ;YES, IS JOB ON DISK OR ON ITS WAY? JRST CHKCO2 ;NO TLNN TAC1,INCOR ;YES, MUST JOB BE IN CORE? JUMPE PROG,CHKCO2 ;NO, IS A SWAP FOR THIS JOB IN PROGRESS? ; NO, SO COMMAND MUST BE DELAYED ; (EITHER BECAUSE SWAP IN PROGRESS OR ; JOB ON DISK AND MUST BE IN PHY CORE) HRRI TAC1,DLYCM ;ASSUME JOB MUST BE IN PHY CORE ; SO SET TO SWAP JOB IN TLNN TAC1,INCOR ;IS THIS TRUE? CHKDLY: HRRI TAC1,DLYCM1 ;NO, JUST DELAY COMMAND UNTIL SWAP OUT OR IN IS FINISHED JRST COMDIS ;AND DISPATCH TO DELAY COMMAND > CHKCO2: TLNE TAC1,NOACT ;CAN COMMAND BE PERFORMED WITH ACTIVE DEVICES? PUSHJ PDP,RUNCHK ;NO, RETURN IF JOB STOPPED AND NO ACTIVE DEVICES CHKCO1: TLNE TAC1,NOCORE ;DOES THIS COMMAND NEED CORE? JRST COMGO ;NO, GO DISPATCH JUMPN PROG,CHKXPN ;YES, IS CORE IN MEMORY? JSP TAC,COMER ;NO, PRINT "NO CORE ASSIGNED" ASCIZ /NO CORE ASSIGNED / CHKXPN: TLNN TAC1,PLSXPN ;DOES THIS COMMAND NEED CORE TO BE EXPANDED? JRST COMGO ;NO HLRE IOS,JOBHCU(JDAT) ;YES, IS CORE STILL COMPRESSED(SAVE DID NOT GO ; TO COMPLETION) AOJGE IOS,COMGO ;LH=-2 DURING SAVE, WHEN CORE COMPRESSED ;LH=-1 DURING SAVE OF HIGH SEG, OR GET OF LOW ; OR HIGH SEG PUSHJ PDP,EXPAND ;YES, EXPAND CORE FIRST JFCL ;IGNORE ADDRESS CHECK ERROR, WE TRIED IFN FTSWAP,< JRST CHKDLY ;DELAY COMMAND BECAUSE COMMAND DECODER ACS ARE ; ALL GONE, NEXT TIME JOBHCU WILL BE 0 > IFE FTSWAP,< HRRI TAC1,DLYCM1 ;DELAY COMMAND TILL NEXT CLOCK TICK JRST COMDIS > COMER: MOVSI TAC1,NOINCK MOVEM TAC1,(PDP) MOVEI TAC1,CERR ;CALL ERROR MESSAGE ROUTINE COMGO: MOVSI IOS,CMWRQ TLZN T,CMWB ;CLEAR CMWB; WAS JONB IN COMM WAIT ANDCAM IOS,(PDP) ;NO, CLEAR REQUEU BIT IN DISP. FLAGS MOVEM T,JBTSTS(ITEM) COMDIS: MOVEI IOS,0 ;CLEAR IOS FOR SETTING DISPATCH ADDRESSES PUSHJ PDP,(TAC1) ;DISPATCH TO COMMAND SETUP ROUTINE. ;RETURN FROM COMMAND SETUP ROUTINE COMRET: POP PDP,T1 ;RESTORE COMMAND FLAGS POP PDP,DEVDAT ;RESTORE TTY DDB ADDRESS. IFN FTTTYSER,< EXTERN TITAKR,TISYNC LDB TEM,TITAKR(DEVDAT) ;GET BREAK CHARACTER PUSHJ PDP,SKPBRK ;SKIP TO BREAK CHAR SOS TISYNC(DEVDAT) ;REDUCE LINE COUNT > MOVSI T,400000 LDB TAC,PUNIT ANDCAM T,TTYTAB(TAC) ;YES. TURN OFF SIGN BIT SOS COMCNT JUMPN ITEM,COMRT1 ;DID AN ERROR OCCUR? TLNN T1,NOJOBN ;I.E., ITEM=0 AND NOJOBN=0? MOVSI T1,NOINCK+ERRFLG+CMWRQ ;YES, PRINT ERROR MESSAGE ONLY, AND ;REQUEUE JOB IF NECESSARY. COMRT1: MOVE T,JBTSTS(ITEM) ;JOB STATUS WORD TLNN T1,NOINCK ;SUPPRESS JOB INIT. CHECK? TLOE T,JNA ;NO, IS JOB INIT BIT ALREADY SET? JRST PCRLF ;YES. MOVEM T,JBTSTS(ITEM) ;NO, SO SET IT THIS COMMAND PUSHJ PDP,TTYATI ;ATTACH TTY TO JOB JFCL ;INGORE IF CAN NOT(SHOULD NEVER HAPPEN) PUSHJ PDP,INLMES ;AND PRINT "JOB " ASCIZ /JOB / MOVE TAC,ITEM ;PRINT JOB NUMBER PUSHJ PDP,RADX10 PUSHJ PDP,PRSPC MOVEI TAC,CONFIG ;PRINT SYSTEM CONFIGURATION NAME PUSHJ PDP,CONMES IFN FTLOGIN, < PUSHJ PDP,CRLF > IFE FTLOGIN, < PUSHJ PDP,PRSPC PUSHJ PDP,DAYTM1 > PCRLF: TLNE T1,ERRFLG ;DID AN ERROR OCCUR? PUSHJ PDP,PRQM ;YES. APPEND ? TLNN T1,NOCRLF ;SUPRESS CRLF? PUSHJ PDP,CRLF ;NO TLNN T1,NOPER ;SUPRESS PRINTING PERIOD? PUSHJ PDP,PRPER ;NO JUMPE ITEM,PCRLF1 ;JOB DOES NOT RUN IF ERROR OR NO JOB NO. ASSIGNED TLNE T1,TTYRNU ;JOB TO RUN WHEN TTY FINISHED TYPING? ; COMMAND RESPONSE (TTY TO USER MODE)? PUSHJ PDP,TTYUSR ;YES, CALL SCANNER ROUTINE TLNE T1,TTYRNC ;NO. JOB TO RUN AND REMAIN IN MONITOR MODE? PUSHJ PDP,SETRUN ;YES, CALL SCANNER ROUTINE PCRLF1: TLNN T1,NOMESS ;IS THERE A MESSAGE? PUSHJ PDP,TTYSTR ;YES. START TTY TYPING IT OUT IFN FTSWAP, < EXTERN PJOBN,REQUE LDB ITEM,PJOBN ;GET JOB NUMBER FROM TTY DEVICE DATA BLOCK JUMPE ITEM,CPOPJ TLNE T1,CMWRQ ;REQUEUE JOB AFTER COMMAND WAIT OR ERROR? JRST REQUE ;YES > POPJ PDP, IFN FTTTYSER, ;TABLE OF CONSOLE COMMANDS INTERNAL FTATTACH,FTTIME,FTTALK,FTEXAMINE,FTLOGIN,FTREASSIGN INTERNAL FTFINISH,FTCCL ;BITS CHECKED BEFORE DISPATCHING TO COMMAND SETUP ROUTINE NOCORE=400000 ;NO CORE NEEDED FOR COMMAND NOJOBN=200000 ;NO JOB NUMBER NEEDED FOR COMMAND NOLOGIN=100000 ;JOB DOES NOT NEED TO BE ALREADY LOGGED IN. NOACT=40000 ;COMMAND MUST BE DELAYED IF JOB HAS ACTIVE DEVICES. NOTRAN=20000 ;COMMAND MUST BE DELAYED IF SWAPPED TRANSFER IN PROGRESS NORUN=10000 ;AN EXPLICIT ^C MUST BE TYPED BY USER BEFORE COMMAND ; IS EXECUTED IF JOB IS RUNNING ; JOB MUST BE SWAPPED IN IF IT HAS LOGICAL CORE INCOR=4000 ;USED ONLY BY COMMAND DISPATCH ; DOES NOT APPEAR IN COMMAND TABLE INCORE=4000!NOTRAN ;COMMAND MUST BE DELAYED IF JOB HAS LOGICAL CORE ; WHICH IS ON DISK OR ON ITS WAY IN OR OUT. ; JOB WILL BE SWAPPED IN (SEE DLYCOM) ; AND IS NOT SITTING QUIETLY IN CORE(IE NO SWAPPING TRANSFER) PLSXPN=4 ;CORE MUST BE EXPANED IF STILL COMPRESSED BY SAVE NOT GOING ; TO COMPLETION(CONTROL C OR DEVICE OK?) ; MUST BE USED IN CONJUNCTION WITH COMMANDS WHICH ; NEED CORE AND NEED IT IN CORE ;BITS CHECKED AFTER RETURN FROM COMMAND SETUP ROUTINE CMWRQ=2000 ;REQUEUE JOB AFTER COMMAND WAIT NODATE=1000 ;DON'T PRINT DATE DURING JOB INTERROGATION NOINCK=400 ;NO CHECK FOR JOB INITIALIZATION (JNA=0) NOCRLF=200 ;NO PRINTING OF CRLF NOPER=100 ;NO PRINTING OF PERIOD TTYRNU=40 ;SET TTY TO USER MODE AND START JOB ; WHEN COMMAND RESPONSE STOPS TYPING TTYRNC=20 ;KEEP TTY IN COMMAND MODE AND START JOB ; WHEN COMMAND RESPONSE STOPS TYPING NOMESS=10 ;NO COMMAND RESPONSE EVER, DO NOT CALL TTYSTR ;4 TAKEN ABOVE BY 'PLSXPN' BIT ERRFLG=1 ;COMMAND ERROR DEFINE NAMES< C START,START,NOPER!TTYRNU!INCORE!NOACT!NORUN C HALT,STOP,NOCORE!NOJOBN!NOLOGIN!NOINCK!CMWRQ C KJOB,KJOB,NOCORE!NOJOBN!NOINCK!NOLOGIN!NOACT!NORUN!NOPER!NOCRLF!NOMESS!NOTRAN C <>,CBLANK,NOCORE!NOJOBN!NOLOGIN!NOINCK!NOCRLF C R,RCOM,NOCORE!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN C RUN,RUNCOM,NOCORE!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN C CORE,CORE,NOCORE!NORUN!CMWRQ!INCORE!NOACT!NOTRAN C GET,GET,NOCRLF!NOPER!TTYRNC!NOCORE!NOACT!NORUN!NOTRAN C SAVE,SAVE,NOCRLF!NOPER!TTYRNC!INCORE!NOACT!NORUN!PLSXPN IFN FT2REL,< C SSAVE,SSAVE,NOCRLF!NOPER!TTYRNC!INCORE!NOACT!NORUN!PLSXPN > C CONTINUE,CONT,NOPER!TTYRNU!INCORE!NORUN IFN FTEXAMINE,< C D,DCOM,CMWRQ!INCORE C E,ECOM,NOCRLF!CMWRQ!INCORE > C PJOB,PJOB,NOCORE C ASSIGN,ASSIGN,NOCORE C DEASSI,DEASSIGN,NOCORE!NOJOBN!NOINCK C DDT,DDTGO,NOPER!TTYRNU!INCORE!NORUN!PLSXPN IFN FTFINISH,< C FINISH,CFINI,TTYRNC!NOACT!INCORE!NORUN > C REENTER,REENTER,TTYRNU!NOPER!INCORE!NORUN!PLSXPN C CSTART,STARTC,TTYRNC!INCORE!NOACT!NORUN!PLSXPN C CCONTINUE,CONTC,TTYRNC!INCORE!NORUN IFN FTATTACH,< C DETACH,DETACH,NOPER+NOCRLF+NOCORE!NOJOBN!NOINCK C ATTACH,ATTACH,NOCORE!NOJOBN!NOLOGIN!NOINCK > C DAYTIME,DAYTIM,NOCORE!NOJOBN!NOLOGIN!NOINCK IFN FTTIME,< C TIME,RUNTIM,NOCORE!NOLOGIN!NOINCK > C RESOURCES,FREDEV,NOCORE!NOJOBN!NOLOGIN!NOINCK IFN FTLOGIN,< C SCHEDULE,SKEDUL,NOCORE!NOJOBN!NOLOGIN!NOINCK > IFN FTTALK,< C TALK,TALK,NOCRLF+NOPER+NOCORE!NOJOBN!NOLOGIN!NOMESS!NOINCK > IFN FTLOGIN,< C LOGIN,CLOGIN,NOCORE!NOLOGIN!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN > IFE FTLOGIN,< C LOGIN,CPOPJ,NOCORE!NOACT!NORUN!NOTRAN > IFN FTREASSIGN,< C REASSI,REASS,NOCORE!NOACT!INCORE!CMWRQ!NORUN > C HELP,HELP,NOCORE!NOLOGIN!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN C SYSTAT,SYSTAT,NOCORE!NOLOGIN!NOACT!NORUN!NOCRLF!NOPER!TTYRNU!NOTRAN IFN FTCCL,< C COMPILE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C CREATE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C CREF,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C DEBUG,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C DELETE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C DIRECT,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C EDIT,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C EXECUTE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C LIST,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C LOAD,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C MAKE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C RENAME,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C TECO,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C TYPE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN C CTEST,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN > > ;GENERATE TABLE OF SIXBIT COMMAND NAMES DEFINE C(A,B,D) < > COMTAB: NAMES DISPL=.-COMTAB ;LENGTH OF TABLE ;GENERATE THE DISPATCH TABLE PLUS SPECIAL BITS DEFINE C(A,B,D) < Z B (D) > DISP: NAMES XWD NOCORE+NOJOBN+NOLOGIN+NOINCK,NOCOM ;CALLED FROM COMMAND DECODER WHICH IS CALLED FROM CLOCK ROUTINE ;WITH FOLLOWING AC'S SET: ;TAC= BYTE POINTER TO COMMAND STRING(SPACE OR CR AFTER COMMAND NAME) ;ITEM = JOB NUMBER ;DAT = BYTE POINTER TO LAST OUTPUT CHARACTER ;DEVDAT = ADDRESS OF DEVICE DATA BLOCK INITIATING COMMAND ;JDAT = ADDRESS OF JOB DATA AREA, = 0 IF NO JOB AREA ;PROG=XWD PROTECTION,RELOCATION; 0 IF NO CORE ;IOS=0 ;UPON RETURN FROM COMMAND SETUP ROUTINE, A CR-LF IS ADDED IF ;NEEDED AND TTY IS STARTED ;SINCE THE COMMAND DECODER IS CALLED FROM THE CLOCK ROUTINE ;COMMAND SETUP ROUTINES MUST RUN TO COMPLETION QUICKLY ;IF A COMMAND FUNCTION CANNOT DO THIS, IT MUST JUST SET ;THE JOB TO A RUNABLE STATUS AND RETURN IMMEDIATELY EXTERN TTYFNU COR0: JUMPE PROG,CPOPJ ;RETURN IF JOB DOES NOT HAVE CORE JSP TAC1,MONJOB ;SET TO RUN MONITOR JOB(PC IN EXEC MODE) ; RETURN HERE AT UUO LEVEL(NO ACS SET UP) MOVEI TAC1,ESTOP ;PUT ERROR STOP ON END OF PDL JSP TAC,MONSTR ;START MONITOR JOB BY SETTING UP ACS AND JOB1: PUSHJ PDP,RESET ;RELEASE ALL IO DEVICES ASSIGNED TO THIS JOB PUSHJ PDP,TTYFNU ;FIND TTY FOR THIS JOB(SETUP ITEM WITH JOB NO.) IFN FTSWAP,< EXTERN ZERSWP,NOCORQ PUSHJ PDP,NOCORQ ;PUT JOB IN NO CORE Q PUSHJ PDP,ZERSWP ;CLEAR SWAP SPACE (IF ANY) FOR LOW SEG ; AND CLEAR SWP,SHF,IMGIN,IMGOUT FOR LOW SEG > IFN FT2REL,< EXTERN KILHGH PUSHJ PDP,KILHGH ;HIGH SEG FOR THIS USER. RETURN CORE ; REMOVE HIGH SEG FROM THIS USER LOGICAL ADDRESSING SPACE ; IF NO OTHER USERS IN CORE ARE USING IT ; RETURN DISKL SPACE IF NO LONGER SHARABLE HIGH SEG > MOVEI TAC,0 ;RETURN BOTH PHYSICAL AND LOGICAL CORE SOS (PDP) ;NEGATE SKIP RETURN WHICH CORE1 WILL DO JRST CORE1 ;GO DO IT AND RETURN TO CALLER ; "PJOB" PRINT JOB NUMBER OF JOB TTY IS ATTACHED TO INTERNAL PJOB,DECLF PJOB: MOVE TAC,ITEM ;JOB NO. DECLF: PUSHJ PDP,RADX10 ;PRINT TAC AS DEC. THEN CRLF JRST CRLF ; "KJOB" KILL ATTACHED JOB EXTERNAL JBTSTS,TTYKILM,CPOPJ INTERNAL FTTIME,JOBKL KJOB: JUMPE ITEM,JOBKB ;WAS JOB INITIALIZED? IFN FTLOGIN,< TLZN T,JLOG+JACCT ;TEST JACCT ALSO IN CASE COMMAND WAS DELAYED JRST KJOB2 ;IF JOB NOT LOGGED IN TLO T,JACCT ;DISABLE ^C MOVEM T,JBTSTS(ITEM) IFN FTSWAP, < PUSHJ PDP,ALOGN1 ;ATTACH TTY > MOVSI TAC,TTYRNU+NOMESS XORM TAC,-1(PDP) ;SET TTYRNU AND CLEAR NOMESS FOR COMRET MOVE TAC,[SIXBIT /LOGOUT/] ;NAME OF CUSP JRST ARCOM > KJOB2: IFE FTSWAP+FTLOGIN,< JUMPE PROG,JOBKA ;YES. DOES JOB HAVE CORE IN MEMORY? > PUSHJ PDP,GETMIN ;GET MINIMAL JOB AREA ON DISK OR CORE JUMPE PROG,DLYCM1 ;DELAY COMMAND IF CORE ASSIGNED ON DISK JSP TAC1,MONJOB ;YES, SCHEDULE MONITOR JOB(PC IN EXEC MODE) ;RETURN HERE AT UUO LEVEL WHEN SCHEDULED JOBKL: MOVEI TAC1,ESTOP ;PUT ESTOP ON END OF PDL JSP TAC,MONSTR ;GO SETUP ACS AND PD LIST PUSHJ PDP,JOB1 ;FLUSH CORE AFTER RELEASING DEVICES JOBKA: IFN FTTIME,< IFE FTLOGIN, < PUSHJ PDP,PRTTIM ;PRINT JUST TOTAL RUN TIME PUSHJ PDP,TTYSTR ;START TTY >> PUSHJ PDP,DEASTY ;DEASSIGN ALL BY TTY PUSHJ PDP,TTYKIL ;RETURN TTY TO VIRGIN STATE JRST KSTOP ;CLEAR JOB STATUS WORD AND STOP JOB ;ERROR IN COMMAND CERR: JRST ERRMES JOBKB: SETZM -1(PDP) ;CLEAR NOJOBN SO COMRET WILL PRINT ERROR MSG. JRST ATT4 ;"NOT A JOB" ; "START L" OR "START" - START AT LOC, L OR STARTING ADDRESS INTERNAL FT2REL EXTERNAL JOBSA START: ;SAME AS CSTART, DIFF BY COMTAB BITS ; WHICH PUT TTY IN MONITOR OR USER MODE ; "CSTART L" OR "CSTART" - START AT LOC. L(TTY IN COMMAND MODE) STARTC: PUSHJ PDP,OCTIN ;CONVERT POSSIBLE OCTAL NO ARG. IFE FT2REL,< SKIPA TAC1,JOBSA(JDAT) ;NO START ADR. SPECIFIED RETURN > IFN FT2REL,< JRST SNOARG ;NO ARG SPECIFIED RETURN > JRST COMERA ;ILLEGAL CHARACTER IFN FT2REL,< EXTERN CHKMED PUSHJ PDP,CHKMED ;CHECK TO SEE IF HIGH SEG WHICH IS SHARABLE ; IF YES, TURN ON USER MODE WRITE PROTECT ; FOR THIS USER, AND SET MEDDLE BIT SO HE CANNOT ; TURN UWP OFF.> JRST CHKSTR ;START JOB WITH PC IN USER MODE, ; IF START ADR IS NON-ZERO IFN FT2REL,< SNOARG: SKIPA TAC1,JOBSA(JDAT) ;NO. ARG SPECIFIED, USE START ADR SUPPLIED ; BY PROGRAM END STATEMENT AND STORED BY LINKING LOADER ; SKIP INTO REENTER, START WITH PC IN USER MODE > ;"REENTER" - REENTER USER PROGRAM EXTERNAL JOBREN REENTER:MOVE TAC1,JOBREN(JDAT) ;GET REENTER ADDRESS FORM JOB DATA AREA JRST CHKSTR ;START JOB WITH PC IN USER MODE ; IF START ADR IS NON-ZERO ; "DDT" - START EXECUTION AT DDT IN USER AREA EXTERN JOBDDT DDTGO: MOVE TAC1,JOBDDT(JDAT) ;DDT STARTING ADR. IN JOB DATA AREA ; FALL INTO CHSTR ;ROUTINE TO CHECK TO SEE IF STARTING ADDRESS IS NON-ZERO, AND START USER IF OK CHKSTR: JUMPN TAC1,USTART ;IS IT NON-ZERO?, IS YES ; STORE OLD PC IN JOBOPC IN JOB DATA AREA ; THEN START WITH PC IN USER MODE JSP TAC,ERRMES ;NO, PRINT "NO START ADR" ASCII /NO START ADR / ; "STOP" OR "C" ;SCANNER ROUTINES DUMMY UP STOP WHEN CONTROL C TYPED IN ;STOP MUST BE DELAYED IF THIS JOB IS SYSTEM TAPE USER ;AND SYSTEM TAPE IS ACTIVE, OTHERWISE, THE JOB WILL NOT BE ;STOPPED WHEN DONE USING THE SYSTEM TAPE. INTERNAL FTDISK EXTERNAL STUSER,JOB,PJBSTS,IOWQ,JOBDAC STOP: JUMPE ITEM,STOP8 CAMN ITEM,STUSER ;IS THIS SYSTEM TAPE USER? JRST CFINS ;YES, DO FINISH SYS COMMAND IFN FTDISK,< PUSHJ PDP,STOPCK ;CAN THE JOB STOP? JRST DLYCM1 ;NO. DELAY IT. > PUSHJ PDP,STOP1 ;STOP JOB STOP8: IFE FTTTYSER,< JSP TAC,CONMES ;PRINT "^C CRLF CRFL PERIOS" ASCIZ /^C / > IFN FTTTYSER,< POPJ PDP,0> ; "CONTC" - CONTINUE EXECUTION(TTY REMAINS IN COMMAND MODE) CONTC: ;SAME AS CONT ; "CONT" - CONTINUE EXECUTION FROM WHERE LEFT OFF EXTERNAL JBTSTS CONT: MOVSI TAC1,JERR TDNN TAC1, JBTSTS(ITEM) ;IS JOB ERROR BIT SET? POPJ PDP, ;COMMAND DECODER WILL DO REST JSP TAC,ERRMES ;YES, PRINT CANT CONTINUE ASCIZ /CAN'T CONTINUE / ; "CORE #" - ASSIGNS #*1024 WORDS OF CORE TO JOB ; "CORE" WITH NO ARG. WILL PRINT NO OF FREE BLOCKS LEFT ; WITHOUT AFFECTING CURRENT ASSIGNMENT OF CORE ; JOB NOT IN MIDDLE OF SWAPPING ; EITHER ON DISK OR CORE OR NEITHER PLACE EXTERNAL PCORSZ CORE: PUSHJ PDP, DECIN ;GET NO. OF 1K BLOCKS JRST COR3 ;NO ARG. SPECIFIED, JUST TYPE FREE BLOCK LEFT JRST COMERA ;ILLEGAL DECIMAL CHARACTER RETURN IFE FTSWAP,< JUMPE TAC1,COR0 ;RELEASE DEVICES IF USER ASKING FOR 0 CORE > IFN FTSWAP,< JUMPE TAC1,COR1 ;ASSIGN JUST MINIMAL CORE AND RELEASE DEVICES ; IF ASKING FOR 0 CORE > LSH TAC1,12 ;CONVERT 1K BLOCKS TO WORDS MOVEI TAC,-1(TAC1) ;HIGHEST RELATIVE ADDRESS=LENGTH-1 OF LOW SEG PUSHJ PDP,CORE0 ;TRY TO ASSIGN CORE JRST COR2 ;CORE NOT AVAILABLE. GO PRINT MESSAGE POPJ PDP, ;OK RETURN, CORE ASSIGNED ON DISK OF MEMORY IFN FTSWAP,< ;USER ASKING FOR 0K COR1: JUMPN PROG,COR0 ;GO RELEASE ALL DEVICES IF HE HAS CORE IN MEMORY YET PUSHJ PDP,GETMIN ;NO, CORE ON DISK OR HAS NONE, ASSIGN MINIMAL ; AREA(FLUSH HIGH SEG TOO) IN CORE OR DISK JRST DLYCM ;AND DELAY COMMAND TILL CORE IS IN MEMORY ; DLYCM WILL SWAP IT IN. > COR2: IFN FTTTYSER,< MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB ADR > PUSHJ PDP,INLMES ;PRINT ? FOR PATCH ASCIZ /? / COR3: PUSHJ PDP,PRTSEG ;PRINT SIZE OF LOW SEG IFN FT2REL,< EXTERN PRTHGH PUSHJ PDP,PRTHGH ;PRINT SIZE OF HIGH SEG (+0 IF NONE) ; NOTHING IF NOT 2 REG. MACHINE OR SOFTWARE > PUSHJ PDP,INLMES ASCIZ "/" IFE FTSWAP,< EXTERN CORTAL MOVE TAC,CORTAL ;NO. OF FREE 1K BLOCKS > IFN FTSWAP,< EXTERNAL CORMAX MOVE TAC,CORMAX ;PRINT MAX. NO. OF BLOCKS IN PHYSICAL CORE LSH TAC,-12 ;AVAILABLE TO A SINGLE USER(AS SET ; BY BUILD AND/OR ONCE) > PUSHJ PDP,RADX10 ;PRINT NO. OF 1K BLOCKS AVAILABLE IFE FTSWAP,< JSP TAC,CONMAS ASCIZ /K CORE / > IFN FTSWAP,< EXTERN VIRTAL PUSHJ PDP,INLMES ASCIZ /K CORE VIR. CORE LEFT=/ MOVE TAC,VIRTAL ;PRINT AMOUNT OF FREE SWAP SAPCE LEFT JRST RADX10 ;IN DECIMAL > ; "SSAVE FILENAM.EXT [PROJ,PROG] CORE" ;WORKS LIKE SAVE, EXCEPT THAT HIGH SEG IS SAVED AS SHARABLE(EXT=SHR) ;INSTEAD OF NON-SHARABLE(EXT=HGH) ; "SAVE FILE-NAME[PROJ.,PROG.] CORE" - SAVES JOB AREA ON RETRIEVABLE DEVICE ;ONLY A SAVE OR A GET IN PROGRESS FOR EACH JOB ;NO ATTEMPT IS MADE TO SAVE DEVICE ASSGINMENTS, AC'S OR PC SAVE:IFN FT2REL,< TLO IOS,NSRBIT ;SET FLAGE FOR NON-SHARABLE EXT(HGH) > SSAVE: HRRI IOS,SAVJOB ;SETUP TO RUN SAVEJOB (IOS CLEARED BEFORE PUSHJ PDP,CTEXT1 ;DISPATCH SETZM JBTPRG(ITEM) ;CLEAR JOB'S PROGRAM NAME FOR ROOM JRST SGSET ; "GET DEVICE:FILE-NAME[PROJ.,PROG.] CORE" - SETS UP JOB AREA FROM RETREIVABLE ;DEVICE AND ASSIGNS CORE. GET: MOVEI IOS,GETJOB ;SETUP TO RUN GETJOB PUSHJ PDP,CTEXT1 ;GET DEVICE NAME SETZM JBTPRG(ITEM) ;CLEAR NAME FOR RCOM JRST RUNCM ; JOB DATA AREA FOR MONITOR JOB IFN FTLOGIN,< ;AUTOMATIC LOGIN AFTER DSK REFESH OR WHEN REFLAG SET EXTERNAL REFLAG LOGREF: MOVEM TAC,PRJPRG(ITEM) ;PRJ,PRG NRS. IN REFLAG MOVSI TAC,JLOG IORM TAC,JBTSTS(ITEM) SETZM -1(PDP) ;CLEAR ALL FLAGS FOR COMRET SETZM REFLAG ;ONLY ONCE POPJ PDP, > ;"HELP" -HELP COMMAND INTERNAL FTLOGIN IFN FTLOGIN,< EXTERNAL HELPPP HELP1: MOVE TAC,HELPPP TLN T,JLOG JRST ALOGIN POPJ PDP, > HELP: IFN FTLOGIN,< PUSHJ PDP,HELP1 > MOVE TAC,[SIXBIT /HELP/] ;CUSP NAME JRST ARCOM ;RUN IT SYSTAT: IFN FTLOGIN,< PUSHJ PDP,HELP1 > MOVE TAC,[SIXBIT /SYSTAT/] ;CUSP NAME JRST ARCOM ;RUN IT EXTERNAL JBTSTS,TTYATT ALOGIN: INTERNAL FTLOGIN IFN FTLOGIN,< EXTERNAL PRJPRG MOVEM TAC,PRJPRG(ITEM) MOVSI TAC,JLOG ANDCAM TAC,JBTSTS(ITEM) > IFN FTSWAP, POPJ PDP, INTERN FTCCL IFN FTCCL,< CCLRUN: MOVE TAC,[SIXBIT /COMPIL/] ;CUSP NAME JRST ARCOM ;RUN IT > ;"LOGIN" - LOGIN COMMAND INTERNAL FTLOGIN IFN FTLOGIN,< EXTERNAL SYSPP LOGDET: JSP TAC,ERRMES ASCIZ /PLEASE KJOB OR DETACH / CLOGIN: TLNE T,JLOG ;FORCE USER TO LOGOUT BEFORE JRST LOGDET ; LOGGING IN ANEW. IFN FTSWAP,< EXTERN VIRTAL,LOGSIZ MOVE TAC,VIRTAL ;AMOUNT OF FREE VIRTUAL CORE LEFT CAIL TAC,LOGSIZ ;IS THERE AT LEAST 2K FOR LOGIN? ; CUSTOMER CAN REDEFINE TO BE BIGGER THAN 2 ; WITH MONGEN DIALOG JRST CLOG2 ;YES, MOVEI ITEM,0 ;NO, SET JOB NUMBER TO 0 FOR COMMAND DECODER JRST COR2 ;AND GO TELL USER AMOUNT OF CORE LEFT > CLOG2: SKIPE TAC,REFLAG ;REFLAG SET NON-ZERO FOR AUTOMATIC LOGIN? JRST LOGREF ;YES, LOG USER IN WITHOUT RUNNING CUSP ; SO HE CAN RELOAD THE DISK AFTER REFRESH MOVE TAC,SYSPP ;SET PRJPRG TO SYSPP PUSHJ PDP,ALOGIN ;AUTOMATIC LOGIN MOVSI TAC,JACCT ;FLAG LOGIN OR LOGOUT RUNNING AND IORM TAC,JBTSTS(ITEM);DISABLE ^C, MOVE TAC,[SIXBIT /LOGIN/] ;CUSP NAME JRST ARCOM ;RUN IT > ; "R CUSTNAME CORE" - DOES "RUN SYS:CUSPNAME" RCOM: MOVEI TAC,0 ;NO FILE NAME, TTY WILL SUPPLY IT JRST ARCOM1 ARCOM: IFN FTTTYSER,< PUSHJ PDP,SKPBRK> ARCOM1: MOVEM TAC,JBTPRG(ITEM) ;STORE FILE NAME MOVSI TAC1,(SIXBIT /SYS/) ;READ FROM SYS DEVICE JRST RUNCO2 ; "RUN DEVICE:FILE[PROJ.PROG.] (CORE)" ;DOES A CORE,GET,START ALL IN ONE ;IF CORE ARG IS MISSING. SIZEIN DIRECTORY IS USED ;JOB ON DISK OR IN CORE OR NO CORE, BUT NOT IN MIDDLE OF SWAP EXTERNAL JOBDA RUNCOM: PUSHJ PDP,CTEXT1 ;GET DEVICE NAME FROM COMMAND STRING SETZM JBTPRG(ITEM) ;CLEAR FILE NAME RUNCO2:RUNC1: MOVEI IOS,RUNJOB RUNCM: PUSHJ PDP,GETMIN ;GET MININAL JOB AREA IN CORE OR DISK JUMPN PROG,SGSET ;WAS CORE ASSIGNED IN MEMORY? IF YES, GO SCANARGS IFE FTSWAP,< JRST COR2 ;NO. PRINT "0K CORE LEFT" > IFN FTSWAP,< JRST DLYCM ;NO. DELAY COMMAND UNTIL IN CORE > ; "ASSIGN DEV:NAME" - ASSIGN DEVICE TO JOB AND GIVE IT LOGICAL NAME EXTERNAL DEVLST,PJOBN,SYSTAP ASSIGN: PUSHJ PDP, CTEXT1 ;GET FIRST ARGUMENT JUMPE TAC1, NOTENF ;NO ARGUEMNT TYPED IF 0 IFN FTLOGIN, MOVE T1, TAC1 ;SAVE DEVICE NAME IFN FTTTYSER,< PUSH PDP,DEVDAT ;SAVE TTY > IFE FTTTYSER,< PUSH PDP, TAC ;SAVE INPUT BYTE POINT > MOVE TAC,TAC1 PUSHJ PDP,DEVPHY JRST ASSG3 MOVEI TAC1,ASSCON JRST ASSG4 ASSG3: MOVEI TAC1,ASSCON ;SETUP ASSIGNED BY CONSOLE BIT HLRZ DEVDAT, DEVLST ASSG0: MOVE TAC,DEVNAM(DEVDAT) CAME T1,DEVNAM(DEVDAT) ;DOES PHYSICAL NAME MATCH? JRST ASSG1 ;NO ASSG4: CAMN T1,[SIXBIT /DSK/] ;IS THIS A DISC?(IF YES, JRST ASSG5 ;BYPASS CHECK FOR SYSTEM TAPE AND ASSIGN BELOW CAMN TAC,SYSTAP ;IS NEXT DEVICE IN LIST THE SYSTEM TAPE? JRST ASSFIN ;YES, DO NOT ASSIGN. CLEAR DIRECTORY IN CORE BIT ASSG5: PUSHJ PDP,ASSASG ;NO, TRY TO ASSGIN DEVICE JRST ASSER1 ;ALREADY ASSIGNED TO ANOTHER JOB JRST ASSFIN ;ASSIGNED ;SYSTEM TAPE OR NOT MATCH OF ARG AND PHYSICAL NAME. ASSG1: CAMN TAC,SYSTAP ;IS THIS SYSTEM TAPE? JRST ASSG2 ;YES LDB T, PJOBN ;SAVE OLD JOB NUMBER FOR THIS DEVICE TRZ TAC,-1 ;COMAPRE LEFT HALF ONLY CAMN TAC, T1 PUSHJ PDP, ASSASG ;MATCH. TRY TO ASSIGN IT JRST ASSG2 ;KEEP LOOKING JUMPE T,ASSFIN ;IF OLD JOB NUMBER 0, DEVICE PREVIOSLY UNASSIGNED ASSG2: HLRZ DEVDAT, DEVSER(DEVDAT) JUMPN DEVDAT, ASSG0 IFN FTTTYSER,< POP PDP,DEVDAT ;RESTORE TTY DDB > IFE FTTTYSER,< POP PDP, TAC > JRST NOTDEV ;PRINT NO SUCH DEVICE IFN FTLOGIN, ;ALREADY ASSIGNED TO ANOTHER JOB ASSER1: IFE FTTTYSER,< PDP PDP, TAC MOVEI TAC, ASSMS2 PUSHJ PDP,ERRMES LDB TAC, PJOBN JRST DECLF ;PRINT JOB NUMBER CRLF > IFN FTTTYSER,< LDB TAC,PJOBN ;GET JOB NUMBER FOR DEVICE POP PDP,DEVDAT ;GET DDB FOR TTY PUSH PDP,TAC ;SAVE JOB NO. MOVEI TAC,ASSMS2 ;TYPE ERROR MESSAGE PUSHJ PDP,ERRMES POP PDP,TAC ;GET JOB NO. BACK JRST DECLF ;AND TYPE IT > ASSMS2: ASCIZ /ALREADY ASSIGNED TO JOB / ;DEVICE ASSIGNED, GIVE IT A LOGICAL NAME ASSFIN: SETZM DEVLOG(DEVDAT) ;CLEAR LOGICAL NAME IFE FTTTYSER,< POP PDP,TAC ;RESTORE INPUT BYTE POINTER PUSH PDP,DEVDAT ;SAVE DDB ADDRESS > IFN FTTTYSER,< EXCH DEVDAT,0(PDP) ;GET TTYDDB, SAVE DEVICE DDB > PUSHJ PDP,CTEXT1 ;GET SECOND ARG, LOGICAL DEVICE NAME SKIPE TAC,TAC1 ;IS THERE A LOGICAL NAME SPECIFIED? PUSHJ PDP, DEVLG ;YES, SEE IF IT IS ALREADY IN USE ; BY THIS USER JRST ASSF1 ;NO MOVEI TAC,LOGERR ;YES, PRINT ERROR MOVE DEVDAT,-3(PDP) ;RESTORE TTY DDB PUSHJ PDP,ERRMES MOVEI TAC,0 ;CLEAR LOGICAL NAME FOR THIS DEVICE ASSF1: POP PDP,DEVDAT MOVEM TAC,DEVLOG(DEVDAT);STORE IN DEVICE DATA BLOCK MOVSI TAC1,DVDIRIN ;CLEAR DIRECTORY IN CORE BIT ANDCAB TAC1,DEVMOD(DEVDAT) ;SETUP TAC1 WITH DEVICE CHARACTERISTICS FOR ASGHGH IFN FT2REL,< EXTERN ASGHGH PUSHJ PDP,ASGHGH ;GO CHECK IF THIS DEVICE HAS INITIALIZED ANY SHARED SEGMENTS ; IF YES, CLEAR SEG NAMES SO NO NEW SHARING (DTA,MTA ONLY) > MOVE TAC1,DEVNAM(DEVDAT) ;PHYSICAL NAME MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB PUSHJ PDP,PRNAME ;PRINT IT JSP TAC,CONMES ASCIZ / ASSIGNED / LOGERR: ASCIZ /LOGICAL NAME ALREADY IN USE, / ;"DEASSIGN DEV" - DEASSIGNS DEVICE FROM CONSOLE INTERNAL NOTDEV DEASSI: JUMPE ITEM,CPOPJ ;NO-OP IF NO JOB NUMBER PUSHJ PDP,CTEXT1 ;GET DEVICE NAME JUMPE TAC1,DEASTY ;NO ARG. IF 0, DEASSIGN ALL BY TTY MOVE TAC, TAC1 ;DEVICE NAME PUSHJ PDP, DEVSRC ;SEARCH FOR DEVICE JRST DEAER1 ;NOT FOUND PUSHJ PDP, DEASG ;FOUND, DEASSIGN IT JRST DEAER2 ;NOT PREVIOUSLY ASSIGNED POPJ PDP, ;DEVICE DEASSIGNED NOTDEV: DEAER1: MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB JSP TAC,ERRMES ;PRINT NO SUCH DEVICE ASCIZ /NO SUCH DEVICE / DEAER2: MOVE TAC1,DEVNAM(DEVDAT) ;PRINT PHYSICAL DEVICE NAME MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB PUSHJ PDP,PRNAME JSP TAC,ERRMES ASCIZ / WASN'T ASSIGNED / INTERNAL FTREASSIGN IFE FTREASSIGN,< REASSI=UUOERR > IFN FTREASSIGN,< ;REASSIGN UUO ;CALL MOVE AC,JOB NUMBER ; MOVE AC+1,SIXBIT /DEVICE/ ; CALL AC,[SIXBIT /REASSIGN/] ;IF C(AC)=0, JOB HAS NOT BEEN INITIALIZED ;IF C(AC+1)=0, DEVICE NOT ASSIGNED TO THIS JOB OR DEVICE IS A TTY INTERNAL REASSIGN EXTERNAL PUUOAC,JOB REASSI: LDB UUO,PUUOAC HRLI UUO,PROG PUSH PDP,@UUO ;STACK JOB NUMBER TO BE REASSIGNED TO AOS UUO MOVE TAC1,@UUO ;DEVICE NAME MOVE ITEM,JOB ;THIS JOB NUMBER SOJA UUO,REASS1 ;"REASSIGN DEV:JOB" - REASSIGN DEVICE "DEV" TO JOB "JOB" REASS: PUSHJ PDP,CTEXT1 ;GET DEVICE NAME JUMPE TAC,NOTENF ;NULL NAME? MOVE UUO,TAC1 ;SAVE IT IN UUO PUSHJ PDP,DECIN1 ;GET NEW JOB NUMBER JRST NOTENF ;NONE SPECIFIED, DOESN'T RETURN IF ERROR JRST COMERA ;ILLEGAL CHARACTER PUSH PDP,TAC1 ;PUT JOB NUMBER ON STACK, DEVICE MOVE TAC1,UUO ;NAME IN TAC1 SETZM UUO ;SET COMMAND SWITCH ;ROUTINE COMMON TO REASSIGN UUO AND COMMAND EXTERNAL JBTSTS,PJOBN,JOBFDV REASS1: EXCH ITEM,(PDP) ;NEW JOB NO. IN ITEM CAILE ITEM,JOBN ;IS JOB NUMBER OUT OF RANGE JRST REASE2 ;YES, DO NOT REASSIGN MOVE TAC,JBTSTS(ITEM) ;NEW JOB STATUS EXCH ITEM,(PDP) ;RESTORE ITEM AND STACK TLNN TAC,JNA ;DOES NEW JOB EXIST? JRST REASE1 ;NO. MOVE TAC,TAC1 PUSHJ PDP,DEVSRC ;SEARCH FOR DEV JRST REASE2 ;NOT FOUND LDB TAC,PJOBN CAME TAC,ITEM ;ASSIGNED TO THIS JOB JRST REASE3 ;NO MOVE TAC,DEVMOD(DEVDAT) TLNE TAC,DVTTY ;IS IT A TTY? JRST REASE6 ;YES. CAN'T BE REASSIGNED TRNN TAC,ASSPRG ;IS DEVICE INITED? JRST REASS3 ;NO. JUMPN UUO,REASS4 ;YES. COMMAND LEVEL? HRL DEVDAT,(PDP) ;YES. SCHEDULE RELEASE MOVEM DEVDAT,JOBFDV(JDAT) POP PDP,TAC1 MOVE DEVDAT,-2(PDP) MOVSI TAC1,TTYRNC ;SET TTYRNC SO JOB WILL RUN IORM TAC1,-1(PDP) JSP TAC1,MSTART JSP TAC,MONSTR HLRZ TAC,JOBFDV(JDAT) PUSH PDP,TAC HRRZ DEVDAT,JOBFDV(JDAT) MOVE ITEM,JOB SETOM UUO ;SET FLAG TO STOP JOB REASS4: HRRZ DSER,DEVSER(DEVDAT) HRRZM DEVDAT,JOBFDV(JDAT) MOVE UCHN,USRHCU REASS2: MOVE DEVDAT,USRJDA(UCHN) ;GET XWD UUO BITS,DDB ADDRESS HRRZ TAC,JOBFDV(JDAT) ;GET ADDR. OF DDB SAVED BY COMMAND PUSH PDP,UCHN ;SAVE USER CHANNEL CAIN TAC,(DEVDAT) ;IS CHOSEN DEVICE ON THHS CHANNEL? PUSHJ PDP,RELEA5 ;YES, RELEASE DEVICE POP PDP,UCHN SOJGE UCHN,REASS2 MOVE DEVDAT,JOBFDV(JDAT) MOVE ITEM,JOB ;CURRENT JOB NUMBER REASS3: MOVEI TAC,ASSCON ;ASSIGN IT BY CONSOLE IORM TAC,DEVMOD(DEVDAT) EXCH ITEM,(PDP) DPB ITEM,PJOBN ;PUT IN NEW JOB NUMBER POP PDP,ITEM JUMPL UUO,ESTOP POPJ PDP, REASE1: POP PDP,TAC JUMPE UUO,ATT4 ;JOB NEVER WAS INITIATED REASE4: SETZM @UUO ;CLEAR C(AC) POPJ PDP, REASE2: MOVEI TAC,NOTDEV ;NO SUCH DEVICE REASE5: POP PDP,TAC1 JUMPE UUO,(TAC) AOJA UUO,REASE4 REASE3: MOVEI TAC,DEAER2 ;WASN'T ASSIGNED JRST REASE5 REASE6: MOVEI TAC,REASE7 JRST REASE5 REASE7: MOVE TAC1,DEVNAM(DEVDAT) MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB PUSHJ PDP,PRNAME JSP TAC,ERRMES ASCIZ / CAN'T BE REASSIGNED / > INTERNAL FTATTACH IFN FTATTACH,< ;"ATTACH DEVNAME" -ATTACHES A PREVIOUSLY PARTITIONED DEVICE ; NOTE-MUST BE LOGGED IN UNDER [1,1] TO DO THIS ; "ATTACH N [PROJ.,PROG.]" - ATTACH CONSOLE TO JOB N ;CHANGES ADDRESS OF TTY DEVICE DATA BLOCK STORED IN -2(PDP) ;BY THE COMMAND DECODER INTERNAL ATTACH EXTERNAL TTYATT,JOBN,TTYFND ATTACH: IFE FTTTYSER,< MOVE AC2,TAC ;SAVE BYTE POINTER> PUSHJ PDP,DECIN ;GET JOB NO. JRST NOTENF ;NOT A NUMBER OR NONE SPECIFIEED IFN FTLOGIN, < JRST DEVATT ;WANTS TO ATTACH A DEVICE > IFE FTLOGIN, < JRST ATT1 > SKIPE TAC1 ;0 IS ILLEGAL CAIL TAC1, JOBN ;IS JOB NUMBER TOO BIG? JRST ATT1 ;ILLEGAL JOB NUMBER MOVSI T1,JNA ;HAS THIS JOB NO BEEN ASSIGNED? TDNN T1,JBTSTS(TAC1) JRST ATT4 ;NO, PRINT ERROR INTERNAL FTLOGIN IFN FTLOGIN,< MOVE IOS,TAC1 ;SAVE JOB NO. PUSHJ PDP,PJPGNO ;GET PROJ,-PROG. NOS. ARG(IF ERROR, PDP SUP LEVEL ; OFF 1, PRINT ERROR, AND DO NOT RETRY HERE MOVEM IOS,TAC1 ;RESTORE SKIPN AC2 ;DID USER TYPE IN A PROG,PROG # IN []'S? MOVE AC2,PRJPRG(ITEM) ;NO. ASSUME PROJ,PROG NUMBER FOR CURRENT JOB ; SO USER CAN AVOID TYPEING PROGPROG NO. IF DOING ; FROM 1 JOB TO ANOTHER UNDER SAME PROJ,PROG CAME AC2,PRJPRG(TAC1) ;IS THIS THE SAME PERSON WHO DETACHED FROM THIS JOB NUMBER? JRST ATT3 ;NO-ERROR ; YES > MOVE ITEM,TAC1 ;JOB NUMBER TO ITEM PUSHJ PDP,TTYATT ;NO, ATTACH TTY JRST ATT2 ;ERROR CAN'T ATTACH MOVEM DEVDAT,-2(PDP) ;CHANGE DEV DATA BLOCK ADDRESS IFN FTTTYSER,< EXTERN TSETBF PUSHJ PDP,TSETBF ;INITIALIZE TTY INPUT BUFFER > JRST TTYFND ;ATTACHED, GO SET UP OUTP. BYTE PTR. INTERNAL FTLOGIN IFN FTLOGIN,< DEVATT: IFE FTTTYSER,< MOVE TAC,AC2 ;RESTORE BYTE POINTER> PUSHJ PDP,CTEXT1 ;GET DEVICE ARGUMENT JFCL ;SHOULD NEVER RETURN MOVE T,PRJPRG(ITEM) ;GET PROJ.-PROG. NOS. CAME T,SYSPP ;PRJPRG = [1,1]? JRST ATT5 ;NO - ERROR MOVE TAC,TAC1 ;YES-SET UP DEVICE NAME PUSH PDP,DEVDAT ;SAVE DDB FOR THIS TTY PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE JRST TEMP1 ;NOT FOUND LDB T,PJOBN ;GET JOB NUMBER JUMPN T,ATT6 ;IS IT = 0? DPB ITEM,PJOBN ;SET JOB NUMBER MOVE TAC,DEVMOD(DEVDAT); CHECK TO SEE IF THIS IS A TTY LDB TAC1,PUNIT ; TLNE TAC,DVTTY ;IS IT A TTY? HRRM DEVDAT,TTYTAB(TAC1) ;SET TRANS TABLE TO POINT TO DDB POP PDP,DEVDAT ; POPJ PDP, ;RETURN > ATT1: JSP TAC,ERRMES ASCIZ /ILLEGAL JOB NUMBER / ATT2: MOVE TAC1,DEVNAM(DEVDAT) ;[PRINT PHYSICAL NAME MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB PUSHJ PDP,PRNAME JSP TAC,ERRMES ASCIZ / ALREADY ATTACHED / ATT3: JSP TAC,ERRMES ASCIZ /CAN'T ATT TO JOB / ATT4: JSP TAC,ERRMES ASCIZ /NOT A JOB / ATT5: JSP TAC,ERRMES ASCIZ /CAN'T ATT DEV / ATT6: POP PDP,DEVDAT JSP TAC,ERRMES ASCIZ /WASN'T DET / > INTERNAL FTATTACH IFN FTATTACH,< ;"DETACH" - DETACH CONSOLE FROM JOB ;"DETACH DEVNAM" - DETACHES DEVICE FROM THE SYSTEM SOFTWAREWISE ; NOTE - MUST BE LOGGED IN UNDER [1,1] TO DO THIS EXTERNAL TTYDET INTERNAL FTLOGIN IFE FTLOGIN,< DETACH: JRST TTYDET ;GO DETACH TTY > IFN FTLOGIN,< EXTERNAL PRJPRG,SYSPP,PUNIT,TTYTAB,PJOBN DETACH: PUSHJ PDP,CTEXT1 ;GET ARGUMENT JUMPE TAC1,TTYDET ;ONLY "DET" TYPED MOVE T,PRJPRG(ITEM) ;GET PROJ.-PROG. NUMBER CAME T,SYSPP ;PRJPRG = [1,1]? JRST LOGER1 ;NO-PRINT ERROR MSG. MOVE TAC,TAC1 ;YES-SET UP DEVICE NAME PUSH PDP,DEVDAT ;SAVE TTY DDB PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE JRST TEMP1 ;DEVICE NOT FOUND MOVE TAC,DEVMOD(DEVDAT) ;CHECK TO SEE IF THIS IS DSK TLNE TAC,DVDSK ;IS IT THE DSK? JRST TEMP1 ;YES-PRINT ERROR MSG. MOVEI TAC1,ASSCON ;FOUND-SET UP ASSIGNED BY CONSOLE PUSHJ PDP,ASSASG ;TRY TO ASSIGN JRST TEMP2 ;CAN'T ASSIGN TLNE DEVDAT,SYSDEV ;IS THIS SYSTEM DEVICE? JRST TEMP1 ;YES-PRINT ERROR MSG. XOR T,T ;NO-SET TO ZERO DPB T,PJOBN ;SET JOB NO. TO NULL JOB MOVE TAC,DEVMOD(DEVDAT) ;CHECK TO SEE IF THIS IS A TTY TLNN TAC,DVTTY ;IS IT A TTY? JRST .+4 ;NO-GO AHEAD LDB TAC,PUNIT ;YES-SET UPO FOR SCNSER MOVEI TAC1,-1 ;SET LEFT HALVE TO TTYTAB TO -1 HRRM TAC1,TTYTAB(TAC) ;SO THAT SCNSER CHECKS FOR THIS POP PDP,DEVDAT ;RESTORE TTY DDB POPJ PDP, ;SUCCESSFUL RETURN TEMP1: POP PDP,DEVDAT ;RESTORE TTY DDB JRST DEAER1 ;PRINT ERROR MSG. AND RETURN TEMP2: IFE FTTTYSER,< POP PDP,DEVDAT ;RESTORE TTY DDB JRST ASSER1+1 ;PRINT ERROR MSG. AND RETURN > IFN FTTTYSER,< JRST ASSER1 > LOGER1: JSP TAC,ERRMES ASCIZ /CAN'T DET DEV / >> ;CLOSE BOTH FTLOGIN AND FTATTACH CONDITIONALS. ;"DAYTIME" - PRINT TIME OF DAY EXTERNAL TIME,THSDAT,MONTAB,JIFMIN DAYTIM: IFN FTLOGIN, < JUMPE ITEM,DAYTM1 PUSHJ PDP,DECIN ;WAS AN ARGUMENT TYPED? JRST DAYTM1 ;NO, PRINT TIME JRST COMERA ;ERROR HLRZ TAC,PRJPRG(ITEM) ;YES CAIE TAC,1 ;IS THIS PROJECT 1? JRST DAYTM1 ;NO, PRINT TIME OF DAY ANYWAY(IGNORE ARG) MOVE TAC,TAC1 ;YES, RESET TIME ACCORDING TO ARGUMENT IDIVI TAC,^D100 IDIVI TAC,^D60 ; ADD TAC,TAC1 ;COMPUTE MINUTES IMULI TAC,JIFMIN ;COMPUTE JIFFIES MOVEM TAC,TIME ;AND STORE POPJ PDP, > DAYTM1: MOVE TAC,THSDAT ;PRINT TODAY'S DATE IDIVI TAC,^D31 EXCH TAC,TAC1 ;YEAR AND MONTH IN TAC1 PUSHJ PDP,DECP1 ;ADD 1 TO DAY(IN TAC) AND PRINT DECIMAL MOVEI TAC,0 DIVI TAC,^D12 EXCH TAC,TAC1 MOVE TAC,MONTAB(TAC) ;MONTH DPB TAC,[POINT 21,DAMESS,27] MOVEI TAC,DAMESS PUSHJ PDP,CONMES ;PRINT DAY MOVEI TAC,^D64(TAC1) PUSHJ PDP,RADX10 ;PRINT YEAR PUSHJ PDP,PRSPC MOVE TAC,TIME ;PRINT TIME OF DAY JRST PRTIM1 INTERNAL FTTIME IFN FTTIME,< ;"TIME (JOB NO.)" - PRINT TOTAL AND INCREMENTAL RUNNING TIME FOR A JOB ;FOLLOWED BY KILO-CORE TICKS ;"TIME 0" IMPLIES RUNTIME FOR NULL JOB AND THE TOTAL TIME SPENT SHUFFLING USERS ; IF NO JOB NO. GIVEN-TIME WILL BE FOR CURRENTLY LOGGGED IN JOB NO. EXTERNAL RTIME,TTIME,SHFWRD,WDPJIF,JOBN,JBTSTS,CLRWRD,LSTWRD RUNTIM: PUSHJ PDP,DECIN ;GETJOB NO. ARG. JRST RUN1 ;NO ARG. GIVEN - LOGGED IN? JRST COMERA ;ILLEGAL DECIMAL CHARACTER RETURN JUMPE TAC1,RUN2 ;RUNTIME 0 GIVEN CAIL TAC1,JOBN ;JOB NO. TO BIG? JRST ATT1 ;YES,ILLEGAL JOB. NO. MOVE TAC,TTIME(TAC1) ;TIME SINCE LAST LOGGIN JRST PRTIME ;PRINT AND RETURN RUN2: PUSHJ PDP,INLMES ;PRINT ASCIZ /SHFL / ;"SHUFFLING " MOVE TAC,SHFWRD ;NO. WORDS SHUFFLED IDIVI TAC,WDPJIF ;NO.WORDS/JIFFY USING BLT PUSHJ PDP,PRTIME ;PRINT SHUFFLE TIME PUSHJ PDP,INLMES ASCIZ /ZCOR / MOVE TAC,CLRWRD IDIVI TAC,WDPJIF PUSHJ PDP,PRTIME ;PRINT TIME SPENT CLEARING CORE PUSHJ PDP,INLMES ASCIZ /LOST / MOVE TAC,LSTWRD PUSHJ PDP,PRTIME ;PRINT TME SPENT "LOST" RUNNING NULL JOB PUSHJ PDP,INLMES ;PRINT ASCIZ /NULL / ;"NULL TIME " MOVE TAC,TTIME ;PRINT NULL JOB RUNNING TIME PUSHJ PDP,PRTIME ; PUSHJ PDP,INLMES ;PRINT TOTAL SYSTEM UP TIME ASCIZ /UP / MOVE TAC,UPTIME JRST PRTIME ;AND RETURN RUN1: IFE FTLOGIN,< MOVEI TAC,0 ;GET SET TO CLEAR INCREMENTAL RUN TIME > IFN FTLOGIN,< MOVSI TAC,JLOG ;IS JOB LOGGED IN? TDZN TAC,JBTSTS(ITEM) ;TEST JOB STATUS BITS AND CLEAR TAC ALWAYS JRST NOTENF ;NO, NEED MORE ARGUMENTS > EXCH TAC,RTIME(ITEM) ;GET CURRENT INCR. TIME AND CLEAR PUSHJ PDP,PRTIME ;PRINT TIME SINCE LAST TIME COMM. PRTTIM: MOVE TAC,TTIME(ITEM) ;GET TOTAL ACCUMULATED TIME IFN FTKCT,< PUSHJ PDP,PRTIME EXTERN JBTKCT PUSHJ PDP,INLMES ;PRINT "K*CPUSEG= ASCIZ /KILO-CORE-SEC=/ MOVE TAC,JBTKCT(ITEM) ;PRODUCT OF NO. OF K CORE* NO. OF JIFFIES RUN IDIVI TAC,JIFSEC ;AT THAT SIZE, CONVERT TO KILO CORE SECONDS PUSHJ PDP,RADX10 ;AND PRINT IN DECIMAL JRST CRLF ;PRINT IRLF > IFE FTKCT,< JRST PRTIME ;PRINT IT AND RETURN > > ;ROUTINE TO LET TTY TALK TO ANY OTHER RING OF TTYS ; "TALK TTYN" ; TTYN NEED NEVER HAVE BEEN TYPED ON BEFORE INTERNAL FTTALK IFN FTTALK,< EXTERNAL TTYTLK TALK: PUSHJ PDP,CTEXT1 ;GET ARGUMENT JUMPE TAC1,TALK2 ;NONE SPECIFIED MOVE TAC,TAC1 PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE JRST TALK1 ;DEVSRC SHOULD FIND A FREE TTY DDB ; EVEN IF TTY NEVER TYPED ON YET PUSHJ PDP,TTYTLK JRST TALK1 POPJ PDP, TALK2: MOVSI ITEM,NOINCK ;SET FLAGS SO RESPONSE WILL PRINT MOVEM ITEM,-1(PDP) JRST NOTENF TALK1: MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB MOVSI ITEM,NOINCK ;SET FLAGS TO PRINT RESPONSE MOVEM ITEM,-1(PDP) JSP TAC,ERRMES ASCIZ /BUSY / > INTERNAL FTEXAMINE IFN FTEXAMINE,< ;"EXAMINE LOC" - LOOKS A CONTENTS OF LOC AND PRINTS IN OCTAL ;IF LOC IS MISSING, NEXT LOC IS PRINTED ;IF PREVIOUS WAS E COMMAND, SAME LOC IF PREVIOUS WAS D COMMAND ;TAB. IS PRINTED INSTEAD OF CRLF(LIKE DDT) EXTERNAL TPOPJ,JOBPC ECOM: SKIPGE JOBEXM(JDAT) ;WAS PREVIOUS D OR E COMMAND. A D COMMAND? AOS JOBEXM(JDAT) ;NO, IT WAS AN E. INCREMENT IN CASE HE TYPES NO ARG HRROS JOBEXM(JDAT) ;YES, FLAG THAT E HAPPENED LAST(LH=-1) PUSHJ PDP,OCTIN ;GET OCTAL LOCATION SKIPA TAC,JOBEXM(JDAT) ;NONE SPECIFIED, USE LAST LOC OF D OR NEXT OF E JRST COMERA ;ILLEGAL CHARACTER PUSHJ PDP,DEAT ;CHECK FOR AC REFERENCE AND STORE JOBEXM HRRZ UUO,TAC1 ;IGNORE LH HRLI UUO,PROG ;SET TO RELOCATE PUSHJ PDP,GETWRD ;GET WORD FROM LOW OR HIGH SEG JRST ECOMA ;ERROR, OUT OF BOUNDS PUSH PDP,TAC ;SAVE CONTENTS OF LOC TO BE PRINTED HRRZ TAC,JOBEXM(JDAT) ;PRINT LOC BEING EXAMINED PUSHJ PDP,OCTPNT PUSHJ PDP,INLMES ;PRINT SLASH TAB ASCIZ */ * HLRZ TAC,(PDP) ;PRINT LEFT HALF PUSHJ PDP,OCTPNT PUSHJ PDP,INLMES ;PRINT SPACE ASCIZ / / HRRZ TAC,(PDP) ;PRINT RIGHT HALF PUSHJ PDP,OCTPNT PUSHJ PDP,INLMES ;PRINT FINAL TAB ASCIZ / / JRST TPOPJ ;POP PDP,TAC,POPJ PDP, ;"DEPOSIT LH RH LOC" - DEPOSITS XWD LH,RH IN LOCATION LOC ;IF LOC IS MISSING. ASSUME NEXT LOC IF PREVIOUS D, SAME LOC IF PREVIOUS E EXTERNAL JOBEXM,JOBPFI DCOM: PUSHJ PDP,OCTIN ;GET LH JRST NOTENF ;NOT ENOUGH ARGUMENTS JRST COMERA ;ILLEGAL CHARACTER HRLM TAC1,IOS ;SAVE LH PUSHJ PDP,OCTIN ;GET RH JRST NOTENF ;NOT ENOUGH ARGUMENTS JRST COMERA ;ILLEGAL CHARACTER HRRM TAC1,IOS ;SVE RH SKIPL JOBEXM(JDAT) ;WAS PREVIOUS D OR E AN E COMMAND? ; LH=-1 IF E, LH=0 IF D AOS JOBEXM(JDAT) ;NO, INCREMENT IN CASE USER TYPED NOT THIRD ARG ; FOR SUCCESSIVE D'S HRRZS JOBEXM(JDAT) ;FLAG THAT A D WASDONE LAST(LH=0) PUSHJ PDP,OCTIN ;GET LOC SKIPA TAC1,JOBEXM(JDAT) ;NOT SPECIFIED, USE LAST OF E OR NEXT OF D JRST COMERA ;ILLEGAL CHARACTER IFN FT2REL,< EXTERN CHKMED PUSHJ PDP,CHKMED ;CHECK TO SEE IF HIGH SEG IS SHARABLE ; IF YES, SET USER-MODE WRITE PROTECT (UWP) ON ; FOR THIS USER, AND SET MEDDLE FOR THIS USER ; SO HE CANNOT TURN UWP OFF > TRNN TAC1,777760 ;IN USER ACS JRST DCOM1 ;YES HLRZ TAC,PROG ;GET PROTECTION CAILE TAC1,JOBPFI ;NO, GREATER THAN HIGHEST LOC, PROTECTED ; FROM IO IN JOB DATA AREA? CAMLE TAC1,TAC ;IN BOUNDS? JRST DCOMA ;NO DCOM1: PUSHJ PDP,DEAT ;CHECK FOR AC REFERENCE HRLI TAC1,PROG ;SET FOR RELOCATION MOVEM IOS,@TAC1 POPJ PDP, DEAT: TLZ TAC1,-1 ;CLEAR LH IN CASE THIS IS A SUCCESSIVE E WITH NO ARG HRRM TAC1,JOBEXM(JDAT) ;STORE FOR NEXT TIME, DO NOT TOUCH LH(D OR E LAST) ; YES, WAS JOB STOPPED IN USER MODE? CAIL TAC1,20 ;IS IT AN AC? POPJ PDP, ;NO MOVE TAC,JOBPC(JDAT) TLNE TAC,USRMOD ;USER MODE? ADDI TAC1,20 ;YES USER ACS ARE AT 20 INSTEAD OF 0 POPJ PDP, DCOMA: IFN FT2REL,< EXTERN HGHDEP PUSHJ PDP,HGHDEP ;IS IT IN BOUNDS AND ALLOWED IN HIGH SEG? JRST ECOMA ;NO, PRINT "OUT OF BOUNDS" POPJ PDP, ;YES, IOS DEPOSITED, AND JOBEXM UPDATED > ECOMA: JSP TAC,ERRMES ;OUT OF BOUNDS ASCIZ /OUT OF BOUNDS / > IFN FTLOGIN,< ;"SCHEDULE OCTN" - SETS RH OF STATES TO OCTN, IF TYPED FROM ; THE OPERATOR CONSOLE (C(DEVOPR)), OTHERWISE ILLEGAL ;"SCHEDULE" WITH NO ARGUMENTS TYPES OUT RH OF STATES, LEGAL FOR ALL. EXTERN DEVOPR,STATES,OCTPNT SKEDUL: PUSHJ PDP,OCTIN ;GET THE ARGUMENT IF ANY JRST SKED1 ;NO ARGUMENT JRST COMERA ;BAD SYNTAX IN OCTAL NUMBER MOVE TAC,DEVNAM(DEVDAT) ;AN ARGUMENT. IS THIS THE OPR? CAME TAC,DEVOPR JRST COMERR ;NO, THIS IS ILLEGAL, THEN. HRRM TAC1,STATES ;YES. STORE ARGUMENT IN RH OF STATES POPJ PDP,0 ;RETURN SKED1: HRRZ TAC,STATES ;SCHEDULE WITH NO ARGUMENTS. PUSHJ PDP,OCTPNT ;PRINT RH OF STATES. JRST CRLF ;AND RETURN WITH A CRLF > ;"BLANK" OR NO ALPHA NUMERIC BEFORE BREAK CHAR COMMAND ;DISPATCHED TO LIKE ANY OTHER COMMAND(0 IN COMMAND TABLE) CBLANK: IFE FTTTYSER,< LDB TEM,TAC ;GET BREAK CHARACTER CAIE TEM,15 ;IS IT A CR > IFN FTTTYSER,< CAIE TEM,12 ;WAS BREAK A LF > CAIN TEM,";" ;NO, IS IT SEMI COLON(MONITOR COMMENT) POPJ PDP, ;YES, IGNORE ; FALL IN UNKNOWN COMMAND ;COMMAND NOT IN COMMAND DICECTORY NOCOM: JRST COMERR ;NO, APPEND ? TO WHAT HE TYPED IN IFN FTFINISH,< ; "FINISH DEVICE" - CLOSES,RELEASE AND DESASSIGNS DEVICE ;JOB MUST HAVE CORE EXTERNAL USRJDA,PUUOAC,JOB,USRHCU,JOBFDV,SYSTAP CFINI: PUSHJ PDP,CTEXT1 ;GET DEVICE NAME JUMPE TAC1,NOTENF ;NOT ENOUGH ARG. IF NONE SKIPA TAC,TAC1 ;SEARCH FOR SIXBIT DEVICE NAME CFINS: MOVE TAC,SYSTAP ;HERE ON CONTROL C ON SYSTEM TAPE USER ; DO A FINISH SYS COMMAND FOR HIM PUSHJ PDP,DEVSRC JRST NOTDEV ;PRINT NOT A DEVICE HRRZM DEVDAT,JOBFDV(JDAT) ;STORE DDB ADR. IN JOB DATA AREA MOVE DEVDAT,-2(PDP) JSP TAC1, MSTART ;SETUP MONITOR JOB AND RETURN ; RETURN HERE AT UUO LEVEL WHEN SCHEDULED JSP TAC,MONSTR ;SETUP ACS,PROG,JDAT,PDP MOVE UCHN,USRHCU ;HIGHEST USER IO CHANNEL IN USE FDV1: HRRZ DEVDAT,USRJDA(UCHN) ;GET NEXT DEVICE MOVSI UUO,071000 ;SETUP RELEASE UUO DPB UCHN,PUUOAC ;WITH CHANNEL NO. PUSH PDP,UCHN CAMN DEVDAT,JOBFDV(JDAT) ;IS THIS DEV. THE ONE TO RELEASE? XCT UUO ;YES, RELEASE IT(AND CLOSE) POP PDP,UCHN SOJGE UCHN,FDV1 ;FINISHED? MOVE ITEM,JOB ;GET JOB NUMBER MOVE DEVDAT,JOBFDV(JDAT) ;RESET DEVDAT PUSHJ PDP,DEASG ;DEASSIGN DEVICE JFCL ;IGNORE IF NOT ASSIGNED BY CONSOLE JRST ESTOP ;STOP JOB SO HE CANNOT CONTINUE > IFN FTTIME,< ;"RESOURCES" - PRINT OUT AVAILABLE DEVICES AND FREE BLOCKS ON THE DISK EXTERNAL DEVLST FREDEV: IFN FTDISK, < EXTERNAL SATENT,SATXWD,WLBIT,SENTSZ,NUMBIT XOR TAC,TAC ;INITIALIZE COUNTER HLRE T2,SATXWD ;SET INDEX WITH NUMBER OF SAT BLOCKS IN EXISTENCE, MOVNS T2 HRRI T1,SATENT ;GET SATENT ENTRY POINTER LOP05: HRRZ TAC1,0(T1) ;GET VALUE TRNE TAC1,WLBIT ;IS THIS SPACE WRITE PROTECTED? JRST LOP06 ;YES, NO FREE BLOCKS IN THE SAT BLOCK. ADDI TAC,NUMBIT ;NO, ADD THE FOLLOWING QUANTITY IN THIS SAT SUB TAC,TAC1 ; RUNNING TOTAL: (TOTAL BLOCKS IN THIS SAT ; BLOCK) - (BLOCKS ALREADY IN USE). LOP06: ADDI T1,SENTSZ ;BUMP POINTER SOJN T2,LOP05 ;DECREMENT INDEX PUSHJ PDP,RADX10 ;CONVERT TO DECIMAL PUSHJ PDP,INLMES ;PRINT ASCIZ /. BLKS/ > HRLZ T,DEVLST ;GET DDB POINTER MOVEI AC2,0 ;SET DEVICE NAME 0 FOR FIRST COMPARE LOP01: MOVE T1,DEVMOD(T) ;DEVICE CHARACTERISTICS TRNN T1,ASSCON!ASSPRG ;DEVICE ASSIGNED BY CONSOLE OR PROGRAM? TLNE T1,DVTTY!DVDSK ;NO, IS IT A TTY OR DSK? JRST LOP02 ;YES DO NOT PRINT IFE FTDISK,< JUMPE AC2,LOP018 ;SUPPRESS LEADING COMMA IF NO DISK > PUSHJ PDP,INLMES ;PRINT ,(INSTEAD OF CRLF SO WILL FIT IN 1 BUFFER) ASCIZ /,/ LOP018: MOVS AC1,DEVNAM(T) ;GET DEVICE NAME HLLZ TAC1,AC1 ;ASSUME SAME TYPE AS LAST ONE, PRINT ; ONLY RH OF NAME (UNIT NUMBER) CAIN AC2,0(AC1) ;IS IT REALLY THE SAME? JRST LOP01A ;YES. PRINT THE UNIT NUMBER, MOVS TAC1,AC1 ;NO. MUST PRINT WHOLE NAME, HRRZ AC2,AC1 ; AND GET THE NEW DEVICE IN FLAG AC. LOP01A: PUSHJ PDP,PRNAME ;AS BEING FREE LOP02: HLRZ T,DEVSER(T) ;GET NEXT DEVICE IN CHAIN JUMPN T,LOP01 ;IS THERE ONE? JRST CRLF ;NO. DONE, PRINT CR. LF AND THEN POPJ > EXTERNAL CPOPJ,STUSER ;ROUTINE TO CHECK FOR ACTIVE DEVICES ;NEVER GET HERE DURING SWAP IN OU OUT ;SINCE COMMAND TABLE SHOULD AHVE NOTRAN BIT ON RUNCHK: CAMN ITEM,STUSER ;SYSTEM TAPE USER? JRST DLYCM1 ;YES. DELY,BUT DO NOT STOP JOB ACTCHK: JUMPE PROG,ACTCH1 ;DOES JOB HAVE CORE IN MEMORY PUSHJ PDP,ANYACT ;YES. ARE DEVICES ACTIVE? JRST DLYCM ;YES. DELAY COMMAND. ACTCH1: MOVE TAC1,-1(PDP) ;RESTORE COMMAND DISPATCH ADDRESS MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB ADDRESS MOVE T,JBTSTS(ITEM) ;RESTORE JOB STATUS CONTC1: POPJ PDP,COM0 ;ROUTINE TO DELAY A COMMAND ;DELAYS COMMAND TO BE EXECUTED WHEN JOB IN CORE MEMORY ;AND CAUSE JOB TO BE SWAPPED IN(COMMAND WAIT BIT IS SET IN JBSTS) ;AND POPD LEVEL UP ONE. EXTERNAL TTYCM,LINSAV DLYCM: PUSHJ PDP,DLYCOM ;SET COMMAND WAIT BIT IN JOB STATUS AND PUT ; JOB IN COMMAND WAIT QUEUE ; SO JOB IS NOT RUNNABLE ANY MORE ;ROUTINE TO DELAY A COMMAND IF A SWAP OUT OR IN IS IN PROGRESS ;DIFFERS FROM DLYCM IN THAT JOB IS NOT MADE TO BE SWAPPED IN ;REQUIRES OR DELYAING COMMAND IF SYSTEM ;TAPE USER TYPOES ^C (HALT COMMAND) DLYCM1: POP PDP,TAC POP PDP,TAC1 POP PDP,TAC1 PUSH PDP,CONTC1 MOVE TAC1,LINSAV JRST TTYCM IFN FTDISK,< ;SEARCH DEVICE CHAIN FOR DSK WITH COUNTS ON ;CALL MOVE ITEM,JOB NO ; PUSHJ PDP,STOPCK ; CAN'T STOP RETURN ; OK TO STOP RETURN EXTERNAL DSKDDB,DSKFGS,CPOPJ1 STOPCK: MOVEI DEVDAT,DSKDDB MOVSI TAC1,DSKFGS STOPD: LDB TAC,PJOBN CAIE ITEM,(TAC) ;ASSIGNED TO THIS JOB? JRST STOPC ;NO TDNE TAC1,DEVIOS(DEVDAT) ;YES. FLAG ON? JRST CPOPJ ;YES. DELAY STOPC: HLRZ DEVDAT,DEVSER(DEVDAT) MOVSI TAC,446353 CAMN TAC,DEVNAM(DEVDAT) JRST STOPD JRST CPOPJ1 ;OK TO STOP > SUBTTL COMCSS - COMMON COMMAND SUBROUTINES ;ROUTINE TO RETURN NEXT ALPHANUMERIC STRING ; IN COMMAND LINE (SIXBIT) ;CALL: MOVE TAC,BYTE POINTER TO PREVIOUS CHAR. ; PUSHJ PDP, CTEXT ; SIXBIT STRING RETURN LEFT JUSTIFIED IN AC TAC1 INTERNAL CTEXT INTERNAL CTEXT1 T=BUFPNT ;TEMPORARY AC'S T1=BUFWRD T2=UUO CTEXT: PUSHJ PDP,SKIPS ;CALL HERE IF AT START OF LINE SKIPA CTEXT1: PUSHJ PDP,SKIPS1 ;SKIP LEAD SPACES,TABS,NULLS AND CLEAR TAC1 ; DO NOT RETURN IF CR WAS PERVIOUS BREAK MOVE T,[POINT 6,TAC1] IFE FTTTYSER,< LDB TEM,TAC JRST CTEX1 CTEX0: ILDB TEM,TAC > IFN FTTTYSER,< EXTERN TAKR,GETCHR LDB TEM,TAKR(DAT) ;GET LAST CHAR. JRST CTEX1 CTEX0: PUSHJ PDP,GETCHR ;ROUTINE IN SCNSER TO PICK UP CHAR. > CTEX1: PUSHJ PDP, CTEX ;IS IT ALPHANUMERIC TRC TEM,40 ;CONVERT TO SIXBIT TLNE T,770000 ;SIX CHARS YET? IDPB TEM,T ;NO. BUILD WORD JRST CTEX0 ;LOOP FOR MORE ;SCAN FOR ALPHANUMERIC CHAR IN TEM CTEX: CAILE TEM,"Z"+40 ;GREATER THAN LC Z? JRST CTEXA ;YES. NOT SIXBIT. CAIL TEM,"A"+40 ;LOWER CASE LETTER? TRZ TEM,40 ;YES. MAKE UPPER CASE. CAIL TEM, "0" CAILE TEM, "Z" ;LETTERS ARE LARGER THEN NOS. JRST CTEXA ;NEITHER CAILE TEM,"9" CAIL TEM,"A" POPJ PDP, ;LETTER OR NUMBER RETURN CTEXA: IFE FTTTYSER,< POP PDP,T1 ;REDUCE PDP BY 1 LEVEL POPJ PDP, ;AND RETURN > IFN FTTTYSER,< CAIN TEM,":" ;DEVICE NAME? PUSHJ PDP,GETCHR ;YES. SKIP COLON CAIE TEM,3 ;CONTROL C? JRST TPOPJ ;NO. RETURN ONE LEVEL UP CTXCNC: MOVSI TAC1,(SIXBIT /HAL/) ;MAKE PHONY HALT COMMAND MOVEI TEM,12 ;WITH LF FOR TERMINATION JRST TPOPJ ;AND RETURN UP A LEVEL > ;ROUTINE TO IGNORE LEADING SPACES, TABS, AND NULLS ;ALSO CLEARS TAC1 ;DOES NOT RETURN IF PREVIOUS CHAR. OR NEXT NON-SPACING ;CHAR, IS CR(IE POPS SUBROUTINE LEVEL UP 1 ON RETURN) ;CALL: MOVE TAC,BYTE POINTER TO PREVIOUS BREAK CHAR. ; PUSHJ PDP, SKIPS1 INTERNAL SKIPS1,SKIPS IFE FTTTYSER,< SKIPS1: SKIPS: MOVEI TAC1,0 ;CLEAR TAC1 LDB TEM,TAC ;WAS PRECEDING BREAK A CR? CAIN TEM,15 JRST SKIPS2 ;YES. POP SUB. LEVEL UP 1 SKIPSA: ILDB TEM,TAC JUMPE TEM,SKIPSA ;NULL? CAIE TEM," " ;SPACE? CAIN TEM, 11 JRST SKIPSA CAIN TEM,15 ;CR? SKIPS2: POP PDP,T ;YES. POP SUB. LEVEL UP ONE POPJ PDP, > IFN FTTTYSER,< EXTERNAL GETCHR,SPCHEK,BREAKB,TAKR SKIPS: PUSHJ PDP,GETCHR ;GET FIRST CHAR ON LINE SKIPS1: MOVEI TAC1,0 ;FOR CTEXT, DECIN LDB TEM,TAKR(DAT) ;IN CASE TEM CLOBBERED CAIN TEM,15 ;SKIP TO LF IF CR SKIPSA: PUSHJ PDP,GETCHR ;NEXT CHARACTER JUMPE TEM,SKIPS3 ;POP UP A LEVEL IF NO CHARS PUSHJ PDP,SPCHEK ;SPECIAL? JRST SKIPS2 ;NO TLNE TAC,BREAKB ;BREAK?(END OF LINE) JRST SKIPS3 ;YES. POP UP RETURN SKIPS2: CAIG TEM,40 ;SPACE OR CONTROL CHAR? JRST SKIPSA ;YES. POPJ PDP,Z ;NO. RETURN SKIPS3: CAIN TEM,3 ;^C? JRST CTXCNC ;HANDLE IT MOVEI TEM,12 ;FOR BREAK CONSISTENCY JRST TPOPJ ;RETURN ONE LEVEL UP > ;ROUTINE TO APPEND A "?" TO INPUT STRING AND SET AS OUTPUT ;CALLED FROM OCTIN, RETURNS TO SECOND LEVEL ON PDL ;CALL: MOVE TAC, BYTE POINTER TO LAST CHAR. IN INPUT STRING ; PUSHJ PDP, COMERA INTERNAL COMERA,COMERP COMERP: POP PDP,T ;REMOVE SUB. RETURN BEFORE CALLING COMERA COMERA: IFE FTTTYSER,< IBP TAC> IFN FTTTYSER,< PUSHJ PDP,GETCHR> ;MOVE UP, A CH ;ROUTINE TO REPLACE LAST CHARACTER IN INPUT STRING BY "?" ;AND SET AS OUTPUT ;CALL: MOVE TAC, BYTE POINTER TO LAST CHAR. IN INPUT STRING ; PUSHJ PDP, COMERR INTERNAL COMERR COMERR: IFN FTTTYSER,< EXTERN OUTCHS,TRESCN,TITAKR,SETBFI,TISYNC MOVE T,TITAKR(DEVDAT) ;SAVE POSISITION IN SCAN PUSHJ PDP,TRESCN ;BACK UP TO START OF COMMAND COMERL: PUSHJ PDP,GETCHR ;GET A CHAR FROM COMMAND CAMN T,TITAKR(DEVDAT) ;PASS BAD CHAR YET? JRST COMER1 ;YES PUSHJ PDP,OUTCHS ;NO. TYPE CHAR. JUMPN TEM,COMERL ;LOOP IF NOT OUT OF CHARACTERS COMER1: PUSHJ PDP,SETBFI ;CLEAR ANY MORE TYPEIN AOS TISYNC(DEVDAT) ;THIS WILL BE SOS-ED AT COMRET MOVEI TEM,"?" ;APPEND ? TO ERRONEOUS WORD PUSHJ PDP,OUTCHS > IFE FTTTYSER,< MOVE DAT,TAC MOVEI T,"?" ;STORE ? ON TOP OF BREAK CHAR. DPB T,DAT > TDZA ITEM,ITEM ;CLEAR JOB NO. AND SKIP INTO CRLF ROUT. ;ROUTINE TO PRINT A COMMAND ERROR MESSAGE ;SAME CALL AS CONMES INTERNAL ERRMES ; COMERR SKIPS THIS ROUT,(SEE ABOVE) ERRMES: TDZA ITEM,ITEM ;CLEAR JOB NUMBER TO INDICATE ERROR ; SKIP INTO CONMES ROUTINE ;ROUTINE TO PRINT CARRIAGE RETURN-LINE-FEED ;CALL: MOVE DAT,BYTE POINTER TO OUTPUT ; PUSHJ PDP,CRLF INTERNAL CRLF ; COMERR SKIPS TO HERE(SEE ABOVE) CRLF: MOVEI TAC,[ASCII / /] ;ROUTINE TO MOVE ASCII CHAR. STRING TO CONSOLE OUTPUT BUFFER ; CALL: MOVE DAT, BYTE POINTER TO LAST OUTPUT CHARACTER ; MOVEI TAC, ADDRESS OF ASCII MESSAGE ; PUSHJ PDP, CONMES ; STRING TERMINATED BY NULL ; CONMES DOES NOT START TTY ;CONMS1 - SAME CALLING SEQUENCE A CONMES,EXCEPT LH IS BYTE POINTER INTERNAL CONMES EXTERNAL TPOPJ ; ERRMES SKIPS TO HERE CONMES: HRLI TAC,440700 ;FORM ASCIZ BYTE POINTER CONMS1: PUSH PDP,TAC ;SAVE BYTE POINTER CON0: ILDB TEM,(PDP) ;GET NEXT CHAR. JUMPE TEM,TPOPJ ;IS IT NULL?(IF YES, DO POP TAC, POPJ) TYOINS: ;TAG FOR THE TYPE OUT INSTRUCTION CONOUT: ;EXECUTED FROM REST OF COMCSS TO OUTPUT CHAR IFN FTTTYSER,< EXTERN OUTCHS PUSHJ PDP,OUTCHS ;NO. STORE TTY OUTPUT BUFFER > IFE FTTTYSER,< IDPB TEM,DAT > JRST CON0 ;KEEP GOING ;ROUTINE TO PRINT INLINE ASCIZ MESSAGE ;CALL: PUSHJ PDP,INLMES ; ASCIZ /THE MESSAGE/ ;RETURN TO NEXT LOC AFTER MESSAGE INTERNAL INLMES INLMES: POP PDP,TAC ;SETUP PRINT ADRESS FOR CONMES PUSHJ PDP,CONMES JRST 1(TAC) ;RETURN TO NEXT LOC AFTER MESSAGE ;ROUTINE TO APPEND ? TO ERROR MESSAGE ;CALL PUSHJ PDP,PRQM ; RETURN INTERNAL PRQM PRQM: MOVEI TEM,"?" IFN FTTTYSER,< EXTERN OUTCHS JRST OUTCHS > IFE FTTTYSER,< IDPB TEM,DAT POPJ PDP, > PRSPC: MOVEI TAC,[ASCIZ / /] JRST CONMES ;ROUTINE TO PRINT "TOO FEW ARGUMENTS" ;CALL: MOVE DAT,BYTE POINTER ; PUSHJ PDP,NOTENF INTERNAL NOTENF NOTENF: JSP TAC,ERRMES ASCIZ /TOO FEW ARGUMENTS / ;ROUTINE TO PRINT A PERIOD ;CALL: PUSHJ PDP,PRPER INTERNAL PRPER PRPER: JSP TAC,CONMES ASCIZ /./ ;ROUTINE TO DEASSIGN A DEVICE ;CALL: MOVE DEVDAT, DEVICE DATA BLOCK ; MOVE ITEM, JOB NUMBER ; PUSHJ PDP, DEASG ; ERROR NOT PREVIOUSLY ASSIGNED ; OK RETURN WITH DEVICE DEASSIGNED INTERNAL DEASG EXTERNAL PJOBN,CPOPJ1,IPOPJ DEASG: LDB T, PJOBN ;WAS DEVICE ASSIGNED TO THIS JOB? CAME T, ITEM POPJ PDP, ;NO, RETURN PUSH PDP,ITEM ;SAVE JOB NUMBER MOVSI TAC1,DVDIRI ;CLEAR DIRECTORY IN CORE BIT ANDCAB TAC1,DEVMOD(DEVDAT) ;SET DEVICE CHARACTERISTICS FOR TEST ; AND ASGHGH SETZM DEVLOG(DEVDAT) ;CLEAR LOGICAL NAME TRNE TAC1,ASSCON ;IS DEVICE ASSIGNED BY CONSOLE? AOS -1(PDP) ;YES, DO OK RETURN IFN FT2REL,< EXTERN ASGHGH PUSHJ PDP,ASGHGH ;IF DTA OR MTA, CLEAR ANY HIGH SEGMENT NAMES ; FROM THIS DEVICE SO NO NEW SHARING ; DEVMOD SETUP IN TAC1 ON CALL > MOVEI TAC1,ASSCON ;SETUP ASSIGNED BE CONSOLE BIT FOR RELEASE PUSHJ PDP,RELEA6 ;CLEAR JOB NO. IN DDB IF DDB NOT NEEDED JRST IPOPJ ;RESTORE JOB NUMBER AND RETURN ;ROUTINE TO DEASSIGN ALL DEVICES EXCEPT LOGICAL TTY ;CALL: MOVE ITEM, JOB NUMBER ; MOVE DEVDAT,ADR. OF DEVICE NOT TO BE DEASSIGNED ; PUSHJ PDP, DEASTY INTERNAL DEASAL,DEASTY EXTERNAL DEVLST DEASTY: DEASAL: PUSH PDP,DEVDAT ;SAVE TTY DDB ADDRESS HLRZ DEVDAT,DEVLST ;SEARCH ALL DDB'S DEA1: CAIE DEVDAT,@(PDP) ;IS THIS DEVICE NOT TO BE DEASSIGNED? PUSHJ PDP, DEASG ;NO, TRY TO DEASSIGN IT JFCL ;IGNORE IF CAN'T HLRZ DEVDAT, DEVSER(DEVDAT) JUMPN DEVDAT, DEA1 POP PDP,DEVDAT ;RESTORE TTY DDB ADDRESS POPJ PDP, ;ROUTINE TO READ CONSOLE AND CONVERT ANY RADIX NUMBER ; CALL: MOVE TAC1, DESIRED RADIX ; MOVE TAC, BYTE POINTER TO FIRST CHARACTER ; PUSHJ PDP, ANYRIN ; NO ARG. TYPED RETURN, TAC1=0 ; ILLEGAL CHARACTER RETURN ; NORMAL EXIT TAC TAC1 CONTAINS NUMBER ;SCAN STOPS ON FIRST OR,DASH,SPACE,OR TAB OR ILLEGAL CHAR. ;SKIPS LEADING SPACES AND TABS INTERNAL OCTIN,OCTIN1,DECIN,DECIN1 EXTERNAL CPOPJ1,CPOPJ2 C=BUFPNT ;CHARACTER AC R=BUFWRD ;RADIX AC DECIN1: DECIN: MOVEI R,12 ;DECIMAL INPUT JRST ANYRIN OCTIN1: OCTIN: MOVEI R,10 ;OCTAL INPUT ANYRIN: PUSHJ PDP,SKIPS1 ;SKIP LEADING SPACES, TABS, NULLS ; DO NOT RETURN IF CR WAS PREVIOUS BREAK ; OR THIS BREAK IFE FTTTYSER,< LDB TEM,TAC> OCT0: CAIGE TEM,175 ;ALTMODES(175 OR 176)? CAIN TEM,"[" ;NO. LEFT BRACKET(SO SPACE NOT REQ ; BEFORE [P,P] IN ATT AND GET COMMANDS. JRST CPOPJ2 ;YES. SKIP RETURN CAIE TEM,"-" ;DASH? CAIG TEM,40 ;SPACE OR CONTROL CHAR? JRST CPOPJ2 ;YES, ONLY LEGAL TERMINATORS CAIE TEM,"," ;COMMA? CAIN TEM,"]" ;RIGHT BRACKET? JRST CPOPJ2 ;YES. SUBI TEM,60 JUMPL TEM,CPOPJ1 ;ERROR IF NEG.,REMOVE SUB. RETURN AND PRINT CAML TEM, R ;OR .GE. RADIX JRST CPOPJ1 ;ERROR, GREATER OR EQUAL TO RADIX IMUL TAC1, R ADD TAC1,TEM IFE FTTTYSER,< ILDB TEM,TAC ;NEXT CHAR> IFN FTTTYSER,< PUSHJ PDP,GETCHR> ;NEXT CHAR JRST OCT0 INTERNAL FTLOGIN IFN FTLOGIN,< ;GET PROJECT-PROGRAMMER NUMBERS ;CALL: MOVE TAC,INPUT BYTE POINTER ; PUSHJ PDP,PJPGNO ; ;(AC2)LH _ PROJECT NUMBER ;(AC2)RH _ PROGRAMMER NUMBER ;(AC2) = 0 IF NO [ ]'S TYPED ;THE TERMINAL ] IS OPTIONAL IFE FTTTYSER,< PJPGNO: SKIPA TAC1,TAC ;SAVE INPUT BYTE POINTER IN CASE NO ; [ ]'S WERE TYPED IN. PP0: IBP TAC ;GET NEXT CHARACTER (2ND TIME THRU LOOP) LDB TEM,TAC ;GET CHAR WHICH STOPED PREVIOUS FIELD SCAN ; (OR NEXT CHAR ON 2ND TIME THRU LOOP) > IFN FTTTYSER,< PP0: PUSHJ PDP,SKIPS1 PJPGNO: > CAIN TEM,"[" ;IS IT A "[" ? JRST PP1 ;YES, GET PROJECT-PROGRAMMER NUMBERS FROM INSIDE. CAIE TEM," " ;NO, IS IT A SPACE ? CAIN TEM,11 ; OR A TAB? JRST PP0 ;YES, KEEP LOOKING FOR "[". MOVEI AC2,0 ;NEITHER SPACE NOT TAB, THUS RETURN A 0 MEANING ; NO PROJECT-PROGRAMMER NUMBER ENCOUNTERED. IFE FTTTYSER,< MOVEM TAC1,TAC ;RESTORE ORIGINAL BYTE POINTER.> POPJ PDP, ;EXIT....... PP1: IFN FTTTYSER,< PUSHJ PDP,SKIPS> PUSHJ PDP,OCTIN ;GET FIRST ARG.-PROJ. NO. JRST COMERP ;NO ARG. GIVEN JRST COMERP ;ILLEGAL DECIMAL CHARACTER GIVEN HRL AC2,TAC1 ;ENTER IFN FTTTYSER,< CAIE TEM,"," JRST COMERP PUSHJ PDP,SKIPS> PUSHJ PDP,OCTIN ;GET SECOND ARG.-PROG. NO. JRST COMERP ; JRST COMERP ; HRR AC2,TAC1 ;ENTER PUSHJ PDP,SKIPS1 ;SKIP BLANKS CAIN TEM,"]" ;IS USUAL ENDING A "]"? IFE FTTTYSER, ;YES, SKIP IT IFN FTTTYSER, ;YES, SKIP IT SO FINAL ] IS OPTIONAL POPJ PDP, ;RETURN RO CALL > ;ROUTINE TO PRINT TIME AS HOURS,MINUTES,SECONDS, AND HUNDRETHS ;FORMAT IS HHMM:SS.HH ;CALL: MOVE TAC,TIME IN JIFFIES(60THS,50THS OR MILLISECONDS) ; MOVE DAT,OUTPUT TEXT BYTE POINTER ; PUSHJ PDP,PRTIME ;SCALEING IS DONE USING THE FOLLOWING GLOBAL SYMBOLS DEFINED ;ON THE CONFIGURATION TAPE (IOINI1) ;THUS ANY INSTALLATION MAY HAVE ANY RATE CLOCK EXTERNAL JIFMIN,JIFSEC,JIFSC2 ;JIFMIN=NO. OF JIFFIES(CLOCK TICKS) PER MINUTE ;JIFSEC=NO. OF JIRFIES PER SECOND ;JIFSC2=1/2*JIFSEC(USED FOR ROUNDING) INTERNAL PRTIME PRTIME: IDIVI TAC,JIFMIN ;FORM MINUTES PUSH PDP,TAC1 ;SAVE REMAINDER IN JIFFIES JUMPE TAC,PR1 ;SUPRESS 0 HOURS IN MINUTES IDIVI TAC,^D60 ;HOURS, MINUTES IN TAC,TAC1 JUMPE TAC,PR0 ;SUPPRES 0 HOURS PUSHJ PDP,RADX10 PUSHJ PDP,INLMES ;PRINT "HH:" OR "H:" ASCIZ /:/ PR0: MOVE TAC,TAC1 ;GET MINUTES PUSHJ PDP,PRT2 ;PRINT "MM:" PUSHJ PDP,INLMES ASCIZ /:/ PR1: POP PDP,TAC ;RESTORE SECONDS(IN JIFFIES) IDIVI TAC,JIFSEC ;JIFFIES PER SECOND PUSHJ PDP,RADX10 ;PRINT SECONDS PUSHJ PDP,PRPER ;PRINT PERIOD MOVE TAC,TAC1 ;NO OF JIFFIES(HUNDRETHS) IMULI TAC,^D100 ;CONVERT TO HUNDRETHS IDIVI TAC,JIFSEC CAIL TAC1,JIFSC2 ;ROUND IF GREATER THEN HALF AOS TAC JRST PRT2LF ;PRINT PRTIM1: IDIVI TAC,JIFMIN ; IDIVI TAC,^D60 ;HOURS,MINUTES IN TAC,TAC1 PUSHJ PDP,PRT2 PUSHJ PDP,INLMES ;PRINT "HH:" ASCIZ /:/ MOVE TAC,TAC1 PRT2LF: PUSHJ PDP,PRT2 ;PRINT "MM JRST CRLF PRT2: MOVEI TEM,"0" CAIGE TAC,^D10 XCT CONOUT ;PUT LEADING 0 IF LESS THEN 10 JRST RADX10 ;PRINT REST OF NUMBER ;ROUTINE TO PRINT SIZE OF LOGICAL SEGMENT (LOW OR HIGH) ;CALL: MOVE ITEM, HIGH OR LOW SEG NUMBER ; PUSHJ PDP,PRT SEG ; RETURN ;CALLED AT CLOCK LEVEL FROM CORE (UUO ARG) COMMAND AND SEGCON INTERN PRTSEG EXTERN PCORSZ PRTSEG: PUSHJ PDP,SEGSIZ ;TAC1=SIZE OF HIGH OR LOW SEG MOVE TAC,TAC1 ;RADX10 WANT DEC. NO. IN TAC JRST RADX10 ;PRINT DECIMAL ;ROUTINE TO RETURN SIZE OF HIGH OR LOW SEG ;CALL: MOVE ITEM,LOW OR HIGH SEG NUMBER ; PUSHJ PDP,SEGSIZ ; RETURN WITH SIZE IN K IN TAC1 INTERN SEGSIZ EXTERN CPOPJ SEGSIZ: IFN FTSWAP,< EXTERN IMGIN LDB TAC1,IMGIN ;SIZE WHEN NEXT SWAPPED IN(IN K) JUMPN TAC1,CPOPJ ;0 MEANS NOT SWAPPED OUT > HLRZ TAC1,JBTADR(ITEM) ;SIZE-1 LOW LOW OR HIGH SEG IN WORDS IN CORE JUMPE TAC1,CPOPJ ;IS IT IN CORE? LSH TAC1,-12 ;YES, CONVERT TO #K-1 AOJA TAC1,CPOPJ ;ADD 1 AND RETURN NUMBER OF K ;ROUTINE TO ASSIGN A MINIMAL CORE AREA(140 WORDS) ;CALLED FROM CORE,KJOB, AND RUN COMMANDS ;THIS ROUTINE PRESERVES INPUT BYTE POINTER IN TAC ;CALL: PUSHJ PDP,GETMIN ; RETURN PROG=0 IF UNSUCCESSFUL OR CORE ASSIGNED ON DISK EXTERN JOBDA,TPOPJ GETMIN: IFE FTTTYSER,< PUSH PDP,TAC ;SAVE INPUT BYTE POINTER TO COMMAND > IFN FTTTYSER,< PUSH PDP,DEVDAT ;SAVE TTY DDB ADR > PUSH PDP,TAC1 ;SAVE DEVICE NAME(GET) PUSH PDP,IOS ;SAVE DISPATCH ADDRESS(ANYACT USES IOS) IFN FT2REL,< EXTERN KILHGH PUSHJ PDP,KILHGH ;KILL HIGH SEG > MOVEI TAC,JOBDA ;LENGTH OF JOBDATA AREA PUSHJ PDP,CORE0 ;ASSIGN 140 WORDS ON DISK OR MEMORY JFCL ;IGNORE IF CANT(PROG=0) POP PDP,IOS POP PDP,TAC1 ;RESTORE PUSHED ACS IFN FTTTYSER,< POP PDP,DEVDAT ;RESTORE TTY DDB ADR POPJ PDP, ;TAC NOT USER BY FULL DUPLEX SCNSER > IFE FTTTYSER,< JRST TPOPJ ;RESTORE TAC AND RETURN > ;ROUTINE TO GET 1 WORD FORM USER ARE WHICH CAN BE IN LOW OR HIGH SEG ;CALL: MOVE PROG,[XWD PROT,RELOC FOR LOW SEG] ; MOVE ITEM,JOB NUMBER ; HRLI UUO,PROG ;FOR RELOCATION ; HRR UUO,USER ADDRESS(IE BEFORE RELOCATION) ; PUSHJ PDP,GETWRD ; ERROR RETURN ADDRESS OUT OF BOUNDS ; OK RETURN, CONTENTS IN AC TAC ;CAN BE CALLED AT CLOCK OR UUO LEVEL ;CALLED FROM E COMMAND,INIT,OPEN AND CALL UUOS INTERN GETWRD EXTERN CPOPJ1 GETWRD: HLRZ TAC,PROG ;LARGEST REL LOC IN LOW SEG CAIGE TAC,(UUO) ;IS ADR. IN LOW SEG? IFN FT2REL,< EXTERN HGHWRD JRST HGHWRD ;NO, CHECK IF IN HIGH SEG(ERROR RET IF NO) > IFE FT2REL,< POPJ PDP, ;NO, ERROR RETURN > MOVE TAC,@UUO ;YES, GET IT FROM LOW SEG JRST CPOPJ1 ;AND SKIP RETURN SUBTTL SAVGET - SAVE,GET,R,RUN COMMANDS AND RUN,GETSEG UUOS ;SAVGET LOWER CORE LOCATIONS USED FOR UUOS TO MONITOR ;USED IN SAVGET IN APRSER AND SAVGET IN SEGCON ;THESE LOCATIONS ARE DEFINED TO BE IN THE USERS UUO ACS ;FOR LOOKUP,ENTER UUOS: XP SGANAM,0 ;FILE NAME XP SGAEXT,SGANAM+1 ;FILE EXTENSION XP SGADAT,SGANAM+2 ;FILE CREATION DATE+TIME XP SGALEN,SGANAM+3 ;LN=-LENGTH,RH=FIRST LOC-1 DUMPED ; OR PROJECT-PROGRAMMER NUMBER(DISK) XP SGAEND,SGALEN+1 ;LAST WORD OF DUMP COMMAND LIST=0(SAVE AND GET) XP SGAREN,SGAEND ; ALSO FIRST WORD FOR RENAME USED AS DELETE XP SGAPPN,SGAREN+3 ;FOURTH WORD-PLACE TO SAVE PROJECT-PROGRAMEMR ; NUMBER USER TYPED ;FOR OPEN UUOS: XP SGAMOD,10 ;IOS MODE WORD FOR OPEN UUO XP SGADEV,SGAMOD+1 ;DEVICE NAME XP SGAHED,SGAMOD+2 ;INPUT-OUTPUT BUFFER HEADER ADDRESSES=0 ;MISC. DATA LOCATIONS: XP SGADMP,13 ;DUMP COMMAND IOWD XP SGACOR,14 ;AC FOR CORE UUO'S(HIGHEST USER LOC DESIRED) XP SGANEW,15 ;NEW CORE ASSIGNMENT AS SPECIFIED BY THIRD ARG XP SGAHGH,16 ;LH=EXT TO USE FOR SAVING HIGH SEG ; RH=EXT TO DELETE(IE SHRHGH OR HGHSHR) XP SGALOW,17 ;LH=EXT WHICH USER TYPED FOR SAVE OR GET COMMAND ; OR .SAV IF HE DIDN'T TYPE AN ARG WITH LEADING PERIOD ; RH=0 ;ROUTINE TO SCAN COMMAND STRING ARGUMENTS FOR SAVE,GET,RUN AND R ;COMAMNDS AND STORE THEM IN JOB DATA AREA WHICH MUST BE IN CORE ;WHEN SGSET IS CALLED FROM COMMAND DECODER ;CALL: MOVE TAC,INPUT BYTE POINTER ; MOVE TAC1,SIXBIT DEVICE NAME ; MOVE DAT,OUTPUT BYTE POINTER ; MOVE IOS,ADR. OF MONITOR JOB(SAVJOB,GETJOB,RUNJOB) ; MOVE PROG, ADR. OF JOB AREA ; PUSHJ PDP,SGSET C=BUFPNT INTERNAL FTLOGIN,FT2REL,FTDISK EXTERNAL JOBCOR,JBTPRG SGSET: JUMPE TAC1,NOTENF ;NOT ENOUGH ARE IF NO DEVICE NAME MOVEM TAC1,SGADEV(PROG) ;STORE DEVICE NAME SKIPN TAC1,JBTPRG(ITEM) ;GET AUTOMATIC FILENAME, OR PUSHJ PDP, CTEXT1 ;GET FILE NAME FROM COMMAND STRING JUMPE TAC1,NOTENF ;THERE MUST BE A FILE NAME MOVEM TAC1,SGANAM(PROG) ;STORE FILE NAME MOVEM TAC1,JBTPRG(ITEM) ;SAVE FILE NAME FOR SYSTAT COMMAND MOVEI TAC1,0 ;ASSUME USER DID NOT SPECIFY AN EXTENSION ; 0 WILL BE TURNED INTO SAV OR DMP IFE FTTTYSER,< LDB TEM,TAC> CAIN TEM,"." ;IS AN EXTENSION SPECIFIED? PUSHJ PDP,CTEXT ;YES. GET EXTENSION HLLZM TAC1,SGAEXT(PROG) ;STORE IT FOR LOOKUP IFN FT2REL,< EXTERN SETEXT ;ALSO SAVE IT AGAIN IN SGALOW FOR LOW SEG ; LOOKUP OR ENTER PUSHJ PDP,SETEXT ;SET HIGH EXTENSION(SGAHIGH) TO .SHR IF SSAVE OR GET ; .HGH IF SAVE(LH IOS=NSRBIT). > SETZM SGADAT(PROG) ;SET DATE(E+2) TO 0, SO MONITOR WILL USE TODAYS IFN FTLOGIN,< PUSHJ PDP,PJPGNO ;GET PROJ, PROG. NO. MOVEM AC2,SGAPPN(PROG) ;STORE 0 IF NO []'S TYPED BY USER > PUSHJ PDP,DECIN1 ;AMOUNT OF CORE (OPTIONAL THIRD ARG.) JRST SGSET1 ;DOES NOT RETURN IF ERROR. RETURN HERE IF NO ARG. JRST COMERA ;ILLEGAL CHARACTER LSH TAC,12 ;CONVERT TO HIGHEST REL. LOC. SUBI TAC,1 SGSET1: MOVEM TAC1,SGANEW(PROG) ;STORE FOR RUN AND SAVE HRRZ TAC1,IOS ;SCHEDULE MONITOR JOB ; GUARRANTEE LH OF PC WORD IS 0, SINCE IT WILL ; BE ADDED TO STARTING ADDRESS(IF RUN COM) JRST MSTART ;START JOB WITH PC IN MONITOR MODE ;ROUTINE TO PICKUP ARGUMENTS FOR RUN AND GETSET UUOS ;THIS ROUTINE DOES SAME THING AS SGSET, EXCEPT THAT ARGUMENTS ARE ;OBTAINED FROM USER UUO ARGUMENTS INSTEAD OF FROM CONSOLE COMMAND ;THE USERS ARG ARE MOVED TO USER ACS(SGA...), THEREBY CLOBBERING HIS AC$S ;USER AC FIELD AND START PC OFFSET(RUN UUO) ARE SAVED ON PD LIST AT JOBPD3 ;THEN LOWER CORE IS SET UP(SG2 CALLED) RESET IS NOT DONE (FOR GETSEGUUO) ;JBTPRG NOT SET FOR LOW SET, SINCE GETSEGUUO SHOULD NOT ;CALL: MOVE TAC,CONTENTS OF USER AC(ADR. OF 3 WORD ARG LIST) ; MOVE PROG,JOB RELOCATION ; PUSHJ PDP,GETARG ; RETURN INTERN GETARG EXTERN JBTPRG,JOBCOR,PUUOAC GETARG: HRR UUO,TAC ;MOVE ADR. OF ARG LIST TO UUO EXCH TAC,(PDP) ;AND PUT ON PD LIST PUSH PDP,TAC ;MOVE RETURN PC UP ONE IN PD LIST LDB TAC,PUUOAC ;USER AC FIELD IN RUN OF GETSEG UUO HRRM TAC,-1(PDP) ;SAVE IN CASE OF ERROR RETURN PUSHJ PDP,GETWDU ;GET FIRST ARG FROM USER AREA MOVEM TAC,SGADEV(PROG) ;STORE DEVICE NAME PUSHJ PDP,GETWD1 ;GET NEXT ARG FROM USER ARREA MOVEM TAC,SGANAM(PROG) ;STORE FILE NAME FOR LOOKUP (DO NOT STORE FOR LOWSEG) PUSHJ PDP,GETWD1 ;GET THIRD ARG(EXTENSION WORD E+1) MOVE TAC1,TAC ;PUT ARG IN TAC1, SO SMAE AS SGSET RETURN FROM CTEXT MOVEM TAC1,SGAEXT(PROG) ;STORE EXTENSION AND RH FROM USER IFN FT2REL,< EXTERN SETEX1 PUSHJ PDP,SETEX1 ;SAVE EXT AGAIN IN SGALOW ; SETUP EXT FOR HIGH SEG(SGAHGH="SHR") ; SETUP EXTENSION FOR LOW SEG(SGALOW="SAV") > PUSHJ PDP,GETWD1 ;GET FOURTH ARG(DATE WORD) MOVEM TAC,SGADAT(PROG) PUSHJ PDP,GETWD1 ;GET FIFTH USER ARG FROM USER AREA MOVEM TAC,SGAPPN(PROG) ;STORE PROJECT,PROGRAMMER NO. OR 0 PUSHJ PDP,GETWD1 ;SIX ARG FROM USER HRRZM TAC,SGANEW(PROG) ;STORE CORE ARG OR 0(HIGHEST LOC DESIRED) ; IGNORE LH JRST SG2A ;GO SET UP LOWER CORE AND RETURN ; DO NOT DO A RESET ;THIS JOB SAVES A JOB AREA ON RETRIEVABLE STORAGE ;THIS JOB RUNS IN EXEC MODE AND CALLS IO ROUTINES USING REGULAR UUOS ;NO ATTEMPT IS MADE TO SAVE STATUS OF IO DEVICES, JOBDP, OR AC'S ;IN FACT THE ONLY USEFUL THING WHICH MAY BE DONE WITH A JOB AREA ;AFTER IT HAS BEEN SAVED IS TO START EXECUTIUON OVER AT THE STARTING ;ADDRESS INTERNAL SAVJOB,SAVERR EXTERNAL JOB41,JOBS41,JOBDDT,JOBSDD,JOBSV SAVJOB: JSP TAC1,SG1 ;SET UP ACS PROG,PDP,JDAT,ITEM. ; RESET DEVICES HLRE TAC1,SGADMP(PROG) ;-NO. OF WORDS TO WRITE PUSHJ PDP,CKIOWD ;CHECK USER'S CORE ARG(IF ANY) WITH AMOUNT ; RETURN ONLY IF 0 OR NOT SMALLER HRRM TAC,JOBCOR(PROG) ;STORE MAX OF SIZE OF FILE OR CORE ARG ; FOR ASSIGNING INITIAL CORE WHEN FILE GOTTEN IFN FT2REL,< EXTERN SAVHGH PUSHJ PDP,SAVHGH ;INIT DEV,SAVE HIGH SEG, IF ANY, RETURN IF OK JRST SAVFIN ;HIGH SAVED, BUT NO DATA IN LOW SEG, SO DO ; NOT WRITE LOW FILE ; SKIP RETURN IF LOW SEG TO BE WRITTEN > ; SGALEN, AND SGAEXT RESTORED SAVJB1: OPEN 0,SGAMOD ;RE INIT DEVICE, SO UGETF WILL SET FIRST FREE ; BLOCK BECAUSE NO LOOKUP OR ENTER DONE JRST SGERRA ;DEVICE NOT AVAILABLE UGETF 0,SGAHED ;GET FIRST FREE BLOCK(MEANINGFUL ONLY IF DTA) ; CAUSE ENTER TO ASSIGN FIRST LOBCK OF FILE ; AS LOWEST FREE BLOCK SO TENDMP CAN READ ; SAVED FILES, SGAHED IS NO LONGER NEEDED(OPEN UUO) ENTER 0,SGANAM ;ENTER FILE NAME IN DIRECTORY JRST SAVERR ;DIRECTORY FULL OR PROTECTION FAILURE MOVE TAC,JOB41(JDAT) ;SAVE USER UUO HANDLING JSR MOVEM TAC,JOBS41(JDAT) ;IN UPPER PART OF JOB DATA AREA MOVE TAC,JOBDDT(JDAT) ;SAVE DDT STARTING ADDRESS HIGHER UP IN JOB DATA AREA MOVEM TAC,JOBSDD(JDAT) ;SO COMPRESS ALWAYS MOVES CODE DOWN HRROS USRHCU ;FLAG THAT SAVE GET IS UNDER WAY ; SO THAT JOBHRL WILL NOT BE MODIFIED BY SETHGH RUOTINE ; TO USER'S HIGH SEG RELOCATION INFO. SINCE ; IT WILL CONTAIN COMPRESSION IOWD. ; COMPRESSION WILL ALWAYS MOVE DOWN HRRZ TEM,JOBSA(JDAT) ;SAV START ADDRESS FOR 10DMP MOVEI TAC,JOBSV(PROG) ;POINT TO 1ST DATA WORD MOVE TAC1,[XWD PROG,JOBSDD] ;IT STARTS AT JOBSDD HLRE ITEM,SGADMP(PROG) ;IOWD FOR THIS SIZE CORE(-LENGTH TO WRITE) MOVNS ITEM ;POSITIVE LENGTH ADDI ITEM,JOBSVM ;ADD IN FIRST LOC-1 TO WRITE=HIGHEST LOC TO WRITE ; TO MAKE END TEST HRLI ITEM,PROG ;USE PROG FOR RELOCATION CMPLP1: MOVEM TAC,DAT ;SAVE 1ST LOC FOR IOWD CAMLE TAC1,ITEM ;SEARCH FOR 1ST NON-0 WORD AOJA TAC,CMPTHR ;THROUGH SKIPN @TAC1 ;THIS A DATA WORD? AOJA TAC1,.-3 ;NO, KEEP LOOKING MOVNI AC1,1 ;YES, AC1 WILL BE AN IOWD HRLI AC1,-1(TAC1) ;1ST LOCATION - 1 CMPLP2: PUSH TAC,@TAC1 ;SAVE A DATA WORD AOS TAC1 CAMGE TAC1,ITEM ;AT TOP? SKIPN @TAC1 ;NO. NEXT WORD NON-0? JRST .+2 ;NO. THROUGH THIS BLOCK SOJA AC1,CMPLP2 ;COUNT THE WORD AND CHECK NEXT MOVSM AC1,(DAT) ;SAVE IOWD IN FRONT OF BLOCK AOJA TAC,CMPLP1 ;LOOK FOR NEXT NON-0 BLOCK CMPTHR: HRLI TEM,254000 ;SET A JRST C(JOBSA) MOVEM TEM,-1(TAC) ;AT END OF FILE SUBI TAC,JOBSV(JDAT) ;COMPUTE WORD COUNT MOVNS TAC ;MAKE AN IOWD HRL TAC,SGADMP(PROG) ;START ADDRESS MOVSM TAC,SGALEN(PROG) ;IOWD FOR THE OUTPUT UUO MOVEI TAC,-2 ;FLAG THAT CORE HAS BEEN COMPRESSED HRLM TAC,USRHCU ;KEEP LH NEG. COMMAND DECODER WILL EXPAND ; CORE ON START ,ODT,SAVE, REENTER,SSAVE IN CASE ; THIS SAE IO DOES NOT GO TO COMPLETION. (CONTROL C ; OR DEVICE FULL, SO THAT CORE DOES NOT GET EXPANDED PUSHJ PDP,SGDOA ;DO OUTPUT,RELEASE,FIND TTY OUTPUT 0,SGALEN ;OUTPUT UUO EXECUTED BY SGDO ; RETURN HERE ONLY IF NO ERRORS SAVFIN: PUSHJ PDP,SGREL ;RELEASE DEVICE AND FIND TTY JSP TAC,PHOLD ;PRINT MESSAGE AND STOP JOB ASCIZ /JOB SAVED/ SAVERR: MOVEI TAC,PRTERR ;ERROR CORE IN CASE RUN UUO(PROTECTION ERROR) ; CHANGE TO DISK ERROR CODE IF DEV IS DSK PUSHJ PDP,SGRELL ;CHANGE TO DISK ENTER ERROR CODE IF DSK ; RELEASE DEVICE AND RETURN TO USER(IF RUN UUO) ; OR FIND TTY=PRINT ?CRLF JSP TAC,PHOLD ;PRINT MESSAGE AND STOP JOB ASCIZ /DIRECTORY FULL/ ;THIS JOB GETS A JOB AREA FROM A RETRIEVABLE DEVICE ;THIS JOB RUNS IN EXEC. MODE AND CALLS IO ROUTINES DIRECTLY ;NO ATTEMPT IS MADE TO RESTORE STATUS OF IO DEVICES, PC, OR AC'S ;JOBPC IS SET TO STARTING ADDRESS OF JOB ;CORE MUST ALREADY HAVE BEEN ASSIGNED AND THE FOLLOWING LOC. SETUP IN ;JOB DATA AREA: ;JOBPDP, JOBREL INTERNAL GETJOB GETJOB: JSP TAC1,SG1 ;SETUP ACS, SETUP LOWER CORE(SGALEN,SGADMP) PUSHJ PDP,GETJB ;GET THE JOB JSP TAC,PHOLD ;RETURN ONLY IF EVERYTHING OK ASCIZ /JOB SETUP/ ;THIS JOB GETS A JOB AREA FROM A RETRIEVAL DEVICE AND STARTS IT UP ;JOB HAS JUST A JOB DATA AREA ASSIGNED WHEN CONTROL GETS HERE ;THIS MONITOR JOB GETS A JOB AREA FROM A RETRIEVABLE DEVICE ;ASSIGNS CORE AND START INTERNAL RUNJOB RUNJOB: JSP TAC1,SG1 ;SETUP ACS, SETUP LOWER CORE(SGALEN,SGADMP) JRST URUN1 ;LH PF PC WORD=0(MSTART) SO LH OF TAC1=0 AFTER JSP ; PUT TAC1 AS FIRST ITEM ON PD LIST(JOBPN1) ; LH USED BY SGRELE ON ERROR TO SEE IF FROM USER ; AND LH ADDED TO START PC(JOBSA) BY URUN ;RUN UUO ;CALL: MOVE AC,[XWD N,D] ; CALL AC,[SIXBIT /RUN/] ; ERROR RETURN ;UNLESS LH=HALT(PRINT CONSOLE MESS, IF YES) ; 1K OK, TRANSFER TO C(JOBSA)+N FOR NEW PROGRAM ; USERS ACS CLOBBERED SO CANNOT PASS DATA TO NEW PROGRAM ;WHERE: D/ DEVICE NAME ; D+1/ FILE NAME ; D+2/ FILE EXT OR 0 (LH SIXBIT) ; D+3/ DATE ETC ; D+4/ PROJECT,PROGRAMMER NO OR 0(CURRENT UFD OR DTA,MTA) ; D+5/ HIGHEST LOC DESIRED(OR 0) ANALOGOUS TO RUN COMMAND ; LH IS IGNORED(RATHER THAN ASSIGNING CORE TO HIGH SEG) INTERN URUN EXTERN JOBSA URUN: PUSHJ PDP,RESET ;RELEASE DEVICES ; WARNING! THIS GOES VERY DEEP IN ; PUSHDOWN, SEE MOD 518 ; (AC UUO PRESERVED IN RESET) MOVE TAC,@UUO ;RESTORE CONTENTS OF USERS'S CALLING AC PUSHJ PDP,GETARG ;GET 6 ARGS FROM USER AND STORE ; SAVE STARTING ADDRESS INCREMENT(LH OF TAC) ; AND USER AC NUMBER(IN CASE OF ERROR RETURN) ; SETUP ACS,DEVDAT TO DDB MOVE TAC,SGANAM(PROG) ;STORE FILE NAME FOR LOW SEG MOVEM TAC,JBTPRG(ITEM) ;FOR SYSTAT URUN1: PUSHJ PDP,GETJB ;GET BOTH LOW AND HIGH SEGMENTS HLRZ TAC1,(PDP) ;GET STARTING ADDRESS INCREMENT(0 IF RUN COM) IFN FT2REL,< EXTERN CHKMED CAILE TAC1,1 ;IS START INCREMENT 0 OR 1? PUSHJ PDP,CHKMED ;NO, CHECK TO SEE IF THIS IS SHARABLE SEG ; AND IF YES, SET MEDDLE BIT FOR THIS USER ; SO UWP CANNOT BE TURNED OFF AND CORE FOR HIGH SEG ; CANNOT BE INCREASED OR DECREASED (TAC1 PRESERVED) > ADDB TAC1,JOBSA(JDAT) ;ADD STARTING ADDRESS TO BOTH ; SO THAT C START WILL START ; PROGRAM AT SAME STARTING ADDRESS HRLI TAC1,USRMOD ;SET USER MODE BIT IN PC PUSH PDP,TAC1 ;PUT ON PD LIST JRST USRXIT ;AND GO TO RETURN TO USER AS IF FROM UUO ;UUO TO GET JUST HIGH SEG AND RETURN TO USER ;CALL IS THE SAME AS FOR RUN UUO EXCEPT THAT OK RETURN IS SKIP RETURN ;IF ERROR RETURN HAS HALT IN LH, STANDARD CONSOLE MESSAGE IS PRINTED AND JOB STOPPED INTERN UGTSEG,UGTERR UGTSEG: IFN FT2REL,< EXTERN UGETHI JRST UGETHI ;IN SEGCON > UGTERR: MOVEI TAC,ILUERR ;ILLEGAL UUO ERROR CORE PUSHJ PDP,SGRELE ;SEE IF USER WANTS ERROR JRST UUOERR ;NO, PRINT ILLEGAL UUO ;ROUTINE TO SETUP ACS, RESET IO, AND SETUP LOWER CORE LOCATIONS ;FOR SAVE AND GET(SGALEN SET IO IOWD OR PP IF DTA OR DSK) ;SGADMP SET TO IOWD FOR THIS SIZE CORE ;CALL: JSP TAC1,SG1 ; ALWAYS RETURN HERE, UNLESS DEVICE NOT FOUND ; DEVDAT SETUP TO DEVICE DATA BLOCK(BUT NOT INITED, UNLESS FT2REL=0) ; SO THAT INIT NOT NECESSARTY IF SEG ALREADY KNOWN(NO DTA QUEUING) ; DEVICE CHARACTERISTICS WORD(DEVMOD) RETURNED IN AC TAC1 ; IF DISK SYSTEM INTERN SG1,SG3,SG4 ;CALLED FROM SEGCON EXTERN USRDDT,USRREL,JOBSAV,JOBFF,CPOPJ1 EXTERN TTYFNU,JOBSVM,IADRCK,SAVDMP SG1: JSP TAC,MONSTR ;SETUP PROG.PDP,JDAT,ITEM=JOB NUMBER ; PUT TAC1 ON END OF PD LIST(EXEC MODE PC, ; SO ERROR MESSAGES WILL ALWAYS PRINT(SEE SGRELE) SG2: PUSHJ PDP,RESET ;RELEASE ALL DEVICES SG2A: MOVEI TAC,DR ;DUMP MODE 16(DUMP BY RECORDS ; IN CASE THIS IS MAGTAPE) MOVEM TAC,SGAMOD(PROG) ;STORE FOR OPEN UUO SETZM SGAEND(PROG) ;0 END OF DUMPE MODE COMMAND LIST SETZM SGAREN+1(PROG) ;FOR DELETE SETZM SGAREN+2(PROG) ;FOR DELETE HLLZS JOBCOR(JDAT) ;0 THIRD ARG IN JOBDATA AREA(SO CHKARG WILL ; WORD ON FIRST CALL(SAVE AND GET) SETZM SGAHED(PROG) ;CLEAR BUFFER HEADER ARG, FOR OPEN UUO IFE FT2REL,< OPEN 0,SGAMOD ;TRY TO ASSIGN DEVICE, SINCE IT MUST BE DONE > IFN FT2REL,< MOVE TAC,SGADEV(PROG) ;PHYSICAL OR LOGICAL DEVICE NAME PUSHJ PDP,DEVSRC ;FIND DEVICE AND SETUP DEVDAT TO DDB ; DO NOT INIT DEV SINCE IO MAY NOT BE NECESSARY ; DO NOT WANT TO WAIT IN DTA SYSTEM ; TAPE QUEUE IN 10/40 SYS > JRST SGERRA ;NOT AVAILABLE ;DEVICE INITED(OR FOUND) ;COMMON EXIT FROM SAVHGH AND GETHGH ROUTINES(HIGH SEG SAVE AND GET) ;SO THAT SGA... LOCATIONS ARE RESTOREED TO ORIGINAL VALUES FOR LOW SEG SG3: MOVE TAC,JOBFF(JDAT) ;FIRST FREE LOC IN JOB(SET FROM LH OF ; JOBSA WHICH IS SET BY LOADER MOVEI TAC,-1(TAC) ;MAKE LAST LOC TO SAVE OR GET(MAKE 0=777777) SKIPN USRDDT ;USER DDT IN USE(IF YES, SAVE ALL OF CORE ; SO HIS SYMBOLS WILL BE INCLUDED PUSHJ PDP,IADRCK ;NO, ADDRESS TO SMALL OR TO LARGE? MOVE TAC,USRREL ;YES, DUMP ALL OF CORE RATHER THEN GIVE ; ADDRESS CHECK MESSAGE-HIGHEST REL.ADR. MOVNS TAC ;-HIGHEST ADR TO SAVE TO GET ADDI TAC,JOBSVM ;LOWER CORE NOT DUMPED HRLI TAC,JOBSVM ;IE FIRST LOC-1 TO BE DUMPED MOVSM TAC,SGADMP(PROG) ;STORE IOWD WORD OF THIS SIZE CORE SG4: IFN FTDISK,< MOVE TAC1,DEVMOD(DEVDAT) ;RETURN DEVICE CHARACTERISTICS(IF DISK SYS) TLNE TAC1,DVDSK ;IS THIS DEVICE A DISK? MOVS TAC1,SGAPPN(PROG) ;YES. MAKE SURE FORTH WORD IS PROJ,PROG NO. > MOVSM TAC,SGALEN(PROG) ;NO. MAKE SURE FORTH WORD IS IOWD FOR DECTAPE ; SINCE DECTAPE USES RH TO COMPUTE LENGTH IN K ; FOR BOTH SAVE AND GET SKIPN TAC,SGAEXT(PROG) ;DID USER SPECIFY AN EXTENSION ? MOVSI TAC,SAVDMP ;NO, USE .SAV OR .DMP MOVEM TAC,SGAEXT(PROG) ;AND STORE FOR LOOK UP ORENTER POPJ PDP, ;ERROR ON INIT OR DEVICE SEARCH INTERN SGERRA ;CALLED FROM SEGCON SGERRA: JUMPE DEVDAT,SGERR1 ;WAS DEVICE FOUND, BUT JUST UNAVAILABLE? MOVEM DEVDAT,(PDP) ;YES, SAVE DDB ADDRESS FOR MESSAGE(ERNAM) MOVEI TAC,DNAERR ;ERROR CODE IN CASE RUN UUO(DEVICE NOT AVAILABLE) PUSHJ PDP,SGRELE ;RETURN TO USER IF RUN UUO ; OR FIND TTY AND PRINT ?CRLF PUSHJ PDP,ERNAM ;PRINT DEVICE NAME USING (PDP) JSP TAC,PHOLD ;START TTY AND STOP JOB ASCIZ / NOT AVAILABLE/ SGERR1: MOVEI TAC,NSDERR ;ERROR CODE IN CASE RUN UUO(NO SUCH DEVICE) PUSHJ PDP,SGRELE ;RETURN TO USER IF RUN UUO ; OR FIND TTY AND PRINT ?CRLF JSP TAC,PHOLD ;START TTY AND STOP JOB ASCIZ /NO SUCH DEVICE/ ;ROUTINE TO GET FILE FROM DEVICE(LOW AND/OR HIGH) ;CALL: ACS JDAT,PROG,PDP,DEVDAT SETUP ; MOVE ITEM,JOB NUMBER ; IFN FTDISK, ; PUSHJ PDP,GETJB ; RETURN ONLY IF EVERYTHING OK EXTERNAL JOBCOR,JOB,CPOPJ,JOBS41,JOB41 GETJB: IFN FT2REL,< EXTERN GETHGH PUSHJ PDP,GETHGH ;SEE IF HIGH SEG ALREADY EXISTS AND BEING SHARED ; IF NOT, TRY TO LOOKUP AND READ IN HIGH FILE ; IF .SHR DOESN'T EXIST, TRY .HGH, IF NEITHER-SKIP RETURN ; TAC1=DEVMOD(DEVDAT) IF DISK(DEV CHAR.) JRST LOWFIN ;HIGH SEG NOW IN CORE AND NO LOW FILE NEEDED ; LOW FILE NEEDED ; EITHER BECUASE NOHIGH SEG ; ORHIGH SEG ALSO NEEDS LOW FILE > LOOKUP 0,SGANAM ;LOOKUP LOW SEG FILE(EXT=SAV,DMP OR LOW(IF HIGH SEG ; REQUIRES LOW SEG AND USER DID NOT TYPE EXT) ; MODE=SAVMOD SO DECTAPE SERVICE WILL RETURN ; IOWD IN E+3(TEMPORARY) JRST NOFILE ;GO PRINT FILE.EXT NOT FOUND HLRE TAC1,SGALEN(PROG) ;-NO. OF WORDS IN FILE PUSHJ PDP,CKIOWD ;CHECK USER'S SUPPLIED CORE ARG TO MAKE SURE NOT ;TOO SMALL, RETURN LARGER OF FILE SIZE OR CORE ARG PUSHJ PDP,GETCOR ;OK, TRY TO GET CORE MOVE TAC1,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS MOVNS TAC ADDI TAC,JOBSVM ;-WORD COUNT FOR ALL USERS CORE TLNE TAC1,DVMTA ;MAG TAPE? HRLM TAC,SGALEN(PROG) ;YES, USE USER-SPECIFIED CORE ARGUMENT HRRZS JOBPD1(JDAT) ;TURN OFF USER MODE PC FLAG IN CASE THIS ;IS A RUN UUO,SO ERRORS WILL NOT TRY TO RETURN PUSHJ PDP,SGDO ;READ IN FILE INTO LOW SEGMENT INPUT 0,SGALEN ;EXECUTED FROM SGDO MOVE TAC,JOBS41(JDAT) ;RESTORE USER UUO JSR LOC MOVEM TAC,JOB41(JDAT) ;SAVED BY SAVE LOWFIN: HRRZ TAC,JOBCOR(JDAT) ;CORE ARG FROM PREVIOUS SAVE(THIS MONITOR ; ALWAYS STORES SOMETHING) SKIP TAC ;IS THIS AN OLD FORMAT FILE WITH NO CORE ARG TO SAVE? MOVE TAC,USRREL ;YES, USE ASSIGNMENT MADE WEN LOW FILE READ IN PUSHJ PDP,CKSARG ;RETURN ONLY IF USER'S SUPLLIED ARG IS 0 OR NOT ; SMALLER THAN SAVE CORE ARG. RETURN LARGER PUSHJ PDP,GETCOR ;TRY TO GET THIS AMOUNT OF CORE MOVE TAC,USRREL ;HIGHEST LOC ASSIGNED TO LOW SEG HRRM TAC,JOBCOR(JDAT) ;SET INITIAL CORE ASSIGNMENT IN JOB DATA AREA FOR ; USER TO USE TO RESET CORE TO INITIAL SETTING WHEN ; PROGRAM IS RESTARTED ; FALL INTO SGREL ;ROUTINE TO RELEASE DEVICE AND FIND TTY INTERN SGREL SGREL: SKIPN DEVDAT,USRJDA ;HAS CHANNEL BEEN RELEASED ALREADY? JRST SGREL2 ;YES, FIND TTY AND WAIT FOR OUTPUT TO FINISH PUSH PDP,T4 ;NO, MOVE TAC1,DEVMOD(DEVDAT) TLNE TAC1,DVMTA ;MAGTAPE? TLNN DEVDAT,INPB ;YES, WAS AN INPUT DONE? JRST SGREL1 ;NO CLOSE 0,CLSOUT ;YES, CLOSE MTA INPUT STATO 0,IOTEND+IODEND ;AT END OF APTE? MTAPE 0,16 ;NO SKIP TO EOF SGREL1: RELEASE 0, ;NO RELEASE DEVICE POP PDP,T4 SGREL2: JRST TTYFNU ;FIND TTY FOR CURRENT USER ;ROUTINE TO EXECUTE DUMP MODE COMMAND LIST SETUP IN SGALEN(R) ;AND CHECK FOR ERRORS. USED ONLY TO READ LOW FILE. ;CALL: PUSHJ P,SGDO ; INPUT 0,SGALEN OR OUTPUT 0,SGALEN ; OK RETURN(NO ERRORS) ;SGDOA CALLED FROM SAVE, IT HAS ALREADY SET LH OF USRHCU=-2 ;TO INDICATE CORE IS COMPRESSED EXTERN USRHCU,USRJDA,JOBSA,JOBDDT,JOBSDD,JOBSD1,JOBSAV,JOBCOR EXTERN JOBSV,JOBSV3,JOBSVD,JOBSDP SGDO: HRROS USRHCU ;SET LH OF USRCHU-1 AS A FLAG TO INDICATE SAVE GET ; LOW FILE IO IN PROGRESS, SO MONITOR WILL ; NOT STORE HIGH SEG PROTECTION IN JOBHRL WHICH ; HAS IOWD FOR ZERO COMPRESSION SGDOA: XCT @(PDP) ;EXECUTE INPUT OR OUTPUT UUO MOVE ITEM,JOB ;READ INTO PROTECTED PART OF JOB DATA AREA PUSHJ PDP,EXPAND ;EXPAND CORE IMAGE JRST ADRERR ;ADDRESS CHECK, PRINT MESSAGE AND STOP JOB MOVE TAC1,JOBDDT(PROG) ;COPY DDT STARTING ADR MOVEM TAC1,USRDDT ;INTO MONITOR PROTECTED AREA(IN CASE THIS IS GET) SETZM USRHCU ;FLAG THAT SAVE-GET IO FINISHED AND CORE EXPANDED AOS (PDP) ;SKIP OVER UUO IN CALLING SEQUENCE ;ROUTINE TO CHECK FOR IO ERRORS(CALLED FROM SEGCON) ;CALL: MOVE F,DEVICE DATA BLOCK ADDRESS ; PUSHJ P,SGIOCK ; RETURN ONLY IF NO ERRORS INTERN SGIOCK SGIOCK: MOVE T4,DEVIOS(DEVDAT) ;IO STATUS WORD FOR THIS DEVICE TRNN T4,IOBKTL!IODTER!IODERR!IOIMPM ;ANY ERRORS ON SAVE-GET DEVICE? POPJ PDP, ;NO, GIVE OK RETURN MOVEI TAC,TRNERR ;YES, ERROR CODE IN CASE THIS IS RUN UUO ; (TRANSMISSION ERROR) PUSHJ PDP,SGRELE ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO ; OF FIND TTY AND PRINT ?CRLF JSP TAC,PHOLD ;START TTY AND STOP JOB ASCIZ /TRANSMISSION ERROR/ ;ROUTINE TO EXPAND CORE AFTER A SAVE(LOW SEG ONLY) ;CALL: MOVE DEVDAT,DEVICE ADR. ; MOVE PROG,JOBADR. ; MOVE ITEM,JOB NUMBER ; PUSHJ PDP,EXPAND ; ERROR RETURN, ADR, CHECK, OR NEED CORE BUT NOT CURRENT USER(COMMAND ; DECODER EXPANDING AFTER USER HAS REDUCED CORE) ; OK RETURN, CORE EXPANDED ;CALLED FROM SAVE AND COMMAND DECODER ;START,CSTART,DDT,REENTER,SAVE,SSAVE COMMANDS IF CORE STILL COMPRESSED EXPAND: HLRE AC3,SGALEN(PROG) ;-LENGTH OF FILE MOVNS AC3 ;-LENGTH OF FILE ADDI AC3,JOBSVM ;ADD FIRST LOC-1 TO FORM HIGHEST LEGAL ADR. HRLI AC3,PROG ;PUT PROG IN LH FOR COMPARE ; AC3 SET FOR ADDRESS CHECKING BELOW SKIPL TAC,JOBSV(PROG) ;IF FIRST LOC IS POSITIVE JRST SGDO1 ;OLD FORMAT, SO DONT EXPAND HRRZS TAC ;LOOK AT 1ST WORD OF FILE CAILE TAC,JOBDDT ;IS IT BELOW JOBJDA? JRST EXPND1 ;NO. NEW COMPRESSED FORMAT CAIE TAC,JOBSAV ;IS JOBDDT THE DATA WORD? JRST EXPND1 ;NO. EXPAND SKIPN JOBSV3(JDAT) ;IS THE SAVE FILE FROM CONVERT? ; CONVERT DOES NOT ZERO COMPRESS ; IT JUST WRITES ENTIRE FILE WITHH 1 IOWD IN FRONT SOJA AC3,SGDO1 ;YES, GO BLT DATA DOWN AS IF OLD DISK SAVE FILE ; (NON-COMPRESSED) HRROI TAC,JOBSD1 ;YES. CHANGE TO IOWD 1,JOBSDD EXCH TAC,JOBSV(PROG) ;ZEP, THE IOWD IS FIXED HLRES TAC ;WORD COUNT OF IOWD AOJE TAC,EXPND1 ;JUST 1 DATA WORD - THROUGH MOVSI TAC,1(TAC) ;MAKE IOWD N-2,JOBSAV JUMPE TAC,EXPZ HRRI TAC,JOBSAV ;SO NEXT DATA WDS WILL BE SKIPPED MOVEI TAC1,JOBSV(PROG) MOVEM TAC,2(TAC1) ;STORE IN COMPRESSED DATA JRST EXPND1 EXPZ: MOVSI TAC,-2 HLLM TAC,JOBSV(PROG) ;COME HERE TO DO THE ACTUAL EXPANSION OF A FILE EXPND1: MOVE TAC,[XWD PROG,JOBSV] ;IT WAS READ INTO JOBSV MOVE TAC,@TAC ;FIRST IOWD EXPLP1: HRRZ AC1,TAC1 ;ADDRESS OF IOWD CAIGE AC1,JOBSAV ;LEGAL? AOJA AC1,TOOLOW ;NO. DELETE DATA WHICH IS TO LOW HLRE AC1,TAC1 ;YES. GET WORDCOUNT MOVNS AC1 ;+N HRLM AC1,TAC1 ;CONVERT IOWD TO +N IN LH ADDI TAC,1(AC1) ;ADDRESS OF NEXT IOWD. CAMLE TAC,AC3 ;IN BOUNDS? JRST SGDOER ;NO. COMPLAIN ADDI TAC1,(AC1) ;YES. CHANGE RH OF IOWD EXCH TAC1,@TAC ;MAKE IT XWD +N,A+N-1 AFTER DATA BLOCK JUMPL TAC1,EXPLP1 ;CONTINUE IF NEXT THING IS AN IOWD PUSH PDP,TAC ;SAVE DATA LOCATION HRRZ TAC,@TAC ;TOP REAL LOCATION NEEDED TRO TAC,1777 ;MAKE IT NK-1 HLRZ TAC1,PROG ;PRESENT SIZ OF LOW SEG CAMG TAC,TAC1 ;IS THERE ENOUGH? JRST EXPCOR ;YES. CAME ITEM,JOB ;NO, IS TIS THE CURENT JOB? JRST SGDOER ;NO, GIVE ERRROR RETURN, MUST BE COMMAND DECODER ; DOING EXPAND AFTER USER HAS REDUECED CORE PUSHJ PDP,GETCOR ;YES. GET IT EXPCOR: POP PDP,TAC1 MOVEI AC1,@TAC1 ;TOP DATA LOC HRLI AC1,1(AC1) ;SET TO ZERO TO TOP OF CORE HRRI AC1,2(AC1) SETZM -1(AC1) HRLI TAC,PROG ;RELOCATE TOP LOC OF JOB BLT AC1,@TAC ;ZAP, CORE IS 0 FROM HERE ... HRROI TAC,@TAC1 ;FORM DATA POINTER EXPLP2: HRRZ AC1,(TAC) ;TO DATA POINTER ADDI AC1,(PROG) ;RELOCATE HLRZ AC2,(TAC) ;WORD COUNT SUBI TAC1,1(AC2) ;POINT TAC1 TO PREVIOUS IOWD SETZM (TAC) ;ZERO THIS IOWD SOSA TAC ;POINT TO DATA EXPLP3: SOS AC1 CAIGE AC1,JOBSDD(PROG) ;DON'T STORE DATA BELOW JOBSDD SOSA TAC POP TAC,(AC1) ;MOVE A DATA WORD SETZM 1(TAC) ;ZERO WHERE IT CAME FROM SOJG AC2,EXPLP3 ;LOOP IF MORE DATA CAMLE TAC1,[XWD PROG,JOBSV] ;THROUGH? JRST EXPLP2 ;NO, DO NEXT BLOCK EXCH AC2,JOBSDD(PROG) ;YES, ZERO JOBSDD MOVEM AC2,JOBDDT(JDAT) ;SET USER DDT STR ADR JRST SGDO2 ;AND SETUP USRDDT IN MONITOR PROTECTED ; FROM THIS USER ;THIS ROUTINE WILL DELETE ALL DATA FROM A COMPRESSED FILE ;WHICH IS BELOW JOBSOD (PROBABLY WRITTEN BY TENDUMP) TOOLOW: HLRE AC2,@TAC ;WORDCOUNT OF OFFENDING IOWD SUB AC1,AC2 ;ADDRESS+N CAIG AC1,JOBSDD ;IS ANY DATA IN IT LEGAL? AOJA TAC,NXIOWD ;NO, TEST NEXT IOWD SUBI AC1,JOBSDD ;YES, NUMBER OF WORDS TO KEEP MOVNS AC2 ;TOTAL NUMBER OF WORDS SUB AC2,AC1 ;NUMBER OF WORDS TO DROP HRLS AC2 ;INTO BOTH HALVES ADD AC2,@TAC ;NEW IOWD FOR ONLY GOOD DATA ADDI TAC,(AC2) ;POINT TAC TO LAST BAD DATA LOC MOVEM AC2,@TAC ;STORE UPDATED IOWD OVER IT JRST IOWBLT ;GO BLT OVER BAD DATA NXIOWD: SUB TAC,AC2 ;POINT TAC TO NEXT IOWD HRRZ AC1,@TAC ;GET ADDRESS CAIGE AC1,JOBSD1 ;LEGAL? AOJA AC1,TOOLOW ;NO, AT LEAST PART OF THE DATA IS LOW IOWBLT: MOVSI TAC,@TAC ;YES, KEEP THE ENTIRE IOWD DATA HRRI TAC1,JOBSV(PROG) ;TAC1 IS A BLT POINTER SUBI TAC,JOBSV ;RH OF TAC IS AMOUNT BEING DELETED SUBI AC3,(TAC) ;AC3 POINTS TO TOP OF DATA READ IN-(N) BLT TAC1,@AC3 ;MOVE ONLY GOOD DATA DOWN JRST EXPND1 ;GO EXPAND THE GOOD DATA SGDO1: MOVEI TAC,JOBDDT(PROG) ;MOVE EVERYTHING DOWN )MUST BE NON-COMPRESSED DSK FILE HRLI TAC,JOBSVD(TAC) ;OR CONVERT SAVE FILE SKIPGE JOBSV(JDAT) ;IS THIS CONVERT FILE(FIRST WORD IS IOWD)? HRLI TAC,JOBSDP(TAC) ;YES, ALSO SKIP OVER IOWD SUBI AC3,JOBSVD BLT TAC,@AC3 SGDO2: AOSA (PDP) ;SET FOR OK RETURN SGDOER: POP PDP,TAC SETZM JOBHCU(JDAT) ;CLEAR LH AND SET HIGHEST USER CHAN, IN ; USE TO 0(WHERE IT SHOULD BE ANYWAY) POPJ PDP, ;ERROR RETURN OR OK RETURN ;ROUTINE TO CHECK USER SUPPLIED CORE ARG AND CHECK TO SEE IF 0 ;OR GREATER THAN OR EQUAL TO IOWD USED TO SAVE OR GET FILE ;CALL: HLRE TAC1,-NO. OF WORDS IN FILE ; PUSHJ PDP,CKIOWD ; RETURN WITH LARGER OF 2 POSITIVE NOS. IN TAC(1777 ORED IN) ; DO NOT RETURN IF CORE ARG SUPLLIED BY USER IS TOO SMALL ;CALLED FROM SAVE AND GET EXTERN JOBSVM CKIOWD: MOVEI TAC,JOBSVM ;FIRST LOC-1 READ OR WRITTEN IN USER AREA HRRM TAC,SGALEN(PROG) ;RESTORE RH TO JOBSAV AFTER LOOKUP SUB TAC,TAC1 ;HIGHEST LOC=FIRST LOC-1+LENGTH OF FILE ; FALL INOT CHSARG ;ROUTINE TO CHECK USER SUPPLIED CORE ARG AND CHECK IF 0 ;OR GREATER THAN OR EQUAL TO CORE ARG FOR PREVIOUS SAVE ;CALL: HRRZ TAC,JOBCOR(JDAT) ;WRITTEN WHEN FILE SAVED ; PUSHJ PDP,CKSARG ; RETURN WITH LARGER OF 2 IN AC TAC, ONLY IF USER ARG NOT TOO SMALL ;CALLED ONLY FROM GET AFTER JOB DATA AREA LOADED FROM FILE(JOBCOR) OR HIGH SEG INTERN NROOM1 ;CALLED FROM SEGCON CKSARG: IORI TAC,1777 ;MAKE SURE 1K-1 CAMG TAC,SGANEW(PROG) ;IS USER SUPPLIED CORE ARG BIGGER? SKIPA TAC,SGANEW(PROG) ;YES, RETURN IT SKIPN SGANEW(PROG) ;NO, DID USER SUPPLY ONE POPJ PDP, ;NO, RETURN LARGER OF TWO ;ROUTINE TO PRINTE #K OF CORE NEEDED ;CALL: MOVE TAC,HIGHEST REL. USER ADR. ; PUSHJ PDP, NROOM1 ; NEVER RETURN NROOM1: PUSH PDP,TAC ;YES, ERROR, USER'S SUPPLIED CORE ARG TOO SMALL NOROOM: MOVEI TAC,NECERR ;ERROR CODE IN CASE THIS IS RUN UUO(NOT ENOUGH CORE) PUSHJ PDP,SGRELE ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO ; OR FIND TTY AND PRINT ?CRLF HRRZ TAC,(PDP) ;GET AMOUNT OF CORE REQUESTED LSH TAC,-12 ;CONVERT TO NO. OF 1K BLOCKS-1 PUSHJ PDP,DECP1 ;ADD 1 TO TAC AND PRINT DECIMAL JSP TAC,PHOLD ;START TTY ADN STOP JOB ASCIZ /K OF CORE NEEDED/ ;ROUTINE TO ASSIGN CORE FOR LOW AND HIGH SEG ;CALL: MOVE PROG,LOW SEG RELOCATION ; HRR TAC,HIGHEST LOC DESIRED ; PUSHJ PDP,GETCORE ; RETURN ONLY IF ASSIGNED INTERN GETCOR GETCOR: HRRZM TAC,SGACOR(PROG) ;SOTRE CORE ARG FOR CORE UUO IN USER AC PUSH PDP,TAC ;SAVE IN CASE OF ERROR CALLI SGACOR,11 ;DO CORE UUO JRST NOROOM ;NOT AVAILABLE, PRINT ERROR AND AMOUNT TRYING FOR JRST TPOPJ ;OK, REMOVE TAC FROM PD LIST AND RETURN ;ROUTINE TO PRINT NOT A SAVE FILE IF WRONG FORMAT FILE DETECTED INTERN GETERR GETERR: MOVEI TAC,NSFERR ;ERROR CODE IN CASE THIS IS RUN UUO(NOT SAVE FILE) PUSHJ PDP,SGRELE ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO ; OR FIND TTY AND PRINT ?CRLF JSP TAC,PHOLD ;START TTY AND STOP JOB ASCIZ /NOT A SAVE FILE/ ;ROUTINE TO PRINT FILE NOT FOUND ORNEEDS 2 RELOC REG INTERN NOFILE ;CALLED FROM SEGCON NOFILE: MOVEI TAC,FNFERR ;ERROR CODE IN CASE THIS IS RUN UUO(FILE NOT FOUND ; CHANGE ERROR CODE TO DISK ERROR CODE IF DEV IS DSK PUSHJ PDP,SGRELL ;RETURN DISK LOOKUP OR ENTER ERROR CODE IF DSK ; RELEASE DEVICE AND ERROR RETURN TO USER IF HE WANTED ; OR FIND TTY AND PRINT ?CRLF MOVE TAC1,SGANAM(PROG) ;PRINT FILE NAME PUSHJ PDP,PRNAME PUSHJ PDP,PRPER ;PRINT PERIOD HLLZ TAC1,SGAEXT(PROG) ;PRINT EXTENSION PUSHJ PDP,PRNAME JSP TAC,PHOLD ;START TTY AND STOP JOB ASCIZ / NOT FOUND/ ;ROUTINE TO RELEASE DEVICE ON AN ERROR AND CHECK TO SEE ;IF THIS IS A MONITOR COMMAND OR USER UUO ;IF USER UUO, GIVE ERROR RETURN TO USER UNLESS THERE IS A HALT ;IN LH OF EROR RETURN WORD, IN WHICH CASE FIND TTY, PRINT ?CRLF ;AND RETURN TO CALLER SO CAN ADD MORE INFO TO ERROR MESSAGE AND STOP JOB ;CALL: MOVEI TAC,ERROR CODE(DEFINED IN S.MAC) ; PUSHJ PDP,SGRELE ;DO NOT RETURN TO CALLER IF USER WANTS ERROR RETURN ON RUN AND GETSEG UUOS EXTERN JOBPD1,JOBPD3,USRJDA SGRELL: ;LOOKUP OR ENTER FAILURE IFN FTDISK,< MOVE TAC1,DEVMOD(DEVDAT) ;IS THIS DEVICE A DISK? TLNE TAC1,DVDSK HRRZ TAC,SGAEXT(PROG) ;YES, RETURN DISK SERVICE ERROR CODE > SGRELE: MOVE TAC1,JOBPD1(JDAT) ;GET FIRST PC ON PD LIST TLNN TAC1,USRMOD ;IS IT IN USER MODE(IE USER UUO)? JRST SGRLE1 ;NO. MUST BE MONITOR COMMAND OR CALLED OVERLAYED ; RELEASE DEVICE, FIND TTY, AND RETURN TO CALLED PUSH PDP,TAC ;SAVE ERROR CORE HRR UUO,TAC1 ;ADDRESS OF RETURN AFTER RUN OF GETSEG UUO PUSHJ PDP,GETWDU ;GET ERROR RETURN WORD FROM RUN OR GETSEG UUO HLRZ TAC1,TAC ;GET OP CODE POP PDP,TAC ;RESTORE ERROR CODE CAIN TAC1,(HALT) ;IS LH HALT? JRST SGRLE1 ;YES, RELEASE DEVICE,FIND TTY, AND RETURN TO CALLER HRR UUO,JOBPD3(JDAT) ;NO, AC NUMBER OF RUN OR GETSEG UUO PUSHJ PDP,STOTAC ;STORE ERROR NUMBER IN USER AC SKIPE USRJDA+0 ;DO NOT RELEASE CHANNEL 0 IF NOT INITED YET ; UUO HANDLER DOES NOT ALLOW THIS FROM EXEC MODE RELEAS 0, ;RELEASE DEVICE(IF INITED) PUSH PDP,JOBPD1(JDAT) ;PUT RETURN ON END OF PDLIST JRST USRXIT ;AND RETURN TO USER TO HANDLE ERROR SGRLE1: PUSHJ PDP,SGREL ;RELEASE DEVICE AND FIND TTY JSP TAC,CONMES ;PRINT ?CRLF AND RETURN TO CALLER ; WHO WILL PRINT REST OF ERROR MESSAGE AND STOP JOB ASCIZ /? / COMEND: END ;END OF COMCON