1 TITLE COMCON - COMMAND DECODER AND SAVEGET ROUTINES - V433
\r
2 SUBTTL /RCC 03 JUN 69
\r
5 ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB
\r
7 ENTRY COMCON ;ALWAYS LOAD COMCON IF LIBRARY SEARCH
\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
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
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
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
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
52 T=BUFPNT ;TEMPORARY AC'S
\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
85 TLNN T,JLOG ;IS JOB LOGGED IN?
\r
86 TLNE TAC1,NOLOGIN ;NO, CAN COMMAND PROCEED WITH NO LOGIN?
\r
88 JSP TAC,COMER ;NO, TYPE "LOGIN PLEASE"
\r
92 CHKNO: JUMPN ITEM,CHKRUN ;JOB NUMBER ALREADY ASSIGNED?
\r
93 TLNE TAC1,NOJOBN ;NO, DOES THIS COMMAND NEED A JOB NUMBER?
\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
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
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
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
115 SETZM RTIME(ITEM) ;CLEAR INCREMENTAL JOB RUNNING TIME
\r
116 SETZM TTIME(ITEM) ;CLEAR TOTAL JOB RUNNING TIME
\r
120 SETZM JBTKCT(ITEM) ;CLEAR CORE-RUNNING TIME CORE
\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
127 JSP TAC,COMER ;YES.
\r
128 ASCIZ /PLEASE TYPE ^C FIRST
\r
134 MOVE JDAT,JBTDAT(ITEM) ;ADDRESS OF JOB DATA AREA
\r
136 MOVE PROG,JBTADR(ITEM) ;XWD PROTECTION,RELOCATION
\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
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
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
162 \fCHKXPN: TLNN TAC1,PLSXPN ;DOES THIS COMMAND NEED CORE TO BE EXPANDED?
\r
164 HLRE IOS,JOBHCU(JDAT) ;YES, IS CORE STILL COMPRESSED(SAVE DID NOT GO
\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
169 PUSHJ PDP,EXPAND ;YES, EXPAND CORE FIRST
\r
170 JFCL ;IGNORE ADDRESS CHECK ERROR, WE TRIED
\r
172 JRST CHKDLY ;DELAY COMMAND BECAUSE COMMAND DECODER ACS ARE
\r
173 ; ALL GONE, NEXT TIME JOBHCU WILL BE 0
\r
177 HRRI TAC1,DLYCM1 ;DELAY COMMAND TILL NEXT CLOCK TICK
\r
181 COMER: MOVSI TAC1,NOINCK
\r
183 MOVEI TAC1,CERR ;CALL ERROR MESSAGE ROUTINE
\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
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
195 COMRET: POP PDP,T1 ;RESTORE COMMAND FLAGS
\r
196 POP PDP,DEVDAT ;RESTORE TTY DDB ADDRESS.
\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
205 ANDCAM T,TTYTAB(TAC) ;YES. TURN OFF SIGN BIT
\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
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
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
221 MOVE TAC,ITEM ;PRINT JOB NUMBER
\r
224 MOVEI TAC,CONFIG ;PRINT SYSTEM CONFIGURATION NAME
\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
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
249 LDB ITEM,PJOBN ;GET JOB NUMBER FROM TTY DEVICE DATA BLOCK
\r
251 TLNE T1,CMWRQ ;REQUEUE JOB AFTER COMMAND WAIT OR ERROR?
\r
256 IFN FTTTYSER, <EXTERN SPCHEK,TITAKR,GETCHR,TPOPJ
\r
258 SKPBRK: PUSH PDP,TAC
\r
259 SKPBR2: PUSHJ PDP,SPCHEK
\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
267 \f;TABLE OF CONSOLE COMMANDS
\r
269 INTERNAL FTATTACH,FTTIME,FTTALK,FTEXAMINE,FTLOGIN,FTREASSIGN
\r
270 INTERNAL FTFINISH,FTCCL
\r
272 ;BITS CHECKED BEFORE DISPATCHING TO COMMAND SETUP ROUTINE
\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
293 ;BITS CHECKED AFTER RETURN FROM COMMAND SETUP ROUTINE
\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
306 ;4 TAKEN ABOVE BY 'PLSXPN' BIT
\r
309 ERRFLG=1 ;COMMAND ERROR
\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
321 C SSAVE,SSAVE,NOCRLF!NOPER!TTYRNC!INCORE!NOACT!NORUN!PLSXPN
\r
323 C CONTINUE,CONT,NOPER!TTYRNU!INCORE!NORUN
\r
325 C D,DCOM,CMWRQ!INCORE
\r
326 C E,ECOM,NOCRLF!CMWRQ!INCORE
\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
333 C FINISH,CFINI,TTYRNC!NOACT!INCORE!NORUN
\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
339 C DETACH,DETACH,NOPER+NOCRLF+NOCORE!NOJOBN!NOINCK
\r
340 C ATTACH,ATTACH,NOCORE!NOJOBN!NOLOGIN!NOINCK
\r
342 C DAYTIME,DAYTIM,NOCORE!NOJOBN!NOLOGIN!NOINCK
\r
344 C TIME,RUNTIM,NOCORE!NOLOGIN!NOINCK
\r
346 C RESOURCES,FREDEV,NOCORE!NOJOBN!NOLOGIN!NOINCK
\r
348 C SCHEDULE,SKEDUL,NOCORE!NOJOBN!NOLOGIN!NOINCK
\r
351 C TALK,TALK,NOCRLF+NOPER+NOCORE!NOJOBN!NOLOGIN!NOMESS!NOINCK
\r
354 C LOGIN,CLOGIN,NOCORE!NOLOGIN!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN
\r
357 C LOGIN,CPOPJ,NOCORE!NOACT!NORUN!NOTRAN
\r
360 C REASSI,REASS,NOCORE!NOACT!INCORE!CMWRQ!NORUN
\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
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
382 \f;GENERATE TABLE OF SIXBIT COMMAND 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
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
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
408 ;UPON RETURN FROM COMMAND SETUP ROUTINE, A CR-LF IS ADDED IF
\r
409 ;NEEDED AND TTY IS STARTED
\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
418 COR0: JUMPE PROG,CPOPJ ;RETURN IF JOB DOES NOT HAVE CORE
\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
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
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
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
444 INTERNAL PJOB,DECLF
\r
446 PJOB: MOVE TAC,ITEM ;JOB NO.
\r
447 DECLF: PUSHJ PDP,RADX10 ;PRINT TAC AS DEC. THEN CRLF
\r
450 ; "KJOB" KILL ATTACHED JOB
\r
452 EXTERNAL JBTSTS,TTYKILM,CPOPJ
\r
453 INTERNAL FTTIME,JOBKL
\r
455 KJOB: JUMPE ITEM,JOBKB ;WAS JOB INITIALIZED?
\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
462 PUSHJ PDP,ALOGN1 ;ATTACH TTY
\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
470 IFE FTSWAP+FTLOGIN,<
\r
471 JUMPE PROG,JOBKA ;YES. DOES JOB HAVE CORE IN MEMORY?
\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
483 PUSHJ PDP,PRTTIM ;PRINT JUST TOTAL RUN TIME
\r
484 PUSHJ PDP,TTYSTR ;START TTY
\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
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
502 START: ;SAME AS CSTART, DIFF BY COMTAB BITS
\r
503 ; WHICH PUT TTY IN MONITOR OR USER MODE
\r
505 ; "CSTART L" OR "CSTART" - START AT LOC. L(TTY IN COMMAND MODE)
\r
507 STARTC: PUSHJ PDP,OCTIN ;CONVERT POSSIBLE OCTAL NO ARG.
\r
509 SKIPA TAC1,JOBSA(JDAT) ;NO START ADR. SPECIFIED RETURN
\r
512 JRST SNOARG ;NO ARG SPECIFIED RETURN
\r
514 JRST COMERA ;ILLEGAL CHARACTER
\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
521 JRST CHKSTR ;START JOB WITH PC IN USER MODE,
\r
522 ; IF START ADR IS NON-ZERO
\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
528 \f;"REENTER" - REENTER USER PROGRAM
\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
536 ; "DDT" - START EXECUTION AT DDT IN USER AREA
\r
540 DDTGO: MOVE TAC1,JOBDDT(JDAT) ;DDT STARTING ADR. IN JOB DATA AREA
\r
543 ;ROUTINE TO CHECK TO SEE IF STARTING ADDRESS IS NON-ZERO, AND START USER IF OK
\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
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
559 EXTERNAL STUSER,JOB,PJBSTS,IOWQ,JOBDAC
\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
566 PUSHJ PDP,STOPCK ;CAN THE JOB STOP?
\r
567 JRST DLYCM1 ;NO. DELAY IT.
\r
569 PUSHJ PDP,STOP1 ;STOP JOB
\r
570 STOP8: IFE FTTTYSER,<
\r
571 JSP TAC,CONMES ;PRINT "^C CRLF CRFL PERIOS"
\r
575 IFN FTTTYSER,< POPJ PDP,0>
\r
577 ; "CONTC" - CONTINUE EXECUTION(TTY REMAINS IN COMMAND MODE)
\r
579 CONTC: ;SAME AS CONT
\r
581 ; "CONT" - CONTINUE EXECUTION FROM WHERE LEFT OFF
\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
589 ASCIZ /CAN'T CONTINUE
\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
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
603 JUMPE TAC1,COR0 ;RELEASE DEVICES IF USER ASKING FOR 0 CORE
\r
606 JUMPE TAC1,COR1 ;ASSIGN JUST MINIMAL CORE AND RELEASE DEVICES
\r
607 ; IF ASKING FOR 0 CORE
\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
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
622 \fCOR2: IFN FTTTYSERM,<
\r
623 MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB ADR
\r
625 PUSHJ PDP,INLMES ;PRINT ? FOR PATCH
\r
628 COR3: PUSHJ PDP,PRTSEG ;PRINT SIZE OF LOW SEG
\r
631 PUSHJ PDP,PRTHGH ;PRINT SIZE OF HIGH SEG (+0 IF NONE)
\r
632 ; NOTHING IF NOT 2 REG. MACHINE OR SOFTWARE
\r
639 MOVE TAC,CORTAL ;NO. OF FREE 1K BLOCKS
\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
647 PUSHJ PDP,RADX10 ;PRINT NO. OF 1K BLOCKS AVAILABLE
\r
658 MOVE TAC,VIRTAL ;PRINT AMOUNT OF FREE SWAP SAPCE LEFT
\r
659 JRST RADX10 ;IN DECIMAL
\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
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
670 TLO IOS,NSRBIT ;SET FLAGE FOR NON-SHARABLE EXT(HGH)
\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
677 ; "GET DEVICE:FILE-NAME[PROJ.,PROG.] CORE" - SETS UP JOB AREA FROM RETREIVABLE
\r
679 ;DEVICE AND ASSIGNS CORE.
\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
685 ; JOB DATA AREA FOR MONITOR JOB
\r
687 IFN FTLOGIN,< ;AUTOMATIC LOGIN AFTER DSK REFESH OR WHEN REFLAG SET
\r
691 LOGREF: MOVEM TAC,PRJPRG(ITEM) ;PRJ,PRG NRS. IN REFLAG
\r
693 IORM TAC,JBTSTS(ITEM)
\r
694 SETZM -1(PDP) ;CLEAR ALL FLAGS FOR COMRET
\r
695 SETZM REFLAG ;ONLY ONCE
\r
698 \f;"HELP" -HELP COMMAND
\r
702 IFN FTLOGIN,< EXTERNAL HELPPP
\r
710 HELP: IFN FTLOGIN,<
\r
713 MOVE TAC,[SIXBIT /HELP/] ;CUSP NAME
\r
716 SYSTAT: IFN FTLOGIN,<
\r
719 MOVE TAC,[SIXBIT /SYSTAT/] ;CUSP NAME
\r
722 EXTERNAL JBTSTS,TTYATT
\r
726 IFN FTLOGIN,< EXTERNAL PRJPRG
\r
727 MOVEM TAC,PRJPRG(ITEM)
\r
729 ANDCAM TAC,JBTSTS(ITEM)
\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
742 CCLRUN: MOVE TAC,[SIXBIT /COMPIL/] ;CUSP NAME
\r
746 ;"LOGIN" - LOGIN COMMAND
\r
753 LOGDET: JSP TAC,ERRMES
\r
754 ASCIZ /PLEASE KJOB OR DETACH
\r
756 CLOGIN: TLNE T,JLOG ;FORCE USER TO LOGOUT BEFORE
\r
757 JRST LOGDET ; LOGGING IN ANEW.
\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
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
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
778 \f; "R CUSTNAME CORE" - DOES "RUN SYS:CUSPNAME"
\r
780 RCOM: MOVEI TAC,0 ;NO FILE NAME, TTY WILL SUPPLY IT
\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
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
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
800 JRST COR2 ;NO. PRINT "0K CORE LEFT"
\r
803 JRST DLYCM ;NO. DELAY COMMAND UNTIL IN CORE
\r
805 \f; "ASSIGN DEV:NAME" - ASSIGN DEVICE TO JOB AND GIVE IT LOGICAL NAME
\r
807 EXTERNAL DEVLST,PJOBN,SYSTAP
\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
814 HLRZ T1,PRJPRG(ITEM)
\r
815 CAIN T1,1 ;PROJECT NR, 1?
\r
819 MOVE T1, TAC1 ;SAVE DEVICE NAME
\r
821 PUSH PDP,DEVDAT ;SAVE TTY
\r
825 PUSH PDP, TAC ;SAVE INPUT BYTE POINT
\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
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
846 ASSG1: CAMN TAC,SYSTAP ;IS THIS SYSTEM TAPE?
\r
848 LDB T, PJOBN ;SAVE OLD JOB NUMBER FOR THIS DEVICE
\r
849 TRZ TAC,-1 ;COMAPRE LEFT HALF ONLY
\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
855 ASSG2: HLRZ DEVDAT, DEVSER(DEVDAT)
\r
856 JUMPN DEVDAT, ASSG0
\r
858 POP PDP,DEVDAT ;RESTORE TTY DDB
\r
863 JRST NOTDEV ;PRINT NO SUCH DEVICE
\r
865 IFN FTLOGIN,<EXTERN STREQ,SYSTAP
\r
866 ASSG7: PUSHJ PDP,CTEXT1
\r
873 \f;ALREADY ASSIGNED TO ANOTHER JOB
\r
880 JRST DECLF ;PRINT JOB NUMBER CRLF
\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
888 POP PDP,TAC ;GET JOB NO. BACK
\r
889 JRST DECLF ;AND TYPE IT
\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
896 POP PDP,TAC ;RESTORE INPUT BYTE POINTER
\r
897 PUSH PDP,DEVDAT ;SAVE DDB ADDRESS
\r
900 EXCH DEVDAT,0(PDP) ;GET TTYDDB, SAVE DEVICE DDB
\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
907 MOVEI TAC,LOGERR ;YES, PRINT ERROR
\r
908 MOVE DEVDAT,-3(PDP) ;RESTORE TTY DDB
\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
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
920 MOVE TAC1,DEVNAM(DEVDAT) ;PHYSICAL NAME
\r
921 MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB
\r
922 PUSHJ PDP,PRNAME ;PRINT IT
\r
928 LOGERR: ASCIZ /LOGICAL NAME ALREADY IN USE. /
\r
930 ;"DEASSIGN DEV" - DEASSIGNS DEVICE FROM CONSOLE
\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
945 DEAER1: MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB
\r
946 JSP TAC,ERRMES ;PRINT NO SUCH DEVICE
\r
948 ASCIZ /NO SUCH DEVICE
\r
951 DEAER2: MOVE TAC1,DEVNAM(DEVDAT) ;PRINT PHYSICAL DEVICE NAME
\r
952 MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB
\r
956 ASCIZ / WASN'T ASSIGNED
\r
958 \fINTERNAL FTREASSIGN
\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
973 EXTERNAL PUUOAC,JOB
\r
975 REASSI: LDB UUO,PUUOAC
\r
977 PUSH PDP,@UUO ;STACK JOB NUMBER TO BE REASSIGNED TO
\r
979 MOVE TAC1,@UUO ;DEVICE NAME
\r
980 MOVE ITEM,JOB ;THIS JOB NUMBER
\r
983 ;"REASSIGN DEV:JOB" - REASSIGN DEVICE "DEV" TO JOB "JOB"
\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
996 ;ROUTINE COMMON TO REASSIGN UUO AND COMMAND
\r
998 EXTERNAL JBTSTS,PJOBN,JOBFDV
\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
1008 PUSHJ PDP,DEVSRC ;SEARCH FOR DEV
\r
1009 JRST REASE2 ;NOT FOUND
\r
1011 CAME TAC,ITEM ;ASSIGNED TO THIS JOB
\r
1013 MOVE TAC,DEVMOD(DEVDAT)
\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
1019 JUMPN UUO,REASS4 ;YES. COMMAND LEVEL?
\r
1020 HRL DEVDAT,(PDP) ;YES. SCHEDULE RELEASE
\r
1021 MOVEM DEVDAT,JOBFDV(JDAT)
\r
1023 MOVE DEVDAT,-2(PDP)
\r
1024 MOVSI TAC1,TTYRNC ;SET TTYRNC SO JOB WILL RUN
\r
1028 HLRZ TAC,JOBFDV(JDAT)
\r
1030 HRRZ DEVDAT,JOBFDV(JDAT)
\r
1032 SETOM UUO ;SET FLAG TO STOP JOB
\r
1033 REASS4: HRRZ DSER,DEVSER(DEVDAT)
\r
1034 HRRZM DEVDAT,JOBFDV(JDAT)
\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
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
1048 DPB ITEM,PJOBN ;PUT IN NEW JOB NUMBER
\r
1053 REASE1: POP PDP,TAC
\r
1054 JUMPE UUO,ATT4 ;JOB NEVER WAS INITIATED
\r
1055 REASE4: SETZM @UUO ;CLEAR C(AC)
\r
1058 REASE2: MOVEI TAC,NOTDEV ;NO SUCH DEVICE
\r
1059 REASE5: POP PDP,TAC1
\r
1063 REASE3: MOVEI TAC,DEAER2 ;WASN'T ASSIGNED
\r
1066 REASE6: MOVEI TAC,REASE7
\r
1068 REASE7: MOVE TAC1,DEVNAM(DEVDAT)
\r
1069 MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB
\r
1072 ASCIZ / CAN'T BE REASSIGNED
\r
1075 \fINTERNAL FTATTACH
\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
1085 EXTERNAL TTYATT,JOBN,TTYFND
\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
1092 JRST DEVATT ;WANTS TO ATTACH A DEVICE
\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
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
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
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
1125 PUSHJ PDP,TSETBF ;INITIALIZE TTY INPUT BUFFER
\r
1127 JRST TTYFND ;ATTACHED, GO SET UP OUTP. BYTE PTR.
\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
1147 TLNE TAC,DVTTY ;IS IT A TTY?
\r
1148 HRRM DEVDAT,TTYTAB(TAC1) ;SET TRANS TABLE TO POINT TO DDB
\r
1153 ATT1: JSP TAC,ERRMES
\r
1154 ASCIZ /ILLEGAL JOB NUMBER
\r
1156 ATT2: MOVE TAC1,DEVNAM(DEVDAT) ;[PRINT PHYSICAL NAME
\r
1157 MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB
\r
1160 ASCIZ / ALREADY ATTACHED
\r
1162 ATT3: JSP TAC,ERRMES
\r
1163 ASCIZ /CAN'T ATT TO JOB
\r
1165 ATT4: JSP TAC,ERRMES
\r
1168 ATT5: JSP TAC,ERRMES
\r
1169 ASCIZ /CAN'T ATT DEV
\r
1171 ATT6: POP PDP,DEVDAT
\r
1176 \fINTERNAL FTATTACH
\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
1187 DETACH: JRST TTYDET ;GO DETACH TTY
\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
1222 IFE FTTTYSER,< POP PDP,DEVDAT ;RESTORE TTY DDB
\r
1223 JRST ASSER1+1 ;PRINT ERROR MSG. AND RETURN
\r
1228 LOGER1: JSP TAC,ERRMES
\r
1229 ASCIZ /CAN'T DET DEV
\r
1231 >> ;CLOSE BOTH FTLOGIN AND FTATTACH CONDITIONALS.
\r
1232 \f;"DAYTIME" - PRINT TIME OF DAY
\r
1234 EXTERNAL TIME,THSDAT,MONTAB,JIFMIN
\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
1248 ADD TAC,TAC1 ;COMPUTE MINUTES
\r
1249 IMULI TAC,JIFMIN ;COMPUTE JIFFIES
\r
1250 MOVEM TAC,TIME ;AND STORE
\r
1253 DAYTM1: MOVE TAC,THSDAT ;PRINT TODAY'S DATE
\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
1260 MOVE TAC,MONTAB(TAC) ;MONTH
\r
1261 DPB TAC,[POINT 21,DAMESS,27]
\r
1263 PUSHJ PDP,CONMES ;PRINT DAY
\r
1264 MOVEI TAC,^D64(TAC1)
\r
1265 PUSHJ PDP,RADX10 ;PRINT YEAR
\r
1267 MOVE TAC,TIME ;PRINT TIME OF DAY
\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
1276 EXTERNAL RTIME,TTIME,SHFWRD,WDPJIF,JOBN,JBTSTS,CLRWRD,LSTWRD
\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
1287 RUN2: PUSHJ PDP,INLMES ;PRINT
\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
1297 PUSHJ PDP,PRTIME ;PRINT TIME SPENT CLEARING CORE
\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
1309 JRST PRTIME ;AND RETURN
\r
1313 MOVEI TAC,0 ;GET SET TO CLEAR INCREMENTAL RUN TIME
\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
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
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
1334 JRST PRTIME ;PRINT IT AND RETURN
\r
1337 \f;ROUTINE TO LET TTY TALK TO ANY OTHER RING OF TTYS
\r
1339 ; TTYN NEED NEVER HAVE BEEN TYPED ON BEFORE
\r
1346 TALK: PUSHJ PDP,CTEXT1 ;GET ARGUMENT
\r
1347 JUMPE TAC1,TALK2 ;NONE SPECIFIED
\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
1356 TALK2: MOVSI ITEM,NOINCK ;SET FLAGS SO RESPONSE WILL PRINT
\r
1357 MOVEM ITEM,-1(PDP)
\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
1367 \fINTERNAL FTEXAMINE
\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
1376 EXTERNAL TPOPJ,JOBPC
\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
1392 PUSHJ PDP,INLMES ;PRINT SLASH TAB
\r
1394 HLRZ TAC,(PDP) ;PRINT LEFT HALF
\r
1396 PUSHJ PDP,INLMES ;PRINT SPACE
\r
1398 HRRZ TAC,(PDP) ;PRINT RIGHT HALF
\r
1400 PUSHJ PDP,INLMES ;PRINT FINAL TAB
\r
1402 JRST TPOPJ ;POP PDP,TAC,POPJ PDP,
\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
1407 EXTERNAL JOBEXM,JOBPFI
\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
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
1432 TRNN TAC1,777760 ;IN USER ACS
\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
1439 DCOM1: PUSHJ PDP,DEAT ;CHECK FOR AC REFERENCE
\r
1440 HRLI TAC1,PROG ;SET FOR RELOCATION
\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
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
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
1461 ECOMA: JSP TAC,ERRMES ;OUT OF BOUNDS
\r
1462 ASCIZ /OUT OF BOUNDS
\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
1470 EXTERN DEVOPR,STATES,OCTPNT
\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
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
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
1485 ;"BLANK" OR NO ALPHA NUMERIC BEFORE BREAK CHAR COMMAND
\r
1486 ;DISPATCHED TO LIKE ANY OTHER COMMAND(0 IN COMMAND TABLE)
\r
1490 LDB TEM,TAC ;GET BREAK CHARACTER
\r
1491 CAIE TEM,15 ;IS IT A CR
\r
1494 CAIE TEM,12 ;WAS BREAK A LF
\r
1496 CAIN TEM,";" ;NO, IS IT SEMI COLON(MONITOR COMMENT)
\r
1497 POPJ PDP, ;YES, IGNORE
\r
1498 ; FALL IN UNKNOWN COMMAND
\r
1500 ;COMMAND NOT IN COMMAND DICECTORY
\r
1502 NOCOM: JRST COMERR ;NO, APPEND ? TO WHAT HE TYPED IN
\r
1504 ; "FINISH DEVICE" - CLOSES,RELEASE AND DESASSIGNS DEVICE
\r
1505 ;JOB MUST HAVE CORE
\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
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
1525 CAMN DEVDAT,JOBFDV(JDAT) ;IS THIS DEV. THE ONE TO RELEASE?
\r
1526 XCT UUO ;YES, RELEASE IT(AND CLOSE)
\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
1536 ;"RESOURCES" - PRINT OUT AVAILABLE DEVICES AND FREE BLOCKS ON THE DISK
\r
1542 EXTERNAL SATENT,SATXWD,WLBIT,SENTSZ,NUMBIT
\r
1544 XOR TAC,TAC ;INITIALIZE COUNTER
\r
1545 HLRE T2,SATXWD ;SET INDEX WITH NUMBER OF SAT BLOCKS IN EXISTENCE,
\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
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
1568 JUMPE AC2,LOP018 ;SUPPRESS LEADING COMMA IF NO DISK
\r
1570 PUSHJ PDP,INLMES ;PRINT ,(INSTEAD OF CRLF SO WILL FIT IN 1 BUFFER)
\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
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
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
1599 ;ROUTINE TO DELAY A COMMAND
\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
1605 EXTERNAL TTYCM,LINSAV
\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
1615 DLYCM1: POP PDP,TAC
\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
1629 EXTERNAL DSKDDB,DSKFGS,CPOPJ1
\r
1631 STOPCK: MOVEI DEVDAT,DSKDDB
\r
1633 STOPD: LDB TAC,PJOBN
\r
1634 CAIE ITEM,(TAC) ;ASSIGNED TO THIS JOB?
\r
1636 TDNE TAC1,DEVIOS(DEVDAT) ;YES. FLAG ON?
\r
1637 JRST CPOPJ ;YES. DELAY
\r
1638 STOPC: HLRZ DEVDAT,DEVSER(DEVDAT)
\r
1641 CAMN TAC,DEVNAM(DEVDAT)
\r
1643 JRST CPOPJ1 ;OK TO STOP
\r
1645 \fSUBTTL COMCSS - COMMON COMMAND SUBROUTINES
\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
1656 T=BUFPNT ;TEMPORARY AC'S
\r
1660 CTEXT: PUSHJ PDP,SKIPS ;CALL HERE IF AT START OF LINE
\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
1669 CTEX0: ILDB TEM,TAC
\r
1672 EXTERN TAKR,GETCHR
\r
1673 LDB TEM,TAKR(DAT) ;GET LAST CHAR.
\r
1675 CTEX0: PUSHJ PDP,GETCHR ;ROUTINE IN SCNSER TO PICK UP CHAR.
\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
1689 CAILE TEM, "Z" ;LETTERS ARE LARGER THEN NOS.
\r
1690 JRST CTEXA ;NEITHER
\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
1699 CAIN TEM,":" ;DEVICE NAME?
\r
1700 PUSHJ PDP,GETCHR ;YES. SKIP COLON
\r
1701 CAIE TEM,3 ;CONTROL C?
\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
1708 \f;ROUTINE TO IGNORE LEADING SPACES, TABS, AND NULLS
\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
1715 INTERNAL SKIPS1,SKIPS
\r
1719 SKIPS: MOVEI TAC1,0 ;CLEAR TAC1
\r
1720 LDB TEM,TAC ;WAS PRECEDING BREAK A CR?
\r
1722 JRST SKIPS2 ;YES. POP SUB. LEVEL UP 1
\r
1725 JUMPE TEM,SKIPSA ;NULL?
\r
1726 CAIE TEM," " ;SPACE?
\r
1730 SKIPS2: POP PDP,T ;YES. POP SUB. LEVEL UP ONE
\r
1732 IFN FTTTYSER,< EXTERNAL GETCHR,SPCHEK,BREAKB,TAKR
\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
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
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
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
1757 INTERNAL COMERA,COMERP
\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
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
1773 EXTERN OUTCHS,TRESCN,TITAKR,SETBFI,TISYNC
\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
1780 PUSHJ PDP,OUTCHS ;NO. TYPE CHAR.
\r
1781 JUMPN TEM,COMERL ;LOOP IF NOT OUT OF CHARACTERS
\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
1790 MOVEI T,"?" ;STORE ? ON TOP OF BREAK CHAR.
\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
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
1803 ;ROUTINE TO PRINT CARRIAGE RETURN-LINE-FEED
\r
1804 ;CALL: MOVE DAT,BYTE POINTER TO OUTPUT
\r
1809 ; COMERR SKIPS TO HERE(SEE ABOVE)
\r
1810 CRLF: MOVEI TAC,[ASCII /
\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
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
1833 PUSHJ PDP,OUTCHS ;NO. STORE TTY OUTPUT BUFFER
\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
1846 INLMES: POP PDP,TAC ;SETUP PRINT ADRESS FOR CONMES
\r
1848 JRST 1(TAC) ;RETURN TO NEXT LOC AFTER MESSAGE
\r
1850 ;ROUTINE TO APPEND ? TO ERROR MESSAGE
\r
1851 ;CALL PUSHJ PDP,PRQM
\r
1856 PRQM: MOVEI TEM,"?"
\r
1866 PRSPC: MOVEI TAC,[ASCIZ / /]
\r
1870 ;ROUTINE TO PRINT "TOO FEW ARGUMENTS"
\r
1871 ;CALL: MOVE DAT,BYTE POINTER
\r
1872 ; PUSHJ PDP,NOTENF
\r
1876 NOTENF: JSP TAC,ERRMES
\r
1878 ASCIZ /TOO FEW ARGUMENTS
\r
1881 ;ROUTINE TO PRINT A PERIOD
\r
1882 ;CALL: PUSHJ PDP,PRPER
\r
1886 PRPER: JSP TAC,CONMES
\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
1897 EXTERNAL PJOBN,CPOPJ1,IPOPJ
\r
1899 DEASG: LDB T, PJOBN ;WAS DEVICE ASSIGNED TO THIS JOB?
\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
1906 SETZM DEVLOG(DEVDAT) ;CLEAR LOGICAL NAME
\r
1908 TRNE TAC1,ASSCON ;IS DEVICE ASSIGNED BY CONSOLE?
\r
1909 AOS -1(PDP) ;YES, DO OK RETURN
\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
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
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
1925 INTERNAL DEASAL,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
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
1949 INTERNAL OCTIN,OCTIN1,DECIN,DECIN1
\r
1950 EXTERNAL CPOPJ1,CPOPJ2
\r
1952 C=BUFPNT ;CHARACTER AC
\r
1953 R=BUFWRD ;RADIX AC
\r
1956 DECIN: MOVEI R,12 ;DECIMAL INPUT
\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
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
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
1981 IFE FTTTYSER,< ILDB TEM,TAC ;NEXT CHAR>
\r
1982 IFN FTTTYSER,< PUSHJ PDP,GETCHR> ;NEXT CHAR
\r
1984 \fINTERNAL FTLOGIN
\r
1986 ;GET PROJECT-PROGRAMMER NUMBERS
\r
1987 ;CALL: MOVE TAC,INPUT BYTE POINTER
\r
1988 ; PUSHJ PDP,PJPGNO
\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
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
2004 PP0: PUSHJ PDP,SKIPS1
\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
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
2026 PUSHJ PDP,OCTIN ;GET SECOND ARG.-PROG. NO.
\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
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
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
2046 EXTERNAL JIFMIN,JIFSEC,JIFSC2
\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
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
2060 PUSHJ PDP,INLMES ;PRINT "HH:" OR "H:"
\r
2062 PR0: MOVE TAC,TAC1 ;GET MINUTES
\r
2063 PUSHJ PDP,PRT2 ;PRINT "MM:"
\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
2073 CAIL TAC1,JIFSC2 ;ROUND IF GREATER THEN HALF
\r
2075 JRST PRT2LF ;PRINT
\r
2076 \fPRTIM1: IDIVI TAC,JIFMIN ;
\r
2077 IDIVI TAC,^D60 ;HOURS,MINUTES IN TAC,TAC1
\r
2079 PUSHJ PDP,INLMES ;PRINT "HH:"
\r
2082 PRT2LF: PUSHJ PDP,PRT2 ;PRINT "MM
\r
2085 PRT2: MOVEI TEM,"0"
\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
2093 ;CALLED AT CLOCK LEVEL FROM CORE (UUO ARG) COMMAND AND SEGCON
\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
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
2113 LDB TAC1,IMGIN ;SIZE WHEN NEXT SWAPPED IN(IN K)
\r
2114 JUMPN TAC1,CPOPJ ;0 MEANS NOT SWAPPED OUT
\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
2126 EXTERN JOBDA,TPOPJ
\r
2130 PUSH PDP,TAC ;SAVE INPUT BYTE POINTER TO COMMAND
\r
2133 PUSH PDP,DEVDAT ;SAVE TTY DDB ADR
\r
2135 PUSH PDP,TAC1 ;SAVE DEVICE NAME(GET)
\r
2136 PUSH PDP,IOS ;SAVE DISPATCH ADDRESS(ANYACT USES IOS)
\r
2140 PUSHJ PDP,KILHGH ;KILL HIGH SEG
\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
2146 POP PDP,TAC1 ;RESTORE PUSHED ACS
\r
2148 POP PDP,DEVDAT ;RESTORE TTY DDB ADR
\r
2149 POPJ PDP, ;TAC NOT USER BY FULL DUPLEX SCNSER
\r
2152 JRST TPOPJ ;RESTORE TAC AND RETURN
\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
2168 GETWRD: HLRZ TAC,PROG ;LARGEST REL LOC IN LOW SEG
\r
2169 CAIGE TAC,(UUO) ;IS ADR. IN LOW SEG?
\r
2172 JRST HGHWRD ;NO, CHECK IF IN HIGH SEG(ERROR RET IF NO)
\r
2175 POPJ PDP, ;NO, ERROR RETURN
\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
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
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
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
2201 ;MISC. DATA LOCATIONS:
\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
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
2223 INTERNAL FTLOGIN,FT2REL,FTDISK
\r
2224 EXTERNAL JOBCOR,JBTPRG
\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
2240 EXTERN SETEXT ;ALSO SAVE IT AGAIN IN SGALOW FOR LOW SEG
\r
2242 PUSHJ PDP,SETEXT ;SET HIGH EXTENSION(SGAHIGH) TO .SHR IF SSAVE OR GET
\r
2243 ; .HGH IF SAVE(LH IOS=NSRBIT).
\r
2245 SETZM SGADAT(PROG) ;SET DATE(E+2) TO 0, SO MONITOR WILL USE TODAYS
\r
2247 PUSHJ PDP,PJPGNO ;GET PROJ, PROG. NO.
\r
2248 MOVEM AC2,SGAPPN(PROG) ;STORE 0 IF NO []'S TYPED BY USER
\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
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
2273 EXTERN JBTPRG,JOBCOR,PUUOAC
\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
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
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
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
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
2310 INTERNAL SAVJOB,SAVERR
\r
2311 EXTERNAL JOB41,JOBS41,JOBDDT,JOBSDD,JOBSV
\r
2313 SAVJOB: JSP TAC1,SG1 ;SET UP ACS PROG,PDP,JDAT,ITEM.
\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
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
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
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
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
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
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
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
2409 ;THIS JOB GETS A JOB AREA FROM A RETRIEVAL DEVICE AND STARTS IT UP
\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
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
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
2429 ;WHERE: D/ DEVICE NAME
\r
2431 ; D+2/ FILE EXT OR 0 (LH SIXBIT)
\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
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
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
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
2472 INTERN UGTSEG,UGTERR
\r
2477 JRST UGETHI ;IN SEGCON
\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
2492 INTERN SG1,SG3,SG4 ;CALLED FROM SEGCON
\r
2493 EXTERN USRDDT,USRREL,JOBSAV,JOBFF,CPOPJ1
\r
2494 EXTERN TTYFNU,JOBSVM,IADRCK,SAVDMP
\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
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
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
2512 OPEN 0,SGAMOD ;TRY TO ASSIGN DEVICE, SINCE IT MUST BE DONE
\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
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
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
2540 MOVE TAC1,DEVMOD(DEVDAT) ;RETURN DEVICE CHARACTERISTICS(IF DISK SYS)
\r
2541 TLNE TAC1,DVDSK ;IS THIS DEVICE A DISK?
\r
2543 MOVS TAC1,SGAPPN(PROG) ;YES. MAKE SURE FORTH WORD IS PROJ,PROG NO.
\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
2553 ;ERROR ON INIT OR DEVICE SEARCH
\r
2555 INTERN SGERRA ;CALLED FROM SEGCON
\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
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
2576 ; RETURN ONLY IF EVERYTHING OK
\r
2578 EXTERNAL JOBCOR,JOB,CPOPJ,JOBS41,JOB41
\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
2589 ; EITHER BECUASE NOHIGH SEG
\r
2590 ; ORHIGH SEG ALSO NEEDS LOW FILE
\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
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
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
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
2633 EXTERN USRHCU,USRJDA,JOBSA,JOBDDT,JOBSDD,JOBSD1,JOBSAV,JOBCOR
\r
2634 EXTERN JOBSV,JOBSV3,JOBSVD,JOBSDP
\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
2649 ;ROUTINE TO CHECK FOR IO ERRORS(CALLED FROM SEGCON)
\r
2650 ;CALL: MOVE F,DEVICE DATA BLOCK ADDRESS
\r
2652 ; RETURN ONLY IF NO ERRORS
\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
2668 SGREL: SKIPN DEVDAT,USRJDA ;HAS CHANNEL BEEN RELEASED ALREADY?
\r
2669 JRST SGREL2 ;YES, FIND TTY AND WAIT FOR OUTPUT TO FINISH
\r
2671 MOVE TAC1,DEVMOD(DEVDAT)
\r
2672 TLNE TAC1,DVMTA ;MAGTAPE?
\r
2673 TLNN DEVDAT,INPB ;YES, WAS AN INPUT DONE?
\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
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
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
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
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
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
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
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
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
2763 CAIGE AC1,JOBSDD(PROG) ;DON'T STORE DATA BELOW JOBSDD
\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
2774 \f;THIS ROUTINE WILL DELETE ALL DATA FROM A COMPRESSED FILE
\r
2775 ;WHICH IS BELOW JOBSOD (PROBABLY WRITTEN BY TENDUMP)
\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
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
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
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
2832 INTERN NROOM1 ;CALLED FROM SEGCON
\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
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
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
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
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
2878 ;ROUTINE TO PRINT FILE NOT FOUND ORNEEDS 2 RELOC REG
\r
2880 INTERN NOFILE ;CALLED FROM SEGCON
\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
2889 PUSHJ PDP,PRPER ;PRINT PERIOD
\r
2890 HLLZ TAC1,SGAEXT(PROG) ;PRINT EXTENSION
\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
2903 EXTERN JOBPD1,JOBPD3,USRJDA
\r
2905 SGRELL: ;LOOKUP OR ENTER FAILURE
\r
2907 MOVE TAC1,DEVMOD(DEVDAT) ;IS THIS DEVICE A DISK?
\r
2909 HRRZ TAC,SGAEXT(PROG) ;YES, RETURN DISK SERVICE ERROR CODE
\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
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
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
2935 COMEND: END ;END OF COMCON
\r