! DATED 02 MAY 78 2 %ROUTINESPEC SETS(%INTEGER STREAM) %ROUTINE DUMP BIN(%HALFINTEGERARRAYNAME CODE, %C %INTEGER START,FINISH,%STRINGNAME T,%INTEGERNAME FLAG) PRINTSTRING("ROUTINE DUMPBIN CALLED ?? ") %END; ! DUMPBIN %OWNBYTEINTEGERARRAY BIN(-2:30000) %OWNINTEGERARRAY T(0:300) %OWNINTEGER CA,BLKENT,BRFAULT %OWNINTEGERARRAY BAT(0:6000) %RECORDFORMAT REL ADDRS(%INTEGER RADDR,LINK) %OWNRECORDARRAY REL(1:10)(RELADDRS) %OWNINTEGER MAIN=0 %OWNINTEGER SYSSTK=0 %OWNINTEGER ENDCO1=0 %OWNINTEGER ENDCO=0 %OWNINTEGER CT0=0 %OWNINTEGER LASTRELADDR=0 %OWNINTEGER LASTCAREL=0 %ROUTINE DBIN(%INTEGER OP,M1,NEM1,NUM1,M2,NEM2,NUM2) ! ! ! OP=-2 ADDRESS OF CT0 OR STB NOW AVAILABLE : ! M1=17=STB : M1=18=CT0 : NEM1=ADDR(M1) ! ! OP=-1 BTN NOW SET : ADDRESS AT BAT(M1) ! ! OP= 0 MACHINE CODE ! ! OP= 108-110 OR 120-125 BRANCH OR JUMP ! ! OP= 111-119 OR 126-166 ANY OTHER INSTRUCTION ! ! %ROUTINESPEC POP BT ADDR(%INTEGERNAME BTADDRHD,CADDR,TYPE) %ROUTINESPEC REMOVE SAT BTS %OWNBYTEINTEGERARRAY BIN(-2:30000) %HALFINTEGERARRAYNAME BINS %HALFINTEGERARRAYFORMAT BINFORM(0:15000) BINS==ARRAY(ADDR(BIN(0)),BINFORM) %INTEGERFNSPEC FIND BT ENTRY(%INTEGER BTNO) %ROUTINESPEC PUSH UNSAT BTS(%INTEGER BTNO,CADDR,TYPE) %ROUTINESPEC PUSH BT ADDR(%INTEGERNAME BTADDRHD,%INTEGER CADDR,TYPE) %INTEGERFNSPEC OCT TO BIN(%INTEGERNAME PTR,%INTEGERARRAYNAME T) %ROUTINESPEC OCT(%INTEGER I) BRFAULT=0 %RECORDFORMAT UNSATBTS(%INTEGER LINK,BTNO,BTADDRHD) %RECORDFORMAT CALSTF(%INTEGER LINK,CADDR,TYPE) %OWNRECORDARRAY BTCELLS(0:999)(UNSATBTS) %OWNRECORDARRAY LCELLS(0:999)(CALSTF) %OWNINTEGERARRAY CTSTBHD(17:18)=-1(2) %OWNINTEGER RELPTR=2 %OWNINTEGER FIRST=0 %OWNINTEGER BTASL=0 %OWNINTEGER LASL=0 %OWNINTEGER BTC=-1 %OWNINTEGER ABS=0 %OWNINTEGER STB=0 %INTEGER J,K,L,ENTRY,LAST ENTRY,PUSH CT STB ; PUSH CT STB=0 %BYTEINTEGER BRDISP %HALFINTEGER JMPDISP %INTEGER CODE,I %OWNINTEGERARRAY INST(108:166)= %C X'100',X'77',X'837',X'BC0',X'1000',X'80',X'A1',X'C00', X'CC0',0(3),X'200',X'300',X'400',X'500',X'700',X'600', X'4000',X'5000',X'A40',0,X'1000',X'7400',0(24),X'6000',X'E000',X'5000', X'6000',X'E000',X'A80',X'AC0',X'A00',X'2000',X'B00',X'C0' %OWNINTEGERARRAY MODE(-1:13)=0(2),1,2,3,4,5,6,7,2,0,1,0,2,0 ! ! ! %IF 108<=OP<=110 %OR 120<=OP<=125 %OR OP=-1 %START %IF FIRST=0 %START %CYCLE I=0,1,998 BTCELLS(I)_LINK=I+1 LCELLS(I)_LINK=I+1 BTCELLS(I)_BTADDRHD=-1 %REPEAT BTCELLS(999)_LINK=0 LCELLS(999)_LINK=0 BTCELLS(999)_BTADDRHD=-1 FIRST=1 %FINISH ! ! ! %IF OP=-1 %START; ! LABEL NOW PLANTED BAT(M1)=ADDR(LABEL) I=FIND BT ENTRY(M1) %IF I<0 %THEN ->OUT; ! NO OUTSTANDING REFERENCES TO LABEL POP: POP BT ADDR(BTCELLS(I)_BTADDRHD,J,K) L=(BAT(M1)-J-2)>>(K>>1) %IF K=2 %AND L>128 %THEN BRFAULT=1 %IF ABS=0 %OR K=2 %THEN %C BINS(J>>1)<-BINS(J>>1)! %C L %ELSE BINS(J>>1)<- %C BAT(M1)-LASTCAREL+LASTRELADDR ->POP %UNLESS BTCELLS(I)_BTADDRHD=-1 REMOVE SAT BTS ->OUT %FINISH CODE=INST(OP); ! GET CODE FOR BRANCH %IF NEM1>100 %THEN NEM1=NEM1-100 %IF OP=110 %THEN CODE=CODE!(NEM1<<6); ! RETURN REG. FOR JSR %IF NUM2=-1 %START OCT(CODE!2) ->OUT %FINISH %IF NEM2=129 %AND BAT(NUM2)=-1 %START; ! LABEL NOT SET I=FIND BT ENTRY(NUM2) OCT(CODE) %IF OP=109 %OR OP=110 %THEN J=0 %ELSE J=2 %IF I<0 %START; ! NO ENTRY FOR THIS BRANCH PUSH UNSAT BTS(NUM2,CA-J,J) ->OUTC %FINISH PUSH BT ADDR(BTCELLS(I)_BTADDRHD,CA-J,J) OUTC: %IF J=0 %THEN OCT(0) ->OUT %FINISH ! DEAL HERE WITH LABELS WHICH ARE SET %IF NEM2=136 %OR NEM2=166 %THEN I=NUM2 %ELSE I=BAT(NUM2) %IF OP=109 %START; ! JMP JSR: OCT(CODE) %IF ABS=0 %START JMPDISP=CA-I JMPDISP<--JMPDISP-2 %IF JMPDISP&1=1 %THEN JMPDISP=JMPDISP+1 %FINISHELSE JMPDISP<-I-LASTCAREL+LASTRELADDR %IF NEM2=152 %THEN JMPDISP=X'130' %IF NEM2=166 %THEN JMPDISP=NUM2 OCT(JMPDISP) ->OUT %FINISH %IF OP=110 %START; ! JSR %IF NEM2=152 %OR NEM2=166 %THEN CODE=X'81F' CODE=CODE!(NEM1<<6) ->JSR %FINISH BRDISP=(CA-I)>>1 BRDISP<--BRDISP-1 OCT(CODE!BRDISP) OUT: %RETURN %FINISH ! ! ! %IF OP=-2 %START; ! FILL IN CT0+N OR STB+N L8: %IF CTSTBHD(M1)=-1 %THEN %RETURN; ! NO OUTSTANDING REFERENCES POP BT ADDR(CTSTBHD(M1),I,J) ! I NOW CONTAINS THE ADDRESS OF WORD TO BE PLUGGED ! J CONTAINS THE MODE %IF 6<=J<=7 %THEN BINS(I>>1)<-CA-(I+2)+ %C BINS(I>>1) %ELSE %C BINS(I>>1)<-CA+BINS(I>>1) ->L8 %FINISH ! ! ! %IF OP=0 %START; ! MACHINE CODE J=M1-1 L1: I=OCT TO BIN(J,T) %IF I>=0 %START; ! *NUMBER OCT(I) L2: %IF T(J)=10 %OR T(J)=';' %THEN %RETURN %IF T(J)=',' %START J=J+1 ->L1 %FINISH J=J+1 ->L2 %FINISH; ! *NUMBER ! ! CHECK FOR .WORD ! %IF T(J)='.' %AND T(J+1)='W' %AND T(J+2)='O' %AND T(J+3)='R' %START J=J+5 ->L1 %FINISH ! ! MUST BE NAME OR ADDRESS ! %IF T(J)='.' %AND T(J+1)='=' %START; ! RELOCATION ADDRESS J=J+2 I=OCT TO BIN(J,T) %RETURN %IF I<0 L9: REL(REL PTR)_RADDR=I REL(REL PTR)_LINK=CA REL PTR=REL PTR+1 REL(REL PTR)_LINK=-1 LASTRELADDR=I LASTCAREL=CA %RETURN %FINISH; ! RELOCATION ADDRESS ! ! CT0 ! %IF T(J)='C' %AND T(J+1)='T' %AND T(J+2)='0' %AND T(J+3)='=' %START J=J+4 I=0 K=T(J) %WHILE T(J)#';' %AND T(J)#10 %CYCLE %IF '0'<=T(J)<='7' %START I=OCT TO BIN(J,T) ->L3 %FINISH J=J+1 %REPEAT L3: %IF K='.' %THEN CT0=CA-LASTCAREL+LASTRELADDR+I %ELSE CT0=I I=CT0 ->L9 %IF I>LASTRELADDR %RETURN %FINISH; ! *CT0 ! ! .ABSOLUTE ! %IF T(J)='.' %AND T(J+1)='A' %AND T(J+2)='B' %AND T(J+3)='S' %START ABS=1 INST(109)=X'5F' INST(110)=X'81F' %RETURN %FINISH ! ! .BYTE ! %IF T(J)='.' %AND T(J+1)='B' %START;! ! *.BYTE J=J+4 L4: J=J+1 K=0 I=OCT TO BIN(J,T) ->L5 %UNLESS T(J)=',' J=J+1 K=OCT TO BIN(J,T) L5: OCT(K<<8!I) %IF T(J)=',' %THEN ->L4 %ELSE %RETURN %FINISH; ! *.BYTE ! ! STB: ! %IF T(J)='S' %AND T(J+1)='T' %AND T(J+2)='B' %AND T(J+3)=':' %START STB=CA-LASTCAREL+LASTRELADDR %WHILE T(J)#'+' %THEN J=J+1 J=J+1 I=OCT TO BIN(J,T) I=STB+I ->L9 %RETURN %FINISH; ! *STB:.=. ! ! MAIN ! %IF T(J)='M' %AND T(J+1)='A' %AND T(J+2)='I' %AND T(J+3)='N' %START MAIN=CA %IF T(J+4)='+' %START J=J+5 OCT(OCT TO BIN(J,T)) %FINISHELSE OCT(0) ->L2 %FINISH ! ! ENDCO,ENDCO1 ! %IF T(J)='E' %AND T(J+1)='N' %AND T(J+2)='D' %C %AND T(J+3)='C' %AND T(J+4)='O' %START %IF T(J+5)='1' %THEN ENDCO1=CA %ELSE ENDCO=CA OCT(0) ->L2 %FINISH ! ! SYSSTK: ! %IF T(J)='S' %AND T(J+1)='Y' %AND T(J+2)='S' %AND T(J+3)='S' %START %IF T(J+6)=':' %START I=CA-LASTCAREL+LASTRELADDR BINS(SYSSTK>>1)<-I SYSSTK=I %FINISHELSESTART SYSSTK=CA OCT(0) %FINISH ->L2 %FINISH ! ! .ASCII ! %IF T(J)='.' %AND T(J+1)='A' %AND T(J+2)='S' %AND T(J+3)='C' %START J=J+6 %WHILE T(J)='_' %THEN J=J+1 I=T(J) J=J+1 %WHILE T(J)#I %CYCLE BIN(CA!!1)<-T(J) CA=CA+1 J=J+1 %REPEAT %IF CA&1#0 %START BIN(CA-1)=' ' CA=CA+1 %FINISH ->L2 %FINISH ! ! BLKENT ! %IF T(J)='B' %AND T(J+1)='L' %AND T(J+2)='K' %AND T(J+3)='E' %START J=J+7 BLKENT=OCT TO BIN(J,T) ->L2 %FINISH; ! BLKENT SETS(3) PRINTSTRING(";* FAILED TO ANALYSE STATEMENT ") %RETURN %FINISH; ! MACHINE CODE ! ! ! %IF NEM1>=100 %THEN NEM1=NEM1-100 %IF NEM2>=100 %THEN NEM2=NEM2-100 CODE=INST(OP&255) %IF CODE=0 %THEN %RETURN %IF OP>255 %THEN CODE=CODE!X'8000' ! CODE FOR CT0 & STB ADDRESSES ASUMED SET %IF NEM1=17 %OR NEM1=18 %START; ! FIRST OPERAND IS CT0 OR STB %IF M1=8 %THEN M1=2 %IF M1=9 %THEN M1=3 %IF M1=10 %THEN M1=7 %IF M1=3 %AND ABS=0 %THEN M1=6 %IF NEM1=17 %THEN NUM1=NUM1+20+STB %ELSE NUM1=NUM1+CT0 %IF (NEM1=17 %AND STB=0) %OR (NEM1=18 %AND CT0=0) %START PUSH CT STB=1 ->L6 %FINISH %IF 6<=M1<=7 %THEN NUM1=NUM1-(CA-LASTCAREL+LASTRELADDR+4) L6: NEM1=7 %FINISH %IF NEM2=17 %OR NEM2=18 %START; ! SECOND OPERAND IS CT0 OR STB %IF M2=8 %THEN M2=2 %IF M2=9 %THEN M2=3 %IF M2=10 %THEN M2=7 %IF M2=3 %AND ABS=0 %THEN M2=6 %IF NEM2=17 %THEN NUM2=NUM2+20+STB %ELSE NUM2=NUM2+CT0 %IF (NEM2=17 %AND STB=0) %OR (NEM2=18 %AND CT0=0) %START PUSH CT STB=PUSH CT STB+2 ->L7 %FINISH %IF NUM1#0 %THEN I=6 %ELSE I=4 %IF 6<=M2<=7 %THEN NUM2=NUM2-(CA-LASTCAREL+LASTRELADDR+I) L7: NEM2=7 %FINISH CODE=CODE!(NEM1<<6)!NEM2 I=MODE(M1) %IF I=2 %AND M1#2 %THEN CODE=CODE!X'1C0' %IF I=6 %AND NUM1=0 %THEN I=1 CODE=CODE!(I<<9) I=MODE(M2) %IF I=2 %AND M2#2 %THEN CODE=CODE!7 %IF I=6 %AND NUM2=0 %THEN I=1 CODE=CODE!(I<<3) OCT(CODE) %IF PUSH CT STB&1#0 %START PUSH BT ADDR(CTSTBHD(NEM1),CA,M1) OCT(NUM1) %FINISH %IF PUSH CT STB&2#0 %START PUSH BT ADDR(CTSTBHD(NEM2),CA,M2) OCT(NUM2) %FINISH %IF NUM1#0 %THEN OCT(NUM1) %IF NUM2#0 %THEN OCT(NUM2) %RETURN %INTEGERFN OCT TO BIN(%INTEGERNAME PTR,%INTEGERARRAYNAME T) %INTEGER I I=0 L1: %IF '0'<=T(PTR)<='7' %THEN ->L2 %IF T(PTR)#'_' %THEN %RESULT=-1 PTR=PTR+1 ->L1 L2: %IF '0'<=T(PTR)<='7' %THEN I=I<<3!(T(PTR)-'0') %ELSE %RESULT=I PTR=PTR+1 ->L2 %END %ROUTINE OCT(%INTEGER I) BINS(CA>>1)<-I CA=CA+2 %END %ROUTINE PUSH UNSAT BTS(%INTEGER BTNO,CADDR,TYPE) %INTEGER I,K I=BTASL BTASL=BTCELLS(BTASL)_LINK BTCELLS(I)_BTNO=BTNO PUSH BT ADDR(BTCELLS(I)_BTADDRHD,CADDR,TYPE) K=BTC BTC=I BTCELLS(I)_LINK=K %END %ROUTINE PUSH BT ADDR(%INTEGERNAME BTADDRHD,%INTEGER CADDR,TYPE) %INTEGER I I=LASL LASL=LCELLS(LASL)_LINK LCELLS(I)_CADDR=CADDR LCELLS(I)_TYPE=TYPE LCELLS(I)_LINK=BTADDRHD BTADDRHD=I %END %ROUTINE POP BT ADDR(%INTEGERNAME BTADDRHD,CADDR,TYPE) %INTEGER I CADDR=LCELLS(BTADDRHD)_CADDR TYPE=LCELLS(BTADDRHD)_TYPE I=LCELLS(BTADDRHD)_LINK LCELLS(BTADDRHD)_LINK=LASL LASL=BTADDRHD BTADDRHD=I %END %ROUTINE REMOVE SAT BTS %INTEGER I,J I=BTASL J=BTCELLS(ENTRY)_LINK BTCELLS(ENTRY)_LINK=BTASL BTASL=ENTRY %IF LAST ENTRY=-1 %THEN BTC=J %ELSE BTCELLS(LAST ENTRY)_LINK=J %END %INTEGERFN FIND BT ENTRY(%INTEGER BTNO) %INTEGER I LAST ENTRY=-1 ENTRY=BTC TRY AGAIN: %IF ENTRY=-1 %THEN %RESULT=-1; ! NOT FOUND %IF BTCELLS(ENTRY)_BTNO=BTNO %THEN %RESULT=ENTRY; ! FOUND LAST ENTRY=ENTRY ENTRY=BTCELLS(ENTRY)_LINK ->TRY AGAIN %END %END !%EXTRINSICBYTEINTEGERARRAY BIN(-2:30000) %OWNSTRING(7) RV="7.10" ! ! RENUMBERING THE ALTS OF REQUIRED ALTERATIONS TO ! SS SW(1) AND SW(2) TESTING ALT OF UI ! RT (SCALAR NAME PARAM) ! RT (ARRAYNAME PARAM) ! SCCOND ("THEN UI IS JUMP") ! ! REGISTERS 1024 ! ! NOTE DOPE VECTORS HAVE (TYPE<<4) ! ND ! %ROUTINE SKIMP11(%INTEGER TARGET) !%CONTROL148; ! 128 + 16 + 4 !%BEGIN %STRING (10) ST %HALFINTEGERARRAYNAME BINS %HALFINTEGERARRAYFORMAT BINFORM(0:15001) BINS==ARRAY(ADDR(BIN(-2)),BINFORM) %OWNINTEGER UNDER=20; ! NO OF BYTES UNDER FIRST DISPLAY %OWNINTEGER PDISP=14;!RT PARAMS START PDISP BYTES FROM STP. %OWNINTEGER TEMPS=20;!NO. OF BYTES FOR TEMP STORAGE IN DISPLAY %OWNINTEGER PREVL=12;!DISPL(BYTES) IN DISPLAY OF PREV LEVEL PTR. %OWNINTEGER ARADS %OWNINTEGER CYCS %OWNINTEGER OPNS %OWNINTEGER CALLS %OWNINTEGER ENTS %OWNINTEGER CSIZE %OWNINTEGER SCS=0 %OWNINTEGER PJS=0 %OWNINTEGER STMTS=0 !%ROUTINESPEC SETS(%INTEGER N) %ROUTINESPEC READ SYM(%INTEGERNAME I) %ROUTINESPEC READ STATEMENT %INTEGERFNSPEC COMPARE %ROUTINESPEC PRINT AR(%INTEGER N) %ROUTINESPEC SS %ROUTINESPEC FAULT(%INTEGER I) %INTEGERFNSPEC NEWCELL %INTEGERFNSPEC RETURN CELL(%INTEGER I) %INTEGERFNSPEC TAG OF(%INTEGER NAME) %INTEGERFNSPEC TAG OFF(%INTEGER NAME) %ROUTINESPEC POP(%INTEGERNAME CELL,INF,INF1) %ROUTINESPEC PUSH(%INTEGERNAME CELL, %INTEGER INF,INF1) %INTEGERFNSPEC BT NEXT %INTEGERFNSPEC CT NEXT %ROUTINESPEC SHOW TAGS %INTEGERFNSPEC PRINT4(%INTEGER I) %ROUTINESPEC PRINTNAME(%INTEGER I) %RECORDFORMAT RELADDRS(%INTEGER RADDR,LINK) !%EXTRINSICRECORDARRAY REL(1:10)(RELADDRS) %OWNINTEGER LASTRELADDR %OWNINTEGER LASTCAREL !%EXTRINSICINTEGER CT0 !%EXTERNALINTEGER BRFAULT=0 !%EXTERNALINTEGER BLKENT=0 !%EXTERNALINTEGER CA !%EXTRINSICINTEGER MAIN,SYSSTK,ENDCO,ENDCO1 %OWNINTEGER ASSTK=0 %INTEGER AP,TP,PSP,BTN,CTN,FAULTS,RAD,LEVEL,COMP,SCF %INTEGER POLISH; POLISH=0 %INTEGER FLACC; FLACC=0 %INTEGER REALS; REALS=0 %OWNINTEGER STRFLAG=0; ! MAY BE SET IN RT STRING. %OWNINTEGER EXPFFLAG=0; ! MAY BE SET IN RT AD. %OWNINTEGER READFLAG=0; ! MAY BE SET IN RT RT. %INTEGER LINE,TWSP,TWSPLIM %OWNINTEGERARRAY IND(0:7)=100,101,102,103,104,105,106,107 %OWNINTEGERARRAY IUSE(0:5)=0(6); ! TO KEEP TRACK OF USES(I0=ACC) %OWNINTEGERARRAY POINT(0:5)=0(6) %OWNINTEGERARRAY POINT1(0:5)=-1(6) %OWNINTEGER PTEXTSHL=0 %OWNINTEGER CCSET=-1 %OWNINTEGER ALGO=0 %OWNINTEGER SP=106 %OWNINTEGER PC=107 %OWNINTEGER INC=161 %OWNINTEGER DEC=162 %OWNINTEGER CLR=163 %OWNINTEGER CLRB=419; ! CLR+256 %OWNINTEGER BR=108 %OWNINTEGER JMP=109 %OWNINTEGER JSR=110 %OWNINTEGER TST=111 %OWNINTEGER MOV=112 %OWNINTEGER MOVB=368; ! MOV+256 %OWNINTEGER RTS=113 %OWNINTEGER CLC=114 %OWNINTEGER BIC=126 %OWNINTEGER ROR=115 %OWNINTEGER NEG=165 %OWNINTEGER NOT=128 %OWNINTEGER TRAP=119 %OWNINTEGER CMP=164 %OWNINTEGER MASL=116 %OWNINTEGER ACC=100 %OWNINTEGER R0=100 %OWNINTEGER R1=101 %OWNINTEGER R2=102 %OWNINTEGER R3=103 %OWNINTEGER R4=104 %OWNINTEGER R5=105 %OWNINTEGER STB=117 ; ! ADDRESS OF STACK BASE=GLOBALS %OWNINTEGER CT=118; ! ADDRESS OF CONSTANT TABLE BASE %OWNINTEGER BT=129 %OWNINTEGER LLAB=136 %OWNINTEGER LOAD=112; ! MNEMONIC FOR LOAD OPERATION %OWNINTEGER SUB=160 %OWNINTEGER ADD=159 %OWNINTEGER STR=130 %OWNINTEGER ASH=131 %OWNINTEGER SWAB=166 %OWNHALFINTEGERARRAY BINREALS(0:14)=308,312,316,320,352,0(4), 356,324,328,332,336,340 %INTEGER SWTCA,CTCA ! ALSO ARRAYS TAG,LINK AND NAME AND OWNINTEGER LAST PERM SPEC ! ARRAY PS(-1000:-...) FOLLOWS %ENDOFLIST %OWNINTEGERARRAY PS(-1000:-196)= -995, -728, 5, -631, 3, -988, -625, -529, -519, 5, -674, 3, -984, -470, 58,-1000, -976, -465, -409, -309, 1, -357, -351, 3, -974, -372, -967, -281, -334, -316, 1, -302, 3, -956, -270, -529, -519, 212, 200, 197, 206, 5, -728, 3, -946, -270, -529, -519, 195, 217, 195, 204, 197, 3, -939, -728, -270, 5, -529, -519, 3, -925, 195, 217, 195, 204, 197, 1, 61, -581, 44, -581, 44, -581, 3, -917, 210, 197, 208, 197, 193, 212, 3, -911, 207, 215, 206, -465, -401, -901, 195, 207, 206, 212, 210, 207, 204, 2, 3, -889, 211, 215, 201, 212, 195, 200, 1, -357, 5, -387, 3, -881, 1, 40, -607, 2, 41, 58,-1000, -872, 198, 201, 206, 201, 211, 200, -649, 3, -859, 211, 200, 207, 210, 212, 210, 207, 213, 212, 201, 206, 197, -848, 202, 213, 205, 208, 211, 211, 200, 207, 210, 212, -836, 202, 213, 205, 208, 211, 206, 207, 210, 205, 193, 204, -827, 204, 207, 206, 199, 202, 213, 205, 208, -822, 197, 206, 196, 3, -815, 194, 197, 199, 201, 206, 3, -802, 197, 206, 196, 207, 198, 208, 210, 207, 199, 210, 193, 205, -792, 197, 206, 196, 207, 198, 198, 201, 204, 197, -782, 198, 193, 213, 204, 212, 2, 45, 62, -470, -763, 210, 197, 195, 207, 210, 196, 198, 207, 210, 205, 193, 212, 1, 40, -257, -219, 41, 3, -746, 210, 197, 195, 207, 210, 196, 206, 193, 205, 197, 1, -357, 40, 1, 41, 3, -740, 204, 201, 211, 212, 3, -729, 197, 206, 196, 207, 198, 204, 201, 211, 212, 3, 0, -722, 1, 95, 1, -614, -534, -718, 1, -614, -534, -711, 45, 62, 1, 40, -581, 41, -707, 45, 62, -470, -700, 210, 197, 212, 213, 210, 206, -691, 210, 197, 211, 213, 204, 212, 61, -581, -686, 211, 212, 207, 208, -675, 208, 210, 201, 206, 212, 212, 197, 216, 212, 4, 0, -664, 212, 200, 197, 206, 211, 212, 193, 210, 212, -658, 211, 212, 193, 210, 212, -650, 212, 200, 197, 206, -728, 7, -649, 0, -639, 197, 204, 211, 197, 211, 212, 193, 210, 212, -633, 197, 204, 211, 197, -728, -632, 0, -627, -625, -529, -519, -626, 0, -622, 201, 198, -615, 213, 206, 204, 197, 211, 211, 0, -609, 40, -581, -540, 41, -608, 0, -605, 43, -603, 45, -601, 92, -600, 0, -595, 1, 95, 1, -592, 1, -614, -590, 2, -586, 40, -581, 41, -582, 40, 2, 41, 0, -577, -607, -599, -576, 0, -572, -570, -599, -576, -571, 0, -567, 60, 60, -564, 62, 62, -561, 47, 47, -559, 38, -556, 33, 33, -554, 33, -551, 42, 42, -549, 47, -547, 42, -545, 43, -543, 45, -541, 46, 0, -536, 44, -581, -540, -535, 0, -531, -213, -581, -530, 0, -525, -581, -491, -581, -520, 40, -529, -519, 41, 0, -513, 193, 206, 196, -529, -506, -508, 207, 210, -529, -498, -507, 0, -500, 193, 206, 196, -529, -506, -499, 0, -493, 207, 210, -529, -498, -492, 0, -489, 61, -486, 92, 61, -483, 60, 61, -481, 60, -478, 62, 61, -476, 62, -474, 35, -471, 45, 62, 0, -468, 1, -466, 2, 0, -453, 194, 217, 212, 197, 201, 206, 212, 197, 199, 197, 210, -445, 201, 206, 212, 197, 199, 197, 210, -440, 210, 197, 193, 204, -427, 211, 200, 207, 210, 212, 201, 206, 212, 197, 199, 197, 210, -418, 204, 207, 206, 199, 210, 197, 193, 204, -410, 211, 212, 210, 201, 206, 199, -201, 0, -403, 193, 210, 210, 193, 217, -402, 0, -397, 1, -378, 3, -388, 193, 210, 210, 193, 217, 1, -387, 6, 0, -379, 40, -607, 2, 58, -607, 2, 41, 0, -374, 61, -607, 2, -373, 0, -370, 33, -362, 195, 207, 205, 205, 197, 206, 212, -360, 3, -358, 42, 0, -353, 44, 1, -357, -352, 0, -344, 40, -581, 58, -581, -342, 41, -343, 0, -336, 44, -581, 58, -581, -342, -335, 0, -326, 210, 207, 213, 212, 201, 206, 197, -322, -465, 198, 206, -317, -465, 205, 193, 208, 0, -311, 211, 208, 197, 195, -310, 0, -304, 206, 193, 205, 197, -303, 0, -293, 40, -465, -409, -309, 1, -357, -291, 41, -292, 0, -283, 44, -465, -409, -309, 1, -357, -291, -282, 0, -272, 197, 216, 212, 197, 210, 206, 193, 204, -271, 0, -264, 213, 206, 212, 201, 204, -258, 215, 200, 201, 204, 197, 0, -247, 201, 206, 212, 197, 199, 197, 210, 1, -357, -234, 210, 197, 195, 207, 210, 196, 206, 193, 205, 197, 1, -357, -220, 194, 217, 212, 197, 201, 206, 212, 197, 199, 197, 210, 1, -357, 0, -215, 44, -257, -219, -214, 0, -210, 61, 61, -208, 61, -205, 60, 45, -202, 45, 62, 0, -197, 40, 2, 41, -196, 0 %OWNINTEGERARRAY TAG(0: 4000)= %C 0( 108), 627, 0( 18), 578, 0( 15), 617, 0( 6), 588, 0( 20), 556, 0( 2), 570, 0( 10), 598, 0( 12), 608, 0( 2), 523, 0( 3), 538, 0, 531, 0, 635, 0( 6), 582, 0( 6), 610, 564, 0( 2), 558, 0( 2), 646, 0( 157), 640, 0( 20), 594, 0( 9), 656, 540, 0( 4), 549, 0( 2), 515, 0( 9), 547, 633, 0( 6), 512, 574, 0( 6), 528, 603, 0( 14), 650, 0( 41), 21061, 21337, 20300, 20037, 16400, 446, 0, 21337, 20300, 16896, 428, 21323, 21337, 20300, 16384, 201, 20562, 21587, 16975, 21328, 16400, 454, 0, 17664, 16384, 207, 21328, 17747, 20037, 16400, 205, 0, 18766, 16384, 420, 20037, 18766, 20037, 16400, 438, 0, 16711, 16384, 425, 18766, 21504, 22354, 16912, 171, 0, 17664, 17236, 21317, 16416, 227, 0( 2), 20565, 19791, 16400, 224, 0, 21061, 17168, 174, 0, 16708, 16400, 447, 0, 21317, 16912, 127, 0, 17236, 21584, 17228, 16400, 216, 0, 17747, 17729, 19521, 16400, 150, 0, 20304, 16400, 409, 0, 21329, 21061, 16400, 185, 0, 21329, 18766, 17747, 22354, 16432, 455, 0( 3), 17747, 17228, 16432, 223, 0( 3), 16400, 143, 0, 18245, 16707, 33296, 198, 0, 16896, 108, 21061, 21060, 21332, 33296, 439, 0, 20039, 16985, 34320, 209, 0, 18766, 18245, 21335, 33040, 388, 0, 20562, 16912, 230, 0, 21587, 18766, 19525, 16400, 470, 0, 255, 21576, 21248, 16912, 419, 0( 3336) %OWNINTEGERARRAY TAG1(0: 4000)= %C 0( 512), 16708, 19778, 0, 22612, 0( 2), 18, 19778, 0, 1, 0, 18768, 19778, 0, 2, 0, 18766, 22861, 19456, 16707, 3, 0, 2, 0, 4, 0, 16707, 0, 22348, 5, 0, 2, 17664, 6, 0, 22348, 17747, 22352, 7, 0, 2, 17664, 8, 0, 21584, 0, 18772, 9, 0, 3, 0, 18766, 19525, 10, 0, 2( 2), 21504, 17408, 11, 0, 2, 16708, 12, 0, 3, 17490, 13, 0, 18, 19525, 14, 0, 18, 20309, 21844, 20307, 15, 0, 2, 21586, 19712, 17219, 16, 0, 2, 17742, 17, 0, 2, 0, 16708, 18, 0, 2, 0, 21573, 20736, 18772, 19, 0, 2, 18( 2), 20736, 20307, 20, 0, 2, 18( 2), 21, 0, 2, 20992, 17152, 22, 0, 2, 23, 0, 17231, 0, 21065, 24, 0, 2, 0, 21573, 25, 0, 2, 21573, 20992, 16706, 26, 0, 2, 18766, 27, 0, 2, 21586, 18176, 20039, 28, 0, 6, 0( 3), 29, 0, 22, 0( 3335) %OWNINTEGERARRAY LINK(0: 4000)= %C 0( 108), 631, 0( 18), 583, 0( 15), 623, 0( 6), 595, 0( 20), 559, 0( 2), 575, 0( 10), 604, 0( 12), 628, 0( 2), 526, 0( 3), 541, 0, 536, 0, 641, 0( 6), 589, 0( 6), 618, 571, 0( 2), 565, 0( 2), 651, 0( 157), 647, 0( 20), 599, 0( 9), 663, 545, 0( 4), 554, 0( 2), 521, 0( 9), 550, 636, 0( 6), 516, 579, 0( 6), 532, 611, 0( 14), 657, 0( 41), 513, 514, 0, 519, 518, 0( 2), 520, 0( 2), 517, 524, 525, 0( 2), 522, 529, 530, 0, 535, 534, 527, 0( 3), 533, 539, 0, 544, 543, 537, 0( 3), 542, 548, 0, 553, 552, 546, 0( 3), 551, 557, 0, 562, 561, 555, 0( 2), 569, 563, 567, 560, 568, 0( 3), 573, 566, 0( 2), 577, 572, 0( 2), 581, 576, 0, 586, 585, 580, 0, 587, 0, 592, 591, 584, 0, 593, 0( 2), 597, 590, 0, 602, 601, 596, 0( 2), 607, 606, 600, 0( 2), 626, 0, 609, 613, 605, 614, 615, 0( 2), 616, 620, 612, 621, 622, 0, 625, 619, 0( 3), 630, 624, 0( 2), 629, 634, 0, 639, 638, 632, 0( 2), 644, 643, 637, 0, 645, 0( 2), 649, 642, 0, 654, 653, 648, 0, 655, 0, 661, 659, 652, 660, 0( 2), 667, 665, 658, 666, 0, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, 2551, 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2585, 2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, 2715, 2716, 2717, 2718, 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, 3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094, 3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142, 3143, 3144, 3145, 3146, 3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182, 3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202, 3203, 3204, 3205, 3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213, 3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, 3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253, 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277, 3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349, 3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3421, 3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429, 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437, 3438, 3439, 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3449, 3450, 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573, 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581, 3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589, 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, 3699, 3700, 3701, 3702, 3703, 3704, 3705, 3706, 3707, 3708, 3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716, 3717, 3718, 3719, 3720, 3721, 3722, 3723, 3724, 3725, 3726, 3727, 3728, 3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739, 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747, 3748, 3749, 3750, 3751, 3752, 3753, 3754, 3755, 3756, 3757, 3758, 3759, 3760, 3761, 3762, 3763, 3764, 3765, 3766, 3767, 3768, 3769, 3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777, 3778, 3779, 3780, 3781, 3782, 3783, 3784, 3785, 3786, 3787, 3788, 3789, 3790, 3791, 3792, 3793, 3794, 3795, 3796, 3797, 3798, 3799, 3800, 3801, 3802, 3803, 3804, 3805, 3806, 3807, 3808, 3809, 3810, 3811, 3812, 3813, 3814, 3815, 3816, 3817, 3818, 3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, 3827, 3828, 3829, 3830, 3831, 3832, 3833, 3834, 3835, 3836, 3837, 3838, 3839, 3840, 3841, 3842, 3843, 3844, 3845, 3846, 3847, 3848, 3849, 3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, 3859, 3860, 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, 3869, 3870, 3871, 3872, 3873, 3874, 3875, 3876, 3877, 3878, 3879, 3880, 3881, 3882, 3883, 3884, 3885, 3886, 3887, 3888, 3889, 3890, 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898, 3899, 3900, 3901, 3902, 3903, 3904, 3905, 3906, 3907, 3908, 3909, 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933, 3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949, 3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, 3963, 3964, 3965, 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978, 3979, 3980, 3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, 3990, 3991, 3992, 3993, 3994, 3995, 3996, 3997, 3998, 3999, 4000, 0 %LIST %OWNINTEGERARRAY NAME(0:4)= %C 664, 0( 4) %OWNINTEGER ASL= 662 %OWNINTEGER NNAMES= 511 %OWNINTEGER MINFREE= 3817 %OWNINTEGER FREE= 3817 %INTEGERARRAY A(1:300); ! ANALYSIS RECORD !%EXTERNALINTEGERARRAY T(1:300); ! SOURCE TEXT %INTEGER LTSIZE,HV,SWTSIZE LTSIZE=6000; HV=NNAMES-8 SWTSIZE=300 !%EXTERNALINTEGERARRAY BAT(0:6000) %INTEGERARRAY COT(-1:LTSIZE) %HALFINTEGERARRAYNAME SCONST %HALFINTEGERARRAYFORMAT SFORM(0:LTSIZE+1) SCONST==ARRAY(ADDR(COT(-1)),SFORM) %INTEGERARRAY SWT(-SWTSIZE:-1) %INTEGER SWTN %INTEGERARRAY JUMP,STAR,BRT,CYC,RTP,SBR,SAVETWSP,RECELTS(0:5) %OWNINTEGERARRAY TRUE(1:8)=121,120,124,123,122,125,120,121 %OWNINTEGERARRAY FALSE(1:8)=120,121,125,122,123,124,121,120 %OWNINTEGERARRAY PREC(1:40)=3,3,2,2,1,1,3,2,2,1, 1,1,4,0(6),0, 0(10), 0(3),0(2),0(5) ! AN ELT. 34 BELOW CANNOT BE USED - TAKEN FOR NULL UNARY OP. ! %OWNINTEGERARRAY OPR(0:37)= ! 0/ 112,6,7,5,3, ! 5/ 8,127,2,14,4, ! 10/ 159,160,165,128,9, ! 15/ 13,10,11,12,164, ! 20/ 156,157,158,0,0, ! 25/ 0,0,0,0,0, ! 30/ 130,161,162,163,0, ! 35/ 111,0,112 %OWNINTEGERARRAY OPR(0:37)= %C 112,6,7,5,3, 8,127,2,14,4, 159,160,165,128,9, 13,10,11,12,164, 156,157,158,0,0, 0,0,0,0,0, 130,161,162,163,0, 111,0,112 ! ABOVE 2:EXPI 3:AND 4:MULT 5:DIV 6:SHL 7:SHR 8:LXOR ! 9: EXPF 10:ADDF 11:SUBF 12:NEGF 13:MULF ! 14:DIVF 15:SPARE ! ! 112=LOAD 127=LOR=BIS 159=ADD 160=SUB 165=NEG 128=NOT=COM ! 164=CMP 130=STR 161=INC 162=DEC 163=CLR ! ! %OWNINTEGERARRAY UCN(1:37)= ! 1 /3,3,3,2,2,2,3,3,2,2, ! 11/ 3,1,1,3,2,2,3,1,3,3, ! 21/ 3,3,0,0,0, ! 26/ 0,0,0,0,3, ! 31/ 1,1,1,0,1,0,2 %OWNINTEGERARRAY UCN(1:37)= %C 3,3,3,2,2,2,3,3,2,2, 3,1,1,3,2,2,3,1,3,3, 3,3,0,0,0, 0,0,0,0,3, 1,1,1,0,1,0,2 %INTEGER DIAGS,RDIAG,NORELT1,NORELT2 %INTEGER I,CONSTPTR,MARK,MARK2,CHECKS %OWNINTEGER SPECS=0 %INTEGER PLAB %HALFINTEGER FLIT,FLOT CONSTPTR=0; CHECKS=5 PLAB=0 DIAGS=0 RDIAG=0 ! SETS(0); !SET UP SPECS IP STREAM SETS(1); SPECS=1 SETS(3); !SET UP LISTING OUTPUT STREAM PRINTSTRING( ";ERCC IMP-11 COMPILER ".RV." ") SETS(2); !SET UP OBJ STREAM PRINTSTRING %C (" ACC=%0 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ") %UNLESS TARGET&8192#0 CA=0; !CURRENT CODE-DUMPING ADDRESS BTN=0; ! BRANCH TABLE POINTER SWTN=0; !SWITCH TABLE POINTER LINE=0 ! CONSTANT TABLE POINTER, HOLE 0 IS FOR LINE NO. ! HOLES 1 AND 2 ARE FOR FLOATING ZERO. COT(0)=-1; COT(1)=0; COT(2)=0 CTN=3; ! NEXT FREE HOLE FAULTS=0; ! FAULT COUNT TWSP=PDISP; ! (>5 FOR FLG PT CODING..) (BYTES) RAD=0; ! NEXT RELATIVE ADDRESS TO BE AL LEVEL=0; ! TEXTUAL LEVEL SCF=0; ! CONDITION FLAG JUMP(0)=0; ! JUMP LIST POINTER STAR(0)=0; ! STORAGE ALLOCATION POSITION IN NAME(0)=0; ! NAME LIST POINTER RTP(0)=-1; ! TYPE = %BEGIN-%END BLOCK RECELTS(0)=0 L2: READ STATEMENT TP=1; ! SOURCE TEXT POINTER L14: PSP=-1000; ! START OF IN PHRASE TABLE AP=1; ! ANALYSIS RECORD POINTER %IF COMPARE=1 %THEN ->L1; ! STATEMENT RECOGNISED FAULT(100); ! SYNTAX ERROR PRINT SYMBOL(';') L5: PRINT SYMBOL(T(TP)); !CHAR OF OFFENDING LINE %IF T(TP)=10 %THEN ->L2; ! NELINE TP=TP+1 %IF T(TP)#';' %THEN ->L5; ! CONTINUE PRINTING TP=TP+1 ->L14 L1: PRINT AR(AP); ! PRINT ANALYSIS RECORD AP=1; ! ANALYSIS RECORD POINTER STMTS=STMTS+1 COMP=0 NORELT1=0 NORELT2=0 SS; ! COMPILE SOURCE STATEMENT %IF T(TP)=10 %OR T(TP+1)=10 %THEN ->L2 TP=TP+1 ! SKIP TERMINATING SEMICOLON, PROCEED TO NEXT STMT. ->L14 %ROUTINE READ SYM(%INTEGERNAME I) READ SYMBOL(I) PRINT SYMBOL(I) %UNLESS SPECS=0 %END; ! READ SYM ! ! !%CONTROL0 %ROUTINE FLT11(%INTEGER I) ! PARAM IS A SYSTEM 4 INTEGER (32-BIT) ! RESULT IS A PDP-11 REAL (32-BIT) AS 32-BIT (SYSTEM 4) INTEGER. ! ! THIS FUNCTION OBVIOUSLY IS TO RUN ONLY ON SYSTEM 4. ! %HALFINTEGER SIGN,EXP,FRAC1,FRAC2 %IF I=0 %THENSTART FLIT=0;FLOT=0;%RETURN;%FINISH FRAC1=0; FRAC2=0; EXP=129; SIGN=0 %IF I<0 %THENSTART; I=-I; SIGN<-X'8000'; %FINISH LOOP: %IF I&(-2)=0 %THEN -> L5 FRAC2<-((FRAC2&X'FFFF')>>1)!((FRAC1&1)<<15) FRAC1<-FRAC1>>1 EXP=EXP+1 %IF I&1#0 %THEN FRAC1<-FRAC1 ! X'0040' I=I>>1 -> LOOP L5: -> SIZE FAIL %UNLESS EXP<=511 FLIT<-SIGN!(EXP<<7)!FRAC1 FLOT<-FRAC2 %RETURN SIZE FAIL: SETS(2) PRINTSTRING("SIZE FAIL, FN FLT11 ") %STOP %END; ! FLT11 !%CONTROL X'F1111111' ! ! %ROUTINE WRIT(%INTEGER J); ! NO LEADING SPACES %INTEGER I,K,L,M M=0 %IF J>=0 %THEN ->L1 PRINTSYMBOL('-') J=-J L1: I=1000000000 K=1 L2: L=J//I M=M+L; !M NON ZERO IF ZEROS SIGNIFICANT %IF M#0 %OR K=10 %THEN PRINT SYMBOL(L+'0') ! PRINT ALL SIGNIFICANT J=J-I*L I=I//10 K=K+1 %IF K<=10 %THEN ->L2 %END; ! WRIT %ROUTINE HEX4(%INTEGER I) %INTEGER J,CH %CYCLE J=12,-4,0 CH=(I>>J)&15 + '0' CH=CH+7 %IF CH>'9' PRINTSYMBOL(CH) %REPEAT %END; ! HEX4 %ROUTINE OCT5(%INTEGER I) %INTEGER L L=12 L1: PRINTSYMBOL((I>>L)&7+'0') L=L-3 ->L1 %UNLESS L<0 %END; ! OCT5 %ROUTINE OCTS(%INTEGER I) !OUTPUTS 16 BITS IN 6 OCTAL DIGITS. %IF I&X'8000'#0 %THENSTART;I=I&X'7FFF'; PRINTSYMBOL('1'); %FINISHELSE PRINTSYMBOL('0') OCT5(I) %END; !OCTS %ROUTINE OCT(%INTEGER I) HALFINTEGER(ADDR(BIN(CA)))<-I;CA=CA+2;%RETURN %END; !OCT %ROUTINE OCTN(%INTEGER I,J) %IF TARGET&8192=0 %START SPACE; OCTS(I); CA=CA+2; NEWLINE %IF J=0 %FINISHELSE OCT(I) %END; !OCTN %ROUTINE OCODE(%INTEGER LEV,OFF); ! OFFSET IS SUPPLIED IN BYTES OCTN((LEV<<13)!OFF>>1,0); ! DUMPED AS WORD DISPL %END; ! OCODE %ROUTINE READ STATEMENT %ROUTINESPEC STORE(%INTEGER I) %INTEGER SH,I SETS(3); !SET UP LISTING OUTPUT STREAM SH=0; ! SHIFT VALUE TP=1; ! SOURCE TEXT POINTER LINE=LINE+1 %IF SPECS#0 %THENSTART PRINTSYMBOL(';') OCTS(CA-LASTCAREL+LASTRELADDR) WRITE(LINE,5) SPACES(5+3*LEVEL); ! INDENT LISTINGS %FINISH L1: I=NEXT SYMBOL; ! SKIP BLANK LINES %IF I#10 %THEN ->L3 SKIP SYMBOL ->L1 L3: READ SYM(I) %IF I='''' %THEN ->L4; ! LITERAL TEXT START L8: %IF I#'%' %THEN ->L5 SH=128; ! SHIFT VALUE FOR KEYWORD ->L3 L5: %IF I<'A' %OR I>'Z' %THEN SH=0; ! END OF KEYWORD %IF I=' ' %THEN ->L3; ! IGNORE SPACES T(TP)=I+SH; TP=TP+1 %IF I#10 %THEN ->L3; ! NOT END OF LINE YET %IF TP>=300 %THEN ->L10 %IF T(TP-2)#'C'+128 %THENRETURN !HERE %C NL HAS JUST BEEN READ ->L9 %IF SPECS=0 PRINT SYMBOL(';') SPACES(17+3*LEVEL) L9: TP=TP-2 ->L1 L10: STORE(I); %STOP L4: SH=0 STORE('''') L7: READ SYM(I) %IF I=10 %THEN PRINT SYMBOL(';') !TO BE COMMENT IN O/P STORE(I) %IF I#'''' %THEN ->L7; ! MORE LITERAL TEXT YET READ SYM(I) %IF I#'''' %THEN ->L8; ! END OF TEXT ->L4; ! TWO QUOTES STAND FOR ONE %ROUTINE STORE(%INTEGER I) %IF TP<=300 %THEN ->L1 FAULT(101); ! STATEMENT TOO LONG TP=1; ! IGNORE FIRST 300 CHARS L1: T(TP)=I+SH; ! STORE SHIFTED CHAR TP=TP+1 %END; ! STORE %END %INTEGERFN COMPARE ! ANALYSE PHRASE %INTEGERFNSPEC NAME %INTEGERFNSPEC CONSTLIST %INTEGERFNSPEC CONST %INTEGERFNSPEC PTEXT %INTEGER APP,TPP,PSPP,AE,N %SWITCH BIP(1:7) TPP=TP; ! PRESERVE INITIAL TEXT POINTER ! FOR BACKTRACKING APP=AP; ! PRESERVE INITIAL ANALYSIS RECO ! POINTER FOR BACKTRACKING A(AP)=1; ! ALTERNATIVE 1 FIRST L11: AE=PS(PSP); ! POINTER TO END OF ALTERNATIVE PSP=PSP+1; ! FIRST ITEM OF ALTERNATIVE DEFN L12: %IF PSP=AE %THENRESULT =1; ! END OF ALT REACHED - SUCCESS N=PS(PSP); ! NEXT ITEM OF ALT DEFN PSP=PSP+1; ! FOR FOLLOWING ITEM %IF N<0 %THEN ->L13; ! SUB-PHRASE TO BE COMPARED %IF N<=7 %THEN ->BIP(N) %IF N#T(TP) %THEN ->L14; ! TEXT CHAR DOES NOT MATCH SOURC TP=TP+1; ! NEXT SOURCE TEXT POSITION ->L12; ! GO FOR NEXT ITEM OF DEFN L13: PSPP=PSP; ! PRESERVE PRESENT 'PS' POSITION PSP=N; ! 'PS' POSITION OF SUB-PHRASE AP=AP+1; ! ANALYSIS REC POSITION FOR SUB- N=COMPARE; ! ANALYSE SUB-PHRASE PSP=PSPP; ! RESTORE 'PS' POSITION FOR OLD %IF N=1 %THEN ->L12; ! SUCCESS - GO FOR NEXT ITEM OF L14: TP=TPP; ! BACKTRACK SOURCE TEXT AP=APP; ! AND ANALYSIS RECORD POINTERS %IF PS(AE)=0 %THENRESULT =0; ! END OF PHRASE PSP=AE; ! START OF DEFN OF NEXT ALTERNAT A(AP)=A(AP)+1; ! COUNT ALTERNATIVE NUMBER ON ON ->L11; ! GO TO ANALYSE NEW ALTERNATIVE BIP(1):%IF NAME=1 %THEN ->L12; ! NAME FOUND ->L14; ! NAME NOT FOUND - TRY NEXT ALT BIP(2):%IF CONST=1 %THEN ->L12; ! CONST FOUND ->L14; ! CONST NOT FOUND - TRY NEXT ALT BIP(3):%IF T(TP)=10 %THEN ->L12; ! NEWLINE FOUND %IF T(TP)=M';' %THEN ->L12; ! SEMI COLON ->L14 BIP(4):%IF PTEXT=1 %THEN ->L12; ! TEXT FOUND ->L14 BIP(5):MARK=AP+1; ->L12; ! THIS PHRASE ALWAYS SUCCEEDS BIP(6):%IF CONSTLIST=1 %THEN ->L12; ->L14; ! (NULL CONSTLIST) NOT ! ALLOWED BIP(7):MARK2=AP+1; ->L12 %INTEGERFN NAME ! RECOGNISE AND INSERT NAME IN HASHING AREA OF TAG/LINK ARRAYS %INTEGER I,J,K,L,M,N %INTEGER OE; OE=0; !ODD/EVEN %INTEGER INC INC=0 I=T(TP); ! FIRST CHAR %IF I<'A' %OR I>'Z' %OR T(TP+1)='''' %THENRESULT =0 ! (NOT LETTER) OR M'...' CONSTAN L=0; ! POINTER TO LIST OF NAME CHARS J=I<<8; ! PACK FIRST CHAR K=0; ! SHIFT FOR PACKING NEXT CHAR L1: TP=TP+1 I=T(TP); ! NEXT CHAR %IF I<'0' %OR (I>'9' %AND I<'A') %OR I>'Z' %THEN ->L2; ! NOT ! LETTER INC=I J=J!I<=0 %THEN ->L1; ! WORD NOT FULL YET %IF OE=0 %THEN N=NEWCELL %IF OE=0 %THEN TAG(N)=J %ELSE TAG1(N)=J; ! STORE WORD IN NEW CELL OE=1-OE J=0; ! CLEAR WORD FOR PACKING K=8; ! FIRST SHIFT FOR NEW WORD -> L1 %IF OE=0 ! LINK IN NEW CELL IF ONE JUST TAKEN %IF L=0 %THEN ->L3; ! NOTHING IN LIST YET LINK(M)=N; ! LINK IN PREVIOUS LAST TO PT TO NEW CELL M=N; ! RESET LAST CELL POINTER ->L1 L3: L=N; ! L TO PT TO 1ST CELL OF NAME M=N; ! M TO PT TO LAST CELL OF NAME ->L1 ! ! END OF NAME REACHED - PUT AWAY LAST CHARS & TIDY LIST. L2: %IF J=0 %AND OE=0 %THEN ->L4; ! NOTHING IN THIS WORD %IF J=0 %AND OE#0 %THEN -> L25 %IF OE=0 %THEN N=NEWCELL; ! NEW CELL FOR LAST WORD %IF OE=0 %THEN TAG(N)=J %ELSE TAG1(N)=J L25: %IF L=0 %THEN ->L5; ! NOTHING IN LIST YET -> L4 %IF OE#0 LINK(M)=N; ! LINK AFTER LAST CELL ->L4 L5: L=N; ! L TO TP TO 1ST CELL OF NAME ! ! ALL CHARS NOW STORED AWAY. NOW SEE IF NAME IS ! ALREADY IN LIST. L4: I=INC!TAG(L) ; ! FIRST 4 LETTERS& LAST ! LETTER ! LAST 4 LETTERS %IF OE=0 %THEN J=TAG(N) %ELSE J=TAG1(N) I=I-I//HV*HV; !HASH FOR STARTING POSN INC=((J-J//29*29)+1)!1 ; !ODD INCREMENT J=I; ! SET INDEX FOR SEARCHING L11: %IF TAG(J)=0 %THEN ->L6; ! VACANT HOLE (I.E. NAME NOT IN ! IE. THIS SEARCH START PT NOT OCCUPIED, SO NAME NOT ! IN ALREADY. K=TAG(J); ! POINTER TO NAME LIST (EXISTING M=L; ! POINTER TO NAME LIST (NEW) L9: %IF TAG(K)#TAG(M) %OR %C TAG1(K)#TAG1(M) %THEN ->L7; ! COMPARE WORDS OF CHARS K=LINK(K); ! NEXT CELL (EXISTING) M=LINK(M); ! NEXT CELL (NEW) %IF K=0 %THEN ->L8; ! END OF LIST (EXISTING) %IF M=0 %THEN ->L7; ! END OF LIST (NEW) - FAILURE ->L9 L8: %IF M=0 %THEN ->L10; ! END OF LIST (NEW) - SUCCESS ! ! TRY NEXT HASH AREA ENTRY L7: J=(J+INC)&NNAMES; !INCREMENT CYCLICALLY %IF J#I %THEN ->L11; ! NOT YET DONE FULL CYCLE FAULT(103); ! DICTIONARY FULL L10: L=RETURN CELL(L); ! NAME ALREADY IN SO RETURN %IF L#0 %THEN ->L10; ! NEW NAME LIST TO ASL ->L12 ! ! NAME WAS NOT IN PREVIOUSLY. SET TAG ENTRY TO POINT TO LIST OF ! IDENTIFIER CHARACTERS. L6: TAG(J)=L; ! FILL IN NEW NAME LIST POINTER LINK(J)=0 L12: AP=AP+1; ! INCREMENT ANALYSIS RECORD POSI A(AP)=J; ! STORE INDEX OF NAME IN HASHING %RESULT =1; ! SUCCESS %END; ! NAME %INTEGERFN CONST %ROUTINE CREADF(%INTEGERNAME X,Y,%INTEGERARRAYNAME T, %C %INTEGERNAME TP,F) %INTEGER FLAG,CURSYM; ! FLAG= 0FOR'-',1 FOR '+' %INTEGER IVALUE,FF %INTEGER A,SIGN,EXP11,FRAC %LONGREAL RWORK,SCALE %INTEGER TTP %ROUTINE SKIP SYMBOL TP=TP+1 %END %INTEGERFN NEXT SYMBOL %RESULT=T(TP) %END F=3; !SET SUCCESS FIRST TTP=TP FLAG=1 -> TEST SIGN IGNORE LEADING SPACES: SKIP SYMBOL TEST SIGN:CURSYM=NEXT SYMBOL; ! CARE NOT TO READ TERMINATOR -> IGNORE LEADING SPACES %IF CURSYM=' ' -> PASS SIGN %IF CURSYM='+' -> DIGIT %UNLESS CURSYM='-' FLAG=0; ! RECORD INITIAL MINUS PASS SIGN: SKIP SYMBOL; ! MOVE OVER SIGN ONCE IT HAS CURSYM=NEXT SYMBOL; ! BEEN RECORDED IN FLAG DIGIT: -> DIGIT NOT FIRST %UNLESS '0'<=CURSYM %AND CURSYM<='9' RWORK=CURSYM-'0'; ! KEEP TOTAL IN RWORK LOOP: SKIP SYMBOL CURSYM=NEXT SYMBOL -> NOT DIG %UNLESS '0'<=CURSYM %AND CURSYM<='9' RWORK=10*RWORK+(CURSYM-'0'); ! CONTINUE EVALUATING -> LOOP NOT DIG: -> FAIL NOT REAL %UNLESS CURSYM='.' SCALE=10 FPART: SKIP SYMBOL CURSYM=NEXT SYMBOL -> TRY AT %UNLESS '0'<=CURSYM %AND CURSYM<='9' RWORK=RWORK+(CURSYM-'0')/SCALE SCALE=10*SCALE; -> FPART TRY AT: ! THE VALUE HAS NOW BEEN READ INTO RWORK. THERE MIGHT BE AN EXPONENT ! E.G. '1.7@ 10' IS VALID DATA FOR READ -> FIX %UNLESS CURSYM='@' -> SCALE FAIL ; ! SCALE FACTORS '@' NOT YET IMPLEMENTED SKIP SYMBOL; ! MOVE PAST THE '@' %IF IVALUE<=-99 %THEN RWORK=0 %ELSE RWORK=RWORK*10**IVALUE FIX: ! PICK OUT FLOATING ZERO %IF RWORK=0 %THENSTART; X=0; %RETURN; %FINISH %IF FLAG=0 %THEN RWORK=-RWORK A=ADDR(RWORK) ! ! !******************************************************* PRINTSTRING("REALS NOT IMPLEMENTED ON 2900..... ") -> FAIL !THIS CODE IS ONLY TO BE RUN ON THE SYSTEM 4. ! ! SIGN=INTEGER(A)&X'80000000' EXP11=((BYTEINTEGER(A)&127)-64)<<2 + 128 FRAC=INTEGER(A) & X'00FFFFFF' %IF INTEGER(A+4)<0 %AND FRAC#X'FFFFFF' %THEN FRAC=FRAC+1 -> L5 %IF FRAC=0 %CYCLE FF=1,1,24 %IF FRAC&X'00800000'#0 %THEN -> L5 FRAC=FRAC<<1 EXP11=EXP11-1 %REPEAT L5: -> SIZE FAIL %UNLESS 0<= EXP11 <= 511 INTEGER(A)=SIGN!(EXP11<<23)!(FRAC&X'007FFFFF') ! ! !****************************************************** ! ! ! X=SHORTINTEGER(A) ! Y=SHORTINTEGER(A+2) %RETURN DIGIT NOT FIRST: ! CAN HAVE .73 AS VALID IMP NO -> FAIL NOT REAL %UNLESS CURSYM='.' SKIP SYMBOL CURSYM=NEXT SYMBOL -> FAIL NOT REAL %UNLESS '0'<=CURSYM %AND CURSYM<='9' RWORK=(CURSYM-'0')/10 SCALE=100; -> FPART SIZE FAIL: SELECT OUTPUT(99) PRINTSTRING(" CPLR READ: EXPNT FAIL ") -> FAIL SCALE FAIL: SELECT OUTPUT(99) PRINTSTRING(" ""@"" NOT YET IMPLEMENTED ") FAIL: FAIL NOT REAL: X=0 F=0 TP=TTP %END ! RECOGNISE INTEGER AND LITERAL TEXT CONSTANTS %INTEGER I,J,K,L,F,G; F=2; !TO INDICATE INTEGER TYPE L=0 I=T(TP); ! FIRST CHAR G=0 %IF I='''' %THEN ->L1; ! START OF LITERAL TEXT G=1 %IF I='M' %THEN ->L7; ! COULD BE M'...' CONSTANT %IF I='X' %AND T(TP+1)='''' %THEN ->L10; ! COULD BE HEX CONST %IF I='O' %START TP=TP+1 %IF T(TP)#'''' %THEN %RESULT=0 J=0 OLO: TP=TP+1 I=T(TP) %IF I='''' %THEN -> EXINC %UNLESS '0'<=I %AND I<='7' %AND J&X'E000'=0 %THEN %RESULT=0 J=(J<<3) ! (I-'0') -> OLO %FINISH G=1 ! ! TRY FOR A REAL CONST CREADF(J,L,T,TP,F) %IF F=3 %THEN -> L2; ! JUMP IF REAL CONST F=2; ! INDICATE INTEGER TYPE ! ! DEC INTEGER %IF I<'0' %OR I>'9' %THENRESULT =0; ! NOT A DIGIT J=I-'0'; ! FIRST DIGIT VALUE L3: TP=TP+1 I=T(TP); ! NEXT CHAR %IF I<'0' %OR I>'9' %THEN ->L2; ! NOT A DIGIT - END OF INTEGER J=10*J+I-'0'; ! ACCUMMULATE INTEGER VALUE ->L3 ! ! HEX CONST L10: TP=TP+1; J=0; K=0; ! HEX CONSTS L11: TP=TP+1; I=T(TP) %IF I>='0' %AND I<='9' %THEN ->L12 %IF I<'A' %OR I>'F' %THEN ->L14 I=I-55; ->L13 L12: I=I-'0' L13: J=J<<4!I; K=K+1; ->L11 L14: %IF I#'''' %OR K>4 %THENRESULT =0 EXINC: TP=TP+1 -> L2 ! ! M-CONST L7: %IF T(TP+1)#'''' %THENRESULT =0; ! NOT M'..' CONSTANT - ! FAILU TP=TP+1 L1: J=0; ! CLEAR PACKING WORD K=0; ! NUMBER OF CHARS SO FAR %IF A(1)=12 %AND A(2)=6 %THENSTART G=0 A(AP+2)=CTN ;! STARTING POSITION IN CT. I=PTEXT AP=AP+1 %RESULT=I %FINISH L6: TP=TP+1 I=T(TP); ! NEXT CHARACTER %IF I#'''' %THEN ->L4; ! NOT QUOTE TP=TP+1 I=T(TP); ! NEXT CHARACTER %IF I#'''' %THEN ->L5; ! END OF TEXT - ELSE IGNORE SECO L4: J=J<<8!I ; ! PACK CHARACTER K=K+1; ! CHARACTER COUNT %IF K=2 %AND G=0 %THENSTART TP=TP-2 %RESULT=PTEXT %FINISH ->L6 L5: %IF K>2 %THENRESULT =0; ! CHAR STRING TOO LONG ! ! EXIT L2: AP=AP+1 A(AP)=F;! 2 : INTEGER TYPE 3: REAL AP=AP+1 A(AP)=J; ! CONSTANT VALUE AP=AP+1 A(AP)=L; ! FOR REAL %RESULT =1; ! SUCCESS %END; ! CONST %INTEGERFN PTEXT %INTEGER I,J,K,M,CH %IF T(TP)#'''' %THENRESULT =0 TP=TP+1 M=CTN %IF A(1)=12 %AND A(2)=6 %THENSTART %IF PTEXTSHL=0 %THEN J=8 %ELSESTART CTN=CTN+1 COT(CTN)=0 J=0 %FINISH %IF TP>2 %AND T(TP-2)#'=' %THEN K=COT(CTN) %ELSESTART COT(CTN)=0 K=0 %FINISH %FINISHELSESTART J=8 K=0 COT(M)=0; ! IN CASE NULL TEXT SUPPLIED %FINISH CH=0 L1: I=T(TP) TP=TP+1 %IF I='''' %THEN ->L5 L2: K=K!I<L1 COT(CTN)<-K; ! 2 CHARS TO CONST TABLE K=0 CTN=CTN+1 J=0 ->L1 L5: %IF T(TP)#'''' %THEN ->L6 TP=TP+1; ! TWO QUOTES = ONE QUOTE ->L2 L6: %IF K=0 %THEN ->L7 COT(CTN)<-K; ! LAST FEW CHARS CTN=CTN+1 L7: COT(M)<-COT(M)!CH<L8 %IF I#'-' %THEN ->L9 SIGN=-1 L8: TP=TP+1 L9: %IF CONST=0 %THEN ->L98; ! USE CONST TO GET NEXT CONSTANT AP=AP-3; S=A(AP+2); RF=1; ! EXTRACT CONSTANT FROM ANAL RECD S1=A(AP+3); ! REAL CONST TYPE=A(AP+1) %IF A(1)=12 %AND A(2)=3 %AND TYPE=2 %START FLT11(S) S=FLIT S1=FLOT TYPE=3 %FINISH %IF A(1)=12 %AND A(2)=2 %AND TYPE=3 %THEN FAULT(44) %IF T(TP)#'(' %THEN ->L1; ! IS THERE A REPEAT FACTOR TP=TP+1 %IF CONST=0 %OR T(TP)#')' %THEN ->L98; ! CONST EXTRACTS RF AP=AP-3; RF=A(AP+2); TP=TP+1 ! REPEAT FACTOR NOW SET UP IN RF L1: S=S*SIGN %IF TYPE<3; ! CONSTANT NOW WITH CORRECT SIGN(INTEGER) %IF TYPE=3 %AND SIGN<0 %THEN S=S!X'8000' %IF A(1)=12 %AND A(2)=1 %START ! OWNBYTE ARRAY COMING ! %IF S< -128 %OR S>127 %THEN %RESULT=0 %CYCLE J=1,1,RF %IF SHL=0 %START CPOINT=CT NEXT COT(CPOINT)<-S COT(CPOINT)<-COT(CPOINT)&255 SHL=1 %FINISH %ELSE %START COT(CPOINT)<-COT(CPOINT) ! (S<<8) SHL=0 %FINISH %REPEAT %FINISH %ELSE %START %CYCLE J=1,1,RF I=CTNEXT %IF TYPE=3 %THENSTART; ! REAL CONST COT(I)<-S COT(CT NEXT)<-S1 %FINISH %ELSE COT(I)<-S %REPEAT %FINISH CNUM=CNUM+RF L97: %IF T(TP)#',' %THEN ->L99 TP=TP+1 %IF T(TP)#10 %THEN ->L6 READ STATEMENT; TP=1; ->L6 L98: TP=RTP L99: A(AP+1)=CNUM; !NO OF CONSTS TO ANAL REC A(AP+2)=SCP; !TOGETHER WITH STARTING POSN AP=AP+2 PTEXTSHL=0 %RESULT =1 %END; ! CONSTLIST %END; ! COMPARE %ROUTINE PRINT AR(%INTEGER N) ! PRINT ANALYSIS RECORD (N LONG) %INTEGER I %IF DIAGS=0 %THENRETURN I=1 L1: WRITE(A(I),3) %IF I//16*16=I %THEN NEWLINE I=I+1 %IF I<=N %THEN ->L1 NEWLINE %END; ! PRINT AR %INTEGERFN BT NEXT ! ALLOCATE NEXT POSITION IN BRANCH TABLE %IF BTN<=LTSIZE %THEN ->L1; !STILL ROOM FAULT(66); ! TOO MANY LABELS BTN=0; ! TRY TO CONTINUE L1: BAT(BTN)=-1; ! MARKER FOR ADDRESS NOT FILLED BTN=BTN+1; ! NEXT POSITION %RESULT =BTN-1; ! THIS POSITION %END; ! BT NEXT %INTEGERFN CT NEXT ! ALLOCATE NEXT POSITION IN CONSTANT TABLE %IF CTN<=LTSIZE %THEN ->L1; !STILL ROOM FAULT(67); ! TOO MANY CONSTS CTN=0; ! TRY TO CONTINUE L1: CTN=CTN+1; ! NEXT POSITION %RESULT =CTN-1; ! THIS POSITION %END; ! CT NEXT %ROUTINE SS ! COMPILE SOURCE STATEMENT %ROUTINESPEC REC DISP(%INTEGER I,%INTEGERNAME K,KK,TYPENO) %ROUTINESPEC FMT ELT %ROUTINESPEC RFMTD %ROUTINESPEC ENDS %ROUTINESPEC UI %INTEGERFNSPEC FREE REG %ROUTINESPEC BLOCK ENTRY %ROUTINESPEC FLOAT %ROUTINESPEC UP STACK PTR(%INTEGER N) %ROUTINESPEC SCCOND(%INTEGERNAME I, %INTEGER I,I) %ROUTINESPEC SEXPR(%INTEGERNAME TYPE) %ROUTINESPEC RTSPEC %INTEGERFNSPEC FIND LABEL %ROUTINESPEC CHECK JUMPS %ROUTINESPEC SET LINE %ROUTINESPEC SET LAB(%INTEGER PTP) %ROUTINESPEC STORE TAG(%INTEGER NAME,FORM,TYPE,DIM,LEV,AD) ! ! %ROUTINESPEC RESTORE INTER %ROUTINESPEC RELEASE(%INTEGER REG) %ROUTINESPEC SET INTER (%INTEGER REG) %ROUTINESPEC INTER TO SP %ROUTINESPEC SAVE INTER %INTEGERFNSPEC ADDRDUMP(%INTEGER LEVEL,DISP) %ROUTINESPEC DUMP(%INTEGER OP,BASE,DISP) %INTEGERFNSPEC SET INDEX(%INTEGER BASE) %INTEGERFNSPEC LOAD INDEX(%INTEGER OT,%INTEGERARRAYNAME LOCN) %ROUTINESPEC LOCK(%INTEGER R) %ROUTINESPEC UNLOCK(%INTEGER R) %INTEGERFNSPEC P11REG %ROUTINESPEC LD ADDR(%INTEGER REG,BASE,DISP) %INTEGERFNSPEC INTER BASE %ROUTINESPEC LOSE(%INTEGER REG) %INTEGERFNSPEC INTER REG %INTEGERFNSPEC INTER TO REG(%INTEGER ACC) %INTEGERFNSPEC BYTE TO REG(%INTEGER BASE,DISP,REG) %ROUTINESPEC PRR %ROUTINESPEC PRI(%INTEGER OT) ! ! %ROUTINESPEC PJ(%INTEGER A,A,A) %ROUTINESPEC PPJ(%INTEGER A) %ROUTINESPEC HOY NAME(%INTEGER A) %ROUTINESPEC TYPE CH(%INTEGER I,I) %ROUTINESPEC CBPAIR(%INTEGERNAME I,I) %ROUTINESPEC DETAG %ROUTINESPEC SKIP SEXPR %ROUTINESPEC SKIP APP %ROUTINESPEC RT %ROUTINESPEC ARRAD(%INTEGER MODE, %INTEGERNAME REG) %ROUTINESPEC RETURN %ROUTINESPEC PMN(%INTEGER I) %ROUTINESPEC COMMA %ROUTINESPEC IUSES0 %ROUTINESPEC PRLAB %ROUTINESPEC D11(%INTEGER OP,MODE,NEM,NUM) %ROUTINESPEC D11A(%INTEGER OP,M1,NEM1,NUM1,M2,NEM2,NUM2) %ROUTINESPEC OPERAND(%INTEGER MODE,NEM,NUM) %ROUTINESPEC MAA(%INTEGER M1,A1,M2,A2) %ROUTINESPEC EM(%INTEGER I) %ROUTINESPEC AD(%INTEGER I) %ROUTINESPEC TSAVE(%INTEGER TWSP) %ROUTINESPEC TOPOL %ROUTINESPEC FPOL %ROUTINESPEC TO GLOBLS(%INTEGER I) %ROUTINESPEC F GLOBLS %SWITCH SW(1:29) %OWNINTEGERARRAY GLOBLS(1:10)=0(10) %OWNINTEGER GP=0 %OWNINTEGER IN EXT=0 %OWNINTEGER UTAG=0; ! FOR USE IN RTS ARRAD & PJ. %OWNINTEGER SR=-1; ! %SHORT %ROUTINE %OWNINTEGER JS=-1; ! %JUMPS %SHORT %OWNINTEGER LJS=0; ! %LONG %JUMP %OWNINTEGER BDIAGSPTR=0 %INTEGER TEMPHEAD; TEMPHEAD=0 %INTEGER FMT NAME,RDISP,NRELTS,TORF %INTEGER I,J,K,L,M,N,NN,WS,CELL1,CELL2,TYPE,WK %INTEGER INHIB; INHIB=0; !USED ONLY FOR CASE I=J IN UI & SEXPR %INTEGER DV,UIJ ! ! %OWNINTEGERARRAY PAR1(0:1) %OWNINTEGERARRAY PAR2(0:1) %OWNINTEGERARRAY PAR3(0:1) %OWNINTEGER LOCKED=0 %OWNINTEGER IHEAD=0 %INTEGERARRAY SOUR,DEST(-1:2) !!!!!111111111111111111111111111111!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! %OWNINTEGERARRAY ENCODE(0:16)= %C X'08B0', X'0CB0', X'1350', X'1B50', X'2350', X'0000', X'3040', X'38C0', X'4350', X'4946', X'0000', X'0000', X'6430', X'4351', X'7410', X'7CB8', X'8350' %IF LEVEL>0 %AND RDIAG#0 %START %CYCLE I=1,1,LEVEL PRINTSTRING("LEVEL") WRITE(I,1) PRINTSYMBOL(':') J=SBR(I) %WHILE J#0 %CYCLE WRITE(TAG(J),3) J=LINK(J) %REPEAT NEWLINE %REPEAT %FINISH ! ! SOUR(-1)='S' DEST(-1)='D' I=A(AP); ! ANALYSIS RECORD ENTRY AP=AP+1; ! FOR FOLLOWING ENTRY WS=0; ! WORKSPACE POINTER TO ZERO %IF LEVEL#0 %THEN ->L1 ! ! 5 (COMMENT, M/C CODE, THE LATTER NOT BEING INTENDED! ! 6 ! 8 %BEGIN ! 12 ! 13 %CONTROL ! 18 %JUMPSSHORT ! 21 %ENDOFFILE ! %IF I=5 %OR I=6 %OR I=22 %OR I=12 %OR I=13 %OR I=18 %OR I=24 %C %OR I=28 %OR I=29 %THEN ->L1 FAULT(57); ! BEGIN NOT FIRST L1: ->SW(I) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! UI SW(1): SET LINE; ! UPDATE LINE COUNT %IF A(MARK)=1 %THEN ->L110; ! CONDITION AFTER UI UI; !AND COMPILE UNCONDITIONAL INSTRN %RETURN L110: J=AP; ! SAVE POSN OF UI AP=MARK+2; !TO P SCCOND(I,A(MARK+1),J); !COMPILE CONDITION AP=J %IF A(AP)#4 %THEN UI; ! COMPILE UI UNLESS JUMP !(NECESSARY JUMP HAS BEEN FIXED IN SCCOND). %IF I>=0 %THEN SET LAB(I); ! LABEL FOR BR ROUND UI %RETURN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! %IF . . . %THEN . . . SW(2): SET LINE; ! UPDATE LINE COUNT J=A(AP); AP=AP+1 %IF A(MARK)<=2 %THEN ->L220; ! ALT OF IS %THEN%START OR %START ! THEN ALT OF IS . SCCOND(I,J,MARK+1); ! COMPILE CONDITION AP=MARK+1; ! TO P UIJ=A(AP); ! ALT NO OF UI1 %IF UIJ#4 %THEN UI; ! UI1 UNLESS JUMP ! AP IS NOW PTG TO ALT OF . ! 1:%ELSESTART 2: %ELSE UI12 3: NULL %IF A(MARK2)=3 %THEN ->L230; !JUMP IF ALT OF IS NULL. ! OTHERWISE PLANT A JUMP ROUND THE ELSE CLAUSE. ! BUT NOT IF 'THEN' CLAUSE IS -> LAB %IF UIJ#4 %THEN %START; ! UI1 WAS NOT A JUMP %IF A(MARK2)=2 %THEN K=0 %ELSE K=1 !(MANDATORY SHORT FOR 'ELSE UI', ELSE BEST CAN DO J=BT NEXT PJ(BR,K,J); ! AT END OF UI1, PLANT JUMP ROUND UI2 %FINISH %IF I>=0 %THEN SETLAB(I); ! LABEL FOR START OF UI2 ! MARK2 IS PTG TO ALT OF . %IF A(MARK2)=1 %THENSTART ; !WE HAVE %ELSE %START PUSH(SBR(LEVEL),J,UIJ) %RETURN %FINISH ! HERE WE HAVE %ELSE UI2 AP=MARK2+1; ! TO PT TO . UI; ! UI2 SETLAB(J) %UNLESS UIJ=4; ! LABEL FOR END OF UI2, NOT NEEDED IF UI1 ! WAS JUMP %RETURN L220: ! ALT OF IS %START SCCOND(I,J,MARK); ! SIMPLE CONDITION ! LEAVES I PTG TO ALT OF IN ANAL REC. PUSH(SBR(LEVEL),I,0); ! SAVE I FOR %FINISH %RETURN L230: %IF I>=0 %THEN SETLAB(I); !SET BRANCH ROUND UI. %RETURN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! LABEL SW(3): I=FIND LABEL; ! LOCATE/INSERT LAB IN JUMP LIST %IF I<0 %THEN ->L302; ! INVALID LABEL %IF BAT(I)>=0 %THEN FAULT(2); !LABEL SET TWICE SETLAB(I); ! FILL IN LABEL ADDRESS L302: SS; ! COMPILE STATEMENT AFTER LABEL %RETURN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! DECLARATIONS (OTHER THAN %OWN) ! SW(4): ! 1=BYTEINTEGER 2=INTEGER,3=REAL,4=SHORTINT,5=LONGREAL TYPE=A(AP) %IF TYPE=6 %THEN ->L408; ! TYPE=STRING %IF TYPE>3 %THEN TYPE=TYPE-2; ! SHORTINT=INT, LONGREAL=REAL I=TYPE ! SET I=1,2,4 FOR BYTE,INTEGER,REAL %IF I=3 %THEN I=I+1 %IF A(AP+1)=1 %THEN ->L401; ! = %ARRAY AP=AP+1 J=A(AP+1)&1 %IF J=1 %THEN I=2 L402: AP=AP+2; ! POINTER ON NAME ! ALIGN RAD TO WORD FOR INTEGER AND REAL %IF TYPE>=2 %THEN RAD=(RAD+1)&(-2) STORE TAG(A(AP),J,TYPE,0,LEVEL,RAD); ! TAGS FOR THIS NAME RAD=RAD+I %IF A(AP+1)=1 %THEN ->L402; ! MORE %IF A(AP+2)#2 %THEN FAULT(37); ! SURPLUS BND PAIR %RETURN ; ! IGNORE EXTRA BOUND PAIRS ! ! ARRAY DECLARATIONS (OTHER THAN %OWN) ! L401: AP=AP+1 %IF A(AP+1)=1 %THENSTART ; FAULT(100) ; %RETURN ; %FINISH RAD=(RAD+1)&(-2) DV=RAD; K=AP; ! PUT DOPE VECTOR AMONG LOCALS SET LINE; ! UPDATE LINE COUNT L403: AP=AP+2; ! SKIP A NAME %IF A(AP+1)=1 %THEN ->L403; ! MORE NAMES YET IN NAMELIST AP=AP+2; ! ON TO P %IF A(AP)=1 %THEN ->L404; ! BOUND PAIR PRESENT FAULT(37); ! MISSING BND PAIR AP=K; ! RESTORE INITIAL ANAL. REC. POI ->L402; ! TREAT AS SCALAR DECLARATIONS L404: J=4 L405: ! LOOK FOR THE BOUND-PAIR J=J+2; ! J POINTS TO ALTS OF %IF A(J)=1 %THEN -> L405; ! JUMP BACK WHILE ALT OF NAMELIST IS , ! FOLLOWING CONDITIONS ARE J+4,J+11, - ALT OF OPND IS 3 (CONST) ! AND J+5,J+12, - ALT OF CONST IS 2 (TYPE INTEGER) %IF A(J+4)=3 %AND A(J+5)=2 %AND A(J+11)=3 %AND A(J+12)=2 %C %AND A(J+15)=2 %THENSTART ! CONST BDD ARRAY. PUT DV INTO COT. REL ADDR ! OF ALL ELTS KNOWN AT COMPILE TIME. DV=CT NEXT ! ONE DV FOR ALL ARRAYS WITH THESE BOUNDS COT(DV)=1 ! (I<<4) ;! ND K=A(J+6); ! LB L=A(J+3); ! PICK UP PLUS-DASHED %IF L=2 %THEN K=-K; %IF L=3 %THEN K=\K COT(CT NEXT)=K; ! LB M=A(J+13); ! UB L=A(J+9); ! PICK UP PLUS-DASHED %IF L=2 %THEN M=-M; %IF L=3 %THEN M=\M COT(CT NEXT)=M; ! UB COT(CT NEXT)=0 ; ! RANGE. NOT USED M=(M-K+1)*I; ! NO. OF BYTES FOR EACH ACTUAL ARRAY K=K*I ! K IS NO OF BYTES FROM ARRAY(0) TO ARRAY(LB) ! M IS NO OF BYTES FOR EACH ACTUAL ARRAY J=3 L410: J=J+2; ! POINTS TO S ! PUT ARRAYS AND HEADERS IN LOCAL SPACE, ONE HDR FOR EACH ARRAY. L=RAD; ! RAD FOR 1ST ACTUAL ELEMENT OF ARRAY RAD=RAD+M; ! AREA FOR ARRAY, RAD IS NOW RAD FOR HDR RAD=(RAD+1)&(-2) STORE TAG(A(J),2,TYPE,1,LEVEL,RAD) ! PUT AN EXTRA CELL CONTAINING ADDR(ARRAY(0)) BEHIND ARRAY ! NAME TAGS WITH TOP BIT SET IN LINK FIELD. CELL1=LINK(A(J)) CELL2=NEWCELL TAG(CELL2)=L-K TAG1(CELL2)=0 LINK(CELL2)=LINK(CELL1) LINK(CELL1)=CELL2!X'8000' ! NEXT PLANT CODE TO LOAD THE HEADER D11A(MOV,8,0,L-K,6,R1,RAD); ! ADDR(ARRAY(0)) D11A(ADD,0,R1,0,6,R1,RAD) LD ADDR(-1,15,DV*2); ! ADDR(DV) DUMP(STR,13,RAD+2) RAD=RAD+4 %IF A(J+1)=1 %THEN -> L410 ! JUMP BACK WHILE ALT OF NAMELIST IS , %RETURN %FINISH J=2; ! LEAVE HOLE FOR NUMBER OF DIMEN L406: AP=AP+1 SEXPR(L); ! LOWER BOUND EXPR, L=TYPE FOUND DUMP(STR,13,DV+J); ! STORE LOWER BOUND SEXPR(M); ! UPPER BOUND EXPR, M=TYPE FOUND DUMP(STR,13,DV+J+2); ! STORE UPPER BOUND J=J+6; ! INCREMENT FOR NEXT BOUND PAIR %IF L>2 %OR M>2 %THEN FAULT(24); ! BND REAL EXPRN %IF A(AP)=1 %THEN ->L406; ! ON - MORE BOUND PAIRS J=(J-2)//6; ! NUMBER OF DIMENSIONS ! SET TOPQUARTET OF ND IN DV TO BE 1,2,4 FOR BYTE,INT,REAL DUMP(LOAD,14,J!(I<<4)); ! LOAD NO OF DIMENSIONS DUMP(STR,13,DV); ! INTO WORD 1 OF DOPEVECTOR ! ADDR OF DOPEVECTOR TO I3 ! MOV #DV,R3 D11A(MOV,8,0,DV,0,IND(3),0) ! ADD R1,R3 D11A(ADD,0,R1,0,0,IND(3),0) AP=K; !RESTORE ANAL REC PTR RAD=RAD+2+6*J; ! RAD ON PAST DOPE VECTOR L407: AP=AP+2; ! ON STORE TAG(A(AP),2,TYPE,J,LEVEL,RAD); ! TAGS FOR EACH ARRAY NAME PPJ(0); ! DECLARE ARRAY LEAVING @DV IN I3 & ! ADDR(A(0)) IN ACC SET INTER(0) DUMP(STR,13,RAD); ! ADDR(A(0)) TO WORD1 OF ARRAYHEAD SET INTER(3) DUMP(STR,13,RAD+2); ! AND @DV INTO WORD2 RAD=RAD+4; ! RELATIVE ADDRESS FOR NEXT ARRAYHEAD %IF A(AP+1)=1 %THEN ->L407; ! MORE %RETURN ! ! STRING DECLARATIONS (OTHER THAN %OWN) ! L408: SET LINE %IF A(AP+1)=1 %THEN ->L409 AP=AP+2 ->L419 %IF A(AP+1)=1 ;!STRINGNAME FAULT(32) ;!STRING LENGTH MISSING J=255 ;!GIVE STRING MAX. LENGTH AP=AP+2 ->L411 ;!TRY TO CONTINUE L409: AP=AP+3 %IF A(AP-1)=2 %THEN ->L412 FAULT(33) ;!LENGTH NOT INTEGER J=255 ;!GIVE STRING MAX. LENGTH ->L411 ;!TRY TO CONTINUE L412: J=A(AP) ;!STRING LENGTH L411: AP=AP+2 %IF A(AP)=1 %THEN ->L413 ;!STRING ARRAY ->L419 %IF A(AP+1)=1 ;!STRINGNAME AP=AP+2 ;!POINT TO FIRST NAME %IF A(AP+1)=1 %THENSTART; ! MORE THAN 1 NAME D11A(MOV,8,0,J,0,R0,0); ! MOVE MAX. LENGTH TO R0 I=0 K=R0 L=0 %FINISHELSESTART I=8 K=0 L=J %FINISH ->L415 L414: AP=AP+2 ;!SKIP NAME %RETURNUNLESS A(AP-1)=1 ;!NO MORE NAMES L415: STORE TAG(A(AP),0,6,1,LEVEL,RAD) D11A(MOV,I,K,L,6,R1,RAD+2);!MAX. LENGTH D11A(MOV,8,0,RAD+4,6,R1,RAD);!ADDRESS OF D11A(ADD,0,R1,0,6,R1,RAD);!STRING RAD=RAD+4+J+1 %IF RAD&1=1 %THEN RAD=RAD+1 ;!MAKE RAD WORD ALIGNED ->L414 ! ! STRING ARRAY DECLARATIONS (OTHER THAN %OWN) ! L413: AP=AP+1 K=AP ;! SAVE ANAL PTR. L418: AP=AP+2; ! SKIP A NAME %IF A(AP)=1 %THEN ->L418; ! MORE NAMES IN NAMELIST AP=AP+1; ! ON TO P %IF A(AP)=1 %THEN ->L416;! BOUND PAIR PRESENT FAULT(37); !MISSING BOUND PAIR AP=K+1; ! RESTORE INITIAL ANAL. REC. PTR. ->L415; ! TREAT AS ORDINARY STRING L416: %IF A(AP+3)=3 %AND A(AP+4)=2 %AND A(AP+10)=3 %ANDC A(AP+11)=2 %AND A(AP+14)=2 %THENSTART ! BOUND PAIR AT A(AP+5) AND A(AP+12) DV=CT NEXT ! ONE FOR ALL STRING ARRAYS WITH THESE BOUNDS K=A(AP+5) ;! LB L=A(AP+2) ;! PLUS-DASHED %IF L=2 %THEN K=-K ; %IF L=3 %THEN K=\K COT(CT NEXT)=K ;! LB M=A(AP+12) ;! UB L=A(AP+9) ;! PLUS-DASHED %IF L=2 %THEN M=-M ; %IF L=3 %THEN M=\M COT(CT NEXT)=M ;! UB COT(CT NEXT)=J ;! MAX. LENGTH OF EACH STRING L=M-K %IF L<0 %THEN L=L*(-1) ; L=L+1 COT(DV)=L ! 128 ; ! ND L=L*J+L ; ! NO. OF BYTES FOR ARRAY %IF L&1=1 %THEN L=L+1;! MAKE WORD ALIGNED AP=7 L417: AP=AP+2 M=RAD RAD=RAD+L STORE TAG(A(AP),2,TYPE,1,LEVEL,RAD) CELL1=LINK(A(AP)) CELL2=NEWCELL TAG(CELL2)=J; ! MAX. STRING LENGTH LINK(CELL2)=LINK(CELL1) LINK(CELL1)=CELL2 D11A(MOV,8,0,M-K*J+K,6,R1,RAD); ! ADDR(STRING(0)) D11A(ADD,0,R1,0,6,R1,RAD) LD ADDR(-1,15,DV*2); ! ADDR(DV) DUMP(STR,13,RAD+2) RAD=RAD+4 %IF A(AP+1)=1 %THEN ->L417; ! MORE NAMES %RETURN %FINISH %RETURN ! ! STRING NAME ! L419: AP=AP+2 %IF A(AP-1)#1 %THENSTART ; FAULT(100) ; %RETURN ; %FINISH L420: STORE TAG(A(AP),1,6,0,LEVEL,RAD) D11A(MOV,8,0,225,6,R1,RAD+2) RAD=RAD+4 %RETURNIF A(AP+1)#1 ;! NO MORE NAMES AP=AP+2 ->L420 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! COMMENT, M/C CODE ! SW(5): !AP IS POINTING TO ALT OF !TP IS POINTING TO CHAR AFTER ! OR %COMMENT OR * I=A(AP) %IF I=4 %THENSTART; PRLAB; IUSES0 %IF TARGET&8192#0 %START DBIN(0,TP,0,0,0,0,0) %WHILE T(TP)#10 %AND T(TP)#';' %THEN TP=TP+1 %RETURN %FINISH CA=CA+2; %FINISH ! PRINTS LABEL IF NECESSARY AND SELECTS OBJECT STREAM. L500: J=T(TP) J=10 %IF J=';' J=' ' %IF J='_' PRINT SYMBOL(J) %IF I=4; !M/C CODE %RETURNIF J=10 TP=TP+1 ->L500 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! SW(6): ! RT AND RT SPEC RTSPEC; ! COMPILE RT/FN SPEC/HEADING %RETURN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SW(7): ! %UNTIL/%WHILE ... %THEN ... %BEGIN;%INTEGER I,J,K,L,M L=A(AP); ! 1=UNTIL 2=WHILE ! INITIAL JUMP FOR %UNTIL %IF L=1 %START; J=BTNEXT; PJ(BR,0,J); %FINISH K=BTNEXT SETLAB(K); ! LABEL FOR TOP OF LOOP I=BTNEXT; ! FOR EXIT LABEL AP=AP+1; ! START OF SCCOND(M,L,-I) %IF M>=0 %THEN SETLAB(M) %IF L=1 %THEN SETLAB(J); ! LABEL FOR JUMP ROUND TEST FOR UNTIL ! NOW COMPILE THE UI AP=MARK UI PJ(BR,0,K); ! BACK TO TEST AT TOP OF LOOP SETLAB(I); ! LABEL FOR LOOP EXIT %END; ! BEGIN-BLOCK %RETURN ! !------------------------------------------------------------------- SW(8): ! %UNTIL/%WHILE ... %CYCLE %BEGIN;%INTEGER I,J,K,L,M L=A(AP); ! 1=UNTIL 2=WHILE %IF L=1 %START; J=BTNEXT; PJ(BR,0,J); %FINISH K=BTNEXT SETLAB(K); ! TOP OF LOOP I=BTNEXT; ! FOR EXIT LABEL AP=AP+1; ! START OF SCCOND(M,L,-I); ! M TO BE CONDITION EXIT LABEL, I IS 'UI' JUMP LAB %IF M>=0 %THEN SETLAB(M) %IF L=1 %THEN SETLAB(J) PUSH(CYC(LEVEL),I,K); ! EXIT LAB, TOP LAB PUSH(CYC(LEVEL),1,0); ! INDICATOR, DUMMY %END; ! BEGIN-BLOCK %RETURN !----------------------------------------------------------------------- SW(9): ! UI %UNTIL/%WHILE ... %BEGIN;%INTEGER I,J,K,L,M,APUI APUI=AP L=A(MARK-1); ! 1=UNTIL 2=WHILE %IF L=1 %START; J=BTNEXT; PJ(BR,0,J); %FINISH K=BTNEXT SETLAB(K); ! TOP OF LOOP I=BTNEXT; ! FOR EXIT LABEL AP=MARK; ! START OF SCCOND(M,L,-I) %IF M>=0 %THEN SETLAB(M) %IF L=1 %THEN SETLAB(J) AP=APUI UI PJ(BR,0,K) SETLAB(I); ! EXIT FROM LOOP %END; ! BEGIN-BLOCK %RETURN !----------------------------------------------------------------------- SW(10):! %CYCLE NAME#EXP,EXP,EXP CYCS=CYCS+1 SET LINE; ! UPDATE LINE COUNT J=AP; ! SAVE POINTER AP=AP+1 SKIP SEXPR SEXPR(K) DUMP(STR,13,RAD); ! INCREMENT SEXPR(L) DUMP(STR,13,RAD+2); ! FINAL VALUE AP=J+1 SEXPR(M); ! INITIAL %IF K!L!M#2 %THEN FAULT(24); ! REAL CYC EXPRN I=TAG OF(A(J)) %IF (I>>8)&7#2 %THEN FAULT(25); ! CYC CTRL NOT INT L=I&15+(I>>7)&32 M=TAG OFF(A(J)) NN=INTER TO REG(0) SET LAB(BTN); ! REPEAT JUMPS IN HERE DUMP(STR,L,M); ! STORE INCREMENTED CONTROL PUSH(CYC(LEVEL),RAD,BTN); ! INDICATE ORD TYPE PUSH(CYC(LEVEL),0,A(J)); ! INDICATOR, NAME BTN=BTN+1 RAD=RAD+4 %RETURN !------------------------------------------------------------------- SW(11):! %REPEAT SET LINE; ! UPDATE LINE COUNT POP(CYC(LEVEL),M,K); ! INDICATOR, NAME %IF M=-1 %START FAULT(1); ! REPEAT EXTRA %RETURN %FINISH POP(CYC(LEVEL),L,J); ! RAD,BTN OR EXIT LAB,TOP LAB %IF M=1 %START ! UNTIL/WHILE TYPE PJ(BR,0,J); ! TOP LABEL SETLAB(L); ! EXIT LABEL %RETURN %FINISH I=TAG OF(K) DUMP(LOAD,I&15+(I>>7)&32,TAG OFF(K)) NN=INTER TO REG(0) MAA(0,R0,0,R3) DUMP(ADD,13,L); !ADD INCREMENT INTO R0 D11A(SUB,6,R1,L+2,0,R3,0); ! SUBTRACT FINAL FROM R3 PJ(FALSE(1),1,J) UNLOCK(0) %RETURN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SW(12):! %OWN TYPE OWNDEC ! ! ! NOTE A MINOR ERROR TO SORT FOR UNINITIALISED %OWNREAL DCLARATION ! ! I=A(AP) %IF I=6 %THEN ->L1270; ! OWN STRING DECLARATION %IF I>3 %THEN I=I-2; ! SHORTINT=INT, LONGREAL=REAL ! I SET 1=BYTEINTEGER, 2=INTEGER, 3=REAL J=A(AP+2); ! J=NAME AP=AP+3 %IF A(AP-2)=2 %THEN ->L1240; ! GO IF ARRAY K=0; ! ZERO IS DEFAULT INITIALISATION %IF A(AP)=2 %THEN ->L1202 K=A(AP+3); ! INITIAL VALUE FLOT<-A(AP+4) ! JULY 72: DOES THIS NEXT STMT WORK FOR REALS? %IF A(AP+1)=2 %THEN K=-K; ! PLU WAS '-' L1202: L=CT NEXT FLIT<-K %IF I=3 %THENSTART; ! REAL CONST %IF A(AP+2)=2 %THEN FLT11(K) COT(L)=FLIT COT(CT NEXT)=FLOT %FINISH %C %ELSE COT(L)=K; ! INTEGER CONST %IF I=2 %AND A(AP+2)=3 %THEN FAULT(44) STORE TAG(J,0,I,0,15,2*L); ! STORE TAG, BASE=15 %RETURN ! %OWN ARRAYS ------------------ L1240: CBPAIR(K,L); ! LB TO K----UB TO L SET LINE %IF A(AP)#L-K+1 %START FAULT(45); ! WRONG NO OF CONSTS WRITE(A(AP),2); NEWLINE %FINISH ! SET UP DOPE VECTOR IN CONST TABLE M=CT NEXT ! 1ST WORD OF DV IS BOTTOM 4 BITS ND=1 ! NEXT 4 BITS 1=BYTE 2=INT 3=REAL COT(M)= 1 ! (1<<(I+3)) M=CT NEXT COT(M)=K; !LB M=CT NEXT COT(M)=L; ! UB COT(CT NEXT)=0; ! 'RANGE' (NOT USED) ! SET UP ARRAY HEADR ON STACK. ! IF (POSSIBLY HYPOTHETICAL) A(0) LIES WITHIN CONST TABLE, ! USE LDA TO PUT ITS ADDRESS IN HDR. OTHERWISE JUMP TO 1280 ! TO EVALUATE ADDRESS. ! SET K TO BE THE NO OF BYTES FROM A(0) TO ACTUAL FIRST ELT ! K IS AT PRESENT 'LB'. (TO TREAT I=1,2,3 BYTE,INT,REAL ONLY). WK=1 %WHILE WKNN %THENSTART CELL1=LINK(J) CELL2=NEWCELL TAG(CELL2)=NN-K TAG1(CELL2)=1 LINK(CELL2)=LINK(CELL1) LINK(CELL1)=CELL2!X'8000' %FINISH RAD=RAD+4 %RETURN L1270:! %OWN STRING ------------------------ SET LINE %IF A(AP+1)=1 %THEN ->L1271 FAULT(32);! STRING LENGTH MISSING %RETURN L1271: %IF A(AP+2)=2 %THEN ->L1272 FAULT(33);! STRING LENGTH NOT INTEGER %RETURN L1272: J=A(AP+3) ;! STRING LENGTH AP=AP+6 ;! ON NAME %IF A(AP-1)=2 %THEN ->L1280;! STRING ARRAY CTN=J+1 %IF CTN&1#0 %THEN CTN=CTN+1;! MAKE WORD ALIGNED CTN=CTN//2+A(12) STORE TAG(A(AP),0,6,1,LEVEL,RAD) D11A(MOV,8,0,J,6,R1,RAD+2);! MAX. LENGTH LD ADDR(-1,15,A(12)*2);! ADDRESS OF STRING DUMP(STR,13,RAD) %IF A(11)>J %START FAULT(45) WRITE(A(11),2) NEWLINE %FINISH RAD=RAD+4 %RETURN L1280:! %OWN STRING ARRAY N=A(AP);! NAME AP=AP+1 CB PAIR(K,L);! LB TO K____UB TO L %CYCLE I=K,1,L %IF A(AP)>J %START FAULT(45);! CHECK INDIVIDUAL STRINGS WRITE(A(AP),2) NEWLINE %FINISH AP=AP+1 %REPEAT I=L-K+1 %IF A(AP)#I %START FAULT(45);! CHECK NUMBER OF STRINGS WRITE(A(AP),2) NEWLINE %FINISH AP=AP+1;! TO STARTING POSITION IN CT. M=J*I+I %IF M//2*2#M %THEN CTN=CTN+1;! MAKE WORD ALIGNED M=CT NEXT COT(M)=129 ;! (1 ! 8<<4) NO. OF DIMS. M=CT NEXT COT(M)=K ;! LB M=CT NEXT COT(M)=L ;! UB M=CT NEXT COT(M)=J ;! MAX. LENGTH OF EACH STRING STORE TAG(N,2,6,1,LEVEL,RAD) CELL1=LINK(N) CELL2=NEWCELL TAG(CELL2)=J ;! MAX. LENGTH OF STRING LINK(CELL2)=LINK(CELL1) LINK(CELL1)=CELL2 LD ADDR(-1,15,2*A(AP)-K*(J+1)) ;! ADDR(STRING(0)) DUMP(STR,13,RAD) ;! TO WORD 1 OF ARRAYHEAD LD ADDR(-1,15,2*(M-3)) ;! ADDR(DV) DUMP(STR,13,RAD+2) ;! TO WORD 2 OF ARRAYHEAD RAD=RAD+4 %RETURN ! ! ! ! SW(13):! %CONTROL CHECKS=A(AP+1) DIAGS=CHECKS>>1&1 RDIAG=CHECKS&1024 %IF CHECKS&256#0 %THEN TEMPS=0; ! NO LOCAL TEMPS FOR REALEXPRESSNS %RETURN SW(14):! %SWITCH I=AP; AP=MARK CBPAIR(J,K); ! LB TO J, UB TO K AP=I; ! TO FIRST NAME %IF J<=K %THEN ->L1401; J=K FAULT(27); !SWITCH INSIDE OUT L1401: I=A(AP); ! STORE TAG(I,8,0,1,LEVEL,CTN); !FORM=8,DIM=1,DISP=PTR TO COT COT(CTN)=J; COT(CTN+1)=K; ! LB,UB TO CONST TABLE COT(CTN+2)=SWTN; CTN=CTN+3; !POSN OF ADDRESSES %CYCLE L=J,1,K %IF SWTN>SWTSIZE %START FAULT(66); SWTN=0 %FINISH SWT(SWTN-SWTSIZE)=-1 SWTN=SWTN+1 %REPEAT AP=AP+2 %IF A(AP-1)=1 %THEN ->L1401; ! FURTHER SWITCH NAME %RETURN SW(15):! : I=TAG OF(A(AP)) %IF I=0 %THEN ->L1565 %IF I>>12#8 %OR I&255#16+LEVEL %THEN ->L1565; !MUST BE SW I=TAG OFF(A(AP)) J=A(AP+3); ! LABEL NO %IF A(AP+1)=2 %THEN J=-J; ! NEGATE IF PRECEDED BY - %IF JCOT(I+1) %THEN ->L1565; ! BOUND CHECK J=J-COT(I)+COT(I+2) %IF SWT(J-SWTSIZE)>=0 %THEN ->L1565 SET LAB(J-SWTSIZE); ! SET THE ADDRESS IN BRANCH TABLE L1510: AP=AP+5 SS; %RETURN ; !COMPILE FOLLOWING STATEMENT L1565: FAULT(5); !SWITCH LABEL ERROR ->L1510 SW(16):! %FINISH ! AP IS PTG TO ALT OF . ! 1: %ELSESTART 2: %ELSE UI 3: NULL K=A(AP) POP(SBR(LEVEL),J,UIJ) %IF J>=0 %THEN ->L1601 FAULT(51); !FINISH EXTRA %RETURN L1601: %IF K<=2 %THENSTART ; !WE HAVE %ELSE %START OR %ELSE UI I=BT NEXT %IF K=2 %THEN L=0 %ELSE L=1 !(PLANT SHORT JUMP MANDATORILY FOR '%ELSE UI'). PJ(BR,L,I) %FINISH SETLAB(J) %UNLESS UIJ=3 %RETURNIF K=3; ! IE. FOR NULL %IF K=1 %THENSTART ; !WE HAVE %ELSE %START PUSH(SBR(LEVEL),I,0) %RETURN %FINISH !THEN WE HAVE %ELSE UI AP=AP+1; ! TO PT TO . UI SETLAB(I) %RETURN SW(17): !%SHORTROUTINE SR=LEVEL %RETURN SW(18): ! %JUMPS %SHORT JS=1 %RETURN SW(19): ! %JUMPS %NORMAL SR=-1; JS=-1 %RETURN SW(20): ! %LONG %JUMP LJS=LJS+1 %RETURN SW(21): ! %END SHOW TAGS; ! PRINT OUT TAGS OF NAMES IN SCOP SET LINE; ! UPDATE LINE COUNT CHECK JUMPS; ! CHECK LABELS NOT SET & RETURN NEWLINE J=RTP(LEVEL); !TYPE OF BLOCK 'END'ING J=J&15 %UNLESS J=-1 F GLOBLS IUSES0 DETAG; ! UNDECLARE NAMES, FAULT MISSING ONES I=J&7 ! PLANT STOP FOR FNS, EXCEPT FOR TRUSTED PROGS. %IF J>0 %AND I>0 %AND CHECKS&128=0 %THEN PPJ(8) %IF I=0 %THEN RETURN; ! PLANT RETURN CODE FOR RTS %IF J>=0 %THEN ->L701; ! GO UNLESS BEGIN-END BLOCK ! THEN IT WAS A BEGIN-END BLOCK DUMP(LOAD,13,PREVL); ! RESET TO OLD DISPLAY UNLOCK(INTER TO REG(1)) L701: ! CANCEL %SHORT %ROUTINE IF LEVEL CORRESPONDS TO !WHERE IT LAST APPEARED. SR=JS %IF LEVEL<=SR LEVEL=LEVEL-1; ! DECREMENT TEXTUAL LEVEL COUNT %IF LEVEL>=1 %THEN ->L703; ! NOT BACK AT OUTER LEVEL YET FAULT(14); ! EXCESS END ->L708; ! TREAT AS %ENDOFPROGRAM L703: %IF J>=8 %THENSTART LEVEL=LEVEL-1; ! BACK TO 0 FOR %EXT %IF LEVEL#0 %THENSTART; FAULT(14); LEVEL=0; %FINISH %RETURN %FINISH RAD=COT(STAR(LEVEL)); ! RESTORE OLD RAD FOR MORE DECLA TWSP=SAVETWSP(LEVEL) ! SET LABEL FOR JUMP ROUND RT, IF NECESSARY %IF J>=0 %AND CHECKS&128=0 %THEN SETLAB(BRT(LEVEL)) %RETURN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! %BEGIN ! SW(22): ! %BEGIN %IF LEVEL=0 %THENSTART; BTN=0; ! RESET BR TABLE AFTER PERM SPECS SETS(2); ! OBJECT STREAM %IF TARGET&8192=0 %START PRINTSTRING(" .GLOBL PERM,STB,SYSSTK MAIN: MOV ASSTK,SP MOV ASTB,R1 MOV R1,@R1 TRAP 9. ") OCTN(UNDER,0) PRINTSTRING(" SWT-. CT0-. ") CA=CA+16 %FINISHELSESTART HALFINTEGER(ADDR(BIN(MAIN)))<-CA-LASTCAREL+LASTRELADDR %C +HALFINTEGER(ADDR(BIN(MAIN))) ASSTK=CA+2 DBIN(112,2,7,1,0,SP,0) DBIN(112,2,17,-20,0,R1,0) DBIN(112,0,R1,0,1,R1,0) EM(9) OCTN(UNDER,0) SWTCA=CA OCT(CA-LASTCAREL+LASTRELADDR) CTCA=CA %IF CT0>0 %THEN OCT(CT0-(CA-LASTCAREL+LASTRELADDR)) %ELSE %C OCT(CA-LASTCAREL+LASTRELADDR) %FINISH %FINISH %IF LEVEL#0 %THEN COT(STAR(LEVEL))=RAD; !SAVE OLD STATIC STGE LEVEL=LEVEL+1; !UP TEXTUAL LEVEL SET LINE; ! UPDATE LINE CT PUSH(BDIAGSPTR,CA,-1) BLOCK ENTRY; ! OUTPUT CODE FOR BLOCK ENTRY TWSP=PDISP RAD=TWSP+TEMPS; ! ALLOW TEMPORIES AFTER DISPLAY TWSPLIM=TWSP + TEMPS SAVETWSP(LEVEL)=TWSP RTP(LEVEL)=-1; !FOR BEGIN..END BLOCKS %RETURN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! %ENDOFPROGRAM, %ENDOFFILE ! SW(24): ! %ENDOFFILE ! LEVEL MUST BE 0 WHEN %ENDOFFILE IS ENCOUNTERED IN EXT=-1; ! INDICATOR FOR TERMINATION OUTPUT %IF LEVEL#0 %THENSTART; FAULT(15); LEVEL=0; %FINISH F GLOBLS -> L709 SW(23): ! LEVEL MUST BE 1 WHEN %EOP IS ENCOUNTERED %IF LEVEL#1 %THENSTART; FAULT(15); LEVEL=1; %FINISH SHOW TAGS; ! PRINT OUT TAGS FOR NAMES IN SCO SET LINE; ! UPDATE LINE COUNT CHECK JUMPS; ! CHECK AND RETURN JUMP LIST ! CHECK JUMPS ALSO FILLS STATIC STORAGE INTO CONST TAB. F GLOBLS DETAG; !UNDECLARE NAMES %IF LEVEL#1 %THEN FAULT(15); ! TOO FEW ENDS L708: PPJ(5); ! %STOP IN PERM L709: CSIZE=CA//2 ! BT0 -------------------------------- BT0 ! I=(BTN+4)//5; ! NO OF ROWS WITH FIVE COLUMNS ! %CYCLE J=0,1,I-1 ! PRINTSTRING(";! ") ! %CYCLE K=0,1,4 ! L=J+I*K ! %IF L0 %THEN %START %CYCLE J=0,1,BTN-1 PRINTSTRING("; BT") WRIT(J) PRINTSTRING("=L") I=BAT(J) %IF I<0 %THEN PRINTSTRING("UNDEF") %ELSE OCT5(I) NEWLINE %REPEAT %FINISH PRINTSTRING("SWT: ") %IF SWTN=0 %THEN -> L910 %CYCLE I=-SWTSIZE,1,SWTN-SWTSIZE-1 %IF SWT(I)<0 %THENSTART;PRINTSTRING(" -1 ") -> L911 %FINISH PRINTSTRING(" L") OCT5(SWT(I)) PRINTSTRING("-. ") L911: %REPEAT L910: I=0 !-------------------------------- CT0 PRINTSTRING("CT0: ") L901: SPACE OCTS(COT(I)) PRINTSTRING(" ; ") WRIT(I); SPACE WRIT(COT(I)) PRINTSYMBOL('.') NEWLINE I=I+1 %IF I#CTN %THEN ->L901 PRINTSYMBOL(';') WRITE(FAULTS,1); ! NUMBER OF PROGRAM FAULTS PRINTSTRING(" FAULTS IN PROGRAM ") %IF REALS#0 %START %IF CHECKS&8=0 %THEN PRINTSTRING(" .GLOBL PLSH,LDF,FLT,STST .GLOBL STRF,ADDF,SUBF,NEGF,MULF,DIVF,EXIT,EXPF ") %ELSE PRINTSTRING("PLSH=460 LDF=464 FLT=470 STST=474 STRF=500 ADDF=504 SUBF=510 NEGF=514 MULF=520 DIVF=524 EXIT=540 EXPF=544 ") %IF EXPFFLAG=0 %THEN PRINTSTRING(".GLOBL $PWRR $PWRR: 777 ") %FINISH %IF IN EXT=0 %THEN %START %IF STRFLAG=0 %THEN PRINTSTRING(" .GLOBL RESCON RESCON: 777 ") %IF READFLAG=0 %THEN PRINTSTRING(" .GLOBL READ READ: 777 ") %IF REALS=0 %THEN PRINTSTRING(" .GLOBL INTPT1 INTPT1: 777 ") PRINTSTRING("ASTB: STB ASSTK: SYSSTK ") %FINISH PRINTSTRING("ENDCO: .END"); PRINTSTRING(" MAIN") %IF FAULTS=0 %AND IN EXT=0 NEWLINE %FINISHELSESTART SETS(6) HALFINTEGER(ADDR(BIN(SWTCA)))<-CA-LASTCAREL+LASTRELADDR %C -HALFINTEGER(ADDR(BIN(SWTCA))) %IF SWTN#0 %START %CYCLE I=-SWTSIZE,1,SWTN-SWTSIZE-1 %IF SWT(I)<0 %START OCT(-1) ->L915 %FINISH OCT(SWT(I)-CA) L915: %REPEAT %FINISH %IF ENDCO1#0 %THEN HALFINTEGER(ADDR(BIN(ENDCO1)))<-CA-LASTCAREL %C +LASTRELADDR %IF CT0=0 %START K=CA-LASTCAREL+LASTRELADDR DBIN(-2,18,K,0,0,0,0) HALFINTEGER(ADDR(BIN(CTCA)))<-K-HALFINTEGER(ADDR(BIN(CTCA))) %FINISHELSE K=CT0 K=K+(CTN+2)*2 HALFINTEGER(ADDR(BIN(ASSTK)))<-SYSSTK HALFINTEGER(ADDR(BIN(ENDCO)))<-K K=0 L=0 J=1 M=0 %CYCLE I=0,2,CA-2 %IF M=8 %THEN M=0 L912: %IF REL(J)_LINK=I %START ; ! RELOCATION ADDRESS ENCOUNTERED K=I L=REL(J)_RADDR J=J+1 M=0 ->L912 %UNLESS I-K+L=CT0 %FINISH %IF I-K+L=CT0 %AND CT0>0 %START L913: NN=0 %CYCLE N=0,1,CTN-1 %IF NN=8 %THEN NN=0 %IF NN=0 %START NEWLINES(2) OCTS(I-K+L+N*2) PRINTSYMBOL(':') %FINISH SPACES(5) OCTS(COT(N)) NN=NN+1 %REPEAT M=0 NEWLINES(2) OCTS(I-K+L+N*2+2) PRINTSTRING(": ") OCTS(SYSSTK) COT(CTN)=SYSSTK %IF CT0=-1 %THEN ->L914 %IF I=REL(J)_LINK %THEN ->L912 %ELSE ->L917 %FINISH %IF M=0 %START NEWLINES(2) OCTS(I-K+L) PRINTSYMBOL(':') %FINISH SPACES(5) OCTS(HALFINTEGER(ADDR(BIN(I)))) M=M+1 WK=I-K+L L917: %REPEAT %IF CT0=0 %START CT0=-1 L=L+2 ->L913 %FINISH L914: %IF CT0<=0 %START CT0=CA REL(J)_LINK=CA REL(J)_RADDR=CA J=J+1 %FINISH ST='' REL(J)_LINK=CA REL(J)_RADDR=CA REL(J+1)_LINK=-1 J=1 %WHILE REL(J+1)_LINK#-1 %CYCLE %IF REL(J)_RADDR=CT0 %START SCONST(0)=CT0 DUMP BIN(SCONST,0,CTN+1,ST,K) ->L916 %FINISH BINS(REL(J)_LINK>>1)<-REL(J)_RADDR DUMP BIN(BINS,REL(J)_LINK>>1,REL(J+1)_LINK>>1,ST,K) L916: J=J+1 %REPEAT BINS(0)=BINS(MAIN>>1+1) ST='END' DUMP BIN(BINS,0,0,ST,K) DUMP BIN(BINS,-1,200,ST,K) %FINISH SETS(3) ENDS %IF TARGET&4096#0 %START SETS(0) PRINTSYMBOL('*') %FINISH SETS(4); ! CLOSE FILES, SELECTS OP 99. ENDS SETS(5); ! QUIT %STOP; ! NOT CALLED, IN EMAS !============== %ROUTINE ENDS %INTEGER JJ SPACES(3); NEWLINE; !TO START TTY MOTOR PRINTSTRING(";STMTS FAULTS ;") WRITE(STMTS,4); WRITE(FAULTS,6); NEWLINE PRINTSTRING("; CODE CONSTS TOTAL (WORDS) ;") JJ=I+SWTN; !ADD SW TAB SIZE TO CONST TAB SIZE WRITE(CSIZE,4); WRITE(JJ,6); WRITE(JJ+CSIZE,5); %C PRINTSTRING %C (" (DEC) ;") OCT5(CSIZE); SPACES(2); OCT5(JJ); SPACE; OCT5(JJ+CSIZE) PRINTSTRING(" (OCT)") NEWLINE %RETURNUNLESS CHECKS&16#0 PRINTSTRING("; CYC OPNS CALLS ENTS SCS PJS ARADS") PRINTSTRING(" CTN") NEWLINE; PRINTSYMBOL(';') WRITE(CYCS,4); WRITE(OPNS,5); WRITE(CALLS,5); WRITE(ENTS,5) WRITE(SCS,5) WRITE(PJS,5) WRITE(ARADS,5) WRITE(CTN,5) NEWLINE %END; ! ENDS ! SW(25): ! %FAULT ! AR IS