!** ** ** ***** * * ****** ** ******* !** ** ** ** ** ** ** ** ** ** ** !** ** ** ** ** *** *** ** ** ** ** !** ** ** ** ** ** * ** ****** ** ***** !** ** * ** ** ** ** ** ** ** ** ** !** *** *** ** ** ** ** ** ** ** ** !** * * ***** ** ** ****** ******* ******* !** !***************************************************************** !***************************************************************** !** ** !** WIRING OF MODULES BY LINKED EVOKES ** !** ** !** CS4 PDP-16 GROUP PROJECT 1974 ** !** ** !***************************************************************** !***************************************************************** !** %CONTROL 0 %CONSTSTRING (43) TITLE = 'WOMBLE : VERSION 3.1 ====== = ======= === ' %CONSTINTEGERARRAY MODPIN(1 : 544) = %C M'BR1',M'BS1',M'BN2',M'BP2',M'BR2',M'BS2',M'BU1',M'BV1', M'AH2',M'AJ2',M'AL2',M'AE2',M'AD2',M'AM2',M'AK2',M'AF2', M'AN2',M'AV1',M'AV2',M'AP2',M'AU2',M'AR2',M'AS2',M'AT2', M'BH2',M'BJ2',M'BL2',M'BK2',M'BL1',M'BM1',M'BN1',M'BP1', M'BV2',M'BT2',M'BM2',M'BU2',M'BB2',M'BJ1',M'BF2',M'BD2', M'BE2',M'BF1',M'BH1', M'AV2',M'BU2',M'BT2',M'BV2',M'BR2',M'BP2',M'BS2',M'BK2', M'BN1',M'BM2',M'BL2',M'BN2',M'BH2',M'BJ2',M'BH1',M'BF1', M'BM1',M'BL1',M'BK1',M'BJ1',M'BF2',M'BE2',M'BD2',M'BB2', M'AU2',M'AT2',M'AS2',M'AR2',M'AP2',M'AN2',M'AM2',M'AL2', M'AK2',M'AJ2',M'AH2',M'AF2',M'BP1',M'BR1',M'BS1',M'BU1', M'BV1',M'AV1', M'BR1',M'BS1',M'BN2',M'BP2',M'BR2',M'BS2',M'BP1',M'BN1', M'AD2',M'AE2',M'AF2',M'AH2',M'AJ2',M'AK2',M'AL2',M'AM2', M'AN2',M'AP2',M'AR2',M'AS2',M'AT2',M'AU2',M'BD2',M'BE2', M'BL1',M'BM1',M'BJ2',M'BK2',M'BL2',M'BM2',M'BK1',M'BJ1', M'AB2',M'BF2', M'BF1',M'BH1',M'BJ1',M'BK1',M'AB2',M'AD2',M'AE2',M'AF2', M'AH2',M'AJ2',M'AK2',M'AL2',M'AM2',M'AN2',M'AP2',M'AR2', M'AS2',M'AT2',M'AU2',M'AV2',M'BE2',M'BF2',M'BH2',M'BJ2', M'BR1',M'BS1',M'BN1',M'BP1',M'BL1',M'BM1',M'BU2',M'BV2', M'BS2',M'BT2',M'BP2',M'BR2',M'BM2',M'BN2',M'BK2',M'BL2', M'BE2',M'BF2',M'BH2',M'BJ2',M'BR1',M'BS1',M'BN1',M'BP1', M'BL1',M'BM1',M'BU2',M'BV2',M'BS2',M'BT2',M'BP2',M'BR2', M'BM2',M'BN2',M'BK2',M'BL2', M'BF1',M'BH1',M'BJ1',M'BK1',M'AB2',M'AD2',M'AE2',M'AF2', M'AH2',M'AJ2',M'AK2',M'AL2',M'AM2',M'AN2',M'AP2',M'AR2', M'AS2',M'AT2',M'AU2',M'AV2', M'BM2',M'BL2',M'BN2',M'BP2',M'BU2',M'BT2',M'BR2',M'BS2', M'BH1',M'BF1',M'BK1',M'BJ1',M'AL2',M'AN2',M'BM1',M'BL1', M'AK2',M'AM2', M'BR1',M'BS1',M'BM1',M'BL1',M'BU1',M'BV1',M'BN1',M'BP1', M'BM2',M'BL2',M'BU2',M'BS2',M'BP2',M'BN2',M'BV2',M'BR2', M'BU1',M'BV1',M'BT2',M'BS2',M'BL2',M'BK2',M'BJ2',M'BF1', M'AH2',M'AF2',M'AE2',M'AD2',M'AM2',M'AL2',M'AK2',M'AJ2', M'AS2',M'AR2',M'AP2',M'AN2',M'BH2',M'BF2',M'BE2',M'BD2', M'BS1',M'BN2',M'BP2', M'BD2',M'BE2',M'BF2',M'BH2',M'BU1',M'BV1',M'BR1',M'BS1', M'BN1',M'BP1',M'BL1',M'BM1',M'AD2',M'AE2',M'AH2',M'AF2', M'AJ2',M'AK2',M'AM2',M'AL2',M'AN2',M'AP2',M'AS2',M'AR2', M'AT2',M'AU2',M'AV1',M'AV2', M'AJ2',M'AH2',M'AF2',M'AE2',M'AR2',M'AN2',M'AL2',M'AK2', M'AT2',M'AS2',M'BK2',M'BJ2',M'BB2',M'AU2',M'BM2',M'BL2', M'BH1',M'BH2',M'BK1',M'BJ1',M'BE2',M'BD2',M'BF1',M'BF2', M'BS2',M'BR2',M'BP2',M'BN2',M'BV1',M'BU1',M'BM1',M'BL1', M'BR1',M'BS1',M'BP1',M'BN1',M'BU2',M'BV2', M'BD2',M'BE2',M'BF2',M'BH2',M'BL1',M'BM1',M'BN1',M'BP1', M'BF1',M'BH1',M'BJ1',M'BK1', M'J1',M'F1',M'J2',M'L1',M'H1',M'K1',M'F2',M'E2', M'T2',M'R2',M'P2',M'U2',M'S2',M'V1',M'U1',M'D2', M'N1',M'R1',M'M2',M'L2',M'P1',M'M1',M'N2',M'S1', M'F1',M'H1',M'J1',M'K1',M'L1',M'M1',M'N1',M'P1', M'R1',M'S1',M'U1',M'V1',M'D2',M'E2',M'F2',M'H2', M'J2',M'L2',M'M2',M'N2',M'P2',M'R2',M'S2',M'T2', M'U2',M'V2',M'S2',M'T2',M'E2',M'F2',M'H2',M'J2',M'K2',M'L2', M'V1',M'U1',M'P1',M'R1',M'S1',M'M1',M'L1',M'K1',M'J1',M'N1', M'N2',M'P2',M'R2',M'D2',M'V2', M'A1',M'B1',M'C1',M'D1',M'E1',M'F1', M'H1',M'J1',M'K1',M'L1',M'M1',M'N1', M'P1',M'R1',M'S1',M'D2',M'E2',M'F2', M'H2',M'J2',M'K2',M'L2',M'M2',M'N2', M'P2',M'R2',M'S2',M'T2',M'U2',M'V2', M'A1',M'B1',M'C1',M'D1',M'E1',M'F1',M'H1',M'J1',M'K1',M'L1', M'M1',M'N1',M'P1',M'R1',M'S1',M'D2',M'E2',M'F2',M'H2',M'J2', M'K2',M'L2',M'M2',M'N2',M'P2',M'R2',M'S2',M'T2',M'U2',M'V2', M'H1',M'E2',M'D2',M'F1',M'K1',M'H2',M'F2',M'J1', M'M1',M'K2',M'J2',M'L1',M'P1',M'M2',M'L2',M'N1', M'S1',M'P2',M'N2',M'R1',M'V1',M'S2',M'R2',M'U1',M'V2', M'H1',M'D2',M'E2',M'F1',M'K1',M'F2',M'H2',M'J1', M'M1',M'J2',M'K2',M'L1',M'P1',M'L2',M'M2',M'N1', M'S1',M'N2',M'P2',M'R1',M'V1',M'R2',M'S2',M'U1', M'F1',M'H1',M'J1',M'K1', M'V1',M'U1',M'S1',M'R1',M'P1',M'N1',M'M1',M'L1', M'F2',M'H2',M'J2',M'K2', M'V2',M'U2',M'S2',M'R2',M'P2',M'N2',M'M2',M'L2' %CONSTBYTEINTEGERARRAY NUMPIN(1 : 544) = %C 4,0(3),4,0(3),1(16),8,0(7),1(11), 1(4),4,0(3),4,0(3),4,0(3), 4,0(3),4,0(3),4,0(3), 4,0(3),4,0(3),4,0(3),1,1, 8,0(7),1(16),8,0(7),1,1, 4,0(3),1(16),4,0(3),1(16), 4,0(3),1(16), 4,0(3),1(16), 4,0(3),4,0(3),4,0(3),1(6), 1(16), 2,0,2,0,2,0,2,0,1(19), 4,0(3),2,0,2,0,2,0,2,0,1(16), 4,0(3),4,0(3),2,0,2,0,2,0,2,0,2,0, 2,0,2,0,2,0,2,0,2,0, 2,0,2,0,2,0,2,0,2,0, 4,0(3),4,0(3),4,0(3), 1(206) %CONSTBYTEINTEGERARRAY GPAMAP(1 : 12) = %C 25, 21, 17, 13, 33, 29, 9, 5, 4, 3, 1, 2 %CONSTBYTEINTEGERARRAY MODSLOT(0 : 32) = %C 0,1,2,1(5),2,1(5),0(11),1,0(7) %CONSTSHORTINTEGER ABSENS = 0 %CONSTSHORTINTEGER AGPAU = 43 %CONSTSHORTINTEGER AGPAR = 85 %CONSTSHORTINTEGER AGPINT = 119 %CONSTSHORTINTEGER AOPINT = 159 %CONSTSHORTINTEGER AIPINT = 179 %CONSTSHORTINTEGER ASINT = 199 %CONSTSHORTINTEGER ACGEN = 217 %CONSTSHORTINTEGER ATREG = 233 %CONSTSHORTINTEGER ABREG = 260 %CONSTSHORTINTEGER ASPR = 288 %CONSTSHORTINTEGER AMEMORY = 326 %CONSTSHORTINTEGER AFLAG = 338 %CONSTSHORTINTEGER ANOP = 362 %CONSTSHORTINTEGER AEVOKE = 386 %CONSTSHORTINTEGER AFMERGE4 = 396 %CONSTSHORTINTEGER AFRTCALL = 406 %CONSTSHORTINTEGER AMERGE2 = 411 %CONSTSHORTINTEGER AMERGE4 = 441 %CONSTSHORTINTEGER ARTCALL = 471 %CONSTSHORTINTEGER ABRANCH2 = 496 %CONSTSHORTINTEGER ABRANCH8 = 520 %OWNINTEGERARRAY NOBUSSLOTS(0 : 15) = %C M'0C',M'1C',M'2C', M'0D',M'1D',M'2D', M'DC',M'EC',M'FC', M'DD',M'ED',M'FD', M'CD',M'CC',M'3D',M'3C' %OWNINTEGERARRAY CONTRLSLOTS(0 : 45) = %C M'4C',M'5C',M'6C',M'7C', M'8C',M'9C',M'AC',M'BC', M'4D',M'5D',M'6D',M'7D', M'8D',M'9D',M'AD',M'BD', M'EB',M'DB',M'CB',M'BB', M'AB',M'9B',M'8B',M'7B', M'6B',M'5B',M'4B',M'3B', M'2B',M'1B',0(16) %OWNINTEGERARRAY DATASLOTS(0 : 15) = %C M'1',M'2',M'3', M'4',M'5',M'6',M'7', M'8',M'9',M'A',M'B', M'C',M'D',M'E',M'0',M'F' %OWNINTEGERARRAY OPAT(0 : 16) %OWNINTEGERARRAY OPUSE(0 : 16) %OWNINTEGERARRAY OPNUM(0 : 16) %OWNINTEGERARRAY NULLWIRE(0 : 1024) %OWNINTEGERARRAY INSTRWIRE(0 : 1024) %OWNINTEGERARRAY INSTR(0 : 1024) %OWNINTEGERARRAY NAMESLOT(1 : 256) = -1(256) %OWNINTEGERARRAY DATASLOT(0 : 15) %OWNINTEGERARRAY CONTRLSLOT(0 : 45) %OWNINTEGERARRAY NOBUSSLOT(0 : 16) %OWNINTEGERARRAY ITEM(0 : 2048) %OWNSHORTINTEGERARRAY NEXT(0 : 2048) %OWNSHORTINTEGERARRAY WIREINSTR(0 : 1024) %OWNINTEGERARRAY WIRE(0 : 1024) %OWNINTEGERARRAY CHOICE(1 : 2) %OWNSHORTINTEGERARRAY SLOTADDR(1 : 32) %OWNINTEGER ASL = 2048 %OWNSHORTINTEGER HEAD %OWNINTEGER TYPE, FULL, WHAT, CURRENT, PREVIOUS, CHANGED, LOST, %C TLINENO %OWNINTEGER DATALOC=-1 %OWNINTEGER CONTRLOC=-1 %OWNINTEGER NOBUSLOC=-1 %OWNINTEGER FLAGAT, FLAGNUM %OWNINTEGER CGENUM, CGENAT %OWNINTEGER BRANCHAT, BRANCHNUM %OWNINTEGER MERGE2AT, MERGE2NUM %OWNINTEGER FMERGE4LEFT, FMERGE4NUM %OWNINTEGER MERGE4AT, MERGE4NUM %OWNINTEGER FRTCALLAT, FRTCALLNUM, DISPLACED %OWNINTEGER WIRENO, INSTRNO, START !***************************************************************** !*** DECLARATIONS AS PER PDPDUMPS %ENDOFLIST %OWNSTRING (15) OUTPUT = '.TT' %OWNSTRING (15) SOURCE = 'SS#ARTH' %CONSTSTRING (6) %ARRAY MODTYPE(1 : 13) = %C 'GPAUC ','FLAG ','MEMORY','SPREG ', 'CGEN ','BREG ','TREG ','BRANCH', 'GPINT ','IPINT ','OPINT ','SINT ','MEMORY' %CONSTSTRING (6) %ARRAY OPCODES(0 : 14) = %C 'NOP ', 'EVOKE ', 'BUS ', 'COND ', 'MERGE ', 'RTCALL', 'RETURN', 'JUMP ', 'STOP ', 'BRANCH', 'T-LINE', 'BREAK ', 'CONT ','CMERGE','UNDEF ' %CONSTINTEGER NMAX = 100 %RECORDFORMAT EXTERNFM(%BYTEINTEGER FROM, FBITS, TO, TOBITS) %CONSTINTEGER EXTLNG = 100 %RECORDFORMAT CODEFM(%BYTEINTEGER CODE, NAME, OPRN, MODULE, %C %SHORTINTEGER DEST, STAT) %RECORDFORMAT HEADFM( %C %INTEGER IDEN, USEAGE, NNAMES, NAMES, TEXT, CODE, %C CONSTANTS, OLD FILE, TXTLNG, STARTAD, EXTERNS, TABS) %RECORDFORMAT TAGFM(%INTEGER MASTER, %SHORTINTEGER TYPE, %C %BYTEINTEGER USED, BITS, %INTEGER USE, DEFN, SIZE, WHERE) %RECORDFORMAT NAMEFM(%INTEGER NAME,%RECORD TAGS(TAGFM)) %ROUTINE CONNEKT(%STRING(17) FILE, %INTEGERNAME AD,FLAG) %SYSTEMROUTINESPEC CONNECT(%STRING (15) S, %C %INTEGER ACCESS, MAXBYTES, PROTECTION, %C %RECORDNAME R, %INTEGERNAME FLAG) %RECORDFORMAT FINFO(%INTEGER CONAD, FILESIZE, %C %BYTEINTEGER DUM1, DUM2, MODE, DUM3, DUM4, %C %STRING (6) DUM5, %SHORTINTEGER FILETYPE, DUM6, %C %INTEGER DATASTART, DATAEND, DUM7) %RECORD R(FINFO) %CONSTINTEGER READ UNSHARED = 2 CONNECT(FILE,READ UNSHARED,0,4,R,FLAG) AD = R_CONAD %IF FLAG = 0 %END %LIST !***************************************************************** %ROUTINE INCRCONTRL %OWNINTEGER FLAG = 0 %INTEGER L CONTRLOC = CONTRLOC+1 %IF FLAG = 0 %AND CONTRLOC+DATALOC >= 28 %START !*** GET EXTRA CONTROLSLOTS FROM NOBUSSLOTS %CYCLE L = 0, 1, 15 CONTRLSLOTS(CONTRLOC+L) = NOBUSSLOTS(15-L) %REPEAT FLAG = 1 %FINISH %IF CONTRLOC+DATALOC >= 44 %C %THEN PRINTSTRING(' *** CONTROL BUS FULL *** ') %C %AND FULL = 1 %AND %RETURN %END !***************************************************************** %ROUTINE AUTOALLOC(%INTEGER OP, N) !*** ALLOCATE SLOTS ON CONTROL BUS %RETURN %IF OPUSE(OP) <= 0 OPAT(OP) = CONTRLOC+1 OPNUM(OP) = (OPUSE(OP)+N-1)//N %CYCLE N = 1, 1, OPNUM(OP) INCRCONTRL %IF FULL = 1 %THEN %RETURN CONTRLSLOT(CONTRLOC) = OP %REPEAT %END !***************************************************************** %ROUTINE AUTOINCR(%INTEGER OP, N) !*** GET NEXT CONTROL ELEMENT - NEW CARD IF NECESSARY %IF OPNUM(OP) = N %C %THEN OPNUM(OP) = 0 %AND OPAT(OP) = OPAT(OP)+1 OPNUM(OP) = OPNUM(OP)+1 %END !***************************************************************** %ROUTINE CON(%INTEGER WHAT, %INTEGERNAME POINTER) !*** CONNECT WIRE OR PIN TO LIST %INTEGER TEMP %RETURN %IF WHAT = 0 TEMP = NEXT(ASL) NEXT(ASL) = POINTER POINTER = ASL ASL = TEMP ITEM(POINTER) = WHAT %IF ASL = 0 %THEN %STOP %END !***************************************************************** %INTEGERFN ACTUAL(%INTEGER SLOT, PIN) !*** ACTUAL PIN FROM SLOT NUMBER AND DISPLACEMENT %RESULT = CONTRLSLOTS(SLOT)<<16+MODPIN(PIN) %END !***************************************************************** %ROUTINE HSYM(%INTEGER N) %OWNBYTEINTEGERARRAY HEX(0:15) = %C '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' !**** PRINT CONSTANT IN HEX PRINTSYMBOL(HEX(N>>12)) PRINTSYMBOL(HEX(N>>8&15)) PRINTSYMBOL(HEX(N>>4&15)) PRINTSYMBOL(HEX(N&15)) %END !***************************************************************** %ROUTINE PRINTMC(%INTEGER N) !*** PRINT MULTICONSTANT ROUTINE PRINTSYMBOL(N>>24) PRINTSYMBOL(N>>16&255) PRINTSYMBOL(N>>8&255) PRINTSYMBOL(N&255) %END !***************************************************************** %ROUTINE MERGE(%INTEGER PTR, P, DISP, SLOT) !*** ALLOCATE MERGES FOR FAN-IN %OWNBYTEINTEGERARRAY FLAGMAP(4 : 12) = %C 3,4,5,11,12,13,19,20,21 %INTEGERARRAY TPIN(1:2,1:3) %INTEGERARRAY FPIN(1:10,1:5) %INTEGERARRAY ARRAY(1 : 45) %INTEGER F, T, J, FLAG, IN, N, SHORT, EXTRA PSR !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** FLAG: 1=MODULE,0=PROGRAM,-1=FLAG CONTROL FLAG = 1; EXTRA PSR = 0 %IF P = 0 %START P = 1; FLAG = 0 %FINISH %IF P = -1 %START P = 1; FLAG = -1 %FINISH !* * * * * * * * * * * * * * * * * * * * * * !*** GET ACTUAL INPUT WIRES N = 0 %WHILE PTR # 0 %CYCLE N = N+1 ARRAY(N) = ITEM(PTR) PTR = NEXT(PTR) %REPEAT !* * * * * * * * * * * * * * * * * * * * * * !*** WILL REQUIRE POST PROCESSING NOT A MERGE1 %IF FLAG = 0 %AND N = 1 %START NULLWIRE(-ARRAY(1)) = INSTRWIRE(INSTRNO)+1 PREVIOUS = 0 %RETURN %FINISH !* * * * * * * * * * * * * * * * * * * * * * !*** CALCULATE NUMBER OF MERGES REQUIRED F = (N-P)//3 T = (N-P)-F*3 %IF F < 0 %THEN F = 0 %IF T < 0 %THEN T = 0 !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** GET MERGE2S %IF F=0 %AND T=1 %AND FMERGE4LEFT>0 %START;! USE 4-MERGES SPARE T=0; F=1; EXTRA PSR = 2 %FINISH %IF T > 0 %START %CYCLE T = 1, 1, T MERGE2NUM = MERGE2NUM-MERGE2NUM//10*10+1 %IF MERGE2NUM = 1 %START NOBUSLOC = NOBUSLOC+1 MERGE2AT = NOBUSLOC NOBUSSLOT(NOBUSLOC) = 2 %FINISH %CYCLE J = 1, 1, 3 SHORT = MODPIN(AMERGE2+J+3*(MERGE2NUM-1)) TPIN(T, J) = NOBUSSLOTS(MERGE2AT)<<16+SHORT %REPEAT !*** OUTPUTS TEMPORARILY ON INPUT LIST ARRAY(N+T) = TPIN(T, 3) %REPEAT %FINISH !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** GET MERGE4S FROM EVOKE CARDS IF POSSIBLE %IF F > 0 %START %CYCLE F = 1, 1, F %IF FMERGE4LEFT > 0 %START FMERGE4NUM = FMERGE4NUM&1+1 DISPLACED = AFMERGE4+5*(FMERGE4NUM-1) %IF FMERGE4NUM = 1 %THEN MERGE4AT = MERGE4AT+1 %CYCLE J = 1, 1, 5 SHORT = MODPIN(DISPLACED+J) FPIN(F, J) = CONTRLSLOTS(MERGE4AT)<<16+SHORT %REPEAT %FINISH %ELSE %START !* * * * * * * * * * * * * * * * * * * * * * !*** GET MERGE4S FROM MERGE4 CARDS MERGE4NUM = MERGE4NUM-MERGE4NUM//6*6+1 %IF MERGE4NUM = 1 %START NOBUSLOC = NOBUSLOC+1 MERGE4AT = NOBUSLOC NOBUSSLOT(NOBUSLOC) = 4 %FINISH DISPLACED = AMERGE4+5*(MERGE4NUM-1) %CYCLE J = 1, 1, 5 SHORT = MODPIN(DISPLACED+J) FPIN(F, J) = NOBUSSLOTS(MERGE4AT)<<16+SHORT %REPEAT %FINISH !*** OUTPUTS TEMPORARILY ON INPUT LIST ARRAY(N+T+F) = FPIN(F, 5) FMERGE4LEFT = FMERGE4LEFT-1 %REPEAT %FINISH !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** ALLOCATE WIRES TO MERGE OUTPUTS IN = N+T+F %IF FLAG = 0 %THEN IN = IN-1 %IF IN > N %START %CYCLE N = N+1, 1, IN WIRENO = WIRENO+1 CON(ARRAY(N), WIRE(WIRENO)) ARRAY(N) = -WIRENO %REPEAT %FINISH !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** CONNECT WIRES TO PINS EXCEPT FOR CONTROL %IF FLAG = 0 %THEN PREVIOUS = ARRAY(IN+1) %ELSE %START %IF FLAG = -1 %START DISP = FLAGMAP(DISP) SHORT = CONTRLSLOTS(SLOT)<<16+MODPIN(AFLAG+DISP) CON(SHORT, WIRE(-ARRAY(IN))) IN = IN-1 %FINISH %ELSE %START %WHILE P > 0 %AND IN > 0 %CYCLE CON(MODPIN(DISP+P)+DATASLOTS(SLOT)<<24, WIRE(-ARRAY( %C IN))) P = P-1; IN = IN-1 %REPEAT %FINISH %FINISH !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** CONNECT INPUTS TO MERGE4S %WHILE F > 0 %CYCLE %CYCLE J = 1, 1, 4 CON(FPIN(F, J), WIRE(-ARRAY(IN))) %IF EXTRA PSR # 0 %THEN EXTRA PSR = EXTRA PSR-1 %ELSE %C IN = IN-1 %REPEAT F = F-1 %REPEAT !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** CONNECT INPUTS TO MERGE2S %WHILE T > 0 %CYCLE %CYCLE J = 1, 1, 2 CON(TPIN(T, J), WIRE(-ARRAY(IN))) IN = IN-1 %REPEAT T = T-1 %REPEAT %END !***************************************************************** %ROUTINE SORT LIST(%SHORTINTEGERNAME TOP) %SHORTINTEGERNAME N %SHORTINTEGER HEAD %INTEGER J, V, P HEAD = 0 J = TOP %WHILE J # 0 %CYCLE P = J; J = NEXT(J) V = ITEM(P) N == HEAD N == NEXT(N) %WHILE N # 0 %AND ITEM(N) < V NEXT(P) = N; N = P %REPEAT TOP = HEAD %END !***************************************************************** %EXTERNALROUTINE WOMBLE(%STRING (63) S) %SWITCH OPCODE(0 : 16) %SWITCH EVOMOD(0 : 32) %INTEGERARRAY PINS(0:14,0:43) %INTEGERARRAY FLAGPOLE(0:45,0:12) %INTEGERARRAY TLINES(1 : 3) !***************************************************************** !*** DECLARATIONS AS PER PDPDUMPS %ENDOFLIST %RECORDARRAYFORMAT EXTARFM(1 : EXTLNG)(EXTERNFM) %RECORDARRAYNAME EXTERNALS(EXTERNFM) %RECORDFORMAT TABFM(%SHORTINTEGERARRAY W(0 : 7)) %RECORDARRAYFORMAT TBAFM(1 : 50)(TABFM) %RECORDARRAYNAME TABLES(TABFM) %RECORDARRAYFORMAT OBJFM(0 : 2000)(CODEFM) %RECORDARRAYFORMAT TEXTFM(1 : NMAX)(NAMEFM) %SHORTINTEGERARRAYFORMAT USEFM(0 : 20) %SHORTINTEGERARRAYFORMAT CONFM(0 : 60) %RECORDARRAYNAME OBJECT(CODEFM) %RECORDARRAYNAME NAME(NAMEFM) %RECORDNAME NP(NAMEFM) %RECORDNAME CP(CODEFM) %SHORTINTEGERARRAYNAME USE %SHORTINTEGERARRAYNAME CONSTANTS %SHORTINTEGERARRAYNAME BADDRS %RECORDNAME HEADER(HEADFM) %RECORDNAME TAGS(TAGFM) %EXTERNALROUTINESPEC DEFINE(%STRING (63) S) %INTEGER AD, FLAG, J, K, L, LIMIT, DISP, M, N %ROUTINE PS(%INTEGER AD) %STRING (8) S S <- STRING(AD+DISP) PRINTSTRING(S) SPACES(10-LENGTH(S)) %END %LIST !***************************************************************** %ROUTINE CONPIN(%INTEGER PIN) CON(-WIRENO, PINS(NAMESLOT(CP_NAME), PIN)) %END !***************************************************************** %ROUTINE CONTLINE(%INTEGER MC, NAME, MODULE, ADDR) !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * %ROUTINE CONCHAIN(%INTEGER PIN) CON(MC, PINS(NAMESLOT(NAME), PIN)) %END !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * %INTEGER LEVEL %SWITCH MD(0 : 32) -> MD(MODULE) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** HI,LO,OVF,DZ,DP,DN MD(0): ADDR = ADDR>>8 %IF ADDR = 1 %OR ADDR = 2 %START %IF ADDR = 2 %THEN LEVEL = M'*HI*' %ELSE LEVEL = M'*LO*' WIRENO = WIRENO+1 WIREINSTR(WIRENO) = INSTRNO CON(LEVEL, WIRE(WIRENO)) CON(MC, WIRE(WIRENO)) %RETURN %FINISH CON(MC, PINS(14, ADDR+24)) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** FLAG MD(2): NAME = NAMESLOT(NAME) CON(MC, FLAGPOLE(NAME&63, NAME>>8)) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** BREG BITS MD(6): CONCHAIN(13+ADDR&15) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** TREG BITS MD(7): CONCHAIN(9+ADDR&15) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** OPINT BITS MD(10): CONCHAIN(5+ADDR&15) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** IPINT BITS MD(11): CONCHAIN(5+ADDR&15) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** GPAUR_A BITS MD(18): CON(MC, PINS(NAMESLOT(NAME)+1, 9+ADDR&15)) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** GPAUR_B BITS MD(19): CON(MC, PINS(NAMESLOT(NAME)+1, 33+ADDR&1)) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** SINT_KF MD(21): CONCHAIN(13) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** SINT_PF MD(22): CONCHAIN(14) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** BUS BITS MD(25): CON(MC, PINS(14, 9+ADDR&15)) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** GPINT_IN BITS MD(26): CONCHAIN(5+ADDR&15) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** GPINT_OUT BITS MD(27): CONCHAIN(25+ADDR&15) %RETURN !* * * * * * * * * * * * * * * * * * * * !*** SINT_OVERUN MD(31): CONCHAIN(18) %END !***************************************************************** !*** INPUT/OUTPUT FILE ALLOCATION AND CHECK %IF LENGTH(S) > 31 %START PRINTSTRING('PARAMETER '.S.' ? ') %RETURN %FINISH S = SOURCE %IF S = '' %IF S -> S.('/').OUTPUT %START S = SOURCE %IF S = '' OUTPUT = '.TT' %IF OUTPUT = '' %FINISH DEFINE('ST01,'.OUTPUT) AD = 7; ! READ ONLY CONNEKT(S, AD, FLAG) %IF FLAG # 0 %START PRINTSTRING('CANNOT CONNECT '.S.', FLAG =') WRITE(FLAG, 1) NEWLINE %RETURN %FINISH HEADER == RECORD(AD+32); ! FOR SYSTEM USE 16 EXTRA %IF HEADER_IDEN # M'ARTH' %OR INTEGER(AD) = 0 %C %THEN PRINTSTRING(S.' CANNOT BE WOMBLED ') %AND %RETURN SELECTOUTPUT(1) !***************************************************************** !*** INITIALISE ARRAYS AND LIST NEXT(0) = 0 %CYCLE ASL = 1, 1, ASL NEXT(ASL) = ASL-1 %REPEAT %CYCLE J = 0, 1, 14 %CYCLE K = 0, 1, 43 PINS(J, K) = 0 %REPEAT %REPEAT %CYCLE J = 0, 1, 45 %CYCLE K = 0, 1, 12 FLAGPOLE(J, K) = 0 %REPEAT %REPEAT !***************************************************************** !*** ADDRESSES OF PIN MULTICONSTANTS IN MODPIN PINS(0, 0) = ABSENS SLOTADDR(1) = AGPAU SLOTADDR(3) = AMEMORY SLOTADDR(4) = ASPR SLOTADDR(5) = ACGEN SLOTADDR(6) = ABREG SLOTADDR(7) = ATREG SLOTADDR(9) = AGPINT SLOTADDR(10) = AIPINT SLOTADDR(11) = AOPINT SLOTADDR(12) = ASINT !***************************************************************** !*** SET UP RECORDS FRON OBJECT FILE DISP = AD-HEADER_OLD FILE AD = AD+32 NAME == ARRAY(AD+HEADER_NAMES, TEXTFM) EXTERNALS == ARRAY(AD+HEADER_EXTERNS, EXTARFM) TABLES == ARRAY(AD+HEADER_TABS, TBAFM) OBJECT == ARRAY(AD+HEADER_CODE, OBJFM) USE == ARRAY(AD+HEADER_USEAGE, USEFM) CONSTANTS == ARRAY(AD+HEADER_CONSTANTS, CONFM) K = HEADER_NNAMES J = 0 LIMIT = HEADER_CONSTANTS+AD !***************************************************************** !*** EXAMINE CODE FOR CONTROL MODULE ALLOCATION %UNTIL (CP_CODE = 8 %AND CP_OPRN = 0) %C %OR ADDR(CP) >= LIMIT %CYCLE J = J+1; CP == OBJECT(J) %IF CP_CODE = 6 %THEN START = J OPUSE(CP_CODE) = OPUSE(CP_CODE)+1 %REPEAT START = START+1 INSTRNO = J NEWLINES(5) PRINTSTRING(TITLE) !***************************************************************** !*** EXAMINE NAME TABLE FOR DATA MODULE ALLOCATION PRINTSTRING(' DECLARED ======== NAME MODULE SLOT ---- ------ ---- BSENSE 0B ') %IF K > 0 %START %CYCLE K = 1, 1, K NP == NAME(K); TAGS == NP_TAGS %IF TAGS_MASTER # 0 %C %AND NAMESLOT(TAGS_MASTER) = -1 %START !*** ACTUAL DECLARATION !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * %IF MODSLOT(TAGS_TYPE) = 1 %START !*** DATA MODULE PS(NP_NAME) DATALOC = DATALOC+1 DATASLOT(DATALOC) = TAGS_TYPE NAMESLOT(TAGS_MASTER) = DATALOC PINS(DATALOC, 0) = SLOTADDR(TAGS_TYPE) PRINTSTRING(MODTYPE(TAGS_TYPE)); SPACES(6) PRINTMC(DATASLOTS(NAMESLOT(TAGS_MASTER))<<8+'B') NEWLINE %IF TAGS_TYPE = 1 %START DATALOC = DATALOC+1 PINS(DATALOC, 0) = AGPAR PRINTSTRING(' GPAUR ') PRINTMC(DATASLOTS(NAMESLOT(TAGS_MASTER)+1)<<8+ %C 'B') NEWLINE %FINISH %FINISH !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * %IF MODSLOT(TAGS_TYPE) = 2 %START !*** CONTROL MODULE PS(NP_NAME) !* * * * * * * * * * * * * * * * * * * * * * %IF TAGS_TYPE = 2 %START !*** FLAG FLAGNUM = FLAGNUM-FLAGNUM//3*3+1 %IF FLAGNUM = 1 %START !*** NEW CARD INCRCONTRL %IF FULL = 1 %THEN %RETURN FLAGAT = CONTRLOC CONTRLSLOT(CONTRLOC) = 2 FLAGPOLE(FLAGAT, 0) = 1 %FINISH NAMESLOT(TAGS_MASTER) = FLAGNUM<<8+FLAGAT %FINISH !* * * * * * * * * * * * * * * * * * * * * * %IF TAGS_TYPE = 8 %START !*** BRANCH BRANCHNUM = BRANCHNUM&1+1 %IF BRANCHNUM = 1 %START !*** NEW CARD INCRCONTRL %IF FULL = 1 %THEN %RETURN BRANCHAT = CONTRLOC CONTRLSLOT(CONTRLOC) = 8 %FINISH NAMESLOT(TAGS_MASTER) = BRANCHNUM<<8+BRANCHAT %FINISH !* * * * * * * * * * * * * * * * * * * * * * PRINTSTRING(MODTYPE(TAGS_TYPE)); SPACES(6) PRINTMC(CONTRLSLOTS(NAMESLOT(TAGS_MASTER)&63)) NEWLINE %FINISH !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * %IF DATALOC >= 14 %C %THEN PRINTSTRING(' *** DATA BUS FULL *** ') %C %AND %RETURN %FINISH %REPEAT %FINISH !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * CGENUM = CONSTANTS(0) CGENAT = DATALOC+1 %IF CGENUM > 0 %START %CYCLE L = 1, 4, (CGENUM+1)&(\3)-3 DATALOC = DATALOC+1 %IF DATALOC = 14 %C %THEN PRINTSTRING(' *** DATA BUS FULL *** ') %C %AND %RETURN PINS(DATALOC, 0) = ACGEN %IF L = 1 %THEN PRINTSTRING(' CGEN ') %C %ELSE SPACES(22) PRINTMC(DATASLOTS(DATALOC)<<8+'B') PRINTSTRING(' :') %CYCLE J = L, 1, L+3 ! OUTPUT VALUES IN CGEN SPACES(4) HSYM(CONSTANTS(J)) %EXITIF J = CGENUM %REPEAT NEWLINE %REPEAT %FINISH ! DATALOC = DATALOC+1; ! ONE EXTRA FOR THE BUS SENSE PRINTSTRING(' BTRMTR FB # ') !***************************************************************** !*** ALLOCATE REMAINING CONTROL MODULES !*** NOP AUTOALLOC(0, 24) !*** EACH NOP REQUIRES AN EVOKE OPUSE(1) = OPUSE(1)+OPUSE(0)+OPUSE(15) !*** EVOKE AUTOALLOC(1, 5) MERGE4AT = OPAT(1)-1 FMERGE4LEFT = 2*OPNUM(1) FRTCALLAT = OPAT(1) FRTCALLNUM = OPNUM(1) !*** COND AUTOALLOC(3, 6) OPUSE(5) = OPUSE(5)-OPNUM(1) !*** FREE RTCALLS ON EVOKE CARDS AUTOALLOC(5, 6) OPUSE(5) = OPUSE(5)+OPNUM(1) %IF FULL = 1 %THEN %RETURN NEWLINES(2) !***************************************************************** !*** OUTPUT ALLOCATION OF CONTROL SLOTS PRINTSTRING(' CONTROL ======= CARD SLOT ---- ---- ') %CYCLE L = 0, 1, 5 J = 0 %IF L # 2 %AND L # 4 %AND OPNUM(L) # 0 %START PRINTSTRING(OPCODES(L)) SPACES(6) %CYCLE K = 0, 1, OPNUM(L)-1 %IF J = 8 %START NEWLINE; SPACES(12); J = 1 %FINISH %ELSE J = J+1 PRINTMC(CONTRLSLOTS(OPAT(L)+K)); SPACES(2) %REPEAT OPNUM(L) = 0 NEWLINE %FINISH %REPEAT !***************************************************************** !*** EXAMINE CODE AND GENERATE LISTS %CYCLE INSTRNO = 1, 1, INSTRNO CP == OBJECT(INSTRNO) WIRENO = WIRENO+1 WIREINSTR(WIRENO) = INSTRNO PREVIOUS = M'0BB2' %IF INSTRNO = START CON(PREVIOUS, WIRE(WIRENO)) PREVIOUS = 0 -> OPCODE(CP_CODE) !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** NOP OPCODE(0): AUTOINCR(0, 24) CURRENT = ACTUAL(OPAT(0), ANOP+OPNUM(0)) CON(CURRENT, WIRE(WIRENO)) !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** EVOKE OPCODE(1): OPCODE(15): AUTOINCR(1, 5) CURRENT = ACTUAL(OPAT(1), AEVOKE+2*OPNUM(1)-1) CON(CURRENT, WIRE(WIRENO)) PREVIOUS = ACTUAL(OPAT(1), AEVOKE+2*OPNUM(1)) -> EVOMOD(CP_MODULE) !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** CONTINUE OPCODE(12): WIRENO = WIRENO-1 -> EVOMOD(CP_MODULE) !* * * * * * * * * * * * * * * * * * * * * * !*** NOP EVOMOD(0): -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * !*** MEMORY EVOMOD(3): %IF CP_DEST = 9 %START %IF CP_OPRN = 36 %THEN CONPIN(5) %IF CP_OPRN = 37 %THEN CONPIN(9) %FINISH %ELSE %START %IF CP_OPRN = 37 %THEN CONPIN(1) %FINISH -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * !*** CGEN EVOMOD(5): CON(-WIRENO, PINS(CGENAT+(CP_NAME-1)//4, %C (CP_NAME-1)&3*4+CP_DEST-2)) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * !*** BREG EVOMOD(6): %IF CP_OPRN = 36 %THEN CONPIN(2*CP_DEST-3) %IF CP_OPRN = 37 %THEN CONPIN(1) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * !*** TREG EVOMOD(7): %IF CP_OPRN = 36 %THEN CONPIN(5-CP_DEST//2) %IF CP_OPRN = 37 %THEN CONPIN(9-CP_DEST//2) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * !*** IPINT EVOMOD(10): CONPIN(1) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * !*** OPINT EVOMOD(11): CONPIN(1) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * !*** SINT EVOMOD(12): %IF CP_OPRN = 35 %THEN CONPIN(9) %IF CP_OPRN = 36 %THEN CONPIN(5) %IF CP_OPRN = 37 %THEN CONPIN(1) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * !*** ROM? EVOMOD(13): -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * !*** GPA_A EVOMOD(18): !*** GPA_B EVOMOD(19): %IF CP_OPRN&16 = 16 %THEN CONPIN(37) %IF CP_OPRN < 32 %THEN CONPIN(GPAMAP(CP_OPRN&15)) %IF CP_DEST = 1 %C %THEN CON(-WIRENO, PINS(NAMESLOT(CP_NAME)+1, 1)) %IF CP_DEST = 2 %C %THEN CON(-WIRENO, PINS(NAMESLOT(CP_NAME)+1, 25)) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * !*** SP REG EVOMOD(24): %IF CP_OPRN = 36 %THEN CONPIN(1) %IF CP_OPRN = 37 %THEN CONPIN(5) %IF CP_DEST < 15 %THEN CONPIN(2*CP_DEST+9) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * !*** BUS EVOMOD(25): %IF CP_OPRN = 13 %THEN CON(-WIRENO, PINS(14, 5)) %IF CP_OPRN = 37 %THEN CON(-WIRENO, PINS(14, 1)) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * !*** GPINT_IN EVOMOD(26): CONPIN(1) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * !*** GPINT_OUT EVOMOD(27): CONPIN(21) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** CONDITION OPCODE(3): AUTOINCR(3, 6) DISPLACED = ABRANCH2+(OPNUM(3)-1)*4 TYPE = CP_OPRN %IF TYPE > 2 %THEN TYPE = TYPE-2 CURRENT = ACTUAL(OPAT(3), DISPLACED+1) CHOICE(1) = ACTUAL(OPAT(3), DISPLACED+2) CHOICE(2) = ACTUAL(OPAT(3), DISPLACED+3) CON(CURRENT, WIRE(WIRENO)) CON(CHOICE(TYPE), WIRE(WIRENO+1)) CON(CHOICE(3-TYPE), WIRE(WIRENO+2)) CURRENT = ACTUAL(OPAT(3), DISPLACED+4) CONTLINE(CURRENT, CP_NAME, CP_MODULE, CP_DEST) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** MERGE OPCODE(4): %IF CP_MODULE = 0 %THEN WIRENO = WIRENO-1 %C %ELSE CON(-WIRENO, INSTR(INSTRNO)) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** RTCALL OPCODE(5): %IF FRTCALLNUM # 0 %START FRTCALLNUM = FRTCALLNUM-1 DISPLACED = AFRTCALL %FINISH %ELSE %START AUTOINCR(5, 6) FRTCALLAT = OPAT(5) DISPLACED = ARTCALL+(OPNUM(5)-1)*4 %FINISH CURRENT = ACTUAL(FRTCALLAT, DISPLACED+1) CON(CURRENT, WIRE(WIRENO)) CON(-WIRENO, INSTR(CP_DEST)) CURRENT = ACTUAL(FRTCALLAT, DISPLACED+2) CON(CURRENT, WIRE(INSTRWIRE(CP_MODULE))) PREVIOUS = ACTUAL(FRTCALLAT, DISPLACED+3) FRTCALLAT = FRTCALLAT+1 -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** RETURN OPCODE(6): -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** JUMP OPCODE(7): J = CP_DEST %WHILE OBJECT(J)_CODE = 13 %THEN J = J-1 CON(-WIRENO, INSTR(J)) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** STOP OPCODE(8): CON(M'****', WIRE(WIRENO)) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** BRANCH OPCODE(9): BADDRS == TABLES(CP_DEST)_W BRANCHAT = NAMESLOT(CP_NAME)&63 BRANCHNUM = NAMESLOT(CP_NAME)>>8 DISPLACED = ABRANCH8+12*(BRANCHNUM-1)+1 CURRENT = ACTUAL(BRANCHAT, DISPLACED) CON(CURRENT, WIRE(WIRENO)) %CYCLE L = 0, 1, 7 %IF BADDRS(L) # 0 %START WIRENO = WIRENO+1 WIREINSTR(WIRENO) = INSTRNO CURRENT = ACTUAL(BRANCHAT, DISPLACED+4+L) CON(CURRENT, WIRE(WIRENO)) J = BADDRS(L) %WHILE OBJECT(J)_CODE = 13 %THEN J = J-1 CON(-WIRENO, INSTR(J)) %FINISH %REPEAT %CYCLE L = 1, 1, 3 TLINES(L) = ACTUAL(BRANCHAT, DISPLACED+L) %REPEAT TLINENO = 0 -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** T-LINE OPCODE(10): WIRENO = WIRENO-1 TLINENO = TLINENO+1 CONTLINE(TLINES(TLINENO), CP_NAME, CP_MODULE, CP_DEST) -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** BREAK OPCODE(11): WIRENO = WIRENO-1 -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** CMERGE OPCODE(13): WIRENO = WIRENO-1 -> CONTINUE !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** FLAG OPCODE(14): WIRENO = WIRENO-1 %IF CP_DEST#0 %THEN CON(-WIRENO,PINS(14,25))%ELSESTART FLAGAT = NAMESLOT(CP_NAME)&63 FLAGNUM = NAMESLOT(CP_NAME)>>8 CON(-WIRENO, FLAGPOLE(FLAGAT, 3*FLAGNUM+CP_OPRN-2)) %FINISH CONTINUE: INSTRWIRE(INSTRNO) = WIRENO %IF INSTRWIRE(INSTRNO) = 0 %REPEAT !*********************************************************************** !*** ALLOCATE PINS FOR L AND R SI AND DATA ENABLE FOR FLAGS %CYCLE K = 1,1,HEADER_NNAMES TAGS == NAME(K)_TAGS N = TAGS_MASTER %IF TAGS_TYPE = 1 %START N = DATA SLOTS(NAMESLOT(N))<<24 L = TAGS_USE M = SLOTADDR(1)+41 %CYCLE M = M,1,M+1 L =((L!!1)+1)<<8 %IF 0<= L <=1; ! %HIGH OR %LOW WIRENO = WIRENO+1 J = N+MODPIN(M) CONTLINE(J,L>>24,L>>16&255,L&X'FFFF') CON(0,WIRE(WIRENO)) L = TAGS_DEFN %REPEAT %FINISH %IF TAGS_TYPE = 2 %AND K = N %START ! NOT DEFINED FLAGS N = NAMESLOT(N) N = CONTRLSLOTS(N&63)<<16+MODPIN(AFLAG+N>>5) WIRENO = WIRENO+1 WIREINSTR(WIRENO) = INSTRNO CON(M'*LO*',WIRE(WIRENO)) CON(N,WIRE(WIRENO)) %FINISH %REPEAT !***************************************************************** !*** ALLOCATE PROGRAM CONTROL MERGES %CYCLE INSTRNO = 1, 1, INSTRNO %IF INSTR(INSTRNO) # 0 %START MERGE(INSTR(INSTRNO), 0, 0, 0) CON(PREVIOUS, WIRE(INSTRWIRE(INSTRNO)+1)) %FINISH %REPEAT !***************************************************************** !*** ALLOCATE MODULE CONTROL MERGES %CYCLE DATALOC = 0, 1, 14 %CYCLE J = 1, 1, 43 CURRENT = PINS(DATALOC, J) %IF CURRENT # 0 %START %IF ITEM(CURRENT) < 0 %START DISPLACED = PINS(DATALOC, 0)+J MERGE(CURRENT, NUMPIN(DISPLACED), DISPLACED-1, %C DATALOC) %FINISH %ELSE %START !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** LINK TEST LINE CHAINS TO MODULES WIRENO = WIRENO+1 WIRE(WIRENO) = CURRENT CURRENT = DATASLOTS(DATALOC)<<24+MODPIN(PINS( %C DATALOC, 0)+J) CON(CURRENT, WIRE(WIRENO)) %FINISH %FINISH %REPEAT %REPEAT !***************************************************************** !*** LINK TEST LINE CHAINS TO FLAGS %CYCLE J = 0, 1, 45 %IF FLAGPOLE(J, 0) # 0 %START %CYCLE K = 1, 1, 3 %IF FLAGPOLE(J, K) # 0 %START WIRENO = WIRENO+1 WIRE(WIRENO) = FLAGPOLE(J, K) CURRENT = CONTRLSLOTS(J)<<16+MODPIN(AFLAG+(K-1)*8+ %C 6) CON(CURRENT, WIRE(WIRENO)) %FINISH %REPEAT !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** ALLOCATE FLAG CONTROL MERGES %CYCLE K = 4, 1, 12 %IF FLAGPOLE(J, K) # 0 %C %THEN MERGE(FLAGPOLE(J, K), -1, K, J) %REPEAT %FINISH %REPEAT !***************************************************************** !*** OUTPUT USE OF MERGE4 CARDS %IF FMERGE4LEFT < 0 %START PRINTSTRING('MERGE4 ') J = 0 %CYCLE NOBUSLOC = 0, 1, NOBUSLOC %IF NOBUSSLOT(NOBUSLOC) = 4 %START %IF J = 8 %START NEWLINE; SPACES(10); J = 1 %FINISH %ELSE J = J+1 SPACES(2); PRINTMC(NOBUSSLOTS(NOBUSLOC)) %FINISH %REPEAT NEWLINE %FINISH !* !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** OUTPUT USE OF MERGE2 CARDS %IF MERGE2NUM > 0 %START PRINTSTRING('MERGE2 ') J = 0 %CYCLE NOBUSLOC = 0, 1, NOBUSLOC %IF NOBUSSLOT(NOBUSLOC) = 2 %START %IF J = 8 %START NEWLINE; SPACES(10); J = 1 %FINISH %ELSE J = J+1 SPACES(2); PRINTMC(NOBUSSLOTS(NOBUSLOC)) %FINISH %REPEAT NEWLINE %FINISH PRINTSYMBOL('#') !***************************************************************** !*** POSTPROCESS WIRES TO ELIMINATE NULL WIRES %CYCLE CHANGED = 0 %CYCLE WIRENO = 1, 1, WIRENO %IF NULLWIRE(WIRENO) # 0 %START %WHILE WIRE(WIRENO) # 0 %CYCLE CURRENT = ITEM(WIRE(WIRENO)) WIRE(WIRENO) = NEXT(WIRE(WIRENO)) CON(CURRENT, WIRE(NULLWIRE(WIRENO))) CHANGED = 1 %REPEAT %FINISH %REPEAT %EXIT %IF CHANGED = 0 %REPEAT !***************************************************************** !*** SORT WIRES %CYCLE WIRENO = 1, 1, WIRENO HEAD = WIRE(WIRENO) SORT LIST(HEAD) WIRE(WIRENO) = HEAD %REPEAT !***************************************************************** !*** OUTPUT ACTUAL WIRING PRINTSTRING(' WIRING ====== STAT WIRE FROM TO ---- ---- ---- -- ') L = -1 LOST = 0 %CYCLE WIRENO = 1, 1, WIRENO J = WIRE(WIRENO) %IF J # 0 %START K = 0 %IF L = OBJECT(WIREINSTR(WIRENO))_STAT %C %THEN SPACES(4) %ELSE %START L = OBJECT(WIREINSTR(WIRENO))_STAT %IF L = 0 %THEN SPACES(4) %ELSE WRITE(L&X'7FFF', 3) %FINISH WRITE(WIRENO-LOST, 5) SPACES(4) !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !*** ACTUAL WIRE PRINTMC(ITEM(J)) J = NEXT(J) %WHILE J # 0 %CYCLE PRINTSTRING(' <=> ') %IF K = 5 %START NEWLINES(2); SPACES(14); K = 0 %FINISH %ELSE K = K+1 PRINTMC(ITEM(J)) J = NEXT(J) %REPEAT NEWLINES(2) %FINISH %ELSE LOST = LOST+1 %REPEAT PRINTSYMBOL('#') !***************************************************************** !*** END MESSAGE TO FILE AND TELETYPE %CYCLE NEWLINES(3) PRINTSTRING(' =========== END OF WOMBLE ========== ') NEWLINES(3) SELECTOUTPUT(0) %EXIT %IF OUTPUT = '.TT' CLOSESTREAM(1) OUTPUT = '.TT' %REPEAT %END !***************************************************************** !***************************************************************** %ENDOFFILE