TITLE LNKOV1 - PHASE 1 OVERLAY MODULE FOR LINK SUBTTL D.M.NIXON/DMN/JLd/RKH/JBC/JNG/MCHC/DZN/PY/PAH/HD/RJF 5-Feb-88 ;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1973,1986,1988. ; ALL RIGHTS RESERVED. ; ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ;TRANSFERRED. ; ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ;CORPORATION. ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. SEARCH LNKPAR,LNKLOW,OVRPAR,MACTEN,UUOSYM,SCNMAC IFN TOPS20,< SEARCH MONSYM > ;[1506] SALL ENTRY LNKOV1 EXTERN LNKLOD,LNKWLD,LNKOV2 CUSTVR==0 ;CUSTOMER VERSION DECVER==6 ;DEC VERSION DECMVR==0 ;DEC MINOR VERSION DECEVR==2420 ;DEC EDIT VERSION VERSION SEGMENT ;LOCAL ACC DEFINITIONS R=:R1 ;CURRENT RELOCATION COUNTER SUBTTL REVISION HISTORY ;START OF VERSION 2 ;135 ADD OVERLAY FACILITY ;136 FIX VARIOUS BUGS ;170 MAKE PLOT SWITCH WORK ;174 FIX RELOCATABLE OVERLAY BUGS ;175 REPLACE /RESET WITH /NODE ;200 LOAD REENTRANT OVERLAY HANDLER ;207 REDUCE SIZE OF OVERHEAD TABLES ;216 (13559) ADD ZSV ERROR CHECKS ;START OF VERSION 2B ;237 (13931) CHANGE RPR ERROR TO NBR ;245 MAKE OVERLAY FILE STAY ON SAME STRUCTURE ON SUPERSEDE ; MODIFY OC.OPN ROUTINE TO CHECK THIS CASE ;262 Force a /LINK on encountering /NODE, if needed ;300 Fix copy of permanent excludes on /OVERLAY ;331 Set size of segment correctly so don't loose ; EXTTAB and ENTTAB'S. ;352 LABEL EDIT 237 ;404 Put edit 316 back in to LINK. ;407 Correct problem with /NODE:-1 ;413 Fix some small bugs with ELN message. ;414 Make sure FUNCT. is loaded in the root link. ;416 Update GS.FR instead of GS.PT when creating bound globals. ;425 Improve FSN error detect to not bomb users unnecessarily. ;START OF VERSION 2C ;466 Avoid loop on /NODE when loading relocatable overlays. ;504 Get output IOWD right when putting symbols in overlay file. ;505 Fix absolute addresses after call to LNKCOR via SY.CHR. ;511 Overlap by 1 page when copying LS to overlay file for fixups. ;521 Zap MNSEEN and MNTYPE on /LINK. ;530 Get triplet flag definitions right. ;534 Make multiple /LINK switches work on one line. ;557 Clean up the listing for release. ;START OF VERSION 3A ;560 Release on both TOPS-10 and TOPS-20 as LINK version 3A(560) ;START OF VERSION 4 ;605 Use OUTSTR in LNKRER message. ;623 Handle multiple /PLOT switches (delete data block) ;625 Print blank line after LNKELN message ;631 Print correct file spec with LNKEOV message. ;632 Implement $FIXUP. ;635 Add code to handle /ARSIZE switch, and count any ; ambiguous request table space in previous link. ;650 Use VM on TOPS-10 if available. ;651 Put the overlay file where the user wants it. ;660 Clear .LINK storage at the end of an overlay. ;664 Don't destroy last word of BG area on /NODE:0. ;665 Fix core management problem broken by edit 650. ;666 Fix edits 650 and 665, this time for sure. ;671 Don't leave junk in PH.ORL. ;677 Don't default to /SYMSEG:LOW if loading overlays. ;730 Check for /DEBUG, do it before /LINK. ;731 SEARCH MACTEN,UUOSYM ;765 Release on both TOPS-10 and TOPS-20 as LINK version 4(765) ;START OF VERSION 4A ;1152 Set up RC.HL correctly on /LINK and /NODE. ;1172 Allocate PAT.. in the root. ;1174 Label and clean up all error messages. ;1201 Change $SEGxxx to $SSGxxx. ;1204 Say LNKPTL if /SPACE or /PATCHSIZE exceeds 777777. ;1205 Don't waste blocks in the overlay file. ;1214 Fix mismatched angle bracket bugs. ;1217 Clean up the listings for release. ;1220 Release on both TOPS-10 and TOPS-20 as version 4A(1220). ;START OF VERSION 4B ;1226 Default /SEGMENT:LOW after loading the root. ;1230 Really put the overlay file where the user wants it (see edit 651). ;1232 Handle symbolic start address in LINKGT. ;1247 Add check for /SYMSEG:HIGH or /SYMSEG:PSECT: with overlays. ;1257 Store RC.HL from absolute code after loading root node. ;1263 Don't change LSTSYM if not new symbol. ;1265 Put .SYM file name in OWN block in Algol program. ;1266 Fix loop when local symbols can't all be read in at once. ;1310 Make LNKOFS message use long error text. ;START OF VERSION 5 ;1400 Use OVRPAR.MAC and implement writable overlays. ;1424 Implement /MAXNODE. ;1447 Move /MAXNODE support into LNKWLD. ;START OF VERSION 5.1 ;1506 Conditionalize TOPS-10 specific code and nativize LS overflow area ;1514 Unmap, don't BLT to zero the LC area excess when shrinking LC ;1537 Remove unnecessary AOSA when setting up PMAP arguments. ;1541 Unmap overflow windows before deleting overflow files (TOPS-20) ;1704 Writable overlay support work. ;1710 Don't miss last writable overlay link. ;2002 Implement /PLTTYP switch. ;2007 Give LNKTML a long message. ;2011 Remove /PLTTYP code, put it in LNKWLD. ;2026 Update copyright notices, cleanup listing. ;2033 Keep LW.LS page aligned on TOPS-20. ;2053 Argcheck the BG area, and build deferred character fixups. ;2076 Check IO.PTR+%PC not NULSPC for previously seen file spec in %PLOT. ;Start of version 6 ;2202 Use 30 bit addresses when calling xx.IN and xx.OUT, remove bare PMAPs. ;2214 Add 30 bit fixups, which relocate like halfwords in overlays. ;2235 Give error if overlays used with extended addressing. ;2247 Use inferior fork on TOPS-20. ;2251 Set PM%CNT before mapping out pages. ;2255 Use LSTLCL and LSTGBL instead of LSTSYM. ;2262 Check for PG.LSG returning all memory asked for. ;2316 Don't check lower bound after PG.LSG, just upper. Lower is always OK. ;2366 Check for overlays outside section zero on TOPS-10. ;2403 New corporate copywrite statement. ;2417 Update copywrite statement to 1988. ;2420 Reset LC.UP when a .TMP file is discarded. SUBTTL ENTRY POINT LNKOV1: JFCL .+1 ;NORMAL ENTRY JRST LNKLOD ;IOWD FOR PREAMBLE SECTION IFE FTKIONLY,< PHIOWD: IOWD PH.ZZ,PH ;[1400] 0 > IFN FTKIONLY, ;BUG IN DMOVE MACRO SUBTTL SWITCH ACTION -- /OVERLAY:key .OVERLAY:: HRLZ T1,(P2) ;GET NEXT SWITCH HLLM T1,1(P1) ;FIX LIST OF SWITCHES TO DO JRST OVRLAY %OVERLAY:: HRRZ T1,(P2) ;GET NEXT SWITCH HRRM T1,1(P1) ;FIX LIST OF SWITCHES TO DO ; JRST OVRLAY OVRLAY: IFN TOPS20,< ;[2366] MOVE T1,FXSBIT ;[2235] GET THE SECTION BITS TDNE T1,[^-1B0] ;[2235] ANY NON-ZERO SECTIONS? PUSHJ P,E$$CBO## ;[2235] YES, GIVE ERROR >;[2366] IFN TOPS20 IFE TOPS20,< ;[2366] MOVE T1,HL.S1 ;[2366] GET THE HIGHEST LOADED TLNE T1,-1 ;[2366] OUTSIDE OF SECTION ZERO? PUSHJ P,E$$CBO## ;[2366] YES, GIVE ERROR >;[2366] IFE TOPS20 MOVE T1,OVLTBL-1(T2) ;GET BIT IORM T1,OVERLW ;SET IN MEMORY SKIPE IO.PTR+%OC ;ALREADY SET ONCE? JRST OVRLA1 ;YES, JUST RETURN MOVEI T1,.DBS ;[1424] SET MAXIMUM LINK NUMBER SKIPN L.MAX ;[1424] UNLESS ALREADY SET MOVEM T1,L.MAX ;[1424] ... MOVE T1,SYMSEG ;[1247] GET SYMBOL SEGMENT LOCATION JUMPL T1,.+3 ;[1247] /SYMSEG:PSECT? CAIE T1,$SSGHIGH ;[1247] /SYMSEG:HIGH? JRST OVSYMS ;[1247] NO - IT'S OK E01OSL::.ERR. (MS,,V%L,L%W,S%W,OSL,) ;[1247] MOVEI T1,$SSGLOW ;[1247] GET /SYMSEG:LOW MOVEM T1,SYMSEG ;[1247] FORCE SYMBOLS THERE OVSYMS: MOVSI T1,'OVL' ;[1247] FORCE EXTENSION MOVEM T1,F.EXT(P1) PUSHJ P,DVOUT.## ;SETUP DATA BLOCK %OC,,.IODPR MOVE T1,IO.CHR ;[1230] MAKE SURE DEVICE IS A DISK TLC T1,-1-<(DV.TTA)>;[1230] .. TLCE T1,-1-<(DV.TTA)>;[1230] .. TXNN T1,DV.DSK ;[1230] .. JRST E$$OFS ;[1230] OVERLAY HANDLER ASSUMES A DISK HRLZI T1,2(P1) ;CLEAR ALL BUT LINK AND SWITCH HRRI T1,3(P1) SETZM 2(P1) BLT T1,F.LEN-1(P1) PUSHJ P,OVRTST ;PUT REQUEST IN SYMBOL TABLE HLLZ T1,INCPTR ;SEE IF ANY VERY PERM INCLUDES JUMPE T1,OVRLA0 ;NO INCLUDES, TRY EXCLUDES MOVEI T2,.EXC ;YES, GET SPACE PUSHJ P,DY.GET## HRLZM T1,OVINEX ;SAVE START OF LIST HLLZ T2,INCPTR ;START OF LIST HRR T2,T1 ;WHERE TO PUT IT BLT T2,.EXC-1(T1) ;DO MOVE HRRZ T2,(T1) ;SEE IF MORE JUMPE T2,OVRLA0 ;NO PUSHJ P,OVRINX ;YES, COPY REST ;HERE TO SAVE SUPER-GLOBAL EXCLUDES, IF ANY EXIST. OVRLA0: HLLZ T1,EXCPTR ;ANY EXCLUDES JUMPE T1,OVRLA1 ;NO MOVEI T2,.EXC ;YES, GET SPACE PUSHJ P,DY.GET## HRRM T1,OVINEX ;SAVE START OF LIST HLLZ T2,EXCPTR ;START OF LIST HRR T2,T1 ;WHERE TO PUT IT BLT T2,.EXC-1(T1) ;DO MOVE HRRZ T2,(T1) ;SEE IF MORE JUMPE T2,OVRLA1 ;NO PUSHJ P,OVRINX ;YES, COPY REST OVRLA1: HRLS ARSIZE ;[635] STORE STICKY /ARSIZE SUB P,[2,,2] ;ADJUST STACK MOVE T1,P2 ;ADDRESS OF SWITCH BLOCK HLRZ T2,(P2) ;SIZE PUSHJ P,DY.RET## ;GIVE IT BACK HLLZ T1,FL ;GET PERMANENT FLAGS TO DATE IORM T1,FLAGS ;SAVE SO AS TO AFFECT ALL LINKS JRST LNKWLD ;RETURN & TRY AGAIN OVRTST: PUSHJ P,.SAVE4## ;SAVE THE P'S MOVX W1,PT.SGN!PT.SYM MOVE W2,['.OVRLA'] ;ENTRY POINT SETZ W3, PUSHJ P,TRYSYM## ;SEE IF DEFINED PJRST SY.RQ## ;UNDEF, ENTER REQUEST POPJ P, ;ALREADY UNDEFINED POPJ P, ;ALREADY DEFINED OVRINX: SPUSH ;SAVE THE POINTERS MOVEI T2,.EXC ;GET ANOTHER BLOCK PUSHJ P,DY.GET## POP P,T2 ;GET LAST NEW BLOCK HRRM T1,(T2) ;LINK THIS TO IT POP P,T2 ;NEXT BLOCK IN ORIGINAL LIST HRLZ T3,T2 ;FROM HRR T3,T1 ;TO BLT T3,.EXC-1(T1) HRRZ T2,(T1) ;GET NEXT JUMPN T2,OVRINX ;YES THERE IS POPJ P, ;RETURN E$$OFS::.ERR. (MS,0,V%L,L%F,S%F,OFS,) ;[1310] DEFINE KEYMAC (A,B)< IFIDN ,< A'TBL: IRP B,< EXP $OV'B >>> XALL KEYWORDS SALL SUBTTL SWITCH ACTION -- /LINK:name %LINK:: SKIPN T1,S.DEBG ;[730] HAVE WE SEEN A /DEBUG? JRST %LINK1 ;[730] NO, JUMP SETZM S.DEBG ;[730] YES, CLEAR FLAG MOVEI T2,0(P2) ;[730] GET CURRENT /LINK SWITCH PTR HRRM T2,1(T1) ;[730] CHAIN INTO /DEBUG FILE SPEC AS LOCAL SW HRRZ T2,(P2) ;[730] MOVE PTR OF NEXT SWITCH INTO AN AC HLLZS 0(P2) ;[730] BEFORE IT GET CLEARED MOVE P2,T2 ;[730] UPDATE CURRENT SWTICH PTR WITH IT POPJ P, ;[730] RETURN %LINK1: ;[730] JUMPN T2,.+3 ;NAME ALREADY SET? SKIPGE LNKMAX ;NO, SO IS IT FIRST TIME? MOVE T2,['ROOT '] ;YES, PREEMPT NAME "ROOT" MOVEM T2,LNKNAM ;STORE NAME OR ZERO MOVEI T1,LINKTO ;HERE ON TERMINATION MOVEM T1,GOTO SETOM S.INZR ;FLAG RETFSP TO END LINE IN LNKWLD JUMPE T2,CPOPJ ;NO NAME PUSHJ P,.SAVE2## ;NEED TWO SAFE ACCS MOVE P1,T2 ;SAVE NAME MOVS P2,LNMPTR ;GET START OF NAME CHAIN JUMPE P2,LINKB ;NOT SETUP YET LINKA: CAMN P1,(P2) ;SAME NAME JRST LNKLNA ;YES, ERROR HRRZ T1,1(P2) ;SEE IF ANY MORE JUMPE T1,LINKB ;NO MOVE P2,T1 JRST LINKA ;YES LINKB: MOVEI T2,2 ;USE 2 WORDS PUSHJ P,DY.GET## JUMPE P2,[HRLZM T1,LNMPTR JRST .+2] HRRM T1,1(P2) ;LINK TO NEW BLOCK MOVE P2,LNKMAX ;LINK NUMBER OF PREVIOUS HRLZI P2,1(P2) ;ONE MORE IS # OF THIS ONE DMOVEM P1,(T1) ;STORE AOS LNMPTR ;COUNT ONE MORE SKIPL WRTDAT ;[1704] LINK MARKED WRITABLE? POPJ P, ;[1704] NO, FINISHED HRLOI T1,377777 ;[1704] CLEAR MARKER BIT NOW ANDM T1,WRTDAT ;[1704] HLRZ T1,P2 ;[1704] CURRENT LINK IS WRITABLE PUSHJ P,WRTPTR## ;[1704] GET BYTE PTR TO LINK DATA MOVX T2,OW.WRT ;[1704] MARK IT WRITABLE DPB T2,T1 ;[1704] ... POPJ P, LNKLNA: HLRZ P2,1(P2) ;GET LINK# E$$LNA::.ERR. (MS,.EC,V%L,L%W,S%W,LNA,) ;[1174] .ETC. (SBX,.EC!.EP,,,,P1) .ETC. (STR,.EC,,,,,< already assigned to link number >) .ETC. (DEC,.EP,,,,P2) POPJ P, E$$TML::.ERR. (MS,,V%L,L%F,S%F,TML,) ;[2007] POPJ P, ;[1424] SUBTTL SWITCH ACTION -- /ARSIZE:n, /MAXNODE:n, /NOENTRY:sym, /NOREQUIRE:sym %ARSIZE:: HRRM T2,ARSIZE ;[635] STORE VALUE FOR THIS LINK POPJ P, ;[635] RETURN TO LNKWLD %NOENTRY:: PUSHJ P,STRLSW## ;WAIT 'TIL FILE IS LOADED .NOENTRY:: PUSHJ P,.SAVE4## ;SAVE P1-P4 MOVX W1,PT.SGN!PT.SYM ;FLAGS SKIPN W2,T2 ;SYMBOL JRST E$$ZSV## ;[1174] ZERO IS ILLEGAL SETZ W3, ;VALUE PUSHJ P,TRYSYM## ;SEE IF DEFINED POPJ P, ;IGNORE JFCL ;UNDEFINED MOVX W1,PS.NOE ;NOT AN ENTRY FLAG IORM W1,0(P1) ;SET IN SYMBOL TRIPLET POPJ P, %NOREQUEST:: PUSHJ P,STRLSW## ;WAIT 'TIL FILE IS LOADED .NOREQUEST:: PUSHJ P,.SAVE4## ;SAVE P1-P4 MOVX W1,PT.SGN!PT.SYM ;FLAGS SKIPN W2,T2 ;SYMBOL JRST E$$ZSV## ;[1174] ZERO IS ILLEGAL SETZ W3, ;VALUE PUSHJ P,TRYSYM## ;SEE IF DEFINED POPJ P, ;IGNORE JFCL ;UNDEFINED MOVX W1,PS.NRQ ;NOT A REQUEST FLAG IORM W1,0(P1) ;SET IN SYMBOL TRIPLET POPJ P, SUBTTL SWITCH ACTION -- /PLOT:(INCHES:n,LEAVES:n,STEPS:n) %PLOT:: SETOM PLOTSW ;MAKE SURE WE DO IT SKIPE T1,3(P2) ;GET SWITCH VALUE MOVEM T1,PLTTAB-1(T2) ;STORE FOR LNKPLT SKIPE IO.PTR+%PC ;[2076] FIRST CALL THIS FILE SPEC? POPJ P, ;NO PUSHJ P,COPYP1## ;MAKE A NEW DATA BLOCK PUSHJ P,DVOUT.## ;SETUP OUTPUT BLOCK %PC,,-1 ;WILL BE EITHER ASCII LINE OR IMAGE AT RUN TIME PJRST RESTP1## ;DELETE DATA BLOCK SUBTTL SWITCH ACTION -- /REGION, /SPACE:n %REGION:: JUMPE T2,CPOPJ ;ALLOW /REGION:0 E$$MRN::.ERR. (MS,0,V%L,L%I,S%I,MRN,) ;[1174] POPJ P, %SPACE:: MOVEM T2,SPACE ;SAVE VALUE POPJ P, SUBTTL LINK SWITCHES -- /REQUEST %REQUEST:: PUSHJ P,STRLSW ;WAIT TIL AFTER FILE LOADED .REQUEST:: MOVE T1,[PUSHJ P,REQNXT] ;[1174] SET UP NEXT SYMBOL ROUTINE MOVEM T1,NXTGLB ;[1174] .. MOVE W3,HT.PRM ;[1174] SET UP HASH TABLE INDEX ADDI W3,1 ;[1174] START UP BY 1 FOR SOSGE BELOW PUSHJ P,REQNXT ;[1174] GET NEXT (FIRST) ENTRY PJRST E01RER ;[1174] NONE--GO SAY SO SPECIALLY E$$RER::.ERR. (MS,.EC!.EN,V%L,L%F,S%I,RER) ;[1174] .ETC. (STR,.EC,,,,,) ;[1174] .ETC. (JMP,,,,,.ETSAV##) ;[1174] GO PRINT THE LIST ;REQNXT RETURNS THE NEXT INTER-LINK ENTRY POINT FOR USE BY THE ABOVE .ERR.. ; ;CALL: ; W3/ NEXT HASH TABLE INDEX TO CHECK ;RETURNS WITH A NON-SKIP RETURN IF THERE ARE NO MORE SUCH SYMBOLS. OTHERWISE, ;GIVES A SKIP RETURN WITH: ; W1/ NEXT SYMBOL ; W2/ OCTAL VALUE ; W3/ UPDATED REQNXT: PUSHJ P,.SAVE4## ;[1174] SAVE LNKLOG'S P ACS REQLUP: SOSGE P2,W3 ;[1174] CHECK NEXT HASH TABLE ENTRY POPJ P, ;[1174] NONE LEFT--GIVE NON-SKIP RETURN SKIPN P3,@HT.PTR ;[1174] IGNORE IF NO SYMBOL HERE JRST REQLUP ;[1174] .. ADD P3,GS.LB ;[1174] RELOCATE IN CASE GS AREA MOVED MOVE T1,0(P3) ;[1174] MUST BE UNDEFINED LINK ENTRY SYMBOL TXNE T1,PT.SYM ;[1174] .. TXNN T1,PS.ENT ;[1174] .. JRST REQLUP ;[1174] NO--TRY NEXT TXNN T1,PS.NRQ ;[1174] DID USER SAY NO FOR THIS SYMBOL? SKIPN 2(P3) ;[1174] OR ZERO VALUE (I.E. NOT A CALL FOO) JRST REQLUP ;[1174] YES--TRY NEXT MOVE W1,1(P3) ;[1174] NO--A WINNER! LOAD UP SYMBOL AND VALUE MOVE W2,2(P3) ;[1174] .. JRST CPOPJ1 ;[1174] DONE--GIVE SKIP RETURN E01RER::.ERR. (MS,.EC,V%L,L%F,S%I,RER) ;[1174] .ETC. (STR,,,,,,) ;[1174] POPJ P, ;[1174] REQHDR: ASCIZ \[LNKRER \ REQMES: ASCIZ \Request External References (Inter-Link Entry points)] \ SUBTTL HERE TO TERMINATE LINK LINKGO::SKIPN PRGNO ;LOAD ANYTHING? JRST LNKOV2 ;NO, DO PASS2 PUSHJ P,LIBRARY## ;LOAD DEFAULT LIBS PUSH P,.+1 ;LOAD RETURN ADDRESS CAI LNKOV2 JRST LINKGT ;COMMON CODE LINKTO::PUSHJ P,LIBRARY## ;LOAD DEFAULT LIBS PUSH P,.+1 ;LOAD RETURN ADDRESS CAI LNKOV1 LINKGT: IFE TOPS20,< MOVE T1,HL.S1 ;[2366] GET THE HIGHEST LOADED TLNE T1,-1 ;[2366] OUTSIDE OF SECTION ZERO? PUSHJ P,E$$CBO## ;[2235] YES, GIVE ERROR >;[2366] IFE TOPS20 SETOM LINKSEEN ;END OF SEGMENT SPECIFIED AOS T1,LNKMAX ;INCREMENT NUMBER SEEN MOVEM T1,CS+CS.NUM ;[1400]STORE CURRENT IN HEADER CAMLE T1,L.MAX ;[1424] TOO MANY? PUSHJ P,E$$TML ;[1424] TOO MANY SKIPL WRTDAT ;[1710] LINK MARKED WRITABLE? JRST LNKGT0 ;[1710] HRLOI T2,377777 ;[1710] CLEAR MARKER BIT NOW ANDM T2,WRTDAT ;[1710] PUSHJ P,WRTPTR## ;[1710] GET BYTE PTR TO LINK DATA MOVX T2,OW.WRT ;[1710] MARK IT WRITABLE DPB T2,T1 ;[1710] ... LNKGT0: SKIPN W2,STADDR+1 ;[1232] IS START ADDRESS STILL SYMBOLIC? JRST LNKT0 ;NO MOVX W1,PT.SGN!PT.SYM SETZ W3, PUSHJ P,TRYSYM## ;SEE IF DEFINED BY NOW JRST LKSTER ;CANNOT HAPPEN JRST LKSTER ;UNDEFINED MOVE W3,2(P1) ;GET VALUE ADDM W3,STADDR ;[1232] CALCULATE VALUE LNKT0: SKIPE CS+CS.NUM ;[1400]LINK 0? JRST LNKT1 ;NO PUSHJ P,ALGCHK## ;[1265] DO SPECIAL CHECK FOR ALGOL HRRZ T1,RC.TB ;[1257] GET POINTER MOVE T1,0(T1) ;[1257] GET POINTER TO .ABS. BLOCK MOVE T1,RC.HL(T1) ;[1257] GET ROOT NODE HIGH ABS LOC. MOVEM T1,ROOTAB ;[1257] STORE IT FOR EXIT TIME MOVSI T1,L.FNS!L.FHS ;[1226] TURN OFF /SEG:DEF AND /SEG:HIGH ANDCAM T1,FLAGS ;[1226] IN GLOBAL (ACCROSS LINES) SWITCHES ANDCAM T1,S.LHFL ;[1226] AND GLOBAL KLUDGE FLAGS MOVSI T1,L.FLS ;[1226] TURN ON /SEGMENT:LOW FOR DURATION IORM T1,FLAGS ;[1226] .. IORM T1,S.LHFL ;[1226] .. TXZ FL, ;[1226] FIX /SEG:LOW NOW TOO TXO FL, ;[1226] .. MOVX W1,PT.SGN!PT.SYM ;FLAG BITS FOR A SYMBOL MOVE W2,['FUNCT.'] ;THE SYMBOL'S NAME SETZ W3, PUSHJ P,TRYSYM ;IT MUST BE THERE OR OVRLAY ;WILL RECURSE HORRIBLY SKIPA ;NOT NEEDED IS OK JRST E$$FSN ;[1174] OVRLAY NEEDS IT, MUST BE THERE MOVX W1,PT.SGN!PT.SYM MOVE W2,['.OVRLA'] ;NEED TO KNOW WHERE IT IS SETZ W3, PUSHJ P,TRYSYM## JRST E$$OHN ;[1174] MUST BE THERE JRST E$$OHN ;[1174] BUT WARN USER MOVE T1,2(P1) ;GET ADDRESS HRLI T1,(JSP 1,) ;COMPLETE INST MOVEM T1,ET+ET.OVL ;[1400] AND STORE IN PROTOTYPE EXTTAB HRRI W2,'RLU' ;WHERE UNDEFINED REQUESTS GO PUSHJ P,TRYSYM## JRST E$$OHN ;[1174] JRST E$$OHN ;[1174] ;HERE TO SET UP FRONT OF OVERLAY FILE. MOVE T1,2(P1) ;GET ADDRESS MOVEM T1,ADDOVU ;SO WE CAN DO FIXUPS PUSHJ P,OC.OPN ;SETUP OVERLAY FILE MOVEI T2,.DBS ;[1424] START TABLE WITH 256 LINKS SKIPN T2,L.MAX ;[1424] BUT NOT IF SET BY /MAXNODE MOVEM T2,L.MAX ;STORE NUMBER FOR CHECKS PUSHJ P,DY.GET## ;GET SOME SPACE HRLI T1,P1 ;PUT INDEX IN P1 FOR @ MOVEM T1,LNKTBL ;FOR DISC BLOCKS MOVEI T1,LN.OVL/<.DBS*2> ;[650] MOVEM T1,OVLBLK ;FIRST FREE BLOCK FOR LINKS SKIPN LW.S1 ;SEE IF PAGING AND BASE NOT IN CORE JRST LNKT0A ;OK IT IS MOVEI P2,.JBVER ;HIGHEST ADDRESS WE NEED SETZ P3, ;LOWER PUSHJ P,PG.LSG## ;MAKE SURE WINDOW IS IN CORE LNKT0A: MOVE T1,LC.LB ;BASE OF LOW SEG MOVE T2,SYMSEG ;GET SYMSEG VALUE CAIE T2,$SSGNONE ;[1201] USER SAYS NO? SKIPE NOSYMS ;HOWEVER IF USER SAID NO JRST [SETZM SYMSEG ;MAKE SURE NONE JRST LNKT0C] ;[1172] CONTINUE JUMPN T2,LNKT0B ;OK IF USER ALREADY SAID /SYMSEG SKIPN .JBDDT(T1) ;IS DDT LOADED JRST LNKT0C ;[1172] NO, CONTINUE MOVEI T2,$SSGLOW ;[1201] SYMBOLS IN LOW SEG INDEX MOVEM T2,SYMSEG ;SET VALUE SO WE CAN SAVE SYMBOLS ;HERE IF WE'RE GOING TO HAVE A RUNTIME SYMBOL TABLE. ALLOCATE PAT.. ;AT THE END OF THE ROOT. LNKT0B: MOVE T2,SYMSEG ;[1172] GET INDEX TO SYMBOL SEGMENT SKIPN T3,PATSPC ;[1172] GET PATCHING SPACE MOVEI T3,PATSP. ;[1172] DEFAULT EXCH T3,HL.S0(T2) ;[1172] GET LOCATION OF PAT.. MOVEM T3,PATLOC ;[1172] SAVE FOR LSOVX ADDM T3,HL.S0(T2) ;[1172] ALLOCATE THE PAT.. AREA ; .. ; .. LNKT0C: MOVE T2,.JBVER(T1) ;[1172] GET VERSION N0. SKIPN VERNUM MOVEM T2,VERNUM ;SET FOR OVERLAY FILE MOVX W1,PT.SGN!PT.SYM MOVE W2,['.OVRLO'] SETO W3, MOVE T1,OVERLW ;GET FLAGS TXNE T1,$OVLOG ;WANT A LOG FILE? PUSHJ P,SETVAL ;YES SETZ W3, TXNE T1,$OVNOLOG ;SPECIFICALLY NOT? PUSHJ P,SETVAL HRRI W2,'RWA' ;NOW FOR WARNINGS TXNE T1,$OVWARN PUSHJ P,SETVAL SETO W3, TXNE T1,$OVNOWARN PUSHJ P,SETVAL JRST LNKT1B SETVAL: PUSHJ P,TRYSYM## JRST E$$OHN ;[1174] JRST E$$OHN ;[1174] HRRZ P2,2(P1) ;GET ADDRESS MOVE P3,P2 ;FOR ADDRESS CHECK SKIPE PAG.S1 ;ON DSK PUSHJ P,PG.LSG## ;YES ADD P3,LC.LB MOVEM W3,(P3) ;STORE BACK MOVE T1,OVERLW ;RESET SWITCH POPJ P, LKSTER: PUSHJ P,E$$USA## ;[1232] UNDEFINED MESSAGE JRST LNKT0 ;[1232] CONTINUE END-OF-LINK PROCESSING LNKT1: SKIPN P1,LSTPTR ;FIRST TIME (LINK# 1)? JRST [MOVEI T2,4 ;NEED 4 WORDS PUSHJ P,DY.GET## MOVEM T1,FSTPTR ;STORE START OF TREE MOVSI T2,-4 ;-4 ,, 0 JRST LNKT1A] SKIPN (P1) ;JUST DONE A RESET (0 WORD) JRST [MOVS T2,CS+CS.NUM ;[1400] MOVEM T2,(P1) JRST LNKT1B] ;REPLACE WITH LINK# MOVEI T2,4 ;ASSUME AT LEAST 2 FORWARD PATHS FROM THIS LINK PUSHJ P,DY.GET## HRRM T1,(P1) ;LINK BACK TO PREVIOUS HLRZ T2,P1 ;PTR TO START OF BLOCK HRL T2,(T2) ;GET ITS LINK# MOVEM T2,1(T1) ;STORE BACK POINTER MOVSI T2,-4 HLR T2,(P1) ;THIS LINK# LNKT1A: MOVEM T2,(T1) MOVS T2,CS+CS.NUM ;[1400] MOVEM T2,2(T1) ;STORE LINK # WITH ZERO PTR HRLI T1,2(T1) ;POINT TO NULL PTR MOVSM T1,LSTPTR LNKT1B: SKIPN T1,HL.S1 ;GET CURRENT HIGHEST LOC JRST [SKIPN T1,PH+PH.ADD ;[1400] NEVER SETUP, SO NO LOW SEG MOVEI T1,.JBDA ;NOT POSSIBLE, BUT !!1 MOVEM T1,HL.S1 ;JUST STORE TABLES, ETC. JRST .+1] MOVEM T1,PH+PH.CST ;[1400] WILL BE START OF HEADER SECTION SKIPN CS+CS.NUM ;[1400] IF ROOT HRLM T1,ADDOVU ;STORE FOR UNDEF SYMBOL HRL T1,CS+CS.NUM ;[1400] PUT NUMBER IN LH MOVEM T1,ET+ET.CST ;[1400] ALSO IN EXTTAB MOVE T1,PH+PH.ADD ;[1400] GET THIS LINK'S ORIGIN MOVEM T1,CS+CS.COR ;[1400] SAVE AS START OF LINK MOVEI T1,CS.LEN ;[1400] ALLOCATE SPACE FOR HEADER ADDB T1,HL.S1 ;AND ACCOUNT FOR IT MOVE T1,[CS+CS.HDR,,PH+PH.HDR] ;[1400] BLT T1,PH+PH.NAM ;[1400] COPY COMMON INFO MOVE T1,STADDR ;COPY START ADDRESS HRRZM T1,CS+CS.STA ;[1400] SETZM CS+CS.EXT ;[1400] INCASE NO UNDEFS SKIPN P2,USYM ;NO. OF UNDEFS JRST LNKT3 ;NONE MOVN T1,P2 ;- NUMBER HRL T1,HL.S1 ;,,ADDRESS MOVSM T1,CS+CS.EXT ;[1400] POINT TO TABLE IMULI P2,ET.LEN ;[1400] 4 WORDS EACH MOVE P3,HL.S1 ;LOWER BOUND ADD P2,HL.S1 ;ACCOUNT FOR THEM PUSHJ P,LNKTCK ;MAKE SURE IT'S IN CORE ;HERE TO SET EXTTAB LNKT2: HRLI P3,ET ;[1400] FORM BLT PTR IN P3 MOVE P4,USYM ;GET UNDEFINED SYMBOL COUNT AGAIN MOVE P2,HT.PRM ;GET INDEX INTO HASH TABLE LNKT2A: SKIPN P1,@HT.PTR ;GET POINTER TO SYMBOL JRST LNKT2B ;NO POINTER, NO SYMBOL ADD P1,GS.LB ;ADD IN BASE MOVE T1,0(P1) ;GET FLAGS TXNE T1,PT.SYM ;WE ONLY WANT SYMBOLS TXNN T1,PS.UDF!PS.REQ ;SEE IF UNDEFINED STILL JRST LNKT2B ;NO AOS EXTCNT ;COUNT ONE MORE DMOVE T1,1(P1) ;GET SYMBOL AND VALUE (POINTER) MOVEM T1,ET+ET.NAM ;[1400] STORE NAME MOVE T1,P3 ;GET BYTE PTR ADDI P3,ET.LEN ;[1400] INCR P3 BLT T1,-1(P3) ;MOVE PROTOTYPE BLOCK MOVEI W3,ET.LEN ;[1400] ADD W3,HL.S1 ;NEW TOP EXCH W3,HL.S1 ;OLD BASE HRLI R,(1B1) ;RELOCATE RHS SETZ P1, ;NOT SYMBOLIC THOUGH SUB P3,LC.LB ;MAKE RELATIVE IN CASE CORE MOVES PUSHJ P,SY.CHR## ;LINK ALL REQUESTS TO EXTTAB ADD P3,LC.LB ;CAN HAPPEN IF PAGING LC AREA SOJLE P4,LNKT3 ;DONE IF NO MORE UNDEFS LNKT2B: SOJGE P2,LNKT2A ;LOOP IF MORE SYMBOLS TO LOOK AT ;HERE TO SET INTTAB LNKT3: SETZM CS+CS.INT ;[1400] INCASE 0 ENTRIES SKIPN CS+CS.NUM ;[1400] NOT REQUIRED IF LINK 0 JRST LNKT4 MOVEI T1,100 ;MAKE SURE ENOUGH SPACE FOR 100 ENTRIES MOVEM T1,INTCNT MOVE P3,HL.S1 ;LOWER BOUND MOVEI P2,2*100(P3) ;ALLOCATE SPACE FOR WORD PAIRS PUSHJ P,LNKTCK ;MAKE SURE IN CORE MOVE P2,HT.PRM ;GET INDEX INTO HASH TABLE LNKT3A: SKIPN T4,@HT.PTR ;GET POINTER TO SYMBOL JRST LNKT3B ;NO POINTER, NO SYMBOL ADD T4,GS.LB ;ADD IN BASE MOVE T1,0(T4) ;GET FLAGS TXNE T1,PT.SYM ;WE ONLY WANT SYMBOLS TXNN T1,PS.ENT ;SEE IF AN ENTRY JRST LNKT3B ;NOT AN ENTRY TXNE T1,PS.BGS!PS.NOE ;BUT ONLY IF NOT BOUND AND USER DIDN'T SAY NO JRST LNKT3B ;NO SOSGE INTCNT ;ENOUGH SPACE JRST [MOVEI T1,100 ;GET ANOTHER 100 WORDS WORTH MOVEM T1,INTCNT ADDB T1,CS+CS.INT ;[1400] ACCOUNT FOR THEM LSH T1,1 ;WORD PAIRS PUSH P,P2 ;SAVE INDEX INTO HASH TABLE MOVE P3,HL.S1 ;BASE AGAIN MOVEI P2,2*100(P3) ADD P2,T1 ;ADDRESS BOUNDS PUSHJ P,LNKTCK ;ADDRESS CHECK IT ADD P3,CS+CS.INT ;[1400] ACCOUNT FOR PREVIOUS ADD P3,CS+CS.INT ;[1400] IN PAIRS POP P,P2 JRST LNKT3A] ;KEEP ON TRYING DMOVE T1,1(T4) ;GET NAME + VALUE HRL T2,HL.S1 ;BASE OF TABLE DMOVEM T1,(P3) ;STORE IN CORE ADDI P3,2 ;INCREMENT LNKT3B: SOJGE P2,LNKT3A ;LOOP IF MORE SYMBOLS TO LOOK AT MOVEI T1,100 SUB T1,INTCNT ;SEE HOW MANY ENTRY POINTS ADD T1,CS+CS.INT ;[1400] INCASE MORE THAN 100 MOVN T2,T1 ;-NUMBER HRL T2,HL.S1 ;,, ADDRESS MOVSM T2,CS+CS.INT ;[1400] POINTER TO TABLE LSH T1,1 ;2 WORDS EACH ADDM T1,HL.S1 ;ACCOUNT FOR THEM ; JRST LNKT4 LNKT4: DMOVE T1,OV.S1 ;SAVE CURRENT HRR T1,PH+PH.ADD ;[1400] HOWEVER LOW REALLY STARTS AFTER SPACE DMOVEM T1,PV.S1 ;AS PREVIOUS SO MAP CAN COMPUTE LENGTHS HRRZ T1,ARSIZE ;[635] RESERVE SPACE AFTER INTTAB FOR ADDB T1,HL.S1 ;[635] ARL'S, PICK UP NEW HL.S1 MOVE T2,HL.S2 ;[635] NEED HI SEG HIGHEST ALSO HRL T1,T1 ;MAKE THE HIGEST CODE THE HRL T2,T2 ; HIGHEST SEEN TO HERE DMOVEM T1,OV.S1 ;SAVE FOR MAP AND EXIT MOVE T1,HL.S1 ;HIGHEST USED MOVE T2,T1 SUB T2,PH+PH.ADD ;[1400] REMOVE BASE HRLM T2,CS+CS.COR ;[1400] SAVE LENGTH REQUIRED HRRZM T2,PH+PH.LLN ;[1400] MOVE P1,CS+CS.NUM ;[1400] GET THIS LINK # ROT P1,-1 ;CUT IN HALF AND MAKE REM SIGN BIT HRLS T2,OVLBLK ;THIS TRICK PUTS RH(OVLBLK) INTO LH(OVLBLK) ;AND BOTH HALVES IN T2 JUMPL P1,[HRRM T2,@LNKTBL JRST .+2] HRLZM T2,@LNKTBL ;DISC BLOCK # OF PREAMBLE AOS T1,OVLBLK ;ACCOUNT FOR PREAMBLE (OUTPUT IT LATER) HRRZM T1,PH+PH.OVL ;[1400] USE THIS BLOCK FOR CODE LNKT4A: MOVE P3,PH+PH.CST ;[1400] ADDRESS OF CONTROL SECTION MOVEI P2,CS.LEN-1(P3) ;[1400] UPPER BOUND PUSHJ P,LNKTCK ;MAKE SURE ITS IN CORE MOVN T2,PH+PH.LLN ;[1400] TOTAL NO. OF WORDS HRLM T2,PH+PH.OVL ;[1400] IN IOWD FORM MOVE T2,PH+PH.OVL ;[1400] COPY POINTER TO CS FOR SPEED MOVEM T2,CS+CS.OVL ;[1400] AT RUNTIME WITH WRITABLE OVERLAYS HRLI P3,CS ;[1400] COPY FINAL CONTROL SECTION TO MOVEI P2,CS.LEN-1(P3) ;[1400] THE MEMORY IMAGE BLT P3,(P2) ;[1400] .. MOVE T1,HL.S1 ;TOP OF CORE ADD T1,SPACE ;PLUS BUFFER SPACE CAMLE T1,[1,,0] ;[1204] STILL IN BOUNDS? PUSHJ P,E$$PTL## ;[1204] NO, COMPLAIN MOVEM T1,PH+PH.NFL ;[1400] FOR NEXT LINK PUSHJ P,LODFIX## ;DO ALL CORE FIXCUPS ETC. SKIPN PAG.S1 ;PAGING? JRST LNKT4B ;NO MOVE T1,LW.S1 ;[2202] LOWER BOUND MOVE T2,UW.S1 ;[2202] UPPER BOUND PUSHJ P,LC.OUT## ;MAKE SURE FILE IS CORRECT SETZB T1,LW.S1 ;[2202] NOW START AT FRONT MOVE T2,LC.UB ;[2202] GET TOP MOVEM T2,LC.AB ;[2202] USE ALL SPACE WE CAN SUB T2,LC.LB ;[2202] GET THE SIZE MOVEM T2,UW.S1 ;[2202] MAKE IT UPPER BOUND PUSHJ P,LC.IN## ;READ BACK ;HERE TO SETUP .JBOVL AND UPDATE OVERLAY FILE LNKT4B: HRRZ T1,OVLBLK ;[666] BLOCK TO START STASHING CODE USETO OC,(T1) ;SET ON IT SKIPE CS+CS.NUM ;[1400] IF LINK# 0 JRST LNKT4C ;NO MOVE T1,LC.LB ;BASE MOVE T2,PH+PH.CST ;[1400] START OF CONTROL BLOCK MOVEM T2,.JBOVL(T1) ;STORE INITIAL PTR ;HERE TO DUMP LC AREA IF NOT PAGING OR ON EACH BUFFER IF PAGING. LNKT4C: MOVE T1,LC.AB ;[666] USUALLY WILL WANT TO DUMP SUB T1,LC.LB ;[666] ENTIRE LC AREA, SO CALCULATE ADDI T1,1 ;[666] SIZE TO DUMP MOVE T3,PH+PH.LLN ;[1400] NUMBER OF WORDS TO DUMP TOTAL SKIPN PAG.S1 ;[666] HAS LC AREA OVERFLOWED TO DISK? SKIPA T1,T3 ;[666] NO, DUMP ALL WORDS AT ONCE CAML T3,UW.S1 ;[666] YES, IF NOT LAST BUF DUMP ALL LC JRST LNKT4G ;[666] T1 HAS CORRECT # WORDS TO DUMP SUB T1,UW.S1 ;[666] LAST BUF WHEN PAGING, ONLY DUMP SUBI T1,1 ;[666] LAST PARTIAL BUFFER ADD T1,PH+PH.LLN ;[1400] GET LENGTH EXACT LNKT4G: HRLZ T1,T1 ;[666] GENERATE IOWD TO DUMP LC AREA SETCA T1, ;[666] .. ADD T1,LC.LB ;[666] .. SETZ T2, ;TERMINATOR OUT OC,T1 ;OUTPUT WHOLE AREA JRST LNKT4D ;OK PUSHJ P,E$$OOV## ;[1174] OUTPUT ERROR LNKT4D: SKIPE PAG.S1 ;[666] PAGING? CAMG T3,UW.S1 ;[666] YES, FINISHED LAST BUFFER? JRST LNKT4F ;[666] DON'T NEED TO DUMP ANOTHER BUF MOVE T1,LC.AB ;GET TOP OF WHATS IN USE SUB T1,LC.LB ;GET DIFF MOVEI T1,1(T1) ;SO WE CAN ADD NO. ADDM T1,LW.S1 ;ADJUST WINDOWS ADDB T1,UW.S1 IORI T3,.IPM ;[666] MAKE SUB COME OUT EVEN .IPS'S SUB T3,T1 ;[666] DO WE STILL NEED IT ALL? JUMPGE T3,LNKT4E ;[666] YES, USE ALL OF SPACE AVAILABLE ADDM T3,UW.S1 ;[666] IFE TOPS20,< ADDB T3,LC.AB ;[666] REDUCE WINDOW NOW HRLI T3,1(T3) ;[666] FORM BLT PTR HRRI T3,2(T3) ;[666] SETZM -1(T3) ;[666] CLEAR FROM (LC.AB)+1 BLT T3,@LC.UB ;[666] THROUGH ALL OF FREE SPACE > ;[1514]IFE TOPS20 IFN TOPS20,< MOVE T2,LC.AB ;[2202] Get upper bound SUB T2,LC.LB ;[2202] Get the current size ADD T2,LW.LC ;[2202] Current window area MOVE T1,T2 ;[2202] Get the upper window ADD T1,T3 ;[2202] Get new upper window (T3 is negative) ADDI T1,1 ;[2202] Start of piece to remove ADDM T3,LC.AB ;[1514] Set new upper limit PUSHJ P,LC.OUT## ;[2202] Unmap excess area > ;[1514] IFN TOPS20 LNKT4E: MOVE T1,LW.S1 ;[2202] GET LOWER BOUND MOVE T2,UW.S1 ;[2202] SETUP NEW WINDOW PUSHJ P,LC.IN## ;INPUT NEW AREA JRST LNKT4C ;[666] AND OUTPUT IT LNKT4F: MOVE T1,PH+PH.LLN ;[1400] GET LENGTH WE NEED ADDI T1,.DBM ;[650] FILL OUT BLOCK LSH T1,-.DBS2W ;[650] INTO BLOCKS ADDM T1,OVLBLK ;ACCOUNT FOR THEM ; JRST LNKT5 ;HERE FOR LOCAL SYMBOLS LNKT5: MOVN T1,LSYM ;[666] NEGATED # SYMBOLS FOR IOWD HRL T1,OVLBLK ;GET FREE BLOCK MOVS T1,T1 MOVEM T1,PH+PH.SYM ;[1400] HOLD LOCAL IN THIS AREA MOVE T1,LSYM ;CALCULATE # OF BLOCKS LS WILL USE ADDI T1,.DBM ;[650] ROUND WORDS UP TO NEXT BLOCK LSH T1,-.DBS2W ;[1214] WORDS TO BLOCKS ADDM T1,OVLBLK ;UPDATE OVLBLK TO END OF SYMBOLS SKIPN T1,PAG.LS ;PAGING? JRST LNKT5B ;NO JUMPG T1,LNKT5A ;IS UPPER WINDOW SET? MOVE T2,LSYM ;[2202] NO ;**;[2033] Replace at LNKT5+12 Lines PY 14-Feb-83 IFN TOPS20,< ;[2033] IORI T2,.IPM ;[2202] PUT ON PAGE BOUND >;[2033] IFN TOPS20 IFE TOPS20,< ;[2033] IORI T2,.DBM ;[2202] PUT ON BLOCK BOUND >;[2033] IFE TOPS20 LNKT5A: MOVE T1,LW.LS ;[2202] GET LOWER BOUND PUSHJ P,LS.OUT## ;WRITE OUT SYMBOLS MOVEI P1,LS.IX ;EXPAND LS AREA AS MUCH AS WE CAN MOVE P2,LSYM ;HOW MUCH WE NEED ADD P2,LS.LB ;MINUS HOW MUCH WE ALREADY HAVE SUB P2,LS.AB ;GIVES HOW MUCH WE NEED JUMPLE P2,LNKT5E ;SKIP LNKCOR CALL IF ALREADY ENUF PUSHJ P,FR.CNT## ;SEE HOW MUCH IS FREE CAMLE P2,T1 ;AS MUCH AS WE NEED? MOVE P2,T1 ;NO, USE WHAT WE CAN PUSHJ P,LNKCOR## ;NEED MORE - TRY FOR IT PUSHJ P,E$$MEF## ;[1174] TOO BAD LNKT5E: SETZB T1,LW.LS ;[2202] START BACK AT FRONT OF FILE MOVE T2,LS.AB ;[2202] CALCULATE THE SUB T2,LS.LB ;[2202] LENGTH IFL .IPS-2*.DBS,< CAIGE T2,2*.DBS ;[650] MUST HAVE THIS MUCH FOR FIXUPS PUSHJ P,E$$MEF## ;[1174] TOO BAD > ;END IFL .IPS-2*.DBS MOVEM T2,UW.LS ;[2202] NEW END OF WINDOW PUSHJ P,LS.IN## ;INPUT IT ;HERE IF NOT PAGING OR ON EACH BUFFER OF SYMBOLS IF PAGING LNKT5B: MOVE T1,LS.AB ;SAME AS FOR LC SUB T1,LS.LB ADDI T1,1 ;[666] WILL USUALLY WANT TO DUMP ALL LS MOVE T3,LSYM ;[666] GET # WORDS TO DUMP TOTAL SKIPE PAG.LS ;[666] IS LS AREA ON DISK? JRST LNKT5F ;[666] YES, T1 MAY BE OK MOVE T1,T3 ;[666] DO ONE DUMP, EXACT RIGHT # WORDS JRST LNKT5H ;[666] GO DUMP THE LS AREA LNKT5F: CAMG T3,UW.LS ;[666] IS THIS THE LAST BUF OF SYMBOLS? JRST LNKT5G ;[666] YES, SPECIAL STUFF ;**;[2033] Replace at LNKT5F+2 Lines PY 14-Feb-83 IFN TOPS20,< ;[2033] SUBI T1,.IPS ;[2033] NO, DON'T DUMP LAST WORDS TILL >;[2033] IFN TOPS20 IFE TOPS20,< ;[2033] SUBI T1,.DBS ;[666] NO, DON'T DUMP LAST WORDS TILL >;[2033] IFE TOPS20 JRST LNKT5H ;[666] NEXT TIME SO FIXUPS CAN BE DONE LNKT5G: SUB T1,UW.LS ;[666] LAST BUF IF PAGING, REDUCE COUNT SUBI T1,1 ;[666] DON'T BE OFF BY ONE ADD T1,LSYM ;[666] WE DON'T WANT TO DUMP TOO MUCH LNKT5H: HRLZ T1,T1 ;[666] GENERATE IOWD TO DUMP LS AREA SETCA T1, ;[666] .. ADD T1,LS.LB ;[666] .. SETZ T2, OUT OC,T1 JRST LNKT5C PUSHJ P,E$$OOV## ;[1174] OUTPUT ERROR LNKT5C: SKIPE PAG.LS ;PAGING? CAMG T3,UW.LS ;YES, SEE IF MORE TO DO JRST LNKT6 ;NO, ALL DONE MOVE T1,LS.AB ;[666] WINDOW MOVES UP BY SIZE OF SUB T1,LS.LB ;[666] LS AREA MINUS .DBM ;**;[2033] Replace at LNKT5C+5 Lines PY 14-Feb-83 IFN TOPS20,< ;[2033] ANDCMI T1,.IPM ;[2033] FIGURE WINDOW OFFSET INTO T1 >;[2033] IFN TOPS20 IFE TOPS20,< ;[2033] ANDCMI T1,.DBM ;[666] FIGURE WINDOW OFFSET INTO T1 >;[2033] IFE TOPS20 ADDM T1,LW.LS ;[666] MOVE THE WINDOW UP ADDB T1,UW.LS ;[666] .. IFE TOPS20,< IORI T3,.IPM ;[666] MAKE SUB BELOW COME OUT .IPS'S SUB T3,T1 ;[666] ARE WE DUMPING FINAL PART WINDOW? JUMPGE T3,LNKT5D ;[666] NO, PROCEED AS USUAL MOVE T3,LSYM ;[1266] GET NUMBER OF SYMBOLS MOVEM T3,UW.LS ;[1266] SINCE LAST BUFFER, MUST BE TOP SUB T3,LW.LS ;[1266] FIGURE SIZE OF CURRENT BUFFER ADD T3,LS.LB ;[1266] GET TOP OF NEW BUFFER IORI T3,.IPM ;[1266] MUST BE ON END OF PAGE MOVEM T3,LS.AB ;[1266] SET HIGHEST ADDRESS IN USE HRLI T3,1(T3) HRRI T3,2(T3) ;FORM BLT PTR SETZM -1(T3) BLT T3,@LS.UB ;TO CLEAR ALL EXCESS CORE > ;[1506] IFE TOPS20 LNKT5D: MOVE T1,LW.LS ;[2202] LOWER WINDOW ADDR TO FILL MOVE T2,UW.LS ;[2202] UPPER WINDOW ADDR PUSHJ P,LS.IN## ;GET WINDOW JRST LNKT5B ;AND OUTPUT IT ;HERE FOR RELOCATION TABLES LNKT6: SETZM PH+PH.REL ;[1400] ASSUME NO RELOCATION SETZM PH+PH.ORL ;[1400] AND NO "OTHER" RELOCATION SKIPN RT.LB ;SETUP YET? JRST LNKT7 ;NO HRRZ P3,HL.S1 ;GET HIGHEST LOC USED PUSHJ P,RT.P3## ;SETUP RT.PT TO IT MOVE T1,RT.LB HRRZ T2,RT.PT SUBI T1,1(T2) ;- LENGTH ACTUALLY USED HRL T1,OVLBLK MOVSM T1,PH+PH.REL ;[1400] -LENGTH ,, BLOCK NUMBER MOVE T1,RT.AB SUB T1,RT.LB ;LENGTH AOS T2,T1 ;ACTUALLY ONE LARGER LSH T2,-.DBS2W ;[650] NO. OF BLOCKS ADDM T2,OVLBLK MOVN T1,T1 HRLZ T1,T1 HRR T1,RT.LB HRRI T1,-1(T1) ;IOWD AT LAST SETZ T2, OUT OC,T1 CAIA PUSHJ P,E$$OOV## ;[1174] SKIPN RBGPTR ;ANY OTHER RELOCATION JRST LNKT7 ;NO MOVE T1,RT.LB ;YES, GET AREA TO HOLD IT IN MOVEM T1,RT.PT ;POINT TO FIRST FREE HRL T1,T1 ADDI T1,1 ;BLT PTR SETZM -1(T1) ;CLEAR FIRST WORD BLT T1,@RT.AB ;AND REST MOVE T1,RT.LB IORI T1,.IPM MOVEM T1,RT.AB ;ALLOCATE ONE BLOCK SUB T1,RT.LB ;FREE SPACE MOVEM T1,RT.FR ;IN THIS BLOCK ;USES ACCS AS FOLLOWS ;P1 = TO HOLD RBGPTR TO WHATS LEFT ;P2 = CURRENT LINK # ;P3 = TO HOLD LIST FOR THIS LINK LNKT6A: MOVE P1,RBGPTR ;GET START OF LIST HRRZ P3,P1 ;SET INITIAL PTR SETZM RBGPTR ;WILL PUT BACK THOSE NOT REQUIRED MOVE T1,P1 ;GET FIRST ITEM IN LIST ADD T1,FX.LB ;FIX IN CORE HLRZ P2,(T1) ;GET LINK# HRRZ P1,(T1) ;GET NEXT ITEM PTR HLLZS (T1) ;CLEAR THIS PTR LNKT6B: SKIPN T1,P1 ;GET NEXT ITEM JRST LNKT6L ;LIST EMPTY ADD T1,FX.LB ;FIX IN CORE HRRZ P1,(T1) ;GET PTR TO NEXT HLLZS (T1) ;CLEAR PTR HLRZ T2,(T1) ;GET LINK# CAMN T2,P2 ;THIS THE ONE WE WANT? JRST LNKT6C ;YES MOVE T2,T1 SUB T2,FX.LB ;REMOVE BASE EXCH T2,RBGPTR HRRM T2,(T1) ;PUT BACK IN LIST JUMPN P1,LNKT6B ;IF NOT END JRST LNKT6L ;END OF THIS CHAIN LNKT6C: HRRZ T2,1(T1) ;GET ADDRESS WE WANT TO ADD MOVE T3,P3 ;START OF CHAIN LNKT6M: ADD T3,FX.LB ;MAKE ABS HRRZ T4,1(T3) ;ADDRESS IN CHAIN CAML T2,T4 ;FOUND OUR PLACE YET? JRST LNKT6G ;NO HLRZ T3,T3 ;PUT LAST ADDRESS BACK JUMPE T3,[HRRM P3,0(T1) ;PUT IN FRONT OF LIST SUB T1,FX.LB MOVE P3,T1 ;RESET BASE PTR JRST LNKT6B] ;GET NEXT MOVE T4,0(T3) ;GET FORWARD PTR HRRM T4,0(T1) ;PUT INTO NEW BLOCK LNKT6D: SUB T1,FX.LB ;MAKE REL HRRM T1,0(T3) ;AND MAKE LAST POINT TO IT JRST LNKT6B ;GET NEXT LNKT6G: HRL T3,T3 ;SAVE LAST PTR HRR T3,0(T3) ;GET NEXT TRNE T3,-1 ;0 IS END OF LIST JRST LNKT6M ;NO, MORE TO COME MOVS T3,T3 ;SWAP BACK JRST LNKT6D ;PUT LAST IN LIST LNKT6L: MOVE T1,RT.PT ;GET PTR SUB T1,RT.LB ;MAKE RELATIVE PUSH P,T1 ;SAVE PTR SO WE CAN ADD COUNT LATER AOS RT.PT SOS RT.FR ;ACCOUNT FOR WORD MOVE T1,BRNADD ;GET START OF ADDRESS TABLE HRLI T1,-^D128 ;MAX SIZE? MOVS T2,(T1) ;GET LINK# CAIN P2,(T2) ;ONE WE WANT? JRST .+3 ;YES AOBJN T1,.-3 ;NO HALT MOVS P1,T2 ;LINK# ,, ADDRESS SETZ T1, ;NO PREVIOUS PUSHJ P,RT.DPB ;STORE IT LNKT6K: SKIPN T1,P3 ;COPY OF PTR JRST LNKT6R ;END OF LIST ADD T1,FX.LB HRRZ P3,0(T1) ;GET NEXT JUMPE P1,[MOVE P1,1(T1) ;NO PREVIOUS JRST LNKT6K] ;GET NEXT HRRZ T2,1(T1) ;ADDRESS OF THIS RELOC WORD SUBI T2,(P1) ;- PREVIOUS CAIL T2,^D9 ;WITHIN RANGE? JRST [PUSH P,1(T1) ;GET THIS VALUE PUSHJ P,RT.DPB ;DUMP CURRENT POP P,P1 ;RESET THIS ONE JRST LNKT6K] ;GET NEXT HLLZ T3,1(T1) ;GET RELOC BITS IMULI T2,-2 ;2 BITS PER WORD LSH T3,(T2) ;SHIFT INTO POSSITION IOR P1,T3 JUMPN P3,LNKT6K ;TRY NEXT WORD ;HERE TO CHECK TO SEE IF MORE TO DO AND OUTPUT RT AREA IF NOT. LNKT6R: SKIPE P1 ;PREVIOUS TO STORE STILL? PUSHJ P,RT.DPB ;YES POP P,P1 ;GET PTR TO START OF TABLE ADD P1,RT.LB ;MAKE ABS MOVE T1,RT.PT ;PTR TO END SUBI T1,1(P1) ;LENGTH MOVEM T1,(P1) ;PUT IT IN SKIPE P1,RBGPTR ;MORE TO DO? JRST LNKT6A ;YES LNKT6Z: MOVE T1,RT.LB HRRZ T2,RT.PT SUBI T1,1(T2) ;- LENGTH ACTUALLY USED HRL T1,OVLBLK MOVSM T1,PH+PH.ORL ;[1400] -LENGTH ,, BLOCK NUMBER MOVE T1,RT.AB SUB T1,RT.LB ;LENGTH AOS T2,T1 ;ACTUALLY ONE LARGER LSH T2,-.DBS2W ;[650] NO. OF BLOCKS ADDM T2,OVLBLK MOVN T1,T1 HRLZ T1,T1 HRR T1,RT.LB HRRI T1,-1(T1) ;IOWD AT LAST SETZ T2, OUT OC,T1 JRST LNKT7 PUSHJ P,E$$OOV## ;[1174] RT.DPB: SOSL RT.FR ;ANY ROOM JRST RTDPB1 ;YES SPUSH MOVEI P1,RT.IX ;NEED MORE ROOM MOVEI P2,.IPS PUSHJ P,LNKCOR## PUSHJ P,E$$MEF## ;[1174] SPOP RTDPB1: MOVEM P1,@RT.PT AOS RT.PT MOVE P1,T1 ;STORE NEW AS PREVIOUS POPJ P, ;HERE FOR GLOBAL SYMBOLS LNKT7: MOVE T1,HT.PTR ;ABS ADDRESS OF HASH TABLE SUB T1,GS.LB ;RELATIVE HRL T1,HT.PRM ;NEED TO SAVE THE HASH NUMBER MOVEM T1,@GS.LB ;IN A SAFE PLACE MOVE T1,OVLBLK HRRZM T1,PH+PH.GLB ;[1400] POINT TO BLOCK MOVE T1,GS.AB ;SAME AS FOR LC SUB T1,GS.LB ADDI T1,1 ;[1205] SIZE REQUIRED MOVEI T2,.DBM(T1) ;[1205] ROUND UP TO BLOCK BOUND LSH T2,-.DBS2W ;[650] ADDM T2,OVLBLK MOVN T1,T1 HRLZ T1,T1 HRR T1,GS.LB HRRI T1,-1(T1) HLLM T1,PH+PH.GLB ;[1400] SETZ T2, OUT OC,T1 JRST LNKT8 PUSHJ P,E$$OOV## ;[1174] OUTPUT ERROR ;HERE TO OUTPUT PREAMBLE - MUST BE LAST LNKT8: HLRZ T1,OVLBLK ;GET BLOCK RESERVED FOR PREAMBLE USETO OC,(T1) ;SET ON IT DMOVE T1,PHIOWD ;SINCE IOWD CAN NOT BE IN HIGH SEG YET OUT OC,T1 JRST LNKT9 PUSHJ P,E$$OOV## ;[1174] OUTPUT ERROR LNKT9: MOVE T1,CS+CS.NUM ;[1400] GET THIS LINK MOVEM T1,PH+PH.BPT ;[1400] AS BACK POINTER FOR NEXT LINK ;HERE TO ZERO VARIOUS AREAS ;HERE TO ZERO LOW CODE AREA LNKZLC: IFE TOPS20,< ;[2247] MOVE T1,LC.LB ;BASE HRL T1,T1 ADDI T1,1 ;BLT PTR SETZM -1(T1) ;CLEAR FIRST WORD BLT T1,@LC.AB ;AND REST MOVE T1,LC.LB IORI T1,.IPM ;PRE-ALLOCATE ONE BLOCK ONLY MOVEM T1,LC.AB SKIPN PAG.S1 ;PAGING? JRST LNKZRT ;NO MOVEI T1,LC ;CHAN# IF ON DSK MOVEM T1,IO.CHN PUSHJ P,DVDEL.## ;DELETE FILE JFCL ;INCASE OF ERRORS PUSHJ P,DVZAP.## ;GET RID OF DATA BLOCK SETZM LW.S1 ;ZERO ALL PAGING INFO SETZM UW.S1 SETZM HB.S1 SETZM LC.UP ;[2420] RESET HIGHEST BLOCK NUMBER >;[2247] IFE TOPS20 IFN TOPS20,< ;[1541] MOVE T1,LW.LC ;[2202] GET THE BOTTOM MOVE T2,UW.LC ;[2202] AND THE TOP PUSHJ P,LC.OUT## ;[1541] UNMAP IT SO IT CAN CLOSE MOVE T3,HL.S1 ;[2247] GET THE UPPER BOUND LSH T3,-9 ;[2247] IN PAGES ADDI T3,1 ;[2247] NEED COUNT OF PAGES TXO T3,PM%CNT ;[2251] TELL THE MONITOR ABOUT IT HRLZ T2,LC.JF ;[2247] GET THE FORK HANDLE SETO T1, ;[2247] WANT TO UNMAP THE PAGES PMAP% ;[2247] MAKE THEM GO AWAY ERCAL E$$OLC## ;[2247] UNEXPECTED FAILURE MOVE T1,LC.LB IORI T1,.IPM ;PRE-ALLOCATE ONE BLOCK ONLY MOVEM T1,LC.AB SETZB T1,LW.S1 ;[2247] RESET LOWER WINDOW MOVEI T2,.IPM ;[2247] NEED ONE PAGE MOVEM T2,UW.S1 ;[2247] MAPPED IN FOR WINDOW PUSHJ P,LC.IN## ;[2247] MAP IT IN > ;[1541] IFN TOPS20 ;HERE TO ZERO THE RELOCATION TABLE LNKZRT: SKIPN T1,RT.LB ;DO WE HAVE SPACE ALLOCATED? JRST LNKZLS ;NO HRL T1,T1 ADDI T1,1 ;BLT PTR SETZM -1(T1) ;CLEAR FIRST WORD BLT T1,@RT.AB ;AND REST MOVE T1,RT.LB IORI T1,.IPM ;PRE-ALLOCATE ONE BLOCK ONLY MOVEM T1,RT.AB SKIPN PAG.RT ;PAGING JRST LNKZLS ;NO HALT ;HERE TO ZERO LOCAL SYMBOL AREA LNKZLS: IFN TOPS20,< ;[2202] SKIPE PAG.LS ;[2202] Paging? JRST LSNPAG ;[2202] Yes, Don't bother to BLT > ;[2202] IFN TOPS20 MOVE T1,LS.LB ;BASE HRL T1,T1 ADDI T1,1 ;BLT PTR SETZM -1(T1) ;CLEAR FIRST WORD BLT T1,@LS.AB ;AND REST LSNPAG: ;[1506] MOVE T1,LS.LB ADDI T1,1 ;PRE-ALLOCATE FIRST WORD MOVEM T1,LS.PT ;SO USER CAN NOT GET IT IORI T1,.IPM ;PRE-ALLOCATE ONE BLOCK ONLY MOVEM T1,LS.AB MOVEI T1,.IPM ;NO. OF WORDS FREE MOVEM T1,LS.FR ;IN THIS BLOCK SKIPN PAG.LS ;PAGING? JRST LNKZFX ;NO IFN TOPS20,< ;[1541] MOVE T1,LW.LS ;[2202] GET THE BOTTOM MOVE T2,UW.LS ;[2202] AND THE TOP PUSHJ P,LS.OUT## ;[1541] UNMAP IT SO IT CAN CLOSE > ;[1541] IFN TOPS20 MOVEI T1,SC ;CHAN# IF ON DSK MOVEM T1,IO.CHN PUSHJ P,DVDEL.## ;DELETE FILE JFCL ;INCASE OF ERRORS PUSHJ P,DVZAP.## ;GET RID OF DATA BLOCK SETZM LW.LS ;ZERO ALL PAGING INFO SETZM UW.LS SETZM HB.LS ;HERE TO ZERO AND REMOVE THE FIXUP AREA LNKZFX: MOVEI T1,FX.IX ;AREA# SKIPE TAB.LB(T1) ;SET UP? PUSHJ P,XX.ZAP## ;YES, DELETE WHOLE AREA MOVE T1,[FX.S1,,FX.S2] SETZM FX.S1 BLT T1,FXC.SS ;CLEAR ALL POINTERS ;HERE TO ADD GS TO BG AND ZERO GS LNKZBG: SKIPE BG.LB ;BOUND GLOBAL TABLE SET UP JRST LNKZGS ;YES SETOM BG.SCH ;WILL BE ALLOWED TO SEARCH THEM MOVEI T2,^D128 ;SETUP BRANCH TABLES PUSHJ P,DY.GET## HRLI T1,P1 ;PUT INDEX IN P1 FOR @ MOVEM T1,BRNTBL ;LINK # ,, REL ADDRESS MOVEI T2,^D128 PUSHJ P,DY.GET## HRLI T1,P1 ;PUT INDEX IN P1 FOR @ MOVEM T1,BRNADD ;LINK# ,, LOWEST ADDRESS MOVEI T2,^D128 PUSHJ P,DY.GET## HRLI T1,P1 ;PUT INDEX IN P1 FOR @ MOVEM T1,BRNDSK ;LENGTH ,, DSK BLOCK # MOVE T2,GS.PT ;LAST LOC USED SUB T2,GS.LB ;- FIRST = LENGTH MOVSM T2,(T1) ;STORE LENGTH MOVSI T1,-^D127 ;AOBJN WORD FOR NUMBER LEFT MOVEM T1,BRNLEN MOVE T1,GS.AB ;TOP IN ACTUAL USE CAML T1,GS.UB ;ANY FREE? JRST [MOVEI P1,GS.IX ;EASIEST WAY IS TO EXPAND MOVEI P2,.IPS ;BY ONE BLOCK PUSHJ P,LNKCOR## PUSHJ P,E$$MEF## ;[1174] MOVNI T1,.IPS ;NOW TAKE BACK EXTRA ADDM T1,GS.FR ;NO MORE FREE THAN BEFORE ADDB T1,GS.AB JRST .+1] ;AND CONTINUE MOVEM T1,BG.AB ;MOVE AREA MOVEM T1,BG.UB ; BY MOVING THE POINTERS MOVE T2,GS.LB MOVEM T2,BG.LB MOVE T2,GS.PT MOVEM T2,BG.PT ;POINT TO NEXT FREE MOVE T2,GS.FR MOVEM T2,BG.FR ;AND FREE SPACE IN IT ADDI T1,1 ;NEXT FREE WILL BE START OF NEW GS MOVEM T1,GS.LB JRST LNKZHT ;NOW SET UP HASH TABLES ETC. LNKZGS: MOVE T1,BG.UB ;SEE IF ENOUGH CORE SUB T1,BG.PT ADD T1,GS.UB ;IN GS +BG SUB T1,GS.PT CAIL T1,.IPS ;SO WE CAN MOVE AND ALLOCATE 1 BLOCK JRST LNKZG1 ;OK, NO PROBLEM MOVEI P1,BG.IX MOVEI P2,.IPS PUSHJ P,LNKCOR## ;EXPAND PUSHJ P,E$$MEF## ;[1174] TOO BAD MOVNI T1,.IPS ADDM T1,BG.AB ;DON'T REALLY WANT IT LNKZG1: MOVE P1,BRNLEN ;GET NO. OF LINKS IN BRANCH AOBJP P1,[HALT] MOVEM P1,BRNLEN ;ALL OK HRRZ P1,P1 ;INDEX ONLY CAMLE P1,BRNMAX ;DEEPEST YET? MOVEM P1,BRNMAX ;YES, STORE FOR LATER MOVE T2,BG.PT ;NEXT FREE LOC SUB T2,BG.LB ;REMOVE BASE HRL T2,CS+CS.NUM ;[1400] LINK # IN LEFT MOVEM T2,@BRNTBL HLLZ T3,T2 ;LINK# HRR T3,PH+PH.ADD ;[1400] STARTING ADDRESS MOVEM T3,@BRNADD ;IN CASE RELOCATABLE MOVE T3,GS.PT ;NOW FOR LENGTH OF NEW GLOBAL SUB T3,GS.LB ADDM T3,BG.PT ;ACCOUNT FOR IT MOVSM T3,@BRNDSK ADD T2,BG.LB ;PUT BACK BASE HRL T2,GS.LB ;FORM BLT PTR BLT T2,@BG.PT ;MOVE ALL WORDS HRRZ T1,BG.PT ;NOW CLEAN UP SETZM (T1) HRL T1,T1 ADDI T1,1 BLT T1,@GS.AB ;ALL OF GS AREA MOVE T1,BG.PT MOVE T2,T1 IORI T1,.IPM ;THIS IS TOP MOVEM T1,BG.AB MOVEM T1,BG.UB ;NO WASTED SPACE SUB T2,T1 ;SEE WHATS LEFT MOVMM T2,BG.FR ADDI T1,1 ;START OF GS MOVEM T1,GS.LB ;HERE TO SET UP HASH TABLE LNKZHT: IORI T1,.IPM ;MUST ALLOCATE 1 BLOCK MOVEM T1,GS.AB ;TO KEEP LNKCOR HAPPY ANDCMI T1,.IPM-1 ;PRE-ALLOCATE FIRST WORD HRLI T1,P2 ;USES P2 AS INDEX MOVEM T1,HT.PTR ;START OF NEW HASH TABLE MOVEI T2,I.PRM ;INITIAL HASH TABLE MOVEM T2,HT.PRM ; PRIME NUMBER HRRZI T1,I.PRM(T1) ;SEE IF ENOUGH SPACE FOR WHAT WE NEED CAMG T1,GS.UB ;WELL? JRST LNKZB1 SUB T1,GS.UB ;EXTRA WE NEED MOVEI P1,GS.IX MOVE P2,T1 PUSHJ P,LNKCOR## PUSHJ P,E$$MEF## ;[1174] FAILED LNKZB1: MOVE T1,GS.LB ;GET BASE SETOM (T1) ;MAKE NON-ZERO SO WE DON'T LOAD JOBDAT AGAIN ADDI T1,1+/.L*.L ;SPACE RESERVED FOR HASH TABLE MOVEM T1,GS.PT ;MAKE SURE CORRECT MOVE T2,T1 IORI T2,.IPM ;NOW RESET TO WHAT IT SHOULD BE MOVEM T2,GS.AB ;INCASE MORE THAN ONE BLOCK LONG SUB T1,T2 ;- WHATS FREE MOVNM T1,GS.FR ;IN GS BLOCK MOVEI T1,I.PRM*.HS%/^D100 ;INITIAL AMOUNT FREE MOVEM T1,HSPACE ;BEFORE WE REHASH MOVSI T1,(POINT 18,0) MOVEM T1,PRMPTR ;START HASH POINTER AT REL 0 SETZM GS.LNK ;NO FREE SPACE IN LINKED LISTS SETZM GS.FSP ;HERE TO INITIALIZE THE REST OF LOW CORE E$$ELN::.ERR. (MS,.EC,V%L,L%I6,S%I,ELN,) ;[1174] .ETC. (JMP,.EC,,,,.ETLNN##) ;[1174] .ETC. (BKL) ;[1174] BLANK LINE IN THE LOG FILE LNKZA: MOVEI R,1 ;POINT TO RELOC TABLE 1 MOVE R,@RC.TB MOVE T1,PH+PH.NFL ;[1400] NEXT FREE LOC MOVEM T1,PH+PH.ADD ;[1400] SET ORIGIN OF NEXT LINK MOVEM T1,RC.CV(R) ;SET AS NEW CURRENT VALUE MOVEM T1,RC.HL(R) ;[1152] AND AS NEW FIRST FREE PUSHJ P,Z.INEX## ;CLEAR INCLUDE/EXCLUDE STORAGE MOVSS INCPTR ;BOTH HALVES MOVSS EXCPTR PUSHJ P,Z.INEX## MOVE T1,[OV1.Z0,,OV1.Z0+1] SETZM OV1.Z0 ;CLEAR PASS1 DATA BLT T1,OV1.ZE MOVE T1,[CS+CS.NUM,,CS+CS.NUM+1] ;[1400] SETZM CS+CS.NUM ;[1400] BLT T1,CS+CS.LEN-1 ;[1400] SKIPN T1,LINKTB ;[660] .LINK TABLE SET UP? JRST LNKZA0 ;[660] NO SETZM LINKTB ;[660] YES, DELETE IT HRRZ T1,T1 ;[660] ADDRESS TO GIVE BACK ONLY MOVEI T2,LN.12 ;[660] LENGTH PUSHJ P,DY.RET## ;[660] RETURN THE BLOCK LNKZA0: SETZM %OWN ;[660] CANNOT LINK ALGOL OWN YET SETZM HL.S1 SETZM MNSEEN ;NO MAIN PROGRAMS SEEN YET SETZM MNTYPE ;SO DON'T KNOW LIBRARIES, CPU ETC. SETZM NOLIBS SETZM NAMPTR SETZM PRGNAM SETZM LSTGBL ;[2255] ZERO GLOBAL POINTER SETZM LSTLCL ;[2255] AND LOCAL POINTER ;CONTINUED ON NEXT PAGE ;FALL IN FROM PREVIOUS PAGE SETZM GOTO ;SO WE DON'T LOOP HLRS ARSIZE ;[635] RESET STICKY SIZE FOR ARL TABLE MOVEI T1,.SPL ;SET DEFAULT SPACE MOVEM T1,SPACE ;[635] FOR NON-ROOT LINKS AOS LSYM ;ALLOCATE FIRST WORD HLLZ T1,OVINEX ;SEE IF ANY INCLUDES TO SETUP JUMPE T1,LNKZA1 ;NO MOVEI T2,.EXC ;GET SPACE PUSHJ P,DY.GET## HRLZM T1,INCPTR ;SET IT UP HLLZ T2,OVINEX ;FROM HRR T2,T1 ;TO BLT T2,.EXC-1(T1) ;MOVE HRRZ T2,(T1) ;SEE IF MORE SKIPE T2 ;NO PUSHJ P,OVRINX ;YES LNKZA1: HRRZ T1,OVINEX ;SEE IF EXCLUDES JUMPE T1,LNKZA2 ;NO MOVEI T2,.EXC ;GET SPACE PUSHJ P,DY.GET## HRLZM T1,EXCPTR ;SET IT UP HRLZ T2,OVINEX ;FROM HRR T2,T1 ;TO BLT T2,.EXC-1(T1) ;MOVE HRRZ T2,(T1) ;GET NEXT SKIPE T2 ;IF NONE PUSHJ P,OVRINX ;OTHERWISE MOVE REST LNKZA2: MOVE T1,OVERLW ;GET OVERLAY SWITCHES SKIPN RT.LB ;ALREADY SETUP? TXNN T1,$OVRELOC ;NO, BUT DO WE NEED IT POPJ P, ;NO, RETURN TO EITHER LNKOV1 OR LNKOV2 MOVEI P1,RT.IX ;AREA WE WANT PJRST XX.INI## ;SET IT UP LNKTCK: SKIPE RT.LB ;RELOCATABLE? PUSHJ P,RT.P2## ;YES, SETUP BYTE PTR SUB P2,PH+PH.ADD ;[1400] REMOVE BASE ADDRESS INCASE ABS SUB P3,PH+PH.ADD ;[1400] ... SKIPE PAG.S1 ;PAGING? JRST LNKTC2 ;YES ADD P2,LC.LB ;RELOCATE CAMG P2,LC.AB ;FIT IN WHAT WE HAVE? JRST LNKTC1 ;YES SUB P2,LC.AB ;GET EXTRA REQUIRED MOVEI P1,LC.IX PUSHJ P,LNKCOR## JRST LNKTC2 ;MUST BE ON DSK NOW SUB P3,LW.S1 ;INCASE WE DUMPED CORE LNKTC1: ADD P3,LC.LB ;RELOCATE POPJ P, LNKTC2: PUSHJ P,PG.LSG## ;MAKE SURE IN CORE CAMLE P2,UW.LC ;[2262] HIGH ADDRESS IN WINDOW? PUSHJ P,E$$MEF ;[2262] NO, NOT ENOUGH MEMORY JRST LNKTC1 ;IS BY NOW SUBTTL DO OPEN & ENTER FOR OV FILE OC.OPN: MOVEI T1,%OC ;[1230] NOW THAT ROOT IS DONE, FIND OUT MOVEM T1,IO.CHN ;[1230] WHAT TO CALL THE OVERLAY FILE PUSHJ P,DVNAM.## ;[1230] .. MOVEI T2,LN.IO ;[1230] GET SPACE FOR OVERFLOW SPEC'S PUSHJ P,DY.GET## ;[1230] BLOCK MOVEM T1,IO.PTR+OC ;[1230] SAVE ITS ADDRESS FOR LATER MOVE T2,T1 ;[1230] POINTER TO OVERFLOW BLOCK IN T2 MOVE T1,IO.PTR+%OC ;[1230] POINTER TO USER'S BLOCK IN T1 MOVEI T3,.IODPR ;[1230] SET UP OVERFLOW BLOCK WITH MOVEM T3,I.MOD(T2) ;[1230] PROPER DATA--FIRST, DATA MODE MOVEI T3,LN.RIB-1 ;[1230] SIZE OF EXTENDED RIB MOVEM T3,I.RIB+.RBCNT(T2) ;[1230] .. MOVE T3,JOBNUM ;[1230] FILE NAME nnnOVL HRRI T3,'OVL' ;[1230] .. MOVEM T3,I.RIB+.RBNAM(T2) ;[1230] .. MOVSI T3,'TMP' ;[1230] EXTENSION .TMP MOVEM T3,I.RIB+.RBEXT(T2) ;[1230] .. MOVX T3, ;[1230] HIGH PROT FOR OVERFLOW FILES MOVEM T3,I.RIB+.RBPRV(T2) ;[1230] .. SKIPN T3,I.RIB+.RBEST(T1) ;[1230] USE USER'S ESTIMATE MOVEI T3,1000 ;[1230] OR LARGE DEFAULT (REAL PROGS MOVEM T3,I.RIB+.RBEST(T2) ;[1230] ARE BIG) MOVEI T1,%OC ;[1230] CHANNEL OF USER'S OVERLAY FILE MOVEI T2,OC ;[1230] CHANNEL OF LINK'S OVERFLOW FILE PUSHJ P,DVSUP.## ;[1230] PUT OVERFLOW FILE IN RIGHT PLACE JRST E$$EOV ;[1230] FAILED POPJ P, ;[1230] DONE E$$EOV::PUSH P,[OC] ;[1230] TELL ERROR ROUTINE CHANNEL NUMBER .ERR. (LRE,.EC,V%L,L%F,S%F,EOV,) ;[1174] SUBTTL SWITCH ACTION -- /NODE:name %NODE:: %RESET:: PUSHJ P,.SAVE4## SKIPN LINKSEEN ;PREVIOUS SEGMENT COMPLETED? PUSHJ P,[PUSHJ P,.SAVE4## ;WILL NEED P2 MOVE P2,LNKMAX ;OVERLAY COUNT ADDI P2,1 ;OVERLAY NUMBER E$$LSM::.ERR. (MS,.EC,V%L,L%W,S%W,LSM,) ;[1174] .ETC. (DEC,.EC!.EP,,,,P2) ;LINK NUM .ETC. (STR,,,,,,< -- assumed>) PUSHJ P,SYSLB1## ;SEARCH LIBRARIES SETZM LNKNAM ;/LINK: PJRST LINKGT] ;FORCE /LINK SETZM LINKSEEN ;STARTING NEW SEGMENT MOVE T2,2(P2) ;RESTORE /NODE VALUE TLNN T2,-1 ;TEST FOR NAME JRST RSTA ;CERTAINLY NOT TLC T2,-1 ;BUT MIGHT BE NEGATIVE NO. TLCE T2,-1 JRST RSTL ;NO, ITS A NAME RSTA: CAMN T2,LNKMAX ;TEST FOR TRIVIAL CASE POPJ P, ;IT WAS, LEAVE AS IS CAMLE T2,LNKMAX ;IS IT IN RANGE? JRST E$$LNL ;[1174] NO MOVEM T2,CS+CS.NUM ;[1400] NO, STORE SO WE KNOW WHO TO LINK TO MOVE P2,T2 ;SAFER PLACE FOR LINK# JUMPE P2,RESET0 ;RESET TO ROOT IS SPECIAL JUMPL P2,RSTN ;STILL A NEGATIVE NO.? MOVS T1,LSTPTR ;SEE IF SPECIAL CASE MOVE T2,(T1) ;OF WANTING PENULTIMATE LINK CAIE P2,(T2) JRST RST2 ;NO, GENERAL CASE ;HERE ON A /NODE TO THE ROOT LINK. RSTB: HLL T1,(T1) ;FORM AOBJN PTR ADD T1,[2,,2] ;BYPASS LINK# AND BACK PTR SKIPN (T1) ;BLANK? JRST RST1 ;YES AOBJN T1,.-2 HLRZ T1,LSTPTR ;GET NODE BLOCK HLRE T2,(T1) ;GET LENGTH MOVM T2,T2 ADDI T2,1 ;MAKE ONE MORE PUSHJ P,DY.GET## HLLZ T3,LSTPTR ;FROM HRR T3,T1 ;TO, BLT PTR MOVN T4,T2 ;- LENGTH HLL T2,LSTPTR ;SAVE START OF OLD BLOCK HRLM T1,LSTPTR ADDI T1,-2(T2) ;END OF BLT BLT T3,(T1) ;MOVE DATA HRRM T1,LSTPTR ;RESET LAST POINTER SUBI T1,-2(T2) ;BACKUP HRLM T4,(T1) ;SET NEW COUNT HLRZ T1,T2 ;OLD ORIGIN HRRZI T2,-1(T2) ;OLD BLOCK SIZE PUSHJ P,DY.RET## HLRZ T1,LSTPTR ;GET NEW BLOCK AGAIN HRRZ T2,(T1) ;THIS LINK# SKIPN T3,1(T1) ;BACK POINTER JRST [MOVEM T1,FSTPTR ;MUST BE LINK# 0 JRST RSTBB] MOVS T4,2(T3) ;GET LINK# CAIE T2,(T4) ;ONE WE WANT AOJA T3,.-2 ;MUST BE THERE HRRM T1,2(T3) ;MAKE IT POINT TO NEW BLOCK RSTBB: MOVEI T3,2(T1) ;NOW LOOK AT POSSIBLE FORWARD PTRS RSTC: SKIPN T2,(T3) ;GET POINTER JRST RST1 ;ALL DONE TRNE T2,-1 ;FORWARD PTR? HRRM T1,1(T2) ;YES AOJA T3,RSTC ;THIS CASE IS SPECIAL IN THAT ALL THAT HAS TO BE DONE IS TO DELETE ;THE LAST LINK STORED AND ADJUST THE POINTERS ACCORDINGLY RST1: AOS LSTPTR ;MAKE ROOM IN CURRENT BLOCK RST1A: HRRZ P1,BRNLEN ;GET POINTER TO LAST LINK STORED PUSHJ P,CHKBRN ;SEE IF LINK AS AT TOP OF TABLE JRST RST1C ;ON DSK SO NOTHING TO DO RST1B: SETZM (T1) ;ZERO FIRST WORD HRLZ T2,T1 HRRI T2,1(T1) ;BLT PTR BLT T2,@BG.AB ;DELETE ALL AREA MOVEM T1,BG.PT ;NEW TOP OF AREA USED IORI T1,.IPM ;PUT ON BLOCK BOUND MOVEM T1,BG.AB ;MAKE NEW TOP MOVEM T1,BG.UB ADDI T1,1 ;NEW START OF GS AREA HRLZ T2,GS.LB HRR T2,T1 ;BLT PTR SUB T1,GS.LB ;- DIFF JUMPE T1,RST1C ;SHOULD NOT HAPPEN ADDM T1,GS.LB ;FIXUP PTR ADDM T1,GS.AB ADDM T1,GS.PT ADDM T1,HT.PTR BLT T2,@GS.AB ;MOVE AREA DOWN MOVM T1,T1 ;+ DIFF ADD T1,GS.AB ;GET OLD END AGAIN HRRZ T2,GS.AB HRLI T2,1(T2) HRRI T2,2(T2) ;BLT PTR SETZM -1(T2) BLT T2,(T1) ;CLEAR ALL OF AREA LEFT RST1C: MOVE T1,BRNLEN ;GET OLD LENGTH HRRZ P1,T1 ;INDEX INTO BRANCH TABLES SETZM @BRNTBL ;AVIODS CONFUSION SETZM @BRNDSK SETZM @BRNADD SUB T1,[1,,1] ;BACKUP MOVEM T1,BRNLEN ;AND RESET IT MOVE P1,CS+CS.NUM ;[1400] GET NUMBER WE WANT JRST RST06 ;AND READ IN THE PREAMBLE ;HERE TO RESET TO SOME LINK ON THE CURRENT PATH ;THE LINKS ABOVE THE REQUIRED ONE MUST BE DELETED ;AND ALL POINTERS ADJUSTED RST2: PUSHJ P,DLTDSK ;DELETE POSSIBLE DSK FILE PUSHJ P,MRKLNK ;MARK IT AS REQUIRED JRST RST3 ;NOT IN BRANCH PUSHJ P,.SAVE2## ;NEED P2 MOVS P1,LSTPTR ;WALK BACKWARDS THROUGH TREE HRRZ T1,(P1) ;GET LINK# MOVE P1,1(P1) ;AND NEXT PTR CAME P2,T1 ;BACK TO ONE WE WANT? JRST .-3 ;NOT YET RST2A: HRRZ P2,(P1) ;LINK# PUSHJ P,MRKLNK ;WE NEED THIS ONE PUSHJ P,E$$LNM## ;[1174] MUST BE IN MEMORY MOVE P1,1(P1) ;GET PREVIOUS JUMPN P2,RST2A ;END AT 0 PUSHJ P,ADJBRN ;NOW REMOVE WHATS NOT NEEDED RST2B: PUSHJ P,BKPBRN ;DELETE AREA AND BACKUP BRNTBL SUBI P1,1 CAME P1,P2 ;DONE THEM ALL YET? JRST RST2B ;NO, LOOP HLRZ P2,@BRNTBL ;GET LINK# WE REALLY WANTED MOVS T1,LSTPTR ;GET NODE PTR HRRZ T2,(T1) ;GET NUMBER CAMN T2,P2 ;WHAT WE WANTED? JRST RST2D ;YES HLL T1,(T1) ;AOBJN ADD T1,[2,,2] ;BYPASS HEADER & BACK PTR MOVS T2,(T1) ;GET LINK# CAIN P2,(T2) ;ONE WE WANTED? JRST .+3 AOBJN T1,.-3 ;NOT YET PUSHJ P,E$$LNM## ;[1174] MUST BE IN MEMORY TLNN T2,-1 ;FORWARD PTR? JRST RST2D ;NO? MOVS T2,T2 ;GET PTR HRLM T2,LSTPTR ;POINT TO NEW HLL T2,(T2) ;AOBJN PTR ADD T2,[2,,2] ;BYPASS LINK# AND BACK PTR SKIPE (T2) ;LOOK FOR BLANK AOBJN T2,.-1 ;OR END OF LIST SUBI T2,1 ;BACKUP 1 TO POINT TO LAST USED HRRM T2,LSTPTR RST2D: MOVE T1,[1,,1] ;FAKE OUT BRNLEN ADDM T1,BRNLEN ;SO WE CAN REMOVE NON-EXISTENT TOP MOVS T1,LSTPTR JRST RSTB ;YES, NOW MOVE GS DOWN ;HERE TO RESET TO SOME LINK NOT ON THE CURRENT PATH ;ALL THE LINKS NOT REQUIRED MUST BE DELETED ;THEN ALL OTHER LINKS ON THE PATH READ IN RST3: MOVE P1,P2 ;WE WANTED THIS LINK PUSHJ P,TR.WLK## ;FIND NODE HLRZ T1,P1 ;GET ADDRESS OF START OF NODE HRRZ T2,(T1) ;GET LINK# CAIN T2,(P1) ;ONE WE WANTED? JRST RST3A ;YES, AS EXPECTED MOVEI T2,4 ;NO, MUST BE A NEW NODE PUSHJ P,DY.GET## ;SO GET SPACE FOR IT HRRZ T2,P1 ;LINK # HRLI T2,-4 ;LENGTH MOVEM T2,(T1) ;HEADER WORD HLRZM P1,1(T1) ;BACK POINTER HRLI T1,1(T1) ;MAKE LSTPTR MOVSM T1,LSTPTR HLRZ T2,P1 ;NOW LOOK BACK TO FIND FATHER HLRZ T3,2(T2) CAIE T3,(P1) ;MATCHING ONE WE WANT? AOJA T2,.-2 ;MUST BE THERE HRRM T1,2(T2) ;POINT TO IT JRST RST3B ;NOW CONTINUE RST3A: HRLM T1,LSTPTR ;START OF NODE ADD T1,[2,,2] ;BYPASS LINK# AND BACK PTR HLL T1,(T1) ;FORM AOBJN PTR SKIPN (T1) ;LOOK FOR BLANK JRST .+3 AOBJN T1,.-2 ;OR END OF LIST SUBI T1,1 ;END SO BACKUP TO LAST HRRM T1,LSTPTR ;LSTPTR IS NOW POINTING TO NODE WE WANT RST3B: MOVS P1,LSTPTR PUSH P,P2 ;DEPTH WE FINALLY WANT CAIA RST3C: MOVE P1,1(P1) ;GET BACK PTR HRRZ P2,(P1) ;GET LINK # PUSHJ P,MRKLNK ;MARK AS REQUIRED JFCL ;TOO BAD, WILL HAVE TO READ IT IN LATER JUMPN P2,RST3C ;FINISH ON 0 PUSHJ P,ADJBRN ;REMOVE WHATS NOT NEEDED RST3D: CAMN P1,P2 ;NOTHING TO REMOVE? JRST RST3E PUSHJ P,DLTBRN ;REMOVE SYMBOL TABLE SOJA P1,RST3D ;SEE IF DONE ;HERE WHEN ALL OLD SYMBOL TABLES DELETED. READ IN NEW ONES. RST3E: POP P,P2 ;RECOVER DEPTH MOVE T1,BRNLEN ;DEPTH WE NOW HAVE SUBI P2,(T1) ;DIFFERENCE HRL P2,P2 ;IN BOTH HALVES ADDB P2,BRNLEN ;MAKE IT WHAT WE WANT HRRZS P1,P2 HLRZ T1,LSTPTR ;START OF BACK PATH RST3F: HRRZ T2,(T1) ;GET LINK# SKIPE @BRNDSK ;IF 0 THEN ITS NOT YET SETUP JRST RST3G ;ALL DONE HRLZM T2,@BRNTBL ;STORE # WE NEED MOVE T1,1(T1) ;GET NEXT PTR SOJG P1,RST3F ;LINK# IS ALWAYS IN CORE ;HERE TO READ IN ALL REQUIRED SYMBOL TABLES RST3G: MOVNI P2,1(P2) HRLZ P2,P2 ;FORM AOBJN WORD RST3H: HRRZ P1,P2 ;INDEX FOR TABLE LOOKUPS SKIPE @BRNDSK ;SEE IF ALREADY SET AOBJN P2,.-2 ;WILL EVENTUALLY SKIP HLRZ P1,@BRNTBL ;GET LINK# ROT P1,-1 ;USUAL METHOD TO PICK CORRECT HALF JUMPL P1,[HRRZ T1,@LNKTBL JRST .+2] HLRZ T1,@LNKTBL ;FOR USETI TO GET PREAMBLE USETI OC,(T1) ;SET ON BLOCK DMOVE T1,PHIOWD IN OC,T1 ;READ IT IN CAIA ;OK PUSHJ P,E$$IOV## ;[1174] INPUT ERROR HRRZ P1,P2 ;INDEX INTO BRANCH TABLES HRRZ T1,PH+PH.ADD ;[1400] LOWER ADDRESS HLL T1,@BRNTBL ;LINK # MOVEM T1,@BRNADD ;INCASE RELOCATED RST3I: MOVE T1,PH+PH.GLB ;[1400] POINTER TO GLOBAL SYMBOLS HLRE T2,T1 ;WORD COUNT (FROM IOWD) MOVM T2,T2 ADD T2,BG.PT ;TOP WE NEED CAMG T2,BG.AB ;IS THERE ENOUGH? JRST RST3J ;YES SUB T2,BG.AB ;EXCESS PUSH P,P2 ;SAVE AOBJN COUNTER MOVEI P1,BG.IX MOVE P2,T2 ;WHAT WE NEED PUSHJ P,LNKCOR## PUSHJ P,E$$MEF## ;[1174] POP P,P2 JRST RST3I ;TRY AGAIN ;HERE WHEN ENOUGH ROOM. READ IN REQUIRED GLOBAL TABLE. RST3J: USETI OC,(T1) ;SET ON BLOCK HRR T1,BG.PT ;IOWD (ALMOST) HRRI T1,-1(T1) SETZ T2, IN OC,T1 ;READ IN GLOBAL TABLE CAIA PUSHJ P,E$$IOV## ;[1174] INPUT ERROR HRRZ P1,P2 ;TO HOLD BRN DEPTH HRRZI T2,1(T1) ;GET LOWER ADDRESS BACK SUB T2,BG.LB ;MAKE RELATIVE HRRM T2,@BRNTBL ;START OF SYMBOL AREA HLRE T2,T1 ;- LENGTH MOVM T2,T2 HRLM T2,@BRNDSK ;STORE LENGTH ADDM T2,BG.PT ;ACCOUNT FOR AREA AOBJN P2,RST3H ;GET NEXT JRST RST2D ;NOW CORRECT PTRS RSTN0: PUSHJ P,BKPBRN ;BACKUP ONE LINK AOS P2,CS+CS.NUM ;[1400] GET ITS FATHER ; JRST RSTN ;AND SEE IF ALL DONE RSTN: MOVN T1,LNKMAX ;CHECK FOR INRANGE LINK CAMGE P2,T1 ;NODE REQUESTED BEFORE ROOT? JRST E$$NBR ;[1174] YES - ERROR MOVS T1,LSTPTR ;MUST BACKUP BY ONE LEVEL CAME P2,[-1] ;BACK TO LAST YET? JRST RSTN0 ;NO, KEEP TRYING HRRZ P2,(T1) ;GET LINK# MOVEM P2,CS+CS.NUM ;[1400] SET IT JUMPE P2,RESET0 ;ROOT IS SPECIAL JRST RST2 ;DO IT RSTL: MOVS T1,LNMPTR ;GET POINTER JUMPE T1,E$$LNN ;[1174] ERROR RSTLA: CAMN T2,(T1) ;IS THIS IT JRST RSTLF ;YES HRRZ T1,1(T1) ;GET FORWARD PTR JUMPN T1,RSTLA ;TRY AGAIN E$$LNN::.ERR. (MS,.EC,V%L,L%W,S%W,LNN,) ;[1174] .ETC. (SBX,.EC!.EP,,,,T2) .ETC. (STR,,,,,,< not assigned>) POPJ P, E$$LNL::.ERR. (MS,.EC,V%L,L%W,S%W,LNL,) ;[1174] .ETC. (DEC,.EC!.EP,,,,T2) .ETC. (STR,,,,,,< not loaded>) POPJ P, RSTLF: HLRZ T2,1(T1) ;GET NUMBER JRST RSTA ;AND RETURN E$$NBR::.ERR. (MS,,V%L,L%F,S%F,NBR,) ;[1174] ;HERE IF RESET IS ALL THE WAY BACK TO THE ROOT RESET0: MOVE T1,FSTPTR HLL T1,(T1) ;FORM AOBJN ADD T1,[2,,2] ;BYPASS LINK# AND BACK PTR SKIPN (T1) ;LOOK FOR NULL IN CURRENT BLOCK JRST RST0A ;FOUND IT AOBJN T1,.-2 HLRE T2,@FSTPTR ;GET LENGTH MOVM T2,T2 ADDI T2,1 ;MAKE ONE MORE PUSHJ P,DY.GET## HRLZ T3,FSTPTR ;FROM HRR T3,T1 ;TO, BLT PTR MOVN T4,T2 ;- LENGTH ADDI T1,-2(T2) ;END OF BLT BLT T3,(T1) ;MOVE DATA SUBI T1,-2(T2) ;BACKUP HRLM T4,(T1) ;SET NEW COUNT EXCH T1,FSTPTR ;EXCH OLD WITH NEW HRRZI T2,-1(T2) ;OLD BLOCK SIZE PUSHJ P,DY.RET## HRRZ T3,FSTPTR ;GET NEW BLOCK AGAIN MOVEI T1,2(T3) ;NOW LOOK AT POSSIBLE FORWARD PTRS RST0C: SKIPN T2,(T1) ;GET POINTER JRST RST0A ;ALL DONE TRNE T2,-1 ;FORWARD PTR? HRRM T3,1(T2) ;YES AOJA T1,RST0C RST0A: HRL T1,FSTPTR MOVEM T1,LSTPTR ;RESET TREE PTR PUSHJ P,DLTDSK ;DELETE DSK FILE, MARK LINKS NOT IN CORE HRRZ P1,BRNLEN ;NO. OF LINKS TO SCAN RST01: HLRZ T2,@BRNTBL ;GET LINK # JUMPE T2,RST02 ;FOUND IT SETZM @BRNTBL ;ZERO THE TABLE SLOTS SETZM @BRNDSK SETZM @BRNADD SOJGE P1,RST01 ;LOOP PUSHJ P,E$$LNM## ;[1174] MUST BE IN MEMORY RST02: HRRZ T1,@BRNTBL ;GET ORIGIN OF TABLE JUMPE T1,RST03 ;ALREADY AT BOTTOM HRLZ T2,T1 HRR T2,BG.LB ;BLT PTR HLRZ T3,@BRNDSK ;GET LENGTH OF THIS TABLE ADDB T1,T3 ;NEXT FREE WORD MOVEM T1,BG.PT ;RESET NEXT FREE PTR BLT T2,-1(T2) ;MOVE DOWN JRST RST04 ;NOW ZERO THE REST AND GIVE IT AWAY RST03: HLRZ T3,@BRNDSK ;GET LENGTH ADD T3,BG.LB ;+ BASE MOVEM T3,BG.PT ;NEW PTR TO NEXT FREE RST04: HRLZ T1,T3 HRRI T1,1(T3) ;BLT PTR SETZM -1(T1) ;[664] CLEAR CORE BLT T1,@BG.AB ;BEFORE WE GIVE IT AWAY MOVE T1,T3 IORI T1,.IPM MOVEM T1,BG.AB ;HIGHEST IN ACTUAL USE SUBM T1,T3 ;GET FREE SPACE MOVEM T3,BG.FR ;NO. OF WORDS FREE IN LAST BLOCK CAML T1,BG.UB ;JUST INCASE NOTHING TO GIVE AWAY JRST RST05 ;NOT VERY LIKELY! MOVEM T1,BG.UB AOS T3,T1 ;WHERE IT WILL GO HRL T1,GS.LB ;FROM SUB T3,GS.LB ;- NEGATIVE DIFF ADDM T3,GS.LB ;FIXUP ALL GS PTR ADDM T3,GS.PT ADDM T3,HT.PTR MOVE T2,GS.PT ;NEXT FREE HRLI T2,1(T2) ;BLT PTR (SWAPPED) BLT T1,-1(T2) ;MOVE DOWN SETZM (T2) ;CLEAR REST MOVS T2,T2 ;PUT BLT PTR RIGHT WAY ROUND BLT T2,@GS.AB ;CLEAR CORE ADDM T3,GS.AB ;SET LOWER RST05: MOVE T1,BRNLEN ;GET AOBJN POINTER HRLS T2,BRNLEN ;PUTINDEX IN BOTH SIDES SUB T1,T2 ;GET ORIGINAL PTR HLLZM T1,BRNLEN ;ONLY LINK 0 IN TABLE SETZ P1, ;INDEX FOR LINK # 0 RST06: ROT P1,-1 ;CUT IN HALF JUMPL P1,[HRRZ T1,@LNKTBL JRST .+2] HLRZ T1,@LNKTBL ;GET BLOCK USETI OC,(T1) ;OF PREAMBLE DMOVE T1,PHIOWD IN OC,T1 PJRST LNKZA ;NOW ZERO WHAT WE DON'T NEED PUSHJ P,E$$IOV## ;[1174] INPUT ERROR SUBTTL COMMON SUBROUTINES ;CHKBRN - CHECKS TO SEE IF LINK IS AT TOP OF BG AREA ;IF NOT IT MOVES ALL LINKS ABOVE DOWN AND PUTS ADDRESS OF ;THIS LINK AT TOP. NOTE ACTUAL LINK IS NOT MOVED UP. ;IF LINK IS ON DSK NOTHING IS DONE ;ENTERS WITH ; P1 CONTAINS DEPTH IN BRANCH OF REQUIRED LINK # ;RETURNS ;+1 LINK IS ON DSK ;+2 LINK IS NOW AT TOP OF BG CHKBRN: HRRZ T1,@BRNTBL ;GET ITS ADDRESS ADD T1,BG.LB ;FIX IT MOVS T2,@BRNDSK ;GET LENGTH SKIPE T2 ;DOES NOT REALLY EXIST IF 0 TLNE T2,-1 ;IS CURRENTLY ON DSK POPJ P, ;JUST BACKUP PTR ADD T2,T1 ;GET END CAMN T2,BG.PT ;MAKE SURE ITS THE LAST ITEM JRST CPOPJ1 ;YES, SIMPLE CASE HRL T1,T2 MOVS T1,T1 ;FORM BLT PTR HRRZ T3,T2 ;ALL AT OR ABOVE THIS ADDRESS MUST BE ADJUSTED SUB T2,BG.LB MOVN T2,T2 ;- NO. OF WORDS TO REMOVE ADD T2,BG.PT ;TOP OF SYMBOLS LEFT HRRM T2,@BRNTBL ;SO POINT TO WHERE IT WOULD BE MOVED TO BLT T1,(T2) ;MOVE REQUIRED SYMBOLS DOWN SUB T2,BG.PT ;GET - COUNT BACK PUSH P,P1 SUBI P1,1 ;NOW FIXUP POINTERS HRRZ T1,@BRNTBL ;GET POINTER CAIL T3,(T1) ;NEED TO ADJUST? ADDM T2,@BRNTBL ;YES SOJGE P1,.-3 POP P,P1 JRST CHKBRN ;NOW TRY MRKLNK: PUSHJ P,.SAVE1## HRRZ P1,BRNLEN ;NO. OF LINKS TO SCAN MRKLN1: HLRZ T1,@BRNTBL ;GET LINK# CAMN T1,P2 ;ONE WE WANT JRST MRKLN2 ;FOUND IT SOJGE P1,MRKLN1 ;NO POPJ P, ;NOT IN BRANCH MRKLN2: HLLOS @BRNDSK ;MARK BY -1 IN RIGHT HALF JRST CPOPJ1 ;FOUND IT DLTDSK: PUSHJ P,.SAVE1## ;NEED P1 HRRZ P1,BRNLEN ;NO. OF LINKS IN BRANCH HLLZS @BRNDSK ;ZERO RH MEANS NOT NEEDED YET SOJGE P1,.-1 POPJ P, ADJBRN: HRRZ T4,BRNLEN ;MAX NO. WE HAVE SETZ P1, ;START AT ZERO SETO P2, ;SAFE SINCE LINK# 0 IS ALWAYS WANTED ADJBR1: MOVE T1,@BRNDSK TRNN T1,-1 ;DO WE NEED IT? JRST ADJBR2 ;NO, SEE IF ALL DONE ADDI P2,1 ;INCRENENT SINCE WE NEED TO STORE THIS ONE MOVE T2,@BRNTBL ;GET ADDRESS AND NUMBER MOVE T3,@BRNADD ;LINK # AND LOWER BOUND EXCH P1,P2 ;SWAP PTRS HLLZM T1,@BRNDSK MOVEM T2,@BRNTBL ;MOVE BACK MOVEM T3,@BRNADD EXCH P1,P2 ADJBR2: CAMGE P1,T4 ;DONE THEM ALL? AOJA P1,ADJBR1 ;NOT YET POPJ P, BKPBRN: MOVS T1,LSTPTR HRRZ T2,(T1) ;GET FATHER LINK SKIPN T1,1(T1) ;BACK POINTER JRST E$$NBR ;[1174] ERROR HRLM T1,LSTPTR ;BACK UP HLL T1,(T1) ;FORM AOBJN POINTER ADD T1,[2,,2] ;BYPASS LINK# AND BACK PTR SKIPN (T1) ;BLANK YET? JRST BKPB1 ;YES AOBJN T1,.-2 SUBI T1,1 ;NO SPACE, SO BACKUP BKPB1: HRRM T1,LSTPTR ;RESET NOW ; JRST DLTBRN DLTBRN: HRRZ P1,BRNLEN ;GET DEPTH IN BRANCH PUSHJ P,CHKBRN ;MAKE SURE ITS AT TOP JFCL ;OK IF ON DSK HLRZ T1,@BRNDSK ;GET LENGTH MOVN T1,T1 ADDM T1,BG.PT ;AND BACK UP MOVE T1,BRNLEN ;ONE LESS BRANCH IN CORE SUB T1,[1,,1] ;SO BACKUP MOVEM T1,BRNLEN SETZM @BRNTBL ;AVOIDS CONFUSION SETZM @BRNDSK SETZM @BRNADD JUMPL T1,CPOPJ ;STILL VALID POINTER PUSHJ P,E$$LNM## ;[1174] MUST BE IN MEMORY SUBTTL SEARCH BOUND GLOBALS TRY.BG::SPUSH ;SAVE HASH ACCS SPUSH ;GS PARAMETERS .JDDT LNKOV1,TRY.BG,<> SETZM HSPACE ;PREVENT REHASHING HRRZ T1,BRNLEN ; NO. OF BOUND GLOBAL TABLES MOVEM T1,BG.SCH ;SAFE PLACE TO PUT IT TRYBG1: ;START AT LINK 0 AND READ IN ASCENDING ORDER ; SINCE MOST GLOBALS WILL BE IN ROOT HRRZ T1,BRNLEN ;TOTAL SUB T1,BG.SCH ;MINUS WHATS LEFT GIVES INDEX ADD T1,BRNTBL ;INDEX INTO TABLE SKIPN T2,(T1) ;GET LINK #,,ADDRESS JRST .+3 ;LINK 0 IS ALWAYS IN CORE TRNN T2,-1 ;ON DSK? PUSHJ P,E$$LNM## ;[1174] MUST BE IN MEMORY ADD T2,BG.LB ;ADD IN BASE HRRZM T2,NAMLOC ;WHERE IT IS MOVE T1,(T2) ;FIRST WORD IS SPECIAL HLRZM T1,HT.PRM ;CONTAINS HASH SIZE ADDI T2,(T1) ;ADD OFFSET FOR HASH TABLE HRRM T2,HT.PTR PUSHJ P,TRYSYM## ;TRY AGAIN JRST TRYBG3 ;FAILED JRST TRYBG3 ;ALSO FAILED SPOP MOVE P4,P1 ;SAVE POINTER TO THIS SYMBOL MOVE W1,0(P1) ;GET FLAGS TXO W1,PS.BGS ;TURN ON BOUND BIT TXZ W1,PS.ENT ;MAKE SURE ENTRY FLAG OFF IN COPY ; ALSO NOT RELOC WRT THIS LINK SPOP ;PREV VALUES PUSH P,W3 ;SAVE CURRENT VALUE (REQUEST CHAIN) MOVE W3,2(P4) ;GET BOUND VALUE HRRZ T1,BRNLEN ;NO. OF POSSIBLE LINKS SUB T1,BG.SCH ;CURRENT INDEX TXZN W1,PS.REL ;IS THE SYMBOL RELOCATABLE JRST .+3 ;NO, SO NO RELOC PROBLEM SKIPE RT.LB ;LINK RELOCATABLE? JUMPN T1,TRYBG4 ;YES, UNLESS LINK 0 TXNN W1,PT.EXT ;IS IT EXTENDED? JRST TRYBG2 ;NO EXCH P1,P4 ;PTR BACK IN P1 PUSHJ P,SY.CHK## ;SEE HOW LONG SUB P1,BG.LB ;IN CASE CORE MOVES PUSHJ P,GS.GET## ;GET SPACE ADDI T2,-1(T1) ;END OF BLT ADD P1,BG.LB MOVE W3,T1 ;SYMBOL LOCATION HRL T1,P1 ;BLT PTR BLT T1,(T2) ;COPY SYMBOL MOVEM W1,0(W3) ;RESET POSSIBLE CHANGED VALUE OF FLAGS SUB W3,GS.LB ;RELATIVE EXCH P1,P4 ;RESTORE P1 TRYBG2: PUSH P,LSTGBL ;[2255] SAVE GLOBAL PTR IN CASE PART OF FIXUP PUSH P,LSTLCL ;[2255] SAVE LOCAL POINTER TOO PUSHJ P,INSRT## ;PUT IN CURRENT TABLE POP P,LSTLCL ;[2255] RESTORE POINTERS POP P,LSTGBL ;[2255] THIS SYMBOL ALREADY EXISTS SOS GSYM ;NOT REALLY A NEW GLOBAL SO REDUCE COUNT AOS BSYM ;INCREASE COUNT FROM BOUND TABLES POP P,W3 ;GET REQUEST CHAIN BACK HRRZ P1,@HT.PTR ;GET REL ADDRESS OF SYMBOL ADD P1,NAMLOC ;MAKE ABS SETOM BG.SCH ;PUT BACK NORMAL VALUE HRRZ R,R ;NOT RELOCATABLE WITH RESPECT TO THIS LINK CPOPJ2: AOS (P) CPOPJ1: AOS (P) CPOPJ: POPJ P, TRYBG3: SOSL T1,BG.SCH ;MORE TO LOOK AT? JRST TRYBG1 ;YES SPOP ;PUT THINGS BACK SPOP SETOM BG.SCH ;AS IT WAS POPJ P, ;NOT FOUND RETURN TRYBG4: TXO W1,PS.RBG ;TURN ON REL BOUND GLOBAL EXCH P1,P4 ;GET POINTER BACK PUSHJ P,SY.CHK## ;SEE HOW LONG SUB P1,BG.LB ;IN CASE CORE MOVES ADDI T2,.L ;NEED EXTRA BLOCK PUSHJ P,GS.GET## ;GET SPACE FOR COPY ADDI T2,-<1+.L>(T1) ;END OF BLT ADD P1,BG.LB MOVE W3,T1 ;SYMBOL LOCATION HRL T1,P1 ;FORM BLT PTR BLT T1,(T2) ;MOVE IT MOVEM W1,0(W3) ;SET NEW FLAGS MOVX T1,PT.EXT ;MUST BE EXTENDED BY NOW IORM T1,(W3) ;SET BIT SUB W3,GS.LB ;RELATIVE MOVX T1,S.LST ;CLEAR LAST TRIPLET BIT IF SET TXOE W1,PT.EXT ;SET AS EXTENDED ANDCAM T1,-.L+1(T2) ;IT WAS MOVX T1,S.SYM!S.LST!S.RBG MOVEM T1,1(T2) ;STORE NEW TRIPLET MOVEM W2,2(T2) ;STORE NAME FOR NOW HRRZ T1,BRNLEN ;GET POSSIBLE MAX INDEX SUB T1,BG.SCH ;GET INDEX INTO TABLE ADD T1,BRNTBL ;PLUS BASE HLRZ T1,(T1) ;LINK# MOVEM T1,3(T2) ;CRUCIAL ITEM IN THIS TRIPLET JRST TRYBG2 ;PUT IN TABLE ;**;[2053] Insert after TRYBG4+26 Lines PY 8-Nov-83 SUBTTL Argument check the BG area [2053] TYP.BG::SKIPL BG.SCH ;[2053] Any bound globals we can look at? POPJ P, ;[2053] No, return SPUSH ;[2053] GS Parameters SETOM ARGOVL ;[2053] Remember that BG area is being checked .JDDT LNKOV1,TYP.BG,<> ;[2053] SETZM HSPACE ;[2053] Prevent rehashing HRRZ T1,BRNLEN ;[2053] No. of bound global tables MOVEM T1,BG.SCH ;[2053] Safe place to put it PUSH P,W3 ;[2053] Save the arg block pointer TYPBG1: ;[2053] Start at link 0 so typout will ;[2053] be in correct order HRRZ T1,BRNLEN ;[2053] Total SUB T1,BG.SCH ;[2053] Minus whats left gives index ADD T1,BRNTBL ;[2053] Index into table SKIPN T2,(T1) ;[2053] Get LINK #,,ADDRESS JRST TYPBG2 ;[2053] Link 0 is always in core TRNN T2,-1 ;[2053] On DSK? PUSHJ P,E$$LNM## ;[2053] Must be in memory TYPBG2: ADD T2,BG.LB ;[2053] Add in base HRRZM T2,NAMLOC ;[2053] Where it is MOVE T1,(T2) ;[2053] First word is special HLRZM T1,HT.PRM ;[2053] Contains hash size ADDI T2,(T1) ;[2053] Add offset for hash table HRRM T2,HT.PTR ;[2053] MOVE W3,0(P) ;[2053] Get the callee argblock pointer PUSHJ P,SYTYP## ;[2053] Typecheck this table SOSL T1,BG.SCH ;[2053] More to look at? JRST TYPBG1 ;[2053] Yes SETZM ARGOVL ;[2053] Back to typechecking GS area POP P,W3 ;[2053] Recover the arg block pointer SPOP ;[2053] Put things back POPJ P, ;[2053] Return to process current overlay ;[2053] Here to build a deferred fixup block. The block is two words ;[2053] long, and looks like: ; ; ----------------------------- ; ! Pointer to next ! ; ----------------------------- ; !overlay index,,user address! ; ----------------------------- ; ;[2053] These blocks are stored in ascending order by overlay index ;[2053] and address. Note that the address is 18 bits because this ;[2053] only occur in the overlay case, and that is restricted to ;[2053] section zero. On entry, P3 contains the user address. COEOVL::HRRZ T2,BRNLEN ;[2053] Total SUB T2,BG.SCH ;[2053] Minus whats left gives index JUMPN T2,COEOV0 ;[2053] Check for not root node HRRZ P2,LL.S2 ;[2053] Get the root node highseg origin JUMPE P2,COEOV0 ;[2053] No root node high segment CAML P3,P2 ;[2053] In the high segment? JRST COESP0## ;[2053] Yes, do this fixup now. SGCHK. ;[2053] will use the root node high seg. COEOV0: HRL P3,T2 ;[2053] Put the index with the address MOVEI T2,TPCBK ;[2053] Get the length PUSH P,T4 ;[2053] Save over DY.GET call PUSHJ P,DY.GET## ;[2053] Get a block POP P,T4 ;[2053] Restore AC MOVEM P3,TPCAD(T1) ;[2053] Store the address info MOVEI P1,ARGFXP ;[2053] Get the pointer to the chain COEOV1: MOVE T2,TPCLK(P1) ;[2053] Get the new pointer JUMPE T2,COEOV2 ;[2053] At end of chain? CAMG P3,TPCAD(T2) ;[2053] Is this one bigger than last? JRST COEOV2 ;[2053] Yes, link it in here MOVE P1,T2 ;[2053] Point to the current block JRST COEOV1 ;[2053] Try the next block COEOV2: MOVEM T2,TPCLK(T1) ;[2053] Link this one into the chain MOVEM T1,TPCLK(P1) ;[2053] Complete the chain PJRST COESP1## ;[2053] Return to coersion code SUBTTL STORE INTO USER CORE IMAGE ;HERE TO STORE BLOCK TYPE 1 (AND 21) ;ENTER WITH DATA IN W1 (RESULT FROM RB.1) ;STORE ADDRESS IN P3 ;THIS BLOCK IS NOT GENERALIZED BECAUSE OF SPEED CONSIDERATIONS ;CALLED BY ; MOVE W1,DATA WORD ; CSTORE ;WHICH IS ; JSP T1,CS.RHS## ; CS.LHS==:(JSP T1,) ;BUILD THE INSTRUCTION UP CS.RHS::MOVEM W1,(P3) ;STORE IN CORE SKIPN RT.LB ;LOADING RELOCATABLE OVERLAYS? JRSTF (T1) ;NO ROT R,2 ;PUT RELOC BITS IN 34-35 IDPB R,RT.PT ;STORE ROT R,-2 ;PUT BACK JRSTF (T1) ;RETURN SUBTTL RELOCATABLE OVERLAY ROUTINES ;RT.FX - ROUTINE TO STORE RELOCATION FOR BOUND GLOBAL IN A RELOCATABLE LINK ;ENTER WITH ;P1 = POINTER TO SYMBOL ;W1 = FIXUP FLAGS (WHICH HALF) ;W3 = FIXUP VALUE ;USES T1-T4 RT.FX:: MOVEI T2,2 ;USES 2 WORDS SUB P1,GS.LB ;IN CASE CORE MOVES PUSHJ P,FX.GET## ;IN FIXUP AREA ADD P1,GS.LB MOVE T2,P1 ;COPY PTR TO SYMBOL MOVE T3,0(T2) ;GET PRIMARY FLAGS TXNN T3,PT.EXT ;IT BETTER BE EXTENDED HALT RT.FX1: ADDI T2,.L ;GET NEXT TRIPLET MOVE T3,0(T2) ;GET SECONDARY FLAGS TXNE T3,S.RBG ;BOUND GLOBAL? JRST RT.FX2 ;YES TXNN T3,S.LST ;LAST TRIPLET? JRST RT.FX1 ;NOT YET HALT RT.FX2: MOVS T2,2(T2) ;GET LINK# HRR T2,RBGPTR ;LAST ONE TO LINK IN SETZ T3, ;START WITH NO RELOCATION TXNN W1,FS.FXR ;[2214] RIGHT ONLY? TXNE W1,FS.FXE ;[2214] OR THIRTY BIT? TXO T3,1B1 ;YES TXNE W1,FS.FXL ;OR LEFT ONLY? TXO T3,1B0 ;YES TXNE W1,FS.FXF ;OR BOTH? TXO T3,3B1 ;YES TXNE W1,FS.FXS ;SYMBOL TABLE? HALT ;NOT YET HRR T3,W3 ;VALUE DMOVEM T2,(T1) ;STORE SUB T1,FX.LB ;REMOVE BASE .JDDT LNKOV1,RT.FX2,<> ;[632] MOVEM T1,RBGPTR ;POINT TO IT POPJ P, ;RT.FXC - ROUTINE SAME AS RT.FX BUT USES PREVIOUS RELOCATION ;I.E. FOR CHAINED REFERENCES ;ENTER WITH ;P1 = POINTER TO SYMBOL ;W1 = FIXUP FLAGS (WHICH HALF) ;W3 = FIXUP VALUE ;USES T1-T4 RT.FXC::MOVEI T2,2 ;SAME 2 WORDS AS ABOVE PUSHJ P,FX.GET## MOVE T2,RBGPTR ;GET ADDRESS OF LAST ADD T2,FX.LB ;FIX IN CORE DMOVE T3,(T2) ;GET LAST HRR T3,RBGPTR ;LINK TO LAST ADDRESS HRR T4,W3 ;CHANGE VALUE DMOVEM T3,(T1) ;STORE IN NEW BLOCK SUB T1,FX.LB ;REMOVE BASE .JDDT LNKOV1,RT.FXC,<> ;[632] MOVEM T1,RBGPTR ;STORE POINTER TO LIST POPJ P, ;RT.T2R - ROUTINE TO SET RELOC BITS CORRECT FOR RIGHT HALF CHAINED REFERENCES ;ENTER WITH ;T2 = ADDRESS ;R = RELOC BITS (BITS 0 & 1) ;P1 = PTR TO SYMBOL ;W1 = FLAGS OF PRIMARY SYMBOL RT.T2R::PUSHJ P,RT.T2H ;CHECK NOT IN HISEG POPJ P, ;IN HIGH PUSH P,P3 ;NEED P3 FOR ADDRESS CHECK MOVE P3,T2 PUSHJ P,RT.P3## ;SETUP RT.PT TXNN R,1B1 ;IS IT RELOCATED? TDZA T2,T2 ;NO MOVEI T2,1 ;YES MOVE T1,RT.PT ;GET BYTE PTR TLC T1,(-) IBP T1 ;BYPASS LHS IDPB T2,T1 ;NEW BYTE JUMPE P1,POPP3 ;NOT SYMBOLIC PUSH P,W1 ;SAVE FLAGS MOVX W1,FS.FXR ;RH IN CASE BOUND RT.T2Z: MOVE T2,0(P1) ;GET FLAGS TXNN T2,PS.RBG ;BOUND? JRST .+4 ;NO EXCH W3,P3 ;PUT ADDRESS IN W3 PUSHJ P,RT.FX ;STORE FIXUP EXCH W3,P3 POP P,W1 ;RESTORE FLAGS POPP3: MOVE T2,P3 ;RESET T2 SETZ T1, ;[2214] ZERO SECTION FOR CHAINED FIXUPS POP P,P3 POPJ P, ;RT.T2H - ROUTINE TO CHECK ADDRESS NOT IN HISEG ;ENTER WITH ;T2 = ADDRESS ;RETURNS ;+1 IN HISEG ;+2 IN LOW SEG RT.T2H: SKIPE HC.LB ;NO HIGH SEG CAMGE T2,LL.S2 ;IS IT IN HIGH? AOS (P) ;NO POPJ P, ;RT.T2L - ROUTINE TO SET RELOC BITS CORRECT FOR LEFT HALF CHAINED REFERENCES ;ENTER WITH ;T2 = ADDRESS ;R = RELOC BITS (BITS 0 & 1) RT.T2L::PUSHJ P,RT.T2H ;CHECK NOT IN HISEG POPJ P, ;IN HIGH PUSH P,P3 ;NEED P3 FOR ADDRESS CHECK MOVE P3,T2 PUSHJ P,RT.P3## ;SETUP RT.PT TXNN R,1B0 ;IS IT RELOCATED? TDZA T2,T2 ;NO MOVEI T2,1 ;YES MOVE T1,RT.PT ;GET BYTE PTR TLC T1,(-) IDPB T2,T1 ;NEW BYTE JUMPE P1,POPP3 ;NOT SYMBOLIC PUSH P,W1 ;SAVE FLAGS MOVX W1,FS.FXL ;LH IN CASE BOUND JRST RT.T2Z ;RESET T2,P3, AND RETURN ;RT.T2F - ROUTINE TO SET RELOC BITS CORRECT FOR FULL WORD CHAINED REFERENCES ;ENTER WITH ;T2 = ADDRESS ;R = RELOC BITS (BITS 0 & 1) RT.T2F::PUSHJ P,RT.T2H ;CHECK NOT IN HISEG POPJ P, ;IN HIGH PUSH P,P3 ;NEED P3 FOR ADDRESS CHECK MOVE P3,T2 PUSHJ P,RT.P3## ;SETUP RT.PT TXNN R,3B1 ;IS IT RELOCATED? TDZA T2,T2 ;NO MOVEI T2,1 ;YES MOVE T1,RT.PT ;GET BYTE PTR IDPB T2,T1 ;NEW BYTE JUMPE P1,POPP3 ;NOT SYMBOLIC PUSH P,W1 ;SAVE FLAGS MOVX W1,FS.FXF ;FULL WORD IN CASE BOUND JRST RT.T2Z ;RESET T2,P3, AND RETURN ;RT.T2E - Routine to set reloc bits correct for thirty bit chained references ;Enter with ;T2 = Address ;R = Reloc bits (BITS 0 & 1) RT.T2E::PUSHJ P,RT.T2H ;[2214] Check not in hiseg POPJ P, ;[2214] In high PUSH P,P3 ;[2214] NEED P3 FOR ADDRESS CHECK MOVE P3,T2 ;[2214] PUSHJ P,RT.P3## ;[2214] Setup RT.PT TXNN R,3B1 ;[2214] Is it relocated? TDZA T2,T2 ;[2214] No MOVEI T2,1 ;[2214] Yes MOVE T1,RT.PT ;[2214] Get byte ptr IDPB T2,T1 ;[2214] New byte JUMPE P1,POPP3 ;[2214] Not symbolic PUSH P,W1 ;[2214] Save flags MOVX W1,FS.FXE ;[2214] Full word in case bound JRST RT.T2Z ;[2214] Reset T2, P3, and return E$$OHN::.ERR. (MS,,V%L,L%F,S%F,OHN,) ;[1174] E$$FSN::.ERR. (MS,,V%L,L%F,S%F,FSN,) ;[1174] SUBTTL THE END OV1LIT: END LNKOV1