1 SUBTTL RP GRUEN/NGP/WFW/DMN V.052 7-SEP-70
3 ; TURNED ON FAILSW,SAILSW FOR NIH USAGE.
7 VPATCH==0 ;DEC PATCH LEVEL
8 VCUSTOM==0 ;NON-DEC PATCH LEVEL
11 XWD VCUSTOM,VLOADER+1000*VPATCH
14 COMMENT * ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO)
16 SWITCHES ON (NON-ZERO) IN DEC VERSION
17 SEG2SW GIVES TWO SEGMENT CODE (IF MACRO ALLOWS IT)
18 PURESW GIVES PURE CODE (VARIABLES IN LOW SEG)
19 REENT GIVES REENTRANT CAPABILITY PDP-10
20 (REENT=0 FOR PDP-10/30 OR PDP-6 OR EARLY PDP-10)
21 RPGSW INCLUDE CCL FEATURE
22 TEMP INCLUDE TMPCOR FEATURE
23 DMNSW SYMBOL TABLE WILL BE MOVED DOWN FROM TOP OF CORE
24 KUTSW GIVES CORE CUTBACK ON /K
25 EXPAND FOR AUTOMATIC CORE EXPANSION
27 DIDAL GIVES DIRECT ACCESS LIBRARY SEARCH MODE
28 ALGSW WILL LOAD ALGOL OWN BLOCK (TYPE 15)
30 SWITCHES OFF (ZERO) IN DEC VERSION
31 K GIVES 1KLOADER - NO F4
33 SPMON GIVES SPMON LOADER (MONITOR LOADER)
34 TEN30 FOR 10/30 LOADER
35 STANSW GIVES STANFORD FEATURES
36 LNSSW GIVES LNS VERSION
37 FAILSW INCLUDE PROVISIONS FOR SPECIAL FAIL FIXUPS.
38 LDAC MEANS LOAD CODE INTO ACS
39 (LDAC DOES NOT WORK WITH KUTSW=1.CORE UUO CLEARS JOBBLT)
40 WFWSW GIVES BLOCK TYPE 13 (VARIABLS INTO LOW SEG)
41 SYMARG ACCEPT SYMBOLIC (GLOBAL) ARGUMENTS FOR SWITCHES
42 SPCHN WILL DO SPECIAL OVERLAYING
43 SAILSW GIVES BLOCK TYPE 15 (FORCE LOAD OF REL FILES)
44 AND 16 (FORCE SEARCH OF LIBRARIES) FOR SAIL
48 SUBTTL DEFAULT ASSEMBLY SWITCH SETTINGS
50 IFNDEF SPMON,<SPMON=0>
56 IFNDEF TEN30,<TEN30=0>
60 IFNDEF DMNSW,< DMNSW=0>
61 IFNDEF DIDAL,< DIDAL=0>
73 IFNDEF STANSW,<STANSW=0>
77 IFNDEF LNSSW,<LNSSW=0>
82 IFNDEF FAILSW,<FAILSW=0>
84 IFNDEF RPGSW,<RPGSW==1>
85 IFN RPGSW,<PP==1> ;REQUIRE DISK FOR CCL
92 IFNDEF NAMESW,<NAMESW==1>
97 IFNDEF KUTSW,<KUTSW==1>
99 IFNDEF EXPAND,< IFN K,<EXPAND==0>
102 IFNDEF DMNSW,<DMNSW==1>
103 IFN DMNSW!LDAC,<IFNDEF SYMPAT,<SYMPAT==20>
104 IFN LDAC,<IFG 20-SYMPAT,<SYMPAT==20>>>
106 IFNDEF REENT,<REENT==1>
110 IFDEF TWOSEG,<IFNDEF SEG2SW,<SEG2SW==1>>
111 IFNDEF SEG2SW,<SEG2SW==0>
112 IFN SEG2SW,<PURESW==1>
114 IFNDEF PURESW,<PURESW==1>
116 IFNDEF WFWSW,<WFWSW==0>
121 IFNDEF SYMARG,<SYMARG==0>
123 IFNDEF SPCHN,<SPCHN==0>
125 IFNDEF DIDAL,<DIDAL==1>
127 IFNDEF ALGSW,<ALGSW==0>
130 IFNDEF SAILSW,<SAILSW==0>
133 SUBTTL ACCUMULATOR ASSIGNMENTS
134 F=0 ;FLAGS IN BOTH HALVES OF F
135 N=1 ;FLAGS IN LH, PROGRAM NAME POINTER IN RH
137 H=3 ;HIGHEST LOC LOADED
138 S=4 ;UNDEFINED POINTER
139 R=5 ;RELOCATION CONSTANT
140 B=6 ;SYMBOL TABLE POINTER
146 E=C+1 ;DATA WORD COUNTER
147 Q=15 ;RELOCATION BITS
148 A=Q+1 ;SYMBOL SEARCH POINTER
149 P=17 ;PUSHDOWN POINTER
152 ;MONITOR LOCATIONS IN THE USER AREA
157 EXTERN JOBDDT,JOBFF,JOBSA,JOBREL,JOBSYM,JOBUSY,JOB41
158 IFN REENT,< EXTERN JOBHRL,JOBCOR>
159 IFE K,<EXTERN JOBCHN ;RH = PROG BREAK OF FIRST BLOCK DATA
160 ;LH = PROG BREAK OF FIRST F4 PROG>
161 IFN RPGSW,< EXTERN JOBERR>
162 IFN LDAC,< EXTERN JOBBLT>
163 IFN FAILSW,< EXTERN JOBAPR>
165 NEGOFF==400 ;NEGATIVE OFFSET OF HIGH SEGMENT
168 IFN FAILSW,<;LENGTH OF PUSHDOWN LIST FOR POLISH FIXUPS
173 CSW==1 ;ON - COLON SEEN
174 ESW==2 ;ON - EXPLICIT EXTENSION IDENT.
175 SKIPSW==4 ;ON - DO NOT LOAD THIS PROGRAM
176 FSW==10 ;ON - SCAN FORCED TO COMPLETION
177 FCONSW==20 ;ON - FORCE CONSOLE OUTPUT
178 IFN REENT,<HIPROG==40 ;LOADING HI PROGRAM, SET BY HISEG. CLEARED BY EOF>
179 ASW==100 ;ON - LEFT ARROW ILLEGAL
180 FULLSW==200 ;ON - STORAGE EXCEEDED
181 SLIBSW==400 ;ON - LIB SEARCH IN THIS PROG
182 RMSMSW==1000 ;REMEMBER IF LOADING WITH SYMBOLS DURING LIB SEARCH
183 REWSW==2000 ;ON - REWIND AFTER INIT
184 LIBSW==4000 ;ON - LIBRARY SEARCH MODE
185 NAMSSW==10000 ;NAME BLOCK HAS BEEN SEEN FOR THIS PROG
186 ISW==20000 ;ON - DO NOT PERFORM INIT
187 SYMSW==40000 ;ON - LOAD LOCAL SYMBOLS
188 DSW==100000 ;ON - CHAR IN IDENTIFIER
189 NSW==200000 ;ON - SUPPRESS LIBRARY SEARCH
190 SSW==400000 ;ON - SWITCH MODE
194 ALLFLG==1 ;ON - LIST ALL GLOBALS
195 ISAFLG==2 ;ON - IGNORE STARTING ADDRESSES
196 COMFLG==4 ;ON - SIZE OF COMMON SET
197 IFE K,< F4SW==10 ;F4 IN PROGRESS
198 RCF==20 ;READ DATA COUNT
199 SYDAT==40; SYMBOL IN DATA>
200 SLASH==100 ;SLASH SEEN
201 IFE K,< BLKD1==200 ;ON- FIRST BLOCK DATA SEEN
202 PGM1==400 ;ON FIRST F4 PROG SEEN
203 DZER==1000 ;ON - ZERO SECOND DATA WORD>
204 EXEQSW==2000 ;IMMEDIATE EXECUTION
205 DDSW==4000 ;GO TO DDT
206 IFN RPGSW,<RPGF==10000 ;IN RPG MODE>
207 AUXSWI==20000 ;ON - AUX. DEVICE INITIALIZED
208 AUXSWE==40000 ;ON - AUX. DEVICE ENTERED
209 IFN PP,<PPSW==100000 ;ON - READING PROJ-PROG #>
210 IFN PP!SPCHN,<PPCSW==200000 ;ON - READING PROJ #>
211 IFN FAILSW,<HSW==400000 ;USED IN BLOCK 11 POLISH FIXUPS>
215 ;MORE FLAGS IN F (18-35)
217 SEENHI==1 ;HAVE SEEN HI STUFF
218 NOHI==2 ;LOAD AS NON-REENTRANT>
219 IFN RPGSW,<NOTTTY==4 ;DEV "TTY" IS NOT A TTY>
220 NOHI6==10 ;PDP-6 TYPE SYSTEM
221 IFN DMNSW,<HISYM==20 ;BLT SYMBOLS INTO HIGH SEGMENT>
222 SEGFL==40 ;LOAD INTO HI-SEG>
223 IFN DIDAL,<XFLG==100 ;INDEX IN CORE (BLOCK TYPE 14)
224 LSTLOD==200 ;LAST PROG WAS LOADED
225 DTAFLG==400 ;LIBRARY DEVICE IS A DTA (NEEDED FOR INDEXING)>
226 IFN DMNSW,<DMNFLG==1000> ;SYMBOL TABLE TO BE MOVED DOWN
227 IFN REENT,<VFLG==2000 ;DO LIB SEARCH OF IMP40.REL BEFORE LIB40>
228 IFN SYMARG,<ARGFL==4000 ;TREAT $%. AS RADIX-50 CHAR.>
229 TWOFL==10000 ;TWO SEGMENTS IN THIS BINARY FILE
230 LOCAFL==20000 ;PRINT LOCAL SYMBOLS IN MAP
231 TTYFL==40000 ;AUX. DEV. IS TTY
234 IFE K,<F4FL==400000 ;FORTRAN SEEN>
235 COBFL==200000 ;COBOL SEEN
236 IFN ALGSW,<ALGFL==100000 ;ALGOL SEEN>
244 IFE K,< TITLE LOADER - LOADS MACRO AND FORTRAN FOUR>
245 IFN K,< TITLE 1KLOAD - LOADS MACRO>
249 IFN SEG2SW,<TWOSEGMENTS
255 DSKBLK==200 ;LENGTH OF DISK BLOCKS
256 VECLEN==↑D25 ;LENGTH OF VECTOR TABLE FOR OVERLAYS>
259 RELLEN==↑D5 ;#NUMBER OF REL FILES OR LIBRARIES (MUST BE SAME)>
263 OPDEF RESET [CALLI 0]
264 OPDEF SETDDT [CALLI 2]
265 OPDEF DDTOUT [CALLI 3]
266 OPDEF DEVCHR [CALLI 4]
267 OPDEF CORE [CALLI 11]
268 OPDEF EXIT [CALLI 12]
269 OPDEF UTPCLR [CALLI 13]
270 OPDEF DATE [CALLI 14]
271 OPDEF MSTIME [CALLI 23]
272 OPDEF PJOB [CALLI 30]
273 OPDEF SETUWP [CALLI 36]
274 OPDEF REMAP [CALLI 37]
275 OPDEF GETSEG [CALLI 40]
276 OPDEF SETNAM [CALLI 43]
277 OPDEF TMPCOR [CALLI 44]
284 SUBTTL CCL INITIALIZATION
286 BEG: JRST LD ;NORMAL INITIALIZATION
287 RPGSET: RESET ;RESET UUO.
288 IFN TEMP,<MOVEI F,CTLBUF-1 ;USE CCL BUFFER FOR COMMANDS
289 HRRM F,CTLIN+1 ;DUMMY UP BYTE POINTER
290 HRLI F,-200 ;MAKE IT AN IOWD
292 MOVSI F,(SIXBIT /LOA/)
294 MOVE N,[XWD 2,TMPFIL] ;POINTER FOR TMPCOR READ
295 TMPCOR N, ;READ AND DELETE LOA FILE
296 JRST RPGTMP ;NO SUCH FILE IN CORE, TRY DISK
297 IMULI N,5 ;GET CHAR COUNT
299 MOVEM N,CTLIN+2 ;STORE IN BUFFER HEADER
300 MOVEI N,700 ;BYTE POINTER FOR LOA FILE
301 HRLM N,CTLIN+1 ;BYTE POINTER NOW COMPLETE
302 SETOM TMPFLG ;MARK THAT A TMPCOR READ WAS DONE
303 SETZM NONLOD ;NOT YET STARTED SCAN
304 JRST RPGS3C ;GET BACK IN MAIN STREAM
305 RPGTMP: SETZM TMPFLG ;MARK AS NOT TMP>
306 INIT 17,1 ;SET UP DSK FOR COMMAND FILE INPUT.
309 JRST NUTS ;CAN'T INIT, GET INPUT FROM TTY.
311 PJOB N, ;GET JOB NUMBER
312 LUP: IDIVI N,12 ;STRIP OFF LAST DIGIT
313 ADDI N+1,"0"-40 ;CONVERT TO SIXBIT
315 SOJG F,LUP ;3 DIGITS YET?
317 HRRI (SIXBIT /LOA/) ;LOADER NAME PART OF FILE NAME.
319 MOVSI (SIXBIT /TMP/) ;AND EXTENSION.
322 LOOKUP 17,CTLNAM ;FILE THERE?
324 INIT 16,1 ;GET SET TO DELETE FILE
328 SETZM CTLNAM+3 ;PUT STUFF BACK AS IT WAS
331 SETZM CTLNAM ;SET FOR RENAME
334 RPGS3B: RELEASE 16, ;GET RID OF DEVICE
335 RPGS3A: SETZM NONLOD ;TO INDICATE WE HAVE NOT YET STARTED TO SCAN
341 INBUF 17,1 ;SET UP BUFFER.
342 RPGS3C: TTCALL 3,[ASCIZ /LOADING/] ;PRINT MESSAGE THAT WE ARE STARTING.
343 SKIPE NONLOD ;CONTIUATION OF COMMAND?
344 JRST RPGS2 ;YES, SPECIAL SETUP.
345 CCLCHN: MOVSI N,RPGF ;@ CHAIN FILES CYCLE FROM HERE
346 JRST CTLSET ;SET UP TTY
348 RPGS1: PUSHJ P,[TLNE F,ESW ;HERE FROM FOO@ COMMAND, STORE NAME.
349 JRST LDDT3 ;SAVE EXTENSION.
350 TLZE F,CSW!DSW ;AS NAME
351 MOVEM W,DTIN ;STORE AS NAME
352 SETZM W,DTIN1 ;TRY BLANK EXTENSION FIRST.
354 MOVEM 0,SVRPG ;SAVE 0 JUST IN CASE
355 SETZM NONLOD ;DETERMINE IF CONTINUATION.
356 MOVEI 0,2(B) ;BY SEEING IF ANY SYMBOLS LOADED.
358 SETOM NONLOD ;SET TO -1 AND SKIP CALLI
359 IFN TEMP,<SETZM TMPFLG>
362 OPEN 17,OPEN1 ;KEEP IT PURE
365 LOOKUP 17,DTIN ;THE FILE NAME.
366 JRST [MOVE 0,SVRPG ;RESTORE AC0=F
367 TLOE F,ESW ;WAS EXT EXPLICIT?
368 JRST ILD9 ;YES, DON'T TRY AGAIN.
369 MOVEM 0,SVRPG ;SAVE AC0 AGAIN
370 MOVSI 0,(SIXBIT /TMP/) ;TRY TMP INSTEAD
372 PUSHJ P,LDDT4 ;SET UP PPN
376 RPGS2: MOVSI 0,RPGF ;SET FLAG
380 JRST LD2Q ;BACK TO INPUT SCANNING.
386 SUBTTL NORMAL INITIALIZATION
389 IFN L,< HRRZM 0,LSPXIT
394 HLLZS JOBERR ;MAKE SURE ITS CLEAR.>
395 RESET ;INITIALIZE THIS JOB
396 NUTS: SETZ N, ;CLEAR N
397 CTLSET: SETZB F,S ;CLEAR THESE AS WELL
398 HLRZ X,JOBSA ;TOP OF LOADER
399 HRLI X,V ;PUT IN INDEX
400 HRRZI H,JOBDA(X) ;PROGRAM BREAK
401 MOVE R,[XWD W,JOBDA] ;INITIAL RELOCATION
402 MOVSI E,(SIXBIT /TTY/)
404 TLNN E,10 ;IS IT A REAL TTY?
405 IFN RPGSW,<JRST [TLNN F,RPGF ;IN CCL MODE?>
406 EXIT ;NO, EXIT IF NOT TTY
407 IFN RPGSW,< TRO F,NOTTTY ;SET FLAG
408 JRST LD1] ;SKIP INIT>
409 INIT 3,1 ;INITIALIZE CONSOLE
412 CALLEX: EXIT ;DEVICE ERROR, FATAL TO JOB
416 OUTBUF 3,1 ;INITIALIZE OUTPUT BUFFERS
417 OUTPUT 3, ;DO INITIAL REDUNDANT OUTPUT
419 IFE L,< HRRZ B,JOBREL ;MUST BE JOBREL FOR LOADING REENTRANT>
420 IFN L,< MOVE B,JOBSYM ;USED INSTEAD OF JOBREL FOR SYMBOL TABLE FIXUPS>
422 SUB B,SE3 ;INITIALIZE SYMBOL TABLE POINTER
423 CAILE H,1(B) ;TEST CORE ALLOCATION>
424 JRST [HRRZ B,JOBREL;TOP OF CORE
426 CORE B, ;TRY TO GET IT
427 EXIT ;INSUFFICIENT CORE, FATAL TO JOB
430 CORE S, ;GET PERMITTED CORE
433 SUBI S,1 ;CONVERT TO NUMBER OF WORDS
434 MOVEM S,ALWCOR ;SAVE IT FOR XPAND TEST>
435 IFN PURESW,<MOVE S,[XWD HICODE,LOWCOD]
436 BLT S,LOWCOD+CODLN-1>
437 IFE L,< MOVS E,X ;SET UP BLT POINTER
441 SETZM -1(E) ;ZERO FIRST WORD
442 BLT E,(B) ;ZERO CORE UP TO THE SYMBOL AREA
443 HRRZ S,B ;INITIALIZE UNDEF. POINTER
444 HRR N,B ;INITIALIZE PROGRAM NAME POINTER
445 IFE L,< HRRI R,JOBDA ;INITIALIZE THE LOAD ORIGIN
446 MOVE E,COMM ;SET .COMM. AS THE FIRST PROGRAM
447 MOVEM E,1(B) ;STORE IN SYMBOL TABLE
448 HRRZM R,2(B) ;STORE COMMON ORIGIN>
449 MOVEI E,F.C ;INITIALIZE STATE OF THE LOADER
451 SETZM MDG ;MULTIPLY DEFINED GLOBAL COUNT
452 SETZM STADDR ;CLEAR STARTING ADDRESS
460 SETUWP W, ;SETUWP UUO.
461 TRO F,NOHI6 ;PDP-6 COMES HERE.
462 MOVEM F,F.C ;PDP-10 COMES HERE.>
463 IFN SAILSW,<MOVE W,[XWD -RELLEN-1,LIBFLS-1] ;SET UP POINTERS
464 MOVEM W,LIBPNT# ;IN THE FORM OF AOBJN WORDS
465 MOVE W,[XWD -RELLEN-1,PRGFLS-1]
467 IFE L,< MOVSI W,254200 ;STORE HALT IN JOB41
468 MOVEM W,JOB41(X) ;...>
469 IFN L,< MOVE W,JOBREL
471 IFN SPCHN,<SETZM CHNACB ;USED AS DEV INITED FLAG TOO>
472 IFN NAMESW,<SETZM CURNAM>
473 IFN FAILSW,<MOVEI W,440000 ;SET UP THE SPECIAL BITS OF HEADNUM(ADD+POLISH)
475 SETZM POLSW ;SWITCH SAYS WE ARE DOING POLISH
476 MOVEI W,PDLOV ;ENABLE FOR PDL OV
480 SETZM LINKTB ;ZERO OUT TABLE OF LINKS
483 MOVE W,[XWD LINKTB,LINKTB+1]
485 IFN DMNSW,<MOVEI W,SYMPAT
487 IFN KUTSW,<SETOM CORSZ>
490 IFN RPGSW,<JRST LD2Q>
491 LD2: IFN RPGSW,<MOVSI B,RPGF ;HERE ON ERRORS, TURN OFF RPG
492 ANDCAM B,F.C+N ;IN CORE>
493 ;LOADER SCAN FOR FILE NAMES
495 LD2Q: MOVSI B,F.C ;RESTORE ACCUMULATORS
497 MOVE P,PDLPT ;INITIALIZE PUSHDOWN LIST
498 SETZM BUFI2 ;CLEAR INPUT BUFFER POINTER
499 IFE PP,< SETZM ILD1 ;CLEAR INPUT DEVICE NAME>
500 IFN PP,< MOVSI T,(SIXBIT /DSK/) ;ASSUME DSK.
502 SETZM OLDDEV ;TO MAKE IT GO BACK AFTER /D FOR LIBSR>
503 SETZM DTIN ;CLEAR INPUT FILE NAME
505 LD2B: RELEAS 1, ;RELEASE BINARY INPUT DEVICE
506 IFN RPGSW,< TLNE N,RPGF ;NOT IF DOING CCL STUFF
509 IDPB T,BUFO1 ;OUTPUT ASTERISK TO START INPUT
511 LD2BA: TLZ F,FULLSW+ASW+ISW+CSW+ESW+SKIPSW+SLIBSW+REWSW
512 LD2BP: TLNE F,LIBSW ;WAS LIBRARY MODE ON?
513 TLO F,SKIPSW ;YES, NORMAL MODE IS SKIPPING
515 LD2D: IFN PP,<SETZM PPN ;DON'T REMEMBER PPN FROM ONE FILE TO NEXT.
516 LD2DB: SKIPE W,OLDDEV ;RESET DEVICE IF NEEDED.
517 CAMN W,ILD1 ;IS IT SAME?
518 JRST LD2DA ;YES, FORGET IT.
519 TLZ F,ISW+DSW+FSW+REWSW
521 LD2DA: MOVEI W,0 ;INITIALIZE IDENTIFIER SCAN
522 MOVEI E,6 ;INITIALIZE CHARACTER COUNTER
523 MOVE V,LSTPT ;INITIALIZE BYTE POINTER TO W
524 TLZ F,SSW+DSW+FSW ;LEAVE SWITCH MODE
525 LD3: IFN RPGSW,<TLNE N,RPGF ;CHECK RPG FEATURE
527 SOSG BUFI2 ;DECREMENT CHARACTER COUNTER
528 INPUT 3, ;FILL TTY BUFFER
529 ILDB T,BUFI1 ;LOAD T WITH NEXT CHARACTER
530 LD3AA: CAIN T,175 ;OLD ALTMOD
532 CAIL T,140 ;LOWER CASE?
533 TRZ T,40 ;CONVERT TO UPPER CASE
535 HRLM Q,LIMBO ;SAVE THIS CHAR.
536 MOVSS LIMBO ;AND LAST ONE
537 IDIVI Q,11 ;TRANSLATE TO 4 BIT CODE
538 LDB Q,LD8(A) ;LOAD CLASSIFICATION CODE
539 CAIGE Q,4 ;MODIFY CODE IF .GE. 4
540 TLNN F,SSW ;MODIFY CODE IF SWITCH MODE OFF
541 ADDI Q,4 ;MODIFY CLASS. CODE FOR DISPATCH
542 IFN SYMARG,<CAIL Q,20 ;SKIP UNLESS SECOND FORM OF DISPATCH
543 JRST LD3AB ;DIFFERENT DISPATCH>
544 HRRZ A,LD3A(Q) ;LOAD RH DISPATCH ENTRY
545 CAIL Q,10 ;SKIP IF CORRECT DISPATCH ENTRY
546 HLRZ A,LD3A-10(Q) ;LOAD LH DISPATCH ENTRY
547 JRST @A ;JUMP TO INDICATED LOCATION
549 ;COMMAND DISPATCH TABLE
551 LD3A: XWD LD3,LD7B ;IGNORED CHAR, BAD CHAR (SWITCH)
552 XWD LD6A,LD6 ;</> OR <(>, LETTER (SWITCH)
553 XWD LD5,LD6C ;<:>, DIGIT (SWITCH ARG.)
554 XWD LD5A,LD6D ;<.>, ESCAPE SWITCH MODE <)>
555 XWD LD5C,LD7 ;<=> OR <L. ARROW>, BAD CHAR.
556 XWD LD5B,LD4 ;<,>, ALPHABETIC CHAR.
557 XWD LD5D,LD4 ;<CR.>, NUMERIC CHAR.
558 XWD LD5E1,LD7 ;<ALT MODE>, BAD CHAR. <)>
559 IFN SYMARG,<XWD LD7,LD10 ;BAD CHAR,&>
565 RPGRD: SOSG CTLIN+2 ;CHECK CHARACTER COUNT.
566 JRST [IFN TEMP,<SKIPE TMPFLG ;TMPCOR UUO READ DONE?
567 JRST LD2 ;YES, JUST LEAVE>
573 SIXBIT /ERROR WHILE READING COMMAND FILE%/
575 IBP CTLIN+1 ;ADVANCE POINTER
578 MOVE T,@CTLIN+1 ;AND CHECK FOR LINE #
583 LDB T,CTLIN+1 ;GET CHR
584 JRST LD3AA ;PASS IT ON>
586 LD3AB: ROT Q,-1 ;CUT Q IN HALF
587 HRRZ A,LD3A(Q) ;PULL OFF RIGHT HALF OF TABLE ENTRY
588 JUMPGE Q,@A ;WHICH IS CORRECT FOR EVEN ENTRIES
589 HLRZ A,LD3A(Q) ;BUT USE LEFT HALF FOR ODD ENTRIES
593 SUBTTL CHARACTER HANDLING
595 ;ALPHANUMERIC CHARACTER, NORMAL MODE
596 LD4: SOJL E,LD3 ;JUMP IF NO SPACE FOR CHAR IN W
597 CAIGE T,141 ;WORRY ABOUT LOWER CASE LETTERS
598 SUBI T,40 ;CONVERT FROM ASCII TO SIXBIT
599 IDPB T,V ;DEPOSIT CHAR OF IDENTIFIER IN W
600 TLO F,DSW ;SET IDENTIFIER FLAG
601 JRST LD3 ;RETURN FOR NEXT CHARACTER
603 ;DEVICE IDENTIFIER DELIMITER <:>
605 LD5: PUSH P,W ;SAVE W
606 TLOE F,CSW ;TEST AND SET COLON FLAG
607 PUSHJ P,LDF ;FORCE LOADING
609 TLNE F,ESW ;TEST SYNTAX
610 JRST LD7A ;ERROR, MISSING COMMA ASSUMED
611 JUMPE W,LD2D ;JUMP IF NULL DEVICE IDENTIFIER
612 MOVEM W,ILD1 ;STORE DEVICE IDENTIFIER
613 IFN PP,<MOVEM W,OLDDEV ;WE HAVE A NEW ONE, DO IGNORE OLD.>
614 TLZ F,ISW+DSW+FSW+REWSW ;CLEAR OLD DEVICE FLAGS
615 JRST LD2D ;RETURN FOR NEXT IDENTIFIER
617 ;FILE NAME EXTENSION IDENTIFIER DELIMITER <.>
619 TRNE F,ARGFL ;IS "." SPECIAL
620 JRST LD4 ;YES,RADIX-50>
621 TLOE F,ESW ;TEST AND SET EXTENSION FLAG
622 JRST LD7A ;ERROR, TOO MANY PERIODS
623 TLZE F,CSW+DSW ;SKIP IF NULL IDENT AND NO COLON
624 MOVEM W,DTIN ;STORE FILE IDENTIFIER
625 JRST LD2D ;RETURN FOR NEXT IDENTIFIER
627 ;INPUT SPECIFICATION DELIMITER <,>
629 IFN PP,<TLZE N,PPCSW ;READING PP #?
631 IFE STANSW,< HRLM D,PPN ;STORE PROJ #
632 JRST LD6A1 ];GET PROG #>
633 IFN STANSW,< PUSHJ P,RJUST ;RIGHT JUSTIFY W
634 HRLM W,PPN ;STORE PROJ NAME
635 JRST LD2DB ];GET PROG NAME>
636 PUSHJ P,RBRA ;CHECK FOR MISSING RBRA>
637 SETOM LIMBO ;USED TO INDICATE COMMA SEEN
638 TLZN F,FSW ;SKIP IF PREV. FORCED LOADING
639 PUSHJ P,FSCN2 ;LOAD (FSW NOT SET)
640 JRST LD2BP ;RETURN FOR NEXT IDENTIFIER
642 LD5B1: TLNE F,ESW ;TEST EXTENSION FLAG
643 JRST LDDT3 ;EXPLICIT EXTENSION IDENTIFIER
644 TLZN F,CSW+DSW ;SKIP IF IDENT. OR COLON
646 MOVEM W,DTIN ;STORE FILE IDENTIFIER
647 JRST LDDT2 ;ASSUME <.REL> IN DEFAULT CASE
650 ;OUTPUT SPECIFICATION DELIMITER <=> OR <LEFT ARROW>
651 ;OR PROJ-PROG # BRACKETS <[> AND <]>
654 IFN SPCHN,<CAIN T,"=" ;DO A /= AS SWITCH
658 IFN RPGSW,<CAIN T,"@" ;CHECK FOR * COMMAND.
660 IFN PP,<CAIN T,"[" ;PROJ-PROG #?
661 JRST [TLO N,PPSW+PPCSW ;SET FLAGS
665 IFE STANSW,< JRST LD6A2]> ;READ NUMBERS AS SWITCHES
666 IFN STANSW,< JRST LD2DB]>
667 CAIN T,"]" ;END OF PP #?
668 JRST [PUSHJ P,RBRA ;PROCESS RIGHT BRACKET
669 JRST LD3] ;READ NEXT IDENT>
670 TLOE F,ASW ;TEST AND SET LEFT ARROW FLAG
671 JRST LD7A ;ERROR, MISPLACED LEFT ARROW
672 PUSHJ P,LD5B1 ;STORE IDENTIFIER
673 TLZN F,ESW ;TEST EXTENSION FLAG
674 MOVSI W,554160 ;ASSUME <.MAP> IN DEFAULT CASE
675 MOVEM W,DTOUT1 ;STORE FILE EXTENSION IDENTIFIER
676 MOVE W,DTIN ;LOAD INPUT FILE IDENTIFIER
677 MOVEM W,DTOUT ;USE AS OUTPUT FILE IDENTIFIER
678 IFN SPCHN,<MOVEM W,CHNENT ;AND FOR SPECAIL CHAINING>
679 IFN PP,<MOVE W,PPN ;PROJ-PROG #
680 MOVEM W,DTOUT+3 ;...>
681 MOVE W,ILD1 ;LOAD INPUT DEVICE IDENTIFIER
682 MOVEM W,LD5C1 ;USE AS OUTPUT DEVICE IDENTIFIER
683 IFN PP,<SKIPE W,OLDDEV ;RESTORE OLD
685 ;INITIALIZE AUXILIARY OUTPUT DEVICE
687 TLZE N,AUXSWI+AUXSWE ;FLUSH CURRENT DEVICE
689 DEVCHR W, ;IS DEVICE A TTY?
691 JRST [TRO F,TTYFL ;TTY IS AUX. DEV.
692 JRST LD2D] ;YES, SKIP INIT
693 OPEN 2,OPEN2 ;KEEP IT PURE
695 TLNE F,REWSW ;REWIND REQUESTED?
696 UTPCLR 2, ;DECTAPE REWIND
697 TLZE F,REWSW ;SKIP IF NO REWIND REQUESTED
698 MTAPE 2,1 ;REWIND THE AUX DEV
699 MOVEI E,AUX ;SET BUFFER ORIGIN
701 OUTBUF 2,1 ;INITIALIZE SINGLE BUFFER
702 TLO N,AUXSWI ;SET INITIALIZED FLAG
703 IFN LNSSW,<EXCH E,JOBFF
707 JRST LD2D ;RETURN TO CONTINUE SCAN
711 ;RIGHT SQUARE BRACKET (PROJ-PROG NUMBERS)
713 RBRA: TLZN N,PPSW ;READING PP #?
714 POPJ P, ;NOPE, RETURN
715 TLZE N,PPCSW ;COMMA SEEN?
716 JRST LD7A ;NOPE, INDICATE ERROR
717 IFE STANSW,<HRRM D,PPN ;STASH PROG NUMBER
718 TLZ F,SSW ;AND TURN OFF SWITCH MODE>
719 IFN STANSW,<PUSHJ P,RJUST ;RIGHT JUSTIFY W
720 HRRM W,PPN ;STASH PROG NAME>
721 MOVE W,PPNW ;PICKUP OLD IDENT
722 MOVE E,PPNE ;RESTORE CHAR COUNT
723 MOVE V,PPNV ;RESTORE BYTE PNTR
729 RJUST: JUMPE W,LD7A ;NOTHING TO RIGHT JUSTIFY
730 TRNE W,77 ;IS W RJUSTED YET?
731 POPJ P, ;YES, TRA 1,4
732 LSH W,-6 ;NOPE, TRY AGAIN
736 ;& SELECTS A SYMBOL RATHER THAN ANUMBER FOR A SWITCH ARGUMENT
737 ;& MUST ALSO FOLLOW THW SYMBOL; THE FORM IS /&SYMBOL&SWITHCH
738 LD10: TRC F,ARGFL ;SET OR CLEAR SPECIAL CHARS.
739 TLCE F,SSW ;IF IN SWITCH MODE, EXIT TO GET IDENTIFIER
741 PUSHJ P,ASCR50 ;IF NOT, REENTER IT, CONVERT IDENTIFIER TO R50
742 PUSHJ P,SDEF ;AND SEE IF IT EXISTS
743 JRST LD10A ;YES IT DOES
744 PUSHJ P,PRQ ;NO, COMPLAIN. OUTPUT ?
745 PUSHJ P,SPACE ;FOLLOWED BY A SPACE
746 PUSHJ P,PRNAME ;FOLLOWED BY THIS SYMBOL
747 ERROR 0,</ DOESN'T EXIST@/>
749 LD10A: MOVE D,2(A) ;SET D=VALUE OF SYMBOL AS NUMERIC ARG
751 MOVEI E,6 ;INITIALIZE NEW IDENTIFIER SCAN
752 MOVE V,LSTPT ;(W IS ALREADY 0)
753 JRST LD3 ;NOW EAT SWITCH AND CONTINUE PROCESSING COMMAND
754 LD10B: PUSHJ P,FSCN1 ;FORCE SCAN TO COMPLETION TO MAKE SURE FILE IS LOADED
760 ;CONVERT SYMBOL IN W TO RADIX-50 IN C
764 ROTC W,6 ;C IS NEXT SIXBIT CHAR
766 JRST R50B ;UNDER 20, MAY BE ., $, OR %
769 SUBI C,20-1 ;IS NUMBER
772 JUMPN W,R50A ;LOOP FOR ALL CHARS
773 MOVE C,A ;WIND UP WITH CHAR IN C
774 TLO C,040000 ;MAKE IT GLOBAL DEFINITION
776 R50B: JUMPE C,R50D ;OK IF SPACE
782 R50E: MOVEI C,5 ;ASSUME % IF NOTHING ELSE
786 JRST R50E ;BETWEEN 31 AND 41
789 SUBI C,41-13 ;IS LETTER
792 ;DEFINE PUTS A SYMBOL IN THE UNDEFINED SYMBOL TABLE
793 ;SO LOADER CAN SCAN LIBRARY AND LOAD PROGRAMS BEFORE THEY ARE REQUESTED
794 ;THE FORM IS /&SYMBOL# WHERE SYMBOL IS CONVERTED TO RADIX-50
796 DEFINE: PUSHJ P,ASCR50 ;CONVRT TO R-50
797 MOVEI W,-2(S) ;WHERE SYMBOL WILL GO
798 CAIG W,(H) ;ENOUGH ROOM
799 IFN EXPAND,<PUSHJ P,[PUSHJ P,XPAND
803 IFE EXPAND,<TLO F,FULLSW>
804 SUB S,SE3 ;ADJUST POINTER
805 MOVEM C,1(S) ;R-50 SYMBOL
807 TLZ F,DSW!SSW ;TURN OFF SWITCHES
808 JRST LD2D ;CONTINUE TO SCAN
813 ;LINE TERMINATION <CARRIAGE RETURN>
816 IFN PP,<PUSHJ P,RBRA ;CHECK FOR UNTERMINATED PP #>
817 SKIPGE LIMBO ;WAS LAST CHAR. BEFORE CR A COMMA?
818 TLO F,DSW ;YES ,SO LOAD ONE MORE FILE
819 PUSHJ P,FSCN ;FORCE SCAN TO COMPLETION
820 JRST LD2B ;RETURN FOR NEXT LINE
822 ;TERMINATE LOADING <ALT MODE>
824 LD5E: JUMPE D,LD5E1 ;ENTER FROM G COMMAND
825 TLO N,ISAFLG ;AND IGNORE ANY STARTING ADDRESS TO COME
826 HRRZM D,STADDR ;USE NUMERIC STARTING ADDRESS
827 LD5E1: PUSHJ P,CRLF ;START A NEW LINE
828 IFN RPGSW,<RELEASE 17,0 ;RELEASE COMMAND DEVICE>
829 PUSHJ P,SASYM ;SETUP JOBSA,JOBFF,JOBSYM,JOBUSY
830 MOVE W,[SIXBIT ?LOADER?] ;FINAL MESSAGE
831 PUSHJ P,BLTSET ;SETUP FOR FINAL BLT
832 RELEASE 2, ;RELEASE AUX. DEV.
833 RELEASE 1,0 ;INPUT DEVICE
835 IFN SPCHN,<RELEASE 4,0 ;SPECIAL CHAINING CHANEL>
836 IFN NAMESW,<HRRZ W,HISTRT ;IN CASE NO NAME SET, USE FIRST LOADED
841 CAMN W,[SIXBIT /MAIN/] ;FORTRAN MAIN PROG, OR MACRO NO TITLE
842 SKIPE W,PRGNAM ;USE BINARY FILE NAME IN EITHER CASE
848 MOVE V,[XWD HHIGO,HIGO]
849 BLT V,HIGONE ;MOVE DOWN CODE TO EXIT>
850 TLNN N,EXEQSW ;DO WE WANT TO START
852 IFN RPGSW,<TLNN N,RPGF ;IF IN RPG MODE
854 HRRZ C,JOBERR ;CHECK FOR ERRORS
856 EXDLTD: TTCALL 3,[ASCIZ /?EXECUTION DELETED
859 LD5E2: HRRZ W,JOBSA(X)
860 TLNE N,DDSW ;SHOULD WE START DDT??
862 IFN RPGSW,< TLNE N,RPGF ;IF IN RPG MODE
863 JUMPE W,[TTCALL 3,[ASCIZ /?NO STARTING ADDRESS
866 JUMPE W,LD5E3 ;ANYTHING THERE?
867 TLOA W,(JRST) ;SET UP A JRST
868 LD5E3: SKIPA W,CALLEX ;NO OR NO EXECUTE, SET CALLI 12
869 TTCALL 3,[ASCIZ /EXECUTION
871 IFN LDAC,< HRLZ P,BOTACS ;SET UP FOR ACBLT
872 MOVEM W,JOBBLT+1(X) ;SET JOBBLT
875 MOVSI LSTAC,LODACS ;SET UP TO BLT BLT CODE INTO ACS
877 IFN KUTSW,<SKIPGE E,CORSZ ;DO WE WANT CORE ADJUST
878 MOVE CORAC,JFCLAC ;NO, CLEAR COREUUO>
879 IFE LDAC,<MOVE LSTAC,W ;SET END CONDITION>
881 MOVSI V,LD ;DOES IT HAVE HISEG
882 JUMPG V,HINOGO ;NO,DON'T DO CORE UUO
883 MOVSI V,1 ;SET HISEG CORE NONE ZERO
888 BLT Q,(A) ;BLT CODE DOWN
889 IFN KUTSW,<CORAC: CORE E, ;CUT BACK CORE
890 JFCLAC: JFCL ;SHOULD NEVER HAVE AN ERROR SINCE REDUCING CORE>
891 LSTAC: IFN LDAC,<JRST JOBBLT>
896 SUBTTL PRINT FINAL MESSAGE
897 ; SET UP BLT AC'S, SETDDT, RELEAS
899 BLTSET: IFN RPGSW,<IFE K,<
900 JUMPE W,.+4 ;NO MESSAGE FROM CHAIN IN CCL@>>
901 PUSHJ P,FCRLF ;A RETURN
902 PUSHJ P,PWORD ;AND CHAIN OR LOADER
904 IFN FAILSW,<MOVSI Q,-20 ;FINISH UP LINK STUFF
905 FREND: HLRZ V,LINKTB+1(Q)
908 IFN REENT,<CAMGE V,HVAL1
911 IFN L,<CAML V,RINITL>
912 HRRM A,@X ;PUT END OF LINK CHAIN IN PROPER PLACE
914 IFN REENT,<MOVE X,LOWX ;RESET THINGS>>
915 IFN KUTSW,<SKIPGE C,CORSZ ;NEG MEANS DO NOT KUT BACK CORE
917 JUMPE C,MINCUT ;0 IS KUT TO MIN. POSSIBLE
918 LSH C,12 ;GET AS A NUMBER OF WORDS
920 CAMG C,JOBREL ;DO WE NEED MORE THAN WE HAVE??
921 JRST TRYSML ;NO, SEE IF NUMBER REQUESTED IS TOO SMALL
924 JFCL ;WE JUST WANT TO KNOW HOW MUCH
928 JRST NOCUT1 ;SET FOR DO NOT CHANGE SIZE
929 TRYSML: CAIG C,(R) ;IS DESIRED AMOUNT BIGGER THAN NEEDED
930 MINCUT: HRRZ C,R ;GET MIN AMOUNT
931 IORI C,1777 ;CONVERT TO A 1K MULTIPLE
932 IFN DMNSW,< TRNN F,DMNFLG ;DID WE MOVE SYMBOLS??
933 SKIPN JOBDDT(X) ;IF NOT IS DDT THERE??
935 IFE DMNSW,<SKIPE JOBDDT(X) ;IF NO SYMBOL MOVING JUST CHECK DDT>
936 JRST NOCUT ;DO NOT CUT IF SYMBOLS AT TOP AND DDT
937 NOCUT1: MOVEM C,JOBREL(X) ;SAVE FOR CORE UUO
938 MOVEM C,CORSZ ;SAVE AWAY FOR LATER
940 NOCUT: SETOM CORSZ ;SET FOR NO CUT BACK>
942 JUMPE W,NOMAX ;NO MESSAGE IF CHAIN IN CCL@>>
944 SUB Q,OLDJR ;PROPER SIZE>
945 IFE L,<HRRZ Q,JOBREL(X)
946 LSH Q,-12 ;GET CORE SIZE TO PRINT
949 IFN REENT,<MOVE Q,HVAL
952 JUMPE Q,NOHY ;NO HIGH SEGMENT
953 MOVEI T,"+"-40 ;THERE IS A HISEG
959 MOVE W,[SIXBIT /K CORE/]
963 IFN RPGSW,<TLNE N,RPGF
964 JRST NOMAX ;DO NOT PRINT EXTRA JUNK IN RPG MODE>
968 PUSHJ P,RCNUM ;PRINT MAX LOW CORE SIZE
969 IFN REENT,< SKIPE Q,JOBHRL ;GET SIZE OF HIGH SEGMENT
970 PUSHJ P,[MOVEI Q,400001(Q) ;CLEAR HIGH ORDER BIT
971 MOVEI T,"+"-40 ;PRINT A HIGH CORE PART
975 MOVE W,[SIXBIT /K MAX/]
977 IFN DMNSW,<TRNN F,DMNFLG>
980 MOVEI Q,1(S) ;FIND THE AMOUNT OF SPACE LEFT OVER
983 MOVE W,[SIXBIT / WORDS/]
985 MOVE W,[SIXBIT / FREE/]
988 NOMAX: MOVE W,JOBDDT(X)
990 IFE TEN30,<HRLI Q,20(X) ;SET UP BLT FOR CODE
992 IFN TEN30,<HRLI Q,JOBDDT(X)
995 POPJ P, ;WE HAVE SET R UP BY CLEVER CODE IN SASYM
996 IFN KUTSW,<CORERR: TTCALL 3,[ASCIZ /?NOT ENOUGH CORE
1001 SUBTTL SET UP JOBDAT
1003 PUSHJ P,LIBF ;SEARCH LIBRARY IF REQUIRED
1004 PUSHJ P,FSCN ;FORCE END OF SCAN
1005 IFN ALGSW,<MOVE C,[RADIX50 44,%OWN]
1006 MOVE W,%OWN ;GET VALUE
1007 TRNE F,ALGFL ;IF ALGOL PROG LOADED
1008 PUSHJ P,SYMPT ;DEFINE %OWN>
1014 PUSHJ P,PMS1 ;PRINT UNDEFS
1015 HRRZ A,H ;DO NOT CLOBBER H IF STILL INSERTING SYMBOLS
1016 SUBI A,(X) ;HIGHEST LOC LOADED INCLUDES LOC STMTS
1017 CAILE A,(R) ;CHECK AGAINST R
1018 HRR R,A ;AND USE LARGER
1019 IFE L,< HRRZ A,STADDR ;GET STARTING ADDRESS
1020 HRRM A,JOBSA(X) ;STORE STARTING ADDRESS
1021 HRRZM R,JOBFF(X) ;AND CURRENT END OF PROG
1023 IFN DMNSW,<MOVE C,[RADIX50 44,PAT..] ;MARK PATCH SPACE FOR RPG
1025 SKIPE JOBDDT(X) ;BUT ONLY IF DDT LOADED
1027 IFN REENT,<TRNE F,HISYM ;SHOULD SYMBOLS GO IN HISEG?
1029 IFN DMNSW!LDAC,< ;ONLY ASSEMBLE IF EITHER SET
1030 IFE LDAC,< TRNN F,DMNFLG ;GET EXTRA SPACE IF SYMBOLS
1031 JRST NODDT ;MOVED OR IF LOADING ACS>
1032 IFE DMNSW,< MOVEI A,20 ;FOR LOADING ACS>
1033 IFN DMNSW,< MOVE A,KORSP
1034 IFN LDAC,< TRNN F,DMNFLG ;ONLY 20 IF SYMBOLS NOT MOVED
1036 ADDI A,(R) ;GET ACTUAL PLACE TO PUT END OF SPACE
1038 CAIL A,(S) ;DO NOT OVERWRITE SYMBOLS
1039 IFN EXPAND,<JRST [PUSHJ P,XPAND>
1041 IFN EXPAND,< JRST .-1]>
1042 IFN LDAC,<HRRM R,BOTACS ;SAVE BOTTOM OF WHERE WE PUT ACS
1045 HRL A,X ;SET UP BLT FROM (X) TO R(X)
1048 IFN DMNSW,<TRNN F,DMNFLG ;NOW THE CODE TO MOVE SYMBOLS
1052 MOVE W,A ;SAVE POINTER TO FINAL LOC OF UNDEFS
1054 HLLZ Q,S ;COMPUTE LENGTH OF SYMBOL TABLE
1058 ADDI Q,-1(A) ;GET PLACE TO STOP BLT
1059 HRLI A,1(S) ;WHERE TO BLT FROM
1060 SUBI W,1(S) ;GET AMOUNT TO CHANGE S AND B BY
1061 BLT A,(Q) ;MOVE SYMBOL TABLE
1063 ADD B,W ;CORRECT S AND B FOR MOVE
1064 SKIPN JOBDDT(X) ;IS DDT LOADED
1065 JRST NODDT ;NO DO NOT RESET R
1066 HRRI R,1(Q) ;SET R TO POINT TO END OF SYMBOLS
1069 HRLM R,JOBSA(X) ;AND SAVE AWAY NEW JOBFF
1070 IFN LDAC,<SKIPA> ;SKIP THE ADD TO R
1072 IFN LDAC,<ADDI R,20> ;MAKE SURE R IS CORRECT FOR BLT
1074 ADDI A,1 ;SET UP JOBSYM, JOBUSY
1075 IFE L,<MOVEM A,JOBSYM(X)>
1076 IFN L,<MOVEM A,JOBSYM>
1079 IFE L,<MOVEM A,JOBUSY(X)
1080 MOVE A,HISTRT ;TAKE POSSIBLE REMAP INTO ACCOUNT
1081 MOVEM A,JOBREL(X) ;SET UP FOR IMEDIATE EXECUTION>
1082 IFN L,<MOVEM A,JOBUSY>
1084 SKIPE A,HILOW ;SET UP TOP LOC OF LOW CORE EXCLUDING BLOCKS
1085 SUBI A,1(X) ;IF NON-ZERO THEN IT NEEDS RELOCATION
1097 SUBTTL BLT SYMBOL TABLE INTO HIGH SEGMENT
1099 BLTSYM: MOVE Q,HVAL ;GET ORIGIN OF HISEG
1100 CAMN Q,HVAL1 ;HAS IT CHANGED?
1102 HLLZ Q,S ;COMPUTE LENGTH OF SYMBOL TABLE
1103 HLRS S ;PUT NEG COUNT IN BOTH HALVES
1104 JUMPE S,.+2 ;SKIP IF S IS ZERO
1105 HRLI S,-1(S) ;SUB 1 FROM LEFT TO FIX CARRY PROBLEM
1109 ADD Q,HVAL ;ADD LENGTH OF HISEG
1110 SUB Q,HVAL1 ;BUT REMOVE ORIGIN
1111 ADD Q,HISTRT ;START OF HISEG IN CORE
1112 HRRZS Q ;CLEAR INDEX FROM Q
1113 ADD Q,KORSP ;SAVE SPACE FOR SYMBOL PATCHES
1114 CORE Q, ;EXPAND IF NEEDED
1117 SOJ B, ;REMOVE CARRY FROM ADD TO FOLLOW
1118 MOVSS B ;SWAP SYMBOL POINTER
1120 HRRM B,(P) ;SAVE NEW B
1122 ADD B,S ;INCASE ANY UNDEFS.
1123 BLT B,(Q) ;MOVE SYMBOLS
1127 SOJ B, ;REMOVE CARRY
1128 ADDI S,(B) ;SET UP JOBUSY
1129 BLTSY1: MOVE Q,JOBREL
1132 SUBI Q,1 ;ONE TOO HIGH
1138 NOBLT: HRRZ Q,HILOW ;GET HIGHEST LOC LOADED
1139 HRRZ A,S ;GET BOTTOM OF UNDF SYMBOLS
1140 SUB A,KORSP ;DON'T FORGET PATCH SPACE
1141 IORI A,1777 ;MAKE INTO A K BOUND
1143 CAIN A,(Q) ;ARE THEY IN SAME K
1144 IFN EXPAND,<JRST [PUSHJ P,XPAND>
1146 IFN EXPAND,< JRST NOBLT]>
1147 MOVEM Q,HISTRT ;SAVE AS START OF HIGH
1148 MOVEI A,400000 ;HISEG ORIGIN
1149 MOVEM A,HVAL1 ;SAVE AS ORIGIN
1150 SUB S,HISTRT ;GET POSITION OF UNDF POINTER
1151 ADDI S,377777 ;RELATIVE TO ORG
1152 SUB B,HISTRT ;SAME FOR SYM POINTER
1154 TRO F,SEENHI ;SO JOBHRL WILL BE SET UP
1155 JRST BLTSY1 ;AND USE COMMON CODE
1159 MORCOR: ERROR ,</MORE CORE NEEDED#/>
1163 SUBTTL WRITE CHAIN FILES
1165 IFE K,< ;DONT INCLUDE IN 1KLOAD
1166 CHNC: SKIPA A,JOBCHN(X) ;CHAIN FROM BREAK OF FIRST BLOCK DATA
1167 CHNR: HLR A,JOBCHN(X) ;CHAIN FROM BREAK OF FIRST F4 PROG
1168 IFN ALGSW,<TRNE F,ALGFL ;IF ALGOL LOADING
1169 POPJ P, ;JUST RETURN>
1170 HRRZS A ;ONLY RIGHT HALF IS SIGNIFICANT
1171 JUMPE A,LD7C ;DON'T CHAIN IF ZERO
1172 TLNN N,AUXSWI ;IS THERE AN AUX DEV?
1173 JRST LD7D ;NO, DON'T CHAIN
1174 PUSH P,A ;SAVE WHEREFROM TO CHAIN
1175 JUMPE D,.+2 ;STARTING ADDR SPECIFIED?
1176 HRRZM D,STADDR ;USE IT
1177 CLOSE 2, ;INSURE END OF MAP FILE
1178 TLZ N,AUXSWI+AUXSWE ;INSURE NO PRINTED OUTPUT
1179 PUSHJ P,SASYM ;DO LIB SEARCH, SETUP JOBSA, ETC.
1180 IFN RPGSW,<TLNE N,RPGF ;IF IN CCL MODE
1181 TDZA W,W ;NO MESSAGES>
1182 MOVE W,[SIXBIT ?CHAIN?] ;FINAL MESSAGE
1183 PUSHJ P,BLTSET ;SETUP BLT PNTR, SETDDT, RELEAS
1184 POP P,A ;GET WHEREFROM
1185 HRRZ W,R ;CALCULATE MIN IOWD NECESSARY
1186 SKIPE JOBDDT(X) ;IF JOBDDT KEEP SYMBOLS
1189 HRRZ W,JOBREL ;NEED SYMBOLS AND THEY HAVE NOT MOVED DOWN
1190 SUBI W,(X) ;BECAUSE WE WILL NOT HAVE BLITTED
1191 SUBI B,-1(X) ;SYMBOL TABLE WILL COME OUT IN A
1192 MOVEM B,JOBSYM(X) ;DIFFERENT PLACE
1196 PUSH A,W ;SAVE LENGTH
1199 SETZM IOWDPP+1 ;JUST IN CASE
1201 PUSH A,JOBSA(X) ;SETUP SIX WORD TABLE
1202 PUSH A,JOBSYM(X) ;...
1205 SETSTS 2,17 ;SET AUX DEV TO DUMP MODE
1206 MOVSI W,435056 ;USE .CHN AS EXTENSION
1208 PUSHJ P,IAD2 ;DO THE ENTER
1209 OUTPUT 2,IOWDPP ;WRITE THE CHAIN FILE
1210 STATZ 2,IOBAD!IODEND
1213 STATZ 2,IOBAD!IODEND
1214 IFN RPGSW,<JRST LOSEBIG
1215 TLNE N,RPGF ;IF IN CCL MODE
1216 JRST CCLCHN ;LOAD NEXT LINK
1218 LOSEBI: TTCALL 3,[ASCIZ /?DEVICE ERROR/]
1222 SUBTTL SPECIAL CHAINB
1226 PUSHJ P,FSCN1A ;FORCE SCAN TO COMPLETION FOR CURRENT FILE
1227 TLNN N,AUXSWI ;IS THERE AN AUX DEV??
1229 HRLZI W,-1(R) ;CHNTAB-L = ADDRESS OF VECTOR TABLE
1230 HRRI W,1 ;CHNTAB-R = NEXT DISK BLOCK TO RITE INTO
1232 MOVE C,[RADIX50 4,OVTAB] ;DEFINE GLOBAL SYMBOL OVTAB
1233 MOVEI W,(R) ;TO HAVE VALUE THE BEGINNING OF THE VECTOR TABLE
1235 ADDI R,VECLEN ;RESERVE SPACE FOR VECTOR TABLE
1236 MOVE C,[RADIX50 4,OVBEG] ;OVBEG IS BEGINNING OF OVERLAY AREA
1239 HRRZM R,BEGOV ;AND SAVE IN OVBEG
1240 OPEN 4,CHNOUT ;OPEN FILE FOR CHAIN
1241 JRST ILD5 ;CANT OPEN CHAIN FILE
1242 ENTER 4,CHNENT ;ENTER CHAIN FILE
1243 JRST IMD3 ;NO CAN DO
1245 SUB W,HISTRT ;KEEP N RIGHT HALF AS RELATIVE TO HISTRT
1246 HRRZM W,CHNACN ;SAVE FOR RESTORING
1247 MOVEM B,CHNACB ;ALSO B R IS SAVED IN BEGOV
1250 CHNENS: TLOA N,PPCSW ;THIS FLAG UNUSED AT THIS POINT
1251 CHNEN: TLZ N,PPCSW ;ON TO NOT DELETE NEW SYMBOLS
1252 SKIPN CHNACB ;WILL BE NON-ZERO IF WE SAW A /< (> TO KEEP MACRO HAPPY)
1253 JRST LD7D ;ERROR MESSAGE
1254 PUSHJ P,FSCN1A ;LOAD LIB (IF DESIRED) AND FORCE SCAN
1255 SKIPL Q,S ;CHECK SYMBOL TABLE FOR MISSED UNDEFS
1256 JRST NOER ;NONE THERE
1257 MOVEI E,0 ;COUNT OF ERRORS
1259 IFN FAILSW,<SKIPL V,1(Q) ;IF HIGH ORDER BIT IS ON
1260 TLNN V,740000 ;OR IF ALL CODE BITS 0
1261 JRST NXTCK ;THEN NOT TO BE CHECKED>
1262 MOVE V,2(Q) ;GET FIXUP WORD
1263 TLNE V,100000 ;BIT INDICATES SYMBOL TABLE FIXUP
1265 IFN FAILSW,<TLNE V,40000 ;BIT INDICATES POLISH FIXUP
1267 TLZE V,740000 ;THESE BITS WOULD MEAN ADDITIVE
1269 JRST NXTCK] ;ONLY TRY FIRST LOCATION
1271 HRRZ V,@X ;THE WAY TO LINK
1272 CORCKL: IFN REENT,<CAMGE V,HVAL1>
1274 SKIPA ;NOT IN BAD RANGE
1275 JRST ERCK ;BAD, GIVE ERROR
1276 JUMPE V,NXTCK ;CHAIN HAS RUN OUT
1277 IFN REENT,<CAMGE V,HVAL1 ;GET CORRECT LINK
1280 XCT (A) ;TELLS US WHAT TO DO
1281 JRST CORCKL ;GO ON WITH NEXT LINK
1284 SMTBFX: TLNE N,PPCSW ;IF NOT CUTTING BACK SYMBOL TABLE
1285 JRST NXTCK ;THE ALL OK
1286 ADD V,HISTRT ;GET PLACE TO POINT TO
1288 HLRE D,CHNACB ;OLD LENGTH OF TABLE (NEGATIVE)
1289 HLRE T,B ;NEW LENGTH
1290 SUB D,T ;-OLD LEN+NEW LEN
1291 ADDI D,(B) ;OLD BOTTOM=NEW BOTTOM+NEW LEN-OLD LEN
1292 CAIG V,(D) ;IS IT IN THE PART WE ARE KEEPING
1295 IFN FAILSW,<POLCK: HLRZ C,V ;FIND HEADER
1298 JRST LOAD4A ;SHOULD BE THERE
1299 HRL C,2(A) ;NOW FIRST OPERATOR (STORE)
1304 ANDI C,37 ;GET OPERATION
1305 HRRZ V,2(A) ;DESTINATION
1306 JRST @CKSMTB-15(C) ;DISPATCH
1307 CKSMTB: EXP SMTBFX,SMTBFX,SMTBFX,CORCK,LCORCK,CORCK,NXTCK
1308 LCORCK: JSP A,CORCKL
1310 ERCK: MOVE C,1(Q) ;GET SYMBOL NAME
1311 PUSHJ P,FCRLF ;FORCE CRLF AND OUTPUT ON TTY
1312 PUSHJ P,PRNAME ;PRINT IT
1313 ADDI E,1 ;MARK ERROR
1314 NXTCK: ADD Q,SE3 ;TRY ANOTHER
1316 IFN REENT,<PUSHJ P,RESTRX ;GET PROPER X BACK>
1317 JUMPE E,NOER ;DID ANYTHING GO WRONG??
1318 ERROR ,</UNDEFINED GLOBAL(S) IN LINK@/>
1320 NOER: MOVE A,BEGOV ;GET START OF OVERLAY
1321 ADDI A,(X) ;GET ACTUAL CURRENT LOCATION
1322 IFN REENT,<HRRZ W,HILOW ;AND END OF OVERLAY+1
1323 HRRZM A,HILOW ;RESET>
1325 ADDI R,(X) ;A GOOD GUESS>
1327 SUBI A,1 ;SET TO BASE-1 (FOR IOWD)
1330 HRR A,CHNTAB ;BLOCK WE ARE WRITING ON
1331 HLRZ V,CHNTAB ;POINTER TO SEGMENT TABLE
1332 ADDI V,1 ;NEXT LOCATION
1333 HRLM V,CHNTAB ;REMEMBER IT
1334 CAML V,BEGOV ;CHECK FOR OVERRUN
1335 JRST [ERROR </?TOO MANY LINKS@/>
1337 MOVEM A,@X ;PUT INTO TABLE
1338 MOVN W,W ;GET POSITIVE LENGTH
1340 IDIVI W,DSKBLK ;GET NUMBER OF BLOCKS
1341 ADDM W,CHNTAB ;AND UPDATE
1343 JRST NOMVB ;DO NOT ADJUST SYMBOLS
1344 HLRE W,CHNACB ;GET OLD LENGTH OF DEF SYMBOLS
1345 HLRE C,B ;AND NEW LENGTH
1346 SUB W,C ;-OLD LEN+NEW LEN
1347 HRRZ C,B ;SAVE POINTER TO CURRENT S
1350 ADD B,W ;UPDATE B (COUNT AND LOC)
1351 JUMPGE S,UNLNKD ;JUST IN CASE NOTHING TO MOVE
1352 HRRZ A,B ;PLACE TO PUT UNDEFS
1354 MOVEM W,(A) ;TRANSFER
1356 CAIE A,(S) ;HAVE WE MOVED LAST WORD??
1357 SOJA C,UNLNK ;NO, CONTINUE
1358 UNLNKD: HRRZ W,CHNACN ;GET SAVED N
1360 HRR N,W ;AND RESET IT
1361 NOMVB: HRR R,BEGOV ;PICK UP BASE OF AREA
1362 OUTPUT 4,IOWDPP ;DUMP IT
1363 STATZ 4,IOBAD!IODEND ;AND ERROR CHECK
1365 HRRZ V,R ;GET AREA TO ZERO
1367 CAIL W,1(S) ;MUST MAKE SURE SOME THERE
1374 BLT W,(S) ;ZERO WORLD
1383 XPAND: TLNE F,FULLSW ;IF CORE EXCEEDED
1384 POPJ P, ;DON'T WASTE TIME ON CORE UUO
1388 XPAND1: PUSH P,H ;GET SOME REGISTERS TO USE
1391 PUSH P,JOBREL ;SAVE PREVIOUS SIZE
1392 CAMG Q,ALWCOR ;CHECK TO SEE IF RUNNING OVER
1395 IFE K,< HRRZ H,MLTP ;GET LOWEST LOCATION
1396 TLNN N,F4SW ;IS FORTRAN LOADING>
1397 MOVEI H,1(S) ;NO, USE S
1398 POP P,X ;LAST JOBREL
1399 HRRZ Q,JOBREL;NEW JOBREL
1400 SUBI Q,(X) ;GET DIFFERENCE
1401 HRLI Q,X ;PUT X IN INDEX FIELD
1404 CAMLE X,H ;TEST FOR END
1407 TLC H,-1 ;MAKE IT NEGATIVE
1408 SETZM (H) ;ZERO NEW CORE
1413 ADDM H,HISTRT ;UPDATE START OF HISEG
1414 IFN REENT,<ADDM H,HIGHX ;AND STORE LOCATION
1416 ADDM H,-1(P) ;X IS CURRENTLY IN THE STACK>
1419 IFE K,< TLNN N,F4SW ;F4?
1436 XPAND6: POP P,A ;CLEAR JOBREL OUT OF STACK
1437 ERROR ,</MORE CORE NEEDED#/>
1440 XPAND7: PUSHJ P,XPAND
1444 XPAND9: PUSH P,Q ;SAVE Q
1445 HRRZ Q,JOBREL ;GET CORE SIZE
1446 ADDI Q,(V) ;ADD XTRA NEEDED
1447 JRST XPAND1 ;AND JOIN COMMON CODE
1449 POPJM3: SOS (P) ;POPJ TO CALL-2
1450 POPJM2: SOS (P) ;POPJ TO CALL-1
1451 SOS (P) ;SAME AS POPJ TO
1452 POPJ P, ;NORMAL POPJ MINUS TWO
1457 SUBTTL SWITCH HANDLING
1461 LD6A: CAIN T,57 ;WAS CHAR A SLASH?
1462 TLO N,SLASH ;REMEBER THAT
1463 LD6A2: TLO F,SSW ;ENTER SWITCH MODE
1464 LD6A1: SETZB D,C ;ZERO TWO REGS FOR DECIMAL AND OCTAL
1465 JRST LD3 ;EAT A SWITCH
1467 ;ALPHABETIC CHARACTER, SWITCH MODE
1470 CAIL T,141 ;ACCEPT LOWER CASE SWITCHES
1472 IFN SPCHN,<XCT LD6B-74(T) ;EXECUTE SWITCH FUNCTION>
1473 IFE SPCHN,<XCT LD6B-101(T) ;EXECUTE SWITCH FUNCTION>
1474 TLZE N,SLASH ;SWITCH MODE ENTERED W/ SLASH?
1475 JRST LD6D ;LEAVE SWITCH MODE
1476 JRST LD6A1 ;STAY IN SWITCH MODE
1480 ;DISPATCH TABLE FOR SWITCHES
1482 ; THE INSTRUCTION AT THE CHARACTER LOCATION IS EXECUTED
1485 IFN SPCHN,<PUSHJ P,CHNBG ;LESS THAN - BEGINNING OF OVERLAY
1486 PUSHJ P,CHNENS ;= - PUT OUT CHAIN RETAINING SYMBOLS
1487 PUSHJ P,CHNEN ;GREATER THAN - END OF OVERLAY
1488 JRST LD7B ;? - ERROR
1489 JRST LD7B ;@ - ERROR>
1490 PUSHJ P,ASWTCH ;A - LIST ALL GLOBALS
1491 IFN DMNSW,<PUSHJ P,DMN2 ;B - BLOCKS DOWN SYMBOL TABLE >
1492 IFE DMNSW,<JRST LD7B ;B - ERROR>
1493 IFE K,< PUSHJ P,CHNC ;C - CHAIN, START W/ COMMON>
1494 IFN K,< JRST LD7B ;C - ILLEGAL IN 1KLOAD>
1495 PUSHJ P,LDDT ;D - DEBUG OPTION, LOAD DDT
1496 TLO N,EXEQSW ;E - LOAD AND GO
1497 PUSHJ P,LIBF ;F - LIBRARY SEARCH
1498 PUSHJ P,LD5E ;G - GO INTO EXECUTION
1499 IFN REENT,<PUSHJ P,HSET ;H - REENTRANT. PROGRAM>
1500 IFE REENT,<JFCL ;JUST IGNORE /H>
1501 PUSHJ P,ISWTCH ;I - IGNORE STARTING ADDRESSES
1502 TLZ N,ISAFLG ;J - USE STARTING ADDRESSES
1503 IFE KUTSW,<JRST LD7B ;K - ERROR>
1504 IFN KUTSW,<MOVEM C,CORSZ ;K - SET DESIRED CORE SIZE>
1505 PUSHJ P,LSWTCH ;L - ENTER LIBRARY SEARCH
1506 PUSHJ P,PRMAP ;M - PRINT STORAGE MAP
1507 TLZ F,LIBSW+SKIPSW ;N - LEAVE LIBRARY SEARCH
1508 HRR R,D ;O - NEW PROGRAM ORIGIN
1509 PUSHJ P,PSWTCH ;P - PREVENT AUTO. LIB. SEARCH
1510 TLZ F,NSW ;Q - ALLOW AUTO. LIB. SEARCH
1511 IFE K,< PUSHJ P,CHNR ;R - CHAIN, START W/ RESIDENT>
1512 IFN K,< JRST LD7B ;R - ILLEGAL IN 1KLOAD>
1513 PUSHJ P,SSWTCH ;S - LOAD WITH SYMBOLS
1514 PUSHJ P,LDDTX ;T - LOAD AND GO TO DDT
1515 PUSHJ P,PMS ;U - PRINT UNDEFINED LIST
1516 IFN REENT,<PUSHJ P,VSWTCH ;V - LOAD REENTRANT LIB40>
1517 IFE REENT,<JRST LD7B ;V - ERROR>
1518 TLZ F,SYMSW+RMSMSW ;W - LOAD WITHOUT SYMBOLS
1519 TLZ N,ALLFLG ;X - DO NOT LIST ALL GLOBALS
1520 TLO F,REWSW ;Y - REWIND BEFORE USE
1521 JRST LDRSTR ;Z - RESTART LOADER
1525 ; PAIRED SWITCHES ( +,-)
1527 ASWTCH: JUMPL D,.+2 ;SKIP IF /-A
1528 TLOA N,ALLFLG ;LIST ALL GLOBALS
1532 ISWTCH: JUMPL D,.+2 ;SKIP IF /-I
1533 TLOA N,ISAFLG ;IGNORE STARTING ADDRESSES
1537 LSWTCH: JUMPL D,.+2 ;SKIP IF /-L
1538 TLOA F,LIBSW!SKIPSW ;ENTER LIBRARY SEARCH
1539 TLZ F,LIBSW!SKIPSW ;DON'T
1542 PSWTCH: JUMPL D,.+2 ;SKIP IF /-P
1543 TLOA F,NSW ;PREVENT AUTO. LIB SEARCH
1547 SSWTCH: JUMPL D,.+2 ;SKIP IF /-S
1548 TLOA F,SYMSW!RMSMSW ;LOAD WITH SYMBOLS
1549 TLZ F,SYMSW!RMSMSW ;DON'T
1553 VSWTCH: JUMPL D,.+2 ;SKIP IF /-V
1554 TROA F,VFLG ;SEARCH RE-ENTRANT LIBRARY
1560 ; H SWITCH --- EITHER /H OR /NH
1561 HSET: JUMPE D,SETNUM ;/H ALWAYS LEGAL
1562 CAIGE D,2 ;WANT TO CHANGE SEGMENTS
1563 JRST SETSEG ;YES,GO DO IT
1564 TRNN F,SEENHI ;STARTED TO LOAD YET?
1565 JRST HCONT ;NO, CONTINUE.
1566 ERROR ,<?/H ILLEGAL AFTER FIRST HISEG FILE IS LOADED@?>>
1568 LDRSTR: ERROR 0,</LOADER RESTARTED@/>
1569 JRST LD ;START AGAIN
1571 REMPFL: ERROR ,</?LOADER REMAP FAILURE@/>
1577 JRST COROVL ;BEING SET LOWER THEN 400000 OR MORE THAN TO OF LOW SEG
1578 HRRZM C,HVAL1 ;WE HAVE REMOVED THE ODD BITS TO MAKE A 1K MULT
1580 CAILE C,(D) ;MAKE SURE OF ENOUGH ROOM
1582 HRLI D,W ;SET UP W IN LEFT HALF
1586 COROVL: ERROR ,</HISEG STARTING ADDRESS TOO LOW@/>
1588 SETNUM: TRO F,NOHI ;SET NO-HIGH-SEG SWITCH.
1592 ;SWITCH MODE NUMERIC ARGUMENT
1594 LD6C: LSH D,3 ;BUILD OCTAL NUMERIC ARGUMENT
1597 ADDI C,-"0"(T) ;ACCUMULATE DEC AND OCTAL
1600 ;EXIT FROM SWITCH MODE
1602 LD6D: TLZ F,SSW ;CLEAR SWITCH MODE FLAG
1603 TLNE F,FSW ;TEST FORCED SCAN FLAG
1604 JRST LD2D ;SCAN FORCED, START NEW IDENT.
1605 JRST LD3 ;SCAN NOT FORCED, USE PREV IDENT
1606 ;ILLEGAL CHARACTER, NORMAL MODE
1609 CAIN T,"#" ;DEFINING THIS SYMBOL
1611 TRNN F,ARGFL ;TREAT AS SPECIAL
1616 CAIN T,"Z"-100 ;TEST FOR ↑Z
1617 JRST LD5E1 ;TREAT AS ALTMODE FOR BATCH
1619 JRST LD2 ;TRY TO CONTINUE
1621 ;SYNTAX ERROR, NORMAL MODE
1623 LD7A: ERROR 8,</SYNTAX%/>
1626 ;ILLEGAL CHARACTER, SWITCH MODE
1628 LD7B: CAIN T,"-" ;SPECIAL CHECK FOR -
1631 CAIN T,"Z"-100 ;CHECK FOR /↑Z
1632 JRST LD5E1 ;SAME AS ↑Z
1637 ;ATTEMPT TO CHAIN WITH SPECIFIED HALF OF JOBCHN = 0
1640 LD7C: ERROR ,<?UNCHAINABLE AS LOADED@?>
1643 ;ATTEMP TO CHAIN WITHOUT SPECIFYING DEVICE
1645 LD7D: ERROR ,<?NO CHAIN DEVICE@?>
1650 IFN ALGSW,<TRNE F,ALGFL ;IF LOADING ALGOL
1651 POPJ P, ;JUST RETURN>
1652 CAIN D,1 ;SPECIAL CASE
1653 TROA F,HISYM ;YES ,BLT SYMBOLS INTO HISEG
1655 TROA F,DMNFLG ;TURN ON /B
1656 IFN KUTSW,<TRZA F,DMNFLG ;TURN OFF IF /-B
1657 SETZM CORSZ ;SET TO CUT BACK CORE>
1658 IFE KUTSW,<TRZ F,DMNFLG ;TURN OFF IF /-B>
1665 SUBTTL CHARACTER CLASSIFICATION TABLE DESCRIPTION:
1667 ; EACH CHARACTER HAS ASSOCIATED WITH IT A FOUR BIT BYTE
1668 ; PACKED IN THE CHARACTER CLASSIFICATION TABLE. THE CHARACTER
1669 ; CLASSIFICATION CODES ARE ORDERED IN SUCH A WAY AS TO GIVE
1670 ; DELIMITERS OF HIGHER PRECEDENCE LOWER CLASSIFICATION NUMBERS.
1671 ; CERTAIN CHARACTERS HAVE NO EFFECT ON THE COMMAND STRING, AND
1672 ; THEREFORE DO NOT EFFECT ORDERING OF DELIMITERS. FOUR CODES
1673 ; ARE RESERVED FOR ALTERNATE DISPATCHES WHILE THE SWITCH MODE IS
1677 ;CLASSIFICATION BYTE CODES:
1679 ; BYTE DISP CLASSIFICATION
1681 ; 00 - 00 ILLEGAL CHARACTER, SWITCH MODE
1682 ; 01 - 01 ALPHABETIC CHARACTER, SWITCH MODE
1683 ; 02 - 02 NUMERIC CHARACTER, SWITCH MODE
1684 ; 03 - 03 SWITCH MODE ESCAPE, SWITCH MODE
1686 ; 00 - 04 ILLEGAL CHARACTER, NORMAL MODE
1687 ; 01 - 05 ALPHABETIC CHARACTER, NORMAL MODE
1688 ; 02 - 06 NUMERIC CHARACTER, NORMAL MODE
1689 ; 03 - 07 SWITCH MODE ESCAPE, NORMAL MODE
1691 ; 04 - 10 IGNORED CHARACTER
1692 ; 05 - 11 ENTER SWITCH MODE CHARACTER
1693 ; 06 - 12 DEVICE IDENTIFIER DELIMITER
1694 ; 07 - 13 FILE EXTENSION DELIMITER
1695 ; 10 - 14 OUTPUT SPECIFICATION DELIMITER
1696 ; 11 - 15 INPUT SPECIFICATION DELIMITER
1697 ; 12 - 16 LINE TERMINATION
1698 ; 13 - 17 JOB TERMINATION
1701 ;BYTE POINTERS TO CHARACTER CLASSIFICATION TABLE
1703 LD8: POINT 4,LD9(Q),3
1713 ;CHARACTER CLASSIFIACTION TABLE
1715 LD9: BYTE (4)4,0,0,0,0,0,0,0,0
1716 BYTE (4)4,4,4,4,12,0,0,0,0
1717 BYTE (4)0,0,0,0,0,0,0,0,0
1718 BYTE (4)13,0,0,0,0,4,0,4,0
1719 IFE SYMARG,< BYTE (4)0,0,0,0,5,3,0,0,11>
1720 IFN SYMARG,< BYTE (4)0,0,14,0,5,3,0,0,11>
1721 BYTE (4)0,7,5,2,2,2,2,2,2
1722 IFE SPCHN,< BYTE (4)2,2,2,2,6,0,0,10,0>
1723 IFN SPCHN,< BYTE (4)2,2,2,2,6,0,1,10,1>
1724 IFE RPGSW,< BYTE (4)0,0,1,1,1,1,1,1,1>
1725 IFN RPGSW,< BYTE (4) 0,10,1,1,1,1,1,1,1>
1726 BYTE (4)1,1,1,1,1,1,1,1,1
1727 BYTE (4)1,1,1,1,1,1,1,1,1
1728 IFE PP,<BYTE (4)1,0,0,0,0,10,0,1,1>
1729 IFN PP,<BYTE (4)1,10,0,10,0,10,0,1,1>
1730 BYTE (4)1,1,1,1,1,1,1,1,1
1731 BYTE (4)1,1,1,1,1,1,1,1,1
1732 BYTE (4)1,1,1,1,1,1,0,0,13
1736 SUBTTL INITIALIZE LOADING OF A FILE
1738 ILD: MOVEI W,BUF1 ;LOAD BUFFER ORIGIN
1740 TLOE F,ISW ;SKIP IF INIT REQUIRED
1741 JRST ILD6 ;DONT DO INIT
1742 ILD7: OPEN 1,OPEN3 ;KEEP IT PURE
1744 ILD6: TLZE F,REWSW ;SKIP IF NO REWIND
1746 ILD2: LOOKUP 1,DTIN ;LOOK UP FILE FROM DIRECTORY
1747 JRST ILD3 ;FILE NOT IN DIRECTORY
1749 IFE K,< INBUF 1,2 ;SET UP BUFFERS>
1750 IFN K,< INBUF 1,1 ;SET UP BUFFER>>
1751 IFN LNSSW,<INBUF 1,1
1755 IFE K,<MOVEI C,4*203+1>
1756 IFN K,<MOVEI C,203+1>
1759 TLO F,ASW ;SET LEFT ARROW ILLEGAL FLAG
1760 TLZ F,ESW ;CLEAR EXTENSION FLAG
1765 ILD3: TLOE F,ESW ;SKIP IF .REL WAS ASSUMED
1766 JRST ILD4 ;FATAL LOOKUP FAILURE
1767 SETZM DTIN1 ;ZERO FILE EXTENSION
1768 JRST ILD2 ;TRY AGAIN WITH NULL EXTENSION
1770 ILD4: IFE REENT,<IFE TEN30,< ;PDP-6 ONLY
1771 MOVE W,[SIXBIT /LIB40/]
1772 CAME W,DTIN ;WAS THIS A TRY FOR LIB40?
1774 TRZ W,(SIXBIT / 0/) ;YES
1775 MOVEM W,DTIN ;TRY LIB4
1776 PUSHJ P,LDDT2 ;USE .REL EXTENSION
1778 JRST ILD2 ;GO TRY AGAIN
1780 IFN PP,<MOVSI W,(SIXBIT /DSK/)
1781 CAMN W,ILD1 ;TRIED DSK ONCE?
1782 JRST ILD9 ;YES, FILE DOES NOT EXIST
1783 MOVEM W,ILD1 ;SET IT UP
1784 SETZM PPN ;CLEAR OLD VALUE
1785 PUSHJ P,LDDT2 ;SET UP .REL
1786 TLZ F,ESW ;SO WE CAN TRY BLANK EXT
1787 JRST ILD7 ;OPEN DSK,TRY AGAIN>
1789 ILD9: ERROR ,</CANNOT FIND#/>
1792 ; DEVICE SELECTION ERROR
1794 ILD5A: SKIPA W,LD5C1
1796 ILD5: TLO F,FCONSW ;INSURE TTY OUTPUT
1797 PUSHJ P,PRQ ;START W/ ?
1798 PUSHJ P,PWORD ;PRINT DEVICE NAME
1799 ERROR 7,</UNAVAILABLE@/>
1803 SUBTTL LIBRARY SEARCH CONTROL AND LOADER CONTROL
1805 ;LIBF ENABLES A LIBRARY SEARCH OF <SYS:LIB4.REL>
1807 LIBF: PUSHJ P,FSCN1 ;FORCE SCAN TO COMPLETION
1808 PUSH P,ILD1 ;SAVE DEVICE NAME
1809 PUSHJ P,LIBF1 ;LOAD SYS:JOBDAT.REL
1810 IFN SAILSW,<LIBAGN: PUSHJ P,SALOAD ;LOAD RELS AND SEARCH LIBS>
1811 IFN REENT,<TRNN F,SEENHI ;IF ANY HISEG LOADED NO RE-ENT OP SYSTEM
1814 IFN ALGSW,<TRNE F,ALGFL ;SPECIAL ACTION IF LOADING ALGOL
1815 JRST [MOVE C,[RADIX50 44,%ALGDR]
1816 MOVEI W,400010 ;JOBHDA
1817 PUSHJ P,SYMPT ;DEFINE IT
1818 JRST LIBF3] ;DON'T LOAD IMP40>
1819 MOVE W,[SIXBIT /IMP40/]
1822 TRNN F,COBFL ;COBOL SEEN?
1823 SKIPA W,[SIXBIT /LIB40/] ;FIRST TRY AT NAME
1824 MOVE W,[SIXBIT /LIBOL/] ;YES, SEARCH COBOL'S LIBRARY ONLY
1825 PUSHJ P,LIBF2 ;LOAD SYS:LIB40.REL
1826 IFN SAILSW,<MOVE W,LIBPNT ;SEE IF ANY MORE TO DO
1827 CAME W,[XWD -RELLEN-1,LIBFLS-1]
1829 MOVE W,PRGPNT ;IT COULD BE DANGEROUS TO LOAD PROGRAMS HERE
1830 CAME W,[XWD -RELLEN-1,PRGFLS-1]
1831 JRST LIBAGN ;MORE TO DO, TRY AGAIN>
1832 POP P,ILD1 ;CALL TO LDDT1 WILL PUT IT IN OLDDEV
1833 LIBF1: MOVE W,[SIXBIT /JOBDAT/] ;LOAD SYS:JOBDAT.REL
1834 LIBF2: PUSHJ P,LDDT1
1835 LIBGO: JUMPGE S,EOF2 ;JUMP IF NO UNDEFINED GLOBALS
1836 TLO F,SLIBSW+SKIPSW ;ENABLE LIBRARY SEARCH
1837 TLZ F,SYMSW ;DISABLE LOADING WITH SYMBOLS
1838 JRST LDF ;INITIALIZE LOADING LIB4
1841 ; LIB CONTROLS THE LIBRARY SEARCH OF ONE FILE
1843 LIB: JUMPGE S,EOF1 ;JUMP IF NO UNDEFINED GLOBALS
1844 TLO F,SKIPSW ;SET SKIPSW TO IGNORE MODE
1845 IFN DIDAL,<TRNE F,XFLG ;INDEX IN CORE?
1847 JRST LOAD ;CONTINUE LIB. SEARCH
1849 LIB1: CAIE A,4 ;TEST FOR ENTRY BLOCK
1850 JRST LIB29 ;NOT AN ENTRY BLOCK, IGNORE IT
1851 LIB2: PUSHJ P,RWORD ;READ ONE DATA WORD
1853 TLO C,040000 ;SET CODE BITS FOR SEARCH
1855 TLZA F,SKIPSW ;REQUEST MATCHES ENTRY, LOAD
1856 JRST LIB2 ;NOT FOUND
1857 LIB3: PUSHJ P,RWORD ;READ AND IGNORE ONE DATA WORD
1858 JRST LIB3 ;LOOP TO IGNORE INPUT
1861 IFN DIDAL,<CAIN A,14 ;INDEX BLOCK?
1863 LIB30: HRRZ C,W ;GET WORD COUNT
1864 JUMPE C,LOAD1 ;IF NUL BLOCK RETURN
1865 CAILE C,↑D18 ;ONLY ONE SUB-BLOCK
1866 JRST LIB3 ;NO,SO USE OLD SLOW METHOD
1867 AOJA C,LIB31 ;ONE FOR RELOCATION WORD
1869 BLOCK0: HRRZ C,W ;GET WORD COUNT
1870 JUMPE C,LOAD1 ;NOISE WORD
1871 LIB31: CAML C,BUFR2 ;DOES BLOCK OVERLAP BUFFERS?
1872 SOJA C,LIB32 ;YES,ALLOW FOR INITIAL ILDB
1873 ADDM C,BUFR1 ;ADD TO BYTE POINTER
1875 ADDM C,BUFR2 ;TO SUBTRACT C FROM WORD COUNT
1876 JRST LOAD1 ;GET NEXT BLOCK
1878 LIB32: SUB C,BUFR2 ;ACCOUNT FOR REST OF THIS BUFFER
1879 PUSHJ P,WORD+1 ;GET ANOTHER BUFFERFUL
1880 JRST LIB31 ;TRY AGAIN
1885 COMMENT * BLOCK TYPE 15 AND 16 USED TO SPECIFY PROGRAMS AND
1886 LIBRARIES WHICH MUST BE LOADED (SEARCHED) IF THE PROGRAM
1887 IN WHICH THE BLOCK APPEARS IS LOADED. IT IS NOW TIME TO
1888 LOAD AND SEARCH THESE FILES. IF ANY MAKE REQUESTS, THEY ARE ADDED
1889 TO THE END. WE WILL COME BACK AND LOOK AGAIN IN CASE A
1890 LIBRARY PROGRAM LOAD A REL PROGRAM. ORIGINAL CODE BY DCS*
1892 SALOAD: MOVE T,[XWD -RELLEN-1,PRGFLS-1] ;TO RESET WITH AT END
1893 MOVEI D,PRGPNT ;OINTER TO UPPER LIMIT
1894 PUSHJ P,PRGPRG ;LOAD THEM IF ANY
1896 ;NOW FOR LIBRARY SEARCH
1898 MOVE T,[XWD -RELLEN-1,LIBFLS-1]
1901 PRGPRG: MOVEM D,LODLIM# ;SAVE POINTER TO LIMIT
1902 MOVEM T,LODSTP# ;START FOR RESETTING
1903 PRGBAK: MOVEM T,LODPNT# ;AND START
1904 CAMN T,@LODLIM ;GOTTEN TO END YET?
1905 JRST PRGDON ;YES, DUMP IT
1906 SKIPN W,PRGDEV(T) ;IS DEVICE SPECIFIED?
1907 MOVSI W,(SIXBIT /DSK/) ;NO, DSK
1908 MOVEM W,ILD1 ;WHERE WE INIT FROM
1909 MOVSI W,(SIXBIT /REL/) ;EXTENSION
1912 MOVEM W,DTIN ;FILE NAME
1913 MOVE W,PRGPPN(T) ;THE PROJECT PROG
1915 PUSH P,JRPRG ;A RETURN ADDRESS
1916 TLZ F,ISW ;FORCE NEW INIT
1918 CAIN T,LIBPNT ;WHICH ONE
1921 PRGRET: MOVE T,LODPNT ;RETURNS HERE, GET NEXT ONE
1924 PRGDON: MOVE T,LODSTP ;RESTE POINTER IN CASE MORE ON OTHER LIBS
1926 JRPRG: POPJ P,PRGRET ;PUSHED TO GET A RETURN ADDRESS
1928 PRGFIL==1 ;REL INDEX FOR FILE NAMES
1929 PRGPPN==RELLEN+1 ;AND FOR PPNS
1930 PRGDEV==2*RELLEN+1 ;AND FOR DEVICES
1931 > ;END OF IFN SAILSW
1934 SUBTTL LDDT LOADS <SYS:DDT.REL> AND SETS SYMSW
1937 IFN ALGSW,<TRNE F,ALGSW
1939 TLO N,DDSW+EXEQSW ;T - LOAD AND GO TO DDT
1941 IFN ALGSW,<TRNE F,ALGFL
1943 IFN DMNSW,< PUSH P,D ;SAVE INCASE /NNND >
1944 PUSHJ P,FSCN1 ;FORCE SCAN TO COMPLETION
1945 MOVSI W,444464 ;FILE IDENTIFIER <DDT>
1946 TLZ F,SYMSW!RMSMSW ;DON'T LOAD DDT WITH LOCAL SYMBOLS
1948 PUSHJ P,LDF ;LOAD <SYS:DDT.REL>
1949 TLO F,SYMSW!RMSMSW ;ENABLE LOADING WITH SYMBOLS
1950 IFN DMNSW,< POP P,D ;RESTORE D
1951 JRST DMN2 ;MOVE SYMBOL TABLE >
1952 IFE DMNSW,< POPJ P,>
1954 LDDT1: MOVEM W,DTIN ;STORE FILE IDENTIFIER
1955 IFN PP,<MOVE W,ILD1 ;SAVE OLD DEV
1957 MOVSI W,637163 ;DEVICE IDENTIFIER <SYS>
1958 MOVEM W,ILD1 ;STORE DEVICE IDENTIFIER
1959 TLZ F,ISW+LIBSW+SKIPSW+REWSW ;CLEAR OLD FLAGS
1960 LDDT2: MOVSI W,624554 ;EXTENSION IDENTIFIER <.REL>
1961 LDDT3: MOVEM W,DTIN1 ;STORE EXTENSION IDENTIFIER
1962 LDDT4:IFN PP,<EXCH W,PPN ;GET PROJ-PROG #
1964 EXCH W,PPN ;W MUST BE SAVED SINCE IT MAY BE USED LATER>
1968 SUBTTL EOF TERMINATES LOADING OF A FILE
1970 EOF: MOVE P,PDSAV ;RESTORE PUSHDOWN POINTER
1971 EOF1: TLZ F,SLIBSW!SKIPSW ;CLEAR ONE FILE LIB. SEARCH FLAG
1972 IFN DIDAL,<TRZ F,XFLG!LSTLOD ;CLEAR DIDAL FLAGS>
1973 EOF2: TLNE F,RMSMSW ;IF REMEMBER LOADING WITH SYMBOLS IS ON
1974 TLO F,SYMSW ;THEN RESTORE SYMBOL LOADING STATE
1977 ; FORCE SCAN TO COMPLETION, LOAD IF NECESSARY
1979 FSCN: PUSHJ P,FSCN1 ;FORCED LOAD BEFORE TEST
1980 TLNN F,FULLSW ;TEST FOR OVERLAP
1981 POPJ P, ;NO OVERLAP, RETURN
1982 MOVE W,H ;FETCH CORE SIZE REQUIRED
1983 SUBI W,1(S) ; COMPUT DEFICIENCY
1984 JUMPL W,EOF2 ;JUMP IF NO OVERLAP
1985 TLO F,FCONSW ;INSURE TTY OUTPUT
1986 PUSHJ P,PRQ ;START WITH ?
1987 PUSHJ P,PRNUM0 ;INFORM USER
1988 ERROR 7,</WORDS OF OVERLAP#/>
1989 JRST LD2 ;ERROR RETURN
1991 IFN SPCHN,<FSCN1A: TLNN F,NSW
1993 FSCN1: TLON F,FSW ;SKIP IF NOT FIRST CALL TO FSCN
1994 TLNN F,CSW+DSW+ESW ;TEST SCAN FOR COMPLETION
1996 FSCN2: PUSHJ P,LD5B1 ;STORE FILE OR EXTENSION IDENT.
1998 ; LOADER CONTROL, NORMAL MODE
2000 LDF: PUSHJ P,ILD ;INITIALIZE LOADING
2003 SUBTTL LOAD SUBROUTINE
2005 LOAD: MOVEM P,PDSAV ;SAVE PUSHDOWN POINTER
2006 IFN WFWSW,<SETZM VARLNG ;LENGTH OF VARIABLE AREA-ADDED TO RELOC>
2007 IFN ALGSW,<SETZM OWNLNG ;LENGTH OF OWN AREA-ADDED TO RELOC>
2008 IFN FAILSW,<SETZM LFTHSW ;RESET LOAD LEFT HALF FIXUP SW>
2009 LOAD1: MOVE P,PDSAV ;RESTORE PUSHDOWN POINTER
2010 LOAD1A: PUSHJ P,WORD ;INPUT BLOCK HEADER WORD
2011 MOVNI E,400000(W) ;WORD COUNT - FROM RH OF HEADER
2012 HLRZ A,W ;BLOCK TYPE - FROM LH OF HEADER
2013 IFN FAILSW,<SKIPN POLSW ;ERROR IF STILL DOING POLISH>
2014 CAIL A,DISPL*2 ;TEST BLOCK TYPE NUMBER
2015 JRST LOAD4 ;ERROR, ILLEGAL BLOCK TYPE
2016 TLNE F,SKIPSW ;BLOCK OK - TEST LOAD STATUS
2017 JRST LIB1 ;RETURN TO LIB. SEARCH CONTROL
2018 HRRZ T,LOAD2(A) ;LOAD RH DISPATCH ENTRY
2019 CAIL A,DISPL ;SKIP IF CORRECT
2020 HLRZ T,LOAD2-DISPL(A);LOAD LH DISPATCH ENTRY
2021 TLNE F,FULLSW ;TEST CORE OVERLAP INDICATOR
2022 SOJG A,HIGH0 ;IGNORE BLOCK IF NOT TYPE 1
2023 JRST @T ;DISPATCH TO BLOCK SUBROUTINE
2025 ;DISPATCH TABLE - BLOCK TYPES
2026 IFE FAILSW,<POLFIX==LOAD4A
2028 IFE WFWSW,<LVARB==LOAD4A>
2029 IFE DIDAL,<INDEX==LOAD4A>
2030 IFE ALGSW!SAILSW,<ALGBLK==LOAD4A>
2031 IFE SAILSW,<LDLIB==LOAD4A>
2033 LOAD2: XWD LOCD, BLOCK0 ;10,,0
2034 XWD POLFIX, PROG ;11,,1
2035 XWD LINK, SYM ;12,,2
2036 XWD LVARB, HISEG ;13,,3
2037 XWD INDEX, LIB30 ;14,,4
2038 XWD ALGBLK, HIGH ;15,,5
2039 XWD LDLIB, NAME ;16,,6
2040 XWD LOAD4A, START ;17,,7
2044 ;ERROR EXIT FOR BAD HEADER WORDS
2047 CAIN A,400 ;FORTRAN FOUR BLOCK
2049 LOAD4A: MOVE W,A ;GET BLOCK TYPE
2050 ERROR ,</ILL. FORMAT BLOCK TYPE !/>
2051 PUSHJ P,PRNUM ;PRINT BLOCK TYPE
2052 JRST ILC1 ;PRINT SUBROUTINE NAME
2055 SUBTTL LOAD PROGRAMS AND DATA (BLOCK TYPE 1)
2057 PROG: MOVEI V,-1(W) ;LOAD BLOCK LENGTH
2058 PUSHJ P,RWORD ;READ BLOCK ORIGIN
2059 ADD V,W ;COMPUTE NEW PROG. BREAK
2060 IFN REENT,<TLNN F,HIPROG
2061 JRST PROGLW ;NOT HIGH SEGMENT
2062 PROG3: CAMGE W,HVAL1 ;CHECK TO SEE IF IN TOP SEG
2064 MOVE T,JOBREL ;CHECK FOR OVERFLOW ON HIGH
2072 CAMG H,T ;COMPARE WITH PREV. PROG. BREAK
2075 JRST FULLC ;NO ERROR MESSAGE
2076 IFN REENT,<CAML H,HVAL1
2077 JRST COROVL ;WE HAVE OVERFLOWED THE LOW SEGMENT
2079 MOVEM T,HILOW ;HIGHEST LOW CODE LOADED INTO>
2080 CAILE H,1(S) ; SKIP IF SUFFICIENT CORE AVAILABLE
2081 IFN EXPAND,<JRST [PUSHJ P,XPAND>
2083 IFN REENT,< TLNE F,HIPROG
2084 SUBI W,2000 ;HISEG LOADING LOW SEG>
2085 IFN EXPAND,< JRST .-1]>
2087 PROG1: PUSHJ P,RWORD ;READ DATA WORD
2088 IFN TEN30,<CAIN V,41 ;CHANGE FOR 10/30 JOBDAT
2089 MOVEI V,JOB41 ;JOB41 IS DIFFERENT
2090 CAIN V,74 ;SO IS JOBDAT
2092 IFN L,<CAML V,RINITL ;CHECK FOR BAD STORE>
2093 MOVEM W,@X ;STORE DATA WORD IN PROG. AT LLC
2094 AOJA V,PROG1 ;ADD ONE TO LOADER LOC. COUNTER
2097 LOWCOR: SUB V,HIGHX ;RELOC FOR PROPER
2098 ADD V,LOWX ;LOADING OF LOW SEQMENT
2104 SUBTTL LOAD SYMBOLS (BLOCK TYPE 2)
2106 SYM: PUSHJ P,PRWORD ;READ TWO DATA WORDS
2107 PUSHJ P,SYMPT; PUT INTO TABLE
2108 IFN REENT,<PUSHJ P,RESTRX>
2111 SYMPT: TLNE C,200000 ;GLOBAL REQUEST? WFW
2112 JUMPL C,SYM3 ;CHECK FOR 60 NOT JUST HIGH BIT WFW
2114 JRST SYM1A ;LOCAL SYMBOL
2117 PUSHJ P,SREQ ;GLOBAL DEF., SEARCH FOR REQUEST
2118 JRST SYM2 ;REQUEST MATCHES
2119 PUSHJ P,SDEF ;SEARCH FOR MULTIPLE DEFINITIONS
2120 JRST SYM1 ;MULTIPLY DEFINED GLOBAL
2123 ; PROCESS MULTIPLY DEFINED GLOBAL
2125 SYM1: CAMN W,2(A) ;COMPARE NEW AND OLD VALUE
2127 AOS MDG ;COUNT MULTIPLY DEFINED GLOBALS
2128 PUSHJ P,PRQ ;START W/ ?
2129 PUSHJ P,PRNAM ;PRINT SYMBOL AND VALUE
2130 IFN RPGSW,<MOVE W,JOBERR ;RECORD THIS AS AN ERROR
2133 MOVE W,2(A) ;LOAD OLD VALUE
2134 PUSHJ P,PRNUM ;PRINT OLD VALUE
2135 ERROR 7,</MUL. DEF. GLOBAL IN PROG. !/>
2136 MOVE C,SBRNAM ;GET PROGRAM NAME
2137 PUSHJ P,PRNAME ;PRINT R-50 NAME
2139 POPJ P, ;IGNORE MUL. DEF. GLOBAL SYM
2144 SYM1A: TLNN F,SYMSW ;SKIP IF LOAD LOCALS SWITCH ON
2145 POPJ P,; IGNORE LOCAL SYMBOLS
2146 SYM1B: CAIL H,(S) ;STORE DEFINED SYMBOL
2147 IFN EXPAND,< PUSHJ P,XPAND7>
2148 IFE EXPAND,< JRST SFULLC>
2150 TLNE N,F4SW; FORTRAN FOUR REQUIRES A BLT
2151 PUSHJ P,MVDWN; OF THE TABLES>
2152 MOVEI A,-2(S) ;LOAD A TO SAVE INST. AT SYM2
2153 SYM1D: SUBI S,2; UPDATE UNDEFINED POINTER
2154 POP B,2(A) ;MOVE UNDEFINED VALUE POINTER
2155 POP B,1(A) ;MOVE UNDEFINED SYMBOL
2156 MOVEM W,2(B) ;STORE VALUE
2157 MOVEM C,1(B) ;STORE SYMBOL
2161 ; GLOBAL DEFINITION MATCHES REQUEST
2163 SYM2: PUSH P,SYM2C ;NEXT MUST BE A SUBROUTINE FOR LATER, SET RETURN
2164 SYM2B: MOVE V,2(A) ;LOAD REQUEST POINTER
2166 JUMPL V,SYM2W ;ADDITIVE REQUEST? WFW
2167 PUSHJ P,SYM4A ;REPLACE CHAIN WITH DEFINITION
2168 SYM2W1: PUSHJ P,SREQ ;LOOK FOR MORE REQUESTS FOR THIS SYMBOL
2169 JRST SYM2B ;FOUND MORE
2170 MOVE A,SVA ;RESTORE A
2171 SYM2C: POPJ P,SYM1D ;RETURN, SEE SYM2 FOR USE OF ADDRESS
2173 ; REQUEST MATCHES GLOBAL DEFINITION
2175 SYM2A: MOVE V,W ;LOAD POINTER TO CHAIN
2176 MOVE W,2(A) ;LOAD VALUE
2177 JUMPL V,FIXWP ;HANDLE ATTITIVE REQUEST WFW
2180 ; PROCESS GLOBAL REQUEST
2182 SYM3: TLNE C,040000; COMMON NAME
2184 TLC C,640000; PERMUTE BITS FROM 60 TO 04
2185 PUSHJ P,SDEF ;SEARCH FOR GLOBAL DEFINITION
2186 JRST SYM2A ;MATCHING GLOBAL DEFINITION
2187 JUMPL W,SYM3X1 ;ADDITIVE FIXUP WFW
2188 PUSHJ P,SREQ ;SEARCH FOR EXISTING REQUEST WFW
2189 JRST SYM3A ;EXISTING REQUEST FOUND WFW
2190 SYM3X1: TLNN W,100000 ;CHECK SYMBOL TABLE FIXUP
2192 MOVE V,1(B) ;MUST BE LAST SYMBOL DEFINED. GET SYMBOL
2193 XOR V,W ;CHECK FOR IDENTITY
2194 TDNE V,[XWD 77777,-1] ;BUT IGNORE HIGH 3 BITS
2195 POPJ P, ;NOT SAME, ASSUME NOT LOADED LOCAL
2196 HRRI W,2(B) ;GET LOCATION IN RIGHT HALF
2198 SUB W,HISTRT ;AND MAKE RELATIVE
2199 IFN FAILSW,<TLZ W,040000>
2200 SYM3X2: CAIL H,(S) ;STORE REQUEST IN UNDEF. TABLE WFW
2201 IFN EXPAND,< PUSHJ P,XPAND7>
2202 IFE EXPAND,< JRST SFULLC>
2204 TLNE N,F4SW; FORTRAN FOUR
2205 PUSHJ P,MVDWN; ADJUST TABLES IF F4>
2206 SUB S,SE3 ;ADVANCE UNDEFINED POINTER
2207 MOVEM W,2(S) ;STORE UNDEFINED VALUE POINTER
2208 MOVEM C,1(S) ;STORE UNDEFINED SYMBOL
2213 ; COMBINE TWO REQUEST CHAINS
2215 SYM3A: SKIPL 2(A) ;IS IT ADDITIVE WFW
2216 JRST SYM3A1 ;NO, PROCESS WFW
2217 SYM3A4: PUSHJ P,SDEF2 ;YES, CONTINUE WFW
2218 JRST SYM3A ;FOUND ANOTHER WFW
2219 JRST SYM3X2 ;REALLY NO CHAIN THERE WFW
2220 SYM3A1: SKIPE V,2(A) ;IF ADDRESS OF CHAIN IS 0, THROW IT AWAY
2221 JRST SYM3A2 ;AND USE THE NEW ONE, ELSE ADD THE CHAINS
2222 MOVEM W,2(A) ;W IS ADDRESS OF NEW CHAIN,STORE ON TOP OF OLD 0
2227 IFN L,<CAMGE V,RINITL
2229 IFN REENT,<CAMGE V,HVAL1
2232 HRRZ A,@X ; LOAD NEXT ADDRESS IN CHAIN
2233 JUMPN A,SYM3B ; JUMP IF NOT THE LAST ADDR. IN CHAIN
2234 HRRM W,@X ;COMBINE CHAINS
2237 ;WFW PATCH FOR ADDITIVE GLOBAL REQUESTS
2239 FIXWP: TLNN V,100000 ;CHECK FOR SYMBOL TABLE FIXUP
2241 MOVE T,1(B) ;SYMBOL FIXUP, MUST BE LAST SYMBOL DEFINED
2242 XOR T,V ;CHECK FO SAME
2243 TDNE T,[XWD 77777,-1] ;EXCEPT FOR HIGH CODE BITS
2244 POPJ P, ;ASSUME NON-LOADED LOCAL
2245 HRRI V,2(B) ;GET LOCATION
2246 SUBI V,(X) ;SO WE CAN USE @X
2248 FIXW: IFN REENT,<HRRZ T,V
2255 FIXW1: TLNE V,200000 ;IS IT LEFT HALF
2258 ADD T,W ;VALUE OF GLOBAL
2259 HRRM T,@X ;FIX WITHOUT CARRY
2260 MOVSI D,200000 ;SET UP TO REMOVE DEFERED INTERNAL IF THERE
2264 FIXWL: HRLZ T,W ;UPDATE VALUE OF LEFT HALF
2265 ADDM T,@X ;BY VALUE OF GLOBAL
2266 MOVSI D,400000 ;LEFT DEFERED INTERNAL
2267 SYMFIX: TLNN V,100000 ;CHECK FOR SYMBOL TABLE FIXUP
2269 ADDI V,(X) ;GET THE LOCATION
2270 SYMFX1: MOVE T,-1(V) ;GET THE SYMBOL NAME
2271 TLNN T,40000 ;CHECK TO SEE IF INTERNAL
2273 ANDCAB D,-1(V) ;REMOVE PROPER BIT
2274 TLNE D,600000 ;IS IT STILL DEFERED?
2275 POPJ P, ;YES, ALL DONE
2276 EXCH C,D ;NO, CHECK FOR A REQUEST FOR IT
2278 JRST CHNSYM ;YES, WILL HAVE TO CALL THE FIXUP ROUTINE
2279 MOVE C,D ;GET C BACK
2281 CHNSYM: PUSH P,D ;HAS THE OLD C IN IT
2282 PUSH P,W ;WE MAY NEED IT LATER
2283 MOVE W,(V) ;GET VALUE
2284 PUSHJ P,SYM2B ;CALL THE FOUND GLOBAL TO MATCH REQUEST ROUTINE
2286 POP P,C ;RESTORE FOR CALLER
2287 POPJ P, ;AND GO AWAY
2290 TLNE V,40000 ;CHECK FOR POLISH
2292 TLNN V,100000 ;SYMBOL TABLE?
2294 ADD V,HISTRT ;MAKE ABSOLUTE
2295 SUBI V,(X) ;GET READY TO ADD X
2298 SYM2WA: PUSHJ P,FIXW ;DO FIXUP
2299 JRST SYM2W1 ;AND LOOK FOR MORE REQUESTS
2304 ;PATCH VALUES INTO CHAINED REQUEST
2306 SYM4: IFN L,<CAMGE V,RINITL
2308 IFN REENT,<CAMGE V,HVAL1
2311 HRRZ T,@X ;LOAD NEXT ADDRESS IN CHAIN
2312 HRRM W,@X ;INSERT VALUE INTO PROGRAM
2314 SYM4A: JUMPN V,SYM4 ;JUMP IF NOT LAST ADDR. IN CHAIN
2319 IFN EXPAND,< SUBI T,2>
2320 CAIG T,(H); ANY ROOM LEFT?
2321 IFN EXPAND,< JRST [PUSHJ P,XPAND>
2323 IFN EXPAND,< JRST MVDWN
2325 TLNE F,SKIPSW+FULLSW
2328 ADDM T,PLTP; ADJUST PROGRAMMER LABEL POINTER
2329 ADDM T,BITP; AND BIT TABLE POINTER
2330 ADDM T,SDSTP; FIRST DATA STATEMENT
2335 ADDB T,MLTP; AND FINALLY TO MADE LABEL TABLE
2336 HRLS T; SET UP BLT POINTER
2343 SUBTTL HIGH-SEGMENT (BLOCK TYPE 3)
2344 ;THIS PROGRAM IS INTENDED FOR HI SEGMENT IF RUNNING ON A PDP-10.
2345 ; THIS BLOCK TYPE OCCURS AFTER ENTRY AND NAME BLOCKS.
2347 HISEG: PUSHJ P,WORD ;GOBBLE UP A WORD.
2348 JUMPE W,HISEG2 ;MACRO V36
2349 PUSHJ P,WORD ;GET THE OFSET
2350 IFE REENT,<HISEG2==LOAD1A
2351 JUMPGE W,LOAD1A ;NOT TWO SEG PROG.>
2352 IFN REENT,<JUMPE W,HISEG2 ;IGNORE ZERO
2353 JUMPG W,HISEG3 ;NEG. IF TWOSEG PSEUDO-OP>
2354 TRO F,TWOFL ;SET FLAG
2356 TRNE F,NOHI!NOHI6 ;TWO SEGMENTS LEGAL?
2357 JRST ONESEG ;LOAD AS ONE SEGMENT
2358 HISEG3: HRRZ D,W ;GET START OF HISEG
2359 JUMPE D,.+2 ;NOT SPECIFIED
2360 PUSHJ P,HCONT ;AS IF /H
2361 HISEG2: PUSHJ P,HISEG1
2362 JRST LOAD1 ;GET NEXT BLOCK
2363 FAKEHI: ;AS IF BLOCK TYPE 3
2364 HISEG1: TRNE F,NOHI!NOHI6 ;LOAD REENT?
2366 TLOE F,HIPROG ;LOADING HI PROG
2367 POPJ P, ;IGNORE 2'ND HISEG
2368 TRON F,SEENHI ;HAVE WE LOADED ANY OTHER HI STUFF?
2369 PUSHJ P,SETUPH ;NO,SET UP HI SEG.
2372 HRRM R,2(N) ;CALL THIS THE START OF THE PROGRAM
2375 SETUPH: MOVE X,HVAL1
2376 CAIGE X,-1 ;SEE IF IT HAS BEEN CHANGED FROM ORIG
2377 JRST SEENHS ;YES, MUST HAVE SEEN /H
2380 CAIG X,(H) ;HAVE WE RUN OVER WITH THE LOW SEG
2396 SETSEG: TRZ F,NOHI!SEGFL ;ALLOW HI-SEG
2397 JUMPL D,.+2 ;/-H TURNS OFF NOHI ONLY
2398 TRO F,SEGFL ;/1H FORCES HI
2402 ONESEG: HLRZ D,W ;GET LENGTH OF HISEG
2403 SUBI D,(W) ;REMOVE OFSET
2404 JUMPLE D,TWOERR ;LENGTH NOT AVAILABLE
2405 MOVEM R,LOWR ;SAVE LOW SEGMENT RELOCATION
2406 ADDM D,LOWR ;ADD TO LOW SEG RELOCATION
2407 HRRZM W,HVAL1 ;SO RELOC WILL WORK
2408 JRST LOAD1 ;GET NEXT BLOCK
2410 TWOERR: ERROR 7,</TWO SEGMENTS ILLEGAL#/>
2414 SUBTTL HIGHEST RELOCATABLE POINT (BLOCK TYPE 5)
2415 SFULLC: TLOE F,FULLSW ;PREVIOUS OVERFLOW?
2416 JRST FULLC ;YES, DON'T PRINT MESSAGE
2417 ERROR ,<?SYMBOL TABLE OVERLAP#?>
2418 FULLC: TLO F,FULLSW ;CORE OVERLAP ERROR RETURN
2421 JRST LIB3 ;LOOK FOR MORE
2422 HIGH2: PUSHJ P,RWORD ;GET HISEG BREAK
2423 TRZ F,TWOFL ;CLEAR FLAG NOW
2424 IFE REENT,< MOVE R,LOWR
2426 IFN REENT,< TRNE F,NOHI!NOHI6 ;SINGLE SEGMENT LOAD?
2427 JRST [MOVE R,LOWR ;YES,GET LARGER RELOC
2428 MOVE W,HVAL ;ORIGINAL VALUE
2429 MOVEM W,HVAL1 ;RESET
2430 JRST HIGH2A] ;CONTINUE AS IF LOW ONLY
2431 HRR R,W ;PUT BREAK IN R
2435 MOVE R,LOWR ;NEXT WORD IS LOW SEG BREAK
2436 TLZ F,HIPROG ;CLEAR HIPROG
2437 PUSHJ P,PRWORD ;GET WORD PAIR
2438 HRR R,C ;GET LOW SEG BREAK
2439 MOVEM R,LOWR ;SAVE IT
2440 MOVE R,HIGHR ;GET HIGH BREAK
2441 JRST HIGHN3 ;AND JOIN COMMON CODE>
2443 HIGH0: CAIE A,4 ; TEST FOR END BLOCK (OVERLAP)
2446 HIGH: TRNE F,TWOFL ;IS THIS A TWO SEGMENT PROGRAM?
2448 HIGH2A: PUSHJ P,PRWORD ;READ TWO DATA WORDS.
2449 IFN REENT,< TLZE F,HIPROG
2451 IFN WFWSW,<ADD C,VARLNG ;IF LOW SEG THEN VARIABLES GO AT END>
2452 IFN ALGSW,<ADD C,OWNLNG ;ADD IN LENGTH OF OWN BLOCK>
2453 HRR R,C ;SET NEW PROGRAM BREAK
2454 CAMGE C,W ;CHECK 2ND WORD (LOC PROG BRK IF PRESENT)
2458 MOVEI H,(C) ;SET UP H
2459 CAILE H,1(S) ;TEST PROGRAM BREAK
2460 IFN EXPAND,<PUSHJ P,[ PUSHJ P,XPAND
2464 IFE EXPAND,<TLO F,FULLSW>
2467 IFN REENT,<TRNE F,NOHI!NOHI6 ;ONE SEGMENT PROGRAM?
2469 HRLZ W,HIGHR ;GET HIGH PROG BREAK
2470 JUMPE W,[HRRZ W,R ;NO HIGH SEGMENT YET
2471 JRST .+2] ;SO USE LOW RELOCATION ONLY
2472 HRR W,LOWR ;GET LOW BREAK
2473 SETZ C, ;ZERO SYMBOL NAME
2474 PUSHJ P,SYM1B ;PUT IN SYMBOL TABLE
2475 MOVEM S,F.C+S ;SAVE NEW S AND B
2476 MOVEM B,F.C+B ;INCASE OF ERROR
2478 TLZ F,NAMSSW ;RELAX, RELOCATION BLOCK FOUND
2479 TLNE F,SLIBSW+LIBSW ;NORMAL MODE EXIT THROUGH LOAD1
2480 JRST LIB ;LIBRARY SEARCH EXIT
2484 HIGHN1: CAMLE R,HVAL
2487 HIGHN3: PUSH P,W ;SAVE W,CONTAIN HIGHEST ABSOLUTE ADDRESS
2488 ADD W,LOWX ;LOC PROG BRK
2489 CAIGE H,(W) ;CHECK FOR TOP OF LOW CORE
2493 JRST COROVL ;OVERFLOW OF LOW SEGMENT
2503 IFN WFWSW,<ADD R,VARLNG ;VARIABLES IN LOW SEG>
2504 IFN ALGSW,<ADD R,OWNLNG ;OWN BLOCK IN LOW SEGMENT>
2506 CAIGE C,(W) ;IS ABSOLUTE LOCATION GREATER
2510 HRRZ C,R ;SET UP C AGAIN
2511 JRST HIGH31 ;GO CHECK PROGRAM BREAK
2514 SUBTTL EXPAND HIGH SEGMENT
2516 HIEXP: TLNE F,FULLSW
2518 IFN EXPAND,<PUSH P,Q>
2529 IFE EXPAND,<POPJ P,>
2530 IFN EXPAND,<HRRZ N,JOBREL
2539 MOVHI: MOVEI N,-2000(X)
2545 IFN EXPAND,<JRST XPAND8>
2546 IFE EXPAND,<ADDM H,HISTRT
2553 SUBI N,2000 ;ADJUST POINTER TO NAME
2576 SUBTTL PROGRAM NAME (BLOCK TYPE 6)
2578 NAME: TLOE F,NAMSSW ;HAVE WE SEEN TWO IN A ROW?
2579 JRST NAMERR ;YES, NO END BLOCK SEEN
2580 PUSHJ P,PRWORD ;READ TWO DATA WORDS
2581 MOVEM C,SBRNAM ;SAVE SUBROUTINE NAME
2582 NCONT: HLRE V,W ;GET COMPILER TYPE
2585 CAIGE V,CMPLEN-CMPLER ;ONLY IF LEGAL TYPE
2586 XCT CMPLER(V) ;DO SPECIAL FUNCTION
2587 TLOE N,COMFLG ;SKIP IF COMMON NOT PREV. SET
2588 JRST NAME1 ;SIZE OF COMMON PREV. SET
2589 MOVEM W,COMSAV ;STORE LENGTH OF COMMON
2590 JUMPE W,NAME2 ;JUMP IF NO COMMON IN THIS JOB
2591 HRRI R,@R ;FIRST PROGRAM SET LOAD ORIGIN
2592 NAME1: CAILE H,-1(S) ;TEST FOR AVAIL. SYMBOL SPACE
2593 IFN EXPAND,< PUSHJ P,XPAND7>
2594 IFE EXPAND,< JRST SFULLC>
2595 SUBI S,2 ;UPDATE UNDEF. TABLE POINTER
2598 HRRZ V,N ;POINTER TO PREVIOUS NAME
2599 SUBM B,V ;COMPUTE RELATIVE POSITIONS
2600 HRLM V,2(N) ;STORE FORWARD POINTER
2601 HRR N,B ;UPDATE NAME POINTER
2602 NAME2: MOVEM C,1(B) ;STORE PROGRAM NAME
2603 HRRZM R,2(B) ;STORE PROGRAM ORIGIN
2604 CAMG W,COMSAV ;CHECK COMMON SIZE
2605 IFE REENT,<JRST LIB3 ;COMMON OK>
2606 IFN REENT,<JRST [TRNE F,SEGFL ;LOAD LOW IN HI-SEG
2610 ILC: MOVE C,1(A) ;NAME
2611 PUSH P,C ;SAVE COMMON NAME
2612 ERROR ,</ILL. COMMON !/>
2617 ERROR 0,</ PROG. !/>
2618 MOVE C,SBRNAM ;RECOVER SUBROUTINE NAME
2620 ILC2: ERROR 0,</ #/>
2623 NAMERR: SETZM DTIN ;CLEAR WRONG FILE NAME FOR MESSAGE
2624 ERROR ,</NO END BLOCK !/>
2629 ;COMPILER TYPE - DO SPECIAL FUNCTION FOR IT
2631 DEFINE CTYPE (CONDITION,TRUE,FALSE)
2632 <IFN CONDITION,<TRUE>
2633 IFE CONDITION,<FALSE>>
2635 CMPLER: CTYPE 1,JFCL,JFCL ;0 MACRO
2636 CTYPE K-1,<TRO F,F4FL>,JFCL ;1 FORTRAN
2637 CTYPE 1,<TRO F,COBFL>,JFCL ;2 COBOL
2638 CTYPE ALGSW,<PUSHJ P,ALGNAM>,JFCL ;3 ALGOL
2645 SUBTTL STARTING ADDRESS (BLOCK TYPE 7)
2648 START: PUSHJ P,PRWORD ;READ TWO DATA WORDS
2649 TLNN N,ISAFLG ;SKIP IF IGNORE SA FLAG ON
2650 HRRZM C,STADDR ;SET STARTING ADDRESS
2652 MOVE W,DTIN ;PICK UP BINARY FILE NAME
2654 MOVEM W,PRGNAM ;SAVE IT
2655 MOVE W,1(N) ;SET UP NAME OF THIS PROGRAM
2656 TLNN N,ISAFLG ;DONT SET NAME IF IGNORING SA'S
2658 PUSHJ P,PRWORD ;**OBSCURE RETURN TO LOAD1**
2661 RESTRX: TLNE F,HIPROG
2667 SUBTTL ONE PASS LOCAL DEFINITION (BLOCK TYPE 10)
2669 ;PMP PATCH FOR LEFT HALF FIXUPS
2671 LOCDLH: IFN L,<CAMGE V,RINITL
2673 IFN REENT,<CAMGE V,HVAL1
2676 HLRZ T,@X ;LOAD NEXT ADDRESS IN CHAIN
2677 HRLM W,@X ;INSERT VALUE INTO PROGRAM
2679 LOCDLF: JUMPN V,LOCDLH ;JUMP IF NOT LAST ADDR. IN CHAIN
2682 LOCDLI: PUSHJ P,LOCDLF
2683 IFN REENT,<PUSHJ P,RESTRX>
2684 AOSA LFTHSW ;TURN OFF LEFT HALF FIX SW (WAS -1) AND SKIP
2685 LOCDLG: SETOM LFTHSW ;TURN ON LEFT HALF FIX SW>
2687 LOCD: PUSHJ P,RWORD ;READ ONE DATA WORD
2688 HLRZ V,W ;STORAGE POINTER IN LEFT HALF
2690 SKIPE LFTHSW ;LEFT HALF CHAINED? PMP
2691 JRST LOCDLI ;YES PMP
2692 CAMN W,[-1] ;LEFT HALF NEXT? PMP
2693 JRST LOCDLG ;YES, SET SWITCH PMP>
2694 PUSHJ P,SYM4A ;LINK BACK REFERENCES
2695 IFN REENT,<PUSHJ P,RESTRX>
2699 SUBTTL LVAR FIX-UP (BLOCK TYPE 13)
2701 LVARB: PUSHJ P,PRWORD ;THE FIRST TWO WORDS IN THE BLOCK
2702 MOVEM W,VARLNG ;AR SPECIAL. SECOND IS LENGTH OF VARIABLES
2703 IFN REENT,< TLNE F,HIPROG
2704 MOVE C,LOWR ;USE LOW RELOC IF LOADING HI SEG>
2705 ;ELSE C HAS RELOC FOR THIS PROGRAM, USE IT
2706 HRRZM C,VARREL ;THIS IS LOCATION 0 OF VARIABLE AREA
2707 LVLP: PUSHJ P,PRWORD ;THINGS COME IN PAIRS
2708 TLNE C,200000 ;BIT ON IF SYMBOL TABLE FIXUP
2710 HLRZ V,W ;NO GET LOC FROM LEFTH HALF OF SECOND
2711 ADD W,VARREL ;AND RELOCATE VARIABLE
2712 TLNE C,400000 ;ON FOR LEFT HALF
2713 JRST [PUSHJ P,LOCDLF ;TAKE CARE OF IT
2714 IFN REENT,< JRST LVLCOM] ;RESET X>
2715 IFN REENT,< JRST LVLP] ;MUST BE LOW SEG X OK>
2716 PUSHJ P,SYM4A ;RIGHT HALF CHAIN
2717 IFN REENT,<LVLCOM: PUSHJ P,RESTRX>
2719 LVSYM: MOVE V,B ;GET SYMBOL TABLE POINTER
2720 ADD C,VARREL ;VALUE IS IN FIRST WORD FOR THESE
2721 TLZ W,740000 ;MAKE SURE NO BITS ON
2722 ADDI V,2 ;CORRECT POINTER TO SYMBOL TABLE
2723 SRSYM: MOVE A,-1(V) ;GET A NAME
2724 TLZN A,740000 ;CHECK FOR PROGRAM NAME
2725 JRST LVLP ;LEAVE (PROBABLY A NON-LOADED LOCAL)
2726 CAMN A,W ;IS IT THE RIGHT ONE??
2728 ADD V,SE3 ;CHECK NEXT ONE
2729 JUMPL V,SRSYM ;BUT ONLY IF SOME ARE THERE
2731 LVSYMD: TLNE C,400000 ;WHICH HALF??
2733 ADD C,(V) ;ADDITIVE FIXUP
2735 MOVSI D,200000 ;DEFERED BITS
2736 LVSM1: PUSHJ P,COMSFX ;GO TAKE CARE OF IT
2737 JRST LVLP ;NEXT PLEASE
2739 ADDM C,(V) ;WE DON'T HAVE TO WORRY ABOUT OVERFLOW HERE
2740 MOVSI D,400000 ;LEFT DEFERED BITS
2741 JRST LVSM1 ;GO WORRY ABOUT DEFERED INTERNALS>
2745 ;ONLY LIST IF FAILSW=1
2748 REPEAT 0,<IF POLISH FIXUPS CONTAIN GLOBAL REQUESTS WHICH
2749 CAN NOT BE SATISFIED WHEN THEY ARE SEEN, THEY MUST BE
2750 SAVED UNTIL THESE GLOBAL SYMBOLS BECOME DEFINED.
2751 THE POLISH FIXUP IS SAVED IN THE UNDEFINED TABLE (POINTED
2752 TO BY S). THE FIXUP IS SAVED IN TWO WORD BLOCKS THE FIRST
2753 WORD OF WHICH (THE ONE WHICH WOULD NORMALL CONTAIN THE SYMBOL)
2754 HAS SPECIAL BITS ON SO IT WILL NOT BE FOUND BY A SEARCH FOR
2755 A GLOBAL REQUEST. SINCE THE UNDEFINED TABLE MAY BE
2756 SHUFFELED INTO A RANDOM ORDER, IT IS NOT POSSIBLE TO KEEP
2757 ALL OF A POLISH FIXUP TOGETHER OR TO HAVE POINTERS IN
2758 THE USUAL SENCE FROM ONE TWO WORD BLOCK TO ANOTHER.
2759 SUFFICIENT INFORMATION IS THEREFORE GIVEN TO DETERMINE
2760 WHAT THE FIRST WORD OF THE NEXT DESIRED BLOCK IS AND THIS
2761 BLOCK IS FOUND BY SEARCHING THE UNDEFINED TABLE FOR A MATCH.
2762 EACH POLISH FIXUP WHICH IS ENTERED INTO THE UNDEFINED
2763 TABLE IS GIVEN A UNIQUE NUMBER CALLED THE "HEAD NUMBER".
2764 EACH ELEMENT OF THE FIXUP (EITHER OPERAND OR OPERATOR)
2765 IS ASSIGNED A NUMBER CALLED THE "OP NUMBER". THUS
2766 THE OP NUMBER AND HEAD NUMBER TOGETHER DETERMINE
2767 A SPECIFIC ELEMENT OF A SPECIFIC FIXUP. EACH ELEMENT
2768 (TWO WORD BLOCK) IS ARRANGED AS FOLLOWS:
2770 BITS 0-4 THESE ARE THE USUAL CODE BITS OF A RADIX50
2771 SYMBOL AND CONTAIN 44 TO DISTINGUISH
2772 AN ELEMENT OF A POLISH FIXUP FROM OTHER
2773 SYMBOLS IN THE UNDEFINED TABLE
2774 BITS 5-17 THE HEAD NUMBER OF THIS FIXUP
2775 BITS 18-30 THE OP NUMBER OF THIS ELEMENT
2776 BITS 31-35 THE OPERAND FOR THIS ELEMENT
2777 OPERAND 2 INDICATES A WORD OF DATA
2779 IF THE OPERAND IS 2 THIS WORD CONTAINS THE DATA
2781 IF THIS IS NOT A DATA OPERATOR THEN THE LEFT AND
2782 RIGHT HALVES OF THIS WORD POINT TO THE TWO OPERANDS
2783 THE CONTENTS OF THE HALF WORD IS THE RIGHT HALF
2784 OF THE FIRST WORD OF THE BLOCK POINTED
2785 TO. THUS THE LEFT HALF OF THE FIRST WORD COMBINED
2786 WITH ONE OF THESE HALF WORDS IS THE FIRST WORD
2787 OF THE BLOCK POINTED TO AND CAN BE FOUND BY SEARCHING
2789 EACH FIXUP ALSO HAS A HEADER BLOCK. THIS BLOCK CONTAINS THE
2790 FOLLOWING INFORMATION:
2794 BITS 22-35 THE HEAD NUMBER OF THIS FIXUP
2797 BITS 0-17 A COUNT OF THE NUMBER OF UNDEFINED
2798 GLOBALS REMAINING IN THIS FIXUP
2799 BITS 18-35 A HALF WORD POINTER OF THE
2800 SAME TYPE FOUND IN OTHER ELEMENTS POINTING
2801 TO THE FIRST ELEMENT OF POLISH
2802 WHICH WILL BE THE STORE OPERATOR
2804 THE REQUESTS FOR THE GLOBAL SYMBOLS NEEDED BY THE FIXUP ARE
2809 BITS 5-35 RADIX 50 FOR THE NAME OF THE SYMBOL
2812 (NOTE THIS IS JUST A STANDARD GLOBAL REQUEST)
2815 BITS 0-4 44 (THIS IDENTIFIES IT AS "ADITIVE TYPE"
2816 AND BIT 4 INDICATES POLISH)
2817 BITS 5-17 THE HEAD NUMBER OF THE FIXUP
2818 (THIS GIVES ENOUGH INFORMATION TO FIND THE HEADER
2819 BLOCK AND UPDATE THE COUNT WHEN THE REQUEST IS
2823 BITS 18-35 A HALF WORD POINTER TO THE ELEMENT OF THE
2824 FIXUP INTO WHICH THE VALUE OF
2827 THE SYMBOL SHOULD BE STORED
2832 ;POLISH FIXUPS <BLOCK TYPE 11>
2834 PDLOV: SKIPE POLSW ;PDL OV ARE WE DOING POLISH?
2836 ERROR ,</PUSHDOWN OVERFLOW#/>
2838 COMPOL: ERROR ,</POLISH TOO COMPLEX#/>
2842 ;READ A HALF WORD AT A TIME
2844 RDHLF: TLON N,HSW ;WHICH HALF
2846 PUSHJ P,RWORD ;GET A NEW ONE
2847 TLZ N,HSW ;SET TO READ OTEHR HALF
2848 MOVEM W,SVHWD ;SAVE IT
2849 HLRZS W ;GET LEFT HALF
2851 NORD: HRRZ W,SVHWD ;GET RIGHT HALF
2855 POLFIX: MOVE D,[IOWD PPDL,PPDB] ;SET UP THE POLISH PUSHDOWN LIST
2856 MOVEI V,100 ;IN CASE OF ON OPERATORS
2858 SETOM POLSW ;WE ARE DOING POLISH
2859 TLO N,HSW ;FIX TO READ A WORD THE FIRST TIME
2860 SETOM GLBCNT ;NUMBER OF GLOBALS IN THIS FIXUP
2861 SETOM OPNUM ;NUMBER OF OPERANDS AND OPERATORS THIS FIXUP
2862 PUSH D,[15] ;FAKE OPERATOR SO STORE WILL NOT HACK
2864 RPOL: PUSHJ P,RDHLF ;GET A HLAF WORD
2865 TRNE W,400000 ;IS IT A STORE OP?
2866 JRST STOROP ;YES, DO IT
2867 IFN WFWSW,<CAIN W,15
2868 JRST [PUSHJ P,RDHLF ;THIS TRICK FOR VARIABLES
2869 ADD W,VARREL ;HOPE SOMEONE HAS DONE
2870 HRRZ C,W ;A BLOCK TYPE 13
2872 CAIGE W,3 ;0,1,2 ARE OPERANDS
2874 CAILE W,14 ;14 IS HIGHEST OPERATOR
2875 JRST LOAD4A ;ILL FORMAT
2876 PUSH D,W ;SAVE OPERATOR IN STACK
2877 MOVE V,DESTB-3(W) ;GET NUMBER OF OPERANDS NEEDED
2878 MNVEM V,SVSAT ;ALSO SAVE IT
2879 JRST RPOL ;BACK FOR MORE
2883 ;HANDLE OPERANDS. THIS GETS COMPLICATED BECAUSE OF THE PRESENCE OF
2886 OPND: MOVE A,W ;GET THE OPERAND TYPE HERE
2887 PUSHJ P,RDHLF ;THIS IS AT LEAST PART OF THE OPERAND
2888 MOVE C,W ;GET IT INTO C
2889 JUMPE A,HLFOP ;0 IS HALF-WORD OPERAND
2890 PUSHJ P,RDHLF ;NEED FULL WORD, GET SECOND HALF
2891 HRL C,W ;GET HALF IN RIGHT PLACE
2892 MOVSS C ;WELL ALMOST RIGHT
2893 SOJE A,HLFOP ;1 IS FULL WORD, 2 IS GLOBAL REQUEST
2894 PUSHJ P,SDEF ;SEE IF IT IS ALREADY DEFINED
2895 JRST [MOVE C,2(A) ;YES, WE WIN
2897 AOSN GLBCNT ;NO, INCREMENT NUMBER OF GLOBALS THIS FIXUP
2898 AOS HEADNM ;INCREMENT FIXUP NUMBER IF FIRST GLOBAL
2899 AOS W,OPNUM ;GET AN OPERAND NUMBER
2900 LSH W,5 ;SPACE FOR TYPE
2901 IORI W,2 ;TYPE 2 IS GLOBAL
2902 HRL W,HEADNM ;GET FIXUP NUMBER
2903 PUSHJ P,SYM3X2 ;AND PUT INTO UDEFINED AREA ALONG WITH NAME
2904 MOVE C,W ;ALSO PUT THAT PART OF THE FIXUP IN
2906 SKIPA A,[400000] ;SET UP GLOBAL FLAG
2907 HLFOP: MOVEI A,0 ;VALUE OPERAND FLAG
2908 HLFOP1: SOJL V,CSAT ;ENOUGH OPERANDS SEEN?
2909 PUSH D,C ;NO, SAVE VALUE(OR GLOBAL NAME)
2910 HRLI A,400000 ;PUT IN A VALUE MARKER
2911 PUSH D,A ;TO THE STACK
2912 JRST RPOL ;GET MORE POLISH
2916 ;HAVE ENOUGH OPERANDS FOR THE CURRENT OPERATOR
2918 CSAT: HRRZS A ;KEEP ONLY THE GLOBAL-VALUE HALF
2919 SKIPN SVSAT ;IS IT UNARY
2920 JRST UNOP ;YES, NO NEED TO GET 2ND OPERAND
2921 HRL A,(D) ;GET GLOBAL VALUE MARKER FOR 2ND OP
2923 POP D,W ;VALUE OR GLOBAL NAME
2924 UNOP: POP D,V ;OPERATOR
2925 JUMPN A,GLOB ;IF EITHER IS A GLOBAL HANDLE SPECIALLY
2926 XCT OPTAB-3(V) ;IF BOTH VALUES JUST XCT
2927 MOVE C,W ;GET THE CURRENT VALUE
2928 SETSAT: SKIPG V,(D) ;IS THERE A VALUE IN THE STACK
2929 MOVE V,-2(D) ;YES, THIS MUST BE THE OPERATOR
2930 MOVE V,DESTB-3(V) ;GET NUMBER OF OPERANDS NEEDED
2931 MOVEM V,SVSAT ;SAVE IT HERE
2932 SKIPG (D) ;WAS THERE AN OPERAND
2933 SUBI V,1 ;HAVE 1 OPERAND ALREADY
2934 JRST HLFOP1 ;GO SEE WHAT WE SHOULD DO NOW
2937 GLOB: TRNE A,-1 ;IS IT IN RIGHT HALF
2938 JRST TLHG ;NO, NEED TO PUT THIS VALUE INTO THE FIXUP LIST
2939 PUSH P,W ;SAVE FOR A WHILE
2941 AOS C,OPNUM ;GET AN OPERAND NUMBER
2942 LSH C,5 ;AND PUT IN TYPE
2943 IORI C,2 ;VALUE TYPE
2944 HRL C,HEADNM ;THE FIXUP NUMBER
2946 POP P,W ;RETRIEVE THE OTHER VALUE
2947 TLHG: SKIPE SVSAT ;WAS THIS A UNARY OPERATOR
2948 TLNE A,-1 ;WAS THERE A GLOBAL IN LEFT HALF
2950 PUSH P,C ;SAVE THE FIRST OPERAND
2951 AOS C,OPNUM ;SEE ABOVE
2959 GLSET: EXCH C,W ;GET THEM IN THE OTHER ORDER
2960 HRL W,C ;SET UP THE OPERATOR LINK
2962 LSH C,5 ;SPACE FOR THYPE
2963 IOR C,V ;THE OPERATOR
2965 PUSHJ P,SYM3X2 ;INTO THE UNDEF LIST
2966 MOVEI A,400000 ;SET UP AS A GLOBAL VALUE
2967 JRST SETSAT ;AND SET UP FOR NEXT OPERATOR
2970 ;FINALLY WE GET TO STORE THIS MESS
2972 STOROP: MOVE T,-2(D) ;THIS SHOULD BE THE FAKE OPERATOR
2974 JRST LOAD4A ;NO, ILL FORMAT
2975 HRRZ T,(D) ;GET THE VALUE TYPE
2976 JUMPN T,GLSTR ;AND TREAT GLOBALS SPECIAL
2977 MOVE A,W ;THE TYPE OF STORE OPERATOR
2980 PUSHJ P,RDHLF ;GET THE ADDRESS
2981 MOVE V,W ;SET UP FOR FIXUPS
2982 POP D,W ;GET THE VALUE
2983 POP D,W ;AFTER IGNORING THE FLAG
2984 PUSHJ P,@STRTAB+6(A) ;CALL THE CORRECT FIXUP ROUTINE
2985 COMSTR: SETZM POLSW ;ALL DONE WITH POLISH
2986 IFN REENT,<PUSHJ P,RESTRX>
2987 MOVE T,OPNUM ;CHECK ON SIZES
2991 JRST COMPOL ;TOO BIG, GIVE ERROR
2992 PUSHJ P,RWORD ;THIS SHOULD GET US OUT (I.E RUN OUT COUNT)
2993 JRST LOAD4A ;IF NOT, SOMETHING IS WRONG
2995 STRTAB: EXP ALSYM,LFSYM,RHSYM,ALSTR,LOCDLF,SYM4A,FAKESY
3000 PUSHJ P,RDHLF ;GET THE STORE LOCATION
3004 HRLM V,W ;SET UP STORAGE ELEMENT
3010 MOVE W,C ;NOW SET UP THE HEADER
3011 AOS V,GLBCNT ;WHICH HAS NUMBER OF GLOBALS
3015 JRST COMSTR ;AND FINISH
3019 ALSTR1: IFN L,<CAMGE V,RINITL
3021 IFN REENT,<CAMGE V,HVAL1
3025 MOVEM W,@X ;FULL WORD FIXUPS
3027 ALSTR: JUMPN V,ALSTR1
3029 DESTB: EXP 1,1,1,1,1,1,1,1,0,0,100
3041 REPEAT 7,<JRST STRSAT>
3044 FSYMT: PUSHJ P,RDHLF ;FIRST HALF OF SYMBOL
3048 PUSH D,A ;SAVE STORE TYPE
3049 PUSHJ P,RDHLF ;GET BLOCK NAME
3053 TLO C,140000 ;MAKE BLOCK NAME
3054 PUSHJ P,SDEF ;FIND IT
3056 JRST FNOLOC ;MUST NOT BE LOADING LOCALS
3057 FSLP: LDB C,[POINT 32,-1(A),35] ;GET NAME
3064 MOVEI A,0 ;SET FOR A FAKE FIXUP
3067 FNDSYM: MOVEI W,(A) ;LOC OF SYMBOL
3075 MOVSI D,400000 ;LEFT HALF
3081 FAKESY: POPJ P, ;IGNORE
3084 POLSAT: PUSH P,C ;SAVE SYMBOL
3086 PUSHJ P,SREQ ;GO FIND IT
3088 JRST LOAD4A ;SOMETHING IS ROTTEN IN DENMARK
3089 MOVEM W,2(A) ;STORE VALUE
3090 HLRZS C ;NOW FIND HEADER
3094 HRLZI V,-1 ;AND DECREMENT COUNT
3096 TLNN V,-1 ;IS IT NOW 0
3097 JRST PALSAT ;YES, GO DO POLISH
3098 POP P,C ;RESTORE SYMBOL
3099 JRST SYM2W1 ;AND RETURN
3101 PALSAT: PUSH P,W ;SAVE VALUE
3102 MOVEM C,HDSAV ;SAVE THE HEADER NUMBER
3103 MOVE D,[IOWD PPDL,PPDB] ;SET UP A PDL
3104 MOVE C,V ;GET THE POINTER
3105 HRL C,HDSAV ;AND THE FIXUP NUMBER
3106 PUSHJ P,REMSYM ;REMOVE THE HEADER FORM EXISTANCE
3107 PUSHJ P,SREQ ;GO FINE THE NEXT LINK
3110 ANDI C,37 ;GET OPERATOR TYPE
3111 HRRZ V,2(A) ;PLACE TO STORE
3113 PUSH D,[XWD 400000,0]
3114 PUSH D,C ;THIS HAD BETTER BE A STORE OR WE ARE IN TROUBLE
3115 HLRZ C,2(A) ;GET POINTER TO POLISH CHAIN
3116 PSAT1: PUSHJ P,REMSYM ;REMOVE SYMBOL
3120 PSAT2: HRL C,HDSAV ;GET FIXUP NUMBER
3121 PUSHJ P,SREQ ;LOOK FOR IT
3124 ANDI C,37 ;THE OPERATOR NUMBER
3125 CAIN C,2 ;IS IT AN OPERAND?
3126 JRST PSOPD ;YES, GO PROCESS
3127 PUSH D,C ;YES STORE IT
3128 SKIPN DESTB-3(C) ;IS IT UNARY
3130 HLRZ C,2(A) ;GET FIRST OPERAND
3131 HRLI C,600000 ;AND MARK AS VALUE
3133 PSUNOP: HRRZ C,2(A) ;OTHER OPERAND
3134 JRST PSAT1 ;AND AWAY WE GO
3136 PSOPD: MOVE C,2(A) ;THIS IS A VALUE
3137 PUSHJ P,REMSYM ;GET RID OF THAT PART OF THE CHAIN
3138 PSOPD1: SKIPG V,(D) ;IS THERE A VALUE IN THE STACK
3139 JRST PSOPD2 ;YES, TAKE GOOD CARE OF IT
3140 COMOP: POP D,V ;NO, GET THAT OPERATOR OUT OF THERE
3141 XCT OPTAB-3(V) ;AND DO IT
3142 MOVE C,W ;GET RESULT IN RIGHT PLACE
3143 JRST PSOPD1 ;AND TRY FOR MORE
3144 PSOPD2: TLNE V,200000 ;IS IT A POINTER
3145 JRST DBLOP ;YES, NEEDS MORE WORK
3146 MOVE W,C ;NO, ONE WE HAVE IS FIRST OPND, GET IT INTO W
3147 POP D,C ;VALUE POINTER
3148 POP D,C ;2ND OPERAND INTO C
3149 JRST COMOP ;GO PROCESS OPERATOR
3151 DBLOP: EXCH C,(D) ;PUT VALUE IN STACK AND RETRIEV POINTER
3152 PUSH D,[XWD 400000,0] ;MARK AS VALUE
3153 JRST PSAT2 ;AND GO LOOK FOR MORE TROUBLE
3155 LINK: PUSHJ P,PRWORD ;GET TWO WORDS
3156 JUMPLE C,ENDLNK ;THIS IS AN END OF LINK WORD
3157 CAILE C,20 ;IS IT IN RANGE?
3159 HRRZ V,W ;GET THE ADDRESS
3160 HRRZ W,LINKTB(C) ;GET CURRENT LINK
3161 IFN L,< CAML V,RINITL ;LOSE>
3162 HRRM W,@X ;PUT INTO CORE
3163 HRRM V,LINKTB(C) ;SAVE LINK FOR NEXT ONE
3164 JRST LINK ;GO BACK FOR MORE
3165 ENDLNK: MOVNS C ;GET ENTRY NUMBER
3166 JUMPE C,LOAD4A ;0 IS A LOSER
3167 CAILE C,20 ;CHECK RANGE
3169 HRLM W,LINKTB(C) ;SAVE END OF LINK INFO
3173 STRSAT: MOVE W,C ;GET VALUE TO STORE IN W
3174 MOVE C,V ;GET OPERATOR HERE
3176 POP D,V ;GET ADDRESS TO STORE
3177 PUSHJ P,@STRTAB-15(C)
3178 IFN REENT,<PUSHJ P,RESTRX>
3179 POP P,W ;RESTORE THINGS
3187 LIST ;END OF FAILSW CODE
3189 COMSFX: IFE REENT,<PUSHJ P,SYMFX1
3191 IFN REENT,<JRST SYMFX1>>
3203 SUBTTL LIBRARY INDEX (BLOCK TYPE 14)
3205 COMMENT * DIRECT ACCESS LIBRARY SEARCH MODE
3206 INDEX WRITTEN BY FUDGE2.SEE DIDAL DOC (100-540-001-00)
3207 DESIGN AND CODING BY D.M.NIXON JUL-AUG 1970
3212 INDEX8: POP P,LSTBLK ;SET UP LSTBLK FOR NEXT PROG
3213 PUSHJ P,WORD ;READ FIRST WORD
3214 HLRZ A,W ;BLOCK TYPE ONLY
3215 CAIE A,14 ;IS IT AN INDEX?
3216 JRST INDEXE ;NO, ERROR
3217 JRST INDEX9 ;DON'T SET FLAG AGAIN
3219 INDEX0: TRO F,XFLG ;SIGNAL INDEX IN CORE
3220 MOVEI A,1 ;START ON BLOCK 1 (DSK)
3221 HRROM A,LSTBLK ;BUT INDICATE AN INDEX
3222 MOVE A,ILD1 ;INPUT DEVICE
3224 TLNE A,100 ;IS IT A DTA?
3226 INDEX9: MOVEI A,AUX+2 ;AUX BUFFER
3227 HRLI A,4400 ;MAKE BYTE POINTER
3228 MOVEM A,ABUF1 ;AND SAVE IT
3229 HRL A,BUFR1 ;INPUT BUFFER
3230 BLT A,AUX+201 ;STORE BLOCK
3231 TRO F,LSTLOD ;AND FAKE LAST PROG READ
3232 INDEX1: ILDB T,ABUF1
3233 HLRE A,T ;GET WORD COUNT
3234 JUMPL A,INDEX3 ;END OF BLOCK IF NEGATIVE
3235 CAIE A,4 ;IS IT ENTRY
3237 HRRZS T ;WORD COUNT ONLY
3238 INDEX2: ILDB C,ABUF1 ;GET NEXT SYMBOL
3240 PUSHJ P,SREQ ;SEARCH FOR IT
3241 SOJA T,INDEX4 ;REQUEST MATCHES
3242 SOJG T,INDEX2 ;KEEP TRYING
3243 ILDB T,ABUF1 ;GET POINTER WORD
3244 TRZN F,LSTLOD ;WAS LAST PROG LOADED?
3246 TRNN F,DTAFLG ;ALWAYS SAVE IF DTA???
3247 SKIPL LSTBLK ;SKIP IF LAST BLOCK WAS AN INDEX
3248 MOVEM T,LSTBLK ;SAVE POINTER FOR CALCULATIONS
3249 JRST INDEX1 ;GET NEXT PROG
3252 INDEX4: ADDM T,ABUF1
3254 PUSH P,A ;SAVE THIS BLOCK
3255 TROE F,LSTLOD ;DID WE LOAD LAST PROG?
3256 JRST [SKIPGE LSTBLK ;WAS LAST BLOCK AN INDEX?
3257 JRST NXTBLK ;YES, SO GET NEXT ONE
3259 JRST LOAD1] ;NEXT PROG IS ADJACENT
3260 HRRZ T,LSTBLK ;GET LAST BLOCK NUMBER
3261 CAIN T,(A) ;IN THIS BLOCK?
3263 NXTNDX: TRNE F,DTAFLG ;DIFFERENT TEST FOR DTA
3264 JRST NXTDTA ;CHECK IF NEXT BUFFER IN CORE
3265 CAIN T,-1(A) ;NEXT BLOCK?
3266 JRST NXTBLK ;YES,JUST DO INPUT
3267 INDEX5: USETI 1,(A) ;SET ON BLOCK
3268 WAIT 1, ;LET I/O FINISH
3269 MOVSI C,(1B0) ;CLEAR RING USE BIT IF ON
3270 ; ****** THE DEC BASTARDS DON'T READ THEIR OWN MANUALS *****
3271 HLLM C,BUFR ;INDICATE VIRGIN BUFFER
3272 ; ****** END OF THE CURRENT DEC IDIOCY **********:
3275 JRST NXTBLK ;ALL DONE NOW
3276 ANDCAM C,(T) ;CLEAR USE BIT
3277 HRRZ T,(T) ;GET NEXT BUFFER
3280 NXTDTA: WAIT 1, ;LET I/O RUN TO COMPLETION
3281 HRRZ T,BUFR ;GET POINTER TO CURRENT BUFFER
3282 HLRZ T,1(T) ;FIRST DATA WORD IS LINK
3283 CAIE T,(A) ;IS IT BLOCK WE WANT?
3286 JRST NEWBLK ;IT IS NOW
3287 JRST WORD3 ;EOF OR ERROR
3289 NEWBLK: MOVE A,(P) ;GET CURRENT BLOCK
3290 JUMPL A,INDEX8 ;JUST READ AN INDEX
3291 HLRZS A ;GET WORD COUNT
3292 JUMPE A,[TRNN F,DTAFLG ;WORD COUNT OK IF ON DTA
3295 SKIPL LSTBLK ;WAS LAST BLOCK AN INDEX?
3296 AOJA A,INDEX6 ;NO, ALWAYS ONE WORD OUT THEN
3297 HRRZ T,AUX+3 ;GET FIRST ENTRY BLOCK TYPE COUNT
3298 HRRZ T,AUX+4(T) ;GET FIRST POINTER WORD
3299 MOVEM T,LSTBLK ;SOME WHERE TO STORE IT
3300 HRRZ T,(P) ;GET CURRENT BLOCK NUMBER
3301 CAME T,LSTBLK ;SAME BLOCK?
3303 TRNN F,DTAFLG ;BUFR2 OK IF DTA???
3304 SOS BUFR2 ;ONE WORD TO MANY THOUGH
3305 JRST INDEX6 ;YES, WORD COUNT WILL BE CORRECT
3309 THSBLK: SUB A,LSTBLK ;GET WORD DIFFERENCE
3310 MOVSS A ;INTO RIGHT HALF
3311 INDEX6: ADDM A,BUFR1
3314 INDEX7: POP P,LSTBLK ;STORE THIS AS LAST BLOCK READ
3317 INDEX3: HRRE A,T ;GET BLOCK # OF NEXT INDEX
3318 JUMPL A,EOF ;FINISHED IF -1
3319 PUSH P,T ;STACK THIS BLOCK
3320 HRRZ T,LSTBLK ;GET LAST BLOCK
3321 JRST NXTNDX ;CHECK IF NEXT BUFFER IN CORE
3323 INDEX: IN 1, ;GET NEXT BUFFER
3324 SOSA BUFR2 ;O.K. RETURN, BUT 1 WORD TOO MANY
3325 JRST WORD3 ;ERROR OR EOF
3326 PUSHJ P,WORD ;READ FIRST WORD
3327 INDEXE: TRZE F,XFLG ;INDEX IN CORE?
3328 TTCALL 3,[ASCIZ /LIBRARY INDEX INCONSISTENT - CONTINUING
3330 JRST LOAD1A+1 ;AND CONTINUE
3335 SUBTTL ALGOL OWN BLOCK (TYPE 15)
3339 IFN SAILSW,<TRNN F,ALGFL ;IF NOT ALGOL
3340 JRST LDPRG ;MUST BE SAIL BLOCK TYPE 15>
3341 PUSHJ P,RWORD ;READ 3RD WORD
3342 HLRZ V,W ;GET START OF OWN BLOCK
3343 MOVEI C,(W) ;GET LENGTH OF OWN BLOCK
3344 MOVEM C,OWNLNG ;SAVE IT TO FIX RELOC AT END
3345 PUSHJ P,ALGB2 ;FIX AND CHECK PROG BREAK
3346 ADDI V,(R) ;RELOCATE
3347 MOVEI W,(V) ;GET CURRENT OWN ADDRESS
3348 EXCH W,%OWN ;SAVE FOR NEXT TIME
3349 MOVEM W,@X ;STORE LAST OWN ADDRESS IN LEFT HALF
3350 ALGB1: PUSHJ P,RWORD ;GET DATA WORD
3351 HLRZ V,W ;GET ADDRESS TO FIX UP
3352 HRRZS W ;RIGHT HALF ONLY
3353 ADD W,%OWN ;ADD IN ADDRESS OF OWN BLOCK
3354 ADDM W,@X ;FIX UP RIGHT HALF
3355 JRST ALGB1 ;LOOP TIL DONE
3357 ALGNAM: JUMPE W,CPOPJ ;NOT ALGOL MAIN PROG
3358 TROE F,ALGFL ;SET ALGOL SEEN FLAG
3359 JRST ALGER1 ;ONLY ONE ALGOL MAIN PROG ALLOWED
3360 IFN REENT,<TRNN F,SEENHI ;ANYTHING IN HIGH SEGMENT?>
3361 CAME R,[XWD W,JOBDA] ;ANYTHING LOADED IN LOW SEGMENT?
3362 JRST ALGER2 ;YES, ERROR ALSO
3363 SETZM %OWN ;INITIALISE OWN AREA POINTER
3364 IFN REENT,<TRO F,VFLG ;DEFAULT RE-ENTRANT OP-SYSTEM>
3365 ALGB2: ADDI H,(W) ;FIX PROG BREAK
3366 IFN REENT,<CAML H,HILOW
3367 MOVEM H,HILOW ;HIGHEST LOW CODE LOADED>
3368 CAILE H,1(S) ;SKIP IF SUFFICIENT CORE AVAILABLE
3369 IFN EXPAND,<JRST [PUSHJ P,XPAND>
3371 IFN EXPAND,< JRST .+1]>
3374 ALGER1: ERROR ,</ONLY ONE ALGOL MAIN PROGRAM ALLOWED#/>
3377 ALGER2: ERROR ,</ALGOL MAIN PROGRAM MUST BE LOADED FIRST#/>
3383 SUBTTL SAIL BLOCK TYPE 15
3385 COMMENT * BLOCK TYPE 15 AND 16. SIXBIT FOR FIL,PPN,DEV
3386 IN THE BLOCK. SEARCH TABLE FOR ALREADY REQUESTED. IF NOT
3387 ENTER REQUEST. ORIGINAL CODE BY DCS REWRITTEN BY WFW*
3391 LDPRG: MOVEI D,PRGFLS-1 ;SET UP SOMETHING WE CAN SEARCH WITH
3392 MOVE W,PRGPNT ;AND CURRENT POINTER
3393 PUSHJ P,LDSAV ;GO ENTER (WILL NOT RETURN IF RUNS OUT)
3395 JRST LDPRG ;BACK FOR MORE
3396 LDLIB: MOVEI D,LIBFLS-1
3400 JRST LDLIB ;LOOKS JUST LIKE THE LAST ONE, DOESN'T IT
3402 LDSAV: HRLI D,-RELLEN-1 ;GET AOBJN SET UP
3403 MOVEM W,LODPN2# ;SAV IT
3404 PUSHJ P,PRWORD ;GET FILE,PPN
3406 PUSHJ P,RWORD ;AND DEVICE
3407 FILSR: CAMN D,LODPN2
3408 JRST FENT ;HAVE GOTTEN THERE, ENTER FILE
3409 CAME C,PRGFIL(D) ;CHECK FOR MATCH
3414 NOMT: AOBJN D,FILSR ;AND NOT DEVICE SHOULD ALWAYS JUMP
3416 POPJ P, ;JUST RETURN CURRENT POINTER
3417 FENT: MOVE D,LODPN2 ;ENTER IT
3418 AOBJP D,WRONG ;THAT IS IF NOT TOO MANY
3419 MOVEM C,PRGFIL-1(D) ;HAVE ALREADY INDEXED
3420 MOVEM A,PRGPPN-1(D) ;HENCE THE -1
3423 WRONG: ERROR ,</TOO MANY DEMANDED FILES#/>
3428 SUBTTL SYMBOL TABLE SEARCH SUBROUTINES
3430 ; ENTERED WITH SYMBOL IN C
3431 ; RETURN IS WITH POINTER IN A IF MATCHING SYMBOL FOUND
3432 ; OTHERWISE, A SKIP ON RETURN OCCURS
3434 SREQ: JUMPGE S,CPOPJ1 ;JUMP IF NO UNDEF. SYMBOLS
3435 SKIPA A,S ;LOAD REQUEST SEARCH POINTER
3436 SDEF: MOVE A,B ;LOAD DEF. SYMBOL SEARCH POINTER
3438 POPJ P, ;SYMBOLS MATCH, RETURN
3439 IFE K,< TLNE N,F4SW ;ARE WE IN FORTRAN?
3440 JRST SDEF2 ;YES,JUST TRY NEXT SYMBOL>
3441 TLC C,400000 ;MIGHT BE SUPPRESSED INTERNAL
3442 CAMN C,1(A) ;WAS IT?
3443 JRST [TLO C,400000 ;YES, SO ENSURE IT'S SUPPRESSED
3444 MOVEM C,1(A) ;STORE SUPPRESSED DEFINITION
3446 TLC C,400000 ;NO,TRY NEXT SYMBOL
3449 IFE K,< JRST CPOPJ1 ;SYMBOL NOT FOUND SKIPS ON RETURN>
3455 SUBTTL RELOCATION AND BLOCK INPUT
3457 PRWORD: PUSHJ P,RWORD ;READ A WORD PAIR
3458 MOVE C,W ;LOAD C WITH FIRST DATA WORD
3459 TRNE E,377777 ;TEST FOR END OF BLOCK
3460 JRST RWORD1 ;INPUT SECOND WORD OF PAIR
3461 MOVEI W,0 ;NO SECOND WORD, ASSUME ZERO
3464 RWORD: TRNN E,377777 ;TEST FOR END OF BLOCK
3465 JRST LOAD1 ;RETURN TO LOAD THE NEXT BLOCK
3466 RWORD1: AOBJN E,RWORD2 ;JUMP IF DATA WORD NEXT
3467 PUSHJ P,WORD ;READ CONTROL WORD
3468 MOVE Q,W ;DON'T COUNT RELOCATION WORDS
3469 HRLI E,-22 ;SET RELOCATION WORD BYTE COUNT
3470 RWORD2: PUSHJ P,WORD ;READ INPUT WORD
3471 JUMPGE Q,RWORD3 ;TEST LH RELOCATION BIT
3472 TRNN F,TWOFL ;POSSIBLE TWO SEGMENTS?
3475 PUSHJ P,CHECK ;USE CORRECT RELOCATION
3478 JRST RWORD3 ;AND TEST RIGHT HALF
3480 ADD W,T ;LH RELOCATION
3481 RWORD3: TLNN Q,200000 ;TEST RH RELOCATION BIT
3482 JRST RWORD4 ;NOT RELOCATABLE
3483 TRNE F,TWOFL ;POSSIBLE TWO SEGMENTS?
3484 PUSHJ P,CHECK ;USE CORRECT RELOCATION
3485 HRRI W,@R ;RH RELOCATION
3489 CHECK: MOVE T,HVAL1 ;START OF HISEGMENT
3490 CAIG T,NEGOFF(W) ;IN HISEG?
3491 JRST [SUBI W,(T) ;YES REMOVE OFSET
3493 HRRI W,@LOWR ;USE LOW SEG RELOC
3494 JRST CPOPJ1 ;SKIP RETURN
3497 SUBTTL PRINT STORAGE MAP SUBROUTINE
3499 PRMAP: CAIN D,1 ;IF /1M PRINT LOCAL SYMBOLS
3500 TROA F,LOCAFL ;YES,TURN ON FLAG
3501 TRZ F,LOCAFL ;CLEAR JUST IN CASE
3502 PUSHJ P,FSCN1 ;LOAD OTHER FILES FIRST
3503 PUSHJ P,CRLFLF ;START NEW PAGE
3505 IFN REENT,<CAIG W,JOBDA ;LOADED INTO LOW SEGMENT
3506 JRST NOLOW ;DON'T PRINT IF NOTHING THERE>
3508 IFE REENT,<ERROR 7,<?IS THE PROGRAM BREAK@?>>
3509 IFN REENT,<ERROR 7,<?IS THE LOW SEGMENT BREAK@?>
3510 PUSHJ P,CRLF ;CR-LF ON ALL BUT TTY
3511 NOLOW: MOVE W,HVAL ;HISEG BREAK
3512 CAMG W,HVAL1 ;HAS IT CHANGED
3513 JRST NOHIGH ;NO HI-SEGMENT
3514 TLO F,FCONSW ;FORCE OUT HI-SEG BREAK ALSO
3516 ERROR 7,<?IS THE HIGH SEGMENT BREAK@?>
3519 IFE NAMESW,< MOVE W,DTOUT ;OUTPUT NAME >
3520 IFN NAMESW,< SKIPN W,DTOUT
3521 MOVE W,CURNAM ;USE PROGRAM NAME>
3522 JUMPE W,.+3 ;DON'T PRINT IF NOT THERE
3524 PUSHJ P,SPACES ;SOME SPACES
3525 ERROR 0,<?STORAGE MAP!?>
3526 PUSHJ P,SPACES ;SOME SPACES
3529 MOVE N,[POINT 6,DBUF] ;INITIALIZE DATE POINTER
3530 MSTIME Q, ;GET THE TIME
3531 IDIVI Q,↑D60*↑D1000
3533 PUSH P,A ;SAVE MINUTES
3534 PUSHJ P,OTOD1 ;STORE HOURS
3535 POP P,Q ;GET MINUTES
3536 PUSHJ P,OTOD ;STORE MINUTES
3538 IDIVI E,↑D31 ;GET DAY
3540 PUSHJ P,OTOD ;STORE DAY
3541 IDIVI E,↑D12 ;GET MONTH
3543 HRR A,DTAB(Q) ;GET MNEMONIC
3545 HLR A,DTAB(Q) ;OTHER SIDE
3546 HRRM A,DBUF+1 ;STORE IT
3547 MOVEI Q,↑D64(E) ;GET YEAR
3548 MOVE N,[POINT 6,DBUF+2]
3549 PUSHJ P,OTOD ;STORE IT
3554 SKIPN STADDR ;PRINT STARTING ADDRESS
3555 JRST NOADDR ;NO ADDRESS SEEN
3556 ERROR 0,</STARTING ADDRESS !/>
3558 MOVE W,STADDR ;GET ST. ADDR.
3559 PUSHJ P,PRNUM0 ;PRINT IT
3562 MOVE W,[SIXBIT / PROG /]
3564 MOVE W,CURNAM ;PROG NAME
3567 MOVE W,ERRPT6 ;SIXBIT / FILE /
3569 MOVE W,PRGNAM ;FILE NAME
3572 HRRZ A,HVAL1 ;GET INITIAL HIGH START
3573 ADDI A,JOBHDA ;ADD IN OFFSET
3574 HRLI A,JOBDA ;LOW START
3575 MOVSM A,SVBRKS ;INITIAL BREAKS>
3580 IFN REENT,<SKIPN C,1(A) ;LOAD SYMBOL SKIP IF REAL SYMBOL
3581 JRST PRMAP4 ;IGNORE ZERO NAME(TWOSEG BREAKS)>
3582 IFE REENT,<MOVE C,1(A) ;LOAD SYMBOL>
3583 TLNN C,300000 ;TEST FOR LOCAL SYMBOL
3584 JRST .+4 ;GLOBAL (NOT LOCAL ANYWAY)
3585 TRNN F,LOCAFL ;PRINT LOCAL SYMBOLS?
3586 JRST PRMAP4 ;IGNORE LOCAL SYMBOLS
3587 TLC C,140000 ;MAKE IT LOOK LIKE INTERN
3597 PRMP1B: PUSHJ P,PRNAM1 ;PRINT SYMBOL AND VALUE
3599 JRST PRMAP4 ;GLOBAL SYMBOL
3600 HLRE C,W ;POINTER TO NEXT PROG. NAME
3601 HRRZS W ;SO WE ONLY HAVE THE HALF WE WANT
3602 PRMAP7: JUMPL C,PRMP7A
3603 IFN REENT,<SKIPN 1(B) ;IS IT A ZERO SYMBOL
3604 JRST [MOVE C,B ;SET UP C
3605 JRST PRMAP2] ;AND GO
3606 HRRZ T,HVAL ;GET TO OF HI PART
3607 CAML W,HVAL1 ;IS PROGRAM START UP THERE??
3609 HRRZ T,HILOW ;GET HIGHEST LOCATION LOADED IN LOW
3610 SUBI T,(X) ;REMOVE OFFSET
3611 CAIE T,(W) ;EQUAL IF ZERO LENGTH PROG>
3612 HRRZ T,R ;GET LOW, HERE ON LAST PROG
3615 PRMP7A: ADDI C,2(A) ;POINTER TO NEXT PROGRAM NAME
3617 SKIPE 1(C) ;THIS IS A TWO SEG FILE
3619 MOVE T,2(C) ;GET PROG BREAKS
3620 TLNN T,-1 ;IF NO HIGH STUFF YET
3621 HLL T,SVBRKS ;FAKE IT
3622 SUB T,SVBRKS ;SUBTRACT LAST BREAKS
3625 JUMPGE T,.+2 ;IF NEGATIVE
3626 TDZA W,W ;MAKE ZERO (FIRST TIME THRU)
3627 HLRZ W,T ;GET HIGH BREAK
3628 PUSHJ P,PRNUM ;PRINT IT
3629 PUSHJ P,TAB ;AND TAB
3633 CAMN C,B ;EQUAL IF LAST PROG
3637 CAMN T,SVBRKS ;ZERO LENGTT IF EQUAL
3638 JRST PRMP6A ;SEE IF LIST ALL ON
3639 MOVEM T,SVBRKS ;SAVE FOR NEXT TIME
3640 JRST PRMAP3 ;AND CONTINUE
3642 HRRZ T,(C) ;GET ITS STARTING ADRESS
3643 IFN REENT,<CAMGE W,HVAL1 ;MAKE SURE BOTH IN SAME SEGMENT
3646 JRST [HLRE T,(C) ;NO TRY NEXT ONE DOWN
3647 JUMPE T,@PRMAP7 ;END GO USE PROG BREAK
3649 JRST PRMAP2] ;CHECK THIS ONE>
3650 PRMAP6: SUBM T,W ;SUBTRACT ORIGIN TO GET LENGTH
3651 PUSHJ P,PRNUM ;PRINT PROGRAM LENGTH
3653 PRMP6A: TLNN N,ALLFLG ;SKIP IF LIST ALL MODE IS ON
3654 TRNE W,777777 ;SKIP IF ZERO LENGTH PROGRAM
3656 HLRE C,2(A) ;GET BACK CORRECT LOCATION IF 0 LENGTH
3657 JUMPE C,PRMAP5 ;JUMP IF LAST PROGRAM
3658 ADDI C,2(A) ;IN CASE WE SKIPPED SOME PROGRAMS
3659 SKIPA A,C ;SKIP GLOBALS, ZERO LENGTH PROG.
3660 PRMAP3: PUSHJ P,CRLF
3661 PRMAP4: CAILE A,(B) ;TEST FOR END OF SYMBOL TABLE
3663 PRMAP5: PUSHJ P,CRLF ;GIVE AN XTRA CR-LF
3667 SUBTTL LIST UNDEFINED AND MULTIPLY DEFINED GLOBALS
3669 PUSHJ P,PMS1 ;PRINT UNDEFINED SYMBOLS
3671 ;LIST NUMBER OF MULTIPLY DEFINED GLOBALS
3673 PMS3: SKIPN W,MDG ;ANY MULTIPLY DEFINED GLOBALS
3674 JRST PMS4 ;NO, EXCELSIOR
3675 PUSHJ P,FCRLF ;ROOM AT THE TOP
3676 PUSHJ P,PRQ ;PRINT ?
3677 PUSHJ P,PRNUM0 ;NUMBER OF MULTIPLES
3678 ERROR 7,<?MULTIPLY DEFINED GLOBALS@?>
3679 PMS4: TLNE N,AUXSWE ;AUXILIARY OUTPUT DEVICE?
3680 OUTPUT 2, ;INSURE A COMPLETE BUFFER
3683 ;LIST UNDEFINED GLOBALS
3685 PMS1: PUSHJ P,FSCN1 ;LOAD FILES FIRST
3686 JUMPGE S,CPOPJ ;JUMP IF NO UNDEFINED GLOBALS
3687 PUSHJ P,FCRLF ;START THE MESSAGE
3688 HLRE W,S ;COMPUTE NO. OF UNDEF. GLOBALS
3690 LSH W,-1 ;<LENGTH OF LIST>/2
3692 ERROR 7,</UNDEFINED GLOBALS@/>
3693 MOVE A,S ;LOAD UNDEF. POINTER
3698 PUSHJ P,PRNAM0 ;PRINT SYMBOL AND POINTER
3703 PMS: PUSHJ P,PMS1 ;PRINT UNDEFINED SYMBOLS
3704 JUMPGE S,CPOPJ ;NO UNDEFINED SYMBOLS
3705 PUSHJ P,CRLF ;NEW LINE,MAKE ? VISIBLE
3706 PUSHJ P,PRQ ;FIX FOR BATCH TO PRINT ALL SYMBOLS
3707 JRST CRLF ;SPACE AFTER LISTING
3710 SUBTTL ENTER FILE ON AUXILIARY OUTPUT DEVICE
3712 IAD2: PUSH P,A ;SAVE A FOR RETURN
3713 MOVE A,LD5C1 ;GET AUX. DEV.
3714 DEVCHR A, ;GET DEVCHR
3715 TLNN A,4 ;DOES IT HAVE A DIRECTORY
3716 JRST IAD2A ;NO SO JUST RETURN
3717 MOVE A,DTOUT ;GET OUTPUT NAME
3718 CAME A,[SIXBIT /JOBDAT/] ;DON'T USE JOBDAT
3719 JUMPN A,IAD2A ;USE ANYTHING NON-ZERO
3720 MOVSI A,(SIXBIT /DSK/) ;DEFAULT DEVICE
3721 CAMN A,LD5C1 ;IS IT AUX. DEV.
3722 JRST .+5 ;YES LEAVE WELL ALONE
3723 CLOSE 2, ;CLOSE OLD AUX. DEV.
3724 MOVEM A,LD5C1 ;SET IT TO DSK
3725 OPEN 2,OPEN2 ;OPEN IT FOR DSK
3727 IFN NAMESW,< SKIPN A,CURNAM ;USE PROG NAME>
3728 MOVSI A,(SIXBIT /MAP/) ;AN UNLIKELY NAME
3729 MOVEM A,DTOUT ;SO ENTER WILL NOT FAIL
3730 IAD2A: POP P,A ;RECOVER A
3731 SETZM DTOUT+2 ;CLEAR PROTECTION (LEVEL D)
3732 ENTER 2,DTOUT ;WRITE FILE NAME IN DIRECTORY
3733 JRST IMD3 ;NO MORE DIRECTORY SPACE
3736 IMD3: ERROR ,</DIR. FULL@/>
3739 IMD4: MOVE P,[XWD -40,PDLST] ;RESTORE STACK
3740 TLZ N,AUXSWE!AUXSWI ;NO AUX.DEV.NOW
3741 ERROR ,</NO MAP DEVICE@/>
3742 JRST PRMAP5 ;CONTINUE TO LOAD
3746 SUBTTL PRINT SUBROUTINES
3748 ;PRINT THE 6 DIGIT OCTAL ADDRESS IN W
3750 ; ACCUMULATORS USED: D,T,V
3752 PRNAM0: MOVE C,1(A) ;LOAD SYMBOL
3753 PRNAM1: MOVE W,2(A) ;LOAD VALUE
3754 PRNAM: PUSHJ P,PRNAME
3759 PRNUM0: MOVE V,PRNUM2 ;LOAD BYTE POINTER TO RH. OF W
3760 MOVNI D,6 ;LOAD CHAR. COUNT
3761 PRNUM1: ILDB T,V ;LOAD DIGIT TO BE OUTPUT
3762 ADDI T,60 ;CONVERT FROM BINARY TO ASCII
3764 AOJL D,PRNUM1 ;JUMP IF MORE DIGITS REMAIN
3767 PRNUM2: XWD 220300,W
3773 LDNAM: MOVE T,[POINT 6,CURNAM] ;POINTER
3774 MOVNI D,6 ;SET COUNT
3775 TLZ W,740000 ;REMOVE CODE BITS
3776 SETNAM: IDIVI W,50 ;CONVERT FROM RAD 50
3785 CAIG C,72 ;REMOVE SPECIAL CHARS. (. $ %)
3790 ;YE OLDE RECURSIVE NUMBER PRINTER
3791 ;PRINTS Q, WITH LEADING ZEROES SUPPRESSED; USES A AND T
3793 RCNUM: IDIVI Q,12 ;RADIX DECIMAL
3808 ; ACCUMULATORS USED: Q,T,D
3810 PWORD: MOVNI Q,6 ;SET CHARACTER COUNT TO SIX
3811 PWORD1: MOVE D,LSTPT ;ENTER HERE WITH Q PRESET
3812 PWORD2: ILDB T,D ;LOAD NEXT CHAR. TO BE OUTPUT
3813 PUSHJ P,TYPE ;OUTPUT CHARACTER
3818 ;TYPEOUT SUBROUTINE - THE CHARACTER SUPPLIED IN T IS CONVERTED TO ASCII
3819 ;AND IS OUTPUT ON THE CONSOLE AND/OR THE SPECIFIED LOADER MAP OUTPUT
3822 CRLFLF: PUSHJ P,CRLF
3823 FCRLF: TLO F,FCONSW ;INSURE TTY OUTPUT
3824 CRLF: MOVEI T,15 ;CARRIAGE RETURN LINE FEED
3826 TRCA T,7 ;CR.XOR.7=LF
3827 TYPE: MOVEI T,40(T) ;CONVERT SIXBIT TO ASCII
3828 TYPE2: TLNN N,AUXSWI ;IS THER AN AUXILIARY DEVICE?
3829 JRST TYPE3 ;NO, DONT OUTPUT TO IT
3830 TLON N,AUXSWE ;IS AUX. DEV. ENTERED?
3831 PUSHJ P,IAD2 ;NOPE, DO SO!
3832 SOSG ABUF2 ;SPACE LEFT IN BUFFER?
3833 OUTPUT 2, ;CREATE A NEW BUFFER
3834 IDPB T,ABUF1 ;DEPOSIT CHARACTER
3835 TLNN F,FCONSW ;FORCE OUTPUT TO CONSOLE TOO?
3838 TRNE F,NOTTTY ;IF TTY IS ANOTHER DEVICE
3839 POPJ P, ;DON'T OUTPUT TO IT>
3840 SKIPN BUFO2 ;END OF BUFFER
3841 OUTPUT 3, ;FORCE OUTPUT NOW
3842 IDPB T,BUFO1 ;DEPOSIT CHARACTER
3843 CAIN T,12 ;END OF LINE
3844 OUTPUT 3, ;FORCE AN OUTPUT
3848 SUBTTL SYMBOL PRINT - RADIX 50
3850 ; ACCUMULATORS USED: D,T
3852 PRNAME: MOVE T,C ;LOAD SYMBOL
3853 TLZ T,740000 ;ZERO CODE BITS
3865 MOVNI D,6 ;LOAD CHAR. COUNT
3866 SPT: IDIVI T,50 ;THE REMAINDER IS THE NEXT CHAR.
3867 HRLM V,(P) ;STORE IN LH. OF PUSHDOWN LIST
3868 AOJGE D,.+2 ;SKIP IF NO CHARS. REMAIN
3869 PUSHJ P,SPT ;RECURSIVE CALL FOR NEXT CHAR.
3870 HLRZ T,(P) ;LOAD FROM LH. OF PUSHDOWN LIST
3895 OTOD1: IDIVI Q,↑D10
3896 ADDI Q,20 ;FORM SIXBIT
3902 DTAB: SIXBIT /JANFEB/
3911 SUBTTL ERROR MESSAGE PRINT SUBROUTINE
3916 ; SIXBIT /<MESSAGE>/
3918 ; ACCUMULATORS USED: T,V,C,W
3920 ERRPT: TLO F,FCONSW ;INSURE TTY OUTPUT
3921 PUSHJ P,CRLF ;ROOM AT THE TOP
3922 PUSHJ P,PRQ ;START OFF WITH ?
3923 ERRPT0: PUSH P,Q ;SAVE Q
3925 ERRPT1: PUSHJ P,TYPE
3932 JRST ERRP42 ;JUST RETURN,LEAVE FCONSW ON
3943 ERRPT3: MOVE W,ERRPT6
3951 ERRPT4: PUSHJ P,CRLF
3952 ERRP41: TLZ F,FCONSW ;ONE ERROR PER CONSOLE
3953 ERRP42: POP P,Q ;***DMN*** FIX FOR ILC MESSAGE
3954 AOJ V, ;PROGRAM BUMMERS BEWARE:
3955 JRST @V ;V HAS AN INDEX OF A
3957 ERRPT5: POINT 6,0(A)
3958 ERRPT6: SIXBIT / FILE /
3961 ERRPT8: TLO F,FCONSW ;INSURE TTY OUTPUT
3962 PUSHJ P,PRQ ;START WITH ?
3963 CAIGE T,140 ;IS IT A NON-PRINTING CHAR?
3967 MOVEI T,136 ;UP ARROW
3970 TRC T,100 ;CONVERT TO PRINTING CHAR.
3971 ERRP8: PUSHJ P,TYPE2
3972 ERRPT7: PUSHJ P,SPACE
3977 ERROR 7,<?ILLEGAL -LOADER@?>
3981 ;PRINT QUESTION MARK
3984 MOVEI T,"?" ;PRINT ?
3990 SUBTTL INPUT - OUTPUT INTERFACE
3992 ;BINARY INPUT SUBROUTINE - RETURNS A WORD IN W
3994 WORDPR: PUSHJ P,WORD ;GET FIRST WORD OF PAIR
3995 MOVE C,W ;KEEP IT HANDY>
3996 WORD: SOSGE BUFR2 ;SKIP IF BUFFER NOT EMPTY
3998 WORD1: ILDB W,BUFR1 ;PICK UP 36 BIT WORD
4001 WORD2: IN 1, ;GET NEXT BUFFER LOAD
4002 JRST WORD ;DATA OK - CONTINUE LOADING
4003 WORD3: STATZ 1,IODEND ;TEST FOR EOF
4004 JRST EOF ;END OF FILE EXIT
4005 ERROR ,< /INPUT ERROR#/>
4006 JRST LD2 ;GO TO ERROR RETURN
4009 SE3: XWD 2,2 ;SYMBOL POINTER INCREMENT
4010 PDLPT: XWD -41,PDLST-1; INITIAL PUSHDOWN POINTER
4011 COMM: SQUOZE 0,.COMM.
4012 LSTPT: POINT 6,W ;CHARACTER POINTER TO W
4020 IOBAD==IODERR!IODTER!IOBKTL!IOIMPM
4028 IFN SEG2SW,< PHASE LOWCOD>
4029 IFE SEG2SW,< PHASE 140>>
4033 DBUF: SIXBIT /TI:ME DY-MON-YR @/
4036 ;DATA FOR PURE OPEN UUO'S
4068 IFE SEG2SW,<LOC 140>
4070 LOWCOD: BLOCK CODLN>
4072 PDSAV: BLOCK 1 ;SAVED PUSHDOWN POINTER
4073 COMSAV: BLOCK 1 ;LENGTH OF COMMON
4074 MDG: BLOCK 1 ;COUNTER FOR MUL DEF GLOBALS
4078 BLOCK 1 ;STORE N HERE
4079 BLOCK 1 ;STORE X HERE
4080 BLOCK 1 ;STORE H HERE
4081 BLOCK 1 ;STORE S HERE
4082 BLOCK 1 ;STORE R HERE
4085 STADDR: BLOCK 1 ;HOLDS STARTING ADDRESS
4088 PRGNAM: BLOCK 1 ;STORE BINARY FILE NAME-USED TO MAKE SYSTAT MORE MEANINGFUL
4092 HIGHR: BLOCK 1 ;HOLD X AND R WHILE LOADING LOW SEG PIECES
4094 HILOW: BLOCK 1 ;HIGHEST NON-BLOCK STMT IN LOW SEG
4095 HVAL: BLOCK 1 ;ORG OF HIGH SEG>
4096 HVAL1: BLOCK 1 ;ACTUAL ORG OF HIGH SEG
4097 LOWR: BLOCK 1 ;HOLD X AND R WHILE LOADING HISEG PIECES
4098 IFN KUTSW,<CORSZ: BLOCK 1>
4099 IFN DMNSW,<KORSP: BLOCK 1>
4100 IFN LDAC,<BOTACS: BLOCK 1>
4101 IFN WFWSW,<VARLNG: BLOCK 1
4103 IFN SAILSW,<LIBFLS: BLOCK RELLEN*3
4104 PRGFLS: BLOCK RELLEN*3>
4138 HISTRT: BLOCK 1 ;JOBREL AT START OF LOADING
4149 LIMBO: BLOCK 1 ;WHERE OLD CHARS. ARE STORED
4150 IFN DIDAL,<LSTBLK: BLOCK 1 ;POINTER TO LAST PROG LOADED>
4151 IFN EXPAND,<ALWCOR: BLOCK 1 ;CORE AVAILABLE TO USER>
4152 IFN ALGSW,<%OWN: BLOCK 1 ;ADDRESS OF ALGOL OWN AREA
4153 OWNLNG: BLOCK 1 ;LENGTH OF OWN BLOCK>
4154 IFN REENT,<SVBRKS: BLOCK 1 ;XWD HIGH,LOW (PROG BREAKS)>
4157 SUBTTL BUFFER HEADERS AND HEADER HEADERS
4159 BUFO: BLOCK 1 ;CONSOLE INPUT HEADER HEADER
4163 BUFI: BLOCK 1 ;CONSOLE OUTPUT HEADER HEADER
4167 ABUF: BLOCK 1 ;AUXILIARY OUTPUT HEADER HEADER
4171 BUFR: BLOCK 1 ;BINARY INPUT HEADER HEADER
4175 DTIN: BLOCK 1 ;DECTAPE INPUT BLOCK
4178 DTOUT: BLOCK 1 ;DECTAPE OUTPUT BLOCK
4181 TTYL==52 ;TWO TTY BUFFERS
4183 IFE K,< BUFL==406 ;TWO DTA BUFFERS FOR LOAD>
4184 IFN K,< BUFL==203 ;ONE DTA BUFFER FOR LOAD>
4185 ABUFL==203 ;ONE DTA BUFFER FOR AUX DEV>
4187 IFE K,<BUFL==4*203+1>
4191 TTY1: BLOCK TTYL ;TTY BUFFER AREA
4192 BUF1: BLOCK BUFL ;LOAD BUFFER AREA
4193 AUX: BLOCK ABUFL ;AUX BUFFER AREA
4203 SUBTTL FORTRAN DATA STORAGE
4205 IFN STANSW,<PATCH: BLOCK 20 ;STANFORD HAS SEMI-INFINITE CORE>
4208 TOPTAB: BLOCK 1 ;TOP OF TABLES
4209 CTAB: BLOCK 1; COMMON
4210 ATAB: BLOCK 1; ARRAYS
4211 STAB: BLOCK 1; SCALARS
4212 GSTAB: BLOCK 1; GLOBAL SUBPROGS
4213 AOTAB: BLOCK 1; OFFSET ARRAYS
4214 CCON: BLOCK 1; CONSTANTS
4215 PTEMP: BLOCK 1; PERMANENT TEMPS
4216 TTEMP: BLOCK 1; TEMPORARY TEMPS
4217 COMBAS: BLOCK 1; BASE OF COMMON
4218 LLC: BLOCK 1; PROGRAM ORIGIN
4219 BITP: BLOCK 1; BIT POINTER
4220 BITC: BLOCK 1; BIT COUNT
4221 PLTP: BLOCK 1; PROGRAMMER LABEL TABLE
4222 MLTP: BLOCK 1; MADE LABEL TABLE
4223 SDS: BLOCK 1 ;START OF DATA STATEMENTS
4224 SDSTP: BLOCK 1 ;START OF DATA STATEMENTS POINTER
4225 BLKSIZ: BLOCK 1; BLOCK SIZE
4226 MODIF: BLOCK 1; ADDRESS MODIFICATION +1
4227 SVFORH: BLOCK 1 ;SAVE H WHILE LOADING F4 PROGRAMS
4233 CT1: BLOCK 1 ;TEMP FOR C
4237 WCNT: BLOCK 1 ;DATA WORD COUNT
4238 RCNT: BLOCK 1 ;DATA REPEAT COUNT
4240 LTCTEM: BLOCK 1 ;TEMP FOR LTC
4241 DWCT: BLOCK 1 ;DATA WORD COUNT>
4250 IFN PURESW,<HHIGO: PHASE BUF1 ;DON'T NEED BUF1 NOW>
4252 HIGO: CORE V, ;CORE UUO
4255 CAMG D,HVAL1 ;ANYTHING IN HI-SEG
4257 MOVE V,HISTRT ;NOW REMAP THE HISEG.
4258 REMAP V, ;REMAP UUO.
4259 JRST HIGET ;FATAL ERROR.
4260 HIRET: JRST 0 ;EXECUTE CODE IN ACC'S
4262 HIGET: HRRZI V,SEGBLK ;DATA FOR
4263 GETSEG V, ;GETSEG UUO
4264 SKIPA ;CANNOT CONTINUE NO HISEG
4265 JRST REMPFL ;REGAINED LOADER HISEG
4267 TTCALL 3,SEGMES ;PRINT SEGMES
4270 SEGBLK: SIXBIT /SYS/
4275 SEGMES: ASCIZ /?CANNOT FIND LOADER.SHR
4278 IFN PURESW,<HIGONE: DEPHASE>>
4283 ;END HERE IF 1K LOADER REQUESTED.
4284 IFN K,<IFE L,<END BEG>
4287 IFN L,<LODMAK: MOVEI A,LODMAK
4288 MOVEM A,137 ;SET UP TO SAVE THE LISP LOADER
4297 ADDM A,LMLST ;BECAUSE MACRO WON'T TAKE POLISH FIXUPS
4303 LMFILE: SIXBIT /LISP/
4307 LMLST: IOWD LODMAK+1,137
4314 SUBTTL FORTRAN FOUR LOADER
4316 F4LD: TLNE F,SKIPSW!FULLSW ;ARE WE IN SKIP MODE
4317 JRST REJECT ;YES,DON'T LOAD ANY OF THIS
4318 MOVEI W,-2(S); GENERATE TABLES
4319 CAIG W,(H) ;NEED TO EXPAND?
4320 IFN EXPAND,<PUSHJ P,[PUSHJ P,XPAND
4324 IFE EXPAND,< TLO F,FULLSW>
4325 ;IFN REENT,<TRO F,F4FL!VFLG ;RE-ENTRANT LIB40>
4326 TLO N,F4SW; SET FORTRAN FOUR FLAG
4327 HRRZ V,R; SET PROG BREAK INTO V
4328 MOVEM V,LLC; SAVE FIRST WORD ADDRESS
4329 HRRZM W,MLTP; MADE LABELS
4330 HRRZM W,PLTP; PROGRAMMER LABELS
4331 ADD W,[POINT 1,1]; GENERATE BIT-BYTE POINTER
4333 MOVEM W,SDSTP; FIRST DATA STATEMENT
4335 HRREI W,-↑D36; BITS PER WORDUM
4336 MOVEM W,BITC; BIT COUNT
4337 PUSHJ P,BITWX ;MAKE SURE OF ENOUGH SPACE
4338 MOVE W,[JRST ALLOVE] ;LAST DATA STATEMENT
4341 TEXTR: PUSHJ P,WORD; TEXT BY DEFAULT
4345 MOVEI C,1; RELOCATABLE
4346 TLNN F,FULLSW!SKIPSW ;DON'T LOAD IF EITHER SET
4347 PUSHJ P,BITW; SHOVE AND STORE
4348 JRST TEXTR; LOOP FOR NEXT WORD
4350 ABS: SOSG BLKSIZ; MORE TO GET
4353 MOVEI C,0; NON-RELOCATABLE
4354 TLNN F,FULLSW!SKIPSW ;DON'T LOAD IF EITHER SET
4355 PUSHJ P,BITW; TYPE 0
4359 SUBTTL PROCESS TABLE ENTRIES
4361 MDLB: TLNE F,FULLSW+SKIPSW; MADE LABEL PROC
4362 JRST GLOBDF; NO ROOM AT THE IN
4363 HLRZ C,MLTP; GET PRESENT SIZE
4364 CAMGE C,BLKSIZ; IF NEW SIZE BIGGER, STR-R-RETCH
4366 HRRZ C,MLTP; GET BASE
4367 MLPLC: ADD C,BLKSIZ; MAKE INDEX
4368 TLNN F,FULLSW+SKIPSW; DONT LOAD
4369 HRRZM V,(C); PUT AWAY DEFINITION
4370 GLOBDF: PUSHJ P,WORD
4371 TLNE F,FULLSW+SKIPSW ;SKIPPING THIS PROG?
4372 JRST TEXTR ;YES, DON'T DEFINE
4373 MOVEI C,(V); AND LOC
4375 PUSHJ P,SYMXX; PUT IN DDT-SYMBOL TABLE
4379 PLB: TLNE F,FULLSW+SKIPSW
4381 HLRZ C,PLTP; PRESENT SIZE
4388 SUBTTL STORE WORD AND SET BIT TABLE
4390 BITW: MOVEM W,@X; STORE AWAY OFFSET
4391 IDPB C,BITP; STORE BIT
4392 AOSGE BITC; STEP BIT COUNT
4393 AOJA V,BITWX; SOME MORE ROOM LEFT
4394 HRREI C,-↑D36; RESET COUNT
4397 SOS BITP; ALL UPDATED
4398 IFE EXPAND,<HRL C,MLTP
4401 IFN EXPAND,<HRRZ C,MLTP; TO ADDRESS
4404 PUSHJ P,[PUSHJ P,XPAND
4410 HRRZ T,SDSTP; GET DATA POINTER
4411 BLT C,-1(T); MOVE DOWN LISTS
4412 AOJ V,; STEP LOADER LOCATION
4417 MOVEI H,@X ;KEEP H SET RIGHT FOR HISEG STUFF
4419 CAIG T,(H); OVERFLOW CHECK
4420 IFE EXPAND,<TLO F,FULLSW>
4421 IFN EXPAND,<PUSHJ P, [PUSHJ P,XPAND
4427 SMLT: SUB C,BLKSIZ; STRETCH
4428 MOVS W,MLTP ;LEFT HALF HAS OLD BASE
4429 ADD C,MLTP ;RIGHT HALF HAS NEW BASE
4430 IFN EXPAND,< HRRZS C ;GET RID OF COUNT
4432 PUSHJ P,[PUSHJ P,XPAND
4437 HRRM C,MLTP ;PUT IN NEW MLTP
4438 HLL C,W ;FORM BLT POINTER
4439 ADDI W,(C) ;LAST ENTRY OF MLTP
4440 HRL W,BLKSIZ ;NEW SIZE OF MLTP
4442 SLTC: BLT C,0(W); MOVE DOWN (UP?)
4449 IFN EXPAND,< HRRZS C
4451 PUSHJ P,[PUSHJ P,XPAND
4456 HRRM C,MLTP ;PUT IN NEW MLTP
4458 HLRZ W,PLTP ;OLD SIZE OF PL TABLE
4459 ADD W,PLTP ;NEW BASE OF PL TABLE
4460 HRL W,BLKSIZ ;NEW SIZE OF PL TABLE
4461 HLLM W,PLTP ;INTO POINTER
4466 FORTHI: HRRZ T,JOBREL ;CHECK FOR CORE OVERFLOW
4468 PUSHJ P,[PUSHJ P,HIEXP
4470 JRST POPJM3 ;CHECK AGAIN
4475 SUBTTL PROCESS END CODE WORD
4477 ENDS: PUSHJ P,WORD; GET STARTING ADDRESS
4478 JUMPE W,ENDS1; NOT MAIN
4479 ADDI W,(R); RELOCATION OFFSET
4480 TLNE N,ISAFLG; IGNORE STARTING ADDRESS
4482 HRRZM W,STADDR ;STORE STARTING ADDRESS
4483 IFN NAMESW,<MOVE W,1(N) ;SET UP NAME
4487 ENDS1: PUSHJ P,WORDPR ;DATA STORE SIZE
4488 HRRZM C,PTEMP ;NUMBER OF PERMANENT TEMPS
4489 MOVEM V,CCON; START OF CONSTANTS AREA
4491 MOVEM W,BLKSIZ ;SAVE COUNT
4492 MOVEI W,0(V) ;DEFINE CONST.
4494 TLNN F,SKIPSW!FULLSW
4496 PUSHJ P,GSWD ;STORE CONSTANT TABLE
4497 E1: MOVEI W,0(V); GET LOADER LOC
4498 EXCH W,PTEMP; STORE INTO PERM TEMP POINTER
4499 ADD W,PTEMP; FORM TEMP TEMP ADDRESS
4500 MOVEM W,TTEMP; POINTER
4501 MOVEM V,GSTAB; STORE LOADER LOC IN GLOBSUB
4503 MOVE C,TTR50 ;DEFINE %TEMP.
4504 TLNE F,SKIPSW!FULLSW
4507 MOVE C,PTR50 ;DEFINE (IF EXTANT) TEMP.
4509 CAME W,TTEMP ;ANY PERM TEMPS?
4510 PUSHJ P,SYMPT ;YES, DEFINE
4511 E1A: PUSHJ P,WORD; NUMBER OF GLOBSUBS
4513 MOVEM W,BLKSIZ ;SIZE OF GLOBSUB
4514 PUSHJ P,GSWD ;STORE GLOBSUB TABLE
4515 E11: MOVEM V,STAB; SCALARS
4516 PUSHJ P,WORD; HOW MANY?
4518 PUSHJ P,GSWDPR ;STORE SCALAR TABLE
4519 E21: MOVEM V,ATAB; ARRAY POINTER
4520 PUSHJ P,WORD; COMMENTS FOR SCALARS APPLY
4522 PUSHJ P,GSWDPR ;STORE ARRAY TABLE
4523 E31: MOVEM V,AOTAB; ARRAYS OFFSET
4524 PUSHJ P,WORD; SAME COMMENTS AS ABOVE
4526 PUSHJ P,GSWDPR ;STORE ARRAY OFFSET TABLE
4527 E41: PUSHJ P,WORD; TEMP, SCALAR, ARRAY SIZE
4528 TLNE F,FULLSW!SKIPSW ;SKIPPING THIS PROG?
4529 MOVEI W,0 ;DON'T ACCEPT GLOB SUBPROG REQUESTS
4530 MOVEM V,CTAB; SETUP COMMON TABLE POINTER
4531 ADD W,GSTAB; GLOBAL SUBPROG BASE
4532 MOVEM W,COMBAS; START OF COMMON
4533 PUSHJ P,WORD; COMMON BLOCK SIZE
4535 JUMPE W,PASS2; NO COMMON
4536 COMTOP: PUSHJ P,WORDPR ;GET A COMMON PAIR
4537 TLNE F,SKIPSW!FULLSW ;IF SKIPPING
4538 JRST COMCO1 ;DON'T USE
4539 PUSHJ P,SDEF; SEARCH
4540 JRST COMYES; ALREADY THERE
4542 HRR W,COMBAS; PICK UP THIS COMMON LOC
4543 TLNN F,SKIPSW!FULLSW
4544 PUSHJ P,SYMXX; DEFINE IT
4545 MOVS W,W; SWAP HALFS
4546 ADD W,COMBAS; UPDATE COMMON LOC
4547 HRRM W,COMBAS; OLD BASE PLUS NEW SIZE
4548 HLRZS W; RETURN ADDRESS
4550 TLNN F,SKIPSW!FULLSW
4552 COMCOM: PUSHJ P,CWSTWX ;STORE A WORD PAIR
4558 COMYES: HLRZ C,2(A); PICK UP DEFINITION
4559 CAMLE W,C; CHECK SIZE
4560 JRST ILC; ILLEGAL COMMON
4567 PRSTWX: PUSHJ P,WORDPR ;GET A WORD PAIR
4568 CWSTWX: EXCH C,W ;SPACE TO STORE FIRST WORD OF PAIR?
4570 EXCH C,W ;THERE WAS; IT'S STORED
4571 WSTWX: TLNE F,FULLSW!SKIPSW ;SPACE FOR ANOTHER WORD?
4572 POPJ P, ;NOPE, RETURN
4573 MOVEM W,@X ;YES, STORE IT.
4574 AOJA V,BITWX ;TELL THE TABLES ABOUT IT; THEN RETURN
4577 GSWD: PUSHJ P,WORD ;GET WORD FROM TABLE
4578 PUSHJ P,WSTWX ;STASH IT
4579 SOSE BLKSIZ ;FINISHED?
4580 JRST GSWD ;NOPE, LOOP
4583 GSWDPR: MOVEM W,BLKSIZ ;KEEP COUNT
4584 GSWDP1: PUSHJ P,PRSTWX ;GET AND STASH A PAIR
4585 SOS BLKSIZ ;FINISHED?
4587 JRST GSWDP1 ;NOPE, LOOP
4591 SUBTTL BEGIN HERE PASS2 TEXT PROCESSING
4594 IFN REENT,<TLNE F,HIPROG
4596 MOVEM V,TOPTAB ;SAVE FOR OVERLAP CHECKING
4597 TLNE F,FULLSW+SKIPSW; ABORT?
4599 MOVE V,LLC ;PICK UP PROGRAM ORIGIN
4600 CAML V,CCON ;IS THIS A PROGRAM?
4601 JRST FBLKD ;NO, GO LOOK FOR FIRST BLK DATA
4602 TLOE N,PGM1 ;YES, IS THIS FIRST F4 PROG?
4604 HRR W,COMBAS ;YES, PLACE PROG BREAK IN LH
4605 IFE L,<IFN REENT,<TLNN F,HIPROG ;DON'T BOTHER IF IN HISEG, CHAIN NOT SMART ENOUGH>
4606 HRLM W,JOBCHN(X) ;FOR CHAIN>
4607 NOPRG: HRRZ W,PLTP; GET PROG TABLE BASE
4608 HLRZ C,PLTP; AND SIZE
4609 ADD W,C; COMPUTE END OF PROG TABLE
4610 ADD W,[POINT 1,1]; AND BEGINNING OF BIT TABLE
4611 EXCH W,BITP; SWAP POINTERS
4612 PASS2B: ILDB C,BITP; GET A BIT
4613 JUMPE C,PASS2C; NO PASS2 PROCESSING
4614 PUSHJ P,PROC; PROCESS A TAG
4615 JRST PASS2B; MORE TO COME
4618 PROC: LDB C,[POINT 6,@X,23]; TAG
4619 SETZM MODIF; ZERO TO ADDRESS MODIFIER
4622 MOVEI W,TABDIS; HEAD OF TABLE
4623 HRLI W,-TABLNG ;SET UP FOR AOBJN
4624 HLRZ T,(W); GET ENTRY
4627 JUMPGE W,LOAD4A ;RAN OUT OF ENTRIES
4628 HRRZ W,(W); GET DISPATCH
4629 LDB C,[POINT 12,@X,35]
4633 PASS2C: PUSHJ P,PASS2A
4639 TABDIS: XWD 11,PCONS; CONSTANTS
4640 XWD 06,PGS; GLOBAL SUBPROGRAMS
4643 XWD 01,PATO; ARRAYS OFFSET
4644 XWD 00,PPLT; PROGRAMMER LABELS
4645 XWD 31,PMLT; MADE LABESL
4646 XWD 26,PPT; PERMANENT TEMPORARYS
4647 XWD 27,PTT; TEMPORARY TEMPORARYS
4649 ;DISPATCH ON A HEADER
4651 HEADER: CAMN W,[EXP -2]; END OF PASS ONE
4653 LDB C,[POINT 12,W,35]; GET SIZE
4656 JUMPE W,PLB; PROGRAMMER LABEL
4657 CAIN W,500000; ABSOLUTE BLOCK
4659 CAIN W,310000; MADE LABEL
4660 JRST MDLB; MADE LABEL
4663 CAIN W,700000; DATA STATEMENT
4665 JRST LOAD4A; DATA STATEMENTS WILL GO HERE
4667 TTR50: RADIX50 10,%TEMP.
4668 PTR50: RADIX50 10,TEMP.
4669 CNR50: RADIX50 10,CONST.
4672 SUBTTL ROUTINES TO PROCESS POINTERS
4674 PCONS: ADD C,CCON; GENERATE CONSTANT ADDRESS
4675 SOJA C,PCOMX ;ADJUST FOR 1 AS FIRST ENTRY
4677 PSTA: PUSHJ P,SWAPSY ;NON-COMMON SCALARS AND ARRAYS
4678 ADDI C,(R); RELOCATE
4679 PCOM1: PUSHJ P,SYDEF ;...
4680 PCOMX: ADD C,MODIF ;ADDR RELOC FOR DP
4681 HRRM C,@X; REPLACE ADDRESS
4682 PASS2A: AOJ V,; STEP READOUT POINTER
4683 CAML V,CCON ;END OF PROCESSABLES?
4684 CPOPJ1: AOS (P); SKIP
4687 PAT: SKIPA W,ATAB ;ARRAY TABLE BASE
4688 PST: MOVE W,STAB ;SCALAR TABLE BASE
4690 ADD C,W ;ADD IN TABLE BASE
4691 ADDI C,-2(X); TABLE ENTRY
4692 HLRZ W,(C); CHECK FOR COMMON
4693 JUMPE W,PSTA; NO COMMON
4694 PUSHJ P,COMDID ;PROCESS COMMON
4697 COMDID: LSH W,1 ;PROCESS COMMON TABLE ENTRIES
4698 ADD W,CTAB; COMMON TAG
4699 ADDI W,-2(X); OFFSET
4700 PUSHJ P,SWAPSY; GET SYMBOL AND SET TO DEFINED
4701 ADD C,1(W); BASE OF COMMON
4705 ADD C,AOTAB; ARRAY OFFSET
4706 ADDI C,-2(X); LOADER OFFSET
4707 MOVEM C,CT1; SAVE CURRENT POINTER
4708 HRRZ C,1(C); PICK UP REFERENCE POINTER
4709 ANDI C,7777; MASK TO ADDRESS
4710 ROT C,1; ALWAYS A ARRAY
4713 HLRZ W,(C); COMMON CHECK
4715 PUSHJ P,COMDID ;PROCESS COMMON
4723 NCO: PUSHJ P,SWAPSY;
4724 ADDI C,(R) ;DEFINE SYMBOL IN TRUE LOC
4727 HRRZ C,(C) ;OFFSET ADDRESS PICKUP
4728 ADDI C,(R) ;WHERE IT WILL BE
4729 JRST PCOMX ;STASH ADDR AWAY
4731 PTT: ADD C,TTEMP; TEMPORARY TEMPS
4732 SOJA C,PCOMX ;ADJUST FOR 1 AS FIRST ENTRY
4734 PPT: ADD C,PTEMP; PERMANENT TEMPS
4735 SOJA C,PCOMX ;ADJUST FOR 1 AS FIRST ENTRY
4737 PGS: ADD C,GSTAB; GLOBSUBS
4738 ADDI C,-1(X); OFFSET
4740 TLC C,640000; MAKE A REQUEST
4741 PUSHJ P,TBLCHK ;CHECK FOR OVERLAP
4742 MOVEI W,(V); THIS LOC
4743 HLRM W,@X; ZERO RIGHT HALF
4747 SYDEF: TLNE N,SYDAT ;SYMBOL WANTS DEFININITION?
4748 POPJ P, ;NO, GO AWAY
4749 PUSH P,C ;SAVE THE WORLD
4751 PUSHJ P,TBLCHK ;CHECK FOR OVERLAP
4753 SKIPE C,T ;PICKUP VALUE
4769 IFN REENT,<JRST RESTRX>
4773 SWAPSY: MOVEI T,0; SET TO EXCHANGE DEFS
4774 EXCH T,1(C); GET NAME
4775 HRRZ C,(C) ;GET VALUE
4777 TBLCHK: HRRZ W,MLTP ;GETT TOP OV TABLES
4779 CAMG W,TOPTAB ;WILL IT OVERLAP
4780 IFE EXPAND,<TLO F,FULLSW>
4781 IFN EXPAND,<JRST [PUSHJ P,XPAND
4790 ALLOVE: TLZ N,F4SW ;END OF F4 PROG
4791 HRRZ V,SDSTP ;GET READY TO ZERO OUT DATA STMTS
4792 SETZM (V) ;AT LEAST ONE THERE
4793 CAIL V,(S) ;IS THERE MORE THAN ONE??
4796 ADDI V,1 ;SET UP BLT
4797 BLT V,(S) ;ZERO OUT ALL OF IT
4798 NOMODS: MOVE H,SVFORH
4799 TLNE F,FULLSW!SKIPSW
4801 HRR R,COMBAS ;TOP OF THE DATA
4802 CAMG H,SDS ;HIGHEST LOC GREATER THAN DATA STATEMENTS?
4803 JRST HIGH3A ;NO, RETURN
4804 ADDI H,1(S) ;YES, SET UP MEANINGFUL ERROR COMMENT
4806 TLO F,FULLSW ;INDICATE OVERFLO
4807 HIGH3A: IFN REENT,<SETZ W, ;CAUSES TROUBLE OTHERWISE
4817 DATAS: TLNE F,FULLSW+SKIPSW
4819 MOVEI C,(S) ;ADDR OF WORD UNDER SYMBOL TABLE
4820 MOVN W,BLKSIZ ;HOW FAR DOWN TO BLT
4821 ADDM W,PLTP ;UPDATE TABLE POINTERS
4824 ADD C,W ;RH(C):= WHEN TO STOP BLT
4825 HRL C,MLTP ;SOURCE OF BLTED DATA
4826 ADD W,MLTP ;UPDATE, GET DESTINATION OF BLT DATA
4827 IFN EXPAND,< HRRZS W ;GET RID OF LEFT HALF
4829 PUSHJ P,[PUSHJ P,XPAND
4832 ADD C,[XWD 2000,2000]
4834 HRRM W,MLTP ;NO SET THIS SO EXTRA CORE NOT ZEROED
4835 HLL W,C ;FORM BLT POINTER
4836 BLT W,-1(C) ;MOVE TABLES DOWN (BUT NOT JRST ALLOVE)
4838 DAX: PUSHJ P,WORD; READ ONE WORD
4839 TLNN F,FULLSW+SKIPSW
4841 SOSLE BLKSIZ ;COUNT OF DATA SEQUENCE SIZE
4842 AOJA C,DAX ;INCREMENT DATA SEQUENCE DEPOSIT LOC
4846 FBLKD: TLOE N,BLKD1 ;IS THIS FIRST BLOCK DATA?
4848 HRR V,COMBAS ;PLACE PROG BREAK IN RH FOR
4849 IFE L,<IFN REENT,< TLNN F,HIPROG>
4850 HRRM V,JOBCHN(X) ;CHAIN>
4851 ENDTP: TLNE F,FULLSW+SKIPSW
4854 ENDTP0: CAML V,STAB; ANY MORE GLOBSUBS
4856 MOVE C,@X; GET SUBPROG NAME
4857 PUSHJ P,SREQ; IS IT ALLREADY REQUESTED
4859 PUSHJ P,SDEF; OR DEFINED
4862 MOVEI W,0 ;PREPARE DUMMY LINK
4863 TLNN F,FULLSW+SKIPSW ;ABORT
4864 PUSHJ P,SYM3X; PUT IN DUMMY REQUEST
4865 PUSHJ P,BITWX; OVERLAP CHECK
4868 ENDTPW: HRRZ V,SDSTP
4869 IFN EXPAND,<IFN REENT,<TLNE F,HIPROG
4878 ENDTPH: HRR V,SDSTP>
4879 HRRZM V,SDS ;DATA STATEMENT LOC
4880 ENDTP1: SUBI V,(X); COMPENSATE FOR OFFSET
4882 TLNE W,-1; NO LEFT HALF IMPLIES COUNT
4883 JRST DODON; DATA DONE
4888 ADD W,@X; ITEMS COUNT
4890 MOVE W,[MOVEM W,LTC]
4891 MOVEM W,@X; SETUP FOR DATA EXECUTION
4895 MOVEM W,ENC; END COUNT
4900 HLRZ T,W; LEFT HALF INST.
4902 CAIN T,254000 ;JRST?
4903 JRST WRAP ;END OF DATA
4904 CAIN T,260000 ;PUSHJ?
4905 JRST PJTABL(W) ;DISPATCH VIA TABLE
4906 CAIN T,200000; MOVE?
4910 CAIN T,221000; IMULI?
4912 CAIE T,220000; IMUL?
4914 INNER: HRRZ T,@X; GET ADDRESS
4915 TRZE T,770000; ZERO TAG?
4916 SOJA T,CONPOL; NO, CONSTANT POOL
4918 SUB T,PT1; SUBTRACT INDUCTION NUMBER
4926 IFN EXPAND,<IFN REENT,<ENDTPI: HRRZ V,COMBAS
4934 FORCNF: ERROR ,</FORTRAN CONFUSED ABOUT DATA STATEMENTS#/>
4938 CONPOL: ADD T,ITC; CONSTANT BASE
4947 PJTABL: JRST DWFS ;PUSHJ 17,0
4948 AOSA PT1 ;INCREMENT DO COUNT
4949 SOSA PT1; DECREMENT DO COUNT
4950 SKIPA W,[EXP DOINT.]
4953 AOJA V,SKIPIN ;SKIP A WORD
4959 PUSHJ P,PROC; PROCESS THE TAG
4960 JRST LOAD4A ;DATA STATEMENT BELOW CODE TOP
4961 JRST LOOP ;PROPER RETURN
4963 DOINT.: POP P,V; GET ADDRESS OF INITIAL VALUE
4964 PUSH P,(V); STORE INDUCTION VARIABLE
4966 PUSH P,V; INITIAL ADDRESS
4969 DOEND.: HLRE T,@(P) ;RETAIN SIGN OF INCREMENT
4970 ADDM T,-2(P); INCREMENT
4971 HRRZ T,@(P); GET FINAL VALUE
4972 SUB T,-2(P) ;FINAL - CURRENT
4973 IMUL T,@(P) ;INCLUDE SIGN OF INCREMENT
4974 JUMPL T,DODONE ;SIGN IS ONLY IMPORTANT THING
4975 POP P,(P); BACK UP POINTER
4979 DODONE: POP P,-1(P); BACK UP ADDRESS
4983 WRAP: MOVE W,ENC; NUMBER OF CONSTANTS
4984 ADD W,ITC; CONSTANT BASE
4987 MOVEI V,(W); READY TO GO
4990 DODON: TLZ N,RCF!SYDAT!DZER ;DATA STATEMENT FLAGS
4991 MOVE W,PTEMP ;TOP OF PROG
4994 IFE EXPAND,<SUBI C,(X) ;CHECK FOR ROOM
4995 CAMGE C,COMBAS ;IS IT THERE
4996 TLO F,FULLSW ;NO (DONE EARLIER IF EXPAND)
4998 SUBI C,1 ;GET ONE LESS (TOP LOCATION TO ZERO)
4999 IFN REENT,<TLNE F,HIPROG
5001 SECZER: CAMLE W,C ;ANY DATA TO ZERO?
5002 JRST @SDS ;NO, DO DATA STATEMENTS
5003 ;FULLSW IS ON IF COMBAS GT. SDS
5004 TLNN F,FULLSW+SKIPSW ;SHOULD WE ZERO?
5005 SETZM (W) ;YES, DO SO
5006 TLON N,DZER ;GO BACK FOR MORE?
5007 AOJA W,SECZER ;YES, PLEASE
5008 HRLI W,-1(W) ;SET UP BLT POINTER TO ZERO DATA
5009 TLNN F,FULLSW+SKIPSW ;SHOULD WE ZERO?
5010 BLT W,(C) ;YES, DO SO
5011 JRST @SDS ;GO DO DATA STATEMENTS
5013 DATAOV: ERROR 0,</DATA STATEMENT OVERFLOW#/>
5017 DREAD: TLNE N,RCF; NEW REPEAT COUNT NEEDED
5021 MOVE W,@LTC; GET A WORD
5022 HLRZM W,RCNT; SET REPEAT COUNT
5023 HRRZM W,WCNT; SET WORD COUNT
5024 POP W,(W); SUBTRACT ONE FROM BOTH HALFS
5025 HLLM W,@LTC; DECREMENT REPEAT COUNT
5026 AOS W,LTC; STEP READOUT
5034 MOVE V,LTCTEM; RESTORE READOUT
5036 DOFF.: TLZ N,RCF; RESET DATA REPEAT FLAG
5041 MOVE T,(T); GET ADDRESS
5042 HLRZM T,DWCT; DATA WORD COUNT
5045 IFN REENT,<HRRZS T ;CLEAR LEFT HALF INCASE OF CARRY
5048 HRRZS T ;MUST GET RID OF LEFT HALF
5050 JRST DATAOV ;IN CASE FORTRAN GOOFS ON LIMITS
5054 IFE REENT,<ADDI T,(X)>
5057 DWFS.1: PUSHJ P,DREAD ;GET A DATA WORD
5059 IFN REENT,<CAMG T,JOBREL ;JUST TO MAKE SURE>
5062 TLNN F,FULLSW+SKIPSW ;LOAD THE NEXT DATA ITEM?
5063 MOVEM W,(T) ;YES, STORE IT
5064 SOSE W,DWCT; STEP DOWN AND TEST
5065 AOJA T,DWFS.1 ;ONE MORE TIME, MOZART BABY!
5069 SUBTTL ROUTINE TO SKIP FORTRAN OUTPUT
5071 ;SUBSECTION OF THE ROUTINE TO HANDLE OUTPUT FROM THE
5072 ;FORTRAN IV COMPILER. THE MAIN OBJECT OF THE ROUTINE IS TO
5073 ;LOOK FOR THE END BLOCK. CODE TAKEN FROM FUDGE2.
5075 MACHCD: HRRZ C,W ;GET THE WORD COUNT
5076 PUSHJ P,WORD ;INPUT A WORD
5077 SOJG C,MACHCD ;LOOP BACK FOR REST OF THE BLOCK
5078 ;GO LOOK FOR NEXT BLOCK
5080 REJECT: PUSHJ P,WORD ;READ A FORTRAN BLOCK HEADER
5081 TLC W,-1 ;TURN ONES TO ZEROES IN LEFT HALF
5082 TLNE W,-1 ;WAS LEFT HALF ALL ONES?
5083 JRST REJECT ;NO, IT WAS CALCULATED MACHINE CODE
5084 CAIN W,-2 ;YES, IS RIGHT HALF = 777776?
5085 JRST ENDST ;YES, PROCESS F4 END BLOCK
5086 LDB C,[POINT 6,W,23];GET CODE BITS FROM BITS 18-23
5087 TRZ W,770000 ;THEN WIPE THEM OUT
5088 CAIE C,70 ;IS IT A DATA STATEMENT?
5089 CAIN C,50 ;IS IT ABSOLUTE MACHINE CODE?
5090 JRST MACHCD ;YES, TREAT IT LIKE DATA STATEMENTS
5091 PUSHJ P,WORD ;NO, ITS A LABEL OF SOME SORT
5092 JRST REJECT ;WHICH CONSISTS OF ONE WORD
5093 ;LOOK FOR NEXT BLOCK HEADER
5095 ENDST: MOVEI C,1 ;TWO WORDS, FIVE TABLES, ONE WORD, ONE TABLE
5097 F4LUP1: PUSHJ P,WORD ;GET TABLE MEMBER
5098 F4LUP3: SOJGE C,F4LUP1 ;LOOP WITHIN A TABLE
5099 JUMPL T,LOAD1 ;LAST TABLE - RETURN
5100 SOJG T,F4LUP2 ;FIRST TWO WORDS AND FIVE TABLES
5101 JUMPE T,F4LUP1 ;COMMON LENGTH WORD
5102 F4LUP2: PUSHJ P,WORD ;READ HEADER WORD
5103 MOVE C,W ;COUNT TO COUNTER
5111 IFN L,<LODMAK: MOVEI A,LODMAK
5112 MOVEM A,137 ;SET UP TO SAVE THE LISP LOADER
5121 ADDM A,LMLST ;BECAUSE MACRO WON'T TAKE POLISH FIXUPS
5127 LMFILE: SIXBIT /LISP/
5131 LMLST: IOWD LODMAK+1,137