TITLE LNKOVS - COMMON SUBROUTINES FOR OVERLAY MODULES SUBTTL D.M.NIXON/DMN/JBC/JNG/DZN/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 SALL ENTRY TR.WLK CUSTVR==0 ;CUSTOMER VERSION DECVER==5 ;DEC VERSION DECMVR==1 ;DEC MINOR VERSION DECEVR==2417 ;DEC EDIT VERSION VERSION SEGMENT SUBTTL REVISION HISTORY ;START OF VERSION 2 ;135 ADD OVERLAY FACILITY ;136 FIX VARIOUS BUGS ;174 MAKE RELOCATABLE OVERLAYS WORK ;START OF VERSION 2B ;363 UPDATE MINOR VERSION # ;START OF VERSION 2C ;557 Clean up 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 ;731 SEARCH MACTEN,UUOSYM ;765 Release on both TOPS-10 and TOPS-20 as LINK version 4(765) ;START OF VERSION 4A ;1174 Label and clean up all error messages. ;1217 Clean up the listings for release. ;1220 Release on both TOPS-10 and TOPS-20 as version 4A(1220). ;START OF VERSION 5 ;1400 Use OVRPAR.MAC. ;Start of Version 5.1 ;2026 Update copyright notice. ;Start of Version 6.0 ;2403 New corporate copywrite statement. ;2417 UPDATE copywrite statement to 1988. SUBTTL TREE WALK ROUTINE ;ENTER WITH REQUIRED LINK IN P1 (RH) ;START AT FSTLNK ;SCAN ALL TREE UNTIL REQUIRED LINK IS FOUND ;RETURNS ADDRESS IN P1 (LH), LINK # IN (RH) ;RETURNS TOTAL NO. OF LINKS IN SUB-TREE IN P2 ;ADDRESS IN P1 IS EITHER THAT OF REQUIRED NODE ; OR ITS FATHER IF REQUIRED NODE IS TERMINAL TR.WLK: MOVE T2,BRNMAX ;LONGEST POSSIBLE BRANCH ADDI T2,1 ;SPACE FOR TERMINATOR PUSHJ P,DY.GET## ;GET SPACE FOR PD STACK SPUSH ;SAVE SO WE CAN GIVE BACK MOVN T2,T2 ;-LENGTH HRL T1,T2 ;FORM PDP MOVE P2,T1 ;SAFE PLACE PUSH P2,[0] ;START WITH A ZERO TERMINATOR MOVE T1,FSTPTR ;GET START TRWLK1: HLL T1,(T1) ;FORM AOBJN ADD T1,[2,,2] ;BYPASS HEADER AND BACK PTR TRWLK2: MOVS T2,(T1) ;PTR ,, # CAIN P1,(T2) ;ONE WE WANT? JRST TRWLKF ;YES TLNE T2,-1 ;IS IT A TOP LINK? JRST TRWLK3 ;NO, FOLLOW IT AOBJP T1,.+3 ;GET NEXT ITEM IN LIST SKIPE (T1) ;UNLESS NULL JRST TRWLK2 ;TRAVEL ITS PATH POP P2,T1 ;GET TOP ITEM OFF STACK JUMPE T1,TRWLKZ ;NOT IN TREE (MIGHT BE SUB-TREE) JRST TRWLK2 ;AND FOLLOW PREVIOUS TRWLK3: MOVE T2,T1 ;GET A COPY TO PLAY WITH AOBJP T2,.+3 ;SEE IF WE NEED TO STACK SKIPE (T2) PUSH P2,T2 ;YES, RETURN HERE MOVE T1,(T1) ;GET ADDRESS JRST TRWLK1 ;AND FOLLOW TRWLKF: SETZ P2, ;HOLD COUNT OF NODES IN SUB-TREE TLNN T2,-1 ;IS IT TERMINAL? AOJA P2,.+2 ;YES, ACCOUNT FOR IT HLR T1,T2 ;NO, USE PTR SKIPL (T1) ;POINTING TO AOBJN WORD SOJA T1,.-1 ;NOT YET HRL P1,T1 ;SAFE PLACE SPOP PUSHJ P,DY.RET## ;RETURN STACK MOVS T1,P1 ;GET POINTER HRRZ T2,(T1) ;GET LINK# JUMPE T2,CPOPJ ;FINISHED WHEN BACK TO 0 MOVE T1,1(T1) ;GET NEXT AOJA P2,.-3 ;LOOP TRWLKZ: SETZB P1,P2 ;NO DEPTH, NO PTR SPOP PJRST DY.RET## ;RETURN STACK AND GIVE UP SUBTTL RELOCATABLE OVERLAY ROUTINES ;RT.P2 - ROUTINE TO SETUP RT.PT AND MAKE SURE ENOUGH SPACE ;ENTER WITH ;P2 = UPPER ADDRESS ;P3 = LOWER ADDRESS ;USES T1, T2 RT.P2:: MOVE T1,P2 ;GET UPPER ADDRESS SUB T1,PH+PH.ADD ;[1400] MINUS BASE IDIVI T1,^D18 ;2 BITS PER BYTE SKIPE T2 ;REMAINDER? ADDI T1,1 ;YES SUB T1,OVLOFF ;INCASE BASE NOT IN CORE ADD T1,RT.LB ;MAKE ABS CAMG T1,RT.AB ;WILL IT FIT? JRST RT.P3 ;YES, SET BYTE PTR PUSHJ P,RT.INC ;NO, EXPAND JRST RT.P2 ;MAKE SURE ITS OK NOW ;RT.P3 - ROUTINE TO SETUP RT.PT (BYTE PTR TO STORE RELOCATION INFO) ;ENTER WITH ;P3 = LOWER ADDRESS ;USES T1, T2 RT.P3:: MOVE T1,P3 ;GET LOWER ADDRESS SUB T1,PH+PH.ADD ;[1400] MINUS BASE IDIVI T1,^D18 ;2 BITS PER BYTE SUB T1,OVLOFF ;INCASE BASE NOT IN CORE IOR T1,RTBTAB(T2) ;GET CORRECT BYTE ADD T1,RT.LB ;MAKE ABS MOVEM T1,RT.PT ;NEW IDPB PTR POPJ P, SALL RTBTAB: POINT 2, ZZ==1 REPEAT ^D17,< POINT 2,0,ZZ ZZ==ZZ+2> RT.INC::PUSHJ P,.SAVE2## ;SAVE P1 & P2 MOVEI P1,RT.IX ;AREA MOVEI P2,.IPS ;SIZE PUSHJ P,LNKCOR## ;EXPAND PUSHJ P,E$$MEF## ;[1174] SHOULD NOT HAPPEN HRLI T1,(POINT 2) ;RESET BYTE PTR HLLM T1,RT.PT MOVEI T1,^D18*.IPS ;AND BYTE COUNT MOVEM T1,RT.FR CPOPJ: POPJ P, SUBTTL COMMON MESSAGES ;IOWD FOR PREAMBLE SECTION IFN FTKIONLY,< PHIOWD::IOWD PH.ZZ,PH ;[1400] 0 > E$$IOV::PUSH P,[OC] ;[1174] .ERR. (ST,,V%L,L%F,S%F,IOV,) E$$OOV::PUSH P,[OC] ;[1174] .ERR. (ST,,V%L,L%F,S%F,OOV,) E$$LNM::.ERR. (MS,.EC,V%L,L%F,S%F,LNM,) ;[1174] .ETC. (DEC,.EC!.EP,,,,P2) .ETC. (STR,,,,,,< not in memory>) ;[1174] SUBTTL THE END END