1 SUBTTL DICK GRUEN: V25 3 AUG 68
\r
4 ;K=1 ;K=1 MEANS 1KLOADER
\r
5 IFNDEF K,<K=0> ;K=0 MEANS F4 LOADER
\r
7 ;RPGSW=1 ;MEANS RPG FEATURE
\r
8 IFNDEF RPGSW,<RPGSW=0>
\r
9 ;LDAC=1 ;MEANS LOAD CODE INTO ACS
\r
10 IFNDEF LDAC,<LDAC=0>
\r
12 ;BLTSYM=1 ;MOVE SYMBOL TABLE DOWN TO END OF PROG
\r
13 IFNDEF BLTSYM,<BLTSYM=0>
\r
15 ;EXPAND=1 ;FOR AUTOMATIC CORE EXPANSION
\r
16 IFNDEF EXPAND,< IFN K,<EXPAND=0>
\r
19 ;PP=1 ;ALLOW PROJ-PROG #
\r
22 ;CHN5=0 ;IF CHAIN WHICH DOESN'T SAVES JOB41
\r
23 IFNDEF CHN5,<CHN5=1>
\r
25 IFE K,< TITLE LOADER - LOADS MACROX AND SIXTRAN FOUR>
\r
26 IFN K,< TITLE 1KLOAD - LOADS MACROX>
\r
27 \f;ACCUMULATOR ASSIGNMENTS
\r
28 F=0 ;FLAGS IN LH, SA IN RH
\r
29 N=1 ;PROGRAM NAME POINTER
\r
31 H=3 ;HIGHEST LOC LOADED
\r
32 S=4 ;UNDEFINED POINTER
\r
33 R=5 ;RELOCATION CONSTANT
\r
34 B=6 ;SYMBOL TABLE POINTER
\r
40 E=C+1 ;DATA WORD COUNTER
\r
41 Q=15 ;RELOCATION BITS
\r
42 A=Q+1 ;SYMBOL SEARCH POINTER
\r
43 P=17 ;PUSHDOWN POINTER
\r
45 CSW==1 ;ON - COLON SEEN
\r
46 ESW==2 ;ON - EXPLICIT EXTENSION IDENT.
\r
47 SKIPSW==4 ;ON - DO NOT LOAD THIS PROGRAM
\r
48 FSW==10 ;ON - SCAN FORCED TO COMPLETION
\r
49 FCONSW==20 ;ON - FORCE CONSOLE OUTPUT
\r
50 ASW==100 ;ON - LEFT ARROW ILLEGAL
\r
51 FULLSW==200 ;ON - STORAGE EXCEEDED
\r
52 SLIBSW==400 ;ON - LIB SEARCH IN THIS PROG
\r
53 DSYMSW==1000 ;ON - LOAD WITH SYMBOLS FOR DDT
\r
54 REWSW==2000 ;ON - REWIND AFTER INIT
\r
55 LIBSW==4000 ;ON - LIBRARY SEARCH MODE
\r
56 F4LIB==10000 ;ON - F4 LIBRARY SEARCH LOOKUP
\r
57 ISW==20000 ;ON - DO NOT PERFORM INIT
\r
58 SYMSW==40000 ;ON - LOAD LOCAL SYMBOLS
\r
59 DSW==100000 ;ON - CHAR IN IDENTIFIER
\r
60 NSW==200000 ;ON - SUPPRESS LIBRARY SEARCH
\r
61 SSW==400000 ;ON - SWITCH MODE
\r
63 ALLFLG==1 ;ON - LIST ALL GLOBALS
\r
64 ISAFLG==2 ;ON - IGNORE STARTING ADDRESSES
\r
65 COMFLG==4 ;ON - SIZE OF COMMON SET
\r
66 IFE K,< F4SW==10 ;F4 IN PROGRESS
\r
67 RCF==20 ;READ DATA COUNT
\r
68 SYDAT==40 ;SYMBOL IN DATA>
\r
69 SLASH==100 ;SLASH SEEN
\r
70 IFE K,< BLKD1==200 ;ON- FIRST BLOCK DATA SEEN
\r
71 PGM1==400 ;ON FIRST F4 PROG SEEN
\r
72 DZER==1000 ;ON - ZERO SECOND DATA WORD>
\r
73 EXEQSW==2000 ;IMMEDIATE EXECUTION
\r
74 DDSW==4000 ;GO TO DDT
\r
75 IFN RPGSW,<RPGF==10000 ;IN RPG MODE>
\r
76 AUXSWI==20000 ;ON - AUX. DEVICE INITIALIZED
\r
77 AUXSWE==40000 ;ON - AUX. DEVICE ENTERED
\r
78 IFN PP,<PPSW==100000 ;ON - READING PROJ-PROG #
\r
79 PPCSW==200000 ;ON - READING PROJ #>
\r
88 ;MONITOR LOCATIONS IN THE USER AREA
\r
90 JOBPRO==140 ;PROGRAM ORIGIN
\r
91 JOBBLT==134 ;BLT ORIGIN
\r
92 JOBCHN==131 ;RH = PROG BREAK OF FIRST BLOCK DATA
\r
93 ;LH = PROG BREAK OF FIRST F4 PROG
\r
97 CDDTOUT==3 ;CALLI DDTOUT
\r
98 CEXIT==12 ;CALLI EXIT
\r
99 CDDTGT==5 ;CALLI DDTGT
\r
100 CSETDDT==2 ;CALLI SETDDT
\r
102 ;LENGTH OF PUSHDOWN LIST FOR POLISH FIXUPS
\r
107 INIT 17,1 ;SET UP DSK
\r
111 MOVE [SIXBIT /QQLOAD/] ;NAME OF COMMAND FILE
\r
113 MOVSI (SIXBIT /RPG/) ;AND EXT
\r
116 LOOKUP 17,CTLNAM ;THERE?
\r
118 INIT 16,16 ;GET SET TO DELETE QQLOAD.RPG
\r
121 JRST LD ;GIVE UP COMPLETELY
\r
123 HLLZS CTLNAM+1 ;CLEAR OUT EXTRA JUNK
\r
126 RENAME 16,ZEROS ;DELETE IT
\r
127 JFCL ;IGNORE IF IT WILL NOT GO
\r
128 RELEASE 16,0 ;GET RID OF THIS DEVICE
\r
129 SETZM NONLOD ;THIS IS NOT A CONTINUATION
\r
130 RPGS3: MOVEI CTLBUF
\r
131 MOVEM JOBFF ;SET UP BUFFER
\r
135 /] ;PRINT MESSAGE THAT WE ARE STARTING
\r
137 SKIPE NONLOD ;CONTINUATION?
\r
138 JRST RPGS2 ;YES, SPECIAL SETUP
\r
139 MOVSI R,F.I ;NOW SO WE CAN SET FLAG
\r
142 JRST CTLSET ;SET UP TTY
\r
143 RPGS1: PUSHJ P,[TLNE F,ESW ;HERE FROM FOO* COMMAND, STORE NAME
\r
144 JRST LDDT3 ;SAVE EXTENSION
\r
145 TLZE F,CSW!DSW ;OR AS NAME
\r
148 MOVEM 0,SVRPG# ;SAVE 0 JUST IN CASE
\r
149 SETZM NONLOD# ;DETERMINE IF CONTINUATION
\r
150 MOVEI 0,2(B) ;BY SEEING IF ANY SYMBOLS LOADED
\r
152 SETOM NONLOD ;SET TO -1 AND SKIP CALLI
\r
159 LOOKUP 17,DTIN ;THE FILE NAME
\r
163 RPGS2: MOVSI 0,RPGF ;SET FLAG
\r
167 JRST LD2Q ;BACK TO INPUT SCANNING
\r
170 ;MONITOR LOADER CONTROL
\r
173 LD: IFN RPGSW,<SKIPA ;NORMAL INITIALIZE
\r
174 JRST RPGSET ;SPECIAL INIT>
\r
175 HLLZS 42 ;GET RID OF ERROR COUNT IF NOT IN RPG MODE
\r
176 CALLI 0 ;INITIALIZE THIS JOB
\r
177 NUTS: MOVSI R,F.I ;SET UP INITIAL ACCUMULATORS
\r
179 CTLSET: INIT 3,1 ;INITIALIZE CONSOLE
\r
182 CALLEX: CALLI CEXIT ;DEVICE ERROR, FATAL TO JOB
\r
186 OUTBUF 3,1 ;INITIALIZE OUTPUT BUFFERS
\r
187 OUTPUT 3, ;DO INITIAL REDUNDANT OUTPUT
\r
188 HRRZ B,JOBREL ;PICK UP CORE BOUND
\r
189 SKIPE JOBDDT ;DOES DDT EXIST?
\r
190 HRRZ B,JOBSYM ;USED BOTTOM OF SYMBOL TABLE INSTEAD
\r
191 SUB B,SE3 ;INITIALIZE SYMBOL TABLE POINTER
\r
192 CAILE H,1(B) ;TEST CORE ALLOCATION
\r
193 CALLI CEXIT ;INSUFFICIENT CORE, FATAL TO JOB
\r
194 MOVS E,X ;SET UP BLT POINTER
\r
196 SETZM -1(E) ;ZERO FIRST WORD
\r
197 BLT E,(B) ;ZERO CORE UP TO THE SYMBOL AREA
\r
198 HRRZ S,B ;INITIALIZE UNDEF. POINTER
\r
199 HRR N,B ;INITIALIZE PROGRAM NAME POINTER
\r
200 HRRI R,JOBPRO ;INITIALIZE THE LOAD ORIGIN
\r
201 MOVE E,COMM ;SET .COMM. AS THE FIRST PROGRAM
\r
202 MOVEM E,1(B) ;STORE IN SYMBOL TABLE
\r
203 HRRZM R,2(B) ;STORE COMMON ORIGIN
\r
204 MOVEI E,F.C ;INITIALIZE STATE OF THE LOADER
\r
206 SETZM MDG ;MULTIPLY DEFINED GLOBAL COUNT
\r
207 MOVSI W,254200 ;STORE HALT IN JOB41
\r
208 MOVEM W,JOB41(X) ;...
\r
209 IFN LDAC!BLTSYM,<MOVEI W,20 ;SET UP SPACE TO SAVE FOR ACS AND
\r
210 MOVEM W,KORSP# ;USER DEFINITIONS WITH DDT>
\r
213 IFN RPGSW,<JRST LD2Q>
\r
214 LD2: IFN RPGSW,<MOVSI B,RPGF ;HERE ON ERRORS, TURN OFF RPG
\r
215 ANDCAM B,F.C+N ;IN CORE>
\r
216 ;LOADER SCAN FOR FILE NAMES
\r
218 LD2Q: MOVSI B,F.C ;RESTORE ACCUMULATORS
\r
220 MOVE P,PDLPT ;INITIALIZE PUSHDOWN LIST
\r
221 SETZM BUFI2 ;CLEAR INPUT BUFFER POINTER
\r
222 IFE PP,< SETZM ILD1 ;CLEAR INPUT DEVICE NAME>
\r
223 IFN PP,< MOVSI T,(SIXBIT /DSK/) ;ASSUME DSK
\r
225 SETZM OLDDEV# ;TO MAKE IT GO BACK AFTER /D FOR LIBSR>
\r
226 SETZM DTIN ;CLEAR INPUT FILE NAME
\r
227 IFN PP,<SETZM PPN# ;CLEAR INPUT PROJ-PROG #>
\r
229 LD2B: RELEAS 1, ;RELEASE BINARY INPUT DEVICE
\r
230 IFN RPGSW,< TLNE N,RPGF ;NOT IF DOING RPG
\r
233 IDPB T,BUFO1 ;OUTPUT ASTERISK TO START INPUT
\r
235 LD2BA: TLZ F,FULLSW+ASW+ISW+CSW+ESW+SKIPSW+SLIBSW+REWSW
\r
236 TLNE F,LIBSW ;WAS LIBRARY MODE ON?
\r
237 TLO F,SKIPSW ;YES, NORMAL MODE IS SKIPPING
\r
239 LD2D: IFN PP,<SETZM PPN ;DO NOT REMEMBER PPNS FOR NOW
\r
240 LD2DB: SKIPE W,OLDDEV ;RESET DEVICE IF NEEDED
\r
241 CAMN W,ILD1 ;IS IT SAME?
\r
242 JRST LD2DA ;YES, FORGET IT
\r
243 TLZ F,ISW+DSW+FSW+REWSW
\r
246 IFN RPGSW,< SETZM DTIN1 ;CLEAR EXTENSION>
\r
247 MOVEI W,0 ;INITIALIZE IDENTIFIER SCAN
\r
248 MOVEI E,6 ;INITIALIZE CHARACTER COUNTER
\r
249 MOVE V,LSTPT ;INITIALIZE BYTE POINTER TO W
\r
250 TLZ F,SSW+DSW+FSW ;LEAVE SWITCH MODE
\r
251 LD3: IFN RPGSW,<TLNE N,RPGF ;CHECK RPG FEATURE
\r
253 SOSG BUFI2 ;DECREMENT CHARACTER COUNT
\r
254 INPUT 3, ;FILL TTY BUFFER
\r
255 ILDB T,BUFI1 ;LOAD T WITH NEXT CHARACTER
\r
257 IDIVI Q,11 ;TRANSLATE TO 4 BIT CODE
\r
258 LDB Q,LD8(A) ;LOAD CLASSIFICATION CODE
\r
259 CAIGE Q,4 ;MODIFY CODE IF .GE. 4
\r
260 TLNN F,SSW ;MODIFY CODE IF SWITCH MODE OFF
\r
261 ADDI Q,4 ;MODIFY CLASS. CODE FOR DISPATCH
\r
262 HRRZ A,LD3A(Q) ;LOAD RH DISPATCH ENTRY
\r
263 CAIL Q,10 ;SKIP IF CORRECT DISPATCH ENTRY
\r
264 HLRZ A,LD3A-10(Q) ;LOAD LH DISPATCH ENTRY
\r
265 JRST @A ;JUMP TO INDICATED LOCATION
\r
267 ;COMMAND DISPATCH TABLE
\r
269 LD3A: XWD LD3,LD7B ;IGNORED CHAR, BAD CHAR (SWITCH)
\r
270 XWD LD6A,LD6 ;</> OR <(>, LETTER (SWITCH)
\r
271 XWD LD5,LD6C ;<:>, DIGIT (SWITCH ARG.)
\r
272 XWD LD5A,LD6D ;<.>, ESCAPE SWITCH MODE <)>
\r
273 XWD LD5C,LD7 ;<=> OR <L. ARROW>, BAD CHAR.
\r
274 XWD LD5B,LD4 ;<,>, ALPHABETIC CHAR.
\r
275 XWD LD5D,LD4 ;<CR.>, NUMERIC CHAR.
\r
276 XWD LD5E1,LD7 ;<ALT MODE>, BAD CHAR. <)>
\r
278 IFN RPGSW,<RPGRD: SOSG CTLIN+2 ;CHECK CHARACTER COUNT
\r
284 SIXBIT /ERROR WHILE READING COMMAND FILE%/
\r
286 IBP CTLIN+1 ;ADVANCE POINTER
\r
287 MOVE T,@CTLIN+1 ;AND CHECK FOR LINE #
\r
292 JRST RPGRD ];GO READ AGAIN
\r
293 LDB T,CTLIN+1 ;GET CHR
\r
294 JRST LD3AA ;PASS IT ON>
\r
295 \f;ALPHANUMERIC CHARACTER, NORMAL MODE
\r
296 LD4: SOJL E,LD3 ;JUMP IF NO SPACE FOR CHAR IN W
\r
297 SUBI T,40 ;CONVERT FROM ASCII TO SIXBIT
\r
298 IDPB T,V ;DEPOSIT CHAR OF IDENTIFIER IN W
\r
299 TLO F,DSW ;SET IDENTIFIER FLAG
\r
300 JRST LD3 ;RETURN FOR NEXT CHARACTER
\r
302 ;DEVICE IDENTIFIER DELIMITER <:>
\r
304 LD5: PUSH P,W ;SAVE W
\r
305 TLOE F,CSW ;TEST AND SET COLON FLAG
\r
306 PUSHJ P,LDF ;FORCE LOADING
\r
308 TLNE F,ESW ;TEST SYNTAX
\r
309 JRST LD7A ;ERROR, MISSING COMMA ASSUMED
\r
310 JUMPE W,LD2D ;JUMP IF NULL DEVICE IDENTIFIER
\r
311 MOVEM W,ILD1 ;STORE DEVICE IDENTIFIER
\r
312 IFN PP,<MOVEM W,OLDDEV ;WE HAVE A NEW ONE SO IGNORE OLD>
\r
313 TLZ F,ISW+DSW+FSW+REWSW ;CLEAR OLD DEVICE FLAGS
\r
314 IFN PP,<SETZM PPN ;CLEAR OLD PP #>
\r
315 JRST LD2D ;RETURN FOR NEXT IDENTIFIER
\r
317 ;FILE NAME EXTENSION IDENTIFIER DELIMITER <.>
\r
319 LD5A: TLOE F,ESW ;TEST AND SET EXTENSION FLAG
\r
320 JRST LD7A ;ERROR, TOO MANY PERIODS
\r
321 TLZE F,CSW+DSW ;SKIP IF NULL IDENT AND NO COLON
\r
322 MOVEM W,DTIN ;STORE FILE IDENTIFIER
\r
323 JRST LD2D ;RETURN FOR NEXT IDENTIFIER
\r
325 ;INPUT SPECIFICATION DELIMITER <,>
\r
328 IFN PP,<TLZE N,PPCSW ;READING PP #?
\r
330 HRLM D,PPN ;STORE PROJ #
\r
331 JRST LD6A1] ;GET PROG #
\r
332 PUSHJ P,RBRA ;CHECK FOR MISSING RBRA>
\r
333 TLZN F,FSW ;SKIP IF PREV. FORCED LOADING
\r
334 PUSHJ P,FSCN2 ;LOAD (FSW NOT SET)
\r
335 JRST LD2D ;RETURN FOR NEXT IDENTIFIER
\r
337 LD5B1: TLNE F,ESW ;TEST EXTENSION FLAG
\r
338 JRST LDDT3 ;EXPLICIT EXTENSION IDENTIFIER
\r
339 TLZN F,CSW+DSW ;SKIP IF IDENT. OR COLON
\r
341 MOVEM W,DTIN ;STORE FILE IDENTIFIER
\r
342 JRST LDDT2 ;ASSUME <.REL> IN DEFAULT CASE
\r
343 \f;OUTPUT SPECIFICATION DELIMITER <=> OR <LEFT ARROW>
\r
344 ;OR PROJ-PROG # BRACKETS <[> AND <]>
\r
346 IFN RPGSW,<CAIN T,"@" ;CHECK FOR * COMMAND
\r
348 IFN PP,<CAIN T,"[" ;PROJ-PROG #?
\r
349 JRST [TLO N,PPSW+PPCSW ;SET FLAGS
\r
350 MOVEM W,PPNW# ;SAVE W
\r
351 MOVEM E,PPNE# ;SAVE E
\r
352 MOVEM V,PPNV# ;SAVE V
\r
353 JRST LD6A1-1] ;READ NUMBERS AS SWITCHES
\r
354 CAIN T,"]" ;END OF PP #?
\r
355 JRST [PUSHJ P,RBRA ;PROCESS RIGHT BRACKET
\r
356 JRST LD3 ];READ NEXT IDENT>
\r
357 TLOE F,ASW ;TEST AND SET LEFT ARROW FLAG
\r
358 JRST LD7A ;ERROR, MISPLACED LEFT ARROW
\r
359 PUSHJ P,LD5B1 ;STORE IDENTIFIER
\r
360 TLZN F,ESW ;TEST EXTENSION FLAG
\r
361 MOVSI W,554160 ;ASSUME <.MAP> IN DEFAULT CASE
\r
362 MOVEM W,DTOUT1 ;STORE FILE EXTENSION IDENTIFIER
\r
363 MOVE W,DTIN ;LOAD INPUT FILE IDENTIFIER
\r
364 MOVEM W,DTOUT ;USE AS OUTPUT FILE IDENTIFIER
\r
365 IFN PP,<MOVE W,PPN ;PROJ-PROG #
\r
366 MOVEM W,DTOUT+3 ;...>
\r
367 MOVE W,ILD1 ;LOAD INPUT DEVICE IDENTIFIER
\r
368 MOVEM W,LD5C1 ;USE AS OUTPUT DEVICE IDENTIFIER
\r
369 IFN PP,< SKIPE W,OLDDEV ;RESTORE OLD
\r
371 ;INITIALIZE AUXILIARY OUTPUT DEVICE
\r
372 TLZE N,AUXSWI+AUXSWE ;FLUSH CURRENT DEVICE
\r
374 CALL W,[SIXBIT ?DEVCHR?] ;IS DEVICE A TTY?
\r
376 JRST LD2D ;YES, SKIP INIT
\r
377 INIT 2,1 ;INIT THE AUXILIARY DEVICE
\r
378 LD5C1: 0 ;AUXILIARY OUTPUT DEVICE NAME
\r
379 XWD ABUF,0 ;BUFFER HEADER
\r
380 JSP A,ILD5 ;ERROR RETURN
\r
381 TLNE F,REWSW ;REWIND REQUESTED?
\r
382 CALL 2,[SIXBIT /UTPCLR/] ;DECTAPE REWIND
\r
383 TLZE F,REWSW ;SKIP IF NO REWIND REQUESTED
\r
384 MTAPE 2,1 ;REWIND THE AUX DEV
\r
385 MOVEI E,AUX ;SET BUFFER ORIGIN
\r
387 OUTBUF 2,1 ;INITIALIZE SINGLE BUFFER
\r
388 TLO N,AUXSWI ;SET INITIALIZED FLAG
\r
389 JRST LD2D ;RETURN TO CONTINUE SCAN
\r
392 ;RIGHT SQUARE BRACKET (PROJ-PROG NUMBERS)
\r
394 RBRA: TLZN N,PPSW ;READING PP #?
\r
395 POPJ P, ;NOPE, RETURN
\r
396 TLZE N,PPCSW ;COMMA SEEN?
\r
397 JRST LD7A ;NOPE, INDICATE ERROR
\r
398 HRRM D,PPN ;STASH PROG NUMBER
\r
399 MOVE W,PPNW# ;PICKUP OLD IDENT
\r
400 MOVE E,PPNE# ;RESTORE CHAR COUNT
\r
401 MOVE V,PPNV# ;RESTORE BYTE PNTR
\r
406 RJUST: JUMPE W,LD7A ;NOTHING TO RIGHT JUSTIFY
\r
407 TRNE W,77 ;IS W RJUSTED YET?
\r
408 POPJ P, ;YES, TRA 1,4
\r
409 LSH W,-6 ;NOPE, TRY AGAIN
\r
412 ;LINE TERMINATION <CARRIAGE RETURN>
\r
415 IFN PP,<PUSHJ P,RBRA ;CHECK FOR UNTERMINATED PP #>
\r
416 PUSHJ P,FSCN ;FORCE SCAN TO COMPLETION
\r
417 JRST LD2B ;RETURN FOR NEXT LINE
\r
419 ;TERMINATE LOADING <ALT MODE>
\r
421 LD5E: SKIPE D ;ENTER FROM G COMMAND
\r
422 HRR F,D ;USE NUMERIC STARTING ADDRESS
\r
424 PUSHJ P,CRLF ;START A NEW LINE
\r
425 PUSHJ P,SASYM ;SETUP JOBSA,JOBFF,JOBSYM,JOBUSY
\r
426 IFN LDAC!BLTSYM,<HRRZ A,R ;SET UP BLT OF ACS
\r
428 ADD A,KORSP ;ADD IN SPACE RESERVED
\r
430 IFN EXPAND,<JRST [PUSHJ P,XPAND>
\r
432 IFE EXPAND,< JSP A,ERRPT
\r
433 SIXBIT /MORE CORE NEEDED#/>
\r
435 IFN EXPAND,< JRST .-1]>
\r
436 HRRM R,BOTACS# ;SAVE FOR LATER
\r
442 IFN BLTSYM,<HRRZ A,R ;PLACE TO BLT TO
\r
444 MOVE W,A ;SAVE DEST
\r
445 ADDI A,(X) ;AFTER ADJUSTMENT
\r
446 MOVE Q,S ;UDEF PNTR
\r
447 ADD Q,B ;TOTAL UNDEFS AND DEFS IN LEFT
\r
448 HLROS Q ;NOW NEG IN RIGHT
\r
450 ADDI Q,-1(A) ;END OF BLT
\r
451 HRLI A,1(S) ;AND GET PLACE TO BLT FROM
\r
452 SUBI W,1(S) ;PREST LOC OF SYMBOL TABLE
\r
454 ADDM W,JOBUSY(X) ;ADJUST POINTERS
\r
456 SKIPN JOBDDT(X) ;IS DDT THERE?
\r
459 HRRM Q,JOBFF(X) ;RESTET JOBFF IF DDT IS IN
\r
462 MOVE W,[SIXBIT ?LOADER?] ;FINAL MESSAGE
\r
463 PUSHJ P,BLTSET ;SETUP FOR FINAL BLT
\r
464 RELEASE 2, ;RELEASE AUX. DEV.
\r
465 IFN RPGSW,<RELEASE 17,0 ;RELEASE COMMAND DEVICE>
\r
466 LD5E5: MOVE W,[BLT Q,(A)] ;BLT OF ALL CODE
\r
467 MOVEM W,JOBBLT ;STASH IN JOB DATA AREA
\r
468 MOVEM W,JOBBLT(X) ;STASH IN RELOCATED JOBDATA AREA
\r
469 LD5E2: MOVE W,CALLEX ;EXIT AFTER BLT
\r
470 TLZN N,EXEQSW ;IMMEDIATE EXECUTION REQUESTED?
\r
471 JRST LD5E3 ;NOPE, LET USER TYPE START HIMSELF
\r
472 HRRZ W,JOBSA(X) ;PICKUP USUAL STARTING ADDRESS
\r
473 TLNE N,DDSW ;DDT EXECUTION?
\r
474 HRRZ W,JOBDDT(X) ;USE DDT SA INSTEAD
\r
475 JUMPE W,LD5E2 ;IF SA=0, DON'T EXECUTE
\r
476 HRLI W,(JRST) ;INSTRUCTION TO EXECUTE
\r
478 IFE LDAC,<MOVEM W,JOBBLT+1(X) ;STASH FOR EXECUTION>
\r
479 IFN LDAC,<MOVEM W,JOBBLT+2(X) ;STASH FOR EXECUTION
\r
480 HRLZ 17,JOBFF(X) ;BUT FIRST BLT ACS
\r
481 MOVE W,[BLT 17,17] ;...
\r
482 MOVEM W,JOBBLT+1(X) ;...>
\r
483 JRST JOBBLT ;IF IT WERE DONE, 'TWERE BEST DONE QUICKLY
\r
487 ;SEARCH LIBRARY, PRINT UNDEFS, SETUP JOBSA,JOBFF,JOBSYM,JOBUSY
\r
489 SASYM: TLNN F,NSW ;SKIP IF NO SEARCH FLAG ON
\r
490 PUSHJ P,LIBF ;SEARCH LIBRARY FILE
\r
491 PUSHJ P,FSCN ;FORCE SCAN TO COMPLETION
\r
492 PUSHJ P,PMS ;PRINT UNDEFINEDS
\r
493 HRRZM F,JOBSA(X) ;RH OF JOBSA :=STARTING ADDRESS
\r
494 SAS1: HRRZ A,H ;COMPUTE PROG BREAK
\r
496 CAIGE A,(R) ;BUT NO HIGHER THAN RELOC
\r
498 HRLM A,JOBSA(X) ;LH OR JOBSA IS PROG BREAK
\r
499 HRRZM A,JOBFF(X) ;RH OF JOBFF CONTAINS PROG BREAK
\r
500 MOVE A,B ;SET JOBSYM W/ SYMBOL TABLE POINTER
\r
502 MOVEM A,JOBSYM(X) ;...
\r
503 MOVE A,S ;SET JOBUSY W/ UNDEFINED SYMBOL POINTER
\r
505 MOVEM A,JOBUSY(X) ;...
\r
507 ;PRINT FINAL MESSAGE, SET UP BLT AC'S, SETDDT, RELEAS
\r
509 BLTSET: PUSHJ P,FCRLF ;START FINAL MESSAGE
\r
510 PUSHJ P,PWORD ;PRINT W
\r
512 HRRZ Q,JOBREL ;PUBLISH HOW MUCH CORE USED
\r
515 PUSHJ P,RCNUM ;PUBLISH THE NUMBER
\r
516 MOVE W,[SIXBIT /K CORE/] ;PUBLISH THE UNITS
\r
519 MOVSI Q,20(X) ;HOW MUCH CODE TO BLT
\r
521 HRRZ A,42 ;CHECK ON ERRORS
\r
522 JUMPE A,NOEX ;NONE, GO AHEAD
\r
523 TLZN N,EXEQSW ;DID HE WANT TO START EXECUTION?
\r
525 JSP A ,ERRPT ;PRINT AN ERROR MESSAGE
\r
526 SIXBIT /EXECUTION DELETED@/
\r
527 NOEX: HRRZ A,JOBREL ;WHEN TO STOP BLT
\r
528 HRRZM A,JOBREL(X) ;SETUP FOR POSSIBLE IMMED. XEQ
\r
530 IFE BLTSYM,<CAIL A,(S) ;DON'T BLT OVER SYMBOL TABLE
\r
531 MOVEI A,(S) ;OR UNDEFINED TABLE>
\r
532 RELEAS 1, ;RELEASE DEVICES
\r
534 MOVE R,JOBDDT(X) ;SET NEW DDT
\r
535 CALLI R,CSETDDT ;...
\r
541 CHNC: SKIPA A,JOBCHN(X) ;CHAIN FROM BREAK OF FIRST BLOCK DATA
\r
542 CHNR: HLR A,JOBCHN(X) ;CHAIN FROM BREAK OF FIRST F4 PROG
\r
543 HRRZS A ;ONLY RIGHT HALF IS SIGNIFICANT
\r
544 JUMPE A,LD7C ;DON'T CHAIN IF ZERO
\r
545 TLNN N,AUXSWI ;IS THERE AN AUX DEV?
\r
546 JRST LD7D ;NO, DON'T CHAIN
\r
547 PUSH P,A ;SAVE WHEREFROM TO CHAIN
\r
548 SKIPE D ;STARTING ADDR SPECIFIED?
\r
550 PUSHJ P,SASYM ;DO LIB SEARCH, SETUP JOBSA, ETC.
\r
551 POP P,A ;GET WHEREFROM
\r
552 MOVN W,JOBREL ;CALCULATE IOWD FOR DUMP
\r
553 ADDI W,-1-3-CHN5(A) ;...
\r
554 HRLI W,-4-CHN5(A) ;...
\r
555 MOVSM W,IOWDPP ;...
\r
556 ADDI A,-4-CHN5(X) ;ADD IN OFFSET
\r
557 IFN CHN5,<PUSH A,JOBSYM(X) ;SETUP FOUR WORD TABLE
\r
558 PUSH A,JOB41(X) ;...>
\r
559 PUSH A,JOBDDT(X) ;JOBDDT IN ALL CASES
\r
560 IFE CHN5,<PUSH A,JOBSYM(X) ;JOBDDT, JOBSYM, JOBSA>
\r
561 PUSH A,JOBSA(X) ;JOBRYM ALWAYS LAST
\r
562 CLOSE 2, ;INSURE END OF MAP FILE
\r
563 SETSTS 2,17 ;SET AUX DEV TO DUMP MODE
\r
564 MOVSI W,435056 ;USE .CHN AS EXTENSION
\r
565 MOVEM W,DTOUT1 ;...
\r
566 PUSHJ P,IAD2 ;DO THE ENTER
\r
567 TLZ N,AUXSWI+AUXSWE ;INSURE NO PRINTED OUTPUT
\r
568 MOVE W,[SIXBIT ?CHAIN?] ;FINAL MESSAGE
\r
569 PUSHJ P,BLTSET ;SETUP BLT PNTR, SETDDT, RELEAS
\r
570 CALLI CDDTGT ;START DDT MODE OUTPUT
\r
571 MOVSI CHNBLT,CHAIN3 ;BLT CHAIN3 INTO ACS
\r
572 BLT CHNBLT,CHNBLT ;...
\r
573 MOVEI P,CHNERR ;POINTER TO ERR MESS
\r
574 JRST 0 ;GO DO CHAIN
\r
577 ;THE AC SECTION OF CHAIN
\r
581 BLT Q,(A) ;USUAL LDRBLT
\r
582 OUTPUT 2,IOWDP ;WRITE THE CHAIN FILE
\r
583 STATZ 2,IOBAD!IODEND ;CHECK FOR ERROR OR EOF
\r
584 JRST LOSEBIG ;FOUND SAME, GO GRIPE
\r
585 CLOSE 2, ;FINISH OUTPUT
\r
586 STATZ 2,IOBAD!IODEND ;CHECK FOR FINAL ERROR
\r
587 LOSEBI: CALLI CDDTOUT ;GRIPE ABOUT ERROR
\r
589 CHNERR: ASCIZ ?DEVICE ERROR? ;ERROR MESSAGE
\r
590 IOWDP: Z ;STORE IOWD FOR DUMP HERE
\r
591 CHNBLT: ;LAST WORD OF AC CHAIN (ZERO OF I/O POINTER)
\r
593 IOWDPP=.-1 ;MEMORY LOC OF AC IOWDP
\r
594 Z ;TERMINATOR OF DUMP MODE LIST
\r
599 XPAND: PUSH P,H ;GET SOME REGISTERS TO USE
\r
602 HRRZ X,JOBREL ;WHAT WE WANT
\r
604 CALLI X,11 ;CORE ALLOCATOR CALLS THIS
\r
606 IFE K,< HRRZ H,MLTP ;GET LOWEST LOCATION
\r
607 TLNN N,F4SW ;IS FORTRAN LOADING>
\r
608 HRRZ H,S ;NO, USE S
\r
609 HRRZ X,JOBREL ;NOW MOVE
\r
613 CAMLE X,H ;TEST FOR END
\r
614 SOJA X,XPAND2; HAND EYE SYSTEM MOVES TABLE
\r
616 SETZM (H) ;ZERO NEW CORE
\r
624 IFE K,< TLNN N,F4SW ;F4?
\r
637 XPAND6: JUMPE X,XPAND4
\r
639 SIXBIT /CORE AVAILABLE, BUT NOT TO YOU#/
\r
640 XPAND4: JSP A,ERRPT
\r
641 SIXBIT /MORE CORE NEEDED#/
\r
647 XPAND7: PUSHJ P,XPAND
\r
651 POPJM3: SOS (P) ;POPJ TO CALL-2
\r
652 POPJM2: SOS (P) ;POPJ TO CALL-1
\r
653 SOS (P) ;SAME AS POPJ TO
\r
654 POPJ P, ;NORMAL POPJ MINUS TWO
\r
660 LD6A: CAIN T,57 ;WAS CHAR A SLASH?
\r
661 TLO N,SLASH ;REMEBER THAT
\r
662 TLO F,SSW ;ENTER SWITCH MODE
\r
663 LD6A1: MOVEI D,0 ;ZERO THE NUBER REGISTER
\r
664 JRST LD3 ;EAT A SWITCH
\r
666 ;ALPHABETIC CHARACTER, SWITCH MODE
\r
668 LD6: XCT LD6B-101(T) ;EXECUTE SWITCH FUNCTION
\r
669 TLZE N,SLASH ;SWITCH MODE ENTERED W/ SLASH?
\r
670 JRST LD6D ;LEAVE SWITCH MODE
\r
671 JRST LD6A1 ;STAY IN SWITCH MODE
\r
673 ;DISPATCH TABLE FOR SWITCHES
\r
675 ; THE INSTRUCTION AT THE CHARACTER LOCATION IS EXECUTED
\r
677 LD6B: TLO N,ALLFLG ;A - LIST ALL GLOBALS
\r
678 JRST LD7B ;B - ERROR
\r
679 PUSHJ P,CHNC ;C - CHAIN, START W/ COMMON
\r
680 PUSHJ P,LDDT ;D - DEBUG OPTION, LOAD DDT
\r
681 TLO N,EXEQSW ;E - LOAD AND GO
\r
682 PUSHJ P,LIBF ;F - LIBRARY SEARCH
\r
683 PUSHJ P,LD5E ;G - GO INTO EXECUTION
\r
684 PUSHJ P,LRAIDX ;H - LOAD AN START RAID
\r
685 TLO N,ISAFLG ;I - IGNORE STARTING ADDRESSES
\r
686 TLZ N,ISAFLG ;J - USE STARTING ADDRESSES
\r
687 IFE BLTSYM,<JRST LD7B ;K - ERROR>
\r
688 IFN BLTSYM,<PUSHJ P,KORADJ ;K - RESERVE SPACE FOR SYM DEFS>
\r
689 TLO F,LIBSW+SKIPSW ;L - ENTER LIBRARY SEARCH
\r
690 PUSHJ P,PRMAP ;M - PRINT STORAGE MAP
\r
691 TLZ F,LIBSW+SKIPSW ;N - LEAVE LIBRARY SEARCH
\r
692 HRR R,D ;O - NEW PROGRAM ORIGIN
\r
693 TLO F,NSW ;P - PREVENT AUTO. LIB. SEARCH
\r
694 TLZ F,NSW ;Q - ALLOW AUTO. LIB. SEARCH
\r
695 PUSHJ P,CHNR ;R - CHAIN, START W/ RESIDENT
\r
696 TLO F,SYMSW ;S - LOAD WITH SYMBOLS
\r
697 PUSHJ P,LDDTX ;T - LOAD AND GO TO DDT
\r
698 PUSHJ P,PMS ;U - PRINT UNDEFINED LIST
\r
699 PUSHJ P,LRAID ;V - LOAD RAID
\r
700 TLZ F,SYMSW+DSYMSW ;W - LOAD WITHOUT SYMBOLS
\r
701 TLZ N,ALLFLG ;X - DO NOT LIST ALL GLOBALS
\r
702 TLO F,REWSW ;Y - REWIND BEFORE USE
\r
703 JRST LD ;Z - RESTART LOADER
\r
706 ;SWITCH MODE NUMERIC ARGUMENT
\r
708 LD6C: LSH D,3 ;BUILD OCTAL NUMERIC ARGUMENT
\r
712 ;EXIT FROM SWITCH MODE
\r
714 LD6D: TLZ F,SSW ;CLEAR SWITCH MODE FLAG
\r
715 TLNE F,FSW ;TEST FORCED SCAN FLAG
\r
716 JRST LD2D ;SCAN FORCED, START NEW IDENT.
\r
717 JRST LD3 ;SCAN NOT FORCED, USE PREV IDENT
\r
718 ;ILLEGAL CHARACTER, NORMAL MODE
\r
724 ;SYNTAX ERROR, NORMAL MODE
\r
730 ;ILLEGAL CHARACTER, SWITCH MODE
\r
736 ;ATTEMPT TO CHAIN WITH SPECIFIED HALF OF JOBCHN = 0
\r
738 LD7C: JSP A,ERRPT ;GRIPE
\r
739 SIXBIT ?UNCHAINABLE AS LOADED@?
\r
742 ;ATTEMP TO CHAIN WITHOUT SPECIFYING DEVICE
\r
744 LD7D: JSP A,ERRPT ;GRIPE
\r
745 SIXBIT ?NO CHAIN DEVICE@?
\r
748 IFN BLTSYM,<KORADJ: CAMLE D,KORSP ;IF SMALLER IGNORE
\r
752 ;CHARACTER CLASSIFICATION TABLE DESCRIPTION:
\r
754 ; EACH CHARACTER HAS ASSOCIATED WITH IT A FOUR BIT BYTE
\r
755 ; PACKED IN THE CHARACTER CLASSIFICATION TABLE. THE CHARACTER
\r
756 ; CLASSIFICATION CODES ARE ORDERED IN SUCH A WAY AS TO GIVE
\r
757 ; DELIMITERS OF HIGHER PRECEDENCE LOWER CLASSIFICATION NUMBERS.
\r
758 ; CERTAIN CHARACTERS HAVE NO EFFECT ON THE COMMAND STRING, AND
\r
759 ; THEREFORE DO NOT EFFECT ORDERING OF DELIMITERS. FOUR CODES
\r
760 ; ARE RESERVED FOR ALTERNATE DISPATCHES WHILE THE SWITCH MODE IS
\r
764 ;CLASSIFICATION BYTE CODES:
\r
766 ; BYTE DISP CLASSIFICATION
\r
768 ; 00 - 00 ILLEGAL CHARACTER, SWITCH MODE
\r
769 ; 01 - 01 ALPHABETIC CHARACTER, SWITCH MODE
\r
770 ; 02 - 02 NUMERIC CHARACTER, SWITCH MODE
\r
771 ; 03 - 03 SWITCH MODE ESCAPE, SWITCH MODE
\r
773 ; 00 - 04 ILLEGAL CHARACTER, NORMAL MODE
\r
774 ; 01 - 05 ALPHABETIC CHARACTER, NORMAL MODE
\r
775 ; 02 - 06 NUMERIC CHARACTER, NORMAL MODE
\r
776 ; 03 - 07 SWITCH MODE ESCAPE, NORMAL MODE
\r
778 ; 04 - 10 IGNORED CHARACTER
\r
779 ; 05 - 11 ENTER SWITCH MODE CHARACTER
\r
780 ; 06 - 12 DEVICE IDENTIFIER DELIMITER
\r
781 ; 07 - 13 FILE EXTENSION DELIMITER
\r
782 ; 10 - 14 OUTPUT SPECIFICATION DELIMITER
\r
783 ; 11 - 15 INPUT SPECIFICATION DELIMITER
\r
784 ; 12 - 16 LINE TERMINATION
\r
785 ; 13 - 17 JOB TERMINATION
\r
788 ;BYTE POINTERS TO CHARACTER CLASSIFICATION TABLE
\r
790 LD8: POINT 4,LD9(Q),3
\r
800 ;CHARACTER CLASSIFIACTION TABLE
\r
802 LD9: BYTE (4)4,0,0,0,0,0,0,0,0
\r
803 BYTE (4)4,4,4,4,12,0,0,0,0
\r
804 BYTE (4)0,0,0,0,0,0,0,0,0
\r
805 BYTE (4)13,0,0,0,0,4,0,4,0
\r
806 BYTE (4)0,0,0,0,5,3,0,0,11
\r
807 BYTE (4)0,7,5,2,2,2,2,2,2
\r
808 BYTE (4)2,2,2,2,6,0,0,10,0
\r
809 IFE RPGSW,< BYTE (4)0,0,1,1,1,1,1,1,1>
\r
810 IFN RPGSW,< BYTE (4) 0,10,1,1,1,1,1,1,1>
\r
811 BYTE (4)1,1,1,1,1,1,1,1,1
\r
812 BYTE (4)1,1,1,1,1,1,1,1,1
\r
813 IFE PP,<BYTE (4)1,0,0,0,0,10,0,0,0>
\r
814 IFN PP,<BYTE (4)1,10,0,10,0,10,0,0,0>
\r
815 BYTE (4)0,0,0,0,0,0,0,0,0
\r
816 BYTE (4)0,0,0,0,0,0,0,0,0
\r
817 BYTE (4)0,0,0,0,0,0,0,0,13
\r
821 ;INITIALIZE LOADING OF A FILE
\r
823 ILD: MOVEI W,BUF1 ;LOAD BUFFER ORIGIN
\r
825 TLOE F,ISW ;SKIP IF INIT REQUIRED
\r
826 JRST ILD6 ;DONT DO INIT
\r
828 ILD1: 0 ;LOADER INPUT DEVICE
\r
830 JSP A,ILD5 ;ERROR RETURN
\r
831 ILD6: TLZE F,REWSW ;SKIP IF NO REWIND
\r
833 ILD2: LOOKUP 1,DTIN ;LOOK UP FILE FROM DIRECTORY
\r
834 JRST ILD3 ;FILE NOT IN DIRECTORY
\r
835 IFE K,< INBUF 1,2 ;SET UP BUFFERS>
\r
836 IFN K,< INBUF 1,1 ;SET UP BUFFER>
\r
837 TLO F,ASW ;SET LEFT ARROW ILLEGAL FLAG
\r
838 TLZ F,ESW+F4LIB ;CLEAR EXTENSION FLAG
\r
843 ILD3: TLOE F,ESW ;SKIP IF .REL WAS ASSUMED
\r
844 JRST ILD4 ;FATAL LOOKUP FAILURE
\r
845 SETZM DTIN1 ;ZERO FILE EXTENSION
\r
846 JRST ILD2 ;TRY AGAIN WITH NULL EXTENSION
\r
848 ILD4: TLZE F,F4LIB ;WAS THIS A TRY FOR F40 LIBRARY?
\r
849 JRST [MOVE W,[SIXBIT /LIB4/]; YES, TRY LIB4
\r
851 PUSHJ P,LDDT2 ;USE .REL EXTENSION
\r
853 JRST ILD2 ];GO TRY AGAIN
\r
855 SIXBIT /CANNOT FIND#/
\r
858 ; DEVICE SELECTION ERROR
\r
860 ILD5: MOVE W,-3(A) ;LOAD DEVICE NAME FROM INIT
\r
861 TLO F,FCONSW ;INSURE TTY OUTPUT
\r
862 PUSHJ P,PRQ ;START W/ ?
\r
863 PUSHJ P,PWORD ;PRINT DEVICE NAME
\r
865 SIXBIT /UNAVAILABLE@/
\r
868 ;LIBRARY SEARCH CONTROL AND LOADER CONTROL
\r
870 ;LIBF ENABLES A LIBRARY SEARCH OF <SYS:LIB4.REL>
\r
872 LIBF: PUSHJ P,FSCN1 ;FORCE SCAN TO COMPLETION
\r
873 PUSHJ P,LIBF1 ;LOAD SYS:JOBDAT.REL
\r
874 TLO F,F4LIB ;INDICATE FORTRAN LIBRARY SEARCH
\r
875 MOVE W,[SIXBIT /LIB40/] ;FIRST TRY AT NAME
\r
876 PUSHJ P,LIBF2 ;LOAD SYS:LIB40.REL
\r
877 LIBF1: MOVE W,[SIXBIT /JOBDAT/] ;LOAD SYS:JOBDAT.REL
\r
878 LIBF2: PUSHJ P,LDDT1
\r
879 JUMPGE S,EOF2 ;JUMP IF NO UNDEFINED GLOBALS
\r
880 TLO F,SLIBSW+SKIPSW ;ENABLE LIBRARY SEARCH
\r
881 TLZ F,SYMSW+DSYMSW ;DISABLE LOADING WITH SYMBOLS
\r
882 JRST LDF ;INITIALIZE LOADING LIB4
\r
884 ; LIB CONTROLS THE LIBRARY SEARCH OF ONE FILE
\r
886 LIB: JUMPGE S,EOF1 ;JUMP IF NO UNDEFINED GLOBALS
\r
887 TLO F,SKIPSW ;SET SKIPSW TO IGNORE MODE
\r
888 JRST LOAD ;CONTINUE LIB. SEARCH
\r
890 LIB1: CAIE A,4 ;TEST FOR ENTRY BLOCK
\r
891 JRST LIB3 ;NOT AN ENTRY BLOCK, IGNORE IT
\r
892 LIB2: PUSHJ P,RWORD ;READ ONE DATA WORD
\r
894 TLO C,040000 ;SET CODE BITS FOR SEARCH
\r
896 TLZA F,SKIPSW ;REQUEST MATCHES ENTRY, LOAD
\r
897 JRST LIB2 ;NOT FOUND
\r
898 LIB3: PUSHJ P,RWORD ;READ AND IGNORE ONE DATA WORD
\r
899 JRST LIB3 ;LOOP TO IGNORE INPUT
\r
901 ;LDDT LOADS <SYS:DDT.REL> AND SETS DSYMSW
\r
903 LRAIDX: TLO N,DDSW!EXEQSW ;H - LOAD AND START RAID
\r
904 LRAID: PUSHJ P,FSCN1 ;FORCE END OF SCAN
\r
905 MOVE W,[SIXBIT /RAID/]
\r
907 LDDTX: TLO N,DDSW+EXEQSW ;T - LOAD AND GO TO DDT
\r
908 LDDT: PUSHJ P,FSCN1 ;FORCE SCAN TO COMPLETION
\r
909 MOVSI W,444464 ;FILE IDENTIFIER <DDT>
\r
910 LDDT0: PUSHJ P,LDDT1
\r
911 PUSHJ P,LDF ;LOAD <SYS:DDT.REL>
\r
912 TLO F,DSYMSW ;ENABLE LOADING WITH SYMBOLS
\r
915 LDDT1: MOVEM W,DTIN ;STORE FILE IDENTIFIER
\r
916 IFN PP,<MOVE W,ILD1 ;SAVE OLD DEV
\r
918 MOVSI W,637163 ;DEVICE IDENTIFIER <SYS>
\r
919 MOVEM W,ILD1 ;STORE DEVICE IDENTIFIER
\r
920 TLZ F,ISW+LIBSW+SKIPSW+REWSW ;CLEAR OLD FLAGS
\r
921 LDDT2: MOVSI W,624554 ;EXTENSION IDENTIFIER <.REL>
\r
922 LDDT3: MOVEM W,DTIN1 ;STORE EXTENSION IDENTIFIER
\r
923 IFN PP,<MOVE W,PPN ;GET PROJ-PROG #
\r
926 \f;EOF TERMINATES LOADING OF A FILE
\r
928 EOF: MOVE P,PDSAV ;RESTORE PUSHDOWN POINTER
\r
929 EOF1: TLZ F,SLIBSW+SKIPSW ;CLEAR ONE FILE LIB. SEARCH FLAG
\r
932 ; FORCE SCAN TO COMPLETION, LOAD IF NECESSARY
\r
934 FSCN: PUSHJ P,FSCN1 ;FORCED LOAD BEFORE TEST
\r
935 TLNN F,FULLSW ;TEST FOR OVERLAP
\r
936 POPJ P, ;NO OVERLAP, RETURN
\r
937 MOVE W,H ;FETCH CORE SIZE REQUIRED
\r
938 SUBI W,1(S) ; COMPUT DEFICIENCY
\r
939 JUMPL W,EOF2 ;JUMP IF NO OVERLAP
\r
940 TLO F,FCONSW ;INSURE TTY OUTPUT
\r
941 PUSHJ P,PRQ ;START WITH ?
\r
942 PUSHJ P,PRNUM0 ;INFORM USER
\r
944 SIXBIT /WORDS OF OVERLAP#/
\r
945 JRST LD2 ;ERROR RETURN
\r
947 FSCN1: TLON F,FSW ;SKIP IF NOT FIRST CALL TO FSCN
\r
948 TLNN F,CSW+DSW+ESW ;TEST SCAN FOR COMPLETION
\r
950 FSCN2: PUSHJ P,LD5B1 ;STORE FILE OR EXTENSION IDENT.
\r
952 ; LOADER CONTROL, NORMAL MODE
\r
954 LDF: PUSHJ P,ILD ;INITIALIZE LOADING
\r
958 LOAD: MOVEM P,PDSAV ;SAVE PUSHDOWN POINTER
\r
959 LOAD1: MOVE P,PDSAV ;RESTORE PUSHDOWN POINTER
\r
960 LOAD1A: PUSHJ P,WORD ;INPUT BLOCK HEADER WORD
\r
961 MOVNI E,400000(W) ;WORD COUNT - FROM RH OF HEADER
\r
962 HLRZ A,W ;BLOCK TYPE - FROM LH OF HEADER
\r
963 CAILE A,DISPL*2+1 ;TEST BLOCK TYPE NUMBER
\r
964 JRST LOAD4 ;ERROR, ILLEGAL BLOCK TYPE
\r
965 TLNE F,SKIPSW ;BLOCK OK - TEST LOAD STATUS
\r
966 JRST LIB1 ;RETURN TO LIB. SEARCH CONTROL
\r
967 HRRZ T,LOAD2(A) ;LOAD RH DISPATCH ENTRY
\r
968 CAILE A,DISPL ;SKIP IF CORRECT
\r
969 HLRZ T,LOAD2-DISPL-1(A) ;LOAD LH DISPATCH ENTRY
\r
970 TLNE F,FULLSW ;TEST CORE OVERLAP INDICATOR
\r
971 SOJG A,HIGH0 ;IGNORE BLOCK IF NOT TYPE 1
\r
972 JRST @T ;DISPATCH TO BLOCK SUBROUTINE
\r
974 ;DISPATCH TABLE - BLOCK TYPES
\r
976 LOAD2: XWD NAME,LOAD1A
\r
981 LOAD3: XWD LOAD4A,HIGH
\r
985 ;ERROR EXIT FOR BAD HEADER WORDS
\r
988 CAIN A,400 ;FORTRAN FOUR BLOCK
\r
990 LOAD4A: JSP A,ERRPT ;INCORRECT HEADER WORD
\r
991 SIXBIT /ILL. FORMAT#/
\r
994 \f;LOAD PROGRAMS AND DATA (BLOCK TYPE 1)
\r
996 PROG: HRRZ V,W ;LOAD BLOCK LENGTH
\r
997 PUSHJ P,RWORD ;READ BLOCK ORIGIN
\r
998 ADD V,W ;COMPUTE NEW PROG. BREAK
\r
999 CAIG H,@X ;COMPARE WITH PREV. PROG. BREAK
\r
1000 MOVEI H,@X ;UPDATE PROGRAM BREAK
\r
1002 JRST FULLC ;NO ERROR MESSAGE
\r
1003 CAILE H,1(S) ; SKIP IF SUFFICIENT CORE AVAILABLE
\r
1004 IFN EXPAND,< JRST [PUSHJ P,XPAND>
\r
1006 IFN EXPAND,< JRST .-1]>
\r
1008 PROG1: PUSHJ P,RWORD ;READ DATA WORD
\r
1009 MOVEM W,@X ;STORE DATA WORD IN PROG. AT LLC
\r
1010 AOJA V,PROG1 ;ADD ONE TO LOADER LOC. COUNTER
\r
1012 ;LOAD SYMBOLS (BLOCK TYPE 2)
\r
1014 SYM: PUSHJ P,PRWORD ;READ TWO DATA WORDS
\r
1015 PUSHJ P,SYMPT; PUT INTO TABLE
\r
1018 ; WFW SYMPT: JUMPL C,SYM3; JUMP IF GLOBAL REQUEST
\r
1019 SYMPT: TLNE C,200000 ;GLOBAL REQUEST? WFW
\r
1020 JUMPL C,SYM3 ;CHECK FOR 60 NOT JUST HIGH BIT WFW
\r
1022 JRST SYM1A ;LOCAL SYMBOL
\r
1023 PUSHJ P,SREQ ;GLOBAL DEF., SEARCH FOR REQUEST
\r
1024 JRST SYM2 ;REQUEST MATCHES
\r
1025 PUSHJ P,SDEF ;SEARCH FOR MULTIPLE DEFINITIONS
\r
1026 JRST SYM1 ;MULTIPLY DEFINED GLOBAL
\r
1029 ; PROCESS MULTIPLY DEFINED GLOBAL
\r
1031 SYM1: CAMN W,2(A) ;COMPARE NEW AND OLD VALUE
\r
1033 AOS MDG ;COUNT MULTIPLY DEFINED GLOBALS
\r
1034 PUSHJ P,PRQ ;START W/ ?
\r
1035 PUSHJ P,PRNAM ;PRINT SYMBOL AND VALUE
\r
1036 MOVE W,2(A) ;LOAD OLD VALUE
\r
1037 PUSHJ P,PRNUM ;PRINT OLD VALUE
\r
1038 JSP A,ERRPT7 ;PRINT MESSAGE
\r
1039 SIXBIT /MUL. DEF. GLOBAL#/
\r
1040 POPJ P,; IGNORE MUL. DEF. GLOBAL SYM
\r
1044 SYM1A: TLNN F,SYMSW+DSYMSW ;SKIP IF LOAD LOCALS SWITCH ON
\r
1045 POPJ P,; IGNORE LOCAL SYMBOLS
\r
1046 SYM1B: CAIL H,(S) ;STORE DEFINED SYMBOL
\r
1047 IFN EXPAND,< PUSHJ P,XPAND7>
\r
1048 IFE EXPAND,< JRST SFULLC>
\r
1050 TLNE N,F4SW; FORTRAN FOUR REQUIRES A BLT
\r
1051 PUSHJ P,MVDWN; OF THE TABLES>
\r
1052 MOVEI A,-2(S) ;LOAD A TO SAVE INST. AT SYM2
\r
1053 SYM1D: SUBI S,2; UPDATE UNDEFINED POINTER
\r
1054 POP B,2(A) ;MOVE UNDEFINED VALUE POINTER
\r
1055 POP B,1(A) ;MOVE UNDEFINED SYMBOL
\r
1056 MOVEM W,2(B) ;STORE VALUE
\r
1057 MOVEM C,1(B) ;STORE SYMBOL
\r
1060 \f; GLOBAL DEFINITION MATCHES REQUEST
\r
1062 SYM2: PUSH P,SYM2C ;NEXT MUST BE A SUBROUTINE FOR LATER. SET RETURN
\r
1063 SYM2B: MOVE V,2(A) ;LOAD REQUEST POINTER
\r
1065 JUMPL V,SYM2W ;ADDITIVE REQUEST? WFW
\r
1066 PUSHJ P,SYM4A ;REPLACE CHAIN WITH DEFINITION
\r
1067 ;WFW PATCH TO LOOK FOR MORE THAN ONE REQUEST
\r
1068 SYM2W1: PUSHJ P,SREQ ;LOOK FOR MORE REQUESTS FOR THIS SYMBOL
\r
1069 JRST SYM2B ;FOUND MORE
\r
1070 MOVE A,SVA ;RESTORE A
\r
1072 SYM2C: POPJ P,SYM1D ;RETURN, SEE SYM2 FOR USE OF ADDRESS
\r
1073 SVA: 0 ;A TEMP CELL WFW
\r
1075 ; REQUEST MATCHES GLOBAL DEFINITION
\r
1077 SYM2A: MOVE V,W ;LOAD POINTER TO CHAIN
\r
1078 MOVE W,2(A) ;LOAD VALUE
\r
1079 JUMPL V,FIXWP ;HANDLE ATTITIVE REQUEST WFW
\r
1080 JRST SYM4A; REPLACE CHAIN WITH DEFINITION
\r
1082 ; PROCESS GLOBAL REQUEST
\r
1084 SYM3: TLNE C,040000; COMMON NAME
\r
1086 TLC C,640000; PERMUTE BITS FROM 60 TO 04
\r
1087 PUSHJ P,SDEF ;SEARCH FOR GLOBAL DEFINITION
\r
1088 JRST SYM2A ;MATCHING GLOBAL DEFINITION
\r
1089 JUMPL W,SYM3X1 ;ADDITIVE FIXUP WFW
\r
1090 PUSHJ P,SREQ ;SEARCH FOR EXISTING REQUEST WFW
\r
1091 JRST SYM3A ;EXISTING REQUEST FOUND WFW
\r
1092 SYM3X1: TLNN W,100000 ;CHECK SYMBOL TABLE FIXUP
\r
1094 MOVE V,1(B) ;MUST BE LAST SYMBOL DEFINED. GET SYMBOL
\r
1095 XOR V,W ;CHECK FOR IDENTITY
\r
1096 TDNE V,[XWD 77777,-1] ;BUT IGNORE HIGH 3 BITS
\r
1097 POPJ P, ;NOT SAME, ASSUME NOT LOADED LOCAL
\r
1098 HRRI W,2(B) ;GET LOCATION IN RIGHT HALF
\r
1100 SUB W,JOBREL ;AND MAKE RELATIVE
\r
1101 SYM3X2: CAIL H,(S) ;STORE REQUEST IN UNDEF. TABLE WFW
\r
1102 IFN EXPAND,< PUSHJ P,XPAND7>
\r
1103 IFE EXPAND,< JRST SFULLC>
\r
1105 TLNE N,F4SW; FORTRAN FOUR
\r
1106 PUSHJ P,MVDWN; ADJUST TABLES IF F4>
\r
1107 SUB S,SE3 ;ADVANCE UNDEFINED POINTER
\r
1108 MOVEM W,2(S) ;STORE UNDEFINED VALUE POINTER
\r
1109 MOVEM C,1(S) ;STORE UNDEFINED SYMBOL
\r
1113 ; COMBINE TWO REQUEST CHAINS
\r
1115 SYM3A: SKIPL 2(A) ;IS IT ADDITIVE WFW
\r
1116 JRST SYM3A1 ;NO, PROCESS WFW
\r
1117 PUSHJ P,SDEF2 ;YES, CONTINUE WFW
\r
1118 JRST SYM3A ;FOUND ANOTHER WFW
\r
1119 JRST SYM3X2 ;REALLY NO CHAIN THERE WFW
\r
1120 SYM3A1: SUBI A,-2(X) ;A=A-(-2+X(18-35)); A RELATIVE TO X WFW
\r
1121 SYM3B: HRRZ V,A ; SAVE CHAIN ADDRESS FOR HRRM W,@X
\r
1122 HRRZ A,@X ; LOAD NEXT ADDRESS IN CHAIN
\r
1123 JUMPN A,SYM3B ; JUMP IF NOT THE LAST ADDR. IN CHAIN
\r
1124 HRRM W,@X ;COMBINE CHAINS
\r
1127 ;WFW PATCH FOR ADDITIVE GLOBAL REQUESTS
\r
1129 FIXWP: TLNN V,100000 ;CHECK FOR SYMBOL TABLE FIXUP
\r
1131 MOVE T,1(B) ;SYMBOL FIXUP, MUST BE LAST SYMBOL DEFINED
\r
1132 XOR T,V ;CHECK FOR SAME
\r
1133 TDNE T,[XWD 77777,-1] ;EXCEPT FOR HEGH CODE BITS
\r
1134 POPJ P, ;ASSUME NON-LOADED LOCAL
\r
1135 HRRI V,2(B) ;GET LOCATION
\r
1136 SUBI V,(X) ;SO WE CAN USE @X
\r
1137 FIXW: TLNE V,200000 ;IS IT LEFT HALF
\r
1139 MOVE T,@X ;GET WORD
\r
1140 ADD T,W ;VALUE OF GLOBAL
\r
1141 HRRM T,@X ;FIX WITHOUT CARRY
\r
1142 MOVSI D,200000 ;SET UP TO REMOVE DEFERED INTERNAL IF THERE
\r
1144 FIXWL: HRLZ T,W ;UPDATE VALUE OF LEFT HALF
\r
1145 ADDM T,@X ;BY VALUE OF GLOBAL
\r
1146 MOVSI D,400000 ;LEFT DEFERED INTERNAL
\r
1147 SYMFIX: TLNN V,100000 ;CHECK FOR SYMBOL TABLE FIXUP
\r
1148 POPJ P, ;NO, RETURN
\r
1149 ADDI V,(X) ;GET THE LOCATION
\r
1150 MOVE T,-1(V) ;GET THE SYMBOL NAME
\r
1151 TLNN T,40000 ;CHECK TO SEE IF INTERNAL
\r
1152 POPJ P, ;NO, LEAVE
\r
1153 ANDCAB D,-1(V) ;REMOVE PROPER BIT
\r
1154 TLNE D,600000 ;IS IT STILL DEFERED?
\r
1155 POPJ P, ;YES, ALL DONE
\r
1156 EXCH C,D ;NO, CHECK FOR A REQUEST FOR IT
\r
1158 JRST CHNSYM ;YES, WILL HAVE TO CALL THE FIXUP ROUTINE
\r
1159 MOVE C,D ;GET C BACK
\r
1161 CHNSYM: PUSH P,D ;HAS THE OLD C IN IT
\r
1162 PUSH P,W ;WE MAY NEED IT LATER
\r
1163 MOVE W,(V) ;GET VALUE
\r
1164 PUSHJ P,SYM2B ;CALL THE FOUND GLOBAL TO MATCH REQUEST ROUTINE
\r
1166 POP P,C ;RESTORE FOR CALLER
\r
1167 POPJ P, ;AND GO AWAY
\r
1169 SYM2W: TLNN V,100000 ;SYMBOL TABLE?
\r
1171 ADD V,JOBREL ;MAKE ABSOLUTE
\r
1172 SUBI V,(X) ;GET READY TO ADD X
\r
1173 SYM2WA: PUSHJ P,FIXW ;DO FIXUP
\r
1174 JRST SYM2W1 ;AND LOOK FOR MORE REQUESTS
\r
1178 \f;PATCH VALUES INTO CHAINED REQUEST
\r
1180 HRRZ T,@X ;LOAD NEXT ADDRESS IN CHAIN
\r
1181 HRRM W,@X ;INSERT VALUE INTO PROGRAM
\r
1183 SYM4A: JUMPN V,SYM4 ;JUMP IF NOT LAST ADDR. IN CHAIN
\r
1187 MVDWN: HRRZ T,MLTP
\r
1188 IFN EXPAND,< SUBI T,2>
\r
1189 CAIG T,@X; ANY ROOM LEFT?
\r
1190 IFN EXPAND,< JRST [PUSHJ P,XPAND>
\r
1192 IFN EXPAND,< JRST MVDWN
\r
1194 TLNE F,SKIPSW+FULLSW
\r
1195 JRST MVABRT; ABORT BLT
\r
1197 ADDM T,PLTP; ADJUST PROGRAMMER LABEL POINTER
\r
1198 ADDM T,BITP; AND BIT TABLE POINTER
\r
1199 ADDM T,SDSTP; FIRST DATA STATEMENT
\r
1204 ADDB T,MLTP; AND FINALLY TO MADE LABEL TABLE
\r
1205 HRLS T; SET UP BLT POINTER
\r
1210 ;HIGHEST RELOCATABLE POINT (BLOCK TYPE 4)
\r
1211 SFULLC: TLOE F,FULLSW ;PREVIOUS OVERFLOW?
\r
1212 JRST FULLC ;YES, DON'T PRINT MESSAGE
\r
1213 JSP A,ERRPT ;NO, COMPLAIN ABT OVERFLO
\r
1214 SIXBIT ?SYMBOL TABLE OVERLAP#?
\r
1215 FULLC: TLO F,FULLSW ;CORE OVERLAP ERROR RETURN
\r
1216 IFE K,< TLNE N,F4SW
\r
1218 JRST LIB3 ;LOOK FOR MORE
\r
1220 HIGH0: CAIE A,4 ; TEST FOR END BLOCK (OVERLAP)
\r
1222 HIGH: PUSHJ P,PRWORD ;READ TWO DATA WORDS
\r
1223 HRR R,C ;SET NEW PROGRAM BREAK
\r
1224 ADDI C,X; BE SURE TO RELOCATE
\r
1225 CAILE C,1(S) ;TEST PROGRAM BREAK
\r
1226 IFN EXPAND,<PUSHJ P,[ PUSHJ P,XPAND
\r
1230 IFE EXPAND,<TLO F,FULLSW>
\r
1231 HIGH3: MOVEI A,F.C ;SAVE CURRENT STATE OF LOADER
\r
1233 TLNE F,SLIBSW+LIBSW ;NORMAL MODE EXIT THROUGH LOAD1
\r
1234 JRST LIB ;LIBRARY SEARCH EXIT
\r
1237 \f;STARTING ADDRESS (BLOCK TYPE 7)
\r
1239 START: PUSHJ P,PRWORD ;READ TWO DATA WORDS
\r
1240 TLNN N,ISAFLG ;SKIP IF IGNORE SA FLAG ON
\r
1241 HRR F,C ;SET STARTING ADDRESS
\r
1243 ;PROGRAM NAME (BLOCK TYPE 6)
\r
1245 NAME: PUSHJ P,PRWORD ;READ TWO DATA WORDS
\r
1246 TLOE N,COMFLG ;SKIP IF COMMON NOT PREV. SET
\r
1247 JRST NAME1 ;SIZE OF COMMON PREV. SET
\r
1248 MOVEM W,COMSAV ;STORE LENGTH OF COMMON
\r
1249 JUMPE W,NAME2 ;JUMP IF NO COMMON IN THIS JOB
\r
1250 HRRI R,@R ;FIRST PROGRAM SET LOAD ORIGIN
\r
1251 NAME1: CAILE H,-1(S) ;TEST FOR AVAIL. SYMBOL SPACE
\r
1252 IFN EXPAND,< PUSHJ P,XPAND7>
\r
1253 IFE EXPAND,< JRST SFULLC>
\r
1254 SUBI S,2 ;UPDATE UNDEF. TABLE POINTER
\r
1257 HRRZ V,N ;POINTER TO PREVIOUS NAME
\r
1258 SUBM B,V ;COMPUTE RELATIVE POSITIONS
\r
1259 HRLM V,2(N) ;STORE FORWARD POINTER
\r
1260 HRR N,B ;UPDATE NAME POINTER
\r
1261 NAME2: MOVEM C,1(B) ;STORE PROGRAM NAME
\r
1262 HRRZM R,2(B) ;STORE PROGRAM ORIGIN
\r
1263 CAMG W,COMSAV ;CHECK COMMON SIZE
\r
1264 JRST LIB3 ;COMMON OK
\r
1266 SIXBIT /ILL. COMMON#/
\r
1269 ;ONE PASS LOCAL DEFINITION (BLOCK TYPE 10)
\r
1271 ;PMP PATCH FOR LEFT HALF FIXUPS
\r
1273 LOCD: PUSHJ P,RWORD ;READ ONE DATA WORD
\r
1274 HLRZ V,W ;STORAGE POINTER IN LEFT HALF
\r
1275 PUSHJ P,SYM4A ;LINK BACK REFERENCES
\r
1278 REMSYM: MOVE T,1(S)
\r
1286 \f;SYMBOL TABLE SEARCH SUBROUTINES
\r
1288 ; ENTERED WITH SYMBOL IN C
\r
1289 ; RETURN IS WITH POINTER IN A IF MATCHING SYMBOL FOUND
\r
1290 ; OTHERWISE, A SKIP ON RETURN OCCURS
\r
1292 SREQ: JUMPGE S,CPOPJ1 ;JUMP IF NO UNDEF. SYMBOLS
\r
1293 SKIPA A,S ;LOAD REQUEST SEARCH POINTER
\r
1294 SDEF: MOVE A,B ;LOAD DEF. SYMBOL SEARCH POINTER
\r
1295 SDEF1: CAMN C,1(A)
\r
1296 POPJ P, ;SYMBOLS MATCH, RETURN
\r
1299 IFE K,< JRST CPOPJ1 ;SYMBOL NOT FOUND SKIPS ON RETURN>
\r
1301 CPOPJ1: AOS (P) ;TRA 2,4
\r
1304 ;RELOCATION AND BLOCK INPUT
\r
1306 PRWORD: PUSHJ P,RWORD ;READ A WORD PAIR
\r
1307 MOVE C,W ;LOAD C WITH FIRST DATA WORD
\r
1308 TRNE E,377777 ;TEST FOR END OF BLOCK
\r
1309 JRST RWORD1 ;INPUT SECOND WORD OF PAIR
\r
1310 MOVEI W,0 ;NO SECOND WORD, ASSUME ZERO
\r
1313 RWORD: TRNN E,377777 ;TEST FOR END OF BLOCK
\r
1314 JRST LOAD1 ;RETURN TO LOAD THE NEXT BLOCK
\r
1315 RWORD1: AOBJN E,RWORD2 ;JUMP IF DATA WORD NEXT
\r
1316 PUSHJ P,WORD ;READ CONTROL WORD
\r
1317 MOVE Q,W ;DON'T COUNT RELOCATION WORDS
\r
1318 HRLI E,-22 ;SET RELOCATION WORD BYTE COUNT
\r
1319 RWORD2: PUSHJ P,WORD ;READ INPUT WORD
\r
1320 JUMPGE Q,RWORD3 ;TEST LH RELOCATION BIT
\r
1322 ADD W,T ;LH RELOCATION
\r
1323 RWORD3: TLNE Q,200000 ;TEST RH RELOCATION BIT
\r
1324 HRRI W,@R ;RH RELOCATION
\r
1328 \f;PRINT STORAGE MAP SUBROUTINE
\r
1330 PRMAP: PUSHJ P,FSCN1 ;LOAD OTHER FILES FIRST
\r
1331 PUSHJ P,CRLFLF ;START NEW PAGE
\r
1335 SIXBIT ?IS THE PROGRAM BREAK@?
\r
1336 PUSHJ P,CRLF ;START STORAGE MAP
\r
1337 JSP A,ERRPT0 ;PRINT HEADER
\r
1338 SIXBIT ?STORAGE MAP@?
\r
1343 SKIPL C,1(A) ;LOAD SYMBOL, SKIP IF DELETED
\r
1344 TLNE C,300000 ;TEST FOR LOCAL SYMBOL
\r
1345 JRST PRMAP4 ;IGNORE LOCAL SYMBOLS
\r
1347 PUSHJ P,CRLF ;PROGRAM NAME
\r
1348 PUSHJ P,PRNAM1 ;PRINT SYMBOL AND VALUE
\r
1350 JRST PRMAP3 ;GLOBAL SYMBOL
\r
1351 HLRE C,W ;POINTER TO NEXT PROG. NAME
\r
1352 JUMPGE C,PRMAP2 ;JUMP IF LAST PROGRAM NAME
\r
1353 ADDI C,2(A) ;COMPUTE LOC. OF FOLLOWING NAME
\r
1354 SKIPA T,@C ;LOAD ORIGIN OF FOLLOWING PROG.
\r
1355 PRMAP2: HRRZ T,R ;LOAD PROGRAM BREAK
\r
1356 SUBM T,W ;SUBTRACT ORIGIN TO GET LENGTH
\r
1357 PUSHJ P,PRNUM ;PRINT PROGRAM LENGTH
\r
1359 TLNN N,ALLFLG ;SKIP IF LIST ALL MODE IS ON
\r
1360 TRNE W,777777 ;SKIP IF ZERO LENGTH PROGRAM
\r
1362 JUMPE C,PRMAP5 ;JUMP IF LAST PROGRAM
\r
1363 SKIPA A,C ;SKIP GLOBALS, ZERO LENGTH PROG.
\r
1364 PRMAP3: PUSHJ P,CRLF
\r
1365 PRMAP4: CAILE A,(B) ;TEST FOR END OF SYMBOL TABLE
\r
1369 \f;LIST UNDEFINED GLOBALS
\r
1371 PMS: PUSHJ P,FSCN1 ;LOAD FILES FIRST
\r
1372 JUMPGE S,PMS3 ;JUMP IF NO UNDEFINED GLOBALS
\r
1373 HLLOS 42 ;SET SOME ERROR TO ABORT EXECUTION
\r
1374 PUSHJ P,FCRLF ;START THE MESSAGE
\r
1375 PUSHJ P,PRQ ;PRINT ?
\r
1376 HLRE W,S ;COMPUTE NO. OF UNDEF. GLOBALS
\r
1378 LSH W,-1 ;<LENGTH OF LIST>/2
\r
1381 SIXBIT /UNDEFINED GLOBALS@/
\r
1382 MOVE A,S ;LOAD UNDEF. POINTER
\r
1383 PMS2: PUSHJ P,CRLF
\r
1384 PUSHJ P,PRQ ;PRINT ?
\r
1385 PUSHJ P,PRNAM0 ;PRINT SYMBOL AND POINTER
\r
1388 PUSHJ P,CRLF ;SPACE AFTER LISTING
\r
1390 ;LIST NUMBER OF MULTIPLY DEFINED GLOBALS
\r
1392 PMS3: SKIPN W,MDG ;ANY MULTIPLY DEFINED GLOBALS
\r
1393 JRST PMS4 ;NO, EXCELSIOR
\r
1394 HLLOS 42 ;ANOTHER WAY TO LOSE
\r
1395 PUSHJ P,FCRLF ;ROOM AT THE TOP
\r
1396 PUSHJ P,PRQ ;PRINT ?
\r
1397 PUSHJ P,PRNUM0 ;NUMBER OF MULTIPLES
\r
1398 JSP A,ERRPT7 ;REST OF MESSAGE
\r
1399 SIXBIT ?MULTIPLY DEFINED GLOBALS@?
\r
1400 PMS4: TLNE N,AUXSWE ;AUXILIARY OUTPUT DEVICE?
\r
1401 OUTPUT 2, ;INSURE A COMPLETE BUFFER
\r
1404 \f;ENTER FILE ON AUXILIARY OUTPUT DEVICE
\r
1406 IAD2: ENTER 2,DTOUT ;WRITE FILE NAME IN DIRECTORY
\r
1407 JRST IMD3 ;NO MORE DIRECTORY SPACE
\r
1410 IMD3: JSP A,ERRPT ;DIRECTORY FULL ERROR
\r
1411 SIXBIT /DIR. FULL@/
\r
1414 ;PRINT THE 6 DIGIT OCTAL ADDRESS IN W
\r
1416 ; ACCUMULATORS USED: D,T,V
\r
1418 PRNAM0: MOVE C,1(A) ;LOAD SYMBOL
\r
1419 PRNAM1: MOVE W,2(A) ;LOAD VALUE
\r
1420 PRNAM: PUSHJ P,PRNAME
\r
1421 PRNUM: PUSHJ P,SPACES
\r
1422 PRNUM0: MOVE V,PRNUM2 ;LOAD BYTE POINTER TO RH. OF W
\r
1423 MOVNI D,6 ;LOAD CHAR. COUNT
\r
1424 PRNUM1: ILDB T,V ;LOAD DIGIT TO BE OUTPUT
\r
1425 ADDI T,60 ;CONVERT FROM BINARY TO ASCII
\r
1427 AOJL D,PRNUM1 ;JUMP IF MORE DIGITS REMAIN
\r
1430 PRNUM2: XWD 220300,W
\r
1432 ;YE OLDE RECURSIVE NUMBER PRINTER
\r
1433 ;PRINTS Q, WITH LEADING ZEROES SUPPRESSED; USES A AND T
\r
1435 RCNUM: IDIVI Q,12 ;RADIX DECIMAL
\r
1443 \f;PRINT FOUR SPACES
\r
1445 SPACES: PUSHJ P,SP1
\r
1446 SP1: PUSHJ P,SPACE
\r
1450 ;SYMBOL PRINT - RADIX 50
\r
1452 ; ACCUMULATORS USED: D,T
\r
1454 PRNAME: MOVE T,C ;LOAD SYMBOL
\r
1455 TLZ T,740000 ;ZERO CODE BITS
\r
1456 MOVNI D,6 ;LOAD CHAR. COUNT
\r
1457 SPT: IDIVI T,50 ;THE REMAINDER IS THE NEXT CHAR.
\r
1458 HRLM V,(P) ;STORE IN LH. OF PUSHDOWN LIST
\r
1459 AOSGE D ;SKIP IF NO CHARS. REMAIN
\r
1460 PUSHJ P,SPT ;RECURSIVE CALL FOR NEXT CHAR.
\r
1461 HLRZ T,(P) ;LOAD FROM LH. OF PUSHDOWN LIST
\r
1462 JUMPE T,TYPE ;BLANK
\r
1471 ;PRINT A WORD OF SIXBIT CHARACTERS IN AC W
\r
1473 ; ACCUMULATORS USED: Q,T,D
\r
1475 PWORD: MOVNI Q,6 ;SET CHARACTER COUNT TO SIX
\r
1476 PWORD1: MOVE D,LSTPT ;ENTER HERE WITH Q PRESET
\r
1477 PWORD2: ILDB T,D ;LOAD NEXT CHAR. TO BE OUTPUT
\r
1478 PUSHJ P,TYPE ;OUTPUT CHARACTER
\r
1482 \f;ERROR MESSAGE PRINT SUBROUTINE
\r
1487 ; SIXBIT /<MESSAGE>/
\r
1489 ; ACCUMULATORS USED: T,V,C,W
\r
1491 ERRPT: TLO F,FCONSW ;INSURE TTY OUTPUT
\r
1492 PUSHJ P,CRLF ;ROOM AT THE TOP
\r
1493 PUSHJ P,PRQ ;START OFF WITH ?
\r
1494 ERRPT0: PUSH P,Q ;SAVE Q
\r
1496 ERRPT1: PUSHJ P,TYPE
\r
1512 ERRPT3: MOVE W,ERRPT6
\r
1520 ERRPT4: PUSHJ P,CRLF
\r
1522 TLZ F,FCONSW ;ONE ERROR PER CONSOLE
\r
1523 AOS V ;PROGRAM BUMMERS BEWARE:
\r
1524 JRST @V ;V HAS AN INDEX OF A
\r
1526 ERRPT5: POINT 6,0(A)
\r
1527 ERRPT6: SIXBIT / FILE /
\r
1529 \fERRPT8: TLO F,FCONSW ;INSURE TTY OUTPUT
\r
1530 PUSHJ P,PRQ ;START WITH ?
\r
1531 CAIGE T,140 ;IS IT A NON-PRINTING CHAR?
\r
1535 MOVEI T,136 ;UP ARROW
\r
1538 ADDI T,100 ;CONVERT TO PRINTING CHAR.
\r
1539 ERRP8: PUSHJ P,TYPE2
\r
1540 ERRPT7: PUSHJ P,SPACE
\r
1543 ERRPT9: MOVEI V,@V
\r
1546 SIXBIT ?ILLEGAL -LOADER@?
\r
1550 ;PRINT QUESTION MARK
\r
1552 PRQ: PUSH P,T ;SAVE
\r
1553 MOVEI T,"?" ;PRINT ?
\r
1554 PUSHJ P,TYPE2 ;...
\r
1558 \f;INPUT - OUTPUT INTERFACE
\r
1560 ;BINARY INPUT SUBROUTINE - RETURNS A WORD IN W
\r
1562 WORDPR: PUSHJ P,WORD ;GET FIRST WORD OF PAIR
\r
1563 MOVE C,W ;KEEP IT HANDY>
\r
1564 WORD: SOSG BUFR2 ;SKIP IF BUFFER NOT EMPTY
\r
1566 WORD1: ILDB W,BUFR1 ;PICK UP 36 BIT WORD
\r
1569 WORD2: INPUT 1, ;GET NEXT BUFFER LOAD
\r
1570 STATUS 1,W ;GET DEVICE STATUS FROM MONITOR
\r
1571 TRNE W,IODEND ;TEST FOR EOF
\r
1572 JRST EOF ;END OF FILE EXIT
\r
1573 TRNN W,IOBAD ;TEST FOR DATA ERROR
\r
1574 JRST WORD1 ;DATA OK - CONTINUE LOADING
\r
1575 JSP A,ERRPT ;DATA ERROR - PRINT MESSAGE
\r
1576 SIXBIT /INPUT ERROR#/
\r
1577 JRST LD2 ;GO TO ERROR RETURN
\r
1578 ;TYPEOUT SUBROUTINE - THE CHARACTER SUPPLIED IN T IS CONVERTED TO ASCII
\r
1579 ;AND IS OUTPUT ON THE CONSOLE AND/OR THE SPECIFIED LOADER MAP OUTPUT
\r
1582 CRLFLF: PUSHJ P,CRLF
\r
1583 FCRLF: TLO F,FCONSW ;INSURE TTY OUTPUT
\r
1584 CRLF: MOVEI T,15 ;CARRIAGE RETURN LINE FEED
\r
1586 MOVEI T,12-40 ;LINE FEED IN PSEUDO SIXBIT
\r
1587 TYPE: MOVEI T,40(T) ;CONVERT SIXBIT TO ASCII
\r
1588 TYPE2: TLNN N,AUXSWI ;IS THER AN AUXILIARY DEVICE?
\r
1589 JRST TYPE3 ;NO, DONT OUTPUT TO IT
\r
1590 TLON N,AUXSWE ;IS AUX. DEV. ENTERED?
\r
1591 PUSHJ P,IAD2 ;NOPE, DO SO!
\r
1592 SOSG ABUF2 ;SPACE LEFT IN BUFFER?
\r
1593 OUTPUT 2, ;CREATE A NEW BUFFER
\r
1594 IDPB T,ABUF1 ;DEPOSIT CHARACTER
\r
1595 TLNN F,FCONSW ;FORCE OUTPUT TO CONSOLE TOO?
\r
1597 TYPE3: SKIPN BUFO2 ;END OF BUFFER
\r
1598 OUTPUT 3, ;FORCE OUTPUT NOW
\r
1599 IDPB T,BUFO1 ;DEPOSIT CHARACTER
\r
1600 CAIN T,12 ;END OF LINE
\r
1601 OUTPUT 3, ;FORCE AN OUTPUT
\r
1604 \fSE3: XWD 2,2 ;SYMBOL POINTER INCREMENT
\r
1605 LSTPT: POINT 6,W ;CHARACTER POINTER TO W
\r
1606 PDLPT: XWD -41,PDLST-1; INITIAL PUSHDOWN POINTER
\r
1607 COMM: SQUOZE 0,.COMM.
\r
1608 PDSAV: 0 ;SAVED PUSHDOWN POINTER
\r
1609 COMSAV: 0 ;LENGTH OF COMMON
\r
1610 MDG: 0 ;COUNTER FOR MUL DEF GLOBALS
\r
1620 F.I: 0 ;INITIAL F - FLAGS
\r
1622 XWD V,LDEND ;INITIAL X - LOAD PROGRAM AFTER LOADER
\r
1623 EXP LDEND+JOBPRO ;INITIAL H - INITIAL PROG BREAK
\r
1625 XWD W,JOBPRO ;INITIAL R - INITIAL RELOC
\r
1627 \f;BUFFER HEADERS AND HEADER HEADERS
\r
1629 BUFO: 0 ;CONSOLE INPUT HEADER HEADER
\r
1633 BUFI: 0 ;CONSOLE OUTPUT HEADER HEADER
\r
1637 ABUF: 0 ;AUXILIARY OUTPUT HEADER HEADER
\r
1641 BUFR: 0 ;BINARY INPUT HEADER HEADER
\r
1645 DTIN: 0 ;DECTAPE INPUT BLOCK
\r
1650 DTOUT: 0 ;DECTAPE OUTPUT BLOCK
\r
1655 TTYL=52 ;TWO TTY BUFFERS
\r
1656 IFE K,< BUFL=406 ;TWO DTA BUFFERS FOR LOAD>
\r
1657 IFN K,< BUFL=203 ;ONE DTA BUFFER FOR LOAD>
\r
1658 ABUFL=203 ;ONE DTA BUFFER FOR AUX DEV
\r
1659 TTY1: BLOCK TTYL ;TTY BUFFER AREA
\r
1660 BUF1: BLOCK BUFL ;LOAD BUFFER AREA
\r
1661 AUX: BLOCK ABUFL ;AUX BUFFER AREA
\r
1662 ZEROS: REPEAT 4,<0>
\r
1664 IFN RPGSW,<CTLIN: BLOCK 3
\r
1666 CTLBUF: BLOCK 203+1
\r
1674 IOBAD=IODERR+IODTER+IOBKTL+IOIMPM
\r
1676 INTERN PWORD,DTIN,DTOUT,LDEND
\r
1677 INTERN WORD,LD,BEG,PDLST,LOAD
\r
1678 INTERN CRLF,TYPE,PMS,PRMAP
\r
1679 INTERN F,P,X,H,S,R,B,N,T,V,W,C,E,Q,A,D
\r
1681 EXTERN JOBDDT,JOBFF,JOBSA,JOBREL,JOBSYM,JOBUSY,JOB41
\r
1683 ;END HERE IF 1K LOADER REQUESTED.
\r
1689 \f;HERE BEGINS FORTRAN FOUR LOADER
\r
1692 HRRZ V,R; SET PROG BREAK INTO V
\r
1693 MOVEM V,LLC; SAVE FIRST WORD ADDRESS
\r
1694 MOVEI W,-2(S); GENERATE TABLES
\r
1696 HRRZM W,MLTP; MADE LABELS
\r
1697 HRRZM W,PLTP; PROGRAMMER LABELS
\r
1698 ADD W,[POINT 1,1]; GENERATE BIT-BYTE POINTER
\r
1700 MOVEM W,SDSTP; FIRST DATA STATEMENT
\r
1702 MOVE W,[JRST ALLOVE] ;LAST DATA STATEMENT
\r
1704 HRREI W,-^D36; BITS PER WORDUM
\r
1705 MOVEM W,BITC; BIT COUNT
\r
1706 PUSHJ P,BITWX+1 ;MAKE SURE OF ENOUGH SPACE
\r
1708 TEXTR: PUSHJ P,WORD; TEXT BY DEFAULT
\r
1711 JRST HEADER; HEADER
\r
1712 MOVEI C,1; RELOCATABLE
\r
1713 PUSHJ P,BITW; SHOVE AND STORE
\r
1714 JRST TEXTR; LOOP FOR NEXT WORD
\r
1716 ABS: SOSG BLKSIZ; MORE TO GET
\r
1718 ABSI: PUSHJ P,WORD;
\r
1719 MOVEI C,0; NON-RELOCATABLE
\r
1720 PUSHJ P,BITW; TYPE 0
\r
1723 \f;PROCESS TABLE ENTRIES
\r
1725 MDLB: TLNE F,FULLSW+SKIPSW; MADE LABEL PROC
\r
1726 JRST GLOBDF; NO ROOM AT THE IN
\r
1727 HLRZ C,MLTP; GET PRESENT SIZE
\r
1728 CAMGE C,BLKSIZ; IF NEW SIZE BIGGER, STR-R-RETCH
\r
1730 HRRZ C,MLTP; GET BASE
\r
1731 MLPLC: ADD C,BLKSIZ; MAKE INDEX
\r
1732 TLNN F,FULLSW+SKIPSW; DONT LOAD
\r
1733 HRRZM V,(C); PUT AWAY DEFINITION
\r
1734 GLOBDF: PUSHJ P,WORD
\r
1735 TLNE F,FULLSW+SKIPSW ;SKIPPING THIS PROG?
\r
1736 JRST TEXTR ;YES, DON'T DEFINE
\r
1737 MOVEI C,(V); AND LOC
\r
1739 PUSHJ P,SYMXX; PUT IN DDT-SYMBOL TABLE
\r
1743 PLB: TLNE F,FULLSW+SKIPSW
\r
1745 HLRZ C,PLTP; PRESENT SIZE
\r
1751 \f;STORE WORD AND SET BIT TABLE
\r
1753 BITW: TLNE F,FULLSW+SKIPSW; WE DONT LOAD THIS
\r
1755 MOVEM W,@X; STORE AWAY OFFSET
\r
1756 IDPB C,BITP; STORE BIT
\r
1757 AOSGE BITC; STEP BIT COUNT
\r
1758 JRST BITWX; SOME MORE ROOM LEFT
\r
1759 HRREI C,-^D36; RESET COUNT
\r
1762 SOS BITP; ALL UPDATED
\r
1763 IFE EXPAND,<HRL C,MLTP
\r
1766 IFN EXPAND,<HRRZ C,MLTP; TO ADDRESS
\r
1769 PUSHJ P,[PUSHJ P,XPAND
\r
1775 HRRZ T,SDSTP; GET DATA POINTER
\r
1776 BLT C,-1(T); MOVE DOWN LISTS
\r
1777 BITWX: AOS V; STEP LOADER LOCATION
\r
1779 CAIG T,@X; OVERFLOW CHECK
\r
1780 IFE EXPAND,<TLO F,FULLSW>
\r
1781 IFN EXPAND,<PUSHJ P, [PUSHJ P,XPAND
\r
1787 SMLT: SUB C,BLKSIZ; STRETCH
\r
1788 MOVS W,MLTP ;LEFT HALF HAS OLD BASE
\r
1789 ADD C,MLTP ;RIGHT HALF HAS NEW BASE
\r
1790 IFN EXPAND,< HRRZS C ;GET RID OF COUNT
\r
1792 PUSHJ P,[PUSHJ P,XPAND
\r
1794 ADD W,[XWD 2000,0]
\r
1797 HRRM C,MLTP ;PUT IN NEW MLTP
\r
1798 HLL C,W ;FORM BLT POINTER
\r
1799 ADDI W,(C) ;LAST ENTRY OF MLTP
\r
1800 HRL W,BLKSIZ ;NEW SIZE OF MLTP
\r
1802 SLTC: BLT C,0(W); MOVE DOWN (UP?)
\r
1805 SPLT: SUB C,BLKSIZ
\r
1809 IFN EXPAND,< HRRZS C
\r
1811 PUSHJ P,[PUSHJ P,XPAND
\r
1813 ADD W,[XWD 2000,0]
\r
1816 HRRM C,MLTP ;PUT IN NEW MLTP
\r
1818 HLRZ W,PLTP ;OLD SIZE OF PL TABLE
\r
1819 ADD W,PLTP ;NEW BASE OF PL TABLE
\r
1820 HRL W,BLKSIZ ;NEW SIZE OF PL TABLE
\r
1821 HLLM W,PLTP ;INTO POINTER
\r
1827 \f;PROCESS END CODE WORD
\r
1829 ENDS: PUSHJ P,WORD; GET STARTING ADDRESS
\r
1831 JRST ENDS1 ;FOOBAZ!!!!!!!!
\r
1832 JUMPE W,ENDS1; NOT MAIN
\r
1833 ADDI W,(R); RELOCATION OFFSET
\r
1834 TLNN N,ISAFLG; IGNORE STARTING ADDRESS
\r
1836 ENDS1: PUSHJ P,WORDPR ;DATA STORE SIZE
\r
1837 HRRZM C,PTEMP ;NUMBER OF PERMANENT TEMPS
\r
1838 MOVEM V,CCON; START OF CONSTANTS AREA
\r
1840 MOVEM W,BLKSIZ ;SAVE COUNT
\r
1841 MOVEI W,0(V) ;DEFINE CONST.
\r
1843 TLNN F,SKIPSW!FULLSW
\r
1844 PUSHJ P,SYMPT ;...
\r
1845 PUSHJ P,GSWD ;STORE CONSTANT TABLE
\r
1846 E1: MOVEI W,0(V); GET LOADER LOC
\r
1847 EXCH W,PTEMP; STORE INTO PERM TEMP POINTER
\r
1848 ADD W,PTEMP; FORM TEMP TEMP ADDRESS
\r
1849 MOVEM W,TTEMP; POINTER
\r
1850 MOVEM V,GSTAB; STORE LOADER LOC IN GLOBSUB
\r
1851 MOVE C,TTR50 ;DEFINE %TEMP.
\r
1852 TLNE F,SKIPSW!FULLSW
\r
1854 PUSHJ P,SYMPT ;...
\r
1855 MOVE C,PTR50 ;DEFINE (IF EXTANT) TEMP.
\r
1857 CAME W,TTEMP ;ANY PERM TEMPS?
\r
1858 PUSHJ P,SYMPT ;YES, DEFINE
\r
1859 E1A: PUSHJ P,WORD; NUMBER OF GLOBSUBS
\r
1861 MOVEM W,BLKSIZ ;SIZE OF GLOBSUB
\r
1862 PUSHJ P,GSWD ;STORE GLOBSUB TABLE
\r
1863 E11: MOVEM V,STAB; SCALARS
\r
1864 PUSHJ P,WORD; HOW MANY?
\r
1866 PUSHJ P,GSWDPR ;STORE SCALAR TABLE
\r
1867 E21: MOVEM V,ATAB; ARRAY POINTER
\r
1868 PUSHJ P,WORD; COMMENTS FOR SCALARS APPLY
\r
1870 PUSHJ P,GSWDPR ;STORE ARRAY TABLE
\r
1871 E31: MOVEM V,AOTAB; ARRAYS OFFSET
\r
1872 PUSHJ P,WORD; SAME COMMENTS AS ABOVE
\r
1874 PUSHJ P,GSWDPR ;STORE ARRAY OFFSET TABLE
\r
1875 E41: PUSHJ P,WORD; TEMP, SCALAR, ARRAY SIZE
\r
1876 TLNE F,FULLSW!SKIPSW ;SKIPPING THIS PROG?
\r
1877 MOVEI W,0 ;DON'T ACCEPT GLOB SUBPROG REQUESTS
\r
1878 MOVEM V,CTAB; SETUP COMMON TABLE POINTER
\r
1879 ADD W,GSTAB; GLOBAL SUBPROG BASE
\r
1880 MOVEM W,COMBAS; START OF COMMON
\r
1881 PUSHJ P,WORD; COMMON BLOCK SIZE
\r
1883 JUMPE W,PASS2; NO COMMON
\r
1884 COMTOP: PUSHJ P,WORDPR ;GET A COMMON PAIR
\r
1885 PUSHJ P,SDEF; SEARCH
\r
1886 JRST COMYES; ALREADY THERE
\r
1888 HRR W,COMBAS; PICK UP THIS COMMON LOC
\r
1889 TLNN F,SKIPSW!FULLSW
\r
1890 PUSHJ P,SYMXX; DEFINE IT
\r
1891 MOVS W,W; SWAP HALFS
\r
1892 ADD W,COMBAS; UPDATE COMMON LOC
\r
1893 HRRM W,COMBAS; OLD BASE PLUS NEW SIZE
\r
1894 HLRZS W; RETURN ADDRESS
\r
1896 TLNN F,SKIPSW!FULLSW
\r
1898 COMCOM: PUSHJ P,CWSTWX ;STORE A WORD PAIR
\r
1904 COMYES: TLNE F,SKIPSW
\r
1905 JRST COMCOM ;NO ERRORS IF SKIPPING
\r
1906 HLRZ C,2(A); PICK UP DEFINITION
\r
1907 CAMLE W,C; CHECK SIZE
\r
1908 JRST ILC; ILLEGAL COMMON
\r
1914 PRSTWX: PUSHJ P,WORDPR ;GET A WORD PAIR
\r
1915 CWSTWX: EXCH C,W ;SPACE TO STORE FIRST WORD OF PAIR?
\r
1916 PUSHJ P,WSTWX ;...
\r
1917 EXCH C,W ;THERE WAS; IT'S STORED
\r
1918 WSTWX: TLNE F,FULLSW!SKIPSW ;SPACE FOR ANOTHER WORD?
\r
1919 POPJ P, ;NOPE, RETURN
\r
1920 MOVEM W,@X ;YES, STORE IT.
\r
1921 JRST BITWX ;TELL THE TABLES ABOUT IT; THEN RETURN
\r
1924 GSWD: PUSHJ P,WORD ;GET WORD FROM TABLE
\r
1925 PUSHJ P,WSTWX ;STASH IT
\r
1926 SOSE BLKSIZ ;FINISHED?
\r
1927 JRST GSWD ;NOPE, LOOP
\r
1930 GSWDPR: MOVEM W,BLKSIZ ;KEEP COUNT
\r
1931 GSWDP1: PUSHJ P,PRSTWX ;GET AND STASH A PAIR
\r
1932 SOS BLKSIZ ;FINISHED?
\r
1934 JRST GSWDP1 ;NOPE, LOOP
\r
1937 \f;BEGIN HERE PASS2 TEXT PROCESSING
\r
1940 MOVEM V,TOPTAB ;SAVE FOR OVERLAP CHECKING
\r
1941 TLNE F,FULLSW+SKIPSW; ABORT?
\r
1943 MOVE V,LLC ;PICK UP PROGRAM ORIGIN
\r
1944 CAML V,CCON ;IS THIS A PROGRAM?
\r
1945 JRST FBLKD ;NO, GO LOOK FOR FIRST BLK DATA
\r
1946 TLOE N,PGM1 ;YES, IS THIS FIRST F4 PROG?
\r
1948 HRR W,COMBAS ;YES, PLACE PROG BREAK IN LH
\r
1949 HRLM W,JOBCHN(X) ;FOR CHAIN
\r
1950 NOPRG: HRRZ W,PLTP; GET PROG TABLE BASE
\r
1951 HLRZ C,PLTP; AND SIZE
\r
1952 ADD W,C; COMPUTE END OF PROG TABLE
\r
1953 ADD W,[POINT 1,1]; AND BEGINNING OF BIT TABLE
\r
1954 EXCH W,BITP; SWAP POINTERS
\r
1955 PASS2B: ILDB C,BITP; GET A BIT
\r
1956 JUMPE C,PASS2C; NO PASS2 PROCESSING
\r
1957 PUSHJ P,PROC; PROCESS A TAG
\r
1958 JRST PASS2B; MORE TO COME
\r
1961 PROC: LDB C,[POINT 6,@X,23]; TAG
\r
1962 SETZM MODIF; ZERO TO ADDRESS MODIFIER
\r
1965 HRLM C,ENDTAB; ERROR SETUP
\r
1966 MOVEI W,TABDIS; HEAD OF TABLE
\r
1967 HLRZ T,(W); GET ENTRY
\r
1970 HRRZ W,(W); GET DISPATCH
\r
1971 LDB C,[POINT 12,@X,35]
\r
1972 JRST (W); DISPATCH
\r
1974 TABDIS: XWD 11,PCONS; CONSTANTS
\r
1975 XWD 06,PGS; GLOBAL SUBPROGRAMS
\r
1976 XWD 20,PST; SCALARS
\r
1977 XWD 22,PAT; ARRAYS
\r
1978 XWD 01,PATO; ARRAYS OFFSET
\r
1979 XWD 00,PPLT; PROGRAMMER LABELS
\r
1980 XWD 31,PMLT; MADE LABESL
\r
1981 XWD 26,PPT; PERMANENT TEMPORARYS
\r
1982 XWD 27,PTT; TEMPORARY TEMPORARYS
\r
1983 ENDTAB: XWD 00,LOAD4A; ERRORS
\r
1985 PASS2C: PUSHJ P,PASS2A
\r
1989 \f;DISPATCH ON A HEADER
\r
1991 HEADER: CAMN W,[EXP -2]; END OF PASS ONE
\r
1993 LDB C,[POINT 12,W,35]; GET SIZE
\r
1996 JUMPE W,PLB; PROGRAMMER LABEL
\r
1997 CAIN W,500000; ABSOLUTE BLOCK
\r
1999 CAIN W,310000; MADE LABEL
\r
2000 JRST MDLB; MADE LABEL
\r
2003 CAIN W,700000; DATA STATEMENT
\r
2005 JRST LOAD4A; DATA STATEMENTS WILL GO HERE
\r
2007 TOPTAB: 0 ;TOP OF TABLES
\r
2011 GSTAB: 0; GLOBAL SUBPROGS
\r
2012 AOTAB: 0; OFFSET ARRAYS
\r
2013 CCON: 0; CONSTANTS
\r
2014 PTEMP: 0; PERMANENT TEMPS
\r
2015 TTEMP: 0; TEMPORARY TEMPS
\r
2016 COMBAS: 0; BASE OF COMMON
\r
2017 LLC: 0; PROGRAM ORIGIN
\r
2018 BITP: 0; BIT POINTER
\r
2019 BITC: 0; BIT COUNT
\r
2020 PLTP: 0; PROGRAMMER LABEL TABLE
\r
2021 MLTP: 0; MADE LABEL TABLE
\r
2022 SDS: 0 ;START OF DATA STATEMENTS
\r
2023 SDSTP: 0 ;START OF DATA STATEMENTS POINTER
\r
2024 BLKSIZ: 0; BLOCK SIZE
\r
2025 MODIF: 0; ADDRESS MODIFICATION +1
\r
2026 TTR50: XWD 136253,114765 ;RADIX 50 %TEMP.
\r
2027 PTR50: XWD 100450,614765 ;RADIX 50 TEMP.
\r
2028 CNR50: XWD 112320,235025 ;RADIX 50 CONST.
\r
2030 \f;ROUTINES TO PROCESS POINTERS
\r
2032 PCONS: ADD C,CCON; GENERATE CONSTANT ADDRESS
\r
2033 SOJA C,PCOMX ;ADJUST FOR 1 AS FIRST ENTRY
\r
2035 PSTA: PUSHJ P,SWAPSY ;NON-COMMON SCALARS AND ARRAYS
\r
2036 ADDI C,(R); RELOCATE
\r
2037 PCOM1: PUSHJ P,SYDEF ;...
\r
2038 PCOMX: ADD C,MODIF ;ADDR RELOC FOR DP
\r
2039 HRRM C,@X; REPLACE ADDRESS
\r
2040 PASS2A: AOS V; STEP READOUT POINTER
\r
2041 CAML V,CCON ;END OF PROCESSABLES?
\r
2042 CPOPJ1: AOS (P); SKIP
\r
2045 PAT: SKIPA W,ATAB ;ARRAY TABLE BASE
\r
2046 PST: MOVE W,STAB ;SCALAR TABLE BASE
\r
2047 ROT C,1 ;SCALE BY 2
\r
2048 ADD C,W ;ADD IN TABLE BASE
\r
2049 ADDI C,-2(X); TABLE ENTRY
\r
2050 HLRZ W,(C); CHECK FOR COMMON
\r
2051 JUMPE W,PSTA; NO COMMON
\r
2052 PUSHJ P,COMDID ;PROCESS COMMON
\r
2055 COMDID: LSH W,1 ;PROCESS COMMON TABLE ENTRIES
\r
2056 ADD W,CTAB; COMMON TAG
\r
2057 ADDI W,-2(X); OFFSET
\r
2058 PUSHJ P,SWAPSY; GET SYMBOL AND SET TO DEFINED
\r
2059 ADD C,1(W); BASE OF COMMON
\r
2063 ADD C,AOTAB; ARRAY OFFSET
\r
2064 ADDI C,-2(X); LOADER OFFSET
\r
2065 MOVEM C,CT1; SAVE CURRENT POINTER
\r
2066 HRRZ C,1(C); PICK UP REFERENCE POINTER
\r
2067 ANDI C,7777; MASK TO ADDRESS
\r
2068 ROT C,1; ALWAYS A ARRAY
\r
2071 HLRZ W,(C); COMMON CHECK
\r
2073 PUSHJ P,COMDID ;PROCESS COMMON
\r
2080 \fNCO: PUSHJ P,SWAPSY;
\r
2081 ADDI C,(R) ;DEFINE SYMBOL IN TRUE LOC
\r
2082 PUSHJ P,SYDEF ;...
\r
2084 HRRZ C,(C) ;OFFSET ADDRESS PICKUP
\r
2085 ADDI C,(R) ;WHERE IT WILL BE
\r
2086 JRST PCOMX ;STASH ADDR AWAY
\r
2088 PTT: ADD C,TTEMP; TEMPORARY TEMPS
\r
2089 SOJA C,PCOMX ;ADJUST FOR 1 AS FIRST ENTRY
\r
2091 PPT: ADD C,PTEMP; PERMANENT TEMPS
\r
2092 SOJA C,PCOMX ;ADJUST FOR 1 AS FIRST ENTRY
\r
2094 PGS: ADD C,GSTAB; GLOBSUBS
\r
2095 ADDI C,-1(X); OFFSET
\r
2097 TLC C,640000; MAKE A REQUEST
\r
2098 PUSHJ P,TBLCHK ;CHECK FOR OVERLAP
\r
2099 MOVEI W,(V); THIS LOC
\r
2100 HLRM W,@X; ZERO RIGHT HALF
\r
2104 SYDEF: TLNE N,SYDAT ;SYMBOL WANTS DEFININITION?
\r
2105 POPJ P, ;NO, GO AWAY
\r
2106 PUSH P,C ;SAVE THE WORLD
\r
2108 PUSHJ P,TBLCHK ;CHECK FOR OVERLAP
\r
2110 SKIPE C,T ;PICKUP VALUE
\r
2127 SWAPSY: MOVEI T,0; SET TO EXCHANGE DEFS
\r
2128 EXCH T,1(C); GET NAME
\r
2129 HRRZ C,(C) ;GET VALUE
\r
2131 TBLCHK: HRRZ W,MLTP ;GETT TOP OV TABLES
\r
2133 CAMG W,TOPTAB ;WILL IT OVERLAP
\r
2134 IFE EXPAND,<TLO F,FULLSW>
\r
2135 IFN EXPAND,< JRST [PUSHJ P,XPAND
\r
2143 ALLOVE: TLZ N,F4SW ;END OF F4 PROG
\r
2144 TLNE F,FULLSW!SKIPSW
\r
2146 HRR R,COMBAS ;TOP OF THE DATA
\r
2147 HRR V,R ;IS THIS THE HIGHEST LOC YET?
\r
2149 MOVEI H,@X ;YES, TELL THE WORLD
\r
2150 CAMG H,SDS ;HIGHEST LOC GREATER THAN DATA STATEMENTS?
\r
2151 JRST HIGH3 ;NO, RETURN
\r
2152 ADDI H,1(S) ;YES, SET UP MEANINGFUL ERROR COMMENT
\r
2154 TLO F,FULLSW ;INDICATE OVERFLO
\r
2155 JRST HIGH3 ;RETURN
\r
2157 DATAS: TLNE F,FULLSW+SKIPSW
\r
2159 MOVEI C,(S) ;ADDR OF WORD UNDER SYMBOL TABLE
\r
2160 MOVN W,BLKSIZ ;HOW FAR DOWN TO BLT
\r
2161 ADDM W,PLTP ;UPDATE TABLE POINTERS
\r
2164 ADD C,W ;RH(C):= WHEN TO STOP BLT
\r
2165 HRL C,MLTP ;SOURCE OF BLTED DATA
\r
2166 ADD W,MLTP ;UPDATE, GET DESTINATION OF BLT DATA
\r
2167 IFN EXPAND,< HRRZS W ;GET RID OF LEFT HALF
\r
2169 PUSHJ P,[PUSHJ P,XPAND
\r
2172 ADD C,[XWD 2000,2000]
\r
2174 HRRM W,MLTP ;NO SET THIS SO EXTRA CORE NOT ZEROED
\r
2175 HLL W,C ;FORM BLT POINTER
\r
2176 BLT W,-1(C) ;MOVE TABLES DOWN (BUT NOT JRST ALLOVE)
\r
2178 DAX: PUSHJ P,WORD; READ ONE WORD
\r
2179 TLNN F,FULLSW+SKIPSW
\r
2181 SOSLE BLKSIZ ;COUNT OF DATA SEQUENCE SIZE
\r
2182 AOJA C,DAX ;INCREMENT DATA SEQUENCE DEPOSIT LOC
\r
2185 \fFBLKD: TLOE N,BLKD1 ;IS THIS FIRST BLOCK DATA?
\r
2187 HRR V,COMBAS ;PLACE PROG BREAK IN RH FOR
\r
2188 HRRM V,JOBCHN(X) ;CHAIN
\r
2189 ENDTP: TLNE F,FULLSW+SKIPSW
\r
2192 ENDTP0: CAML V,STAB; ANY MORE GLOBSUBS
\r
2194 MOVE C,@X; GET SUBPROG NAME
\r
2195 PUSHJ P,SREQ; IS IT ALLREADY REQUESTED
\r
2196 AOJA V,ENDTP0; YES
\r
2197 PUSHJ P,SDEF; OR DEFINED
\r
2198 AOJA V,ENDTP0; YES
\r
2200 MOVEI W,0 ;PREPARE DUMMY LINK
\r
2201 TLNN F,FULLSW+SKIPSW; ABORT
\r
2202 PUSHJ P,SYM3X; PUT IN DUMMY REQUEST
\r
2203 PUSHJ P,BITWX+1; OVERLAP CHECK
\r
2207 IFN EXPAND,< SUBI V,(X)
\r
2209 JRST [PUSHJ P,XPAND
\r
2214 HRRZM V,SDS ;DATA STATEMENT LOC
\r
2215 ENDTP1: SUBI V,(X); COMPENSATE FOR OFFSET
\r
2216 MOVE W,@X; GET WORD
\r
2217 TLNE W,-1; NO LEFT HALF IMPLIES COUNT
\r
2218 JRST DODON; DATA DONE
\r
2223 ADD W,@X; ITEMS COUNT
\r
2225 MOVE W,[MOVEM W,LTC]
\r
2226 MOVEM W,@X; SETUP FOR DATA EXECUTION
\r
2228 MOVE W,[MOVEI W,0]
\r
2230 MOVEM W,ENC; END COUNT
\r
2235 HLRZ T,W; LEFT HALF INST.
\r
2237 CAIN T,254000 ;JRST?
\r
2238 JRST WRAP ;END OF DATA
\r
2239 CAIN T,260000 ;PUSHJ?
\r
2240 JRST PJTABL(W) ;DISPATCH VIA TABLE
\r
2241 CAIN T,200000; MOVE?
\r
2243 CAIN T,270000; ADD?
\r
2245 CAIN T,221000; IMULI?
\r
2247 CAIE T,220000; IMUL?
\r
2249 INNER: HRRZ T,@X; GET ADDRESS
\r
2250 TRZE T,770000; ZERO TAG?
\r
2251 SOJA T,CONPOL; NO, CONSTANT POOL
\r
2252 SUB T,PT1; SUBTRACT INDUCTION NUMBER
\r
2254 SOS T; FORM INDUCTION POINTER
\r
2261 \fCONPOL: ADD T,ITC; CONSTANT BASE
\r
2268 SKIPIN: AOJA V,LOOP
\r
2270 PJTABL: JRST DWFS ;PUSHJ 17,0
\r
2271 AOSA PT1 ;INCREMENT DO COUNT
\r
2272 SOSA PT1; DECREMENT DO COUNT
\r
2273 SKIPA W,[EXP DOINT.]
\r
2276 AOJA V,SKIPIN ;SKIP A WORD
\r
2278 DWFS: MOVEI W,DWFS.
\r
2282 PUSHJ P,PROC; PROCESS THE TAG
\r
2283 JRST LOAD4A ;DATA STATEMENT BELOW CODE TOP
\r
2284 JRST LOOP ;PROPER RETURN
\r
2286 DOINT.: POP P,V; GET ADDRESS OF INITIAL VALUE
\r
2287 PUSH P,(V); STORE INDUCTION VARIABLE
\r
2289 PUSH P,V; INITIAL ADDRESS
\r
2292 DOEND.: HLRZ T,@(P)
\r
2293 ADDM T,-2(P); INCREMENT
\r
2294 HRRZ T,@(P); GET FINAL VALUE
\r
2295 CAMGE T,-2(P); END CHECK
\r
2296 JRST DODONE; WRAP IT UP
\r
2297 POP P,(P); BACK UP POINTER
\r
2300 \fDODONE: POP P,-1(P); BACK UP ADDRESS
\r
2302 JRST CPOPJ1 ;RETURN
\r
2304 WRAP: MOVE W,ENC; NUMBER OF CONSTANTS
\r
2305 ADD W,ITC; CONSTANT BASE
\r
2306 MOVEI C,(W); CHAIN
\r
2308 MOVEI V,(W); READY TO GO
\r
2311 DODON: TLZ N,RCF!SYDAT!DZER ;DATA STATEMENT FLAGS
\r
2312 MOVE W,PTEMP ;TOP OF PROG
\r
2313 ADDI W,(X) ;+OFFSET
\r
2314 MOVE C,COMBAS ;TOP OF DATA
\r
2315 ADDI C,(X) ;+OFFSET
\r
2316 SECZER: CAML W,C ;ANY DATA TO ZERO?
\r
2317 JRST @SDS ;NO, DO DATA STATEMENTS
\r
2318 CAML W,SDS ;IS DATA BELOW DATA STATEMENTS?
\r
2319 TLO F,FULLSW ;NO, INDICATE OVERFLO
\r
2320 TLNN F,FULLSW+SKIPSW ;SHOULD WE ZERO?
\r
2321 SETZM (W) ;YES, DO SO
\r
2322 TLON N,DZER ;GO BACK FOR MORE?
\r
2323 AOJA W,SECZER ;YES, PLEASE
\r
2324 CAMLE C,SDS ;ALL DATA BELOW DATA STATEMENTS?
\r
2325 MOVE C,SDS ;ALL ZEROED DATA MUST BE
\r
2326 HRLI W,-1(W) ;SET UP BLT POINTER TO ZERO DATA
\r
2327 TLNN F,FULLSW+SKIPSW ;SHOULD WE ZERO?
\r
2328 BLT W,-1(C) ;YES, DO SO
\r
2329 JRST @SDS ;GO DO DATA STATEMENTS
\r
2331 \fDREAD: TLNE N,RCF; NEW REPEAT COUNT NEEDED
\r
2335 MOVE W,@LTC; GET A WORD
\r
2336 HLRZM W,RCNT; SET REPEAT COUNT
\r
2337 HRRZM W,WCNT; SET WORD COUNT
\r
2338 POP W,(W); SUBTRACT ONE FROM BOTH HALFS
\r
2339 HLLM W,@LTC; DECREMENT REPEAT COUNT
\r
2340 AOS W,LTC; STEP READOUT
\r
2342 FETCH: MOVE W,@LTC
\r
2348 MOVE V,LTCTEM; RESTORE READOUT
\r
2350 DOFF.: TLZ N,RCF; RESET DATA REPEAT FLAG
\r
2355 MOVE T,(T); GET ADDRESS
\r
2356 HLRZM T,DWCT; DATA WORD COUNT
\r
2359 ADDI T,(X); LOADER OFFSET
\r
2360 DWFS.1: PUSHJ P,DREAD ;GET A DATA WORD
\r
2361 CAML T,SDS ;BELOW BEGINNING OF DATA STATEMENTS
\r
2362 TLO F,FULLSW ;YES, INDICATE OVERFLO
\r
2363 TLNN F,FULLSW+SKIPSW ;LOAD THE NEXT DATA ITEM?
\r
2364 MOVEM W,(T) ;YES, STORE IT
\r
2366 SOSE W,DWCT; STEP DOWN AND TEST
\r
2367 JRST DWFS.1 ;ONE MORE TIME, MOZART BABY!
\r
2375 CT1: 0 ;TEMP FOR C
\r
2379 WCNT: 0 ;DATA WORD COUNT
\r
2380 RCNT: 0 ;DATA REPEAT COUNT
\r
2382 LTCTEM: 0 ;TEMP FOR LTC
\r
2383 DWCT: 0 ;DATA WORD COUNT
\r