!------HDR------- 17 DEC 79 -------------------------------------------- ! offset of LH entry: RECORDFORMAT HDRF(STRING (6) OWNER, BYTEINTEGER C FLAG,SECTSI,ALNK,USE,IMARK, C 07 IUSE,BUSE,ISESSM,SURNAME, C 0C IMAX,TMAX,BMAX,STKKB, C 10 INTEGER LNKSTART,CELSTART,FREEBYTES,TRYING, C 14 NAMSTART,NEXNAM,LOFDAD,TOP, C 24 DWSP,BWSP,SEMA,MSGSEMA, C 34 SEMANO,IINSTRS,BINSTRS,NKBOUT, C 44 DINSTRS,IPTRNS,BPTRNS,NKBIN, C 54 IMSECS,BMSECS,CHKSUM,ASEMA, C 64 BYTEINTEGER CODES,SIGMON,DEPTH,CONCURR, C 74 ACR,DIRVSN,MSGSPRIV,BATCHSS, C 78 BASEF,DELY,STARTF,ADRTELE, C 7C LOGFILE,SPECIALSS,SPFF1,GPHOLDR, C 80 INTEGER USED AFDS,AFILES,AKB,USED FDS, C 84 FILES,TOTKB,ATOP,SPA0 ,DATE, C 94 MAXFILE,MAXKB,DIRMON, C A8 CHERFILES,CHERKB,CONNECTT,ARESTORES, C B4 ZASL,ZFREEC,ZNCELLS,TEMPKB, C C4 FILES0,FILES1,FILES2,FILES3, C D4 BNUTS,INUTS,XLNKST,XCELST, C E4 XTOP,XNAMST,ISTOP) F4 ! !------ENDHDR----------------------------------------------------------- RECORDFORMAT FLF(INTEGER PGSNAM, BYTEINTEGER POOL, C CODES2,CODES,ALNK,PLNK,ARCH,OWNP,CCT,EEP,SSBYTE,USE,SP15) OWNBYTEINTEGERARRAYFORMAT LINKF(0:254) OWNBYTEINTEGERARRAYFORMAT BAF(0:3) OWNINTEGERARRAYFORMAT CELLF(0:254) SYSTEMROUTINESPEC FILL(INTEGER START,LENGTH,PATTERN) SYSTEMROUTINESPEC MOVE(INTEGER LEN,FROM,TO) EXTERNALINTEGERFNSPEC DINDEX(STRING (6) USER, C INTEGER FSYS,BITADDR,INDAD, INTEGERNAME LOPAGE,HIPAGE) EXTERNALROUTINESPEC PROMPT(STRING (15) S) EXTERNALROUTINESPEC DEFINE(STRING (255) S) EXTERNALROUTINESPEC CLEAR(STRING (255) S) OWNINTEGERARRAY BITMAP(0:8191) OWNINTEGERARRAY INDEX(0:8191) OWNINTEGERARRAY LASTLINE(0:7) OWNINTEGERARRAY SECTCELLS(1:255) OWNINTEGERARRAY LINKCOUNT(0:3) OWNINTEGERARRAY MAP(0:31) OWNINTEGERARRAY PERMCELLS(1:255) CONSTSTRING (12)ARRAY SARCHIVE(-1:7)="ARCH "," WR CONN", C " BACKUP"," CONN"," ARCH3"," ARCH4"," ARCH5"," ARCH6"," ARCHIVE" CONSTSTRING (12)ARRAY SCODES(-1:7)="CODES "," UNAVA"," OFFER", C " TEMPF"," VTEMP"," CHERS"," PRIVAT"," VIOLAT"," ARCH INHIB" CONSTSTRING (12)ARRAY SCODES2(-1:7)="CODES2 "," WR CONN", C " NEWGEN", " OLDGEN"," WS ALLOW"," COMMS MODE"," DISC ONLY", C " STACK"," DEAD" CONSTSTRING (51) MINUS= C "---------------------------------------------------" CONSTINTEGER TRUE=1 CONSTINTEGER FALSE=0 EXTERNALROUTINE PROBEINDEX(STRING (255) S) ROUTINESPEC PRINTHEX(INTEGER NO,WIDTH) ROUTINESPEC PRINTBIN(INTEGER NO,PL) ROUTINESPEC TRACECHAIN(INTEGER LISTPOOL,PLINK,FILLCELLS, C INTEGERARRAYNAME CELLS, INTEGERNAME CELLCOUNT) ROUTINESPEC CHECKLINK(INTEGER POOL,PLINK,INTEGERNAME FLAG) ROUTINESPEC DUMPBITMAP(INTEGER TYPE) ROUTINESPEC TRACEBACK(INTEGER PLINK) ROUTINESPEC OUTPERM(INTEGER I) ROUTINESPEC CHECKBITMAP ROUTINESPEC POOLLINK(INTEGER ROGUE,WORD,TYPE, INTEGERNAME FLAG) ROUTINESPEC OUTBYTE(STRINGARRAYNAME NAMES, BYTEINTEGER BYTE) ROUTINESPEC PRINTCHAIN(STRING (31) S, BYTEINTEGER PLINK, C INTEGER PRINTREGARDLESS) ROUTINESPEC ASK(STRING (15) TEXT,STRINGNAME T) STRINGFNSPEC S2(INTEGER N) STRINGFNSPEC PRINTDATE(INTEGER P) RECORDNAME H(HDRF) RECORDNAME FDESC(FLF) BYTEINTEGERARRAYNAME LARR,TOTA,TOTB,FREEA,FREEB,WARN INTEGERARRAYNAME CARR INTEGER CUR,LOFDAD,SECTSI,NAMSTART,TOP,USEDFDS,NEXNAM,NAMOFF INTEGER ADDRNAM,FILENO,CONFIDENT,CFLAG,BADNAME INTEGER FLAG,INDAD,I,J,FLEN,SCOUNT,ACOUNT,FDPAGES,ONOFFER INTEGER HIPAGE,LOPAGE,ADDR2,ACOUNT2,POOL,CELLCOUNT,DEAD INTEGER TOTCELLSA,TOTFREEB,WARNING,GRANDTOT,CELSTART,PLFLAG,LNKSTART INTEGER FATAL,ANYTHING,K,BAD INTEGER LINESOFOUTPUT,II INTEGER ZEROES,SAME,SUPPRESSPRINT INTEGER GOOD1,GOOD3,CORRUPTDESCRIPTOR,DEADFILES,TOTALKB INTEGER NCHERISHED,CHERISHEDKB,TEMPKBUSED INTEGER FSYS,BITADDR INTEGERARRAY TOTC,TOTD(0:3) BYTEINTEGER LEN,CH STRING (15) USER STRING (11) OUTDEV,FILENAME CONSTINTEGER FDSIZE=16 CONSTSTRING (31) COLONS=":::::::::::::::::::::::::::::: " ! ZERO ARRAYS AND INITIALISE VARS ZEROES=FALSE SAME=FALSE SUPPRESSPRINT=FALSE INDAD=ADDR(INDEX(0)) BITADDR=ADDR(BITMAP(0)) H==RECORD(INDAD) FILL(32,ADDR(LASTLINE(0)),X'0F') ! UNLIKELY EVER TO OCCUR AS FIRST LINE OF INDEX FILL(X'8000',INDAD,X'00') FILL(16,ADDR(LINKCOUNT(0)),X'00') FILL(128,ADDR(MAP(0)),X'00') ASK("USER:",USER) NEWLINE PROMPT("FSYS:") READ(FSYS) SKIPSYMBOL ASK("OUTPUT TO:",OUTDEV) DEFINE("11,".OUTDEV.",500") SELECTOUTPUT(11) FLAG=DINDEX(USER,FSYS,BITADDR,INDAD,LOPAGE,HIPAGE) IF FLAG#0 THEN START SELECTOUTPUT(0) CLEAR("11") PRINTSTRING("** DINDEX FAILED ") WRITE(FLAG,3) NEWLINE PRINTSTRING("** FATAL ERROR **PROBEINDEX TERMINATES") RETURN FINISH PRINTSTRING("****************************") NEWLINE PRINTSTRING("* PROBEINDEX VERSION 3.04 *") NEWLINE PRINTSTRING("****************************") NEWLINES(2) PRINTSTRING("0. FILE INDEX DUMP") NEWLINE PRINTSTRING(" ---- ----- ----") NEWLINES(2) LINESOFOUTPUT=(H_TOP+31)>>5-1 ! MAXLINES OF OP DUMP, 32 BYTES/LINE, 0-LINESOFOUTPUT CYCLE I=0,1,LINESOFOUTPUT II=I<<3 SUPPRESSPRINT=TRUE IF SAME=TRUE SAME=TRUE IF SAME=FALSE CYCLE J=0,1,7 SAME=FALSE AND EXIT IF LASTLINE(J)#INDEX(II+J) REPEAT IF SAME=TRUE THEN START ZEROES=TRUE IF LASTLINE(0)=0 FINISH ELSE START ZEROES=FALSE IF ZEROES=TRUE SUPPRESSPRINT=FALSE IF SUPPRESSPRINT=TRUE FINISH UNLESS SUPPRESSPRINT=TRUE THEN START ! PRINT RELATIVE ADDRESS PRINTSTRING("(") PRINTHEX(I<<5,8) PRINTSTRING(") ") IF SAME=TRUE THEN START IF ZEROES=TRUE THEN PRINTSTRING("ZEROES") ELSE PRINTSTRING("SAME") FINISH ELSE START ! PRINT HEX CYCLE J=0,1,7 PRINTHEX(INDEX(II+J),8) SPACES(2) REPEAT ! PRINT CHAR REPRESENTATION CYCLE J=0,1,31 CH=BYTEINTEGER(ADDR(INDEX(II))+J) IF 32<=CH<=122 THEN PRINTSYMBOL(CH) ELSE PRINTSYMBOL(32) REPEAT FINISH NEWLINE FINISH MOVE(32,ADDR(INDEX(II)),ADDR(LASTLINE(0))) REPEAT DEAD=FALSE; ! TO ENSURE CHECKLINK LOGS ANY LINKS USED BY LISTHEADS BAD=FALSE FATAL=FALSE NEWLINES(2) PRINTSTRING("1. FILE INDEX HEADER") NEWLINE PRINTSTRING(" ---- ----- ------") NEWLINE UNLESS H_TOP=X'800' OR (X'1000'<=H_TOP<=X'8000' AND C H_TOP<<21=0 ) THEN START PRINTSTRING("** CORRUPT INDEX SIZE ") PRINTHEX(H_TOP,8) NEWLINE SELECTOUTPUT(0) CLEAR("11") PRINTSTRING("** CORRUPT INDEX SIZE ** FATAL ERROR ** PROBEINDEX TERMINATES") RETURN FINISH ! NEED SELF CONSISTENT VALUES OF LNKSTART,CELSTART AND ! NAMSTART TO GO ON. THESE ARE RELATED BY THE EQUATION ! (CELSTART-LNKSTART)<<2=NAMSTART-CELSTART ! SINCE THERE IS 1 BYTE LINK FOR EACH CELL WORD. ! SHOULD THIS NOT BE SATISFIED THEN LNKSTART CAN BE OBTAINED ! WITH 100% ACCURACY AS ADDR(H_ISTOP)-INDAD+4 ! IF THIS IS ENOUGH THEN WELL AND GOOD. IF NOT THEN ! TOTAL CELLS CAN BE CALCULATED FROM SUMMING THE BYTE INTEGER ! COMPONENTS OF H_ZNCELLS (+1 FOR EACH X'FF' VALUE). ! THIS GRANDTOTAL CAN THEN BE ADDED TO LNKSTART TO CALCULATE ! BOTH CELSTART AND NAMSTART AND WILL OF COURSE SATISFY THE ! EQUATION. IF EITHER CELSTART OR NAMSTART AGREE WITH CALC. VALUES ! THEN ALL IS WELL. ANY PROBLEM WOULD ARISE IF EITHER OR BOTH ! CELSTART AND NAMSTART WERE CORRUPT AND ZNCELLS ALSO. ! IN THIS CASE THE SELF CONSISTENT VALUES WOULD BE WRONG. ! AS A CHECK LOOK AT THE BYTEINTEGER AT INDAD+NAMSTART+ ! BYTEINTEGER(INDAD+NAMSTART)+1. THIS SHOULD BE FILENO FOR THE ! FIRST FILE. I.E. 0. IF NOT THEN PROBABLY INCORRECTLY ALIGNED ! ON THE INDEX SO GIVE UP. LNKSTART=H_LNKSTART CELSTART=H_CELSTART NAMSTART=H_NAMSTART FATAL=FALSE IF H_TOP=X'800' THEN START ! THIS CODE TEMPORARY TO CIRCUMVENT THE 2K INDEX PROBLEM ! WHILE I THINK OF A BETTER WAY TO DO THINGS IN THIS SECTION. LNKSTART=ADDR(H_ISTOP)-INDAD+4 ! ALWAYS TRUE IF LNKSTART#H_LNKSTART THEN C PRINTSTRING("** LNKSTART CORRUPT - PROBEINDEX ASSIGNS NEW VALUE ") ! CALCULATE EXPECTED VALUES OF CELSTART AND NAMSTART FROM ZNCELLS GRANDTOT=0 CYCLE I=0,1,3 ANYTHING=BYTEINTEGER(ADDR(H_ZNCELLS)+I) GRANDTOT=GRANDTOT+ANYTHING GRANDTOT=GRANDTOT+1 IF ANYTHING=X'FF' REPEAT ANYTHING=(GRANDTOT+3)&(¬3) CELSTART=LNKSTART+ANYTHING ANYTHING=(GRANDTOT*5+3)&(¬3) NAMSTART=LNKSTART+(ANYTHING+15)&(¬15) PRINTSTRING("CURRENT CALCULATED VALUES ARE: <LNKSTART>: ") PRINTHEX(LNKSTART,8) NEWLINE PRINTSTRING("<CELSTART>: ") PRINTHEX(CELSTART,8) NEWLINE PRINTSTRING("<NAMSTART>: ") PRINTHEX(NAMSTART,8) NEWLINE IF CELSTART#H_CELSTART OR NAMSTART#H_NAMSTART THEN START PRINTSTRING("** INCONSISTENT VALUES OF CELSTART/NAMSTART/ZNCELLS ** CORRUPTION INDICATED ") FATAL=TRUE FINISH ELSE PRINTSTRING( C "++ LNKSTART,CELSTART AND NAMSTART ARE SELF CONSISTENT") NEWLINES(2) FINISH ELSE START UNLESS (CELSTART-LNKSTART)<<2=NAMSTART-CELSTART AND LNKSTART#0 C THEN START PRINTSTRING("** INCONSISTENT VALUES OF LNKSTART,CELSTART AND NAMSTART ** ATTEMPTING RECOVERY ") LNKSTART=ADDR(H_ISTOP)-INDAD+4 ! ALWAYS TRUE IF LNKSTART#H_LNKSTART THEN C PRINTSTRING("** LNKSTART CORRUPT - PROBEINDEX ASSIGNS NEW VALUE ") IF (CELSTART-LNKSTART)<<2=NAMSTART-CELSTART THEN C PRINTSTRING("++ RECOVERY SUCCESSFUL - PROBEINDEX CONTINUES ") ELSE START ! CALCULATE EXPECTED VALUES OF CELSTART AND NAMSTART FROM ZNCELLS GRANDTOT=0 CYCLE I=0,1,3 ANYTHING=BYTEINTEGER(ADDR(H_ZNCELLS)+I) GRANDTOT=GRANDTOT+ANYTHING GRANDTOT=GRANDTOT+1 IF ANYTHING=X'FF' REPEAT CELSTART=LNKSTART+GRANDTOT IF CELSTART#H_CELSTART THEN C PRINTSTRING("** CELSTART CORRUPT - PROBEINDEX ASSIGNS NEW VALUE ") NAMSTART=CELSTART+GRANDTOT<<2 IF NAMSTART#H_NAMSTART THEN C PRINTSTRING("** NAMSTART CORRUPT - PROBEINDEX ASSIGNS NEW VALUE ") PRINTSTRING("CURRENT VALUES ARE: <LNKSTART>: ") PRINTHEX(LNKSTART,8) NEWLINE PRINTSTRING("<CELSTART>: ") PRINTHEX(CELSTART,8) NEWLINE PRINTSTRING("<NAMSTART>: ") PRINTHEX(NAMSTART,8) NEWLINE IF CELSTART#H_CELSTART AND NAMSTART#H_NAMSTART THEN START ! CHECK ALIGNMENT ON INDEX IF BYTEINTEGER(INDAD+NAMSTART+BYTEINTEGER(INDAD+NAMSTART)+1)#0 C THEN FATAL=TRUE AND PRINTSTRING( C "** NEW CALCULATED VALUES NOT CONSISTENT WITH INDEX CONTENTS ** RECOVERY FAILS ") FINISH IF FATAL=FALSE THEN PRINTSTRING("++ RECOVERY SUCCESSFUL ") FINISH FINISH ELSE PRINTSTRING( C "++ LNKSTART,CELSTART AND NAMSTART ARE SELF CONSISTENT") NEWLINES(2) FINISH IF FATAL=TRUE THEN START PRINTSTRING("** PROBEINDEX TERMINATES") SELECTOUTPUT(0) CLEAR("11") PRINTSTRING("** FATAL ERROR DETECTED ** INCONSISTENT LNKSTART,CELSTART AND NAMSTART ** PROBEINDEX TERMINATES") RETURN FINISH LNKSTART=LNKSTART+INDAD CELSTART=CELSTART+INDAD NAMSTART=NAMSTART+INDAD SPACES(78) PRINTSTRING("OFFSET IN HEADER (HEX) ") ! CHECK FOR SENSIBLE USERNAME ! LENGTH BYTE UNLESS BYTEINTEGER(INDAD)=6 THEN START PRINTSTRING("** CORRUPT INDEX - LENGTH OF OWNER STRING IS ") WRITE(BYTEINTEGER(INDAD),5) NEWLINE BAD=TRUE FINISH ! NOW CHECK THAT USERNAME CONTAINS VALID CHARS CYCLE I=1,1,6 CH=BYTEINTEGER(INDAD+I) UNLESS 'A'<=CH<='Z' OR '0'<=CH<='9' THEN START PRINTSTRING("** CORRUPT INDEX - ILLEGAL CHARACTER ") PRINTHEX(CH,1) PRINTSTRING(" IN USERNAME") NEWLINE BAD=TRUE IF BAD=FALSE FINISH REPEAT PRINTSTRING("INDEX OWNER <OWNER>: ") IF BAD=FALSE THEN PRINTSTRING(H_OWNER) ELSE C PRINTHEX(INTEGER(INDAD),8) AND PRINTHEX(INTEGER(INDAD+4),8) IF BAD=FALSE THEN SPACES(39) ELSE SPACES(29) PRINTSTRING("0000") NEWLINE BAD=FALSE PRINTSTRING("PROCESS LAST USED <DATE>: ") PRINTSTRING(PRINTDATE(H_DATE)) SPACES(37) PRINTHEX(ADDR(H_DATE)-INDAD,4) NEWLINE PRINTCHAIN("OWNER IS",H_SURNAME,TRUE) PRINTCHAIN("DELIVERY INFO",H_DELY,TRUE) PRINTCHAIN("ADDRESS/TELE NO",H_ADRTELE,FALSE) PRINTCHAIN("GROUP HOLDER",H_GPHOLDR,FALSE) PRINTCHAIN("WHOLE INDEX PERMISSIONS",H_ALNK,FALSE) PRINTCHAIN("INTERACTIVE BASEFILE",H_BASEF,FALSE) PRINTCHAIN("BATCH BASEFILE",H_BATCHSS,FALSE) PRINTCHAIN("TEST SUBSYSTEM",H_SPECIALSS,FALSE) PRINTCHAIN("DIR. PROC. MONITOR FILE",H_LOGFILE,FALSE) PRINTCHAIN("STARTFILE",H_STARTF,FALSE) ! TEMP** PRINTCHAIN("SPARE LISTHEAD",H_SPFF1,FALSE) PRINTSTRING("DIRECTOR VERSION <DIRVSN>: ") WRITE(H_DIRVSN,4) PRINTSTRING(" (255 = DEFAULT)") SPACES(22) PRINTHEX(ADDR(H_DIRVSN)-INDAD,4) NEWLINE ! ABCDEFG ! NOW CHECK INDEX SIZE ! SHOULD BE 2K OR 4K<=SIZE<=32K : MUST BE MULTIPLE OF 1K PRINTSTRING("INDEX SIZE <TOP>: ") WRITE(H_TOP>>10,2) PRINTSTRING(" K") SPACES(40) PRINTHEX(ADDR(H_TOP)-INDAD,4) NEWLINE PRINTSTRING(COLONS) !****************************************** NEWLINES(2) PRINTSTRING("PROCESS LIMIT INFORMATION ------- ----- -----------") NEWLINE PRINTSTRING("PROCESS ACR <ACR>: ") WRITE(H_ACR,3) PRINTSTRING(" (0 = DEFAULT)") SPACES(20) PRINTHEX(ADDR(H_ACR)-INDAD,4) NEWLINE PRINTSTRING("SECTION SIZE <SECTSI>: ") WRITE(H_SECTSI,4) SPACES(37) PRINTHEX(ADDR(H_SECTSI)-INDAD,4) NEWLINE PRINTSTRING("PROCESSOR STACK (K) <STKKB>: ") WRITE(H_STKKB,4) PRINTSTRING(" (0 = DEFAULT)") SPACES(20) PRINTHEX(ADDR(H_STKKB)-INDAD,4) NEWLINE PRINTSTRING("ARCHIVE INDEX SIZE (BYTES) <ATOP>: ") WRITE(H_ATOP,11) SPACES(37) PRINTHEX(ADDR(H_ATOP)-INDAD,4) NEWLINE PRINTSTRING("MAX FILE SIZE (K) <MAXFILE>: ") WRITE(H_MAXFILE,11) PRINTSTRING(" (0 = DEFAULT)") SPACES(20) PRINTHEX(ADDR(H_MAXFILE)-INDAD,4) NEWLINE PRINTSTRING("MAX FILE SPACE (K) <MAXKB>: ") WRITE(H_MAXKB,11) SPACES(37) PRINTHEX(ADDR(H_MAXKB)-INDAD,4) NEWLINE PRINTSTRING("INTERACTIVE NUTS ASSIGNED <INUTS>: ") WRITE(H_INUTS,11) SPACES(37) PRINTHEX(ADDR(H_INUTS)-INDAD,4) NEWLINE PRINTSTRING("BATCH NUTS ASSIGNED <BNUTS>: ") WRITE(H_BNUTS,11) SPACES(37) PRINTHEX(ADDR(H_BNUTS)-INDAD,4) NEWLINE !****************************************** PRINTSTRING(COLONS) NEWLINES(2) PRINTSTRING("CURRENT STATUS OF FILES ------- ------ -- -----") NEWLINE PRINTSTRING("ON-LINE FILES <FILES>: ") WRITE(H_FILES,11) SPACES(28) PRINTHEX(ADDR(H_FILES)-INDAD,4) NEWLINE PRINTSTRING("USED FILE DESCRIPTORS <USEDFDS>: ") WRITE(H_USEDFDS,11) SPACES(28) PRINTHEX(ADDR(H_USEDFDS)-INDAD,4) NEWLINE PRINTSTRING("FREEBYTES IN INDEX <FREEBYTES>: ") WRITE(H_FREEBYTES,11) SPACES(28) PRINTHEX(ADDR(H_FREEBYTES)-INDAD,4) NEWLINE PRINTSTRING("TOTAL KB <TOTKB>: ") WRITE(H_TOTKB,11) SPACES(28) PRINTHEX(ADDR(H_TOTKB)-INDAD,4) NEWLINE PRINTSTRING("ARCHIVE FILES <AFILES>: ") WRITE(H_AFILES,11) SPACES(28) PRINTHEX(ADDR(H_AFILES)-INDAD,4) NEWLINE PRINTSTRING("ARCHIVE INDEX FILE DESCRIPTORS <USEDAFDS>: ") WRITE(H_USEDAFDS,11) SPACES(28) PRINTHEX(ADDR(H_USEDAFDS)-INDAD,4) NEWLINE PRINTSTRING("ARCHIVE INDEX E-PAGES <AKB>: ") WRITE(H_AKB,11) SPACES(28) PRINTHEX(ADDR(H_AKB)-INDAD,4) NEWLINE PRINTSTRING("ON-LINE CHERISHED FILES <CHERFILES>: ") WRITE(H_CHERFILES,11) SPACES(28) PRINTHEX(ADDR(H_CHERFILES)-INDAD,4) NEWLINE PRINTSTRING("KB CHERISHED FILES <CHERKB>: ") WRITE(H_CHERKB,11) SPACES(28) PRINTHEX(ADDR(H_CHERKB)-INDAD,4) NEWLINE PRINTSTRING("ON-LINE TEMP FILESPACE USED (K) <TEMPKB>: ") WRITE(H_TEMPKB,11) SPACES(28) PRINTHEX(ADDR(H_TEMPKB)-INDAD,4) NEWLINE PRINTSTRING("TYPE 0 ARCHIVE FILES <FILES0>: ") WRITE(H_FILES0,11) SPACES(28) PRINTHEX(ADDR(H_FILES0)-INDAD,4) NEWLINE PRINTSTRING("TYPE 1 ARCHIVE FILES <FILES1>: ") WRITE(H_FILES1,11) SPACES(28) PRINTHEX(ADDR(H_FILES1)-INDAD,4) NEWLINE PRINTSTRING("TYPE 2 ARCHIVE FILES <FILES2>: ") WRITE(H_FILES2,11) SPACES(28) PRINTHEX(ADDR(H_FILES2)-INDAD,4) NEWLINE PRINTSTRING("TYPE 3 ARCHIVE FILES <FILES3>: ") WRITE(H_FILES3,11) SPACES(28) PRINTHEX(ADDR(H_FILES3)-INDAD,4) NEWLINE PRINTSTRING(COLONS) NEWLINES(2) PRINTSTRING("CURRENT PROCESS ACTIVITY") NEWLINE PRINTSTRING("------- ------- --------") NEWLINE PRINTSTRING("CURR. ACTIVE PROCESSES") NEWLINE PRINTSTRING("INTERACTIVE <IUSE>: ") WRITE(H_IUSE,4) SPACES(41) PRINTHEX(ADDR(H_IUSE)-INDAD,4) NEWLINE PRINTSTRING("BATCH <BUSE>: ") WRITE(H_BUSE,4) SPACES(41) PRINTHEX(ADDR(H_BUSE)-INDAD,4) NEWLINE PRINTSTRING("CURRENT SESSION LENGTH (MIN) <ISESSM>: ") WRITE(H_ISESSM,4) PRINTSTRING(" (0 = DEFAULT)") SPACES(26) PRINTHEX(ADDR(H_ISESSM)-INDAD,4) NEWLINE PRINTSTRING("CONCURRENCY LIMITS (0 = SITE DEFAULT)") NEWLINE PRINTSTRING("INTERACTIVE <IMAX>: ") WRITE(H_IMAX,4) SPACES(41) PRINTHEX(ADDR(H_IMAX)-INDAD,4) NEWLINE PRINTSTRING("BATCH <BMAX>: ") WRITE(H_BMAX,4) SPACES(41) PRINTHEX(ADDR(H_BMAX)-INDAD,4) NEWLINE PRINTSTRING("TOTAL <TMAX>: ") WRITE(H_TMAX,4) SPACES(41) PRINTHEX(ADDR(H_TMAX)-INDAD,4) NEWLINE PRINTSTRING(COLONS) !************************************************ !************************************************************** NEWLINES(2) PRINTSTRING("MACHINE USAGE INFORMATION") NEWLINE PRINTSTRING("------- ----- -----------") NEWLINE PRINTSTRING("INTERACTIVE OCP TIME (MS) <IMSECS>: ") WRITE(H_IMSECS,11) SPACES(20) PRINTHEX(ADDR(H_IMSECS)-INDAD,4) NEWLINE PRINTSTRING("BATCH OCP TIME (MS) <BMSECS>: ") WRITE(H_BMSECS,11) SPACES(20) PRINTHEX(ADDR(H_BMSECS)-INDAD,4) NEWLINE PRINTSTRING("INTERACTIVE PAGETURNS <IPTRNS>: ") WRITE(H_IPTRNS,11) SPACES(20) PRINTHEX(ADDR(H_IPTRNS)-INDAD,4) NEWLINE PRINTSTRING("BATCH PAGETURNS <BPTRNS>: ") WRITE(H_BPTRNS,11) SPACES(20) PRINTHEX(ADDR(H_BPTRNS)-INDAD,4) NEWLINE PRINTSTRING("INTERACTIVE MACHINE INSTRUCTIONS (K) <IINSTRS>: ") WRITE(H_IINSTRS,11) SPACES(20) PRINTHEX(ADDR(H_IINSTRS)-INDAD,4) NEWLINE PRINTSTRING("BATCH MACHINE INSTRUCTIONS (K) <BINSTRS>: ") WRITE(H_BINSTRS,11) SPACES(20) PRINTHEX(ADDR(H_BINSTRS)-INDAD,4) NEWLINE PRINTSTRING("DIR. PROC. MACHINE INSTRUCTIONS (K) <DINSTRS>: ") WRITE(H_DINSTRS,11) SPACES(20) PRINTHEX(ADDR(H_DINSTRS)-INDAD,4) NEWLINE PRINTSTRING("KBYTES SPOOLED IN <NKBIN>: ") WRITE(H_NKBIN,11) SPACES(20) PRINTHEX(ADDR(H_NKBIN)-INDAD,4) NEWLINE PRINTSTRING("KBYTES SPOOLED OUT <NKBOUT>: ") WRITE(H_NKBOUT,11) SPACES(20) PRINTHEX(ADDR(H_NKBOUT)-INDAD,4) NEWLINE PRINTSTRING("CUMULATIVE CONNECT TIME (S) <CONNECTT>: ") WRITE(H_CONNECTT,12) SPACES(20) PRINTHEX(ADDR(H_CONNECTT)-INDAD,4) NEWLINE PRINTSTRING("CUMULATIVE FILES RESTORED FROM ARCHIVE <ARESTORES>: ") WRITE(H_ARESTORES,12) SPACES(20) PRINTHEX(ADDR(H_ARESTORES)-INDAD,4) NEWLINE !************************************************************ PRINTSTRING(COLONS) NEWLINES(2) PRINTSTRING("LISTPOOL INFORMATION") NEWLINE PRINTSTRING("-------- -----------") NEWLINE PRINTSTRING("LISTPOOL 0 1 2 3") NEWLINE PRINTSTRING("TOTAL CELLS <ZNCELLS> ") CYCLE I=0,1,3 WRITE(BYTEINTEGER(ADDR(H_ZNCELLS)+I),4) REPEAT SPACES(41) PRINTHEX(ADDR(H_ZNCELLS)-INDAD,4) NEWLINE PRINTSTRING("FREE CELLS <ZFREEC> ") CYCLE I=0,1,3 WRITE(BYTEINTEGER(ADDR(H_ZFREEC)+I),4) REPEAT SPACES(41) PRINTHEX(ADDR(H_ZFREEC)-INDAD,4) NEWLINE PRINTSTRING("NEXT FREE (HEX) <ZASL> ") CYCLE I=0,1,3 SPACES(3) PRINTHEX(BYTEINTEGER(ADDR(H_ZASL)+I),2) REPEAT SPACES(41) PRINTHEX(ADDR(H_ZASL)-INDAD,4) NEWLINE PRINTSTRING(COLONS) NEWLINES(2) PRINTSTRING("LISTHEAD AND BYTE OFFSET INFORMATION (HEX)") NEWLINE PRINTSTRING("-------- --- ---- ------ -----------") NEWLINE PRINTSTRING("WHOLE INDEX PERMISSION CELLS <ALNK>: ") PRINTHEX(H_ALNK,2) SPACES(26) PRINTHEX(ADDR(H_ALNK)-INDAD,4) NEWLINE PRINTSTRING("SURNAME LISTHEAD <SURNAME>: ") PRINTHEX(H_SURNAME,2) SPACES(26) PRINTHEX(ADDR(H_SURNAME)-INDAD,4) NEWLINE PRINTSTRING("BYTE OFFSET OF LINKS FOR POOL 0 <LNKSTART>: ") PRINTHEX(H_LNKSTART,8) SPACES(26) PRINTHEX(ADDR(H_LNKSTART)-INDAD,4) NEWLINE PRINTSTRING("BYTE OFFSET OF CELLS FOR POOL 0 <CELSTART>: ") PRINTHEX(H_CELSTART,8) SPACES(26) PRINTHEX(ADDR(H_CELSTART)-INDAD,4) NEWLINE PRINTSTRING("BYTE OFFSET OF FILENAME STORAGE AREA <NAMSTART>: ") PRINTHEX(H_NAMSTART,8) SPACES(26) PRINTHEX(ADDR(H_NAMSTART)-INDAD,4) NEWLINE PRINTSTRING("BYTE OFFSET OF NEXT FILENAME <NEXNAM>: ") PRINTHEX(H_NEXNAM,8) SPACES(26) PRINTHEX(ADDR(H_NEXNAM)-INDAD,4) NEWLINE PRINTSTRING("BYTE OFFSET OF NEXT FREE DESC. <LOFDAD>: ") PRINTHEX(H_LOFDAD,8) SPACES(26) PRINTHEX(ADDR(H_LOFDAD)-INDAD,4) NEWLINE PRINTSTRING("LIST POOL 0 LISTHEAD OF BASEFILE <BASEF>: ") PRINTHEX(H_BASEF,2) PRINTSTRING(" (NULL => FIXED SITE)") SPACES(3) PRINTHEX(ADDR(H_BASEF)-INDAD,4) NEWLINE PRINTSTRING("LIST POOL 0 LISTHEAD OF DELY INFO <DELY>: ") PRINTHEX(H_DELY,2) SPACES(26) PRINTHEX(ADDR(H_DELY)-INDAD,4) NEWLINE PRINTSTRING("LIST POOL 0 LISTHEAD OF ADRTELE <ADRTELE>: ") PRINTHEX(H_ADRTELE,2) SPACES(26) PRINTHEX(ADDR(H_ADRTELE)-INDAD,4) NEWLINE PRINTSTRING("LIST POOL 0 LISTHEAD DIR. PROC. MONITOR FILE <LOGFILE>: ") PRINTHEX(H_LOGFILE,2) SPACES(26) PRINTHEX(ADDR(H_LOGFILE)-INDAD,4) NEWLINE PRINTSTRING("LIST POOL 0 LISTHEAD TEST SUBSYSTEM <SPECIALSS>: ") PRINTHEX(H_SPECIALSS,2) SPACES(26) PRINTHEX(ADDR(H_SPECIALSS)-INDAD,4) NEWLINE PRINTSTRING("LIST POOL 0 LISTHEAD OF GROUP HOLDER <GPHOLDER>: ") PRINTHEX(H_GPHOLDR,2) SPACES(26) PRINTHEX(ADDR(H_GPHOLDR)-INDAD,4) NEWLINE PRINTSTRING("LIST POOL 0 LISTHEAD OF BATCH BASEFILE <BATCHSS>: ") PRINTHEX(H_BATCHSS,2) SPACES(26) PRINTHEX(ADDR(H_BATCHSS)-INDAD,4) NEWLINE PRINTSTRING("LIST POOL 0 LISTHEAD OF STARTFILE <STARTF>: ") PRINTHEX(H_STARTF,2) SPACES(26) PRINTHEX(ADDR(H_STARTF)-INDAD,4) NEWLINE PRINTSTRING("LIST POOL 0 SPARE LISTHEAD <SPFF1>: ") PRINTHEX(H_SPFF1,2) PRINTSTRING(" (SHOULD BE FF)") SPACES(9) PRINTHEX(ADDR(H_SPFF1)-INDAD,4) NEWLINE PRINTSTRING(COLONS) !***************************************************** NEWLINES(2) PRINTSTRING("SEMAPHORE VALUES AND CHECKSUMS") NEWLINE PRINTSTRING("--------- ------ --- ---------") NEWLINE PRINTSTRING("INDEX SEMAPHORE NUMBER <SEMANO>: ") PRINTHEX(H_SEMANO,8) SPACES(37) PRINTHEX(ADDR(H_SEMANO)-INDAD,4) NEWLINE PRINTSTRING("INDEX SEMAPHORE WORD <SEMA>: ") PRINTHEX(H_SEMA,8) SPACES(37) PRINTHEX(ADDR(H_SEMA)-INDAD,4) NEWLINE PRINTSTRING("MESSAGE FILE SEMAPHORE WORD <MSGSEMA>: ") PRINTHEX(H_MSGSEMA,8) SPACES(37) PRINTHEX(ADDR(H_MSGSEMA)-INDAD,4) NEWLINE PRINTSTRING("ARCHIVE INDEX CHECKSUM <CHKSUM>: ") PRINTHEX(H_CHKSUM,8) SPACES(37) PRINTHEX(ADDR(H_CHKSUM)-INDAD,4) NEWLINE PRINTSTRING("ARCHIVE INDEX SEMAPHORE WORD <ASEMA>: ") PRINTHEX(H_ASEMA,8) SPACES(37) PRINTHEX(ADDR(H_ASEMA)-INDAD,4) NEWLINE PRINTSTRING(COLONS) NEWLINES(2) PRINTSTRING("DIRECTOR MONITOR INFO") NEWLINE PRINTSTRING("-------- ------- ----") NEWLINE PRINTSTRING("DIRECTOR CALL BIT MASK <DIRMON>: ") PRINTHEX(H_DIRMON,8) SPACES(44) PRINTHEX(ADDR(H_DIRMON)-INDAD,4) NEWLINE PRINTSTRING("SIGNAL MONITORING LEVEL <SIGMON>: ") WRITE(H_SIGMON,4) SPACES(44) PRINTHEX(ADDR(H_SIGMON)-INDAD,4) NEWLINE PRINTSTRING("MONITOR DEPTH <DEPTH>: ") WRITE(H_DEPTH,4) SPACES(44) PRINTHEX(ADDR(H_DEPTH)-INDAD,4) NEWLINE PRINTSTRING(COLONS) !******************************************** NEWLINES(2) PRINTSTRING("BYTE OFFSET OF LINKS FOR POOL 0 <XLNKST>: ") PRINTHEX(H_XLNKST,8) PRINTSTRING(" ** NOT USED **") SPACES(9) PRINTHEX(ADDR(H_XLNKST)-INDAD,4) NEWLINE PRINTSTRING("BYTE OFFSET OF CELLS FOR POOL 0 <XCELST>: ") PRINTHEX(H_XCELST,8) PRINTSTRING(" ** NOT USED **") SPACES(9) PRINTHEX(ADDR(H_XCELST)-INDAD,4) NEWLINE PRINTSTRING("BYTE OFFSET OF FILENAME STORAGE AREA <XNAMST>: ") PRINTHEX(H_XNAMST,8) PRINTSTRING(" ** NOT USED **") SPACES(9) PRINTHEX(ADDR(H_XNAMST)-INDAD,4) NEWLINE PRINTSTRING("INDEX SIZE <XTOP>: ") PRINTHEX(H_XTOP,8) PRINTSTRING(" ** NOT USED **") SPACES(9) PRINTHEX(ADDR(H_XTOP)-INDAD,4) NEWLINE PRINTSTRING("FLAG <FLAG>: ") SPACES(14) PRINTHEX(H_FLAG,2) PRINTSTRING(" ** NOT USED **") SPACES(9) PRINTHEX(ADDR(H_FLAG)-INDAD,4) NEWLINE PRINTSTRING("USE <USE>: ") SPACES(14) PRINTHEX(H_USE,2) PRINTSTRING(" ** NOT USED **") SPACES(9) PRINTHEX(ADDR(H_USE)-INDAD,4) NEWLINE PRINTSTRING("IMARK <IMARK>: ") SPACES(14) PRINTHEX(H_IMARK,2) PRINTSTRING(" ** NOT USED **") SPACES(9) PRINTHEX(ADDR(H_IMARK)-INDAD,4) NEWLINE PRINTSTRING("TRYING <TRYING>: ") SPACES(14) PRINTHEX(H_TRYING,8) PRINTSTRING(" ** NOT USED **") SPACES(9) PRINTHEX(ADDR(H_TRYING)-INDAD,4) NEWLINE PRINTSTRING("CODES <CODES>: ") SPACES(14) PRINTHEX(H_CODES,2) PRINTSTRING(" ** NOT USED **") SPACES(9) PRINTHEX(ADDR(H_CODES)-INDAD,4) NEWLINE PRINTSTRING("CONCURR <CONCURR>: ") SPACES(14) PRINTHEX(H_CONCURR,2) PRINTSTRING(" ** NOT USED **") SPACES(9) PRINTHEX(ADDR(H_CONCURR)-INDAD,4) NEWLINE PRINTSTRING("MSGSPRIV <MSGSPRIV>: ") SPACES(14) PRINTHEX(H_MSGSPRIV,2) PRINTSTRING(" ** NOT USED **") SPACES(9) PRINTHEX(ADDR(H_MSGSPRIV)-INDAD,4) NEWLINE PRINTSTRING("SPARE WORD <SPA0>: ") SPACES(14) PRINTHEX(H_SPA0,8) PRINTSTRING(" ** NOT USED **") SPACES(9) PRINTHEX(ADDR(H_SPA0)-INDAD,4) NEWLINE PRINTSTRING("RECORD FORMAT END MARKER <ISTOP>: ") SPACES(14) PRINTHEX(H_ISTOP,8) SPACES(26) PRINTHEX(ADDR(H_ISTOP)-INDAD,4) NEWLINE PRINTSTRING(COLONS) NEWLINES(2) !****************************** IF H_LOFDAD-H_NEXNAM=H_FREEBYTES THEN C PRINTSTRING("++ LOFDAD,NEXNAM AND FREEBYTES INTERNALLY CONSISTENT ") ELSE C PRINTSTRING("** LOFDAD,NEXNAM AND FREEBYTES NOT CONSISTENT ") !::::::::::::::::::::::::::::::::::::::::: FILENO=0; ! FILE NUMBER NEXNAM=0; ! CUMULATIVE POINTER TO START OF NEXT FILENAME RELATIVE ! TO NAMSTART - CALC FROM FILENAME AREA INFO CONFIDENT=TRUE; ! DESCRIBES HOW ACCURATE PROGRAM JUDGES NEXNAM TO BE ! TRUE == O.K., FALSE == UNLIKELY TO BE CORRECT DEAD=FALSE; ! I.E. ALIVE NEWLINES(2) PRINTSTRING("2. FILE INDEX FILEINFO") NEWLINE PRINTSTRING(" ---- ----- --------") NEWLINES(2) ! DUMPBITMAP(0) TOP=INDAD+H_TOP SECTSI=H_SECTSI USEDFDS=H_USEDFDS LOFDAD=INDAD+H_LOFDAD CUR=TOP-FDSIZE ! MUST GET RELIABLE LOFDAD IF PROGRAM TO GO ON ! THERE ARE THREE EQUATIONS LINKING LOFDAD ETC. ! LOFDAD-NEXNAM=FREEBYTES 1. ! TOP-LOFDAD=USEDFDS*FDSIZE 2. ! AND 1+2 ! TOP-NEXNAM=FREEBYTES+USEDFDS*FDSIZE 3. UNLESS 0<=TOP-LOFDAD=USEDFDS*FDSIZE THEN START ! 2. HAS NOT BEEN SATISFIED IF HERE PRINTSTRING("** EITHER OR BOTH LOFDAD AND USEDFDS CORRUPT ** PROBEINDEX INVESTIGATING ") IF H_LOFDAD-H_NEXNAM=H_FREEBYTES THEN GOOD1=TRUE ELSE GOOD1=FALSE IF H_TOP-H_NEXNAM=H_FREEBYTES+USEDFDS*FDSIZE THEN GOOD3=TRUE C ELSE GOOD3=FALSE IF GOOD1=FALSE AND GOOD3=FALSE THEN FATAL=TRUE AND C PRINTSTRING("** PROBEINDEX CANNOT RESOLVE -WIDESPREAD CORRUPTION ** INVOLVING LOFDAD,USEDFDS,NEXNAM AND FREEBYTES ") IF GOOD1=TRUE AND GOOD3=TRUE THEN FATAL=TRUE AND C PRINTSTRING("** PROGRAM ERROR OR INCREDIBLE COINCIDENCE ** SEND O/P TO C MCCALLUM ERCC KB ") IF FATAL=FALSE THEN START IF GOOD3=TRUE THEN START ! USEDFDS IS O.K. PRINTSTRING("** LOFDAD CORRUPT - ATTEMPTING RECOVERY ") ! RECALCULATE LOFDAD=H_TOP-USEDFDS*FDSIZE UNLESS LOFDAD-H_NEXNAM=H_FREEBYTES THEN START FATAL=TRUE PRINTSTRING("** RECOVERY FAILS - WIDESPREAD CORRUPTION ** FATAL ERROR ** PROBEINDEX TERMINATES") FINISH ELSE LOFDAD=LOFDAD+INDAD AND C PRINTSTRING("++ RECOVERY SUCCEEDS - PROBEINDEX CONTINUES ") FINISH ELSE PRINTSTRING("** USEDFDS CORRUPT ") ! I.E. LOFDAD O.K. FINISH IF FATAL=TRUE THEN START SELECTOUTPUT(0) CLEAR("11") PRINTSTRING("** FATAL ERROR ** NO CONSISTENT LOFDAD OBTAINABLE ** PROBEINDEX TERMINATES") RETURN FINISH FINISH DEADFILES=0 TOTALKB=0 NCHERISHED=0 CHERISHEDKB=0 TEMPKBUSED=0 CORRUPTDESCRIPTOR=FALSE FILENAME="" PRINTSTRING("FILENO NAME POOL OWNP EEP CCT ARCH USE ") PRINTSTRING("CODES CODES2 PGS PLNK SECTIONS SSBYTE SP15 ALNK ") PRINTSTRING("OFFERS/PRMS") NEWLINES(2) PRINTSTRING(MINUS.MINUS) NEWLINE WHILE CUR>=LOFDAD CYCLE ! GO ROUND THE FILES CFLAG=FALSE; ! CONTAINS VALUE OF CONFIDENT CALCULATED BY THIS CYCLE FDESC==RECORD(CUR) FDPAGES=FDESC_PGSNAM>>16 NAMOFF=FDESC_PGSNAM&X'FFFF' ! NAMOFF IS NAME OFFSET FROM NAMSTART AS GIVEN BY CURRENT DESCRIPTOR ! NAMOFF AND NEXNAM SHOULD AGREE IF NAMOFF#NEXNAM THEN START PRINTSTRING("** INCONSISTENCY IN LOCATION OF CURRENT NAME DETECTED") NEWLINE IF CONFIDENT=TRUE THEN START ADDRNAM=NAMSTART+NEXNAM PRINTSTRING("** CORRUPTION SUSPECTED IN DESCRIPTOR") NEWLINE CORRUPTDESCRIPTOR=TRUE IF CORRUPTDESCRIPTOR=FALSE FINISH ELSE ADDRNAM=NAMSTART+NAMOFF FINISH ELSE ADDRNAM=NAMSTART+NEXNAM ! TRY TO GET FILENAME ! ****** ! THERE ARE THREE HOOKS IN THE FILENAME AREA ! 1. LENGTH BYTE OF CURRENT FILENAME (L) ! 2. CURRENT FILE NO L+1 BYTES FURTHER ! 3. NEXT LENGTH BYTE L+2 BYTES ON ! IF CAN FIND ANY TWO OF THESE PROGRAM CAN CALCULATE AN ! ACCURATE NEXNAM FOR THE NEXT FILE ! ****** ! TEST LENGTH BYTE LEN=BYTEINTEGER(ADDRNAM) IF 0<LEN<=11 THEN START ! IN RANGE THOUGH NOT NECESSARILY CORRECT IF BYTEINTEGER(ADDRNAM+LEN+1)=FILENO THEN START ! FOUND EXPECTED FILE NO MOVE(LEN+1,ADDRNAM,ADDR(FILENAME)) CFLAG=TRUE FINISH ELSE START PRINTSTRING("** INCONSISTENCY IN CURRENT FILENAME - ". C "ATTEMPTING DIAGNOSIS AND RECOVERY") NEWLINE FINISH FINISH ELSE PRINTSTRING("** ERROR - LENGTH BYTE OF ". C "FILENAME OUT OF RANGE - TRYING TO RECOVER") NEWLINE IF CFLAG=FALSE THEN START ! LOOK FOR FILENO+NEXT LENGTH BYTE PATTERN ADDR2=ADDRNAM+12 ! MAX EXTENT OF A FIELD CYCLE I=ADDRNAM,1,ADDR2 J=I IF BYTEINTEGER(I)=FILENO AND 0<BYTEINTEGER(I+1)<=11 THEN START CFLAG=TRUE EXIT PRINTSTRING("** PROBEINDEX DIAGNOSES CORRUPT LENGTH BYTE IN FILENAME") NEWLINE FINISH REPEAT IF CFLAG=FALSE AND 0<LEN<=11 AND 0<BYTEINTEGER(ADDRNAM+LEN+2)<=11 C THEN START ! IF LENGTH IN RANGE LOOK AT EXPECTED ADDR OF NEXT LENGTH BYTE ! IF THIS LOOKS O.K. THEN FILENO PROB CORRUPT ! OTHER CASE VIZ. LEN O.K., FILENO O.K., NEXTLEN BAD WOULD ! HAVE APPEARED NORMAL IN THIS CYCLE CFLAG=TRUE PRINTSTRING("** PROBEINDEX DIAGNOSES CORRUPT FILENO ON CURRENT FILE") NEWLINE MOVE(LEN+1,ADDRNAM,ADDR(FILENAME)) FINISH FINISH IF CFLAG=FALSE THEN START ! DIRE PROBLEMS PRINTSTRING("** ATTEMPT TO RECOVER FILENAME ABANDONED - ". C "LARGE SCALE CORRUPTION INDICATED") NEWLINE PRINTSTRING("AREA CONTAINS: ") CYCLE I=ADDRNAM,1,ADDR2 PRINTHEX(BYTEINTEGER(I),2) REPEAT SPACES(2) CYCLE I=ADDRNAM,1,ADDR2 PRINTCH(BYTEINTEGER(I)) REPEAT FINISH ! VALIDATE FILENAME IF ONE RETRIEVED IF CFLAG=TRUE THEN START ! 1ST CHAR BADNAME=TRUE MEANS IT'S BAD BADNAME=FALSE CH=BYTEINTEGER(ADDR(FILENAME)+1) UNLESS 'A'<=CH<='Z' OR CH='#' THEN START PRINTSTRING("** FILENAME HAS ILLEGAL 1ST CHAR (HEX) - ") PRINTHEX(CH,2) NEWLINE BADNAME=TRUE IF BADNAME=FALSE FINISH FLEN=LENGTH(FILENAME) IF FLEN>1 THEN START CYCLE I=2,1,FLEN CH=BYTEINTEGER(ADDR(FILENAME)+I) UNLESS 'A'<=CH<='Z' OR '0'<=CH<='9' OR CH='#' THEN START PRINTSTRING("** FILENAME CHAR ") WRITE(I,3) PRINTSTRING(" ILLEGAL - (HEX) ") PRINTHEX(CH,2) NEWLINE BADNAME=TRUE IF BADNAME=FALSE FINISH REPEAT FINISH FINISH ELSE FILENAME=" " ! NOW QUICK CHECKS ON OWNP,EEP AND POOL ! 0<=POOL<=3 POOL=FDESC_POOL&X'3' IF POOL#FDESC_POOL THEN START PRINTSTRING("** POOL VALUE OUT OF RANGE - USING POOL&X'3'") NEWLINE CORRUPTDESCRIPTOR=TRUE IF CORRUPTDESCRIPTOR=FALSE FINISH IF FDESC_OWNP&X'F'#FDESC_OWNP THEN START PRINTSTRING("** OWNP OUT OF RANGE") NEWLINE CORRUPTDESCRIPTOR=TRUE IF CORRUPTDESCRIPTOR=FALSE FINISH ! DON'T NEED TO USE OWNP AND EEP LATER SO MERELY REPORT IF CORRUPT IF FDESC_EEP&X'F'#FDESC_EEP THEN START PRINTSTRING("** EEP OUT OF RANGE") NEWLINE CORRUPTDESCRIPTOR=TRUE IF CORRUPTDESCRIPTOR=FALSE FINISH ! IS IT A DEAD FILE? DEAD=TRUE IF FDESC_CODES2&128=128 ! NOW GET SECTIONS USED AND 1. CHECK AGAINST PGSNAM 2.CHECK PAGE LIMS IF FDESC_PLNK#X'FF' THEN C TRACECHAIN(POOL,FDESC_PLNK,TRUE,SECTCELLS,SCOUNT) ELSE SCOUNT=0 ! UPDATE COUNT OF LINKS USED LINKCOUNT(POOL)=LINKCOUNT(POOL)+SCOUNT IF DEAD=FALSE IF SCOUNT#(FDPAGES+SECTSI-1)//SECTSI THEN START UNLESS SCOUNT=0 THEN START CORRUPTDESCRIPTOR=TRUE IF CORRUPTDESCRIPTOR=FALSE PRINTSTRING("** PLIST WRONG LENGTH") NEWLINE IF CONFIDENT=TRUE THEN C PRINTSTRING("** CAVEAT: DESCRIPTOR PGSNAM INTEGER SUSPECTED CORRUPT". C " - PLIST MAY BE ACCURATE") AND NEWLINE FINISH FINISH IF SCOUNT=0 AND DEAD=FALSE THEN C PRINTSTRING("** FILE NOT DEAD - NO PAGES ASSIGNED ") IF SCOUNT#0 AND DEAD=TRUE THEN C PRINTSTRING("** WARNING - FILE DEAD, A/PLNK NOT NULL ") ! CHECK PAGE BOUNDS IF SCOUNT#0 THEN START CYCLE I=1,1,SCOUNT UNLESS LOPAGE<=SECTCELLS(I)<=HIPAGE THEN START PRINTSTRING("** SECTION ") PRINTHEX(SECTCELLS(I),8) PRINTSTRING(" OUT OF RANGE") NEWLINE CORRUPTDESCRIPTOR=TRUE IF CORRUPTDESCRIPTOR=FALSE FINISH REPEAT FINISH ! NOW GET OFFERS/PERMISSIONS IF FDESC_ALNK#X'FF' THEN C TRACECHAIN(POOL,FDESC_ALNK,TRUE,PERMCELLS,ACOUNT) ELSE ACOUNT=0 ! UPDATE LINKCOUNT LINKCOUNT(POOL)=LINKCOUNT(POOL)+ACOUNT IF DEAD=FALSE ! THERE ARE TWO CELLS FOR EACH PERMISSION SO CHECK FOR ODD LENGTH IF ACOUNT#0 THEN START IF (ACOUNT>>1)<<1#ACOUNT THEN START PRINTSTRING("** ACCESS LIST HAS ODD LENGTH") NEWLINE CORRUPTDESCRIPTOR=TRUE IF CORRUPTDESCRIPTOR=FALSE FINISH ! FILE ON OFFER SHOULD HAVE LIST LENGTH OF TWO IF FDESC_CODES&2=2 THEN ONOFFER=TRUE ELSE ONOFFER=FALSE IF ONOFFER=TRUE AND ACOUNT#2 THEN START PRINTSTRING("** FILE ON OFFER - ACCESS LIST # 2") NEWLINE CORRUPTDESCRIPTOR=TRUE IF CORRUPTDESCRIPTOR=FALSE FINISH IF ACOUNT>32 THEN START PRINTSTRING("** ACCESS LIST TOO LONG ") WRITE(ACOUNT,3) PRINTSTRING(" CELLS (32 MAX)") NEWLINE CORRUPTDESCRIPTOR=TRUE IF CORRUPTDESCRIPTOR=FALSE FINISH ! ACOUNT2 IS NO OF 2 CELL CHUNKS ACOUNT2=ACOUNT>>1 ACOUNT2=ACOUNT2+1 IF ACOUNT2<<1#ACOUNT FINISH ELSE ACOUNT2=0 IF DEAD=TRUE THEN DEADFILES=DEADFILES+1 ELSE START TOTALKB=TOTALKB+FDPAGES<<2 IF FDESC_CODES&16=16 THEN START NCHERISHED=NCHERISHED+1 CHERISHEDKB=CHERISHEDKB+FDPAGES<<2 FINISH ELSE START IF FDESC_CODES&8=8 OR FDESC_CODES&4=4 THEN C TEMPKBUSED=TEMPKBUSED+FDPAGES<<2 FINISH FINISH ! NOW OUTPUT RESULTS OUTBYTE(SARCHIVE,FDESC_ARCH) OUTBYTE(SCODES,FDESC_CODES) OUTBYTE(SCODES2,FDESC_CODES2) WRITE(FILENO,3) SPACES(3) PRINTSTRING(FILENAME) SPACES(12-LENGTH(FILENAME)) PRINTHEX(POOL,2) SPACES(2) WRITE(FDESC_OWNP,3) WRITE(FDESC_EEP,3) WRITE(FDESC_CCT,3) SPACE PRINTBIN(FDESC_ARCH,8) WRITE(FDESC_USE,3) SPACE PRINTBIN(FDESC_CODES,8) SPACE PRINTBIN(FDESC_CODES2,8) SPACE PRINTHEX(FDPAGES,4) SPACES(2) PRINTHEX(FDESC_PLNK,2) SPACES(2) IF SCOUNT=0 THEN SPACES(8) ELSE PRINTHEX(SECTCELLS(1),8) SPACES(3) PRINTHEX(FDESC_SSBYTE,2) SPACES(4) PRINTHEX(FDESC_SP15,2) SPACES(3) PRINTHEX(FDESC_ALNK,2) SPACES(2) IF ACOUNT#0 THEN OUTPERM(1) IF DEAD=TRUE THEN PRINTSTRING("** DEAD FILE") NEWLINE I=2 CYCLE EXIT IF I>SCOUNT AND I>ACOUNT2 SPACES(77) IF I>SCOUNT THEN SPACES(8) ELSE PRINTHEX(SECTCELLS(I),8) SPACES(18) IF I<=ACOUNT2 THEN OUTPERM(I) NEWLINE I=I+1 REPEAT ! OUTPUT COMPLETE ! NEXT CYCLE UPDATES DEAD=FALSE IF DEAD=TRUE FILENO=FILENO+1 CONFIDENT=CFLAG NEXNAM=NEXNAM+LEN+2 IF CFLAG=TRUE; ! CANT ESTIMATE IT OTHERWISE CUR=CUR-FDSIZE REPEAT ! END OF INDEX CYCLE ! TEMP ! DUMPBITMAP(0) NEWLINES(2) PRINTSTRING("3. LINK USAGE AND CONSISTENCY CHECKING ---- ----- --- ----------- --------") NEWLINES(2) IF CORRUPTDESCRIPTOR=TRUE THEN C PRINTSTRING("** WARNING - PROBEINDEX HAS REPORTED A CONDITION WHICH MAY HAVE ARISEN FROM A CORRUPT DESCRIPTOR - MAY AFFECT CERTAIN CONSISTENCY CHECKS") AND C NEWLINES(2) CUR=CUR+FDSIZE PRINTSTRING("CALC BYTE OFFSET OF NEXT FREE DESC: ") PRINTHEX(CUR-INDAD,8) IF CUR-INDAD=H_LOFDAD THEN C PRINTSTRING(" .... CONSISTENT WITH <LOFDAD>") ELSE C PRINTSTRING(" ** INCONSISTENT WITH <LOFDAD> **") NEWLINE PRINTSTRING("CALC BYTE OFFSET OF NEXT FILENAME: ") PRINTHEX(NAMSTART+NEXNAM-INDAD,8) IF NAMSTART+NEXNAM-INDAD=H_NEXNAM THEN C PRINTSTRING(" .... CONSISTENT WITH <NEXNAM>") ELSE C PRINTSTRING(" ** INCONSISTENT WITH <NEXNAM> **") NEWLINE PRINTSTRING("CALC FREEBYTES IN INDEX: ") WRITE(CUR-NEXNAM-NAMSTART,11) IF CUR-NEXNAM-NAMSTART=H_FREEBYTES THEN C PRINTSTRING(" .... CONSISTENT WITH <FREEBYTES>") ELSE C PRINTSTRING(" ** INCONSISTENT WITH <FREEBYTES> **") NEWLINE PRINTSTRING("CALC USED FILE DESCRIPTORS: ") WRITE(FILENO,11) IF FILENO=H_USEDFDS THEN C PRINTSTRING(" .... CONSISTENT WITH <USEDFDS>") ELSE C PRINTSTRING(" ** INCONSISTENT WITH <USEDFDS> **") NEWLINE PRINTSTRING("CALC ON-LINE FILES: ") WRITE(FILENO-DEADFILES,11) IF FILENO-DEADFILES=H_FILES THEN C PRINTSTRING(" .... CONSISTENT WITH <FILES>") ELSE C PRINTSTRING(" ** INCONSISTENT WITH <FILES> **") NEWLINE PRINTSTRING("CALC TOTAL KB: ") WRITE(TOTALKB,11) IF TOTALKB=H_TOTKB THEN C PRINTSTRING(" .... CONSISTENT WITH <TOTKB>") ELSE C PRINTSTRING(" ** INCONSISTENT WITH <TOTKB> **") NEWLINE PRINTSTRING("CALC ON-LINE CHERISHED FILES: ") WRITE(NCHERISHED,11) IF NCHERISHED=H_CHERFILES THEN C PRINTSTRING(" .... CONSISTENT WITH <CHERFILES>") ELSE C PRINTSTRING(" ** INCONSISTENT WITH <CHERFILES> **") NEWLINE PRINTSTRING("CALC KB CHERISHED FILES: ") WRITE(CHERISHEDKB,11) IF CHERISHEDKB=H_CHERKB THEN C PRINTSTRING(" .... CONSISTENT WITH <CHERKB>") ELSE C PRINTSTRING(" ** INCONSISTENT WITH <CHERKB> **") NEWLINE PRINTSTRING("CALC ON-LINE TEMP FILESPACE USED :") WRITE(TEMPKBUSED,11) IF TEMPKBUSED=H_TEMPKB THEN C PRINTSTRING(" .... CONSISTENT WITH <TEMPKB>") ELSE C PRINTSTRING(" ** INCONSISTENT WITH <TEMPKB> **") NEWLINES(3) GRANDTOT=CELSTART-LNKSTART GRANDTOT=GRANDTOT-GRANDTOT>>8 ! TO EXCLUDE 256TH BYTE IN EACH POOL TOTA==ARRAY(ADDR(TOTCELLSA),BAF) TOTB==ARRAY(ADDR(H_ZNCELLS),BAF) FREEA==ARRAY(ADDR(H_ZFREEC),BAF) FREEB==ARRAY(ADDR(TOTFREEB),BAF) WARN==ARRAY(ADDR(WARNING),BAF) PRINTSTRING("POOL 0 1 2 3") SPACES(65) PRINTSTRING("0 1 2 3 ") NEWLINE PRINTSTRING("TOTCELLS(A) ") CYCLE J=0,1,3 IF GRANDTOT>255 THEN TOTA(J)=255 AND GRANDTOT=GRANDTOT-255 C ELSE TOTA(J)<-GRANDTOT AND GRANDTOT=0 PRINTHEX(TOTA(J),4) SPACES(3) IF J#3 REPEAT PRINTSTRING(" CELSTART - LNKSTART") NEWLINE PRINTSTRING("TOTCELLS(B) ") WARNING=0 CYCLE J=0,1,3 PRINTHEX(TOTB(J),4) SPACES(3) IF J#3 WARN(J)=X'FF' IF TOTB(J)#TOTA(J) REPEAT PRINTSTRING(" ZNCELLS") IF WARNING#0 THEN START SPACES(20) PRINTSTRING("- ** INCONSISTENT WITH TOTCELLS(A) ") PRINTHEX(WARNING,8) FINISH NEWLINE PRINTSTRING("FREECELLS(A) ") CYCLE J=0,1,3 PRINTHEX(FREEA(J),4) SPACES(3) IF J#3 REPEAT PRINTSTRING(" ZFREEC") NEWLINE PRINTSTRING("FREECELLS(B) ") WARNING=0 CYCLE J=0,1,3 TRACECHAIN(J,BYTEINTEGER(ADDR(H_ZASL)+J),FALSE,PERMCELLS,CELLCOUNT) FREEB(J)<-CELLCOUNT PRINTHEX(FREEB(J),4) SPACES(3) IF J#3 WARN(J)=X'FF' IF FREEB(J)#FREEA(J) REPEAT PRINTSTRING(" ZASL LISTHEADS") IF WARNING#0 THEN START SPACES(13) PRINTSTRING("- ** INCONSISTENT WITH FREECELLS(A) ") PRINTHEX(WARNING,8) FINISH NEWLINE PRINTSTRING("CELLS USED ") CYCLE J=0,1,3 PRINTHEX(LINKCOUNT(J),4) SPACES(3) IF J#3 REPEAT PRINTSTRING(" CALCULATED") NEWLINE PRINTSTRING("TOTCELLS(C) ") WARNING=0 CYCLE J=0,1,3 TOTC(J)=LINKCOUNT(J)+FREEA(J) PRINTHEX(TOTC(J),4) SPACES(3) IF J#3 WARN(J)=X'FF' IF TOTC(J)#TOTA(J) REPEAT PRINTSTRING(" FREECELLS(A) + CELLS USED") IF WARNING#0 THEN START PRINTSTRING(" - ** INCONSISTENT WITH TOTCELLS(A) ") PRINTHEX(WARNING,8) FINISH NEWLINE PRINTSTRING("TOTCELLS(D) ") WARNING=0 CYCLE J=0,1,3 TOTD(J)=LINKCOUNT(J)+FREEB(J) PRINTHEX(TOTD(J),4) SPACES(3) IF J#3 WARN(J)=X'FF' IF TOTD(J)#TOTA(J) REPEAT PRINTSTRING(" FREECELLS(B) + CELLS USED ") IF WARNING#0 THEN START PRINTSTRING("- ** INCONSISTENT WITH TOTCELLS(A) ") PRINTHEX(WARNING,8) FINISH NEWLINE ! FINALLY CHECK OUT BIT MAP !TEMP ! DUMPBITMAP(0) PLFLAG=0 CHECKBITMAP IF PLFLAG=0 THEN NEWLINES(2) AND C PRINTSTRING("ALL LINKS ARE CONSISTENT") SELECTOUTPUT(0) CLOSESTREAM(11) CLEAR("11") PRINTSTRING("PROBEINDEX TERMINATES NORMALLY") RETURN ROUTINE PRINTHEX(INTEGER I,PL) ! RESULT IS THE STRING OF HEX DIGITS REPRESENTING THE NUMBER I. ! THE SECOND PARAM, TO BE SET IN RANGE 1 TO 8, SPECIFIES LENGTH OF ! RESULT STRING. INTEGER J,K,M,N STRING (8) W J=ADDR(W) N=8-PL+1 CYCLE M=8,-1,N K=I&15 + '0' IF K>57 THEN K=K+7 BYTEINTEGER(J+M)=K I=I>>4 REPEAT J=J+N-1 BYTEINTEGER(J)=PL PRINTSTRING(STRING(J)) RETURN END ; ! PRINTHEX ROUTINE CHECKLINK(INTEGER POOL,PLINK,INTEGERNAME FLAG) INTEGER WORDNO,BITNO,LINKNO,PATTERN FLAG=0 LINKNO=POOL*255+PLINK WORDNO=LINKNO>>5 BITNO=LINKNO-WORDNO<<5 PATTERN=1<<(31-BITNO) IF MAP(WORDNO)&PATTERN=PATTERN THEN START ! BIT ALREADY SET PRINTSTRING("** DUPLICATE ENTRY - POOL ") WRITE(POOL,3) PRINTSTRING(" LINK ") WRITE(PLINK,4) NEWLINE FLAG=1 RETURN FINISH ELSE START MAP(WORDNO)=MAP(WORDNO)!PATTERN IF DEAD=FALSE FINISH ! SET BIT RETURN END ; ! OF CHECKLINK ROUTINE DUMPBITMAP(INTEGER TYPE) BYTEINTEGERARRAY MAPOUT(0:1023),BITCOUNT(0:3) INTEGER I,J,M,MASK,L BYTEINTEGERNAME K MASK=X'80000000' CYCLE I=0,1,31 M=MAP(I) CYCLE J=0,1,31 K==BYTEINTEGER(ADDR(MAPOUT(I<<5+J))) IF M&MASK=MASK THEN K='1' ELSE K='0' M=M<<1 REPEAT REPEAT PRINTSTRING("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< DUMPBITMAP CALLED ---------- ------ ") CYCLE I=0,1,3 PRINTSTRING("POOL ") PRINTHEX(I,2) NEWLINE BITCOUNT(I)=0 CYCLE J=0,1,254 K==BYTEINTEGER(ADDR(MAPOUT(I*255+J))) PRINTCH(K) IF TYPE=0 BITCOUNT(I)=BITCOUNT(I)+1 IF K='1' IF TYPE=0 THEN START L=J+1 IF (L>>4)<<4=L THEN START IF (L>>6)<<6=L THEN NEWLINE ELSE SPACE FINISH FINISH REPEAT NEWLINE PRINTSTRING("BITCOUNT ") PRINTHEX(BITCOUNT(I),2) NEWLINE PRINTSTRING("LINKCOUNT ") PRINTHEX(LINKCOUNT(I),2) NEWLINES(2) REPEAT PRINTSTRING(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ") RETURN END ; ! OF DUMPBITMAP ROUTINE TRACECHAIN(INTEGER LISTPOOL,PLINK,FILLCELLS, C INTEGERARRAYNAME CELLS, INTEGERNAME CELLCOUNT) CELLCOUNT=0 LARR==ARRAY(LNKSTART+LISTPOOL<<8,LINKF) CARR==ARRAY(CELSTART+LISTPOOL<<10,CELLF) WHILE PLINK#X'FF' CYCLE CHECKLINK(LISTPOOL,PLINK,FLAG) IF FLAG#0 THEN START PRINTSTRING("** LINK ALREADY USED - POOL ") WRITE(LISTPOOL,3) PRINTSTRING(" LINK ") PRINTHEX(PLINK,2) NEWLINE TRACEBACK(PLINK) RETURN FINISH CELLCOUNT=CELLCOUNT+1 CELLS(CELLCOUNT)=CARR(PLINK) IF FILLCELLS=TRUE PLINK=LARR(PLINK) REPEAT RETURN END ; ! OF TRACECHAIN ROUTINE TRACEBACK(INTEGER PLINK) ROUTINESPEC PRINTTRACEBACK(INTEGER ARRAYELEM) BYTEINTEGERARRAY FIFOQ,CAMEFROM(0:254) INTEGER ORIGIN,NEXTFREE,I,UPDATED,USED,J,NREFS PRINTSTRING("** TRACEBACK ENTERED ") ORIGIN=0 UPDATED=FALSE FIFOQ(0)=PLINK CAMEFROM(0)=X'FF' NEXTFREE=1 USED=FALSE WHILE ORIGIN#NEXTFREE CYCLE NREFS=0 CYCLE I=0,1,254 IF LARR(I)=PLINK THEN START ! IS LINK ALREADY IN FIFOQ? ! IF SO HIT INFINITE LOOP NREFS=NREFS+1 USED=FALSE CYCLE J=0,1,NEXTFREE-1 USED=TRUE AND EXIT IF FIFOQ(J)=I REPEAT FIFOQ(NEXTFREE)=I CAMEFROM(NEXTFREE)=ORIGIN UPDATED=TRUE IF UPDATED=FALSE AND USED=FALSE NEXTFREE=NEXTFREE+1 IF USED=FALSE IF USED=TRUE THEN START ! REPORT LOOP PRINTSTRING("** INFINITE LOOP ") IF FIFOQ(ORIGIN)=FIFOQ(NEXTFREE) THEN START PRINTSTRING("** LINK ") PRINTHEX(I,2) PRINTSTRING(" POINTING AT ITSELF ") FINISH ELSE START PRINTSTRING("** LOOP FORMED BY LINKS: ") PRINTTRACEBACK(NEXTFREE) FINISH FINISH FINISH REPEAT IF NREFS>1 THEN START PRINTSTRING("** LINK ") PRINTHEX(PLINK,2) PRINTSTRING(" REFERENCED ") WRITE(NREFS,4) PRINTSTRING(" TIMES ") FINISH IF UPDATED=FALSE AND USED=FALSE THEN START ! HIT LISTHEAD PRINTSTRING("** LISTHEAD IS: ") PRINTHEX(PLINK,2) NEWLINE PRINTSTRING("** ROUTE FROM LISTHEAD: ") PRINTTRACEBACK(ORIGIN) FINISH ORIGIN=ORIGIN+1 UPDATED=FALSE IF UPDATED=TRUE PLINK=FIFOQ(ORIGIN) ! TEMP ! %CYCLE J=0,1,NEXTFREE-1 ! PRINTHEX(CAMEFROM(J),2) ! %IF ((J+1)>>5)<<5=J+1 %THEN NEWLINE %ELSE SPACE ! %REPEAT ! NEWLINE ! %CYCLE J=0,1,NEXTFREE-1 ! PRINTHEX(FIFOQ(J),2) ! %IF ((J+1)>>5)<<5=J+1 %THEN NEWLINE %ELSE SPACE ! %REPEAT ! NEWLINE ! REPEAT PRINTSTRING("** TRACEBACK COMPLETE ") RETURN ROUTINE PRINTTRACEBACK(INTEGER ARRAYELEM) INTEGER FIRSTLINK,NEXTELEM FIRSTLINK=FIFOQ(ARRAYELEM) NEXTELEM=ARRAYELEM J=1 CYCLE PRINTHEX(FIFOQ(NEXTELEM),2) IF (J>>5)<<5=J THEN NEWLINE ELSE SPACE EXIT IF CAMEFROM(NEXTELEM)=X'FF' EXIT IF FIFOQ(NEXTELEM)=FIRSTLINK AND J#1 J=J+1 NEXTELEM=CAMEFROM(NEXTELEM) REPEAT NEWLINE RETURN END ; ! OF PRINTTRACEBACK END ; ! OF TRACEBACK ROUTINE PRINTBIN(INTEGER I,PL) ! RESULT IS THE STRING OF BIN DIGITS REPRESENTING THE NUMBER I. ! THE SECOND PARAM, TO BE SET IN RANGE 1 TO 32, SPECIFIES LENGTH OF ! RESULT STRING. INTEGER J,K,M,N STRING (32) W J=ADDR(W) N=32-PL+1 CYCLE M=32,-1,N K=I&1 + '0' BYTEINTEGER(J+M)=K I=I>>1 REPEAT J=J+N-1 BYTEINTEGER(J)=PL PRINTSTRING(STRING(J)) RETURN END ; ! PRINTBIN ROUTINE OUTPERM(INTEGER I) ! UNSCRAMBLES PERMISSIONS FROM PERMCELLS INTEGER J,OUTSTART,PERMBYTE OUTSTART=ADDR(PERMCELLS(I<<1-1)); ! START OF TWO CELL BLOCK IF I<<1>ACOUNT THEN START CYCLE J=0,1,3 PRINTCH(BYTEINTEGER(OUTSTART+J)) REPEAT PRINTSTRING("** MISSING SECTION") FINISH ELSE START CYCLE J=0,1,7 PRINTCH(BYTEINTEGER(OUTSTART+J)) REPEAT PERMBYTE=BYTEINTEGER(OUTSTART+7)&7 IF ONOFFER=TRUE THEN PRINTSTRING("OFFER") AND RETURN IF PERMBYTE=0 THEN PRINTSTRING("NONE") IF PERMBYTE&4=4 THEN PRINTSTRING("E") IF PERMBYTE&2=2 THEN PRINTSTRING("W") IF PERMBYTE&1=1 THEN PRINTSTRING("R") IF PERMBYTE#BYTEINTEGER(OUTSTART+7) THEN START PRINTSTRING("** CORRUPT PERM ") PRINTHEX(PERMBYTE,2) FINISH FINISH RETURN END ; ! OF OUTPERM ROUTINE CHECKBITMAP INTEGER PATTERN,MASK,ROGUE,REM,I,J PATTERN=X'FFFFFFFF' GRANDTOT=CELSTART-LNKSTART GRANDTOT=GRANDTOT-GRANDTOT>>8 J=GRANDTOT>>5 ! NO OF COMPLETE WORDS IN MAP CYCLE I=0,1,31 IF I<J THEN START ROGUE=MAP(I)!!PATTERN ! BITS SET ONLY WHERE LINK MISSING IF ROGUE#0 THEN POOLLINK(ROGUE,I,0,PLFLAG) FINISH IF I=J THEN START REM=GRANDTOT-I<<5 MASK=PATTERN<<(32-REM) ! FOR BITS NOT SET THAT SHOULD BE ROGUE=(MAP(I)&MASK)!!MASK IF ROGUE#0 THEN POOLLINK(ROGUE,I,0,PLFLAG) MASK=PATTERN!!MASK ! FOR BITS SET WHICH OUGHT NOT TO BE ROGUE=MAP(I)&MASK IF ROGUE#0 THEN POOLLINK(ROGUE,I,1,PLFLAG) FINISH IF I>J THEN START ROGUE=MAP(I)&PATTERN ! BITS SET WHERE LINK USED THAT OUGHT NOT TO HAVE BEEN IF ROGUE#0 THEN POOLLINK(ROGUE,I,1,PLFLAG) FINISH REPEAT RETURN END ; ! OF CHECKBITMAP ROUTINE POOLLINK(INTEGER ROGUE,WORD,TYPE, INTEGERNAME FLAG) INTEGER MASK,BIT,I,POOL,LINK MASK=X'80000000' CYCLE I=0,1,31 IF ROGUE&MASK=MASK THEN START FLAG=1 IF FLAG=0 BIT=WORD<<5+I POOL=BIT//255 LINK=BIT-POOL*255 PRINTSTRING("POOL ") PRINTHEX(POOL,2) PRINTSTRING(" LINK ") PRINTHEX(LINK,2) IF TYPE=0 THEN PRINTSTRING(" NOT ACCOUNTED FOR") ELSE C PRINTSTRING(" USED BUT SHOULDNT HAVE BEEN") NEWLINE TRACEBACK(LINK) IF TYPE=1 FINISH ROGUE=ROGUE<<1 REPEAT RETURN END ; ! OF POOLLINK ROUTINE OUTBYTE(STRINGARRAYNAME NAMES, BYTEINTEGER BYTE) INTEGER I SPACES(15) PRINTSTRING(NAMES(-1)) PRINTSTRING(" BITS SET:") IF BYTE=0 THEN START PRINTSTRING(" * NONE SET *") NEWLINE RETURN FINISH CYCLE I=0,1,7 IF BYTE&1=1 THEN PRINTSTRING(NAMES(I)) BYTE=BYTE>>1 REPEAT NEWLINE RETURN END ; ! OF OUTBYTE ROUTINE PRINTCHAIN(STRING (31) TEXT, BYTEINTEGER PLINK, C INTEGER PRINTREGARDLESS) INTEGER I,J,CELLCOUNT IF PLINK#X'FF' OR PRINTREGARDLESS=TRUE THEN START TRACECHAIN(0,PLINK,TRUE,PERMCELLS,CELLCOUNT) PRINTSTRING(TEXT) PRINTSTRING(" (") WRITE(CELLCOUNT,3) PRINTSTRING(" CELLS):") SPACES(26-LENGTH(TEXT)) ! SO THAT PRINTING STARTS AT COL 41 IF CELLCOUNT#0 THEN START CYCLE I=1,1,CELLCOUNT NEWLINE AND SPACES(40) IF I//21*21=I CYCLE J=0,1,3 PRINTCH(BYTEINTEGER(ADDR(PERMCELLS(I))+J)) REPEAT REPEAT FINISH NEWLINE LINKCOUNT(0)=LINKCOUNT(0)+CELLCOUNT FINISH RETURN END ; ! OF PRINTCHAIN STRINGFN S2(INTEGER N) !THIS FUNCTION RETURNS A TWO DIGIT DECIMAL VALUE FOR N INTEGER TENS, UNITS TENS = N//10 UNITS = N-10*TENS RESULT = TOSTRING(TENS+'0').TOSTRING(UNITS+'0') END ; !OF S2 STRINGFN PRINTDATE(INTEGER P) RESULT =S2(P&X'1F')."/".S2(P>>5&X'F')."/".S2(P>>9&X'3F'+70) END ; !OF PRINTDATE ROUTINE ASK(STRING (15) TEXT, STRINGNAME T) EXTERNALROUTINESPEC PROMPT(STRING (15) S) ROUTINESPEC TRIM(STRINGNAME A) BYTEINTEGER IN T="" NEWLINE PROMPT(TEXT) WHILE NEXTSYMBOL#X'0A' CYCLE READSYMBOL(IN) T=T.TOSTRING(IN) REPEAT SKIPSYMBOL TRIM(T) RETURN ROUTINE TRIM(STRINGNAME A) ! REMOVES LEADING AND TRAILING SPACES, BUT NOT EMBEDDED SPACES. WHILE CHARNO(A,LENGTH(A)) = ' ' C THEN LENGTH(A) = LENGTH(A)-1 !REMOVE !TRAILING SPACES WHILE A -> (" ").A THEN CYCLE REPEAT ; !REMOVE !LEADING SPACES END END ; ! OF ASK END ; ! OF PROBEINDEX ENDOFFILE