1 SUBTTL RP GRUEN/NGP/WFW/DMN V.052 7-SEP-70
3 ; TURNED ON FAILSW,SAILSW FOR NIH USAGE.
5 ; ADDITIONS FOR SAIL (SHARED EXECS, UPDATED STANSW)
8 ; TURN ON REENT FEATURES
11 VPATCH==0 ;DEC PATCH LEVEL
12 VCUSTOM==<SIXBIT / SG1/> ;NON-DEC PATCH LEVEL
16 XWD VCUSTOM,VLOADER+1000*VPATCH
19 COMMENT * ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO)
21 SWITCHES ON (NON-ZERO) IN DEC VERSION
22 SEG2SW GIVES TWO SEGMENT CODE (IF MACRO ALLOWS IT)
23 PURESW GIVES PURE CODE (VARIABLES IN LOW SEG)
24 REENT GIVES REENTRANT CAPABILITY PDP-10
25 (REENT=0 FOR PDP-10/30 OR PDP-6 OR EARLY PDP-10)
26 RPGSW INCLUDE CCL FEATURE
27 TEMP INCLUDE TMPCOR FEATURE
28 DMNSW SYMBOL TABLE WILL BE MOVED DOWN FROM TOP OF CORE
29 KUTSW GIVES CORE CUTBACK ON /K
30 EXPAND FOR AUTOMATIC CORE EXPANSION
32 DIDAL GIVES DIRECT ACCESS LIBRARY SEARCH MODE
33 ALGSW WILL LOAD ALGOL OWN BLOCK (TYPE 15)
35 SWITCHES OFF (ZERO) IN DEC VERSION
36 K GIVES 1KLOADER - NO F4
38 SPMON GIVES SPMON LOADER (MONITOR LOADER)
39 TEN30 FOR 10/30 LOADER
40 STANSW GIVES STANFORD FEATURES
41 LNSSW GIVES LNS VERSION
42 FAILSW INCLUDE PROVISIONS FOR SPECIAL FAIL FIXUPS.
43 LDAC MEANS LOAD CODE INTO ACS
44 (LDAC DOES NOT WORK WITH KUTSW=1.CORE UUO CLEARS JOBBLT)
45 WFWSW GIVES BLOCK TYPE 13 (VARIABLS INTO LOW SEG)
46 SYMARG ACCEPT SYMBOLIC (GLOBAL) ARGUMENTS FOR SWITCHES
47 SPCHN WILL DO SPECIAL OVERLAYING
48 SAILSW GIVES BLOCK TYPE 15 (FORCE LOAD OF REL FILES)
49 AND 16 (FORCE SEARCH OF LIBRARIES) FOR SAIL
54 STANSW, SAILSW, FAILSW, AND REENT ALL ON
55 ALGSW, PURESW AND SEG2SW ALL OFF
66 \fSUBTTL DEFAULT ASSEMBLY SWITCH SETTINGS
68 IFNDEF SPMON,<SPMON=0>
74 IFNDEF TEN30,<TEN30=0>
78 IFNDEF DMNSW,< DMNSW=0>
80 IFNDEF DIDAL,< DIDAL=0>
93 IFNDEF STANSW,<STANSW=0>
99 IFNDEF LNSSW,<LNSSW=0>
104 IFNDEF FAILSW,<FAILSW=0>
106 IFNDEF RPGSW,<RPGSW==1>
107 IFN RPGSW,<PP==1> ;REQUIRE DISK FOR CCL
113 IFNDEF TEMP,<TEMP==1>
115 IFNDEF NAMESW,<NAMESW==1>
120 IFNDEF KUTSW,<KUTSW==1>
122 IFNDEF EXPAND,< IFN K,<EXPAND==0>
125 IFNDEF DMNSW,<DMNSW==1>
126 IFN DMNSW!LDAC,<IFNDEF SYMPAT,<SYMPAT==20>
127 IFN LDAC,<IFG 20-SYMPAT,<SYMPAT==20>>>
129 IFNDEF REENT,<REENT==1>
132 IFG STANSW,<SEG2SW==0
135 IFDEF TWOSEG,<IFNDEF SEG2SW,<SEG2SW==1>>
136 IFNDEF SEG2SW,<SEG2SW==0>
137 IFN SEG2SW,<PURESW==1>
139 IFNDEF PURESW,<PURESW==1>
141 IFNDEF WFWSW,<WFWSW==0>
146 IFNDEF SYMARG,<SYMARG==0>
148 IFNDEF SPCHN,<SPCHN==0>
150 IFNDEF DIDAL,<DIDAL==1>
152 IFNDEF ALGSW,<ALGSW==0>
155 IFNDEF SAILSW,<SAILSW==0>
158 \fSUBTTL ACCUMULATOR ASSIGNMENTS
159 F=0 ;FLAGS IN BOTH HALVES OF F
160 N=1 ;FLAGS IN LH, PROGRAM NAME POINTER IN RH
162 H=3 ;HIGHEST LOC LOADED
163 S=4 ;UNDEFINED POINTER
164 R=5 ;RELOCATION CONSTANT
165 B=6 ;SYMBOL TABLE POINTER
171 E=C+1 ;DATA WORD COUNTER
172 Q=15 ;RELOCATION BITS
173 A=Q+1 ;SYMBOL SEARCH POINTER
174 P=17 ;PUSHDOWN POINTER
177 ;MONITOR LOCATIONS IN THE USER AREA
182 EXTERN JOBDDT,JOBFF,JOBSA,JOBREL,JOBSYM,JOBUSY,JOB41
183 IFN REENT,< EXTERN JOBHRL,JOBCOR>
184 IFE K,<EXTERN JOBCHN ;RH = PROG BREAK OF FIRST BLOCK DATA
185 ;LH = PROG BREAK OF FIRST F4 PROG>
186 IFN RPGSW,< EXTERN JOBERR>
187 IFN LDAC,< EXTERN JOBBLT>
188 IFN FAILSW,< EXTERN JOBAPR>
190 NEGOFF==400 ;NEGATIVE OFFSET OF HIGH SEGMENT
193 IFN FAILSW,<;LENGTH OF PUSHDOWN LIST FOR POLISH FIXUPS
198 CSW==1 ;ON - COLON SEEN
199 ESW==2 ;ON - EXPLICIT EXTENSION IDENT.
200 SKIPSW==4 ;ON - DO NOT LOAD THIS PROGRAM
201 FSW==10 ;ON - SCAN FORCED TO COMPLETION
202 FCONSW==20 ;ON - FORCE CONSOLE OUTPUT
203 IFN REENT,<HIPROG==40 ;LOADING HI PROGRAM, SET BY HISEG. CLEARED BY EOF>
204 ASW==100 ;ON - LEFT ARROW ILLEGAL
205 FULLSW==200 ;ON - STORAGE EXCEEDED
206 SLIBSW==400 ;ON - LIB SEARCH IN THIS PROG
207 RMSMSW==1000 ;REMEMBER IF LOADING WITH SYMBOLS DURING LIB SEARCH
208 REWSW==2000 ;ON - REWIND AFTER INIT
209 LIBSW==4000 ;ON - LIBRARY SEARCH MODE
210 NAMSSW==10000 ;NAME BLOCK HAS BEEN SEEN FOR THIS PROG
211 ISW==20000 ;ON - DO NOT PERFORM INIT
212 SYMSW==40000 ;ON - LOAD LOCAL SYMBOLS
213 DSW==100000 ;ON - CHAR IN IDENTIFIER
214 NSW==200000 ;ON - SUPPRESS LIBRARY SEARCH
215 SSW==400000 ;ON - SWITCH MODE
219 ALLFLG==1 ;ON - LIST ALL GLOBALS
220 ISAFLG==2 ;ON - IGNORE STARTING ADDRESSES
221 COMFLG==4 ;ON - SIZE OF COMMON SET
222 IFE K,< F4SW==10 ;F4 IN PROGRESS
223 RCF==20 ;READ DATA COUNT
224 SYDAT==40; SYMBOL IN DATA>
225 SLASH==100 ;SLASH SEEN
226 IFE K,< BLKD1==200 ;ON- FIRST BLOCK DATA SEEN
227 PGM1==400 ;ON FIRST F4 PROG SEEN
228 DZER==1000 ;ON - ZERO SECOND DATA WORD>
229 EXEQSW==2000 ;IMMEDIATE EXECUTION
230 DDSW==4000 ;GO TO DDT
231 IFN RPGSW,<RPGF==10000 ;IN RPG MODE>
232 AUXSWI==20000 ;ON - AUX. DEVICE INITIALIZED
233 AUXSWE==40000 ;ON - AUX. DEVICE ENTERED
234 IFN PP,<PPSW==100000 ;ON - READING PROJ-PROG #>
235 IFN PP!SPCHN,<PPCSW==200000 ;ON - READING PROJ #>
236 IFN FAILSW,<HSW==400000 ;USED IN BLOCK 11 POLISH FIXUPS>
240 ;MORE FLAGS IN F (18-35)
242 SEENHI==1 ;HAVE SEEN HI STUFF
243 NOHI==2 ;LOAD AS NON-REENTRANT>
244 IFN RPGSW,<NOTTTY==4 ;DEV "TTY" IS NOT A TTY>
245 NOHI6==10 ;PDP-6 TYPE SYSTEM
246 IFN DMNSW,<HISYM==20 ;BLT SYMBOLS INTO HIGH SEGMENT>
247 SEGFL==40 ;LOAD INTO HI-SEG>
248 IFN DIDAL,<XFLG==100 ;INDEX IN CORE (BLOCK TYPE 14)
249 LSTLOD==200 ;LAST PROG WAS LOADED
250 DTAFLG==400 ;LIBRARY DEVICE IS A DTA (NEEDED FOR INDEXING)>
251 IFN DMNSW,<DMNFLG==1000> ;SYMBOL TABLE TO BE MOVED DOWN
252 IFN REENT,<VFLG==2000 ;DO LIB SEARCH OF IMP40.REL BEFORE LIB40>
253 IFN SYMARG,<ARGFL==4000 ;TREAT $%. AS RADIX-50 CHAR.>
254 TWOFL==10000 ;TWO SEGMENTS IN THIS BINARY FILE
255 LOCAFL==20000 ;PRINT LOCAL SYMBOLS IN MAP
256 TTYFL==40000 ;AUX. DEV. IS TTY
259 IFE K,<F4FL==400000 ;FORTRAN SEEN>
260 COBFL==200000 ;COBOL SEEN
261 IFN ALGSW,<ALGFL==100000 ;ALGOL SEEN>
269 \fIFE K,< TITLE LOADER - LOADS MACRO AND FORTRAN FOUR>
270 IFN K,< TITLE 1KLOAD - LOADS MACRO>
274 IFN SEG2SW,<TWOSEGMENTS
280 DSKBLK==200 ;LENGTH OF DISK BLOCKS
281 VECLEN==↑D25 ;LENGTH OF VECTOR TABLE FOR OVERLAYS>
284 RELLEN==↑D20 ;#NUMBER OF REL FILES OR LIBRARIES (MUST BE SAME)>
288 OPDEF RESET [CALLI 0]
289 OPDEF SETDDT [CALLI 2]
290 OPDEF DDTOUT [CALLI 3]
291 OPDEF DEVCHR [CALLI 4]
292 OPDEF CORE [CALLI 11]
293 OPDEF EXIT [CALLI 12]
294 OPDEF UTPCLR [CALLI 13]
295 OPDEF DATE [CALLI 14]
296 OPDEF MSTIME [CALLI 23]
297 OPDEF PJOB [CALLI 30]
298 OPDEF SETUWP [CALLI 36]
299 OPDEF REMAP [CALLI 37]
300 OPDEF GETSEG [CALLI 40]
302 OPDEF SETNAM [CALLI 43]
305 OPDEF SETNAM [CALLI 400002]
307 OPDEF TMPCOR [CALLI 44]
314 \fSUBTTL CCL INITIALIZATION
316 BEG: JRST LD ;NORMAL INITIALIZATION
317 RPGSET: RESET ;RESET UUO.
318 IFN TEMP,<MOVEI F,CTLBUF-1 ;USE CCL BUFFER FOR COMMANDS
319 HRRM F,CTLIN+1 ;DUMMY UP BYTE POINTER
320 HRLI F,-200 ;MAKE IT AN IOWD
322 MOVSI F,(SIXBIT /LOA/)
324 MOVE N,[XWD 2,TMPFIL] ;POINTER FOR TMPCOR READ
325 TMPCOR N, ;READ AND DELETE LOA FILE
326 JRST RPGTMP ;NO SUCH FILE IN CORE, TRY DISK
327 IMULI N,5 ;GET CHAR COUNT
329 MOVEM N,CTLIN+2 ;STORE IN BUFFER HEADER
330 MOVEI N,700 ;BYTE POINTER FOR LOA FILE
331 HRLM N,CTLIN+1 ;BYTE POINTER NOW COMPLETE
332 SETOM TMPFLG ;MARK THAT A TMPCOR READ WAS DONE
333 SETZM NONLOD ;NOT YET STARTED SCAN
334 JRST RPGS3C ;GET BACK IN MAIN STREAM
335 RPGTMP: SETZM TMPFLG ;MARK AS NOT TMP>
336 INIT 17,1 ;SET UP DSK FOR COMMAND FILE INPUT.
339 JRST NUTS ;CAN'T INIT, GET INPUT FROM TTY.
342 PJOB N, ;GET JOB NUMBER
343 LUP: IDIVI N,12 ;STRIP OFF LAST DIGIT
344 ADDI N+1,"0"-40 ;CONVERT TO SIXBIT
346 SOJG F,LUP ;3 DIGITS YET?
348 HRRI (SIXBIT /LOA/) ;LOADER NAME PART OF FILE NAME.
350 MOVSI (SIXBIT /TMP/) ;AND EXTENSION.
354 MOVE N,[SIXBIT /QQLOAD/]
356 MOVSI N,(SIXBIT /RPG/)
360 LOOKUP 17,CTLNAM ;FILE THERE?
362 INIT 16,1 ;GET SET TO DELETE FILE
366 SETZM CTLNAM+3 ;PUT STUFF BACK AS IT WAS
369 SETZM CTLNAM ;SET FOR RENAME
371 SETZM CTLNAM+3 ;RENAME SHOULD REQUIRE THIS ANYWAY?
375 RPGS3B: RELEASE 16, ;GET RID OF DEVICE
376 RPGS3A: SETZM NONLOD ;TO INDICATE WE HAVE NOT YET STARTED TO SCAN
380 \fRPGS3: MOVEI CTLBUF
382 INBUF 17,1 ;SET UP BUFFER.
383 RPGS3C: TTCALL 3,[ASCIZ /LOADING/] ;PRINT MESSAGE THAT WE ARE STARTING.
384 SKIPE NONLOD ;CONTIUATION OF COMMAND?
385 JRST RPGS2 ;YES, SPECIAL SETUP.
386 CCLCHN: MOVSI N,RPGF ;@ CHAIN FILES CYCLE FROM HERE
387 JRST CTLSET ;SET UP TTY
389 RPGS1: PUSHJ P,[TLNE F,ESW ;HERE FROM FOO@ COMMAND, STORE NAME.
390 JRST LDDT3 ;SAVE EXTENSION.
391 TLZE F,CSW!DSW ;AS NAME
392 MOVEM W,DTIN ;STORE AS NAME
393 SETZM W,DTIN1 ;TRY BLANK EXTENSION FIRST.
395 MOVEM 0,SVRPG ;SAVE 0 JUST IN CASE
396 SETZM NONLOD ;DETERMINE IF CONTINUATION.
397 MOVEI 0,2(B) ;BY SEEING IF ANY SYMBOLS LOADED.
399 SETOM NONLOD ;SET TO -1 AND SKIP CALLI
400 IFN TEMP,<SETZM TMPFLG>
403 OPEN 17,OPEN1 ;KEEP IT PURE
406 LOOKUP 17,DTIN ;THE FILE NAME.
407 JRST [MOVE 0,SVRPG ;RESTORE AC0=F
408 TLOE F,ESW ;WAS EXT EXPLICIT?
409 JRST ILD9 ;YES, DON'T TRY AGAIN.
410 MOVEM 0,SVRPG ;SAVE AC0 AGAIN
411 MOVSI 0,(SIXBIT /TMP/) ;TRY TMP INSTEAD
413 PUSHJ P,LDDT4 ;SET UP PPN
417 RPGS2: MOVSI 0,RPGF ;SET FLAG
421 JRST LD2Q ;BACK TO INPUT SCANNING.
427 \fSUBTTL NORMAL INITIALIZATION
430 IFN L,< HRRZM 0,LSPXIT
435 HLLZS JOBERR ;MAKE SURE ITS CLEAR.>
436 RESET ;INITIALIZE THIS JOB
437 NUTS: SETZ N, ;CLEAR N
438 CTLSET: SETZB F,S ;CLEAR THESE AS WELL
439 HLRZ X,JOBSA ;TOP OF LOADER
440 HRLI X,V ;PUT IN INDEX
441 HRRZI H,JOBDA(X) ;PROGRAM BREAK
442 MOVE R,[XWD W,JOBDA] ;INITIAL RELOCATION>
443 MOVSI E,(SIXBIT /TTY/)
445 TLNN E,10 ;IS IT A REAL TTY?
446 IFN RPGSW,<JRST [TLNN F,RPGF ;IN CCL MODE?>
447 EXIT ;NO, EXIT IF NOT TTY
448 IFN RPGSW,< TRO F,NOTTTY ;SET FLAG
449 JRST LD1] ;SKIP INIT>
450 INIT 3,1 ;INITIALIZE CONSOLE
453 CALLEX: EXIT ;DEVICE ERROR, FATAL TO JOB
457 OUTBUF 3,1 ;INITIALIZE OUTPUT BUFFERS
458 OUTPUT 3, ;DO INITIAL REDUNDANT OUTPUT
460 IFE L,< HRRZ B,JOBREL ;MUST BE JOBREL FOR LOADING REENTRANT>
461 IFN L,< MOVE B,JOBSYM ;USED INSTEAD OF JOBREL FOR SYMBOL TABLE FIXUPS>
463 SUB B,SE3 ;INITIALIZE SYMBOL TABLE POINTER
464 CAILE H,1(B) ;TEST CORE ALLOCATION>
465 JRST [HRRZ B,JOBREL;TOP OF CORE
467 CORE B, ;TRY TO GET IT
468 EXIT ;INSUFFICIENT CORE, FATAL TO JOB
470 IFN EXPAND,< IFE STANSW ,<SETZ S,
471 CORE S, ;GET PERMITTED CORE
474 SUBI S,1 ;CONVERT TO NUMBER OF WORDS
475 MOVEM S,ALWCOR ;SAVE IT FOR XPAND TEST>>
477 MOVEI S,-1 ;THERE IS ALWAYS CORE AT STANFORD!!
480 IFN PURESW,<MOVE S,[XWD HICODE,LOWCOD]
481 BLT S,LOWCOD+CODLN-1>
482 IFE L,< MOVS E,X ;SET UP BLT POINTER
486 SETZM -1(E) ;ZERO FIRST WORD
487 BLT E,(B) ;ZERO CORE UP TO THE SYMBOL AREA
488 HRRZ S,B ;INITIALIZE UNDEF. POINTER
489 HRR N,B ;INITIALIZE PROGRAM NAME POINTER
490 IFE L,< HRRI R,JOBDA ;INITIALIZE THE LOAD ORIGIN
491 MOVE E,COMM ;SET .COMM. AS THE FIRST PROGRAM
492 MOVEM E,1(B) ;STORE IN SYMBOL TABLE
493 HRRZM R,2(B) ;STORE COMMON ORIGIN>
494 MOVEI E,F.C ;INITIALIZE STATE OF THE LOADER
496 SETZM MDG ;MULTIPLY DEFINED GLOBAL COUNT
497 SETZM STADDR ;CLEAR STARTING ADDRESS
505 IFE STANSW,< SETUWP W, ;SETUWP UUO.
506 TRO F,NOHI6 ;PDP-6 COMES HERE.>
507 MOVEM F,F.C ;PDP-10 COMES HERE.>
508 IFE L,< IFN STANSW,< TRO F,DMNFLG ;ASSUME /B IS SAID...
509 MOVEM F,F.C ;AND SAVE>>
510 IFN SAILSW,<MOVE W,[XWD -RELLEN-1,LIBFLS-1] ;SET UP POINTERS
511 MOVEM W,LIBPNT# ;IN THE FORM OF AOBJN WORDS
512 MOVE W,[XWD -RELLEN-1,PRGFLS-1]
514 IFE L,< MOVSI W,254200 ;STORE HALT IN JOB41
515 MOVEM W,JOB41(X) ;...>
516 IFN L,< MOVE W,JOBREL
518 IFN SPCHN,<SETZM CHNACB ;USED AS DEV INITED FLAG TOO>
519 IFN NAMESW,<SETZM CURNAM>
520 IFN FAILSW,<MOVEI W,440000 ;SET UP THE SPECIAL BITS OF HEADNUM(ADD+POLISH)
522 SETZM POLSW ;SWITCH SAYS WE ARE DOING POLISH
523 MOVEI W,PDLOV ;ENABLE FOR PDL OV
527 SETZM LINKTB ;ZERO OUT TABLE OF LINKS
530 \f MOVE W,[XWD LINKTB,LINKTB+1]
532 IFN DMNSW,<MOVEI W,SYMPAT
534 IFN KUTSW,< IFE STANSW,<SETOM CORSZ>>
535 IFN KUTSW,< IFN STANSW,<SETZM CORSZ>> ;ASSUME /K FOR KIDS...
538 \fIFN RPGSW,<JRST LD2Q>
539 LD2: IFN RPGSW,<MOVSI B,RPGF ;HERE ON ERRORS, TURN OFF RPG
540 ANDCAM B,F.C+N ;IN CORE>
541 ;LOADER SCAN FOR FILE NAMES
543 LD2Q: MOVSI B,F.C ;RESTORE ACCUMULATORS
545 MOVE P,PDLPT ;INITIALIZE PUSHDOWN LIST
546 SETZM BUFI2 ;CLEAR INPUT BUFFER POINTER
547 IFE PP,< SETZM ILD1 ;CLEAR INPUT DEVICE NAME>
548 IFN PP,< MOVSI T,(SIXBIT /DSK/) ;ASSUME DSK.
550 SETZM OLDDEV ;TO MAKE IT GO BACK AFTER /D FOR LIBSR>
551 SETZM DTIN ;CLEAR INPUT FILE NAME
553 LD2B: RELEAS 1, ;RELEASE BINARY INPUT DEVICE
554 IFN RPGSW,< TLNE N,RPGF ;NOT IF DOING CCL STUFF
557 IDPB T,BUFO1 ;OUTPUT ASTERISK TO START INPUT
559 LD2BA: TLZ F,FULLSW+ASW+ISW+CSW+ESW+SKIPSW+SLIBSW+REWSW
560 LD2BP: TLNE F,LIBSW ;WAS LIBRARY MODE ON?
561 TLO F,SKIPSW ;YES, NORMAL MODE IS SKIPPING
563 LD2D: IFN PP,<SETZM PPN ;DON'T REMEMBER PPN FROM ONE FILE TO NEXT.
564 LD2DB: SKIPE W,OLDDEV ;RESET DEVICE IF NEEDED.
565 CAMN W,ILD1 ;IS IT SAME?
566 JRST LD2DA ;YES, FORGET IT.
567 TLZ F,ISW+DSW+FSW+REWSW
569 LD2DA: MOVEI W,0 ;INITIALIZE IDENTIFIER SCAN
570 MOVEI E,6 ;INITIALIZE CHARACTER COUNTER
571 MOVE V,LSTPT ;INITIALIZE BYTE POINTER TO W
572 TLZ F,SSW+DSW+FSW ;LEAVE SWITCH MODE
573 LD3: IFN RPGSW,<TLNE N,RPGF ;CHECK RPG FEATURE
575 SOSG BUFI2 ;DECREMENT CHARACTER COUNTER
576 INPUT 3, ;FILL TTY BUFFER
577 ILDB T,BUFI1 ;LOAD T WITH NEXT CHARACTER
578 LD3AA: CAIN T,175 ;OLD ALTMOD
580 CAIL T,140 ;LOWER CASE?
581 TRZ T,40 ;CONVERT TO UPPER CASE
583 HRLM Q,LIMBO ;SAVE THIS CHAR.
584 MOVSS LIMBO ;AND LAST ONE
585 IDIVI Q,11 ;TRANSLATE TO 4 BIT CODE
586 LDB Q,LD8(A) ;LOAD CLASSIFICATION CODE
587 CAIGE Q,4 ;MODIFY CODE IF .GE. 4
588 TLNN F,SSW ;MODIFY CODE IF SWITCH MODE OFF
589 ADDI Q,4 ;MODIFY CLASS. CODE FOR DISPATCH
590 IFN SYMARG,<CAIL Q,20 ;SKIP UNLESS SECOND FORM OF DISPATCH
591 JRST LD3AB ;DIFFERENT DISPATCH>
592 HRRZ A,LD3A(Q) ;LOAD RH DISPATCH ENTRY
593 CAIL Q,10 ;SKIP IF CORRECT DISPATCH ENTRY
594 HLRZ A,LD3A-10(Q) ;LOAD LH DISPATCH ENTRY
595 JRST @A ;JUMP TO INDICATED LOCATION
597 ;COMMAND DISPATCH TABLE
599 LD3A: XWD LD3,LD7B ;IGNORED CHAR, BAD CHAR (SWITCH)
600 XWD LD6A,LD6 ;</> OR <(>, LETTER (SWITCH)
601 XWD LD5,LD6C ;<:>, DIGIT (SWITCH ARG.)
602 XWD LD5A,LD6D ;<.>, ESCAPE SWITCH MODE <)>
603 XWD LD5C,LD7 ;<=> OR <L. ARROW>, BAD CHAR.
604 XWD LD5B,LD4 ;<,>, ALPHABETIC CHAR.
605 XWD LD5D,LD4 ;<CR.>, NUMERIC CHAR.
606 XWD LD5E1,LD7 ;<ALT MODE>, BAD CHAR. <)>
607 IFN SYMARG,<XWD LD7,LD10 ;BAD CHAR,&>
613 RPGRD: SOSG CTLIN+2 ;CHECK CHARACTER COUNT.
614 JRST [IFN TEMP,<SKIPE TMPFLG ;TMPCOR UUO READ DONE?
615 JRST LD2 ;YES, JUST LEAVE>
621 SIXBIT /ERROR WHILE READING COMMAND FILE%/
623 IBP CTLIN+1 ;ADVANCE POINTER
626 \f MOVE T,@CTLIN+1 ;AND CHECK FOR LINE #
631 LDB T,CTLIN+1 ;GET CHR
632 JRST LD3AA ;PASS IT ON>
634 LD3AB: ROT Q,-1 ;CUT Q IN HALF
635 HRRZ A,LD3A(Q) ;PULL OFF RIGHT HALF OF TABLE ENTRY
636 JUMPGE Q,@A ;WHICH IS CORRECT FOR EVEN ENTRIES
637 HLRZ A,LD3A(Q) ;BUT USE LEFT HALF FOR ODD ENTRIES
641 \fSUBTTL CHARACTER HANDLING
643 ;ALPHANUMERIC CHARACTER, NORMAL MODE
644 LD4: SOJL E,LD3 ;JUMP IF NO SPACE FOR CHAR IN W
645 CAIGE T,141 ;WORRY ABOUT LOWER CASE LETTERS
646 SUBI T,40 ;CONVERT FROM ASCII TO SIXBIT
647 IDPB T,V ;DEPOSIT CHAR OF IDENTIFIER IN W
648 TLO F,DSW ;SET IDENTIFIER FLAG
649 JRST LD3 ;RETURN FOR NEXT CHARACTER
651 ;DEVICE IDENTIFIER DELIMITER <:>
653 LD5: PUSH P,W ;SAVE W
654 TLOE F,CSW ;TEST AND SET COLON FLAG
655 PUSHJ P,LDF ;FORCE LOADING
657 TLNE F,ESW ;TEST SYNTAX
658 JRST LD7A ;ERROR, MISSING COMMA ASSUMED
659 JUMPE W,LD2D ;JUMP IF NULL DEVICE IDENTIFIER
660 MOVEM W,ILD1 ;STORE DEVICE IDENTIFIER
661 IFN PP,<MOVEM W,OLDDEV ;WE HAVE A NEW ONE, DO IGNORE OLD.>
662 TLZ F,ISW+DSW+FSW+REWSW ;CLEAR OLD DEVICE FLAGS
663 JRST LD2D ;RETURN FOR NEXT IDENTIFIER
665 ;FILE NAME EXTENSION IDENTIFIER DELIMITER <.>
667 TRNE F,ARGFL ;IS "." SPECIAL
668 JRST LD4 ;YES,RADIX-50>
669 TLOE F,ESW ;TEST AND SET EXTENSION FLAG
670 JRST LD7A ;ERROR, TOO MANY PERIODS
671 TLZE F,CSW+DSW ;SKIP IF NULL IDENT AND NO COLON
672 MOVEM W,DTIN ;STORE FILE IDENTIFIER
673 JRST LD2D ;RETURN FOR NEXT IDENTIFIER
675 ;INPUT SPECIFICATION DELIMITER <,>
677 IFN PP,<TLZE N,PPCSW ;READING PP #?
679 IFE STANSW,< HRLM D,PPN ;STORE PROJ #
680 JRST LD6A1 ];GET PROG #>
681 IFN STANSW,< PUSHJ P,RJUST ;RIGHT JUSTIFY W
682 HRLM W,PPN ;STORE PROJ NAME
683 JRST LD2DB ];GET PROG NAME>
684 PUSHJ P,RBRA ;CHECK FOR MISSING RBRA>
685 SETOM LIMBO ;USED TO INDICATE COMMA SEEN
686 TLZN F,FSW ;SKIP IF PREV. FORCED LOADING
687 PUSHJ P,FSCN2 ;LOAD (FSW NOT SET)
688 JRST LD2BP ;RETURN FOR NEXT IDENTIFIER
690 LD5B1: TLNE F,ESW ;TEST EXTENSION FLAG
691 JRST LDDT3 ;EXPLICIT EXTENSION IDENTIFIER
692 TLZN F,CSW+DSW ;SKIP IF IDENT. OR COLON
694 MOVEM W,DTIN ;STORE FILE IDENTIFIER
695 JRST LDDT2 ;ASSUME <.REL> IN DEFAULT CASE
698 \f;OUTPUT SPECIFICATION DELIMITER <=> OR <LEFT ARROW>
699 ;OR PROJ-PROG # BRACKETS <[> AND <]>
702 IFN SPCHN,<CAIN T,"=" ;DO A /= AS SWITCH
706 IFN RPGSW,<CAIN T,"@" ;CHECK FOR * COMMAND.
708 IFN PP,<CAIN T,"[" ;PROJ-PROG #?
709 JRST [TLO N,PPSW+PPCSW ;SET FLAGS
713 IFE STANSW,< JRST LD6A2]> ;READ NUMBERS AS SWITCHES
714 IFN STANSW,< JRST LD2DB]>
715 CAIN T,"]" ;END OF PP #?
716 JRST [PUSHJ P,RBRA ;PROCESS RIGHT BRACKET
717 JRST LD3] ;READ NEXT IDENT>
718 TLOE F,ASW ;TEST AND SET LEFT ARROW FLAG
719 JRST LD7A ;ERROR, MISPLACED LEFT ARROW
720 PUSHJ P,LD5B1 ;STORE IDENTIFIER
721 TLZN F,ESW ;TEST EXTENSION FLAG
722 MOVSI W,554160 ;ASSUME <.MAP> IN DEFAULT CASE
723 MOVEM W,DTOUT1 ;STORE FILE EXTENSION IDENTIFIER
724 MOVE W,DTIN ;LOAD INPUT FILE IDENTIFIER
725 MOVEM W,DTOUT ;USE AS OUTPUT FILE IDENTIFIER
726 IFN SPCHN,<MOVEM W,CHNENT ;AND FOR SPECAIL CHAINING>
727 IFN PP,<MOVE W,PPN ;PROJ-PROG #
728 MOVEM W,DTOUT+3 ;...>
729 MOVE W,ILD1 ;LOAD INPUT DEVICE IDENTIFIER
730 MOVEM W,LD5C1 ;USE AS OUTPUT DEVICE IDENTIFIER
731 IFN PP,<SKIPE W,OLDDEV ;RESTORE OLD
733 ;INITIALIZE AUXILIARY OUTPUT DEVICE
735 TLZE N,AUXSWI+AUXSWE ;FLUSH CURRENT DEVICE
737 DEVCHR W, ;IS DEVICE A TTY?
739 JRST [TRO F,TTYFL ;TTY IS AUX. DEV.
740 JRST LD2D] ;YES, SKIP INIT
741 OPEN 2,OPEN2 ;KEEP IT PURE
743 TLNE F,REWSW ;REWIND REQUESTED?
744 UTPCLR 2, ;DECTAPE REWIND
745 TLZE F,REWSW ;SKIP IF NO REWIND REQUESTED
746 MTAPE 2,1 ;REWIND THE AUX DEV
747 MOVEI E,AUX ;SET BUFFER ORIGIN
749 OUTBUF 2,1 ;INITIALIZE SINGLE BUFFER
750 TLO N,AUXSWI ;SET INITIALIZED FLAG
751 IFN LNSSW,<EXCH E,JOBFF
755 JRST LD2D ;RETURN TO CONTINUE SCAN
759 \f;RIGHT SQUARE BRACKET (PROJ-PROG NUMBERS)
761 RBRA: TLZN N,PPSW ;READING PP #?
762 POPJ P, ;NOPE, RETURN
763 TLZE N,PPCSW ;COMMA SEEN?
764 JRST LD7A ;NOPE, INDICATE ERROR
765 IFE STANSW,<HRRM D,PPN ;STASH PROG NUMBER
766 TLZ F,SSW ;AND TURN OFF SWITCH MODE>
767 IFN STANSW,<PUSHJ P,RJUST ;RIGHT JUSTIFY W
768 HRRM W,PPN ;STASH PROG NAME>
769 MOVE W,PPNW ;PICKUP OLD IDENT
770 MOVE E,PPNE ;RESTORE CHAR COUNT
771 MOVE V,PPNV ;RESTORE BYTE PNTR
777 RJUST: JUMPE W,LD7A ;NOTHING TO RIGHT JUSTIFY
778 TRNE W,77 ;IS W RJUSTED YET?
779 POPJ P, ;YES, TRA 1,4
780 LSH W,-6 ;NOPE, TRY AGAIN
784 ;& SELECTS A SYMBOL RATHER THAN ANUMBER FOR A SWITCH ARGUMENT
785 ;& MUST ALSO FOLLOW THW SYMBOL; THE FORM IS /&SYMBOL&SWITHCH
786 LD10: TRC F,ARGFL ;SET OR CLEAR SPECIAL CHARS.
787 TLCE F,SSW ;IF IN SWITCH MODE, EXIT TO GET IDENTIFIER
789 PUSHJ P,ASCR50 ;IF NOT, REENTER IT, CONVERT IDENTIFIER TO R50
790 PUSHJ P,SDEF ;AND SEE IF IT EXISTS
791 JRST LD10A ;YES IT DOES
792 PUSHJ P,PRQ ;NO, COMPLAIN. OUTPUT ?
793 PUSHJ P,SPACE ;FOLLOWED BY A SPACE
794 PUSHJ P,PRNAME ;FOLLOWED BY THIS SYMBOL
795 ERROR 0,</ DOESN'T EXIST@/>
797 LD10A: MOVE D,2(A) ;SET D=VALUE OF SYMBOL AS NUMERIC ARG
799 MOVEI E,6 ;INITIALIZE NEW IDENTIFIER SCAN
800 MOVE V,LSTPT ;(W IS ALREADY 0)
801 JRST LD3 ;NOW EAT SWITCH AND CONTINUE PROCESSING COMMAND
802 LD10B: PUSHJ P,FSCN1 ;FORCE SCAN TO COMPLETION TO MAKE SURE FILE IS LOADED
808 ;CONVERT SYMBOL IN W TO RADIX-50 IN C
812 ROTC W,6 ;C IS NEXT SIXBIT CHAR
814 JRST R50B ;UNDER 20, MAY BE ., $, OR %
817 SUBI C,20-1 ;IS NUMBER
820 JUMPN W,R50A ;LOOP FOR ALL CHARS
821 MOVE C,A ;WIND UP WITH CHAR IN C
822 TLO C,040000 ;MAKE IT GLOBAL DEFINITION
824 R50B: JUMPE C,R50D ;OK IF SPACE
830 R50E: MOVEI C,5 ;ASSUME % IF NOTHING ELSE
834 JRST R50E ;BETWEEN 31 AND 41
837 SUBI C,41-13 ;IS LETTER
840 ;DEFINE PUTS A SYMBOL IN THE UNDEFINED SYMBOL TABLE
841 ;SO LOADER CAN SCAN LIBRARY AND LOAD PROGRAMS BEFORE THEY ARE REQUESTED
842 ;THE FORM IS /&SYMBOL# WHERE SYMBOL IS CONVERTED TO RADIX-50
844 DEFINE: PUSHJ P,ASCR50 ;CONVRT TO R-50
845 MOVEI W,-2(S) ;WHERE SYMBOL WILL GO
846 CAIG W,(H) ;ENOUGH ROOM
847 IFN EXPAND,<PUSHJ P,[PUSHJ P,XPAND
851 IFE EXPAND,<TLO F,FULLSW>
852 SUB S,SE3 ;ADJUST POINTER
853 MOVEM C,1(S) ;R-50 SYMBOL
855 TLZ F,DSW!SSW ;TURN OFF SWITCHES
856 JRST LD2D ;CONTINUE TO SCAN
861 ;LINE TERMINATION <CARRIAGE RETURN>
864 IFN PP,<PUSHJ P,RBRA ;CHECK FOR UNTERMINATED PP #>
865 SKIPGE LIMBO ;WAS LAST CHAR. BEFORE CR A COMMA?
866 TLO F,DSW ;YES ,SO LOAD ONE MORE FILE
867 PUSHJ P,FSCN ;FORCE SCAN TO COMPLETION
868 JRST LD2B ;RETURN FOR NEXT LINE
870 ;TERMINATE LOADING <ALT MODE>
872 LD5E: JUMPE D,LD5E1 ;ENTER FROM G COMMAND
873 TLO N,ISAFLG ;AND IGNORE ANY STARTING ADDRESS TO COME
874 HRRZM D,STADDR ;USE NUMERIC STARTING ADDRESS
875 LD5E1: PUSHJ P,CRLF ;START A NEW LINE
876 IFN RPGSW,<RELEASE 17,0 ;RELEASE COMMAND DEVICE>
877 PUSHJ P,SASYM ;SETUP JOBSA,JOBFF,JOBSYM,JOBUSY
878 MOVE W,[SIXBIT ?LOADER?] ;FINAL MESSAGE
879 PUSHJ P,BLTSET ;SETUP FOR FINAL BLT
880 RELEASE 2, ;RELEASE AUX. DEV.
881 RELEASE 1,0 ;INPUT DEVICE
883 IFN SPCHN,<RELEASE 4,0 ;SPECIAL CHAINING CHANEL>
884 IFN NAMESW,<HRRZ W,HISTRT ;IN CASE NO NAME SET, USE FIRST LOADED
889 CAMN W,[SIXBIT /MAIN/] ;FORTRAN MAIN PROG, OR MACRO NO TITLE
890 SKIPE W,PRGNAM ;USE BINARY FILE NAME IN EITHER CASE
895 \fIFE L,< ;NONE OF THIS NEEDED FOR LISP
897 MOVE V,[XWD HHIGO,HIGO]
898 BLT V,HIGONE ;MOVE DOWN CODE TO EXIT>
899 TLNN N,EXEQSW ;DO WE WANT TO START
901 IFN RPGSW,<TLNN N,RPGF ;IF IN RPG MODE
903 HRRZ C,JOBERR ;CHECK FOR ERRORS
905 EXDLTD: TTCALL 3,[ASCIZ /?EXECUTION DELETED
908 LD5E2: HRRZ W,JOBSA(X)
909 TLNE N,DDSW ;SHOULD WE START DDT??
911 IFN RPGSW,< TLNE N,RPGF ;IF IN RPG MODE
912 JUMPE W,[TTCALL 3,[ASCIZ /?NO STARTING ADDRESS
915 JUMPE W,LD5E3 ;ANYTHING THERE?
916 TLOA W,(JRST) ;SET UP A JRST
917 LD5E3: SKIPA W,CALLEX ;NO OR NO EXECUTE, SET CALLI 12
918 TTCALL 3,[ASCIZ /EXECUTION
920 IFN LDAC,< HRLZ P,BOTACS ;SET UP FOR ACBLT
921 MOVEM W,JOBBLT+1(X) ;SET JOBBLT
924 MOVSI LSTAC,LODACS ;SET UP TO BLT BLT CODE INTO ACS
926 IFN KUTSW,<SKIPGE E,CORSZ ;DO WE WANT CORE ADJUST
927 MOVE CORAC,JFCLAC ;NO, CLEAR COREUUO>
928 IFE LDAC,<MOVE LSTAC,W ;SET END CONDITION>
930 MOVSI V,LD ;DOES IT HAVE HISEG
931 JUMPG V,HINOGO ;NO,DON'T DO CORE UUO
932 MOVSI V,1 ;SET HISEG CORE NONE ZERO
937 BLT Q,(A) ;BLT CODE DOWN
938 IFN KUTSW,<CORAC: CORE E, ;CUT BACK CORE
939 JFCLAC: JFCL ;SHOULD NEVER HAVE AN ERROR SINCE REDUCING CORE>
940 LSTAC: IFN LDAC,<JRST JOBBLT>
943 > ;;;;END OF IFE L AT BEGINNING OF THIS PAGE
946 \fSUBTTL PRINT FINAL MESSAGE
947 ; SET UP BLT AC'S, SETDDT, RELEAS
949 BLTSET: IFN RPGSW,<IFE K,<
950 JUMPE W,.+4 ;NO MESSAGE FROM CHAIN IN CCL@>>
951 PUSHJ P,FCRLF ;A RETURN
952 PUSHJ P,PWORD ;AND CHAIN OR LOADER
954 IFN FAILSW,<MOVSI Q,-20 ;FINISH UP LINK STUFF
955 FREND: HLRZ V,LINKTB+1(Q)
958 IFN REENT,<CAMGE V,HVAL1
961 IFN L,<CAML V,RINITL>
962 HRRM A,@X ;PUT END OF LINK CHAIN IN PROPER PLACE
964 IFN REENT,<MOVE X,LOWX ;RESET THINGS>>
965 IFN KUTSW,<SKIPGE C,CORSZ ;NEG MEANS DO NOT KUT BACK CORE
967 JUMPE C,MINCUT ;0 IS KUT TO MIN. POSSIBLE
968 LSH C,12 ;GET AS A NUMBER OF WORDS
970 CAMG C,JOBREL ;DO WE NEED MORE THAN WE HAVE??
971 JRST TRYSML ;NO, SEE IF NUMBER REQUESTED IS TOO SMALL
974 JFCL ;WE JUST WANT TO KNOW HOW MUCH
978 JRST NOCUT1 ;SET FOR DO NOT CHANGE SIZE
979 TRYSML: CAIG C,(R) ;IS DESIRED AMOUNT BIGGER THAN NEEDED
980 MINCUT: HRRZ C,R ;GET MIN AMOUNT
981 IORI C,1777 ;CONVERT TO A 1K MULTIPLE
982 IFN DMNSW,< TRNN F,DMNFLG ;DID WE MOVE SYMBOLS??
983 SKIPN JOBDDT(X) ;IF NOT IS DDT THERE??
985 IFE DMNSW,<SKIPE JOBDDT(X) ;IF NO SYMBOL MOVING JUST CHECK DDT>
986 JRST NOCUT ;DO NOT CUT IF SYMBOLS AT TOP AND DDT
987 NOCUT1: MOVEM C,JOBREL(X) ;SAVE FOR CORE UUO
988 MOVEM C,CORSZ ;SAVE AWAY FOR LATER
990 NOCUT: SETOM CORSZ ;SET FOR NO CUT BACK>
992 JUMPE W,NOMAX ;NO MESSAGE IF CHAIN IN CCL@>>
994 SUB Q,OLDJR ;PROPER SIZE>
995 IFE L,<HRRZ Q,JOBREL(X)>
996 LSH Q,-12 ;GET CORE SIZE TO PRINT
999 IFN REENT,<MOVE Q,HVAL
1002 JUMPE Q,NOHY ;NO HIGH SEGMENT
1003 MOVEI T,"+"-40 ;THERE IS A HISEG
1009 MOVE W,[SIXBIT /K CORE/]
1013 IFN RPGSW,<TLNE N,RPGF
1014 JRST NOMAX ;DO NOT PRINT EXTRA JUNK IN RPG MODE>
1018 PUSHJ P,RCNUM ;PRINT MAX LOW CORE SIZE
1019 IFN REENT,< SKIPE Q,JOBHRL ;GET SIZE OF HIGH SEGMENT
1020 PUSHJ P,[MOVEI Q,400001(Q) ;CLEAR HIGH ORDER BIT
1021 MOVEI T,"+"-40 ;PRINT A HIGH CORE PART
1025 MOVE W,[SIXBIT /K MAX/]
1027 IFN DMNSW,<TRNN F,DMNFLG>
1030 MOVEI Q,1(S) ;FIND THE AMOUNT OF SPACE LEFT OVER
1033 MOVE W,[SIXBIT / WORDS/]
1035 MOVE W,[SIXBIT / FREE/]
1038 NOMAX: MOVE W,JOBDDT(X)
1040 IFE TEN30,<HRLI Q,20(X) ;SET UP BLT FOR CODE
1042 IFN TEN30,<HRLI Q,JOBDDT(X)
1045 POPJ P, ;WE HAVE SET R UP BY CLEVER CODE IN SASYM
1046 IFN KUTSW,<CORERR: TTCALL 3,[ASCIZ /?NOT ENOUGH CORE
1051 \fSUBTTL SET UP JOBDAT
1053 PUSHJ P,LIBF ;SEARCH LIBRARY IF REQUIRED
1054 PUSHJ P,FSCN ;FORCE END OF SCAN
1055 IFN ALGSW,<MOVE C,[RADIX50 44,%OWN]
1056 MOVE W,%OWN ;GET VALUE
1057 TRNE F,ALGFL ;IF ALGOL PROG LOADED
1058 PUSHJ P,SYMPT ;DEFINE %OWN>
1064 PUSHJ P,PMS1 ;PRINT UNDEFS
1065 HRRZ A,H ;DO NOT CLOBBER H IF STILL INSERTING SYMBOLS
1066 SUBI A,(X) ;HIGHEST LOC LOADED INCLUDES LOC STMTS
1067 CAILE A,(R) ;CHECK AGAINST R
1068 HRR R,A ;AND USE LARGER
1069 IFE L,< HRRZ A,STADDR ;GET STARTING ADDRESS
1070 HRRM A,JOBSA(X) ;STORE STARTING ADDRESS
1071 HRRZM R,JOBFF(X) ;AND CURRENT END OF PROG
1073 IFN DMNSW,<MOVE C,[RADIX50 44,PAT..] ;MARK PATCH SPACE FOR RPG
1075 SKIPE JOBDDT(X) ;BUT ONLY IF DDT LOADED
1077 IFN REENT,<TRNE F,HISYM ;SHOULD SYMBOLS GO IN HISEG?
1079 IFN DMNSW!LDAC,< ;ONLY ASSEMBLE IF EITHER SET
1080 IFE LDAC,< TRNN F,DMNFLG ;GET EXTRA SPACE IF SYMBOLS
1081 JRST NODDT ;MOVED OR IF LOADING ACS>
1082 IFE DMNSW,< MOVEI A,20 ;FOR LOADING ACS>
1083 IFN DMNSW,< MOVE A,KORSP
1084 IFN LDAC,< TRNN F,DMNFLG ;ONLY 20 IF SYMBOLS NOT MOVED
1086 ADDI A,(R) ;GET ACTUAL PLACE TO PUT END OF SPACE
1088 CAIL A,(S) ;DO NOT OVERWRITE SYMBOLS
1089 IFN EXPAND,<JRST [PUSHJ P,XPAND>
1091 IFN EXPAND,< JRST .-1]>
1092 IFN LDAC,<HRRM R,BOTACS ;SAVE BOTTOM OF WHERE WE PUT ACS
1095 HRL A,X ;SET UP BLT FROM (X) TO R(X)
1098 IFN DMNSW,<TRNN F,DMNFLG ;NOW THE CODE TO MOVE SYMBOLS
1102 MOVE W,A ;SAVE POINTER TO FINAL LOC OF UNDEFS
1104 HLLZ Q,S ;COMPUTE LENGTH OF SYMBOL TABLE
1108 ADDI Q,-1(A) ;GET PLACE TO STOP BLT
1109 HRLI A,1(S) ;WHERE TO BLT FROM
1110 SUBI W,1(S) ;GET AMOUNT TO CHANGE S AND B BY
1111 BLT A,(Q) ;MOVE SYMBOL TABLE
1113 ADD B,W ;CORRECT S AND B FOR MOVE
1114 HRRI R,1(Q) ;SET R TO POINT TO END OF SYMBOLS
1116 SKIPN JOBDDT(X) ;IS DDT LOADED
1117 JRST NODDT ;ON THE CONTRARY, DO LEAVE SYMBOLS!!!!!
1119 HRLM R,JOBSA(X) ;AND SAVE AWAY NEW JOBFF
1120 IFN LDAC,<SKIPA> ;SKIP THE ADD TO R
1122 IFN LDAC,<ADDI R,20> ;MAKE SURE R IS CORRECT FOR BLT
1124 ADDI A,1 ;SET UP JOBSYM, JOBUSY
1125 IFE L,<MOVEM A,JOBSYM(X)>
1126 IFN L,<MOVEM A,JOBSYM>
1129 IFE L,<MOVEM A,JOBUSY(X)
1130 MOVE A,HISTRT ;TAKE POSSIBLE REMAP INTO ACCOUNT
1131 MOVEM A,JOBREL(X) ;SET UP FOR IMEDIATE EXECUTION>
1132 IFN L,<MOVEM A,JOBUSY>
1134 SKIPE A,HILOW ;SET UP TOP LOC OF LOW CORE EXCLUDING BLOCKS
1135 SUBI A,1(X) ;IF NON-ZERO THEN IT NEEDS RELOCATION
1147 \fSUBTTL BLT SYMBOL TABLE INTO HIGH SEGMENT
1149 BLTSYM: MOVE Q,HVAL ;GET ORIGIN OF HISEG
1150 CAMN Q,HVAL1 ;HAS IT CHANGED?
1152 HLLZ Q,S ;COMPUTE LENGTH OF SYMBOL TABLE
1153 HLRS S ;PUT NEG COUNT IN BOTH HALVES
1154 JUMPE S,.+2 ;SKIP IF S IS ZERO
1155 HRLI S,-1(S) ;SUB 1 FROM LEFT TO FIX CARRY PROBLEM
1159 ADD Q,HVAL ;ADD LENGTH OF HISEG
1160 SUB Q,HVAL1 ;BUT REMOVE ORIGIN
1161 ADD Q,HISTRT ;START OF HISEG IN CORE
1162 HRRZS Q ;CLEAR INDEX FROM Q
1163 ADD Q,KORSP ;SAVE SPACE FOR SYMBOL PATCHES
1164 CORE Q, ;EXPAND IF NEEDED
1167 SOJ B, ;REMOVE CARRY FROM ADD TO FOLLOW
1168 MOVSS B ;SWAP SYMBOL POINTER
1170 HRRM B,(P) ;SAVE NEW B
1172 ADD B,S ;INCASE ANY UNDEFS.
1173 BLT B,(Q) ;MOVE SYMBOLS
1177 SOJ B, ;REMOVE CARRY
1178 ADDI S,(B) ;SET UP JOBUSY
1179 BLTSY1: MOVE Q,JOBREL
1182 SUBI Q,1 ;ONE TOO HIGH
1188 \fNOBLT: HRRZ Q,HILOW ;GET HIGHEST LOC LOADED
1189 HRRZ A,S ;GET BOTTOM OF UNDF SYMBOLS
1190 SUB A,KORSP ;DON'T FORGET PATCH SPACE
1191 IORI A,1777 ;MAKE INTO A K BOUND
1193 CAIN A,(Q) ;ARE THEY IN SAME K
1194 IFN EXPAND,<JRST [PUSHJ P,XPAND>
1196 IFN EXPAND,< JRST NOBLT]>
1197 MOVEM Q,HISTRT ;SAVE AS START OF HIGH
1198 MOVEI A,400000 ;HISEG ORIGIN
1199 MOVEM A,HVAL1 ;SAVE AS ORIGIN
1200 SUB S,HISTRT ;GET POSITION OF UNDF POINTER
1201 ADDI S,377777 ;RELATIVE TO ORG
1202 SUB B,HISTRT ;SAME FOR SYM POINTER
1204 TRO F,SEENHI ;SO JOBHRL WILL BE SET UP
1205 JRST BLTSY1 ;AND USE COMMON CODE
1209 MORCOR: ERROR ,</MORE CORE NEEDED#/>
1213 \fSUBTTL WRITE CHAIN FILES
1215 IFE K,< ;DONT INCLUDE IN 1KLOAD
1216 CHNC: SKIPA A,JOBCHN(X) ;CHAIN FROM BREAK OF FIRST BLOCK DATA
1217 CHNR: HLR A,JOBCHN(X) ;CHAIN FROM BREAK OF FIRST F4 PROG
1218 IFN ALGSW,<TRNE F,ALGFL ;IF ALGOL LOADING
1219 POPJ P, ;JUST RETURN>
1220 HRRZS A ;ONLY RIGHT HALF IS SIGNIFICANT
1221 JUMPE A,LD7C ;DON'T CHAIN IF ZERO
1222 TLNN N,AUXSWI ;IS THERE AN AUX DEV?
1223 JRST LD7D ;NO, DON'T CHAIN
1224 PUSH P,A ;SAVE WHEREFROM TO CHAIN
1225 JUMPE D,.+2 ;STARTING ADDR SPECIFIED?
1226 HRRZM D,STADDR ;USE IT
1227 CLOSE 2, ;INSURE END OF MAP FILE
1228 TLZ N,AUXSWI+AUXSWE ;INSURE NO PRINTED OUTPUT
1229 PUSHJ P,SASYM ;DO LIB SEARCH, SETUP JOBSA, ETC.
1230 IFN RPGSW,<TLNE N,RPGF ;IF IN CCL MODE
1231 TDZA W,W ;NO MESSAGES>
1232 MOVE W,[SIXBIT ?CHAIN?] ;FINAL MESSAGE
1233 PUSHJ P,BLTSET ;SETUP BLT PNTR, SETDDT, RELEAS
1234 POP P,A ;GET WHEREFROM
1235 HRRZ W,R ;CALCULATE MIN IOWD NECESSARY
1236 SKIPE JOBDDT(X) ;IF JOBDDT KEEP SYMBOLS
1239 HRRZ W,JOBREL ;NEED SYMBOLS AND THEY HAVE NOT MOVED DOWN
1240 SUBI W,(X) ;BECAUSE WE WILL NOT HAVE BLITTED
1241 SUBI B,-1(X) ;SYMBOL TABLE WILL COME OUT IN A
1242 MOVEM B,JOBSYM(X) ;DIFFERENT PLACE
1246 PUSH A,W ;SAVE LENGTH
1249 SETZM IOWDPP+1 ;JUST IN CASE
1251 PUSH A,JOBSA(X) ;SETUP SIX WORD TABLE
1252 PUSH A,JOBSYM(X) ;...
1255 SETSTS 2,17 ;SET AUX DEV TO DUMP MODE
1256 MOVSI W,435056 ;USE .CHN AS EXTENSION
1258 PUSHJ P,IAD2 ;DO THE ENTER
1259 OUTPUT 2,IOWDPP ;WRITE THE CHAIN FILE
1260 STATZ 2,IOBAD!IODEND
1263 STATZ 2,IOBAD!IODEND
1264 IFN RPGSW,<JRST LOSEBIG
1265 TLNE N,RPGF ;IF IN CCL MODE
1266 JRST CCLCHN ;LOAD NEXT LINK
1268 LOSEBI: TTCALL 3,[ASCIZ /?DEVICE ERROR/]
1272 \fSUBTTL SPECIAL CHAINB
1276 PUSHJ P,FSCN1A ;FORCE SCAN TO COMPLETION FOR CURRENT FILE
1277 TLNN N,AUXSWI ;IS THERE AN AUX DEV??
1279 HRLZI W,-1(R) ;CHNTAB-L = ADDRESS OF VECTOR TABLE
1280 HRRI W,1 ;CHNTAB-R = NEXT DISK BLOCK TO RITE INTO
1282 MOVE C,[RADIX50 4,OVTAB] ;DEFINE GLOBAL SYMBOL OVTAB
1283 MOVEI W,(R) ;TO HAVE VALUE THE BEGINNING OF THE VECTOR TABLE
1285 ADDI R,VECLEN ;RESERVE SPACE FOR VECTOR TABLE
1286 MOVE C,[RADIX50 4,OVBEG] ;OVBEG IS BEGINNING OF OVERLAY AREA
1289 HRRZM R,BEGOV ;AND SAVE IN OVBEG
1290 OPEN 4,CHNOUT ;OPEN FILE FOR CHAIN
1291 JRST ILD5 ;CANT OPEN CHAIN FILE
1292 ENTER 4,CHNENT ;ENTER CHAIN FILE
1293 JRST IMD3 ;NO CAN DO
1295 SUB W,HISTRT ;KEEP N RIGHT HALF AS RELATIVE TO HISTRT
1296 HRRZM W,CHNACN ;SAVE FOR RESTORING
1297 MOVEM B,CHNACB ;ALSO B R IS SAVED IN BEGOV
1300 CHNENS: TLOA N,PPCSW ;THIS FLAG UNUSED AT THIS POINT
1301 CHNEN: TLZ N,PPCSW ;ON TO NOT DELETE NEW SYMBOLS
1302 SKIPN CHNACB ;WILL BE NON-ZERO IF WE SAW A /< (> TO KEEP MACRO HAPPY)
1303 JRST LD7D ;ERROR MESSAGE
1304 PUSHJ P,FSCN1A ;LOAD LIB (IF DESIRED) AND FORCE SCAN
1305 SKIPL Q,S ;CHECK SYMBOL TABLE FOR MISSED UNDEFS
1306 JRST NOER ;NONE THERE
1307 MOVEI E,0 ;COUNT OF ERRORS
1309 IFN FAILSW,<SKIPL V,1(Q) ;IF HIGH ORDER BIT IS ON
1310 TLNN V,740000 ;OR IF ALL CODE BITS 0
1311 JRST NXTCK ;THEN NOT TO BE CHECKED>
1312 MOVE V,2(Q) ;GET FIXUP WORD
1313 TLNE V,100000 ;BIT INDICATES SYMBOL TABLE FIXUP
1315 IFN FAILSW,<TLNE V,40000 ;BIT INDICATES POLISH FIXUP
1317 TLZE V,740000 ;THESE BITS WOULD MEAN ADDITIVE
1319 JRST NXTCK] ;ONLY TRY FIRST LOCATION
1321 HRRZ V,@X ;THE WAY TO LINK
1322 CORCKL: IFN REENT,<CAMGE V,HVAL1>
1324 SKIPA ;NOT IN BAD RANGE
1325 JRST ERCK ;BAD, GIVE ERROR
1326 JUMPE V,NXTCK ;CHAIN HAS RUN OUT
1327 IFN REENT,<CAMGE V,HVAL1 ;GET CORRECT LINK
1330 XCT (A) ;TELLS US WHAT TO DO
1331 JRST CORCKL ;GO ON WITH NEXT LINK
1334 \fSMTBFX: TLNE N,PPCSW ;IF NOT CUTTING BACK SYMBOL TABLE
1335 JRST NXTCK ;THE ALL OK
1336 ADD V,HISTRT ;GET PLACE TO POINT TO
1338 HLRE D,CHNACB ;OLD LENGTH OF TABLE (NEGATIVE)
1339 HLRE T,B ;NEW LENGTH
1340 SUB D,T ;-OLD LEN+NEW LEN
1341 ADDI D,(B) ;OLD BOTTOM=NEW BOTTOM+NEW LEN-OLD LEN
1342 CAIG V,(D) ;IS IT IN THE PART WE ARE KEEPING
1345 IFN FAILSW,<POLCK: HLRZ C,V ;FIND HEADER
1348 JRST LOAD4A ;SHOULD BE THERE
1349 HRL C,2(A) ;NOW FIRST OPERATOR (STORE)
1354 ANDI C,37 ;GET OPERATION
1355 HRRZ V,2(A) ;DESTINATION
1356 JRST @CKSMTB-15(C) ;DISPATCH
1357 CKSMTB: EXP SMTBFX,SMTBFX,SMTBFX,CORCK,LCORCK,CORCK,NXTCK
1358 LCORCK: JSP A,CORCKL
1360 ERCK: MOVE C,1(Q) ;GET SYMBOL NAME
1361 PUSHJ P,FCRLF ;FORCE CRLF AND OUTPUT ON TTY
1362 PUSHJ P,PRNAME ;PRINT IT
1363 ADDI E,1 ;MARK ERROR
1364 NXTCK: ADD Q,SE3 ;TRY ANOTHER
1366 IFN REENT,<PUSHJ P,RESTRX ;GET PROPER X BACK>
1367 JUMPE E,NOER ;DID ANYTHING GO WRONG??
1368 ERROR ,</UNDEFINED GLOBAL(S) IN LINK@/>
1370 NOER: MOVE A,BEGOV ;GET START OF OVERLAY
1371 ADDI A,(X) ;GET ACTUAL CURRENT LOCATION
1372 IFN REENT,<HRRZ W,HILOW ;AND END OF OVERLAY+1
1373 HRRZM A,HILOW ;RESET>
1375 ADDI R,(X) ;A GOOD GUESS>
1377 SUBI A,1 ;SET TO BASE-1 (FOR IOWD)
1380 HRR A,CHNTAB ;BLOCK WE ARE WRITING ON
1381 HLRZ V,CHNTAB ;POINTER TO SEGMENT TABLE
1382 ADDI V,1 ;NEXT LOCATION
1383 HRLM V,CHNTAB ;REMEMBER IT
1384 CAML V,BEGOV ;CHECK FOR OVERRUN
1385 JRST [ERROR </?TOO MANY LINKS@/>
1387 MOVEM A,@X ;PUT INTO TABLE
1388 MOVN W,W ;GET POSITIVE LENGTH
1390 IDIVI W,DSKBLK ;GET NUMBER OF BLOCKS
1391 ADDM W,CHNTAB ;AND UPDATE
1393 JRST NOMVB ;DO NOT ADJUST SYMBOLS
1394 HLRE W,CHNACB ;GET OLD LENGTH OF DEF SYMBOLS
1395 HLRE C,B ;AND NEW LENGTH
1396 SUB W,C ;-OLD LEN+NEW LEN
1397 HRRZ C,B ;SAVE POINTER TO CURRENT S
1400 ADD B,W ;UPDATE B (COUNT AND LOC)
1401 JUMPGE S,UNLNKD ;JUST IN CASE NOTHING TO MOVE
1402 HRRZ A,B ;PLACE TO PUT UNDEFS
1404 MOVEM W,(A) ;TRANSFER
1406 CAIE A,(S) ;HAVE WE MOVED LAST WORD??
1407 SOJA C,UNLNK ;NO, CONTINUE
1408 UNLNKD: HRRZ W,CHNACN ;GET SAVED N
1410 HRR N,W ;AND RESET IT
1411 NOMVB: HRR R,BEGOV ;PICK UP BASE OF AREA
1412 OUTPUT 4,IOWDPP ;DUMP IT
1413 STATZ 4,IOBAD!IODEND ;AND ERROR CHECK
1415 HRRZ V,R ;GET AREA TO ZERO
1417 CAIL W,1(S) ;MUST MAKE SURE SOME THERE
1424 BLT W,(S) ;ZERO WORLD
1430 \fSUBTTL EXPAND CORE
1433 XPAND: TLNE F,FULLSW ;IF CORE EXCEEDED
1434 POPJ P, ;DON'T WASTE TIME ON CORE UUO
1438 XPAND1: PUSH P,H ;GET SOME REGISTERS TO USE
1441 PUSH P,JOBREL ;SAVE PREVIOUS SIZE
1442 CAMG Q,ALWCOR ;CHECK TO SEE IF RUNNING OVER
1445 IFE K,< HRRZ H,MLTP ;GET LOWEST LOCATION
1446 TLNN N,F4SW ;IS FORTRAN LOADING>
1447 MOVEI H,1(S) ;NO, USE S
1448 POP P,X ;LAST JOBREL
1449 HRRZ Q,JOBREL;NEW JOBREL
1450 SUBI Q,(X) ;GET DIFFERENCE
1451 HRLI Q,X ;PUT X IN INDEX FIELD
1454 CAMLE X,H ;TEST FOR END
1457 TLC H,-1 ;MAKE IT NEGATIVE
1458 SETZM (H) ;ZERO NEW CORE
1463 ADDM H,HISTRT ;UPDATE START OF HISEG
1464 IFN REENT,<ADDM H,HIGHX ;AND STORE LOCATION
1466 ADDM H,-1(P) ;X IS CURRENTLY IN THE STACK>
1469 IFE K,< TLNN N,F4SW ;F4?
1486 XPAND6: POP P,A ;CLEAR JOBREL OUT OF STACK
1487 ERROR ,</MORE CORE NEEDED#/>
1490 XPAND7: PUSHJ P,XPAND
1494 XPAND9: PUSH P,Q ;SAVE Q
1495 HRRZ Q,JOBREL ;GET CORE SIZE
1496 ADDI Q,(V) ;ADD XTRA NEEDED
1497 JRST XPAND1 ;AND JOIN COMMON CODE
1499 POPJM3: SOS (P) ;POPJ TO CALL-2
1500 POPJM2: SOS (P) ;POPJ TO CALL-1
1501 SOS (P) ;SAME AS POPJ TO
1502 POPJ P, ;NORMAL POPJ MINUS TWO
1507 \fSUBTTL SWITCH HANDLING
1511 LD6A: CAIN T,57 ;WAS CHAR A SLASH?
1512 TLO N,SLASH ;REMEBER THAT
1513 LD6A2: TLO F,SSW ;ENTER SWITCH MODE
1514 LD6A1: SETZB D,C ;ZERO TWO REGS FOR DECIMAL AND OCTAL
1515 JRST LD3 ;EAT A SWITCH
1517 ;ALPHABETIC CHARACTER, SWITCH MODE
1520 CAIL T,141 ;ACCEPT LOWER CASE SWITCHES
1522 IFN SPCHN,<XCT LD6B-74(T) ;EXECUTE SWITCH FUNCTION>
1523 IFE SPCHN,<XCT LD6B-101(T) ;EXECUTE SWITCH FUNCTION>
1524 TLZE N,SLASH ;SWITCH MODE ENTERED W/ SLASH?
1525 JRST LD6D ;LEAVE SWITCH MODE
1526 JRST LD6A1 ;STAY IN SWITCH MODE
1530 \f;DISPATCH TABLE FOR SWITCHES
1532 ; THE INSTRUCTION AT THE CHARACTER LOCATION IS EXECUTED
1535 IFN SPCHN,<PUSHJ P,CHNBG ;LESS THAN - BEGINNING OF OVERLAY
1536 PUSHJ P,CHNENS ;= - PUT OUT CHAIN RETAINING SYMBOLS
1537 PUSHJ P,CHNEN ;GREATER THAN - END OF OVERLAY
1538 IFE STANSW,<JRST LD7B ;? - ERROR
1539 JRST LD7B ;@ - ERROR>
1540 IFG STANSW,<PUSHJ P,VSWTCH ;? HERE = VSWITCH
1541 PUSHJ P,HSET ;@ HERE = H SWITCH>>
1543 AT STANFORD MAP SWITCHES ? TO V
1546 PUSHJ P,ASWTCH ;A - LIST ALL GLOBALS
1547 IFN DMNSW,<PUSHJ P,DMN2 ;B - BLOCKS DOWN SYMBOL TABLE >
1548 IFE DMNSW,<JRST LD7B ;B - ERROR>
1549 IFE K,< PUSHJ P,CHNC ;C - CHAIN, START W/ COMMON>
1550 IFN K,< JRST LD7B ;C - ILLEGAL IN 1KLOAD>
1551 PUSHJ P,LDDT ;D - DEBUG OPTION, LOAD DDT
1552 TLO N,EXEQSW ;E - LOAD AND GO
1553 PUSHJ P,LIBF ;F - LIBRARY SEARCH
1554 PUSHJ P,LD5E ;G - GO INTO EXECUTION
1555 IFE STANSW,<IFN REENT,< PUSHJ P,HSET ;H - REENTRANT. PROGRAM>
1556 IFE REENT,<JFCL ;NOT REENT AND NOT STANFORD>>
1557 IFN STANSW,<PUSHJ P,LDDTQX ;H - LOAD AND START RAID>
1558 PUSHJ P,ISWTCH ;I - IGNORE STARTING ADDRESSES
1559 TLZ N,ISAFLG ;J - USE STARTING ADDRESSES
1560 IFE KUTSW,<JRST LD7B ;K - ERROR>
1561 IFN KUTSW,<MOVEM C,CORSZ ;K - SET DESIRED CORE SIZE>
1562 PUSHJ P,LSWTCH ;L - ENTER LIBRARY SEARCH
1563 PUSHJ P,PRMAP ;M - PRINT STORAGE MAP
1564 TLZ F,LIBSW+SKIPSW ;N - LEAVE LIBRARY SEARCH
1565 HRR R,D ;O - NEW PROGRAM ORIGIN
1566 PUSHJ P,PSWTCH ;P - PREVENT AUTO. LIB. SEARCH
1567 TLZ F,NSW ;Q - ALLOW AUTO. LIB. SEARCH
1568 IFE K,< PUSHJ P,CHNR ;R - CHAIN, START W/ RESIDENT>
1569 IFN K,< JRST LD7B ;R - ILLEGAL IN 1KLOAD>
1570 PUSHJ P,SSWTCH ;S - LOAD WITH SYMBOLS
1571 PUSHJ P,LDDTX ;T - LOAD AND GO TO DDT
1572 PUSHJ P,PMS ;U - PRINT UNDEFINED LIST
1573 IFE STANSW,<IFN REENT,<PUSHJ P,VSWTCH ;V - LOAD REENTRANT LIB40>
1574 IFE REENT,<JRST LD7B ;V -NO REENT, NO STANFORD: ERROR>>
1575 IFN STANSW,<PUSHJ P,LDDTQ ;V - LOAD RAID>
1576 TLZ F,SYMSW+RMSMSW ;W - LOAD WITHOUT SYMBOLS
1577 TLZ N,ALLFLG ;X - DO NOT LIST ALL GLOBALS
1579 TLO F,REWSW ;Y - REWIND BEFORE USE
1582 PUSHJ P,SEGLOD ;Y - LOAD SYS:SAILOW FOR 2-SGMT SAIL
1584 JRST LDRSTR ;Z - RESTART LOADER
1588 \f; PAIRED SWITCHES ( +,-)
1590 ASWTCH: JUMPL D,.+2 ;SKIP IF /-A
1591 TLOA N,ALLFLG ;LIST ALL GLOBALS
1595 ISWTCH: JUMPL D,.+2 ;SKIP IF /-I
1596 TLOA N,ISAFLG ;IGNORE STARTING ADDRESSES
1600 LSWTCH: JUMPL D,.+2 ;SKIP IF /-L
1601 TLOA F,LIBSW!SKIPSW ;ENTER LIBRARY SEARCH
1602 TLZ F,LIBSW!SKIPSW ;DON'T
1605 PSWTCH: JUMPL D,.+2 ;SKIP IF /-P
1606 TLOA F,NSW ;PREVENT AUTO. LIB SEARCH
1610 SSWTCH: JUMPL D,.+2 ;SKIP IF /-S
1611 TLOA F,SYMSW!RMSMSW ;LOAD WITH SYMBOLS
1612 TLZ F,SYMSW!RMSMSW ;DON'T
1616 VSWTCH: JUMPL D,.+2 ;SKIP IF /-V
1617 TROA F,VFLG ;SEARCH RE-ENTRANT LIBRARY
1622 SEGLOD: PUSHJ P,FSCN1 ;FORCE SCAN TO COMPLETION
1623 HRRZ W,R ;CHECK LEGAL
1624 CAILE W,140 ; (MUST BE NOTHING LOADED EARLIER)
1625 JRST [ERROR ,<./Y MUST APPEAR BEFORE ANY FILES ARE LOADED`.>
1626 JRST LD2] ;TRY AGAIN
1627 MOVE W,[SIXBIT /SAILOW/] ;WILL LOAD SAILOW NOW
1628 ADD W,D ;SAILOW, SAILOX, SAILOY, DEPENDING
1629 ;ON ARG -- W FOR SAIL, X FOR OSAIL, Y FOR NSAIL
1630 TLZ F,SYMSW!RMSMSW ;SET SWITCHES (SEE LDDT)
1631 PUSHJ P,LDDT1 ;SET SYS AS DEVICE, PREPARE
1632 PUSHJ P,LDF ;LOAD SAILOW
1633 POPJ P, ;AFRAID OF `JRST LDF'
1634 >; END OF SEGMENT LOADING OPTION
1638 ; H SWITCH --- EITHER /H OR /NH
1639 HSET: JUMPE D,SETNUM ;/H ALWAYS LEGAL
1640 CAIGE D,2 ;WANT TO CHANGE SEGMENTS
1641 JRST SETSEG ;YES,GO DO IT
1642 TRNN F,SEENHI ;STARTED TO LOAD YET?
1643 JRST HCONT ;NO, CONTINUE.
1644 ERROR ,<?/H ILLEGAL AFTER FIRST HISEG FILE IS LOADED@?>>
1646 LDRSTR: ERROR 0,</LOADER RESTARTED@/>
1647 JRST LD ;START AGAIN
1649 REMPFL: ERROR ,</?LOADER REMAP FAILURE@/>
1655 JRST COROVL ;BEING SET LOWER THEN 400000 OR MORE THAN TO OF LOW SEG
1656 HRRZM C,HVAL1 ;WE HAVE REMOVED THE ODD BITS TO MAKE A 1K MULT
1658 CAILE C,(D) ;MAKE SURE OF ENOUGH ROOM
1660 HRLI D,W ;SET UP W IN LEFT HALF
1664 COROVL: ERROR ,</HISEG STARTING ADDRESS TOO LOW@/>
1666 SETNUM: TRO F,NOHI ;SET NO-HIGH-SEG SWITCH.
1670 \f;SWITCH MODE NUMERIC ARGUMENT
1672 LD6C: LSH D,3 ;BUILD OCTAL NUMERIC ARGUMENT
1675 ADDI C,-"0"(T) ;ACCUMULATE DEC AND OCTAL
1678 ;EXIT FROM SWITCH MODE
1680 LD6D: TLZ F,SSW ;CLEAR SWITCH MODE FLAG
1681 TLNE F,FSW ;TEST FORCED SCAN FLAG
1682 JRST LD2D ;SCAN FORCED, START NEW IDENT.
1683 JRST LD3 ;SCAN NOT FORCED, USE PREV IDENT
1684 ;ILLEGAL CHARACTER, NORMAL MODE
1687 CAIN T,"#" ;DEFINING THIS SYMBOL
1689 TRNN F,ARGFL ;TREAT AS SPECIAL
1694 CAIN T,"Z"-100 ;TEST FOR ↑Z
1695 JRST LD5E1 ;TREAT AS ALTMODE FOR BATCH
1697 JRST LD2 ;TRY TO CONTINUE
1699 ;SYNTAX ERROR, NORMAL MODE
1701 LD7A: ERROR 8,</SYNTAX%/>
1704 ;ILLEGAL CHARACTER, SWITCH MODE
1706 LD7B: CAIN T,"-" ;SPECIAL CHECK FOR -
1709 CAIN T,"Z"-100 ;CHECK FOR /↑Z
1710 JRST LD5E1 ;SAME AS ↑Z
1715 \f;ATTEMPT TO CHAIN WITH SPECIFIED HALF OF JOBCHN = 0
1718 LD7C: ERROR ,<?UNCHAINABLE AS LOADED@?>
1721 ;ATTEMP TO CHAIN WITHOUT SPECIFYING DEVICE
1723 LD7D: ERROR ,<?NO CHAIN DEVICE@?>
1728 IFN ALGSW,<TRNE F,ALGFL ;IF LOADING ALGOL
1729 POPJ P, ;JUST RETURN>
1730 CAIN D,1 ;SPECIAL CASE
1731 TROA F,HISYM ;YES ,BLT SYMBOLS INTO HISEG
1733 TROA F,DMNFLG ;TURN ON /B
1734 IFN KUTSW,<TRZA F,DMNFLG ;TURN OFF IF /-B
1735 SETZM CORSZ ;SET TO CUT BACK CORE>
1736 IFE KUTSW,<TRZ F,DMNFLG ;TURN OFF IF /-B>
1743 \fSUBTTL CHARACTER CLASSIFICATION TABLE DESCRIPTION:
1745 ; EACH CHARACTER HAS ASSOCIATED WITH IT A FOUR BIT BYTE
1746 ; PACKED IN THE CHARACTER CLASSIFICATION TABLE. THE CHARACTER
1747 ; CLASSIFICATION CODES ARE ORDERED IN SUCH A WAY AS TO GIVE
1748 ; DELIMITERS OF HIGHER PRECEDENCE LOWER CLASSIFICATION NUMBERS.
1749 ; CERTAIN CHARACTERS HAVE NO EFFECT ON THE COMMAND STRING, AND
1750 ; THEREFORE DO NOT EFFECT ORDERING OF DELIMITERS. FOUR CODES
1751 ; ARE RESERVED FOR ALTERNATE DISPATCHES WHILE THE SWITCH MODE IS
1755 ;CLASSIFICATION BYTE CODES:
1757 ; BYTE DISP CLASSIFICATION
1759 ; 00 - 00 ILLEGAL CHARACTER, SWITCH MODE
1760 ; 01 - 01 ALPHABETIC CHARACTER, SWITCH MODE
1761 ; 02 - 02 NUMERIC CHARACTER, SWITCH MODE
1762 ; 03 - 03 SWITCH MODE ESCAPE, SWITCH MODE
1764 ; 00 - 04 ILLEGAL CHARACTER, NORMAL MODE
1765 ; 01 - 05 ALPHABETIC CHARACTER, NORMAL MODE
1766 ; 02 - 06 NUMERIC CHARACTER, NORMAL MODE
1767 ; 03 - 07 SWITCH MODE ESCAPE, NORMAL MODE
1769 ; 04 - 10 IGNORED CHARACTER
1770 ; 05 - 11 ENTER SWITCH MODE CHARACTER
1771 ; 06 - 12 DEVICE IDENTIFIER DELIMITER
1772 ; 07 - 13 FILE EXTENSION DELIMITER
1773 ; 10 - 14 OUTPUT SPECIFICATION DELIMITER
1774 ; 11 - 15 INPUT SPECIFICATION DELIMITER
1775 ; 12 - 16 LINE TERMINATION
1776 ; 13 - 17 JOB TERMINATION
1779 \f;BYTE POINTERS TO CHARACTER CLASSIFICATION TABLE
1781 LD8: POINT 4,LD9(Q),3
1791 ;CHARACTER CLASSIFICATION TABLE
1793 LD9: BYTE (4)4,0,0,0,0,0,0,0,0
1794 BYTE (4)4,4,4,4,12,0,0,0,0
1795 BYTE (4)0,0,0,0,0,0,0,0,0
1796 BYTE (4)13,0,0,0,0,4,0,4,0
1797 IFE SYMARG,< BYTE (4)0,0,0,0,5,3,0,0,11>
1798 IFN SYMARG,< BYTE (4)0,0,14,0,5,3,0,0,11>
1799 BYTE (4)0,7,5,2,2,2,2,2,2
1800 IFE SPCHN,< BYTE (4)2,2,2,2,6,0,0,10,0>
1801 IFN SPCHN,< BYTE (4)2,2,2,2,6,0,1,10,1>
1802 IFE RPGSW,< BYTE (4)0,0,1,1,1,1,1,1,1>
1803 IFN RPGSW,< BYTE (4) 0,10,1,1,1,1,1,1,1>
1804 BYTE (4)1,1,1,1,1,1,1,1,1
1805 BYTE (4)1,1,1,1,1,1,1,1,1
1806 IFE PP,<BYTE (4)1,0,0,0,0,10,0,1,1>
1807 IFN PP,<BYTE (4)1,10,0,10,0,10,0,1,1>
1808 BYTE (4)1,1,1,1,1,1,1,1,1
1809 BYTE (4)1,1,1,1,1,1,1,1,1
1810 BYTE (4)1,1,1,1,1,1,0,0,13
1814 \fSUBTTL INITIALIZE LOADING OF A FILE
1816 ILD: MOVEI W,BUF1 ;LOAD BUFFER ORIGIN
1818 TLOE F,ISW ;SKIP IF INIT REQUIRED
1819 JRST ILD6 ;DONT DO INIT
1820 ILD7: OPEN 1,OPEN3 ;KEEP IT PURE
1822 ILD6: TLZE F,REWSW ;SKIP IF NO REWIND
1824 ILD2: LOOKUP 1,DTIN ;LOOK UP FILE FROM DIRECTORY
1825 JRST ILD3 ;FILE NOT IN DIRECTORY
1827 IFE K,< INBUF 1,2 ;SET UP BUFFERS>
1828 IFN K,< INBUF 1,1 ;SET UP BUFFER>>
1829 IFN LNSSW,<INBUF 1,1
1833 IFE K,<MOVEI C,4*203+1>
1834 IFN K,<MOVEI C,203+1>
1837 TLO F,ASW ;SET LEFT ARROW ILLEGAL FLAG
1838 TLZ F,ESW ;CLEAR EXTENSION FLAG
1843 ILD3: TLOE F,ESW ;SKIP IF .REL WAS ASSUMED
1844 JRST ILD4 ;FATAL LOOKUP FAILURE
1845 SETZM DTIN1 ;ZERO FILE EXTENSION
1846 JRST ILD2 ;TRY AGAIN WITH NULL EXTENSION
1848 ILD4: IFE REENT,<IFE TEN30,< ;PDP-6 ONLY
1849 MOVE W,[SIXBIT /LIB40/]
1850 CAME W,DTIN ;WAS THIS A TRY FOR LIB40?
1852 TRZ W,(SIXBIT / 0/) ;YES
1853 MOVEM W,DTIN ;TRY LIB4
1854 PUSHJ P,LDDT2 ;USE .REL EXTENSION
1856 JRST ILD2 ;GO TRY AGAIN
1858 IFN PP,<MOVSI W,(SIXBIT /DSK/)
1859 CAMN W,ILD1 ;TRIED DSK ONCE?
1860 JRST ILD9 ;YES, FILE DOES NOT EXIST
1861 MOVEM W,ILD1 ;SET IT UP
1862 SETZM PPN ;CLEAR OLD VALUE
1863 PUSHJ P,LDDT2 ;SET UP .REL
1864 TLZ F,ESW ;SO WE CAN TRY BLANK EXT
1865 JRST ILD7 ;OPEN DSK,TRY AGAIN>
1867 ILD9: ERROR ,</CANNOT FIND#/>
1870 ; DEVICE SELECTION ERROR
1872 ILD5A: SKIPA W,LD5C1
1874 ILD5: TLO F,FCONSW ;INSURE TTY OUTPUT
1875 PUSHJ P,PRQ ;START W/ ?
1876 PUSHJ P,PWORD ;PRINT DEVICE NAME
1877 ERROR 7,</UNAVAILABLE@/>
1881 \fSUBTTL LIBRARY SEARCH CONTROL AND LOADER CONTROL
1883 ;LIBF ENABLES A LIBRARY SEARCH OF <SYS:LIB4.REL>
1885 LIBF: PUSHJ P,FSCN1 ;FORCE SCAN TO COMPLETION
1886 PUSH P,ILD1 ;SAVE DEVICE NAME
1887 PUSHJ P,LIBF1 ;LOAD SYS:JOBDAT.REL
1888 IFN SAILSW,<LIBAGN: PUSHJ P,SALOAD ;LOAD RELS AND SEARCH LIBS>
1889 IFN REENT,<TRNN F,SEENHI ;IF ANY HISEG LOADED NO RE-ENT OP SYSTEM
1892 IFN ALGSW,<TRNE F,ALGFL ;SPECIAL ACTION IF LOADING ALGOL
1893 JRST [MOVE C,[RADIX50 44,%ALGDR]
1894 MOVEI W,400010 ;JOBHDA
1895 PUSHJ P,SYMPT ;DEFINE IT
1896 JRST LIBF3] ;DON'T LOAD IMP40>
1897 MOVE W,[SIXBIT /IMP40/]
1900 TRNN F,COBFL ;COBOL SEEN?
1901 SKIPA W,[SIXBIT /LIB40/] ;FIRST TRY AT NAME
1902 MOVE W,[SIXBIT /LIBOL/] ;YES, SEARCH COBOL'S LIBRARY ONLY
1903 PUSHJ P,LIBF2 ;LOAD SYS:LIB40.REL
1904 IFN SAILSW,<MOVE W,LIBPNT ;SEE IF ANY MORE TO DO
1905 CAME W,[XWD -RELLEN-1,LIBFLS-1]
1907 MOVE W,PRGPNT ;IT COULD BE DANGEROUS TO LOAD PROGRAMS HERE
1908 CAME W,[XWD -RELLEN-1,PRGFLS-1]
1909 JRST LIBAGN ;MORE TO DO, TRY AGAIN>
1910 POP P,ILD1 ;CALL TO LDDT1 WILL PUT IT IN OLDDEV
1911 LIBF1: MOVE W,[SIXBIT /JOBDAT/] ;LOAD SYS:JOBDAT.REL
1912 LIBF2: PUSHJ P,LDDT1
1913 LIBGO: JUMPGE S,EOF2 ;JUMP IF NO UNDEFINED GLOBALS
1914 TLO F,SLIBSW+SKIPSW ;ENABLE LIBRARY SEARCH
1915 TLZ F,SYMSW ;DISABLE LOADING WITH SYMBOLS
1916 JRST LDF ;INITIALIZE LOADING LIB4
1919 \f; LIB CONTROLS THE LIBRARY SEARCH OF ONE FILE
1921 LIB: JUMPGE S,EOF1 ;JUMP IF NO UNDEFINED GLOBALS
1922 TLO F,SKIPSW ;SET SKIPSW TO IGNORE MODE
1923 IFN DIDAL,<TRNE F,XFLG ;INDEX IN CORE?
1925 JRST LOAD ;CONTINUE LIB. SEARCH
1927 LIB1: CAIE A,4 ;TEST FOR ENTRY BLOCK
1928 JRST LIB29 ;NOT AN ENTRY BLOCK, IGNORE IT
1929 LIB2: PUSHJ P,RWORD ;READ ONE DATA WORD
1931 TLO C,040000 ;SET CODE BITS FOR SEARCH
1933 TLZA F,SKIPSW ;REQUEST MATCHES ENTRY, LOAD
1934 JRST LIB2 ;NOT FOUND
1935 LIB3: PUSHJ P,RWORD ;READ AND IGNORE ONE DATA WORD
1936 JRST LIB3 ;LOOP TO IGNORE INPUT
1939 IFN DIDAL,<CAIN A,14 ;INDEX BLOCK?
1941 LIB30: HRRZ C,W ;GET WORD COUNT
1942 JUMPE C,LOAD1 ;IF NUL BLOCK RETURN
1943 CAILE C,↑D18 ;ONLY ONE SUB-BLOCK
1944 JRST LIB3 ;NO,SO USE OLD SLOW METHOD
1945 AOJA C,LIB31 ;ONE FOR RELOCATION WORD
1947 BLOCK0: HRRZ C,W ;GET WORD COUNT
1948 JUMPE C,LOAD1 ;NOISE WORD
1949 LIB31: CAML C,BUFR2 ;DOES BLOCK OVERLAP BUFFERS?
1950 SOJA C,LIB32 ;YES,ALLOW FOR INITIAL ILDB
1951 ADDM C,BUFR1 ;ADD TO BYTE POINTER
1953 ADDM C,BUFR2 ;TO SUBTRACT C FROM WORD COUNT
1954 JRST LOAD1 ;GET NEXT BLOCK
1956 LIB32: SUB C,BUFR2 ;ACCOUNT FOR REST OF THIS BUFFER
1957 PUSHJ P,WORD+1 ;GET ANOTHER BUFFERFUL
1958 JRST LIB31 ;TRY AGAIN
1963 COMMENT * BLOCK TYPE 15 AND 16 USED TO SPECIFY PROGRAMS AND
1964 LIBRARIES WHICH MUST BE LOADED (SEARCHED) IF THE PROGRAM
1965 IN WHICH THE BLOCK APPEARS IS LOADED. IT IS NOW TIME TO
1966 LOAD AND SEARCH THESE FILES. IF ANY MAKE REQUESTS, THEY ARE ADDED
1967 TO THE END. WE WILL COME BACK AND LOOK AGAIN IN CASE A
1968 LIBRARY PROGRAM LOAD A REL PROGRAM. ORIGINAL CODE BY DCS*
1970 SALOAD: MOVE T,[XWD -RELLEN-1,PRGFLS-1] ;TO RESET WITH AT END
1971 MOVEI D,PRGPNT ;OINTER TO UPPER LIMIT
1972 PUSHJ P,PRGPRG ;LOAD THEM IF ANY
1974 ;NOW FOR LIBRARY SEARCH
1976 MOVE T,[XWD -RELLEN-1,LIBFLS-1]
1979 PRGPRG: MOVEM D,LODLIM# ;SAVE POINTER TO LIMIT
1980 MOVEM T,LODSTP# ;START FOR RESETTING
1981 PRGBAK: MOVEM T,LODPNT# ;AND START
1982 CAMN T,@LODLIM ;GOTTEN TO END YET?
1983 JRST PRGDON ;YES, DUMP IT
1984 SKIPN W,PRGDEV(T) ;IS DEVICE SPECIFIED?
1985 MOVSI W,(SIXBIT /DSK/) ;NO, DSK
1986 MOVEM W,ILD1 ;WHERE WE INIT FROM
1987 MOVSI W,(SIXBIT /REL/) ;EXTENSION
1990 MOVEM W,DTIN ;FILE NAME
1991 MOVE W,PRGPPN(T) ;THE PROJECT PROG
1993 PUSH P,JRPRG ;A RETURN ADDRESS
1994 TLZ F,ISW ;FORCE NEW INIT
1996 CAIN T,LIBPNT ;WHICH ONE
1999 PRGRET: MOVE T,LODPNT ;RETURNS HERE, GET NEXT ONE
2002 PRGDON: MOVE T,LODSTP ;RESTE POINTER IN CASE MORE ON OTHER LIBS
2004 JRPRG: POPJ P,PRGRET ;PUSHED TO GET A RETURN ADDRESS
2006 PRGFIL==1 ;REL INDEX FOR FILE NAMES
2007 PRGPPN==RELLEN+1 ;AND FOR PPNS
2008 PRGDEV==2*RELLEN+1 ;AND FOR DEVICES
2009 > ;END OF IFN SAILSW
2012 \fSUBTTL LDDT LOADS <SYS:DDT.REL> AND SETS SYMSW
2016 LDDTQX: TLO N,DDSW+EXEQSW ;WILL START RAID AFTER LOADING
2017 LDDTQ: PUSH P,D ;SAVE ARG
2018 PUSHJ P,FSCN1 ;SEE BELOW
2019 MOVE W,['RAID '] ;LOAD RAID STATT DDT
2020 IFN DMNSW,<SETZM (P);ELSE>POP P,D ;/0D FOR DMN2 (BELOW) !?!
2021 JRST LDDT11 ;JOIN FORCES
2025 IFN ALGSW,<TRNE F,ALGSW
2027 TLO N,DDSW+EXEQSW ;T - LOAD AND GO TO DDT
2029 IFN ALGSW,<TRNE F,ALGFL
2031 IFN DMNSW,< PUSH P,D ;SAVE INCASE /NNND >
2032 PUSHJ P,FSCN1 ;FORCE SCAN TO COMPLETION
2033 MOVSI W,444464 ;FILE IDENTIFIER <DDT>
2034 LDDT11: TLZ F,SYMSW!RMSMSW ;DON'T LOAD DDT WITH LOCAL SYMBOLS
2036 PUSHJ P,LDF ;LOAD <SYS:DDT.REL>
2037 TLO F,SYMSW!RMSMSW ;ENABLE LOADING WITH SYMBOLS
2038 IFN DMNSW,< POP P,D ;RESTORE D
2039 JRST DMN2 ;MOVE SYMBOL TABLE >
2040 IFE DMNSW,< POPJ P,>
2042 LDDT1: MOVEM W,DTIN ;STORE FILE IDENTIFIER
2043 IFN PP,<MOVE W,ILD1 ;SAVE OLD DEV
2045 MOVSI W,637163 ;DEVICE IDENTIFIER <SYS>
2046 MOVEM W,ILD1 ;STORE DEVICE IDENTIFIER
2047 TLZ F,ISW+LIBSW+SKIPSW+REWSW ;CLEAR OLD FLAGS
2048 LDDT2: MOVSI W,624554 ;EXTENSION IDENTIFIER <.REL>
2049 LDDT3: MOVEM W,DTIN1 ;STORE EXTENSION IDENTIFIER
2050 LDDT4:IFN PP,<EXCH W,PPN ;GET PROJ-PROG #
2052 EXCH W,PPN ;W MUST BE SAVED SINCE IT MAY BE USED LATER>
2056 \fSUBTTL EOF TERMINATES LOADING OF A FILE
2058 EOF: MOVE P,PDSAV ;RESTORE PUSHDOWN POINTER
2059 EOF1: TLZ F,SLIBSW!SKIPSW ;CLEAR ONE FILE LIB. SEARCH FLAG
2060 IFN DIDAL,<TRZ F,XFLG!LSTLOD ;CLEAR DIDAL FLAGS>
2061 EOF2: TLNE F,RMSMSW ;IF REMEMBER LOADING WITH SYMBOLS IS ON
2062 TLO F,SYMSW ;THEN RESTORE SYMBOL LOADING STATE
2065 ; FORCE SCAN TO COMPLETION, LOAD IF NECESSARY
2067 FSCN: PUSHJ P,FSCN1 ;FORCED LOAD BEFORE TEST
2068 TLNN F,FULLSW ;TEST FOR OVERLAP
2069 POPJ P, ;NO OVERLAP, RETURN
2070 MOVE W,H ;FETCH CORE SIZE REQUIRED
2071 SUBI W,1(S) ; COMPUT DEFICIENCY
2072 JUMPL W,EOF2 ;JUMP IF NO OVERLAP
2073 TLO F,FCONSW ;INSURE TTY OUTPUT
2074 PUSHJ P,PRQ ;START WITH ?
2075 PUSHJ P,PRNUM0 ;INFORM USER
2076 ERROR 7,</WORDS OF OVERLAP#/>
2077 JRST LD2 ;ERROR RETURN
2079 IFN SPCHN,<FSCN1A: TLNN F,NSW
2081 FSCN1: TLON F,FSW ;SKIP IF NOT FIRST CALL TO FSCN
2082 TLNN F,CSW+DSW+ESW ;TEST SCAN FOR COMPLETION
2084 FSCN2: PUSHJ P,LD5B1 ;STORE FILE OR EXTENSION IDENT.
2086 ; LOADER CONTROL, NORMAL MODE
2088 LDF: PUSHJ P,ILD ;INITIALIZE LOADING
2091 \fSUBTTL LOAD SUBROUTINE
2093 LOAD: MOVEM P,PDSAV ;SAVE PUSHDOWN POINTER
2094 IFN WFWSW,<SETZM VARLNG ;LENGTH OF VARIABLE AREA-ADDED TO RELOC>
2095 IFN ALGSW,<SETZM OWNLNG ;LENGTH OF OWN AREA-ADDED TO RELOC>
2096 IFN FAILSW,<SETZM LFTHSW ;RESET LOAD LEFT HALF FIXUP SW>
2097 LOAD1: MOVE P,PDSAV ;RESTORE PUSHDOWN POINTER
2098 LOAD1A: PUSHJ P,WORD ;INPUT BLOCK HEADER WORD
2099 MOVNI E,400000(W) ;WORD COUNT - FROM RH OF HEADER
2100 HLRZ A,W ;BLOCK TYPE - FROM LH OF HEADER
2101 IFN FAILSW,<SKIPN POLSW ;ERROR IF STILL DOING POLISH>
2102 CAIL A,DISPL*2 ;TEST BLOCK TYPE NUMBER
2103 JRST LOAD4 ;ERROR, ILLEGAL BLOCK TYPE
2104 TLNE F,SKIPSW ;BLOCK OK - TEST LOAD STATUS
2105 JRST LIB1 ;RETURN TO LIB. SEARCH CONTROL
2106 HRRZ T,LOAD2(A) ;LOAD RH DISPATCH ENTRY
2107 CAIL A,DISPL ;SKIP IF CORRECT
2108 HLRZ T,LOAD2-DISPL(A);LOAD LH DISPATCH ENTRY
2109 TLNE F,FULLSW ;TEST CORE OVERLAP INDICATOR
2110 SOJG A,HIGH0 ;IGNORE BLOCK IF NOT TYPE 1
2111 JRST @T ;DISPATCH TO BLOCK SUBROUTINE
2113 ;DISPATCH TABLE - BLOCK TYPES
2114 IFE FAILSW,<POLFIX==LOAD4A
2116 IFE WFWSW,<LVARB==LOAD4A>
2117 IFE DIDAL,<INDEX==LOAD4A>
2118 IFE ALGSW!SAILSW,<ALGBLK==LOAD4A>
2119 IFE SAILSW,<LDLIB==LOAD4A>
2121 LOAD2: XWD LOCD, BLOCK0 ;10,,0
2122 XWD POLFIX, PROG ;11,,1
2123 XWD LINK, SYM ;12,,2
2124 XWD LVARB, HISEG ;13,,3
2125 XWD INDEX, LIB30 ;14,,4
2126 XWD ALGBLK, HIGH ;15,,5
2127 XWD LDLIB, NAME ;16,,6
2128 XWD LOAD4A, START ;17,,7
2132 ;ERROR EXIT FOR BAD HEADER WORDS
2135 CAIN A,400 ;FORTRAN FOUR BLOCK
2137 LOAD4A: MOVE W,A ;GET BLOCK TYPE
2138 ERROR ,</ILL. FORMAT BLOCK TYPE !/>
2139 PUSHJ P,PRNUM ;PRINT BLOCK TYPE
2140 JRST ILC1 ;PRINT SUBROUTINE NAME
2143 \fSUBTTL LOAD PROGRAMS AND DATA (BLOCK TYPE 1)
2145 PROG: MOVEI V,-1(W) ;LOAD BLOCK LENGTH
2146 PUSHJ P,RWORD ;READ BLOCK ORIGIN
2147 ADD V,W ;COMPUTE NEW PROG. BREAK
2148 IFN REENT,<TLNN F,HIPROG
2149 JRST PROGLW ;NOT HIGH SEGMENT
2150 PROG3: CAMGE W,HVAL1 ;CHECK TO SEE IF IN TOP SEG
2152 MOVE T,JOBREL ;CHECK FOR OVERFLOW ON HIGH
2160 CAMG H,T ;COMPARE WITH PREV. PROG. BREAK
2163 JRST FULLC ;NO ERROR MESSAGE
2164 IFN REENT,<CAML H,HVAL1
2165 JRST COROVL ;WE HAVE OVERFLOWED THE LOW SEGMENT
2167 MOVEM T,HILOW ;HIGHEST LOW CODE LOADED INTO>
2168 CAILE H,1(S) ; SKIP IF SUFFICIENT CORE AVAILABLE
2169 IFN EXPAND,<JRST [PUSHJ P,XPAND>
2171 IFN REENT,< TLNE F,HIPROG
2172 SUBI W,2000 ;HISEG LOADING LOW SEG>
2173 IFN EXPAND,< JRST .-1]>
2175 PROG1: PUSHJ P,RWORD ;READ DATA WORD
2176 IFN TEN30,<CAIN V,41 ;CHANGE FOR 10/30 JOBDAT
2177 MOVEI V,JOB41 ;JOB41 IS DIFFERENT
2178 CAIN V,74 ;SO IS JOBDAT
2180 IFN L,<CAML V,RINITL ;CHECK FOR BAD STORE>
2181 MOVEM W,@X ;STORE DATA WORD IN PROG. AT LLC
2182 AOJA V,PROG1 ;ADD ONE TO LOADER LOC. COUNTER
2185 LOWCOR: SUB V,HIGHX ;RELOC FOR PROPER
2186 ADD V,LOWX ;LOADING OF LOW SEQMENT
2192 \fSUBTTL LOAD SYMBOLS (BLOCK TYPE 2)
2194 SYM: PUSHJ P,PRWORD ;READ TWO DATA WORDS
2195 PUSHJ P,SYMPT; PUT INTO TABLE
2196 IFN REENT,<PUSHJ P,RESTRX>
2199 SYMPT: TLNE C,200000 ;GLOBAL REQUEST? WFW
2200 JUMPL C,SYM3 ;CHECK FOR 60 NOT JUST HIGH BIT WFW
2202 JRST SYM1A ;LOCAL SYMBOL
2205 PUSHJ P,SREQ ;GLOBAL DEF., SEARCH FOR REQUEST
2206 JRST SYM2 ;REQUEST MATCHES
2207 PUSHJ P,SDEF ;SEARCH FOR MULTIPLE DEFINITIONS
2208 JRST SYM1 ;MULTIPLY DEFINED GLOBAL
2211 ; PROCESS MULTIPLY DEFINED GLOBAL
2213 SYM1: CAMN W,2(A) ;COMPARE NEW AND OLD VALUE
2215 AOS MDG ;COUNT MULTIPLY DEFINED GLOBALS
2216 PUSHJ P,PRQ ;START W/ ?
2217 PUSHJ P,PRNAM ;PRINT SYMBOL AND VALUE
2218 IFN RPGSW,<MOVE W,JOBERR ;RECORD THIS AS AN ERROR
2221 MOVE W,2(A) ;LOAD OLD VALUE
2222 PUSHJ P,PRNUM ;PRINT OLD VALUE
2223 ERROR 7,</MUL. DEF. GLOBAL IN PROG. !/>
2224 MOVE C,SBRNAM ;GET PROGRAM NAME
2225 PUSHJ P,PRNAME ;PRINT R-50 NAME
2227 POPJ P, ;IGNORE MUL. DEF. GLOBAL SYM
2232 SYM1A: TLNN F,SYMSW ;SKIP IF LOAD LOCALS SWITCH ON
2233 POPJ P,; IGNORE LOCAL SYMBOLS
2234 SYM1B: CAIL H,(S) ;STORE DEFINED SYMBOL
2235 IFN EXPAND,< PUSHJ P,XPAND7>
2236 IFE EXPAND,< JRST SFULLC>
2238 TLNE N,F4SW; FORTRAN FOUR REQUIRES A BLT
2239 PUSHJ P,MVDWN; OF THE TABLES>
2240 MOVEI A,-2(S) ;LOAD A TO SAVE INST. AT SYM2
2241 SYM1D: SUBI S,2; UPDATE UNDEFINED POINTER
2242 POP B,2(A) ;MOVE UNDEFINED VALUE POINTER
2243 POP B,1(A) ;MOVE UNDEFINED SYMBOL
2244 MOVEM W,2(B) ;STORE VALUE
2245 MOVEM C,1(B) ;STORE SYMBOL
2249 \f; GLOBAL DEFINITION MATCHES REQUEST
2251 SYM2: PUSH P,SYM2C ;NEXT MUST BE A SUBROUTINE FOR LATER, SET RETURN
2252 SYM2B: MOVE V,2(A) ;LOAD REQUEST POINTER
2254 JUMPL V,SYM2W ;ADDITIVE REQUEST? WFW
2255 PUSHJ P,SYM4A ;REPLACE CHAIN WITH DEFINITION
2256 SYM2W1: PUSHJ P,SREQ ;LOOK FOR MORE REQUESTS FOR THIS SYMBOL
2257 JRST SYM2B ;FOUND MORE
2258 MOVE A,SVA ;RESTORE A
2259 SYM2C: POPJ P,SYM1D ;RETURN, SEE SYM2 FOR USE OF ADDRESS
2261 ; REQUEST MATCHES GLOBAL DEFINITION
2263 SYM2A: MOVE V,W ;LOAD POINTER TO CHAIN
2264 MOVE W,2(A) ;LOAD VALUE
2265 JUMPL V,FIXWP ;HANDLE ATTITIVE REQUEST WFW
2268 ; PROCESS GLOBAL REQUEST
2270 SYM3: TLNE C,040000; COMMON NAME
2272 TLC C,640000; PERMUTE BITS FROM 60 TO 04
2273 PUSHJ P,SDEF ;SEARCH FOR GLOBAL DEFINITION
2274 JRST SYM2A ;MATCHING GLOBAL DEFINITION
2275 JUMPL W,SYM3X1 ;ADDITIVE FIXUP WFW
2276 PUSHJ P,SREQ ;SEARCH FOR EXISTING REQUEST WFW
2277 JRST SYM3A ;EXISTING REQUEST FOUND WFW
2278 SYM3X1: TLNN W,100000 ;CHECK SYMBOL TABLE FIXUP
2280 MOVE V,1(B) ;MUST BE LAST SYMBOL DEFINED. GET SYMBOL
2281 XOR V,W ;CHECK FOR IDENTITY
2282 TDNE V,[XWD 77777,-1] ;BUT IGNORE HIGH 3 BITS
2283 POPJ P, ;NOT SAME, ASSUME NOT LOADED LOCAL
2284 HRRI W,2(B) ;GET LOCATION IN RIGHT HALF
2286 SUB W,HISTRT ;AND MAKE RELATIVE
2287 IFN FAILSW,<TLZ W,040000>
2288 SYM3X2: CAIL H,(S) ;STORE REQUEST IN UNDEF. TABLE WFW
2289 IFN EXPAND,< PUSHJ P,XPAND7>
2290 IFE EXPAND,< JRST SFULLC>
2292 TLNE N,F4SW; FORTRAN FOUR
2293 PUSHJ P,MVDWN; ADJUST TABLES IF F4>
2294 SUB S,SE3 ;ADVANCE UNDEFINED POINTER
2295 MOVEM W,2(S) ;STORE UNDEFINED VALUE POINTER
2296 MOVEM C,1(S) ;STORE UNDEFINED SYMBOL
2301 ; COMBINE TWO REQUEST CHAINS
2303 SYM3A: SKIPL 2(A) ;IS IT ADDITIVE WFW
2304 JRST SYM3A1 ;NO, PROCESS WFW
2305 SYM3A4: PUSHJ P,SDEF2 ;YES, CONTINUE WFW
2306 JRST SYM3A ;FOUND ANOTHER WFW
2307 JRST SYM3X2 ;REALLY NO CHAIN THERE WFW
2308 SYM3A1: SKIPE V,2(A) ;IF ADDRESS OF CHAIN IS 0, THROW IT AWAY
2309 JRST SYM3A2 ;AND USE THE NEW ONE, ELSE ADD THE CHAINS
2310 MOVEM W,2(A) ;W IS ADDRESS OF NEW CHAIN,STORE ON TOP OF OLD 0
2315 IFN L,<CAMGE V,RINITL
2317 IFN REENT,<CAMGE V,HVAL1
2320 HRRZ A,@X ; LOAD NEXT ADDRESS IN CHAIN
2321 JUMPN A,SYM3B ; JUMP IF NOT THE LAST ADDR. IN CHAIN
2322 HRRM W,@X ;COMBINE CHAINS
2325 ;WFW PATCH FOR ADDITIVE GLOBAL REQUESTS
2327 FIXWP: TLNN V,100000 ;CHECK FOR SYMBOL TABLE FIXUP
2329 MOVE T,1(B) ;SYMBOL FIXUP, MUST BE LAST SYMBOL DEFINED
2330 XOR T,V ;CHECK FO SAME
2331 TDNE T,[XWD 77777,-1] ;EXCEPT FOR HIGH CODE BITS
2332 POPJ P, ;ASSUME NON-LOADED LOCAL
2333 HRRI V,2(B) ;GET LOCATION
2334 SUBI V,(X) ;SO WE CAN USE @X
2336 FIXW: IFN REENT,<HRRZ T,V
2343 FIXW1: TLNE V,200000 ;IS IT LEFT HALF
2346 ADD T,W ;VALUE OF GLOBAL
2347 HRRM T,@X ;FIX WITHOUT CARRY
2348 MOVSI D,200000 ;SET UP TO REMOVE DEFERED INTERNAL IF THERE
2352 \fFIXWL: HRLZ T,W ;UPDATE VALUE OF LEFT HALF
2353 ADDM T,@X ;BY VALUE OF GLOBAL
2354 MOVSI D,400000 ;LEFT DEFERED INTERNAL
2355 SYMFIX: TLNN V,100000 ;CHECK FOR SYMBOL TABLE FIXUP
2357 ADDI V,(X) ;GET THE LOCATION
2358 SYMFX1: MOVE T,-1(V) ;GET THE SYMBOL NAME
2359 TLNN T,40000 ;CHECK TO SEE IF INTERNAL
2361 ANDCAB D,-1(V) ;REMOVE PROPER BIT
2362 TLNE D,600000 ;IS IT STILL DEFERED?
2363 POPJ P, ;YES, ALL DONE
2364 EXCH C,D ;NO, CHECK FOR A REQUEST FOR IT
2366 JRST CHNSYM ;YES, WILL HAVE TO CALL THE FIXUP ROUTINE
2367 MOVE C,D ;GET C BACK
2369 CHNSYM: PUSH P,D ;HAS THE OLD C IN IT
2370 PUSH P,W ;WE MAY NEED IT LATER
2371 MOVE W,(V) ;GET VALUE
2372 PUSHJ P,SYM2B ;CALL THE FOUND GLOBAL TO MATCH REQUEST ROUTINE
2374 POP P,C ;RESTORE FOR CALLER
2375 POPJ P, ;AND GO AWAY
2378 TLNE V,40000 ;CHECK FOR POLISH
2380 TLNN V,100000 ;SYMBOL TABLE?
2382 ADD V,HISTRT ;MAKE ABSOLUTE
2383 SUBI V,(X) ;GET READY TO ADD X
2386 SYM2WA: PUSHJ P,FIXW ;DO FIXUP
2387 JRST SYM2W1 ;AND LOOK FOR MORE REQUESTS
2392 \f;PATCH VALUES INTO CHAINED REQUEST
2394 SYM4: IFN L,<CAMGE V,RINITL
2396 IFN REENT,<CAMGE V,HVAL1
2399 HRRZ T,@X ;LOAD NEXT ADDRESS IN CHAIN
2400 HRRM W,@X ;INSERT VALUE INTO PROGRAM
2402 SYM4A: JUMPN V,SYM4 ;JUMP IF NOT LAST ADDR. IN CHAIN
2407 IFN EXPAND,< SUBI T,2>
2408 CAIG T,(H); ANY ROOM LEFT?
2409 IFN EXPAND,< JRST [PUSHJ P,XPAND>
2411 IFN EXPAND,< JRST MVDWN
2413 TLNE F,SKIPSW+FULLSW
2416 ADDM T,PLTP; ADJUST PROGRAMMER LABEL POINTER
2417 ADDM T,BITP; AND BIT TABLE POINTER
2418 ADDM T,SDSTP; FIRST DATA STATEMENT
2423 ADDB T,MLTP; AND FINALLY TO MADE LABEL TABLE
2424 HRLS T; SET UP BLT POINTER
2431 \fSUBTTL HIGH-SEGMENT (BLOCK TYPE 3)
2432 ;THIS PROGRAM IS INTENDED FOR HI SEGMENT IF RUNNING ON A PDP-10.
2433 ; THIS BLOCK TYPE OCCURS AFTER ENTRY AND NAME BLOCKS.
2435 HISEG: PUSHJ P,WORD ;GOBBLE UP A WORD.
2436 JUMPE W,HISEG2 ;MACRO V36
2437 PUSHJ P,WORD ;GET THE OFSET
2438 IFE REENT,<HISEG2==LOAD1A
2439 JUMPGE W,LOAD1A ;NOT TWO SEG PROG.>
2440 IFN REENT,<JUMPE W,HISEG2 ;IGNORE ZERO
2441 JUMPG W,HISEG3 ;NEG. IF TWOSEG PSEUDO-OP>
2442 TRO F,TWOFL ;SET FLAG
2444 TRNE F,NOHI!NOHI6 ;TWO SEGMENTS LEGAL?
2445 JRST ONESEG ;LOAD AS ONE SEGMENT
2446 HISEG3: HRRZ D,W ;GET START OF HISEG
2447 JUMPE D,.+2 ;NOT SPECIFIED
2448 PUSHJ P,HCONT ;AS IF /H
2449 HISEG2: PUSHJ P,HISEG1
2450 JRST LOAD1 ;GET NEXT BLOCK
2451 FAKEHI: ;AS IF BLOCK TYPE 3
2452 HISEG1: TRNE F,NOHI!NOHI6 ;LOAD REENT?
2454 TLOE F,HIPROG ;LOADING HI PROG
2455 POPJ P, ;IGNORE 2'ND HISEG
2456 TRON F,SEENHI ;HAVE WE LOADED ANY OTHER HI STUFF?
2457 PUSHJ P,SETUPH ;NO,SET UP HI SEG.
2460 HRRM R,2(N) ;CALL THIS THE START OF THE PROGRAM
2463 SETUPH: MOVE X,HVAL1
2464 CAIGE X,-1 ;SEE IF IT HAS BEEN CHANGED FROM ORIG
2465 JRST SEENHS ;YES, MUST HAVE SEEN /H
2468 CAIG X,(H) ;HAVE WE RUN OVER WITH THE LOW SEG
2484 \fSETSEG: TRZ F,NOHI!SEGFL ;ALLOW HI-SEG
2485 JUMPL D,.+2 ;/-H TURNS OFF NOHI ONLY
2486 TRO F,SEGFL ;/1H FORCES HI
2490 ONESEG: HLRZ D,W ;GET LENGTH OF HISEG
2491 SUBI D,(W) ;REMOVE OFSET
2492 JUMPLE D,TWOERR ;LENGTH NOT AVAILABLE
2493 MOVEM R,LOWR ;SAVE LOW SEGMENT RELOCATION
2494 ADDM D,LOWR ;ADD TO LOW SEG RELOCATION
2495 HRRZM W,HVAL1 ;SO RELOC WILL WORK
2496 JRST LOAD1 ;GET NEXT BLOCK
2498 TWOERR: ERROR 7,</TWO SEGMENTS ILLEGAL#/>
2502 \fSUBTTL HIGHEST RELOCATABLE POINT (BLOCK TYPE 5)
2503 SFULLC: TLOE F,FULLSW ;PREVIOUS OVERFLOW?
2504 JRST FULLC ;YES, DON'T PRINT MESSAGE
2505 ERROR ,<?SYMBOL TABLE OVERLAP#?>
2506 FULLC: TLO F,FULLSW ;CORE OVERLAP ERROR RETURN
2509 JRST LIB3 ;LOOK FOR MORE
2510 HIGH2: PUSHJ P,RWORD ;GET HISEG BREAK
2511 TRZ F,TWOFL ;CLEAR FLAG NOW
2512 IFE REENT,< MOVE R,LOWR
2514 IFN REENT,< TRNE F,NOHI!NOHI6 ;SINGLE SEGMENT LOAD?
2515 JRST [MOVE R,LOWR ;YES,GET LARGER RELOC
2516 MOVE W,HVAL ;ORIGINAL VALUE
2517 MOVEM W,HVAL1 ;RESET
2518 JRST HIGH2A] ;CONTINUE AS IF LOW ONLY
2519 HRR R,W ;PUT BREAK IN R
2523 MOVE R,LOWR ;NEXT WORD IS LOW SEG BREAK
2524 TLZ F,HIPROG ;CLEAR HIPROG
2525 PUSHJ P,PRWORD ;GET WORD PAIR
2526 HRR R,C ;GET LOW SEG BREAK
2527 MOVEM R,LOWR ;SAVE IT
2528 MOVE R,HIGHR ;GET HIGH BREAK
2529 JRST HIGHN3 ;AND JOIN COMMON CODE>
2531 HIGH0: CAIE A,4 ; TEST FOR END BLOCK (OVERLAP)
2534 HIGH: TRNE F,TWOFL ;IS THIS A TWO SEGMENT PROGRAM?
2536 HIGH2A: PUSHJ P,PRWORD ;READ TWO DATA WORDS.
2537 IFN REENT,< TLZE F,HIPROG
2539 IFN WFWSW,<ADD C,VARLNG ;IF LOW SEG THEN VARIABLES GO AT END>
2540 IFN ALGSW,<ADD C,OWNLNG ;ADD IN LENGTH OF OWN BLOCK>
2541 HRR R,C ;SET NEW PROGRAM BREAK
2542 CAMGE C,W ;CHECK 2ND WORD (LOC PROG BRK IF PRESENT)
2546 MOVEI H,(C) ;SET UP H
2547 CAILE H,1(S) ;TEST PROGRAM BREAK
2548 IFN EXPAND,<PUSHJ P,[ PUSHJ P,XPAND
2552 IFE EXPAND,<TLO F,FULLSW>
2555 IFN REENT,<TRNE F,NOHI!NOHI6 ;ONE SEGMENT PROGRAM?
2557 HRLZ W,HIGHR ;GET HIGH PROG BREAK
2558 JUMPE W,[HRRZ W,R ;NO HIGH SEGMENT YET
2559 JRST .+2] ;SO USE LOW RELOCATION ONLY
2560 HRR W,LOWR ;GET LOW BREAK
2561 SETZ C, ;ZERO SYMBOL NAME
2562 PUSHJ P,SYM1B ;PUT IN SYMBOL TABLE
2563 MOVEM S,F.C+S ;SAVE NEW S AND B
2564 MOVEM B,F.C+B ;INCASE OF ERROR
2566 TLZ F,NAMSSW ;RELAX, RELOCATION BLOCK FOUND
2567 TLNE F,SLIBSW+LIBSW ;NORMAL MODE EXIT THROUGH LOAD1
2568 JRST LIB ;LIBRARY SEARCH EXIT
2572 HIGHN1: CAMLE R,HVAL
2575 HIGHN3: PUSH P,W ;SAVE W,CONTAIN HIGHEST ABSOLUTE ADDRESS
2576 ADD W,LOWX ;LOC PROG BRK
2577 CAIGE H,(W) ;CHECK FOR TOP OF LOW CORE
2581 JRST COROVL ;OVERFLOW OF LOW SEGMENT
2591 IFN WFWSW,<ADD R,VARLNG ;VARIABLES IN LOW SEG>
2592 IFN ALGSW,<ADD R,OWNLNG ;OWN BLOCK IN LOW SEGMENT>
2594 CAIGE C,(W) ;IS ABSOLUTE LOCATION GREATER
2598 \f HRRZ C,R ;SET UP C AGAIN
2599 JRST HIGH31 ;GO CHECK PROGRAM BREAK
2602 \fSUBTTL EXPAND HIGH SEGMENT
2604 HIEXP: TLNE F,FULLSW
2606 IFN EXPAND,<PUSH P,Q>
2617 IFE EXPAND,<POPJ P,>
2618 IFN EXPAND,<HRRZ N,JOBREL
2627 MOVHI: MOVEI N,-2000(X)
2633 IFN EXPAND,<JRST XPAND8>
2634 IFE EXPAND,<ADDM H,HISTRT
2641 SUBI N,2000 ;ADJUST POINTER TO NAME
2664 \fSUBTTL PROGRAM NAME (BLOCK TYPE 6)
2666 NAME: TLOE F,NAMSSW ;HAVE WE SEEN TWO IN A ROW?
2667 JRST NAMERR ;YES, NO END BLOCK SEEN
2668 PUSHJ P,PRWORD ;READ TWO DATA WORDS
2669 MOVEM C,SBRNAM ;SAVE SUBROUTINE NAME
2670 NCONT: HLRE V,W ;GET COMPILER TYPE
2673 CAIGE V,CMPLEN-CMPLER ;ONLY IF LEGAL TYPE
2674 XCT CMPLER(V) ;DO SPECIAL FUNCTION
2675 TLOE N,COMFLG ;SKIP IF COMMON NOT PREV. SET
2676 JRST NAME1 ;SIZE OF COMMON PREV. SET
2677 MOVEM W,COMSAV ;STORE LENGTH OF COMMON
2678 JUMPE W,NAME2 ;JUMP IF NO COMMON IN THIS JOB
2679 HRRI R,@R ;FIRST PROGRAM SET LOAD ORIGIN
2680 NAME1: CAILE H,-1(S) ;TEST FOR AVAIL. SYMBOL SPACE
2681 IFN EXPAND,< PUSHJ P,XPAND7>
2682 IFE EXPAND,< JRST SFULLC>
2683 SUBI S,2 ;UPDATE UNDEF. TABLE POINTER
2686 HRRZ V,N ;POINTER TO PREVIOUS NAME
2687 SUBM B,V ;COMPUTE RELATIVE POSITIONS
2688 HRLM V,2(N) ;STORE FORWARD POINTER
2689 HRR N,B ;UPDATE NAME POINTER
2690 NAME2: MOVEM C,1(B) ;STORE PROGRAM NAME
2691 HRRZM R,2(B) ;STORE PROGRAM ORIGIN
2692 CAMG W,COMSAV ;CHECK COMMON SIZE
2693 IFE REENT,<JRST LIB3 ;COMMON OK>
2694 IFN REENT,<JRST [TRNE F,SEGFL ;LOAD LOW IN HI-SEG
2698 ILC: MOVE C,1(A) ;NAME
2699 PUSH P,C ;SAVE COMMON NAME
2700 ERROR ,</ILL. COMMON !/>
2705 ERROR 0,</ PROG. !/>
2706 MOVE C,SBRNAM ;RECOVER SUBROUTINE NAME
2708 ILC2: ERROR 0,</ #/>
2711 NAMERR: SETZM DTIN ;CLEAR WRONG FILE NAME FOR MESSAGE
2712 ERROR ,</NO END BLOCK !/>
2717 \f;COMPILER TYPE - DO SPECIAL FUNCTION FOR IT
2719 DEFINE CTYPE (CONDITION,TRUE,FALSE)
2720 <IFN CONDITION,<TRUE>
2721 IFE CONDITION,<FALSE>>
2723 CMPLER: CTYPE 1,JFCL,JFCL ;0 MACRO
2724 CTYPE K-1,<TRO F,F4FL>,JFCL ;1 FORTRAN
2725 CTYPE 1,<TRO F,COBFL>,JFCL ;2 COBOL
2726 CTYPE ALGSW,<PUSHJ P,ALGNAM>,JFCL ;3 ALGOL
2733 \fSUBTTL STARTING ADDRESS (BLOCK TYPE 7)
2736 START: PUSHJ P,PRWORD ;READ TWO DATA WORDS
2737 TLNN N,ISAFLG ;SKIP IF IGNORE SA FLAG ON
2738 HRRZM C,STADDR ;SET STARTING ADDRESS
2740 MOVE W,DTIN ;PICK UP BINARY FILE NAME
2742 MOVEM W,PRGNAM ;SAVE IT
2743 MOVE W,1(N) ;SET UP NAME OF THIS PROGRAM
2744 TLNN N,ISAFLG ;DONT SET NAME IF IGNORING SA'S
2746 PUSHJ P,PRWORD ;**OBSCURE RETURN TO LOAD1**
2749 RESTRX: TLNE F,HIPROG
2755 \fSUBTTL ONE PASS LOCAL DEFINITION (BLOCK TYPE 10)
2757 ;PMP PATCH FOR LEFT HALF FIXUPS
2759 LOCDLH: IFN L,<CAMGE V,RINITL
2761 IFN REENT,<CAMGE V,HVAL1
2764 HLRZ T,@X ;LOAD NEXT ADDRESS IN CHAIN
2765 HRLM W,@X ;INSERT VALUE INTO PROGRAM
2767 LOCDLF: JUMPN V,LOCDLH ;JUMP IF NOT LAST ADDR. IN CHAIN
2770 LOCDLI: PUSHJ P,LOCDLF
2771 IFN REENT,<PUSHJ P,RESTRX>
2772 AOSA LFTHSW ;TURN OFF LEFT HALF FIX SW (WAS -1) AND SKIP
2773 LOCDLG: SETOM LFTHSW ;TURN ON LEFT HALF FIX SW>
2775 LOCD: PUSHJ P,RWORD ;READ ONE DATA WORD
2776 HLRZ V,W ;STORAGE POINTER IN LEFT HALF
2778 SKIPE LFTHSW ;LEFT HALF CHAINED? PMP
2779 JRST LOCDLI ;YES PMP
2780 CAMN W,[-1] ;LEFT HALF NEXT? PMP
2781 JRST LOCDLG ;YES, SET SWITCH PMP>
2782 PUSHJ P,SYM4A ;LINK BACK REFERENCES
2783 IFN REENT,<PUSHJ P,RESTRX>
2787 \fSUBTTL LVAR FIX-UP (BLOCK TYPE 13)
2789 LVARB: PUSHJ P,PRWORD ;THE FIRST TWO WORDS IN THE BLOCK
2790 MOVEM W,VARLNG ;AR SPECIAL. SECOND IS LENGTH OF VARIABLES
2791 IFN REENT,< TLNE F,HIPROG
2792 MOVE C,LOWR ;USE LOW RELOC IF LOADING HI SEG>
2793 ;ELSE C HAS RELOC FOR THIS PROGRAM, USE IT
2794 HRRZM C,VARREL ;THIS IS LOCATION 0 OF VARIABLE AREA
2795 LVLP: PUSHJ P,PRWORD ;THINGS COME IN PAIRS
2796 TLNE C,200000 ;BIT ON IF SYMBOL TABLE FIXUP
2798 HLRZ V,W ;NO GET LOC FROM LEFTH HALF OF SECOND
2799 ADD W,VARREL ;AND RELOCATE VARIABLE
2800 TLNE C,400000 ;ON FOR LEFT HALF
2801 JRST [PUSHJ P,LOCDLF ;TAKE CARE OF IT
2802 IFN REENT,< JRST LVLCOM] ;RESET X>
2803 IFE REENT,< JRST LVLP] ;MUST BE LOW SEG X OK>
2804 PUSHJ P,SYM4A ;RIGHT HALF CHAIN
2805 IFN REENT,<LVLCOM: PUSHJ P,RESTRX>
2807 LVSYM: MOVE V,B ;GET SYMBOL TABLE POINTER
2808 ADD C,VARREL ;VALUE IS IN FIRST WORD FOR THESE
2809 TLZ W,740000 ;MAKE SURE NO BITS ON
2810 ADDI V,2 ;CORRECT POINTER TO SYMBOL TABLE
2811 SRSYM: MOVE A,-1(V) ;GET A NAME
2812 TLZN A,740000 ;CHECK FOR PROGRAM NAME
2813 JRST LVLP ;LEAVE (PROBABLY A NON-LOADED LOCAL)
2814 CAMN A,W ;IS IT THE RIGHT ONE??
2816 ADD V,SE3 ;CHECK NEXT ONE
2817 JUMPL V,SRSYM ;BUT ONLY IF SOME ARE THERE
2819 LVSYMD: TLNE C,400000 ;WHICH HALF??
2821 ADD C,(V) ;ADDITIVE FIXUP
2823 MOVSI D,200000 ;DEFERED BITS
2824 LVSM1: PUSHJ P,COMSFX ;GO TAKE CARE OF IT
2825 JRST LVLP ;NEXT PLEASE
2827 ADDM C,(V) ;WE DON'T HAVE TO WORRY ABOUT OVERFLOW HERE
2828 MOVSI D,400000 ;LEFT DEFERED BITS
2829 JRST LVSM1 ;GO WORRY ABOUT DEFERED INTERNALS>
2832 \fSUBTTL FAIL LOADER
2833 ;ONLY LIST IF FAILSW=1
2836 REPEAT 0,<IF POLISH FIXUPS CONTAIN GLOBAL REQUESTS WHICH
2837 CAN NOT BE SATISFIED WHEN THEY ARE SEEN, THEY MUST BE
2838 SAVED UNTIL THESE GLOBAL SYMBOLS BECOME DEFINED.
2839 THE POLISH FIXUP IS SAVED IN THE UNDEFINED TABLE (POINTED
2840 TO BY S). THE FIXUP IS SAVED IN TWO WORD BLOCKS THE FIRST
2841 WORD OF WHICH (THE ONE WHICH WOULD NORMALL CONTAIN THE SYMBOL)
2842 HAS SPECIAL BITS ON SO IT WILL NOT BE FOUND BY A SEARCH FOR
2843 A GLOBAL REQUEST. SINCE THE UNDEFINED TABLE MAY BE
2844 SHUFFELED INTO A RANDOM ORDER, IT IS NOT POSSIBLE TO KEEP
2845 ALL OF A POLISH FIXUP TOGETHER OR TO HAVE POINTERS IN
2846 THE USUAL SENCE FROM ONE TWO WORD BLOCK TO ANOTHER.
2847 SUFFICIENT INFORMATION IS THEREFORE GIVEN TO DETERMINE
2848 WHAT THE FIRST WORD OF THE NEXT DESIRED BLOCK IS AND THIS
2849 BLOCK IS FOUND BY SEARCHING THE UNDEFINED TABLE FOR A MATCH.
2850 EACH POLISH FIXUP WHICH IS ENTERED INTO THE UNDEFINED
2851 TABLE IS GIVEN A UNIQUE NUMBER CALLED THE "HEAD NUMBER".
2852 EACH ELEMENT OF THE FIXUP (EITHER OPERAND OR OPERATOR)
2853 IS ASSIGNED A NUMBER CALLED THE "OP NUMBER". THUS
2854 THE OP NUMBER AND HEAD NUMBER TOGETHER DETERMINE
2855 A SPECIFIC ELEMENT OF A SPECIFIC FIXUP. EACH ELEMENT
2856 (TWO WORD BLOCK) IS ARRANGED AS FOLLOWS:
2858 BITS 0-4 THESE ARE THE USUAL CODE BITS OF A RADIX50
2859 SYMBOL AND CONTAIN 44 TO DISTINGUISH
2860 AN ELEMENT OF A POLISH FIXUP FROM OTHER
2861 SYMBOLS IN THE UNDEFINED TABLE
2862 BITS 5-17 THE HEAD NUMBER OF THIS FIXUP
2863 BITS 18-30 THE OP NUMBER OF THIS ELEMENT
2864 BITS 31-35 THE OPERAND FOR THIS ELEMENT
2865 OPERAND 2 INDICATES A WORD OF DATA
2867 IF THE OPERAND IS 2 THIS WORD CONTAINS THE DATA
2869 IF THIS IS NOT A DATA OPERATOR THEN THE LEFT AND
2870 RIGHT HALVES OF THIS WORD POINT TO THE TWO OPERANDS
2871 THE CONTENTS OF THE HALF WORD IS THE RIGHT HALF
2872 OF THE FIRST WORD OF THE BLOCK POINTED
2873 TO. THUS THE LEFT HALF OF THE FIRST WORD COMBINED
2874 WITH ONE OF THESE HALF WORDS IS THE FIRST WORD
2875 OF THE BLOCK POINTED TO AND CAN BE FOUND BY SEARCHING
2877 EACH FIXUP ALSO HAS A HEADER BLOCK. THIS BLOCK CONTAINS THE
2878 FOLLOWING INFORMATION:
2882 BITS 22-35 THE HEAD NUMBER OF THIS FIXUP
2885 BITS 0-17 A COUNT OF THE NUMBER OF UNDEFINED
2886 GLOBALS REMAINING IN THIS FIXUP
2887 BITS 18-35 A HALF WORD POINTER OF THE
2888 SAME TYPE FOUND IN OTHER ELEMENTS POINTING
2889 TO THE FIRST ELEMENT OF POLISH
2890 WHICH WILL BE THE STORE OPERATOR
2892 THE REQUESTS FOR THE GLOBAL SYMBOLS NEEDED BY THE FIXUP ARE
2897 BITS 5-35 RADIX 50 FOR THE NAME OF THE SYMBOL
2900 \f(NOTE THIS IS JUST A STANDARD GLOBAL REQUEST)
2903 BITS 0-4 44 (THIS IDENTIFIES IT AS "ADITIVE TYPE"
2904 AND BIT 4 INDICATES POLISH)
2905 BITS 5-17 THE HEAD NUMBER OF THE FIXUP
2906 (THIS GIVES ENOUGH INFORMATION TO FIND THE HEADER
2907 BLOCK AND UPDATE THE COUNT WHEN THE REQUEST IS
2911 BITS 18-35 A HALF WORD POINTER TO THE ELEMENT OF THE
2912 FIXUP INTO WHICH THE VALUE OF
2915 \f THE SYMBOL SHOULD BE STORED
2920 ;POLISH FIXUPS <BLOCK TYPE 11>
2922 PDLOV: SKIPE POLSW ;PDL OV ARE WE DOING POLISH?
2924 ERROR ,</PUSHDOWN OVERFLOW#/>
2926 COMPOL: ERROR ,</POLISH TOO COMPLEX#/>
2930 ;READ A HALF WORD AT A TIME
2932 RDHLF: TLON N,HSW ;WHICH HALF
2934 PUSHJ P,RWORD ;GET A NEW ONE
2935 TLZ N,HSW ;SET TO READ OTEHR HALF
2936 MOVEM W,SVHWD ;SAVE IT
2937 HLRZS W ;GET LEFT HALF
2939 NORD: HRRZ W,SVHWD ;GET RIGHT HALF
2943 POLFIX: MOVE D,[IOWD PPDL,PPDB] ;SET UP THE POLISH PUSHDOWN LIST
2944 MOVEI V,100 ;IN CASE OF ON OPERATORS
2946 SETOM POLSW ;WE ARE DOING POLISH
2947 TLO N,HSW ;FIX TO READ A WORD THE FIRST TIME
2948 SETOM GLBCNT ;NUMBER OF GLOBALS IN THIS FIXUP
2949 SETOM OPNUM ;NUMBER OF OPERANDS AND OPERATORS THIS FIXUP
2950 PUSH D,[15] ;FAKE OPERATOR SO STORE WILL NOT HACK
2952 RPOL: PUSHJ P,RDHLF ;GET A HLAF WORD
2953 TRNE W,400000 ;IS IT A STORE OP?
2954 JRST STOROP ;YES, DO IT
2955 IFN WFWSW,<CAIN W,15
2956 JRST [PUSHJ P,RDHLF ;THIS TRICK FOR VARIABLES
2957 ADD W,VARREL ;HOPE SOMEONE HAS DONE
2958 HRRZ C,W ;A BLOCK TYPE 13
2960 CAIGE W,3 ;0,1,2 ARE OPERANDS
2962 CAILE W,14 ;14 IS HIGHEST OPERATOR
2963 JRST LOAD4A ;ILL FORMAT
2964 PUSH D,W ;SAVE OPERATOR IN STACK
2965 MOVE V,DESTB-3(W) ;GET NUMBER OF OPERANDS NEEDED
2966 MOVEM V,SVSAT ;ALSO SAVE IT
2967 JRST RPOL ;BACK FOR MORE
2971 \f;HANDLE OPERANDS. THIS GETS COMPLICATED BECAUSE OF THE PRESENCE OF
2974 OPND: MOVE A,W ;GET THE OPERAND TYPE HERE
2975 PUSHJ P,RDHLF ;THIS IS AT LEAST PART OF THE OPERAND
2976 MOVE C,W ;GET IT INTO C
2977 JUMPE A,HLFOP ;0 IS HALF-WORD OPERAND
2978 PUSHJ P,RDHLF ;NEED FULL WORD, GET SECOND HALF
2979 HRL C,W ;GET HALF IN RIGHT PLACE
2980 MOVSS C ;WELL ALMOST RIGHT
2981 SOJE A,HLFOP ;1 IS FULL WORD, 2 IS GLOBAL REQUEST
2982 PUSHJ P,SDEF ;SEE IF IT IS ALREADY DEFINED
2983 JRST [MOVE C,2(A) ;YES, WE WIN
2985 AOSN GLBCNT ;NO, INCREMENT NUMBER OF GLOBALS THIS FIXUP
2986 AOS HEADNM ;INCREMENT FIXUP NUMBER IF FIRST GLOBAL
2987 AOS W,OPNUM ;GET AN OPERAND NUMBER
2988 LSH W,5 ;SPACE FOR TYPE
2989 IORI W,2 ;TYPE 2 IS GLOBAL
2990 HRL W,HEADNM ;GET FIXUP NUMBER
2991 PUSHJ P,SYM3X2 ;AND PUT INTO UDEFINED AREA ALONG WITH NAME
2992 MOVE C,W ;ALSO PUT THAT PART OF THE FIXUP IN
2994 SKIPA A,[400000] ;SET UP GLOBAL FLAG
2995 HLFOP: MOVEI A,0 ;VALUE OPERAND FLAG
2996 HLFOP1: SOJL V,CSAT ;ENOUGH OPERANDS SEEN?
2997 PUSH D,C ;NO, SAVE VALUE(OR GLOBAL NAME)
2998 HRLI A,400000 ;PUT IN A VALUE MARKER
2999 PUSH D,A ;TO THE STACK
3000 JRST RPOL ;GET MORE POLISH
3004 \f;HAVE ENOUGH OPERANDS FOR THE CURRENT OPERATOR
3006 CSAT: HRRZS A ;KEEP ONLY THE GLOBAL-VALUE HALF
3007 SKIPN SVSAT ;IS IT UNARY
3008 JRST UNOP ;YES, NO NEED TO GET 2ND OPERAND
3009 HRL A,(D) ;GET GLOBAL VALUE MARKER FOR 2ND OP
3011 POP D,W ;VALUE OR GLOBAL NAME
3012 UNOP: POP D,V ;OPERATOR
3013 JUMPN A,GLOB ;IF EITHER IS A GLOBAL HANDLE SPECIALLY
3014 XCT OPTAB-3(V) ;IF BOTH VALUES JUST XCT
3015 MOVE C,W ;GET THE CURRENT VALUE
3016 SETSAT: SKIPG V,(D) ;IS THERE A VALUE IN THE STACK
3017 MOVE V,-2(D) ;YES, THIS MUST BE THE OPERATOR
3018 MOVE V,DESTB-3(V) ;GET NUMBER OF OPERANDS NEEDED
3019 MOVEM V,SVSAT ;SAVE IT HERE
3020 SKIPG (D) ;WAS THERE AN OPERAND
3021 SUBI V,1 ;HAVE 1 OPERAND ALREADY
3022 JRST HLFOP1 ;GO SEE WHAT WE SHOULD DO NOW
3025 GLOB: TRNE A,-1 ;IS IT IN RIGHT HALF
3026 JRST TLHG ;NO, NEED TO PUT THIS VALUE INTO THE FIXUP LIST
3027 PUSH P,W ;SAVE FOR A WHILE
3029 AOS C,OPNUM ;GET AN OPERAND NUMBER
3030 LSH C,5 ;AND PUT IN TYPE
3031 IORI C,2 ;VALUE TYPE
3032 HRL C,HEADNM ;THE FIXUP NUMBER
3034 POP P,W ;RETRIEVE THE OTHER VALUE
3035 TLHG: SKIPE SVSAT ;WAS THIS A UNARY OPERATOR
3036 TLNE A,-1 ;WAS THERE A GLOBAL IN LEFT HALF
3038 PUSH P,C ;SAVE THE FIRST OPERAND
3039 AOS C,OPNUM ;SEE ABOVE
3047 GLSET: EXCH C,W ;GET THEM IN THE OTHER ORDER
3048 HRL W,C ;SET UP THE OPERATOR LINK
3050 LSH C,5 ;SPACE FOR THYPE
3051 IOR C,V ;THE OPERATOR
3053 PUSHJ P,SYM3X2 ;INTO THE UNDEF LIST
3054 MOVEI A,400000 ;SET UP AS A GLOBAL VALUE
3055 JRST SETSAT ;AND SET UP FOR NEXT OPERATOR
3058 \f;FINALLY WE GET TO STORE THIS MESS
3060 STOROP: MOVE T,-2(D) ;THIS SHOULD BE THE FAKE OPERATOR
3062 JRST LOAD4A ;NO, ILL FORMAT
3063 HRRZ T,(D) ;GET THE VALUE TYPE
3064 JUMPN T,GLSTR ;AND TREAT GLOBALS SPECIAL
3065 MOVE A,W ;THE TYPE OF STORE OPERATOR
3068 PUSHJ P,RDHLF ;GET THE ADDRESS
3069 MOVE V,W ;SET UP FOR FIXUPS
3070 POP D,W ;GET THE VALUE
3071 POP D,W ;AFTER IGNORING THE FLAG
3072 PUSHJ P,@STRTAB+6(A) ;CALL THE CORRECT FIXUP ROUTINE
3073 COMSTR: SETZM POLSW ;ALL DONE WITH POLISH
3074 IFN REENT,<PUSHJ P,RESTRX>
3075 MOVE T,OPNUM ;CHECK ON SIZES
3079 JRST COMPOL ;TOO BIG, GIVE ERROR
3080 PUSHJ P,RWORD ;THIS SHOULD GET US OUT (I.E RUN OUT COUNT)
3081 JRST LOAD4A ;IF NOT, SOMETHING IS WRONG
3083 STRTAB: EXP ALSYM,LFSYM,RHSYM,ALSTR,LOCDLF,SYM4A,FAKESY
3088 PUSHJ P,RDHLF ;GET THE STORE LOCATION
3092 HRLM V,W ;SET UP STORAGE ELEMENT
3098 MOVE W,C ;NOW SET UP THE HEADER
3099 AOS V,GLBCNT ;WHICH HAS NUMBER OF GLOBALS
3103 JRST COMSTR ;AND FINISH
3107 \fALSTR1: IFN L,<CAMGE V,RINITL
3109 IFN REENT,<CAMGE V,HVAL1
3113 MOVEM W,@X ;FULL WORD FIXUPS
3115 ALSTR: JUMPN V,ALSTR1
3117 DESTB: EXP 1,1,1,1,1,1,1,1,0,0,100
3129 REPEAT 7,<JRST STRSAT>
3132 FSYMT: PUSHJ P,RDHLF ;FIRST HALF OF SYMBOL
3136 PUSH D,A ;SAVE STORE TYPE
3137 PUSHJ P,RDHLF ;GET BLOCK NAME
3141 TLO C,140000 ;MAKE BLOCK NAME
3142 PUSHJ P,SDEF ;FIND IT
3144 JRST FNOLOC ;MUST NOT BE LOADING LOCALS
3145 FSLP: LDB C,[POINT 32,-1(A),35] ;GET NAME
3152 MOVEI A,0 ;SET FOR A FAKE FIXUP
3155 FNDSYM: MOVEI W,(A) ;LOC OF SYMBOL
3163 MOVSI D,400000 ;LEFT HALF
3169 FAKESY: POPJ P, ;IGNORE
3172 \fPOLSAT: PUSH P,C ;SAVE SYMBOL
3174 PUSHJ P,SREQ ;GO FIND IT
3176 JRST LOAD4A ;SOMETHING IS ROTTEN IN DENMARK
3177 MOVEM W,2(A) ;STORE VALUE
3178 HLRZS C ;NOW FIND HEADER
3182 HRLZI V,-1 ;AND DECREMENT COUNT
3184 TLNN V,-1 ;IS IT NOW 0
3185 JRST PALSAT ;YES, GO DO POLISH
3186 POP P,C ;RESTORE SYMBOL
3187 JRST SYM2W1 ;AND RETURN
3189 PALSAT: PUSH P,W ;SAVE VALUE
3190 MOVEM C,HDSAV ;SAVE THE HEADER NUMBER
3191 MOVE D,[IOWD PPDL,PPDB] ;SET UP A PDL
3192 MOVE C,V ;GET THE POINTER
3193 HRL C,HDSAV ;AND THE FIXUP NUMBER
3194 PUSHJ P,REMSYM ;REMOVE THE HEADER FORM EXISTANCE
3195 PUSHJ P,SREQ ;GO FINE THE NEXT LINK
3198 ANDI C,37 ;GET OPERATOR TYPE
3199 HRRZ V,2(A) ;PLACE TO STORE
3201 PUSH D,[XWD 400000,0]
3202 PUSH D,C ;THIS HAD BETTER BE A STORE OR WE ARE IN TROUBLE
3203 HLRZ C,2(A) ;GET POINTER TO POLISH CHAIN
3204 PSAT1: PUSHJ P,REMSYM ;REMOVE SYMBOL
3208 \fPSAT2: HRL C,HDSAV ;GET FIXUP NUMBER
3209 PUSHJ P,SREQ ;LOOK FOR IT
3212 ANDI C,37 ;THE OPERATOR NUMBER
3213 CAIN C,2 ;IS IT AN OPERAND?
3214 JRST PSOPD ;YES, GO PROCESS
3215 PUSH D,C ;YES STORE IT
3216 SKIPN DESTB-3(C) ;IS IT UNARY
3218 HLRZ C,2(A) ;GET FIRST OPERAND
3219 HRLI C,600000 ;AND MARK AS VALUE
3221 PSUNOP: HRRZ C,2(A) ;OTHER OPERAND
3222 JRST PSAT1 ;AND AWAY WE GO
3224 PSOPD: MOVE C,2(A) ;THIS IS A VALUE
3225 PUSHJ P,REMSYM ;GET RID OF THAT PART OF THE CHAIN
3226 PSOPD1: SKIPG V,(D) ;IS THERE A VALUE IN THE STACK
3227 JRST PSOPD2 ;YES, TAKE GOOD CARE OF IT
3228 COMOP: POP D,V ;NO, GET THAT OPERATOR OUT OF THERE
3229 XCT OPTAB-3(V) ;AND DO IT
3230 MOVE C,W ;GET RESULT IN RIGHT PLACE
3231 JRST PSOPD1 ;AND TRY FOR MORE
3232 PSOPD2: TLNE V,200000 ;IS IT A POINTER
3233 JRST DBLOP ;YES, NEEDS MORE WORK
3234 MOVE W,C ;NO, ONE WE HAVE IS FIRST OPND, GET IT INTO W
3235 POP D,C ;VALUE POINTER
3236 POP D,C ;2ND OPERAND INTO C
3237 JRST COMOP ;GO PROCESS OPERATOR
3239 DBLOP: EXCH C,(D) ;PUT VALUE IN STACK AND RETRIEV POINTER
3240 PUSH D,[XWD 400000,0] ;MARK AS VALUE
3241 JRST PSAT2 ;AND GO LOOK FOR MORE TROUBLE
3243 LINK: PUSHJ P,PRWORD ;GET TWO WORDS
3244 JUMPLE C,ENDLNK ;THIS IS AN END OF LINK WORD
3245 CAILE C,20 ;IS IT IN RANGE?
3247 HRRZ V,W ;GET THE ADDRESS
3249 CAMGE V,HVAL1 ;CHECK HISEG ADDRESS
3250 SKIPA X,LOWX ;LOW SEGMENT
3251 MOVE X,HIGHX ;HIGH SEGMENT BASE
3253 HRRZ W,LINKTB(C) ;GET CURRENT LINK
3254 IFN L,< CAML V,RINITL ;LOSE>
3255 HRRM W,@X ;PUT INTO CORE
3256 HRRM V,LINKTB(C) ;SAVE LINK FOR NEXT ONE
3258 PUSHJ P,RESTRX ;RESTORE X
3260 JRST LINK ;GO BACK FOR MORE
3261 ENDLNK: MOVNS C ;GET ENTRY NUMBER
3262 JUMPE C,LOAD4A ;0 IS A LOSER
3263 CAILE C,20 ;CHECK RANGE
3265 HRLM W,LINKTB(C) ;SAVE END OF LINK INFO
3269 \fSTRSAT: MOVE W,C ;GET VALUE TO STORE IN W
3270 MOVE C,V ;GET OPERATOR HERE
3272 POP D,V ;GET ADDRESS TO STORE
3273 PUSHJ P,@STRTAB-15(C)
3274 IFN REENT,<PUSHJ P,RESTRX>
3275 POP P,W ;RESTORE THINGS
3283 LIST ;END OF FAILSW CODE
3285 COMSFX: IFN REENT,<PUSHJ P,SYMFX1 ;WAS IFE, I THINK THAT'S WRONG -- DCS
3287 IFE REENT,<JRST SYMFX1>> ;WAS IFN, I THINK THAT'S WRONG -- DCS
3299 \fSUBTTL LIBRARY INDEX (BLOCK TYPE 14)
3301 COMMENT * DIRECT ACCESS LIBRARY SEARCH MODE
3302 INDEX WRITTEN BY FUDGE2.SEE DIDAL DOC (100-540-001-00)
3303 DESIGN AND CODING BY D.M.NIXON JUL-AUG 1970
3308 INDEX8: POP P,LSTBLK ;SET UP LSTBLK FOR NEXT PROG
3309 PUSHJ P,WORD ;READ FIRST WORD
3310 HLRZ A,W ;BLOCK TYPE ONLY
3311 CAIE A,14 ;IS IT AN INDEX?
3312 JRST INDEXE ;NO, ERROR
3313 JRST INDEX9 ;DON'T SET FLAG AGAIN
3315 INDEX0: TRO F,XFLG ;SIGNAL INDEX IN CORE
3316 MOVEI A,1 ;START ON BLOCK 1 (DSK)
3317 HRROM A,LSTBLK ;BUT INDICATE AN INDEX
3318 MOVE A,ILD1 ;INPUT DEVICE
3320 TLNE A,100 ;IS IT A DTA?
3322 INDEX9: MOVEI A,AUX+2 ;AUX BUFFER
3323 HRLI A,4400 ;MAKE BYTE POINTER
3324 MOVEM A,ABUF1 ;AND SAVE IT
3325 HRL A,BUFR1 ;INPUT BUFFER
3326 BLT A,AUX+201 ;STORE BLOCK
3327 TRO F,LSTLOD ;AND FAKE LAST PROG READ
3328 INDEX1: ILDB T,ABUF1
3329 HLRE A,T ;GET WORD COUNT
3330 JUMPL A,INDEX3 ;END OF BLOCK IF NEGATIVE
3331 CAIE A,4 ;IS IT ENTRY
3333 HRRZS T ;WORD COUNT ONLY
3334 INDEX2: ILDB C,ABUF1 ;GET NEXT SYMBOL
3336 PUSHJ P,SREQ ;SEARCH FOR IT
3337 SOJA T,INDEX4 ;REQUEST MATCHES
3338 SOJG T,INDEX2 ;KEEP TRYING
3339 ILDB T,ABUF1 ;GET POINTER WORD
3340 TRZN F,LSTLOD ;WAS LAST PROG LOADED?
3342 TRNN F,DTAFLG ;ALWAYS SAVE IF DTA???
3343 SKIPL LSTBLK ;SKIP IF LAST BLOCK WAS AN INDEX
3344 MOVEM T,LSTBLK ;SAVE POINTER FOR CALCULATIONS
3345 JRST INDEX1 ;GET NEXT PROG
3348 \fINDEX4: ADDM T,ABUF1
3350 PUSH P,A ;SAVE THIS BLOCK
3351 TROE F,LSTLOD ;DID WE LOAD LAST PROG?
3352 JRST [SKIPGE LSTBLK ;WAS LAST BLOCK AN INDEX?
3353 JRST NXTBLK ;YES, SO GET NEXT ONE
3355 JRST LOAD1] ;NEXT PROG IS ADJACENT
3356 HRRZ T,LSTBLK ;GET LAST BLOCK NUMBER
3357 CAIN T,(A) ;IN THIS BLOCK?
3359 NXTNDX: TRNE F,DTAFLG ;DIFFERENT TEST FOR DTA
3360 JRST NXTDTA ;CHECK IF NEXT BUFFER IN CORE
3361 CAIN T,-1(A) ;NEXT BLOCK?
3362 JRST NXTBLK ;YES,JUST DO INPUT
3363 INDEX5: USETI 1,(A) ;SET ON BLOCK
3364 WAIT 1, ;LET I/O FINISH
3365 MOVSI C,(1B0) ;CLEAR RING USE BIT IF ON
3366 ; ***** THE EQUIV. OF THE NEXT INSTR. MAY WELL BE IN LATER VERSIONS.
3367 ; ***** IT WAS MISSING, AND FOULED UP THE INDEX STUFF. (DCS 7-7-71)
3368 HLLM C,BUFR ;INDICATE VIRGIN BUFFER
3371 JRST NXTBLK ;ALL DONE NOW
3372 ANDCAM C,(T) ;CLEAR USE BIT
3373 HRRZ T,(T) ;GET NEXT BUFFER
3376 NXTDTA: WAIT 1, ;LET I/O RUN TO COMPLETION
3377 HRRZ T,BUFR ;GET POINTER TO CURRENT BUFFER
3378 HLRZ T,1(T) ;FIRST DATA WORD IS LINK
3379 CAIE T,(A) ;IS IT BLOCK WE WANT?
3382 JRST NEWBLK ;IT IS NOW
3383 JRST WORD3 ;EOF OR ERROR
3385 NEWBLK: MOVE A,(P) ;GET CURRENT BLOCK
3386 JUMPL A,INDEX8 ;JUST READ AN INDEX
3387 HLRZS A ;GET WORD COUNT
3388 COMMENT * DCS -- 3/15/71
3389 This code required modification to work with DEC's FUDGE2
3390 (with /X) at Stanford. I don't know the formats, so I don't know
3391 if the bugs are unique to Stanford.
3392 In particular, the special 0 test seems to cause all the
3393 trouble -- removing it fixed it. However, my fix may well foul
3394 up with Dectapes (see the SPR for "details?").
3397 ; 0 TEST REMOVED HERE -- DCS
3398 SKIPL LSTBLK ;WAS LAST BLOCK AN INDEX?
3399 AOJA A,INDEX6 ;NO, ALWAYS ONE WORD OUT THEN
3400 HRRZ T,AUX+3 ;GET FIRST ENTRY BLOCK TYPE COUNT
3401 HRRZ T,AUX+4(T) ;GET FIRST POINTER WORD
3402 MOVEM T,LSTBLK ;SOME WHERE TO STORE IT
3403 HRRZ T,(P) ;GET CURRENT BLOCK NUMBER
3404 CAME T,LSTBLK ;SAME BLOCK
3406 TRNN F,DTAFLG ;BUFR2 OK IF DTA
3407 SOS BUFR2 ;ONE WORD TOO MANY THOUGH
3408 JRST INDEX6 ;YES, WORD COUNT WILL BE CORRECT
3409 ; IF A IS 0, INDEX6≡INDEX7 -- DCS
3412 \fTHSBLK: SUB A,LSTBLK ;GET WORD DIFFERENCE
3413 MOVSS A ;INTO RIGHT HALF
3414 INDEX6: ADDM A,BUFR1
3417 INDEX7: POP P,LSTBLK ;STORE THIS AS LAST BLOCK READ
3420 INDEX3: HRRE A,T ;GET BLOCK # OF NEXT INDEX
3421 JUMPL A,EOF ;FINISHED IF -1
3422 PUSH P,T ;STACK THIS BLOCK
3423 HRRZ T,LSTBLK ;GET LAST BLOCK
3424 JRST NXTNDX ;CHECK IF NEXT BUFFER IN CORE
3426 INDEX: IN 1, ;GET NEXT BUFFER
3427 SOSA BUFR2 ;O.K. RETURN, BUT 1 WORD TOO MANY
3428 JRST WORD3 ;ERROR OR EOF
3429 PUSHJ P,WORD ;READ FIRST WORD
3430 INDEXE: TRZE F,XFLG ;INDEX IN CORE?
3431 TTCALL 3,[ASCIZ /LIBRARY INDEX INCONSISTENT - CONTINUING
3433 JRST LOAD1A+1 ;AND CONTINUE
3438 \fSUBTTL ALGOL OWN BLOCK (TYPE 15)
3442 IFN SAILSW,<TRNN F,ALGFL ;IF NOT ALGOL
3443 JRST LDPRG ;MUST BE SAIL BLOCK TYPE 15>
3444 PUSHJ P,RWORD ;READ 3RD WORD
3445 HLRZ V,W ;GET START OF OWN BLOCK
3446 MOVEI C,(W) ;GET LENGTH OF OWN BLOCK
3447 MOVEM C,OWNLNG ;SAVE IT TO FIX RELOC AT END
3448 PUSHJ P,ALGB2 ;FIX AND CHECK PROG BREAK
3449 ADDI V,(R) ;RELOCATE
3450 MOVEI W,(V) ;GET CURRENT OWN ADDRESS
3451 EXCH W,%OWN ;SAVE FOR NEXT TIME
3452 MOVEM W,@X ;STORE LAST OWN ADDRESS IN LEFT HALF
3453 ALGB1: PUSHJ P,RWORD ;GET DATA WORD
3454 HLRZ V,W ;GET ADDRESS TO FIX UP
3455 HRRZS W ;RIGHT HALF ONLY
3456 ADD W,%OWN ;ADD IN ADDRESS OF OWN BLOCK
3457 ADDM W,@X ;FIX UP RIGHT HALF
3458 JRST ALGB1 ;LOOP TIL DONE
3460 ALGNAM: JUMPE W,CPOPJ ;NOT ALGOL MAIN PROG
3461 TROE F,ALGFL ;SET ALGOL SEEN FLAG
3462 JRST ALGER1 ;ONLY ONE ALGOL MAIN PROG ALLOWED
3463 IFN REENT,<TRNN F,SEENHI ;ANYTHING IN HIGH SEGMENT?>
3464 CAME R,[XWD W,JOBDA] ;ANYTHING LOADED IN LOW SEGMENT?
3465 JRST ALGER2 ;YES, ERROR ALSO
3466 SETZM %OWN ;INITIALISE OWN AREA POINTER
3467 IFN REENT,<TRO F,VFLG ;DEFAULT RE-ENTRANT OP-SYSTEM>
3468 ALGB2: ADDI H,(W) ;FIX PROG BREAK
3469 IFN REENT,<CAML H,HILOW
3470 MOVEM H,HILOW ;HIGHEST LOW CODE LOADED>
3471 CAILE H,1(S) ;SKIP IF SUFFICIENT CORE AVAILABLE
3472 IFN EXPAND,<JRST [PUSHJ P,XPAND>
3474 IFN EXPAND,< JRST .+1]>
3477 ALGER1: ERROR ,</ONLY ONE ALGOL MAIN PROGRAM ALLOWED#/>
3480 ALGER2: ERROR ,</ALGOL MAIN PROGRAM MUST BE LOADED FIRST#/>
3486 \fSUBTTL SAIL BLOCK TYPE 15
3488 COMMENT * BLOCK TYPE 15 AND 16. SIXBIT FOR FIL,PPN,DEV
3489 IN THE BLOCK. SEARCH TABLE FOR ALREADY REQUESTED. IF NOT
3490 ENTER REQUEST. ORIGINAL CODE BY DCS REWRITTEN BY WFW*
3494 LDPRG: MOVEI D,PRGFLS-1 ;SET UP SOMETHING WE CAN SEARCH WITH
3495 MOVE W,PRGPNT ;AND CURRENT POINTER
3496 PUSHJ P,LDSAV ;GO ENTER (WILL NOT RETURN IF RUNS OUT)
3498 JRST LDPRG ;BACK FOR MORE
3499 LDLIB: MOVEI D,LIBFLS-1
3503 JRST LDLIB ;LOOKS JUST LIKE THE LAST ONE, DOESN'T IT
3505 LDSAV: HRLI D,-RELLEN-1 ;GET AOBJN SET UP
3506 MOVEM W,LODPN2# ;SAV IT
3507 PUSHJ P,PRWORD ;GET FILE,PPN
3509 PUSHJ P,RWORD ;AND DEVICE
3510 FILSR: CAMN D,LODPN2
3511 JRST FENT ;HAVE GOTTEN THERE, ENTER FILE
3512 CAME C,PRGFIL(D) ;CHECK FOR MATCH
3517 NOMT: AOBJN D,FILSR ;AND NOT DEVICE SHOULD ALWAYS JUMP
3519 POPJ P, ;JUST RETURN CURRENT POINTER
3520 FENT: MOVE D,LODPN2 ;ENTER IT
3521 AOBJP D,WRONG ;THAT IS IF NOT TOO MANY
3522 MOVEM C,PRGFIL-1(D) ;HAVE ALREADY INDEXED
3523 MOVEM A,PRGPPN-1(D) ;HENCE THE -1
3526 WRONG: ERROR ,</TOO MANY DEMANDED FILES#/>
3531 \fSUBTTL SYMBOL TABLE SEARCH SUBROUTINES
3533 ; ENTERED WITH SYMBOL IN C
3534 ; RETURN IS WITH POINTER IN A IF MATCHING SYMBOL FOUND
3535 ; OTHERWISE, A SKIP ON RETURN OCCURS
3537 SREQ: JUMPGE S,CPOPJ1 ;JUMP IF NO UNDEF. SYMBOLS
3538 SKIPA A,S ;LOAD REQUEST SEARCH POINTER
3539 SDEF: MOVE A,B ;LOAD DEF. SYMBOL SEARCH POINTER
3541 POPJ P, ;SYMBOLS MATCH, RETURN
3542 IFE K,< TLNE N,F4SW ;ARE WE IN FORTRAN?
3543 JRST SDEF2 ;YES,JUST TRY NEXT SYMBOL>
3544 TLC C,400000 ;MIGHT BE SUPPRESSED INTERNAL
3545 CAMN C,1(A) ;WAS IT?
3546 JRST [TLO C,400000 ;YES, SO ENSURE IT'S SUPPRESSED
3547 MOVEM C,1(A) ;STORE SUPPRESSED DEFINITION
3549 TLC C,400000 ;NO,TRY NEXT SYMBOL
3552 IFE K,< JRST CPOPJ1 ;SYMBOL NOT FOUND SKIPS ON RETURN>
3558 \fSUBTTL RELOCATION AND BLOCK INPUT
3560 PRWORD: PUSHJ P,RWORD ;READ A WORD PAIR
3561 MOVE C,W ;LOAD C WITH FIRST DATA WORD
3562 TRNE E,377777 ;TEST FOR END OF BLOCK
3563 JRST RWORD1 ;INPUT SECOND WORD OF PAIR
3564 MOVEI W,0 ;NO SECOND WORD, ASSUME ZERO
3567 RWORD: TRNN E,377777 ;TEST FOR END OF BLOCK
3568 JRST LOAD1 ;RETURN TO LOAD THE NEXT BLOCK
3569 RWORD1: AOBJN E,RWORD2 ;JUMP IF DATA WORD NEXT
3570 PUSHJ P,WORD ;READ CONTROL WORD
3571 MOVE Q,W ;DON'T COUNT RELOCATION WORDS
3572 HRLI E,-22 ;SET RELOCATION WORD BYTE COUNT
3573 RWORD2: PUSHJ P,WORD ;READ INPUT WORD
3574 JUMPGE Q,RWORD3 ;TEST LH RELOCATION BIT
3575 TRNN F,TWOFL ;POSSIBLE TWO SEGMENTS?
3578 PUSHJ P,CHECK ;USE CORRECT RELOCATION
3581 JRST RWORD3 ;AND TEST RIGHT HALF
3583 ADD W,T ;LH RELOCATION
3584 RWORD3: TLNN Q,200000 ;TEST RH RELOCATION BIT
3585 JRST RWORD4 ;NOT RELOCATABLE
3586 TRNE F,TWOFL ;POSSIBLE TWO SEGMENTS?
3587 PUSHJ P,CHECK ;USE CORRECT RELOCATION
3588 HRRI W,@R ;RH RELOCATION
3592 CHECK: MOVE T,HVAL1 ;START OF HISEGMENT
3593 CAIG T,NEGOFF(W) ;IN HISEG?
3594 JRST [SUBI W,(T) ;YES REMOVE OFSET
3596 HRRI W,@LOWR ;USE LOW SEG RELOC
3597 JRST CPOPJ1 ;SKIP RETURN
3600 \fSUBTTL PRINT STORAGE MAP SUBROUTINE
3602 PRMAP: CAIN D,1 ;IF /1M PRINT LOCAL SYMBOLS
3603 TROA F,LOCAFL ;YES,TURN ON FLAG
3604 TRZ F,LOCAFL ;CLEAR JUST IN CASE
3605 PUSHJ P,FSCN1 ;LOAD OTHER FILES FIRST
3606 PUSHJ P,CRLFLF ;START NEW PAGE
3608 IFN REENT,<CAIG W,JOBDA ;LOADED INTO LOW SEGMENT
3609 JRST NOLOW ;DON'T PRINT IF NOTHING THERE>
3611 IFE REENT,<ERROR 7,<?IS THE PROGRAM BREAK@?>>
3612 IFN REENT,<ERROR 7,<?IS THE LOW SEGMENT BREAK@?>
3613 PUSHJ P,CRLF ;CR-LF ON ALL BUT TTY
3614 NOLOW: MOVE W,HVAL ;HISEG BREAK
3615 CAMG W,HVAL1 ;HAS IT CHANGED
3616 JRST NOHIGH ;NO HI-SEGMENT
3617 TLO F,FCONSW ;FORCE OUT HI-SEG BREAK ALSO
3619 ERROR 7,<?IS THE HIGH SEGMENT BREAK@?>
3622 IFE NAMESW,< MOVE W,DTOUT ;OUTPUT NAME >
3623 IFN NAMESW,< SKIPN W,DTOUT
3624 MOVE W,CURNAM ;USE PROGRAM NAME>
3625 JUMPE W,.+3 ;DON'T PRINT IF NOT THERE
3627 PUSHJ P,SPACES ;SOME SPACES
3628 ERROR 0,<?STORAGE MAP!?>
3629 PUSHJ P,SPACES ;SOME SPACES
3632 MOVE N,[POINT 6,DBUF] ;INITIALIZE DATE POINTER
3633 MSTIME Q, ;GET THE TIME
3634 IDIVI Q,↑D60*↑D1000
3636 PUSH P,A ;SAVE MINUTES
3637 PUSHJ P,OTOD1 ;STORE HOURS
3638 POP P,Q ;GET MINUTES
3639 PUSHJ P,OTOD ;STORE MINUTES
3641 IDIVI E,↑D31 ;GET DAY
3643 PUSHJ P,OTOD ;STORE DAY
3644 IDIVI E,↑D12 ;GET MONTH
3646 HRR A,DTAB(Q) ;GET MNEMONIC
3648 HLR A,DTAB(Q) ;OTHER SIDE
3649 HRRM A,DBUF+1 ;STORE IT
3650 MOVEI Q,↑D64(E) ;GET YEAR
3651 MOVE N,[POINT 6,DBUF+2]
3652 PUSHJ P,OTOD ;STORE IT
3657 SKIPN STADDR ;PRINT STARTING ADDRESS
3658 JRST NOADDR ;NO ADDRESS SEEN
3659 ERROR 0,</STARTING ADDRESS !/>
3661 MOVE W,STADDR ;GET ST. ADDR.
3662 PUSHJ P,PRNUM0 ;PRINT IT
3665 MOVE W,[SIXBIT / PROG /]
3667 MOVE W,CURNAM ;PROG NAME
3670 MOVE W,ERRPT6 ;SIXBIT / FILE /
3672 MOVE W,PRGNAM ;FILE NAME
3675 HRRZ A,HVAL1 ;GET INITIAL HIGH START
3676 ADDI A,JOBHDA ;ADD IN OFFSET
3677 HRLI A,JOBDA ;LOW START
3678 MOVSM A,SVBRKS ;INITIAL BREAKS>
3683 IFN REENT,<SKIPN C,1(A) ;LOAD SYMBOL SKIP IF REAL SYMBOL
3684 JRST PRMAP4 ;IGNORE ZERO NAME(TWOSEG BREAKS)>
3685 IFE REENT,<MOVE C,1(A) ;LOAD SYMBOL>
3686 TLNN C,300000 ;TEST FOR LOCAL SYMBOL
3687 JRST .+4 ;GLOBAL (NOT LOCAL ANYWAY)
3688 TRNN F,LOCAFL ;PRINT LOCAL SYMBOLS?
3689 JRST PRMAP4 ;IGNORE LOCAL SYMBOLS
3690 TLC C,140000 ;MAKE IT LOOK LIKE INTERN
3699 \fPRMP1A: PUSHJ P,TAB
3700 PRMP1B: PUSHJ P,PRNAM1 ;PRINT SYMBOL AND VALUE
3702 JRST PRMAP4 ;GLOBAL SYMBOL
3703 HLRE C,W ;POINTER TO NEXT PROG. NAME
3704 HRRZS W ;SO WE ONLY HAVE THE HALF WE WANT
3705 PRMAP7: JUMPL C,PRMP7A
3706 IFN REENT,<SKIPN 1(B) ;IS IT A ZERO SYMBOL
3707 JRST [MOVE C,B ;SET UP C
3708 JRST PRMAP2] ;AND GO
3709 HRRZ T,HVAL ;GET TO OF HI PART
3710 CAML W,HVAL1 ;IS PROGRAM START UP THERE??
3712 HRRZ T,HILOW ;GET HIGHEST LOCATION LOADED IN LOW
3713 SUBI T,(X) ;REMOVE OFFSET
3714 CAIE T,(W) ;EQUAL IF ZERO LENGTH PROG>
3715 HRRZ T,R ;GET LOW, HERE ON LAST PROG
3718 PRMP7A: ADDI C,2(A) ;POINTER TO NEXT PROGRAM NAME
3720 SKIPE 1(C) ;THIS IS A TWO SEG FILE
3722 MOVE T,2(C) ;GET PROG BREAKS
3723 TLNN T,-1 ;IF NO HIGH STUFF YET
3724 HLL T,SVBRKS ;FAKE IT
3725 SUB T,SVBRKS ;SUBTRACT LAST BREAKS
3728 JUMPGE T,.+2 ;IF NEGATIVE
3729 TDZA W,W ;MAKE ZERO (FIRST TIME THRU)
3730 HLRZ W,T ;GET HIGH BREAK
3731 PUSHJ P,PRNUM ;PRINT IT
3732 PUSHJ P,TAB ;AND TAB
3736 CAMN C,B ;EQUAL IF LAST PROG
3740 CAMN T,SVBRKS ;ZERO LENGTT IF EQUAL
3741 JRST PRMP6A ;SEE IF LIST ALL ON
3742 MOVEM T,SVBRKS ;SAVE FOR NEXT TIME
3743 JRST PRMAP3 ;AND CONTINUE
3745 HRRZ T,(C) ;GET ITS STARTING ADRESS
3746 IFN REENT,<CAMGE W,HVAL1 ;MAKE SURE BOTH IN SAME SEGMENT
3749 JRST [HLRE T,(C) ;NO TRY NEXT ONE DOWN
3750 JUMPE T,@PRMAP7 ;END GO USE PROG BREAK
3752 JRST PRMAP2] ;CHECK THIS ONE>
3753 PRMAP6: SUBM T,W ;SUBTRACT ORIGIN TO GET LENGTH
3754 PUSHJ P,PRNUM ;PRINT PROGRAM LENGTH
3756 PRMP6A: TLNN N,ALLFLG ;SKIP IF LIST ALL MODE IS ON
3757 TRNE W,777777 ;SKIP IF ZERO LENGTH PROGRAM
3759 HLRE C,2(A) ;GET BACK CORRECT LOCATION IF 0 LENGTH
3760 JUMPE C,PRMAP5 ;JUMP IF LAST PROGRAM
3761 ADDI C,2(A) ;IN CASE WE SKIPPED SOME PROGRAMS
3762 SKIPA A,C ;SKIP GLOBALS, ZERO LENGTH PROG.
3763 PRMAP3: PUSHJ P,CRLF
3764 PRMAP4: CAILE A,(B) ;TEST FOR END OF SYMBOL TABLE
3766 PRMAP5: PUSHJ P,CRLF ;GIVE AN XTRA CR-LF
3770 \fSUBTTL LIST UNDEFINED AND MULTIPLY DEFINED GLOBALS
3772 PUSHJ P,PMS1 ;PRINT UNDEFINED SYMBOLS
3774 ;LIST NUMBER OF MULTIPLY DEFINED GLOBALS
3776 PMS3: SKIPN W,MDG ;ANY MULTIPLY DEFINED GLOBALS
3777 JRST PMS4 ;NO, EXCELSIOR
3778 PUSHJ P,FCRLF ;ROOM AT THE TOP
3779 PUSHJ P,PRQ ;PRINT ?
3780 PUSHJ P,PRNUM0 ;NUMBER OF MULTIPLES
3781 ERROR 7,<?MULTIPLY DEFINED GLOBALS@?>
3782 PMS4: TLNE N,AUXSWE ;AUXILIARY OUTPUT DEVICE?
3783 OUTPUT 2, ;INSURE A COMPLETE BUFFER
3786 ;LIST UNDEFINED GLOBALS
3788 PMS1: PUSHJ P,FSCN1 ;LOAD FILES FIRST
3789 JUMPGE S,CPOPJ ;JUMP IF NO UNDEFINED GLOBALS
3790 PUSHJ P,FCRLF ;START THE MESSAGE
3791 HLRE W,S ;COMPUTE NO. OF UNDEF. GLOBALS
3793 LSH W,-1 ;<LENGTH OF LIST>/2
3795 ERROR 7,</UNDEFINED GLOBALS@/>
3796 MOVE A,S ;LOAD UNDEF. POINTER
3801 PUSHJ P,PRNAM0 ;PRINT SYMBOL AND POINTER
3806 PMS: PUSHJ P,PMS1 ;PRINT UNDEFINED SYMBOLS
3807 JUMPGE S,CPOPJ ;NO UNDEFINED SYMBOLS
3808 PUSHJ P,CRLF ;NEW LINE,MAKE ? VISIBLE
3809 PUSHJ P,PRQ ;FIX FOR BATCH TO PRINT ALL SYMBOLS
3810 JRST CRLF ;SPACE AFTER LISTING
3813 \fSUBTTL ENTER FILE ON AUXILIARY OUTPUT DEVICE
3815 IAD2: PUSH P,A ;SAVE A FOR RETURN
3816 MOVE A,LD5C1 ;GET AUX. DEV.
3817 DEVCHR A, ;GET DEVCHR
3818 TLNN A,4 ;DOES IT HAVE A DIRECTORY
3819 JRST IAD2A ;NO SO JUST RETURN
3820 MOVE A,DTOUT ;GET OUTPUT NAME
3821 CAME A,[SIXBIT /JOBDAT/] ;DON'T USE JOBDAT
3822 JUMPN A,IAD2A ;USE ANYTHING NON-ZERO
3823 MOVSI A,(SIXBIT /DSK/) ;DEFAULT DEVICE
3824 CAMN A,LD5C1 ;IS IT AUX. DEV.
3825 JRST .+5 ;YES LEAVE WELL ALONE
3826 CLOSE 2, ;CLOSE OLD AUX. DEV.
3827 MOVEM A,LD5C1 ;SET IT TO DSK
3828 OPEN 2,OPEN2 ;OPEN IT FOR DSK
3830 IFN NAMESW,< SKIPN A,CURNAM ;USE PROG NAME>
3831 MOVSI A,(SIXBIT /MAP/) ;AN UNLIKELY NAME
3832 MOVEM A,DTOUT ;SO ENTER WILL NOT FAIL
3833 IAD2A: POP P,A ;RECOVER A
3834 SETZM DTOUT+2 ;CLEAR PROTECTION (LEVEL D)
3835 ENTER 2,DTOUT ;WRITE FILE NAME IN DIRECTORY
3836 JRST IMD3 ;NO MORE DIRECTORY SPACE
3839 IMD3: ERROR ,</DIR. FULL@/>
3842 IMD4: MOVE P,[XWD -40,PDLST] ;RESTORE STACK
3843 TLZ N,AUXSWE!AUXSWI ;NO AUX.DEV.NOW
3844 ERROR ,</NO MAP DEVICE@/>
3845 JRST PRMAP5 ;CONTINUE TO LOAD
3849 \fSUBTTL PRINT SUBROUTINES
3851 ;PRINT THE 6 DIGIT OCTAL ADDRESS IN W
3853 ; ACCUMULATORS USED: D,T,V
3855 PRNAM0: MOVE C,1(A) ;LOAD SYMBOL
3856 PRNAM1: MOVE W,2(A) ;LOAD VALUE
3857 PRNAM: PUSHJ P,PRNAME
3862 PRNUM0: MOVE V,PRNUM2 ;LOAD BYTE POINTER TO RH. OF W
3863 MOVNI D,6 ;LOAD CHAR. COUNT
3864 PRNUM1: ILDB T,V ;LOAD DIGIT TO BE OUTPUT
3865 ADDI T,60 ;CONVERT FROM BINARY TO ASCII
3867 AOJL D,PRNUM1 ;JUMP IF MORE DIGITS REMAIN
3870 PRNUM2: XWD 220300,W
3876 LDNAM: MOVE T,[POINT 6,CURNAM] ;POINTER
3877 MOVNI D,6 ;SET COUNT
3878 TLZ W,740000 ;REMOVE CODE BITS
3879 SETNAM: IDIVI W,50 ;CONVERT FROM RAD 50
3888 CAIG C,72 ;REMOVE SPECIAL CHARS. (. $ %)
3893 ;YE OLDE RECURSIVE NUMBER PRINTER
3894 ;PRINTS Q, WITH LEADING ZEROES SUPPRESSED; USES A AND T
3896 RCNUM: IDIVI Q,12 ;RADIX DECIMAL
3911 \f; ACCUMULATORS USED: Q,T,D
3913 PWORD: MOVNI Q,6 ;SET CHARACTER COUNT TO SIX
3914 PWORD1: MOVE D,LSTPT ;ENTER HERE WITH Q PRESET
3915 PWORD2: ILDB T,D ;LOAD NEXT CHAR. TO BE OUTPUT
3916 PUSHJ P,TYPE ;OUTPUT CHARACTER
3921 ;TYPEOUT SUBROUTINE - THE CHARACTER SUPPLIED IN T IS CONVERTED TO ASCII
3922 ;AND IS OUTPUT ON THE CONSOLE AND/OR THE SPECIFIED LOADER MAP OUTPUT
3925 CRLFLF: PUSHJ P,CRLF
3926 FCRLF: TLO F,FCONSW ;INSURE TTY OUTPUT
3927 CRLF: MOVEI T,15 ;CARRIAGE RETURN LINE FEED
3929 TRCA T,7 ;CR.XOR.7=LF
3930 TYPE: MOVEI T,40(T) ;CONVERT SIXBIT TO ASCII
3931 TYPE2: TLNN N,AUXSWI ;IS THER AN AUXILIARY DEVICE?
3932 JRST TYPE3 ;NO, DONT OUTPUT TO IT
3933 TLON N,AUXSWE ;IS AUX. DEV. ENTERED?
3934 PUSHJ P,IAD2 ;NOPE, DO SO!
3935 SOSG ABUF2 ;SPACE LEFT IN BUFFER?
3936 OUTPUT 2, ;CREATE A NEW BUFFER
3937 IDPB T,ABUF1 ;DEPOSIT CHARACTER
3938 TLNN F,FCONSW ;FORCE OUTPUT TO CONSOLE TOO?
3941 TRNE F,NOTTTY ;IF TTY IS ANOTHER DEVICE
3942 POPJ P, ;DON'T OUTPUT TO IT>
3943 SKIPN BUFO2 ;END OF BUFFER
3944 OUTPUT 3, ;FORCE OUTPUT NOW
3945 IDPB T,BUFO1 ;DEPOSIT CHARACTER
3946 CAIN T,12 ;END OF LINE
3947 OUTPUT 3, ;FORCE AN OUTPUT
3951 \fSUBTTL SYMBOL PRINT - RADIX 50
3953 ; ACCUMULATORS USED: D,T
3955 PRNAME: MOVE T,C ;LOAD SYMBOL
3956 TLZ T,740000 ;ZERO CODE BITS
3968 MOVNI D,6 ;LOAD CHAR. COUNT
3969 SPT: IDIVI T,50 ;THE REMAINDER IS THE NEXT CHAR.
3970 HRLM V,(P) ;STORE IN LH. OF PUSHDOWN LIST
3971 AOJGE D,.+2 ;SKIP IF NO CHARS. REMAIN
3972 PUSHJ P,SPT ;RECURSIVE CALL FOR NEXT CHAR.
3973 HLRZ T,(P) ;LOAD FROM LH. OF PUSHDOWN LIST
3998 OTOD1: IDIVI Q,↑D10
3999 ADDI Q,20 ;FORM SIXBIT
4005 DTAB: SIXBIT /JANFEB/
4014 \fSUBTTL ERROR MESSAGE PRINT SUBROUTINE
4019 ; SIXBIT /<MESSAGE>/
4021 ; ACCUMULATORS USED: T,V,C,W
4023 ERRPT: TLO F,FCONSW ;INSURE TTY OUTPUT
4024 PUSHJ P,CRLF ;ROOM AT THE TOP
4025 PUSHJ P,PRQ ;START OFF WITH ?
4026 ERRPT0: PUSH P,Q ;SAVE Q
4028 ERRPT1: PUSHJ P,TYPE
4035 JRST ERRP42 ;JUST RETURN,LEAVE FCONSW ON
4046 ERRPT3: MOVE W,ERRPT6
4054 ERRPT4: PUSHJ P,CRLF
4055 ERRP41: TLZ F,FCONSW ;ONE ERROR PER CONSOLE
4056 ERRP42: POP P,Q ;***DMN*** FIX FOR ILC MESSAGE
4057 AOJ V, ;PROGRAM BUMMERS BEWARE:
4058 JRST @V ;V HAS AN INDEX OF A
4060 ERRPT5: POINT 6,0(A)
4061 ERRPT6: SIXBIT / FILE /
4064 \fERRPT8: TLO F,FCONSW ;INSURE TTY OUTPUT
4065 PUSHJ P,PRQ ;START WITH ?
4066 CAIGE T,140 ;IS IT A NON-PRINTING CHAR?
4070 MOVEI T,136 ;UP ARROW
4073 TRC T,100 ;CONVERT TO PRINTING CHAR.
4074 ERRP8: PUSHJ P,TYPE2
4075 ERRPT7: PUSHJ P,SPACE
4080 ERROR 7,<?ILLEGAL -LOADER@?>
4084 ;PRINT QUESTION MARK
4087 MOVEI T,"?" ;PRINT ?
4093 \fSUBTTL INPUT - OUTPUT INTERFACE
4095 ;BINARY INPUT SUBROUTINE - RETURNS A WORD IN W
4097 WORDPR: PUSHJ P,WORD ;GET FIRST WORD OF PAIR
4098 MOVE C,W ;KEEP IT HANDY>
4099 WORD: SOSGE BUFR2 ;SKIP IF BUFFER NOT EMPTY
4101 WORD1: ILDB W,BUFR1 ;PICK UP 36 BIT WORD
4104 WORD2: IN 1, ;GET NEXT BUFFER LOAD
4105 JRST WORD ;DATA OK - CONTINUE LOADING
4106 WORD3: STATZ 1,IODEND ;TEST FOR EOF
4107 JRST EOF ;END OF FILE EXIT
4108 ERROR ,< /INPUT ERROR#/>
4109 JRST LD2 ;GO TO ERROR RETURN
4112 SE3: XWD 2,2 ;SYMBOL POINTER INCREMENT
4113 PDLPT: XWD -41,PDLST-1; INITIAL PUSHDOWN POINTER
4114 COMM: SQUOZE 0,.COMM.
4115 LSTPT: POINT 6,W ;CHARACTER POINTER TO W
4123 IOBAD==IODERR!IODTER!IOBKTL!IOIMPM
4127 \fSUBTTL IMPURE CODE
4131 IFN SEG2SW,< PHASE LOWCOD>
4132 IFE SEG2SW,< PHASE 140>>
4136 DBUF: SIXBIT /TI:ME DY-MON-YR @/
4139 ;DATA FOR PURE OPEN UUO'S
4168 \fSUBTTL DATA STORAGE
4171 IFE SEG2SW,<LOC 140>
4173 LOWCOD: BLOCK CODLN>
4175 PDSAV: BLOCK 1 ;SAVED PUSHDOWN POINTER
4176 COMSAV: BLOCK 1 ;LENGTH OF COMMON
4177 MDG: BLOCK 1 ;COUNTER FOR MUL DEF GLOBALS
4181 BLOCK 1 ;STORE N HERE
4182 BLOCK 1 ;STORE X HERE
4183 BLOCK 1 ;STORE H HERE
4184 BLOCK 1 ;STORE S HERE
4185 BLOCK 1 ;STORE R HERE
4188 STADDR: BLOCK 1 ;HOLDS STARTING ADDRESS
4191 PRGNAM: BLOCK 1 ;STORE BINARY FILE NAME-USED TO MAKE SYSTAT MORE MEANINGFUL
4195 HIGHR: BLOCK 1 ;HOLD X AND R WHILE LOADING LOW SEG PIECES
4197 HILOW: BLOCK 1 ;HIGHEST NON-BLOCK STMT IN LOW SEG
4198 HVAL: BLOCK 1 ;ORG OF HIGH SEG>
4199 HVAL1: BLOCK 1 ;ACTUAL ORG OF HIGH SEG
4200 LOWR: BLOCK 1 ;HOLD X AND R WHILE LOADING HISEG PIECES
4201 IFN KUTSW,<CORSZ: BLOCK 1>
4202 IFN DMNSW,<KORSP: BLOCK 1>
4203 IFN LDAC,<BOTACS: BLOCK 1>
4204 IFN WFWSW,<VARLNG: BLOCK 1
4206 IFN SAILSW,<LIBFLS: BLOCK RELLEN*3
4207 PRGFLS: BLOCK RELLEN*3>
4241 HISTRT: BLOCK 1 ;JOBREL AT START OF LOADING
4252 LIMBO: BLOCK 1 ;WHERE OLD CHARS. ARE STORED
4253 IFN DIDAL,<LSTBLK: BLOCK 1 ;POINTER TO LAST PROG LOADED>
4254 IFN EXPAND,<ALWCOR: BLOCK 1 ;CORE AVAILABLE TO USER>
4255 IFN ALGSW,<%OWN: BLOCK 1 ;ADDRESS OF ALGOL OWN AREA
4256 OWNLNG: BLOCK 1 ;LENGTH OF OWN BLOCK>
4257 IFN REENT,<SVBRKS: BLOCK 1 ;XWD HIGH,LOW (PROG BREAKS)>
4260 \fSUBTTL BUFFER HEADERS AND HEADER HEADERS
4262 BUFO: BLOCK 1 ;CONSOLE INPUT HEADER HEADER
4266 BUFI: BLOCK 1 ;CONSOLE OUTPUT HEADER HEADER
4270 ABUF: BLOCK 1 ;AUXILIARY OUTPUT HEADER HEADER
4274 BUFR: BLOCK 1 ;BINARY INPUT HEADER HEADER
4278 DTIN: BLOCK 1 ;DECTAPE INPUT BLOCK
4281 DTOUT: BLOCK 1 ;DECTAPE OUTPUT BLOCK
4284 TTYL==52 ;TWO TTY BUFFERS
4285 IFN STANSW,< TTYL==70 ;;;STANFORD, JUST TO BE DIFFERENT, HAS BIG TTY BFRS>
4288 IFE K,< BUFL==406 ;TWO DTA BUFFERS FOR LOAD>
4289 IFN K,< BUFL==203 ;ONE DTA BUFFER FOR LOAD>
4290 ABUFL==203 ;ONE DTA BUFFER FOR AUX DEV>
4292 IFE K,<BUFL==4*203+1>
4296 TTY1: BLOCK TTYL ;TTY BUFFER AREA
4297 BUF1: BLOCK BUFL ;LOAD BUFFER AREA
4298 AUX: BLOCK ABUFL ;AUX BUFFER AREA
4308 \fSUBTTL FORTRAN DATA STORAGE
4310 IFN STANSW,<PATCH: BLOCK 20 ;STANFORD HAS SEMI-INFINITE CORE>
4313 TOPTAB: BLOCK 1 ;TOP OF TABLES
4314 CTAB: BLOCK 1; COMMON
4315 ATAB: BLOCK 1; ARRAYS
4316 STAB: BLOCK 1; SCALARS
4317 GSTAB: BLOCK 1; GLOBAL SUBPROGS
4318 AOTAB: BLOCK 1; OFFSET ARRAYS
4319 CCON: BLOCK 1; CONSTANTS
4320 PTEMP: BLOCK 1; PERMANENT TEMPS
4321 TTEMP: BLOCK 1; TEMPORARY TEMPS
4322 COMBAS: BLOCK 1; BASE OF COMMON
4323 LLC: BLOCK 1; PROGRAM ORIGIN
4324 BITP: BLOCK 1; BIT POINTER
4325 BITC: BLOCK 1; BIT COUNT
4326 PLTP: BLOCK 1; PROGRAMMER LABEL TABLE
4327 MLTP: BLOCK 1; MADE LABEL TABLE
4328 SDS: BLOCK 1 ;START OF DATA STATEMENTS
4329 SDSTP: BLOCK 1 ;START OF DATA STATEMENTS POINTER
4330 BLKSIZ: BLOCK 1; BLOCK SIZE
4331 MODIF: BLOCK 1; ADDRESS MODIFICATION +1
4332 SVFORH: BLOCK 1 ;SAVE H WHILE LOADING F4 PROGRAMS
4338 CT1: BLOCK 1 ;TEMP FOR C
4342 WCNT: BLOCK 1 ;DATA WORD COUNT
4343 RCNT: BLOCK 1 ;DATA REPEAT COUNT
4345 LTCTEM: BLOCK 1 ;TEMP FOR LTC
4346 DWCT: BLOCK 1 ;DATA WORD COUNT>
4355 IFN PURESW,<HHIGO: PHASE BUF1 ;DON'T NEED BUF1 NOW>
4357 HIGO: CORE V, ;CORE UUO
4360 CAMG D,HVAL1 ;ANYTHING IN HI-SEG
4362 MOVE V,HISTRT ;NOW REMAP THE HISEG.
4363 REMAP V, ;REMAP UUO.
4364 JRST HIGET ;FATAL ERROR.
4365 HIRET: JRST 0 ;EXECUTE CODE IN ACC'S
4367 HIGET: HRRZI V,SEGBLK ;DATA FOR
4368 GETSEG V, ;GETSEG UUO
4369 SKIPA ;CANNOT CONTINUE NO HISEG
4370 JRST REMPFL ;REGAINED LOADER HISEG
4372 TTCALL 3,SEGMES ;PRINT SEGMES
4375 SEGBLK: SIXBIT /SYS/
4380 SEGMES: ASCIZ /?CANNOT FIND LOADER.SHR
4383 IFN PURESW,<HIGONE: DEPHASE>>
4386 \fSUBTTL LISP LOADER
4388 ;END HERE IF 1K LOADER REQUESTED.
4389 IFN K,<IFE L,<END BEG>
4394 LODMAK: MOVEI A,LODMAK
4402 OUTPUT [IOWD 1,LMLST ;OUTPUT LENGTH OF FILE
4408 CALL [SIXBIT /EXIT/]
4410 LMFILE: SIXBIT /LISP/
4415 LMLST: IOWD LODMAK+1-LD,137
4424 \fSUBTTL FORTRAN FOUR LOADER
4426 F4LD: TLNE F,SKIPSW!FULLSW ;ARE WE IN SKIP MODE
4427 JRST REJECT ;YES,DON'T LOAD ANY OF THIS
4428 MOVEI W,-2(S); GENERATE TABLES
4429 CAIG W,(H) ;NEED TO EXPAND?
4430 IFN EXPAND,<PUSHJ P,[PUSHJ P,XPAND
4434 IFE EXPAND,< TLO F,FULLSW>
4435 ;IFN REENT,<TRO F,F4FL!VFLG ;RE-ENTRANT LIB40>
4436 TLO N,F4SW; SET FORTRAN FOUR FLAG
4437 HRRZ V,R; SET PROG BREAK INTO V
4438 MOVEM V,LLC; SAVE FIRST WORD ADDRESS
4439 HRRZM W,MLTP; MADE LABELS
4440 HRRZM W,PLTP; PROGRAMMER LABELS
4441 ADD W,[POINT 1,1]; GENERATE BIT-BYTE POINTER
4443 MOVEM W,SDSTP; FIRST DATA STATEMENT
4445 HRREI W,-↑D36; BITS PER WORDUM
4446 MOVEM W,BITC; BIT COUNT
4447 PUSHJ P,BITWX ;MAKE SURE OF ENOUGH SPACE
4448 MOVE W,[JRST ALLOVE] ;LAST DATA STATEMENT
4451 TEXTR: PUSHJ P,WORD; TEXT BY DEFAULT
4455 MOVEI C,1; RELOCATABLE
4456 TLNN F,FULLSW!SKIPSW ;DON'T LOAD IF EITHER SET
4457 PUSHJ P,BITW; SHOVE AND STORE
4458 JRST TEXTR; LOOP FOR NEXT WORD
4460 ABS: SOSG BLKSIZ; MORE TO GET
4463 MOVEI C,0; NON-RELOCATABLE
4464 TLNN F,FULLSW!SKIPSW ;DON'T LOAD IF EITHER SET
4465 PUSHJ P,BITW; TYPE 0
4469 \fSUBTTL PROCESS TABLE ENTRIES
4471 MDLB: TLNE F,FULLSW+SKIPSW; MADE LABEL PROC
4472 JRST GLOBDF; NO ROOM AT THE IN
4473 HLRZ C,MLTP; GET PRESENT SIZE
4474 CAMGE C,BLKSIZ; IF NEW SIZE BIGGER, STR-R-RETCH
4476 HRRZ C,MLTP; GET BASE
4477 MLPLC: ADD C,BLKSIZ; MAKE INDEX
4478 TLNN F,FULLSW+SKIPSW; DONT LOAD
4479 HRRZM V,(C); PUT AWAY DEFINITION
4480 GLOBDF: PUSHJ P,WORD
4481 TLNE F,FULLSW+SKIPSW ;SKIPPING THIS PROG?
4482 JRST TEXTR ;YES, DON'T DEFINE
4483 MOVEI C,(V); AND LOC
4485 PUSHJ P,SYMXX; PUT IN DDT-SYMBOL TABLE
4489 PLB: TLNE F,FULLSW+SKIPSW
4491 HLRZ C,PLTP; PRESENT SIZE
4498 \fSUBTTL STORE WORD AND SET BIT TABLE
4500 BITW: MOVEM W,@X; STORE AWAY OFFSET
4501 IDPB C,BITP; STORE BIT
4502 AOSGE BITC; STEP BIT COUNT
4503 AOJA V,BITWX; SOME MORE ROOM LEFT
4504 HRREI C,-↑D36; RESET COUNT
4507 SOS BITP; ALL UPDATED
4508 IFE EXPAND,<HRL C,MLTP
4511 IFN EXPAND,<HRRZ C,MLTP; TO ADDRESS
4514 PUSHJ P,[PUSHJ P,XPAND
4520 HRRZ T,SDSTP; GET DATA POINTER
4521 BLT C,-1(T); MOVE DOWN LISTS
4522 AOJ V,; STEP LOADER LOCATION
4527 MOVEI H,@X ;KEEP H SET RIGHT FOR HISEG STUFF
4529 CAIG T,(H); OVERFLOW CHECK
4530 IFE EXPAND,<TLO F,FULLSW>
4531 IFN EXPAND,<PUSHJ P, [PUSHJ P,XPAND
4537 SMLT: SUB C,BLKSIZ; STRETCH
4538 MOVS W,MLTP ;LEFT HALF HAS OLD BASE
4539 ADD C,MLTP ;RIGHT HALF HAS NEW BASE
4540 IFN EXPAND,< HRRZS C ;GET RID OF COUNT
4542 PUSHJ P,[PUSHJ P,XPAND
4547 HRRM C,MLTP ;PUT IN NEW MLTP
4548 HLL C,W ;FORM BLT POINTER
4549 ADDI W,(C) ;LAST ENTRY OF MLTP
4550 HRL W,BLKSIZ ;NEW SIZE OF MLTP
4552 SLTC: BLT C,0(W); MOVE DOWN (UP?)
4559 IFN EXPAND,< HRRZS C
4561 PUSHJ P,[PUSHJ P,XPAND
4566 HRRM C,MLTP ;PUT IN NEW MLTP
4568 HLRZ W,PLTP ;OLD SIZE OF PL TABLE
4569 ADD W,PLTP ;NEW BASE OF PL TABLE
4570 HRL W,BLKSIZ ;NEW SIZE OF PL TABLE
4571 HLLM W,PLTP ;INTO POINTER
4576 FORTHI: HRRZ T,JOBREL ;CHECK FOR CORE OVERFLOW
4578 PUSHJ P,[PUSHJ P,HIEXP
4580 JRST POPJM3 ;CHECK AGAIN
4585 \fSUBTTL PROCESS END CODE WORD
4587 ENDS: PUSHJ P,WORD; GET STARTING ADDRESS
4588 JUMPE W,ENDS1; NOT MAIN
4589 ADDI W,(R); RELOCATION OFFSET
4590 TLNE N,ISAFLG; IGNORE STARTING ADDRESS
4592 HRRZM W,STADDR ;STORE STARTING ADDRESS
4593 IFN NAMESW,<MOVE W,1(N) ;SET UP NAME
4597 ENDS1: PUSHJ P,WORDPR ;DATA STORE SIZE
4598 HRRZM C,PTEMP ;NUMBER OF PERMANENT TEMPS
4599 MOVEM V,CCON; START OF CONSTANTS AREA
4601 MOVEM W,BLKSIZ ;SAVE COUNT
4602 MOVEI W,0(V) ;DEFINE CONST.
4604 TLNN F,SKIPSW!FULLSW
4606 PUSHJ P,GSWD ;STORE CONSTANT TABLE
4607 E1: MOVEI W,0(V); GET LOADER LOC
4608 EXCH W,PTEMP; STORE INTO PERM TEMP POINTER
4609 ADD W,PTEMP; FORM TEMP TEMP ADDRESS
4610 MOVEM W,TTEMP; POINTER
4611 MOVEM V,GSTAB; STORE LOADER LOC IN GLOBSUB
4613 MOVE C,TTR50 ;DEFINE %TEMP.
4614 TLNE F,SKIPSW!FULLSW
4617 MOVE C,PTR50 ;DEFINE (IF EXTANT) TEMP.
4619 CAME W,TTEMP ;ANY PERM TEMPS?
4620 PUSHJ P,SYMPT ;YES, DEFINE
4621 E1A: PUSHJ P,WORD; NUMBER OF GLOBSUBS
4623 MOVEM W,BLKSIZ ;SIZE OF GLOBSUB
4624 PUSHJ P,GSWD ;STORE GLOBSUB TABLE
4625 E11: MOVEM V,STAB; SCALARS
4626 PUSHJ P,WORD; HOW MANY?
4628 PUSHJ P,GSWDPR ;STORE SCALAR TABLE
4629 E21: MOVEM V,ATAB; ARRAY POINTER
4630 PUSHJ P,WORD; COMMENTS FOR SCALARS APPLY
4632 PUSHJ P,GSWDPR ;STORE ARRAY TABLE
4633 E31: MOVEM V,AOTAB; ARRAYS OFFSET
4634 PUSHJ P,WORD; SAME COMMENTS AS ABOVE
4636 PUSHJ P,GSWDPR ;STORE ARRAY OFFSET TABLE
4637 E41: PUSHJ P,WORD; TEMP, SCALAR, ARRAY SIZE
4638 TLNE F,FULLSW!SKIPSW ;SKIPPING THIS PROG?
4639 MOVEI W,0 ;DON'T ACCEPT GLOB SUBPROG REQUESTS
4640 MOVEM V,CTAB; SETUP COMMON TABLE POINTER
4641 ADD W,GSTAB; GLOBAL SUBPROG BASE
4642 MOVEM W,COMBAS; START OF COMMON
4643 PUSHJ P,WORD; COMMON BLOCK SIZE
4645 JUMPE W,PASS2; NO COMMON
4646 COMTOP: PUSHJ P,WORDPR ;GET A COMMON PAIR
4647 TLNE F,SKIPSW!FULLSW ;IF SKIPPING
4648 JRST COMCO1 ;DON'T USE
4649 PUSHJ P,SDEF; SEARCH
4650 JRST COMYES; ALREADY THERE
4652 HRR W,COMBAS; PICK UP THIS COMMON LOC
4653 TLNN F,SKIPSW!FULLSW
4654 PUSHJ P,SYMXX; DEFINE IT
4655 MOVS W,W; SWAP HALFS
4656 ADD W,COMBAS; UPDATE COMMON LOC
4657 HRRM W,COMBAS; OLD BASE PLUS NEW SIZE
4658 HLRZS W; RETURN ADDRESS
4660 TLNN F,SKIPSW!FULLSW
4662 COMCOM: PUSHJ P,CWSTWX ;STORE A WORD PAIR
4668 COMYES: HLRZ C,2(A); PICK UP DEFINITION
4669 CAMLE W,C; CHECK SIZE
4670 JRST ILC; ILLEGAL COMMON
4677 PRSTWX: PUSHJ P,WORDPR ;GET A WORD PAIR
4678 CWSTWX: EXCH C,W ;SPACE TO STORE FIRST WORD OF PAIR?
4680 EXCH C,W ;THERE WAS; IT'S STORED
4681 WSTWX: TLNE F,FULLSW!SKIPSW ;SPACE FOR ANOTHER WORD?
4682 POPJ P, ;NOPE, RETURN
4683 MOVEM W,@X ;YES, STORE IT.
4684 AOJA V,BITWX ;TELL THE TABLES ABOUT IT; THEN RETURN
4687 GSWD: PUSHJ P,WORD ;GET WORD FROM TABLE
4688 PUSHJ P,WSTWX ;STASH IT
4689 SOSE BLKSIZ ;FINISHED?
4690 JRST GSWD ;NOPE, LOOP
4693 GSWDPR: MOVEM W,BLKSIZ ;KEEP COUNT
4694 GSWDP1: PUSHJ P,PRSTWX ;GET AND STASH A PAIR
4695 SOS BLKSIZ ;FINISHED?
4697 JRST GSWDP1 ;NOPE, LOOP
4701 \fSUBTTL BEGIN HERE PASS2 TEXT PROCESSING
4704 IFN REENT,<TLNE F,HIPROG
4706 MOVEM V,TOPTAB ;SAVE FOR OVERLAP CHECKING
4707 TLNE F,FULLSW+SKIPSW; ABORT?
4709 MOVE V,LLC ;PICK UP PROGRAM ORIGIN
4710 CAML V,CCON ;IS THIS A PROGRAM?
4711 JRST FBLKD ;NO, GO LOOK FOR FIRST BLK DATA
4712 TLOE N,PGM1 ;YES, IS THIS FIRST F4 PROG?
4714 HRR W,COMBAS ;YES, PLACE PROG BREAK IN LH
4715 IFE L,<IFN REENT,<TLNN F,HIPROG ;DON'T BOTHER IF IN HISEG, CHAIN NOT SMART ENOUGH>
4716 HRLM W,JOBCHN(X) ;FOR CHAIN>
4717 NOPRG: HRRZ W,PLTP; GET PROG TABLE BASE
4718 HLRZ C,PLTP; AND SIZE
4719 ADD W,C; COMPUTE END OF PROG TABLE
4720 ADD W,[POINT 1,1]; AND BEGINNING OF BIT TABLE
4721 EXCH W,BITP; SWAP POINTERS
4722 PASS2B: ILDB C,BITP; GET A BIT
4723 JUMPE C,PASS2C; NO PASS2 PROCESSING
4724 PUSHJ P,PROC; PROCESS A TAG
4725 JRST PASS2B; MORE TO COME
4728 PROC: LDB C,[POINT 6,@X,23]; TAG
4729 SETZM MODIF; ZERO TO ADDRESS MODIFIER
4732 MOVEI W,TABDIS; HEAD OF TABLE
4733 HRLI W,-TABLNG ;SET UP FOR AOBJN
4734 HLRZ T,(W); GET ENTRY
4737 JUMPGE W,LOAD4A ;RAN OUT OF ENTRIES
4738 HRRZ W,(W); GET DISPATCH
4739 LDB C,[POINT 12,@X,35]
4743 PASS2C: PUSHJ P,PASS2A
4749 TABDIS: XWD 11,PCONS; CONSTANTS
4750 XWD 06,PGS; GLOBAL SUBPROGRAMS
4753 XWD 01,PATO; ARRAYS OFFSET
4754 XWD 00,PPLT; PROGRAMMER LABELS
4755 XWD 31,PMLT; MADE LABESL
4756 XWD 26,PPT; PERMANENT TEMPORARYS
4757 XWD 27,PTT; TEMPORARY TEMPORARYS
4759 ;DISPATCH ON A HEADER
4761 HEADER: CAMN W,[EXP -2]; END OF PASS ONE
4763 LDB C,[POINT 12,W,35]; GET SIZE
4766 JUMPE W,PLB; PROGRAMMER LABEL
4767 CAIN W,500000; ABSOLUTE BLOCK
4769 CAIN W,310000; MADE LABEL
4770 JRST MDLB; MADE LABEL
4773 CAIN W,700000; DATA STATEMENT
4775 JRST LOAD4A; DATA STATEMENTS WILL GO HERE
4777 TTR50: RADIX50 10,%TEMP.
4778 PTR50: RADIX50 10,TEMP.
4779 CNR50: RADIX50 10,CONST.
4782 \fSUBTTL ROUTINES TO PROCESS POINTERS
4784 PCONS: ADD C,CCON; GENERATE CONSTANT ADDRESS
4785 SOJA C,PCOMX ;ADJUST FOR 1 AS FIRST ENTRY
4787 PSTA: PUSHJ P,SWAPSY ;NON-COMMON SCALARS AND ARRAYS
4788 ADDI C,(R); RELOCATE
4789 PCOM1: PUSHJ P,SYDEF ;...
4790 PCOMX: ADD C,MODIF ;ADDR RELOC FOR DP
4791 HRRM C,@X; REPLACE ADDRESS
4792 PASS2A: AOJ V,; STEP READOUT POINTER
4793 CAML V,CCON ;END OF PROCESSABLES?
4794 CPOPJ1: AOS (P); SKIP
4797 PAT: SKIPA W,ATAB ;ARRAY TABLE BASE
4798 PST: MOVE W,STAB ;SCALAR TABLE BASE
4800 ADD C,W ;ADD IN TABLE BASE
4801 ADDI C,-2(X); TABLE ENTRY
4802 HLRZ W,(C); CHECK FOR COMMON
4803 JUMPE W,PSTA; NO COMMON
4804 PUSHJ P,COMDID ;PROCESS COMMON
4807 COMDID: LSH W,1 ;PROCESS COMMON TABLE ENTRIES
4808 ADD W,CTAB; COMMON TAG
4809 ADDI W,-2(X); OFFSET
4810 PUSHJ P,SWAPSY; GET SYMBOL AND SET TO DEFINED
4811 ADD C,1(W); BASE OF COMMON
4815 ADD C,AOTAB; ARRAY OFFSET
4816 ADDI C,-2(X); LOADER OFFSET
4817 MOVEM C,CT1; SAVE CURRENT POINTER
4818 HRRZ C,1(C); PICK UP REFERENCE POINTER
4819 ANDI C,7777; MASK TO ADDRESS
4820 ROT C,1; ALWAYS A ARRAY
4823 HLRZ W,(C); COMMON CHECK
4825 PUSHJ P,COMDID ;PROCESS COMMON
4833 \fNCO: PUSHJ P,SWAPSY;
4834 ADDI C,(R) ;DEFINE SYMBOL IN TRUE LOC
4837 HRRZ C,(C) ;OFFSET ADDRESS PICKUP
4838 ADDI C,(R) ;WHERE IT WILL BE
4839 JRST PCOMX ;STASH ADDR AWAY
4841 PTT: ADD C,TTEMP; TEMPORARY TEMPS
4842 SOJA C,PCOMX ;ADJUST FOR 1 AS FIRST ENTRY
4844 PPT: ADD C,PTEMP; PERMANENT TEMPS
4845 SOJA C,PCOMX ;ADJUST FOR 1 AS FIRST ENTRY
4847 PGS: ADD C,GSTAB; GLOBSUBS
4848 ADDI C,-1(X); OFFSET
4850 TLC C,640000; MAKE A REQUEST
4851 PUSHJ P,TBLCHK ;CHECK FOR OVERLAP
4852 MOVEI W,(V); THIS LOC
4853 HLRM W,@X; ZERO RIGHT HALF
4857 SYDEF: TLNE N,SYDAT ;SYMBOL WANTS DEFININITION?
4858 POPJ P, ;NO, GO AWAY
4859 PUSH P,C ;SAVE THE WORLD
4861 PUSHJ P,TBLCHK ;CHECK FOR OVERLAP
4863 SKIPE C,T ;PICKUP VALUE
4879 IFN REENT,<JRST RESTRX>
4883 SWAPSY: MOVEI T,0; SET TO EXCHANGE DEFS
4884 EXCH T,1(C); GET NAME
4885 HRRZ C,(C) ;GET VALUE
4887 TBLCHK: HRRZ W,MLTP ;GETT TOP OV TABLES
4889 CAMG W,TOPTAB ;WILL IT OVERLAP
4890 IFE EXPAND,<TLO F,FULLSW>
4891 IFN EXPAND,<JRST [PUSHJ P,XPAND
4898 \fSUBTTL END OF PASS2
4900 ALLOVE: TLZ N,F4SW ;END OF F4 PROG
4901 HRRZ V,SDSTP ;GET READY TO ZERO OUT DATA STMTS
4902 SETZM (V) ;AT LEAST ONE THERE
4903 CAIL V,(S) ;IS THERE MORE THAN ONE??
4906 ADDI V,1 ;SET UP BLT
4907 BLT V,(S) ;ZERO OUT ALL OF IT
4908 NOMODS: MOVE H,SVFORH
4909 TLNE F,FULLSW!SKIPSW
4911 HRR R,COMBAS ;TOP OF THE DATA
4912 CAMG H,SDS ;HIGHEST LOC GREATER THAN DATA STATEMENTS?
4913 JRST HIGH3A ;NO, RETURN
4914 ADDI H,1(S) ;YES, SET UP MEANINGFUL ERROR COMMENT
4916 TLO F,FULLSW ;INDICATE OVERFLO
4917 HIGH3A: IFN REENT,<SETZ W, ;CAUSES TROUBLE OTHERWISE
4927 DATAS: TLNE F,FULLSW+SKIPSW
4929 MOVEI C,(S) ;ADDR OF WORD UNDER SYMBOL TABLE
4930 MOVN W,BLKSIZ ;HOW FAR DOWN TO BLT
4931 ADDM W,PLTP ;UPDATE TABLE POINTERS
4934 ADD C,W ;RH(C):= WHEN TO STOP BLT
4935 HRL C,MLTP ;SOURCE OF BLTED DATA
4936 ADD W,MLTP ;UPDATE, GET DESTINATION OF BLT DATA
4937 IFN EXPAND,< HRRZS W ;GET RID OF LEFT HALF
4939 PUSHJ P,[PUSHJ P,XPAND
4942 ADD C,[XWD 2000,2000]
4944 HRRM W,MLTP ;NO SET THIS SO EXTRA CORE NOT ZEROED
4945 HLL W,C ;FORM BLT POINTER
4946 BLT W,-1(C) ;MOVE TABLES DOWN (BUT NOT JRST ALLOVE)
4948 DAX: PUSHJ P,WORD; READ ONE WORD
4949 TLNN F,FULLSW+SKIPSW
4951 SOSLE BLKSIZ ;COUNT OF DATA SEQUENCE SIZE
4952 AOJA C,DAX ;INCREMENT DATA SEQUENCE DEPOSIT LOC
4956 \fFBLKD: TLOE N,BLKD1 ;IS THIS FIRST BLOCK DATA?
4958 HRR V,COMBAS ;PLACE PROG BREAK IN RH FOR
4959 IFE L,<IFN REENT,< TLNN F,HIPROG>
4960 HRRM V,JOBCHN(X) ;CHAIN>
4961 ENDTP: TLNE F,FULLSW+SKIPSW
4964 ENDTP0: CAML V,STAB; ANY MORE GLOBSUBS
4966 MOVE C,@X; GET SUBPROG NAME
4967 PUSHJ P,SREQ; IS IT ALLREADY REQUESTED
4969 PUSHJ P,SDEF; OR DEFINED
4972 MOVEI W,0 ;PREPARE DUMMY LINK
4973 TLNN F,FULLSW+SKIPSW ;ABORT
4974 PUSHJ P,SYM3X; PUT IN DUMMY REQUEST
4975 PUSHJ P,BITWX; OVERLAP CHECK
4978 ENDTPW: HRRZ V,SDSTP
4979 IFN EXPAND,<IFN REENT,<TLNE F,HIPROG
4988 ENDTPH: HRR V,SDSTP>
4989 HRRZM V,SDS ;DATA STATEMENT LOC
4990 ENDTP1: SUBI V,(X); COMPENSATE FOR OFFSET
4992 TLNE W,-1; NO LEFT HALF IMPLIES COUNT
4993 JRST DODON; DATA DONE
4998 ADD W,@X; ITEMS COUNT
5000 MOVE W,[MOVEM W,LTC]
5001 MOVEM W,@X; SETUP FOR DATA EXECUTION
5005 MOVEM W,ENC; END COUNT
5010 HLRZ T,W; LEFT HALF INST.
5012 CAIN T,254000 ;JRST?
5013 JRST WRAP ;END OF DATA
5014 CAIN T,260000 ;PUSHJ?
5015 JRST PJTABL(W) ;DISPATCH VIA TABLE
5016 CAIN T,200000; MOVE?
5020 CAIN T,221000; IMULI?
5022 CAIE T,220000; IMUL?
5024 INNER: HRRZ T,@X; GET ADDRESS
5025 TRZE T,770000; ZERO TAG?
5026 SOJA T,CONPOL; NO, CONSTANT POOL
5028 SUB T,PT1; SUBTRACT INDUCTION NUMBER
5036 IFN EXPAND,<IFN REENT,<ENDTPI: HRRZ V,COMBAS
5044 FORCNF: ERROR ,</FORTRAN CONFUSED ABOUT DATA STATEMENTS#/>
5048 \fCONPOL: ADD T,ITC; CONSTANT BASE
5057 PJTABL: JRST DWFS ;PUSHJ 17,0
5058 AOSA PT1 ;INCREMENT DO COUNT
5059 SOSA PT1; DECREMENT DO COUNT
5060 SKIPA W,[EXP DOINT.]
5063 AOJA V,SKIPIN ;SKIP A WORD
5069 PUSHJ P,PROC; PROCESS THE TAG
5070 JRST LOAD4A ;DATA STATEMENT BELOW CODE TOP
5071 JRST LOOP ;PROPER RETURN
5073 DOINT.: POP P,V; GET ADDRESS OF INITIAL VALUE
5074 PUSH P,(V); STORE INDUCTION VARIABLE
5076 PUSH P,V; INITIAL ADDRESS
5079 DOEND.: HLRE T,@(P) ;RETAIN SIGN OF INCREMENT
5080 ADDM T,-2(P); INCREMENT
5081 HRRZ T,@(P); GET FINAL VALUE
5082 SUB T,-2(P) ;FINAL - CURRENT
5083 IMUL T,@(P) ;INCLUDE SIGN OF INCREMENT
5084 JUMPL T,DODONE ;SIGN IS ONLY IMPORTANT THING
5085 POP P,(P); BACK UP POINTER
5089 \fDODONE: POP P,-1(P); BACK UP ADDRESS
5093 WRAP: MOVE W,ENC; NUMBER OF CONSTANTS
5094 ADD W,ITC; CONSTANT BASE
5097 MOVEI V,(W); READY TO GO
5100 DODON: TLZ N,RCF!SYDAT!DZER ;DATA STATEMENT FLAGS
5101 MOVE W,PTEMP ;TOP OF PROG
5104 IFE EXPAND,<SUBI C,(X) ;CHECK FOR ROOM
5105 CAMGE C,COMBAS ;IS IT THERE
5106 TLO F,FULLSW ;NO (DONE EARLIER IF EXPAND)
5108 SUBI C,1 ;GET ONE LESS (TOP LOCATION TO ZERO)
5109 IFN REENT,<TLNE F,HIPROG
5111 SECZER: CAMLE W,C ;ANY DATA TO ZERO?
5112 JRST @SDS ;NO, DO DATA STATEMENTS
5113 ;FULLSW IS ON IF COMBAS GT. SDS
5114 TLNN F,FULLSW+SKIPSW ;SHOULD WE ZERO?
5115 SETZM (W) ;YES, DO SO
5116 TLON N,DZER ;GO BACK FOR MORE?
5117 AOJA W,SECZER ;YES, PLEASE
5118 HRLI W,-1(W) ;SET UP BLT POINTER TO ZERO DATA
5119 TLNN F,FULLSW+SKIPSW ;SHOULD WE ZERO?
5120 BLT W,(C) ;YES, DO SO
5121 JRST @SDS ;GO DO DATA STATEMENTS
5123 DATAOV: ERROR 0,</DATA STATEMENT OVERFLOW#/>
5127 \fDREAD: TLNE N,RCF; NEW REPEAT COUNT NEEDED
5131 MOVE W,@LTC; GET A WORD
5132 HLRZM W,RCNT; SET REPEAT COUNT
5133 HRRZM W,WCNT; SET WORD COUNT
5134 POP W,(W); SUBTRACT ONE FROM BOTH HALFS
5135 HLLM W,@LTC; DECREMENT REPEAT COUNT
5136 AOS W,LTC; STEP READOUT
5144 MOVE V,LTCTEM; RESTORE READOUT
5146 DOFF.: TLZ N,RCF; RESET DATA REPEAT FLAG
5151 MOVE T,(T); GET ADDRESS
5152 HLRZM T,DWCT; DATA WORD COUNT
5155 IFN REENT,<HRRZS T ;CLEAR LEFT HALF INCASE OF CARRY
5158 HRRZS T ;MUST GET RID OF LEFT HALF
5160 JRST DATAOV ;IN CASE FORTRAN GOOFS ON LIMITS
5164 IFE REENT,<ADDI T,(X)>
5167 DWFS.1: PUSHJ P,DREAD ;GET A DATA WORD
5169 IFN REENT,<CAMG T,JOBREL ;JUST TO MAKE SURE>
5172 TLNN F,FULLSW+SKIPSW ;LOAD THE NEXT DATA ITEM?
5173 MOVEM W,(T) ;YES, STORE IT
5174 SOSE W,DWCT; STEP DOWN AND TEST
5175 AOJA T,DWFS.1 ;ONE MORE TIME, MOZART BABY!
5179 \fSUBTTL ROUTINE TO SKIP FORTRAN OUTPUT
5181 ;SUBSECTION OF THE ROUTINE TO HANDLE OUTPUT FROM THE
5182 ;FORTRAN IV COMPILER. THE MAIN OBJECT OF THE ROUTINE IS TO
5183 ;LOOK FOR THE END BLOCK. CODE TAKEN FROM FUDGE2.
5185 MACHCD: HRRZ C,W ;GET THE WORD COUNT
5186 PUSHJ P,WORD ;INPUT A WORD
5187 SOJG C,MACHCD ;LOOP BACK FOR REST OF THE BLOCK
5188 ;GO LOOK FOR NEXT BLOCK
5190 REJECT: PUSHJ P,WORD ;READ A FORTRAN BLOCK HEADER
5191 TLC W,-1 ;TURN ONES TO ZEROES IN LEFT HALF
5192 TLNE W,-1 ;WAS LEFT HALF ALL ONES?
5193 JRST REJECT ;NO, IT WAS CALCULATED MACHINE CODE
5194 CAIN W,-2 ;YES, IS RIGHT HALF = 777776?
5195 JRST ENDST ;YES, PROCESS F4 END BLOCK
5196 LDB C,[POINT 6,W,23];GET CODE BITS FROM BITS 18-23
5197 TRZ W,770000 ;THEN WIPE THEM OUT
5198 CAIE C,70 ;IS IT A DATA STATEMENT?
5199 CAIN C,50 ;IS IT ABSOLUTE MACHINE CODE?
5200 JRST MACHCD ;YES, TREAT IT LIKE DATA STATEMENTS
5201 PUSHJ P,WORD ;NO, ITS A LABEL OF SOME SORT
5202 JRST REJECT ;WHICH CONSISTS OF ONE WORD
5203 ;LOOK FOR NEXT BLOCK HEADER
5205 ENDST: MOVEI C,1 ;TWO WORDS, FIVE TABLES, ONE WORD, ONE TABLE
5207 F4LUP1: PUSHJ P,WORD ;GET TABLE MEMBER
5208 F4LUP3: SOJGE C,F4LUP1 ;LOOP WITHIN A TABLE
5209 JUMPL T,LOAD1 ;LAST TABLE - RETURN
5210 SOJG T,F4LUP2 ;FIRST TWO WORDS AND FIVE TABLES
5211 JUMPE T,F4LUP1 ;COMMON LENGTH WORD
5212 F4LUP2: PUSHJ P,WORD ;READ HEADER WORD
5213 MOVE C,W ;COUNT TO COUNTER
5217 \fSUBTTL LISP LOADER
5223 LODMAK: MOVEI A,LODMAK
5231 OUTPUT [IOWD 1,LMLST ;OUTPUT LENGTH OF FILE
5237 CALL [SIXBIT /EXIT/]
5239 LMFILE: SIXBIT /LISP/
5244 LMLST: IOWD LODMAK+1-LD,137