2 SUBTTL 2-OCT-70 ED YOURDON/VJC/DMN
\r
3 ;FILE UPDATE GENERATOR
\r
4 ;"COPYRIGHT 1968,1969,DIGITAL EQUIPMENT CORP. MAYNARD,MASS. U.S.A."
\r
6 VFUDGE==11 ;VERSION NUMBER
\r
7 VPATCH==0 ;DEC PATCH LEVEL
\r
8 VCUSTOM==0 ;NON-DEC PATCH LEVEL
\r
12 XWD VCUSTOM,VFUDGE+VPATCH*1000
\r
16 ;FUDGE ACCUMULATOR DEFINITIONS
\r
18 A= 1 ;GENERAL COMMUNICATION AC
\r
19 B= 2 ;SCRATCH ACCUMULATOR
\r
20 T= 3 ;USED IN /C AND /X ONLY
\r
21 C= 4 ;SCRATCH ACCUMULATOR
\r
22 D= 5 ;IO DEVICE NUMBER ACCUMULATOR
\r
23 E= 6 ;SCRATCH ACCUMULATOR
\r
24 F= 7 ;FLAG ACCUMULATOR
\r
25 G= 10 ;DEVICE CHARACTERISTICS AC
\r
26 H= 11 ;USED IN GETCHR AND GETCMN
\r
27 P= 12 ;PUSHDOWN POINTER AC
\r
28 R= 13 ;PROGRAM NAME-USED IN READ,WRITE
\r
29 S= 14 ;SIXBIT SYMBOL ACCUMULATOR
\r
30 DIS= 15 ;DISPATCH ACCUMULATOR
\r
31 EXT= 16 ;FILE NAME EXTENSION ACCUMULATOR
\r
32 SW= 17 ;SWITCH UUO AC
\r
34 \f;FUDGE FLAG DEFINITIONS (RIGHT HALF OF ACCUMULATOR F)
\r
36 DESTB== 1 ;1-DESTINATION DEVICE SEEN
\r
37 SAVEB== 2 ;1-SWITCH SEEN,BUT NOT EXECUTED
\r
38 SWTB== 4 ;1-SWITCH MODE ENTERED IN GETCHR
\r
39 SLSHB== 10 ;1-SWITCH MODE ENTERED WITH </>
\r
40 TTYOB== 20 ;1-NON-TTY OUTPUT;USED BY IO
\r
41 TTYCB== 40 ;1-NON-TTY OUTPUT;USED BY COMMAND
\r
42 PROGB== 100 ;1-PROGRAM NAME SEEN IN SPECIFICATION
\r
43 NOLOCB==200 ;1-DELETE LOCAL SYMBOLS ***VJC
\r
44 DEVB== 400 ;1-DEVICE NAME SEEN IN SPEC.
\r
45 EXTB== 1000 ;1-EXPLICIT FILE NAME EXTENSION
\r
46 ERRB== 2000 ;1-ERROR IN ENTRY BLOCK CHECK
\r
47 INFOB== 4000 ;1-VALID INFORMATION IN COMMAND
\r
48 CONB== 10000 ;1-CONTEXT OF <.> IS PROGRAM NAME
\r
49 ;0-CONTEXT OF <.> IS FILE NAME
\r
50 F4IB== 20000 ;1-IGNORE F4 OUTPUT
\r
51 CRLFTY==40000 ;1-CR,LF TYPED (FOR ERROR MSG)
\r
52 POPBAK==100000 ;1-XCT POPJ P, ;TO RETURN TO CALLING SEQ.
\r
53 XFLG== 200000 ;1-INDEX THIS FILE
\r
54 DTAFLG==400000 ;1-OUTPUT DEVICE IS DTA (SPECIAL INDEX)
\r
58 ;HANDY BITS FOR CALLS TO DEVCHR FOR DEVICE CHARACTERISTICS
\r
59 OUTBIT==1 ;1-DEVICE CAN DO OUTPUT
\r
60 INBIT== 2 ;1-DEVICE CAN DO INPUT
\r
61 DRCTRB==4 ;1-DEVICE HAS A DIRECTORY
\r
62 TTYBIT==10 ;1-DEVICE IS A TTY
\r
63 DTABIT==100 ;1-DEVICE IS A DTA
\r
64 LPTBIT==40000 ;1-DEVICE IS LPT
\r
65 DSKBIT==200000 ;1-DEVICE IS DSK
\r
67 ;OTHER USEFUL PARAMETER ASSIGNMENTS
\r
68 N== 200 ;SIZE OF MASTER AND TRAN BUFFERS
\r
69 XP== 20 ;SIZE OF PUSHDOWN LIST
\r
70 SIZE== 500 ;SIZE OF PURE ENTRY BLOCK
\r
71 X== SIZE+5 ;SIZE OF ENTRY AND SAVE BLOCKS
\r
72 IOEOF== 20000 ;1-END-OF-FILE HAS BEEN SEEN
\r
73 IOBKTL==40000 ;1-BLOCK-TOO-LARGE ERROR
\r
74 IODATA==100000 ;1-DATA ERROR
\r
75 IODEV== 200000 ;1-DEVICE ERROR
\r
76 IOBOT== 4000 ;1-MAG TAPE IS AT BEGINNING OF TAPE
\r
78 RIBALC==11 ;NUMBER OF BLOCKS ALLOCATED
\r
81 EXTERN JOBFF, JOBREL, JOBSYM, JOBSA
\r
83 OPDEF JSR [PUSHJ P,] ;PURE FOR RE-ENTRANT FUDGE
\r
85 \fSUBTTL INITIALIZE AND SETUP OF FUDGE2
\r
86 ;THIS SECTION OF CODING DOES THE FOLLOWING THINGS
\r
87 ; 1.RESETS ALL IO DEVICES BY CALLING [SIXBIT /RESET/]
\r
88 ; 2.INITIALIZES THE TELETYPE IN ASCII-LINE MODE
\r
89 ; 3.TYPES A * TO SIGNIFY READINESS FOR INPUT FROM USER
\r
90 ; 4.SETS UP A PUSHDOWN LIST
\r
91 ; 5.INITIALIZES VARIOUS ACCUMULATORS, CLEARS THE FLAGS,
\r
92 ; AND INITIALIZES THE MSTBUF AND TRNBUF COUNTERS
\r
94 FUDGE2: JFCL ;INCASE OF CCL ENTRY
\r
95 RESET ;RESET I/O DEVICES
\r
96 MOVE [XWD LOW,LOW+1]
\r
97 SETZM LOW ;CLEAR DATA AREA
\r
99 MOVE [XWD 17,11] ;TEST FOR LEVEL D
\r
100 SETZ ;FAILED, NOT LEVEL D
\r
101 TLNN (7B9) ;IS IT LEVEL D OR LATER?
\r
103 HRROI -2 ;THIS IS LEVEL D
\r
104 MOVEM LEVEL ;STORE STATE
\r
106 MOVEI 17,1 ;WITH A BLT OF ZERO
\r
107 BLT 17,17 ;FROM 0-17
\r
108 INIT 0,1 ;INITIALIZE TTY, CHANNEL 0
\r
110 XWD OBUF, IBUF ;ADDRESSES FOR BUFFER HEADERS
\r
111 HALT . ;ILLEGAL INSTRUCTION IF NO TTY
\r
112 OUTPUT 0, ;DUMMY OUTPUT ON TTY
\r
113 MOVEI A, "*" ;PICK UP A <*>
\r
114 IDPB A, OBUF+1 ;TYPE IT OUT
\r
115 OUTPUT 0, ;EMPTY THE BUFFER
\r
116 MOVE P, XPDLST ;SET UP A PUSHDOWN POINTER
\r
117 HRROI D,1 ;INITIALIZE DEVICE BUFFER
\r
118 MOVEM D, DEVBUF ;...
\r
119 MOVSI A, -N ;GET COUNT OF MSTBUF AND TRNBUF
\r
120 HRRI A, FILBUF+1 ;INITIALIZE POINTER IN FILBUF
\r
121 MOVEM A, FILBUF ;SET UP COUNT IN FILE BUFFER
\r
122 HRRI A, PRGBUF+1 ;INITIALIZE POINTER IN PRGBUF
\r
123 MOVEM A, PRGBUF ;...
\r
124 HRRI A,PPNBUF ;INITIAL POINTER IN PPNBUF
\r
126 \fSUBTTL FUDGE2 COMMAND STRING DISPATCHING
\r
127 ;THIS ROUTINE PICKS UP CHARACTERS FROM THE TELETYPE BUFFER AND
\r
128 ;DISPATCHES TO THE PROPER ROUTINE DEPENDING ON THE TYPE OF
\r
129 ;CHARACTER.A TABLE OF BYTES AND BYTE POINTERS ALLOWS EACH
\r
130 ;CHARACTER IN THE ASCII SET TO BE TREATED INDIVIDUALLY. THE
\r
131 ;ROUTINE MAY BE ENTERED AT GETCHR IF IT IS DESIRED TO ACCUMULATE
\r
132 ;A 6-LETTER SIXBIT SYMBOL IN AC S. SYMBOLS OF DIFFERENT LENGTHS
\r
133 ;MAY BE ACCUMULATED IN DIFFERENT REGISTERS BY SETTING THE CONTENTS
\r
134 ;OF AC B TO THE DESIRED LENGTH, AND PUTTING A BYTE POINTER IN E
\r
135 ;AND ENTERING THE ROUTINE AT GETCHR+4.
\r
137 GETCHR: TRZE F,POPBAK ;IMMEDIATE RETURN?
\r
139 MOVEI B, 6 ;SET COUNT OF SYMBOL TO 6
\r
140 MOVE E, SYMPTR ;SET UP A BYTE POINTER FOR AC S
\r
141 MOVEI S, 0 ;INITIALIZE SYMBOL ACCUMULATOR
\r
142 GETCMN: SOSG IBUF+2 ;IS TTY BUFFER EMPTY?
\r
143 INPUT 0, ;YES, FILL IT UP
\r
144 ILDB A, IBUF+1 ;GET A CHARACTER
\r
145 MOVE G, A ;GET A COPY OF IT IN AC G
\r
146 MOVE 0, CURCHR ;SAVE PREVIOUS CHAR
\r
147 MOVEM 0, LSTCHR ;AS LAST CHAR
\r
148 MOVEM A, CURCHR ;SAVE CURRENT CHAR
\r
149 IDIVI G, 11 ;TRANSLATE TO 4-BIT CODE
\r
150 LDB G, TABLE(H) ;USE PROPER BYTE POINTER
\r
151 CAIGE G, 4 ;MODIFY CODE IF .GE. 4
\r
152 TRNN F, SWTB ;MODIFY CODE IF IN SWITCH MODE
\r
153 ADDI G, 4 ;CHANGE DISPATCH BY ADDING 4
\r
154 HRRZ H, DSPTCH(G) ;GET PROPER DISPATCH ADDRESS
\r
155 CAIL G, 10 ;BUT CHANGE IF NOT CORRECT
\r
156 HLRZ H, DSPTCH-10(G) ;TO A LEFT HALF DISPATCH
\r
157 JRST (H) ;EXIT TO APPROPRIATE ROUTINE
\r
159 \fSUBTTL COMMAND DISPATCH TABLE AND BYTE POINTERS
\r
160 DSPTCH: XWD GETCMN,ERR16 ;IGNORED CHAR, BAD CHAR(SWITCH)
\r
161 XWD SWTCH, SWTCHA ;<(>, LETTER(SWITCH MODE)
\r
162 XWD COLON, ERR16 ;<:>, NUMBER(SWITCH MODE)
\r
163 XWD PERIOD,SWTCHE ;<.>, <)>ESCAPE SWITCH MODE
\r
164 XWD LFTARW,ERR17 ;<?>OR<=>, BAD CHAR (NORMAL MODE)
\r
165 XWD COMMA, STORE ;<,>, ALPHABETIC CHARACTER(NORMAL)
\r
166 XWD ALTMOD,STORE ;<$>,NUMERIC CHARACTER(NORMAL)
\r
167 XWD SLASH, ERR17 ;</>, <)> ILLEGAL ESCAPE
\r
168 XWD LBRACK, 0 ;LEFT ANGLE BRACKET, OR "["
\r
169 XWD RBRACK, 0 ;RIGHT ANGLE BRACKET
\r
171 TABLE: POINT 4, BITE(G), 3
\r
172 POINT 4, BITE(G), 7
\r
173 POINT 4, BITE(G), 11
\r
174 POINT 4, BITE(G), 15
\r
175 POINT 4, BITE(G), 19
\r
176 POINT 4, BITE(G), 23
\r
177 POINT 4, BITE(G), 27
\r
178 POINT 4, BITE(G), 31
\r
179 POINT 4, BITE(G), 35
\r
180 \f SUBTTL BYTE TABLE FOR DISPATCHING
\r
181 ;CLASSIFICATION BYTE CODES
\r
182 ; BYTE DISP CLASSIFICATION
\r
184 ; 00 00 ILLEGAL CHARACTER, SWITCH MODE
\r
185 ; 01 01 ALPHABETIC CHARACTER, SWITCH MODE
\r
186 ; 02 02 NUMERIC CHARACTER, SWITCH MODE
\r
187 ; 03 03 SWITCH MODE ESCAPE, SWITCH MODE
\r
189 ; 00 04 ILLEGAL CHARACTER, NORMAL MODE
\r
190 ; 01 05 ALPHABETIC CHARACTER, NORMAL MODE
\r
191 ; 02 06 NUMERIC CHARACTER, NORMAL MODE
\r
192 ; 03 07 SWITCH MODE ESCAPE, SWITCH MODE
\r
194 ; 04 10 IGNORED CHARACTER
\r
195 ; 05 11 ENTER SWITCH MODE WITH A <(>
\r
196 ; 06 12 DEVICE DELIMITER, <:>
\r
197 ; 07 13 FILE EXTENSION DELIMITER, <.>
\r
198 ; (CAN ALSO BE PART OF A PROGRAM NAME)
\r
199 ; 10 14 OUTPUT SPECIFICATION, <LFT ARW> OR <=>
\r
200 ; 11 15 FILE DELIMITER, <,>
\r
201 ; 12 16 COMMAND TERMINATOR, <ALT MODE>=33,175,176
\r
202 ; 13 17 ENTER SWITCH MODE WITH A </>
\r
203 ; 14 20 CHANGE CONTEXT OF PERIOD TO PROG NAME, <<> ,OR "["
\r
204 ; 15 21 CHANGE CONTEXT OF PERIOD TO FILE NAME, <>>
\r
206 ;BYTE TABLE CORRESPONDING TO 128 ASCII CHARS
\r
208 BITE: BYTE (4) 4,0,0,0,0,0,0,0,0 ;NUL
\r
209 BYTE (4) 4,4,4,4,4,0,0,0,0
\r
210 BYTE (4) 0,0,0,0,0,0,0,0,12 ;?Z=$
\r
211 BYTE (4) 12,0,0,0,0,11,0,4,0 ;$
\r
212 BYTE (4) 0,0,0,0,5,3,1,0,11 ;***DMN
\r
213 BYTE (4) 0,7,13,2,2,2,2,2,2 ;-,.,/,0,1,2,3,4,5
\r
214 BYTE (4) 2,2,2,2,6,0,14,10,15 ;6,7,8,9,:,;,<,=,>
\r
215 BYTE (4) 0,0,1,1,1,1,1,1,1 ; , , ,B,C,D,E,F,G
\r
216 BYTE (4) 1,1,1,1,1,1,1,1,1 ;H,I,J,K,L,M,N,O,P
\r
217 BYTE (4) 1,1,1,1,1,1,1,1,1 ;Q,R,S,T,U,V,W,X,Y
\r
218 BYTE (4) 1,14,0,0,0,10,0,1,1 ;Z,[, ,], ,?, ,A,B
\r
219 BYTE (4) 1,1,1,1,1,1,1,1,1 ;C,D,E,F,G,H,I,J,K
\r
220 BYTE (4) 1,1,1,1,1,1,1,1,1 ;L,M,N,O,P,Q,R,S,T
\r
221 BYTE (4) 1,1,1,1,1,1,0,0,12 ;U,V,W,X,Y,Z, , ,$
\r
222 BYTE (4) 12,4 ;$,DEL
\r
224 \fSUBTTL ROUTINES TO HANDLE 0-9,A-Z,. CHARACTERS
\r
225 ;IN THE COMMAND STRING. IN NORMAL MODE, THE CHARACTER IS
\r
226 ;DEPOSITED TO FORM A SIXBIT SYMBOL. NOTE THAT "." IS LEGAL IN A PROGRAM NAME.
\r
227 ;E.G. <EXP.1,ALLIO.>, IF ENCLOSED IN< >. IN SWITCH MODE, THE PROPER
\r
228 ;INSTRUCTION IS EXECUTED WITH THE AID OF A DISPATCH TABLE.
\r
229 ;THEN, IF SWITCH MODE WAS ENTERED WITH A SLASH, FUDGE2 EXITS
\r
232 STORE: TRO F,INFOB ; INDICATE VALID INFO SEEN
\r
233 SOJL B, GETCMN ; JUMP IF NO ROOM FOR CHARACTER
\r
234 CAIGE A,141 ;WORRY ABOUT LOWER CASE LETTERS
\r
235 SUBI A, 40 ;CONVERT FROM ASCII TO SIXBIT
\r
236 IDPB A, E ;STORE CHARACTER ACCORDING TO BYTE
\r
237 JRST GETCMN ;RETURN FOR NEXT CHARACTER
\r
239 SWTCHA: MOVSI SW, 072000 ;GET AN MTAPE OPCODE
\r
240 CAIL A,141 ;ACCEPT LOWER CASE SWITCHES
\r
242 XCT SLIST-101(A) ;EXECUTE PROPER SWITCH INSTRUCTION
\r
243 TRZE F, SLSHB ;SWITCH MODE ENTERED WITH A </>?
\r
244 TRZ F, SWTB ;YES, EXIT FROM SWITCH MODE
\r
245 JRST GETCMN ;RETURN FOR MORE CHARACTERS
\r
248 ;THE FOLLOWING THREE ROUTINES HANDLE THE CONTROL CHARACTERS IN
\r
249 ;THE COMMAND STRING WHICH CAUSE FUDGE2 TO ENTER INTO AND EXIT
\r
250 ;FROM SWITCH MODE. THERE ARE TWO TYPES OF SWITCH MODE, DEPENDING
\r
251 ;ON WHETHER THE IT IS ENTERED WITH A </> OR A <(>.
\r
253 SLASH: TRO F, SLSHB ;ENTER SWITCH MODE WITH A </>
\r
254 SWTCH: TROA F, SWTB ;ENTER SWITCH MODE WITH A <(>
\r
255 SWTCHE: TRZ F, SWTB ;EXIT FROM SWITCH MODE WITH A <)>
\r
256 JRST GETCMN ;RETURN FOR MORE CHARACTERS
\r
258 \fSUBTTL LEFT ARROW PROCESSOR
\r
259 ;THE LEFT ARROW PROCESSOR IS ENTERED BY A DISPATCH FROM THE
\r
260 ;COMMAND STRING. IT SIGNALS THE END OF THE DESTINGATION DEVICE
\r
261 ;SPECIFICATION. IF THE SIXBIT SYMBOL ACCUMULATOR S IS NON-
\r
262 ;ZERO, IT ASSUMES THAT THE USER HAS OMITTED THE FILE NAME DE-
\r
263 ;LIMITER, AND CALLS THE FILE NAME ROUTINE. A PROGRAM NAME
\r
264 ;SPECIFICATION IN THE OUTPUT DEVICE IS ILLEGAL.
\r
265 ;FLAG SETTINGS: THE DESTINATION FLAG (DESTB) IS SET TO ONE,
\r
266 ;THE DEVICE FLAG IS SET TO ZERO, AND THE PROGR?M NAME FLAG (PROGB)
\r
267 ;IS SET TO ONE SO THAT THE FIRST DEVICE AFTER THE LEFT ARROW
\r
268 ;WILL NOT RESULT IN A CALL TO PUTDEV.
\r
269 ;IF NO OUTPUT DEVICE IS SEEN DSK IS ASSUMED.
\r
270 ;POPBAK IS SET SO CONTROL RETURNS FRON COLON VIA GETCHR
\r
272 NODEV: PUSH P,S ;SAVE FILE NAME
\r
273 MOVSI S,(SIXBIT /DSK/);DSK IS DEFAULT DEVICE
\r
274 TRO F,POPBAK ;RETURN FROM GETCHR
\r
275 PUSHJ P,COLON ;FAKE A DEVICE SEEN
\r
276 POP P,S ;RESTORE FILE NAME
\r
280 LFTARW: PUSHJ P, SEMICP ;DO A LOOKUP IF NECESSARY
\r
281 TRZ F, DEVB ;SET THE DEVICE FLAG TO ZERO
\r
282 TRO F, PROGB+DESTB ;SET PROGRAM AND DESTINATION FLAGS
\r
283 JRST GETCHR ;RETURN FOR NEXT SYMBOL
\r
286 \fSUBTTL THIS CODE PROCESSES PROJECT-PROGRAMMER NUMBERS
\r
288 LSQB: SETZ T, ;START WITH ZERO
\r
289 PUSH P,T ;AND STORE IT
\r
290 LSQB1: PUSHJ P,TTYIN ;GET NEXT CHAR.
\r
291 CAIN A,"]" ;MATCHING SQB.?
\r
294 JRST SQBCMA ;YES,SORT OUT XWD
\r
295 CAIL A,"0" ;IS IT AN OCTAL NUMBER?
\r
297 JRST ERRISQ ;NO,ERROR
\r
298 LSH T,3 ;MAKE SPACE FOR NEXT CHAR.
\r
299 ADDI T,-60(A) ;ADDI IN NEW DIGIT
\r
302 JRST LSQB1 ;BACK FOR MORE
\r
304 SQBCMA: HRLZM T,(P) ;STORE LEFT HALF ON STACK
\r
305 SETZ T, ;START AFRESH
\r
306 JRST LSQB1 ;AND GET RIGHT HALF
\r
308 RSQB: HRRM T,(P) ;PUT RIGHT HALF ON STACK
\r
309 POP P,T ;AND POP XWD OFF
\r
310 MOVEM T,PRJPRG ;SAVE DEFAULT PROJ-PROG
\r
311 JUMPN S,GETCMN ;AFTER A FILE NAME IS ONLY TEMP.
\r
312 MOVEM T,DEFPPN ;PERMANENT DEFAULT PPN
\r
313 JRST GETCMN ;GET NEXT CHAR.
\r
315 TTYIN: SOSG IBUF+2 ;BUFFER EMPTY
\r
316 INPUT 0, ;YES, FILL IT UP
\r
317 ILDB A,IBUF+1 ;GET A CHARACTER
\r
318 POPJ P, ;AND RETURN
\r
320 ERRISQ: MOVEI B,[ASCIZ /?Illegal project-programmer number/]
\r
322 \fSUBTTL DISPATCH TABLE FOR SWITCHES
\r
324 SLIST: MOVEI DIS, APPEND ;A - APPEND INSTRUCTION
\r
325 PUSHJ P, BSWTCH ;B - BACKSPACE ONE FILE
\r
326 MOVEI DIS, DELCPY ;C - COPY AND DELETE LOCAL SYMBOLS ***VJC
\r
327 MOVEI DIS, DELETE ;D - DELETE INSTRUCTION
\r
328 MOVEI DIS, EXTRCT ;E - EXTRACT INSTRUCTION
\r
329 JRST ERR16 ;F - ERROR
\r
330 JRST ERR16 ;G - ERROR
\r
331 JRST ERR16 ;H - ERROR
\r
332 MOVEI DIS, INSERT ;I - INSERT INSTRUCTION
\r
333 JRST ERR16 ;J - ERROR
\r
334 PUSHJ P, KSWTCH ;K - SKIPFILE
\r
335 MOVEI DIS, LIST ;L - LIST COMMAND
\r
336 JRST ERR16 ;M - ERROR
\r
337 JRST ERR16 ;N - ERROR
\r
338 JRST ERR16 ;O - ERROR
\r
339 JRST ERR16 ;P - ERROR
\r
340 JRST ERR16 ;Q - ERROR
\r
341 MOVEI DIS, REPLCE ;R - REPLACE INSTRUCTION
\r
342 JRST ERR16 ;S - ERROR
\r
343 PUSHJ P, TSWTCH ;T - SKIP TO LOGICAL END OF TAPE
\r
344 JRST ERR16 ;U - ERROR
\r
345 JRST ERR16 ;V - ERROR
\r
346 PUSHJ P, WSWTCH ;W - REWIND MAG TAPE
\r
347 MOVEI DIS,INDEX ;X - INDEX THIS LIBRARY
\r
348 JRST ERR16 ;Y - ERROR
\r
349 PUSHJ P, ZSWTCH ;Z - CLEAR DIRECTORY ON DECTAPE
\r
352 ;MAGTAPE AND DECTAPE DEVICE SWITCH HANDLERS
\r
353 ;THE FOLLOWING ROUTINES HANDLE THE B,K,T,W, AND Z SWITCHES
\r
354 ;BY ASSEMBLING THE PROPER CALL OR UUO INSTRUCTION. IF A
\r
355 ;DEVICE HAS ALREADY BEEN SEEN, THE CHANNEL NUMBER IS LOADED
\r
356 ;INTO THE COMMAND, AND THE INSTRUCTION IS EXECUTED. OTHER-
\r
357 ;WISE, EXECUTION IS DEFERRED BY SETTING A FLAG AND STORING
\r
358 ;THE PARTIALLY ASSEMBLED INSTRUCTION. THE INSTRUCTION IS
\r
359 ;EXECUTED LATER, AFTER THE DEVICE HAS BEEN SEEN.
\r
361 BSWTCH: ADDI SW, 1 ;CODE FOR BACKSPACE IS 17
\r
362 KSWTCH: ADDI SW, 6 ;CODE FOR SKIPFILE IS 16
\r
363 TSWTCH: ADDI SW, 7 ;CODE FOR SKIP TO L.E.O.T. IS 10
\r
364 WSWTCH: AOJA SW,.+2 ;CODE FOR REWIND IS 1
\r
365 ZSWTCH: MOVE SW, DTCLR ;DIFFERENT UUO FOR /Z
\r
366 TRO F, SAVEB ;TURN ON THE SWITCH BIT
\r
368 \fSUBTTL PERIOD PROCESSOR
\r
369 ;THE PERIOD PROCESSOR IS CALLED BY A DISPATCH FROM GETCHR. IT
\r
370 ;PRECEDES A FILE NAME EXTENSION, UNLESS THE CONTEXT BIT CONB IS
\r
371 ;A ONE (CONB=1), IN WHICH CASE, THE PERIOD WAS FOUND INSIDE AN
\r
372 ;ANGLE BRACKET, INDICATING THAT IT IS PART OF A PROGRAM NAME.
\r
373 ;THE EXTENSION NAME IS GOTTEN BY ENTERING THE GETCHR ROUTINE
\r
374 ;WITH THE LENGTH SET TO THREE CHARACTERS, AND A BYTE POINTER
\r
375 ;SET TO STORE THE SYMOL IN ACCUMULATOR EXT. THE EXTENSION
\r
376 ;FLAG IS SET BY THIS ROUTINE.
\r
378 PERIOD: TRNE F, CONB ;IS PERIOD PART OF A PROGRAM NAME?
\r
379 JRST STORE ;YES, STORE IT IN SYMBOL
\r
380 TRO F, EXTB ;NO, SET EXTENSION FLAG
\r
381 MOVE E, EXTPTR ;GET ANOTHER BYTE POINTER
\r
382 MOVEI B, 3 ;ASSEMBLE A 3-CHARACTER WORD
\r
383 JRST GETCMN ;BUT DONT DESTROY S
\r
385 \fSUBTTL ROUTINES TO PROCESS ANGLE BRACKETS
\r
386 ;THE FOLLOWING ROUTINES PROCESS THE LEFT ANGLE BRACKET "<"
\r
387 ;AND RIGHT ANGLE BRACKET ">" CHARACTERS. THEY ARE ENTERED BY
\r
388 ;A DISPATCH FROM THE GETCHR ROUTINE. THE ANGLE BRACKETS
\r
389 ;CAN ACT AS FILE NAME OR PROGRAM NAME DELIMITERS, SO A CHECK
\r
390 ;IS MADE TO SEE IF THE SYMBOL ACCUMULATOR IS NON-ZERO. THE
\r
391 ;MAIN FUNCTION OF THE ROUTINES IS TO SET OR CLEAR THE CONTEXT
\r
392 ;BIT CONB, WHOSE INTERPRETATION IS AS FOLLOWS:
\r
393 ;SETTING OF BIT MEANING
\r
394 ; 0 COMMAS DELIMIT FILE NAMES, AND PERIODS
\r
395 ; DELIMIT FILE NAME EXTENSIONS
\r
396 ; 1 COMMAS DELIMIT PROGRAM NAMES, AND PERIODS
\r
397 ; ARE PART OF A PROGRAM NAME
\r
399 LBRACK: TRNN F, DESTB ;IS THIS THE OUTPUT DEVICE?
\r
400 JRST ERROR1 ;YES, SYNTAX ERROR
\r
401 CAIN A,"[" ;PROJECT-PROGRAMMER PAIR?
\r
402 JRST LSQB ;YES, HANDLE IT
\r
403 MOVE 0,SDEVCHR ;GET SAVED DEV CHRSTCS
\r
404 TLNN 0,DTABIT+DSKBIT ;LAST DEVICE DSK OR DTA?
\r
406 MOVE 0,LSTCHR ;GET LAST CHAR
\r
407 CAIN 0,72 ;WAS IT COLON?
\r
408 JRST ERROR1 ;YES,:< ILLEGAL
\r
409 LBRACA: ;NO CONTINUE
\r
410 PUSHJ P, SEMICP ;PROCESS THE FILE NAME
\r
411 TRO F, CONB ;SET CONTEXT TO PROGRAM NAMES
\r
412 AOS MATCH ;ADD ONE FOR EACH LEFT < ***VJC
\r
413 JRST GETCHR ;RETURN FOR MORE CHARACTERS
\r
415 RBRACK: JUMPE S,.+2 ;IS THERE A SYMBOL TO HANDLE?
\r
416 PUSHJ P,COMMAP ;YES,PROCESS THE FILE NAME
\r
417 TRZ F,CONB ;SET CONTEXT TO FILE NAMES
\r
418 SOS MATCH ;SUBTRACT ONE FOR EACH RIGHT > ***VJC
\r
419 JRST GETCHR ;RETURN FOR MORE CHARACTERS
\r
421 \fSUBTTL COMMA PROCESSOR
\r
422 ;THE COMMA ROUTINE IS ENTERED BY A DISPATCH FROM GETCHR.
\r
423 ;IT DETERMINES WHETHER THE COMMA DELIMITS A FILE NAME OR A
\r
424 ;PROGRAM NAME, AND TRANSFERS CONTROL EITHER TO SEMICP OR TO
\r
427 COMMA: TRNN F, CONB ;FILE NAME OR PRGRAM NAME?
\r
428 JRST COMMAX ;FILE NAME
\r
429 PUSHJ P, COMMAP ;PROGRAM NAME
\r
430 JRST GETCHR ;RETURN FOR MORE CHARACTERS
\r
432 COMMAX: PUSHJ P, SEMICP ;FILE NAME, DO A LOOKUP
\r
433 SETZM PRJPRG ;CLEAR TEMP. PPN
\r
434 JRST GETCHR ;RETURN FOR MORE CHARACTERS
\r
436 \fSUBTTL COLON PROCESSOR
\r
437 ;THIS ROUTINE IS ENTERED BY A DISPATCH FROM THE GETCHR
\r
438 ;ITS PURPOSE IS TO INITIALIZE DEVICES USED BY FUDGE2 AND
\r
439 ;ASSIGN THEM A CHANNEL NUMBER. IF THE DEVICE IS THE TTY, THE
\r
440 ;ROUTINE EXITS IMMEDIATELY, SINCE THE TTY HAS ALREADY BEEN
\r
441 ;INITIALIZED. IF A PROGRAM WAS NOT SEEN IN THE PREVIOUS DEVICE
\r
442 ;SPECIFICATION, THEN THE PRECEDING FILE HAD NO PROGRAMS
\r
443 ;FOLLOWING IT, AND A ZERO IS PLACED IN THE LIST STRUCTURE IN
\r
444 ;THE 3-WORD FILE BLOCK, SO THAT THE GETDEV ROUTINE WILL
\r
445 ;KNOW THAT THE ENTIRE FILE IS DESIRED. IF THE COLON ROUTINE
\r
446 ;IS CALLED WITH 0 IN ACCUMULATOR S, THE ROUTINE ASSUMES
\r
447 ;THAT SOMETHING LIKE "DTA3:FOO?DTA4:BAR<X,Y,Z>,MTA0:::/R"
\r
448 ;WAS TYPED, AND IT PUTS A PHONY FILE NAME IN FILBUF TO KEEP
\r
449 ;THE BOOK-KEEPING STRAIGHT.
\r
451 COLON: TRO F, DEVB ;DEVICE WAS SEEN IN THIS SPEC.
\r
452 TRNE F,POPBAK ;DEFAULT "DSK" BEING SET
\r
453 JRST .+3 ;SO DON'T CLEAR PROJ-PROG
\r
454 SETZM DEFPPN ;CLEAR PERMANENT PPN
\r
455 SETZM PRJPRG ;AND TEMP. ALSO
\r
456 JUMPE S, COLONC ;NULL S IMPLIES FILES ON MTA,PTR
\r
457 MOVEM S, COLON2 ;SAVE DEVICE FOR INIT
\r
458 MOVE G, S ;GET A COPY OF THE DEVICE NAME
\r
459 DEVCHR G, ;GET ITS CHARACTERISTICS
\r
460 MOVEM G,SDEVCHR ;SAVE DEV CHRSTCS ***VJC
\r
461 TLNE G,TTYBIT!LPTBIT ;IF EITHER TTY OR LPT
\r
462 SETZM LEVEL ;DON'T DO EXTENDED LOOKUPS EVER
\r
463 TLNE G, TTYBIT ;IS THE DEVICE A TTY?
\r
464 JRST GETCHR ;YES, RETURN IMMEDIATELY
\r
465 TRNN F, DESTB ;IS THIS THE OUTPUT DEVICE?
\r
466 JRST COLON4 ;YES, GO CHECK SEPARATE THINGS
\r
467 MOVE D, DEVBUF ;GET POINTER TO DEVICE NAME TABLE
\r
468 COLON6: AOBJP D, COLON7 ;MORE DEVICES TO CHECK?
\r
469 CAMN S, DEVBUF(D) ;HAS DEVICE ALREADY BEEN INITTED?
\r
470 JRST GETCHR ;YES, DON'T RE-INIT IT
\r
471 JRST COLON6 ;CHECK SOME MORE
\r
473 COLON7: MOVEM S, DEVBUF(D) ;STORE THE NEW DEVICE NAME
\r
474 MOVSI A, -1 ;FIX UP THE COUNT IN THE BUFFER
\r
475 ADDM A, DEVBUF ;...
\r
476 TLNN G, INBIT ;CAN DEVICE DO INPUT?
\r
477 JRST ERROR4 ;NO, ERROR
\r
478 MOVEI S, 0 ;CLEAR OUT THE SYMBOL WORD
\r
479 TRON F, PROGB ;WAS A PROGRAM NAME SEEN?
\r
480 PUSHJ P, STNULL ;NO, STORE A NULL IN FILE BLOCK
\r
481 MOVE A, D ;CALCULATE BUFFER HEADER POSITION
\r
482 IMULI A, 3 ;3 WORDS PER BUFFER HEADER
\r
483 ADDI A, IBUF ;ALL BUFFER HEADERS IN IBUF BLOCK
\r
484 COLON8: AOS NUMDEV ;ONE MORE DEVICE SEEN
\r
485 MOVEM A, COLON3 ;SAVE WORD FOR INIT
\r
486 MOVEI A, 14 ;SET MODE TO BINARY
\r
487 TLNE G,LPTBIT ;IS DEVICE THE LPT?
\r
488 MOVEI A, 0 ;YES, RESTORE MODE TO ASCII
\r
489 HRRM A, COLON0 ;SAVE MODE FOR INIT
\r
490 DPB D, [POINT 4,COLON1,12]
\r
491 XCT COLON1 ;DO OPEN ON DEVICE
\r
492 JRST ERROR9 ;DEVICE NOT AVAILABLE
\r
493 TRNN F, DESTB ;IS THIS THE OUTPUT DEVICE?
\r
494 JRST GETCHR ;YES, NO MORE CHECKING - EXIT
\r
495 TLNN G, DRCTRB ;DOES DEVICE HAVE A DIRECTORY?
\r
496 COLONC: PUSHJ P, COLONB ;NO, GIVE IT A PHONY FILE NAME
\r
497 JRST GETCHR ;RETURN FOR MORE CHARACTERS
\r
499 ;OUTPUT DEVICE ONLY
\r
501 COLON4: MOVEM S, DEVBUF+1 ;SAVE THE DEVICE NAME
\r
502 MOVEI D, 1 ;SET DEVICE NUMBER TO 1
\r
503 TLNN G, OUTBIT ;CAN DEVICE DO OUTPUT?
\r
504 JRST ERROR4 ;NO, ERROR
\r
505 TLNE G,DTABIT ;IS DEVICE DTA?
\r
506 TRO F,DTAFLG ;YES, SET IN CASE INDEXING
\r
507 MOVSI A, OBUF+3 ;CALCULATE BUFFER HEADER ADDRESS
\r
508 TRO F, TTYCB ;INDICATE NON-TTY IO
\r
509 JRST COLON8 ;ENTER MAIN PROCESSING LOOP
\r
511 COLONB: MOVEI S, 465757 ;FILE NAME OF "FOO"
\r
512 ;FALLS THROUGH TO SEMICP ROUTINE
\r
513 \fSUBTTL FILE NAME PROCESSOR
\r
514 ;THIS ROUTINE IS CALLED BY THE COMMA ROUTINE WHEN IT HAS
\r
515 ;BEEN DETERMINED THAT THE CONTEXT OF THE COMMA IS THAT OF A
\r
516 ;FILE NAME. NULL FILES ARE IGNORED BY THE ROUTINE, AND CAUSE
\r
517 ;AN IMMEDIATE RETURN TO GETCHR. FOR OUTPUT DEVICES, AN ENTER
\r
518 ;IS PERFORMED, WHILE FOR INPUT DEVICES, THE FLOW OF CONTROL IS
\r
520 ; 1. IF THE PREVIOUS FILE HAD NO PROGRAMS, A ZERO IS
\r
521 ; STORED IN THE 3RD WORD OF THE FILE BLOCK OF THAT
\r
522 ; FILE - THE WORD THAT ORDINARILY POINTS TO THE
\r
524 ; 2. THE PROGRAM LIST FOR THE PREVIOUS FILE IS TERMINATED
\r
525 ; BY PUTTING A ZERO IN THE PROGRAM BUFFER, AND PUTTING
\r
526 ; A POINTER TO THE ZERO IN THE 3RD WORD OF THIS FILE
\r
527 ; BLOCK (NOT THE PREVIOUS BLOCK)
\r
528 ; 3. THE FILE NAME AND FILE NAME EXTENSION AND THE DEVICE
\r
529 ; CHANNEL NUMBER OF THE CURRENT FILE ARE STORED.
\r
531 SEMICP: TRNN F,DEVB ;HAS A DEVICE BEEN SEEN?
\r
532 PUSHJ P,NODEV ;NO, SO ASSUME "DSK"
\r
533 CAME SW,DTCLR ;Z SWITCH? YES, OPERATE ON OUTPUT ONLY
\r
534 DPB D, [POINT 4,SW,12]
\r
535 TRZE F, SAVEB ;IS THERE A SWITCH TO PROCESS?
\r
536 XCT SW ;YES, EXECUTE IT
\r
537 JUMPE S, SEMIC3 ;IGNORE NULL FILES
\r
539 SEMICA: TRZN F, EXTB ;EXPLICIT EXTENSION SEEN?
\r
540 HRLI EXT, 624554 ;NO, REPLACE WITH REL"
\r
541 TRNN F, DESTB ;OUTPUT DEVICE?
\r
542 JRST SEMIC2 ;YES, PROCESS SEPARATELY
\r
543 PUSH P, S ;SAVE FILE NAME
\r
544 MOVEI S, 0 ;PUT IN A ZERO
\r
545 TRZN F, PROGB ;WAS A PROGRAM SEEN IN PREVIOUS?
\r
546 PUSHJ P, STNULL ;NO, CLOSE OUT PREVIOUS FILE
\r
547 PUSHJ P, PUTPRG ;YES, CLOSE OUT PREVIOUS PRGLST
\r
548 SEMIC4: POP P, S ;RESTORE FILE NAME
\r
549 CAMN S,[12B5] ;IS IT * ?***DMN
\r
550 JRST ASTRSK ;YES ***DMN
\r
551 PUSHJ P, PUTFIL ;NO, STORE FILENAME
\r
552 MOVE S,DEFPPN ;GET GLOBAL PPN
\r
553 PUSHJ P,PUTPPN ;SAVE IT
\r
554 MOVE S, EXT ;GET FILE NAME EXTENSION
\r
555 PUSHJ P, PUTFIL ;STORE IT
\r
556 HRRM D, (A) ;STORE CHANNEL NUMBER, ALSO
\r
557 MOVE S,PRJPRG ;GET TEMP. PPN
\r
558 PUSHJ P,PUTPPN ;SAVE IT ALSO
\r
559 HRRZ S, PRGBUF ;GET A POINTER TO PROGRAM LIST
\r
560 JRST PUTFIL ;STORE IT AND EXIT
\r
562 STNULL: HRRZ A, FILBUF ;GET ADDRESS OF CURRENT BLOCK
\r
563 SETZM (A) ;CLOSE OUT THE FILE
\r
566 \fSUBTTL ENTER ON OUTPUT DEVICE DIRECTORY
\r
568 SEMIC2: MOVEM S, EBLOCK ;SAVE FILE NAME FOR ENTER
\r
569 MOVEM EXT, EBLOCK+1 ;SAVE FILE NAME EXTENSION
\r
570 DPB D, [POINT 4,SEMIC1,12]
\r
571 SETZM EBLOCK+2 ;CLEAR DATA AND PROTECTION
\r
572 MOVE T,SDEVCHR ;GET CHARACTERISTICS
\r
573 TLNN T,DSKBIT ;IF NOT A DSK
\r
574 SETZM LEVEL ;CLEAR LEVEL D FLAG
\r
575 SKIPE T,LEVEL ;EITHER -2 OR 0
\r
576 JRST DEFENT ;SAVE ENTRY BLOCK
\r
577 XCT SEMIC1 ;DO AN ENTER ON THE OUTPUT DEVICE
\r
578 JRST ERR14 ;DIRECTORY FULL
\r
579 SEMIC3: POPJ P, ;EXIT
\r
581 DEFENT: MOVE T,[XWD EBLOCK,SVENTR]
\r
582 BLT T,SVENTR+1 ;SAVE EBLOCK
\r
583 MOVEI T,RIBALC ;SET FOR 11 WORD LOOKUP
\r
584 MOVEM T,EBLOCK-2 ;IN EXTENDED LOOKUP
\r
585 JRST SEMIC3 ;DEFER ENTRY TIL AFTER LOOKUP
\r
586 \fSUBTTL THE PROGRAM NAME PROCESSOR
\r
587 ;THE COMMAP ROUTINE IS ENTERED BY A CALL FROM THE COMMA
\r
588 ;ROUTINE WHEN THE CONTEXT OF A COMMA IS THAT OF A PROGRAM NAME
\r
589 ;DELIMITER. ITS PURPOSE IS TO SAVE UP THE PROGRAM NAMES IT SEES
\r
590 ;IN THE PROGRAM BUFFER PRGBUF. THE PROGRAM NAMES ARE CONVERTED
\r
591 ;TO RADIX 50 REPRESENTATION, AND A CALL TO PUTPRG STORES THE
\r
592 ;PROGRAM NAME FOR LATER REFERENCE BY THE VARIOUS FUDGE SUBROUTINES
\r
593 ;------------------------------------------------------------------
\r
594 ;RADIX50 - SIXBIT CODE CONVERSION TABLE
\r
596 ;CHARACTER SIXBIT RADIX50
\r
603 ;-------------------------------------------------------------------
\r
604 ;THE SYMBOL IS ASSUMED TO LEFT-JUSTIFIED UPON ENTERING, AND
\r
605 ;IS RIGHT-JUSTIFIED BEFORE CONVERSION TO RADIX 50.
\r
607 ;FLAG SETTINGS: THE PROGRAM BIT PROGB IS SET TO 1, AND THE FILE
\r
608 ;BIT FILEB IS SET TO 0.
\r
609 COMMAP: TRO F, PROGB ;SET PROGRAM BIT
\r
610 TRNN F, DESTB ;IS THIS THE OUTPUT DEVICE?
\r
611 JRST ERROR1 ;YES, SYNTAX ERROR
\r
612 MOVE E, SYMPTR ;SET UP A BYTE POINTER TO S
\r
613 MOVEI B, 6 ;SET COUNTER TO SIX
\r
615 JUMPE S, COMMA1 ;NULL SYMBOL?
\r
616 COMMA3: TRNE S, 77 ;IS SYMBOL RIGHT-JUSTIFIED YET?
\r
617 JRST COMMA1 ;YES, GO CONVERT TO RADIX 50
\r
618 ROT S, -6 ;NO, SHIFT IT ONE PLACE RIGHT
\r
619 JRST COMMA3 ;CHECK AGAIN
\r
620 COMMA1: IMULI C, 50 ;CONVERT TO RADIX50
\r
621 ILDB A, E ;PICK UP NEXT CHARACTER IN S
\r
622 JUMPE A, COMMA4 ;A BLANK IS A BLANK IS A BLANK!
\r
623 CAIN A, 4 ;IS IT A <$>?
\r
624 ADDI A, 70 ;YES, COMPENSATE FOR SUBTRACTION
\r
625 CAIN A, 16 ;IS IT A <.>?
\r
626 ADDI A, 55 ;YES, COMPENSATE FOR SUBTRACTION
\r
627 CAILE A, 31 ;TRANSLATE TO RADIX 50 CODE
\r
628 SUBI A, 7 ;LETTER - SUBTRACT 26
\r
629 SUBI A, 17 ;NUMBER - SUBTRACT 17
\r
630 ADD C, A ;COMBINE WITH PARTIAL WORD
\r
631 COMMA4: SOJG B, COMMA1 ;LOOP FOR SIX CHARACTERS
\r
632 MOVE S, C ;PUT SYMBOL BACK IN S
\r
633 JRST PUTPRG ;STORE IT AND EXIT
\r
635 \fSUBTTL THE ALTMODE PROCESSOR
\r
636 ;THE ALTMODE SUBROUTINE IS CALLED BY A DISPATCH FROM THE
\r
637 ;GETCHR ROUTINE WHEN A $ IS SEEN IN THE COMMAND STRING. IT SIGNALS
\r
638 ;THE END OF THE COMMAND STRING. A CHECK IS MADE ON THE SYNTAX
\r
639 ;OF THE COMMAND STRING, TO SEE IF AN OUTPUT DEVICE WAS SPEC-
\r
640 ;IFIED, AND TO SEE IF A COMMAND WAS GIVEN. THE LIST
\r
641 ;STRUCTURE FOR THE FILE NAMES AND PROGRAM NAMES IS TERMINATED
\r
642 ;BY TWO CALLS TO SEMICP, THE LAST OF WHICH HAS A FILE NAME OF 0.
\r
643 ;THE POINTERS AT THE TOP OF THE FILBUF,PRGBUF AND DEVBUF BUFFERS
\r
644 ;ARE RESET FOR LATER USER BY THE VARIOUS SUBROUTINES.
\r
646 ALTMOD: TRNN F,INFOB ; IS THERE A COMMAND?
\r
647 JRST FUDGE2 ; NO, RESTART
\r
648 PUSHJ P,CRLF ; ACKNOWLEDGE WITH A CR LF
\r
649 TRO F,CRLFTY ;INDICATE CR,LF TYPED
\r
650 PUSHJ P, SEMICP ;STORE THIS FILE NAME
\r
651 MOVEI S, 0 ;MAKE A NULL FILE NAME
\r
652 PUSHJ P, SEMICA ;TERMINATE THE LIST STRUCTURE
\r
653 MOVE A, FILXWD ;SET UP A BLT POINTER TO FIX
\r
654 BLT A, FILBUF+3 ;THE MASTER FILE PART,1ST WORD OF
\r
655 SETZM FILBUF+4 ;FILBUF WAS JUNK,NOW 4TH WORD=0
\r
656 MOVEI A, FILBUF+5 ;RESET POINTER TO TRANS. FILES
\r
657 MOVEM A, FILBUF ;...
\r
658 MOVEI A,PPNBUF+1 ;RESET PPNBUF
\r
659 MOVEM A,PPNBUF ;AS IT WAS AT START
\r
660 JUMPE DIS, ERROR1 ;NO COMMAND SEEN?
\r
661 TRNN F, DESTB ;NO OUTPUT FILE MENTIONED?
\r
662 JRST ERROR1 ;SYNTAX ERROR
\r
663 SKIPE MATCH ;LEFT < EQU RIGHT > ?***VJC
\r
664 JRST ERROR1 ;SYNTAX ERROR ***VJC
\r
665 TRNE F, TTYCB ;CHANGE OUTPUT IF ON TTY
\r
667 ;AND FALL INTO INBUF0
\r
670 ;SEE HOW MANY 204(8) WORD BLOCKS FIT IN JOBREL-JOBFF.
\r
671 ;DIVIDE THIS NUMBER BY THE NUMBER OF DEVICES
\r
672 ;IN DEVBUF TABLE. THIS GIVES THE NO. OF BLOCKS
\r
673 ;THAT CAN BE ASSIGNED TO EACH DEVICE, IF ZERO,
\r
674 ;NEED MORE CORE. THE REMAINDER OF THE DIVISION
\r
675 ;INDICATES EXTRA BLOCKS THAT MAY BE
\r
676 ;ALLOCATED TO OUTPUT OR INPUT DEVICES
\r
678 INBUF0: HRRZ A, JOBREL ;GET TOP OF JOB AREA
\r
679 SUB A,JOBFF ;BUFFER AREA AVAILABLE
\r
680 IDIVI A, 204 ;NUMBER OF DECTAPE BLOCKS
\r
681 IDIV A,NUMDEV ;DIVIDED BY NUMBER OF DEVICES
\r
682 JUMPE A,INBUFG ;NOT ENOUGH CORE
\r
683 MOVEI E,2 ;START INBUFS ON DEVICE #2
\r
684 TRNE F, TTYCB ;IS OUTPUT ON TTY?
\r
685 JRST INBUF1 ;NO, DO AN OUTBUF
\r
686 INBUF2: MOVE C, A ;PICK UP NUMBER OF BLOCKS
\r
687 SOJL A+1,.+2 ;ANY EXTRA BLOCKS? (REMAINDER)
\r
688 AOJ C, ;YES, USE THEM
\r
689 DPB E, [POINT 4, INBUF3,12]
\r
690 XCT INBUF3 ;PERFORM THE INBUF
\r
691 CAMGE E, D ;MORE DEVICES TO TAKE CARE OF?
\r
692 AOJA E, INBUF2 ;YES, PROCESS THEM
\r
693 JRST (DIS) ;NO, GO TO APPROPRIATE SUBROUTINE
\r
696 INBUF1: MOVE C, A ;PICK UP NUMBER OF BLOCKS
\r
697 SOJL A+1,.+2 ;ANY EXTRA BLOCKS?
\r
698 AOJ C, ;YES, GIVE ONE TO OUTPUT
\r
699 INBUF4: OUTBUF 1,(C) ;OUTBUF ON DEVICE #1
\r
700 JRST INBUF2 ;GO DO SOME INBUFS
\r
703 INBUFG: HRRZ A,JOBREL ;GET ANOTHER K OF CORE
\r
706 JRST ERR22 ;NOT AVAILABLE
\r
707 JRST INBUF0 ;TRY TO SET UP BUFFERS
\r
708 \fSUBTTL FUDGE2 COMMAND PROCESSORS
\r
711 ;THIS ROUTINE PROCESSES THE L COMMAND IN FUDGE2. BINARY
\r
712 ;PROGRAMS ARE READ, AND THEIR NAMES OUTPUT, UNTIL AN END
\r
713 ;OF FILE IS REACHED.
\r
715 LIST: TRNN F,TTYOB ;OUTPUT TO TTY?
\r
716 JRST LIST1 ;MODE MUST BE ASCII
\r
717 GETSTS 1,T ;GET STATUS
\r
718 TRZN T,14 ;BINARY MODE SET?
\r
719 JRST LIST1 ;NO, MUST BE ASCII
\r
720 SETSTS 1,(T) ;CHANGE MODE TO ASCII
\r
721 MOVSI T,700 ;SET UP NEW BYTE POINTER
\r
722 MOVEM T,OBUF+4 ;SO WORD COUNT WILL BE CORRECT
\r
723 LIST1: PUSHJ P, MSTGET ;GET THE MASTER DEVICE
\r
724 JRST ERROR6 ;NOT ENOUGH ARGUMENTS
\r
725 SETOM NOWARN ;DON'T GIVE WARNING MESSAGE IF INDEX SEEN
\r
726 LIST2: PUSHJ P, READ ;READ A PROGRAM NAME
\r
727 JRST EXIT ;ALL DONE
\r
728 MOVE B, A ;GET THE PROGRAM NAME IN B
\r
729 PUSHJ P, PTYPO ;TYPE IT OUT
\r
730 PUSHJ P, CRLF ;TYPE A CRLF
\r
731 JRST LIST2 ;RETURN FOR MORE PROGRAM NAMES
\r
735 ;THIS ROUTINE PROCESSES THE R COMMAND IN FUDGE2. THE TOTAL
\r
736 ;COMMAND STRING IS BROKEN INTO A LIST OF PROGRAMS FOR THE MASTER
\r
737 ;DEVICE, AND A LIST OF PROGRAMS FOR THE TRANSACTION DEVICES.
\r
738 ;THE ROUTINE READS THE MASTER FILE UNTIL ONE OF THE DESIRED
\r
739 ;REPLACEMENT PROGRAMS IS REACHED, THEN SWITCHES TO THE
\r
740 ;TRANSACTION DEVICE TO FIND THE PROGRAM WHICH IS TO REPLACE THE
\r
741 ;PROGRAM IN THE MASTER FILE. AFTER THE REPLACEMENT HAS BEEN
\r
742 ;EFFECTED, RESET IS CALLED TO RESTORE THE MASTER DEVICE TO ITS
\r
745 REPLCE: PUSHJ P, MSTGET ;GET A PROGRAM FROM MASTER DEVICE
\r
746 JRST IPROC7 ;NO MORE, COPY REST OF MASTER
\r
747 PUSHJ P, COPYTO ;COPY UP TO THE PROGRAM NAME
\r
748 PUSHJ P, TRNGET ;GET A PROGRAM FROM TRANSACTION
\r
749 JRST ERROR5 ;USER DID NOT SUPPLY ENOUGH
\r
750 PUSHJ P, FINDCP ;FIND THE PROGRAM AND COPY IT
\r
751 CAIN D, 2 ;HAS THE MASTER DEVICE BEEN MOVED?
\r
752 PUSHJ P, RESET ;YES, RESET IT
\r
753 JRST REPLCE ;LOOK FOR MORE REPLACEMENTS
\r
754 \fSUBTTL INSERT PROCESSOR
\r
755 ;THIS SUBROUTINE PROCESSES THE I COMMAND IN FUDGE. IT READS AND
\r
756 ;WRITES PROGRAMS FROM THE MASTER FILE UNTIL IT FINDS THE
\r
757 ;PROGRAM NAME CURRENTLY POINTED TO, AT WHICH TIME IT STARTS READING
\r
758 ;FROM THE TRANSACTION DEVICE, MAKING AN INSERTION AT THE
\r
761 INSERT: PUSHJ P, MSTGET ;GET A PROGRAM FROM MASTER FILE
\r
762 JRST IPROC7 ;NO MORE, COPY REST OF MASTER
\r
763 PUSHJ P, COPYTO ;COPY UP TO A PROGRAM NAME
\r
764 MOVEM C, SAVEAC ;SAVE SPECIAL ACCUMULATOR
\r
765 MOVE D, [XWD ENTBLK,SVEBLK]
\r
766 BLT D, X+1(C) ;MOVE ENTRY BLOCK INTO SAFE PLACE
\r
767 PUSHJ P, TRNGET ;GET NEXT TRANSACTION FILE
\r
768 JRST ERROR5 ;NOT ENOUGH TRANSACTION FILES
\r
769 PUSHJ P, FINDCP ;FIND TRANSACTION FILE AND COPY
\r
770 CAIE D, 2 ;HAS MASTER FILE BEEN JIGGLED?
\r
771 JRST FIXUP ;NO, RESTORE THE ENTRY BLOCK
\r
772 PUSHJ P, RESET ;YES, RESET IT
\r
773 JRST INSER1 ;WRITE OUTGO BACK FOR MORE INSERTIONS
\r
775 FIXUP: MOVE C, SAVEAC ;RESTORE SPECIAL AC
\r
776 MOVS D, [XWD ENTBLK,SVEBLK]
\r
777 BLT D, (C) ;RESTORE ENTRY BLOCK
\r
778 MOVEI D, 2 ;SET UP CHANNEL AC
\r
779 MOVEI DIS, 6 ;SET UP BUFFER HEADER INDEX
\r
780 INSER1: PUSHJ P, WRITE ;WRITE OUT THE CURRENT FILE
\r
781 JRST INSERT ;GO BACK FOR MORE INSERTIONS
\r
783 IPROC7: PUSHJ P, COPY ;COPY REST OF MASTER FILE
\r
785 \f SUBTTL EXTRACT PROCESSOR
\r
786 ;THIS ROUTINE PROCESSES THE E COMMAND IN FUDGE. RATHER THAN
\r
787 ;ONE MASTER AND SEVERAL TRANSACTION FILES, ALL FILES ARE
\r
788 ;TREATED THE SAME. AFTER A CALL TO EITHER MSTGET OR TRNGET
\r
789 ;PROGRAMS ARE SEARCHED FOR AND WRITTEN ON THE OUTPUT DEVICE.
\r
791 EXTRCT: SETOM NOWARN ;NO WARNING MESSAGE
\r
792 PUSHJ P, MSTGET ;GET A PROGRAM FROM MASTER DEVICE
\r
793 JRST EPROC1 ;ALL DONE WITH MASTER DEVICE
\r
794 JUMPN R,.+3 ;ANY PROGRAMS THIS FILE? **VJC
\r
795 PUSHJ P,COPY ;NO, COPY ENTIRE FILE ***VJC
\r
796 JRST EPROC1 ; ***VJC
\r
797 PUSHJ P, FINDCP ;FIND THE PROGRAM AND COPY IT
\r
798 JRST EXTRCT ;RETURN FOR MORE MASTER PROGRAMS
\r
799 EPROC1: MOVEI A, FILBUF+5 ;GET PROGRAM FROM TRANS BUFFER
\r
800 MOVEM A, FILBUF ;INITIALIZE POINTER FIRST
\r
801 EPROC2: PUSHJ P, GETDEV ;...
\r
802 JRST EXIT ;ALL DONE
\r
803 JUMPN R,.+3 ;ANY PROGRAMS THIS FILE? ***VJC
\r
804 PUSHJ P,COPY ;NO, COPY ENTIRE FILE ***VJC
\r
805 JRST EPROC2 ; ***VJC
\r
806 PUSHJ P, FINDCP ;FIND THE PROGRAM AND COPY IT
\r
807 JRST EPROC2 ;RETURN FOR MORE TRANS FILES
\r
808 \fSUBTTL DELETE PROCESSOR
\r
809 ;THIS ROUTINE PROCESSES THE D COMMAND IN FUDGE2. ONLY ONE
\r
810 ;INPUT FILE WILL BE READ, AND THE PROGRAM NAMES ASSOCIATED
\r
811 ;WITH ITS LIST WILL BE DELETED.
\r
813 DELETE: PUSHJ P, MSTGET ;GET A PROGRAM TO BE DELETED
\r
814 JRST IPROC7 ;FINISH OFF THE MASTER FILE
\r
815 DPROC1: PUSHJ P, READ ;READ A PROGRAM
\r
816 JRST ERROR7 ;EOF - CANT FIND IT
\r
817 CAMN R, A ;CORRECT PROGRAM?
\r
818 JRST DELETE ;YES, GET THE NEXT ONE
\r
819 PUSHJ P, WRITE ;NO, WRITE THIS ONE OUT
\r
820 JRST DPROC1 ;TRY AGAIN
\r
823 ;THIS ROUTINE HANDLES THE A COMMAND IN FUDGE2. IT WILL COPY
\r
824 ;THE ENTIRE MASTER FILE, THEN START OBTAINING TRANSACTION
\r
825 ;DEVICES WITH CALLS TO TRNGET, APPENDING ONE OR MORE
\r
826 ;PROGRAMS FROM EACH FILE.
\r
828 APPEND: PUSHJ P, MSTGET ;GET A PROGRAM FROM MASTER FILE
\r
829 JRST ERROR6 ;NOT ENOUGH ARGUMENTS
\r
830 PUSHJ P, COPY ;COPY ENTIRE FILE
\r
831 MOVEI A, FILBUF+5 ;INITIALIZE POINTER FOR TRANS
\r
832 MOVEM A, FILBUF ;...
\r
833 APROC3: PUSHJ P, GETDEV ;GET A PROGRAM NAME
\r
834 JRST EXIT ;ALL DONE
\r
835 PUSHJ P, FINDCP ;FIND THE PROGRAM AND COPY IT
\r
836 JRST APROC3 ;GET NEXT APPENDATION
\r
838 ;THIS ROUTINE PROCESSES THE X COMMAND (INDEX LIBRARY)
\r
839 ;AND FALLS INTO DELETE LOCAL SYMBOLS CODE.
\r
840 ;IF NOT DESIRED SKIP TO DELCPY+1
\r
842 INDEX: MOVE A,DEVBUF+1 ;GET OUTPUT DEVICE
\r
843 DEVCHR A, ;GET ITS CHARACTERISTICS
\r
844 TLNN A,DSKBIT!DTABIT ;ONLY ALLOW DSK AND DTA AS LIBRARY DEVICES
\r
845 JRST ERR23 ;GIVE ERROR MESSAGE
\r
846 SETOM NOWARN ;NO WARNING MESSAGE IF /X
\r
847 TRO F,XFLG ;SET INDEX FLAG
\r
848 ; TROA F,XFLG ;SET /X BUT NOT /C
\r
850 ;DELETE LOCAL SYMBOLS AND COPY PROCESSOR
\r
851 ;THIS ROUTINE PROCESSES THE C COMMAND
\r
852 ;ONLY THE MASTER FILE IS HANDLED
\r
854 DELCPY: TRO F, NOLOCB ;SET FLAG TO DELETE LOCAL SYMBOLS
\r
855 PUSHJ P, MSTGET ;GET A PROGRAM FROM MASTER FILE
\r
856 JRST ERROR6 ;NOT ENOUGH ARGUMENTS
\r
857 PUSHJ P, COPY ;COPY ENTIRE FILE
\r
858 TRNN F,XFLG ;INDEX FLAG ON?
\r
859 JRST EXIT ;ALL DONE
\r
860 JRST INDEX3 ;YES DO PASS 2
\r
861 \fSUBTTL FUDGE2 IO SUBROUTINES
\r
863 ;ROUTINES TO COPY FILES, COPY UP TO A GIVEN PROGRAM IN A FILE
\r
864 ;AND TO FIND A GIVEN PROGRAM IN A FILE AND COPY IT.
\r
866 ;THE COPY ROUTINE WILL COPY BINARY PROGRAMS FROM WHEREVER THE
\r
867 ;INPUT DEVICE HAPPENS TO BE WHEN IT IS CALLED, UP TO THE
\r
868 ;END OF FILE. SINCE COPY IS CALLED WITH A PUSHJ, THE END-OF-
\r
869 ;FILE EXIT IN INGET WILL EXIT TO THE PLACE THAT CALLED COPY.
\r
871 COPY: PUSHJ P, READ ;READ A PROGRAM
\r
872 POPJ P, ;EXIT WHEN ALL THROUGH FILE
\r
873 PUSHJ P, WRITE ;WRITE OUT THE PROGRAM
\r
874 JRST COPY ;RETURN FOR MORE PROGRAMS
\r
876 ;THE COPYTO ROUTINE WILL READ AND WRITE PROGRAMS FROM THE
\r
877 ;INPUT DEVICE UNTIL THE PROGRAM WHOSE NAME IS IN ACCUMULATOR
\r
878 ;R IS FOUND, AT WHICH TIME IT EXITS
\r
880 COPYTO: PUSHJ P, READ ;READ A PROGRAM
\r
881 JRST ERROR7 ;EOF - CANT FIND IT
\r
882 CAMN R, A ;IS IT THE CORRECT PROGRAM?
\r
884 PUSHJ P, WRITE ;NO, WRITE IT OUT
\r
885 JRST COPYTO ;READ SOME MORE PROGRAMS
\r
887 ;THE FINDCP ROUTINE WILL SEARCH THE INPUT FILE FOR A PROGRAM
\r
888 ;WHOSE NAME IS IN ACCUMULATOR R, AND HAVING FOUND IT, WILL
\r
889 ;WRITE IT OUT. IF THE CONTENTS OF AC R ARE ZERO, THE ENTIRE
\r
892 FINDCP: JUMPE R, COPY ;COPY ENTIRE FILE?
\r
893 FIND1: PUSHJ P, READ ;READ A PROGRAM FROM INPUT FILE
\r
894 JRST FIND2 ;EOF, TRY REWINDING AND TRYING AGAIN
\r
895 CAME R, A ;IS THIS THE RIGHT ONE?
\r
896 JRST FIND1 ;NO, TRY AGAIN
\r
897 JRST WRITE ;YES, WRITE IT OUT AND EXIT
\r
899 FIND2: JUMPE A,ERROR7 ;V3 IF EOF OUTPUT ERROR MESSAGE
\r
900 PUSHJ P, BACKSP ;BACKSPACE THE MAG TAPE
\r
901 HRRZ A, FILBUF ;PICK UP THE FILE POINTER
\r
902 HLLM A, 3(A) ;CLEAR THE LOOKUP FLAG FOR DECTAPE
\r
903 PUSHJ P, GETDEV ;SET UP THE PROGRAM AGAIN
\r
904 JRST ERROR3 ;IMPOSSIBLE ERROR RETURN
\r
905 FIND3: PUSHJ P, READ ;READ A PROGRAM FROM INPUT FILE
\r
906 JRST ERROR7 ;EOF - REALLY CANT FIND IT
\r
907 CAME R, A ;IS THIS THE RIGHT ONE?
\r
908 JRST FIND3 ;NO, TRY AGAIN
\r
909 JRST WRITE ;YES, WRITE IT OUT AND EXIT
\r
910 \f;ROUTINE MSTGET RETRIEVES A PROGRAM NAME FROM THE MASTER
\r
911 ;DEVICE SPECIFICATIONS. IT SAVES THE POINTER IN FILBUF,
\r
912 ;CHANGES IT TO POINT TO ITS OWN BLOCK, THEN CALLS GETDEV
\r
914 MSTGET: MOVE A, FILBUF ;GET THE POINTER TO CURRENT FILE
\r
915 MOVEM A, FILSAV ;SAVE THE CURRENT POINTER
\r
916 MOVEI A, FILBUF+1 ;CHANGE IT TO POINT TO MASTER
\r
917 MOVEM A, FILBUF ;...
\r
918 JRST GETDEV ;CALL COMMON ROUTINE
\r
921 ;ROUTINE TRNGET RETRIEVES A PROGRAM NAME FROM THE TRANSACTION
\r
922 ;FILES. IT RESETS THE POINTER THAT MSTGET WIPED OUT, AND CALLS
\r
923 ;THE COMMON PROGRAM RETRIEVAL PROGRAM GETDEV.
\r
925 TRNGET: MOVE A, FILSAV ;GET SAVED POINTER
\r
926 MOVEM A, FILBUF ;RESTORE IT TO ITS PLACE
\r
927 JRST GETDEV ;CALL COMMON ROUTINE
\r
929 ;ROUTINE RESET RESTORES THE STATE OF THE MASTER DEVICE TO
\r
930 ;WHAT IT WAS JUST AFTER THE LAST TIME MSTGET WAS CALLED. IT
\r
931 ;SETS THE POINTER OF THE MASTER FILE BACK TO THE PREVIOUS
\r
932 ;PROGRAM, CALLS MSTGET, AND FINDS THE PROGRAM AGAIN
\r
934 RESET: MOVEI A,FILBUF+5 ;START OF TRANSACTION LIST ***DMN
\r
935 HLLM A, FILBUF+3 ;NOW CLEAR LOOKUP FLAG ON MASTER
\r
936 SOS FILBUF+3 ;MOVE POINTER BACK ONE PROGRAM
\r
937 RESET2: SKIPN (A) ;ANY TRANSACTION FILES ? ***DMN
\r
938 JRST RESET3 ;NO-ALL DONE ***DMN
\r
939 HLLM A,2(A) ;CLEAR LOOKUP FLAG ON IT ***DMN
\r
940 ADDI A,3 ;NEXT FILE ***DMN
\r
941 JRST RESET2 ;GO BACK FOR MORE ***DMN
\r
942 RESET3: PUSHJ P, MSTGET ;SET UP THE MASTER DEVICE
\r
943 JRST ERROR3 ;FUDGE ERROR-NO MASTER!
\r
944 PUSHJ P, BACKSP ;BACKSPACE IN CASE ITS A MAG TAPE
\r
945 MOVE A, FILSAV ;DIDDLE THE POINTERS, BECAUSE MSTGET
\r
946 MOVEM A, FILBUF ;WILL BE CALLED AGAIN IMMEDIATELY
\r
947 RESET1: PUSHJ P, READ ;READ A PROGRAM FROM MASTER FILE
\r
948 JRST ERROR3 ;FUDGE ERROR-CANT FIND PROGRAM
\r
949 CAME R, A ;IS IT THE RIGHT PROGRAM NAME?
\r
950 JRST RESET1 ;NO, LOOK AGAIN
\r
952 BACKSP: DPB D, [POINT 4, BACK0,12]
\r
953 DPB D, [POINT 4, BACK1, 12]
\r
954 DPB D, [POINT 4, BACK2,12]
\r
955 DPB D, [POINT 4,BACK3,12]
\r
956 JRST BACK0 ;GO TO POSITION MAGTAPE
\r
957 \fSUBTTL COMMON PROGRAM RETRIEVAL PROGRAM GETDEV.
\r
958 ;THIS PROGRAM USES VARIOUS POINTERS AND BITS OF INFORMATION
\r
959 ;IN FILBUF AND PRG BUF TO RETURN TO THE USER A RADIX 50
\r
960 ;PROGRAM NAME AS SEEN IN THE COMMAND STRING. THE STRUCTURE
\r
961 ;OF INFORMATION IN THESE TWO BUFFERS IS AS FOLLOWS:
\r
963 ;FILBUF IS A LIST OF 3-WORD BLOCKS OF DATA ABOUT EACH FILE.
\r
964 ;THE FIRST WORD IN FILBUF IS A POINTER WHICH POINTS TO THE
\r
965 ;FIRST WORD OF THE BLOCK CURRENTLY BEING WORKED ON BY
\r
966 ;THE VARIOUS SUBROUTINES OF FUDGE. WHEN THE COMMAND STRING
\r
967 ;IS BEING PROCESSED AND INFORMATION IS BEING STORED IN FILBUF,
\r
968 ;THIS POINTER IS IN THE FORM OF AN AOBJN WORD SO THAT A CHECK
\r
969 ;CAN BE MADE FOR BUFFER OVERFLOW. THE CONTENTS OF THE 3-WORD
\r
970 ;FILE BLOCK IS AS FOLLOWS:
\r
971 ; 1ST WORD - SIXBIT FILE NAME, OR ZERO IF THIS IS THE
\r
972 ; END OF THE LIST .
\r
973 ; 2ND WORD - LEFT HALF CONTAINS A SIXBIT FILE NAME EXTENSION
\r
974 ; RIGHT HALF CONTAINS THE CHANNEL NUMBER FOR
\r
976 ; 3RD WORD - LEFT HALF IS ZERO IS A LOOKUP HAS NOT BEEN
\r
977 ; DONE ON THIS FILE NAME, AND -1 IF IT HAS. A
\r
978 ; LOOKUP CAN THUS BE FORECED BY ZEROING OUT THE
\r
979 ; LEFT HALF OF THE WORD.
\r
980 ; RIGHT HALF CONTAINS A POINTER TO THE LAST
\r
981 ; PROGRAM NAME IN PRGBUF THAT WAS REFERENCED. THE
\r
982 ; RIGHT HALF IS ZERO IF THERE ARE NO PROGRAM
\r
983 ; NAMES ASSOCIATED WITH THE FILE.
\r
985 ;PRGBUF IS A LIST OF PROGRAM NAMES USED BY THE FILES IN FILBUF.
\r
986 ;THE FIRST WORD OF PRGBUF IS A POINTER WORD WHOSE USE IS THE
\r
987 ;SAME AS THE FIRST WORD OF FILBUF.THE ENTRIES IN PRGBUF CONSIST
\r
988 ;OF A LIST OF RADIX50 SYMBOLS, ONE TO A WORD, TERMINATED BY
\r
991 ;FUDGE2 WORKS WITH FILBUF AND PRGBUF IN TWO DISTINCTLY
\r
992 ;DIFFERENT WAYS: ONCE WHEN IT IS PROCESSING THE COMMAND STRING
\r
993 ;AND STORING THE VARIOUS FILE NAMES AND PROGRAM NAMES, AND
\r
994 ;ONCE WHEN IT IS USING THE INFORMATION IN THE FILES TO PROCESS
\r
995 ;A FUDGE COMMAND. WHEN A FILE NAME IS SEEN IN THE COMMAND STRING,
\r
996 ;THE STATUS OF THE PREVIOUS FILE IS CHECKED. IF THE PREVIOUS
\r
997 ;FILE HAD NO PROGRAM NAMES, THEN ITS POINTER WORD (3RD WORD) IS
\r
998 ;ZEROED OUT TO INDICATE THE ABSCENCE OF ANY PROGRAMS IN PRGBUF.
\r
999 ;OTHERWISE, PROCESSING BEGINS ON THE CURRENT FILE: THE FILE
\r
1000 ;NAME, FILE NAME EXTENSION, AND CHANNEL NUMBER ARE STORED. THE
\r
1001 ;CONTENTS OF THE POINTER WORD IN PRGBUF ARE STORED IN THE
\r
1002 ;POINTER WORD OF THE FILE BLOCK
\r
1003 ;ROOM IS LEFT IN FILBUF SO THAT WHEN THE CARRIAGE RETURN IS
\r
1004 ;SEEN, FUDGE2 CAN SHUFFLE THE FIRST FILE BLOCK UP ONE WORD AND
\r
1005 ;INSERT ANOTHER NULL. THE EFFECT OF THIS KLUDGE IS THAT WE NOW
\r
1006 ;HAVE TWO SEPARATE LISTS IN FILBUF, A MASTER LIST, AND A
\r
1007 ;TRANSACTION LIST.
\r
1008 \fGETDEV: MOVE B, FILBUF ;GET POINTER TO FILE BLOCK
\r
1009 SKIPN (B) ;END OF LIST? (ZERO TERMINATES)
\r
1010 POPJ P, ;YES, EXIT
\r
1011 MOVE A,PPNBUF ;GET POINTER TO PPN'S
\r
1012 MOVE D,(A) ;GET GLOBAL PPN
\r
1013 MOVEM D,DEFPPN ;SAVE AS DEFAULT PPN
\r
1014 MOVE D,1(A) ;GET TEMP. PPN
\r
1015 MOVEM D,PRJPRG ;SAVE AS TEMP. PPN
\r
1016 ADDI A,2 ;INCREMENT POINTER
\r
1017 MOVEM A,PPNBUF ;SAVE NEW POINTER
\r
1018 HRRZ D, 1(B) ;GET DEVICE NUMBER FOR THIS DEVICE
\r
1019 SKIPL 2(B) ;HAS A LOOKUUP BEEN DONE?
\r
1020 JRST GET3 ;NO, GO DO LOOKUP
\r
1021 GET0: MOVEI DIS, 3 ;SET UP AC DIS
\r
1022 IMUL DIS, D ;C(DIS) = 3*C(D)
\r
1023 HRRZ A, 2(B) ;GET POINTER TO PROGRAM NAMES
\r
1024 JUMPE A, GET1 ;NULL PROGRAM LIST (NO POINTER)?
\r
1025 AOS A, 2(B) ;NO, INCREMENT POINTER BY ONE
\r
1026 MOVE R, (A) ;GET A PROGRAM NAME
\r
1027 JUMPN R, CPOPJ1 ;END OF PROGRAM LIST?
\r
1028 ADDI B, 3 ;YES, INCREMENT FILBUF POINTER
\r
1029 MOVEM B, FILBUF ;SAVE NEW POINTER
\r
1030 JRST GETDEV ;TRY NEXT FILE BLOCK
\r
1032 GET1: MOVEI R, 0 ;NO PROGRAMS, RETURN ZERO
\r
1033 ADDI B, 3 ;MOVE FILBUF POINTER TO NEXT BLOCK
\r
1034 MOVEM B, FILBUF ;SAVE THE POINTER
\r
1035 CPOPJ1: AOSA (P) ;GOOD RETURN
\r
1036 POPOUT: POP P,(P) ;POP UP ONE LEVEL
\r
1037 CPOPJ: POPJ P, ;EXIT
\r
1039 GET3: DPB D, [POINT 4,GET3A,12]
\r
1040 XCT GET3A ;CLOSE CURRENT FILE BEFORE DOING...
\r
1041 MOVE A, (B) ;GET FILE NAME OF NEXT FILE
\r
1042 MOVEM A, EBLOCK ;SET UP FOR LOOKUP
\r
1043 HLLZ A, 1(B) ;GET FILE NAME EXTENSION
\r
1044 MOVEM A, EBLOCK+1 ;SAVE IT FOR LOOKUP
\r
1045 HRROS A, 2(B) ;SET FLAG IN LEFT HALF OF 3RD WORD
\r
1046 DPB D, [POINT 4,GET4A,12]
\r
1047 SKIPN A,PRJPRG ;GET TEMP. PPN
\r
1048 MOVE A,DEFPPN ;USE PERMANENT IF NO TEMP.
\r
1049 MOVEM A,EBLOCK+3 ;SAVE IT
\r
1050 MOVEM A,EBLOCK-1 ;FOR LEVEL D ALSO
\r
1051 MOVE A,DEVBUF(D) ;GET DEVICE
\r
1052 DEVCHR A, ;GET ITS CHARACTERISTICS
\r
1053 TLNN A,DSKBIT ;IF NOT A DSK
\r
1054 TDZA T,T ;NO EXTENDED LOOKUP
\r
1055 MOVE T,LEVEL ;GET LEVEL
\r
1056 GET4: XCT GET4A ;DO A LOOKUP ON NEW FILE
\r
1057 JRST .+3 ;NOT FOUND, TRY WITH BLANKS EXT.
\r
1058 SETZM EBLOCK+3 ;CLEAR PROJ-PROG
\r
1059 JRST DOENTR ;SUCCESSFUL RETURN FROM LOOKUP
\r
1060 HLRZ A, 1(B) ;GET THE FILE NAME EXTENSION
\r
1061 CAIE A, 624554 ;IS IT "REL" ?
\r
1062 JRST ERROR8 ;NO, DON'T GIVE HIM ANOTHER CHANCE
\r
1063 HLLM A, 1(B) ;YES, TRY LOOKUP WITH 0 EXTENSION
\r
1064 SETZM EBLOCK+1 ;CLEAR EXTENSION IN LOOKUP BLOCK
\r
1065 JRST GET4 ;TRY AGAIN
\r
1067 DOENTR: SKIPN LEVEL ;IF NOT LEVEL D
\r
1068 JRST DOXSWT ;ENTER DONE ALREADY
\r
1069 MOVS T,[XWD EBLOCK,SVENTR]
\r
1070 BLT T,EBLOCK+1 ;RESTORE EBLOCK
\r
1071 MOVSI T,777000 ;MASK FOR PROTECTION
\r
1072 ANDM T,EBLOCK+2 ;CLEAR DATE AND TIME
\r
1073 SETZM EBLOCK-1 ;CLEAR PPN
\r
1075 XCT SEMIC1 ;DO ENTER
\r
1076 JRST [HRRZ T,EBLOCK+1 ;GET ERROR CODE
\r
1077 CAIN T,17 ;PARTIAL ALLOCATION ONLY?
\r
1078 JRST .+1 ;YES, JUST CONTINUE
\r
1079 JRST ERR14] ;ERROR
\r
1080 SETZM LEVEL ;NEVER AGAIN
\r
1081 DOXSWT: TRNE F,XFLG ;INDEX FLAG ON?
\r
1082 PUSHJ P,INDEX0 ;YES, SET UP POINTERS AND CORE
\r
1083 JRST GET0 ;AND CONTINUE
\r
1085 ;SHORT ROUTINES TO STORE WORDS IN THE FILE BUFFER AND PROGRAM
\r
1087 ;ROUTINE PUTFIL STORES THE CONTENTS OF ACCUMULATOR S IN THE
\r
1088 ;NEXT FREE LOCATION IN FILBUF. IT CHECKS FOR OVERFLOW.
\r
1090 PUTFIL: MOVE A, FILBUF ;GET POINTER WORD FOR FILBUF
\r
1091 AOBJP A, ERROR2 ;INCREMENT, CHECK FOR OVERFLOW
\r
1092 MOVEM A, FILBUF ;SAVE NEW POINTER
\r
1093 MOVEM S, (A) ;SAVE FILE NAME ENTRY
\r
1097 ;ROUTINE PUTPRG STORES THE CONENTS OF ACCUMULATOR S IN THE
\r
1098 ;NEXT FREE LOCATION IN PRGBUF. IT CHECKS FOR OVERFLOW.
\r
1100 PUTPRG: MOVE A, PRGBUF ;GET POINTER WORD FOR BUFFER
\r
1101 AOBJP A, ERROR2 ;INCREMENT, CHECK FOR OVERFLOW
\r
1102 MOVEM A, PRGBUF ;SAVE NEW POINTER WORD
\r
1103 MOVEM S, (A) ;SAVE PROGRAM NAME
\r
1106 ;ROUTINE PUTPPN STORE THE TWO PPPN NUMBER IN PPNBUF
\r
1108 PUTPPN: MOVE A,PPNBUF ;GET POINTER WORD FOR BUFFER
\r
1110 MOVEM A,PPNBUF ;SAVE NEW POINTER WORD
\r
1111 MOVEM S,(A) ;SAVE PPN
\r
1113 \fSUBTTL ROUTINE TO INPUT ONE PROGRAM AT A TIME
\r
1114 ;THE FIRST WORD THAT THE PROGRAM READS WILL BE A BLOCK HEADER.
\r
1115 ;BLOCKS ARE READ UNTIL AN ENTRY BLOCK IS FOUND, AND THE ENTIRE
\r
1116 ;ENTRY BLOCK IS STORED IN AN INTERNAL BUFFER,SIZE PERMITTING.
\r
1117 ;FOLLOWING THAT, THE NAME BLOCK IS READ, AND THE NAME OF THE
\r
1118 ;PROGRAM IS RETURNED IN ACCUMULATOR A. PROVISION IS MADE FOR
\r
1119 ;BLOCKS OF WORD COUNT ZERO. THE SECTION OF CODING AROUND READ2
\r
1120 ;DELIBERATELY OMITS THIS CHECK IN ORDER TO READ IN THE NEXT
\r
1121 ;BLOCK HEADER WITH A MINIMUM OF INSTRUCTIONS. ORDINARILY, EACH
\r
1122 ;PROGRAM WILL BEGIN WITH AN ENTRY BLOCK, BUT THE ROUTINE WILL
\r
1123 ;ALSO ALLOW THE PROGRAM TO BEGIN WITH A NAME BLOCK IF NO
\r
1124 ;ENTRY BLOCK IS SEEN.
\r
1126 READ: MOVEI C, ENTBLK ;SET UP POINTER TO BUFFER
\r
1127 READ6: JSR GETIN ;GET A BLOCK HEADER
\r
1128 HLRZ B, A ;GET THE BLOCK CODE
\r
1129 CAIN B,14 ;IS IT AN INDEX BLOCK?
\r
1130 JRST READX ;YES, GET RID OF IT
\r
1131 CAIN B, 4 ;IS IT AN ENTRY BLOCK?
\r
1132 JRST READ1 ;YES, PROCESS IT
\r
1133 CAIN B, 6 ;IS IT A NAME BLOCK?
\r
1134 JRST READ7 ;YES, PROCESS IT
\r
1135 CAIN B,400 ;F4 SIGNAL WORD?
\r
1136 JRST F4I ;YES, PROCESS F4 BLOCKS
\r
1137 PUSHJ P, COUNT ;CALCULATE SIZE OF BLOCK
\r
1138 JUMPE B, READ6 ;WORD COUNT OF ZERO?
\r
1139 READ6A: CAML B, IBUF+2(DIS) ;DOES BLOCK OVERLAP IO BUFFERS?
\r
1140 JRST READ6B ;ADJUST B AND GET ANOTHER BUFFER
\r
1141 MOVE A, IBUF+2(DIS) ;NO, DIDDLE BUFFER HEADER COUNT
\r
1142 SUB A, B ;ELIMINATE BLOCK OF LENGTH C(B)
\r
1143 MOVEM A, IBUF+2(DIS) ;PUT NEW WORD COUNT BACK
\r
1144 ADDM B, IBUF+1(DIS) ;MOVE BYTE POINTER PAST BLOCK
\r
1145 JRST READ6 ;GET NEXT BLOCK
\r
1146 READ6B: SUB B, IBUF+2(DIS) ;ACCOUNT FOR REST OF THIS BUFFER
\r
1147 SETZM IBUF+2(DIS) ;FORCE ANOTHER INBUF
\r
1148 JSR GETIN ;GET ANOTHER BUFFER OF INPUT
\r
1149 JRST READ6A ;CHECK AGAIN
\r
1152 ; THIS CODE MODIFIED 3-21-71 BY DCS (STANFORD) TO HANDLE
\r
1153 ; MORE THAN ONE ENTRY BLOCK (FAIL AND SAIL BOTH ISSUE
\r
1154 ; MULTIPLE ENTRY BLOCKS).
\r
1156 SIZZ==SIZE-<<SIZE+21>/22>-4 ;ACCOUNT FOR HDR BLKS, RELOC WRDS, PROGNAME
\r
1157 READ1: SETZM ENTBLK ;SAME AS (C) AT PRESENT
\r
1158 HRLI C,-1 ;AOBJN WILL OVERFLOW FIRST TIME
\r
1160 ; BACK HERE FOR EACH NEW ENTRY BLOCK
\r
1162 READ2: MOVNI B,400000(A) ;-1 IN LH, 377777-CT IN RH
\r
1164 ADD A,ENTBLK ;NEW COUNT IF IT FITS
\r
1165 CAILE A,SIZZ ;TOO MUCH NOW?
\r
1166 TROA F,ERRB ; YES, MARK ENTRY BLOCK TOO BIG
\r
1167 MOVEM A,ENTBLK ;NO, UPDATE USED COUNT
\r
1168 ; HERE FOR EACH NEW WORD
\r
1169 READ23: TRNN B,377777 ;END THIS LOADER BLOCK?
\r
1170 JRST READ55 ; YES, CHECK NEXT
\r
1171 AOBJN B,NXTWRD ;TIME FOR SOME RELOC BITS?
\r
1172 JSR GETIN ;YES, GET THEM AND TOSS THEM
\r
1173 HRLI B,-22 ;AND RESET COUNT
\r
1174 NXTWRD: JSR GETIN ;GET A DATA WORD
\r
1175 ; (ROUTINE COURTESY OF DEC LOADER)
\r
1177 AOBJN C,READ22 ;NEED TO INSERT RELOC WORD?
\r
1178 TRNN F,ERRB ;YES, UNLESS NOT INSERTING
\r
1179 SETZM (C) ; ALL ENTRY RELOCS ARE 0
\r
1180 ADD C,[XWD -22,1] ;LH 0 BEFORE ADD, SET UP NEXT
\r
1181 READ22: TRNN F,ERRB ;ARE WE INSERTING?
\r
1182 MOVEM A,(C) ; YES, PUT IT AWAY
\r
1186 READ55: JSR GETIN ;GET NEXT HEADER WORD
\r
1188 CAIN B,4 ;ANOTHER ENTRY?
\r
1189 JRST READ2 ; YES, STORE IT
\r
1191 ; PROGRAM NAME -- FINISH ENTRY BLOCK OUT
\r
1192 MOVEI B,4 ;ENTRY BLOCK TYPE
\r
1193 HRLM B,ENTBLK ;NOW CORRECT TYPE,,COUNT
\r
1194 HRLI C,0 ;CLEAR LH COUNT
\r
1195 AOJA C,READ7 ;STORE NAME BLOCK HEADER AND CONTINUE
\r
1196 ; END OF DCS PATCH 3-21-71
\r
1197 \fREAD5: PUSHJ P, COUNT ;CALCULATE SIZE OF BLOCK
\r
1198 JUMPE B, READ9 ;WORD COUNT OF ZERO?
\r
1199 READ3: JSR GETIN ;GET A WORD
\r
1200 MOVEM A, (C) ;STORE IT
\r
1201 AOJ C, ;INCREMENT BUFFER POINTER
\r
1202 SOJG B, READ3 ;DONE READING YET?
\r
1203 CAIN G+1, 2 ;IS THERE A COMMON WORD?
\r
1204 MOVE A, -2(C) ;GET PROGRAM NAME IN A
\r
1205 JUMPE A, READ9 ;IGNORE WORD OF ZERO
\r
1206 MOVE B, A ;GET RID OF EXTRA BLANKS
\r
1207 READ8: IDIVI B, 50 ;TRY DIVIDING IT BY 50
\r
1208 JUMPN B+1, READ9 ;FILTERED OUT ALL THE BLANKS?
\r
1209 MOVE A, B ;NO, STORE SYMBOL AGAIN
\r
1210 JRST READ8 ;TRY ANOTHER DIVISION
\r
1212 READ9: TRNE F, ERRB ;ERROR CONDITION?
\r
1214 TRNN F,XFLG ;INDEX FLAG ON?
\r
1215 JRST CPOPJ1 ;NO, SKIP EXIT
\r
1216 JRST INDEX1 ;YES SAVE ENTRIES
\r
1218 READ7: MOVEM A, (C) ;STORE NAME BLOCK HEADER
\r
1219 AOJA C, READ5 ;GO READ NAME BLOCK
\r
1221 F4I: TRO F,F4IB ;DONT OUTPUT DURING F4 SEARCH
\r
1222 PUSH P,C ;SAVE ENTRY BLOCK
\r
1223 PUSHJ P,F4 ;PASS F4 BLOCKS
\r
1224 POP P,C ;RESTORE ENTRY BLOCK
\r
1225 TRZ F,F4IB ;TURN OFF IGNORE BIT
\r
1226 JRST READ6 ;GO PROCESS NEXT PROGRAM
\r
1228 READX: SKIPN NOWARN ;DO WE WANT A MESSAGE?
\r
1229 TTCALL 3,[ASCIZ /WARNING NO INDEX ON OUTPUT FILE - CONTINUING
\r
1231 SETOM NOWARN ;ONCE IS ENOUGH
\r
1232 SETZM IBUF+2(DIS) ;FORCE ANOTHER INBUF
\r
1233 JSR GETIN ;INPUT THE NEXT BLOCK
\r
1234 SOS IBUF+2(DIS) ;WORD COUNT OUT BY ONE
\r
1235 JRST READ6+1 ;AND RETURN TO CODE
\r
1236 \fSUBTTL ROUTINE TO OUTPUT ONE PROGRAM AT A TIME
\r
1237 ;THE WRITE SUBROUTINE WILL OUTPUT AN ENTIRE BINARY RE-
\r
1238 ;LOCATABLE PROGRAM AS WRITTEN BY MACRO6. IT ASSUMES THAT THE
\r
1239 ;ENTRY BLOCK AND NAME BLOCK FOR THE PROGRAM ARE IN THE
\r
1240 ;INTERNAL BUFFER ENTBLK, AND OUTPUTS THESE BEFORE PICKING UP
\r
1241 ;MORE BLOCKS FROM THE CURRENT INPUT DEVICE. BLOCKS ARE READ
\r
1242 ;AND WRITTEN UNTIL THE END BLOCK HAS BEEN PROCESSED. PROVISION I
\r
1243 ;IS MADE FOR BLOCKS WITH A WORD COUNT OF ZERO.
\r
1245 WRITE: SUBI C, ENTBLK ;GET COUNT OF ENTRY BLOCK
\r
1246 JUMPE C, WRITE3 ;NOTHING TO OUTPUT?
\r
1247 MOVEI B, ENTBLK ;GET A POINTER IN B
\r
1248 WRITE2: MOVE A, (B) ;GET A BINARY WORD
\r
1249 PUSHJ P, OUT ;OUTPUT IT
\r
1250 AOJ B, ;INCREMENT POINTER
\r
1251 SOJG C, WRITE2 ;KEEP GOING UNTIL BUFFER EMPTY
\r
1252 WRITE3: JSR GETIN ;GET A BLOCK HEADER
\r
1253 HLRZ B,A ;GET THE BLOCK TYPE CODE ***VJC
\r
1254 TRNN F,NOLOCB ;DELETE LOCAL SYMBOLS? ***VJC
\r
1256 CAIN B,2 ;IS IT A SYMBOL BLOCK? ***VJC
\r
1257 JRST DELLOC ;GO DELETE LOCAL SYMBOL ***VJC
\r
1258 ;COME BACK TO WRITE3 ***VJC
\r
1259 ;UNLESS EXIT ON END-OF-FILE ***VJC
\r
1261 PUSHJ P, OUT ;OUTPUT IT
\r
1262 CAIN B, 400 ;IS THIS A FORTRAN IV SIGNAL WORD?
\r
1263 JRST F4 ;YES, PROCESS F4 OUTPUT
\r
1264 MOVEM B, SAVEBT ;SAVE THE BLOCK TYPE
\r
1265 PUSHJ P, COUNT ;NO, GET SIZE OF BLOCK
\r
1266 JUMPE B, WRITE3 ;WORD COUNT OF ZERO?
\r
1267 WRITE4: JSR GETIN ;OUTPUT THE BLOCK
\r
1269 SOJG B, WRITE4 ;LOOP BACK UNTIL DONE
\r
1270 MOVE A, SAVEBT ;RETRIEVE THE BLOCK TYPE
\r
1271 CAIE A, 5 ;WAS IT AN END BLOCK?
\r
1272 JRST WRITE3 ;NO, RETURN FOR MORE BLOCKS
\r
1273 POPJ P, ;YES, EXIT
\r
1275 ;THE COUNT SUBROUTINE CALCULATES THE LENGTH OF THE VARIOUS
\r
1276 ;BLOCKS READ BY THE WRITE AND READ SUBROUTINES. THE POSITIVE
\r
1277 ;WORD COUNT IS FOUND IN THE RIGHT HALF OF THE ENTRY BLOCK
\r
1278 ;HEADER, WHICH IS ASSUMED TO BE IN AC A UPON ENTERING. THE
\r
1279 ;LENGTH WILL BE RETURNED IN AC B, AND INCLUDES THE DATA WORDS
\r
1280 ;(SYMBOLS, ENTRY WORDS, ETC.) AND THE SUBHEADERS, OF WHICH
\r
1281 ;THERE IS ONE FOR EVERY 18 (DECIMIAL) DATA WORDS. THE BLOCK
\r
1282 ;HEADER IS DESTROYED, AND IS NOT INCLUDED IN THE LENGTH.
\r
1284 COUNT: HRRZ G, A ;GET NUMBER OF WORDS
\r
1285 IDIVI G, 22 ;1SUBHEADER/18 DATA WORDS
\r
1286 ADDI G,(A) ;ADD INTO WORD COUNT
\r
1287 JUMPE G+1,.+2 ;1 EXTRA SUBHEADER FOR
\r
1288 AOJ G, ;STRAY ONES
\r
1289 MOVE B, G ;RESULTS IN AC B
\r
1291 \fSUBTTL ROUTINE TO HANDLE FORTRAN OUTPUT
\r
1293 ;SUBSECTION OF THE WRITE ROUTINE TO HANDLE OUTPUT FROM THE
\r
1294 ;FORTRAN IV COMPILER. THE MAIN OBJECT OF THE ROUTINE IS TO
\r
1295 ;LOOK FOR THE END BLOCK. OTHER BLOCKS ARE MERELY COPIED OUT.
\r
1296 ;THE BLOCK TYPES ARE GIVEN BY THE FOLLOWING TABLE
\r
1297 ;----------------------------------------------------------------
\r
1298 ;BITS 0-17 BITS18-23 BITS 24-35 TYPE
\r
1300 ;777777 70 N DATA STATEMENT
\r
1301 ;777777 50 N ABSOLUTE MACHINE CODE
\r
1302 ;777777 0 - PROGRAMMER LABELS
\r
1303 ;777777 31 - MADE LABELS
\r
1304 ;777777 60 - ENTRY LABELS
\r
1305 ;777777 777776 END BLOCK
\r
1306 ;-----------------------------------------------------------------
\r
1307 F4: JSR GETIN ;GET A FORTRAN IV BLOCK HEADER
\r
1308 PUSHJ P, OUT4 ;OUTPUT IT
\r
1309 TLC A, -1 ;TURN ONES TO ZEROES IN LEFT HALF
\r
1310 TLNE A, -1 ;NO, WAS LEFT HALF ALL ONES?
\r
1311 JRST F4 ;NO, IT WAS CALCULATED MACHINE CODE
\r
1312 CAIN A, -2 ;YES, IS RIGHT HALF = 777776?
\r
1313 JRST ENDST ;YES, PROCESS F4 END BLOCK
\r
1314 LDB B, [POINT 6,A,23];GET CODE BITS FROM BITS 18-23
\r
1315 TRZ A, 770000 ;THEN WIPE THEM OUT
\r
1316 CAIE B, 70 ;IS IT A DATA STATEMENT?
\r
1317 CAIN B, 50 ;IS IT ABSOLUTE MACHINE CODE?
\r
1318 JRST MACHCD ;YES, TREAT IT LIKE DATA STATEMENTS
\r
1319 JSR GETIN ;NO, ITS A LABEL OF SOME SORT
\r
1320 PUSHJ P, OUT4 ;WHICH CONSISTS OF ONE WORD
\r
1321 JRST F4 ;LOOK FOR NEXT BLOCK HEADER
\r
1323 MACHCD: HRRZ B, A ;GET THE WORD COUNT IN AC B
\r
1324 JSR GETIN ;INPUT A WORD
\r
1325 PUSHJ P, OUT4 ;OUTPUT IT
\r
1326 SOJG B, MACHCD ;LOOP BACK FOR REST OF THE BLOCK
\r
1327 JRST F4 ;GO LOOK FOR NEXT BLOCK
\r
1329 ENDST: MOVEI B,1 ;TWO WORDS, FIVE TABLES, ONE WORD, ONE TABLE
\r
1331 F4LUP1: JSR GETIN ;GET TABLE MEMBER
\r
1332 F4LUP3: PUSHJ P,OUT4 ;OUTPUT WORD
\r
1333 SOJGE B,F4LUP1 ;LOOP WITHIN A TABLE
\r
1334 JUMPL C,CPOPJ ;LAST TABLE - RETURN
\r
1335 SOJG C,F4LUP2 ;FIRST TWO WORDS AND FIVE TABLES
\r
1336 JUMPE C,F4LUP1 ;COMMON LENGTH WORD
\r
1337 F4LUP2: JSR GETIN ;READ HEADER WORD
\r
1338 MOVE B,A ;COUNT TO COUNTER
\r
1339 JRST F4LUP3 ;STASH
\r
1341 OUT4: TRNN F,F4IB ;DONT DO OUTPUT?
\r
1342 PUSHJ P,OUT ;YES, DO OUTPUT
\r
1344 \fSUBTTL ROUTINE TO DELETE LOCAL SYMBOLS FROM SYMBOL BLOCK
\r
1346 ;ALL LOCAL AND SUPPRESSED LOCAL SYMBOLS ARE DELETED
\r
1347 ;EXTERNALS,INTERNAL AND SUPPRESSED INTERNALS ARE NOT DELETED.
\r
1349 DELLOC: HRRZM A,BSZ ;SIZE OF SYMBOL BBLE
\r
1350 PUSHJ P,DELINI ;CLEAR NEW HEADER & RELOC WORDS
\r
1351 ;SET PB = SYMBLK+2
\r
1352 DELGTR: JSR GETIN ;GET RELOCATION WORD
\r
1353 MOVEM A,RELOCS ;SAVE IT
\r
1354 MOVE A,PTGR ;INIT POINTER TO GET
\r
1355 MOVEM A,PTGRS ;RELOCATION WORD
\r
1357 DELGT1: JSR GETIN ;GET FIRST WORD OF PAIR
\r
1358 ILDB 0,PTGRS ;GET RELOCATION BITS & HOLD
\r
1359 TLNE A,(1B2) ;IS SYMBOL LOCAL?
\r
1360 JRST DELDEC ;YES, DON'T COPY
\r
1361 MOVEM A,0(T) ;STORE FIRST WORD
\r
1362 JSR GETIN ;GET SECOND WORD INTO A
\r
1363 MOVEM A,1(T) ;STORE SECOND WORD
\r
1364 IDPB 0,PTSRS ;STORE RELOCATION BITS
\r
1365 MOVEI A,2 ;COUNT WORDS STORED
\r
1366 ADDM A,SYMBLK ;I.E. UPDATE WORD COUNT
\r
1367 ADDI T,2 ;UPDATE NEXT LOCATION TO STORE
\r
1368 MOVE A,PTSRS ;HAVE WE STORED 9
\r
1369 TLNN A,770000 ;SYMBOL PAIRS?
\r
1370 PUSHJ P,DELWRT ;YES, WRITE IT OUT
\r
1371 JRST DELDEC+1 ;ALREADY HAVE 2ND WORD
\r
1373 DELDEC: JSR GETIN ;GET SECOND WORD INTO A
\r
1374 SOS BSZ ;HAVE WE EXHAUSTED
\r
1375 SOSG BSZ ;ALL WORDS IN BLOCK?
\r
1376 JRST DELFIN ;YES, NONE LEFT
\r
1377 MOVE A,PTGRS ;HAVE WE GOT 9
\r
1378 TLNE A,770000 ;SYMBOL PAIRS YET?
\r
1379 JRST DELGT1 ;NO, GET NEXT PAIR
\r
1380 JRST DELGTR ;YES, GET RELOCATION
\r
1382 DELFIN: PUSHJ P,DELWRT ;ORIGINAL BLOCK EMPTY NOW
\r
1383 JRST WRITE3 ;GET NEXT BLOCK
\r
1386 \fSUBTTL ROUTINE TO WRITE OUT NEW SYMBOL BBLE
\r
1388 DELWRT: SKIPN A,SYMBLK ;ANYTHING TO WRITE
\r
1389 JRST DELINI ;NO, CAN LEAVE
\r
1390 HRRZ 0,A ;GET WORD COUNT
\r
1391 HRLI A,2 ;PUT IN BLOCK TYPE
\r
1392 PUSHJ P,OUT ;WRITE BLOCK HEADER
\r
1393 MOVEI B,SYMBLK ;LOC OF FIRST WORD
\r
1394 DELWRU: ADDI B,1 ;LOC OF RELOC WORD
\r
1395 MOVE A,0(B) ;GET WORD
\r
1396 PUSHJ P,OUT ;OUTPUT
\r
1397 SOJGE 0,DELWRU ;ALL THROUGH?
\r
1399 ;ROUTINE TO INITIALIZE NEW SYMBOL BBLE
\r
1400 DELINI: SETZM SYMBLK ;YES, CLEAR COUNT
\r
1401 SETZM SYMBLK+1 ;CLEAR RELOCATION
\r
1402 MOVE A,PTSR ;INIT POINTER
\r
1403 MOVEM A,PTSRS ;FOR STORING NEW RELOC
\r
1404 MOVEI T,SYMBLK+2 ;SET TO STORE FIRST GLOBAL
\r
1406 \fSUBTTL ROUTINES TO INDEX THE LIBRARY
\r
1408 COMMENT * THE INDEXING OF LIBRARY FILES IS DONE IN TWO PASSES.
\r
1409 ON PASS 1 THE LIBRARY FILE IS COPIED AND ALL ENTRIES STORED
\r
1410 IN CORE ALLONG WITH A POINTER TO THE BEGINING OF THE BLOCK.
\r
1411 A DUMMY INDEX BLOCK (TYPE 14) IS OUTPUT AT THE BEGINING OF THE
\r
1412 NEW LIBRARY AND ONE IS OUTPUT WHENEVER THE CURRENT INDEX BLOCK
\r
1414 ON PASS 2 THE DUMMY INDEX BLOCKS ARE REPLACED BY REAL ONES.
\r
1415 FUDGE2 USED USETO'S AND DUMP MODE.
\r
1416 IF THE OUTPUT DEVICE IS DTA FUDGE2 USES UGETF UUO'S TO FIND
\r
1417 THE NEXT BLOCK AND NON-STANDARD DUMP MODE TO WRITE THE INDICES.
\r
1418 DESIGN AND CODING BY D.M.NIXON JULY 1970
\r
1421 INDEX0: MOVE A,INDEXH ;BLOCK HEADER
\r
1422 AOS BLKCNT ;START ON BLOCK #1
\r
1423 PUSHJ P,OUT1 ;OUTPUT IT
\r
1424 OUTPUT 1, ;FORCE OUTPUT
\r
1425 MOVE T,OBUF+5 ;BUFFER SIZE
\r
1427 MOVEM T,BUFSIZ ;SAVE IT AWAY
\r
1428 AOS T,JOBREL ;TO GET 1K MORE
\r
1430 MOVEM T,XBEG ;START OF INDEX BUFFERS
\r
1432 JRST ERR22 ;NOT ENUF CORE
\r
1433 MOVEI A,1 ;START ON BLOCK #1 (IF DSK)
\r
1434 MOVEM A,@XPNTR ;STORE FIRST BLOCK #
\r
1440 SOS XCOUNT ;RESERVE SPACE FOR NEXT LINK WORD
\r
1442 \f;HERE ON PASS 1 TO STORE ENTRIES AND POINTERS.
\r
1444 INDEX1: AOS (P) ;SET SKIP RETURN
\r
1445 HRRZ T,ENTBLK ;GET SIZE OF BLOCK
\r
1447 ADDI T,1 ;WORD OF INFO
\r
1448 CAML T,XCOUNT ;ENUF ROOM IN BLOCK?
\r
1450 MOVE T,ENTBLK ;GET HEADER WORD
\r
1456 INDEXA: SKIPN T,(A)
\r
1462 INDEX2: MOVE T,BUFSIZ
\r
1471 ;HERE WHEN CURRENT INDEX BLOCK IS FULL.
\r
1473 NOROOM: MOVE A,INDEXH ;HEADER BLOCK OF INDEX FOR LOADER
\r
1476 MOVE T,BLKCNT ;GET INDEX BLOCK #
\r
1477 HRROM T,@XPNTR ;STORE IT WITH -1 IN LEFT HALF
\r
1482 ;MARK IT AS AN INDEX INCASE BLOCK FULL
\r
1483 HRROM T,@XPNTR ;SAVE BLOCK # FOR PASS 2
\r
1485 TRNN F,DTAFLG ;NOT IF DTA
\r
1486 AOS BLKCNT ;ONE FOR OUTPUT
\r
1491 SOS XCOUNT ;SPACE FOR LINK WORD TO NEXT INDEX
\r
1494 \f;HERE FOR PASS 2. WRITE OUT THE INDEX BLOCKS
\r
1496 INDEX3: SETOM @XPNTR ;TERMINATE WITH END OF INDEX MARKER
\r
1497 OUTPUT 1, ;SO LAST BLOCK IS WRITTEN
\r
1498 TRNE F,DTAFLG ;IS IT DTA?
\r
1499 JRST INDEX5 ;YES, TREAT DIFFERENTLY
\r
1503 INDEX4: SETZM XBEG+1
\r
1516 INDEX5: CLOSE 1, ;AND A SEPARATE EOF BLOCK
\r
1517 SETSTS 1,116 ;NONE STANDARD MODE
\r
1518 MOVNI A,200 ;IOWD COUNT
\r
1519 HRLM A,XBEG ;SET IT UP FOR OUTPUT
\r
1520 USETI 1,@BLKCNT ;SET ON LAST BLOCK
\r
1521 INPUT 1,DIRIOW ;READ IT IN
\r
1522 LDB A,[POINT 10,DIRBLK,27] ;GET FIRST BLOCK #
\r
1523 HRRM A,@XBEG ;STORE IT FOR COMMON LOOP
\r
1524 SETZM XBEG+1 ;MAKE SURE IT'S ZERO
\r
1525 INDEX6: MOVE A,@XBEG ;GET BLOCK NUMBER
\r
1526 USETI 1,(A) ;SET FOR INPUT
\r
1527 INPUT 1,DIRIOW ;INPUT BLOCK
\r
1528 MOVE T,DIRBLK ;TO FIND LINK WORD
\r
1529 EXCH T,@XBEG ;PUT IT IN OUTPUT BLOCK
\r
1530 SOS XBEG ;BACK UP POINTER
\r
1531 USETO 1,(A) ;NOW FOR OUTPUT
\r
1532 OUTPUT 1,XBEG ;OUT IT GOES
\r
1533 STATZ 1,760000 ;UNLESS IN ERROR
\r
1534 JRST ERR15 ;DEVICE ERROR
\r
1535 MOVEI A,200 ;GET TO NEXT DUMP BLOCK
\r
1536 ADDB A,XBEG ;ADVANCE POINTER
\r
1537 HRRZS A ;JUST WORD LOCATION
\r
1538 CAMG A,XPNTR ;ALL DONE?
\r
1539 JRST INDEX6 ;NO, LOOP
\r
1540 SETSTS 1,16 ;BACK TO STANDARD MODE TO UPDATE DIR.
\r
1541 JRST EXIT ;YES, FINISH UP
\r
1543 INDEXH: XWD 14,177 ;USED TO SIGNAL INDEX BLOCK TO LOADER
\r
1545 \fSUBTTL INPUT SERVICE ROUTINE
\r
1546 ;THE INPUT ROUTINE GETS CHARACTERS FROM THE DEVICE WHOSE
\r
1547 ;CHANNEL NUMBER IS IN ACCUMULATOR D. IT CALCULATES THE POSITION
\r
1548 ;OF THE BUFFER HEADER OF THE DEVICE, THEN EITHER LOADS AC A
\r
1549 ;FROM THE BYTE POINTER, OR DOES AN INPUT. IF AN END OF FILE
\r
1550 ;IS FOUND, THE ROUTINE EXITS WITH A POPJ, SINCE THE READ ROUTINE
\r
1551 ;IS CALLED WITH A PUSHJ, FOLLOWED BY AN EOF RETURN. THE NORMAL
\r
1552 ;EXIT FROM GETIN IS BY A JRST @GETIN.
\r
1554 GETIN: SOSG IBUF+2(DIS) ;IS APPROPRIATE BUFFER EMPTY?
\r
1555 JRST INGET ;YES, GET ANOTHER BUFFER
\r
1556 GETIN1: ILDB A, IBUF+1(DIS) ;LOAD AC A WITH A CHARACTER
\r
1559 INGET: DPB D,[POINT 4,INGET2,12]
\r
1560 DPB D,[POINT 4,INGET3,12]
\r
1561 JRST INGET2 ;INPUT A BUFFER OF DATA
\r
1564 ;OUTPUT SERVICE ROUTINE
\r
1565 ;THE OUT ROUTINE CHECKS THE TTYOB FLAG TO SEE IF THE OUTPUT
\r
1566 ;SHOULD BE ON THE TTY. IF SO, IT TRANSFERS CONTROL IMMEDIATELY.
\r
1567 ;OTHERWISE, IT ASSUMES OUTPUT IS ON DEVICE #1.
\r
1569 OUT: TRNN F, TTYOB ;SHOULD OUTPUT BE ON TTY?
\r
1571 OUT1: SOSG OBUF+5 ;IS OUTPUT BUFFER EMPTY?
\r
1572 JRST OUTGO ;YES, OUTPUT A BUFFER
\r
1573 OUT2: IDPB A, OBUF+4 ;DEPOSIT CHARACTER
\r
1576 OUTGO: TRNN F,XFLG ;IF NOT INDEXING
\r
1577 JRST OUTG ;DON'T WASTE TIME
\r
1578 TRNN F,DTAFLG ;IF DTA SKIP
\r
1579 AOSA BLKCNT ;INCR. COUNT IF DSK
\r
1580 UGETF 1,BLKCNT ;GET NEXT BLOCK IF DTA
\r
1581 OUTG: OUT 1, ;OUTPUT A BUFFER
\r
1582 JRST OUT2 ;NO ERRORS
\r
1583 MOVEI D, 1 ;YES, SET CHANNEL TO OUTPUT
\r
1584 JRST ERR15 ;GO TO ERROR ROUTINE
\r
1586 \fSUBTTL ROUTINE TO HANDLE ASTERISK FILE NAME *.EXT
\r
1587 ;THE DIRECTORY IS SEARCHED FOR FILE NAMES WITH GIVEN EXTENSION OR
\r
1588 ;EXTENSION REL IF NONE SPECIFIED. THESE ARE STORED IN FILBUF
\r
1589 ;ENTERED BY JRST FROM SEMICP
\r
1594 ASTRSK: MOVE B,COLON2 ;GET DEVICE LAST SEEN
\r
1595 MOVEM B,DSKINI+1 ;SAVE IT IN CASE DSK
\r
1596 DEVCHR B, ;GET ITS CHARACTERISTICS
\r
1597 TLNE B,DTABIT ;IS IT A DTA
\r
1599 TLNN B,DSKBIT ;IS IT THE DSK?
\r
1600 JRST ERR18 ;MUST BE ONE OR THE OTHER
\r
1601 ;FALL INTO DSKAST IF OK
\r
1603 DSKAST: PUSH P,JOBFF ;SAVE OLD JOBFF
\r
1604 MOVEI B,DSKHDR ;WHERE BUFFER WILL GO
\r
1605 MOVEM B,JOBFF ;SET IT UP
\r
1607 OPEN 11,DSKINI ;11 IS SAFE CH.NO.
\r
1608 JRST ERR19 ;CONNOT INIT DSK
\r
1609 INBUF 11,1 ;FORCE SINGLE BUFFERING
\r
1610 MOVE B,COLON2 ;GET DEVICE
\r
1611 DEVPPN B, ;GET PROJ-PROG INCASE SYS: ETC.
\r
1612 GETPPN B, ;FAILED, GET USER PROJ,PROG PAIR
\r
1613 MOVEM B,EBLOCK ;SAVE IT FOR LOOKUP OF UFD
\r
1614 MOVSI B,(SIXBIT/UFD/) ;EXTENSION
\r
1616 MOVE B,[XWD 1,1] ;TO GET UFD ***VJC
\r
1617 MOVEM B,EBLOCK+3 ;ENTRY BLOCK SET UP
\r
1618 LOOKUP 11,EBLOCK ;DO LOOKUP
\r
1619 JRST ERR20 ;CANNOT DO IT
\r
1621 DSKLUP: PUSHJ P,DSKINP ;INPUT A WORD
\r
1622 MOVEM S,SAVNAM ;SAVE NAME FOR LATER
\r
1623 PUSHJ P,DSKINP ;GET EXT AS WELL
\r
1624 HLLZM S,SAVEXT ;SAVE EXT, CLEAR RH ***VJC
\r
1625 SKIPN SAVNAM ;IS THERE A NAME
\r
1626 JRST DSKLUP ;NO GET NEXT PAIR
\r
1627 CAME EXT,SAVEXT ;EXTENSIONS MATCH
\r
1628 JRST DSKLUP ;NO GET NEXT PAIR
\r
1629 PUSHJ P,STNULL ;CLOSE OUT OLD FILE
\r
1630 MOVE S,SAVNAM ;RECALL NAME
\r
1631 PUSHJ P,PUTFIL ;STORE IT IN FILBUF
\r
1632 MOVE S,SAVEXT ;RECALL EXTENSION
\r
1634 HRRM D,(A) ;GET CHANNEL
\r
1635 HRRZ S,PRGBUF ;POINTER TO PRGBUF
\r
1636 PUSHJ P,PUTFIL ;SAVE IT AS 3RD WORD
\r
1637 JRST DSKLUP ;GO LOOP ROUND ALL
\r
1639 \f;ROUTINE TO GET NEXT WORD FROM UFD
\r
1641 DSKINP: SOSGE DIRBUF+2 ;USUAL INPUT ROUTINE
\r
1642 JRST DSKIN1 ;GET ANOTHER BUFFER
\r
1643 ILDB S,DIRBUF+1 ;GET A WORD
\r
1646 DSKIN1: IN 11,0 ;DO INPUT
\r
1647 JRST DSKINP ;NO ERRORS
\r
1648 STATO 11,20000 ;END OF FILE?
\r
1649 JRST ERR21 ;NO, READ ERROR
\r
1651 FIN: POP P,JOBFF ;POP UP ONE LEVEL
\r
1652 POP P,JOBFF ;RESTORE JOBFF
\r
1653 POPJ P, ;RETURN TO COMMAND SCAN
\r
1656 DTAAST: LDB B,[POINT 4,COLON1,12] ;GET CHANNEL
\r
1657 DPB B,[POINT 4,DP+0,12] ;DEPOSIT IT
\r
1658 DPB B,[POINT 4,DP+1,12]
\r
1659 DPB B,[POINT 4,DP+2,12]
\r
1660 DPB B,[POINT 4,DP+3,12]
\r
1661 DPB B,[POINT 4,DP+5,12]
\r
1662 SETZ B, ;INITIAL CONDITION
\r
1663 JRST DP ;INPUT DIRECTORY
\r
1665 DTALUP: CAIL B,26 ;END OF DIRECTORY
\r
1666 POPJ P, ;YES- FINISHED
\r
1667 HLLZ S,DIREXT(B) ;GET EXTENSION
\r
1668 SKIPE DIRNAM(B) ;IF NAME ZERO DON'T BOTHER
\r
1669 CAME S,EXT ;IS EXTENSION SAME
\r
1670 AOJA B,DTALUP ;NO GET NEXT ENTRY
\r
1671 PUSHJ P,STNULL ;TERMINATE LAST ENTRY
\r
1672 MOVE S,DIRNAM(B) ;GET NAME
\r
1673 PUSHJ P,PUTFIL ;STORE IT IN FILBUF
\r
1674 HLLZ S,DIREXT(B) ;AND EXTENSION
\r
1675 PUSHJ P,PUTFIL ;STORE IT
\r
1676 HRRM D,(A) ;SAVECH.
\r
1677 HRRZ S,PRGBUF ;SAVE PRGBUF POINTER
\r
1678 PUSHJ P,PUTFIL ;STORE IT
\r
1679 AOJA B,DTALUP ;GET NEXT ENTRY
\r
1681 \fSUBTTL ERROR ROUTINES
\r
1683 ERROR1: MOVEI B, EMES1 ;FUDGE COMMAND ERROR
\r
1684 JRST ERROR ;TYPE IT AND EXIT
\r
1686 ERROR2: MOVEI B, EMES2 ;TOO MANY PROGRAM NAMES
\r
1687 JRST ERROR ;TYPE IT AND EXIT
\r
1689 ERROR3: MOVEI B, EMES3 ;FUDGE SYSTEM ERROR
\r
1690 JRST ERROR ;TYPE A MESSAGE AND EXIT
\r
1692 ERROR4: PUSHJ P, DTYPOQ ;TYPE DEVICE NAME
\r
1693 MOVEI B, EMES4 ;"CANNOT DO IO AS REQUESTED"
\r
1694 JUMPN G,ERROR ;TYPE IT
\r
1695 MOVEI B,EMES24 ;NO SUCH DEVICE IF G=0
\r
1696 JRST ERROR ;TYPE IT AND EXIT
\r
1698 ERROR5: MOVEI B, EMES5 ;UNEQUAL NUMBER OF MASTER AND TR.
\r
1699 JRST ERROR ;TYPE IT AND EXIT
\r
1701 ERROR6: MOVEI B, EMES6 ;NOT ENOUGH ARGUMENTS
\r
1702 JRST ERROR ;TYPE IT AND EXIT
\r
1704 ERROR7: PUSHJ P, DTYPOQ ;TYPE OUT THE DEVICE NAME
\r
1705 MOVEI A, 72 ;ASCII COLON
\r
1706 PUSHJ P, TYPO ;TYPE IT OUT
\r
1707 PUSHJ P, FTYPO ;TYPE OUT THE FILE NAME
\r
1708 MOVEI A, 74 ;ASCII LEFT ANGLE BRACKET
\r
1709 PUSHJ P, TYPO ;TYPE IT OUT
\r
1710 MOVE B, R ;GET PROGRAM NAME
\r
1711 TRZ F, TTYOB ;SET IO BACK TO TTY
\r
1712 PUSHJ P, PTYPO ;TYPE OUT THE PROGRAM NAME
\r
1713 MOVEI A, 76 ;ASCII RIGHT ANGLE BRACKET
\r
1714 PUSHJ P, TYPO ;TYPE IT OUT
\r
1715 MOVEI B, EMES7 ;GET AN ERROR MESSAGE
\r
1716 JRST ERROR ;TYPE IT OUT AND EXIT
\r
1718 ERROR8: PUSHJ P, DTYPOQ ;TYPE OUT THE DEVICE NAME
\r
1719 MOVEI A, 72 ;ASCII COLON
\r
1720 PUSHJ P, TYPO ;TYPE IT OUT
\r
1721 PUSHJ P, FTYPO ;TYPE OUT FILE NAME
\r
1722 MOVEI A, 56 ;ASCII PERIOD
\r
1723 PUSHJ P, TYPO ;TYPE IT OUT
\r
1724 HRRZ A, FILBUF ;GET THE POINTER TO CURRENT FILE
\r
1725 HLRZ S, 1(A) ;GET FILE NAME EXTENSION
\r
1726 PUSHJ P, DTYPO1 ;TYPE IT OUT
\r
1727 MOVE T,SDEVCHR ;GET CHARACTERISTICS
\r
1728 TLNE T,DSKBIT ;IS IT A DSK?
\r
1730 MOVEI B, EMES7 ;GET ERROR MESSAGE "NOT FOUND"
\r
1731 JRST ERROR ;TYPE IT OUT AND EXIT
\r
1732 \fERROR9: PUSHJ P, DTYPOQ ;TYPE DEVICE NAME
\r
1733 MOVEI B, EMES9B ;GET REMAINDER OF MESSAGE
\r
1734 JRST ERROR ;TYPE IT AND EXIT
\r
1736 ERR10: MOVE C, A ;SAVE PROGRAM NAME IN C
\r
1737 MOVEI B, EMES10 ;"ENTRY BLOCK TOO LARGE, PROGRAM"
\r
1738 PUSHJ P, ETYPO ;TYPE BEGINNING OF MESSAGE
\r
1739 MOVE B, C ;GET PROGRAM NAME IN B
\r
1740 PUSHJ P, PTYPO ;TYPE IT OUT
\r
1743 ERR11: MOVEI B, EMES11 ;TRANSMISSION ERROR ON INPUT
\r
1744 PUSHJ P, ETYPO ;TYPE THE MESSAGE
\r
1745 PUSHJ P, DTYPO ;TYPE NAME OF OFFENDIN DEVICE
\r
1748 ERR14: MOVE T,SDEVCHR ;GET DEVICE CHARACTERISTICS
\r
1749 TLNE T,DSKBIT ;IS IT A DSK
\r
1751 MOVEI B, EMES14 ;DIRECTORY FULL ON OUTPUT
\r
1752 JRST ERROR ;TYPE IT AND EXIT
\r
1754 ERR8A: HRRZ T,EBLOCK+1 ;GET ERROR CODE
\r
1755 CAIL T,TABLND-ETABLE ;LEGAL ERROR?
\r
1756 SKIPA B,TABLND ;NO, USE CATCH ALL MESSAGE
\r
1757 MOVE B,ETABLE(T) ;PICK UP MESSAGE
\r
1760 \fETABLE: [ASCIZ /(0) file was not found/]
\r
1761 [ASCIZ /(1) no such project-programmer number/]
\r
1762 [ASCIZ /(2) protection failure/]
\r
1763 [ASCIZ /(3) file was being modified/]
\r
1764 [ASCIZ /(4) rename file name already exists/]
\r
1765 [ASCIZ /(5) illegal sequence of UUOs/]
\r
1766 [ASCIZ /(6) bad UFD or bad RIB/]
\r
1767 [ASCIZ /(7) not a SAV file/]
\r
1768 [ASCIZ /(10) not enough core/]
\r
1769 [ASCIZ /(11) device not available/]
\r
1770 [ASCIZ /(12) no such device/]
\r
1771 [ASCIZ /(13) not two reloc reg. capability/]
\r
1772 [ASCIZ /(14) no room or quota exceeded/]
\r
1773 [ASCIZ /(15) write lock error/]
\r
1774 [ASCIZ /(16) not enough monitor table space/]
\r
1775 [ASCIZ /(17) partial allocation only/]
\r
1776 [ASCIZ /(20) block not free on allocation/]
\r
1778 TABLND: [ASCIZ /(?) lookup,enter,or rename error/]
\r
1779 \fERR15: MOVEI B, EMES15 ;DEVICE ERROR ON OUTPUT
\r
1780 PUSHJ P, ETYPO ;TYPE THE MESSAGE
\r
1781 PUSHJ P, DTYPO ;TYPE NAME OF OFFENDING DEVICE
\r
1782 JRST EXIT1 ;GO AWAY
\r
1784 ERR16: MOVE B,A ;SAVE OFFENDING LETTER
\r
1786 MOVEI A,77 ;TYPE OUT "?"
\r
1788 MOVE A, B ;GET BACK OFFENDING LETTER
\r
1789 PUSHJ P, OUT ;TYPE OFFENDING LETTER
\r
1790 MOVEI B, EMES16 ;"X" IS AN ILLEGAL SWITCH
\r
1792 JRST ERROR ;TYPE IT AND EXIT
\r
1799 PUSHJ P, OUT ;TYPE OFFENDING LETTER
\r
1800 MOVEI B, EMES17 ;"X" IS AN ILLEGAL CHARACTER
\r
1802 JRST ERROR ;TYPE IT AND EXIT
\r
1804 ERR18: MOVEI B,EMES18
\r
1807 ERR19: MOVEI B,EMES19
\r
1810 ERR20: MOVEI B,EMES20
\r
1813 ERR21: MOVEI B,EMES21
\r
1816 ERR22: MOVEI B,EMES22
\r
1819 ERR23: MOVEI B,EMES23
\r
1821 \fSUBTTL VARIOUS ERROR ROUTINES AND SMALL TYPE-OUT ROUTINES
\r
1823 ETYPO: HRLI B, 440700 ;MAKE A BYTE POINTER
\r
1824 ETYPO2: ILDB A, B ;GET A CHARACTER
\r
1825 JUMPE A,CPOPJ ;EXIT IF NULL
\r
1826 PUSHJ P, TYPO ;NO, TYPE IT
\r
1827 JRST ETYPO2 ;RETURN FOR MORE CHARACTERS
\r
1829 DTYPOQ: TRON F,CRLFTY ;IS CR,LF TYPED OUT?
\r
1831 MOVEI A,77 ;TYPE OUT ? FOR BATCH
\r
1835 DTYPO: MOVE S, DEVBUF(D) ;GET DEVICE NAME FROM BUFFER
\r
1836 DTYPO1: MOVE C, SYMPTR ;BYTE POINTER TO SYMBOL NAME
\r
1837 MOVEI B, 6 ;LOOP COUNTER FOR 6 CHARACTERS
\r
1838 DTYPO2: ILDB A, C ;GET A CHARACTER
\r
1839 JUMPE A, DTYPO3 ;IGNORE BLANKS
\r
1840 ADDI A, 40 ;CONVERT TO 7-BIT ASCII
\r
1841 PUSHJ P, TYPO ;TYPE IT
\r
1842 DTYPO3: SOJG B, DTYPO2 ;ALL DONE?
\r
1845 FTYPO: MOVE S, @FILBUF ;PICK UP THE FILE NAME
\r
1846 JRST DTYPO1 ;JUMP INTO DTYPO ROUTINE
\r
1848 PTYPO: MOVEI A, 6 ;SIX CHARACTERS TO GET
\r
1849 PTYPO2: IDIVI B, 50 ;CONVERT TO SIXBIT CODE
\r
1850 HRLM B+1, (P) ;STORE CHARACTER ON PD LIST
\r
1851 SOJLE A,.+2 ;ALL DONE?
\r
1852 PUSHJ P, PTYPO2 ;NO, DIVIDE SOME MORE
\r
1853 HLRZ A, (P) ;POP CHARACTERS OFF STACK
\r
1854 JUMPE A, CPOPJ ;IGNORE BLANKS
\r
1855 CAILE A, 12 ;LETTER OR NUMBER?
\r
1856 ADDI A, 7 ;LETTER - ADD 66
\r
1857 ADDI A, 57 ;NUMBER - ADD 57
\r
1858 CAIN A, 134 ;DOLLAR SIGN?
\r
1859 SUBI A, 70 ;YES, SPECIAL CASE
\r
1860 CAIN A, 133 ;PERIOD?
\r
1861 SUBI A, 55 ;YES, SPECIAL CASE
\r
1862 JRST OUT ;RECURSIVE EXIT FOR MORE CHARS
\r
1864 TYPO: IDPB A, OBUF+1 ;STORE CHARACTER IN BUFFER
\r
1865 CAIN A, 12 ;LINE FEED?
\r
1866 OUTPUT 0, ;YES, EMPTY BUFFER
\r
1868 \fCRLF: MOVEI A, 15 ;CARRIAGE RETURN
\r
1869 PUSHJ P, OUT ;OUTPUT IT
\r
1870 MOVEI A, 12 ;LINE FEED
\r
1871 JRST OUT ;OUTPUT IT AND EXIT
\r
1873 ERROR: TRZ F,TTYOB ;JUST IN CASE , SET OUTPUT TO TTY
\r
1876 PUSHJ P, ETYPO ;TYPE LAST MESSAGE OF ERROR
\r
1877 EXIT1: TRZ F,TTYOB ;ENSURE TTY OUTPUT OF CR-LF
\r
1878 PUSHJ P,CRLF ;FINISH WITH CR-LF
\r
1879 CLOSE 0, ;FORCE OUTPUT OF LAST LINE
\r
1880 JRST FUDGE2 ;START AGAIN
\r
1882 EXIT: CLOSE 1, ;CLOSE OUT THE OUTPUT CHANNEL
\r
1883 JRST FUDGE2 ;RESTART
\r
1885 \fSUBTTL ERROR MESSAGES
\r
1886 EMES1: ASCIZ "?FUDGE2 SYNTAX ERROR"
\r
1887 EMES2: ASCIZ "?TOO MANY FILE NAMES OR PROGRAM NAMES"
\r
1888 EMES3: ASCIZ "?PROGRAM ERROR WHILE RESETTING MASTER DEVICE"
\r
1889 EMES4: ASCIZ " CANNOT DO IO AS REQUESTED"
\r
1890 EMES5: ASCIZ "?UNEQUAL NUMBER OF MASTER AND TRANSACTION PROGRAMS"
\r
1891 EMES6: ASCIZ "?NOT ENOUGH ARGUMENTS"
\r
1892 EMES7: ASCIZ " NOT FOUND"
\r
1893 EMES9B: ASCIZ " NOT AVAILABLE"
\r
1894 EMES10: ASCIZ "?ENTRY BLOCK TOO LARGE, PROGRAM "
\r
1895 EMES11: ASCIZ "?TRANSMISSION ERROR ON INPUT DEVICE "
\r
1896 EMES14: ASCIZ "?DIRECTORY FULL ON OUTPUT DEVICE "
\r
1897 EMES15: ASCIZ "?DEVICE ERROR ON OUTPUT DEVICE "
\r
1898 EMES16: ASCIZ " IS AN ILLEGAL SWITCH"
\r
1899 EMES17: ASCIZ " IS AN ILLEGAL CHARACTER"
\r
1900 EMES18: ASCIZ "?DEVICE FOR * COMMAND MUST BE DSK OR DTA"
\r
1901 EMES19: ASCIZ "?CANNOT INIT DSK"
\r
1902 EMES20: ASCIZ "?LOOKUP FAILURE ON DSK"
\r
1903 EMES21: ASCIZ "?ERROR WHILE READING UFD"
\r
1904 EMES22: ASCIZ "?NOT ENOUGH CORE AVAILABLE "
\r
1905 EMES23: ASCIZ "?OUTPUT DEVICE MUST BE DSK OR DTA"
\r
1906 EMES24: ASCIZ " DOES NOT EXIST"
\r
1907 \fSUBTTL IMPURE CODE
\r
1910 COLON1: OPEN ,COLON0 ;INITIALIZATION SEQUENCE
\r
1911 SEMIC1: ENTER , EBLOCK(T)
\r
1912 INBUF3: INBUF ,(C)
\r
1914 BACK0: MTAPE , 17 ;BACKSPACE MAG TAPE ONE FILE
\r
1915 BACK3: MTAPE ,0 ;WAIT FOR BACKSPACE TO FIN.
\r
1916 BACK1: STATO , IOBOT ;ARE WE AT BEGINNING OF TAPE
\r
1917 BACK2: MTAPE , 16 ;NO, SKIP FILE
\r
1921 GET4A: LOOKUP , EBLOCK(T)
\r
1923 INGET2: IN 0, ;INPUT A BUFFER OF DATA
\r
1924 JRST GETIN1 ;NO ERRORS
\r
1925 INGET3: STATZ , IOEOF ;END OF FILE?
\r
1926 JRST POPOUT ;YES, HIGH LEVEL EXIT
\r
1929 DP: SETSTS ,117 ;DUMP MODE NON-STANDARD
\r
1930 USETI ,144 ;DIRECTORY BLOCK
\r
1931 INPUT ,DIRIOW ;ONE BLOCK ONLY
\r
1932 STATZ ,760000 ;CHECK ERRORS
\r
1933 JRST DP ;TRY AGAIN
\r
1934 SETSTS ,14 ;BACK TO BINARY
\r
1938 SIXBIT /DSK/ ;MAY GET MODIFIED
\r
1941 DIRIOW: IOWD 200,DIRBLK ;IOWD FOR DIRECTORY INPUT
\r
1942 0 ;MUST BE IN LOW SEGMENT
\r
1944 \fSUBTTL STORAGE AND BUFFERS
\r
1949 BLKCNT: BLOCK 1 ;NUMBER OF BUFFERS OUTPUT
\r
1952 COLON0: BLOCK 1 ;MODE
\r
1953 COLON2: BLOCK 1 ;DEVICE NAME
\r
1954 COLON3: BLOCK 1 ;BUFFER HEADER
\r
1962 BLOCK 2 ;FOR EXTENDED LOOKUP AND ENTERS
\r
1964 BLOCK <RIBALC-6+1> ;MORE EXTENDED STUFF
\r
1965 OBUF: BLOCK 6 ;TTY:, OUTPUT DEV:
\r
1966 IBUF: BLOCK 30 ;INPUT DEVICES (10)
\r
1968 SAVNAM: BLOCK 1 ;SAVED FILE NAME FROM UFD
\r
1969 SAVEXT: BLOCK 1 ;SAVED EXT NAME FROM UFD
\r
1970 DIRBUF: BLOCK 3 ;DIRECTORY BUFFER HEADER
\r
1971 DSKHDR: BLOCK N+2 ;TWO WORDS OF OVERHEAD [P,P]+EXT
\r
1973 DIRNAM=DIRBLK+123 ;FILENAMES IN DTA DIRECTORY START HERE
\r
1974 DIREXT=DIRNAM+26 ;EXTENSIONS IN DTA DIRECTORY START HERE
\r
1976 BSZ: BLOCK 1 ;SIZE OF OLD SYMBOL BLOCK
\r
1977 PTGRS: BLOCK 1 ;PTGR SAVED
\r
1978 PTSRS: BLOCK 1 ;PTSR SAVED
\r
1979 RELOCS: BLOCK 1 ;ORIGINAL RELOC
\r
1980 SYMBLK: BLOCK ^D20 ;NEW SYMBOL BLOCK
\r
1982 MATCH: BLOCK 1 ;COUNT OF <'S - >'S ***VJC
\r
1984 CURCHR: BLOCK 1 ;SAVED CURRENT CHAR OF CS
\r
1985 LSTCHR: BLOCK 1 ;SAVED LAST CHAR OF CS
\r
1986 SDEVCH: BLOCK 1 ;SAVED DEVICE CHARACTERS
\r
1987 NUMDEV: BLOCK 1 ;NUMBER OF DEVICES
\r
1992 LEVEL: BLOCK 1 ;-2 IF LEVEL D
\r
1993 DEFPPN: BLOCK 1 ;DEFAULT PROJ-PROG
\r
1994 PRJPRG: BLOCK 1 ;TEMP. PROJ-PROG
\r
1995 SVENTR: BLOCK 2 ;PLACE TO SAVE EBLOCK,+1
\r
1996 NOWARN: BLOCK 1 ;SIGNAL TO PRINT MESSAGE ABOUT INDEX
\r
2000 \fSUBTTL CONSTANTS,POINTERS AND LITERALS
\r
2002 SYMPTR: POINT 6, S
\r
2003 EXTPTR: POINT 6, EXT
\r
2004 PTSR: POINT 4,SYMBLK+1 ;TO STORE RELOCATION
\r
2005 PTGR: POINT 4,RELOCS ;TO GET RELOCATION
\r
2007 FILXWD: XWD FILBUF+2, FILBUF+1
\r
2008 XPDLST: XWD -XP,PDLIST-1
\r