%CONSTSTRING (20) VERSION= "IFIX 7 19/8/86" %CONSTINTEGER SEGSIZE= X'00040000' %CONSTINTEGER IPUT=0,LPUT=1 !**** RECORD FORMATS **** %RECORDFORMAT DIRINFF(%STRING (6) USER, %STRING (31) BATCHFILE, %INTEGER MARK,FSYS,PROCNO, ISUFF,REASON,BATCHID,SESSICLIM,SCIDENSAD,SCIDENS,OPERNO,MSGFAD,SCDATE,SYNC1DEST,SYNC2DEST, ASYNCDEST) %RECORDFORMAT TABF(%STRING (31) NAME, %INTEGER I,J) %RECORDFORMAT RF(%INTEGER AREALOC,BASELOC) %RECORDFORMAT RELF(%INTEGER LINK,N, %RECORD (RF) %ARRAY R(1:4000)) %RECORDFORMAT OFMF(%INTEGER START,L,PROP) %RECORDFORMAT RRF(%INTEGER CONAD,FILETYPE,DATASTART,DATAEND) %RECORDFORMAT CENTF(%INTEGER LINK,(%INTEGER LOC, %STRING (31) IDEN %ORINTEGER CODE OFFSET, GLA OFFSET,EP OFFSET,PWORD, %STRING (31) IDEN2)) %RECORDFORMAT DENTF(%INTEGER LINK,DISP,L,A, %STRING (31) IDEN) %RECORDFORMAT CREFF(%INTEGER LINK,REFLOC, %STRING (31) IDEN) %RECORDFORMAT DREFF(%INTEGER LINK,REFARRAY,L, %STRING (31) IDEN) !**** SYSTEM AND EXTERNAL SPECS****** !%DYNAMICINTEGERFNSPEC BUILDSCT(%INTEGER OUTBASE, INBASE) %EXTERNALINTEGERFNSPEC OUTSTREAM %ALIAS "S#OUTSTREAM" %EXTERNALSTRING (8) %FNSPEC TIME %ALIAS "S#TIME" %EXTERNALSTRING (8) %FNSPEC DATE %ALIAS "S#DATE" %EXTERNALINTEGERFUNCTIONSPEC UINFI %ALIAS "S#UINFI"(%INTEGER ENTRY) %EXTERNALROUTINESPEC EMAS3(%STRINGNAME CMD,PARAM, %INTEGERNAME I) !%SYSTEMROUTINESPEC PSYSMES(%INTEGER ROOT, FLAG) %EXTERNALROUTINESPEC TRIM %ALIAS "EMAS3TRIM"(%STRINGNAME NFILE, %INTEGERNAME FLAG) !%SYSTEMROUTINESPEC DISCONNECT(%STRING (31) S, %INTEGERNAME FLAG) %EXTERNALROUTINESPEC DISCONNECT %ALIAS "EMAS3DISCONNECT"(%STRINGNAME NFILE, %INTEGERNAME FLAG) %EXTERNALROUTINESPEC emas3string(%stringname qualifier,value) %RECORDFORMAT CHDRFORM(%INTEGER CONAD,FILETYPE,DATASTART,DATAEND) %EXTERNALROUTINESPEC CONNECT %ALIAS "EMAS3CONNECT"(%STRINGNAME S, %INTEGERNAME A,M,P,R1,R2, R3,R4,FLAG) !%SYSTEMROUTINESPEC OUTFILE(%STRING (31) FILE, %C ! %INTEGER SIZE, HOLE, PROT, %INTEGERNAME CONAD, FLAG) %EXTERNALROUTINESPEC OUTFILE %ALIAS "EMAS3OUTFILE"(%STRINGNAME NFILE, %INTEGERNAME NFILESIZE, NHOLE,NPROT,CONAD,FLAG) %EXTERNALROUTINESPEC MOVE %ALIAS "EMAS3MOVE"(%INTEGERNAME NLENGTH,NFROM,NTO) %EXTERNALROUTINESPEC PHEX %ALIAS "EMAS3PHEX"(%INTEGERNAME NI) %externalstringfnspec htos %alias "S#HTOS"(%integer val,places) %CONSTINTEGER AREAS=10 %STRINGFN ITOS(%INTEGER N) !RETURNS STRING CONTAINING ! CHARACTER VALUE OF N WITH ! NO LEADING SPACE !N SHOULD BE POSITIVE OR ! NEGATIVE INTEGER %CONSTINTEGERARRAY TENS(0:9)= %C 1, 10, 100, 1000, 10000, 100000 %C , 1000000, 10000000, 100000000, 1000000000 %STRING (11) RES %INTEGER M,R,I,STARTED %IF N=0 %THENRESULT="0"; !SPECIAL CASE %IF N<0 %THEN N=-N %AND RES="-" %ELSE RES="" STARTED=0; !INDICATES THAT NO CHAS PUT ! OUT SO FAR %FOR I=9,-1,0 %CYCLE R=TENS(I) %IF N>=R %OR STARTED#0 %START STARTED=1; !TO INDICATE THAT CHAR ! ALREADY FOUND M=N//R RES=RES.TOSTRING(M+'0') N=N-M*R %FINISH %REPEAT %RESULT=RES %END; !OF ITOS %INTEGERFN ROUNDUP(%INTEGER N,ROUND) !RESULT IS N ROUNDED UP TO ! MULTIPLE OF ROUND >=N ROUND=ROUND-1 %RESULT=(N+ROUND)&(\ROUND); ! AND WITH NOT ROUND %END; !OF ROUNDUP %ROUTINE ANALYSE(%RECORD (CENTF) %NAME CENT, %INTEGERNAME LPUT TYPE, %STRINGNAME IDEN, %INTEGER LINK) %IF 0ERR %IF FLAG#0 %IF INTEGER(RR_CONAD+12)#1 %THEN FAIL("INVALID FILETYPE") INBASE=RR_CONAD LDATA==ARRAY(INBASE+INTEGER(INBASE+24),LDATAAF) !LOAD DATA OFM==ARRAY(INBASE+INTEGER(INBASE+28)+4,OFMAF) !OBJECT FILE MAP LEN=RR_DATAEND+OFM(9)_l; ! add the zust size %IF MODE&16=16 %THEN OUTLEN=LEN+8192 %ELSE OUTLEN=LEN !DIRECTOR NEEDS ROOM FOR SC TABLE OUTFILE(OUT,OUTLEN+4096,0,0,OUTBASE,FLAG); !ALLOW FOR ALIGNMENT IN SUPERVISOR - A BIT GENEROUS ->ERR %IF FLAG#0 MOVE(OFM(9)_START,INBASE,OUTBASE);!COPY FILE but not ofm or ldata TO 'OUT' %FOR I=1,1,INTEGER(INBASE+INTEGER(INBASE+28)) %CYCLE BASE(I)=OUTBASE+OFM(I)_START %REPEAT LBASE(1)=OFM(1)_START+CODESTART; !START OF LOADED CODE LBASE(2)=GLASTART; !START OF LOADED GLA LBASE(4)=OFM(4)_START+CODESTART; !START OF LOADED SST LBASE(5)=OFM(2)_L+GLASTART; !START OF LOADED UST lbase(6)=ofm(6)_start+codestart; ! start of loaded diag tables Lbase(7)=lbase(5)+ofm(5)_L; ! Start of statics Lbase(8)=lbase(7)+ofm(7)_L; ! Start of ioarea Lbase(9)=lbase(8)+ofm(8)_L; ! Start of Zeroed UST LBASE(10)=OFM(10)_START+CODESTART;! loaded constant area !NOW GO THROUGH CODE REFS FILLING IN INFO LINK=LDATA(7); !STATIC CODE REFS %WHILE LINK#0 %CYCLE CREF==RECORD(LINK+INBASE) FINDCODEEP(CREF_IDEN,CO,GL,ENTP,PWORD,FLAG) LOC=BASE(CREF_REFLOC>>24)+CREF_REFLOC&X'FFFFFF' %IF CO#0{found} %and PWORD#-1 %AND INTEGER(LOC+12)#-1 %AND INTEGER(LOC+12)#PWORD %THEN %C PRINTBOTH("Warning param mismatch 0n: ".CREF_IDEN." ".htos(pword,8)." ".htos(integer(loc+12),8)) INTEGER(LOC)=INTEGER(LOC)+CO INTEGER(LOC+4)=INTEGER(LOC+4)+GL INTEGER(LOC+8)=ENTP INTEGER(LOC+12)=GL LINK=CREF_LINK %REPEAT ! Subsystem dynamic refs. ! If we want a shareable basegla then must fix up ss dynamic refs with ! escape descriptors to escape tables on the unshared basegla. The escape ! tables are located at known addresses at the start of T#BGLA and constructed ! at ss startup %IF MODE&32#0 %THENSTART LINK=LDATA(8) AD=X'00880000'; ! Start of basegla %WHILE LINK#0 %CYCLE CREF==RECORD(LINK+INBASE) LOC=BASE(CREF_REFLOC>>24)+CREF_REFLOC&X'00FFFFFF' INTEGER(LOC)=X'E5000000'; ! Escape descriptor INTEGER(LOC+4)=AD LINK=CREF_LINK AD=AD+16 %REPEAT %FINISH !NOW DEAL WITH DATA REFS LINK=LDATA(9) %WHILE LINK#0 %CYCLE DREF==RECORD(LINK+INBASE) REFARRAY=(DREF_REFARRAY&X'7FFFFFFF')+INBASE !AND OFF COMMON BIT N=INTEGER(REFARRAY) REFLOC==ARRAY(REFARRAY+4,REFLOCAF) FINDDATAEP(DREF_IDEN,AD,FLAG) %FOR N=1,1,N %CYCLE LOC=BASE(REFLOC(N)>>24)+REFLOC(N)&X'FFFFFF' INTEGER(LOC)=INTEGER(LOC)+AD %REPEAT LINK=DREF_LINK %REPEAT ! NOW DEAL WITH RELOCATION REQUESTS LINK=LDATA(14) %WHILE LINK#0 %CYCLE REL==RECORD(LINK+INBASE) %FOR N=1,1,REL_N %CYCLE; !NO OF RELOCATION ENTRIES IN THIS BLOCK AREACODE=REL_R(N)_AREALOC>>24 AREADISP=REL_R(N)_AREALOC&X'FFFFFF' BASECODE=REL_R(N)_BASELOC>>24 BASEDISP=REL_R(N)_BASELOC&X'FFFFFF' LOC=BASE(AREACODE)+AREADISP %if basedisp&x'00800000'#0 %then basedisp=basedisp!x'ff000000' INTEGER(LOC)=INTEGER(LOC)+LBASE(BASECODE)+BASEDISP %REPEAT LINK=REL_LINK %REPEAT !NOW FILL IN JUMP TO BYTE 32 BECAUSE DIRECTOR ALWAYS SET !PC TO 16 %IF MODE&8=8 %THEN INTEGER(OUTBASE+16)=X'1B800008' !JUMP 8 HALF WORDS(16 BYTES) !NOW PRINT MAP OF ENTRY POINTS NEWLINES(2) PRINTSTRING("NAME ENTRY POINT") NEWLINES(2) LINK=LDATA(1); !HEAD OF CODE EP LIST %WHILE LINK#0 %CYCLE CENT==RECORD(INBASE+LINK) ANALYSE(CENT,LPUT TYPE,IDEN,LINK) PRINTSTRING(IDEN) SPACES(32-LENGTH(IDEN)) %IF LPUT TYPE=IPUT %THEN LOC=LBASE(1)+CENT_EP OFFSET %ELSE %C LOC=LBASE((CENT_LOC>>24)&x'f')+CENT_LOC&x'ffffff' PHEX(LOC) NEWLINE LINK=CENT_LINK %REPEAT !NOW PRINT MAP OF DATA ENTRIES IF ANY LINK=LDATA(4); !HEAD OF DATA EP LIST %IF LINK#0 %START NEWLINES(2) PRINTSTRING("NAME LENGTH ADDRESS") NEWLINES(2) %WHILE LINK#0 %CYCLE DENT==RECORD(INBASE+LINK) PRINTSTRING(DENT_IDEN) SPACES(32-LENGTH(DENT_IDEN)) WRITE(DENT_L,10) SPACES(5) PHEX(LBASE(DENT_A)+DENT_DISP) NEWLINE LINK=DENT_LINK %REPEAT %FINISH %IF MODE&16=16 %START; !SPECIAL ACTIONS FOR DIRECTOR INTEGER(OUTBASE+24)=OFM(2)_START; !START OF GLAP INTEGER(OUTBASE+8)=INTEGER(OUTBASE+24); !TEMP INTEGER(OUTBASE)=ROUNDUP(INTEGER(INBASE+24),4096) !ALLOW ROM FOR CODE AND GLA AND THEN ROUND UP TO PAGE BOUNDARY INTEGER(OUTBASE+28)=INTEGER(OUTBASE); !START OF SC TABLE INTEGER(OUTBASE+12)=INTEGER(OUTBASE); !TEMPORARY UNTIL DIRECTOR CORRECTED ! FLAG = BUILDSCT(OUTBASE,INBASE); !NEED INBASE TO GET AT LOAD DATA %IF FLAG#0 %THENSTART PRINTBOTH("NUMBER OF SCT FAULTS: ".ITOS(FLAG)) %FINISH %FINISH; !END OF DIRECTOR SECTION %IF MODE&4=4 %START; !SPECIAL ACTIONS FOR SUPERVISORS FINDCODEEP("ENTER",CO,GL,ENTP,PWORD,FLAG) %IF FLAG#0 %THEN FAIL("NO ENTRY POINT ""ENTER"" FOR SUPERVISOR") INTEGER(OUTBASE+12)=CO INTEGER(OUTBASE+16)=GL INTEGER(OUTBASE+28)=ENTP OLDSTART=BASE(2) NEWSTART=ROUNDUP(BASE(2),4096); !ROUND UP TO NEXT PAGE GLEN=OFM(2)_L+OFM(5)_L+ofm(7)_l+ofm(8)_l+ofm(9)_l; !TOTAL LENGTH OF GLAP %IF NEWSTART#OLDSTART %START; !DONT MOVE IF ALREADY ALIGNED %FOR I=GLEN-1,-1,0 %CYCLE; !FIELDS MIGHT OVERLAP - DONT USE MOVE BYTEINTEGER(NEWSTART+I)=BYTEINTEGER(OLDSTART+I) %REPEAT %FINISH INTEGER(OUTBASE)=NEWSTART+GLEN-OUTBASE; !NEW LENGTH OF FILE INTEGER(OUTBASE+24)=NEWSTART-OUTBASE !NOW CHECK FOR UN-USED ENTRIES LINK=LDATA(1); !LIST HEAD OF CODE ENTRIES %WHILE LINK#0 %CYCLE CENT==RECORD(INBASE+LINK) ANALYSE(CENT,LPUT TYPE,IDEN,LINK) RLINK=LDATA(7); !HEAD OF CODE REF LIST %WHILE RLINK#0 %CYCLE CREF==RECORD(INBASE+RLINK) %EXITIF IDEN=CREF_IDEN; !ENTRY IS USED RLINK=CREF_LINK %REPEAT %IF RLINK=0 %AND IDEN#"ENTER" %START; !ENTRY IS NOT REFERENCED PRINTBOTH("**WARNING - PROCEDURE ".IDEN." NOT USED") %FINISH LINK=CENT_LINK %REPEAT !NOW CHECK FOR UNUSED DATA ENTRIES LINK=LDATA(4); !HEAD OF DATA ENTRY LIST %WHILE LINK#0 %CYCLE DENT==RECORD(INBASE+LINK) IDEN=DENT_IDEN RLINK=LDATA(9); !HEAD OF DATA REF LIST %WHILE RLINK#0 %CYCLE DREF==RECORD(INBASE+RLINK) %EXITIF IDEN=DREF_IDEN RLINK=DREF_LINK %REPEAT %IF RLINK=0 %START PRINTBOTH("**WARNING - DATA ENTRY ".IDEN." NOT USED") %FINISH LINK=DENT_LINK %REPEAT %FINISH BLOCKS=ROUNDUP(INTEGER(OUTBASE),4096)>>12; !NO OF 4K BLOCKS DISCONNECT(OUT,FLAG) TRIM(OUT,FLAG) %UNLESS FLAG=0 %THEN PRINTBOTH("Trim flag = ".ITOS(FLAG)) NEWLINE %IF UNSATCODE=0=UNSATDATA %START PRINTBOTH("ALL REFS FILLED") %FINISHELSESTART %IF UNSATCODE>0 %START PRINTBOTH(ITOS(UNSATCODE)." UNSATISFIED CODE REFERENCES") %FINISH %IF UNSATDATA>0 %THENSTART PRINTBOTH(ITOS(UNSATDATA)." UNSATISFIED DATA REFERENCES") %FINISH %FINISH NEWLINE PRINTBOTH("NUMBER OF 4K BLOCKS: ".ITOS(BLOCKS)) %RETURN ERR: SELECTOUTPUT(0) %UNLESS FLAG=0 %THEN PRINTSTRING("flag =") %AND WRITE(FLAG,1) %END; !OF FIX ! %EXTERNALROUTINE SJFIX(%STRING (255) S) ! !FIX FOR SCIENTIFIC JOBBER ! %RECORD(RRF) RR ! %STRING (31) IN, OUT, LIST ! %CONSTINTEGER CODESTART = X'00800000' ! %INTEGER FLAG, GLASTART ! SETPAR(S) ! IN = SPAR(1) ! OUT = SPAR(2) ! LIST = SPAR(3) ! CONNECT(IN,0,0,0,RR,FLAG) ! %IF FLAG = 0 %START ! GLASTART = ROUNDUP(CODESTART+RR_DATAEND,SEGSIZE) ! !GLA STARTS AT NEXT FREE SEGMENT AFTER BASEFILE ! %FINISH %ELSE GLASTART = 0; !FIX WILL PRODUCE FAILURE MESSAGE ! FIX(IN,OUT,LIST,11,CODESTART,GLASTART) ! %END; !OF SJFIX ! %EXTERNALROUTINE ISSFIX15(%STRING (255) S) %RECORD (RRF) RR %STRING (31) IN,OUT,LIST %RECORD (OFMF) %ARRAYFORMAT OFMAF(1:AREAS) %RECORD (OFMF) %ARRAYNAME OFM %CONSTINTEGER CODESTART= X'00800020' %INTEGER FLAG,GLASTART ! SETPAR(S) ! IN=SPAR(1) ! OUT=SPAR(2) ! LIST=SPAR(3) ! CONNECT(IN,0,0,0,RR_CONAD,RR_FILETYPE,RR_DATASTART,RR_DATAEND,FLAG) ! %IF FLAG=0 %START ! OFM==ARRAY(RR_CONAD+INTEGER(RR_CONAD+28)+4,OFMAF) ! GLASTART=CODESTART+OFM(2)_START ! %FINISHELSE GLASTART=0; !FIX WILL PRODUCE FAILURE MESSAGE ! FIX(IN,OUT,LIST,43,CODESTART,GLASTART) %END; !OF SSFIX ! %EXTERNALROUTINE SPFIX(%STRING (255) S) ! %RECORD(RRF) RR ! %CONSTINTEGER CODESTART = X'00800000' ! %STRING (31) IN, OUT, LIST ! %INTEGER GLASTART, FLAG ! SETPAR(S) ! IN = SPAR(1) ! OUT = SPAR(2) ! LIST = SPAR(3) ! CONNECT(IN,0,0,0,RR,FLAG) ! %IF FLAG = 0 %START ! GLASTART = ROUNDUP(CODESTART+RR_DATAEND,SEGSIZE) ! !ALLOWS FOR MORE THAN 1 SEGMENT ! %FINISH %ELSE GLASTART = 0 ! FIX(IN,OUT,LIST,9,CODESTART,GLASTART) ! %END; !OF SPFIX ! ! %EXTERNALROUTINE DIRFIX(%STRING (255) S) ! %STRING (31) IN, OUT, LIST ! %CONSTINTEGER CODESTART = X'00080000' ! %CONSTINTEGER GLASTART = X'000C0000' ! SETPAR(S) ! IN = SPAR(1) ! OUT = SPAR(2) ! LIST = SPAR(3) ! FIX(IN,OUT,LIST,24,CODESTART,GLASTART) ! %END; !OF DIRFIX ! %EXTERNALROUTINE ISUPFIX %alias "C#ISUPFIX" %INTEGER SSHIFT %CONSTINTEGER CODE SEG=4, GLA SEG=8 %STRING (31) IN,OUT,LIST,P4 emas3string("From;file,exist,object;?;FIle to be Fixed",in) emas3string("To;file,write;?;FIle for Supervisor",out) emas3string("Listing;file,write;T#LIST;FIle for error messages",list) emas3string("Target;;amdahl; Amdahl or 370",p4) %IF p4="370" %THEN SSHIFT=16 %ELSE SSHIFT=20; ! 24 or 31 bit addrs FIX(IN,OUT,LIST,4,CODE SEG<