#include <perms.h>
// Edinburgh IMP77 Compiler - Version 8.4
//
// 1 %BEGIN; !HAL-70
int main(int argc, char **argv) { /*%begin*/
_imp_initialise(argc, argv);
// 2 ! INPUT/OUTPUT STREAMS
// 3 %OWNINTEGER MAIN=1, PRE=2; !INPUT
static int MAIN = 1;
static int PRE = 2;
// 4 %OWNINTEGER BIN=1, LIS=2; !OUTPUT
static int BIN = 1;
static int LIS = 2;
// 5 ! OPERAND TYPES
// 6 %OWNINTEGER OPMASK=16_F000; !MACHINE INSTRUCTION OR MACRO
static int OPMASK = 61440;
// 7 %OWNINTEGER MACRO=16_A000
static int MACRO = 40960;
// 8 %OWNINTEGER SINGLE=16_5000
static int SINGLE = 20480;
// 9 %OWNINTEGER FMASK=16_0800; !FORWARD REF
static int FMASK = 2048;
// 10 %OWNINTEGER OPFMASK=16_F800; !=OPMASK+FMASK
static int OPFMASK = 63488;
// 11 %OWNINTEGER UMASK=16_0200; !UNDEF (FORWARD REF)
static int UMASK = 512;
// 12 %OWNINTEGER BMASK=16_0100; !BYTE
static int BMASK = 256;
// 13 %OWNINTEGER REG=16_0080; !REGISTER
static int REG = 128;
// 14 %OWNINTEGER MEMMASK=16_0040; !MEM REF
static int MEMMASK = 64;
// 15 %OWNINTEGER RELMASK=16_0020; !RELOCATABLE
static int RELMASK = 32;
// 16 %OWNINTEGER XMASK=16_0010; !INDEXED
static int XMASK = 16;
// 17 %OWNINTEGER REGXMASK=16_0090; !=REG+XMASK
static int REGXMASK = 144;
// 18 %OWNINTEGER RELUXMASK=16_0230; !=RELMASK+UMASK+XMASK
static int RELUXMASK = 560;
// 19 ! TEXT POINTERS (BYTE ADDRESSES)
// 20 %OWNINTEGER CODEPOS; !(NOT ACTUALLY BYTE)
static int CODEPOS;
// 21 %OWNINTEGER STARTPOS; !START OF CURRENT LINE
static int STARTPOS;
// 22 %OWNINTEGER GETPOS; !INPUT POINTER (NEXT)
static int GETPOS;
// 23 %OWNINTEGER PUTPOS
static int PUTPOS;
// 24 %OWNINTEGER PSEUDOLIM
static int PSEUDOLIM;
// 25 %OWNINTEGER PRINTPOS; !START OF PRINT LINE
static int PRINTPOS;
// 26 %OWNINTEGER FAULTPOS
static int FAULTPOS;
// 27 %OWNINTEGER MACLIM; !MACRO DEF LIMIT
static int MACLIM;
// 28 ! OTHER POINTERS (WORD ADDRESSES)
// 29 %OWNINTEGER MP; !MACRO-CALL PARAMETERS
static int MP;
// 30 %OWNINTEGER QBASE,QSTART,QLIM,TRANSF; !OPERAND QUEUE
static int QBASE;
static int QSTART;
static int QLIM;
static int TRANSF;
// 31 %OWNINTEGER DEFMIN; !TAG MIN (DOWN - RESET)
static int DEFMIN;
// 32 %OWNINTEGER DEFLIM; !TAG LIM (FIXED)
static int DEFLIM;
// 33 %OWNINTEGER ALMAX; !ASSEMBLER LAB MAX (UP - RESET)
static int ALMAX;
// 34 %OWNINTEGER LABMIN; !USER LAB MIN (DOWN - RESET)
static int LABMIN;
// 35 %OWNINTEGER LABLIM; !USER LAB LIM (FIXED)
static int LABLIM;
// 36 %OWNINTEGER BP; !BLOCK POINTER (UP - DOWN)
static int BP;
// 37 %OWNINTEGER NP; !NEST POINTER (DOWN - UP)
static int NP;
// 38 %OWNINTEGER STORELIM; !(FIXED)
static int STORELIM;
// 39
// 40 %INTEGER SYM; !CURRENT SYMBOL
int SYM;
// 41 %INTEGER TERM; !TAG TERMINATOR
int TERM;
// 42 %INTEGER FSYM; !FAULT FLAG SYMBOL
int FSYM;
// 43 %OWNINTEGER CHARS=0; !PRINT CHAR COUNT
static int CHARS = 0;
// 44 %OWNINTEGER LINES=0; !PRINT LINE COUNT
static int LINES = 0;
// 45 %OWNINTEGER BINCOUNT=0; !OUTPUT RECORD ITEM COUNT
static int BINCOUNT = 0;
// 46 %OWNINTEGER CHECK=0; !OUTPUT RECORD CHECKSUM
static int CHECK = 0;
// 47 %OWNINTEGER PASS=-1; !CURRENT PASS (-1,0,1)
static int PASS = -1;
// 48 %OWNINTEGER LIST=-1; !LISTING CONTROL
static int LIST = -1;
// 49 %INTEGER ASSCOND,SKIP; !ASSEMBLY CONDITIONS (BIT NEST)
int ASSCOND;
int SKIP;
// 50 %OWNINTEGER SAVE=1; !REG SAVE DISPLACEMENT
static int SAVE = 1;
// 51 %OWNINTEGER TEMPS=12; !TEMPORARY REGISTER SET (2,3)
static int TEMPS = 12;
// 52 %INTEGER LOCTYPE,LOC; !LOCATION COUNTER
int LOCTYPE;
int LOC;
// 53 %INTEGER ACC,ATYPE,AVAL; !MAIN TEMP REGISTER
int ACC;
int ATYPE;
int AVAL;
// 54 %INTEGER CREG,CTYPE,CVAL; !CONDITION CODE
int CREG;
int CTYPE;
int CVAL;
// 55 %INTEGER COND; !CONDITION CODE MASK
int COND;
// 56 %INTEGER DREG,DUSE; !DESTINATION REGISTER
int DREG;
int DUSE;
// 57 %INTEGER TYPE,VAL; !CURRENT TYPE,VALUE
int TYPE;
int VAL;
// 58 %INTEGER TAG1,TAG2; !TAG (CHARS 1:3, 4:6)
int TAG1;
int TAG2;
// 59 %INTEGER MODE; !ASSEMBLY MODE
int MODE;
// 60 %INTEGER PEND; !TAG ALREADY RECOGNISED
int PEND;
// 61 %INTEGER FLAG; !JUMPS / AHM
int FLAG;
// 62 %OWNINTEGER QQ='?'
static int QQ = 63;
// 63
// 64 %OWNINTEGERARRAY BREC(1:52); !BINARY OUTPUT RECORD
static int BREC[52];
// 65
// 66 !!%INTEGER SBOUND
// 67 %constINTEGER SBOUND = 16_7F00
// 68 !! SBOUND = FREESTORE-260; !ALLOW FOR INPUT BUFFER
// 69 !! SBOUND = SBOUND-256 %IF OUTDEV = 2
// 70 SELECT OUTPUT(LIS)
_imp_SELECTOUTPUT(LIS);
// 71 !! SBOUND = SBOUND-256 %IF OUTDEV = 2
// 72
// 73 !! Simulate 18-bit word-addressed PDP9/15 memory:
// 74
// 75 %ownINTEGERARRAY STORE(1:SBOUND)
static int STORE[32512];
// 76
// 77 %integerfn integer(%integer p)
int INTEGER(int P) {
// 78 %if p&1 # 0 %start
if (P & 1 == 0) goto L_0001;
// 79 printstring("Integer fetch was not aligned at "); write(p, -1); newline
_imp_PRINTSTRING(_imp_str_literal("Integer fetch was not aligned at "));
_imp_WRITE(P, -1);
_imp_NEWLINE();
// 80 %stop
_imp_stop(0);
// 81 %finish
L_0001:;
// 82 %result = store(P>>1)
return STORE[((unsigned int)P >> 1) - 1];
// 83 %end
} /* end of INTEGER */
// 84
// 85 %INTEGERFN CHAR(%INTEGER P)
int CHAR(int P) {
// 86 !BYTE FETCH
// 87
// 88 %integer val = store(p>>1)
int VAL;
VAL = STORE[((unsigned int)P >> 1) - 1];
// 89 %if p&1 = 0 %start
if (P & 1 != 0) goto L_0002;
// 90 %result = val&255
return VAL & 255;
// 91 %else
L_0002:;
// 92 %result = (val>>8)&255
return (unsigned int)VAL >> 8 & 255;
// 93 %finish
// 94
// 95 !! %OPR 2064;!RCR; %DAC P
// 96 !! %LAC* P; %OPR 768;!SZL; %JMP L1
// 97 !! %OPR 1040;!RTR; %OPR 1040
// 98 !! %OPR 1040; %OPR 1040
// 99 !!L1: %AND #255; %JMP* CHAR
// 100 !! %STOP
// 101
// 102 %END
} /* end of CHAR */
// 103
// 104 %routine set integer(%integer p, k)
void SETINTEGER(int P, int K) {
// 105 store(p>>1) = k
STORE[((unsigned int)P >> 1) - 1] = K;
// 106 %end
return;
} /* end of SETINTEGER */
// 107
// 108 %ROUTINE PUT CHAR(%INTEGER K)
void PUTCHAR(int K) {
// 109 !AT PUTPOS WITH POST-INCREMENT
// 110 %INTEGER P
int P;
// 111 !! %MONITOR 21 %IF PUTPOS>>1-DEFMIN >= 0
// 112 !{} %signal 2,1 %IF PUTPOS>>1-DEFMIN >= 0
// 113
// 114 p = store(putpos>>1)
P = STORE[((unsigned int)PUTPOS >> 1) - 1];
// 115 %if putpos&1 = 0 %start
if (PUTPOS & 1 != 0) goto L_0003;
// 116 p = (p&16_FF00) ! (K&255)
P = P & 65280 | K & 255;
// 117 %else
goto L_0004;
L_0003:;
// 118 p = (p&16_00FF) ! ((K&255)<<8)
P = P & 255 | (K & 255) << 8;
// 119 %finish
L_0004:;
// 120 store(putpos>>1) = p
STORE[((unsigned int)PUTPOS >> 1) - 1] = P;
// 121
// 122 !! %LAC PUTPOS; %OPR 2064;!RCR; %DAC P
// 123 !! %OPR 768;!SZL; %JMP L1
// 124 !! %LAC K; %OPR 1032;!RTL; %OPR 1032
// 125 !! %OPR 1032; %OPR 1032; %DAC K
// 126 !! %LAC #-256; %OPR 513;!SKP!CMA
// 127 !!L1: %LAC #-256; %AND* P; %TAD K; %DAC* P
// 128 !! %ISZ PUTPOS
// 129
// 130 putpos = putpos+1
PUTPOS = PUTPOS + 1;
// 131 %END
return;
} /* end of PUTCHAR */
// 132
// 133 %ROUTINE FAULT(%INTEGER K)
void FAULT(int K) {
// 134 !RECORD (FIRST) FAULT
// 135 !NOT NECESSARILY CULPABLE IN PASS 0
// 136 FSYM = K %IF FSYM = ' '
if (FSYM != 32) goto L_0005;
FSYM = K;
L_0005:;
// 137 %END
return;
} /* end of FAULT */
// 138
// 139 %ROUTINE PRINT(%INTEGER K)
void PRINT(int K) {
// 140 !! INTEGER(CODEPOS+CHARS) = K
// 141 set INTEGER(CODEPOS+CHARS, K)
SETINTEGER(CODEPOS + CHARS, K);
// 142 CHARS = CHARS+1
CHARS = CHARS + 1;
// 143 %END
return;
} /* end of PRINT */
// 144
// 145 %ROUTINE PRINT WORD(%INTEGER V)
void PRINTWORD(int V) {
// 146 %ROUTINE PRINT HIT(%INTEGER V)
void PRINTHIT(int V) {
// 147 V = V&15+'0'; V = V+7 %IF V > '9'
V = (V & 15) + 48;
if (V <= 57) goto L_0006;
V = V + 7;
L_0006:;
// 148 PRINT(V)
PRINT(V);
// 149 %END
return;
} /* end of PRINTHIT */
// 150 %ROUTINE PRINT1(%INTEGER V)
void PRINT1(int V) {
// 151 PRINT HIT(V>>4); PRINT HIT(V)
PRINTHIT((unsigned int)V >> 4);
PRINTHIT(V);
// 152 %END
return;
} /* end of PRINT1 */
// 153 PRINT1(V>>8); PRINT1(V)
PRINT1((unsigned int)V >> 8);
PRINT1(V);
// 154 %END
return;
} /* end of PRINTWORD */
// 155
// 156 %ROUTINE PRINT LOC
void PRINTLOC(void) {
// 157 PRINT WORD(LOC)
PRINTWORD(LOC);
// 158 %IF LOCTYPE&RELMASK # 0 %THEN PRINT('''') %ELSE PRINT(' ')
if (LOCTYPE & RELMASK == 0) goto L_0007;
PRINT(39);
goto L_0008;
L_0007:;
PRINT(32);
L_0008:;
// 159 PRINT(' ')
PRINT(32);
// 160 %END
return;
} /* end of PRINTLOC */
// 161
// 162 %ROUTINE DO NEWLINE
void DONEWLINE(void) {
// 163 NEWLINE; LINES = LINES+1
_imp_NEWLINE();
LINES = LINES + 1;
// 164 NEWLINES(2) %AND LINES = 0 %IF LINES = 61
if (LINES != 61) goto L_0009;
_imp_NEWLINES(2);
LINES = 0;
L_0009:;
// 165 %END
return;
} /* end of DONEWLINE */
// 166
// 167 %ROUTINE PRINT LINE
void PRINTLINE(void) {
// 168 %ROUTINE PRINTIT(%INTEGER SUB)
void PRINTIT(int SUB) {
// 169 %OWNINTEGER MARKER=124; !VERTICAL BAR
static int MARKER = 124;
// 170 %INTEGER P,Q,K
int P;
int Q;
int K;
// 171 %RETURN %IF CHARS = 0 %AND CHAR(PRINTPOS) = NL
if (CHARS != 0) goto L_000A;
if (CHAR(PRINTPOS) != 10) goto L_000A;
return;
L_000A:;
// 172 PRINT SYMBOL(FSYM); SPACE
_imp_PRINTSYMBOL(FSYM);
_imp_SPACE();
// 173 P = CODEPOS; Q = P+CHARS
P = CODEPOS;
Q = P + CHARS;
// 174 PRINT SYMBOL(INTEGER(P)) %AND P=P+1 %WHILE P # Q
L_000B:;
if (P == Q) goto L_000C;
_imp_PRINTSYMBOL(INTEGER(P));
P = P + 1;
goto L_000B;
L_000C:;
// 175 %RETURN %IF PRINTPOS = 0
if (PRINTPOS != 0) goto L_000D;
return;
L_000D:;
// 176 SPACES(17-CHARS)
_imp_SPACES(17 - CHARS);
// 177 P = PRINTPOS; Q = 0
P = PRINTPOS;
Q = 0;
// 178 %CYCLE
L_000E:;
// 179 PRINT SYMBOL(MARKER) %IF P = FAULTPOS
if (P != FAULTPOS) goto L_000F;
_imp_PRINTSYMBOL(MARKER);
L_000F:;
// 180 K = CHAR(P); K = SUB %IF P = PSEUDOLIM
K = CHAR(P);
if (P != PSEUDOLIM) goto L_0010;
K = SUB;
L_0010:;
// 181 PRINT SYMBOL('''') %IF (K!!Q)&128 # 0
if ((K ^ Q) & 128 == 0) goto L_0011;
_imp_PRINTSYMBOL(39);
L_0011:;
// 182 %RETURN %IF K = NL
if (K != 10) goto L_0012;
return;
L_0012:;
// 183 PRINT SYMBOL(K&127)
_imp_PRINTSYMBOL(K & 127);
// 184 P = P+1; Q = K
P = P + 1;
Q = K;
// 185 %REPEAT
goto L_000E;
// 186 %END
} /* end of PRINTIT */
// 187 %RETURN %IF PASS = 0
if (PASS != 0) goto L_0013;
return;
L_0013:;
// 188 %UNLESS LIST < 0 %OR (PRINTPOS=0 %AND FSYM=' ' %AND LIST&1=0) %START
if (LIST < 0) goto L_0014;
if (PRINTPOS != 0) goto L_0015;
if (FSYM != 32) goto L_0015;
if (LIST & 1 == 0) goto L_0014;
L_0015:;
// 189 NEWLINES(3) %IF LINES = 0
if (LINES != 0) goto L_0016;
_imp_NEWLINES(3);
L_0016:;
// 190 PRINTIT(' ')
PRINTIT(32);
// 191 DO NEWLINE
DONEWLINE();
// 192 %FINISH
L_0014:;
// 193 %IF FSYM # ' ' %AND OUTDEV # 1 %START
if (FSYM == 32) goto L_0017;
if (_imp_OUTDEV() == 1) goto L_0017;
// 194 SELECT OUTPUT(0)
_imp_SELECTOUTPUT(0);
// 195 PRINTPOS = STARTPOS %IF PRINTPOS = 0
if (PRINTPOS != 0) goto L_0018;
PRINTPOS = STARTPOS;
L_0018:;
// 196 PRINT LOC %IF CHARS = 0
if (CHARS != 0) goto L_0019;
PRINTLOC();
L_0019:;
// 197 PRINTIT(NL)
PRINTIT(10);
// 198 NEWLINE
_imp_NEWLINE();
// 199 SELECT OUTPUT(LIS)
_imp_SELECTOUTPUT(LIS);
// 200 %FINISH
L_0017:;
// 201 FSYM = ' '; PRINTPOS = 0; CHARS = 0
FSYM = 32;
PRINTPOS = 0;
CHARS = 0;
// 202 %END
return;
} /* end of PRINTLINE */
// 203
// 204 %ROUTINE PUT(%INTEGER V)
void PUT(int V) {
// 205 !STORE 4-BIT ITEM IN BINARY RECORD
// 206 %OWNINTEGER HOLD=0
static int HOLD = 0;
// 207 V = V&15
V = V & 15;
// 208 HOLD = HOLD<<4+V
HOLD = (HOLD << 4) + V;
// 209 BINCOUNT = BINCOUNT+1
BINCOUNT = BINCOUNT + 1;
// 210 %IF BINCOUNT&3 = 0 %START
if (BINCOUNT & 3 != 0) goto L_001A;
// 211 BREC(BINCOUNT>>2) = HOLD
BREC[((unsigned int)BINCOUNT >> 2) - 1] = HOLD;
// 212 CHECK = CHECK!!HOLD
CHECK = CHECK ^ HOLD;
// 213 HOLD = 0
HOLD = 0;
// 214 %FINISH
L_001A:;
// 215 %END
return;
} /* end of PUT */
// 216
// 217 %ROUTINE PUT WORD(%INTEGER V)
void PUTWORD(int V) {
// 218 %ROUTINE PUT1(%INTEGER V)
void PUT1(int V) {
// 219 PUT(V>>4); PUT(V)
PUT((unsigned int)V >> 4);
PUT(V);
// 220 %END
return;
} /* end of PUT1 */
// 221 PUT1(V>>8); PUT1(V)
PUT1((unsigned int)V >> 8);
PUT1(V);
// 222 %END
return;
} /* end of PUTWORD */
// 223
// 224 %ROUTINE OUTPUT RECORD
void OUTPUTRECORD(void) {
// 225 %OWNINTEGER SEQ=0
static int SEQ = 0;
// 226 %INTEGER I
int I;
// 227 %ROUTINE OUTPUT WORD(%INTEGER W)
void OUTPUTWORD(int W) {
// 228 PRINT CH(W>>8&255); PRINT CH(W&255)
_imp_PRINTCH((unsigned int)W >> 8 & 255);
_imp_PRINTCH(W & 255);
// 229 %END
return;
} /* end of OUTPUTWORD */
// 230 PUT(0) %WHILE BINCOUNT # 208
L_001B:;
if (BINCOUNT == 208) goto L_001C;
PUT(0);
goto L_001B;
L_001C:;
// 231 SELECT OUTPUT(BIN)
_imp_SELECTOUTPUT(BIN);
// 232 %CYCLE I = 1,1,10
// %for I = 1, 1, 10 %cycle
{
I = 0;
L_001D:
if (I == 10) goto L_001E;
I += 1;
// 233 PRINT CH(0); !RUNOUT
_imp_PRINTCH(0);
// 234 %REPEAT
goto L_001D;
}
L_001E:;
// 235 PRINT CH(16_F0); !HEADER CODE
_imp_PRINTCH(240);
// 236 SEQ = SEQ-1
SEQ = SEQ - 1;
// 237 OUTPUT WORD(SEQ); !SEQUENCE NUMBER
OUTPUTWORD(SEQ);
// 238 OUTPUT WORD(\(CHECK!!SEQ)); !CHECKSUM
OUTPUTWORD(~(CHECK ^ SEQ));
// 239 %CYCLE I = 1,1,52
// %for I = 1, 1, 52 %cycle
{
I = 0;
L_0020:
if (I == 52) goto L_0021;
I += 1;
// 240 OUTPUT WORD(BREC(I))
OUTPUTWORD(BREC[I - 1]);
// 241 %REPEAT
goto L_0020;
}
L_0021:;
// 242 BINCOUNT = 0; CHECK = 0
BINCOUNT = 0;
CHECK = 0;
// 243 SELECT OUTPUT(LIS)
_imp_SELECTOUTPUT(LIS);
// 244 %END
return;
} /* end of OUTPUTRECORD */
// 245
// 246 %ROUTINE PLANT VAL
void PLANTVAL(void) {
// 247 %INTEGER I,J
int I;
int J;
// 248 TYPE = 0 %IF TYPE = SINGLE
if (TYPE != SINGLE) goto L_0022;
TYPE = 0;
L_0022:;
// 249 I = 2; I = 4 %IF TYPE&OPMASK # 0
I = 2;
if (TYPE & OPMASK == 0) goto L_0023;
I = 4;
L_0023:;
// 250 %IF PASS > 0 %START
if (PASS <= 0) goto L_0024;
// 251 OUTPUT RECORD %IF BINCOUNT+I+I >= 208
if (BINCOUNT + I + I < 208) goto L_0025;
OUTPUTRECORD();
L_0025:;
// 252 %IF I = 4 %START
if (I != 4) goto L_0026;
// 253 %IF TYPE&16_4000 = 0 %START
if (TYPE & 16384 != 0) goto L_0027;
// 254 PUT(11); J = TYPE!!OPMASK
PUT(11);
J = TYPE ^ OPMASK;
// 255 TYPE = RELMASK
TYPE = RELMASK;
// 256 %finish %ELSE %START
goto L_0028;
L_0027:;
// 257 PUT(10); J = TYPE; TYPE = 0
PUT(10);
J = TYPE;
TYPE = 0;
// 258 %FINISH
L_0028:;
// 259 PUT WORD(J)
PUTWORD(J);
// 260 PRINT LINE %IF CHARS # 0
if (CHARS == 0) goto L_0029;
PRINTLINE();
L_0029:;
// 261 PRINT LOC
PRINTLOC();
// 262 PRINT WORD(J); PRINT(' ')
PRINTWORD(J);
PRINT(32);
// 263 %finish %ELSE %START
goto L_002A;
L_0026:;
// 264 %IF TYPE&RELMASK # 0 %THEN PUT(9) %ELSE PUT(8)
if (TYPE & RELMASK == 0) goto L_002B;
PUT(9);
goto L_002C;
L_002B:;
PUT(8);
L_002C:;
// 265 %IF CHARS # 0 %THEN PRINT(' ') %ELSE PRINT LOC
if (CHARS == 0) goto L_002D;
PRINT(32);
goto L_002E;
L_002D:;
PRINTLOC();
L_002E:;
// 266 %FINISH
L_002A:;
// 267 PUT WORD(VAL); PRINT WORD(VAL)
PUTWORD(VAL);
PRINTWORD(VAL);
// 268 PRINT('''') %IF TYPE&RELMASK # 0
if (TYPE & RELMASK == 0) goto L_002F;
PRINT(39);
L_002F:;
// 269 PRINT LINE %IF TYPE&RELMASK#0 %OR CHARS=15
if (TYPE & RELMASK != 0) goto L_0030;
if (CHARS != 15) goto L_0031;
L_0030:;
PRINTLINE();
L_0031:;
// 270 %FINISH
L_0024:;
// 271 LOC = LOC+I
LOC = LOC + I;
// 272 %END
return;
} /* end of PLANTVAL */
// 273
// 274 %ROUTINE NEST(%INTEGER K)
void NEST(int K) {
// 275 !! NP = NP-1; %MONITOR 23 %IF NP = BP
// 276 NP = NP-1; !{}%signal 2,3 %IF NP = BP
NP = NP - 1;
// 277 !! INTEGER(NP) = K
// 278 set INTEGER(NP, K)
SETINTEGER(NP, K);
// 279 %END
return;
} /* end of NEST */
// 280
// 281 %ROUTINE SET LAB(%INTEGER DEST)
void SETLAB(int DEST) {
// 282 %INTEGER D
int D;
// 283 D = DEST
D = DEST;
// 284 %CYCLE
L_0032:;
// 285 TYPE = INTEGER(NP)&16_FFF+DEFLIM; !DEST SLOT
TYPE = (INTEGER(NP) & 4095) + DEFLIM;
// 286 NP = NP+1
NP = NP + 1;
// 287 VAL = INTEGER(NP); !LOC OF JUMP
VAL = INTEGER(NP);
// 288 NP = NP+1
NP = NP + 1;
// 289 ATYPE = -1; CREG = -1
ATYPE = -1;
CREG = -1;
// 290 FLAG = 0; FLAG = 2 %IF (D-VAL)>>1+PASS <= 16
FLAG = 0;
if (((unsigned int)D - VAL >> 1) + PASS > 16) goto L_0033;
FLAG = 2;
L_0033:;
// 291 VAL = VAL-FLAG
VAL = VAL - FLAG;
// 292 %IF PASS = 0 %START
if (PASS != 0) goto L_0034;
// 293 !! D = D-FLAG; INTEGER(TYPE) = D
// 294 D = D-FLAG; set INTEGER(TYPE, D)
D = D - FLAG;
SETINTEGER(TYPE, D);
// 295 %IF FLAG # 0 %START
if (FLAG == 0) goto L_0035;
// 296 LOC = LOC-2; DEST = DEST-2
LOC = LOC - 2;
DEST = DEST - 2;
// 297 %WHILE TYPE # ALMAX %CYCLE
L_0036:;
if (TYPE == ALMAX) goto L_0037;
// 298 !! TYPE = TYPE+1; INTEGER(TYPE) = INTEGER(TYPE)-2
// 299 TYPE = TYPE+1; set INTEGER(TYPE, INTEGER(TYPE)-2)
TYPE = TYPE + 1;
SETINTEGER(TYPE, INTEGER(TYPE) - 2);
// 300 %REPEAT
goto L_0036;
L_0037:;
// 301 %FINISH
L_0035:;
// 302 %finish %ELSE %START
goto L_0038;
L_0034:;
// 303 FAULT('P') %IF INTEGER(TYPE) # D
if (INTEGER(TYPE) == D) goto L_0039;
FAULT(80);
L_0039:;
// 304 %FINISH
L_0038:;
// 305 %RETURN %UNLESS INTEGER(NP)&16_1000 # 0
if (INTEGER(NP) & 4096 != 0) goto L_003A;
return;
L_003A:;
// 306 %IF INTEGER(NP)&16_2000 # 0 %START; !OR
if (INTEGER(NP) & 8192 == 0) goto L_003B;
// 307 D = VAL+4 %IF D = DEST
if (D != DEST) goto L_003C;
D = VAL + 4;
L_003C:;
// 308 %finish %ELSE %START
goto L_003D;
L_003B:;
// 309 D = DEST
D = DEST;
// 310 %FINISH
L_003D:;
// 311 %REPEAT
goto L_0032;
// 312 %END
} /* end of SETLAB */
// 313
// 314 %ROUTINE ASSEMBLE
void ASSEMBLE(void) {
// 315 ! INTERDATA OP-CODES (+FORMATS)
// 316 %OWNINTEGER LOAD=16_080F, LB=16_9303
static int LOAD = 2063;
static int LB = 37635;
// 317 %OWNINTEGER ADD=16_0A0F, SUB=16_0B0F, AND=16_0407
static int ADD = 2575;
static int SUB = 2831;
static int AND = 1031;
// 318 %OWNINTEGER OR=16_0607, XOR=16_0707
static int OR = 1543;
static int XOR = 1799;
// 319 %OWNINTEGER SLLS=16_7508, SRLS=16_7408, SLHL=16_0D04, SRHL=16_0C04
static int SLLS = 29960;
static int SRLS = 29704;
static int SLHL = 3332;
static int SRHL = 3076;
// 320 %OWNINTEGER COMP=16_0907, CLB=16_9402
static int COMP = 2311;
static int CLB = 37890;
// 321 %OWNINTEGER STORE=16_0002, STB=16_9202, AHM=16_2102
static int STORE = 2;
static int STB = 37378;
static int AHM = 8450;
// 322 %OWNINTEGER BT=16_0203, BF=16_0303
static int BT = 515;
static int BF = 771;
// 323 ! FORMAT CODES
// 324 %OWNINTEGER REGISTER=1, MEM=2, LIT=4, SHORT=8
static int REGISTER = 1;
static int MEM = 2;
static int LIT = 4;
static int SHORT = 8;
// 325
// 326 %OWNINTEGER ZQUERY=0
static int ZQUERY = 0;
// 327 %INTEGER OP,K,Q,LITVAL,NQ,TYPE1,VAL1,FREE
int OP;
int K;
int Q;
int LITVAL;
int NQ;
int TYPE1;
int VAL1;
int FREE;
// 328 %SWITCH ASS(-30:-1)
int ASS_index;
int ASS_line;
char *ASS_file;
static const void *ASS[30] = {
&&case_ASS_missing, &&case_ASS_missing, &&case_ASS_missing, &&case_ASS_missing, &&case_ASS_M26,
&&case_ASS_M25, &&case_ASS_M24, &&case_ASS_M23, &&case_ASS_M22, &&case_ASS_M21,
&&case_ASS_M20, &&case_ASS_missing, &&case_ASS_M18, &&case_ASS_M17, &&case_ASS_M16,
&&case_ASS_M15, &&case_ASS_M14, &&case_ASS_M13, &&case_ASS_M12, &&case_ASS_M11,
&&case_ASS_missing, &&case_ASS_missing, &&case_ASS_M8, &&case_ASS_M7, &&case_ASS_M6,
&&case_ASS_M5, &&case_ASS_M4, &&case_ASS_M3, &&case_ASS_M2, &&case_ASS_M1};
// 329
// 330 %ROUTINE FORM INST(%INTEGER CODE)
void FORMINST(int CODE) {
// 331 ! LS 4 BITS OF CODE DEFINE VALID FORMATS
// 332 ! INTERDATA OP-CODES FOR DIFFERENT FORMATS
// 333 ! ARE SYSTEMATICALLY RELATED
// 334 ! SHORT=REGISTER+SINC, LIT=REGISTER+LINC, MEM=REGISTER+MINC
// 335 %OWNINTEGER SINC=16_1C00, LINC=16_C000, MINC=16_4000
static int SINC = 7168;
static int LINC = 49152;
static int MINC = 16384;
// 336 %INTEGER OP
int OP;
// 337 OP = CODE&16_FFF0
OP = CODE & 65520;
// 338 %IF TYPE = REG %START
if (TYPE != REG) goto L_003E;
// 339 %IF CODE®ISTER # 0 %START
if (CODE & REGISTER == 0) goto L_003F;
// 340 TYPE = SINGLE; VAL = OP+VAL
TYPE = SINGLE;
VAL = OP + VAL;
// 341 %RETURN
return;
// 342 %FINISH
L_003F:;
// 343 TYPE = XMASK+VAL; VAL = 0; !COERCE TO INDEXED IMMEDIATE
TYPE = XMASK + VAL;
VAL = 0;
// 344 %FINISH
L_003E:;
// 345 !! %IF TYPE=0 %AND !VAL!<=15 %AND CODE&SHORT#0 %START; !SHORT
// 346 %IF TYPE=0 %AND |VAL|<=15 %AND CODE&SHORT#0 %START; !SHORT
if (TYPE != 0) goto L_0040;
if (_imp_IMOD(VAL) > 15) goto L_0040;
if (CODE & SHORT == 0) goto L_0040;
// 347 VAL = -VAL %AND OP = OP!!16_100 %IF VAL < 0
if (VAL >= 0) goto L_0041;
VAL = -VAL;
OP = OP ^ 256;
L_0041:;
// 348 TYPE = SINGLE; VAL = OP+SINC+VAL
TYPE = SINGLE;
VAL = OP + SINC + VAL;
// 349 %finish %ELSE %START
goto L_0042;
L_0040:;
// 350 FAULT('R') %IF TYPE&31 = XMASK; !R0 AS INDEX
if (TYPE & 31 != XMASK) goto L_0043;
FAULT(82);
L_0043:;
// 351 %IF TYPE&MEMMASK = 0 %START; !IMMEDIATE
if (TYPE & MEMMASK != 0) goto L_0044;
// 352 FAULT('I') %IF CODE&LIT = 0
if (CODE & LIT != 0) goto L_0045;
FAULT(73);
L_0045:;
// 353 OP = OP+LINC
OP = OP + LINC;
// 354 %finish %ELSE %START; !MEMORY
goto L_0046;
L_0044:;
// 355 FAULT('I') %IF CODE&MEM = 0
if (CODE & MEM != 0) goto L_0047;
FAULT(73);
L_0047:;
// 356 OP = OP+MINC
OP = OP + MINC;
// 357 %FINISH
L_0046:;
// 358 OP = OP!!OPMASK %IF TYPE&RELMASK # 0
if (TYPE & RELMASK == 0) goto L_0048;
OP = OP ^ OPMASK;
L_0048:;
// 359 TYPE = TYPE&15+OP
TYPE = (TYPE & 15) + OP;
// 360 %FINISH
L_0042:;
// 361 %END
return;
} /* end of FORMINST */
// 362
// 363 %ROUTINE PLANT JUMP
void PLANTJUMP(void) {
// 364 %INTEGER I,OP
int I;
int OP;
// 365 OP = BF; COND=\COND %AND OP=BT %IF COND < 0
OP = BF;
if (COND >= 0) goto L_0049;
COND = (~COND);
OP = BT;
L_0049:;
// 366 %IF TYPE&(\UMASK) = LOCTYPE %START
if (TYPE & (~UMASK) != LOCTYPE) goto L_004A;
// 367 I = LOC>>1-VAL>>1
I = ((unsigned int)LOC >> 1) - ((unsigned int)VAL >> 1);
// 368 !! FAULT('J') %AND I=0 %IF FLAG # 0 %AND !I! > 15
// 369 FAULT('J') %AND I=0 %IF FLAG # 0 %AND |I| > 15
if (FLAG == 0) goto L_004B;
if (_imp_IMOD(I) <= 15) goto L_004B;
FAULT(74);
I = 0;
L_004B:;
// 370 !! %IF !I! <= 15 %START
// 371 %IF |I| <= 15 %START
if (_imp_IMOD(I) > 15) goto L_004C;
// 372 %IF TYPE&UMASK = 0 %OR FLAG # 0 %START
if (TYPE & UMASK == 0) goto L_004D;
if (FLAG == 0) goto L_004E;
L_004D:;
// 373 OP = OP<<1+2; !0408, 0608
OP = (OP << 1) + 2;
// 374 TYPE = 0; VAL = I
TYPE = 0;
VAL = I;
// 375 %finish %ELSE %START
goto L_004F;
L_004E:;
// 376 FAULT('S') %IF LIST >= 0 %AND LIST&8 # 0
if (LIST < 0) goto L_0050;
if (LIST & 8 == 0) goto L_0050;
FAULT(83);
L_0050:;
// 377 %FINISH
L_004F:;
// 378 %FINISH
L_004C:;
// 379 %FINISH
L_004A:;
// 380 FORM INST(COND<<4+OP)
FORMINST((COND << 4) + OP);
// 381 PLANT VAL
PLANTVAL();
// 382 COND = 0
COND = 0;
// 383 %END
return;
} /* end of PLANTJUMP */
// 384
// 385 %ROUTINE SET JUMP(%INTEGER CASE)
void SETJUMP(int CASE) {
// 386 %INTEGER THOLD,VHOLD,FHOLD
int THOLD;
int VHOLD;
int FHOLD;
// 387 !! ALMAX = ALMAX+1; %MONITOR 22 %IF ALMAX = LABMIN
// 388 ALMAX = ALMAX+1; !{}%signal 2,2 %IF ALMAX = LABMIN
ALMAX = ALMAX + 1;
// 389 NEST(LOC); NEST(ALMAX-DEFLIM+CASE)
NEST(LOC);
NEST(ALMAX - DEFLIM + CASE);
// 390 THOLD = TYPE; VHOLD = VAL; FHOLD = FLAG
THOLD = TYPE;
VHOLD = VAL;
FHOLD = FLAG;
// 391 TYPE = LOCTYPE; VAL = INTEGER(ALMAX); FLAG = 0
TYPE = LOCTYPE;
VAL = INTEGER(ALMAX);
FLAG = 0;
// 392 TYPE = TYPE+UMASK %IF PASS = 0
if (PASS != 0) goto L_0051;
TYPE = TYPE + UMASK;
L_0051:;
// 393 COND = \COND
COND = (~COND);
// 394 PLANT JUMP
PLANTJUMP();
// 395 TYPE = THOLD; VAL = VHOLD; FLAG = FHOLD
TYPE = THOLD;
VAL = VHOLD;
FLAG = FHOLD;
// 396 %END
return;
} /* end of SETJUMP */
// 397
// 398 %ROUTINE PLANT INST(%INTEGER CODE)
void PLANTINST(int CODE) {
// 399 FORM INST(CODE)
FORMINST(CODE);
// 400 SET JUMP(16_1000) %IF COND # 0
if (COND == 0) goto L_0052;
SETJUMP(4096);
L_0052:;
// 401 PLANT VAL
PLANTVAL();
// 402 %END
return;
} /* end of PLANTINST */
// 403
// 404 %ROUTINE LOAD REG(%INTEGER R)
void LOADREG(int R) {
// 405 %INTEGER OP
int OP;
// 406 %IF ATYPE = TYPE %AND AVAL = VAL %START
if (ATYPE != TYPE) goto L_0053;
if (AVAL != VAL) goto L_0053;
// 407 TYPE = REG; VAL = ACC
TYPE = REG;
VAL = ACC;
// 408 %RETURN %IF R = ACC
if (R != ACC) goto L_0054;
return;
L_0054:;
// 409 %FINISH
L_0053:;
// 410 ATYPE = TYPE %AND AVAL = VAL %IF R = ACC
if (R != ACC) goto L_0055;
ATYPE = TYPE;
AVAL = VAL;
L_0055:;
// 411 ATYPE = -1 %IF (ATYPE=REG %AND AVAL=R) %OR ATYPE&15=R#0
if (ATYPE != REG) goto L_0056;
if (AVAL == R) goto L_001F;
L_0056:;
{
// Double-sided test on R (Part I)
int tmp;
if (ATYPE & 15 != (tmp = R)) goto L_0057;
// Double-sided test on R (Part II)
if (tmp == 0) goto L_0057;
}
L_001F:;
ATYPE = -1;
L_0057:;
// 412 %IF TYPE&BMASK = 0 %START
if (TYPE & BMASK != 0) goto L_0058;
// 413 OP = LOAD
OP = LOAD;
// 414 OP = ADD %AND TYPE = 0 %IF TYPE!!XMASK = R # 0
{
// Double-sided test on R (Part I)
int tmp;
if (TYPE ^ XMASK != (tmp = R)) goto L_0059;
// Double-sided test on R (Part II)
if (tmp == 0) goto L_0059;
}
OP = ADD;
TYPE = 0;
L_0059:;
// 415 CREG = R; CTYPE = 0; CVAL = 0
CREG = R;
CTYPE = 0;
CVAL = 0;
// 416 %finish %ELSE %START
goto L_005A;
L_0058:;
// 417 OP = LB
OP = LB;
// 418 CREG = -1 %IF CREG = R
if (CREG != R) goto L_005B;
CREG = -1;
L_005B:;
// 419 %FINISH
L_005A:;
// 420 PLANT INST(R<<4+OP)
PLANTINST((R << 4) + OP);
// 421 TYPE = REG; VAL = R
TYPE = REG;
VAL = R;
// 422 %END
return;
} /* end of LOADREG */
// 423
// 424 %ROUTINE RELEASE
void RELEASE(void) {
// 425 %INTEGER I
int I;
// 426 %RETURN %IF TYPE®XMASK = 0
if (TYPE & REGXMASK != 0) goto L_005C;
return;
L_005C:;
// 427 I = TYPE&15; I = VAL %IF I = 0
I = TYPE & 15;
if (I != 0) goto L_005D;
I = VAL;
L_005D:;
// 428 %IF I = DREG %START
if (I != DREG) goto L_005E;
// 429 DUSE = DUSE-1
DUSE = DUSE - 1;
// 430 %finish %ELSE %START
goto L_005F;
L_005E:;
// 431 I = 1<<I
I = 1 << I;
// 432 FREE = FREE!I %IF TEMPS&I # 0
if (TEMPS & I == 0) goto L_0060;
FREE = FREE | I;
L_0060:;
// 433 %FINISH
L_005F:;
// 434 %END
return;
} /* end of RELEASE */
// 435
// 436 %ROUTINE LOAD TEMP
void LOADTEMP(void) {
// 437 %INTEGER I,J
int I;
int J;
// 438 RELEASE
RELEASE();
// 439 %IF DREG >= ZQUERY %AND DUSE = 0 %START
if (DREG < ZQUERY) goto L_0061;
if (DUSE != 0) goto L_0061;
// 440 I = DREG; DUSE = 1
I = DREG;
DUSE = 1;
// 441 %finish %ELSE %START
goto L_0062;
L_0061:;
// 442 J = 1+ZQUERY
J = 1 + ZQUERY;
// 443 %CYCLE I = ZQUERY,1,15
// %for I = ZQUERY, 1, 15 %cycle
{
int _initial = ZQUERY;
if (invalid_for_loop(_initial, 1, 15)) _imp_signal(5, 1, 0, "Illegal cycle I = ZQUERY, 1, 15");
I = _initial - (1);
L_0063:
if (I == 15) goto L_0064;
I += 1;
// 444 ->OK %IF FREE&J # 0 %AND I # DREG
if (FREE & J == 0) goto L_0066;
if (I == DREG) goto L_0066;
goto U_1000;
L_0066:;
// 445 J = J<<1
J = J << 1;
// 446 %REPEAT
goto L_0063;
}
L_0064:;
// 447 FAULT('R')
FAULT(82);
// 448 OK: FREE = FREE-J
U_1000:;
FREE = FREE - J;
// 449 %FINISH
L_0062:;
// 450 LOAD REG(I)
LOADREG(I);
// 451 %END
return;
} /* end of LOADTEMP */
// 452
// 453 %ROUTINE SWOP
void SWOP(void) {
// 454 %INTEGER K
int K;
// 455 K = TYPE1; TYPE1 = TYPE; TYPE = K
K = TYPE1;
TYPE1 = TYPE;
TYPE = K;
// 456 K = VAL1; VAL1 = VAL; VAL = K
K = VAL1;
VAL1 = VAL;
VAL = K;
// 457 %END
return;
} /* end of SWOP */
// 458
// 459 %ROUTINE PROGREF
void PROGREF(void) {
// 460 %IF TYPE&RELUXMASK = XMASK %AND VAL = 0 %START
if (TYPE & RELUXMASK != XMASK) goto L_0067;
if (VAL != 0) goto L_0067;
// 461 VAL = TYPE&15; TYPE = REG
VAL = TYPE & 15;
TYPE = REG;
// 462 %FINISH
L_0067:;
// 463 TYPE = TYPE!MEMMASK %IF TYPE # REG
if (TYPE == REG) goto L_0068;
TYPE = TYPE | MEMMASK;
L_0068:;
// 464 %END
return;
} /* end of PROGREF */
// 465
// 466 Q = QSTART
Q = QSTART;
// 467 NEW:NQ = QSTART; FREE = TEMPS
U_1000:;
NQ = QSTART;
FREE = TEMPS;
// 468 TYPE = INTEGER(Q); Q = Q+1
TYPE = INTEGER(Q);
Q = Q + 1;
// 469 VAL = INTEGER(Q); Q = Q+1
VAL = INTEGER(Q);
Q = Q + 1;
// 470
// 471 GET:%CYCLE
U_1001:;
L_0069:;
// 472 %RETURN %IF Q = QLIM
if (Q != QLIM) goto L_006A;
return;
L_006A:;
// 473 K = INTEGER(Q); Q = Q+1
K = INTEGER(Q);
Q = Q + 1;
// 474 ->ASS(K) %IF K < 0
if (K >= 0) goto L_006B;
ASS_line = __LINE__;
ASS_file = __FILE__;
ASS_index = K;
goto case_ASS_dispatch;
L_006B:;
// 475 !! INTEGER(NQ) = TYPE1; INTEGER(NQ+1) = VAL1
// 476 set INTEGER(NQ, TYPE1); set INTEGER(NQ+1, VAL1)
SETINTEGER(NQ, TYPE1);
SETINTEGER(NQ + 1, VAL1);
// 477 NQ = NQ+2
NQ = NQ + 2;
// 478 TYPE1 = TYPE; VAL1 = VAL
TYPE1 = TYPE;
VAL1 = VAL;
// 479 TYPE = K; VAL = INTEGER(Q); Q = Q+1
TYPE = K;
VAL = INTEGER(Q);
Q = Q + 1;
// 480 %REPEAT
goto L_0069;
// 481
// 482 %PREDICATE TEMP
int TEMP(void) {
// 483 %FALSE %IF TYPE1 # REG
if (TYPE1 == REG) goto L_006D;
return 0 /*FALSE*/;
L_006D:;
// 484 %IF VAL1 = DREG %START
if (VAL1 != DREG) goto L_006E;
// 485 %FALSE %IF DUSE # 1
if (DUSE == 1) goto L_006F;
return 0 /*FALSE*/;
L_006F:;
// 486 %finish %ELSE %START
goto L_0070;
L_006E:;
// 487 %FALSE %IF 1<<VAL1&TEMPS = 0
if (1 << VAL1 & TEMPS != 0) goto L_0071;
return 0 /*FALSE*/;
L_0071:;
// 488 %FINISH
L_0070:;
// 489 %TRUE
return 1 /*TRUE*/;
// 490 %END
} /* end of TEMP */
// 491
// 492 NOP: K = 0; !NOT SYMMETRIC
U_1002:;
K = 0;
// 493 BOP:%IF MODE <= 0 %OR (TYPE = 0 %AND TYPE1 = 0) %START
U_1003:;
if (MODE <= 0) goto L_0072;
if (TYPE != 0) goto L_0073;
if (TYPE1 != 0) goto L_0073;
L_0072:;
// 494 FAULT('A') %IF TYPE # 0
if (TYPE == 0) goto L_0074;
FAULT(65);
L_0074:;
// 495 TYPE = TYPE1; VAL = LITVAL
TYPE = TYPE1;
VAL = LITVAL;
// 496 %finish %ELSE %START
goto L_0075;
L_0073:;
// 497 %IF %NOT TEMP %OR (TYPE=REG %AND VAL=DREG %AND DUSE=1 %AND K#0) %START
if (!(TEMP())) goto L_0065;
if (TYPE != REG) goto L_0076;
if (VAL != DREG) goto L_0076;
if (DUSE != 1) goto L_0076;
if (K == 0) goto L_0076;
L_0065:;
// 498 SWOP
SWOP();
// 499 %IF K = 0 %OR %NOT TEMP %START
if (K == 0) goto L_0077;
if (TEMP()) goto L_0078;
L_0077:;
// 500 LOAD TEMP; SWOP
LOADTEMP();
SWOP();
// 501 %FINISH
L_0078:;
// 502 %FINISH
L_0076:;
// 503 LOAD TEMP %IF TYPE&BMASK # 0 %OR (OP&MEM=0 %AND TYPE&MEMMASK#0)
if (TYPE & BMASK != 0) goto L_0079;
if (OP & MEM != 0) goto L_007A;
if (TYPE & MEMMASK == 0) goto L_007A;
L_0079:;
LOADTEMP();
L_007A:;
// 504 RELEASE
RELEASE();
// 505 PLANT INST(VAL1<<4+OP)
PLANTINST((VAL1 << 4) + OP);
// 506 TYPE = REG; VAL = VAL1
TYPE = REG;
VAL = VAL1;
// 507 CREG = VAL; CTYPE = 0; CVAL = 0
CREG = VAL;
CTYPE = 0;
CVAL = 0;
// 508 ATYPE = -1 %IF ACC = VAL %OR ATYPE&15 = VAL # 0
if (ACC == VAL) goto L_007B;
{
// Double-sided test on VAL (Part I)
int tmp;
if (ATYPE & 15 != (tmp = VAL)) goto L_007C;
// Double-sided test on VAL (Part II)
if (tmp == 0) goto L_007C;
}
L_007B:;
ATYPE = -1;
L_007C:;
// 509 ATYPE = -1 %IF ATYPE = REG %AND AVAL = VAL
if (ATYPE != REG) goto L_007D;
if (AVAL != VAL) goto L_007D;
ATYPE = -1;
L_007D:;
// 510 %FINISH
L_0075:;
// 511
// 512 POP:NQ = NQ-2
U_1004:;
NQ = NQ - 2;
// 513 TYPE1 = INTEGER(NQ); VAL1 = INTEGER(NQ+1)
TYPE1 = INTEGER(NQ);
VAL1 = INTEGER(NQ + 1);
// 514 ->GET
goto U_1001;
// 515
// 516 ASS(-2):
case_ASS_M2:;
// 517 OP = SUB
OP = SUB;
// 518 ->NOP %IF MODE > 0 %AND TYPE # 0
if (MODE <= 0) goto L_007E;
if (TYPE == 0) goto L_007E;
goto U_1002;
L_007E:;
// 519 TYPE1 = 0 %AND TYPE = 0 %IF MODE <= 0 %AND TYPE1 = TYPE
if (MODE > 0) goto L_007F;
if (TYPE1 != TYPE) goto L_007F;
TYPE1 = 0;
TYPE = 0;
L_007F:;
// 520 VAL = -VAL
VAL = -VAL;
// 521 ASS(-1):
case_ASS_M1:;
// 522 OP = ADD; LITVAL = VAL1+VAL
OP = ADD;
LITVAL = VAL1 + VAL;
// 523 ->BOP %UNLESS TYPE = 0
if (TYPE == 0) goto L_0080;
goto U_1003;
L_0080:;
// 524 %IF TYPE1&MEMMASK # 0 %AND MODE > 0 %START
if (TYPE1 & MEMMASK == 0) goto L_0081;
if (MODE <= 0) goto L_0081;
// 525 SWOP; LOAD TEMP; SWOP
SWOP();
LOADTEMP();
SWOP();
// 526 %FINISH
L_0081:;
// 527 %IF TYPE1 = REG %START
if (TYPE1 != REG) goto L_0082;
// 528 ->BOP %IF VAL1 = 0
if (VAL1 != 0) goto L_0083;
goto U_1003;
L_0083:;
// 529 TYPE1 = XMASK+VAL1; LITVAL = VAL
TYPE1 = XMASK + VAL1;
LITVAL = VAL;
// 530 %FINISH
L_0082:;
// 531 TYPE = TYPE1; VAL = LITVAL
TYPE = TYPE1;
VAL = LITVAL;
// 532 ->POP
goto U_1004;
// 533 ASS(-3):
case_ASS_M3:;
// 534 OP = AND; LITVAL = VAL1&VAL
OP = AND;
LITVAL = VAL1 & VAL;
// 535 ->BOP
goto U_1003;
// 536 ASS(-4):
case_ASS_M4:;
// 537 OP = OR; LITVAL = VAL1!VAL
OP = OR;
LITVAL = VAL1 | VAL;
// 538 ->BOP
goto U_1003;
// 539 ASS(-5):
case_ASS_M5:;
// 540 OP = XOR; LITVAL = VAL1!!VAL
OP = XOR;
LITVAL = VAL1 ^ VAL;
// 541 ->BOP
goto U_1003;
// 542 ASS(-6):
case_ASS_M6:;
// 543 OP = SLLS; LITVAL = VAL1<<VAL
OP = SLLS;
LITVAL = VAL1 << VAL;
// 544 OP = SLHL %IF TYPE # 0
if (TYPE == 0) goto L_0084;
OP = SLHL;
L_0084:;
// 545 ->NOP
goto U_1002;
// 546 ASS(-7):
case_ASS_M7:;
// 547 OP = SRLS; LITVAL = VAL1>>VAL
OP = SRLS;
LITVAL = (unsigned int)VAL1 >> VAL;
// 548 OP = SRHL %IF TYPE # 0
if (TYPE == 0) goto L_0085;
OP = SRHL;
L_0085:;
// 549 ->NOP
goto U_1002;
// 550
// 551 ASS(-8): !TYPE_VAL
case_ASS_M8:;
// 552 TYPE = VAL1
TYPE = VAL1;
// 553 TYPE = 0 %IF TYPE&OPMASK = MACRO; !SAFETY
if (TYPE & OPMASK != MACRO) goto L_0086;
TYPE = 0;
L_0086:;
// 554 TYPE = 0 %IF TYPE&(OPMASK+FMASK) = FMASK
if (TYPE & OPMASK + FMASK != FMASK) goto L_0087;
TYPE = 0;
L_0087:;
// 555 ->POP
goto U_1004;
// 556
// 557 ASS(-11): !COMPARE
case_ASS_M11:;
// 558 K = INTEGER(Q); Q = Q+1
K = INTEGER(Q);
Q = Q + 1;
// 559 %IF MODE <= 0 %START
if (MODE > 0) goto L_0088;
// 560 VAL1 = TYPE1 %AND VAL = TYPE %IF TYPE1 # TYPE
if (TYPE1 == TYPE) goto L_0089;
VAL1 = TYPE1;
VAL = TYPE;
L_0089:;
// 561 LITVAL = \3
LITVAL = (~3);
// 562 LITVAL = 1 %IF VAL1 < VAL
if (VAL1 >= VAL) goto L_008A;
LITVAL = 1;
L_008A:;
// 563 LITVAL = 2 %IF VAL1 > VAL
if (VAL1 <= VAL) goto L_008B;
LITVAL = 2;
L_008B:;
// 564 K = K&LITVAL; K = \0 %IF K # 0
K = K & LITVAL;
if (K == 0) goto L_008C;
K = (~0);
L_008C:;
// 565 %finish %ELSE %UNLESS CREG=16 %AND TYPE1=CTYPE %AND VAL1=CVAL %AND TYPE=VAL=0 %START
goto L_008D;
L_0088:;
if (CREG != 16) goto L_008E;
if (TYPE1 != CTYPE) goto L_008E;
if (VAL1 != CVAL) goto L_008E;
{
// Double-sided test on VAL (Part I)
int tmp;
if (TYPE != (tmp = VAL)) goto L_008E;
// Double-sided test on VAL (Part II)
if (tmp == 0) goto L_008F;
}
L_008E:;
// 566 %IF TYPE1 # REG %START
if (TYPE1 == REG) goto L_0090;
// 567 SWOP
SWOP();
// 568 %IF TYPE1 # REG %START
if (TYPE1 == REG) goto L_0091;
// 569 LOAD TEMP; SWOP
LOADTEMP();
SWOP();
// 570 %finish %ELSE %START
goto L_0092;
L_0091:;
// 571 K = K!!3 %UNLESS K = 3 %OR K = \3
if (K == 3) goto L_0093;
if (K == (~3)) goto L_0093;
K = K ^ 3;
L_0093:;
// 572 %FINISH
L_0092:;
// 573 %FINISH
L_0090:;
// 574 %UNLESS CREG = VAL1 %AND CTYPE = TYPE %AND CVAL = VAL %START
if (CREG != VAL1) goto L_0094;
if (CTYPE != TYPE) goto L_0094;
if (CVAL == VAL) goto L_0095;
L_0094:;
// 575 CREG = VAL1; CTYPE = TYPE; CVAL = VAL
CREG = VAL1;
CTYPE = TYPE;
CVAL = VAL;
// 576 %UNLESS TYPE = VAL = 0 %START
{
// Double-sided test on VAL (Part I)
int tmp;
if (TYPE != (tmp = VAL)) goto L_0096;
// Double-sided test on VAL (Part II)
if (tmp == 0) goto L_0097;
}
L_0096:;
// 577 OP = COMP
OP = COMP;
// 578 %IF TYPE = ATYPE %AND VAL = AVAL %START
if (TYPE != ATYPE) goto L_0098;
if (VAL != AVAL) goto L_0098;
// 579 TYPE = REG; VAL = ACC
TYPE = REG;
VAL = ACC;
// 580 %FINISH
L_0098:;
// 581 %IF TYPE&BMASK # 0 %START
if (TYPE & BMASK == 0) goto L_0099;
// 582 OP = CLB
OP = CLB;
// 583 FAULT('I') %UNLESS K = 3 %OR K = \3
if (K == 3) goto L_009A;
if (K == (~3)) goto L_009A;
FAULT(73);
L_009A:;
// 584 %FINISH
L_0099:;
// 585 %finish %ELSE %START
goto L_009B;
L_0097:;
// 586 OP = LOAD
OP = LOAD;
// 587 TYPE = REG; VAL = VAL1
TYPE = REG;
VAL = VAL1;
// 588 %FINISH
L_009B:;
// 589 PLANT INST(VAL1<<4+OP)
PLANTINST((VAL1 << 4) + OP);
// 590 %FINISH
L_0095:;
// 591 %FINISH
L_008F:;
L_008D:;
// 592 COND = K
COND = K;
// 593 ->GET
goto U_1001;
// 594
// 595 ASS(-12): !TEST CC
case_ASS_M12:;
// 596 COND = \VAL
COND = (~VAL);
// 597 ->GET
goto U_1001;
// 598
// 599 ASS(-13): !AND,WHILE
case_ASS_M13:;
// 600 %IF MODE > 0 %START
if (MODE <= 0) goto L_009C;
// 601 SET JUMP(16_1000)
SETJUMP(4096);
// 602 %finish %ELSE %START
goto L_009D;
L_009C:;
// 603 %RETURN %IF COND # 0; !CONDITION FALSE
if (COND == 0) goto L_009E;
return;
L_009E:;
// 604 %FINISH
L_009D:;
// 605 %RETURN %IF Q = QLIM
if (Q != QLIM) goto L_009F;
return;
L_009F:;
// 606 ->NEW
goto U_1000;
// 607
// 608 ASS(-14): !OR
case_ASS_M14:;
// 609 %IF MODE > 0 %START
if (MODE <= 0) goto L_00A0;
// 610 COND = \COND
COND = (~COND);
// 611 SET JUMP(16_3000)
SETJUMP(12288);
// 612 %finish %ELSE %START
goto L_00A1;
L_00A0:;
// 613 %RETURN %IF COND = 0; !CONDITION TRUE
if (COND != 0) goto L_00A2;
return;
L_00A2:;
// 614 %FINISH
L_00A1:;
// 615 ->NEW
goto U_1000;
// 616
// 617 ASS(-15): !IF
case_ASS_M15:;
// 618 SET JUMP(16_2000)
SETJUMP(8192);
// 619 %RETURN
return;
// 620
// 621 ASS(-16): !ELSE
case_ASS_M16:;
// 622 COND = \0
COND = (~0);
// 623 SET JUMP(16_4000)
SETJUMP(16384);
// 624 %RETURN
return;
// 625
// 626 ASS(-17): !IF AFTER ELSE
case_ASS_M17:;
// 627 SET JUMP(16_6000)
SETJUMP(24576);
// 628 %RETURN
return;
// 629
// 630 ASS(-18): !MACCALL IF
case_ASS_M18:;
// 631 SET JUMP(16_8000)
SETJUMP(32768);
// 632 %RETURN
return;
// 633
// 634 ASS(-20): !HASH
case_ASS_M20:;
// 635 TYPE = TYPE&(UMASK+63)
TYPE = TYPE & UMASK + 63;
// 636 ->GET
goto U_1001;
// 637
// 638 ASS(-21): !INDEX
case_ASS_M21:;
// 639 FAULT('I') %IF TYPE1®XMASK # 0
if (TYPE1 & REGXMASK == 0) goto L_00A3;
FAULT(73);
L_00A3:;
// 640 %IF TYPE&MEMMASK # 0 %START
if (TYPE & MEMMASK == 0) goto L_00A4;
// 641 %IF MODE > 0 %START
if (MODE <= 0) goto L_00A5;
// 642 ZQUERY = 1
ZQUERY = 1;
// 643 LOAD TEMP
LOADTEMP();
// 644 ZQUERY = 0
ZQUERY = 0;
// 645 %finish %ELSE FAULT('A')
goto L_00A6;
L_00A5:;
FAULT(65);
L_00A6:;
// 646 %FINISH
L_00A4:;
// 647 %IF TYPE = REG %START
if (TYPE != REG) goto L_00A7;
// 648 TYPE = XMASK+VAL; VAL = 0
TYPE = XMASK + VAL;
VAL = 0;
// 649 %FINISH
L_00A7:;
// 650 ZQUERY = 0
ZQUERY = 0;
// 651 FAULT('I') %IF TYPE1&TYPE&RELMASK # 0
if (TYPE1 & TYPE & RELMASK == 0) goto L_00A8;
FAULT(73);
L_00A8:;
// 652 TYPE = TYPE1!TYPE!MEMMASK; VAL = VAL1+VAL
TYPE = TYPE1 | TYPE | MEMMASK;
VAL = VAL1 + VAL;
// 653 ->POP
goto U_1004;
// 654
// 655 ASS(-22): !MINST SEPARATOR
case_ASS_M22:;
// 656 %IF TYPE1&OPMASK = 16_7000 %START
if (TYPE1 & OPMASK != 28672) goto L_00A9;
// 657 %IF TYPE1&16_10 = 0 %START; !REG-TYPE INST
if (TYPE1 & 16 != 0) goto L_00AA;
// 658 FAULT('I') %IF TYPE # REG
if (TYPE == REG) goto L_00AB;
FAULT(73);
L_00AB:;
// 659 %finish %ELSE %START
goto L_00AC;
L_00AA:;
// 660 VAL = \VAL %AND VAL1 = VAL1!!16_0100 %IF VAL < 0
if (VAL >= 0) goto L_00AD;
VAL = (~VAL);
VAL1 = VAL1 ^ 256;
L_00AD:;
// 661 FAULT('I') %IF TYPE # 0 %OR VAL > 15
if (TYPE != 0) goto L_00AE;
if (VAL <= 15) goto L_00AF;
L_00AE:;
FAULT(73);
L_00AF:;
// 662 %FINISH
L_00AC:;
// 663 TYPE = TYPE1+16_8000; VAL = VAL1&16_FF0F+VAL<<4
TYPE = TYPE1 + 32768;
VAL = (VAL1 & 65295) + (VAL << 4);
// 664 %finish %ELSE %IF TYPE1&OPMASK = 16_F000 %START
goto L_00B0;
L_00A9:;
if (TYPE1 & OPMASK != 61440) goto L_00B1;
// 665 PROGREF %IF VAL1&16_FC0F = 16_0003; !BAL,BTC,BFC
if (VAL1 & 64527 != 3) goto L_00B2;
PROGREF();
L_00B2:;
// 666 FORM INST(VAL1)
FORMINST(VAL1);
// 667 %finish %ELSE FAULT('I')
goto L_00B0;
L_00B1:;
FAULT(73);
L_00B0:;
// 668 ->POP
goto U_1004;
// 669
// 670 ASS(-23): !MACHINE INST
case_ASS_M23:;
// 671 SET JUMP(16_1000) %IF COND # 0
if (COND == 0) goto L_00B3;
SETJUMP(4096);
L_00B3:;
// 672 PLANT VAL
PLANTVAL();
// 673 CREG = -1; ATYPE = -1
CREG = -1;
ATYPE = -1;
// 674 %RETURN
return;
// 675
// 676 ASS(-24): !LOAD
case_ASS_M24:;
// 677 LOAD TEMP %IF TYPE # REG
if (TYPE == REG) goto L_00B4;
LOADTEMP();
L_00B4:;
// 678 Q = QBASE
Q = QBASE;
// 679 ->GET
goto U_1001;
// 680
// 681 ASS(-25): !STORE (TYPE1,VAL1 -> TYPE,VAL)
case_ASS_M25:;
// 682 %IF TYPE = REG %START
if (TYPE != REG) goto L_00B5;
// 683 SWOP %AND LOAD REG(VAL1) %IF VAL1 # VAL
if (VAL1 == VAL) goto L_00B6;
SWOP();
LOADREG(VAL1);
L_00B6:;
// 684 %finish %ELSE %START
goto L_00B7;
L_00B5:;
// 685 ATYPE = -1 %IF ATYPE&MEMMASK # 0
if (ATYPE & MEMMASK == 0) goto L_00B8;
ATYPE = -1;
L_00B8:;
// 686 %IF FLAG = 0 %START
if (FLAG != 0) goto L_00B9;
// 687 %IF VAL1 = ACC %AND ATYPE < 0 %START
if (VAL1 != ACC) goto L_00BA;
if (ATYPE >= 0) goto L_00BA;
// 688 K = TYPE&15
K = TYPE & 15;
// 689 ATYPE = TYPE %AND AVAL = VAL %IF K = 0 %OR 1<<K&TEMPS = 0
if (K == 0) goto L_00BB;
if (1 << K & TEMPS != 0) goto L_00BC;
L_00BB:;
ATYPE = TYPE;
AVAL = VAL;
L_00BC:;
// 690 %FINISH
L_00BA:;
// 691 OP = STORE; OP = STB %IF TYPE&BMASK # 0
OP = STORE;
if (TYPE & BMASK == 0) goto L_00BD;
OP = STB;
L_00BD:;
// 692 %finish %ELSE %START
goto L_00BE;
L_00B9:;
// 693 CREG = 16; CTYPE = TYPE; CVAL = VAL
CREG = 16;
CTYPE = TYPE;
CVAL = VAL;
// 694 OP = AHM
OP = AHM;
// 695 %FINISH
L_00BE:;
// 696 PLANT INST(VAL1<<4+OP)
PLANTINST((VAL1 << 4) + OP);
// 697 %FINISH
L_00B7:;
// 698 %RETURN
return;
// 699
// 700 ASS(-26): !JUMP
case_ASS_M26:;
// 701 SET JUMP(16_1000) %IF INTEGER(NP)&16_F000 = 16_3000; !OR
if (INTEGER(NP) & 61440 != 12288) goto L_00BF;
SETJUMP(4096);
L_00BF:;
// 702 %IF FLAG < 0 %START; !REPEAT
if (FLAG >= 0) goto L_00C0;
// 703 FLAG = 0
FLAG = 0;
// 704 %IF PASS = 0 %START
if (PASS != 0) goto L_00C1;
// 705 K = NP; LITVAL = LOC
K = NP;
LITVAL = LOC;
// 706 %WHILE INTEGER(K)&16_1000 # 0 %CYCLE
L_00C2:;
if (INTEGER(K) & 4096 == 0) goto L_00C3;
// 707 K = K+2; LITVAL = LITVAL-2
K = K + 2;
LITVAL = LITVAL - 2;
// 708 %REPEAT
goto L_00C2;
L_00C3:;
// 709 FLAG = 1 %IF LITVAL-VAL < 32
if (LITVAL - VAL >= 32) goto L_00C4;
FLAG = 1;
L_00C4:;
// 710 %FINISH
L_00C1:;
// 711 %FINISH
L_00C0:;
// 712 PROGREF
PROGREF();
// 713 PLANT JUMP
PLANTJUMP();
// 714 %RETURN
return;
// 715
// 716 %END; !ASSEMBLE
case_ASS_dispatch:
if (ASS_index < -30 || ASS_index > -1)
_imp_signalf(6, 3, ASS_index, "->ASS(%d) out of bounds at %s line %d", ASS_index, ASS_file, ASS_line);
goto *ASS[ASS_index - -30];
case_ASS_missing:
_imp_signalf(8, 2, ASS_index, "switch jump to undefined label ASS(%d): at %s line %d", ASS_index, ASS_file,
ASS_line);
} /* end of ASSEMBLE */
// 717
// 718 %ROUTINE LOOKUP(%INTEGER CONTROL)
void LOOKUP(int CONTROL) {
// 719 !ALL DICT OPERATIONS LOCALISED HERE
// 720 !CONTROL = 0 (LOOKUP ONLY), 1 (FORWARD OK),
// 721 ! 2 (REDEF), 3 (DEF),
// 722 ! 4 (MACPARM), 7 (LABEL)
// 723 %INTEGER DP
int DP;
// 724 DP = DEFMIN; DP = MP+5 %IF CONTROL = 4
DP = DEFMIN;
if (CONTROL != 4) goto L_00C5;
DP = MP + 5;
L_00C5:;
// 725
// 726 {} %WHILE INTEGER(DP) # 0 %CYCLE
L_00C6:;
if (INTEGER(DP) == 0) goto L_00C7;
// 727 {} ->YES %IF INTEGER(DP) = TAG1 %AND INTEGER(DP+1) = TAG2
if (INTEGER(DP) != TAG1) goto L_00C8;
if (INTEGER(DP + 1) != TAG2) goto L_00C8;
goto U_1005;
L_00C8:;
// 728 {} DP = DP+4
DP = DP + 4;
// 729 {} %REPEAT
goto L_00C6;
L_00C7:;
// 730
// 731 !!%OWNINTEGER P
// 732 !! DP = DP-4
// 733 !!REP:DP = DP+4
// 734 !! %LAC* DP; %OPR 640;!SNA; %JMP NO
// 735 !! %SAD TAG1; %OPR 512; %JMP REP
// 736 !! %LAC DP; %TAD #1; %DAC P
// 737 !! %LAC* P; %SAD TAG2; %JMP YES
// 738 !! ->REP
// 739 !!NO:
// 740 %RETURN %IF CONTROL&1 = 0; !NO CREATION
if (CONTROL & 1 != 0) goto L_00C9;
return;
L_00C9:;
// 741 NEW:DEFMIN = DEFMIN-4; DP = DEFMIN
U_1006:;
DEFMIN = DEFMIN - 4;
DP = DEFMIN;
// 742 !! %MONITOR 21 %IF DP-QLIM <= 0
// 743 !{}%signal 2,1 %IF DP-QLIM <= 0
// 744 !! INTEGER(DP) = TAG1; INTEGER(DP+1) = TAG2
// 745 set INTEGER(DP, TAG1); set INTEGER(DP+1, TAG2)
SETINTEGER(DP, TAG1);
SETINTEGER(DP + 1, TAG2);
// 746 !!SET:INTEGER(DP+2) = TYPE; INTEGER(DP+3) = VAL
// 747 SET:set INTEGER(DP+2, TYPE); set INTEGER(DP+3, VAL)
U_1007:;
SETINTEGER(DP + 2, TYPE);
SETINTEGER(DP + 3, VAL);
// 748 %RETURN
return;
// 749 YES:%IF CONTROL&2 = 0 %START; !NOT DEF CLASS
U_1005:;
if (CONTROL & 2 != 0) goto L_00CA;
// 750 TYPE = INTEGER(DP+2); VAL = INTEGER(DP+3)
TYPE = INTEGER(DP + 2);
VAL = INTEGER(DP + 3);
// 751 %RETURN
return;
// 752 %FINISH
L_00CA:;
// 753 %IF CONTROL = 3 %START
if (CONTROL != 3) goto L_00CB;
// 754 ->NEW %IF DP-INTEGER(BP) >= 0; !GLOBAL
if (DP - INTEGER(BP) < 0) goto L_00CC;
goto U_1006;
L_00CC:;
// 755 FAULT('D')
FAULT(68);
// 756 %FINISH
L_00CB:;
// 757 ->SET %IF CONTROL # 7
if (CONTROL == 7) goto L_00CD;
goto U_1007;
L_00CD:;
// 758 %IF INTEGER(DP+2)&OPFMASK = FMASK %START
if (INTEGER(DP + 2) & OPFMASK != FMASK) goto L_00CE;
// 759 VAL = INTEGER(DP+3)
VAL = INTEGER(DP + 3);
// 760 %IF PASS = 0 %START
if (PASS != 0) goto L_00CF;
// 761 !! INTEGER(VAL) = LOC
// 762 set INTEGER(VAL, LOC)
SETINTEGER(VAL, LOC);
// 763 %finish %ELSE %START
goto L_00D0;
L_00CF:;
// 764 FAULT('P') %AND LOC=INTEGER(VAL) %IF INTEGER(VAL) # LOC
if (INTEGER(VAL) == LOC) goto L_00D1;
FAULT(80);
LOC = INTEGER(VAL);
L_00D1:;
// 765 %FINISH
L_00D0:;
// 766 VAL = LOC
VAL = LOC;
// 767 %finish %ELSE %START
goto L_00D2;
L_00CE:;
// 768 ->NEW %IF DP-INTEGER(BP) >= 0
if (DP - INTEGER(BP) < 0) goto L_00D3;
goto U_1006;
L_00D3:;
// 769 FAULT('D')
FAULT(68);
// 770 %FINISH
L_00D2:;
// 771 ->SET
goto U_1007;
// 772 %END
} /* end of LOOKUP */
// 773
// 774 %ROUTINE TAGREF
void TAGREF(void) {
// 775 %OWNINTEGER B=2184, W=24717
static int B = 2184;
static int W = 24717;
// 776 %IF TERM = '(' %START
if (TERM != 40) goto L_00D4;
// 777 TYPE = 0; VAL = 0
TYPE = 0;
VAL = 0;
// 778 %RETURN %IF TAG1 = W
if (TAG1 != W) goto L_00D5;
return;
L_00D5:;
// 779 TYPE = BMASK
TYPE = BMASK;
// 780 %RETURN %IF TAG1 = B
if (TAG1 != B) goto L_00D6;
return;
L_00D6:;
// 781 %FINISH
L_00D4:;
// 782 TYPE = LOCTYPE+FMASK+UMASK; VAL = LABMIN-1
TYPE = LOCTYPE + FMASK + UMASK;
VAL = LABMIN - 1;
// 783 LOOKUP(1)
LOOKUP(1);
// 784 %IF TYPE&OPFMASK = FMASK %START
if (TYPE & OPFMASK != FMASK) goto L_00D7;
// 785 %IF VAL = LABMIN-1 %START
if (VAL != LABMIN - 1) goto L_00D8;
// 786 !! LABMIN = VAL; %MONITOR 22 %IF LABMIN = ALMAX
// 787 LABMIN = VAL; !{}%signal 2,2 %IF LABMIN = ALMAX
LABMIN = VAL;
// 788 %FINISH
L_00D8:;
// 789 %IF PASS > 0 %START
if (PASS <= 0) goto L_00D9;
// 790 VAL = INTEGER(VAL)
VAL = INTEGER(VAL);
// 791 FAULT('U') %IF VAL = 0
if (VAL != 0) goto L_00DA;
FAULT(85);
L_00DA:;
// 792 %FINISH
L_00D9:;
// 793 TYPE = TYPE-FMASK
TYPE = TYPE - FMASK;
// 794 %FINISH
L_00D7:;
// 795 %END
return;
} /* end of TAGREF */
// 796
// 797 %ROUTINE GET SYM
void GETSYM(void) {
// 798 %CYCLE
L_00DB:;
// 799 SYM = CHAR(GETPOS); GETPOS = GETPOS+1
SYM = CHAR(GETPOS);
GETPOS = GETPOS + 1;
// 800 %RETURN %IF SYM # ' '
if (SYM == 32) goto L_00DC;
return;
L_00DC:;
// 801 %REPEAT
goto L_00DB;
// 802 %END
} /* end of GETSYM */
// 803
// 804 %PREDICATE S(%INTEGER K)
int S(int K) {
// 805 %FALSE %UNLESS K = SYM
if (K == SYM) goto L_00DD;
return 0 /*FALSE*/;
L_00DD:;
// 806 GET SYM
GETSYM();
// 807 %TRUE
return 1 /*TRUE*/;
// 808 %END
} /* end of S */
// 809
// 810 %PREDICATE SS(%INTEGER K)
int SS(int K) {
// 811 %FALSE %UNLESS K = SYM = CHAR(GETPOS)
{
// Double-sided test on SYM (Part I)
int tmp;
if (K != (tmp = SYM)) goto L_00DE;
// Double-sided test on SYM (Part II)
if (tmp == CHAR(GETPOS)) goto L_00DF;
}
L_00DE:;
return 0 /*FALSE*/;
L_00DF:;
// 812 GETPOS = GETPOS+1
GETPOS = GETPOS + 1;
// 813 GET SYM
GETSYM();
// 814 %TRUE
return 1 /*TRUE*/;
// 815 %END
} /* end of SS */
// 816
// 817 %PREDICATE TAG
int TAG(void) {
// 818 %INTEGER J,K
int J;
int K;
// 819 %ROUTINE CODE SYM
void CODESYM(void) {
// 820 SYM = CHAR(GETPOS); GETPOS = GETPOS+1
SYM = CHAR(GETPOS);
GETPOS = GETPOS + 1;
// 821 K = SYM-'0'
K = SYM - 48;
// 822 %IF K >= 0 %START
if (K < 0) goto L_00E0;
// 823 TERM = -1 %AND %RETURN %IF K < 10
if (K >= 10) goto L_00E1;
TERM = -1;
return;
L_00E1:;
// 824 K = SYM-'A'
K = SYM - 65;
// 825 %RETURN %IF K >= 0 %AND K < 26 %AND TERM = 0
if (K < 0) goto L_00E2;
if (K >= 26) goto L_00E2;
if (TERM != 0) goto L_00E2;
return;
L_00E2:;
// 826 %FINISH
L_00E0:;
// 827 TERM = SYM
TERM = SYM;
// 828 %END
return;
} /* end of CODESYM */
// 829 %ROUTINE PACK TRIPLE
void PACKTRIPLE(void) {
// 830 ->T1 %IF TERM < 0
if (TERM >= 0) goto L_00E3;
goto U_1008;
L_00E3:;
// 831 J = ((K<<5+K)<<1+K)<<4+K+1111; !K*1073+1111
J = (((K << 5) + K << 1) + K << 4) + K + 1111;
// 832 CODE SYM
CODESYM();
// 833 ->T2 %IF TERM # 0
if (TERM == 0) goto L_00E4;
goto U_1009;
L_00E4:;
// 834 J = (K<<3+K)<<2+K+111+J; !J+K*37+111
J = ((K << 3) + K << 2) + K + 111 + J;
// 835 CODE SYM
CODESYM();
// 836 ->T3 %IF TERM # 0
if (TERM == 0) goto L_00E5;
goto U_100A;
L_00E5:;
// 837 J = J+K+11
J = J + K + 11;
// 838 CODE SYM
CODESYM();
// 839 %RETURN
return;
// 840 T1: J = ((K<<1+K)<<1+K)<<4-K+1; !K*111+1
U_1008:;
J = (((K << 1) + K << 1) + K << 4) - K + 1;
// 841 CODE SYM
CODESYM();
// 842 T2: %RETURN %IF TERM > 0
U_1009:;
if (TERM <= 0) goto L_00E6;
return;
L_00E6:;
// 843 J = (K<<2+K)<<1+K+1+J; !J+K*11+1
J = ((K << 2) + K << 1) + K + 1 + J;
// 844 CODE SYM
CODESYM();
// 845 T3: %RETURN %IF TERM > 0
U_100A:;
if (TERM <= 0) goto L_00E7;
return;
L_00E7:;
// 846 J = J+K+1
J = J + K + 1;
// 847 CODE SYM
CODESYM();
// 848 %END
return;
} /* end of PACKTRIPLE */
// 849 K = SYM-'A'
K = SYM - 65;
// 850 %FALSE %UNLESS K >= 0 %AND K < 26
if (K < 0) goto L_00E8;
if (K < 26) goto L_00E9;
L_00E8:;
return 0 /*FALSE*/;
L_00E9:;
// 851 %FALSE %IF SYM = 'X' %AND CHAR(GETPOS)&128 # 0
if (SYM != 88) goto L_00EA;
if (CHAR(GETPOS) & 128 == 0) goto L_00EA;
return 0 /*FALSE*/;
L_00EA:;
// 852 TERM = 0
TERM = 0;
// 853 PACK TRIPLE
PACKTRIPLE();
// 854 TAG1 = J
TAG1 = J;
// 855 %CYCLE
L_00EB:;
// 856 J = 0
J = 0;
// 857 PACK TRIPLE %IF TERM <= 0
if (TERM > 0) goto L_00EC;
PACKTRIPLE();
L_00EC:;
// 858 TAG2 = J
TAG2 = J;
// 859 CODE SYM %WHILE TERM <= 0
L_00ED:;
if (TERM > 0) goto L_00EE;
CODESYM();
goto L_00ED;
L_00EE:;
// 860 %EXIT %UNLESS TERM = QQ
if (TERM == QQ) goto L_00EF;
goto L_00F0;
L_00EF:;
// 861 TYPE = 1; LOOKUP(0)
TYPE = 1;
LOOKUP(0);
// 862 FAULT('U') %IF TYPE # 0
if (TYPE == 0) goto L_00F1;
FAULT(85);
L_00F1:;
// 863 TAG1 = VAL
TAG1 = VAL;
// 864 TERM = 0; CODE SYM
TERM = 0;
CODESYM();
// 865 %REPEAT
goto L_00EB;
L_00F0:;
// 866 GET SYM %IF TERM = ' '
if (TERM != 32) goto L_00F2;
GETSYM();
L_00F2:;
// 867 %TRUE
return 1 /*TRUE*/;
// 868 %END
} /* end of TAG */
// 869
// 870 %PREDICATE TAGIF
int TAGIF(void) {
// 871 %FALSE %UNLESS SYM='I' %AND CHAR(GETPOS)='F' %AND CHAR(GETPOS+1)=' '
if (SYM != 73) goto L_00F3;
if (CHAR(GETPOS) != 70) goto L_00F3;
if (CHAR(GETPOS + 1) == 32) goto L_00F4;
L_00F3:;
return 0 /*FALSE*/;
L_00F4:;
// 872 GETPOS = GETPOS+2
GETPOS = GETPOS + 2;
// 873 GET SYM
GETSYM();
// 874 %TRUE
return 1 /*TRUE*/;
// 875 %END
} /* end of TAGIF */
// 876
// 877 %ROUTINE QUEUE(%INTEGER K)
void QUEUE(int K) {
// 878 !! INTEGER(QLIM) = K
// 879 set INTEGER(QLIM, K)
SETINTEGER(QLIM, K);
// 880 !! QLIM = QLIM+1; %MONITOR 21 %IF QLIM = DEFMIN
// 881 QLIM = QLIM+1; !{}%signal 2,1 %IF QLIM = DEFMIN
QLIM = QLIM + 1;
// 882 %END
return;
} /* end of QUEUE */
// 883
// 884 %ROUTINE GET EXP
void GETEXP(void) {
// 885 %INTEGER I,NBASE
int I;
int NBASE;
// 886
// 887 NBASE = NP
NBASE = NP;
// 888 ->E3 %IF PEND # 0
if (PEND == 0) goto L_00F5;
goto U_1009;
L_00F5:;
// 889 E1: NEST(0) %WHILE S('(')
U_100A:;
L_00F6:;
if (!(S(40))) goto L_00F7;
NEST(0);
goto L_00F6;
L_00F7:;
// 890 NEST(-20) %IF S('#')
if (!(S(35))) goto L_00F8;
NEST(-20);
L_00F8:;
// 891 %IF TAG %START
if (!(TAG())) goto L_00F9;
// 892 E3: TAGREF %IF PEND >= 0
U_1009:;
if (PEND < 0) goto L_00FA;
TAGREF();
L_00FA:;
// 893 PEND = 0
PEND = 0;
// 894 %IF TYPE = REG %AND TERM = '(' %START
if (TYPE != REG) goto L_00FB;
if (TERM != 40) goto L_00FB;
// 895 TYPE = 0 %IF SAVE&1 = 0; VAL = VAL+VAL+SAVE
if (SAVE & 1 != 0) goto L_00FC;
TYPE = 0;
L_00FC:;
VAL = VAL + VAL + SAVE;
// 896 %FINISH
L_00FB:;
// 897 FAULT('I') %AND TYPE=0 %IF TYPE&OPMASK # 0
if (TYPE & OPMASK == 0) goto L_00FD;
FAULT(73);
TYPE = 0;
L_00FD:;
// 898 %IF MODE # 0 %START
if (MODE == 0) goto L_00FE;
// 899 %IF TYPE®XMASK # 0 %START
if (TYPE & REGXMASK == 0) goto L_00FF;
// 900 I = TYPE&15; I = VAL %IF I = 0
I = TYPE & 15;
if (I != 0) goto L_0100;
I = VAL;
L_0100:;
// 901 DUSE = DUSE+1 %IF I = DREG
if (I != DREG) goto L_0101;
DUSE = DUSE + 1;
L_0101:;
// 902 %FINISH
L_00FF:;
// 903 %FINISH
L_00FE:;
// 904 %IF TERM = '(' %START
if (TERM != 40) goto L_0102;
// 905 GET SYM
GETSYM();
// 906 I = TYPE&31
I = TYPE & 31;
// 907 QUEUE(TYPE-I); QUEUE(VAL)
QUEUE(TYPE - I);
QUEUE(VAL);
// 908 NEST(-21); NEST(0)
NEST(-21);
NEST(0);
// 909 %IF I # 0 %START
if (I == 0) goto L_0103;
// 910 QUEUE(REG); QUEUE(I&15)
QUEUE(REG);
QUEUE(I & 15);
// 911 NEST(-1)
NEST(-1);
// 912 %FINISH
L_0103:;
// 913 ->E1
goto U_100A;
// 914 %FINISH
L_0102:;
// 915 %finish %ELSE %IF '0' <= SYM <= '9' %START
goto L_0104;
L_00F9:;
{
// Double-sided test on SYM (Part I)
int tmp;
if (48 > (tmp = SYM)) goto L_0105;
// Double-sided test on SYM (Part II)
if (tmp > 57) goto L_0105;
}
// 916 TYPE = 0; VAL = SYM-'0'
TYPE = 0;
VAL = SYM - 48;
// 917 %CYCLE
L_0106:;
// 918 SYM = CHAR(GETPOS)-'0'
SYM = CHAR(GETPOS) - 48;
// 919 %EXIT %UNLESS 0 <= SYM <= 9
{
// Double-sided test on SYM (Part I)
int tmp;
if (0 > (tmp = SYM)) goto L_0107;
// Double-sided test on SYM (Part II)
if (tmp <= 9) goto L_0108;
}
L_0107:;
goto L_0109;
L_0108:;
// 920 VAL = (VAL<<2+VAL)<<1+SYM
VAL = ((VAL << 2) + VAL << 1) + SYM;
// 921 GETPOS = GETPOS+1
GETPOS = GETPOS + 1;
// 922 %REPEAT
goto L_0106;
L_0109:;
// 923 GET SYM
GETSYM();
// 924 %finish %ELSE %IF SYM = 'X' %START
goto L_0104;
L_0105:;
if (SYM != 88) goto L_010A;
// 925 TYPE = 0; VAL = 0
TYPE = 0;
VAL = 0;
// 926 %CYCLE
L_010B:;
// 927 SYM = CHAR(GETPOS)-128
SYM = CHAR(GETPOS) - 128;
// 928 %EXIT %IF SYM < 0
if (SYM >= 0) goto L_010C;
goto L_010D;
L_010C:;
// 929 SYM = SYM-32 %IF SYM >= 96; !ENSURE UPPER-CASE
if (SYM < 96) goto L_010E;
SYM = SYM - 32;
L_010E:;
// 930 %IF '0' <= SYM <= '9' %OR 'A' <= SYM <= 'F' %START
{
// Double-sided test on SYM (Part I)
int tmp;
if (48 > (tmp = SYM)) goto L_010F;
// Double-sided test on SYM (Part II)
if (tmp <= 57) goto L_0110;
}
L_010F:;
{
// Double-sided test on SYM (Part I)
int tmp;
if (65 > (tmp = SYM)) goto L_0111;
// Double-sided test on SYM (Part II)
if (tmp > 70) goto L_0111;
}
L_0110:;
// 931 VAL = VAL<<4+SYM-'0'
VAL = (VAL << 4) + SYM - 48;
// 932 VAL = VAL-7 %IF SYM >= 'A'
if (SYM < 65) goto L_0112;
VAL = VAL - 7;
L_0112:;
// 933 %finish %ELSE FAULT('H')
goto L_0113;
L_0111:;
FAULT(72);
L_0113:;
// 934 GETPOS = GETPOS+1
GETPOS = GETPOS + 1;
// 935 %REPEAT
goto L_010B;
L_010D:;
// 936 GET SYM
GETSYM();
// 937 %finish %ELSE %IF SYM&128 # 0 %START
goto L_0104;
L_010A:;
if (SYM & 128 == 0) goto L_0114;
// 938 TYPE = 0; VAL = SYM-128
TYPE = 0;
VAL = SYM - 128;
// 939 GET SYM
GETSYM();
// 940 %IF MODE >= 0 %AND SYM&128 # 0 %START
if (MODE < 0) goto L_0115;
if (SYM & 128 == 0) goto L_0115;
// 941 VAL = VAL<<8+SYM-128; GET SYM
VAL = (VAL << 8) + SYM - 128;
GETSYM();
// 942 %FINISH
L_0115:;
// 943 %finish %ELSE %IF S('.') %START
goto L_0104;
L_0114:;
if (!(S(46))) goto L_0116;
// 944 ->ERR %IF %NOT TAG
if (TAG()) goto L_0117;
goto U_100B;
L_0117:;
// 945 TYPE = 0; VAL = TAG1
TYPE = 0;
VAL = TAG1;
// 946 %finish %ELSE %IF S('*') %START
goto L_0104;
L_0116:;
if (!(S(42))) goto L_0118;
// 947 TYPE = LOCTYPE&63; VAL = LOC
TYPE = LOCTYPE & 63;
VAL = LOC;
// 948 %IF SYM = 'L' %START; !FOR NOW
if (SYM != 76) goto L_0119;
// 949 TYPE = 0; VAL = LIST %IF TAG
TYPE = 0;
if (!(TAG())) goto L_011A;
VAL = LIST;
L_011A:;
// 950 %FINISH
L_0119:;
// 951 %finish %ELSE %IF SYM = '-' %START
goto L_0104;
L_0118:;
if (SYM != 45) goto L_011B;
// 952 TYPE = 0; VAL = 0
TYPE = 0;
VAL = 0;
// 953 %finish %ELSE %IF SYM = '\' %START
goto L_0104;
L_011B:;
if (SYM != 92) goto L_011C;
// 954 TYPE = 0; VAL = \0
TYPE = 0;
VAL = (~0);
// 955 %finish %ELSE ->ERR
goto L_0104;
L_011C:;
goto U_100B;
L_0104:;
// 956 QUEUE(TYPE); QUEUE(VAL)
QUEUE(TYPE);
QUEUE(VAL);
// 957
// 958 %WHILE NP # NBASE %CYCLE
L_011D:;
if (NP == NBASE) goto L_011E;
// 959 %IF INTEGER(NP) < 0 %START
if (INTEGER(NP) >= 0) goto L_011F;
// 960 QUEUE(INTEGER(NP))
QUEUE(INTEGER(NP));
// 961 %finish %ELSE %START
goto L_0120;
L_011F:;
// 962 %EXIT %IF %NOT S(')')
if (S(41)) goto L_0121;
goto L_011E;
L_0121:;
// 963 %FINISH
L_0120:;
// 964 NP = NP+1
NP = NP + 1;
// 965 %REPEAT
goto L_011D;
L_011E:;
// 966
// 967 I = 1
I = 1;
// 968 NEST(-1) %AND ->E8 %IF S('+')
if (!(S(43))) goto L_0122;
NEST(-1);
goto U_100C;
L_0122:;
// 969 NEST(-2) %AND ->E8 %IF S('-')
if (!(S(45))) goto L_0123;
NEST(-2);
goto U_100C;
L_0123:;
// 970 NEST(-3) %AND ->E9 %IF S('&')
if (!(S(38))) goto L_0124;
NEST(-3);
goto U_100D;
L_0124:;
// 971 NEST(-4) %AND ->E9 %IF S('!')
if (!(S(33))) goto L_0125;
NEST(-4);
goto U_100D;
L_0125:;
// 972 NEST(-5) %AND ->E9 %IF S('\')
if (!(S(92))) goto L_0126;
NEST(-5);
goto U_100D;
L_0126:;
// 973 NEST(-6) %AND ->E9 %IF SS('<')
if (!(SS(60))) goto L_0127;
NEST(-6);
goto U_100D;
L_0127:;
// 974 NEST(-7) %AND ->E9 %IF SS('>')
if (!(SS(62))) goto L_0128;
NEST(-7);
goto U_100D;
L_0128:;
// 975 NEST(-8) %AND ->E9 %IF S('_')
if (!(S(95))) goto L_0129;
NEST(-8);
goto U_100D;
L_0129:;
// 976 %RETURN %IF NP = NBASE
if (NP != NBASE) goto L_012A;
return;
L_012A:;
// 977 ERR:NP = NBASE
U_100B:;
NP = NBASE;
// 978 !! %MONITOR 19
// 979
// 980 E8: I = 0
U_100C:;
I = 0;
// 981 E9: ->E1 %UNLESS MODE = 2 %AND NP+1 = NBASE
U_100D:;
if (MODE != 2) goto L_012B;
if (NP + 1 == NBASE) goto L_012C;
L_012B:;
goto U_100A;
L_012C:;
// 982 %IF FLAG = I %THEN FLAG = QLIM %ELSE FLAG = -1
if (FLAG != I) goto L_012D;
FLAG = QLIM;
goto L_012E;
L_012D:;
FLAG = -1;
L_012E:;
// 983 ->E1
goto U_100A;
// 984 %END
} /* end of GETEXP */
// 985
// 986 %ROUTINE CONDIT(%INTEGER QVAL)
void CONDIT(int QVAL) {
// 987 %OWNINTEGER AND=1717, OR=16873
static int AND = 1717;
static int OR = 16873;
// 988 %INTEGER J,K
int J;
int K;
// 989 TRANSF = QSTART; QSTART = QLIM
TRANSF = QSTART;
QSTART = QLIM;
// 990 J = 0
J = 0;
// 991 %CYCLE
L_012F:;
// 992 GET EXP
GETEXP();
// 993 %IF S('=') %START
if (!(S(61))) goto L_0130;
// 994 K = 3
K = 3;
// 995 %finish %ELSE %IF S('#') %START
goto L_0131;
L_0130:;
if (!(S(35))) goto L_0132;
// 996 K = \3
K = (~3);
// 997 %finish %ELSE %IF S('<') %START
goto L_0131;
L_0132:;
if (!(S(60))) goto L_0133;
// 998 K = \1; K = 2 %IF S('=')
K = (~1);
if (!(S(61))) goto L_0134;
K = 2;
L_0134:;
// 999 %finish %ELSE %IF S('>') %START
goto L_0131;
L_0133:;
if (!(S(62))) goto L_0135;
// 1000 K = \2; K = 1 %IF S('=')
K = (~2);
if (!(S(61))) goto L_0136;
K = 1;
L_0136:;
// 1001 %finish %ELSE %START
goto L_0131;
L_0135:;
// 1002 QUEUE(-12)
QUEUE(-12);
// 1003 ->ANDOR
goto U_100D;
// 1004 %FINISH
L_0131:;
// 1005 GET EXP
GETEXP();
// 1006 QUEUE(-11); QUEUE(K)
QUEUE(-11);
QUEUE(K);
// 1007 ANDOR:
U_100D:;
// 1008 %EXIT %IF %NOT TAG
if (TAG()) goto L_0137;
goto L_0138;
L_0137:;
// 1009 %IF TAG1 = AND %AND TAG2 = 0 %START
if (TAG1 != AND) goto L_0139;
if (TAG2 != 0) goto L_0139;
// 1010 !! %MONITOR 19 %IF J < 0
// 1011 J = 1; QUEUE(-13)
J = 1;
QUEUE(-13);
// 1012 %finish %ELSE %START
goto L_013A;
L_0139:;
// 1013 !! %MONITOR 19 %IF TAG1 # OR %OR J > 0
// 1014 J = -1; QUEUE(-14)
J = -1;
QUEUE(-14);
// 1015 %FINISH
L_013A:;
// 1016 %REPEAT
goto L_012F;
L_0138:;
// 1017 QUEUE(QVAL) %IF QVAL # 0
if (QVAL == 0) goto L_013B;
QUEUE(QVAL);
L_013B:;
// 1018 ASSEMBLE
ASSEMBLE();
// 1019 ATYPE=-1 %AND CREG=-1 %IF J < 0
if (J >= 0) goto L_013C;
ATYPE = -1;
CREG = -1;
L_013C:;
// 1020 %END
return;
} /* end of CONDIT */
// ?OR unused
// 1021
// 1022 %ROUTINE GET INST
void GETINST(void) {
// 1023 %INTEGER I
int I;
// 1024 !OPMASK VALUES
// 1025 ! 0100,0110,1100,1101,1110: DOUBLE WORD INSTRUCTIONS
// 1026 ! 1011,1001,0011,0010,0001: AS ABOVE BUT RELOCATABLE
// 1027 ! 0101: SINGLE WORD INSTRUCTION
// 1028 ! 0111: 2 OPERANDS TO COME
// 1029 ! 1111: 1 OPERAND TO COME
// 1030 ! 1010: MACRO
// 1031 QUEUE(TYPE); QUEUE(VAL)
QUEUE(TYPE);
QUEUE(VAL);
// 1032 %RETURN %IF TYPE&16_7000 # 16_7000
if (TYPE & 28672 == 28672) goto L_013D;
return;
L_013D:;
// 1033 %RETURN %IF TERM # ' '; !NO OPERAND FOLLOWING =>
if (TERM == 32) goto L_013E;
return;
L_013E:;
// 1034 %CYCLE
L_013F:;
// 1035 GET EXP
GETEXP();
// 1036 QUEUE(-22)
QUEUE(-22);
// 1037 %RETURN %IF %NOT S(',')
if (S(44)) goto L_0140;
return;
L_0140:;
// 1038 %REPEAT
goto L_013F;
// 1039 %END
} /* end of GETINST */
// ?I unused
// 1040
// 1041 %ROUTINE READ LINE
void READLINE(void) {
// 1042 %INTEGER Q
int Q;
// 1043 PUTPOS = STARTPOS
PUTPOS = STARTPOS;
// 1044 %IF MP = 0 %START
if (MP != 0) goto L_0141;
// 1045 Q = 0; PSEUDOLIM = 0
Q = 0;
PSEUDOLIM = 0;
// 1046 %CYCLE
L_0142:;
// 1047 READ SYMBOL(SYM)
_imp_READSYMBOL(/*?*/ &SYM);
// 1048 READ SYMBOL(SYM) %AND Q=Q!!128 %IF SYM = ''''
if (SYM != 39) goto L_0143;
_imp_READSYMBOL(/*?*/ &SYM);
Q = Q ^ 128;
L_0143:;
// 1049 %EXIT %IF SYM = NL
if (SYM != 10) goto L_0144;
goto L_0145;
L_0144:;
// 1050 SYM = SYM-32 %IF SYM-Q >= 96; !LOWER-CASE -> UPPER-CASE
if (SYM - Q < 96) goto L_0146;
SYM = SYM - 32;
L_0146:;
// 1051 SYM = SYM+Q
SYM = SYM + Q;
// 1052 %EXIT %IF SYM = '/' %AND PSEUDOLIM # 0
if (SYM != 47) goto L_0147;
if (PSEUDOLIM == 0) goto L_0147;
goto L_0145;
L_0147:;
// 1053 %IF SYM = ' ' %START
if (SYM != 32) goto L_0148;
// 1054 PSEUDOLIM = PUTPOS %IF PSEUDOLIM = 0
if (PSEUDOLIM != 0) goto L_0149;
PSEUDOLIM = PUTPOS;
L_0149:;
// 1055 %finish %ELSE PSEUDOLIM = 0
goto L_014A;
L_0148:;
PSEUDOLIM = 0;
L_014A:;
// 1056 PUT CHAR(SYM)
PUTCHAR(SYM);
// 1057 %REPEAT
goto L_0142;
L_0145:;
// 1058 %IF PSEUDOLIM # 0 %START
if (PSEUDOLIM == 0) goto L_014B;
// 1059 Q = PUTPOS; PUTPOS = PSEUDOLIM
Q = PUTPOS;
PUTPOS = PSEUDOLIM;
// 1060 PUT CHAR(NL)
PUTCHAR(10);
// 1061 PUTPOS = Q
PUTPOS = Q;
// 1062 %FINISH
L_014B:;
// 1063 %CYCLE
L_014C:;
// 1064 PUT CHAR(SYM)
PUTCHAR(SYM);
// 1065 %EXIT %IF SYM = NL
if (SYM != 10) goto L_014D;
goto L_014E;
L_014D:;
// 1066 READ SYMBOL(SYM)
_imp_READSYMBOL(/*?*/ &SYM);
// 1067 %REPEAT
goto L_014C;
L_014E:;
// 1068 PRINTPOS = STARTPOS
PRINTPOS = STARTPOS;
// 1069 %finish %ELSE %START
goto L_014F;
L_0141:;
// 1070 GETPOS = INTEGER(MP)
GETPOS = INTEGER(MP);
// 1071 %IF CHAR(GETPOS) = 0 %START
if (CHAR(GETPOS) != 0) goto L_0150;
// 1072 QBASE = MP
QBASE = MP;
// 1073 GETPOS = INTEGER(MP+2)
GETPOS = INTEGER(MP + 2);
// 1074 STARTPOS = INTEGER(MP+3)
STARTPOS = INTEGER(MP + 3);
// 1075 MP = INTEGER(MP+4)
MP = INTEGER(MP + 4);
// 1076 %IF MP < 0 %START
if (MP >= 0) goto L_0151;
// 1077 MP = MP-8_700000
MP = MP - 229376;
// 1078 %WHILE INTEGER(NP)&16_8000 = 0 %CYCLE
L_0152:;
if (INTEGER(NP) & 32768 != 0) goto L_0153;
// 1079 FAULT('C'); NP = NP+2
FAULT(67);
NP = NP + 2;
// 1080 %REPEAT
goto L_0152;
L_0153:;
// 1081 SET LAB(LOC)
SETLAB(LOC);
// 1082 %FINISH
L_0151:;
// 1083 PRINTPOS = 0 %IF LIST&2 # 0
if (LIST & 2 == 0) goto L_0154;
PRINTPOS = 0;
L_0154:;
// 1084 GET SYM; !TERMINATOR
GETSYM();
// 1085 GET SYM %IF SYM = ';'
if (SYM != 59) goto L_0155;
GETSYM();
L_0155:;
// 1086 %RETURN
return;
// 1087 %FINISH
L_0150:;
// 1088 PRINTPOS = STARTPOS %IF LIST&2 # 0
if (LIST & 2 == 0) goto L_0156;
PRINTPOS = STARTPOS;
L_0156:;
// 1089 QQ = 0
QQ = 0;
// 1090 %CYCLE
L_0157:;
// 1091 SYM = CHAR(GETPOS); GETPOS = GETPOS+1
SYM = CHAR(GETPOS);
GETPOS = GETPOS + 1;
// 1092 %IF TAG %START
if (!(TAG())) goto L_0158;
// 1093 SYM=TERM %AND GETPOS=GETPOS-1 %IF TERM = ' '
if (TERM != 32) goto L_0159;
SYM = TERM;
GETPOS = GETPOS - 1;
L_0159:;
// 1094 TYPE = INTEGER(MP); VAL = GETPOS-1
TYPE = INTEGER(MP);
VAL = GETPOS - 1;
// 1095 LOOKUP(4)
LOOKUP(4);
// 1096 %WHILE TYPE # VAL %CYCLE
L_015A:;
if (TYPE == VAL) goto L_015B;
// 1097 PUT CHAR(CHAR(TYPE))
PUTCHAR(CHAR(TYPE));
// 1098 TYPE = TYPE+1
TYPE = TYPE + 1;
// 1099 %REPEAT
goto L_015A;
L_015B:;
// 1100 %FINISH
L_0158:;
// 1101 PUT CHAR(SYM)
PUTCHAR(SYM);
// 1102 !! INTEGER(MP) = GETPOS
// 1103 set INTEGER(MP, GETPOS)
SETINTEGER(MP, GETPOS);
// 1104 %EXIT %IF SYM = NL
if (SYM != 10) goto L_015C;
goto L_015D;
L_015C:;
// 1105 %REPEAT
goto L_0157;
L_015D:;
// 1106 QQ = '?'
QQ = 63;
// 1107 %FINISH
L_014F:;
// 1108 QBASE = (PUTPOS+1)>>1
QBASE = (unsigned int)PUTPOS + 1 >> 1;
// 1109 GETPOS = STARTPOS; GET SYM
GETPOS = STARTPOS;
GETSYM();
// 1110 %END
return;
} /* end of READLINE */
// 1111
// 1112 %ROUTINE SCAN ARG
void SCANARG(void) {
// 1113 ! SET TYPE,VAL TO START,LIM OF ARG IF NOT NULL
// 1114 %INTEGER I,J
int I;
int J;
// 1115 %RETURN %IF SYM='I' %AND CHAR(GETPOS)='F' %AND CHAR(GETPOS+1)=' '
if (SYM != 73) goto L_015E;
if (CHAR(GETPOS) != 70) goto L_015E;
if (CHAR(GETPOS + 1) != 32) goto L_015E;
return;
L_015E:;
// 1116 I = GETPOS-1; I = GETPOS %IF SYM = '['
I = GETPOS - 1;
if (SYM != 91) goto L_015F;
I = GETPOS;
L_015F:;
// 1117 J = 0
J = 0;
// 1118 %CYCLE
L_0160:;
// 1119 %EXIT %IF SYM = NL
if (SYM != 10) goto L_0161;
goto L_0162;
L_0161:;
// 1120 %EXIT %IF (SYM=' ' %OR SYM=',' %OR SYM=';') %AND J<=0
if (SYM == 32) goto L_0163;
if (SYM == 44) goto L_0163;
if (SYM != 59) goto L_0164;
L_0163:;
if (J > 0) goto L_0164;
goto L_0162;
L_0164:;
// 1121 J = J+1 %IF SYM = '['
if (SYM != 91) goto L_0165;
J = J + 1;
L_0165:;
// 1122 %IF SYM = ']' %START
if (SYM != 93) goto L_0166;
// 1123 J = J-1; %EXIT %IF J = 0
J = J - 1;
if (J != 0) goto L_0167;
goto L_0162;
L_0167:;
// 1124 %FINISH
L_0166:;
// 1125 SYM = CHAR(GETPOS); GETPOS = GETPOS+1
SYM = CHAR(GETPOS);
GETPOS = GETPOS + 1;
// 1126 %REPEAT
goto L_0160;
L_0162:;
// 1127 %IF GETPOS-1 # I %START
if (GETPOS - 1 == I) goto L_0168;
// 1128 TYPE = I; VAL = GETPOS-1
TYPE = I;
VAL = GETPOS - 1;
// 1129 %FINISH
L_0168:;
// 1130 GET SYM %IF SYM = ']'
if (SYM != 93) goto L_0169;
GETSYM();
L_0169:;
// 1131 %END
return;
} /* end of SCANARG */
// 1132
// 1133
// 1134 %ROUTINE SET ACC
void SETACC(void) {
// 1135 %INTEGER I
int I;
// 1136 ACC = -1; ATYPE = -1; CREG = -1
ACC = -1;
ATYPE = -1;
CREG = -1;
// 1137 I = TEMPS
I = TEMPS;
// 1138 %RETURN %IF I = 0
if (I != 0) goto L_016A;
return;
L_016A:;
// 1139 %CYCLE
L_016B:;
// 1140 ACC = ACC+1
ACC = ACC + 1;
// 1141 %RETURN %IF I&1 # 0
if (I & 1 == 0) goto L_016C;
return;
L_016C:;
// 1142 I = I>>1
I = (unsigned int)I >> 1;
// 1143 %REPEAT
goto L_016B;
// 1144 %END
} /* end of SETACC */
// 1145
// 1146 !MAIN PROGRAM
// 1147
// 1148 !RADIX 36 CONSTANTS
// 1149 %OWNINTEGER B=2184, IF=9991, ELS=5950, E=5403, FIN=6907, ISH=10490
static int B = 2184;
static int IF = 9991;
static int ELS = 5950;
static int E = 5403;
static int FIN = 6907;
static int ISH = 10490;
// 1150 %OWNINTEGER JUM=11642, P=17206, PS=17983, DEF=4605, END=6009
static int JUM = 11642;
static int P = 17206;
static int PS = 17983;
static int DEF = 4605;
static int END = 6009;
// 1151
// 1152 %INTEGER I,J,K
int I;
int J;
int K;
// 1153 !!%FAULT 19 ->ERR; !RECOGNITION ERROR
// 1154 !!%FAULT 9 ->BEND; !INPUT ENDED
// 1155
// 1156 %on %event 9,1 %start
if (!_imp_on_event(1, 9)) goto L_016D;
// 1157 ->err %if event_event = 9
if (_imp_EVENT().EVENT != 9) goto L_016E;
goto U_100E;
L_016E:;
// 1158 ->bend %if event_event = 1 %and event_sub = 9
if (_imp_EVENT().EVENT != 1) goto L_016F;
if (_imp_EVENT().SUB != 9) goto L_016F;
goto U_100F;
L_016F:;
// 1159 %stop
_imp_stop(0);
// 1160 %finish
L_016D:;
// 1161
// 1162 open input(MAIN, "interdata/test.hal")
_imp_OPENINPUT(MAIN, _imp_str_literal("interdata/test.hal"));
// 1163 open input(PRE, "interdata/hal70.def")
_imp_OPENINPUT(PRE, _imp_str_literal("interdata/hal70.def"));
// 1164 open output(BIN, "interdata/test.bin")
_imp_OPENOUTPUT(BIN, _imp_str_literal("interdata/test.bin"));
// 1165 open output(LIS, "interdata/test.lis")
_imp_OPENOUTPUT(LIS, _imp_str_literal("interdata/test.lis"));
// 1166 select output(0)
_imp_SELECTOUTPUT(0);
// 1167
// 1168 %CYCLE I = 1,1,SBOUND
// %for I = 1, 1, 32512 %cycle
{
I = 0;
L_0170:
if (I == 32512) goto L_0171;
I += 1;
// 1169 STORE(I) = 0
STORE[I - 1] = 0;
// 1170 %REPEAT
goto L_0170;
}
L_0171:;
// 1171 !! CODEPOS = ADDR(STORE(1))
// 1172 {} CODEPOS = 1
CODEPOS = 1;
// 1173 MACLIM = (CODEPOS+20)<<1
MACLIM = CODEPOS + 20 << 1;
// 1174 !! STORELIM = ADDR(STORE(SBOUND))
// 1175 {} STORELIM = sbound
STORELIM = 32512;
// 1176 NP = STORELIM
NP = STORELIM;
// 1177 LABLIM = NP-60
LABLIM = NP - 60;
// 1178 BP = LABLIM
BP = LABLIM;
// 1179 DEFLIM = BP-(SBOUND>>2)
DEFLIM = BP - ((unsigned int)32512 >> 2);
// 1180 DEFMIN = DEFLIM
DEFMIN = DEFLIM;
// 1181 !! INTEGER(BP) = DEFLIM
// 1182 set INTEGER(BP, DEFLIM)
SETINTEGER(BP, DEFLIM);
// 1183 SELECT INPUT(PRE)
_imp_SELECTINPUT(PRE);
// 1184 DO PASS:
U_1010:;
// 1185 STARTPOS = MACLIM
STARTPOS = MACLIM;
// 1186 MP = 0
MP = 0;
// 1187 ALMAX = DEFLIM
ALMAX = DEFLIM;
// 1188 LABMIN = LABLIM
LABMIN = LABLIM;
// 1189 ASSCOND = 1; SKIP = 0
ASSCOND = 1;
SKIP = 0;
// 1190 LOCTYPE = MEMMASK+RELMASK; LOC = 0
LOCTYPE = MEMMASK + RELMASK;
LOC = 0;
// 1191 SET ACC
SETACC();
// 1192 READ: FSYM = ' '; FAULTPOS = 0
U_1011:;
FSYM = 32;
FAULTPOS = 0;
// 1193 READ LINE
READLINE();
// 1194 NEXT:
U_1012:;
// 1195 DREG = -1
DREG = -1;
// 1196 MODE = 0
MODE = 0;
// 1197 PEND = 0; COND = 0
PEND = 0;
COND = 0;
// 1198 QSTART = QBASE; QLIM = QSTART
QSTART = QBASE;
QLIM = QSTART;
// 1199 FLAG = 0
FLAG = 0;
// 1200 %IF S('$') %START
if (!(S(36))) goto L_0173;
// 1201 ->NEWPAGE %IF SYM = '/'
if (SYM != 47) goto L_0174;
goto U_1013;
L_0174:;
// 1202 ->ERR %IF %NOT TAG
if (TAG()) goto L_0175;
goto U_100E;
L_0175:;
// 1203 ->ASSIF %IF TAG1 = IF
if (TAG1 != IF) goto L_0176;
goto U_1014;
L_0176:;
// 1204 ->ASSELSE %IF TAG1 = ELS
if (TAG1 != ELS) goto L_0177;
goto U_1015;
L_0177:;
// 1205 ->ASSFIN %IF TAG1 = FIN
if (TAG1 != FIN) goto L_0178;
goto U_1016;
L_0178:;
// 1206 ->LEND %IF SKIP # 0
if (SKIP == 0) goto L_0179;
goto U_1017;
L_0179:;
// 1207 ->DEFINE %IF TAG1 = DEF
if (TAG1 != DEF) goto L_017A;
goto U_1018;
L_017A:;
// 1208 ->DEFINE %IF TAG1 = 19625; !RED
if (TAG1 != 19625) goto L_017B;
goto U_1018;
L_017B:;
// 1209 ->LISTC %IF TAG1 = 13350; !LIS
if (TAG1 != 13350) goto L_017C;
goto U_1019;
L_017C:;
// 1210 ->TEMP %IF TAG1 = 21780; !TEM
if (TAG1 != 21780) goto L_017D;
goto U_101A;
L_017D:;
// 1211 ->LOCC %IF TAG1 = 13556; !LOC
if (TAG1 != 13556) goto L_017E;
goto U_1000;
L_017E:;
// 1212 ->LOCC %IF TAG1 = 1917; !ASS
if (TAG1 != 1917) goto L_017F;
goto U_1000;
L_017F:;
// 1213 ->SAVC %IF TAG1 = 20568; !SAV
if (TAG1 != 20568) goto L_0180;
goto U_1001;
L_0180:;
// 1214 ->MACDEF %IF TAG1 = 14111; !MAC
if (TAG1 != 14111) goto L_0181;
goto U_101B;
L_0181:;
// 1215 ->BEGIN %IF TAG1 = 2460; !BEG
if (TAG1 != 2460) goto L_0182;
goto U_1002;
L_0182:;
// 1216 ->BEND %IF TAG1 = END
if (TAG1 != END) goto L_0183;
goto U_100F;
L_0183:;
// 1217 FAULT('U')
FAULT(85);
// 1218 ->LEND
goto U_1017;
// 1219 %FINISH
L_0173:;
// 1220 ->LEND %IF SKIP # 0 %OR SYM = '/'
if (SKIP != 0) goto L_0172;
if (SYM != 47) goto L_0184;
L_0172:;
goto U_1017;
L_0184:;
// 1221 ->LEND %IF SYM = NL
if (SYM != 10) goto L_0185;
goto U_1017;
L_0185:;
// 1222 %IF TAG %START
if (!(TAG())) goto L_0186;
// 1223 ->LABDEF %IF TERM = ':'
if (TERM != 58) goto L_0187;
goto U_1003;
L_0187:;
// 1224 MODE = 1
MODE = 1;
// 1225 ->ASSIGN %IF TERM = '(' %OR SYM = '='
if (TERM == 40) goto L_0188;
if (SYM != 61) goto L_0189;
L_0188:;
goto U_1004;
L_0189:;
// 1226 ->JUMP %IF TAG1 = JUM %AND (TAG2=P %OR TAG2=PS)
if (TAG1 != JUM) goto L_018A;
if (TAG2 == P) goto L_018B;
if (TAG2 != PS) goto L_018A;
L_018B:;
goto U_101C;
L_018A:;
// 1227 ->IFC %IF TAG1 = IF
if (TAG1 != IF) goto L_018C;
goto U_101D;
L_018C:;
// 1228 ->ELSE %IF TAG1 = ELS %AND TAG2 = E
if (TAG1 != ELS) goto L_018D;
if (TAG2 != E) goto L_018D;
goto U_101E;
L_018D:;
// 1229 ->FINISH %IF TAG1 = FIN %AND TAG2 = ISH
if (TAG1 != FIN) goto L_018E;
if (TAG2 != ISH) goto L_018E;
goto U_101F;
L_018E:;
// 1230 ->WHILE %IF TAG1 = 25106 %AND TAG2 = 13173
if (TAG1 != 25106) goto L_018F;
if (TAG2 != 13173) goto L_018F;
goto U_1020;
L_018F:;
// 1231 ->CYCLE %IF TAG1 = 4269 %AND TAG2 = 13173
if (TAG1 != 4269) goto L_0190;
if (TAG2 != 13173) goto L_0190;
goto U_1021;
L_0190:;
// 1232 ->REPEAT %IF TAG1 = 19637 %AND TAG2 = 5544
if (TAG1 != 19637) goto L_0191;
if (TAG2 != 5544) goto L_0191;
goto U_1022;
L_0191:;
// 1233 MODE=-2 %AND ->DATA %IF TAG1 = B
if (TAG1 != B) goto L_0192;
MODE = -2;
goto U_1023;
L_0192:;
// 1234 TYPE = UMASK; LOOKUP(0)
TYPE = UMASK;
LOOKUP(0);
// 1235 ->MACCALL %IF TYPE&OPMASK = MACRO
if (TYPE & OPMASK != MACRO) goto L_0193;
goto U_1024;
L_0193:;
// 1236 ->MINST %IF TYPE&OPMASK # 0
if (TYPE & OPMASK == 0) goto L_0194;
goto U_1025;
L_0194:;
// 1237 FAULT('U') %AND ->LEND %IF TYPE&UMASK # 0
if (TYPE & UMASK == 0) goto L_0195;
FAULT(85);
goto U_1017;
L_0195:;
// 1238 PEND = -1
PEND = -1;
// 1239 %FINISH
L_0186:;
// 1240 MODE = -1
MODE = -1;
// 1241 DATA:
U_1023:;
// 1242 %CYCLE
L_0196:;
// 1243 GET EXP; ASSEMBLE
GETEXP();
ASSEMBLE();
// 1244 FAULT('I') %IF TYPE®XMASK # 0
if (TYPE & REGXMASK == 0) goto L_0197;
FAULT(73);
L_0197:;
// 1245 I = 1
I = 1;
// 1246 %IF S('$') %START
if (!(S(36))) goto L_0198;
// 1247 I = VAL %IF VAL < 1000
if (VAL >= 1000) goto L_0199;
I = VAL;
L_0199:;
// 1248 QLIM = QSTART
QLIM = QSTART;
// 1249 GET EXP; ASSEMBLE
GETEXP();
ASSEMBLE();
// 1250 %FINISH
L_0198:;
// 1251 %WHILE I > 0 %CYCLE
L_019A:;
if (I <= 0) goto L_019B;
// 1252 %IF MODE # -1 %START
if (MODE == -1) goto L_019C;
// 1253 FAULT('T') %IF VAL&16_FF00 # 0
if (VAL & 65280 == 0) goto L_019D;
FAULT(84);
L_019D:;
// 1254 %IF MODE = -2 %START
if (MODE != -2) goto L_019E;
// 1255 J = VAL<<8; MODE = -3
J = VAL << 8;
MODE = -3;
// 1256 %finish %ELSE %START
goto L_019F;
L_019E:;
// 1257 VAL = VAL+J; MODE = -2
VAL = VAL + J;
MODE = -2;
// 1258 PLANT VAL; VAL = VAL&255
PLANTVAL();
VAL = VAL & 255;
// 1259 %FINISH
L_019F:;
// 1260 %finish %ELSE %START
goto L_01A0;
L_019C:;
// 1261 PLANT VAL
PLANTVAL();
// 1262 %FINISH
L_01A0:;
// 1263 I = I-1
I = I - 1;
// 1264 %REPEAT
goto L_019A;
L_019B:;
// 1265 %EXIT %UNLESS S(',') %OR SYM&128 # 0
if (S(44)) goto L_01A1;
if (SYM & 128 != 0) goto L_01A1;
goto L_01A2;
L_01A1:;
// 1266 %IF SYM = NL %START
if (SYM != 10) goto L_01A3;
// 1267 PRINT LINE %IF PRINTPOS # 0; READ LINE
if (PRINTPOS == 0) goto L_01A4;
PRINTLINE();
L_01A4:;
READLINE();
// 1268 QSTART = QBASE
QSTART = QBASE;
// 1269 %FINISH
L_01A3:;
// 1270 QLIM = QSTART
QLIM = QSTART;
// 1271 %REPEAT
goto L_0196;
L_01A2:;
// 1272 VAL=J %AND PLANT VAL %IF MODE = -3
if (MODE != -3) goto L_01A5;
VAL = J;
PLANTVAL();
L_01A5:;
// 1273 ->SEND
goto U_1026;
// 1274
// 1275 LABDEF:
U_1003:;
// 1276 CREG = -1; ATYPE = -1
CREG = -1;
ATYPE = -1;
// 1277 GET SYM
GETSYM();
// 1278 FAULT('C') %AND NP=STORELIM %IF NP # STORELIM
if (NP == STORELIM) goto L_01A6;
FAULT(67);
NP = STORELIM;
L_01A6:;
// 1279 TYPE = LOCTYPE; VAL = LOC
TYPE = LOCTYPE;
VAL = LOC;
// 1280 LOOKUP(7)
LOOKUP(7);
// 1281 ->NEXT
goto U_1012;
// 1282
// 1283 ASSIGN:
U_1004:;
// 1284 PEND = 1
PEND = 1;
// 1285 GET EXP
GETEXP();
// 1286 ->ERR %IF %NOT S('=')
if (S(61)) goto L_01A7;
goto U_100E;
L_01A7:;
// 1287 QUEUE(-25); !'STORE'
QUEUE(-25);
// 1288 %IF INTEGER(QBASE) = REG %START
if (INTEGER(QBASE) != REG) goto L_01A8;
// 1289 DREG = INTEGER(QBASE+1)
DREG = INTEGER(QBASE + 1);
// 1290 DUSE = 0
DUSE = 0;
// 1291 %FINISH
L_01A8:;
// 1292 QSTART = QLIM; MODE = 2
QSTART = QLIM;
MODE = 2;
// 1293 GET EXP
GETEXP();
// 1294 %IF FLAG # 0 %START
if (FLAG == 0) goto L_01A9;
// 1295 %IF DREG<0 %AND FLAG-QSTART=QSTART-QBASE-1 %C
if (DREG >= 0) goto L_01AA;
if (FLAG - QSTART != QSTART - QBASE - 1) goto L_01AA;
if (INTEGER(QBASE) & BMASK != 0) goto L_01AA;
// 1296+ %AND INTEGER(QBASE)&BMASK=0 %START
// 1297 I = QBASE; J = QSTART
I = QBASE;
J = QSTART;
// 1298 I = I+1 %AND J=J+1 %WHILE INTEGER(I) = INTEGER(J)
L_01AB:;
if (INTEGER(I) != INTEGER(J)) goto L_01AC;
I = I + 1;
J = J + 1;
goto L_01AB;
L_01AC:;
// 1299 %IF J = FLAG %START
if (J != FLAG) goto L_01AD;
// 1300 %IF INTEGER(QLIM-1) = -2 %START; !MINUS
if (INTEGER(QLIM - 1) != -2) goto L_01AE;
// 1301 QSTART = J-2
QSTART = J - 2;
// 1302 !! INTEGER(QSTART) = 0; INTEGER(QSTART+1) = 0
// 1303 set INTEGER(QSTART, 0); set INTEGER(QSTART+1, 0)
SETINTEGER(QSTART, 0);
SETINTEGER(QSTART + 1, 0);
// 1304 %ELSE
goto L_01AF;
L_01AE:;
// 1305 QSTART = J; QLIM = QLIM-1
QSTART = J;
QLIM = QLIM - 1;
// 1306 %FINISH
L_01AF:;
// 1307 %finish %ELSE FLAG = 0
goto L_01B0;
L_01AD:;
FLAG = 0;
L_01B0:;
// 1308 %finish %ELSE FLAG = 0
goto L_01B1;
L_01AA:;
FLAG = 0;
L_01B1:;
// 1309 %FINISH
L_01A9:;
// 1310 QUEUE(-24); !'LOAD'
QUEUE(-24);
// 1311
// 1312 CONDQ:
U_1027:;
// 1313 %IF TAGIF %START
if (!(TAGIF())) goto L_01B2;
// 1314 MODE = MODE+4; DREG = DREG-16; !SCARIFY
MODE = MODE + 4;
DREG = DREG - 16;
// 1315 CONDIT(0)
CONDIT(0);
// 1316 MODE = MODE-4; DREG = DREG+16; !RESTORE
MODE = MODE - 4;
DREG = DREG + 16;
// 1317 QLIM = QSTART; QSTART = TRANSF
QLIM = QSTART;
QSTART = TRANSF;
// 1318 %FINISH
L_01B2:;
// 1319 ASSEMBLE
ASSEMBLE();
// 1320 ->SEND
goto U_1026;
// 1321
// 1322 JUMP:
U_101C:;
// 1323 FLAG = TAG2-P; !POSITIVE IF SHORT
FLAG = TAG2 - P;
// 1324 GET EXP
GETEXP();
// 1325 QUEUE(-26); !'JUMP'
QUEUE(-26);
// 1326 ->CONDQ
goto U_1027;
// 1327
// 1328 MINST:
U_1025:;
// 1329 MODE = -1
MODE = -1;
// 1330 GET INST
GETINST();
// 1331 QUEUE(-23); !'PLANT'
QUEUE(-23);
// 1332 ->CONDQ
goto U_1027;
// 1333
// 1334 MACCALL:
U_1024:;
// 1335 QUEUE(0); !(DEFPOS)
QUEUE(0);
// 1336 QUEUE(0); !SPARE
QUEUE(0);
// 1337 QUEUE(0); !(CALLPOS)
QUEUE(0);
// 1338 QUEUE(STARTPOS)
QUEUE(STARTPOS);
// 1339 QUEUE(MP)
QUEUE(MP);
// 1340 J = VAL; QQ = 0
J = VAL;
QQ = 0;
// 1341 %CYCLE
L_01B3:;
// 1342 %EXIT %IF CHAR(J) = NL; !END OF MAC DEF
if (CHAR(J) != 10) goto L_01B4;
goto L_01B5;
L_01B4:;
// 1343 I = GETPOS-1; !SAVE CALLPOS
I = GETPOS - 1;
// 1344 GETPOS = J; GET SYM
GETPOS = J;
GETSYM();
// 1345 !! %MONITOR 24 %IF %NOT TAG
// 1346 TYPE = 0; VAL = 0
TYPE = 0;
VAL = 0;
// 1347 SCAN ARG
SCANARG();
// 1348 GET SYM %IF SYM = ','
if (SYM != 44) goto L_01B6;
GETSYM();
L_01B6:;
// 1349 J = GETPOS-1; !SAVE DEFPOS
J = GETPOS - 1;
// 1350 GETPOS = I; GET SYM; !RESTORE CALLPOS
GETPOS = I;
GETSYM();
// 1351 SCAN ARG
SCANARG();
// 1352 GET SYM %IF SYM = ','
if (SYM != 44) goto L_01B7;
GETSYM();
L_01B7:;
// 1353 QUEUE(TAG1); QUEUE(TAG2)
QUEUE(TAG1);
QUEUE(TAG2);
// 1354 QUEUE(TYPE); QUEUE(VAL)
QUEUE(TYPE);
QUEUE(VAL);
// 1355 %REPEAT
goto L_01B3;
L_01B5:;
// 1356 QQ = '?'
QQ = 63;
// 1357 GET SYM %IF SYM = ' '
if (SYM != 32) goto L_01B8;
GETSYM();
L_01B8:;
// 1358 %IF TAGIF %START
if (!(TAGIF())) goto L_01B9;
// 1359 CONDIT(-18)
CONDIT(-18);
// 1360 QLIM = QSTART
QLIM = QSTART;
// 1361 !! INTEGER(QBASE+4) = MP+8_700000
// 1362 set INTEGER(QBASE+4, MP+8_700000)
SETINTEGER(QBASE + 4, MP + 229376);
// 1363 %FINISH
L_01B9:;
// 1364 QUEUE(0)
QUEUE(0);
// 1365 STARTPOS = QLIM<<1
STARTPOS = QLIM << 1;
// 1366 MP = QBASE
MP = QBASE;
// 1367 !! INTEGER(MP) = J+1; !START OF BODY
// 1368 set INTEGER(MP, J+1); !START OF BODY
SETINTEGER(MP, J + 1);
// 1369 !! INTEGER(MP+2) = GETPOS-1
// 1370 set INTEGER(MP+2, GETPOS-1)
SETINTEGER(MP + 2, GETPOS - 1);
// 1371 ->LEND
goto U_1017;
// 1372
// 1373 !CODING OF JUMPS: 1000 (SINGLE INST), 2000 (MAIN IF)
// 1374 ! 4000 (ELSE), 6000 (IF AFTER ELSE)
// 1375
// 1376 IFC:
U_101D:;
// 1377 CONDIT(-15)
CONDIT(-15);
// 1378 ->SEND
goto U_1026;
// 1379
// 1380 ELSE:
U_101E:;
// 1381 ->CERR %IF INTEGER(NP)&16_2000 = 0
if (INTEGER(NP) & 8192 != 0) goto L_01BA;
goto U_1028;
L_01BA:;
// 1382 QUEUE(0); QUEUE(0)
QUEUE(0);
QUEUE(0);
// 1383 QUEUE(-16); ASSEMBLE
QUEUE(-16);
ASSEMBLE();
// 1384 ATYPE = -1; CREG = -1
ATYPE = -1;
CREG = -1;
// 1385 %IF TAGIF %START
if (!(TAGIF())) goto L_01BB;
// 1386 CONDIT(-17)
CONDIT(-17);
// 1387 %FINISH
L_01BB:;
// 1388 ->SEND
goto U_1026;
// 1389
// 1390 FINISH:
U_101F:;
// 1391 ->CERR %IF INTEGER(NP)&16_6000 = 0
if (INTEGER(NP) & 24576 != 0) goto L_01BC;
goto U_1028;
L_01BC:;
// 1392 I = LOC
I = LOC;
// 1393 %WHILE INTEGER(NP)&16_4000 # 0 %CYCLE
L_01BD:;
if (INTEGER(NP) & 16384 == 0) goto L_01BE;
// 1394 %IF INTEGER(NP)&16_2000 # 0 %START; !IF AFTER ELSE
if (INTEGER(NP) & 8192 == 0) goto L_01BF;
// 1395 SET LAB(I)
SETLAB(I);
// 1396 %finish %ELSE %START
goto L_01C0;
L_01BF:;
// 1397 SET LAB(LOC)
SETLAB(LOC);
// 1398 I = VAL+4
I = VAL + 4;
// 1399 %FINISH
L_01C0:;
// 1400 %REPEAT
goto L_01BD;
L_01BE:;
// 1401 SET LAB(I)
SETLAB(I);
// 1402 ->SEND
goto U_1026;
// 1403
// 1404 WHILE:
U_1020:;
// 1405 I = LOC; ATYPE = -1; CREG = -1
I = LOC;
ATYPE = -1;
CREG = -1;
// 1406 CONDIT(-13)
CONDIT(-13);
// 1407 NEST(I); NEST(1)
NEST(I);
NEST(1);
// 1408 ->SEND
goto U_1026;
// 1409
// 1410 CYCLE:
U_1021:;
// 1411 NEST(LOC); NEST(1)
NEST(LOC);
NEST(1);
// 1412 ATYPE = -1; CREG = -1
ATYPE = -1;
CREG = -1;
// 1413 ->SEND
goto U_1026;
// 1414
// 1415 REPEAT:
U_1022:;
// 1416 ->CERR %IF INTEGER(NP) # 1
if (INTEGER(NP) == 1) goto L_01C1;
goto U_1028;
L_01C1:;
// 1417 QUEUE(LOCTYPE); QUEUE(INTEGER(NP+1))
QUEUE(LOCTYPE);
QUEUE(INTEGER(NP + 1));
// 1418 NP = NP+2
NP = NP + 2;
// 1419 QUEUE(-26); !'JUMP'
QUEUE(-26);
// 1420 FLAG = -1
FLAG = -1;
// 1421 ->CONDQ
goto U_1027;
// 1422
// 1423 CERR:
U_1028:;
// 1424 FAULT('C')
FAULT(67);
// 1425 ->LEND
goto U_1017;
// 1426
// 1427 SEND:
U_1026:;
// 1428 SET LAB(LOC) %IF INTEGER(NP)&16_1000 # 0
if (INTEGER(NP) & 4096 == 0) goto L_01C2;
SETLAB(LOC);
L_01C2:;
// 1429 ->LEND %IF SYM = NL
if (SYM != 10) goto L_01C3;
goto U_1017;
L_01C3:;
// 1430 ->NEXT %IF S(';')
if (!(S(59))) goto L_01C4;
goto U_1012;
L_01C4:;
// 1431
// 1432 ERR:FSYM = 'F'; FAULTPOS = GETPOS-1
U_100E:;
FSYM = 70;
FAULTPOS = GETPOS - 1;
// 1433 PRINTPOS = STARTPOS
PRINTPOS = STARTPOS;
// 1434
// 1435 LEND:
U_1017:;
// 1436 ->READ %IF SKIP # 0 %AND LIST&4 = 0
if (SKIP == 0) goto L_01C5;
if (LIST & 4 != 0) goto L_01C5;
goto U_1011;
L_01C5:;
// 1437 ->READ %IF FSYM = ' ' %AND CHARS = 0 %AND %C
if (FSYM != 32) goto L_01C6;
if (CHARS != 0) goto L_01C6;
if (PRINTPOS == 0) goto L_01C7;
if (MP == 0) goto L_01C6;
if (LIST & 2 != 0) goto L_01C6;
L_01C7:;
goto U_1011;
L_01C6:;
// 1438+ (PRINTPOS = 0 %OR (MP#0 %AND LIST&2=0))
// 1439 PRINT LINE
PRINTLINE();
// 1440 ->READ
goto U_1011;
// 1441
// 1442 ASSIF:
U_1014:;
// 1443 ASSCOND = ASSCOND<<1
ASSCOND = ASSCOND << 1;
// 1444 ->LEND %IF SKIP # 0
if (SKIP == 0) goto L_01C8;
goto U_1017;
L_01C8:;
// 1445 A1: CONDIT(0)
U_1029:;
CONDIT(0);
// 1446 SKIP = ASSCOND %IF COND # 0
if (COND == 0) goto L_01C9;
SKIP = ASSCOND;
L_01C9:;
// 1447 PRINT LINE %IF PRINTPOS # 0
if (PRINTPOS == 0) goto L_01CA;
PRINTLINE();
L_01CA:;
// 1448 ->LEND
goto U_1017;
// 1449
// 1450 ASSELSE:
U_1015:;
// 1451 %IF SKIP = 0 %START
if (SKIP != 0) goto L_01CB;
// 1452 ->CERR %IF ASSCOND&1 # 0
if (ASSCOND & 1 == 0) goto L_01CC;
goto U_1028;
L_01CC:;
// 1453 SKIP = ASSCOND
SKIP = ASSCOND;
// 1454 %finish %ELSE %START
goto L_01CD;
L_01CB:;
// 1455 ->LEND %IF SKIP # ASSCOND
if (SKIP == ASSCOND) goto L_01CE;
goto U_1017;
L_01CE:;
// 1456 SKIP = 0
SKIP = 0;
// 1457 ->A1 %IF TAGIF
if (!(TAGIF())) goto L_01CF;
goto U_1029;
L_01CF:;
// 1458 %FINISH
L_01CD:;
// 1459 ASSCOND = ASSCOND+1
ASSCOND = ASSCOND + 1;
// 1460 ->LEND
goto U_1017;
// 1461
// 1462 ASSFIN:
U_1016:;
// 1463 ->CERR %IF ASSCOND = 1
if (ASSCOND != 1) goto L_01D0;
goto U_1028;
L_01D0:;
// 1464 ASSCOND = ASSCOND>>1
ASSCOND = (unsigned int)ASSCOND >> 1;
// 1465 SKIP = 0 %IF SKIP>>1 = ASSCOND
if ((unsigned int)SKIP >> 1 != ASSCOND) goto L_01D1;
SKIP = 0;
L_01D1:;
// 1466 ->LEND
goto U_1017;
// 1467
// 1468 DEFINE:
U_1018:;
// 1469 FAULT('C') %IF NP # STORELIM
if (NP == STORELIM) goto L_01D2;
FAULT(67);
L_01D2:;
// 1470 I = TAG1
I = TAG1;
// 1471 %CYCLE
L_01D3:;
// 1472 ->ERR %IF %NOT (TAG %AND S('='))
if (!(TAG())) goto L_01D4;
if (S(61)) goto L_01D5;
L_01D4:;
goto U_100E;
L_01D5:;
// 1473 J = TAG1; K = TAG2
J = TAG1;
K = TAG2;
// 1474 %IF TAG %START
if (!(TAG())) goto L_01D6;
// 1475 TAGREF
TAGREF();
// 1476 %IF TYPE&OPMASK # 0 %START
if (TYPE & OPMASK == 0) goto L_01D7;
// 1477 GET INST
GETINST();
// 1478 %finish %ELSE %START
goto L_01D8;
L_01D7:;
// 1479 PEND = -1; GET EXP
PEND = -1;
GETEXP();
// 1480 %FINISH
L_01D8:;
// 1481 %finish %ELSE GET EXP
goto L_01D9;
L_01D6:;
GETEXP();
L_01D9:;
// 1482 ASSEMBLE
ASSEMBLE();
// 1483 TAG1 = J; TAG2 = K
TAG1 = J;
TAG2 = K;
// 1484 %IF I=DEF %THEN LOOKUP(3) %ELSE LOOKUP(2)
if (I != DEF) goto L_01DA;
LOOKUP(3);
goto L_01DB;
L_01DA:;
LOOKUP(2);
L_01DB:;
// 1485 %EXIT %UNLESS S(',')
if (S(44)) goto L_01DC;
goto L_01DD;
L_01DC:;
// 1486 QLIM = QSTART
QLIM = QSTART;
// 1487 %REPEAT
goto L_01D3;
L_01DD:;
// 1488 ->SEND
goto U_1026;
// 1489
// 1490 NEWPAGE:
U_1013:;
// 1491 DO NEWLINE %WHILE LINES # 0
L_01DE:;
if (LINES == 0) goto L_01DF;
DONEWLINE();
goto L_01DE;
L_01DF:;
// 1492 ->LEND
goto U_1017;
// 1493
// 1494 LISTC:
U_1019:;
// 1495 GET EXP; ASSEMBLE
GETEXP();
ASSEMBLE();
// 1496 LIST = VAL
LIST = VAL;
// 1497 ->SEND
goto U_1026;
// 1498
// 1499 TEMP:
U_101A:;
// 1500 I = 0
I = 0;
// 1501 %IF SYM # NL %START
if (SYM == 10) goto L_01E0;
// 1502 %CYCLE
L_01E1:;
// 1503 GET EXP
GETEXP();
// 1504 FAULT('I') %IF TYPE # REG
if (TYPE == REG) goto L_01E2;
FAULT(73);
L_01E2:;
// 1505 I = I!1<<VAL
I = I | 1 << VAL;
// 1506 %EXIT %UNLESS S(',')
if (S(44)) goto L_01E3;
goto L_01E4;
L_01E3:;
// 1507 %REPEAT
goto L_01E1;
L_01E4:;
// 1508 %FINISH
L_01E0:;
// 1509 TEMPS = I
TEMPS = I;
// 1510 SET ACC
SETACC();
// 1511 ->SEND
goto U_1026;
// 1512
// 1513 LOCC:
U_1000:;
// 1514 I = TAG1
I = TAG1;
// 1515 GET EXP; ASSEMBLE
GETEXP();
ASSEMBLE();
// 1516 %IF TYPE&16_FF80 = 0 %START
if (TYPE & 65408 != 0) goto L_01E5;
// 1517 %IF I = 13556 %START; !LOC
if (I != 13556) goto L_01E6;
// 1518 OUTPUT RECORD %IF BINCOUNT >= 203
if (BINCOUNT < 203) goto L_01E7;
OUTPUTRECORD();
L_01E7:;
// 1519 PUT(3) %IF (LOCTYPE!!TYPE)&RELMASK # 0
if ((LOCTYPE ^ TYPE) & RELMASK == 0) goto L_01E8;
PUT(3);
L_01E8:;
// 1520 PUT(5); PUT WORD(VAL)
PUT(5);
PUTWORD(VAL);
// 1521 %FINISH
L_01E6:;
// 1522 LOCTYPE = TYPE&63+MEMMASK; LOC = VAL
LOCTYPE = (TYPE & 63) + MEMMASK;
LOC = VAL;
// 1523 %finish %ELSE FAULT('I')
goto L_01E9;
L_01E5:;
FAULT(73);
L_01E9:;
// 1524 ->SEND
goto U_1026;
// 1525
// 1526 SAVC:
U_1001:;
// 1527 GET EXP; ASSEMBLE
GETEXP();
ASSEMBLE();
// 1528 SAVE = VAL
SAVE = VAL;
// 1529 ->SEND
goto U_1026;
// 1530
// 1531 MACDEF:
U_101B:;
// 1532 ->CERR %IF MP # 0
if (MP == 0) goto L_01EA;
goto U_1028;
L_01EA:;
// 1533 ->ERR %IF %NOT TAG
if (TAG()) goto L_01EB;
goto U_100E;
L_01EB:;
// 1534 J = TAG1; K = TAG2
J = TAG1;
K = TAG2;
// 1535 I = GETPOS-1
I = GETPOS - 1;
// 1536 %IF SYM # NL %START
if (SYM == 10) goto L_01EC;
// 1537 %CYCLE
L_01ED:;
// 1538 ->ERR %IF %NOT TAG
if (TAG()) goto L_01EE;
goto U_100E;
L_01EE:;
// 1539 SCAN ARG
SCANARG();
// 1540 %EXIT %IF %NOT S(',')
if (S(44)) goto L_01EF;
goto L_01F0;
L_01EF:;
// 1541 %REPEAT
goto L_01ED;
L_01F0:;
// 1542 %FINISH
L_01EC:;
// 1543 ->ERR %IF SYM # NL
if (SYM == 10) goto L_01F1;
goto U_100E;
L_01F1:;
// 1544 TAG1 = J; TAG2 = K
TAG1 = J;
TAG2 = K;
// 1545 TYPE = MACRO; VAL = I
TYPE = MACRO;
VAL = I;
// 1546 LOOKUP(3)
LOOKUP(3);
// 1547 %CYCLE
L_01F2:;
// 1548 PRINT LINE
PRINTLINE();
// 1549 %EXIT %IF S('$') %AND TAG %AND TAG1 = END
if (!(S(36))) goto L_01F3;
if (!(TAG())) goto L_01F3;
if (TAG1 != END) goto L_01F3;
goto L_01F4;
L_01F3:;
// 1550 STARTPOS = PUTPOS
STARTPOS = PUTPOS;
// 1551 STARTPOS = PSEUDOLIM+1 %IF PSEUDOLIM # 0
if (PSEUDOLIM == 0) goto L_01F5;
STARTPOS = PSEUDOLIM + 1;
L_01F5:;
// 1552 READ LINE
READLINE();
// 1553 %REPEAT
goto L_01F2;
L_01F4:;
// 1554 PUTPOS = STARTPOS; PUT CHAR(0)
PUTPOS = STARTPOS;
PUTCHAR(0);
// 1555 STARTPOS = PUTPOS
STARTPOS = PUTPOS;
// 1556 MACLIM = STARTPOS
MACLIM = STARTPOS;
// 1557 ->LEND
goto U_1017;
// 1558
// 1559 %ROUTINE BNEST
void BNEST(void) {
// 1560 !! BP = BP+4; %MONITOR 23 %IF BP-NP >= 0
// 1561 BP = BP+4; !{}%signal 2,3 %IF BP-NP >= 0
BP = BP + 4;
// 1562 !! INTEGER(BP-3) = SAVE; INTEGER(BP-2) = TEMPS
// 1563 set INTEGER(BP-3, SAVE); set INTEGER(BP-2, TEMPS)
SETINTEGER(BP - 3, SAVE);
SETINTEGER(BP - 2, TEMPS);
// 1564 !! INTEGER(BP-1) = MACLIM; INTEGER(BP) = DEFMIN
// 1565 set INTEGER(BP-1, MACLIM); set INTEGER(BP, DEFMIN)
SETINTEGER(BP - 1, MACLIM);
SETINTEGER(BP, DEFMIN);
// 1566 %END
return;
} /* end of BNEST */
// 1567
// 1568 BEGIN:
U_1002:;
// 1569 BNEST
BNEST();
// 1570 ->NEWPAGE %IF SYM # NL
if (SYM == 10) goto L_01F6;
goto U_1013;
L_01F6:;
// 1571 ->LEND
goto U_1017;
// 1572
// 1573 BEND:
U_100F:;
// 1574 FAULT('C') %IF NP # STORELIM %OR MP # 0
if (NP != STORELIM) goto L_01F7;
if (MP == 0) goto L_01F8;
L_01F7:;
FAULT(67);
L_01F8:;
// 1575 MP = 0; NP = STORELIM
MP = 0;
NP = STORELIM;
// 1576 %IF BP # LABLIM %START
if (BP == LABLIM) goto L_01F9;
// 1577 SAVE = INTEGER(BP-3); TEMPS = INTEGER(BP-2)
SAVE = INTEGER(BP - 3);
TEMPS = INTEGER(BP - 2);
// 1578 MACLIM = INTEGER(BP-1); STARTPOS = MACLIM
MACLIM = INTEGER(BP - 1);
STARTPOS = MACLIM;
// 1579 DEFMIN = INTEGER(BP)
DEFMIN = INTEGER(BP);
// 1580 SET ACC
SETACC();
// 1581 BP = BP-4
BP = BP - 4;
// 1582 ->LEND %IF BP # LABLIM
if (BP == LABLIM) goto L_01FA;
goto U_1017;
L_01FA:;
// 1583 %FINISH
L_01F9:;
// 1584 CLOSE INPUT; SELECT INPUT(MAIN)
_imp_CLOSEINPUT();
_imp_SELECTINPUT(MAIN);
// 1585 BNEST
BNEST();
// 1586 LIST = 5
LIST = 5;
// 1587 PASS = PASS+1
PASS = PASS + 1;
// 1588 ->DO PASS %IF PASS # 2
if (PASS == 2) goto L_01FB;
goto U_1010;
L_01FB:;
// 1589
// 1590 OUTPUT RECORD %IF BINCOUNT = 208
if (BINCOUNT != 208) goto L_01FC;
OUTPUTRECORD();
L_01FC:;
// 1591 PUT(1)
PUT(1);
// 1592 OUTPUT RECORD
OUTPUTRECORD();
// 1593 FAULT('$')
FAULT(36);
// 1594 PRINT LOC; PRINT LINE
PRINTLOC();
PRINTLINE();
// 1595
// 1596 %ENDOFPROGRAM
_imp_stop(0);
return 0;
end_0:;
}