%INCLUDE "ERCS06.OPT_SPECS" %INCLUDE "ERCS06.PERQ_TRIADOPS" {2900} %CONSTINTEGER FRSIZE=8; ! FREELIST ENTRY SIZE IN BYTES %CONSTINTEGER FUNCBIT=1; %CONSTINTEGER RETBIT=4 %CONSTINTEGER LPEBIT=8 %ROUTINE PUSHFREE(%INTEGER VAL,%INTEGERNAME LINK) %RECORD(SRECF)%NAME FREE FREE==RECORD(ADICT+DPTR) FREE_INF0=VAL FREE_LINK1=LINK LINK=DPTR DPTR=DPTR+FRSIZE %END %ROUTINE PRBLHEAD(%RECORD(BLRECF)%NAME BL,%INTEGER BLIND) BL==RECORD(ABLOCKS+BLIND*BLSIZE) PRINTSTRING("BLOCK") WRITE(BLIND,1) NEWLINE;NEWLINE %END %ROUTINE PRBLFIELDS(%RECORD(BLRECF)%NAME BL) PRINTSTRING("DEPTH ");WRITE(BL_DEPTH,1);NEWLINE PRINTSTRING("BACK DOMINATOR BLOCK ");WRITE(BL_BDOM,1);NEWLINE PRINTSTRING("BACK TARGET BLOCK ");WRITE(BL_BTARG,1);NEWLINE PRINTSTRING("BLOCK FOLLOWING ");WRITE(BL_CHAIN,1);NEWLINE PRINTSTRING("1ST TRIAD OF BLOCK ");WRITE(BL_TEXT,1);NEWLINE PRINTSTRING("ADDRESS OF USE BIT STRIP");WRITE(BL_USE,1);NEWLINE PRINTSTRING("ADDRESS OF DEF BIT STRIP");WRITE(BL_DEF,1);NEWLINE PRINTSTRING("ADDRESS OF BOE BIT STRIP");WRITE(BL_BOE,1);NEWLINE PRINTSTRING("FLAGS SET ");WRITE(BL_FLAGS,1);NEWLINE %IF BL_FCON#0 %START %END %EXTERNALROUTINE PRBLOCK(%INTEGER BLIND) %RECORD(BLRECF)%NAME BL %RECORD(CONRECF)%NAME CON %INTEGER I %IF BLIND=0 %THEN %RETURN BL==RECORD(ABLOCKS+BLIND*BLSIZE) PRINTSTRING("BLOCK");WRITE(BLIND,1);NEWLINE;NEWLINE PRINTSTRING("DEPTH ");WRITE(BL_DEPTH,1);NEWLINE PRINTSTRING("BACK DOMINATOR BLOCK ");WRITE(BL_BDOM,1);NEWLINE PRINTSTRING("BACK TARGET BLOCK ");WRITE(BL_BTARG,1);NEWLINE PRINTSTRING("BLOCK FOLLOWING ");WRITE(BL_CHAIN,1);NEWLINE PRINTSTRING("1ST TRIAD OF BLOCK ");WRITE(BL_TEXT,1);NEWLINE PRINTSTRING("ADDRESS OF USE BIT STRIP");WRITE(BL_USE,1);NEWLINE PRINTSTRING("ADDRESS OF DEF BIT STRIP");WRITE(BL_DEF,1);NEWLINE PRINTSTRING("ADDRESS OF BOE BIT STRIP");WRITE(BL_BOE,1);NEWLINE PRINTSTRING("FLAGS SET ");WRITE(BL_FLAGS,1);NEWLINE %IF BL_FCON#0 %START CON==RECORD(ATABS+BL_FCON) PRINTSTRING("FORWARD CONNECTIONS TO BLOCKS") %FOR I=1,1,CON_COUNT %CYCLE WRITE(CON_BLOCK(I),1) %REPEAT %FINISHELSE PRINTSTRING("NO FORWARD CONNECTIONS") NEWLINE %IF BL_BCON#0 %START CON==RECORD(ATABS+BL_BCON) PRINTSTRING("BACKWARD CONNECTIONS TO BLOCKS") %FOR I=1,1,CON_COUNT %CYCLE WRITE(CON_BLOCK(I),1) %REPEAT %FINISHELSE PRINTSTRING("NO BACKWARD CONNECTIONS") NEWLINE NEWLINE %END %EXTERNALROUTINESPEC SETBITS(%RECORD(RESF) RES,%INTEGER ADDR,USEORDEF) %EXTERNALROUTINE BLOCKS(%INTEGER GTOLABPTR) %RECORD(BLRECF)%NAME BL,TMPBL %RECORD(TRIADF)%NAME TR %RECORD(CONRECF)%NAME CON %RECORD(SRECF)%NAME GTOLABS,BLKS %RECORD(LABRECF)%NAME LAB %INTEGERARRAYNAME ENTBTAB,EXBTAB %INTEGERARRAYFORMAT TABF(0:100) %CONSTBYTEINTEGERARRAY BSDO(0:20)= 0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,1,1 %SWITCH SWTR(0:98) %INTEGER CURBLK,LASTBLK,LABCOUNT,NEXTLAB,I %INTEGER NEWBLFLAG,CONNECT %INTEGER BLADDR,BLIND %ROUTINE NEWBLOCK %INTEGER BLLEN BLIND=BLIND+1 BLLEN=BLIND*BLSIZE %IF BLLEN>=MAXBLOCKS %THEN BLOCKSFULL TMPBL==RECORD(ATABS+BLLEN) TMPBL_BCON=0 %END BLIND=0 FREETABS=0 CURBLK=0 NEWBLFLAG=0 CONNECT=0 ENTBPTR=0 EXBPTR=0 LABCOUNT=0 BL==RECORD(ABLOCKS) CON==RECORD(ATABS) %FOR I=1,1,NEXTTRIAD-1 %CYCLE TR==RECORD(ATRIADS+I*TRIADLENGTH) ->SWTR(TR_OP) SWTR(STMT): %IF TR_VAL2<2 %START LAB==RECORD(TR_OPD2<JMP1 %FINISH NEXTLAB=GTOLABPTR GOTO1: %IF BSDO(TR_QOPD1)=1 %THEN SETBITS(TR_RES1,BLADDR,USE) BL_FCON=FREETABS CON==RECORD(ATABS+FREETABS) %WHILE NEXTLAB#0 %CYCLE GTOLABS==RECORD(NEXTLAB+ADICT) LAB==RECORD(GTOLABS_INF0) %IF LAB_BLKIND=0 %START NEWBLOCK LAB_BLKIND=BLIND %FINISHELSE TMPBL==RECORD(ATABS+LAB_BLKIND*BLSIZE) LABCOUNT=LABCOUNT+1 CON_BLOCK(LABCOUNT)=LAB_BLKIND NEXTLAB=GTOLABS_LINK1 PUSHFREE(CURBLK,TMPBL_BCON) %REPEAT NEWBLFLAG=1 %CONTINUE SWTR(CGT): CONNECT=1 NEXTLAB=TR_OPD2<GOTO1 SWTR(STOP): NEWBLFLAG=1 BL_FCON=0 %CONTINUE SWTR(RET): BL_FLAGS=BL_FLAGS!RETBIT %IF BSDO(TR_QOPD1)=1 %THEN SETBITS(TR_RES2,BLADDR,USE) BL_FCON=FREETABS CON==RECORD(ATABS+FREETABS) CON_COUNT=1 CON_BLOCK(1)=0 FREETABS=FREETABS+2<