Fixed some typos and added COPY and DTBOOT.
[retro-software/dec/tops10/v4.5.git] / src / comcon.mac
1 TITLE COMCON - COMMAND DECODER AND SAVEGET ROUTINES - V433\r
2 SUBTTL /RCC 03 JUN 69\r
3 XP VCOMCN,433\r
4 \r
5                                 ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB\r
6 \r
7         ENTRY COMCON    ;ALWAYS LOAD COMCON IF LIBRARY SEARCH\r
8 COMCON:\r
9 \r
10 ;CALLED FROM CLOCK ROUTINE WHEN 'COMCNT' IS GREATER THAN 0\r
11 ;AS SET BY TTY SERVICE ROUTINE\r
12 ;ALL AC'S HAVE BEEN SAVED BY CLOCK CHANNEL\r
13 ;THE COMMAND DECODER CALLS TTYCOM WHICH SCANS FOR TTY WHICH TYPED\r
14 ;THE COMMAND AND THEN DISPATCHES(PUSHJ) TO APPROPRIATE\r
15 ;COMMAND SETUP ROUTINE OF THE SAME NAME WITH AC'S SET AS:\r
16 ;ITEM = JOB NUMBER\r
17 ;TAC = BYTE POINTER TO COMMAND STRING(SPACE OR CR AFTER COMMAND NAME)\r
18 ;DAT = BYTE POINTER TO LAST OUTPUT CHARACTER\r
19 ;DEVDAT = ADDRESS OF DEVICE DATA BLOCK TYPING COMMAND\r
20 ;JDAT = ADDRESS OF JOB AREA, = 0 IF NO JOB AREA\r
21 ;PROG = ADDRESS OF PROGRAM AREA, 0 MEANS NOT IN CORE OR NO CORE\r
22 ;IOS IS SET TO 0, USED FOR ADDRESS OF SUBSEQUENT CALLS\r
23 ;DEVDAT IS ALSO PUSHED ON END OF PO LIST SO IT MAY BE DESTROYED\r
24 ;UPON RETURN FROM COMMAND SETUP ROUTINE, A CR-LF IS ADDED TO\r
25 ;MESSAGE AND TTY IS STARTED ON TTYP SPECIFIED BY -1(PDP)\r
26 ;SEVERAL COMMAND FLAGS ARE CHECKED BEFORE DISPATCHING TO\r
27 ;COMMAND SETUP ROUTINES TO SEE IF COMMAND IS LEGAL AT THIS TIME\r
28 ;SEVERAL MORE FLAGS ARE CHECKED UPON RETURN FROM COMMAND SETUP\r
29 ;ROUTINES(UNLESS AN ERROR HAS OCCURRED) FOR STANDARD\r
30 ;COMMAND RESPONSE\r
31 ;IF AN ERROR OCCURS, THE JOB NO.(ITEM) SHOULD BE 0 ON RETURN\r
32 ;SO THAT JOB WILL NOT BE INITIALIZED IF FIRST COMMAND.\r
33 ;ERRMES ROUTINE WILL SET ITEM TO 0\r
34 \r
35 ;SINCE THE COMMAND DECODER IS CALLED FROM THE CLOCK ROUTINE\r
36 ;COMMAND SETUP ROUTINE MUST RUN TO COMPLETION QUICKLY\r
37 ;IF A COMMAND FUNCTION CANNOT DO THIS, IT MUST JUST SET\r
38 ;THE JOB TO RUNABLE STATUS AND RETURN IMMEDIATELY\r
39 ;OR DELAY THE COMMAND FOR LATER EXECUTION\r
40 \fINTERNAL COMMAND\r
41 INTERNAL FTLOGIN,FTSWAP,FTTIME\r
42 EXTERNAL COMCNT,TTYCOM,JBTSTS,JOBMAX,JBTDAT,JBTADR,JOBHCU\r
43 EXTERNAL CONFIG,HIGHJB\r
44 EXTERNAL TTYSTR,TTYUSR,TTYATT\r
45 EXTERNAL TTYTAB,PUNIT,TTYATI\r
46 EXTERNAL ADRERR,ANYACT,ASSASG,CORE0,DAMESS,DEVLG,DEVPHY,DEVSRC\r
47 EXTERNAL DLYCOM,ERNAM,ESTOP,GETWD1,GETWDU,KSTOP,CORE1,MONJOB,DECP1\r
48 EXTERNAL MONSTR,MSTART,OCTPNT,PHOLD,PRNAME,RADX10,RELEA5\r
49 EXTERNAL RELEA6,RESET,SETRUN,STOP1\r
50 EXTERNAL STOTAC,UPTIME,USRXIT,USTART,UUOERR\r
51 \r
52 T=BUFPNT        ;TEMPORARY AC'S\r
53 T1=BUFWRD\r
54 T2=UUO\r
55 T3=AC1\r
56 T4=AC2\r
57 COMMAND:PUSHJ PDP,TTYCOM        ;SETUP DEVDAT,DAT,TAC,AND ITEM\r
58                                 ; FOR ANY TTY WHICH HAS TYPED A COMMAND\r
59 COM0:   POPJ PDP,               ;NONE FOUND\r
60         PUSH PDP,DEVDAT         ;SAVE TTY DEVICE DATA BLOCK ADDRESS\r
61         PUSHJ PDP,CTEXT         ;SCAN COMMAND NAME, RETURN IT IN TAC1\r
62         MOVE T,TAC1             ;COPY COMMAND.\r
63         MOVNI T1,1              ;SET MASK ALL ONES\r
64         LSH T1,-6               ;CLEAR OUT ONE MORE CHAR.\r
65         LSH T,6                 ;SHIFT 1 COMMAND CHAR OFF\r
66         JUMPN T,.-2             ;IF NOT END OF COMMAND. GO AROUND\r
67         MOVEI T4,0              ;CLEAR FLAG REGISTER\r
68         MOVSI T,-DISPL          ;SEARCH COMMAND TABLE FOR MATCH\r
69 COMLP:  MOVE T2,COMTAB(T)       ;GET NEXT ENTRY FROM COMMAND TABLE\r
70         TDZ T2,T1               ;MASK OUT CHAR 5\r
71         CAMN TAC1,COMTAB(T)     ;EXACT MATCH?\r
72         JRST COMFND             ;YES, THIS IS IT.\r
73         CAME TAC1,T2            ;MATCH?\r
74         JRST COMNEQ             ;NOT EVEN GOOD MASK\r
75         TROE T4,1               ;MATCHES MASKED, IS THIS FIRST ONE\r
76         TROA T4,2               ;NO, SET 2ND OCCUR FLAG\r
77         MOVE T3,T               ;YES, COPY CURRENT INDEX\r
78 COMNEQ: AOBJN T,COMLP           ;NO, KEEP LOOKING\r
79         CAIN T4,1               ;DID ONE AND ONLY ONE COMMAND MATCH?\r
80         MOVE T,T3               ;YES, GET ITS INDEX\r
81 \fCOMFND:        MOVE TAC1,DISP(T)       ;GET DISPATCH TABLE ENTRY,\r
82         PUSH PDP,TAC1           ;SAVE RH(DISPATCH ADR,+BITS)\r
83         MOVE T,JBTSTS(ITEM)     ;JOB STATUS WORD FOR THIS JOB\r
84 IFN FTLOGIN,<\r
85                 TLNN T,JLOG             ;IS JOB LOGGED IN?\r
86                 TLNE TAC1,NOLOGIN       ;NO, CAN COMMAND PROCEED WITH NO LOGIN?\r
87                 JRST CHKNO              ;YES\r
88                 JSP TAC,COMER           ;NO, TYPE "LOGIN PLEASE"\r
89                 ASCIZ /LOGIN PLEASE\r
90 /\r
91 >\r
92 CHKNO:  JUMPN ITEM,CHKRUN       ;JOB NUMBER ALREADY ASSIGNED?\r
93         TLNE TAC1,NOJOBN        ;NO, DOES THIS COMMAND NEED A JOB NUMBER?\r
94         JRST COMGO              ;NO\r
95         MOVEI ITEM,1            ;YES, SCAN FOR ONE STARTING WITH 1\r
96 NUMLOP: MOVE T,JBTSTS(ITEM)     ;SCAN FOR FREE JOB NO.\r
97         TLNN T,JNA+CMWB         ;THIS NUMBER ASSIGNED?\r
98         JRST NEWJOB             ;NO, SO USE THIS NUMBER\r
99 \r
100         CAIGE ITEM,JOBMAX       ;YES, IS THE MAX. JOB NO.?\r
101         AOJA ITEM,NUMLOP        ;NO, KEEP LOOKING\r
102         JSP TAC,COMER           ;YES, NONE LEFT, PRINT "JOB CAPACITY EXCEEDED"\r
103         ASCIZ /JOB CAPACITY EXCEEDED\r
104 /\r
105 \r
106                                 ; EVEN THROUGH THIS IS A NEW JOB NUMBER\r
107                                 ; IT MAY HAVE CORE ASSIGNED NOW BECAUSE IT WAS DELAYED\r
108                                 ; UNTIL IT COULD BE SWAPPED IN(LOGIN WITH CORE FULL)\r
109 \r
110 NEWJOB: MOVEI T1,ASSCON         ;SET ASSIGNED BY CONSOLE BIT FOR TTY\r
111         IORM T1,DEVMOD(DEVDAT)  ;SO OTHER JOBS CAN NOT USE\r
112         SETZM DEVLOG(DEVDAT)    ;SET LOGICAL NAME TO ZERO\r
113                                 ; "TTY" IS PUBLIC LOGICAL NAME\r
114 IFN FTTIME,<\r
115         SETZM RTIME(ITEM)       ;CLEAR INCREMENTAL JOB RUNNING TIME\r
116         SETZM TTIME(ITEM)       ;CLEAR TOTAL JOB RUNNING TIME\r
117 >\r
118 IFN FTKCT,<\r
119         EXTERN JBTKCT\r
120         SETZM JBTKCT(ITEM)      ;CLEAR CORE-RUNNING TIME CORE\r
121 >\r
122         CAMLE ITEM,HIGHJB       ;HIGHEST JOB NUMBER ASSIGNED?\r
123         MOVEM ITEM,HIGHJB       ;YES,SAVE IT FOR SCHEDULER SCAN OF JOBS\r
124 \fCHKRUN:        TLNE    T,RUN           ;RUN BIT ON IN JOB STATUS?\r
125         TLNN    TAC1,NORUN      ;YES, DOES THIS COMMAND REQUIRE A JOB?\r
126         JRST    CHKACT          ;NO\r
127         JSP     TAC,COMER       ;YES.\r
128         ASCIZ   /PLEASE TYPE ^C FIRST\r
129 /\r
130 \r
131 CHKACT:\r
132 \r
133 IFN PROG-JDAT,<\r
134         MOVE JDAT,JBTDAT(ITEM)  ;ADDRESS OF JOB DATA AREA\r
135 >\r
136         MOVE PROG,JBTADR(ITEM)  ;XWD PROTECTION,RELOCATION\r
137 IFN FTSWAP,<\r
138         TLNE TAC1,INCOR!NOTRAN  ;MUST JUST NOT BE SWAPPING OR\r
139                                 ; IF JOB HAS CORE ASSIGNED, MUST IT BE\r
140                                 ; IN PHYSICAL CORE (RATHER THAN DISK OR ON ITS WAY)\r
141         TLNN T,SWP              ;YES, IS JOB ON DISK OR ON ITS WAY?\r
142         JRST CHKCO2             ;NO\r
143         TLNN TAC1,INCOR         ;YES, MUST JOB BE IN CORE?\r
144         JUMPE PROG,CHKCO2       ;NO, IS A SWAP FOR THIS JOB IN PROGRESS?\r
145                                 ; NO, SO COMMAND MUST BE DELAYED\r
146                                 ; (EITHER BECAUSE SWAP IN PROGRESS OR\r
147                                 ; JOB ON DISK AND MUST BE IN PHY CORE)\r
148         HRRI TAC1,DLYCM         ;ASSUME JOB MUST BE IN PHY CORE\r
149                                 ; SO SET TO SWAP JOB IN\r
150         TLNN TAC1,INCOR         ;IS THIS TRUE?\r
151 CHKDLY: HRRI TAC1,DLYCM1        ;NO, JUST DELAY COMMAND UNTIL SWAP OUT OR IN IS FINISHED\r
152         JRST COMDIS             ;AND DISPATCH TO DELAY COMMAND\r
153 >\r
154 CHKCO2: TLNE TAC1,NOACT         ;CAN COMMAND BE PERFORMED WITH ACTIVE DEVICES?\r
155         PUSHJ PDP,RUNCHK        ;NO, RETURN IF JOB STOPPED AND NO ACTIVE DEVICES\r
156 CHKCO1: TLNE TAC1,NOCORE        ;DOES THIS COMMAND NEED CORE?\r
157         JRST COMGO              ;NO, GO DISPATCH\r
158         JUMPN PROG,CHKXPN       ;YES, IS CORE IN MEMORY?\r
159         JSP TAC,COMER           ;NO, PRINT "NO CORE ASSIGNED"\r
160         ASCIZ /NO CORE ASSIGNED\r
161 /\r
162 \fCHKXPN:        TLNN TAC1,PLSXPN        ;DOES THIS COMMAND NEED CORE TO BE EXPANDED?\r
163         JRST COMGO              ;NO\r
164         HLRE IOS,JOBHCU(JDAT)   ;YES, IS CORE STILL COMPRESSED(SAVE DID NOT GO\r
165                                 ; TO COMPLETION)\r
166         AOJGE IOS,COMGO         ;LH=-2 DURING SAVE, WHEN CORE COMPRESSED\r
167                                 ;LH=-1 DURING SAVE OF HIGH SEG, OR GET OF LOW\r
168                                 ; OR HIGH SEG\r
169         PUSHJ PDP,EXPAND        ;YES, EXPAND CORE FIRST\r
170         JFCL                    ;IGNORE ADDRESS CHECK ERROR, WE TRIED\r
171 IFN FTSWAP,<\r
172         JRST CHKDLY             ;DELAY COMMAND BECAUSE COMMAND DECODER ACS ARE\r
173                                 ; ALL GONE, NEXT TIME JOBHCU WILL BE 0\r
174 >\r
175 \r
176 IFE FTSWAP,<\r
177         HRRI TAC1,DLYCM1                ;DELAY COMMAND TILL NEXT CLOCK TICK\r
178         JRST COMDIS\r
179 >\r
180 \r
181 COMER:  MOVSI TAC1,NOINCK\r
182         MOVEM TAC1,(PDP)\r
183         MOVEI TAC1,CERR         ;CALL ERROR MESSAGE ROUTINE\r
184 \r
185 COMGO:  MOVSI   IOS,CMWRQ\r
186         TLZN    T,CMWB          ;CLEAR CMWB; WAS JONB IN COMM WAIT\r
187         ANDCAM  IOS,(PDP)       ;NO, CLEAR REQUEU BIT IN DISP. FLAGS\r
188         MOVEM   T,JBTSTS(ITEM)\r
189 \r
190 \r
191 COMDIS: MOVEI IOS,0             ;CLEAR IOS FOR SETTING DISPATCH ADDRESSES\r
192         PUSHJ PDP,(TAC1)        ;DISPATCH TO COMMAND SETUP ROUTINE.\r
193 \f;RETURN FROM COMMAND SETUP ROUTINE\r
194 \r
195 COMRET: POP PDP,T1              ;RESTORE COMMAND FLAGS\r
196         POP PDP,DEVDAT          ;RESTORE TTY DDB ADDRESS.\r
197 IFN FTTTYSER,<\r
198         EXTERN  TITAKR,TISYNC\r
199         LDB     TEM,TITAKR(DEVDAT)      ;GET BREAK CHARACTER\r
200         PUSHJ   PDP,SKPBRK      ;SKIP TO BREAK CHAR\r
201         SOS     TISYNC(DEVDAT)  ;REDUCE LINE COUNT\r
202 >\r
203         MOVSI T,400000\r
204         LDB     TAC,PUNIT\r
205         ANDCAM  T,TTYTAB(TAC)   ;YES. TURN OFF SIGN BIT\r
206         SOS     COMCNT\r
207         JUMPN ITEM,COMRT1       ;DID AN ERROR OCCUR?\r
208         TLNN T1,NOJOBN          ;I.E., ITEM=0 AND NOJOBN=0?\r
209         MOVSI T1,NOINCK+ERRFLG+CMWRQ    ;YES, PRINT ERROR MESSAGE ONLY, AND\r
210                                         ;REQUEUE JOB IF NECESSARY.\r
211 \r
212 COMRT1: MOVE T,JBTSTS(ITEM)     ;JOB STATUS WORD\r
213         TLNN T1,NOINCK          ;SUPPRESS JOB INIT. CHECK?\r
214         TLOE T,JNA              ;NO, IS JOB INIT BIT ALREADY SET?\r
215         JRST PCRLF              ;YES.\r
216         MOVEM T,JBTSTS(ITEM)    ;NO, SO SET IT THIS COMMAND\r
217         PUSHJ PDP,TTYATI        ;ATTACH TTY TO JOB\r
218         JFCL                    ;INGORE IF CAN NOT(SHOULD NEVER HAPPEN)\r
219         PUSHJ PDP,INLMES        ;AND PRINT "JOB "\r
220         ASCIZ /JOB /\r
221         MOVE TAC,ITEM           ;PRINT JOB NUMBER\r
222         PUSHJ PDP,RADX10\r
223         PUSHJ PDP,PRSPC\r
224         MOVEI TAC,CONFIG        ;PRINT SYSTEM CONFIGURATION NAME\r
225         PUSHJ PDP,CONMES\r
226 IFN FTLOGIN, <\r
227         PUSHJ PDP,CRLF\r
228 >\r
229 IFE FTLOGIN, <\r
230         PUSHJ PDP,PRSPC\r
231         PUSHJ   PDP,DAYTM1\r
232 >\r
233 \fPCRLF: TLNE T1,ERRFLG          ;DID AN ERROR OCCUR?\r
234         PUSHJ PDP,PRQM          ;YES. APPEND ?\r
235         TLNN T1,NOCRLF          ;SUPRESS CRLF?\r
236         PUSHJ PDP,CRLF          ;NO\r
237         TLNN T1,NOPER           ;SUPRESS PRINTING PERIOD?\r
238         PUSHJ PDP,PRPER         ;NO\r
239         JUMPE ITEM,PCRLF1       ;JOB DOES NOT RUN IF  ERROR OR NO JOB NO. ASSIGNED\r
240         TLNE T1,TTYRNU          ;JOB TO RUN WHEN TTY FINISHED TYPING?\r
241                                 ; COMMAND RESPONSE (TTY TO USER MODE)?\r
242         PUSHJ PDP,TTYUSR        ;YES, CALL SCANNER ROUTINE\r
243         TLNE T1,TTYRNC          ;NO. JOB TO RUN AND REMAIN IN MONITOR MODE?\r
244         PUSHJ PDP,SETRUN        ;YES, CALL SCANNER ROUTINE\r
245 PCRLF1: TLNN T1,NOMESS          ;IS THERE A MESSAGE?\r
246         PUSHJ PDP,TTYSTR        ;YES. START TTY TYPING IT OUT\r
247 IFN     FTSWAP, <\r
248         EXTERN  PJOBN,REQUE\r
249         LDB     ITEM,PJOBN      ;GET JOB NUMBER FROM TTY DEVICE DATA BLOCK\r
250         JUMPE   ITEM,CPOPJ      \r
251         TLNE    T1,CMWRQ        ;REQUEUE JOB AFTER COMMAND WAIT OR ERROR?\r
252         JRST    REQUE           ;YES\r
253 >\r
254         POPJ PDP,\r
255 \r
256 IFN FTTTYSER,   <EXTERN SPCHEK,TITAKR,GETCHR,TPOPJ\r
257 \r
258 SKPBRK: PUSH    PDP,TAC\r
259 SKPBR2: PUSHJ   PDP,SPCHEK\r
260         JRST    SKPBR1\r
261         TLNE    TAC,BREAKB      ;IS THIS CHAR THE BREAK?\r
262         JRST    TPOPJ           ;YES, RESTORE TAC, RETURN\r
263 SKPBR1: PUSHJ   PDP,GETCHR      \r
264         JUMPN   TEM,SKPBR2      ;LOOK FURTHER FOR BREAK\r
265         JRST    TPOPJ           ;UNLESS NO MORE CHARS\r
266 >\r
267 \f;TABLE OF CONSOLE COMMANDS\r
268 \r
269 INTERNAL FTATTACH,FTTIME,FTTALK,FTEXAMINE,FTLOGIN,FTREASSIGN\r
270 INTERNAL FTFINISH,FTCCL\r
271 \r
272 ;BITS CHECKED BEFORE DISPATCHING TO COMMAND SETUP ROUTINE\r
273 \r
274 NOCORE=400000   ;NO CORE NEEDED FOR COMMAND\r
275 NOJOBN=200000   ;NO JOB NUMBER NEEDED FOR COMMAND\r
276 NOLOGIN=100000  ;JOB DOES NOT NEED TO BE ALREADY LOGGED IN.\r
277 NOACT=40000     ;COMMAND MUST BE DELAYED IF JOB HAS ACTIVE DEVICES.\r
278 NOTRAN=20000    ;COMMAND MUST BE DELAYED IF SWAPPED TRANSFER IN PROGRESS\r
279 NORUN=10000     ;AN EXPLICIT ^C MUST BE TYPED BY USER BEFORE COMMAND\r
280                 ; IS EXECUTED IF JOB IS RUNNING\r
281                 ; JOB MUST BE SWAPPED IN IF IT HAS LOGICAL CORE\r
282 INCOR=4000      ;USED ONLY BY COMMAND DISPATCH\r
283                 ; DOES NOT APPEAR IN COMMAND TABLE\r
284 INCORE=4000!NOTRAN      ;COMMAND MUST BE DELAYED IF JOB HAS LOGICAL CORE\r
285                 ; WHICH IS ON DISK OR ON ITS WAY IN OR OUT.\r
286                 ; JOB WILL BE SWAPPED IN (SEE DLYCOM)\r
287                 ; AND IS NOT SITTING QUIETLY IN CORE(IE NO SWAPPING TRANSFER)\r
288 PLSXPN=4        ;CORE MUST BE EXPANED IF STILL COMPRESSED BY SAVE NOT GOING\r
289                 ; TO COMPLETION(CONTROL C OR DEVICE OK?)\r
290                 ; MUST BE USED IN CONJUNCTION WITH COMMANDS WHICH\r
291                 ; NEED CORE AND NEED IT IN CORE\r
292 \r
293 ;BITS CHECKED AFTER RETURN FROM COMMAND SETUP ROUTINE\r
294 \r
295 CMWRQ=2000      ;REQUEUE JOB AFTER COMMAND WAIT\r
296 NODATE=1000     ;DON'T PRINT DATE DURING JOB INTERROGATION\r
297 NOINCK=400      ;NO CHECK FOR JOB INITIALIZATION (JNA=0)\r
298 NOCRLF=200      ;NO PRINTING OF CRLF\r
299 NOPER=100       ;NO PRINTING OF PERIOD\r
300 TTYRNU=40       ;SET TTY TO USER MODE AND START JOB\r
301                 ; WHEN COMMAND RESPONSE STOPS TYPING\r
302 TTYRNC=20       ;KEEP TTY IN COMMAND MODE AND START JOB\r
303                 ; WHEN COMMAND RESPONSE STOPS TYPING\r
304 NOMESS=10       ;NO COMMAND RESPONSE EVER, DO NOT CALL TTYSTR\r
305 \r
306                 ;4 TAKEN ABOVE BY 'PLSXPN' BIT\r
307 \r
308 \r
309 ERRFLG=1        ;COMMAND ERROR\r
310 \fDEFINE NAMES<\r
311         C START,START,NOPER!TTYRNU!INCORE!NOACT!NORUN\r
312         C HALT,STOP,NOCORE!NOJOBN!NOLOGIN!NOINCK!CMWRQ\r
313         C KJOB,KJOB,NOCORE!NOJOBN!NOINCK!NOLOGIN!NOACT!NORUN!NOPER!NOCRLF!NOMESS!NOTRAN\r
314         C <>,CBLANK,NOCORE!NOJOBN!NOLOGIN!NOINCK!NOCRLF\r
315         C R,RCOM,NOCORE!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN\r
316         C RUN,RUNCOM,NOCORE!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN\r
317         C CORE,CORE,NOCORE!NORUN!CMWRQ!INCORE!NOACT!NOTRAN\r
318         C GET,GET,NOCRLF!NOPER!TTYRNC!NOCORE!NOACT!NORUN!NOTRAN\r
319         C SAVE,SAVE,NOCRLF!NOPER!TTYRNC!INCORE!NOACT!NORUN!PLSXPN\r
320 IFN FT2REL,<\r
321         C SSAVE,SSAVE,NOCRLF!NOPER!TTYRNC!INCORE!NOACT!NORUN!PLSXPN\r
322 >\r
323         C CONTINUE,CONT,NOPER!TTYRNU!INCORE!NORUN\r
324 IFN FTEXAMINE,<\r
325         C D,DCOM,CMWRQ!INCORE\r
326         C E,ECOM,NOCRLF!CMWRQ!INCORE\r
327 >\r
328         C PJOB,PJOB,NOCORE\r
329         C ASSIGN,ASSIGN,NOCORE\r
330         C DEASSI,DEASSIGN,NOCORE!NOJOBN!NOINCK\r
331         C DDT,DDTGO,NOPER!TTYRNU!INCORE!NORUN!PLSXPN\r
332 IFN FTFINISH,<\r
333         C FINISH,CFINI,TTYRNC!NOACT!INCORE!NORUN\r
334 >\r
335         C REENTER,REENTER,TTYRNU!NOPER!INCORE!NORUN!PLSXPN\r
336         C CSTART,STARTC,TTYRNC!INCORE!NOACT!NORUN!PLSXPN\r
337         C CCONTINUE,CONTC,TTYRNC!INCORE!NORUN\r
338 IFN FTATTACH,<\r
339         C DETACH,DETACH,NOPER+NOCRLF+NOCORE!NOJOBN!NOINCK\r
340         C ATTACH,ATTACH,NOCORE!NOJOBN!NOLOGIN!NOINCK\r
341 >\r
342         C DAYTIME,DAYTIM,NOCORE!NOJOBN!NOLOGIN!NOINCK\r
343 IFN FTTIME,<\r
344         C TIME,RUNTIM,NOCORE!NOLOGIN!NOINCK\r
345 >\r
346         C RESOURCES,FREDEV,NOCORE!NOJOBN!NOLOGIN!NOINCK\r
347 IFN FTLOGIN,<\r
348         C SCHEDULE,SKEDUL,NOCORE!NOJOBN!NOLOGIN!NOINCK\r
349 >\r
350 IFN FTTALK,<\r
351         C TALK,TALK,NOCRLF+NOPER+NOCORE!NOJOBN!NOLOGIN!NOMESS!NOINCK\r
352 >\r
353 IFN FTLOGIN,<\r
354         C LOGIN,CLOGIN,NOCORE!NOLOGIN!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN\r
355 >\r
356 IFE FTLOGIN,<\r
357         C LOGIN,CPOPJ,NOCORE!NOACT!NORUN!NOTRAN\r
358 >\r
359 IFN FTREASSIGN,<\r
360         C REASSI,REASS,NOCORE!NOACT!INCORE!CMWRQ!NORUN\r
361 >\r
362         C HELP,HELP,NOCORE!NOLOGIN!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN\r
363         C SYSTAT,SYSTAT,NOCORE!NOLOGIN!NOACT!NORUN!NOCRLF!NOPER!TTYRNU!NOTRAN\r
364 IFN FTCCL,<\r
365         C COMPILE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
366         C CREATE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
367         C CREF,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
368         C DEBUG,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
369         C DELETE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
370         C DIRECT,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
371         C EDIT,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
372         C EXECUTE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
373         C LIST,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
374         C LOAD,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
375         C MAKE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
376         C RENAME,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
377         C TECO,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
378         C TYPE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
379         C CTEST,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
380 >\r
381 >\r
382 \f;GENERATE TABLE OF SIXBIT COMMAND NAMES\r
383 \r
384 DEFINE C(A,B,D) <\r
385         <SIXBIT /A/>\r
386 >\r
387 \r
388 COMTAB: NAMES\r
389         XWD NOCORE+NOJOBN+NOLOGIN+NOINCK,NOCOM\r
390 DISPL=.-COMTAB  ;LENGTH OF TABLE\r
391 \f;GENERATE THE DISPATCH TABLE PLUS SPECIAL BITS\r
392 \r
393 DEFINE C(A,B,D) <\r
394 Z       B       (D)\r
395 >\r
396 DISP:   NAMES\r
397 \f\r
398 ;CALLED FROM COMMAND DECODER WHICH IS CALLED FROM CLOCK ROUTINE\r
399 ;WITH FOLLOWING AC'S SET:\r
400 ;TAC= BYTE POINTER TO COMMAND STRING(SPACE OR CR AFTER COMMAND NAME)\r
401 ;ITEM = JOB NUMBER\r
402 ;DAT = BYTE POINTER TO LAST OUTPUT CHARACTER\r
403 ;DEVDAT = ADDRESS OF DEVICE DATA BLOCK INITIATING COMMAND\r
404 ;JDAT = ADDRESS OF JOB DATA AREA, = 0 IF NO JOB AREA\r
405 ;PROG=XWD PROTECTION,RELOCATION; 0 IF NO CORE\r
406 ;IOS=0\r
407 \r
408 ;UPON RETURN FROM COMMAND SETUP ROUTINE, A CR-LF IS ADDED IF\r
409 ;NEEDED AND TTY IS STARTED\r
410 \r
411 ;SINCE THE COMMAND DECODER IS CALLED FROM THE CLOCK ROUTINE\r
412 ;COMMAND SETUP ROUTINES MUST RUN TO COMPLETION QUICKLY\r
413 ;IF A COMMAND FUNCTION CANNOT DO THIS, IT MUST JUST SET\r
414 ;THE JOB TO A RUNABLE STATUS AND RETURN IMMEDIATELY\r
415 \r
416         EXTERN TTYFNU\r
417 \r
418 COR0:   JUMPE PROG,CPOPJ        ;RETURN IF JOB DOES NOT HAVE CORE\r
419         \r
420         JSP TAC1,MONJOB         ;SET TO RUN MONITOR JOB(PC IN EXEC MODE)\r
421                                 ; RETURN HERE AT UUO LEVEL(NO ACS SET UP)\r
422         MOVEI TAC1,ESTOP        ;PUT ERROR STOP ON END OF PDL\r
423         JSP TAC,MONSTR          ;START MONITOR JOB BY SETTING UP ACS AND\r
424 JOB1:   PUSHJ PDP,RESET         ;RELEASE ALL IO DEVICES ASSIGNED TO THIS JOB\r
425         PUSHJ PDP,TTYFNU        ;FIND TTY FOR THIS JOB(SETUP ITEM WITH JOB NO.)\r
426 IFN FTSWAP,<\r
427         EXTERN ZERSWP,NOCORQ\r
428         PUSHJ PDP,NOCORQ        ;PUT JOB IN NO CORE Q\r
429         PUSHJ PDP,ZERSWP        ;CLEAR SWAP SPACE (IF ANY) FOR LOW SEG\r
430                                 ; AND CLEAR SWP,SHF,IMGIN,IMGOUT FOR LOW SEG\r
431 >\r
432 IFN FT2REL,<\r
433         EXTERN KILHGH\r
434         PUSHJ PDP,KILHGH        ;HIGH SEG FOR THIS USER. RETURN CORE\r
435                                 ; REMOVE HIGH SEG FROM THIS USER LOGICAL ADDRESSING SPACE\r
436                                 ; IF NO OTHER USERS IN CORE ARE USING IT\r
437                                 ; RETURN DISKL SPACE IF NO LONGER SHARABLE HIGH SEG\r
438 >\r
439         MOVEI TAC,0             ;RETURN BOTH PHYSICAL AND LOGICAL CORE\r
440         SOS (PDP)               ;NEGATE SKIP RETURN WHICH CORE1 WILL DO\r
441         JRST CORE1              ;GO DO IT AND RETURN TO CALLER\r
442 \f; "PJOB" PRINT JOB NUMBER OF JOB TTY IS ATTACHED TO\r
443 \r
444 INTERNAL PJOB,DECLF\r
445 \r
446 PJOB:   MOVE TAC,ITEM           ;JOB NO.\r
447 DECLF:  PUSHJ PDP,RADX10        ;PRINT TAC AS DEC. THEN CRLF\r
448         JRST CRLF\r
449 \r
450 ; "KJOB" KILL ATTACHED JOB\r
451 \r
452 EXTERNAL JBTSTS,TTYKILM,CPOPJ\r
453 INTERNAL FTTIME,JOBKL\r
454 \r
455 KJOB:   JUMPE ITEM,JOBKB        ;WAS JOB INITIALIZED?\r
456 IFN     FTLOGIN,<\r
457         TLZN    T,JLOG+JACCT    ;TEST JACCT ALSO IN CASE COMMAND WAS DELAYED\r
458         JRST    KJOB2           ;IF JOB NOT LOGGED IN\r
459         TLO     T,JACCT         ;DISABLE ^C\r
460         MOVEM   T,JBTSTS(ITEM)\r
461 IFN     FTSWAP, <\r
462         PUSHJ   PDP,ALOGN1      ;ATTACH TTY\r
463 >\r
464         MOVSI   TAC,TTYRNU+NOMESS\r
465         XORM    TAC,-1(PDP)     ;SET TTYRNU AND CLEAR NOMESS FOR COMRET\r
466         MOVE    TAC,[SIXBIT /LOGOUT/]   ;NAME OF CUSP\r
467         JRST    ARCOM\r
468 >\r
469 KJOB2:\r
470 IFE FTSWAP+FTLOGIN,<\r
471         JUMPE PROG,JOBKA        ;YES. DOES JOB HAVE CORE IN MEMORY?\r
472 >\r
473         PUSHJ PDP,GETMIN        ;GET MINIMAL JOB AREA ON DISK OR CORE\r
474         JUMPE PROG,DLYCM1       ;DELAY COMMAND IF CORE ASSIGNED ON DISK\r
475         JSP TAC1,MONJOB         ;YES, SCHEDULE MONITOR JOB(PC IN EXEC MODE)\r
476                                 ;RETURN HERE AT UUO LEVEL WHEN SCHEDULED\r
477 \fJOBKL: MOVEI TAC1,ESTOP        ;PUT ESTOP ON END OF PDL\r
478         JSP TAC,MONSTR          ;GO SETUP ACS AND PD LIST\r
479         PUSHJ PDP,JOB1          ;FLUSH CORE AFTER RELEASING DEVICES\r
480 JOBKA:\r
481 IFN FTTIME,<\r
482 IFE     FTLOGIN, <\r
483         PUSHJ PDP,PRTTIM        ;PRINT JUST TOTAL RUN TIME\r
484         PUSHJ   PDP,TTYSTR      ;START TTY\r
485 >>\r
486         PUSHJ PDP,DEASTY        ;DEASSIGN ALL BY TTY\r
487         PUSHJ PDP,TTYKIL        ;RETURN TTY TO VIRGIN STATE\r
488         JRST KSTOP              ;CLEAR JOB STATUS WORD AND STOP JOB\r
489 \r
490 \r
491 ;ERROR IN COMMAND\r
492 \r
493 \r
494 CERR:   JRST ERRMES\r
495 \r
496 JOBKB:  SETZM   -1(PDP)         ;CLEAR NOJOBN SO COMRET WILL PRINT ERROR MSG.\r
497         JRST    ATT4            ;"NOT A JOB"\r
498 \f; "START L" OR "START" - START AT LOC, L OR STARTING ADDRESS\r
499 INTERNAL FT2REL\r
500 EXTERNAL JOBSA\r
501 \r
502 START:                          ;SAME AS CSTART, DIFF BY COMTAB BITS\r
503                         ; WHICH PUT TTY IN MONITOR OR USER MODE\r
504 \r
505 ; "CSTART L" OR   "CSTART" - START AT LOC. L(TTY IN COMMAND MODE)\r
506 \r
507 STARTC: PUSHJ PDP,OCTIN         ;CONVERT POSSIBLE OCTAL NO ARG.\r
508 IFE FT2REL,<\r
509         SKIPA TAC1,JOBSA(JDAT)  ;NO START ADR. SPECIFIED RETURN\r
510 >\r
511 IFN FT2REL,<\r
512         JRST SNOARG     ;NO ARG SPECIFIED RETURN\r
513 >\r
514         JRST COMERA             ;ILLEGAL CHARACTER\r
515 IFN FT2REL,<\r
516         EXTERN CHKMED\r
517         PUSHJ PDP,CHKMED        ;CHECK TO SEE IF HIGH SEG WHICH IS SHARABLE\r
518                                 ; IF YES, TURN ON USER MODE WRITE PROTECT\r
519                                 ; FOR THIS USER, AND SET MEDDLE BIT SO HE CANNOT\r
520                                 ; TURN UWP OFF.>\r
521         JRST CHKSTR             ;START JOB WITH PC IN USER MODE,\r
522                                 ; IF START ADR IS NON-ZERO\r
523 IFN FT2REL,<\r
524 SNOARG: SKIPA TAC1,JOBSA(JDAT)  ;NO. ARG SPECIFIED, USE START ADR SUPPLIED\r
525                         ; BY PROGRAM END STATEMENT AND STORED BY LINKING LOADER\r
526                         ; SKIP INTO REENTER, START WITH PC IN USER MODE\r
527 >\r
528 \f;"REENTER"  - REENTER USER PROGRAM\r
529 \r
530 EXTERNAL JOBREN\r
531 \r
532 REENTER:MOVE TAC1,JOBREN(JDAT)  ;GET REENTER ADDRESS FORM JOB DATA AREA\r
533         JRST CHKSTR             ;START JOB WITH PC IN USER MODE\r
534                                 ; IF  START ADR IS NON-ZERO\r
535 \r
536 ; "DDT" - START EXECUTION AT DDT IN USER AREA\r
537 \r
538         EXTERN JOBDDT\r
539 \r
540 DDTGO:  MOVE TAC1,JOBDDT(JDAT)  ;DDT STARTING ADR. IN JOB DATA AREA\r
541                         ; FALL INTO CHSTR\r
542 \r
543 ;ROUTINE TO CHECK TO SEE IF STARTING ADDRESS IS NON-ZERO, AND START USER IF OK\r
544 \r
545 CHKSTR: JUMPN TAC1,USTART       ;IS IT NON-ZERO?, IS YES\r
546                                 ; STORE OLD PC IN JOBOPC IN JOB DATA AREA\r
547                                 ; THEN START WITH PC IN USER MODE\r
548         JSP TAC,ERRMES          ;NO, PRINT "NO START ADR"\r
549         ASCII /NO START ADR\r
550 /\r
551 \f\r
552 ; "STOP" OR "<CONTROL>C"\r
553 ;SCANNER ROUTINES DUMMY UP STOP WHEN CONTROL C TYPED IN\r
554 ;STOP MUST BE DELAYED IF THIS JOB IS SYSTEM TAPE USER\r
555 ;AND SYSTEM TAPE IS ACTIVE, OTHERWISE, THE JOB WILL NOT BE\r
556 ;STOPPED WHEN DONE USING THE SYSTEM TAPE.\r
557 \r
558 INTERNAL FTDISK\r
559 EXTERNAL STUSER,JOB,PJBSTS,IOWQ,JOBDAC\r
560 \r
561 STOP:   JUMPE   ITEM,STOP8      \r
562         CAMN ITEM,STUSER        ;IS THIS SYSTEM TAPE USER?\r
563         JRST CFINS              ;YES, DO FINISH SYS COMMAND\r
564 IFN FTDISK,<\r
565         \r
566         PUSHJ PDP,STOPCK        ;CAN THE JOB STOP?\r
567         JRST DLYCM1             ;NO. DELAY IT.\r
568 >\r
569         PUSHJ PDP,STOP1         ;STOP JOB\r
570 STOP8:  IFE FTTTYSER,<\r
571         JSP TAC,CONMES          ;PRINT "^C CRLF CRFL PERIOS"\r
572         ASCIZ /^C\r
573 /\r
574 >\r
575 IFN FTTTYSER,<  POPJ    PDP,0>\r
576 \r
577 ; "CONTC" - CONTINUE EXECUTION(TTY REMAINS IN COMMAND MODE)\r
578 \r
579 CONTC:                          ;SAME AS CONT\r
580 \r
581 ; "CONT" - CONTINUE EXECUTION FROM WHERE LEFT OFF\r
582 EXTERNAL JBTSTS\r
583 \r
584 CONT:   MOVSI TAC1,JERR\r
585         TDNN TAC1, JBTSTS(ITEM) ;IS JOB ERROR BIT SET?\r
586         POPJ PDP,               ;COMMAND DECODER WILL DO REST\r
587         JSP TAC,ERRMES          ;YES, PRINT CANT CONTINUE\r
588 \r
589         ASCIZ /CAN'T CONTINUE\r
590 /\r
591 \f; "CORE  #" - ASSIGNS #*1024 WORDS OF CORE TO JOB\r
592 ; "CORE" WITH NO ARG. WILL PRINT NO OF FREE BLOCKS LEFT\r
593 ;       WITHOUT AFFECTING CURRENT ASSIGNMENT OF CORE\r
594 ;       JOB NOT IN MIDDLE OF SWAPPING\r
595 ;       EITHER ON DISK OR CORE OR NEITHER PLACE\r
596 \r
597 EXTERNAL PCORSZ\r
598 \r
599 CORE:   PUSHJ PDP, DECIN        ;GET NO. OF 1K BLOCKS\r
600         JRST COR3               ;NO ARG. SPECIFIED, JUST TYPE FREE BLOCK LEFT\r
601         JRST COMERA             ;ILLEGAL DECIMAL CHARACTER RETURN\r
602 IFE FTSWAP,<\r
603         JUMPE TAC1,COR0         ;RELEASE DEVICES IF USER ASKING FOR 0 CORE\r
604 >\r
605 IFN FTSWAP,<\r
606         JUMPE TAC1,COR1         ;ASSIGN JUST MINIMAL CORE AND RELEASE DEVICES\r
607                                 ; IF ASKING FOR 0 CORE\r
608 >\r
609         LSH TAC1,12             ;CONVERT 1K BLOCKS TO WORDS\r
610         MOVEI TAC,-1(TAC1)      ;HIGHEST RELATIVE ADDRESS=LENGTH-1 OF LOW SEG\r
611         PUSHJ PDP,CORE0         ;TRY TO ASSIGN CORE\r
612         JRST COR2               ;CORE NOT AVAILABLE. GO PRINT MESSAGE\r
613         POPJ PDP,               ;OK RETURN, CORE ASSIGNED ON DISK OF MEMORY\r
614 IFN FTSWAP,<\r
615 ;USER ASKING FOR 0K\r
616 COR1:   JUMPN PROG,COR0         ;GO RELEASE ALL DEVICES IF HE HAS CORE IN MEMORY YET\r
617         PUSHJ PDP,GETMIN        ;NO, CORE ON DISK OR HAS NONE, ASSIGN MINIMAL\r
618                                 ; AREA(FLUSH HIGH SEG TOO) IN CORE OR DISK\r
619         JRST DLYCM              ;AND DELAY COMMAND TILL CORE IS IN MEMORY\r
620                                 ; DLYCM WILL SWAP IT IN.\r
621 >\r
622 \fCOR2:  IFN FTTTYSERM,<\r
623         MOVE DEVDAT,-2(PDP)     ;RESTORE TTY DDB ADR\r
624 >\r
625         PUSHJ PDP,INLMES        ;PRINT ? FOR PATCH\r
626         ASCIZ /?\r
627 /\r
628 COR3:   PUSHJ PDP,PRTSEG        ;PRINT SIZE OF LOW SEG\r
629 IFN FT2REL,<\r
630         EXTERN PRTHGH\r
631         PUSHJ PDP,PRTHGH        ;PRINT SIZE OF HIGH SEG (+0 IF NONE)\r
632                                 ; NOTHING IF NOT 2 REG. MACHINE OR SOFTWARE\r
633 >\r
634         PUSHJ PDP,INLMES\r
635         ASCIZ "/"\r
636 \r
637 IFE FTSWAP,<\r
638         EXTERN CORTAL\r
639         MOVE TAC,CORTAL         ;NO. OF FREE 1K BLOCKS\r
640 >\r
641 IFN FTSWAP,<\r
642         EXTERNAL CORMAX\r
643         MOVE TAC,CORMAX         ;PRINT MAX. NO. OF BLOCKS IN PHYSICAL CORE\r
644         LSH TAC,-12             ;AVAILABLE TO A SINGLE USER(AS SET\r
645                                 ; BY BUILD AND/OR ONCE)\r
646 >\r
647         PUSHJ PDP,RADX10        ;PRINT NO. OF 1K BLOCKS AVAILABLE\r
648 IFE FTSWAP,<\r
649         JSP TAC,CONMAS\r
650         ASCIZ /K CORE\r
651 /\r
652 >\r
653 IFN FTSWAP,<\r
654         EXTERN VIRTAL\r
655         PUSHJ PDP,INLMES\r
656         ASCIZ /K CORE\r
657 VIR. CORE LEFT =/\r
658         MOVE TAC,VIRTAL         ;PRINT AMOUNT OF FREE SWAP SAPCE LEFT\r
659         JRST RADX10             ;IN DECIMAL\r
660 >\r
661 \f; "SSAVE FILENAM.EXT [PROJ,PROG] CORE"\r
662 ;WORKS LIKE SAVE, EXCEPT THAT HIGH SEG IS SAVED AS SHARABLE(EXT=SHR)\r
663 ;INSTEAD OF NON-SHARABLE(EXT=HGH)\r
664 \r
665 ; "SAVE FILE-NAME[PROJ.,PROG.] CORE" - SAVES JOB AREA ON RETRIEVABLE DEVICE\r
666 ;ONLY A SAVE OR A GET IN PROGRESS FOR EACH JOB\r
667 ;NO ATTEMPT IS MADE TO SAVE DEVICE ASSGINMENTS, AC'S OR PC\r
668 \r
669 SAVE:IFN FT2REL,<\r
670         TLO IOS,NSRBIT          ;SET FLAGE FOR NON-SHARABLE EXT(HGH)\r
671 >\r
672 SSAVE:  HRRI IOS,SAVJOB         ;SETUP TO RUN SAVEJOB (IOS CLEARED BEFORE\r
673         PUSHJ PDP,CTEXT1        ;DISPATCH\r
674         SETZM JBTPRG(ITEM)      ;CLEAR JOB'S PROGRAM NAME FOR ROOM\r
675         JRST SGSET\r
676 \r
677 ; "GET DEVICE:FILE-NAME[PROJ.,PROG.] CORE" - SETS UP JOB AREA FROM RETREIVABLE\r
678 \r
679 ;DEVICE AND ASSIGNS CORE.\r
680 \r
681 GET:    MOVEI IOS,GETJOB        ;SETUP TO RUN GETJOB\r
682         PUSHJ PDP,CTEXT1        ;GET DEVICE NAME\r
683         SETZM   JBTPRG(ITEM)    ;CLEAR NAME FOR RCOM\r
684         JRST RUNCM      \r
685                                 ; JOB DATA AREA FOR MONITOR JOB\r
686 \r
687 IFN FTLOGIN,<   ;AUTOMATIC LOGIN AFTER DSK REFESH OR WHEN REFLAG SET\r
688 \r
689 EXTERNAL        REFLAG\r
690 \r
691 LOGREF: MOVEM   TAC,PRJPRG(ITEM)        ;PRJ,PRG NRS. IN REFLAG\r
692         MOVSI   TAC,JLOG\r
693         IORM    TAC,JBTSTS(ITEM)\r
694         SETZM   -1(PDP)                 ;CLEAR ALL FLAGS FOR COMRET\r
695         SETZM   REFLAG                  ;ONLY ONCE\r
696         POPJ    PDP,\r
697 >\r
698 \f;"HELP" -HELP COMMAND\r
699 \r
700 INTERNAL FTLOGIN\r
701 \r
702 IFN FTLOGIN,<   EXTERNAL HELPPP\r
703 HELP1:\r
704         MOVE TAC,HELPPP\r
705         TLN T,JLOG\r
706         JRST    ALOGIN\r
707         POPJ    PDP,\r
708 >\r
709 \r
710 HELP:   IFN FTLOGIN,<\r
711         PUSHJ   PDP,HELP1\r
712 >\r
713         MOVE    TAC,[SIXBIT /HELP/]     ;CUSP NAME\r
714         JRST    ARCOM   ;RUN IT\r
715 \r
716 SYSTAT: IFN FTLOGIN,<\r
717         PUSHJ   PDP,HELP1\r
718 >\r
719         MOVE    TAC,[SIXBIT /SYSTAT/]   ;CUSP NAME\r
720         JRST    ARCOM   ;RUN IT\r
721 \r
722 EXTERNAL JBTSTS,TTYATT\r
723 \r
724 ALOGIN:\r
725 INTERNAL FTLOGIN\r
726 IFN FTLOGIN,<   EXTERNAL PRJPRG\r
727         MOVEM TAC,PRJPRG(ITEM)\r
728         MOVSI TAC,JLOG\r
729         ANDCAM TAC,JBTSTS(ITEM)\r
730 >\r
731 IFN FTSWAP,<EXTERNAL    TTYATT\r
732 ALOGN1: PUSHJ PDP,TTYATT        ;MAKE SURE TTY IS ATTACHED IN CASE\r
733                                 ; THIS COMMAND MUST BE DELAYED\r
734                                 ; BECAUSE NO CORE YET.\r
735         JFCL\r
736 >\r
737         POPJ PDP,\r
738 \fINTERN FTCCL\r
739 \r
740 IFN FTCCL,<\r
741 \r
742 CCLRUN: MOVE    TAC,[SIXBIT /COMPIL/]   ;CUSP NAME\r
743         JRST    ARCOM   ;RUN IT\r
744 \r
745 >\r
746 ;"LOGIN" - LOGIN COMMAND\r
747 \r
748 INTERNAL FTLOGIN\r
749 IFN FTLOGIN,<\r
750 \r
751 EXTERNAL SYSPP\r
752 \r
753 LOGDET: JSP     TAC,ERRMES\r
754         ASCIZ   /PLEASE KJOB OR DETACH\r
755 /\r
756 CLOGIN: TLNE    T,JLOG          ;FORCE USER TO LOGOUT BEFORE\r
757         JRST    LOGDET          ; LOGGING IN ANEW.\r
758 IFN FTSWAP,<\r
759         EXTERN VIRTAL,LOGSIZ\r
760         MOVE TAC,VIRTAL         ;AMOUNT OF FREE VIRTUAL CORE LEFT\r
761         CAIL TAC,LOGSIZ         ;IS THERE AT LEAST 2K FOR LOGIN?\r
762                                 ; CUSTOMER CAN REDEFINE TO BE BIGGER THAN 2\r
763                                 ; WITH MONGEN DIALOG\r
764         JRST CLOG2              ;YES,\r
765         MOVEI ITEM,0            ;NO, SET JOB NUMBER TO 0 FOR COMMAND DECODER\r
766         JRST COR2               ;AND GO TELL USER AMOUNT OF CORE LEFT\r
767 >\r
768 CLOG2:  SKIPE   TAC,REFLAG      ;REFLAG SET NON-ZERO FOR AUTOMATIC LOGIN?\r
769         JRST    LOGREF          ;YES, LOG USER IN WITHOUT RUNNING CUSP\r
770                                 ; SO HE CAN RELOAD THE DISK AFTER REFRESH\r
771         MOVE TAC,SYSPP          ;SET PRJPRG TO SYSPP\r
772         PUSHJ PDP,ALOGIN        ;AUTOMATIC LOGIN\r
773         MOVSI   TAC,JACCT       ;FLAG LOGIN OR LOGOUT RUNNING AND\r
774         IORM    TAC,JBTSTS(ITEM);DISABLE ^C,\r
775         MOVE    TAC,[SIXBIT /LOGIN/]    ;CUSP NAME\r
776         JRST    ARCOM   ;RUN IT\r
777 >\r
778 \f; "R CUSTNAME CORE" - DOES "RUN SYS:CUSPNAME"\r
779 \r
780 RCOM:   MOVEI   TAC,0   ;NO FILE NAME, TTY WILL SUPPLY IT\r
781         JRST    ARCOM1\r
782 \r
783 ARCOM:  IFN FTTTYSER,<  PUSHJ   PDP,SKPBRK>\r
784 ARCOM1: MOVEM   TAC,JBTPRG(ITEM)        ;STORE FILE NAME\r
785         MOVSI   TAC1,(SIXBIT /SYS/)     ;READ FROM SYS DEVICE\r
786         JRST    RUNCO2\r
787 ; "RUN DEVICE:FILE[PROJ.PROG.] (CORE)"\r
788 ;DOES A CORE,GET,START ALL IN ONE\r
789 ;IF CORE ARG IS MISSING. SIZEIN DIRECTORY IS USED\r
790 ;JOB ON DISK OR IN CORE OR NO CORE, BUT NOT IN MIDDLE OF SWAP\r
791 \r
792 EXTERNAL JOBDA\r
793 \r
794 RUNCOM: PUSHJ PDP,CTEXT1        ;GET DEVICE NAME FROM COMMAND STRING\r
795         SETZM   JBTPRG(ITEM)    ;CLEAR FILE NAME\r
796 RUNCO2:RUNC1:   MOVEI IOS,RUNJOB\r
797 RUNCM:  PUSHJ PDP,GETMIN        ;GET MININAL JOB AREA IN CORE OR DISK\r
798         JUMPN PROG,SGSET        ;WAS CORE ASSIGNED IN MEMORY? IF YES, GO SCANARGS\r
799 IFE FTSWAP,<\r
800         JRST COR2               ;NO. PRINT "0K CORE LEFT"\r
801 >\r
802 IFN FTSWAP,<\r
803         JRST DLYCM              ;NO. DELAY COMMAND UNTIL IN CORE\r
804 >\r
805 \f; "ASSIGN DEV:NAME" - ASSIGN DEVICE TO JOB AND GIVE IT LOGICAL NAME\r
806 \r
807 EXTERNAL DEVLST,PJOBN,SYSTAP\r
808 \r
809 ASSIGN: PUSHJ PDP, CTEXT1       ;GET FIRST ARGUMENT\r
810         JUMPE TAC1, NOTENF      ;NO ARGUEMNT TYPED IF 0\r
811 IFN FTLOGIN,<EXTERN PRJPRG\r
812         CAME    TAC,[SIXBIT .SYS.]\r
813         JRST    ASSG6\r
814         HLRZ    T1,PRJPRG(ITEM)\r
815         CAIN    T1,1            ;PROJECT NR, 1?\r
816         JRST    ASSG7           ;YES\r
817 ASSG6:\r
818 >\r
819         MOVE T1, TAC1           ;SAVE DEVICE NAME\r
820 IFN FTTTYSER,<\r
821         PUSH    PDP,DEVDAT      ;SAVE TTY\r
822 >\r
823 IFE FTTTYSER,<\r
824 \r
825         PUSH PDP, TAC           ;SAVE INPUT BYTE POINT\r
826 >\r
827         MOVE    TAC,TAC1\r
828         PUSHJ   PDP,DEVPHY\r
829         JRST    ASSG3\r
830         MOVEI   TAC1,ASSCON\r
831         JRST    ASSG4\r
832 ASSG3:  MOVEI   TAC1,ASSCON     ;SETUP ASSIGNED BY CONSOLE BIT\r
833         HLRZ DEVDAT, DEVLST\r
834 ASSG0:  MOVE TAC,DEVNAM(DEVDAT)\r
835         CAME T1,DEVNAM(DEVDAT)  ;DOES PHYSICAL NAME MATCH?\r
836         JRST ASSG1              ;NO\r
837 ASSG4:  CAMN T1,[SIXBIT /DSK/]  ;IS THIS A DISC?(IF YES,\r
838         JRST    ASSG5           ;BYPASS CHECK FOR SYSTEM TAPE AND ASSIGN BELOW\r
839         CAMN TAC,SYSTAP         ;IS NEXT DEVICE IN LIST THE SYSTEM TAPE?\r
840         JRST ASSFIN             ;YES, DO NOT ASSIGN. CLEAR DIRECTORY IN CORE BIT\r
841 ASSG5:  PUSHJ   PDP,ASSASG      ;NO, TRY TO ASSGIN DEVICE\r
842         JRST ASSER1             ;ALREADY ASSIGNED TO ANOTHER JOB\r
843         JRST ASSFIN             ;ASSIGNED\r
844 \f;SYSTEM TAPE OR NOT MATCH OF ARG AND PHYSICAL NAME.\r
845 \r
846 ASSG1:  CAMN TAC,SYSTAP         ;IS THIS SYSTEM TAPE?\r
847         JRST ASSG2              ;YES\r
848         LDB T, PJOBN            ;SAVE OLD JOB NUMBER FOR THIS DEVICE\r
849         TRZ TAC,-1              ;COMAPRE LEFT HALF ONLY\r
850         CAMN TAC, T1\r
851         PUSHJ PDP, ASSASG       ;MATCH. TRY TO ASSIGN IT\r
852         JRST ASSG2              ;KEEP LOOKING\r
853         JUMPE T,ASSFIN          ;IF OLD JOB NUMBER 0, DEVICE PREVIOSLY UNASSIGNED\r
854 \r
855 ASSG2:  HLRZ DEVDAT, DEVSER(DEVDAT)\r
856         JUMPN DEVDAT, ASSG0\r
857 IFN FTTTYSER,<\r
858         POP     PDP,DEVDAT      ;RESTORE TTY DDB\r
859 >\r
860 IFE FTTTYSER,<\r
861         POP PDP, TAC\r
862 >\r
863         JRST NOTDEV             ;PRINT NO SUCH DEVICE\r
864 \r
865 IFN FTLOGIN,<EXTERN STREQ,SYSTAP\r
866 ASSG7:  PUSHJ   PDP,CTEXT1\r
867         JUMPE   TAC1,NOTENF\r
868         SKIPL   STREQ\r
869         JRST    DLYCM1\r
870         MOVEM   TAC1,SYSTAP\r
871         POPJ    PDP,\r
872 >\r
873 \f;ALREADY ASSIGNED TO ANOTHER JOB\r
874 ASSER1:\r
875 IFE FTTTYSER,<\r
876         PDP PDP, TAC\r
877         MOVEI TAC, ASSMS2\r
878         PUSHJ PDP,ERRMES\r
879         LDB TAC, PJOBN\r
880         JRST DECLF              ;PRINT JOB NUMBER CRLF\r
881 >\r
882 IFN FTTTYSER,<\r
883         LDB     TAC,PJOBN       ;GET JOB NUMBER FOR DEVICE\r
884         POP     PDP,DEVDAT      ;GET DDB FOR TTY\r
885         PUSH    PDP,TAC ;SAVE JOB NO.\r
886         MOVEI   TAC,ASSMS2      ;TYPE ERROR MESSAGE\r
887         PUSHJ   PDP,ERRMES\r
888         POP     PDP,TAC ;GET JOB NO. BACK\r
889         JRST    DECLF           ;AND TYPE IT\r
890 >\r
891 \r
892 ASSMS2: ASCIZ   /ALREADY ASSIGNED TO JOB /\r
893 \f;DEVICE ASSIGNED, GIVE IT A LOGICAL NAME\r
894 ASSFIN: SETZM   DEVLOG(DEVDAT)  ;CLEAR LOGICAL NAME\r
895 IFE FTTTYSER,<\r
896         POP PDP,TAC             ;RESTORE INPUT BYTE POINTER\r
897         PUSH PDP,DEVDAT         ;SAVE DDB ADDRESS\r
898 >\r
899 IFN FTTTYSER,<\r
900         EXCH    DEVDAT,0(PDP)   ;GET TTYDDB, SAVE DEVICE DDB\r
901 >\r
902         PUSHJ PDP,CTEXT1        ;GET SECOND ARG, LOGICAL DEVICE NAME\r
903         SKIPE TAC,TAC1          ;IS THERE A LOGICAL NAME SPECIFIED?\r
904         PUSHJ PDP, DEVLG        ;YES, SEE IF IT IS ALREADY IN USE\r
905                                 ; BY THIS USER\r
906         JRST ASSG1              ;NO \r
907         MOVEI TAC,LOGERR        ;YES, PRINT ERROR\r
908         MOVE    DEVDAT,-3(PDP)  ;RESTORE TTY DDB\r
909         PUSHJ PDP,ERRMES\r
910         MOVEI TAC,0             ;CLEAR LOGICAL NAME FOR THIS DEVICE\r
911 ASSF1:  POP PDP,DEVDAT\r
912         MOVEM TAC,DEVLOG(DEVDAT);STORE IN DEVICE DATA BLOCK\r
913         MOVSI TAC1,DVDIRIN      ;CLEAR DIRECTORY IN CORE BIT\r
914         ANDCAB TAC1,DEVMOD(DEVDAT)      ;SETUP TAC1 WITH DEVICE CHARACTERISTICS FOR ASGHGH\r
915 IFN FT2REL,<\r
916         EXTERN ASGHGH\r
917         PUSHJ PDP,ASGHGH        ;GO CHECK IF THIS DEVICE HAS INITIALIZED ANY SHARED SEGMENTS\r
918                                 ; IF YES, CLEAR SEG NAMES SO NO NEW SHARING (DTA,MTA ONLY)\r
919 >\r
920         MOVE TAC1,DEVNAM(DEVDAT)        ;PHYSICAL NAME\r
921         MOVE    DEVDAT,-2(PDP)  ;RESTORE TTY DDB\r
922         PUSHJ PDP,PRNAME        ;PRINT IT\r
923         JSP TAC,CONMES\r
924 \r
925         ASCIZ / ASSIGNED\r
926 /\r
927 \r
928 LOGERR: ASCIZ /LOGICAL NAME ALREADY IN USE. /\r
929 \f\r
930 ;"DEASSIGN DEV" - DEASSIGNS DEVICE FROM CONSOLE\r
931 \r
932 INTERNAL NOTDEV\r
933 \r
934 DEASSI: JUMPE ITEM,CPOPJ        ;NO-OP IF NO JOB NUMBER\r
935         PUSHJ PDP,CTEXT1        ;GET DEVICE NAME\r
936         JUMPE TAC1,DEASTY       ;NO ARG. IF 0, DEASSIGN ALL BY TTY\r
937         MOVE TAC, TAC1          ;DEVICE NAME\r
938         PUSHJ PDP, DEVSRC       ;SEARCH FOR DEVICE\r
939         JRST DEAER1             ;NOT FOUND\r
940         PUSHJ PDP, DEASG        ;FOUND, DEASSIGN IT\r
941         JRST DEAER2             ;NOT PREVIOUSLY ASSIGNED\r
942         POPJ PDP,               ;DEVICE DEASSIGNED\r
943 \r
944 NOTDEV:\r
945 DEAER1: MOVE    DEVDAT,-2(PDP)  ;RESTORE TTY DDB\r
946         JSP TAC,ERRMES          ;PRINT NO SUCH DEVICE\r
947 \r
948         ASCIZ /NO SUCH DEVICE\r
949 /\r
950 \r
951 DEAER2: MOVE TAC1,DEVNAM(DEVDAT)        ;PRINT PHYSICAL DEVICE NAME\r
952         MOVE    DEVDAT,-2(PDP)  ;RESTORE TTY DDB\r
953         PUSHJ PDP,PRNAME\r
954         JSP TAC,ERRMES\r
955 \r
956         ASCIZ / WASN'T ASSIGNED\r
957 /\r
958 \fINTERNAL FTREASSIGN\r
959 IFE FTREASSIGN,<\r
960 REASSI=UUOERR\r
961 >\r
962 \r
963 IFN FTREASSIGN,<\r
964 \r
965 ;REASSIGN UUO\r
966 ;CALL   MOVE AC,JOB NUMBER\r
967 ;       MOVE AC+1,SIXBIT /DEVICE/\r
968 ;       CALL AC,[SIXBIT /REASSIGN/]\r
969 ;IF C(AC)=0, JOB HAS NOT BEEN INITIALIZED\r
970 ;IF C(AC+1)=0, DEVICE NOT ASSIGNED TO THIS JOB OR DEVICE IS A TTY\r
971 \r
972 INTERNAL REASSIGN\r
973 EXTERNAL PUUOAC,JOB\r
974 \r
975 REASSI: LDB UUO,PUUOAC\r
976         HRLI UUO,PROG\r
977         PUSH PDP,@UUO           ;STACK JOB NUMBER TO BE REASSIGNED TO\r
978         AOS UUO\r
979         MOVE TAC1,@UUO          ;DEVICE NAME\r
980         MOVE ITEM,JOB           ;THIS JOB NUMBER\r
981         SOJA UUO,REASS1\r
982 \r
983 ;"REASSIGN DEV:JOB" - REASSIGN DEVICE "DEV" TO JOB "JOB"\r
984 \r
985 REASS:\r
986         PUSHJ PDP,CTEXT         ;GET DEVICE NAME\r
987         JUMPE TAC,NOTENF        ;NULL NAME?\r
988         MOVE UUO,TAC1           ;SAVE IT IN UUO\r
989         PUSHJ PDP,DECIN1        ;GET NEW JOB NUMBER\r
990         JRST NOTENF             ;NONE SPECIFIED, DOESN'T RETURN IF ERROR\r
991         JRST COMERA             ;ILLEGAL CHARACTER\r
992         PUSH PDP,TAC1           ;PUT JOB NUMBER ON STACK, DEVICE\r
993         MOVE TAC1,UUO           ;NAME IN TAC1\r
994         SETZM UUO               ;SET COMMAND SWITCH\r
995 \f\r
996 ;ROUTINE COMMON TO REASSIGN UUO AND COMMAND\r
997 \r
998 EXTERNAL JBTSTS,PJOBN,JOBFDV\r
999 \r
1000 REASS1: EXCH ITEM,(PDP)         ;NEW JOB NO. IN ITEM\r
1001         CAILE ITEM,JOBN         ;IS JOB NUMBER OUT OF RANGE\r
1002         JRST REASE2             ;YES, DO NOT REASSIGN\r
1003         MOVE TAC,JBTSTS(ITEM)   ;NEW JOB STATUS\r
1004         EXCH ITEM,(PDP)         ;RESTORE ITEM AND STACK\r
1005         TLNN TAC,JNA            ;DOES NEW JOB EXIST?\r
1006         JRST REASE1             ;NO.\r
1007         MOVE TAC,TAC1\r
1008         PUSHJ PDP,DEVSRC        ;SEARCH FOR DEV\r
1009         JRST REASE2             ;NOT FOUND\r
1010         LDB TAC,PJOBN\r
1011         CAME TAC,ITEM           ;ASSIGNED TO THIS JOB\r
1012         JRST REASE3             ;NO\r
1013         MOVE TAC,DEVMOD(DEVDAT)\r
1014 \r
1015         TLNE TAC,DVTTY          ;IS IT A TTY?\r
1016         JRST REASE6             ;YES. CAN'T BE REASSIGNED\r
1017         TRNN TAC,ASSPRG         ;IS DEVICE INITED?\r
1018         JRST REASS3             ;NO.\r
1019         JUMPN UUO,REASS4        ;YES. COMMAND LEVEL?\r
1020         HRL DEVDAT,(PDP)        ;YES. SCHEDULE RELEASE\r
1021         MOVEM DEVDAT,JOBFDV(JDAT)\r
1022         POP PDP,TAC1\r
1023         MOVE DEVDAT,-2(PDP)\r
1024         MOVSI TAC1,TTYRNC       ;SET TTYRNC SO JOB WILL RUN\r
1025         IORM TAC1,-1(PDP)\r
1026         JSP TAC1,MSTART\r
1027         JSP TAC,MONSTR\r
1028         HLRZ TAC,JOBFDV(JDAT)\r
1029         PUSH PDP,TAC\r
1030         HRRZ DEVDAT,JOBFDV(JDAT)\r
1031         MOVE ITEM,JOB\r
1032         SETOM UUO               ;SET FLAG TO STOP JOB\r
1033 REASS4: HRRZ DSER,DEVSER(DEVDAT)\r
1034         HRRZM DEVDAT,JOBFDV(JDAT)\r
1035         MOVE UCHN,USRHCU\r
1036 \fREASS2:        MOVE DEVDAT,USRJDA(UCHN)        ;GET XWD UUO BITS,DDB ADDRESS\r
1037         HRRZ TAC,JOBFDV(JDAT)   ;GET ADDR. OF DDB SAVED BY COMMAND\r
1038         PUSH PDP,UCHN           ;SAVE USER CHANNEL\r
1039         CAIN TAC,(DEVDAT)       ;IS CHOSEN DEVICE ON THHS CHANNEL?\r
1040         PUSHJ PDP,RELEA5        ;YES, RELEASE DEVICE\r
1041         POP PDP,UCHN\r
1042         SOJGE UCHN,REASS2\r
1043         MOVE DEVDAT,JOBFDV(JDAT)\r
1044         MOVE ITEM,JOB           ;CURRENT JOB NUMBER\r
1045 REASS3: MOVEI TAC,ASSCON        ;ASSIGN IT BY CONSOLE\r
1046         IORM TAC,DEVMOD(DEVDAT)\r
1047         EXCH ITEM,(PDP)\r
1048         DPB ITEM,PJOBN          ;PUT IN NEW JOB NUMBER\r
1049         POP PDP,ITEM\r
1050         JUMPL UUO,ESTOP\r
1051         POPJ PDP,\r
1052 \r
1053 REASE1: POP PDP,TAC\r
1054         JUMPE UUO,ATT4          ;JOB NEVER WAS INITIATED\r
1055 REASE4: SETZM @UUO              ;CLEAR C(AC)\r
1056         POPJ PDP,\r
1057 \r
1058 REASE2: MOVEI TAC,NOTDEV        ;NO SUCH DEVICE\r
1059 REASE5: POP PDP,TAC1\r
1060         JUMPE UUO,(TAC)\r
1061         AOJA UUO,REASE4\r
1062 \r
1063 REASE3: MOVEI TAC,DEAER2        ;WASN'T ASSIGNED\r
1064         JRST REASE5\r
1065 \r
1066 REASE6: MOVEI TAC,REASE7\r
1067         JRST REASE5\r
1068 REASE7: MOVE TAC1,DEVNAM(DEVDAT)\r
1069         MOVE    DEVDAT,-2(PDP)  ;RESTORE TTY DDB\r
1070         PUSHJ PDP,PRNAME\r
1071         JSP TAC,ERRMES\r
1072         ASCIZ / CAN'T BE REASSIGNED\r
1073 /\r
1074 >\r
1075 \fINTERNAL FTATTACH\r
1076 IFN FTATTACH,<\r
1077 \r
1078 ;"ATTACH DEVNAME" -ATTACHES A PREVIOUSLY PARTITIONED DEVICE\r
1079 ;       NOTE-MUST BE LOGGED IN UNDER [1,1] TO DO THIS\r
1080 ; "ATTACH N [PROJ.,PROG.]" - ATTACH CONSOLE TO JOB N\r
1081 ;CHANGES ADDRESS OF TTY DEVICE DATA BLOCK STORED IN -2(PDP)\r
1082 ;BY THE COMMAND DECODER\r
1083 \r
1084 INTERNAL ATTACH\r
1085 EXTERNAL TTYATT,JOBN,TTYFND\r
1086 \r
1087 ATTACH: IFE FTTTYSER,<\r
1088         MOVE AC2,TAC            ;SAVE BYTE POINTER>\r
1089         PUSHJ PDP,DECIN         ;GET JOB NO.\r
1090         JRST NOTENF             ;NOT A NUMBER OR NONE SPECIFIEED\r
1091 IFN     FTLOGIN, <\r
1092         JRST DEVATT             ;WANTS TO ATTACH A DEVICE\r
1093 >\r
1094 \r
1095 IFE     FTLOGIN, <\r
1096         JRST    ATT1\r
1097 >\r
1098         SKIPE TAC1              ;0 IS ILLEGAL\r
1099         CAIL TAC1, JOBN         ;IS JOB NUMBER TOO BIG?\r
1100         JRST ATT1               ;ILLEGAL JOB NUMBER\r
1101         MOVSI T1,JNA            ;HAS THIS JOB NO BEEN ASSIGNED?\r
1102         TDNN T1,JBTSTS(TAC1)\r
1103         JRST ATT4               ;NO, PRINT ERROR\r
1104 INTERNAL FTLOGIN\r
1105 IFN FTLOGIN,<\r
1106         MOVE IOS,TAC1           ;SAVE JOB NO.\r
1107         PUSHJ PDP,PJPGNO        ;GET PROJ,-PROG. NOS. ARG(IF ERROR, PDP SUP LEVEL\r
1108                                 ; OFF 1, PRINT ERROR, AND DO NOT RETRY HERE\r
1109 \r
1110         MOVEM IOS,TAC1          ;RESTORE\r
1111         SKIPN AC2               ;DID USER TYPE IN A PROG,PROG # IN []'S?\r
1112         MOVE AC2,PRJPRG(ITEM)   ;NO. ASSUME PROJ,PROG NUMBER FOR CURRENT JOB\r
1113                                 ; SO USER CAN AVOID TYPEING PROGPROG NO. IF  DOING\r
1114                                 ; FROM 1 JOB TO ANOTHER UNDER SAME PROJ,PROG\r
1115         CAME AC2,PRJPRG(TAC1)   ;IS THIS THE SAME PERSON WHO DETACHED FROM THIS JOB NUMBER?\r
1116         JRST ATT3               ;NO-ERROR\r
1117                                 ; YES\r
1118 >\r
1119         MOVE ITEM,TAC1  ;JOB NUMBER TO ITEM\r
1120         PUSHJ PDP,TTYATT        ;NO, ATTACH TTY\r
1121         JRST ATT2               ;ERROR CAN'T ATTACH\r
1122         MOVEM DEVDAT,-2(PDP)    ;CHANGE DEV DATA BLOCK ADDRESS\r
1123 IFN FTTTYSER,<\r
1124         EXTERN TSETBF\r
1125         PUSHJ PDP,TSETBF        ;INITIALIZE TTY INPUT BUFFER\r
1126 >\r
1127         JRST TTYFND             ;ATTACHED, GO SET UP OUTP. BYTE PTR.\r
1128 \f\r
1129 INTERNAL FTLOGIN\r
1130 IFN FTLOGIN,<\r
1131 DEVATT: IFE FTTTYSER,<\r
1132         MOVE TAC,AC2            ;RESTORE BYTE POINTER>\r
1133         PUSHJ PDP,CTEXT1                ;GET DEVICE ARGUMENT\r
1134         JFCL                    ;SHOULD NEVER RETURN\r
1135         MOVE T,PRJPRG(ITEM)     ;GET PROJ.-PROG. NOS.\r
1136         CAME T,SYSPP            ;PRJPRG = [1,1]?\r
1137         JRST ATT5               ;NO - ERROR\r
1138         MOVE TAC,TAC1           ;YES-SET UP DEVICE NAME\r
1139         PUSH PDP,DEVDAT         ;SAVE DDB FOR THIS TTY\r
1140         PUSHJ PDP,DEVSRC        ;SEARCH FOR DEVICE\r
1141         JRST TEMP1              ;NOT FOUND\r
1142         LDB T,PJOBN             ;GET JOB NUMBER\r
1143         JUMPN T,ATT6            ;IS IT = 0?\r
1144         DPB ITEM,PJOBN          ;SET JOB NUMBER\r
1145         MOVE TAC,DEVMOD(DEVDAT); CHECK TO SEE IF THIS IS A TTY\r
1146         LDB TAC1,PUNIT          ;\r
1147         TLNE TAC,DVTTY          ;IS IT A TTY?\r
1148         HRRM DEVDAT,TTYTAB(TAC1)        ;SET TRANS TABLE TO POINT TO DDB\r
1149         POP PDP,DEVDAT          ;\r
1150         POPJ PDP,               ;RETURN\r
1151 >\r
1152 \f\r
1153 ATT1:   JSP TAC,ERRMES\r
1154         ASCIZ /ILLEGAL JOB NUMBER\r
1155 /\r
1156 ATT2:   MOVE TAC1,DEVNAM(DEVDAT)        ;[PRINT PHYSICAL NAME\r
1157         MOVE    DEVDAT,-2(PDP)  ;RESTORE TTY DDB\r
1158         PUSHJ PDP,PRNAME\r
1159         JSP TAC,ERRMES\r
1160         ASCIZ / ALREADY ATTACHED\r
1161 /\r
1162 ATT3:   JSP TAC,ERRMES\r
1163         ASCIZ /CAN'T ATT TO JOB\r
1164 /\r
1165 ATT4:   JSP TAC,ERRMES\r
1166         ASCIZ /NOT A JOB\r
1167 /\r
1168 ATT5:   JSP TAC,ERRMES\r
1169         ASCIZ /CAN'T ATT DEV\r
1170 /\r
1171 ATT6:   POP PDP,DEVDAT\r
1172         JSP TAC,ERRMES\r
1173         ASCIZ /WASN'T DET\r
1174 /\r
1175 >\r
1176 \fINTERNAL FTATTACH\r
1177 IFN FTATTACH,<\r
1178 \r
1179 ;"DETACH" - DETACH CONSOLE FROM JOB\r
1180 ;"DETACH DEVNAM" - DETACHES DEVICE FROM THE SYSTEM SOFTWAREWISE\r
1181 ;       NOTE - MUST BE LOGGED IN UNDER [1,1] TO DO THIS\r
1182 \r
1183 EXTERNAL TTYDET\r
1184 INTERNAL FTLOGIN\r
1185 \r
1186 IFE FTLOGIN,<\r
1187 DETACH: JRST TTYDET             ;GO DETACH TTY\r
1188 >\r
1189 \r
1190 IFN FTLOGIN,<\r
1191 EXTERNAL PRJPRG,SYSPP,PUNIT,TTYTAB,PJOBN\r
1192 DETACH: PUSHJ PDP,CTEXT1                ;GET ARGUMENT\r
1193         JUMPE TAC1,TTYDET       ;ONLY "DET" TYPED\r
1194         MOVE T,PRJPRG(ITEM)     ;GET PROJ.-PROG. NUMBER\r
1195         CAME T,SYSPP            ;PRJPRG = [1,1]?\r
1196         JRST LOGER1             ;NO-PRINT ERROR MSG.\r
1197         MOVE TAC,TAC1           ;YES-SET UP DEVICE NAME\r
1198         PUSH PDP,DEVDAT         ;SAVE TTY DDB\r
1199         PUSHJ PDP,DEVSRC        ;SEARCH FOR DEVICE\r
1200         JRST TEMP1              ;DEVICE NOT FOUND\r
1201         MOVE TAC,DEVMOD(DEVDAT) ;CHECK TO SEE IF THIS IS DSK\r
1202         TLNE TAC,DVDSK          ;IS IT THE DSK?\r
1203         JRST TEMP1              ;YES-PRINT ERROR MSG.\r
1204         MOVEI TAC1,ASSCON       ;FOUND-SET UP ASSIGNED BY CONSOLE\r
1205         PUSHJ PDP,ASSASG        ;TRY TO ASSIGN\r
1206         JRST TEMP2              ;CAN'T ASSIGN\r
1207         TLNE DEVDAT,SYSDEV      ;IS THIS SYSTEM DEVICE?\r
1208         JRST TEMP1              ;YES-PRINT ERROR MSG.\r
1209         XOR T,T                 ;NO-SET TO ZERO\r
1210         DPB T,PJOBN             ;SET JOB NO. TO NULL JOB\r
1211         MOVE TAC,DEVMOD(DEVDAT) ;CHECK TO SEE IF THIS IS A TTY\r
1212         TLNN TAC,DVTTY          ;IS IT A TTY?\r
1213         JRST .+4                ;NO-GO AHEAD\r
1214         LDB TAC,PUNIT           ;YES-SET UPO FOR SCNSER\r
1215         MOVEI TAC1,-1           ;SET LEFT HALVE TO TTYTAB TO -1\r
1216         HRRM TAC1,TTYTAB(TAC)   ;SO THAT SCNSER CHECKS FOR THIS\r
1217         POP PDP,DEVDAT          ;RESTORE TTY DDB\r
1218         POPJ PDP,               ;SUCCESSFUL RETURN\r
1219 \fTEMP1: POP PDP,DEVDAT          ;RESTORE TTY DDB\r
1220         JRST DEAER1             ;PRINT ERROR MSG. AND RETURN\r
1221 TEMP2:\r
1222 IFE FTTTYSER,<  POP PDP,DEVDAT          ;RESTORE TTY DDB\r
1223         JRST ASSER1+1           ;PRINT ERROR MSG. AND RETURN\r
1224 >\r
1225 IFN FTTTYSER,<\r
1226         JRST ASSER1\r
1227 >\r
1228 LOGER1: JSP TAC,ERRMES\r
1229         ASCIZ /CAN'T DET DEV\r
1230 /\r
1231 >>      ;CLOSE BOTH FTLOGIN AND FTATTACH CONDITIONALS.\r
1232 \f;"DAYTIME" - PRINT TIME OF DAY\r
1233 \r
1234 EXTERNAL TIME,THSDAT,MONTAB,JIFMIN\r
1235 \r
1236 DAYTIM:\r
1237 IFN     FTLOGIN, <\r
1238         JUMPE ITEM,DAYTM1\r
1239         PUSHJ PDP,DECIN         ;WAS AN ARGUMENT TYPED?\r
1240         JRST DAYTM1             ;NO, PRINT TIME\r
1241         JRST COMERA             ;ERROR\r
1242         HLRZ TAC,PRJPRG(ITEM)   ;YES\r
1243         CAIE TAC,1              ;IS THIS PROJECT 1?\r
1244         JRST DAYTM1             ;NO, PRINT TIME OF DAY ANYWAY(IGNORE ARG)\r
1245         MOVE TAC,TAC1           ;YES, RESET TIME ACCORDING TO ARGUMENT\r
1246         IDIVI TAC,^D100\r
1247         IDIVI TAC,^D60          ;\r
1248         ADD TAC,TAC1            ;COMPUTE MINUTES\r
1249         IMULI TAC,JIFMIN        ;COMPUTE JIFFIES\r
1250         MOVEM TAC,TIME          ;AND STORE\r
1251         POPJ PDP,\r
1252 >\r
1253 DAYTM1: MOVE TAC,THSDAT         ;PRINT TODAY'S DATE\r
1254         IDIVI TAC,^D31\r
1255         EXCH TAC,TAC1           ;YEAR AND MONTH IN TAC1\r
1256         PUSHJ PDP,DECP1         ;ADD 1 TO DAY(IN TAC) AND PRINT DECIMAL\r
1257         MOVEI TAC,0\r
1258         DIVI TAC,^D12\r
1259         EXCH TAC,TAC1\r
1260         MOVE TAC,MONTAB(TAC)    ;MONTH\r
1261         DPB TAC,[POINT 21,DAMESS,27]\r
1262         MOVEI TAC,DAMESS\r
1263         PUSHJ PDP,CONMES        ;PRINT DAY\r
1264         MOVEI TAC,^D64(TAC1)\r
1265         PUSHJ PDP,RADX10        ;PRINT YEAR\r
1266         PUSHJ PDP,PRSPC\r
1267         MOVE TAC,TIME           ;PRINT TIME OF DAY\r
1268         JRST PRTIM1\r
1269 \fINTERNAL FTTIME\r
1270 IFN FTTIME,<\r
1271 ;"TIME (JOB NO.)" - PRINT TOTAL AND INCREMENTAL RUNNING TIME FOR A JOB\r
1272 ;FOLLOWED BY KILO-CORE TICKS\r
1273 ;"TIME 0" IMPLIES RUNTIME FOR NULL JOB AND THE TOTAL TIME SPENT SHUFFLING USERS\r
1274 ;       IF NO JOB NO. GIVEN-TIME WILL BE FOR CURRENTLY LOGGGED IN JOB NO.\r
1275 \r
1276 EXTERNAL RTIME,TTIME,SHFWRD,WDPJIF,JOBN,JBTSTS,CLRWRD,LSTWRD\r
1277 \r
1278 RUNTIM: PUSHJ PDP,DECIN         ;GETJOB NO. ARG.\r
1279         JRST RUN1               ;NO ARG. GIVEN - LOGGED IN?\r
1280         JRST COMERA             ;ILLEGAL DECIMAL CHARACTER RETURN\r
1281         JUMPE TAC1,RUN2         ;RUNTIME 0 GIVEN\r
1282         CAIL TAC1,JOBN          ;JOB NO. TO BIG?\r
1283         JRST ATT1               ;YES,ILLEGAL JOB. NO.\r
1284         MOVE TAC,TTIME(TAC1)    ;TIME SINCE LAST LOGGIN\r
1285         JRST PRTIME             ;PRINT AND RETURN\r
1286 \r
1287 RUN2:   PUSHJ PDP,INLMES        ;PRINT\r
1288 \r
1289         ASCIZ /SHFL /           ;"SHUFFLING "\r
1290         MOVE TAC,SHFWRD         ;NO. WORDS SHUFFLED\r
1291         IDIVI TAC,WDPJIF        ;NO.WORDS/JIFFY USING BLT\r
1292         PUSHJ PDP,PRTIME        ;PRINT SHUFFLE TIME\r
1293         PUSHJ   PDP,INLMES\r
1294         ASCIZ   /ZCOR /\r
1295         MOVE    TAC,CLRWRD\r
1296         IDIVI   TAC,WDPJIF\r
1297         PUSHJ   PDP,PRTIME      ;PRINT TIME SPENT CLEARING CORE\r
1298         PUSHJ   PDP,INLMES\r
1299         ASCIZ   /LOST /\r
1300         MOVE    TAC,LSTWRD\r
1301         PUSHJ   PDP,PRTIME      ;PRINT TME SPENT "LOST" RUNNING NULL JOB\r
1302         PUSHJ PDP,INLMES        ;PRINT\r
1303         ASCIZ /NULL /           ;"NULL TIME "\r
1304         MOVE TAC,TTIME          ;PRINT NULL JOB RUNNING TIME\r
1305         PUSHJ PDP,PRTIME        ;\r
1306         PUSHJ PDP,INLMES        ;PRINT TOTAL SYSTEM UP TIME\r
1307         ASCIZ /UP   /\r
1308         MOVE TAC,UPTIME\r
1309         JRST PRTIME             ;AND RETURN\r
1310 \r
1311 \fRUN1:\r
1312 IFE FTLOGIN,<\r
1313         MOVEI TAC,0             ;GET SET TO CLEAR INCREMENTAL RUN TIME\r
1314 >\r
1315 IFN FTLOGIN,<\r
1316         MOVSI TAC,JLOG          ;IS JOB LOGGED IN?\r
1317         TDZN TAC,JBTSTS(ITEM)   ;TEST JOB STATUS BITS AND CLEAR TAC ALWAYS\r
1318         JRST NOTENF             ;NO, NEED MORE ARGUMENTS\r
1319 >\r
1320         EXCH TAC,RTIME(ITEM)    ;GET CURRENT INCR. TIME AND CLEAR\r
1321         PUSHJ PDP,PRTIME        ;PRINT TIME SINCE LAST TIME COMM.\r
1322 PRTTIM: MOVE TAC,TTIME(ITEM)    ;GET TOTAL ACCUMULATED TIME\r
1323 IFN FTKCT,<\r
1324         PUSHJ PDP,PRTIME\r
1325         EXTERN JBTKCT\r
1326         PUSHJ PDP,INLMES        ;PRINT "K*CPUSEG=\r
1327         ASCIZ /KILO-CORE-SEC=/\r
1328         MOVE TAC,JBTKCT(ITEM)   ;PRODUCT OF NO. OF K CORE* NO. OF JIFFIES RUN\r
1329         IDIVI TAC,JIFSEC        ;AT THAT SIZE, CONVERT TO KILO CORE SECONDS\r
1330         PUSHJ PDP,RADX10        ;AND PRINT IN DECIMAL\r
1331         JRST CRLF               ;PRINT IRLF\r
1332 >\r
1333 IFE FTKCT,<\r
1334         JRST PRTIME             ;PRINT IT AND RETURN\r
1335 >\r
1336 >\r
1337 \f;ROUTINE TO LET TTY TALK TO ANY OTHER RING OF TTYS\r
1338 ;       "TALK TTYN"\r
1339 ;       TTYN NEED NEVER HAVE BEEN TYPED ON BEFORE\r
1340 \r
1341 INTERNAL FTTALK\r
1342 \r
1343 IFN FTTALK,<\r
1344 EXTERNAL TTYTLK\r
1345 \r
1346 TALK:   PUSHJ PDP,CTEXT1                ;GET ARGUMENT\r
1347         JUMPE TAC1,TALK2        ;NONE SPECIFIED\r
1348         MOVE TAC,TAC1\r
1349         PUSHJ PDP,DEVSRC        ;SEARCH FOR DEVICE\r
1350         JRST TALK1              ;DEVSRC SHOULD FIND A FREE TTY DDB\r
1351                                 ; EVEN IF TTY NEVER TYPED ON YET\r
1352         PUSHJ PDP,TTYTLK\r
1353         JRST TALK1\r
1354         POPJ PDP,\r
1355 \r
1356 TALK2:  MOVSI ITEM,NOINCK       ;SET FLAGS SO RESPONSE WILL PRINT\r
1357         MOVEM ITEM,-1(PDP)\r
1358         JRST NOTENF\r
1359 \r
1360 TALK1:  MOVE    DEVDAT,-2(PDP)  ;RESTORE TTY DDB\r
1361         MOVSI ITEM,NOINCK       ;SET FLAGS TO PRINT RESPONSE\r
1362         MOVEM ITEM,-1(PDP)\r
1363         JSP TAC,ERRMES\r
1364         ASCIZ /BUSY\r
1365 /\r
1366 >\r
1367 \fINTERNAL FTEXAMINE\r
1368 \r
1369 IFN FTEXAMINE,<\r
1370 \r
1371 ;"EXAMINE LOC" - LOOKS A CONTENTS OF LOC AND PRINTS IN OCTAL\r
1372 ;IF LOC IS MISSING, NEXT LOC IS PRINTED\r
1373 ;IF PREVIOUS WAS E COMMAND, SAME LOC IF PREVIOUS WAS D COMMAND\r
1374 ;TAB. IS PRINTED INSTEAD OF CRLF(LIKE DDT)\r
1375 \r
1376 EXTERNAL TPOPJ,JOBPC\r
1377 \r
1378 ECOM:   SKIPGE JOBEXM(JDAT)     ;WAS PREVIOUS D OR E COMMAND. A D COMMAND?\r
1379         AOS JOBEXM(JDAT)        ;NO, IT WAS AN  E. INCREMENT IN CASE HE TYPES NO ARG\r
1380         HRROS JOBEXM(JDAT)      ;YES, FLAG THAT E HAPPENED LAST(LH=-1)\r
1381         PUSHJ PDP,OCTIN         ;GET OCTAL LOCATION\r
1382         SKIPA TAC,JOBEXM(JDAT)  ;NONE SPECIFIED, USE LAST LOC OF D OR NEXT OF E\r
1383         JRST COMERA             ;ILLEGAL CHARACTER\r
1384         PUSHJ PDP,DEAT          ;CHECK FOR AC REFERENCE AND STORE JOBEXM\r
1385         HRRZ UUO,TAC1           ;IGNORE LH\r
1386         HRLI UUO,PROG   ;SET TO RELOCATE\r
1387         PUSHJ PDP,GETWRD        ;GET WORD FROM LOW OR HIGH SEG\r
1388         JRST ECOMA              ;ERROR, OUT OF BOUNDS\r
1389         PUSH PDP,TAC            ;SAVE CONTENTS OF LOC TO BE PRINTED\r
1390         HRRZ TAC,JOBEXM(JDAT)   ;PRINT LOC BEING EXAMINED\r
1391         PUSHJ PDP,OCTPNT\r
1392         PUSHJ PDP,INLMES        ;PRINT SLASH TAB\r
1393         ASCIZ */        *\r
1394         HLRZ TAC,(PDP)          ;PRINT LEFT HALF\r
1395         PUSHJ PDP,OCTPNT\r
1396         PUSHJ PDP,INLMES        ;PRINT SPACE\r
1397         ASCIZ / /\r
1398         HRRZ TAC,(PDP)          ;PRINT RIGHT HALF\r
1399         PUSHJ PDP,OCTPNT\r
1400         PUSHJ PDP,INLMES        ;PRINT FINAL TAB\r
1401         ASCIZ / /\r
1402         JRST TPOPJ              ;POP PDP,TAC,POPJ PDP,\r
1403 \f\r
1404 ;"DEPOSIT LH RH LOC" - DEPOSITS XWD LH,RH IN LOCATION LOC\r
1405 ;IF LOC IS MISSING. ASSUME NEXT LOC IF PREVIOUS D, SAME LOC IF PREVIOUS E\r
1406 \r
1407 EXTERNAL JOBEXM,JOBPFI\r
1408 \r
1409 DCOM:   PUSHJ PDP,OCTIN         ;GET LH\r
1410         JRST NOTENF             ;NOT ENOUGH ARGUMENTS\r
1411         JRST COMERA             ;ILLEGAL CHARACTER\r
1412         HRLM TAC1,IOS           ;SAVE LH\r
1413         PUSHJ PDP,OCTIN         ;GET RH\r
1414         JRST NOTENF             ;NOT ENOUGH ARGUMENTS\r
1415         JRST COMERA             ;ILLEGAL CHARACTER\r
1416         HRRM TAC1,IOS           ;SVE RH\r
1417         SKIPL JOBEXM(JDAT)      ;WAS PREVIOUS D OR E AN E COMMAND?\r
1418                         ; LH=-1 IF E, LH=0 IF D\r
1419         AOS JOBEXM(JDAT)        ;NO, INCREMENT IN CASE USER TYPED NOT THIRD ARG\r
1420                         ; FOR SUCCESSIVE D'S\r
1421         HRRZS JOBEXM(JDAT)      ;FLAG THAT A D WASDONE LAST(LH=0)\r
1422         PUSHJ PDP,OCTIN         ;GET LOC\r
1423         SKIPA TAC1,JOBEXM(JDAT) ;NOT SPECIFIED, USE LAST OF E OR NEXT OF D\r
1424         JRST COMERA             ;ILLEGAL CHARACTER\r
1425 IFN FT2REL,<\r
1426         EXTERN CHKMED\r
1427         PUSHJ PDP,CHKMED        ;CHECK TO SEE IF HIGH SEG IS SHARABLE\r
1428                                 ; IF YES, SET USER-MODE WRITE PROTECT (UWP) ON\r
1429                                 ; FOR THIS USER, AND SET MEDDLE FOR THIS USER\r
1430                                 ; SO HE CANNOT TURN UWP OFF\r
1431 >\r
1432         TRNN TAC1,777760        ;IN USER ACS\r
1433         JRST DCOM1              ;YES\r
1434         HLRZ TAC,PROG           ;GET PROTECTION\r
1435         CAILE TAC1,JOBPFI       ;NO, GREATER THAN HIGHEST LOC, PROTECTED\r
1436                                 ; FROM IO IN JOB DATA AREA?\r
1437         CAMLE TAC1,TAC          ;IN BOUNDS?\r
1438         JRST DCOMA              ;NO\r
1439 DCOM1:  PUSHJ PDP,DEAT          ;CHECK FOR AC REFERENCE\r
1440         HRLI TAC1,PROG          ;SET FOR RELOCATION\r
1441         MOVEM IOS,@TAC1 \r
1442         POPJ PDP,\r
1443 \r
1444 \r
1445 \fDEAT:  TLZ TAC1,-1             ;CLEAR LH IN CASE THIS IS A SUCCESSIVE E WITH NO ARG\r
1446         HRRM TAC1,JOBEXM(JDAT)  ;STORE FOR NEXT TIME, DO NOT TOUCH LH(D OR E LAST)\r
1447                                 ; YES, WAS JOB STOPPED IN USER MODE?\r
1448         CAIL TAC1,20            ;IS IT AN AC?\r
1449         POPJ PDP,               ;NO\r
1450         MOVE TAC,JOBPC(JDAT)\r
1451         TLNE TAC,USRMOD         ;USER MODE?\r
1452         ADDI TAC1,20            ;YES USER ACS ARE AT 20 INSTEAD OF 0\r
1453 \r
1454 DCOMA:\r
1455 IFN FT2REL,<\r
1456         EXTERN HGHDEP\r
1457         PUSHJ PDP,HGHDEP        ;IS IT IN BOUNDS AND ALLOWED IN HIGH SEG?\r
1458         JRST ECOMA              ;NO, PRINT "OUT OF BOUNDS"\r
1459         POPJ PDP,               ;YES, IOS DEPOSITED, AND JOBEXM UPDATED\r
1460 >\r
1461 ECOMA:  JSP TAC,ERRMES  ;OUT OF BOUNDS\r
1462         ASCIZ /OUT OF BOUNDS\r
1463 /\r
1464 >\r
1465 \fIFN FTLOGIN,<\r
1466 ;"SCHEDULE OCTN" - SETS RH OF STATES TO OCTN, IF TYPED FROM\r
1467 ; THE OPERATOR CONSOLE (C(DEVOPR)), OTHERWISE ILLEGAL\r
1468 ;"SCHEDULE" WITH NO ARGUMENTS TYPES OUT RH OF STATES, LEGAL FOR ALL.\r
1469 \r
1470         EXTERN DEVOPR,STATES,OCTPNT\r
1471 \r
1472 SKEDUL: PUSHJ   PDP,OCTIN       ;GET THE ARGUMENT IF ANY\r
1473         JRST    SKED1           ;NO ARGUMENT\r
1474         JRST    COMERA          ;BAD SYNTAX IN OCTAL NUMBER\r
1475         MOVE    TAC,DEVNAM(DEVDAT) ;AN ARGUMENT. IS THIS THE OPR?\r
1476         CAME    TAC,DEVOPR\r
1477         JRST    COMERR          ;NO, THIS IS ILLEGAL, THEN.\r
1478         HRRM    TAC1,STATES     ;YES. STORE ARGUMENT IN RH OF STATES\r
1479         POPJ    PDP,0           ;RETURN\r
1480 \r
1481 SKED1:  HRRZ    TAC,STATES      ;SCHEDULE WITH NO ARGUMENTS.\r
1482         PUSHJ   PDP,OCTPNT      ;PRINT RH OF STATES.\r
1483         JRST    CRLF            ;AND RETURN WITH A CRLF\r
1484 >\r
1485 ;"BLANK" OR NO ALPHA NUMERIC BEFORE BREAK CHAR COMMAND\r
1486 ;DISPATCHED TO LIKE ANY OTHER COMMAND(0 IN COMMAND TABLE)\r
1487 \r
1488 CBLANK:\r
1489 IFE FTTTYSER,<\r
1490         LDB     TEM,TAC         ;GET BREAK CHARACTER\r
1491         CAIE    TEM,15          ;IS IT A CR\r
1492 >\r
1493 IFN FTTTYSER,<\r
1494         CAIE    TEM,12          ;WAS BREAK A LF\r
1495 >\r
1496         CAIN TEM,";"            ;NO, IS IT SEMI COLON(MONITOR COMMENT)\r
1497         POPJ PDP,               ;YES, IGNORE\r
1498                                 ; FALL IN UNKNOWN COMMAND\r
1499 \r
1500 ;COMMAND NOT IN COMMAND DICECTORY\r
1501 \r
1502 NOCOM:  JRST COMERR     ;NO, APPEND ? TO WHAT HE TYPED IN\r
1503 \fIFN FTFINISH,<\r
1504 ; "FINISH DEVICE" - CLOSES,RELEASE AND DESASSIGNS DEVICE\r
1505 ;JOB MUST HAVE CORE\r
1506 \r
1507         EXTERNAL USRJDA,PUUOAC,JOB,USRHCU,JOBFDV,SYSTAP\r
1508 CFINI:  PUSHJ PDP,CTEXT1        ;GET DEVICE NAME\r
1509         JUMPE TAC1,NOTENF       ;NOT ENOUGH ARG. IF NONE\r
1510         SKIPA TAC,TAC1          ;SEARCH FOR SIXBIT DEVICE NAME\r
1511 CFINS:  MOVE TAC,SYSTAP         ;HERE ON CONTROL C ON SYSTEM TAPE USER\r
1512                                 ; DO A FINISH SYS COMMAND FOR HIM\r
1513         PUSHJ PDP,DEVSRC        \r
1514         JRST NOTDEV             ;PRINT NOT A DEVICE\r
1515         HRRZM DEVDAT,JOBFDV(JDAT)       ;STORE DDB ADR. IN JOB DATA AREA\r
1516         MOVE DEVDAT,-2(PDP)\r
1517         JSP TAC1, MSTART        ;SETUP MONITOR JOB AND RETURN\r
1518                                 ; RETURN HERE AT UUO LEVEL WHEN SCHEDULED\r
1519         JSP TAC,MONSTR          ;SETUP ACS,PROG,JDAT,PDP\r
1520         MOVE UCHN,USRHCU        ;HIGHEST USER IO CHANNEL IN USE\r
1521 FDV1:   HRRZ DEVDAT,USRJDA(UCHN)        ;GET NEXT DEVICE\r
1522         MOVSI UUO,071000        ;SETUP RELEASE UUO\r
1523         DPB UCHN,PUUOAC         ;WITH CHANNEL NO.\r
1524         PUSH PDP,UCHN\r
1525         CAMN DEVDAT,JOBFDV(JDAT)        ;IS THIS DEV. THE ONE TO RELEASE?\r
1526         XCT UUO                 ;YES, RELEASE IT(AND CLOSE)\r
1527         POP PDP,UCHN\r
1528         SOJGE UCHN,FDV1         ;FINISHED?\r
1529         MOVE ITEM,JOB           ;GET JOB NUMBER\r
1530         MOVE DEVDAT,JOBFDV(JDAT)        ;RESET DEVDAT\r
1531         PUSHJ PDP,DEASG         ;DEASSIGN DEVICE\r
1532         JFCL                    ;IGNORE IF NOT ASSIGNED BY CONSOLE\r
1533         JRST ESTOP              ;STOP JOB SO HE CANNOT CONTINUE\r
1534 >\r
1535 \fIFN FTTIME,<\r
1536 ;"RESOURCES" - PRINT OUT AVAILABLE DEVICES AND FREE BLOCKS ON THE DISK\r
1537 \r
1538 EXTERNAL DEVLST\r
1539 \r
1540 FREDEV:\r
1541 IFN     FTDISK, <\r
1542 EXTERNAL        SATENT,SATXWD,WLBIT,SENTSZ,NUMBIT\r
1543 \r
1544         XOR TAC,TAC             ;INITIALIZE COUNTER\r
1545         HLRE    T2,SATXWD       ;SET INDEX WITH NUMBER OF SAT BLOCKS IN EXISTENCE,\r
1546         MOVNS   T2\r
1547         HRRI T1,SATENT          ;GET SATENT ENTRY POINTER\r
1548 LOP05:  HRRZ TAC1,0(T1)         ;GET VALUE\r
1549         TRNE    TAC1,WLBIT      ;IS THIS SPACE WRITE PROTECTED?\r
1550         JRST    LOP06           ;YES, NO FREE BLOCKS IN THE SAT BLOCK.\r
1551         ADDI    TAC,NUMBIT      ;NO, ADD THE FOLLOWING QUANTITY IN THIS SAT\r
1552         SUB     TAC,TAC1        ; RUNNING TOTAL: (TOTAL BLOCKS IN THIS SAT\r
1553                                 ; BLOCK) - (BLOCKS ALREADY IN USE).\r
1554 LOP06:  ADDI T1,SENTSZ          ;BUMP POINTER\r
1555         SOJN T2,LOP05           ;DECREMENT INDEX\r
1556         PUSHJ PDP,RADX10        ;CONVERT TO DECIMAL\r
1557         PUSHJ   PDP,INLMES      ;PRINT\r
1558         ASCIZ /. BLKS/\r
1559 >\r
1560 \r
1561         HRLZ T,DEVLST           ;GET DDB POINTER\r
1562         MOVEI AC2,0             ;SET DEVICE NAME 0 FOR FIRST COMPARE\r
1563 LOP01:  MOVE T1,DEVMOD(T)       ;DEVICE CHARACTERISTICS\r
1564         TRNN T1,ASSCON!ASSPRG   ;DEVICE ASSIGNED BY CONSOLE OR PROGRAM?\r
1565         TLNE T1,DVTTY!DVDSK     ;NO, IS IT A TTY OR DSK?\r
1566         JRST LOP02              ;YES DO NOT PRINT\r
1567 IFE FTDISK,<\r
1568         JUMPE AC2,LOP018        ;SUPPRESS LEADING COMMA IF NO DISK\r
1569 >\r
1570         PUSHJ PDP,INLMES        ;PRINT ,(INSTEAD OF CRLF SO WILL FIT IN 1 BUFFER)\r
1571         ASCIZ /,/\r
1572 LOP018: MOVS AC1,DEVNAM(T)      ;GET DEVICE NAME\r
1573         HLLZ TAC1,AC1           ;ASSUME SAME TYPE AS LAST ONE, PRINT\r
1574                                 ; ONLY RH OF NAME (UNIT NUMBER)\r
1575         CAIN AC2,0(AC1)         ;IS IT REALLY THE SAME?\r
1576         JRST LOP01A             ;YES. PRINT THE UNIT NUMBER,\r
1577         MOVS TAC1,AC1           ;NO. MUST PRINT WHOLE NAME,\r
1578         HRRZ AC2,AC1            ; AND GET THE NEW DEVICE IN FLAG AC.\r
1579 LOP01A: PUSHJ PDP,PRNAME        ;AS BEING FREE\r
1580 LOP02:  HLRZ T,DEVSER(T)        ;GET NEXT DEVICE IN CHAIN\r
1581         JUMPN T,LOP01           ;IS THERE ONE?\r
1582         JRST CRLF               ;NO. DONE, PRINT CR. LF AND THEN POPJ\r
1583 >\r
1584 \fEXTERNAL CPOPJ,STUSER\r
1585 ;ROUTINE TO CHECK FOR ACTIVE DEVICES\r
1586 ;NEVER GET HERE DURING SWAP IN OU OUT\r
1587 ;SINCE COMMAND TABLE SHOULD AHVE NOTRAN BIT ON\r
1588 \r
1589 RUNCHK: CAMN ITEM,STUSER        ;SYSTEM TAPE USER?\r
1590         JRST DLYCM1             ;YES. DELY,BUT DO NOT STOP JOB\r
1591 ACTCHK: JUMPE PROG,ACTCH1       ;DOES JOB HAVE CORE IN MEMORY\r
1592         PUSHJ PDP,ANYACT        ;YES. ARE DEVICES ACTIVE?\r
1593         JRST DLYCM              ;YES. DELAY COMMAND.\r
1594 ACTCH1: MOVE TAC1,-1(PDP)       ;RESTORE COMMAND DISPATCH ADDRESS\r
1595         MOVE DEVDAT,-2(PDP)     ;RESTORE TTY DDB ADDRESS\r
1596         MOVE T,JBTSTS(ITEM)     ;RESTORE JOB STATUS\r
1597 CONTC1: POPJ PDP,COM0\r
1598 \r
1599 ;ROUTINE TO DELAY A COMMAND\r
1600 \r
1601 ;DELAYS COMMAND TO BE EXECUTED WHEN JOB IN CORE MEMORY\r
1602 ;AND CAUSE JOB TO BE SWAPPED IN(COMMAND WAIT BIT IS SET IN JBSTS)\r
1603 ;AND POPD LEVEL UP ONE.\r
1604 \r
1605 EXTERNAL TTYCM,LINSAV\r
1606 \r
1607 DLYCM:  PUSHJ   PDP,DLYCOM      ;SET COMMAND WAIT BIT IN JOB STATUS AND PUT\r
1608                                 ; JOB IN COMMAND WAIT QUEUE\r
1609                                 ; SO JOB IS NOT RUNNABLE ANY MORE\r
1610 ;ROUTINE TO DELAY A COMMAND IF A SWAP OUT OR IN IS IN PROGRESS\r
1611 ;DIFFERS FROM DLYCM IN THAT JOB IS NOT MADE TO BE SWAPPED IN\r
1612 ;REQUIRES OR DELYAING COMMAND IF SYSTEM\r
1613 ;TAPE USER TYPOES ^C (HALT COMMAND)\r
1614 \r
1615 DLYCM1: POP     PDP,TAC\r
1616         POP     PDP,TAC1\r
1617         POP     PDP,TAC1\r
1618         PUSH    PDP,CONTC1\r
1619         MOVE    TAC1,LINSAV\r
1620         JRST    TTYCM\r
1621 \f\r
1622 IFN FTDISK,<\r
1623 ;SEARCH DEVICE CHAIN FOR DSK WITH COUNTS ON\r
1624 ;CALL   MOVE ITEM,JOB NO\r
1625 ;       PUSHJ PDP,STOPCK\r
1626 ;       CAN'T STOP RETURN\r
1627 ;       OK TO STOP RETURN\r
1628 \r
1629 EXTERNAL DSKDDB,DSKFGS,CPOPJ1\r
1630 \r
1631 STOPCK: MOVEI DEVDAT,DSKDDB\r
1632         MOVSI TAC1,DSKFGS\r
1633 STOPD:  LDB TAC,PJOBN\r
1634         CAIE ITEM,(TAC)         ;ASSIGNED TO THIS JOB?\r
1635         JRST STOPC              ;NO\r
1636         TDNE TAC1,DEVIOS(DEVDAT)        ;YES. FLAG ON?\r
1637         JRST CPOPJ              ;YES. DELAY\r
1638 STOPC:  HLRZ DEVDAT,DEVSER(DEVDAT)\r
1639         MOVSI TAC,446353\r
1640 \r
1641         CAMN TAC,DEVNAM(DEVDAT)\r
1642         JRST STOPD\r
1643         JRST CPOPJ1             ;OK TO STOP\r
1644 >\r
1645 \fSUBTTL COMCSS - COMMON COMMAND SUBROUTINES\r
1646 \r
1647 ;ROUTINE TO RETURN NEXT ALPHANUMERIC STRING\r
1648 ; IN COMMAND LINE (SIXBIT)\r
1649 ;CALL:  MOVE TAC,BYTE POINTER TO PREVIOUS CHAR.\r
1650 ;       PUSHJ PDP, CTEXT\r
1651 ; SIXBIT STRING RETURN LEFT JUSTIFIED IN AC TAC1\r
1652 \r
1653 INTERNAL CTEXT\r
1654 INTERNAL CTEXT1\r
1655 \r
1656 T=BUFPNT                        ;TEMPORARY AC'S\r
1657 T1=BUFWRD\r
1658 T2=UUO\r
1659 \r
1660 CTEXT:  PUSHJ   PDP,SKIPS       ;CALL HERE IF AT START OF LINE\r
1661         SKIPA\r
1662 \r
1663 CTEXT1: PUSHJ PDP,SKIPS1                ;SKIP LEAD SPACES,TABS,NULLS AND CLEAR TAC1\r
1664                                 ; DO NOT RETURN IF CR WAS PERVIOUS BREAK\r
1665         MOVE T,[POINT 6,TAC1]\r
1666 IFE FTTTYSER,<\r
1667         LDB     TEM,TAC\r
1668         JRST CTEX1\r
1669 CTEX0:  ILDB    TEM,TAC\r
1670 >\r
1671 IFN FTTTYSER,<\r
1672 EXTERN TAKR,GETCHR\r
1673         LDB     TEM,TAKR(DAT)   ;GET LAST CHAR.\r
1674         JRST    CTEX1\r
1675 CTEX0:  PUSHJ   PDP,GETCHR      ;ROUTINE IN SCNSER TO PICK UP CHAR.\r
1676 >\r
1677 \r
1678 CTEX1:  PUSHJ PDP, CTEX         ;IS IT ALPHANUMERIC\r
1679         TRC TEM,40              ;CONVERT TO SIXBIT\r
1680         TLNE    T,770000        ;SIX CHARS YET?\r
1681         IDPB    TEM,T   ;NO. BUILD WORD \r
1682         JRST CTEX0      ;LOOP FOR MORE\r
1683 \f;SCAN FOR ALPHANUMERIC CHAR IN TEM\r
1684 CTEX:   CAILE   TEM,"Z"+40      ;GREATER THAN LC Z?\r
1685         JRST    CTEXA           ;YES. NOT SIXBIT.\r
1686         CAIL    TEM,"A"+40      ;LOWER CASE LETTER?\r
1687         TRZ     TEM,40          ;YES. MAKE UPPER CASE.\r
1688         CAIL TEM, "0"\r
1689         CAILE TEM, "Z"  ;LETTERS ARE LARGER THEN NOS.\r
1690         JRST CTEXA      ;NEITHER\r
1691         CAILE TEM,"9"\r
1692         CAIL TEM,"A"\r
1693         POPJ PDP,       ;LETTER OR NUMBER RETURN\r
1694 CTEXA:  IFE FTTTYSER,<\r
1695         POP     PDP,T1  ;REDUCE PDP BY 1 LEVEL\r
1696         POPJ    PDP,    ;AND RETURN\r
1697 >\r
1698 IFN FTTTYSER,<\r
1699         CAIN    TEM,":"         ;DEVICE NAME?\r
1700         PUSHJ   PDP,GETCHR      ;YES. SKIP COLON\r
1701         CAIE    TEM,3   ;CONTROL C?\r
1702 \r
1703         JRST    TPOPJ   ;NO. RETURN ONE LEVEL UP\r
1704 CTXCNC: MOVSI   TAC1,(SIXBIT /HAL/)     ;MAKE PHONY HALT COMMAND\r
1705         MOVSI   TEM,12  ;WITH LF FOR TERMINATION\r
1706         JRST    TPOPJ   ;AND RETURN UP A LEVEL\r
1707 >\r
1708 \f;ROUTINE TO IGNORE LEADING SPACES, TABS, AND NULLS\r
1709 ;ALSO CLEARS TAC1\r
1710 ;DOES NOT RETURN IF PREVIOUS CHAR. OR NEXT NON-SPACING\r
1711 ;CHAR, IS CR(IE POPS SUBROUTINE LEVEL UP 1 ON RETURN)\r
1712 ;CALL:  MOVE TAC,BYTE POINTER TO PREVIOUS BREAK CHAR.\r
1713 ;       PUSHJ PDP, SKIPS1\r
1714 \r
1715 INTERNAL SKIPS1,SKIPS\r
1716 \r
1717 IFE FTTTYSER,<\r
1718 SKIPS1:\r
1719 SKIPS:  MOVEI TAC1,0    ;CLEAR TAC1\r
1720         LDB TEM,TAC     ;WAS PRECEDING BREAK A CR?\r
1721         CAIN TEM,15\r
1722         JRST SKIPS2     ;YES. POP SUB. LEVEL UP 1\r
1723 SKIPSA:\r
1724         ILDB    TEM,TAC\r
1725         JUMPE TEM,SKIPSA        ;NULL?\r
1726         CAIE TEM," "    ;SPACE?\r
1727         CAIN TEM, 11\r
1728         JRST SKIPSA\r
1729         CAIN TEM,15     ;CR?\r
1730 SKIPS2: POP PDP,T       ;YES. POP SUB. LEVEL UP ONE\r
1731 >\r
1732 IFN FTTTYSER,<  EXTERNAL GETCHR,SPCHEK,BREAKB,TAKR\r
1733 \r
1734 SKIPS:  PUSHJ   PDP,GETCHR      ;GET FIRST CHAR ON LINE\r
1735 SKIPS1: MOVEI   TAC1,0  ;FOR CTEXT, DECIN\r
1736         LDB     TEM,TAKR(DAT)   ;IN CASE TEM CLOBBERED\r
1737         CAIN    TEM,15  ;SKIP TO LF IF CR\r
1738 SKIPSA: PUSHJ   PDP,GETCHR      ;NEXT CHARACTER\r
1739         JUMPE   TEM,SKIPS3      ;POP UP A LEVEL IF NO CHARS\r
1740         PUSHJ   PDP,SPCHEK      ;SPECIAL?\r
1741         JRST    SKIPS2  ;NO\r
1742         TLNE    TAC,BREAKB      ;BREAK?(END OF LINE)\r
1743         JRST    SKIPS3  ;YES. POP UP RETURN\r
1744 SKIPS2: CAIG    TEM,40  ;SPACE OR CONTROL CHAR?\r
1745         JRST    SKIPSA  ;YES.\r
1746         POPJ    PDP,Z   ;NO. RETURN\r
1747 SKIPS3: CAIN    TEM,3   ;^C?\r
1748         JRST    CTXCNC  ;HANDLE IT\r
1749         MOVEI   TEM,12  ;FOR BREAK CONSISTENCY\r
1750         JRST    TPOPJ   ;RETURN ONE LEVEL UP\r
1751 >\r
1752 \f;ROUTINE TO APPEND A "?" TO INPUT STRING AND SET AS OUTPUT\r
1753 ;CALLED FROM OCTIN, RETURNS TO SECOND LEVEL ON PDL\r
1754 ;CALL:  MOVE TAC, BYTE POINTER TO LAST CHAR. IN INPUT STRING\r
1755 ;       PUSHJ PDP, COMERA\r
1756 \r
1757 INTERNAL COMERA,COMERP\r
1758 \r
1759 COMERP: POP     PDP,T           ;REMOVE SUB. RETURN BEFORE CALLING COMERA\r
1760 COMERA: IFE FTTTYSER,<  IBP     TAC>\r
1761         IFN FTTTYSER,<  PUSHJ   PDP,GETCHR>     ;MOVE UP, A CH\r
1762 \r
1763 ;ROUTINE TO REPLACE LAST CHARACTER IN INPUT STRING BY "?"\r
1764 ;AND SET AS OUTPUT\r
1765 ;CALL:  MOVE TAC, BYTE POINTER TO LAST CHAR. IN INPUT STRING\r
1766 ;       PUSHJ PDP, COMERR\r
1767 \r
1768 INTERNAL COMERR\r
1769 \r
1770 \r
1771 COMERR:\r
1772 IFN FTTTYSER,<\r
1773 EXTERN OUTCHS,TRESCN,TITAKR,SETBFI,TISYNC\r
1774 \r
1775         MOVE    T,TITAKR(DEVDAT)        ;SAVE POSISITION IN SCAN\r
1776         PUSHJ   PDP,TRESCN      ;BACK UP TO START OF COMMAND\r
1777 COMERL: PUSHJ   PDP,GETCHR      ;GET A CHAR FROM COMMAND\r
1778         CAMN    T,TITAKR(DEVDAT)        ;PASS BAD CHAR YET?\r
1779         JRST    COMER1  ;YES\r
1780         PUSHJ   PDP,OUTCHS      ;NO. TYPE CHAR.\r
1781         JUMPN   TEM,COMERL      ;LOOP IF NOT OUT OF CHARACTERS\r
1782 \r
1783 COMER1: PUSHJ   PDP,SETBFI              ;CLEAR ANY MORE TYPEIN\r
1784         AOS     TISYNC(DEVDAT)  ;THIS WILL BE SOS-ED AT COMRET\r
1785         MOVEI   TEM,"?"         ;APPEND ? TO ERRONEOUS WORD\r
1786         PUSHJ   PDP,OUTCHS\r
1787 >\r
1788 IFE FTTTYSER,<\r
1789         MOVE    DAT,TAC\r
1790         MOVEI   T,"?"           ;STORE ? ON TOP OF BREAK CHAR.\r
1791         DPB     T,DAT\r
1792 >\r
1793         TDZA ITEM,ITEM          ;CLEAR JOB NO. AND SKIP INTO CRLF ROUT.\r
1794 \f;ROUTINE TO PRINT A COMMAND ERROR MESSAGE\r
1795 ;SAME CALL AS CONMES\r
1796 \r
1797 INTERNAL ERRMES\r
1798 \r
1799                                 ; COMERR SKIPS THIS ROUT,(SEE ABOVE)\r
1800 ERRMES: TDZA ITEM,ITEM          ;CLEAR JOB NUMBER TO INDICATE ERROR\r
1801                                 ; SKIP INTO CONMES ROUTINE\r
1802 \r
1803 ;ROUTINE TO PRINT CARRIAGE RETURN-LINE-FEED\r
1804 ;CALL:  MOVE DAT,BYTE POINTER TO OUTPUT\r
1805 ;       PUSHJ PDP,CRLF\r
1806 \r
1807 INTERNAL CRLF\r
1808 \r
1809                                 ; COMERR SKIPS TO HERE(SEE ABOVE)\r
1810 CRLF:   MOVEI TAC,[ASCII /\r
1811 /]\r
1812 \r
1813 ;ROUTINE TO MOVE ASCII CHAR. STRING TO CONSOLE OUTPUT BUFFER\r
1814 ; CALL: MOVE DAT, BYTE POINTER TO LAST OUTPUT CHARACTER\r
1815 ;       MOVEI TAC,  ADDRESS OF ASCII MESSAGE\r
1816 ;       PUSHJ PDP, CONMES\r
1817 ; STRING TERMINATED BY NULL\r
1818 ; CONMES DOES NOT START TTY\r
1819 ;CONMS1 - SAME CALLING SEQUENCE A CONMES,EXCEPT LH IS BYTE POINTER \r
1820 \r
1821 INTERNAL CONMES\r
1822 EXTERNAL TPOPJ\r
1823 \r
1824                                 ; ERRMES SKIPS TO HERE\r
1825 CONMES: HRLI TAC,440700         ;FORM ASCIZ BYTE POINTER\r
1826 CONMS1: PUSH PDP,TAC            ;SAVE BYTE POINTER\r
1827 CON0:   ILDB TEM,(PDP)          ;GET NEXT CHAR.\r
1828         JUMPE TEM,TPOPJ         ;IS IT NULL?(IF YES, DO POP TAC, POPJ)\r
1829 TYOINS:         ;TAG FOR THE TYPE OUT INSTRUCTION\r
1830 CONOUT:                         ;EXECUTED FROM REST OF COMCSS TO OUTPUT CHAR\r
1831 IFN FTTTYSER,<\r
1832 EXTERN OUTCHS\r
1833         PUSHJ   PDP,OUTCHS      ;NO. STORE TTY OUTPUT BUFFER\r
1834 >\r
1835 IFE FTTTYSER,<\r
1836         IDPB    TEM,DAT\r
1837 >\r
1838         JRST CON0               ;KEEP GOING\r
1839 \f;ROUTINE TO PRINT INLINE ASCIZ MESSAGE\r
1840 ;CALL:  PUSHJ PDP,INLMES\r
1841 ;       ASCIZ /THE MESSAGE/\r
1842 ;RETURN TO NEXT LOC AFTER MESSAGE\r
1843 \r
1844 INTERNAL INLMES\r
1845 \r
1846 INLMES: POP PDP,TAC             ;SETUP PRINT ADRESS FOR CONMES\r
1847         PUSHJ PDP,CONMES        \r
1848         JRST 1(TAC)             ;RETURN TO NEXT LOC AFTER MESSAGE\r
1849 \r
1850 ;ROUTINE TO APPEND ? TO ERROR MESSAGE\r
1851 ;CALL   PUSHJ PDP,PRQM\r
1852 ;       RETURN\r
1853 \r
1854 INTERNAL PRQM\r
1855 \r
1856 PRQM:   MOVEI TEM,"?"\r
1857 IFN FTTTYSER,<\r
1858 \r
1859 EXTERN OUTCHS\r
1860         JRST    OUTCHS\r
1861 >\r
1862 IFE FTTTYSER,<\r
1863         IDPB    TEM,DAT\r
1864         POPJ    PDP,\r
1865 >\r
1866 PRSPC:  MOVEI TAC,[ASCIZ /      /]\r
1867         JRST CONMES\r
1868 \f\r
1869 \r
1870 ;ROUTINE TO PRINT "TOO FEW ARGUMENTS"\r
1871 ;CALL:  MOVE DAT,BYTE POINTER\r
1872 ;       PUSHJ PDP,NOTENF\r
1873 \r
1874 INTERNAL NOTENF\r
1875 \r
1876 NOTENF: JSP TAC,ERRMES\r
1877 \r
1878 ASCIZ /TOO FEW ARGUMENTS\r
1879 /\r
1880 \r
1881 ;ROUTINE TO PRINT A PERIOD\r
1882 ;CALL:  PUSHJ PDP,PRPER\r
1883 \r
1884 INTERNAL PRPER\r
1885 \r
1886 PRPER:  JSP TAC,CONMES\r
1887         ASCIZ /./\r
1888 \f\r
1889 ;ROUTINE TO DEASSIGN A DEVICE\r
1890 ;CALL:  MOVE DEVDAT, DEVICE DATA BLOCK\r
1891 ;       MOVE ITEM, JOB NUMBER\r
1892 ;       PUSHJ PDP, DEASG\r
1893 ;       ERROR NOT PREVIOUSLY ASSIGNED\r
1894 ;       OK RETURN WITH DEVICE DEASSIGNED\r
1895 \r
1896 INTERNAL DEASG\r
1897 EXTERNAL PJOBN,CPOPJ1,IPOPJ\r
1898 \r
1899 DEASG:  LDB T, PJOBN            ;WAS DEVICE ASSIGNED TO THIS JOB?\r
1900         CAME T, ITEM\r
1901         POPJ PDP,               ;NO, RETURN\r
1902         PUSH PDP,ITEM           ;SAVE JOB NUMBER\r
1903         MOVSI TAC1,DVDIRI       ;CLEAR DIRECTORY IN CORE BIT\r
1904         ANDCAB TAC1,DEVMOD(DEVDAT)      ;SET DEVICE CHARACTERISTICS FOR TEST\r
1905                                 ; AND ASGHGH\r
1906         SETZM DEVLOG(DEVDAT)    ;CLEAR LOGICAL NAME\r
1907 \r
1908         TRNE TAC1,ASSCON        ;IS DEVICE ASSIGNED BY CONSOLE?\r
1909         AOS -1(PDP)             ;YES, DO OK RETURN\r
1910 IFN FT2REL,<\r
1911         EXTERN ASGHGH\r
1912         PUSHJ PDP,ASGHGH        ;IF DTA OR MTA, CLEAR ANY HIGH SEGMENT NAMES\r
1913                                 ; FROM THIS DEVICE SO NO NEW SHARING\r
1914                                 ; DEVMOD SETUP IN TAC1 ON CALL\r
1915 >\r
1916         MOVEI TAC1,ASSCON       ;SETUP ASSIGNED BE CONSOLE BIT FOR RELEASE\r
1917         PUSHJ PDP,RELEA6        ;CLEAR JOB NO. IN DDB IF DDB NOT NEEDED\r
1918         JRST IPOPJ              ;RESTORE JOB NUMBER AND RETURN\r
1919 \r
1920 ;ROUTINE TO DEASSIGN ALL DEVICES EXCEPT LOGICAL TTY\r
1921 ;CALL:  MOVE ITEM, JOB NUMBER\r
1922 ;       MOVE DEVDAT,ADR. OF DEVICE NOT TO BE DEASSIGNED\r
1923 ;       PUSHJ PDP, DEASTY\r
1924 \r
1925 INTERNAL DEASAL,DEASTY\r
1926 EXTERNAL DEVLST\r
1927 \r
1928 DEASTY:\r
1929 DEASAL: PUSH PDP,DEVDAT         ;SAVE TTY DDB ADDRESS\r
1930         HLRZ DEVDAT,DEVLST      ;SEARCH ALL DDB'S\r
1931 DEA1:   CAIE DEVDAT,@(PDP)      ;IS THIS DEVICE NOT TO BE DEASSIGNED?\r
1932         PUSHJ PDP, DEASG        ;NO, TRY TO DEASSIGN IT\r
1933         JFCL                    ;IGNORE IF CAN'T\r
1934         HLRZ DEVDAT, DEVSER(DEVDAT)\r
1935         JUMPN DEVDAT, DEA1\r
1936         POP PDP,DEVDAT          ;RESTORE TTY DDB ADDRESS\r
1937         POPJ PDP,\r
1938 \f\r
1939 ;ROUTINE TO READ CONSOLE AND CONVERT ANY RADIX NUMBER\r
1940 ; CALL: MOVE TAC1,  DESIRED RADIX\r
1941 ;       MOVE TAC,  BYTE POINTER TO FIRST CHARACTER\r
1942 ;       PUSHJ PDP, ANYRIN\r
1943 ;       NO ARG. TYPED RETURN, TAC1=0\r
1944 ;       ILLEGAL CHARACTER RETURN\r
1945 ;       NORMAL EXIT     TAC TAC1 CONTAINS NUMBER\r
1946 ;SCAN STOPS ON FIRST OR,DASH,SPACE,OR TAB OR ILLEGAL CHAR.\r
1947 ;SKIPS LEADING SPACES AND TABS\r
1948 \r
1949 INTERNAL OCTIN,OCTIN1,DECIN,DECIN1\r
1950 EXTERNAL CPOPJ1,CPOPJ2\r
1951 \r
1952 C=BUFPNT                        ;CHARACTER AC\r
1953 R=BUFWRD                        ;RADIX AC\r
1954 \r
1955 DECIN1:\r
1956 DECIN:  MOVEI R,12              ;DECIMAL INPUT\r
1957         JRST ANYRIN\r
1958 \r
1959 OCTIN1:\r
1960 OCTIN:  MOVEI R,10              ;OCTAL INPUT\r
1961 ANYRIN: PUSHJ PDP,SKIPS1        ;SKIP LEADING SPACES, TABS, NULLS\r
1962                                 ; DO NOT RETURN IF CR WAS PREVIOUS BREAK\r
1963                                 ; OR THIS BREAK\r
1964 IFE FTTTYSER,<  LDB     TEM,TAC>\r
1965 OCT0:   CAIGE TEM,175           ;ALTMODES(175 OR 176)?\r
1966         CAIN TEM,"["            ;NO. LEFT BRACKET(SO SPACE NOT REQ\r
1967                                 ; BEFORE [P,P] IN ATT AND GET COMMANDS.\r
1968         JRST    CPOPJ2  ;YES. SKIP RETURN\r
1969         CAIE TEM,"-"    ;DASH?\r
1970         CAIG    TEM,40  ;SPACE OR CONTROL CHAR?\r
1971         JRST CPOPJ2             ;YES, ONLY LEGAL TERMINATORS\r
1972         CAIE TEM,","            ;COMMA?\r
1973         CAIN TEM,"]"            ;RIGHT BRACKET?\r
1974         JRST CPOPJ2             ;YES.\r
1975         SUBI TEM,60     \r
1976         JUMPL TEM,CPOPJ1                ;ERROR IF NEG.,REMOVE SUB. RETURN AND PRINT\r
1977         CAML TEM, R             ;OR .GE. RADIX\r
1978         JRST CPOPJ1             ;ERROR, GREATER OR EQUAL TO RADIX\r
1979         IMUL TAC1, R\r
1980         ADD TAC1,TEM\r
1981 IFE FTTTYSER,<  ILDB    TEM,TAC ;NEXT CHAR>\r
1982 IFN FTTTYSER,<  PUSHJ   PDP,GETCHR>     ;NEXT CHAR\r
1983         JRST OCT0\r
1984 \fINTERNAL FTLOGIN\r
1985 IFN FTLOGIN,<\r
1986 ;GET PROJECT-PROGRAMMER NUMBERS\r
1987 ;CALL:  MOVE TAC,INPUT BYTE POINTER\r
1988 ;       PUSHJ PDP,PJPGNO\r
1989 ;\r
1990 ;(AC2)LH _ PROJECT NUMBER\r
1991 ;(AC2)RH _ PROGRAMMER NUMBER\r
1992 ;(AC2) = 0 IF NO [ ]'S TYPED\r
1993 ;THE TERMINAL ] IS OPTIONAL\r
1994 \r
1995 IFE FTTTYSER,<\r
1996 PJPGNO: SKIPA   TAC1,TAC        ;SAVE INPUT BYTE POINTER IN CASE NO\r
1997                                 ; [ ]'S WERE TYPED IN.\r
1998 PP0:    IBP     TAC             ;GET NEXT CHARACTER (2ND TIME THRU LOOP)\r
1999         LDB     TEM,TAC         ;GET CHAR WHICH STOPED PREVIOUS FIELD SCAN\r
2000                                 ; (OR NEXT CHAR ON 2ND TIME THRU LOOP)\r
2001 >\r
2002 \r
2003 IFN FTTTYSER,<\r
2004 PP0:    PUSHJ   PDP,SKIPS1\r
2005 PJPGNO:\r
2006 >\r
2007         CAIN    TEM,"["         ;IS IT A "[" ?\r
2008         JRST    PP1             ;YES, GET PROJECT-PROGRAMMER NUMBERS FROM INSIDE.\r
2009         CAIE    TEM," "         ;NO, IS IT A SPACE ?\r
2010         CAIN    TEM,11          ; OR A TAB?\r
2011         JRST    PP0             ;YES, KEEP LOOKING FOR "[".\r
2012         MOVEI   AC2,0           ;NEITHER SPACE NOT TAB, THUS RETURN A 0 MEANING\r
2013                                 ; NO PROJECT-PROGRAMMER NUMBER ENCOUNTERED.\r
2014 IFE FTTTYSER,<  MOVEM   TAC1,TAC        ;RESTORE ORIGINAL BYTE POINTER.>\r
2015         POPJ    PDP,            ;EXIT.......\r
2016 \r
2017 PP1:\r
2018 IFN FTTTYSER,<  PUSHJ   PDP,SKIPS>\r
2019         PUSHJ PDP,OCTIN ;GET FIRST ARG.-PROJ. NO.\r
2020         JRST COMERP             ;NO ARG. GIVEN\r
2021         JRST COMERP             ;ILLEGAL DECIMAL CHARACTER GIVEN\r
2022         HRL AC2,TAC1            ;ENTER\r
2023 IFN FTTTYSER,<  CAIE    TEM,","\r
2024         JRST    COMERP\r
2025         PUSHJ   PDP,SKIPS>\r
2026         PUSHJ PDP,OCTIN         ;GET SECOND ARG.-PROG. NO.\r
2027         JRST COMERP             ;\r
2028         JRST COMERP             ;\r
2029         HRR AC2,TAC1            ;ENTER\r
2030         PUSHJ PDP,SKIPS1        ;SKIP BLANKS\r
2031         CAIN TEM,"]"            ;IS USUAL ENDING A "]"?\r
2032 IFE FTTTYSER,<IBP TAC>          ;YES, SKIP IT\r
2033 IFN FTTTYSER,<PUSHJ PDP,GETCHR> ;YES, SKIP IT SO FINAL ] IS OPTIONAL\r
2034         POPJ PDP,               ;RETURN RO CALL\r
2035 >\r
2036 \f;ROUTINE TO PRINT TIME AS HOURS,MINUTES,SECONDS, AND HUNDRETHS\r
2037 ;FORMAT IS HHMM:SS.HH\r
2038 ;CALL:  MOVE TAC,TIME IN JIFFIES(60THS,50THS OR MILLISECONDS)\r
2039 ;       MOVE DAT,OUTPUT TEXT BYTE POINTER\r
2040 ;       PUSHJ PDP,PRTIME\r
2041 \r
2042 ;SCALEING IS DONE USING THE FOLLOWING GLOBAL SYMBOLS DEFINED\r
2043 ;ON THE CONFIGURATION TAPE (IOINI1)\r
2044 ;THUS ANY INSTALLATION MAY HAVE ANY RATE CLOCK\r
2045 \r
2046 EXTERNAL JIFMIN,JIFSEC,JIFSC2\r
2047 \r
2048 ;JIFMIN=NO. OF JIFFIES(CLOCK TICKS) PER MINUTE\r
2049 ;JIFSEC=NO. OF JIRFIES PER SECOND\r
2050 ;JIFSC2=1/2*JIFSEC(USED FOR ROUNDING)\r
2051 \r
2052 INTERNAL PRTIME\r
2053 \r
2054 PRTIME: IDIVI TAC,JIFMIN        ;FORM MINUTES\r
2055         PUSH PDP,TAC1           ;SAVE REMAINDER IN JIFFIES\r
2056         JUMPE TAC,PR1           ;SUPRESS 0 HOURS IN MINUTES\r
2057         IDIVI TAC,^D60          ;HOURS, MINUTES IN TAC,TAC1\r
2058         JUMPE TAC,PR0           ;SUPPRES 0 HOURS\r
2059         PUSHJ PDP,RADX10\r
2060         PUSHJ PDP,INLMES        ;PRINT "HH:" OR "H:"\r
2061         ASCIZ /:/\r
2062 PR0:    MOVE TAC,TAC1           ;GET MINUTES\r
2063         PUSHJ PDP,PRT2          ;PRINT "MM:"\r
2064         PUSHJ PDP,INLMES\r
2065         ASCIZ /:/\r
2066 PR1:    POP PDP,TAC             ;RESTORE SECONDS(IN JIFFIES)\r
2067         IDIVI TAC,JIFSEC        ;JIFFIES PER SECOND\r
2068         PUSHJ PDP,RADX10        ;PRINT SECONDS\r
2069         PUSHJ PDP,PRPER         ;PRINT PERIOD\r
2070         MOVE TAC,TAC1           ;NO OF JIFFIES(HUNDRETHS)\r
2071         IMULI TAC,^D100         ;CONVERT TO HUNDRETHS\r
2072         IDIVI TAC,JIFSEC\r
2073         CAIL TAC1,JIFSC2        ;ROUND IF GREATER THEN HALF\r
2074         AOS TAC\r
2075         JRST PRT2LF             ;PRINT\r
2076 \fPRTIM1:        IDIVI TAC,JIFMIN        ;\r
2077         IDIVI TAC,^D60          ;HOURS,MINUTES IN TAC,TAC1\r
2078         PUSHJ PDP,PRT2\r
2079         PUSHJ PDP,INLMES        ;PRINT "HH:"\r
2080         ASCIZ /:/\r
2081         MOVE TAC,TAC1\r
2082 PRT2LF: PUSHJ PDP,PRT2          ;PRINT "MM\r
2083         JRST CRLF\r
2084 \r
2085 PRT2:   MOVEI TEM,"0"\r
2086         CAIGE TAC,^D10\r
2087         XCT CONOUT              ;PUT LEADING 0 IF LESS THEN 10\r
2088         JRST RADX10             ;PRINT REST OF NUMBER\r
2089 \f;ROUTINE TO PRINT SIZE OF LOGICAL SEGMENT (LOW OR HIGH)\r
2090 ;CALL:  MOVE ITEM, HIGH OR LOW SEG NUMBER\r
2091 ;       PUSHJ PDP,PRT SEG\r
2092 ;       RETURN\r
2093 ;CALLED AT CLOCK LEVEL FROM CORE (UUO ARG) COMMAND AND SEGCON\r
2094 \r
2095         INTERN PRTSEG\r
2096         EXTERN PCORSZ\r
2097 \r
2098 PRTSEG: PUSHJ PDP,SEGSIZ        ;TAC1=SIZE OF HIGH OR LOW SEG\r
2099         MOVE TAC,TAC1           ;RADX10 WANT DEC. NO. IN TAC\r
2100         JRST RADX10             ;PRINT DECIMAL\r
2101 \r
2102 ;ROUTINE TO RETURN SIZE OF HIGH OR LOW SEG\r
2103 ;CALL:  MOVE ITEM,LOW OR HIGH SEG NUMBER\r
2104 ;       PUSHJ PDP,SEGSIZ\r
2105 ;       RETURN WITH SIZE IN K IN TAC1\r
2106 \r
2107         INTERN SEGSIZ\r
2108         EXTERN CPOPJ\r
2109 \r
2110 SEGSIZ:\r
2111 IFN FTSWAP,<\r
2112         EXTERN IMGIN\r
2113         LDB TAC1,IMGIN          ;SIZE WHEN NEXT SWAPPED IN(IN K)\r
2114         JUMPN TAC1,CPOPJ        ;0 MEANS NOT SWAPPED OUT\r
2115 >\r
2116         HLRZ TAC1,JBTADR(ITEM)  ;SIZE-1 LOW LOW OR HIGH SEG IN WORDS IN CORE\r
2117         JUMPE TAC1,CPOPJ        ;IS IT IN CORE?\r
2118         LSH TAC1,-12            ;YES, CONVERT TO #K-1\r
2119         AOJA TAC1,CPOPJ         ;ADD 1 AND RETURN NUMBER OF K\r
2120 \f;ROUTINE TO ASSIGN A MINIMAL CORE AREA(140 WORDS)\r
2121 ;CALLED FROM CORE,KJOB, AND RUN COMMANDS\r
2122 ;THIS ROUTINE PRESERVES INPUT BYTE POINTER IN TAC\r
2123 ;CALL:  PUSHJ PDP,GETMIN\r
2124 ;       RETURN PROG=0 IF UNSUCCESSFUL OR CORE ASSIGNED ON DISK\r
2125 \r
2126         EXTERN JOBDA,TPOPJ\r
2127 \r
2128 GETMIN:\r
2129 IFE FTTTYSER,<\r
2130         PUSH PDP,TAC    ;SAVE INPUT BYTE POINTER TO COMMAND\r
2131 >\r
2132 IFN FTTTYSER,<\r
2133         PUSH PDP,DEVDAT         ;SAVE TTY DDB ADR\r
2134 >\r
2135         PUSH PDP,TAC1   ;SAVE DEVICE NAME(GET)\r
2136         PUSH PDP,IOS    ;SAVE DISPATCH ADDRESS(ANYACT USES IOS)\r
2137 IFN FT2REL,<\r
2138         EXTERN KILHGH\r
2139 \r
2140         PUSHJ PDP,KILHGH        ;KILL HIGH SEG\r
2141 >\r
2142         MOVEI TAC,JOBDA         ;LENGTH OF JOBDATA AREA\r
2143         PUSHJ PDP,CORE0         ;ASSIGN 140 WORDS ON DISK OR MEMORY\r
2144         JFCL                    ;IGNORE IF CANT(PROG=0)\r
2145         POP PDP,IOS     \r
2146         POP PDP,TAC1            ;RESTORE PUSHED ACS\r
2147 IFN FTTTYSER,<\r
2148         POP PDP,DEVDAT          ;RESTORE TTY DDB ADR\r
2149         POPJ PDP,               ;TAC NOT USER BY FULL DUPLEX SCNSER\r
2150 >\r
2151 IFE FTTTYSER,<\r
2152         JRST TPOPJ              ;RESTORE TAC AND RETURN\r
2153 >\r
2154 \f;ROUTINE TO GET 1 WORD FORM USER ARE WHICH CAN BE IN LOW OR HIGH SEG\r
2155 ;CALL:  MOVE PROG,[XWD PROT,RELOC FOR LOW SEG]\r
2156 ;       MOVE ITEM,JOB NUMBER\r
2157 ;       HRLI UUO,PROG           ;FOR RELOCATION\r
2158 ;       HRR UUO,USER ADDRESS(IE BEFORE RELOCATION)\r
2159 ;       PUSHJ PDP,GETWRD\r
2160 ;       ERROR RETURN ADDRESS OUT OF BOUNDS\r
2161 ;       OK RETURN, CONTENTS IN AC TAC\r
2162 ;CAN BE CALLED AT CLOCK OR UUO LEVEL\r
2163 ;CALLED FROM E COMMAND,INIT,OPEN AND CALL UUOS\r
2164 \r
2165         INTERN GETWRD\r
2166         EXTERN CPOPJ1\r
2167 \r
2168 GETWRD: HLRZ TAC,PROG           ;LARGEST REL LOC IN LOW SEG\r
2169         CAIGE TAC,(UUO)         ;IS ADR. IN LOW SEG?\r
2170 IFN FT2REL,<\r
2171         EXTERN HGHWRD\r
2172         JRST HGHWRD             ;NO, CHECK IF IN HIGH SEG(ERROR RET IF NO)\r
2173 >\r
2174 IFE FT2REL,<\r
2175         POPJ PDP,               ;NO, ERROR RETURN\r
2176 >\r
2177         MOVE TAC,@UUO           ;YES, GET IT FROM LOW SEG\r
2178         JRST CPOPJ1             ;AND SKIP RETURN\r
2179 \fSUBTTL SAVGET - SAVE,GET,R,RUN COMMANDS AND RUN,GETSEG UUOS\r
2180 \r
2181 ;SAVGET LOWER CORE LOCATIONS USED FOR UUOS TO MONITOR\r
2182 ;USED IN SAVGET IN APRSER AND SAVGET IN SEGCON\r
2183 ;THESE LOCATIONS ARE DEFINED TO BE IN THE USERS UUO ACS\r
2184 \r
2185 ;FOR LOOKUP,ENTER UUOS:\r
2186         XP SGANAM,0             ;FILE NAME\r
2187         XP SGAEXT,SGANAM+1      ;FILE EXTENSION\r
2188         XP SGADAT,SGANAM+2      ;FILE CREATION DATE+TIME\r
2189         XP SGALEN,SGANAM+3      ;LN=-LENGTH,RH=FIRST LOC-1 DUMPED\r
2190                                 ; OR PROJECT-PROGRAMMER NUMBER(DISK)\r
2191         XP SGAEND,SGALEN+1      ;LAST WORD OF DUMP COMMAND LIST=0(SAVE AND GET)\r
2192         XP SGAREN,SGAEND        ; ALSO FIRST WORD FOR RENAME USED AS DELETE\r
2193         XP SGAPPN,SGAREN+3      ;FOURTH WORD-PLACE TO SAVE PROJECT-PROGRAMEMR\r
2194                                 ; NUMBER USER TYPED\r
2195 \r
2196 ;FOR OPEN UUOS:\r
2197         XP SGAMOD,10            ;IOS MODE WORD FOR OPEN UUO\r
2198         XP SGADEV,SGAMOD+1      ;DEVICE NAME\r
2199         XP SGAHED,SGAMOD+2      ;INPUT-OUTPUT BUFFER HEADER ADDRESSES=0\r
2200 \r
2201 ;MISC. DATA LOCATIONS:\r
2202 \r
2203         XP SGADMP,13            ;DUMP COMMAND IOWD\r
2204         XP SGACOR,14            ;AC FOR CORE UUO'S(HIGHEST USER LOC DESIRED)\r
2205         XP SGANEW,15            ;NEW CORE ASSIGNMENT AS SPECIFIED BY THIRD ARG\r
2206         XP SGAHGH,16            ;LH=EXT TO USE FOR SAVING HIGH SEG\r
2207                                 ; RH=EXT TO DELETE(IE SHRHGH OR HGHSHR)\r
2208         XP SGALOW,17            ;LH=EXT WHICH USER TYPED FOR SAVE OR GET COMMAND\r
2209                                 ; OR .SAV IF HE DIDN'T TYPE AN ARG WITH LEADING PERIOD\r
2210                                 ; RH=0\r
2211 \f;ROUTINE TO SCAN COMMAND STRING ARGUMENTS FOR SAVE,GET,RUN AND R\r
2212 ;COMAMNDS AND STORE THEM IN JOB DATA AREA WHICH MUST BE IN CORE\r
2213 ;WHEN SGSET IS CALLED FROM COMMAND DECODER\r
2214 ;CALL:  MOVE TAC,INPUT BYTE POINTER\r
2215 ;       MOVE TAC1,SIXBIT DEVICE NAME\r
2216 ;       MOVE DAT,OUTPUT BYTE POINTER\r
2217 ;       MOVE IOS,ADR. OF MONITOR JOB(SAVJOB,GETJOB,RUNJOB)\r
2218 ;       MOVE PROG, ADR. OF JOB AREA\r
2219 ;       PUSHJ PDP,SGSET\r
2220 \r
2221 C=BUFPNT\r
2222 \r
2223 INTERNAL FTLOGIN,FT2REL,FTDISK\r
2224 EXTERNAL JOBCOR,JBTPRG\r
2225 \r
2226 SGSET:  JUMPE TAC1,NOTENF       ;NOT ENOUGH ARE IF NO DEVICE NAME\r
2227         MOVEM TAC1,SGADEV(PROG) ;STORE DEVICE NAME\r
2228         SKIPN  TAC1,JBTPRG(ITEM)        ;GET AUTOMATIC FILENAME, OR\r
2229         PUSHJ PDP, CTEXT1       ;GET FILE NAME FROM COMMAND STRING\r
2230         JUMPE TAC1,NOTENF       ;THERE MUST BE A FILE NAME\r
2231         MOVEM TAC1,SGANAM(PROG) ;STORE FILE NAME\r
2232         MOVEM TAC1,JBTPRG(ITEM) ;SAVE FILE NAME FOR SYSTAT COMMAND\r
2233         MOVEI TAC1,0            ;ASSUME USER DID NOT SPECIFY AN EXTENSION\r
2234                                 ; 0 WILL BE TURNED INTO SAV OR DMP\r
2235 IFE FTTTYSER,<  LDB     TEM,TAC>\r
2236         CAIN    TEM,"." ;IS AN EXTENSION SPECIFIED?\r
2237         PUSHJ PDP,CTEXT ;YES. GET EXTENSION\r
2238         HLLZM TAC1,SGAEXT(PROG) ;STORE IT FOR LOOKUP\r
2239 IFN FT2REL,<\r
2240         EXTERN SETEXT           ;ALSO SAVE IT AGAIN IN SGALOW FOR LOW SEG\r
2241                                 ; LOOKUP OR ENTER\r
2242         PUSHJ PDP,SETEXT        ;SET HIGH EXTENSION(SGAHIGH) TO .SHR IF SSAVE OR GET\r
2243                                 ; .HGH IF SAVE(LH IOS=NSRBIT).\r
2244 >\r
2245         SETZM SGADAT(PROG)      ;SET DATE(E+2) TO 0, SO MONITOR WILL USE TODAYS\r
2246 IFN FTLOGIN,<\r
2247         PUSHJ PDP,PJPGNO        ;GET PROJ, PROG. NO.\r
2248         MOVEM AC2,SGAPPN(PROG)  ;STORE 0 IF NO []'S TYPED BY USER\r
2249 >\r
2250         PUSHJ PDP,DECIN1        ;AMOUNT OF CORE (OPTIONAL THIRD ARG.)\r
2251         JRST SGSET1             ;DOES NOT RETURN IF ERROR. RETURN HERE IF NO ARG.\r
2252         JRST COMERA             ;ILLEGAL CHARACTER\r
2253         LSH TAC,12              ;CONVERT TO HIGHEST REL. LOC.\r
2254         SUBI TAC,1\r
2255 SGSET1: MOVEM TAC1,SGANEW(PROG) ;STORE FOR RUN AND SAVE\r
2256         HRRZ TAC1,IOS           ;SCHEDULE MONITOR JOB   \r
2257                                 ; GUARRANTEE LH OF PC WORD IS 0, SINCE IT WILL\r
2258                                 ; BE ADDED TO STARTING ADDRESS(IF RUN COM)\r
2259         JRST MSTART             ;START JOB WITH PC IN MONITOR MODE\r
2260 \f;ROUTINE TO PICKUP ARGUMENTS FOR RUN AND GETSET UUOS\r
2261 ;THIS ROUTINE DOES SAME THING AS SGSET, EXCEPT THAT ARGUMENTS ARE\r
2262 ;OBTAINED FROM USER UUO ARGUMENTS INSTEAD OF FROM CONSOLE COMMAND\r
2263 ;THE USERS ARG ARE MOVED TO USER ACS(SGA...), THEREBY CLOBBERING HIS AC$S\r
2264 ;USER AC FIELD AND START PC OFFSET(RUN UUO) ARE SAVED ON PD LIST AT JOBPD3\r
2265 ;THEN LOWER CORE IS SET UP(SG2 CALLED) RESET IS NOT DONE (FOR GETSEGUUO)\r
2266 ;JBTPRG NOT SET FOR LOW SET, SINCE GETSEGUUO SHOULD NOT\r
2267 ;CALL:  MOVE TAC,CONTENTS OF USER AC(ADR. OF 3 WORD ARG LIST)\r
2268 ;       MOVE PROG,JOB RELOCATION\r
2269 ;       PUSHJ PDP,GETARG\r
2270 ;       RETURN\r
2271 \r
2272         INTERN GETARG\r
2273         EXTERN JBTPRG,JOBCOR,PUUOAC\r
2274 \r
2275 GETARG: HRR UUO,TAC             ;MOVE ADR. OF ARG LIST TO UUO\r
2276         EXCH TAC,(PDP)          ;AND PUT ON PD LIST\r
2277         PUSH PDP,TAC            ;MOVE RETURN PC UP ONE IN PD LIST\r
2278         LDB TAC,PUUOAC          ;USER AC FIELD IN RUN OF GETSEG UUO\r
2279 \r
2280         HRRM TAC,-1(PDP)        ;SAVE IN CASE OF ERROR RETURN\r
2281         PUSHJ PDP,GETWDU        ;GET FIRST ARG FROM USER AREA\r
2282         MOVEM TAC,SGADEV(PROG)  ;STORE DEVICE NAME\r
2283         PUSHJ PDP,GETWD1        ;GET NEXT ARG FROM USER ARREA\r
2284         MOVEM TAC,SGANAM(PROG)  ;STORE FILE NAME FOR LOOKUP (DO NOT STORE FOR LOWSEG)\r
2285         PUSHJ PDP,GETWD1        ;GET THIRD ARG(EXTENSION WORD E+1)\r
2286         MOVE TAC1,TAC           ;PUT ARG IN TAC1, SO SMAE AS SGSET RETURN FROM CTEXT\r
2287         MOVEM TAC1,SGAEXT(PROG) ;STORE EXTENSION AND RH FROM USER\r
2288 IFN FT2REL,<\r
2289         EXTERN SETEX1\r
2290         PUSHJ PDP,SETEX1        ;SAVE EXT AGAIN IN SGALOW\r
2291                                 ; SETUP EXT FOR HIGH SEG(SGAHGH="SHR")\r
2292                                 ; SETUP EXTENSION FOR LOW SEG(SGALOW="SAV")\r
2293 >\r
2294         PUSHJ PDP,GETWD1        ;GET FOURTH ARG(DATE WORD)\r
2295         MOVEM TAC,SGADAT(PROG)\r
2296         PUSHJ PDP,GETWD1        ;GET FIFTH USER ARG FROM USER AREA\r
2297         MOVEM TAC,SGAPPN(PROG)  ;STORE PROJECT,PROGRAMMER NO. OR 0\r
2298         PUSHJ PDP,GETWD1        ;SIX ARG FROM USER\r
2299         HRRZM TAC,SGANEW(PROG)  ;STORE CORE ARG OR 0(HIGHEST LOC DESIRED)\r
2300                                 ; IGNORE LH\r
2301         JRST SG2A               ;GO SET UP LOWER CORE AND RETURN\r
2302                                 ; DO NOT DO A RESET\r
2303 \f;THIS JOB SAVES A JOB AREA ON RETRIEVABLE STORAGE\r
2304 ;THIS JOB RUNS IN EXEC MODE AND CALLS IO ROUTINES USING REGULAR UUOS\r
2305 ;NO ATTEMPT IS MADE TO SAVE STATUS OF IO DEVICES, JOBDP, OR AC'S\r
2306 ;IN FACT THE ONLY USEFUL THING WHICH MAY BE DONE WITH A JOB AREA\r
2307 ;AFTER IT HAS BEEN SAVED IS TO START EXECUTIUON OVER AT THE STARTING\r
2308 ;ADDRESS\r
2309 \r
2310 INTERNAL SAVJOB,SAVERR\r
2311 EXTERNAL JOB41,JOBS41,JOBDDT,JOBSDD,JOBSV\r
2312 \r
2313 SAVJOB: JSP TAC1,SG1            ;SET UP ACS PROG,PDP,JDAT,ITEM.\r
2314                                 ; RESET DEVICES\r
2315         HLRE TAC1,SGADMP(PROG)  ;-NO. OF WORDS TO WRITE\r
2316         PUSHJ PDP,CKIOWD        ;CHECK USER'S CORE ARG(IF ANY) WITH AMOUNT\r
2317                                 ; RETURN ONLY IF 0 OR NOT SMALLER\r
2318         HRRM TAC,JOBCOR(PROG)   ;STORE MAX OF SIZE OF FILE OR CORE ARG\r
2319                                 ; FOR ASSIGNING INITIAL CORE WHEN FILE GOTTEN\r
2320 IFN FT2REL,<\r
2321         EXTERN SAVHGH\r
2322         PUSHJ PDP,SAVHGH        ;INIT DEV,SAVE HIGH SEG, IF ANY, RETURN IF OK\r
2323         JRST SAVFIN             ;HIGH SAVED, BUT NO DATA IN LOW SEG, SO DO\r
2324                                 ; NOT WRITE LOW FILE\r
2325                                 ; SKIP RETURN IF LOW SEG TO BE WRITTEN\r
2326 >\r
2327                                 ; SGALEN, AND SGAEXT RESTORED\r
2328 SAVJB1: OPEN 0,SGAMOD           ;RE INIT DEVICE, SO UGETF WILL SET FIRST FREE\r
2329                                 ; BLOCK BECAUSE NO LOOKUP OR ENTER DONE\r
2330         JRST SGERRA             ;DEVICE NOT AVAILABLE\r
2331         UGETF 0,SGAHED          ;GET FIRST FREE BLOCK(MEANINGFUL ONLY IF DTA)\r
2332                                 ; CAUSE ENTER TO ASSIGN FIRST LOBCK OF FILE\r
2333                                 ; AS LOWEST FREE BLOCK SO TENDMP CAN READ\r
2334         ENTER 0,SGANAM          ;ENTER FILE NAME IN DIRECTORY\r
2335         JRST SAVERR             ;DIRECTORY FULL OR PROTECTION FAILURE\r
2336         MOVE TAC,JOB41(JDAT)    ;SAVE USER UUO HANDLING JSR\r
2337         MOVEM TAC,JOBS41(JDAT)  ;IN UPPER PART OF JOB DATA AREA\r
2338 \f       MOVE TAC,JOBDDT(JDAT)   ;SAVE DDT STARTING ADDRESS HIGHER UP IN JOB DATA AREA\r
2339         MOVEM TAC,JOBSDD(JDAT)  ;SO COMPRESS ALWAYS MOVES CODE DOWN\r
2340         HRROS USRHCU            ;FLAG THAT SAVE GET IS UNDER WAY\r
2341                                 ; SO THAT JOBHRL WILL NOT BE MODIFIED BY SETHGH RUOTINE\r
2342                                 ; TO USER'S HIGH SEG RELOCATION INFO. SINCE\r
2343                                 ; IT WILL CONTAIN COMPRESSION IOWD.\r
2344                                 ; COMPRESSION WILL ALWAYS MOVE DOWN\r
2345         HRRZ    TEM,JOBSA(JDAT) ;SAV START ADDRESS FOR 10DMP\r
2346         MOVEI   TAC,JOBSV(PROG) ;POINT TO 1ST DATA WORD\r
2347         MOVE    TAC1,[XWD PROG,JOBSDD] ;IT STARTS AT JOBSDD\r
2348         HLRE ITEM,SGADMP(PROG)  ;IOWD FOR THIS SIZE CORE(-LENGTH TO WRITE)\r
2349         MOVNS ITEM              ;POSITIVE LENGTH\r
2350         ADDI ITEM,JOBSVM        ;ADD IN FIRST LOC-1 TO WRITE=HIGHEST LOC TO WRITE\r
2351                                 ; TO MAKE END TEST\r
2352         HRLI    ITEM,PROG               ;USE PROG FOR RELOCATION\r
2353 CMPLP1: MOVEM   TAC,DAT         ;SAVE 1ST LOC FOR IOWD\r
2354         CAMLE   TAC1,ITEM        ;SEARCH FOR 1ST NON-0 WORD\r
2355         AOJA    TAC,CMPTHR        ;THROUGH\r
2356 \r
2357         SKIPN   @TAC1            ;THIS A DATA WORD?\r
2358         AOJA    TAC1,.-3        ;NO, KEEP LOOKING\r
2359         MOVNI   AC1,1           ;YES, AC1 WILL BE AN IOWD\r
2360         HRLI    AC1,-1(TAC1)    ;1ST LOCATION - 1\r
2361 CMPLP2: PUSH    TAC,@TAC1       ;SAVE A DATA WORD\r
2362         AOS     TAC1\r
2363         CAMGE   TAC1,ITEM       ;AT TOP?\r
2364         SKIPN   @TAC1           ;NO. NEXT WORD NON-0?\r
2365         JRST    .+2             ;NO. THROUGH THIS BLOCK\r
2366         SOJA    AC1,CMPLP2      ;COUNT THE WORD AND CHECK NEXT\r
2367         MOVSM   AC1,(DAT)       ;SAVE IOWD IN FRONT OF BLOCK\r
2368         AOJA    TAC,CMPLP1      ;LOOK FOR NEXT NON-0 BLOCK\r
2369 CMPTHR: HRLI    TEM,254000      ;SET A JRST C(JOBSA)\r
2370         MOVEM   TEM,-1(TAC)     ;AT END OF FILE\r
2371         SUBI    TAC,JOBSV(JDAT) ;COMPUTE WORD COUNT\r
2372         MOVNS   TAC             ;MAKE AN IOWD\r
2373         HRL     TAC,SGADMP(PROG) ;START ADDRESS\r
2374         MOVSM   TAC,SGALEN(PROG) ;IOWD FOR THE OUTPUT UUO\r
2375         MOVEI TAC,-2            ;FLAG THAT CORE HAS BEEN COMPRESSED\r
2376         HRLM TAC,USRHCU         ;KEEP LH NEG. COMMAND DECODER WILL EXPAND\r
2377                                 ; CORE ON START ,ODT,SAVE, REENTER,SSAVE IN CASE\r
2378                                 ; THIS SAE IO DOES NOT GO TO COMPLETION. (CONTROL C\r
2379                                 ; OR  DEVICE FULL, SO THAT CORE DOES NOT GET EXPANDED\r
2380 \f       PUSHJ PDP,SGDOA         ;DO OUTPUT,RELEASE,FIND TTY\r
2381         OUTPUT 0,SGALEN         ;OUTPUT UUO EXECUTED BY SGDO\r
2382                                 ; RETURN HERE ONLY IF NO ERRORS\r
2383 SAVFIN: PUSHJ PDP,SGREL         ;RELEASE DEVICE AND FIND TTY\r
2384         JSP TAC,PHOLD           ;PRINT MESSAGE AND STOP JOB\r
2385         ASCIZ /JOB SAVED/\r
2386 SAVERR: MOVEI TAC,PRTERR        ;ERROR CORE IN CASE RUN UUO(PROTECTION ERROR)\r
2387                                 ; CHANGE TO DISK ERROR CODE IF DEV IS DSK\r
2388         PUSHJ PDP,SGRELL        ;CHANGE TO DISK ENTER ERROR CODE IF DSK\r
2389                                 ; RELEASE DEVICE AND RETURN TO USER(IF RUN UUO)\r
2390                                 ; OR FIND TTY=PRINT ?CRLF\r
2391         JSP TAC,PHOLD           ;PRINT MESSAGE AND STOP JOB\r
2392         ASCIZ /DIRECTORY FULL/\r
2393 \f\r
2394 ;THIS JOB GETS A JOB AREA FROM A RETRIEVABLE DEVICE\r
2395 ;THIS JOB RUNS IN EXEC. MODE AND CALLS IO ROUTINES DIRECTLY\r
2396 ;NO ATTEMPT IS MADE TO RESTORE STATUS OF IO DEVICES, PC, OR AC'S\r
2397 ;JOBPC IS SET TO STARTING ADDRESS OF JOB\r
2398 ;CORE MUST ALREADY HAVE BEEN ASSIGNED AND THE FOLLOWING LOC. SETUP IN\r
2399 ;JOB DATA AREA:\r
2400 ;JOBPDP, JOBREL\r
2401 \r
2402 INTERNAL GETJOB\r
2403 \r
2404 GETJOB: JSP TAC1,SG1            ;SETUP ACS, SETUP LOWER CORE(SGALEN,SGADMP)\r
2405         PUSHJ PDP,GETJB         ;GET THE JOB\r
2406         JSP TAC,PHOLD           ;RETURN ONLY IF EVERYTHING OK\r
2407         ASCIZ /JOB SETUP/\r
2408 \r
2409 ;THIS JOB GETS A JOB AREA FROM A RETRIEVAL DEVICE AND STARTS IT UP\r
2410 \r
2411 ;JOB HAS JUST A JOB DATA AREA ASSIGNED WHEN CONTROL GETS HERE\r
2412 ;THIS MONITOR JOB GETS A JOB AREA FROM A RETRIEVABLE DEVICE\r
2413 ;ASSIGNS CORE AND START\r
2414 \r
2415 INTERNAL RUNJOB\r
2416 \r
2417 RUNJOB: JSP TAC1,SG1            ;SETUP ACS, SETUP LOWER CORE(SGALEN,SGADMP)\r
2418         JRST URUN1              ;LH PF PC WORD=0(MSTART) SO LH OF TAC1=0 AFTER JSP\r
2419                                 ; PUT TAC1 AS FIRST ITEM ON PD LIST(JOBPN1)\r
2420                                 ; LH USED BY SGRELE ON ERROR TO SEE IF FROM USER\r
2421                                 ; AND LH ADDED TO START PC(JOBSA) BY URUN\r
2422 \f;RUN UUO\r
2423 ;CALL:  MOVE AC,[XWD N,D]\r
2424 ;       CALL AC,[SIXBIT /RUN/]\r
2425 ;       ERROR RETURN            ;UNLESS LH=HALT(PRINT CONSOLE MESS, IF YES)\r
2426 ;       1K OK, TRANSFER TO C(JOBSA)+N FOR NEW PROGRAM\r
2427 ;       USERS ACS CLOBBERED SO CANNOT PASS DATA TO NEW PROGRAM\r
2428 \r
2429 ;WHERE: D/      DEVICE NAME\r
2430 ;       D+1/    FILE NAME\r
2431 ;       D+2/    FILE EXT OR 0 (LH SIXBIT)\r
2432 ;       D+3/    DATE ETC\r
2433 ;       D+4/    PROJECT,PROGRAMMER NO OR 0(CURRENT UFD OR DTA,MTA)\r
2434 ;       D+5/    HIGHEST LOC DESIRED(OR 0) ANALOGOUS TO RUN COMMAND\r
2435 ;               LH IS IGNORED(RATHER THAN ASSIGNING CORE TO HIGH SEG)\r
2436 \r
2437         INTERN URUN\r
2438         EXTERN JOBSA\r
2439 \r
2440 URUN:   PUSHJ PDP,RESET         ;RELEASE DEVICES\r
2441                                 ; WARNING! THIS GOES VERY DEEP IN\r
2442                                 ; PUSHDOWN, SEE MOD 518\r
2443                                 ; (AC UUO PRESERVED IN RESET)\r
2444         MOVE TAC,@UUO           ;RESTORE CONTENTS OF USERS'S CALLING AC\r
2445         PUSHJ PDP,GETARG        ;GET 6 ARGS FROM USER AND STORE\r
2446                                 ; SAVE STARTING ADDRESS INCREMENT(LH OF TAC)\r
2447                                 ; AND USER AC NUMBER(IN CASE OF ERROR RETURN)\r
2448                                 ; SETUP ACS,DEVDAT TO DDB\r
2449         MOVE TAC,SGANAM(PROG)   ;STORE FILE NAME FOR LOW SEG\r
2450         MOVEM TAC,JBTPRG(ITEM)  ;FOR SYSTAT\r
2451 URUN1:  PUSHJ PDP,GETJB         ;GET BOTH LOW AND HIGH SEGMENTS\r
2452         HLRZ TAC1,(PDP)         ;GET STARTING ADDRESS INCREMENT(0 IF RUN COM)\r
2453 \r
2454 IFN FT2REL,<\r
2455         EXTERN CHKMED\r
2456         CAILE TAC1,1            ;IS START INCREMENT 0 OR 1?\r
2457         PUSHJ PDP,CHKMED        ;NO, CHECK TO SEE IF THIS IS SHARABLE SEG\r
2458                                 ; AND IF YES, SET MEDDLE BIT FOR THIS USER\r
2459                                 ; SO UWP CANNOT BE TURNED OFF AND CORE FOR HIGH SEG\r
2460                                 ; CANNOT BE INCREASED OR DECREASED (TAC1 PRESERVED)\r
2461 >\r
2462         ADDB TAC1,JOBSA(JDAT)   ;ADD STARTING ADDRESS TO BOTH\r
2463                                 ; SO THAT <CONTROL>C START WILL START\r
2464                                 ; PROGRAM AT SAME STARTING ADDRESS\r
2465         HRLI TAC1,USRMOD        ;SET USER MODE BIT IN PC\r
2466         PUSH PDP,TAC1           ;PUT ON PD LIST\r
2467         JRST USRXIT             ;AND GO TO RETURN TO USER AS IF FROM UUO\r
2468 \f;UUO TO GET JUST HIGH SEG AND RETURN TO USER\r
2469 ;CALL IS THE SAME AS FOR RUN UUO EXCEPT THAT OK RETURN IS SKIP RETURN\r
2470 ;IF ERROR RETURN HAS HALT IN LH, STANDARD CONSOLE MESSAGE IS PRINTED AND JOB STOPPED\r
2471 \r
2472         INTERN UGTSEG,UGTERR\r
2473 UGTSEG:\r
2474         \r
2475 IFN FT2REL,<\r
2476         EXTERN UGETHI\r
2477         JRST UGETHI             ;IN SEGCON\r
2478 >\r
2479 UGTERR: MOVEI TAC,ILUERR        ;ILLEGAL UUO ERROR CORE\r
2480         PUSHJ PDP,SGRELE        ;SEE IF USER WANTS ERROR\r
2481         JRST UUOERR             ;NO, PRINT ILLEGAL UUO\r
2482 \f;ROUTINE TO SETUP ACS, RESET IO, AND SETUP LOWER CORE LOCATIONS\r
2483 ;FOR SAVE AND GET(SGALEN SET IO IOWD OR PP IF DTA OR DSK)\r
2484 ;SGADMP SET TO IOWD FOR THIS SIZE CORE\r
2485 ;CALL:  JSP TAC1,SG1\r
2486 ;       ALWAYS RETURN HERE, UNLESS DEVICE NOT FOUND\r
2487 ;       DEVDAT SETUP TO DEVICE DATA BLOCK(BUT NOT INITED, UNLESS FT2REL=0)\r
2488 ;       SO THAT INIT NOT NECESSARTY IF SEG ALREADY KNOWN(NO DTA QUEUING)\r
2489 ;       DEVICE CHARACTERISTICS WORD(DEVMOD) RETURNED IN AC TAC1\r
2490 ;       IF DISK SYSTEM\r
2491 \r
2492         INTERN SG1,SG3,SG4              ;CALLED FROM SEGCON\r
2493         EXTERN USRDDT,USRREL,JOBSAV,JOBFF,CPOPJ1\r
2494         EXTERN TTYFNU,JOBSVM,IADRCK,SAVDMP\r
2495 \r
2496 SG1:    JSP TAC,MONSTR          ;SETUP PROG.PDP,JDAT,ITEM=JOB NUMBER\r
2497                                 ; PUT TAC1 ON END OF PD LIST(EXEC MODE PC,\r
2498                                 ; SO ERROR MESSAGES WILL ALWAYS PRINT(SEE SGRELE)\r
2499 \r
2500 SG2:    PUSHJ PDP,RESET         ;RELEASE ALL DEVICES\r
2501 SG2A:   MOVEI TAC,DR            ;DUMP MODE 16(DUMP BY RECORDS\r
2502                                 ; IN CASE THIS IS MAGTAPE)\r
2503 \r
2504         MOVEM TAC,SGAMOD(PROG)  ;STORE FOR OPEN UUO\r
2505         SETZM SGAEND(PROG)      ;0 END OF DUMPE MODE COMMAND LIST\r
2506         SETZM SGAREN+1(PROG)    ;FOR DELETE\r
2507         SETZM SGAREN+2(PROG)    ;FOR DELETE\r
2508         HLLZS JOBCOR(JDAT)      ;0 THIRD ARG IN JOBDATA AREA(SO CHKARG WILL\r
2509                                 ; WORD ON FIRST CALL(SAVE AND GET)\r
2510         SETZM SGAHED(PROG)      ;CLEAR BUFFER HEADER ARG, FOR OPEN UUO\r
2511 IFE FT2REL,<\r
2512         OPEN 0,SGAMOD           ;TRY TO ASSIGN DEVICE, SINCE IT MUST BE DONE\r
2513 >\r
2514 IFN FT2REL,<\r
2515         MOVE TAC,SGADEV(PROG)   ;PHYSICAL OR LOGICAL DEVICE NAME\r
2516         PUSHJ PDP,DEVSRC        ;FIND DEVICE AND SETUP DEVDAT TO DDB\r
2517                                 ; DO NOT INIT DEV SINCE IO MAY NOT BE NECESSARY\r
2518                                 ; DO NOT WANT TO WAIT IN DTA SYSTEM\r
2519                                 ; TAPE QUEUE IN 10/40 SYS\r
2520 >\r
2521         JRST SGERRA             ;NOT AVAILABLE\r
2522                                 ;DEVICE INITED(OR FOUND)\r
2523 \f;COMMON EXIT FROM SAVHGH AND GETHGH ROUTINES(HIGH SEG SAVE AND GET)\r
2524 ;SO THAT SGA... LOCATIONS ARE RESTOREED TO ORIGINAL VALUES FOR LOW SEG\r
2525 \r
2526 SG3:    MOVE TAC,JOBFF(JDAT)    ;FIRST FREE LOC IN JOB(SET FROM LH OF\r
2527                                 ; JOBSA WHICH IS SET BY LOADER\r
2528         MOVEI TAC,-1(TAC)       ;MAKE LAST LOC TO SAVE OR GET(MAKE 0=777777)\r
2529         SKIPN USRDDT            ;USER DDT IN USE(IF YES, SAVE ALL OF CORE\r
2530                                 ; SO HIS SYMBOLS WILL BE INCLUDED\r
2531         PUSHJ PDP,IADRCK        ;NO, ADDRESS TO SMALL OR TO LARGE?\r
2532         MOVE TAC,USRREL         ;YES, DUMP ALL OF CORE RATHER THEN GIVE\r
2533                                 ; ADDRESS CHECK MESSAGE-HIGHEST REL.ADR.\r
2534         MOVNS TAC               ;-HIGHEST ADR TO SAVE TO GET\r
2535         ADDI TAC,JOBSVM         ;LOWER CORE NOT DUMPED\r
2536         HRLI TAC,JOBSVM         ;IE FIRST LOC-1 TO BE DUMPED\r
2537         MOVSM TAC,SGADMP(PROG)  ;STORE IOWD WORD OF THIS SIZE CORE\r
2538 SG4:\r
2539 IFN FTDISK,<\r
2540         MOVE TAC1,DEVMOD(DEVDAT)        ;RETURN DEVICE CHARACTERISTICS(IF DISK SYS)\r
2541         TLNE TAC1,DVDSK         ;IS THIS DEVICE A DISK?\r
2542 \r
2543         MOVS TAC1,SGAPPN(PROG)  ;YES. MAKE SURE FORTH WORD IS PROJ,PROG NO.\r
2544 >\r
2545         MOVSM TAC,SGALEN(PROG)  ;NO. MAKE SURE FORTH WORD IS IOWD FOR DECTAPE\r
2546                                 ; SINCE DECTAPE USES RH TO COMPUTE LENGTH IN K\r
2547                                 ; FOR BOTH SAVE AND GET\r
2548         SKIPN TAC,SGAEXT(PROG)  ;DID USER SPECIFY AN EXTENSION ?\r
2549         MOVSI TAC,SAVDMP        ;NO, USE .SAV OR .DMP\r
2550         MOVEM TAC,SGAEXT(PROG)  ;AND STORE FOR LOOK UP ORENTER\r
2551         POPJ PDP,\r
2552 \r
2553 ;ERROR ON INIT OR DEVICE SEARCH\r
2554 \r
2555         INTERN SGERRA           ;CALLED FROM SEGCON\r
2556 \r
2557 SGERRA: JUMPE DEVDAT,SGERR1     ;WAS DEVICE FOUND, BUT JUST UNAVAILABLE?\r
2558         MOVEM DEVDAT,(PDP)      ;YES, SAVE DDB ADDRESS FOR MESSAGE(ERNAM)\r
2559         MOVEI TAC,DNAERR        ;ERROR CODE IN CASE RUN UUO(DEVICE NOT AVAILABLE)\r
2560         PUSHJ PDP,SGRELE        ;RETURN TO USER IF RUN UUO\r
2561                                 ; OR FIND TTY AND PRINT ?CRLF\r
2562         PUSHJ PDP,ERNAM         ;PRINT DEVICE NAME USING (PDP)\r
2563         JSP TAC,PHOLD           ;START TTY AND STOP JOB\r
2564         ASCIZ / NOT AVAILABLE/\r
2565 \r
2566 SGERR1: MOVEI TAC,NSDERR        ;ERROR CODE IN CASE RUN UUO(NO SUCH DEVICE)\r
2567         PUSHJ PDP,SGRELE        ;RETURN TO USER IF RUN UUO\r
2568                                 ; OR FIND TTY AND PRINT ?CRLF\r
2569         JSP TAC,PHOLD           ;START TTY AND STOP JOB\r
2570         ASCIZ /NO SUCH DEVICE/\r
2571 \f;ROUTINE TO GET FILE FROM DEVICE(LOW AND/OR HIGH)\r
2572 ;CALL:  ACS JDAT,PROG,PDP,DEVDAT SETUP\r
2573 ;       MOVE ITEM,JOB NUMBER\r
2574 ;       IFN FTDISK,<MOVE TAC1,DEVMOD(DEVDAT)    ;DEVICE CHAR.>\r
2575 ;       PUSHJ PDP,GETJB\r
2576 ;       RETURN ONLY IF EVERYTHING OK\r
2577 \r
2578 EXTERNAL JOBCOR,JOB,CPOPJ,JOBS41,JOB41\r
2579 \r
2580 GETJB:\r
2581 IFN FT2REL,<\r
2582         EXTERN GETHGH\r
2583         PUSHJ PDP,GETHGH        ;SEE IF HIGH SEG ALREADY EXISTS AND BEING SHARED\r
2584                                 ; IF NOT, TRY TO LOOKUP AND READ IN HIGH FILE\r
2585                                 ; IF .SHR DOESN'T EXIST, TRY .HGH, IF NEITHER-SKIP RETURN\r
2586                                 ; TAC1=DEVMOD(DEVDAT) IF DISK(DEV CHAR.)\r
2587         JRST LOWFIN             ;HIGH SEG NOW IN CORE AND NO LOW FILE NEEDED\r
2588                                 ; LOW FILE NEEDED\r
2589                                 ; EITHER BECUASE NOHIGH SEG\r
2590                                 ; ORHIGH SEG ALSO NEEDS LOW FILE\r
2591 >\r
2592         LOOKUP 0,SGANAM         ;LOOKUP LOW SEG FILE(EXT=SAV,DMP OR LOW(IF HIGH SEG\r
2593                                 ; REQUIRES LOW SEG AND USER DID NOT TYPE EXT)\r
2594                                 ; MODE=SAVMOD SO DECTAPE SERVICE WILL RETURN\r
2595                                 ; IOWD IN E+3(TEMPORARY)\r
2596         JRST NOFILE             ;GO PRINT FILE.EXT NOT FOUND\r
2597         HLRE TAC1,SGALEN(PROG)  ;-NO. OF WORDS IN FILE\r
2598         PUSHJ PDP,CKIOWD        ;CHECK USER'S SUPPLIED CORE ARG TO MAKE SURE NOT\r
2599                                 ;TOO SMALL, RETURN LARGER OF FILE SIZE OR CORE ARG\r
2600         PUSHJ PDP,GETCOR        ;OK, TRY TO GET CORE\r
2601         MOVE TAC1,DEVMOD(DEVDAT)        ;DEVICE CHARACTERISTICS\r
2602         MOVNS TAC\r
2603         ADDI TAC,JOBSVM         ;-WORD COUNT FOR ALL USERS CORE\r
2604         TLNE TAC1,DVMTA         ;MAG TAPE?\r
2605         HRLM TAC,SGALEN(PROG)   ;YES, USE USER-SPECIFIED CORE ARGUMENT\r
2606         HRRZS JOBPD1(JDAT)      ;TURN OFF USER MODE PC FLAG IN CASE THIS\r
2607                                 ;IS A RUN UUO,SO ERRORS WILL NOT TRY TO RETURN\r
2608 \r
2609         PUSHJ PDP,SGDO          ;READ IN FILE INTO LOW SEGMENT\r
2610         INPUT 0,SGALEN          ;EXECUTED FROM SGDO\r
2611         MOVE TAC,JOBS41(JDAT)   ;RESTORE USER UUO JSR LOC\r
2612         MOVEM TAC,JOB41(JDAT)   ;SAVED BY SAVE\r
2613 LOWFIN: HRRZ TAC,JOBCOR(JDAT)   ;CORE ARG FROM PREVIOUS SAVE(THIS MONITOR\r
2614                                 ; ALWAYS STORES SOMETHING)\r
2615         SKIP TAC                ;IS THIS AN OLD FORMAT FILE WITH NO CORE ARG TO SAVE?\r
2616         MOVE TAC,USRREL         ;YES, USE ASSIGNMENT MADE WEN LOW FILE READ IN\r
2617         PUSHJ PDP,CKSARG        ;RETURN ONLY IF USER'S SUPLLIED ARG IS 0 OR NOT\r
2618                                 ; SMALLER THAN SAVE CORE ARG. RETURN LARGER\r
2619         PUSHJ PDP,GETCOR        ;TRY TO GET THIS AMOUNT OF CORE\r
2620         MOVE TAC,USRREL         ;HIGHEST LOC ASSIGNED TO LOW SEG\r
2621         HRRM TAC,JOBCOR(JDAT)   ;SET INITIAL CORE ASSIGNMENT IN JOB DATA AREA FOR\r
2622                                 ; USER TO USE TO RESET CORE TO INITIAL SETTING WHEN\r
2623                                 ; PROGRAM IS RESTARTED\r
2624                                 ; FALL INTO SGREL\r
2625 \f;ROUTINE TO EXECUTE DUMP MODE COMMAND LIST SETUP IN SGALEN(R)\r
2626 ;AND CHECK FOR ERRORS. USED ONLY TO READ LOW FILE.\r
2627 ;CALL:  PUSHJ P,SGDO\r
2628 ;       INPUT 0,SGALEN OR OUTPUT 0,SGALEN\r
2629 ;       OK RETURN(NO ERRORS)\r
2630 ;SGDOA CALLED FROM SAVE, IT HAS ALREADY SET LH OF USRHCU=-2\r
2631 ;TO INDICATE CORE IS COMPRESSED\r
2632 \r
2633         EXTERN  USRHCU,USRJDA,JOBSA,JOBDDT,JOBSDD,JOBSD1,JOBSAV,JOBCOR\r
2634         EXTERN  JOBSV,JOBSV3,JOBSVD,JOBSDP\r
2635 \r
2636 SGDO:   HRROS   USRHCU          ;SET LH OF USRCHU-1 AS A FLAG TO INDICATE SAVE GET\r
2637                                 ; LOW FILE IO IN PROGRESS, SO MONITOR WILL\r
2638                                 ; NOT STORE HIGH SEG PROTECTION IN JOBHRL WHICH\r
2639                                 ; HAS IOWD FOR ZERO COMPRESSION\r
2640 SGDOA:  XCT  @(PDP)             ;EXECUTE INPUT OR OUTPUT UUO\r
2641         MOVE    ITEM,JOB                ;READ INTO PROTECTED PART OF JOB DATA AREA\r
2642         PUSHJ   PDP,EXPAND      ;EXPAND CORE IMAGE\r
2643         JRST    ADRERR          ;ADDRESS CHECK, PRINT MESSAGE AND STOP JOB\r
2644         MOVE    TAC1,JOBDDT(PROG) ;COPY DDT STARTING ADR\r
2645         MOVEM   TAC1,USRDDT     ;INTO MONITOR PROTECTED AREA(IN CASE THIS IS GET)\r
2646         SETZM   USRHCU          ;FLAG THAT SAVE-GET IO FINISHED AND CORE EXPANDED\r
2647         AOS (PDP)               ;SKIP OVER UUO IN CALLING SEQUENCE\r
2648 \r
2649 ;ROUTINE TO CHECK FOR IO ERRORS(CALLED FROM SEGCON)\r
2650 ;CALL:  MOVE F,DEVICE DATA BLOCK ADDRESS\r
2651 ;   PUSHJ P,SGIOCK\r
2652 ;   RETURN ONLY IF NO ERRORS\r
2653 \r
2654         INTERN  SGIOCK\r
2655 \r
2656 SGIOCK: MOVE T4,DEVIOS(DEVDAT) ;IO STATUS WORD FOR THIS DEVICE\r
2657         TRNN T4,IOBKTL!IODTER!IODERR!IOIMPM   ;ANY ERRORS ON SAVE-GET DEVICE?\r
2658         POPJ PDP,               ;NO, GIVE OK RETURN\r
2659         MOVEI TAC,TRNERR        ;YES, ERROR CODE IN CASE THIS IS RUN UUO\r
2660                                 ; (TRANSMISSION ERROR)\r
2661         PUSHJ PDP,SGRELE        ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO\r
2662                                 ; OF FIND TTY AND PRINT ?CRLF\r
2663         JSP TAC,PHOLD           ;START TTY AND STOP JOB\r
2664         ASCIZ /TRANSMISSION ERROR/\r
2665 ;ROUTINE TO RELEASE DEVICE AND FIND TTY\r
2666 INTERN SGREL\r
2667 \r
2668 SGREL:  SKIPN   DEVDAT,USRJDA   ;HAS CHANNEL BEEN RELEASED ALREADY?\r
2669         JRST    SGREL2          ;YES, FIND TTY AND WAIT FOR OUTPUT TO FINISH\r
2670         PUSH    PDP,T4          ;NO,\r
2671         MOVE    TAC1,DEVMOD(DEVDAT)\r
2672         TLNE    TAC1,DVMTA      ;MAGTAPE?\r
2673         TLNN    DEVDAT,INPB     ;YES, WAS AN INPUT DONE?\r
2674         JRST    SGREL1          ;NO\r
2675         CLOSE   0,CLSOUT        ;YES, CLOSE MTA INPUT\r
2676         STATO   0,IOTEND+IODEND ;AT END OF APTE?\r
2677         MTAPE   0,16            ;NO SKIP TO EOF\r
2678 SGREL1: RELEASE 0,              ;NO RELEASE DEVICE\r
2679         POP     PDP,T4\r
2680 SGREL2:\r
2681         JRST    TTYFNU          ;FIND TTY FOR CURRENT USER\r
2682 \f;ROUTINE TO EXPAND CORE AFTER A SAVE(LOW SEG ONLY)\r
2683 ;CALL:  MOVE DEVDAT,DEVICE ADR.\r
2684 ;       MOVE PROG,JOBADR.\r
2685 ;       MOVE ITEM,JOB NUMBER\r
2686 ;       PUSHJ PDP,EXPAND\r
2687 ;       ERROR RETURN, ADR, CHECK, OR NEED CORE BUT NOT CURRENT USER(COMMAND\r
2688 ;                       DECODER EXPANDING AFTER USER HAS REDUCED CORE)\r
2689 ;       OK RETURN, CORE EXPANDED\r
2690 ;CALLED FROM SAVE AND COMMAND DECODER\r
2691 ;START,CSTART,DDT,REENTER,SAVE,SSAVE COMMANDS IF CORE STILL COMPRESSED\r
2692 \r
2693 EXPAND: HLRE AC3,SGALEN(PROG)   ;-LENGTH OF FILE\r
2694         MOVNS AC3               ;-LENGTH OF FILE\r
2695         ADDI AC3,JOBSVM         ;ADD FIRST LOC-1 TO FORM HIGHEST LEGAL ADR.\r
2696         HRLI AC3,PROG           ;PUT PROG IN LH FOR COMPARE\r
2697                                 ; AC3 SET FOR ADDRESS CHECKING BELOW\r
2698         SKIPL   TAC,JOBSV(PROG) ;IF FIRST LOC IS POSITIVE\r
2699         JRST    SGDO1           ;OLD FORMAT, SO DONT EXPAND\r
2700         HRRZS   TAC             ;LOOK AT 1ST WORD OF FILE\r
2701         CAILE   TAC,JOBDDT      ;IS IT BELOW JOBJDA?\r
2702         JRST    EXPND1           ;NO. NEW COMPRESSED FORMAT\r
2703         CAIE    TAC,JOBSAV      ;IS JOBDDT THE DATA WORD?\r
2704         JRST EXPND1             ;NO. EXPAND\r
2705         SKIPN JOBSV3(JDAT)      ;IS THE SAVE FILE FROM CONVERT?\r
2706                                 ; CONVERT DOES NOT ZERO COMPRESS\r
2707                                 ; IT JUST WRITES ENTIRE FILE WITHH 1 IOWD IN FRONT\r
2708         SOJA AC3,SGDO1          ;YES, GO BLT DATA DOWN AS IF OLD DISK SAVE FILE\r
2709                                 ; (NON-COMPRESSED)\r
2710         HRROI   TAC,JOBSD1      ;YES. CHANGE TO IOWD 1,JOBSDD\r
2711         EXCH    TAC,JOBSV(PROG) ;ZEP, THE IOWD IS FIXED\r
2712         HLRES TAC               ;WORD COUNT OF IOWD\r
2713         AOJE TAC,EXPND1         ;JUST 1 DATA WORD - THROUGH\r
2714         MOVSI TAC,1(TAC)        ;MAKE IOWD N-2,JOBSAV\r
2715         JUMPE TAC,EXPZ\r
2716         HRRI TAC,JOBSAV         ;SO NEXT DATA WDS WILL BE SKIPPED\r
2717         MOVEI TAC1,JOBSV(PROG)\r
2718         MOVEM TAC,2(TAC1)       ;STORE IN COMPRESSED DATA\r
2719         JRST EXPND1\r
2720 EXPZ:   MOVSI TAC,-2\r
2721         HLLM TAC,JOBSV(PROG)\r
2722 \f;COME HERE TO DO THE ACTUAL EXPANSION OF A FILE\r
2723 EXPND1: MOVE TAC,[XWD PROG,JOBSV] ;IT WAS READ INTO JOBSV\r
2724         MOVE    TAC,@TAC        ;FIRST IOWD\r
2725 EXPLP1: HRRZ    AC1,TAC1        ;ADDRESS OF IOWD\r
2726         CAIGE   AC1,JOBSAV      ;LEGAL?\r
2727         AOJA    AC1,TOOLOW      ;NO. DELETE DATA WHICH IS TO LOW\r
2728         HLRE    AC1,TAC1        ;YES. GET WORDCOUNT\r
2729         MOVNS   AC1             ;+N\r
2730         HRLM    AC1,TAC1        ;CONVERT IOWD TO +N IN LH\r
2731         ADDI    TAC,1(AC1)       ;ADDRESS OF NEXT IOWD.\r
2732         CAMLE   TAC,AC3         ;IN BOUNDS?\r
2733         JRST    SGDOER          ;NO. COMPLAIN\r
2734         ADDI    TAC1,(AC1)      ;YES. CHANGE RH OF IOWD\r
2735         EXCH    TAC1,@TAC       ;MAKE IT XWD +N,A+N-1 AFTER DATA BLOCK\r
2736         JUMPL   TAC1,EXPLP1     ;CONTINUE IF NEXT THING IS AN IOWD\r
2737         PUSH    PDP,TAC         ;SAVE DATA LOCATION\r
2738         HRRZ    TAC,@TAC          ;TOP REAL LOCATION NEEDED\r
2739 \r
2740         TRO     TAC,1777        ;MAKE IT NK-1\r
2741         HLRZ TAC1,PROG          ;PRESENT SIZ OF LOW SEG\r
2742         CAMG TAC,TAC1           ;IS THERE ENOUGH?\r
2743         JRST EXPCOR             ;YES.\r
2744         CAME ITEM,JOB           ;NO, IS TIS THE CURENT JOB?\r
2745         JRST SGDOER             ;NO, GIVE ERRROR RETURN, MUST BE COMMAND DECODER\r
2746                                 ; DOING EXPAND AFTER USER HAS REDUECED CORE\r
2747         PUSHJ   PDP,GETCOR      ;YES. GET IT\r
2748 EXPCOR: POP     PDP,TAC1\r
2749         MOVEI   AC1,@TAC1        ;TOP  DATA LOC\r
2750         HRLI    AC1,1(AC1)      ;SET TO ZERO TO TOP OF CORE\r
2751         HRRI    AC1,2(AC1)\r
2752         SETZM   -1(AC1)\r
2753         HRLI    TAC,PROG        ;RELOCATE TOP LOC OF JOB\r
2754         BLT     AC1,@TAC        ;ZAP, CORE IS 0 FROM HERE ...\r
2755         HRROI   TAC,@TAC1       ;FORM DATA POINTER\r
2756 EXPLP2: HRRZ    AC1,(TAC)       ;TO DATA POINTER\r
2757         ADDI    AC1,(PROG)      ;RELOCATE\r
2758         HLRZ    AC2,(TAC)       ;WORD COUNT\r
2759         SUBI    TAC1,1(AC2)     ;POINT TAC1 TO PREVIOUS IOWD\r
2760         SETZM   (TAC)           ;ZERO THIS IOWD\r
2761         SOSA    TAC             ;POINT TO DATA\r
2762 EXPLP3: SOS     AC1\r
2763         CAIGE AC1,JOBSDD(PROG)  ;DON'T STORE DATA BELOW JOBSDD\r
2764         SOSA TAC\r
2765         POP     TAC,(AC1)       ;MOVE A DATA WORD\r
2766         SETZM   1(TAC)          ;ZERO WHERE IT CAME FROM\r
2767         SOJG    AC2,EXPLP3              ;LOOP IF MORE DATA\r
2768         CAMLE   TAC1,[XWD PROG,JOBSV] ;THROUGH?\r
2769         JRST    EXPLP2          ;NO, DO NEXT BLOCK\r
2770         EXCH    AC2,JOBSDD(PROG) ;YES, ZERO JOBSDD\r
2771         MOVEM AC2,JOBDDT(JDAT)  ;SET USER DDT STR ADR\r
2772         JRST SGDO2              ;AND SETUP USRDDT IN MONITOR PROTECTED\r
2773                                 ; FROM THIS USER\r
2774 \f;THIS ROUTINE WILL DELETE ALL DATA FROM A COMPRESSED FILE\r
2775 ;WHICH IS BELOW JOBSOD (PROBABLY WRITTEN BY TENDUMP)\r
2776 \r
2777 TOOLOW: HLRE    AC2,@TAC        ;WORDCOUNT OF OFFENDING IOWD\r
2778         SUB     AC1,AC2         ;ADDRESS+N\r
2779         CAIG    AC1,JOBSDD      ;IS ANY DATA IN IT LEGAL?\r
2780         AOJA    TAC,NXIOWD      ;NO, TEST NEXT IOWD\r
2781         SUBI    AC1,JOBSDD      ;YES, NUMBER OF WORDS TO KEEP\r
2782         MOVNS   AC2             ;TOTAL NUMBER OF WORDS\r
2783         SUB     AC2,AC1         ;NUMBER OF WORDS TO DROP\r
2784         HRLS    AC2             ;INTO BOTH HALVES\r
2785         ADD     AC2,@TAC        ;NEW IOWD FOR ONLY GOOD DATA\r
2786         ADDI    TAC,(AC2)       ;POINT TAC TO LAST BAD DATA LOC\r
2787         MOVEM   AC2,@TAC        ;STORE UPDATED IOWD OVER IT\r
2788         JRST    IOWBLT          ;GO BLT OVER BAD DATA\r
2789 NXIOWD: SUB     TAC,AC2         ;POINT TAC TO NEXT IOWD\r
2790         HRRZ    AC1,@TAC        ;GET ADDRESS\r
2791         CAIGE   AC1,JOBSD1      ;LEGAL?\r
2792         AOJA    AC1,TOOLOW      ;NO, AT LEAST PART OF THE DATA IS LOW\r
2793 IOWBLT: MOVSI   TAC,@TAC        ;YES, KEEP THE ENTIRE IOWD DATA\r
2794         HRRI    TAC1,JOBSV(PROG) ;TAC1 IS A BLT POINTER\r
2795         SUBI    TAC,JOBSV       ;RH OF TAC IS AMOUNT BEING DELETED\r
2796         SUBI    AC3,(TAC)       ;AC3 POINTS TO TOP OF DATA READ IN-(N)\r
2797         BLT     TAC1,@AC3       ;MOVE ONLY GOOD DATA DOWN\r
2798         JRST    EXPND1          ;GO EXPAND THE GOOD DATA\r
2799 \fSGDO1: MOVEI TAC,JOBDDT(PROG)  ;MOVE EVERYTHING DOWN )MUST BE NON-COMPRESSED DSK FILE\r
2800         HRLI TAC,JOBSVD(TAC)    ;OR CONVERT SAVE FILE\r
2801         SKIPGE JOBSV(JDAT)      ;IS THIS CONVERT FILE(FIRST WORD IS IOWD)?\r
2802         HRLI TAC,JOBSDP(TAC)    ;YES, ALSO SKIP OVER IOWD\r
2803         SUBI AC3,JOBSVD\r
2804         BLT TAC,@AC3\r
2805 SGDO2:  AOSA (PDP)              ;SET FOR OK RETURN\r
2806 SGDOER: POP PDP,TAC\r
2807         SETZM JOBHCU(JDAT)      ;CLEAR LH AND SET HIGHEST USER CHAN, IN\r
2808                                 ; USE TO 0(WHERE IT SHOULD BE ANYWAY)\r
2809         POPJ PDP,               ;ERROR RETURN OR OK RETURN\r
2810 \f;ROUTINE TO CHECK USER SUPPLIED CORE ARG AND CHECK TO SEE IF 0\r
2811 ;OR GREATER THAN OR EQUAL TO IOWD USED TO SAVE OR GET FILE\r
2812 ;CALL:  HLRE TAC1,-NO. OF WORDS IN FILE\r
2813 ;       PUSHJ PDP,CKIOWD\r
2814 ;       RETURN WITH LARGER OF 2 POSITIVE NOS. IN TAC(1777 ORED IN)\r
2815 ;       DO NOT RETURN IF CORE ARG SUPLLIED BY USER IS TOO SMALL\r
2816 ;CALLED FROM SAVE AND GET\r
2817 \r
2818         EXTERN JOBSVM\r
2819 \r
2820 CKIOWD: MOVEI TAC,JOBSVM        ;FIRST LOC-1 READ OR WRITTEN IN USER AREA\r
2821         HRRM TAC,SGALEN(PROG)   ;RESTORE RH TO JOBSAV AFTER LOOKUP\r
2822         SUB TAC,TAC1            ;HIGHEST LOC=FIRST LOC-1+LENGTH OF FILE\r
2823                                 ; FALL INOT CHSARG\r
2824 \r
2825 ;ROUTINE TO CHECK USER SUPPLIED CORE ARG AND CHECK IF 0\r
2826 ;OR GREATER THAN OR EQUAL TO CORE ARG FOR PREVIOUS SAVE\r
2827 ;CALL:  HRRZ TAC,JOBCOR(JDAT)   ;WRITTEN WHEN FILE SAVED\r
2828 ;       PUSHJ PDP,CKSARG\r
2829 ;       RETURN WITH LARGER OF 2 IN AC TAC, ONLY IF USER ARG NOT TOO SMALL\r
2830 ;CALLED ONLY FROM GET AFTER JOB DATA AREA LOADED FROM FILE(JOBCOR) OR HIGH SEG\r
2831 \r
2832         INTERN NROOM1           ;CALLED FROM SEGCON\r
2833 \r
2834 CKSARG: IORI TAC,1777           ;MAKE SURE 1K-1\r
2835         CAMG TAC,SGANEW(PROG)   ;IS USER SUPPLIED CORE ARG BIGGER?\r
2836         SKIPA TAC,SGANEW(PROG)  ;YES, RETURN IT\r
2837         SKIPN SGANEW(PROG)      ;NO, DID USER SUPPLY ONE\r
2838         POPJ PDP,               ;NO, RETURN LARGER OF TWO\r
2839 ;ROUTINE TO PRINTE #K OF CORE NEEDED\r
2840 ;CALL:  MOVE TAC,HIGHEST REL. USER ADR.\r
2841 ;       PUSHJ PDP, NROOM1\r
2842 ;       NEVER RETURN\r
2843 \r
2844 NROOM1: PUSH PDP,TAC            ;YES, ERROR, USER'S SUPPLIED CORE ARG TOO SMALL\r
2845 NOROOM: MOVEI TAC,NECERR        ;ERROR CODE IN CASE THIS IS RUN UUO(NOT ENOUGH CORE)\r
2846         PUSHJ PDP,SGRELE        ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO\r
2847                                 ; OR FIND TTY AND PRINT ?CRLF\r
2848         HRRZ TAC,(PDP)          ;GET AMOUNT OF CORE REQUESTED\r
2849         LSH TAC,-12             ;CONVERT TO NO. OF 1K BLOCKS-1\r
2850         PUSHJ PDP,DECP1         ;ADD 1 TO TAC AND PRINT DECIMAL\r
2851         JSP TAC,PHOLD           ;START TTY ADN STOP JOB\r
2852         ASCIZ /K OF CORE NEEDED/\r
2853 \f\r
2854 \r
2855 ;ROUTINE TO ASSIGN CORE FOR LOW  AND HIGH SEG\r
2856 ;CALL:  MOVE PROG,LOW SEG RELOCATION\r
2857 ;       HRR TAC,HIGHEST LOC DESIRED\r
2858 ;       PUSHJ PDP,GETCORE\r
2859 ;       RETURN ONLY IF ASSIGNED\r
2860 \r
2861         INTERN GETCOR\r
2862 \r
2863 GETCOR: HRRZM TAC,SGACOR(PROG)  ;SOTRE CORE ARG FOR CORE UUO IN USER AC\r
2864         PUSH PDP,TAC            ;SAVE IN CASE OF ERROR\r
2865         CALLI SGACOR,11         ;DO CORE UUO\r
2866         JRST NOROOM             ;NOT AVAILABLE, PRINT ERROR AND AMOUNT TRYING FOR\r
2867         JRST TPOPJ              ;OK, REMOVE TAC FROM PD LIST AND RETURN\r
2868 \f;ROUTINE TO PRINT NOT A SAVE FILE IF WRONG FORMAT FILE DETECTED\r
2869 \r
2870 INTERN GETERR\r
2871 \r
2872 GETERR: MOVEI TAC,NSFERR        ;ERROR CODE IN CASE THIS IS RUN UUO(NOT SAVE FILE)\r
2873         PUSHJ PDP,SGRELE        ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO\r
2874                                 ; OR FIND TTY AND PRINT ?CRLF\r
2875         JSP TAC,PHOLD           ;START TTY AND STOP JOB\r
2876         ASCIZ /NOT A SAVE FILE/\r
2877 \r
2878 ;ROUTINE TO PRINT FILE NOT FOUND ORNEEDS 2 RELOC REG\r
2879 \r
2880 INTERN NOFILE   ;CALLED FROM SEGCON\r
2881 \r
2882 NOFILE: MOVEI TAC,FNFERR        ;ERROR CODE IN CASE THIS IS RUN UUO(FILE NOT FOUND\r
2883                                 ; CHANGE ERROR CODE TO DISK ERROR CODE IF DEV IS DSK\r
2884         PUSHJ PDP,SGRELL        ;RETURN DISK LOOKUP OR ENTER ERROR CODE IF DSK  \r
2885                                 ; RELEASE DEVICE AND ERROR RETURN TO USER IF HE WANTED\r
2886                                 ; OR FIND TTY AND PRINT ?CRLF\r
2887         MOVE TAC1,SGANAM(PROG)  ;PRINT FILE NAME\r
2888         PUSHJ PDP,PRNAME\r
2889         PUSHJ PDP,PRPER         ;PRINT PERIOD\r
2890         HLLZ TAC1,SGAEXT(PROG)  ;PRINT EXTENSION\r
2891         PUSHJ PDP,PRNAME\r
2892         JSP TAC,PHOLD           ;START TTY AND STOP JOB\r
2893         ASCIZ / NOT FOUND/\r
2894 \f;ROUTINE TO RELEASE DEVICE ON AN ERROR AND CHECK TO SEE\r
2895 ;IF THIS IS A MONITOR COMMAND OR USER UUO\r
2896 ;IF USER UUO, GIVE ERROR RETURN TO USER UNLESS THERE IS A HALT\r
2897 ;IN LH OF EROR RETURN WORD, IN WHICH CASE FIND TTY, PRINT ?CRLF\r
2898 ;AND RETURN TO CALLER SO CAN ADD MORE INFO TO ERROR MESSAGE AND STOP JOB\r
2899 ;CALL:  MOVEI TAC,ERROR CODE(DEFINED IN S.MAC)\r
2900 ;       PUSHJ PDP,SGRELE\r
2901 ;DO NOT RETURN TO CALLER IF USER WANTS ERROR RETURN ON RUN AND GETSEG UUOS\r
2902 \r
2903         EXTERN JOBPD1,JOBPD3,USRJDA\r
2904 \r
2905 SGRELL:                         ;LOOKUP OR ENTER FAILURE\r
2906 IFN FTDISK,<\r
2907         MOVE TAC1,DEVMOD(DEVDAT)        ;IS THIS DEVICE A DISK?\r
2908         TLNE TAC1,DVDSK\r
2909         HRRZ TAC,SGAEXT(PROG)   ;YES, RETURN DISK SERVICE ERROR CODE\r
2910 >\r
2911 SGRELE: MOVE TAC1,JOBPD1(JDAT)  ;GET FIRST PC ON PD LIST\r
2912         TLNN TAC1,USRMOD        ;IS IT IN USER MODE(IE USER UUO)?\r
2913 \r
2914         JRST SGRLE1             ;NO. MUST BE MONITOR COMMAND OR CALLED OVERLAYED\r
2915                                 ; RELEASE DEVICE, FIND TTY, AND RETURN TO CALLED\r
2916         PUSH PDP,TAC            ;SAVE ERROR CORE\r
2917         HRR UUO,TAC1            ;ADDRESS OF RETURN AFTER RUN OF GETSEG UUO\r
2918         PUSHJ PDP,GETWDU        ;GET ERROR RETURN WORD FROM RUN OR GETSEG UUO\r
2919         HLRZ TAC1,TAC           ;GET OP CODE\r
2920         POP PDP,TAC             ;RESTORE ERROR CODE\r
2921         CAIN TAC1,(HALT)        ;IS LH HALT?\r
2922         JRST SGRLE1             ;YES, RELEASE DEVICE,FIND TTY, AND RETURN TO CALLER\r
2923         HRR UUO,JOBPD3(JDAT)    ;NO, AC NUMBER OF RUN OR GETSEG UUO\r
2924         PUSHJ PDP,STOTAC        ;STORE ERROR NUMBER IN USER AC\r
2925         SKIPE USRJDA+0          ;DO NOT RELEASE CHANNEL 0 IF NOT INITED YET\r
2926                                 ; UUO HANDLER DOES NOT ALLOW THIS FROM EXEC MODE\r
2927         RELEAS 0,               ;RELEASE DEVICE(IF INITED)\r
2928         JRST USRXIT             ;AND RETURN TO USER TO HANDLE ERROR\r
2929 \r
2930 SGRLE1: PUSHJ PDP,SGREL         ;RELEASE DEVICE AND FIND TTY\r
2931         JSP TAC,CONMES          ;PRINT ?CRLF AND RETURN TO CALLER\r
2932                                 ; WHO WILL PRINT REST OF ERROR MESSAGE AND STOP JOB\r
2933         ASCIZ /?\r
2934 /\r
2935 COMEND: END             ;END OF COMCON\r