! 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 <UI> 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 <SS> 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<<K ; ! PACK CHARACTER K=K-8; ! NEXT SHIFT IF K>=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<<J J=J+8 CH=CH+1 IF J<=8 THEN ->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<<PTEXTSHL; !COUNT OF CHARS IF A(1)=12 AND A(2)=6 THENSTART CYCLE CTN=CTN,1,CTN+((A(5)-CH)//2) COT(CTN)=0 REPEAT FINISH IF CH=0 AND A(5)&1=1 START; ! NULL STRING OF ODD LENGTH CTN=CTN+1 COT(CTN)=0 FINISH AP=AP+1 IF A(1)=12 AND A(2)=6 THEN A(AP)=CH ELSEC A(AP)=M RESULT =1 END; ! PTEXT INTEGERFN CONSTLIST INTEGER CPOINT INTEGER RF,I,J,CTR,SIGN,SCP,S,S1,RTP INTEGER TYPE,CNUM INTEGER SHL SHL=0 CNUM=0; ! TO BE NO OF LOGICAL ENTRIES IN CONST TABLE, ! IE. 1 INTEGER=1 ENTRY, 1 REAL=1 ENTRY IF T(TP)#'=' THENRESULT =0 TP=TP+1; CTR=0; ! OWN ARRAYS REL TO $(0) SCP=CTN; ! SAVE START POSITION IN CONST TABLE L6: RTP=TP; I=T(TP); SIGN=1; ! TEST IF CONSTANT SIGNED IF A(1)=12 AND A(2)=6 START IF (A(5)//2)*2=A(5) AND (CNUM//2)*2#CNUM THENC PTEXTSHL=8 ELSE PTEXTSHL=0 IF PTEXT=1 START CNUM=CNUM+1 ->L97 FINISH ->L98 FINISH IF I='+' THEN ->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 <CMARK> (COMMENT, M/C CODE, THE LATTER NOT BEING INTENDED! ! 6 <EXT><RT><SPEC> ! 8 %BEGIN ! 12 <OWN><TYPE><OWNDEC> ! 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<SC> 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 <SUI> IS %THEN%START OR %START ! THEN ALT OF <SUI> IS <UI><ELSE''>. SCCOND(I,J,MARK+1); ! COMPILE CONDITION AP=MARK+1; ! TO P<UI> UIJ=A(AP); ! ALT NO OF UI1 IF UIJ#4 THEN UI; ! UI1 UNLESS JUMP ! AP IS NOW PTG TO ALT OF <ELSE''>. ! 1:%ELSESTART 2: %ELSE UI12 3: NULL IF A(MARK2)=3 THEN ->L230; !JUMP IF ALT OF <ELSE''> 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 <ELSE''>. 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>. UI; ! UI2 SETLAB(J) UNLESS UIJ=4; ! LABEL FOR END OF UI2, NOT NEEDED IF UI1 ! WAS JUMP RETURN L220: ! ALT OF <SUI> IS %START SCCOND(I,J,MARK); ! SIMPLE CONDITION ! LEAVES I PTG TO ALT OF <ELSE''> 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): ! <TYPE> 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?> = %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 <NAMES> 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<ABP> 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 <NAMELIST> IF A(J)=1 THEN -> L405; ! JUMP BACK WHILE ALT OF NAMELIST IS ,<NAME> ! 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 <NAME>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 ,<NAME> 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 <BPS> - 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 <NAME> 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 <NAMES> 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<BP> 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 <CMARK> !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 <SC> 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 <SC> 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 <SC> 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 WK<I CYCLE K=2*K WK=WK+1 REPEAT ! SET NN=BYTE DISPL OF ACTUAL 1ST ELT IN CT NN=2*A(AP+1) LD ADDR(-1,15,NN-K); ! ADDR A(0) DUMP(STR,13,RAD); ! TO WORD 1 OF ARRAYHEAD LD ADDR(-1,15,2*(M-2)); ! ADDR(DOPEVECTOR) DUMP(STR,13,RAD+2); ! TO WORD 2 OF ARRAYHEAD STORE TAG(J,2,I,1,LEVEL,RAD) IF K>NN 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 <CONST> 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 <SWITCHLIST> 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); ! <NAME> 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):! <SWITCH LABEL>:<SS> 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 J<COT(I) OR J>COT(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 <ELSE''>. ! 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 <ELSE''> 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>. 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 L<BTN %THEN %START ! PRINTSTRING("BT") ! WRIT(L) ! PRINTSTRING("=L") ! %IF I<0 %THEN PRINTSTRING("UNDEF") %ELSE OCT5(BAT(L)) ! SPACE ! %FINISH ! %REPEAT ! NEWLINE ! %REPEAT ! NEWLINE !-------------------------------------- SWT IF TARGET&8192=0 START IF BTN>0 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 <CONST> <LABEL> UNLESS A(AP)=2 AND A(AP+1)=9 THEN FAULT(36); ! DAFT FAULTNO. UNLESS LEVEL<=2 THEN FAULT(26); ! ALLOW IN EXT RT. PPJ(34) AP=AP+3; ! TO <LABEL> PJ(BR,1,FINDLABEL); ! UNCONDITIONAL LONG JUMP RETURN SW(26): ! FORMAT DECLARATION ! %RECORD %FORMAT <NAME> ( <FMT ELT> <RESTOFFMTD> ) <SEP> FMT NAME=A(2); ! PTR TO FMT IDEN NRELTS=0 RDISP=0; ! REL DIPL OF ELT FROM START OF REC AP=3; ! TO ALT OF <FMT ELT> FMT ELT ! LEAVES AP PTG TO ENTRY FOLLOWING NULL ALT OF <NLIST> ! IE. TO ALT OF <RESTOFFORMATD> RFMTD STORE TAG(FMT NAME,7,7,NRELTS,LEVEL,0) RETURN !---------------------------------------------------------------------- SW(27): ! RECORDNAME DECLARATION ! %RECORD %NAME <NAME><NLIST> ( <NAME> ) <SEP> AP=2; ! TO <NAME> RAD=(RAD+1) & (-2) ! GO ALONG TO THE FORMAT NAME UNTIL A(AP-1)=2 THEN AP=AP+2 FMT NAME=A(AP); ! PTR TO FORMAT NAME K=TAG OF(FMT NAME) IF K=0 OR K>>8#X'77' START PRINTNAME(FMT NAME) FAULT(62); ! NOT FORMAT NAME RETURN FINISH AP=2; ! TO <NAME> UNTIL A(AP-1)=2 CYCLE STORE TAG(A(AP),1,7,0,LEVEL,(LINK(FMT NAME)<<16) ! RAD) RAD=RAD+2 AP=AP+2 REPEAT RETURN ! SW(28): ! %LIST SPECS=1 RETURN ! SW(29): ! %ENDOFLIST SPECS=0 RETURN ROUTINE FMT ELT ! ENTER WITH AP PTG TO ALT OF <FMT ELT> ! EXIT WITH AP POINTING TO ENTRY FOLLOWING NULL ALT OF <NLIST> INTEGER IRN,I,M,N,M2 IRN=A(AP); ! 1=INTEGER, 2=RECORDNAME, 3=BYTEINTEGER AP=AP+1; ! TO 1ST NAME IF IRN#3 AND RDISP&1#0 THEN RDISP=RDISP+1 UNTIL A(AP-1)=2 CYCLE M=A(AP); ! REC ELT IDEN PTR M2=TAG(M) I=LINK(FMT NAME) N=NEW CELL TAG(N)=TAG(M2)<<16 ! TAG1(M2); ! 1ST 4 CHARS OF NAME TAG1(N)=RDISP ! (IRN<<16) PUSH(RECELTS(LEVEL),0,M) LINK(FMT NAME)=N LINK(N)=I ! STORE TAG(A(AP),15,15,15,15,15); ! DUMMY ENTRY FOR REC ELT IF IRN=3 THEN RDISP=RDISP+1 ELSE RDISP=RDISP+2 AP=AP+2 REPEAT ! AP POINTS TO ENTRY FOLLOWING NULL ALT OF <NLIST> END; ! FMT ELT ROUTINE RFMTD ! ENTER WITH AP PTG TO ALT OF <RESTOFFORMATD> ! EXIT WITH AP PTG TO NULL ALT OF <RESTOFFORMATD> IF A(AP)=2 THEN RETURN AP=AP+1; ! TO ALT OF <FMT ELT> FMT ELT ! AP POINTS TO ALT OF <RESTOFFORMATD> RFMTD ! AP POINTS TO NULL ALT OF <RESOTOFFORMATD> END; ! RFMTD !--------------------------------------------------------------------- ROUTINE UI; ! UI UI UI UI UI UI UI UI UI UI UI UI UI UI ! COMPILE UNCONDITIONAL INSTRUCTION INTEGER I,J,K,L INTEGER LTYPE SWITCH SW(1:8) NORELT1=0; NORELT2=0 I=A(AP); ! NEXT ANALYSIS RECORD ENTRY AP=AP+1 ->SW(I) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! NAME APP ASS SW(1): ! NAME_NAME<ASSOP><RESTOFUI> SCF=3 SEXPR(K) RETURN SW(2): ! I=TAG OF(A(AP)); ! GET NAME TAG IF I=0 THEN FAULT(16); !NAME NOT SET J=AP; ! PRESERVE AP (PTG TO <NAME>. AP=AP+1 SKIP APP; ! SKIP TO <ASS> IF A(AP)=1 THEN ->L101; ! ASSIGNMENT STATEMENT ! DO NOT CHECK %EXT BIT IN TYPE FIELD IF (I>>8)&X'F7'=64 THEN ->L102; ! ROUTINE CALL IF I#0 THEN FAULT(17); !NOT RT NAME RETURN L102: AP=J; ! RESTORE INITIAL ANALYSIS RECOR RT; ! COMPILE ROUTINE CALL RETURN ! ! ASSIGNMENT L101: K=I>>12; ! 'FORM' OF NAME ON LHS IF K=4 START FAULT(29); !NAME NOT DESTN (LH=RT TYPE) I=0; ! CLEAR TAGS TO AVOID FURTHER DI FINISH !AP IS PTG TO ALT OF REST-OF-UI IF A(AP+1)<=2 THEN A(AP+1)=A(AP+1)!!3 ; ! SWOP '==' AND '=' AP=J; ! BACK TO PT TO <NAME>. SCF=2; ! INDICATE ASST. STMT. SEXPR(LTYPE) RETURN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SW(3): ! -> SWITCH I=AP; AP=AP+1 SEXPR(L) J=INTER TO REG(0) UNLOCK(0) TYPE CH(2,L); ! MUST BE INT J=TAG OF(A(I)) IF J=0 THEN ->L250 IF J>>12#8 OR J&255#16+LEVEL THEN ->L250 LD ADDR(3,15,2*TAG OFF(A(I))); ! TAG HAS NO OF WORDS FROM CT0 UNLOCK(3) PPJ(7) RETURN L250: FAULT(4); !NOT SW NAME RETURN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SW(4): ! -><LABEL> PJ(BR,1,FINDLABEL); ! SCAN LABELS & PLANT JUMP !VIA BRANCH TABLE RETURN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! %RETURN ! RTP(LEVEL)= <0 BEGIN-END BLOCK ! 0 RT BLOCK ! >0 FN, 1,2,3=BYTE, INT,REAL ! AND PLUS 8 FOR %EXTERNAL SW(5): ! %RETURN IF RTP(LEVEL)&7#0 THEN FAULT(30); !%RETURN CONTEXT RETURN; ! %RETURN CODE - INCORREC RETURN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SW(6): ! %RESULT= I=RTP(LEVEL) K=I&7; ! TYPE IF I<=0 OR K=0 THEN FAULT(31); ! RESULT CONTEXT SEXPR(J); ! COMPILE RESULT EXPRESSION IF J=6 START UNLOCK(INTER REG) D11A(MOV,1,R1,0,0,R0,0) ->L501 FINISH IF FLACC=0 THEN UNLOCK(INTER TO REG(0)) ELSE FLACC=0 L501: IF I&X'80'#0 THEN K=2; ! MAP RESULT MUST BE INTEGER TYPE CH(K,J); !CHECK & FAULT OR FLOAT AS REQD RETURN; ! LEAVE RESULT IN ACC & RET RETURN SW(7): ! %STOP PPJ(5) RETURN !----------------------------------------------------- SW(8): ! %PRINTTEXT PPJ(39) J=A(AP); ! PTR IN ARRAY COT K=0 CYCLE I=J,1,J+(COT(J)&255)//2 IF TARGET&8192=0 START PRINTSYMBOL(',') UNLESS K=0 OCTN(COT(I),1) K=K+1; IF K>9 THENSTART; NEWLINE; K=0; FINISH FINISHELSE OCT(COT(I)) REPEAT IF TARGET&8192=0 THEN NEWLINE CTN=J; ! RESET TO REMOVE CHARS FROM COT AP=AP+1 !---------------------------------------------------------------------- END; ! UI ROUTINE SEXPR(INTEGERNAME TYPE) ! COMPILE ARITHMETIC EXPRESSION & RETURN TYPE FOUND ! NORMALLY AP PTS TO ALT OF <PLUS''>, BUT IF SCF=2 IT PTS TO ! <NAME> IN <NAME><APP><RESTOFUI> (AS CALLED FROM UI(1), ASSIGNMENT ! STATEMENT. ! ENTERED WITH AP POINTING TO ALT OF <PLUS''> ! EXIT WITH AP POINTING TO ALT OF THE PHRASE WHICH FOLLOWS <EXP>. ROUTINESPEC STRING(INTEGER DEST,L,N) INTEGERFNSPEC REAL TO CT(INTEGER X,Y) ROUTINESPEC TRY FLT(INTEGERNAME TYPE, INTEGER TPVALUE, C INTEGERARRAYNAME TST,PST) ROUTINESPEC PPRINT ROUTINESPEC OPT ROUTINESPEC TORP(INTEGER I) ROUTINESPEC SOAP(INTEGER I,J) ROUTINESPEC OPN(INTEGER OP,L) INTEGERFNSPEC PSEVAL ROUTINESPEC EVAL(INTEGER P) ROUTINESPEC DESC(INTEGER RPP) INTEGERFNSPEC TYP(INTEGER RPP) INTEGER SSCF; SSCF=SCF INTEGER E2Z INTEGER RPP,APP,STPTR INTEGERARRAY AP POS(1:64) INTEGERARRAY RP0,RP,PT,NP,F,OP,STMARK(1:64); !REVERSE POLISH POINTER/TYPE !-------------------- BODY OF RT SEXPR --------------- !AP PTS TO ALT OF <PLUS''> IN PHRASE EXP ! FLOAT & OPERATOR STACK ARRAYS STPTR=0 E2Z=0 RPP=1; ! RP POINTER TORP(0); ! EXPR TO REV POL, 0=OP STACK BA !IF SCF WAS 2 OR 3, TORP HAS CHANGED IT TO 0 PPRINT IF SCF=0 THEN ->L1; ! NOT PART OF A SIMPLE CONDITION SCF=0; ! RESET FLAG COMP=A(AP); ! COMPARATOR NUMBER IF A(AP+5)=0 AND A(AP+7)=2 THEN ->L2; ! 2ND EXPRESSION 0 AP=AP+1 TORP(0); ! 2ND EXPRESSION TO REVERSE POLI RP(RPP)=19; ! CODE FOR CMP I.E. (1ST-2ND) PT(RPP)=1; ! FLAG=OPERATOR NP(RPP)=0 RPP=RPP+1; ! INCREMENT RP POINTER ->L1 L2: E2Z=E2Z+1 AP=AP+6; ! SKIP 0 EXPR IN ANALYSIS RECORD RP(RPP)=35; ! OPERATOR = TST PT(RPP)=1; ! FLAG=OPERATOR RPP=RPP+1 L1: APP=AP; ! SAVE FINAL ANAL REC POINTER IF NORELT1=0 AND RPP>2 START NORELT1=RP(1); ! POINTER TO ALT OF <UI> FOR RECORDS NORELT2=RP(2) FINISH TYPE=PSEVAL; ! PSEUDO-EVALUATE EXPRESSION IF TYPE=6 THENSTART PPRINT STPTR=1 STRING(0,1,RPP-1) RETURN FINISH OPT EVAL(RPP-1); ! DUMP CODE FOR EXPR EVALUATION IF E2Z#0 THEN UNLOCK(INTER REG) IF TYPE=3 AND SSCF=1 AND FLACC=1 THEN FLACC=0 AP=APP; ! RESTORE FINAL ANAL REC POINTER RETURN !------------ END OF BODY OF ROUTINE SEXPR ---------------- ROUTINE STRING(INTEGER DEST,L,N) INTEGER FINOP,I,J,K,M,MAX1,MAX2,P,JMP,BRANCH STRFLAG=1 IF DEST=0 AND (RP(N)<30 OR PT(N)<0) AND (RP(N)#19 C OR PT(N)<0) THEN DEST=1 BRANCH=0 P=2 JMP=0 MAX1=0 MAX2=0 K=L FINOP=RP(N) IF DEST=1 THENSTART ! PUT STRING ON TEMP L=L-1 M=0 ->FIRST FINISH CYCLE I=1,1,N-1 IF PT(I)>0 AND RP(I)=18 THEN RP(I)=12; !CHANGE '-' TO '.' REPEAT FIRST: I=PT(K); ! TYPE OF OPERAND IF I=-9 THENSTART; ! STRING ARRAY AP=RP(K) MAX1=LINK(LINK(A(AP))) MAX1=TAG(MAX1) ARRAD(1,J) ->SECOND FINISH IF I=-8 THENSTART; ! STRING J=RP0(K)<<13!RP(K) ->SECOND FINISH IF I=-10 THENSTART; ! STRING CONST. J=X'E000'!(RP(K)*2) ->SECOND FINISH IF I=-5 THENSTART; ! CONST. J=RP(K) IF J<0 THEN J=J*(-1) ->SECOND FINISH IF I=-1 OR I=-2 THENSTART; ! MAP/FN OPN(0,K) ! STORE RESULT IN R3 UNLESS OP IS == D11A(MOV,0,R0,0,0,R3,0) UNLESS FINOP=37 UNLOCK(0) J=3 ->SECOND FINISH IF I=1 AND RP(K)=35 THENSTART; ! %IF A='' %THEN _______ FINOP=40 J=0 ->SECOND FINISH WRITE(K,1);WRITE(I,1);NEWLINE FAULT(58) RETURN SECOND: K=K+1 IF K>L+1 THEN ->TRAP1 IF J=3 THENSTART; ! ARRAY D11A(MOV,0,R3,0,0,R2,0); !MOVE ELEMENT ADDRESS TO R2 INCASE SECOND !STRING IS ARRAY M=2 FINISHELSE M=J MAX2=MAX1 ! M HAS TAGS FOR FIRST OPERAND , J FOR SECOND OR ONLY ! TEST %IF A->(B).C IF FINOP=39 OR (FINOP=19 AND COMP=8) THENSTART IF STMARK(1)=2 THENSTART J=0 L=L-1 ->TRAP1 FINISH FINISH ->FIRST TRAP1: ! CHECK TYPE OF STRING OPERATION & DUMP CODE OR TRAPS & ! MAXIMUM LENGTHS AS REQUIRED. (INIT.) IF K>L+2 THEN ->TRAP2 IF FINOP=19 THEN FINOP=40; ! <IU> IF PT(N)<0 THEN FINOP=30 IF WS#0 THEN UP STACK PTR(WS) IF FINOP<=30 OR FINOP=38 THEN PPJ(40) IF FINOP=39 THEN PPJ(44) IF FINOP=37 THENSTART IF J#3 THENSTART; ! S==S1 DUMP(LOAD,RP0(2)&7,RP(2)) DUMP(STR,RP0(1)&7,RP(1)) DUMP(LOAD,RP0(2)&7,RP(2)+2) DUMP(STR,RP0(1)&7,RP(1)+2) FINISHELSESTART; ! S==STRING(ADDR(A(0))) PAR1(0)=X'3040' DUMP(STR,RP0(1)&7,RP(1)) FINISH RETURN FINISH IF FINOP=40 THENSTART IF COMP=8 THEN PPJ(47) ELSE PPJ(49) FINISH OCTN(M,1); ! FIRST OPERAND IF TARGET&8192=0 THEN PRINTSYMBOL(',') IF M<6 AND M>0 THENSTART IF MAX2=0 THEN MAX2=255;OCTN(MAX2,1) IF TARGET&8192=0 THEN PRINTSYMBOL(',');FINISH OCTN(J,1); ! SECOND OPERAND IF J<6 AND J>0 THENSTART;PRINTSYMBOL(',') IF TARGET&8192=0 IF MAX1=0 THEN MAX1=255;OCTN(MAX1,1);FINISH NEWLINE IF TARGET&8192=0 TRAP3: ! CHECK FOR SUB-EXPESSION ->L3 IF K>N IF K<N THENSTART M=0 IF FINOP=39 OR (FINOP=40 AND COMP=8) THENSTART IF STMARK(STPTR)=K THENSTART STPTR=STPTR+1 CYCLE I=K,1,N IF PT(I)<0 THEN M=M+1 IF PT(I)>0 AND RP(I)=30 THENSTART IF M>1 THEN ->L1 RP(I)=12 ->L4 L1: ! FIND FIRST OPERAND OF SUB-EXPRESSION IF PT(K)=1 THEN K=K+1 ELSE ->L2 ->L1 L2: ! COMPILE SUB-EXPRESSION STRING(1,K,I) K=I+1 J=0 ->TRAP2 FINISH REPEAT FINISH FINISH FINISH L4: IF PT(K)>0 THENSTART IF RP(K)=12 THENSTART; ! IGNORE '.' K=K+1 ->TRAP3 FINISH L3: ! PLANT TERMINATING TRAPS & LABEL FOR CONDITIONS IF FINOP<=30 THEN PPJ(42) IF FINOP=38 THEN PPJ(43) IF FINOP=39 THEN PPJ(46) IF FINOP=40 THENSTART IF COMP=8 THENSTART PPJ(48) IF JMP#0 THEN SETLAB(JMP) FINISHELSE PPJ(50) FINISH IF WS#0 THEN UP STACK PTR(-WS) RETURN FINISH ->FIRST TRAP2: ! DUMP INTERMEDIATE TRAPS & JUMPS FOR CONDITIONS IF FINOP=39 OR (FINOP=40 AND COMP=8) THENSTART P=P+1 IF P=3 AND COMP=8 THENSTART P=P-2 IF JMP=0 THEN JMP=BT NEXT BRANCH=1 FINISH PPJ(45) FINISHELSE PPJ(41) OCTN(J,1) IF J<6 AND J>0 THENSTART;PRINTSYMBOL(',') IF TARGET&8192=0 IF MAX1=0 THEN MAX1=255;OCTN(MAX1,1);FINISH NEWLINE IF TARGET&8192=0 IF BRANCH=1 THENSTART PJ(120,0,JMP) BRANCH=0 FINISH IF K=N THEN ->L3 ->TRAP3 END ROUTINE PPRINT INTEGER I,J,NAME,LH,RH RETURN UNLESS DIAGS#0 SETS(2) PRINTSTRING(" RP PT ") -> L5 IF RPP=1 CYCLE I=1,1,RPP-1 WRITE(I,2) J=PT(I) UNLESS -4<=J AND J<=-1 THEN WRITE(RP(I),4) ELSESTART SPACE; HEX4(RP0(I)); SPACE LH=RP(I)>>16 RH=RP(I)&X'FFFF' HEX4(LH) HEX4(RH) FINISH WRITE(J,4) IF J=-4 OR J=-7 THEN START NAME=NP(I) PRINTSTRING(" SCALAR ") PRINTNAME(NAME) IF 0<=NAME AND NAME<=NNAMES FINISH NEWLINE REPEAT L5: END; ! PPRINT ROUTINE OPT ! TO BE CALLED ONLY AFTER PSEVAL HAS FIXED TAGS IN RP. ! PICKS OUT N=N+1, N=N-1, N=0 ! RPP PTS TO ONE BEYOND LAST USED HOLE IN RP/PT. INTEGER K; K=0 INTEGER I PPRINT IF CHECKS&4=0 AND RPP>2 THENSTART IF PT(1)=-3 AND PT(2)=-3 THENSTART CYCLE I=RP(1),1,RP(2)-4 ->DIFF UNLESS A(I)=A(I+RP(2)-3) REPEAT ! ARRAY ELEMENTS AGREE CYCLE I=1,1,RPP-1 IF RP(I)=30 THEN RP(I)=34 REPEAT DIFF: FINISH FINISH CYCLE I=1,1,RPP-1 RETURNIF PT(I)=-7 AND (TAG OF(POINT1(RP(I)))>>8)&7=7 REPEAT RETURN IF (RP0(1)>>8)&15#2; ! NOT INTEGER TYPE IF RPP#6 THEN->L4 IF RP(5)=30 AND PT(5)=1 ANDC RP(1)=RP(2) AND PT(1)=PT(2) ANDC PT(4)=2 THENSTART ! PICKING OUT A=A + <SOMETHING> ! A=A - <SOMETHING> IF RP(3)=1 AND PT(3)=-5 THENSTART ! A=A+1, A=A-1 IF RP(4)=10 THEN K=31; !INC IF RP(4)=11 THEN K=32 ; !DEC -> L6 FINISH IF RP(4)=10 OR RP(4)=11 OR RP(4)=6 THENSTART ! ADD, SUB OR BIS ! A=A+B, A=A-B, A=A!B RP0(2)=RP0(3) RP(2)=RP(3) PT(2)=PT(3) NP(2)=NP(3) I=RP(4) I=12 IF I=6 RP(3)=I + 10; ! OPERATOR IS 20,21 OR 22 PT(3)=1 RPP=4 -> L85 FINISH FINISH L4: IF RPP#4 THEN -> L6 IF RP(3)=30 AND PT(3)=1 ANDC RP(2)=0 AND PT(2)=-5 THEN K=33; !CLR L6: -> L9 IF K=0 RPP=3 RP(2)=K PT(2)=1 L85: PPRINT L9: END; ! OPT ROUTINE TORP(INTEGER I) ! TRANSFORM EXPRESSION TO REVERSE POLISH ! ENTERED WITH AP PTG. TO ALT. OF <PLUS''> IN <PLUS''><OPND><EXP>. SWITCH TORS(1:4) INTEGER J,K,AP OPND K=I; !SAVE INITIAL OP STACK PTR. IF (K>0 AND (OP(1)=39 OR COMP=8)) ORC (STPTR>0 AND RPP>1) START IF A(RP(1))=2 START IF TAG OF(A(RP(1)+1))>>8&7=6 START K=K+1 OP(K)=30 FINISH FINISH FINISH IF SCF>=2 THENSTART !FRIG ASSIGNMENT OPERATOR INTO STACK OP(1)=30 K=1; !HORRIBLE FRIG HERE. AP PTS TO <NAME> BUT EVAL NEEDS TO !HAVE PTR TO <OPND>. BUT AP-1 PTS TO ALT OF UI. !EVAL WILL THINK IT''S ALT OF <OPND>. AP OPND=AP-1 SOAP(AP OPND,0) AP=AP+1 AP=AP+1 IF SCF=3 SKIP APP IF SCF=2 START ! SKIP APP A(AP OPND)=2; ! MAKE ALT OF '<OPND>' 2=NAME FINISH ELSE A(AP OPND)=1; ! MAKE ALT OF '<OPND>' 1=NAME_NAME ! AP NOW POINTS TO ALT OF <ASSOP> IF SCF=3 AND A(AP+1)<=2 THEN A(AP+1)=A(AP+1)!!3 IF A(AP+1)>1 THEN OP(1)=OP(1)+A(AP+1)+5 AP=AP+2; ! PAST ASSOP AND RESTOFUI TO ALT OF <PLUS''> SCF=0 FINISH AP=AP+1 J=A(AP); ! <+-?> AP=AP+1; ! TO PT TO ALT OF <OPND> IF J=1 OR J=4 THEN ->L1; ! '+' OR 'NULL' ALTERNATIVES J=J+10; ! CODES FOR UNARY '-' & '¬' OPER L6: ! ! PICK OUT '-INTEGER CONST' HERE, NEGATNG CONST. ! OTHERWISE INCREMENT OPERATOR STACK PTR & STACK OPERATOR. ! IF J=12 AND A(AP)=3 AND A(AP+1)=2 THEN C A(AP+2)=-A(AP+2) ELSE START K=K+1 OP(K)=J FINISH L1: J=A(AP); ! ALT OF <OPND> ! 1:RECNAME_RECELT 2:NAME-APP 3:CONST 4:SUB-EXPR IF J#4 THEN SOAP(AP,0); ! STORE ANAL REC POSITION OF OPE -> TORS(J) TORS(1): ! RECNAME_REC ELT AP=AP+3; ! PAST RENAME IDEN AND RECELT IDEN -> L4 TORS(2): ! NAME-APP AP=AP+2; ! POINTER TO <APP> SKIP APP; ! POINTER TO <EXPR> ->L4 ! TORS(4): ! SUB-EXPRESSION STPTR=STPTR+1 STMARK(STPTR)=RPP STMARK(STPTR+1)=0 AP=AP+1; ! TO PT TO ALT OF <PLUS''> IN SUB-EXPR TORP(K); ! SUB-EXPR TO REV POL, K=OP STAC ->L4 ! TORS(3): ! CONST. AP=AP+4; ! SKIP <CONST>, LEFT ON <EXPR> IF A(AP-3)>3 THEN AP=AP-2; ! STRING CONST. L4: IF A(AP)=2 THEN ->L5; ! END OF EXPR OR SUB-EXPR (NULL ALT OF <EXP>) J=A(AP+1); ! <OP> AP=AP+2; ! ON <OPERAND> L7: IF K=I OR PREC(J)>PREC(OP(K)) THEN ->L6; ! OPERATOR STACK ! EMPTY ! OR NEW OPERATOR HAS HIGHER PRECEDENCE. SOAP(OP(K),1); ! UNSTACK TOP OPERATOR K=K-1; !USED TO BE DONE IN SOAP... ->L7 ! ! END OF SUB-EXPRESSION. L5: AP=AP+1; ! POINTER AFTER EXPRESSION L8: IF K=I THENRETURN ; ! ALL OPERATORS UNSTACKED SOAP(OP(K),1); ! UNSTACK OPERATOR K=K-1; !USED TO BE DONE IN SOAP... ->L8 END; ! TORP ROUTINE SOAP(INTEGER I,J) ! STORE IN RP & PT ARRAYS, I=ANAL REC PTR , J= OP/OPD FLAG IF RPP<=31 THEN ->L1; ! STILL ROOM FAULT(68); ! EXPR TOO LONG RPP=1; ! TRY AND CONTINUE L1: RP0(RPP)=0 RP(RPP)=I; ! STORE OP/OPD PT(RPP)=J; ! STORE FLAG NP(RPP)=0 RPP=RPP+1; ! NEXT POSITION !FOLLOWING IS NOW DONE IN TORP, AFTER BRINGING SOAP OUTSIDE TORP. !%IF J#0 %THEN K=K-1; ! DECREMENT OP STACK POINTER FOR END; ! SOAP !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! INTEGERFN PSEVAL ! PSEUDO-EVALUATION, CHECKING, FINDING FLOAT POSITIONS INTEGER TP,PRP,I,J,K,KK,II,JJ,CONSTTYPE INTEGERARRAY TST,PST(1:64); !TYPE AND POINTER FOR PSEUDOEVAL CONSTTYPE=0 TP=0; ! TST & PST STACK POINTER PRP=1; ! RP POINTER ! ! DEAL WITH OPERAND L10: I=RP(PRP); ! ANAL REC POSITION OF NEXT OPERAND ! 1=RECNAME_RECELT 2=NAME 3=CONST IF A(I)=2 THEN ->L1; ! OPERAND = <NAME> IF A(I)=1 THEN -> REC ELT ! ! CONST J=A(I+2); ! CONST VALUE L=A(I+3); ! REAL CONST I=A(I+1); ! CONST TYPE IF I>3 THENSTART; ! STRING CONST RP(PRP)=I ; ! POINTER TO POSITION IN CT PT(PRP)=-10 I=6 IF CONSTTYPE=1 THEN TST(1)=6 ->L2 FINISH IF I=3 THENSTART; ! REAL CONST PT(PRP)=-6 ! PUT VALUE IN CONST TABLE, DISPLACEMENT (BYTES) IN BOTTOM ! 16 BITS OF RP, WITH 'LEVEL'=7 K=REAL TO CT(J,L) RP0(PRP)=7 RP(PRP)=K<<1 FINISH ELSE START !INTEGER CONST IF J=0 AND PRP=1 AND RP(RPP-1)=19 C AND PT(RPP-1)>0 START; ! 1ST EXPRESSION 0 RP(RPP-1)=35 PRP=2 TORF=1 ->L10 FINISH RP(PRP)=J PT(PRP)=-5 CONSTTYPE=PRP FINISH -> L2 ! REC ELT: AP POS(PRP)=I NP(PRP)=A(I+1); ! RECORD NAME POINTER K=TAG OF(A(I+1)); ! RECORD NAME TAG WORD (X'1701') KK=TAG OFF(A(I+1)); ! LH16=PTR TO FMT TAGS RH16=RECNAME DISP IF KK>5 THEN REC DISP(I,K,KK,II) ELSESTART K=TAG OF(LINK(A(I+1))) KK=TAG OFF(LINK(A(I+1))) REC DISP(I,K,KK,II) KK=TAG OFF(A(I+1)) FINISH -> L4 ! ! NAME L1: AP POS(PRP)=I NP(PRP)=A(I+1); ! NAME POINTER K=TAG OF(A(I+1)); ! POINTER TO NAME TAG WORD KK=TAG OFF(A(I+1)) IF K#0 THEN ->L3 PRINTNAME(A(I+1)) FAULT(16); !NAME NOT SET K=X'0200'; ! SET TYPE AS INTEGER TO AVOID D KK=14; ! JUST TO BE > 6 -> L4 L3: ! TURN RECORDNAME TO INTEGER TO ALLOW ASSIGMENT TO IT IF K>>8=X'17' START K=(K&X'FF') ! X'1200'; ! FORM,TYPE ETC KK=KK&X'FFFF'; ! 'AND' OFF DISP FOR RECORDNAME FINISH J=K>>12; ! 'FORM' OF NAME IF J>1 THEN ->L5; ! NOT SCALAR ! ! SCALAR IF A(I+2)=1 THEN FAULT(19); ! SCALAR HAS PARAMS L4: RP0(PRP)=K; ! STORE NAME TAGS RP(PRP)=KK ! REGISTER TYPE IF 'DISP' FIELD IS LESS THAN 6 IF KK<6 THEN PT(PRP)=-7 ELSE PT(PRP)=-4 IF K>>8&7=6 START PT(PRP)=-8 IF CONSTTYPE=1 THEN TST(1)=6 FINISH -> L6 L5: RP(PRP)=I+1; ! STORE POINTER TO <NAME> IF J>=4 THEN ->L7; ! ROUTINE/FN/MAP 'FORM' ! ! ARRAY ELT ! SPECIAL ASSIGNMENT TO UNSUBSCRIPTED ARRAY NAME. IF K>>8&7=6 START; ! STRING ARRAY ELEMENT PT(PRP)=-9 IF CONSTTYPE=1 THEN TST(1)=6 ->L6 FINISH IF CHECKS&64#0 AND A(I+2)=2 THENSTART K=K&X'FFF'; ! SET FORM TO SCALAR -> L4 FINISH II=LINK(LINK(A(I+1))) IF CHECKS&4=0 THENSTART ; ! ARRAY BOUND CHECKING OFF IF II&X'8000'#0 THENSTART ; ! CONSTANT BOUNDED ARRAY IF A(I+8)=0 AND A(I+9)=2 THENSTART ; ! CONSTANT ! ARRAY ELEMENT K=K&X'FFF' ;! SET FORM TO SCALAR JJ=(K&X'0F00')>>8 IF TAG1(II&X'7FFF')#0 THEN K=K!15 II=TAG(II&X'7FFF') KK=II+(A(I+7)<<(JJ-1)) ->L4 FINISH FINISH FINISH PT(PRP)=-3; ! FLAG AS 'ARRAY' ELEMENT ->L6 L7: ! TYPE FLD IS 0 FOR ROUTINE FORM: IF K>>8&15#0 THEN ->L8; ! NOT A ROUTINE NAME FAULT(23); !RT NAME IN EXPR K=X'0200'; ! SET AS INTEGER TO AVOID DIAGNO ->L4 ! ! FUNCTION/MAP L8: IF K>>12=4 THEN I=-2 ELSE I=-1 ! I IS -2 FOR FN, -1 FOR MAP PT(PRP)=I; ! FLAG AS 'FUNCTION' OR 'MAP' L6: I=K>>8&7; ! 'TYPE' OF NAME ! FOR %EXTERNAL, 8-BIT IS SET IN TYPE FIELD. ! ! HERE OPERAND HAS BEEN DEALT WITH L2: TP=TP+1; ! INCREMENT STACK POINTER TST(TP)=I; ! STACK 'TYPE' OF OPERAND L12: PST(TP)=PRP; ! STACK POINTER TO REV POL ARRAY F(PRP)=0; ! SET TO 'NO FLOAT' (MAY BE OVER ! ! PROCEED TO NEXT RP/PT ENTRY PRP=PRP+1 IF PRP=RPP THENRESULT =TST(1); ! END OF RP ARRAY, ! RESULT=TYPE IF PT(PRP)=0 THEN ->L10; ! OPERAND NEXT ! ! OPERATOR NEXT I=RP(PRP); ! TYPE OF OPERATOR IF I<12 OR I=19 OR I=30 OR I>=36 THEN ->L11; ! BINARY OPERATORS IF TST(TP)<=2 OR TST(TP)=6 THEN ->L12; ! INTEGER OPERAND ON 'TYPE' STAC ! ! THEN OPERAND IS REAL IF I=12 THEN ->L13; ! UNARY '-' ! IF OPERATOR IS TST, ITS THE FINAL OPERATOR AND WE DONT WANT IT ! FOR REAL OPERAND, SO GET OUT IF I=35 THEN START RPP=RPP - 1 RESULT=TST(1) FINISH FAULT(24); !REAL VARIABLE TST(TP)=2; ! TYPE TO INTEGER TO AVOID DIAGS ->L12 L13: RP(PRP)=18; ! CHANGE OPERATOR TO '-' FLOATIN ->L12 ! ! BINARY OPERATOR I=OPERATOR NO. L11: TP=TP-1; ! DECREMENT 'TYPE' STACK POINTER PT(PRP)=PST(TP); ! FILL IN POINTER TO POSITION OF OPERAND IN RP STACK J=TST(TP); ! 'TYPE' OF 1ST OPERAND K=TST(TP+1); ! 'TYPE' OF 2ND OPERAND ! ! PST(TP) PTS TO OPERAND 1 AND J=TYPE ! PST(TP+1) PTS TO OPERAND 2 AND K=TYPE ! IF AT LEAST ONE OF THE OPERANDS IS REAL, CHECK IF EITHER ! IS AN INTEGER CONST, AND IF SO, FLOAT IT AND PUT IT IN ! THE CONST TABLE. ! ! IF K=6 OR J=6 THEN ->L12 IF J>2 OR K>2 OR I=8 THENSTART TRY FLT(J,TP,TST,PST) TRY FLT(K,TP+1,TST,PST) FINISH IF I=8 THEN ->L15; ! '/' - BOTH OPERANDS FLOATING IF J<=2 AND K<=2 THEN ->L12; ! BOTH OPERANDS INTEGER TYPE ! THEN AT LEAST ONE OPERAND IS REAL IF I=19 THEN RP(PRP)=11; ! CHANGE CMP->SUB (LATER TO BECOME SUBF) IF I=30 THENSTART; ! MOVE IF J=3 AND K<=2 THEN F(PST(TP+1))=1; !FLT FOR 1ST OPND IF J<=2 AND K=3 THEN FAULT(24) -> L12 FINISH IF I>6 THEN ->L16; ! OPERATORS CAN HAVE FLOATING OP FAULT(24); !REAL OPERAND TST(TP)=2; ! SET TYPE TO INTEGER TO AVOID DIAGS ->L12 L16: IF I=7 THEN ->L17; !'**' RP(PRP)=RP(PRP)+6; ! CHANGE OPERATOR TO 'FLOATING' FORM ! ! REAL DIVIDE L15: IF J<=2 THEN F(PST(TP))=1; ! SET 'FLOAT' FLAG FOR 1ST ! OPERA IF K<=2 THEN F(PST(TP+1))=1; ! SET 'FLOAT' FLAG FOR 2ND ! OPERA TST(TP)=3; ! 'TYPE' OF RESULT = FLOATING ->L12 ! ! EXPONENTIATE L17: IF J=3 THEN RP(PRP)=14; ! FLOATING EXP OPERATOR ->L12 END; ! PSEVAL INTEGERFN REAL TO CT(INTEGER X,Y) ! TO BE PROGRAMMED DIFFERENTLY ON SYSTEM 4. ! PARAM IS PDP-11 REAL IN TWO 16-BIT INTEGERS. INTEGER I I=CT NEXT COT(I)=X COT(CTNEXT)=Y RESULT=I END; ! REAL TO CT ! ! ROUTINE TRY FLT(INTEGERNAME TYPE, INTEGER TPVALUE, C INTEGERARRAYNAME TST,PST) INTEGER W W=PST(TPVALUE) IF TYPE=2 AND PT(W)=-5 THENSTART FLT11(RP(W)) RP0(W)=7 RP(W)=REAL TO CT(FLIT,FLOT)<<1 PT(W)=-6 TYPE=3 TST(TPVALUE)=3 FINISH END; ! TRY FLT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ROUTINE EVAL(INTEGER P) ! P IS A POINTER IN THE RP/PT/NP ARRAYS ! DUMP CODE FOR EVALUATION OF EXPRESSION INTEGER I,J,K,L INTEGER LTWSP; LTWSP=0 I=PT(P); ! POINTER/TYPE OF LAST REV POL E IF I<0 THEN ->L1; ! OPERAND ! OPERATOR I PTS TO OPERAND1 ! OPERAND2 IS THE ONE PTD TO BY P-1 J=RP(P); ! OPERATOR K=P-1; ! START OF 2ND OPERAND IF UCN(J)>1 THEN ->L2; ! BINARY OPERATOR ! ! UNARY OPERATOR IF J=34 THENSTART EVAL(K) IF FLACC=0 THEN MAA(0,ACC,6,R3) ELSESTART AD(3); OCODE(0,6); FINISH ->L4 FINISH IF 33>=J AND J>=31 THENSTART ; !UNARY OP ON CORE OPN(J,K) ->L4 FINISH EVAL(K); ! DUMP CODE TO EVALUATE OPERAND J=OPR(J) !(NEGF %ELSE NEG OR NOT OR TST). IF J=12 THEN AD(12) ELSESTART IF TYPE=1 THEN J=J!256 DUMP(J,0,0) FINISH ->L4 ! ! BINARY OPERATOR J HAS OPERATOR NO. L2: IF RP(K)=12 AND PT(K)=1 AND PT(K-1)=-5 THENSTART K=K-1 RP(K)=-RP(K) FINISH ! ! IS OPERATOR A 'STORE'? IF 20<=J AND J<=30 THENSTART EVAL(K); ! EVALUATE 2ND OPN(J,I); ! STORE IN FIRST/ADDS, SUBS, BISS TO FIRST ->L99 FINISH ! ! IS OPERATOR '==' ? IF J=37 START IF P#3 START; FAULT(81); RETURN; FINISH IF PT(1)#-7 START IF RP0(1)&X'1000'=0 START; FAULT(82); RETURN; FINISH FINISHELSESTART IF (TAG OF(LINK(A(NORELT1+1)))>>8)&7=7 ANDC A(NORELT1)#1 START LOSE(RP(1)) RP(1)=TAG OFF(A(NORELT1+1))&X'FFFF' PT(1)=-4 FINISH FINISH IF PT(2)=-7 AND (TAG OF(LINK(A(NORELT2+1)))>>8)&7=7 ANDC A(NORELT2)#1 START LOSE(RP(2)) RP0(2)=RP0(2)!X'1000' RP(2)=TAG OFF(A(NORELT2+1))&X'FFFF' PT(2)=-4 FINISH IF RP0(2)=0 THEN L=TAG OF(A(RP(2))) ELSE L=RP0(2) IF (L>>8)&7#(RP0(1)>>8)&7 START; FAULT(83); RETURN; FINISH RP0(1)=RP0(1)&X'0FFF' UNLESS NORELT1>0 AND A(NORELT1)=1 IF L&X'1000'#0 AND A(NORELT2)#1 AND PT(2)#-3 C THEN DUMP(LOAD,RP0(2)&15,RP(2)) ELSESTART IF PT(2)<(-3) AND L&X'1000'=0 THENC LD ADDR(-1,RP0(2)&15,RP(2)) ELSESTART EVAL(K) IF PT(2)>=-3 THEN PAR1(0)=PAR1(0)&7!ENCODE(6) ELSESTART UNLESS RP(2)>X'FFFF' START ! CHANGE INDIRECT TO DIRECT FOR RECORDS UNLESS %RN_%RN IF (NORELT2>0 AND A(NORELT2)=2) C OR TAG OFF(TAG OFF(A(NORELT2+1))>>16)>>16#2 START IF (PAR1(0)>>7)&15=7 THEN PAR1(0)=PAR1(0)-X'80' IF (PAR1(0)>>7)&15=10 THEN PAR1(0)=PAR1(0)-X'80' FINISHELSESTART IF (PAR1(0)>>7)&15=6 THEN PAR1(0)=PAR1(0)+X'80' IF (PAR1(0)>>7)&15=9 THEN PAR1(0)=PAR1(0)+X'80' FINISH FINISH FINISH FINISH FINISH PAR3(0)=0 OPN(J,I) ->L99 FINISH ! IF J=19 THEN ->L9; ! CMP IF PT(I)>=-3 OR F(I)#0 THEN ->L6; ! 1ST OPERAND A NODE IF PT(K)>=-3 OR F(K)#0 THEN ->L7; ! 2ND OPERAND A NODE OPN(0,I); ! LOAD 1ST OPERAND OPN(J,K); ! OPN BETWEEN INTER & 2ND OPERAND ->L4 ! ! 2ND OPERAND A NODE L7: EVAL(K); ! EVALUATE 2ND OPERAND IF UCN(J)=2 THEN ->L8; ! OPERATOR COMMUTATIVE PUSH(TEMPHEAD,TYP(K),FLACC) IF FLACC#0 THEN TSAVE(TWSP) ELSE SAVE INTER !(ABOVE, IF OPERAND1 IS REAL AND FLACC IS ! IN USE...) OPN(0,I); ! LOAD 1ST OPERAND ->L10 ! ! OPERATOR COMMUTATIVE L8: OPN(J,I); ! OPERATION BETWEEN ACC & 1ST OP ->L4 ! ! 1ST OPERAND A NODE L6: IF PT(K)>=-3 OR F(K)#0 THEN ->L9; ! 2ND OPERAND A NODE EVAL(I); ! EVALUATE 1ST OPERAND OPN(J,K); ! OPERATION BETWEEN ACC & 2ND OP ->L4 ! ! 1ST & 2ND OPERANDS ARE NODES J HAS OPERATOR NO. L9: EVAL(K); ! EVALUATE 2ND OPERAND PUSH(TEMPHEAD,TYP(K),FLACC) IF FLACC#0 THENSTART TSAVE(TWSP); ! PARAM IS DISPLACEMENT IN BYTES LTWSP=TWSP TWSP=TWSP+4; ! INC BY 4 BYTES FAULT(41) IF TWSP>TWSPLIM FINISH ELSE SAVE INTER EVAL(I); ! EVALUATE 1ST OPERAND TWSP=LTWSP IF LTWSP#0 ! ! ! 2ND OPERAND WAS A NODE AND ITS VALUE IS ! IN REAL OR INT TEMP. L10: ! ! K=OPR(J); ! OPERATION CODE/MNEMONIC POP(TEMPHEAD,I,J) IF 2<=K AND K<=8 THENSTART ! OPERAND1 IS TEMP, OPERAND2 INTER ! IN THE IMP EXPRESSION, THE RH OPERAND GOES TO (SP), THE LH TO R0 I=INTER TO REG(0) RESTORE INTER INTER TO SP EM(100+K) UNLOCK(0) SET INTER(0) ->L4 FINISH ! OPERATE ON INTERMEDIATE WITH TEMPORARY. ! INDEX = -1 BELOW MEANS OPERAND IS AT (SP) IF J#0 THENSTART; ! J IS FORMER 'FLACC' AD(K) OCODE(LEVEL,TWSP); ! PARAM AS BYTE DISPL !(TWSP IS AN OFFSET FROM CURRENT LEVEL) FINISH ELSE START K=K!256 IF TYPE=1 OR I=1; ! UP OPTYPE FOR BYTE DUMP(K,-1,0); ! OPERATE ON INTER WITH TEMP FINISH ->L4 L1: OPN(0,P); ! DUMP LOAD OPERATION FOR OPERAND L4: IF F(P)#0 THEN FLOAT; ! 'FLOAT' CALL L99: END; ! EVAL !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ROUTINE OPN(INTEGER OP,RP POSN) ! DUMP SIMPLE OPERATION, OP=OPERATOR, RP POSN=RP POSITION OF OPERAND INTEGER I,II,J,K,L,M,KK,AP0 INTEGER OPND TYPE,NN,EQEQ SWITCH TYPE(-10:-1) EQEQ=OP IF OP=37 THEN OP=30 OPNS=OPNS+1 L1: PPRINT AP0=RP0(RP POSN) AP=RP(RP POSN); ! ANAL REC POINTER OR NAME TAGS I=PT(RP POSN); ! KIND OF OPERAND J=OPR(OP); ! GET CODE FOR OPERATOR K=AP0&15; ! LEVEL L=AP OPND TYPE=TYP(RP POSN) -> TYPE(I) ! TYPE(-1): ! MAP TYPE RELEASE(0) IF OP>=30 THEN SAVE INTER RT ! RT PLANTS CODE LEAVING ADDRESS OF ENTITY REFERENCED IN R0. ! IF ITS STR INC DEC OR CLR, THIS IS THE LAST OPERATION. RESTORE ! WILL LOCK A REG IF IT LOADS ONE. IF ITS ANYHOTHER OP ! ITS AN OP ON INTER WITH WHAT K,L DESCRIBE. LOCK(0) IF OP>=30 THEN RESTORE INTER UNLOCK(0) K=R0 L=0 -> L9 TYPE(-2): ! FUNCTION TYPE ! ONLY 'LOAD TO INTERMEDIATE' IS REQD, SINCE A FN CALL IS A NODE. RELEASE(0) RT; ! DUMP CALL ON FUNCTION IF OPND TYPE=3 THEN FLACC=1 ELSE SET INTER(0) RETURN ! TYPE(-3): ! ARRAY ACCESS IF OP>=30 AND FLACC=0 THEN KK=3 ELSE KK=1 ! AP POINTS TO <NAME>, AP+1 TO <APP>. ! ALLOW REF TO UNSUBSCRIPTED ARRAYNAME FOR COMMUNICATIONS PACKAGE. IF CHECKS&64#0 AND A(AP+1)=2 THEN -> L40; ! NULL <APP> ARRAD(KK,K) K=K+100; L=0; -> L9 TYPE(-4): ! SCALAR L40: I=TAG OF(NP(RP POSN)) IF AP0>>12=0 THEN START; ! VALUE TYPE IF OPND TYPE#3 AND I>>12#2 THENC START; ! NOT REAL OR ARRAY ! ! FOR INC,DEC,CLR,ADDS,SUBS,BISS,STR ITS NECESSARY TO FORGET ! ANY ASSOCIATED REGISTER. IF 20<=OP AND OP<=33 AND AP<6 THEN LOSE(AP) ! ! FOR STR INTER, WHERE INTER IS IN A REGISTER, WE LOSE THE REGISTER ! REFERENCE AND GIVE IT THE NEW ONE. IF J=STR AND INTER BASE=6 THEN START KK=INTER REG LOSE(KK) IUSE(KK)=32; ! REGISTER VARIABLE NN=NP(RP POSN); ! GET PTR TO NAME POINT1(KK)=NN POINT(KK)=0 ! PUSH NEW DESCRIPTOR CELL IN FRONT OF CURRENT TAGS PUSH(LINK(NN),I,KK); ! RH TAGS WORD = REG NO FINISH FINISH; ! NOT REAL -> L9 FINISH; ! VALUE TYPE ! ! SCALAR NAME TYPE ! ! FOR A REC ELT REFERENCE, RP(=L) HAS ! LH16=REL DISP OF REC ELT RH16=DISP OF RECORDNAME IF OPND TYPE=3 OR L>X'FFFF' START; ! REALNAME/REC ELT IF TAG OFF(NP(RP POSN))<=5 START K=TAG OFF(NP(RP POSN)) ->L41 FINISH K=ADDRDUMP(K,L&X'FFFF'); ! ADDRESS WORD TO REG K UNLESS OPND TYPE=3 START LOSE(K) IUSE(K)=32 NN=NP(RP POSN) POINT1(K)=NN POINT(K)=0 PUSH(LINK(NN),I,K) FINISH L41: K=K+100; ! REG MNEMONIC L=L>>16; ! 0 FOR REALNAME, BUT RELDISP FOR REC ELT -> L9 FINISH; ! REALNAME/REC ELT K=K+32; ! LEVEL, INDIRECT -> L9 ! TYPE(-7): ! REGISTER TYPE ! THE REGISTER MIGHT HAVE GOT LOST DURING THE EXPRESSION ! EVALUATION. CHECK THIS, AND TREAT AS SCALAR IF NECESSARY. ! THIS SITUATION ARISES FROM ! RE-ASSIGNMENT TO A VARIABLE CURRENTLY HELD IN A ! REGISTER. ! ANOTHER HANG-UP IS IF FOR THE TRAP OPERATORS, R0 IS TAKEN BELOW ! SO IF R0 IS THE REGISTER ITS ABOUT TO GET LOST BELOW. THEN TREAT ! AS SCALAR (8 IS THE TOP NUMBER FOR TRAP OPERATORS). ! L IS THE REGISTER. IF 20<=OP AND OP<=33 AND (POINT1(L)<=0 C OR (TAG OF(POINT1(L))>>8)&7#7) THEN LOSE(L) IF J<=8 AND L=0 START IF (TAG OF(POINT1(0))>>8)&7=7 START I=FREE REG MAA(0,100,0,100+I) POINT1(I)=NP(RP POSN) IUSE(I)=32 TAG1(LINK(POINT1(0)))=I PUSH(LINK(POINT1(0)),I,K) FINISH LOSE(L) FINISH NN=NP(RP POSN) IF TAG OF(NN)>>12=1 AND TAG OF(NN)>>8&15#7 THEN LOSE(L) IF TAG OFF(NN)>5 START RP0(RP POSN)=TAG OF(NN) RP(RP POSN)=TAG OFF(NN) IF (RP0(RP POSN)>>8)&7=7 START REC DISP(AP POS(RP POSN),RP0(RP POSN),RP(RP POSN),II) OPND TYPE=(RP0(RP POSN)>>8)&7 FINISH PT(RP POSN)=-4 IF EQEQ=37 AND II=1 THEN RP0(RP POSN)=RP0(RP POSN)&X'0FFF' PPRINT -> L1 FINISH K=L+100; ! L=RP(RP POSN) IS THE REG NO M=TAG OF(LINK(NN)) IF (M>>8)&7=7 START L=TAG OFF(LINK(NN)) K=TAG OFF(NN)+100 REC DISP(AP POS(RP POSN),M,L,I) OPND TYPE=(M>>8)&7 RP0(RP POSN)=M L=L>>16 ->L9 FINISH L=-1; ! INDICATE REG TYPE -> L9 ! TYPE(-5): ! CONST VALUE, INTEGER K=14; ! INDICATE IMMEDIATE CONST. ! TYPE(-6): ! REAL CONST. TAGS ARE ALREADY SET UP IN RP ! ALL END UP HERE L9: ! ALL OPNS VIA HERE IF J<=8 THENSTART !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 !(9,12,15 WILL NOT HAPPEN HERE). ! ! FOR THESE FUNCTIONS, WE WANT FIRST THE INTERMEDIATE RESULT ! PUSHED, THEN THE SECOND OPERAND. (THE RESULTING INTERMEDIATE RESULT ! IS LEFT IN R0) ! I=INTER TO REG(0) I=3 IF OPND TYPE=1 AND EQEQ#37 THEN I=259; ! ADD 256 TO OPERATOR FOR BYTE ! SOME OPTIMISING FOR AND, SHL AND SHR IF K=14 START; ! CONST OPERAND IF CHECKS&2048#0 AND (J=6 OR J=7) START; ! ASH AVAILABLE IF J=7 THEN L=-L; ! RIGHT SHIFT D11A(ASH,0,R0,0,8,0,L) LOSE(0) RETURN FINISH; ! ASH AVAILABLE IF J=3 START; ! AND D11A(BIC,8,0,¬L,0,R0,0) LOSE(0) RETURN FINISH; ! AND IF L=1 START; ! CONSTANT=ONE IF J=7 START; ! SHR D11A(CLC,0,0,0,0,0,0) D11A(ROR,0,0,0,0,R0,0) LOSE(0) FINISH; ! SHR IF J=6 THEN D11A(MASL,0,0,0,0,R0,0) LOSE(0) RETURN FINISH; ! CONSTANT=ONE FINISH; ! CONST OPERAND DUMP(I,K,L); ! MOV L(K),-(SP) EM(100+J) RETURN FINISH ! ! IF (9<=J AND J<=15) OR OPND TYPE=3 THEN START; ! REAL OPN IF J=LOAD THEN J=0; ! SET CODE FOR LDF IF J=STR THEN J=3; ! SET CODE FOR STRF AD(J) !DEAL SPECIALLY WITH X**CONST. PLANT AN EXTRA PARAM OF ! '6' TO INDICATE TO INTERPRETER THAT INTEGER EXPONENT !FOLLOWS IF K=14 THENSTART; ! REAL EXPONENTIATE OCTN(6,0) OCTN(L,0) RETURN FINISH !DEAL WITH FN OR ARRAY ELT ELSE SCALAR. IF L=0 THEN OCTN(K-100,0) ELSE DESC(RP POSN) RETURN FINISH; ! REAL OPN ! ! DUMP OPERATION ON INTERMEDIATE IF OPND TYPE=1 AND EQEQ#37 THEN J=J ! 256; ! BYTE OPERATION DUMP(J,K,L) RETURN TYPE(-8): TYPE(-9): TYPE(-10): FAULT(59); ! STRING VARIABLE IN ARITHMETIC EXP. END; ! OPN INTEGERFN TYP(INTEGER RPP) ! PARAM IS POSN OF OPERAND IN RP STACK ! IF THE OPERAND IS A FN OR ARRAY ELT, RP ENTRY POINTS TO ! <NAME> IN AR INTEGER I,W ! IF OPERAND IS AN OPERATOR, USE TYPE OF OPERATOR TO GIV ! RESULT. I=PT(RPP) IF I>0 THENSTART W=RP(RPP) IF F(RPP)#0 OR W=8 OR (14<=W AND W<=18) THENRESULT=3 RESULT=2 FINISH IF -3<=I AND I<=-1 THEN C RESULT=(TAG OF(A(RP(RPP)))>>8)&7 IF I=-6 THEN RESULT=3; !REAL CONST IN CT RESULT=(RP0(RPP)>>8)&7 END; ! TYP ROUTINE DESC(INTEGER RPP) ! PLANTS DESCRIPTOR WORD FOR REAL OPERAND. ! DESCRIPTOR FORMAT IS (FROM LEFT) ! BITS 0-2 LEVEL ! 3-15 DISPLACEMENT (FROM LEVEL PTR OR FROM CT IF LEV=7) ! OR REG PTG TO OPERAND IF LEV=0 ! DISPLACEMENT IS IN BYTES. SETS(2) INTEGER K0,K,LEV,OFF K0=RP0(RPP) K=RP(RPP) LEV=K0&7 OFF=K&X'1FFF'; ! AS BYTE DISPL. FAULT(42) UNLESS LEV=7 OR LEV<=5 OCODE(LEV,OFF); ! OFFSET AS BYTE DISPL END; ! DESC END; ! SEXPR !--------------------------------------------------------- ROUTINE FLOAT ! CONVERTS ACC FROM FIXED TO FLOATING FORM AD(1); !FLT END; ! FLOAT ROUTINE TOPOL PRR RETURN IF POLISH#0 RELEASE(4) D11A(JSR,0,R4,0,9,152,0) POLISH=1 END; ! TOPOL ROUTINE FPOL RETURN IF POLISH=0 AD(4); ! .+2 POLISH=0 END; ! FPOL ROUTINE AD(INTEGER I) INTEGER J ! 0 LDF 138 1 FLT 141 2 STST 142 3 STRF 143 ! 4 EXIT 143 5 6 7 8 ! 9 EXPF 144 10 ADDF 145 11 SUBF 146 12 NEGF 147 ! 13 MULF 148 14 DIVF 149 OWNINTEGERARRAY FNS(0:14)= C 139,141,142,140,151,0,0,0,0, 144,145,146,147,148, 149 SETS(2); !SET UP OBJ STREAM IF I=9 THEN EXPFFLAG=1 IF I=1 THEN START J=INTER TO REG(0) UNLOCK(0) FINISH TOPOL UNLESS I=4 IF TARGET&8192=0 START PRINTSTRING(" .WORD ") PMN(FNS(I)); NEWLINE CA=CA+2 FINISHELSE OCT(BINREALS(I)) RETURN IF I=4; ! EXIT NOT TO CHANGE FLACC VALUE. !FORGET/REMEMBER FLACC USE: IF 2<=I AND I<=3 THEN FLACC=0 ELSESTART FLACC=1 REALS=1 FINISH END; ! AD ROUTINE TSAVE(INTEGER TWSP) AD(3); !STRF OCODE(LEVEL,TWSP); ! OFFSET IN BYTES END; ! TSAVE ROUTINE SKIP SEXPR ! SKIP PAST <+-?><OPERAND><EXPR> IN ANALYSIS RECORD, AP INITIALLY ! ON <+-''>. SWITCH SEX(1:5) AP=AP+1 L5: AP=AP+2; ! SET AP TO <OPERAND>+1 -> SEX(A(AP-1)); ! SWITCH ON ALT OF <OPND> SEX(5): AP=AP-1; ! STRING CONST SEX(4): ! SUB-EXPRESSION SKIP SEXPR; ! SKIP SUB-EXPRESSION ->L3; ! POINTER IS ON <EXPR> SEX(1): ! <NAME>_<NAME> AP=AP+2; ! PAST <NAME> AND <NAME> -> L3 SEX(2): ! <NAME><APP> AP=AP+1; ! SET AP TO <APP> SKIP APP ->L3; ! POINTER TO <EXPR> SEX(3): ! <CONST> IF A(AP)>3 THEN AP=AP-2 AP=AP+3; ! SKIP <CONST> L3: AP=AP+1; ! SET AP TO <EXPR>+1 IF A(AP-1)=1 THEN ->L5; ! MORE OPERANDS TO SKIP ! OTHERWISE NULL OF <EXPR> END; ! SKIP EXPR ROUTINE SKIP APP ! SKIP PAST <APP> IN ANALYSIS RECORD, AP INITIALLY ON <APP>. L1: AP=AP+1; ! POINTER TO <APP>+1 OR <EXPRS>+1 IF A(AP-1)=2 THENRETURN ; ! NO MORE EXPRESSIONS TO SKIP SKIP SEXPR; ! POINTER TO <EXPRS> ->L1 END; ! SKIP APP ROUTINE SCCOND(INTEGERNAME LABEL, INTEGER IU,P) ! COMPILE CONDITION I.E. <SC><COND> ! LABEL SET TO BT POSITION FOR LABEL TO FOLLOW UI ! IU IS THE ALT OF <IU>. ! P PTS TO THE <UI> IN ANAL REC. ! IF LABEL IS SET 0 AT ENTRY, PLANT SHORT JUMP, ELSE LONG. ROUTINESPEC SC ROUTINESPEC COND ROUTINESPEC STORE(INTEGER FT) INTEGER I,J,K,L,APP,M INTEGER SL; SL=0; !SHORT/LONG INDICATOR INTEGERARRAY CAP,LVL,TF,JMP,LBL(1:16); ! ANAL REC POINTERS, ! NESTING LEV, TRUE/FALSE, JUMP & LABEL ARRAYS I=1; ! INDEX TO ARRAYS L=0; ! NESTING LEVEL SC; ! PROCESS <SC> COND; ! PROCESS <COND> APP=AP; ! PRESERVE FINAL ANAL REC POINTE L=-1 STORE(IU); !PSEUDO FALSE AT LEVEL -1 L=-2 STORE(3-IU); !PSEUDO TRUE AT LEVEL -2 K=I-1; ! LAST POSITION FILLED IN IN ARR I=1 L2: J=I; ! FIND POSITIONS TO JUMP TO L1: J=J+1; ! AFTER COMPARISONS IF LVL(J)>=LVL(I) OR TF(J)=TF(I) THEN ->L1; ! SKIP HIGHER ! LE JMP(I)=J; ! JUMP TO COMPARISON POSITION J I=I+1 IF I<K THEN ->L2; ! MORE JUMPS TO FILL IN YET ! P PTS TO ALT OF <UI>. IF P<=0 OR A(P)=4 START ! THEN UI IS A JUMP INSTRUCTION. J=K-1; ! LAST POSITION FILLED IN TF(J)=3-IU; ! REVERSE FT AT LEVEL 1 JMP(J)=J; ! SET JUMP AS THE UI JUMP IF P>0 START AP=P+1 LBL(J)=FIND LABEL; ! FILL IN BRANCH TABLE POSITION SL=1 FINISH ELSE LBL(J)=-P FINISH I=1; ! FILL IN PSEUDO-LABELS FOR INNE L4: IF LBL(JMP(I))<0 THEN LBL(JMP(I))=BT NEXT; ! NEXT BAT POSITIO I=I+1 IF I<K THEN ->L4; ! MORE TO FILL IN I=1 L7: AP=CAP(I); ! ANAL REC POINTER FOR 1ST EXPR SCF=1; ! SET FLAG FOR SEXPR TORF=0 SEXPR(L); ! TO EVALUATE (1ST - 2ND) M=TF(I) IF TORF=1 THEN M=M!!3 ; ! 0 EXPR. FIRST IF M=1 THEN L=FALSE(COMP); ! APPROPRIATE BRANCH ! MNEMONIC IF M=2 THEN L=TRUE(COMP) PJ(L,SL,LBL(JMP(I))); ! BRANCH TO REQUIRED POSITION IF LBL(I)>=0 AND (I#K-1 OR TF(I)=IU) THEN SETLAB(LBL(I)) I=I+1; ! FILL IN LABEL ADDRESS IF I<K THEN ->L7; ! MORE COMPARISONS YET LABEL=LBL(K); ! FINAL LABEL AP=APP; !FINAL ANAL REC PTR RETURN ROUTINE STORE(INTEGER FT) ! STORE LEVEL & TRUE/FALSE FLAG IF I<=16 THEN ->L1; ! ARRAYS NOT FULL YET FAULT(69); !COND TOO LONG I=1 L1: LVL(I)=L; ! SAVE NESTING LEVEL TF(I)=FT; ! SAVE TRUE/FALSE FLAG LBL(I)=-1; ! SET 'LABEL NOT FILLED IN YET' I=I+1; ! NEXT ARRAY POSITION END; ! STORE ROUTINE SC SCS=SCS+1 AP=AP+1 IF A(AP-1)=1 THEN ->L1; ! SIMPLE COMPARISON L=L+1; ! NESTING LEVEL UP 1 FOR SUB-CON SC; ! PROCESS SUB-<SC> COND; ! PROCESS SUB-<COND> L=L-1; ! NESTING LEVEL DOWN AFTER SUB-C RETURN L1: CAP(I)=AP; ! ANAL REC POINTER FOR SIMPLE CO SKIP SEXPR; ! SKIP 1ST EXPR OF COMPARISON AP=AP+1; ! SKIP COMPARATOR SKIP SEXPR; ! SKIP 2ND EXPR END; ! SC ROUTINE COND ! PROCESS <COND> FOR SIMPLE COMPARISONS INTEGER I I=A(AP); ! <COND> AP=AP+1 IF I=3 THENRETURN ; ! NULL ALTERNATIVE OF <COND> L1: STORE(I); ! SAVE %AND OR %OR TYPE OF CONDI SC; ! PROCESS <SC> AP=AP+1; ! POINTER ON <ANDC>+1 OR <ORC>+1 IF A(AP-1)=1 THEN ->L1; ! MORE %ANDS OR %ORS END; ! COND END; ! SCCOND ROUTINE TO GLOBLS(INTEGER I) INTEGER J IF GP>0 THENSTART CYCLE J=1,1,GP RETURN IF GLOBLS(GP)=I REPEAT FINISH GP=GP+1 GLOBLS(GP)=I IF GP=10 THEN F GLOBLS END; ! TO GLOBLS ROUTINE F GLOBLS INTEGER J SETS(2) RETURN IF GP<=0 IF TARGET&8192=0 START PRINTSTRING(" .GLOBL ") CYCLE J=1,1,GP PRINTNAME(GLOBLS(J)) PRINTSYMBOL(',') UNLESS J=GP REPEAT NEWLINE FINISH GP=0 END; ! F GLOBLS ROUTINE RTSPEC ! COMPILE ROUTINE/FN HEADING OR SPEC INTEGER I,J,K,L,M,N,T,TT,EXT,JJ,NN,LEN,BGN ! 16 BITS IS PLENTY IN THESE ARRAYS.. INTEGERARRAY PT,PN,LENGTH(1:15); ! PARAMETER TYPES AND NAMES I=0 EXT=2-A(AP); ! PICK UP 1 FOR %EXT, 0 FOR NULL AP=AP+1; ! TO ALT OF <RT> N=A(AP); ! ALT OF <RT> 1 : RT 2 : FN 3 : MAP IF N=1 THEN ->L1; ! <RT>= %ROUTINE ! ! THEN %FN OR %MAP AP=AP+1 ! SET TYPE, 1=BYTEINTEGER, 2=INTEGER, 3=REAL, 6=STRING ! PLUS 8 FOR %EXTERNAL I=A(AP) IF I=6 START AP=AP+1 IF A(AP)=1 THEN AP=AP+3 FINISH IF I>3 AND I<6 THEN I=I-2; ! SHORTINT=INT, LONGREAL=REAL L1: J=A(AP+1); ! <SPEC?> 1=SPEC 2=HDG K=A(AP+2); ! <NAME> OF %ROUTINE/%FN/%MAP AP=AP+3; ! TO <FPP> IF EXT=1 THENSTART ! %EXTERNAL<RT><SPEC> TO GLOBLS(K) I=I+8; ! ADD 8 TO TYPE FOR %EXTERNAL IF J=2 THENSTART ! HEADING IF LEVEL#0 THEN FAULT(55) IN EXT=IN EXT+1 FINISH; ! HEADING FINISH; ! EXT=1 L=0; ! PARAMETER COUNT ! ! TREAT FORMAL PARAMETERS, STORE IN PT/PN. L6: ! AP PTS TO ALT OF <FPP> IF A(AP)=2 THEN ->L2; ! NO FORMAL PARAMETERS LEN=0 IF A(AP+1)=6 THENSTART ; ! STRING PARAM. IF A(AP+2)=1 THENSTART ; ! STRING HAS LENGTH IF A(AP+3)=2 AND A(AP+5)=0 THEN LEN=A(AP+4) ELSE FAULT(32) AP=AP+3 FINISH AP=AP+5 M=2*A(AP-2)&2!A(AP-1)&1 ;! PARAM. 'FORM' IF M=2 THEN FAULT(9) ! %IF M=1 %AND LEN>0 %THEN FAULT(72); ! STRINGNAME HAS A LENGTH M=(M<<4)+6 ->L5 FINISH M=2*A(AP+2)&2!A(AP+3)&1 ; ! PARAMETER 'FORM' ! (%ARRAY/%NAME IF M=2 THEN FAULT(9); !VALUE TYPE ARRAY NN=A(AP+1); ! A(AP+1) IS ALT OF <TYPE> IF NN>3 THEN NN=NN-2; ! SHORTINT=INT, LONGREAL=REAL M=(M<<4)!NN AP=AP+4; ! ON <NAME> L5: IF L=15 THEN ->L4; ! 15 PARAMETERS FOUND L=L+1; ! INCREMENT PARAMETER COUNT PT(L)=M; ! STORE PARAMETER FORM/TYPE PN(L)=A(AP); ! STORE PARAMETER NAME IDENT NO. LENGTH(L)=LEN AP=AP+2; ! TO <NAMES>+1 IF A(AP-1)=1 THEN ->L5; ! MORE NAMES ->L6 L4: FAULT(8); !TOO MANY PARAMS ! ! PARAM TAGS NOW STORED AWAY. ! CHECK WHETHER RT/FN NAME DECLARED. L2: T=TAG OF(K); ! GET NAME TAG IF T=0 THEN ->L7; ! NAME NOT YET SET AT ALL IF T&15#LEVEL THEN ->L7; ! NAME NOT SET AT THIS LEVEL ! HERE N CONTAINS ALT OF <RT> 1 RT 2 FN 3 MAP ! I CONTAINS TYPE 1 BYTE 2 INT 3 REAL PLUS 8 FOR %EXT IF N<=2 THEN JJ=64 ELSE JJ=128 IF T>>8=JJ!(I&7) AND J=2 THEN ->L8; ! TAGS AGREE & NOT A SPEC FAULT(7); !NAME SET TWICE ->L9 L8: IF T>>4&15#L THEN ->L10; ! NUMBER OF PARAMS DIFFER IF L=0 THEN ->L11; ! NO PARAMS N=1 M=LINK(LINK(K)); ! POINTER TO 1ST PARAM TAGS CELL L12: IF TAG1(M)#PT(N) THEN ->L10; ! PARAM HAS DIFFERENT TAGS M=LINK(M); ! POINTER TO NEXT PARAM TAGS CEL ! CHECK LENGTH FOR STRING PARAM. IF PT(N)&6=6 THENSTART IF TAG(M)#LENGTH(N) THEN ->L10 M=LINK(M) FINISH IF N=L THEN ->L11; ! ALL PARAMETERS CHECK OUT N=N+1 ->L12 L10: FAULT(9); !PARS NOT AS SPEC ->L11 L7: ! SET TAGS FOR RT/FN/MAP NAME. ! FORM=4 FOR RT/FN, 8 FOR MAP ! N CONTAINS ALT OF <RT> 1 RT 2 FN 3 MAP IF N<=2 THEN N=4 ELSE N=8 ! TAGS- OFFSET IS OFFSET IN BRANCH TABLE FOR INTERNAL, ! BUT IS PTR TO NAME FOR %EXTERNAL. IF EXT=1 THEN TT=K ELSE TT=BT NEXT IF EXT=1 AND J=1 AND CHECKS&8192#0 START TT=BTNEXT IF TARGET&8192=0 START ! NEXT INSTRUCTION TO BE CHANGED WITH %ROUTINE PJ SETS(2) PRINTSTRING(" BR .+10. ") CA=CA+2 SET LAB(TT) PRLAB PRINTNAME(K) PRINTSYMBOL(':') EM(24) PRINTSTRING(" .ASCII /") BGN=PRINT4(K) WHILE BGN<6 CYCLE PRINTSYMBOL('Y') BGN=BGN+1 REPEAT PRINTSYMBOL('/') NEWLINE CA=CA+8 FINISHELSESTART OCT(X'104') SET LAB(TT) PRLAB EM(24) BGN=PRINT4(K) WHILE BGN<6 CYCLE BIN(CA!!1)='Y' CA=CA+1 BGN=BGN+1 REPEAT FINISH FINISH STORE TAG(K,N,I,L,LEVEL,TT) IF L=0 THEN ->L9; ! NO PARAMETERS ! ! PUT PARAM TYPES IN TAG/LINK LIST. I=1 M=LINK(K); ! LINK OF NAME TAGS CELL L13: N=NEWCELL; ! NEW CELL FOR NEXT PARAMETER TA TAG1(N)=PT(I) LINK(N)=LINK(M); ! COPY LINK TO FOLLOWING CELL LINK(M)=N; ! LINK FOR PRECEDING CELL M=N; ! POINTER TO NEW LAST PARAMETER IF PT(I)&7=6 THENSTART N=NEWCELL TAG(N)=LENGTH(I) LINK(N)=LINK(M) LINK(M)=N M=N FINISH I=I+1 IF I<=L THEN ->L13; ! MORE PARAMETERS YET L9: IF J#1 THEN ->L11; ! JUMP IF NOT A SPEC. ! ! THEN A SPEC IF L=0 THENRETURN CYCLE L=1,1,L HOY NAME(PN(L)) REPEAT RETURN ! ! HERE WE START ON THE ROUTINE HEADING L11: IF EXT=0 THENSTART COT(STAR(LEVEL))=RAD; ! PRESERVE STORE ALLOC FOR OLD LEVEL -> L115 IF CHECKS&128#0 BRT(LEVEL)=BT NEXT; ! ALLOCATE BRANCH TABLE HOLE FOR PJ(BR,1,BRT(LEVEL)); ! JUMP ROUND RT BODY FINISH ELSE START PRLAB PRINTNAME(K) PRINTSTRING(": ") FINISH L115: T=TAG OF(K); ! TAG MAY HAVE CHANGED J=TAG OFF(K); ! RT/FN NO.=BAT POSITION OR PTR TO NAME FOR %EXT IF EXT=0 THENSTART IF BAT(J)>=0 THEN FAULT(7); ! ROUTINE NAME SET TWICE SET LAB(J); ! FILL IN RT/FN START ADDRESS FINISH IF CHECKS&4096#0 START PPJ(37) OCT(LINE) FINISH SET LINE; ! UPDATE LINE COUNT IF LEVEL<4 THEN ->L15 FAULT(34); !TOO MANY LEVELS ->L16 L15: LEVEL=LEVEL+1; ! INCREMENT LEVEL COUNT L16: PUSH(BDIAGSPTR,CA,K) BLOCK ENTRY; ! PLANT CODE FOR BLOCK ENTRY RAD=PDISP RTP(LEVEL)=T>>8; ! ROUTINE / FN TYPE IF L=0 THEN ->L99; ! NO PARAMETERS I=1 L17: !SET TAGS FOR PARAM VARIABLE IF LENGTH(I)>0 THEN LENGTH(I)=(LENGTH(I)+2)&X'FFFE' STORE TAG(PN(I),PT(I)>>4,PT(I)&15,0,LEVEL,RAD+LENGTH(I)); RAD=RAD+2+LENGTH(I); ! BYTES !ARRAYS , STRINGS AND SCALAR REALS TAKE 4 BYTES: ! IF FORM=ARRAY OR (FORM=SCALAR AND TYPE=REAL) IF PT(I)&32#0 OR (PT(I)&X'F0'=0 AND PT(I)&15=3) C OR PT(I)&15=6 C THEN RAD=RAD+2 I=I+1 IF I<=L THEN ->L17; ! MORE PARAMETERS TO SET L99: TWSP=RAD; RAD=RAD+TEMPS; ! ALLOCATE TEMPORARIES TWSPLIM=RAD SAVETWSP(LEVEL)=TWSP END; ! RTSPEC ROUTINE TYPE CH(INTEGER LH,RH) ! COMPARES TYPES OF LHS &RHS, ARRANGES FLOAT OR ERROR MESSAGE ! CALLED FROM SW(2) OF UI, -> SW( ) ! SW(5) OF UI, %RESULT= ! SCALAR VALUE PAR IN RT IF LH=RH THEN ->L9; !TYPES AGREE IF LH=3 THEN FLOAT; ! FLOAT RHS IF LH<=2 AND RH=3 THEN FAULT(24); !REAL EXP ASSIGNED TO INTEGER L9: END; ! TYPE CH ROUTINE CHECK JUMPS ! CHECK LABELS ALL SET & RETURN JUMP LIST TO ASL INTEGER I,J L1: POP(JUMP(LEVEL),I,J); ! EXTRACT A JUMP IF I<=0 THEN ->L3; ! NO(MORE) JUMPS/LABELS AT THIS L IF BAT(J)>=0 THEN ->L1; ! LABEL SET CORRECTLY ! PRINT OUT LABEL NO OR NAME SETS(3) IF I<8192 THEN WRITE(I,1) ELSE PRINTNAME(I-8192) FAULT(11); !LABEL NOT SET ->L1; ! MORE JUMPS TO PROCESS L3: COT(STAR(LEVEL))=(RAD+1)&(-2); ! FILL IN STATIC STORAGE ALLOCAT ! STATIC STORAGE IN BYTES, ABOVE.. IF CYC(LEVEL)#0 THEN FAULT(13); !REPEATS MISSING IF SBR(LEVEL)#0 THEN FAULT(53); !FINISH MISSING END; ! CHECK JUMPS ROUTINE RETURN ! DUMP CODE FOR %RETURN INTEGER J,K,TYPE J=RTP(LEVEL) TYPE=J&15 ! NEEDNT UNLOCK IT SINCE LABEL HAS TO COME NEXT IF TYPE>=8 THEN PPJ(33) ELSE START DUMP(LOAD,13,PREVL); ! RESET OLD DISPLAY POINTER K=INTER TO REG(1) ! SET CC FOR INTEGER FUNCTION D11A(TST,0,0,0,0,ACC,0) IF J&64#0 AND 0<TYPE AND TYPE<=2 D11A(RTS,0,0,0,0,PC,0); ! (MODE = REG) FINISH END; ! RETURN ROUTINE RT; ! RTRTRT ! DUMP CODE FOR A ROUTINE OR FUNCTION CALL ROUTINESPEC STK PARAM ROUTINESPEC STACK REGS ROUTINESPEC UNSTACK REGS INTEGER RFTAGS,P2,ELT4 INTEGER APP,I,J,K,L,M,N,P,NN,TYPE,FORM,DUMMY INTEGER INDIRECT INTEGER LEV,OFFSET,ARNAM; ARNAM=0 INTEGER STP,REG BEHIND INTEGERARRAY PAP(1:16); ! ANAL REC POINTERS FOR EACH PAR INTEGERARRAY STKD REGS(2:5) DUMMY=0; ! SET 1 WHEN RT/FN/MAP IS ADDR() OR INTEGER() CALLS=CALLS+1 J=LINK(A(AP)); ! POINTER TO ROUTINE/FN NAME TAG AP=AP+2; ! TO <APP>+1 K=0; ! ACTUAL PARAMETER COUNT L2: IF A(AP-1)=2 THEN ->L1; ! NO MORE ACTUAL PARAMETERS IF K<16 THEN K=K+1; ! INCREMENT PARAM COUNT IF NOT T PAP(K)=AP; ! SAVE ANAL REC POINTER FOR EACH SKIP SEXPR; ! SKIP TO <EXPRS> AP=AP+1; ! <EXPRS>+1 ->L2 L1: APP=AP; ! PRESERVE FINAL ANAL REC POINTE L=TAG(J); ! NAME TAGS M=L>>4&15; ! NUMBER OF FORMAL PARAMETERS FORM=L>>12 TYPE=(L>>8)&15 LEV=L&15 ! OFFSET IS OFFSET IN BT FOR INTERNAL RT/FN/MAP, ! BUT IS PTR TO NAME FOR %EXTERNAL. OFFSET=TAG1(J) IF LEV=0 AND TYPE<8 THENSTART IF OFFSET=14 THEN DUMMY=1; ! ADDR() IF OFFSET=22 THEN DUMMY=2; ! INTEGER() IF OFFSET=17 THEN DUMMY=3; ! LACC() IF OFFSET=23 THEN DUMMY=4; ! ACC IF OFFSET=24 THEN DUMMY=2; ! RECORD() IF OFFSET=25 THEN DUMMY=2; ! STRING() IF OFFSET=26 THEN DUMMY=2; ! BYTEINTEGER() IF OFFSET=27 THEN DUMMY=5; ! SWAB() IF OFFSET=28 THEN DUMMY=6; ! PRINTSTRING() IF OFFSET=29 THEN DUMMY=7; ! LENGTH() FINISH IF K#M START FAULT(19); ! WRONG NUMBER OF PARAMS IF K>M THEN K=M; ! TAKE 1ST M PARAMS FINISH I=WS; ! PRESERVE WORKSPACE POINTER IF I#0 AND DUMMY=0 THEN UP STACK PTR(I) WS=PDISP; ! POSITION OF FIRST PARAMETER IF K=0 THEN ->L5; ! NO ACTUAL PARAMETERS !> STP=SET INDEX(16) REG BEHIND=0 ! ! EVALUATE PARAMETERS. ! M=0; ! COUNT OF PARAMS. !--------------------------------------------------------- L6: M=M+1; ! PROCESS EACH PARAMETER P=0 AP=PAP(M); ! ANAL REC POSITION OF NEXT ACTU J=LINK(J); ! POINTER TO NEXT FORMAL PARAM T IF TAG1(J)>>4=0 THEN ->L7; ! SCALAR VALUE PARAMETER AP=AP+1 IF TAG1(J)>>4=1 THEN ->L8; ! SCALAR %NAME PARAMETER ! NEED <PLUS''> NULL, <OPND>=NAME, AND NULL <EXP> AND <APP> IF A(AP)#4 OR A(AP+1)#2 OR A(AP+3)#2 OR A(AP+4)#2 C THEN ->L9 ! CHECK THAT PARAM EXPR IS SINGL N=TAG OF(A(AP+2)) NN=TAG OFF(A(AP+2)) IF N=0 THEN ->L10; ! ACTUAL NAME NOT SET IF N>>12&2#0 THEN ->L11; ! 'FORM' OF NAME IS ARRAY L9: FAULT(22); !PAR NOT ARRAY NAME ->L12 ! ! ARRAY %NAME PARAMETER. L11: P=N&15; ! BASE TO P DUMP(LOAD,P,NN); ! ARRAY HEAD WORD 1 STK PARAM; ! TO STACK WS=WS+2 DUMP(LOAD,P,NN+2); ! ARRAY HEAD WORD 2 STK PARAM; ! TO STACK ->L13 ! !----------------------------------------------------------------------- ! SCALAR %NAME FORMAL PARAMETER. ! ACTUAL PARAMETER MUST HAVE ! (1) <PLUS''> NULL ! (2) <EXP> NULL ! OR <EXP> 1 FOR RECORD ELEMENT L8: IF A(AP)#4 OR A(AP+1)>2 THEN ->L14 N=TAG OF(A(AP+2)); NN=TAG OFF(A(AP+2))&X'FFFF' IF N#0 THEN ->L15 L10: FAULT(16); !NAME NOT SET ->L18 L15: IF N>>12<=1 THEN ->L16; ! SCALAR IF N>>12=4 THEN ->L14; ! ROUTINE/FN IF N>>12=8 THEN -> MAP; ! MAP TYPE PARAMETER ! THEN ACTUAL PARAM IS ARRAY ELEMENT AP=AP+2; ! ON <NAME> IF WS=PDISP THEN WS=0; ! NO NEED TO PROTECT PARAMS ARRAD(0,P); ! ADDRESS OF ELEMENT IF WS=0 THEN WS=PDISP; ! RESTORE WS ! P IS LOCKED SET INTER(P) ! PTD TO BY P, BUT WE WANT THE ADDRESS MOVING, SO 'CONTAINED IN' ! STORE ADDRESS ON STACK, EXCEPT FOR 'PERM' CALL TO ADDR() ! OR MAP INTEGER(). IF DUMMY=0 THENSTART STK PARAM IF N>>8&7=6 THENSTART; ! STRING ARRAY PARAM. WS=WS+2 DUMP(LOAD,N&15,NN+2) DUMP(STR,6,0) DUMP(LOAD,8,6) STK PARAM FINISH FINISH ARNAM=1; !INDICATE FOR 'ADDR()' THAT PARAM IS ! SUBSCRIPTED ARRNAM. IUSE(P)=0; ! FREE REG IF A(AP)=2 THEN ->L13; ! END OF EXPRESSION L14: FAULT(22); !PAR NOT A NAME ->L18 MAP: ! SCALAR %NAME FORMAL PARAM, MAP TYPE ACTUAL IF DUMMY=2 THEN -> L7; ! TREAT INTEGER() SPECIALLY AP=AP+2; ! ONTO <NAME> IF WS=PDISP THEN WS=0 RELEASE(0) RT; ! CODE PLANTED LEAVES ADDR OF ITEM REFERENCED IN R0 IF WS=0 THEN WS=PDISP SET INTER(0) STK PARAM -> L18; ! FOR NEXT PARAM ! ! SCALAR %NAME FORMAL PARAM, NAME/VALUE TYPE ACTUAL L16: IF NN<6 THEN START ! VARIABLE VALUE IS IN A REGISTER LOSE(NN) N=TAG OF(A(AP+2)) NN=TAG OFF(A(AP+2))&X'FFFF' FINISH ! VALUE TYPE ACTUAL ELSE NAME TYPE ACTUAL INDIRECT=0 IF N>>8&7=6 AND TAG1(J)>>4#0 THENSTART; ! STRING PARAM IF DUMMY=7 START ; ! LENGTH DUMP(LOAD,N&15,NN) J=INTER TO REG(0) D11A(MOVB,10,R0,0,0,R0,0) ->L52 FINISH IF DUMMY=1 THEN DUMP(LOAD,N&15,NN) ELSESTART DUMP(LOAD,N&15,NN) STK PARAM WS=WS+2 DUMP(LOAD,N&15,NN+2) FINISH ->L19 FINISH IF N>>8&7=7 AND A(AP+1)=1 START; ! RECORD ELEMENT ->L14 UNLESS DUMMY=1 AP=AP+1 P2=N RFTAGS=TAG OFF(A(AP+1)) REC DISP(AP,P2,RFTAGS,ELT4) IF ELT4=2 THEN ELT4=1 ELSE ELT4=0 P2=ADDR DUMP(N&15,NN)+100 RFTAGS=RFTAGS>>16 D11A(ADD,8,0,RFTAGS,0,P2,0) UNLESS RFTAGS=0 IF P2#100 OR ELT4=1 THEN MAA(ELT4,P2,0,ACC) PAR1(0)=ENCODE(6) ->L19 FINISH IF N>>12=0 THEN LD ADDR(-1,N&15,NN) ELSE C DUMP(LOAD,N&15,NN) L19: IF DUMMY=0 THEN STK PARAM ELSE UNLOCK(INTER TO REG(0)) ! TO STACK, BUT NOT FOR 'ADDR()'. IF A(AP+3)=2 THEN ->L17; ! NO <APP> FAULT(19); !SCALAR HAS PARAMS ->L18 L17: IF A(AP+4)=1 THEN ->L14; ! NOT END OF EXPRESSION L13: ! DO ACTUAL AND FORMAL TYPES AGREE? IF N>>8&15=TAG1(J)&15 THEN ->L18; ! PARAM WRONG TYPE (BUT NOT FOR READSYMBOL AND ADDR()) ! OR FOR READ/WRITE SQ FAULT(22) UNLESS OFFSET=0 OR OFFSET=14 C OR OFFSET=19 OR OFFSET=20 ->L18 !----------------------------------------------------------------------- ! SCALAR VALUE FORMAL PARAM. ! L7: IF WS=PDISP THEN WS=0; ! NO NEED TO PROTECT PARAMS SEXPR(P); !EVALUATE PARAMETER. IF DUMMY=6 START ; ! PRINTSTRING D11A(MOV,10,R1,0,0,R3,0) EM(6) ->L52 FINISH IF WS=0 THEN WS=PDISP; ! RESTORE WS TYPE CH(TAG1(J)&15,P); !CHECK & FAULT OR FLOAT ! ! PARAM TO STACK (SCALAR VALUE FORMAL PARAM). ! TREAT SPECIAL CASES %MAP INTEGER AND %RT LACC ! FOR MAP TYPE, RT LEAVES THE ADDRESS OF THE ENTITY ! REFERENCED IN R0. IF DUMMY>=2 THEN START; ! INTENDED TO TAKE CASES 2,3 ONLY UNLOCK(INTER TO REG(0)) -> L52 FINISH IF TAG1(J)&15#3 THEN STK PARAM ELSESTART AD(2); !STST OCTN((WS-PDISP)>>1,0); ! PARAM IS NO. OF WORDS WS=WS+2; ! 4 BYTES ALTOGETHER FOR REAL PARAM REG BEHIND=REG BEHIND+2 FINISH L18: WS=WS+2; ! INCREMENT WORKSPACE PAST PARAM IF TAG1(J)&7=6 AND TAG1(J)>>4=0 THENSTART; ! STRING VALUE PARAM. J=LINK(J) WS=WS+2+TAG(J) IF WS&1#0 THEN WS=WS+1 MAA(6,R1,0,R5) D11A(MOV,10,R1,0,6,R5,WS-2-PDISP) D11A(MOV,8,0,TAG(J),6,R5,WS-PDISP) WS=WS+2 FINISH L12: IF M#K THEN ->L6; ! MORE PARAMETERS YET !-------------------------------------------------------------------- ! ! ! NOW PLANT THE CALL TO THE RT/FN/MAP. L5: ! IF LEV#0 OR TYPE>=8 THEN START ! RELEASE REG 0 FOR FN/MAP (TYPE=0 FOR RT FORM) IF TYPE#0 THEN RELEASE(0) STACK REGS IF TYPE>=8 AND CHECKS&8192=0 THENSTART ! %EXTERNAL TYPE PRLAB PRINTSTRING(" JSR PC,") PRINTNAME(OFFSET) NEWLINE CA=CA+4 FINISH ELSE D11A(JSR,0,PC,0,13,BT,OFFSET); ! JSR BT<N> IUSES0 UNSTACK REGS ->L52 FINISH ! TO PERM FOR IMPLICITS ! TREAT SPECIAL CASE OF ADDR() WHERE THE ARGUMENT IS A SUBSCRIPTED ! ARRAY NAME. IF OFFSET=14 AND ARNAM#0 THENSTART RELEASE(0) MAA(0,R3,0,ACC); ! MOV R3,ACC ->L52 FINISH READFLAG=1 IF OFFSET=13; ! (DUMPING .GLOBL READ AT EOP). ! PLANT PERM JUMP, BUT NOT FOR FNS ADDR() OR ACC ! RELEASE REG 0 FOR PERM CALLS WHICH ARE FUNCTIONS, ! IN PARTICULAR 1 NEXT SYMBOL, 9, INT PT RELEASE(0) IF OFFSET=1 OR OFFSET=9 PPJ(OFFSET+10) UNLESS DUMMY=1 OR DUMMY=4 ! ! RT/FN/MAP/PERM CALL HAS BEEN PLANTED (IF ONE WAS NECESSARY) L52: AP=APP; ! RESTORE FINAL ANAL REC POINTER WS=I; ! RESTORE ORIGINAL WORKSPACE VAL IF I#0 AND DUMMY=0 THEN UP STACK PTR(-I) IF DUMMY=5 START IF TARGET&8192#0 THEN D11A(SWAB,0,0,0,0,0,0) ELSESTART CA=CA+2 PRINTSTRING(" SWAB R0 ") FINISH FINISH RETURN ROUTINE STK PARAM ! %IF REG BEHIND>0 %THEN %START ! D11A(ADD,8,REG BEHIND,0,0,100+STP,0) ! REG BEHIND=0 ! %FINISH RETURNIF P=6; ! STRING VALUE PARAM. DUMP(STR,16,WS-PDISP); ! BECAUSE (R1) PTS TO STP+PDISP END; ! STK PARAM ROUTINE STACK REGS INTEGER J CYCLE J=2,1,5 STKD REGS(J)=0 IF IUSE(J)&64#0 THEN START D11A(MOV,0,100+J,0,4,SP,0) UNLOCK(J) STKD REGS(J)=1 FINISH REPEAT END; ! STACK REGS ROUTINE UNSTACK REGS INTEGER J CYCLE J=2,1,5 IF STKD REGS(J)#0 THEN START D11A(MOV,2,SP,0,0,100+J,0) LOCK(J) FINISH REPEAT END; ! UNSTACK REGS END; ! RTRTRT ROUTINE REC DISP(INTEGER I,INTEGERNAME K,KK,TYPENO) INTEGER RFTAGS,ELT PTR,ELT4,LIST PTR,CT,TRDISP,FLT,RDISP,RECTYPE INTEGER NAME DISP,FMT PTR,P2,ID ! K HAS TAGS OF RECORDNAME, KK HAS PTR TO RECORDFORMAT TAGS TYPENO=0 FLT=61 ID=A(I+1) ELT PTR=A(I+2) IF K>>8#X'17' THEN -> RERR; ! 1ST IDEN NOT RECORDNAME FMT PTR=KK>>16 NAME DISP=KK&X'FFFF' RFTAGS=TAG(FMT PTR); ! FORM/TYPE ETC OF REC FORMAT FLT=60 IF RFTAGS>>8#X'77' THEN -> RERR; ! NOT POINTING TO FORMATNAME ! NOW GO DOWN LIST OF ELEMENTS IN FORMAT LOOKING FOR THE ELT IDEN ! A(I+2) IS PTR TO ELT IDEN P2=TAG(ELT PTR) ELT4=TAG(P2)<<16 ! TAG1(P2); ! 1ST 4 CHARS OF ELT IDEN ID=ELT PTR LIST PTR=LINK(FMT PTR); ! TO PT TO 1ST CELL OF FMT LIST WHILE LIST PTR>0 CYCLE IF TAG(LIST PTR)=ELT4 THEN -> FOUND LIST PTR=LINK(LIST PTR) REPEAT FLT=65; ! SUBNAME NOT FOUND RERR: PRINTNAME(ID) FAULT(FLT) K=X'0101'; ! TYPE=INTEGER LEVEL=1 KK=14; ! ANYTHING > 6 -> OUT ! FOUND: TRDISP=TAG1(LIST PTR) FLT=59 RECTYPE=TRDISP>>16 TYPENO=RECTYPE IF RECTYPE=2 THEN RECTYPE=1; ! MAKE INTEGER-TYPE ELT IF RECTYPE=1 THEN RECTYPE=X'1200' ELSE RECTYPE=X'1100' RDISP=TRDISP&X'FFFF'; ! REL DISP OF REC ELT K=(K&X'FF') ! RECTYPE; ! SET TYPE/FORM=%INTEGERNAME 0R BYTEINTEGER KK=(RDISP<<16) ! NAME DISP; ! PUT REL DISP IN TOP 16 BITS ! FOR A RECORD ELEMENT, RP HAS ! LH16=REL DISP OF ELT RH16=DISP OF RECORDNAME OUT: END; ! REC DISP ROUTINE BLOCK ENTRY ! PLANT THE CODE FOR BLOCK ENTRY TO COPY GLOBAL PART OF OLD ! DISPLAY AND NEW ELEMENTS TO MAKE CURRENT DISPLAY ! R1 POINTS TO OLD DISPLAY,I2 HAS RETURN ADDRESS INTEGER I ENTS=ENTS+1 I=CT NEXT; ! HOLE FOR STATIC STORAGE IF IN EXT#0 THENSTART LEVEL=LEVEL+1; ! TO MAKE IT 2 D11A(CLR,0,0,0,4,SP,0); ! WORD TO HOLD OLD CT PTR. EM(32) IF TARGET&8192=0 START PRINTSTRING(" SWT-. CT0-. ") CA=CA+4 FINISHELSESTART SWTCA=CA OCT(CA) CTCA=CA OCT(CA) FINISH IN EXT=0 FINISH ELSE START IF CHECKS&16384=0 THEN EM(4) ELSE C D11A(JSR,0,R4,0,9,166,BLKENT) FINISH OCTN((LEVEL<<13)!I,0); ! OFFSET IN WORDS IF LEVEL>4 THEN FAULT(34) ! FOR NEW LEVEL... STAR(LEVEL)=I; ! REMEMBER HOLE FOR FILLING LATER JUMP(LEVEL)=0; !CLEAR ASSORTED LISTHEADS NAME(LEVEL)=0 CYC(LEVEL)=0 SBR(LEVEL)=0 RECELTS(LEVEL)=0 IUSES0 END; ! BLOCK ENTRY ROUTINE UP STACK PTR(INTEGER N) ! DUMPS CODE TO INCREASE (INCL. DECREASE) STACK TOP PTR BY N(BYTES) INTEGER I,J J=ADD IF N<0 THEN START J=SUB N=-N FINISH CYCLE I=0,1,5 IF IUSE(I)=16 THEN IUSE(I)=0 REPEAT D11A(J,8,0,N,1,R1,0); ! ADD #N,@R1 END; ! UP STACK PTR ROUTINE ARRAD(INTEGER MODE, INTEGERNAME REG) ! DUMP CODE TO CALCULATE ARRAY ELEMENT ADDRESS, LEAVING IT IN REG. ! BOTTOM BIT OF MODE INDICATES RESULT IN ACC OR INDEX ! SECOND BOTTOM BIT INDICATES IF ACC FREE OR MUST BE SAVED ! ENTERED WITH AP POINTING TO <NAME> OF <NAME><APP> ! EXIT WITH AP ON ALT OF PHRASE WHICH FOLLOWS <APP>. INTEGER I,J,K,RI,JJ,ABC ABC=CHECKS&4; ! 0 CHECKS OFF #0 CHECKS ON ARADS=ARADS+1 I=WS; ! PRESERVE WORKSPACE VALUE WS=0; ! NEW WORKSPACE VALUE IF I#0 THEN UP STACK PTR(I) J=TAG OF(A(AP)) JJ=TAG OFF(A(AP)) IF J>>8&15=6 THEN ABC=4 ! NOT USED RI=J>>8&15 - 1; ! SET RI 0 FOR INT, 1 FOR REAL. SAVE INTER UNLESS MODE<2 IF ABC#0 THENSTART IUSE(3)=IUSE(3) ! 128 IUSE(0)=IUSE(0) ! 128 RELEASE(3); ! NEEDED FOR PERM CALL RELEASE(0) IUSE(3)=IUSE(3) & X'FF7F' IUSE(0)=IUSE(0) & X'FF7F' FINISH AP=AP+1; ! ON <APP> IF A(AP)=1 THEN ->L4; ! SHOULD BE PARAMETER EXPRESSION FAULT(22); !NO ARRAY INDEXES ->L2 ! ! EVALUATE SUFFIX EXPRESSIONS. L4: AP=AP+1; ! ON <+-?> IF WS#0 THEN WS=WS+4; ! INCREMENT WORKSPACE EXCEPT FOR SEXPR(K); ! EVALUATE INDEX, SHOULD BE INTEGER ! SUFFIX IS NOW IN INTERMEDIATE. IF WS=0 THEN WS=4; ! RESET WORKSPACE VALUE IF K>2 THEN FAULT(24); !REAL EXPRN IF A(AP)=1 THEN ->L4; ! MORE INDEX EXPRESSIONS L2: AP=AP+1; ! SET POINTER TO AFTER ARRAY ELEMENT IF ABC#0 THEN -> CHECKS ON ! CHECKS OFF ! SUFFIX IS IN INTERMEDIATE (FROM SEXPR) ! ADD FIRST WORD OF HDR = ADDR(A(0)) REG=INTER TO REG(3) WS=(J>>8)&15-1 WHILE WS#0 CYCLE WS=WS-1 D11A(MASL,0,0,0,0,REG+100,0) REPEAT DUMP(ADD,J&15,JJ) -> JOINAR CHECKS ON: LOSE(0) K=INTER TO REG(0); ! GET SUFFIX TO R0 UNLOCK(0); ! DOESN''T WANT TO BE ! PLACE DETAILS OF ARRAY HD IN WORD FOLLOWING TRAP. ! FROM LEFT, 1ST 3 BITS = LEVEL ! NEXT = 0, INT 1, REAL ! REMAINING 12 = DISPLACEMENT (IN WORDS) FROM LEVEL. JJ=JJ>>1 FAULT(40) IF JJ>4095; ! JJ TOO BIG FOR 12 BITS J=((J&15)<<13) ! JJ ;!TAGS FOR HD IF J=UTAG AND CHECKS&512=0 THEN PPJ(2) ELSESTART UTAG=J PPJ(1) OCTN(J,0) FINISH ! PERM LEAVES ADDR IN I3 REG=3 JOINAR: WS=I; ! RESTORE OLD WORKSPACE VALUE LOCK(REG) IF I#0 THEN UP STACK PTR(-I) UNLOCK(REG) IF MODE<2 THEN RETURN RESTORE INTER END; ! ARRAD ROUTINE SET LINE OWNINTEGER LAST LINE=0 IF LINE=LAST LINE OR CHECKS&1=0 THENRETURN PPJ(37) IF TARGET&8192=0 START WRIT(LINE); PRINTSTRING(". ") CA=CA+2 FINISHELSE OCT(LINE) LAST LINE=LINE END; ! SET LINE ROUTINE SET LAB(INTEGER BTP) PLAB=PLAB+1; ! INDICATOR ONLY IUSES0 FPOL SETS(2) IF BTP>=0 AND TARGET&8192=0 THEN START PRINTSTRING("BT"); WRIT(BTP); PRINTSTRING("=. ") FINISH ! FLACC MUST BECOME 'OUT OF USE' AT LABEL FLACC=0 ! SWITCH TABLE ELSE BRANCH TABLE IF BTP<0 THEN SWT(BTP)=CA ELSE BAT(BTP)=CA DBIN(-1,BTP,0,0,0,0,0) UNLESS TARGET&8192=0 IF BRFAULT=1 THEN FAULT(99) END; ! SET LAB ROUTINE CBPAIR(INTEGERNAME LB,UB) !P ON ALT OF P<CBPAIR> ON ENTRY LB=A(AP+3) IF A(AP+1)=2 THEN LB=-LB UB=A(AP+7) IF A(AP+5)=2 THEN UB=-UB AP=AP+9 END; ! CBPAIR INTEGERFN FIND LABEL ! CHECK & LOCATE OR INSERT LABEL IN JUMP LIST FOR THIS LEVEL INTEGER I,J,LABEL IF A(AP)=1 THEN ->L6; ! ALPHANUMERIC LABEL AP=AP+1 I=A(AP); ! TYPE OF CONST LABEL=A(AP+1); ! VALUE OF CONST AP=AP+3; ! AFTER <CONST> IF I=2 AND LABEL<8192 THEN ->L3; ! VALID LABEL NUMBER FAULT(38); !INVALID LABEL RESULT =-1; ! 'FAULTY' RESULT ! NUMERIC LABEL L3: I=JUMP(LEVEL); ! JUMP LIST POINTER IF I=0 THEN ->L1; ! NOTHING IN LIST YET L2: IF LABEL=TAG(I) THEN RESULT =TAG1(I); ! LABEL ALRE I=LINK(I); ! NEXT CELL IN LIST IF I#0 THEN ->L2; ! MORE CELLS YET L1: J=BT NEXT; ! NEXT BRANCH TABLE POSITION PUSH(JUMP(LEVEL),LABEL,J) RESULT =J; ! NEW BRANCH TABLE POSITION ! ALPHANUMERIC LABEL L6: I=A(AP+1); AP=AP+2; ! NO. OF NAME FOR NAME LABEL LABEL=I+8192; !UNIQUE NO. FOR NAME LABEL J=TAG OF(I) IF J>>12=8 AND J&15=LEVEL THEN ->L3; !CURRENTLY LAB STORE TAG(I,8,0,0,LEVEL,0) -> L3 END; ! FIND LABEL ROUTINE STORE TAG(INTEGER NAM,FORM,TYPE,DIM,LEV,AD) ! STORE TAGS I.E. SET NAME & CHECK NOT SET ALREADY INTEGER M M=LINK(NAM); ! POINTER TO EXISTING TAGS WORD IF M=0 OR LEV#TAG(M)&15 OR FORM&12#0 THEN ->L1; ! NOT ! SET, ! AT THIS LEVEL OR NEW NAME A ROUTINE/FN/MAP FAULT(7); !NAME SET TWICE RETURN L1: PUSH(LINK(NAM),FORM<<12!TYPE<<8!DIM<<4!LEV,AD) PUSH(NAME(LEVEL),NAM,0); ! PUSH ONTO LIST OF NAMES AT ! THIS LEVEL. NAME(LEVEL) LIST HOLDS PTRS INTO HASHING AREA. END; ! STORE TAG ROUTINE HOY NAME(INTEGER I) ! PARAM IS PTR INTO HASHING AREA FOR THE NAME. IF CHECKS&1024#0 START PRINTSTRING(" HOY NAME I LINK(I) OLD TAG(I) NEW TAG(I) ") WRITE(I,7) WRITE(LINK(I),12) WRITE(TAG(I),18) FINISH IF LINK(I)#0 THEN ->L9; ! STILL DECLARED L1: IF TAG(I)=0 THEN ->L9; ! LIST EMPTY TAG(I)=RETURN CELL(TAG(I)) IF CHECKS&1024#0 THEN WRITE(TAG(I),10) ->L1; ! RETURN 4 CHARS L9: IF CHECKS&1024#0 THEN NEWLINE END; ! HOY NAME ROUTINE DETAG ! DESTROYS TAG LIST AND FAULTS ROUTINE BODIES MISSING INTEGER I,J,K,L,FORM,TYPE,KK POP(BDIAGSPTR,K,L) IF TARGET&4096#0 START SETS(0) IF L=-1 THEN PRINTSTRING("%BEGIN") ELSESTART PRINTSYMBOL('%'); PRINTNAME(L); FINISH WRITE(LEVEL,5) WRITE(K,7) NEWLINE SETS(2) FINISH L1: POP(NAME(LEVEL),J,I) IF J<0 THEN ->L9 POP(LINK(J),K,KK); ! DESTROY CELL HAVING CURRENT USE FORM=K>>12 TYPE=(K>>8)&15 IF TARGET&4096#0 AND FORM#4 AND FORM<7 START ! LIST OF NAMES & DISPLACEMENTS FOR BRIANS SYSTEM. SETS(0) PRINTNAME(J) WRITE(FORM,5) WRITE(TYPE,5) WRITE(K&15,5) IF KK>5 OR FORM>=4 THEN WRITE(KK&X'FFFF',5) ELSEC WRITE(TAG OFF(J)&X'FFFF',5) NEWLINE SETS(2) FINISH ! THROW AWAY CELL HAVING ADDR(ARRAY(0)) FOR CONT BDD ARRAY IF LINK(J)&X'8000'#0 THENSTART K=1 LINK(J)=LINK(J)&X'7FFF' ->L3 FINISH ! SKIP THINGS WHICH ARE (COND1) NOT RT OR FN NAMES AND (COND2) SW NAMES. IF FORM<4 OR (FORM=8 AND TYPE=0) THEN -> L4 IF TYPE>=7 THEN -> L2; ! %EXT RT/FN/MAP OR REC FMT ! FOR INTERNAL RT/FN/MAP, CHECK THAT IT''S BEEN DECLARED IF BAT(KK)>=0 THEN ->L2; !RT ADDR KNOWN SO BODY GIVEN SETS(3) PRINTSYMBOL(';') PRINT NAME(J); SPACE; ! FAULTY NAME TO LISTING FAULT(28); !ROUTINE MISSING L2: K=K>>4&15; ! NO. OF PARAMS L3: IF K=0 AND TYPE#7 THEN ->L4; ! NO (MORE) PARAMS POP(LINK(J),L,I); ! DESTROY PARAM CELL K=K-1; ->L3 UNLESS L<0 L4: HOY NAME(J); ! TEXT OF NAME CELLS BACK TO ASL ->L1 L9: WHILE RECELTS(LEVEL)#0 CYCLE POP(RECELTS(LEVEL),J,I) HOY NAME(I) REPEAT END; ! DETAG ROUTINE PPJ(INTEGER N) ! PLANTS JUMP TO PERM ROUTINE PJS=PJS+1 EM(N) END; ! PPJ ROUTINE PJ(INTEGER BRANCH,SL,N) ! PLANTS CONDITIONAL JUMP TO ENTRY N OF BRANCH TABLE ! BRANCH CAN BE BUNC,BRZ,BRNZ,BRL,BRG,BRNL,BRNG ON REG !SL=0: PLANT A SHORT JUMP UNLESS THE LABEL HAS BEEN DECLARED AND IT''S ! MORE THAN 127 WORDS AWAY. !SL=1: PLANT A LONG JUMP UNLESS LABEL HAS BEEN DECLARED AND IT''S ! <127 WORDS BEHIND, OTHERWISE LONG. ! ! BUT IF SR OR JS NON-NEGATIVE, PLANT SHORT JUMPS ANYWAY. ! (UNLESS A LONG JUMP CAN BE SEEN TO BE NEEDED). ! INTEGER J,MODE,NEM ! ! -> SHORT IF (SL=0 OR JS>=0 OR SR>=0) AND LJS<=0 ! ! PLANT SHORT IF LABEL DECLARED & <127 WORDS BACK, ELSE LONG. IF BAT(N)>0 AND CA-BAT(N)<=252 AND LJS=0 THEN -> SHORT IF LJS>0 THEN LJS=LJS-1 LONG: IF BRANCH=BR THEN -> L3 CYCLE J=1,1,7 -> L2 IF BRANCH=TRUE(J) REPEAT L2: D11A(FALSE(J),0,0,0,11,150,-1); ! CBR .+6; !-1 IS TO HELP !RT OPERAND. L3: MODE=13; NEM=BT; ! LONG, BT-N IF BAT(N)>0 THEN START MODE=14; NEM=LLAB; ! LONG, L-N N=BAT(N) FINISH D11A(JMP,0,0,0,MODE,NEM,N) -> L9 SHORT: ! HOWEVER, IF THE LABEL HAS BEEN DECLARED AND WE KNOW IT NEEDS ! A LONG JUMP, PLANT IT LONG. IF BAT(N)>0 AND CA-BAT(N)>252 THEN -> LONG MODE=11; NEM=BT; ! SHORT, BT-N IF BAT(N)>0 THEN START MODE=12; NEM=LLAB; ! SHORT, L-N N=BAT(N) FINISH D11A(BRANCH,0,0,0,MODE,NEM,N) L9: END; ! PJ ROUTINE DUMP(INTEGER OPB,BASE,DISP) SWITCH S(0:8) INTEGER J,K,L,M,P1 INTEGER SMODE,SNEM,SNUM,DMODE,DNEM,DNUM INTEGER TYPE,REG,OP OP=OPB & 255 REG=0 PRR PRI(0) TYPE=OP IF OP=LOAD THEN TYPE=0 IF OP=STR OR (156<=OP AND OP<=158) THEN TYPE=2 IF OP=INC OR OP=DEC OR OP=CLR THEN TYPE=4 IF OP=NEG OR OP=NOT THEN TYPE=5 IF 32<BASE AND BASE<=37 THEN START BASE=BASE-32 REG=7; ! TO MEAN INDIRECT FINISH IF BASE=-1 THENSTART ! OPERATE ON INTERMEDIATE WITH TEMP TYPE=6 IF OP=CMP THEN TYPE=7 FINISH ! THIS BELOW IS INTENDED TO COPE WITH BIC,BIS,COM,ADD,SUB IF TYPE>126 THEN TYPE=1 ! IF BASE>=100, ITS A REGISTER MNEMONIC ! THEN IF INDEX=0 ITS A 'PTD TO BY REG' MODE 7 ! #0 ITS A 'DISP(REG)' MODE 8 IF BASE>=100 THENSTART REG=BASE-100 BASE=7; ! PTD TO BY REG IF DISP>0 THEN START; ! DISP(REG) BASE=8 FINISH IF DISP<0 THEN BASE=6; ! IN A REG (REGISTER TYPE) FINISH IF OP=TST THEN TYPE=8; ! TST INTERMEDIATE -> S(TYPE) S(0): ! LOAD PAR1(0)=ENCODE(BASE) ! REG PAR2(0)=DISP PAR3(0)=0 IF OPB>255 THEN PAR3(0)=1 IF 6<=BASE AND BASE<=8 THEN LOCK(REG) RETURN S(1): ! ADD/SUB/BIS ! GET INTERMEDIATE TO REGISTER J=INTER TO REG(-1); ! ANY REG LOSE(INTER REG) IF OPB>255 THEN START REG=BYTE TO REG(BASE,DISP,REG) BASE=6 OPB=OP; ! USE THE NON-BYTE OPERATOR FINISH PAR1(1)=ENCODE(BASE) ! REG PAR2(1)=DISP K=LOAD INDEX(1,SOUR) DMODE=0 DNEM=100+J DNUM=0 -> PLANTS S(2): ! INTERMEDIATE TO STORE ('STR') ! ALSO ADDS, SUBS, BISS ! FOR MOV INTER TO STORE, WHERE INTER IS BYTE AND PROVIDED ITS NOT ! 'STRB', GET INTER TO REG FIRST IF PAR3(0)=1 AND OPB<255 THEN J=INTER TO REG(-1) J=LOAD INDEX(0,SOUR) IF OPB>255 AND SOUR(1)=SP START J=FREE REG D11A(OP,SOUR(0),SOUR(1),SOUR(2),0,J+100,0) SOUR(0)=0 SOUR(1)=J+100 SOUR(2)=0 FINISH IF BASE=17 THEN START ! STORE TO (REG)+, REG=DISP IN CALL OF DUMP DMODE=2 DNEM=DISP DNUM=0 IUSE(DISP)=0 UNLOCK(INTER REG) -> PLANTS FINISH PAR1(1)=ENCODE(BASE) ! REG PAR2(1)=DISP ! IMPORTANT NOT TO RELOAD THE LEVEL PTR FOR DEST, SO LOCK IT LOCK(J) IF J>=0 K=LOAD INDEX(1,DEST) UNLOCK(J) IF J>=0 ! FOR INTERMEDIATE 'IN REG' OR 'PTD TO BY REG', THE REG IS NOW FREE. UNLOCK(INTER REG); ! (IF IT WAS LOCKED) PLANTDS: DMODE=DEST(0) DNEM=DEST(1) DNUM=DEST(2) -> PLANTS S(3): ! MOV STORE TO -(SP) LOSE(INTER REG) PAR1(1)=ENCODE(BASE) ! REG PAR2(1)=DISP J=LOAD INDEX(1,SOUR) IF OPB>255 START J=FREE REG+100 D11A(MOVB,SOUR(0),SOUR(1),SOUR(2),0,J,0) SOUR(0)=0 SOUR(1)=J SOUR(2)=0 FINISH DMODE=4; ! -(SP) DNEM=SP DNUM=0 OPB=MOV -> PLANTS S(4): ! INC, DEC, CLR ON STORE PAR1(0)=ENCODE(BASE) ! REG PAR2(0)=DISP -> L80 S(8): ! TST INTERMEDIATE RETURN IF INTER BASE=6 AND INTER REG=CCSET L80: J=LOAD INDEX(0,DEST) D11A(OPB,0,0,0,DEST(0),DEST(1),DEST(2)) RETURN S(5): ! NEG/NOT ON INTERMEDIATE J=INTER TO REG(-1); ! ANY REG LOSE(INTER REG) D11A(OP,0,0,0,0,100+J,0) RETURN S(6): ! OPERATE WITH TEMP SAVED ON INTERMEDIATE LOSE(INTER REG) ! GET INTERMEDIATE TO REG. J=INTER TO REG(-1); ! ANY REG ! GET DETAILS OF TEMP SAVED POP(IHEAD,PAR1(1),L) PAR2(1)=L&X'FFFF' PAR3(1)=L>>16 ! IF TEMP SAVED HAD A LOCKED REGISTER, UNLOCK IT. UNLOCK(P11REG) K=LOAD INDEX(1,SOUR) ! UNLOCK(J) IF PAR3(1)#0 AND PAR1(1)>>7&15=1 START L=FREE REG+100 D11A(MOVB,SOUR(0),SOUR(1),SOUR(2),0,L,0) SOUR(0)=0 SOUR(1)=L SOUR(2)=0 FINISH DMODE=0 DNEM=100+J DNUM=0 OPB=OP PLANTS: SMODE=SOUR(0) SNEM=SOUR(1) SNUM=SOUR(2) D11A(OPB,SMODE,SNEM,SNUM,DMODE,DNEM,DNUM) RETURN S(7): ! CMP ! SET UP RH OPERAND OF CMP POP(IHEAD,PAR1(1),K) PAR2(1)=K&X'FFFF' PAR3(1)=K>>16 IF PAR3(1)=1 START; ! BYTE OPERAND K=LOAD INDEX(1,SOUR) LOCK(K) IF K>=0 L=FREE REG UNLOCK(K) IF K>=0 D11A(MOVB,SOUR(0),SOUR(1),SOUR(2),0,100+L,0) K=L DEST(0)=0 DEST(1)=100+K DEST(2)=0 FINISH ELSE K=LOAD INDEX(1,DEST) LOCK(K) IF K>=0; ! LOCK REG CONTAINING OPND, OR LEV PTR ! ! SET UP LH OPERAND OF CMP M=-1 IF OPB>255 THEN M=INTER TO REG(-1) OPB=OP L=LOAD INDEX(0,SOUR) UNLOCK(K) IF K>=0 UNLOCK(M) IF M>=0 UNLOCK(INTER REG); ! (IF IT WAS LOCKED) UNLOCK(P11REG) -> PLANTDS END; ! DUMP INTEGERFN INTER BASE RESULT=PAR1(0)>>11 END; ! INTER BASE INTEGERFN INTER REG ! RESULT=1 IF INTER IS NOT 'IN' OR 'PTD TO BY' REG ! OR DISP(REG) ! (1 IS AN IRRELEVANT ! REG NO , SINCE R1 IS RESERVED). INTEGER BASE,P1 P1=PAR1(0) BASE=P1>>11 RESULT=1 UNLESS 6<=BASE AND BASE<=8 RESULT=P1&7 END; ! INTER REG INTEGERFN P11REG INTEGER BASE,P1 P1=PAR1(1) BASE=P1>>11 RESULT=1 UNLESS 6<=BASE AND BASE<=8 RESULT=P1&7 END; ! P11REG ROUTINE LOSE(INTEGER REG) INTEGER I,J,K RETURN IF REG=1 OR IUSE(REG)&32=0 I=POINT1(REG) POP(LINK(I),J,K) IF J=-1 OR K>5 THEN PRINTSTRING("LOSE ERROR ***** ") POINT1(REG)=-1 IUSE(REG)=IUSE(REG) & X'FFDF'; ! CLR BIT 2**5=32 END; ! LOSE ROUTINE RELEASE(INTEGER REG) INTEGER J,IPT,BASE,P1 LOSE(REG) IF IUSE(REG) & 64=0 THEN RETURN; ! REG NOT LOCKED ! ! THEN REG IS LOCKED, MOVE ITS CONTENTS J=FREE REG MAA(0,100+REG,0,100+J) LOCK(J) ! THE REG WHOSE CONTENTS HAVE BEEN MOVED HAD EITHER A TEMP STORED ! RESULT OR THE CURRENT INTERMEDIATE RESULT. IPT=POINT(REG) IF IPT#0 THEN START TAG(IPT)=(TAG(IPT)&X'FFF8') ! J POINT(J)=POINT(REG) POINT(REG)=0 FINISH ELSE START P1=PAR1(0) BASE=P1>>11 IF 6<=BASE AND BASE<=8 THEN PAR1(0)=(P1&X'FFF8') ! J PRINTSTRING(";RELEASE ") IF RDIAG#0 FINISH UNLOCK(REG) END; ! RELEASE ROUTINE SET INTER(INTEGER REG) ! PARAM IS REG (0-7), TO SET INTER AS BEING IN REG, ! OR DITTO PLUS 8 TO SET INTER AS POINTD TO BY REG. INTEGER B B=6; ! CONTAINED IN REG IF REG>7 THEN B=7; ! PTD TO BY REG REG=REG & 7 PAR1(0)=ENCODE(B) ! REG LOCK(REG) END; ! SET INTER ROUTINE RESTORE INTER INTEGER BASE,J POP(IHEAD,PAR1(0),J) PAR2(0)=J&X'FFFF' PAR3(0)=J>>16 BASE=PAR1(0)>>11 IF 6<=BASE AND BASE<=8 THEN POINT(INTER REG)=0 END; ! RESTORE INTER ROUTINE SAVE INTER INTEGER BASE,P1 P1=PAR1(0) BASE=P1>>11 ! FOR 1 - 4 6 14, 15, NO NEED TO DO ANYTHING ! FOR 6 - 8 JUST THE REGISTER LOCKED ! FOR 9, IT''S THERE ALREADY IF 6<=BASE AND BASE<=8 THENSTART LOSE(INTER REG) IF LOCKED>3 THEN INTER TO SP; ! SETS PAR1(0) FINISH PUSH(IHEAD,PAR1(0),(PAR3(0)<<16) ! PAR2(0)) IF 6<=BASE AND BASE<=8 THEN POINT(INTER REG)=IHEAD END; ! SAVE INTER ROUTINE INTER TO SP INTEGER BASE,J BASE=PAR1(0)>>11 ! PERHAPS ITS ALREADY @SP... IF BASE=9 THEN RETURN ! UNLOCK ANY REG WHICH CONTAINED OR WAS BEING USED TO REFERENCE INTER IF PAR3(0)#0 THEN J=INTER TO REG(-1) UNLOCK(INTER REG) J=LOAD INDEX(0,SOUR) D11A(MOV,SOUR(0),SOUR(1),SOUR(2),4,SP,0) PAR1(0)=ENCODE(9) END; ! INTER TO SP INTEGERFN INTER TO REG(INTEGER DREG) ! DREG>=0 TO R<N> ! DREG <0 TO ANY REG ! THE REGISTER IS LOCKED. INTEGER BASE,P1,J,SREG P1=PAR1(0) BASE=P1>>11 SREG=P1&7 ! PERHAPS ITS IN A REG ALREADY... IF BASE=6 AND (DREG=SREG OR DREG<0) THEN RESULT=SREG IF BASE=7 THENSTART ! POINTED AT BY REG IF DREG<0 THEN START DREG=FREE REG; !INCASE SREG CONTAINS RECORD NAME POINTER ! DREG=SREG ! %IF SREG=0 %OR SREG=3 %THEN DREG=FREE REG FINISH ELSE START IF DREG#SREG THEN RELEASE(DREG) FINISH J=MOV IF PAR3(0)#0 THEN J=MOVB D11A(J,1,SREG+100,0,0,DREG+100,0) UNLOCK(SREG) -> L9 FINISH IF DREG<0 THEN DREG=FREE REG ELSE RELEASE(DREG) IF BASE=9 THEN STOP; ! ERROR IF BASE=6 OR BASE=8 THEN UNLOCK(SREG) J=LOAD INDEX(0,SOUR) J=MOV IF PAR3(0)#0 THEN J=MOVB D11A(J,SOUR(0),SOUR(1),SOUR(2),0,100+DREG,0) L9: PAR1(0)=ENCODE(6) ! DREG PAR3(0)=0 LOCK(DREG) PRR RESULT=DREG END; ! INTER TO REG INTEGERFN FREE REG ! FIND A FREE INDEX REGISTER ! CHOOSES IUSE SUFFIX CONTAINING LOWEST VALUE<30 ! WILL NOT GIVE A REG IF ITS IUSE IS >32 OWNINTEGERARRAY ORDER(0:14)= C 0,2,3,4,5, 5,4,2,3,0, 4,2,5,3,0 INTEGER I,J,MINR,P,X,START START=ALGO*5 ALGO=0 PRR MINR=1000; X=-1 CYCLE I=0,1,4 J=ORDER(START+I) P=IUSE(J) IF P>32 THEN ->L1 IF P<MINR THENSTART ; MINR=P; X=J; FINISH L1: REPEAT IF X<0 THEN FAULT(110) IF RDIAG#0 THENSTART PRINTSTRING(";FREE REG"); WRITE(X,1); NEWLINE FINISH IUSE(X)=0 RESULT=X END; ! FREE REG ROUTINE LOCK(INTEGER REG) RETURN IF REG=1 IF IUSE(REG)&64#0 START RETURNUNLESS CHECKS&2#0 PRINTSYMBOL(';') WRITE(REG,1) PRINTSTRING(" ALREADY LOCKED ***** ") RETURN FINISH IUSE(REG)=IUSE(REG) ! 64 LOCKED=LOCKED + 1 END; ! LOCK ROUTINE UNLOCK(INTEGER REG) RETURN IF REG=1 IF IUSE(REG)&64=0 THEN RETURN IUSE(REG)=IUSE(REG) & 63 LOCKED=LOCKED - 1 END; ! UNLOCK INTEGERFN SET INDEX(INTEGER BASE) INTEGER RES,K RES=1 IF BASE=LEVEL THEN -> SET UP CYCLE RES=0,1,5 IF RES#1 AND IUSE(RES)=BASE THEN -> SET UP REPEAT ALGO=1 RES=FREE REG K=BASE&15 K=5 IF K=15 D11A(MOV,6,R1,2*K,0,100+RES,0) IUSE(RES)=BASE SET UP: RESULT=RES END; ! SET INDEX INTEGERFN ADDRDUMP(INTEGER LEVEL,DISP) INTEGER J,LDD PAR1(1)=ENCODE(LEVEL) PAR2(1)=DISP PAR3(1)=0 J=LOAD INDEX(1,SOUR) ALGO=0 LDD=FREE REG D11A(MOV,SOUR(0),SOUR(1),SOUR(2),0,LDD+100,0) RESULT=LDD END; ! ADDRDUMP INTEGERFN LOAD INDEX(INTEGER OT,INTEGERARRAYNAME LOCN) ! RESULT IS REG NO OF LEVEL POINTER IF ONE HAS BEEN LOADED ! OTHERWISE RESULT=-1 INTEGER P1,P2,NEM,NUM,BASE,RES,PIC INTEGER INDIRECT INDIRECT=0 RES=-1 P1=PAR1(OT) P2=PAR2(OT) BASE=P1>>11 PIC=CHECKS&8 IF 1<=BASE AND BASE<=4 AND P1&7=7 THEN INDIRECT=INDIRECT+1 IF (2<=BASE AND BASE<=4) OR BASE=16 C OR (PIC#0 AND (BASE=1 OR BASE=15)) THENSTART RES=SET INDEX(BASE) ! SET UP NEW STATUS PAR1(OT)=ENCODE(8) ! RES; ! PDISP(REG) FINISH P1=PAR1(OT) NEM=0 NUM=0 IF P1&16#0 THEN NUM=PAR2(OT) IF P1&32#0 THEN START IF P1&8=0 THEN NEM=STB ELSE NEM=CT FINISH IF P1&64#0 THEN NEM=100 + (P1&7); ! REG LOCN(0)=(P1>>7)&15+INDIRECT; ! MODE LOCN(1)=NEM LOCN(2)=NUM -> L999 IF RDIAG=0 PRINTSTRING("LD INDX ") PRINTSTRING("OT=") PRINTSYMBOL(OT+'0') PRINTSTRING("; ") PRINTSYMBOL(LOCN(-1)) WRITE(LOCN(0),3) SPACES(2) IF NEM=0 THEN PRINTSTRING(" 0") ELSE PMN(LOCN(1)) WRITE(LOCN(2),1) NEWLINE L999: RESULT=RES END; ! LOAD INDEX ROUTINE LD ADDR(INTEGER REG,BASE,DISP) ! IN PARAMS - REG = -1 JUST SET UP INTERMEDIATE ! > 0 LOAD ADDRESS TO THAT REG ! BASE TO DEFINE INTER MODE INTEGER PIC,J,K UNLESS 1<=BASE<=4 OR BASE=15 THEN C PRINTSTRING("RINTTEXT'RT. LD ADDR? ") PIC=CHECKS&8 IF (BASE=1 OR BASE=15) AND PIC=0 THEN START ! #STB+ #CT0+ IF REG<0 THEN START IF BASE=1 THEN J=0 ELSE J=8; ! STB ELSE CT0 PAR1(0)=ENCODE(12) ! J PAR2(0)=DISP FINISH ELSE START IF BASE=1 THEN J=STB ELSE J=CT D11A(MOV,8,J,DISP,0,100+REG,0) FINISH RETURN FINISH ! OTHERWISE WE KNOW WE HAVE TO LOAD A REG (OR USE ONE THATS ! ALREADY LOADED) IF REG<0 THEN REG=FREE REG ELSE RELEASE(REG) D11A(MOV,8,0,DISP,0,100+REG,0) J=1; ! FOR R1 IF BASE=LEVEL IF BASE=LEVEL THEN -> FOUND CYCLE J=0,1,5 IF J#1 AND IUSE(J)=BASE THEN -> FOUND REPEAT ! THEN THERES NOT A REG SET UP K=BASE&15 K=5 IF K=15 D11A(ADD,6,R1,2*K,0,100+REG,0) -> SETPAR FOUND: D11A(ADD,0,J+100,0,0,REG+100,0) SETPAR: PAR1(0)=ENCODE(6) ! REG LOCK(REG) END; ! LD ADDR INTEGERFN BYTE TO REG(INTEGER BASE,DISP,REG) INTEGER J,K PAR1(1)=ENCODE(BASE) ! REG PAR2(1)=DISP J=LOAD INDEX(1,SOUR) K=FREE REG D11A(MOVB,SOUR(0),SOUR(1),SOUR(2),0,K+100,0) RESULT=K END; ! BYTE TO REG ROUTINE PRR INTEGER J,USE RETURN UNLESS RDIAG#0 PRINTSYMBOL(';') CYCLE J=0,1,5 USE=IUSE(J) IF USE=0 OR J=1 THEN -> L9 PRINTSTRING("R".TOSTRING(J+'0')." ") IF USE&32#0 THEN START PRINTSTRING(" SCALAR ") PRINTNAME(POINT1(J)) FINISH IF USE&64#0 THEN PRINTSTRING(" LOCKED") PRINTSTRING(", ") L9: REPEAT NEWLINE PRINTSTRING(" LOCKED ="); WRITE(LOCKED,1) NEWLINE END; ! PRR ROUTINE PRI(INTEGER OT) INTEGER BASE,MODE,REG,P1 RETURN UNLESS RDIAG#0 PRINTSTRING("PAR"); PRINTSYMBOL(OT+'0'); PRINTSTRING(": ") P1=PAR1(0) BASE=P1>>11 REG=P1&7 MODE=(P1>>7)&15 WRITE(MODE,1) SPACE IF P1&64#0 THENSTART PRINTSYMBOL('R') PRINTSYMBOL(REG+'0') SPACE FINISH IF P1&32#0 THENSTART IF P1&8=0 THEN PRINTSTRING("STB") ELSE PRINTSTRING("CT0") FINISH IF P1&16#0 THEN WRITE(PAR2(OT),1) NEWLINE END; ! PRI ROUTINE D11(INTEGER OP,MODE,NEM,NUM) INTEGER NL IND,BYT NL IND=MODE FPOL MODE=MODE-100 IF MODE>90 BYT=0 IF OP>255 THEN START OP=OP & 255 BYT=BYT + 1 FINISH PRLAB; !SETS UP OBJ STREAM CA=CA+2 SPACE PMN(OP) IF BYT#0 THEN PRINTSYMBOL('B') SPACE OPERAND(MODE,NEM,NUM) NEWLINE UNLESS NL IND>90 END; ! D11 ROUTINE D11A(INTEGER OP,M1,NEM1,NUM1,M2,NEM2,NUM2) FPOL PRLAB; !SETS UP OBJ STREAM IF M1=12 THEN PRINTSTRING("*****MODE 12********** ") IF M1=8 THENSTART ; !AA IF NUM1=1 THENSTART ; !BB IF OP=ADD THENSTART ; OP=INC; ->L3; FINISH IF OP=SUB THENSTART ; OP=DEC; ->L3; FINISH FINISH ; !BB IF (OP&255=MOV OR OP&255=STR) AND NUM1=0 AND NEM1#CT C THENSTART OP=OP&256+CLR L3: IF TARGET&8192#0 START DBIN(OP,0,0,0,M2,NEM2,NUM2) RETURN FINISH D11(OP,M2+100,NEM2,NUM2); !+100 TO SUPPRESS NL IN D11 ->L9 FINISH FINISH ; !AA IF TARGET&8192#0 START DBIN(OP,M1,NEM1,NUM1,M2,NEM2,NUM2) CCSET=-1 IF M2=0 THEN CCSET=NEM2-100 RETURN FINISH D11(OP,M1+100,NEM1,NUM1); !+100 TO SUPPRESS NL IN D11. IF M1#0 OR NEM1#0 OR NUM1#0 THEN COMMA OPERAND(M2,NEM2,NUM2) CCSET=-1 IF M2=0 THEN CCSET=NEM2-100 L9: NEWLINE END; ! D11A ROUTINE OPERAND(INTEGER MODE,NEM,NUM) SWITCH K(-1:14) IF MODE>=8 AND MODE#11 AND MODE#12 THEN CA=CA+2; !ALSO FOR 6 & 7, SEE ! BELOW ->K(MODE) K(1): !DREG K(10): !DREL PRINT SYMBOL('@') K(-1): !NON-CORE, NON-REG EG. TRAP K(0): !REG K(9): !REL PMN(NEM) UNLESS NEM=0 IF NUM=0 THEN ->L9 ->PLUSNUM K(3): !DAINC PRINTSYMBOL('@') K(2): !AINC INPAREN: PRINT SYMBOL('(') PMN(NEM) PRINT SYMBOL(')') IF MODE=2 OR MODE=3 THEN PRINT SYMBOL('+') ->L9 K(5): !DADEC PRINT SYMBOL('@') K(4): !ADEC PRINT SYMBOL('-') ->INPAREN K(7): !DINDX PRINT SYMBOL('@') K(6): !INDX IF NUM#0 THENSTART CA=CA+2 WRIT(NUM) PRINTSYMBOL('.') FINISH ->IN PAREN K(11): ! REL (SHORT BRANCHES) K(13): ! REL (MNEMONIC WITH NUM CONCATENATED) PMN(NEM) WRIT(NUM) UNLESS NUM<0 ->L9 K(12): ! REL (SHORT BRANCHES K(14): ! REL PMN(NEM) OCT5(NUM) -> L9 K(8): !IMMEDIATE PRINT SYMBOL('#') UNLESS NEM=0 THEN PMN(NEM) PLUSNUM: PRINT SYMBOL('+') UNLESS NUM<0 ! ! THERE ARE 'UNDER' WORDS UNDER LEVEL 1 DISPLAY. ! IF NEM=STB THEN NUM=NUM+UNDER WRIT(NUM) PRINT SYMBOL('.') L9: END; ! OPERAND ROUTINE MAA(INTEGER M1,A1,M2,A2) !MOV ACC TO ACC D11A(MOV,M1,A1,0,M2,A2,0) END; ! MAA ROUTINE EM(INTEGER I) OWNINTEGER INST=X'8900' PRLAB IF TARGET&8192=0 START D11(TRAP,-1,0,I) CA=CA+2 FINISHELSE OCT(INST!I) CCSET=-1 END; ! EM ROUTINE IUSES0 INTEGER J,K,L CYCLE J=0,1,5 LOSE(J) IUSE(J)=0 REPEAT LOCKED=0 UTAG=0 CCSET=-1 END; ! IUSES0 ROUTINE PRLAB SETS(2); !SET UP OBJ STREAM !GET OUT OF POLISH MODE IF IN. FPOL HAS NO EFFECT IF NOT IN, !OTHERWISE POLISH IS 1ST SET 0, THEN D11 CALLED FOR 'BR .+2'. FPOL RETURN IF PLAB=0 IF TARGET&8192=0 START PRINT SYMBOL('L') OCT5(CA) PRINTSTRING(": ") FINISH PLAB=0 END; ! PRLAB ROUTINE PMN(INTEGER I) ! !---------------------------------------------------------------------- ! %OWNINTEGERARRAY MNIND(100:166)= %C ! 100/ 0,4,7,10,13,16,20,23,26,29,33, ! 111/ 38,42,46,50,54,58,62,66,70, ! 120/ 76,80,84,88, ! 124/ 92,96,100,104, ! 128/ 108,112,42,236,121, ! 133/ 124,127,130,133, ! 137/ 136,139, ! 139/ 175,231,179,183,188,192,197, ! 146/ 202,207,212,217,222,226,170,0,0,0,142,146,104, ! 159/ 142,146,150,154,158,162,166,240 !----------------------------------------------------------------------- ! %OWNINTEGERARRAY MNS(0:1123)= %C ! 0 M'R0',M' ',M'R1',M' R',M'2 ',M'R3',M' R',M'4 ',M'R5',M' ', ! 20 M'SP',M' P',M'C ',M'BR',M' J',M'MP',M' J',M'SR',M' ', ! 38 M'TS',M'T ',M'MO',M'V ',M'RT',M'S ',M'CL',M'C ',M'RO',M'R ', ! 58 M'AS',M'L ',M'ST',M'B ',M'CT',M'0 ',M'TR',M'AP',M' ', ! 76 M'BN',M'E ',M'BE',M'Q ',M'BG',M'E ',M'BL',M'T ', ! 92 M'BL',M'E ',M'BG',M'T ',M'BI',M'C ',M'BI',M'S ', ! 108 M'CO',M'M ',M'BT',M' *',M'2 ',M'*3',M' *',M'4 ', ! 124 M'*5',M' *',M'6 ',M'*7',M' L',M' ', ! 136 M'*9',M' *',M'0 ',M'AD',M'D ',M'SU',M'B ', ! 150 M'IN',M'C ',M'DE',M'C ',M'CL',M'R ',M'CM',M'P ',M'NE',M'G ', ! 170 M'PL',M'SH',M' L',M'DF',M' F',M'LT',M' S',M'TS',M'T ', ! 188 M'.+',M'2 ',M'EX',M'PF',M' A',M'DD',M'F ', ! 202 M'SU',M'BF',M' N',M'EG',M'F ',M'MU',M'LF', ! 216 M' D',M'IV',M'F ',M'.+',M'6 ',M'EX',M'IT',M' S',M'TR',M'F ', ! 236 M'AS',M'H ',M'BL',M'KE',M'NT',M' ' !----------------------------------------------------------------------- ! OWNINTEGERARRAY MNIND(100:166)= C 0,4,7,10,13,16,20,23,26,29,33, 38,42,46,50,54,58,62,66,70, 76,80,84,88, 92,96,100,104, 108,112,42,236,121, 124,127,130,133, 136,139, 175,231,179,183,188,192,197, 202,207,212,217,222,226,170,0,0,0,142,146,104, 142,146,150,154,158,162,166,240 OWNINTEGERARRAY MNS(0:123)= C M'R0',M' ',M'R1',M' R',M'2 ',M'R3',M' R',M'4 ',M'R5',M' ', M'SP',M' P',M'C ',M'BR',M' J',M'MP',M' J',M'SR',M' ', M'TS',M'T ',M'MO',M'V ',M'RT',M'S ',M'CL',M'C ',M'RO',M'R ', M'AS',M'L ',M'ST',M'B ',M'CT',M'0 ',M'TR',M'AP',M' ', M'BN',M'E ',M'BE',M'Q ',M'BG',M'E ',M'BL',M'T ', M'BL',M'E ',M'BG',M'T ',M'BI',M'C ',M'BI',M'S ', M'CO',M'M ',M'BT',M' *',M'2 ',M'*3',M' *',M'4 ', M'*5',M' *',M'6 ',M'*7',M' L',M' ', M'*9',M' *',M'0 ',M'AD',M'D ',M'SU',M'B ', M'IN',M'C ',M'DE',M'C ',M'CL',M'R ',M'CM',M'P ',M'NE',M'G ', M'PL',M'SH',M' L',M'DF',M' F',M'LT',M' S',M'TS',M'T ', M'.+',M'2 ',M'EX',M'PF',M' A',M'DD',M'F ', M'SU',M'BF',M' N',M'EG',M'F ',M'MU',M'LF', M' D',M'IV',M'F ',M'.+',M'6 ',M'EX',M'IT',M' S',M'TR',M'F ', M'AS',M'H ',M'BL',M'KE',M'NT',M' ' INTEGER K,LR,CH,L L=I&256 I=I-L UNLESS 100<=I AND I<=166 THEN START PRINTSTRING("*PMN* ") WRITE(I,1) RETURN FINISH K=MNIND(I) IF (K=170 AND CHECKS&8192#0) OR (K=240 AND CHECKS&16384#0) C THEN PRINTSTRING("@#") L1: LR=K&1 CH=(MNS(K//2)>>(8*(1-LR))) & 255 IF CH=' ' THEN START IF L#0 THEN PRINTSYMBOL('B') RETURN FINISH PRINTSYMBOL(CH) K=K+1 -> L1 END; ! PMN ROUTINE COMMA PRINT SYMBOL(',') END; ! COMMA END; ! SS ROUTINE FAULT(INTEGER I) SETS(3); !SELECT LISTING FILE NEWLINE PRINTSTRING(";*") WRITE(LINE,4) SPACE IF I=100 THEN ->L1 PRINTSTRING("FAULT") WRITE(I,3) L2: NEWLINE UNLESS I=45 FAULTS=FAULTS+1 IF I>100 THENSTOP RETURN L1: PRINTSTRING(" SYNTAX?") ->L2 END; ! FAULT INTEGERFN NEWCELL ! ALLOCATE NEW CELL FOR LIST PROCESSING ! RETURNS INDEX IN ARRAY LINK - DOUBLE THIS FOR ARRAY TAG. INTEGER I IF ASL=0 THEN ->L1; ! END OF AVAILABLE SPACE LIST I=ASL; ! POINTER TO TOP CELL OF ASL ASL=LINK(ASL); ! ASL POINTER TO NEXT CELL DOWN TAG(I)=0; ! CLEAR NEW CELL OUT TAG1(I)=0 LINK(I)=0 RESULT =I; ! INDEX TO NEW CELL L1: FAULT(107); !ASL EMPTY END; ! NEWCELL INTEGERFN RETURN CELL(INTEGER I) ! DEALLOCATE CELL AND RETURN IT TO ASL INTEGER J J=LINK(I); ! PRESENT LINK VALUE OF CELL LINK(I)=ASL; ! LINK TO TOP OF ASL ASL=I; ! ASL POINTER TO RETURNED CELL RESULT =J; ! RETURN VALUE OF LINK END; ! RETURN CELL ROUTINE PUSH(INTEGERNAME CELL, INTEGER INF,INF1) INTEGER M M=NEWCELL TAG(M)=INF TAG1(M)=INF1 LINK(M)=CELL IF CHECKS&1024#0 START PRINTSTRING("PUSH ") WRITE(CELL,1) WRITE(M,1) SPACE; HEX4(INF) SPACE; HEX4(INF1) NEWLINE FINISH CELL=M END; ! PUSH ROUTINE POP(INTEGERNAME CELL,INF,INF1) INTEGER I IF CELL=0 THEN ->L1 INF=TAG(CELL) INF1=TAG1(CELL) I=CELL CELL=RETURN CELL(CELL) IF CHECKS&1024#0 START PRINTSTRING("POP ") WRITE(I,1) WRITE(CELL,1) SPACE; HEX4(INF) SPACE; HEX4(INF1) NEWLINE FINISH RETURN L1: INF=-1 IF CHECKS&1024#0 THEN PRINTSTRING("POP -1 ") END; ! POP INTEGERFN TAG OF(INTEGER NAME) INTEGER P P=LINK(NAME) IF P#0 THEN P=TAG(P) RESULT =P END; ! TAG OF INTEGERFN TAG OFF(INTEGER N) RESULT=TAG1(LINK(N)) END; ! TAG OFF INTEGERFN PRINT4(INTEGER I) INTEGER J,K,L,M,OE; OE=0 J=TAG(I); ! POINTER TO NAME CELL L5: ! FIRST OR NEXT TWO CHARS. IF OE=0 THEN K=TAG(J) ELSE K=TAG1(J) L=8; ! FIRST CHAR. SHIFT L4: M=K>>L&255; ! CHAR. IF M=0 THEN ->RES IF TARGET&8192=0 THEN PRINTSYMBOL(M) ELSESTART; ! PRINT CHAR. BIN(CA!!1)=M CA=CA+1 FINISH L=L-8; ! NEXT SHIFT IF L>=0 THEN ->L4; ! MORE CHARS. YET OE=1-OE IF OE#0 THEN ->L5; ! GET NEXT TWO CHARS. RES: ! RETURN NUMBER OF CHARS. PRINTED IF L<0 THEN RESULT=4 IF L=8 THEN RESULT=2 IF OE=1 THEN RESULT=3 ELSE RESULT=1 END ROUTINE PRINTNAME(INTEGER I) INTEGER J,K,L,M,OE; OE=0 J=TAG(I); !POINTER TO NAME LIST L5: ! FIRST OR NEXT FOUR CHARS IF OE=0 THEN K=TAG(J) ELSE K=TAG1(J) L=8; ! FIRST CHAR SHIFT VALUE L4: M=K>>L&255; ! CHAR IF M=0 THENRETURN PRINTSYMBOL(M); ! PRINT CHAR L=L-8; ! NEXT SHIFT IF L>=0 THEN ->L4; ! MORE CHARS YET OE=1-OE IF OE#0 THEN -> L5 J=LINK(J); ! POINTER TO NEXT 4 CHARS IF J#0 THEN ->L5; !GO UNLESS NO MORE CHARS END; ! PRINTNAME ROUTINE SHOW TAGS ! DISPLAY TAGS OF NAMES IN SCOPE INTEGER I,J,K,L,M,OE; OE=0 IF CHECKS&32=0 THENRETURN I=0; ! EXAMINE TAGS FROM 0 UP L1: IF TAG(I)=0 THEN ->L2; ! NO NAME WITH IDENTIFICATION NU NEWLINE WRITE(I,3); ! IDENT. NO. SPACES(4) PRINT NAME(I) L3: NEWLINE SPACES(4) J=LINK(I); ! POINTER TO NAME TAGS L7: SPACES(4) J=J&X'7FFF' ! FIRST TAGS WORD IF OE=0 THEN K=TAG(J) ELSE K=TAG1(J) L=28; ! FIRST SHIFT VALUE L6: M=K>>L&15; ! NEXT HEX DIGIT IF M<10 THEN PRINT SYMBOL(M+'0'); ! PRINT HEX DIGIT IF M>=10 THEN PRINT SYMBOL(M+'A'-10) L=L-4; ! NEXT SHIFT IF L>=0 THEN ->L6; ! MORE DIGITS IN THIS WORD OE=1-OE IF OE#0 THEN -> L7 J=LINK(J); ! POINTER TO NEXT CELL IF J#0 THEN ->L7; ! MORE CELLS L2: I=I+1 IF I<=NNAMES THEN ->L1; ! MORE NAMES TO CONSIDER NEWLINES(2) END; ! SHOW TAGS END; ! SKIMP11 EXTERNALSTRINGFNSPEC DATE EXTERNALSTRINGFNSPEC TIME EXTERNALROUTINESPEC CLOSE STREAM(INTEGER I) EXTERNALROUTINESPEC DEFINE(STRING (63) S) EXTERNALROUTINESPEC CLEAR(STRING(19) S) !%EXTERNALROUTINESPEC SKIMP11(%INTEGER TARGET) OWNINTEGER OST,SOU=1,OBJ=2,LST=2 OWNINTEGER OBJINIT=0,LSTINIT=0 OWNSTRING(63) SOUF="",OBJF="",LSTF="",LSTB="" OWNINTEGER TARGET=0; !0=RELOCATABLE 1=ABSOLUTE OWNINTEGERARRAY ENV(0:11) OWNINTEGER BPP=0 ! ! ! EXTERNALROUTINE IMP11(STRING(63) S) INTEGER J,K ROUTINESPEC CHECK(INTEGER N STRING(63) S) S=".IN" IF S="" SOUF=S UNLESS S->SOUF.(",").OBJF CHECK(1,SOUF) IF OBJF="" THEN OBJF=".OUT" IF BYTEINTEGER(ADDR(SOUF)+1)='.' AND SOUF#".IN" THENC -> BAD IF OBJF->OBJF.(",").LSTF START IF LSTF->LSTF.(",").LSTB START CHECK(4,LSTB) TARGET=TARGET+4096 DEFINE("STREAM04,".LSTB) FINISH CHECK(3,LSTF) FINISH CHECK(2,OBJF) IF LSTF="" THEN LSTF=OBJF IF OBJF#LSTF THEN LST=5 IF SOUF#".IN" THENSTART -> BAD IF SOUF=OBJF OR SOUF=LSTF FINISH ! CLEAR("STREAMS") DEFINE("STREAM01,".SOUF) IF TARGET&8192#0 START DEFINE("SQ3,".OBJF.",,F80") DEFINE("STREAM06,SS#IMPLP") SELECT OUTPUT(6) FINISHELSESTART DEFINE("STREAM02,".OBJF) SELECT OUTPUT(2) FINISH ! DEFINE("STREAM04,ERCC10.SPECS") DEFINE("STREAM10,.NULL"); ! ONLY FOR TARGET NON-ZERO, TO THROW AWAY ! EARLY OUTPUT FOR SHORTNESS INTESTING UNLESS LST=OBJ THENSTART DEFINE("STREAM05,".LSTF) SELECT OUTPUT(5) FINISH SELECT OUTPUT(0) ! J=ADDR(ENV(0)) ! *LA_15,<OUT> ! *L_1,J ! *STM_4,15,0(1) IF LST=OBJ THEN TARGET=TARGET+4 SKIMP11(TARGET) OUT: CLEAR("STREAM01") CLEAR("STREAM02") CLEAR("STREAM05") ! RETURN INTEGERFN FN OK(STRING(63) S) ! FILENAME OK. (RESULT = 1 IF OK, 0 IF NOT). INTEGER J,L,CH,AS AS=ADDR(S) L=LENGTH(S) RESULT=1 UNLESS 0<L<=8 CYCLE J=1,1,L CH=BYTEINTEGER(AS+J) IF J=1 THENSTART RESULT=1 UNLESS 'A'<=CH<='Z' FINISH RESULT=0 UNLESS '0'<=CH<='9' OR 'A'<=CH<='Z' OR CH='#' REPEAT RESULT=1; ! OK END; ! FN OK ROUTINE CHECK(INTEGER N STRING(63) S) INTEGER J,AS,L,CH STRING(63) USER,W,MEM OWNSTRING(5) ARRAY PERI(1:6)= C ".IN",".OUT",".LP",".PP",".CP",".NULL" AS=ADDR(S) IF BYTEINTEGER(AS+1)='.' THENSTART CYCLE J=1,1,6 -> OUT IF S->(PERI(J)).W AND LENGTH(W)<=2 REPEAT -> BAD FINISH IF N=1 START ! LET SRC IP FILE HAVE USER.FILENAME IF S->USER.(".").S AND LENGTH(USER)#6 THEN->BAD IF S->S.("_").MEM START -> BAD IF FN OK(MEM)=0 FINISH -> BAD IF FN OK(S)=0 FINISH OUT: RETURN BAD: PRINTSTRING("BAD PARAM"); WRITE(N,1) NEWLINE STOP END; !CHECK BAD: PRINTSTRING("FOOLISH PARAMS ") END; !IMP11 EXTERNALROUTINE SK11(STRING(63) S) PRINTSTRING("IN FUTURE PLEASE USE ""IMP11"" INSTEAD OF ""SK11"" ") IMP11(S) END; !SK11 EXTERNALROUTINE SKT(STRING(63) S) TARGET=2 IMP11(S) END; ! SKT EXTERNALROUTINE IMP11A(STRING(63) S) TARGET=1 IMP11(S) END; !IMP11A EXTERNALROUTINE SK11A(STRING(63) S) PRINTSTRING("IN FUTURE PLEASE USE ""IMP11A"" INSTEAD OF ""SK11A"" ") IMP11A(S) END; !SK11A EXTERNALROUTINE SK114K PRINTSTRING("PLEASE TYPE ""IMP11A"" HEREAFTER.. ") END EXTERNALROUTINE IMP11S(STRING(63) S) TARGET=TARGET+8192 IMP11(S) END EXTERNALROUTINE SETS(INTEGER N) ROUTINESPEC TITLE ROUTINESPEC IDENS ROUTINESPEC SELOUT(INTEGER I) INTEGER J SWITCH A(0:6) ->A(N) A(0): !SELECT SPECS OUTPUT SELOUT(4) -> L9 A(1): !SELECT SOURCE INPUT SELECT INPUT(1) -> L9 A(2): !SELECT OBJ OUTPUT IF TARGET&8192=0 THEN SELOUT(2) ELSE SELOUT(6) IF OBJINIT=0 THEN START OBJINIT=1 IF OBJF=".OUT" THEN SELOUT(10) ELSE TITLE FINISH -> L9 A(3): !SELECT LISTING OUTPUT SELOUT(LST) IF LSTINIT=0 START LSTINIT=1 IDENS FINISH -> L9 A(4): !CLOSE FILES SELECT INPUT (0) SELECT OUTPUT(0) CLOSE STREAM(1) CLOSE STREAM(LST) UNLESS LST=OBJ CLOSESTREAM(4) UNLESS LSTB="" IF TARGET&8192#0 THEN CLOSESTREAM(6) ELSE CLOSE STREAM(2) -> L9 A(6): ! SELECT BINARY LP LISTING OUTPUT SELOUT(6) -> L9 A(5): ! QUIT J=ADDR(ENV(0)) ! *L_1,J ! *LM_4,15,0(1) ! *BCR_15,15 L9: RETURN ROUTINE TITLE IDENS UNLESS OBJF=LSTF PRINT STRING(" .TITLE ".SOUF." ") END; ! TITLE ROUTINE IDENS RETURN IF OBJF=".OUT" PRINTSTRING(";SOURCE=".SOUF." COMPILED: ".DATE." ".TIME." ;ASSEMBLER FILE=".OBJF." ") END; ! IDENS ROUTINE SELOUT(INTEGER I) RETURN IF OST=I SELECT OUTPUT(I) OST=I END; ! SELOUT END; !SETS ENDOFFILE LL IF J#0 THEN ->L7; ! MORE CELLS L2: I=I+1 IF I<=NNAMES THEN -> L1; ! MORE NAMES TO CONSIDER NEWLINES(2) END