#include <perms.h>
// Edinburgh IMP77 Compiler - Version 8.4
//
// 1 %BEGIN
int main(int argc, char **argv) { /*%begin*/
_imp_initialise(argc, argv);
// 2 %CONSTINTEGER BIT = X'80000000'
// 3 %CONSTINTEGER MAX SCORE = +50000
// 4 !!
// 5 %EXTERNALROUTINESPEC PROMPT(%STRING (255) S)
extern void PROMPT(_imp_string255 S);
// 6
// 7
// 8 %CONSTINTEGER PLYWIDTH = 5
// 9 %RECORDFORMAT SQF(%INTEGER P, ATT, DEF, ATTP)
struct SQF {
union {
struct {
int P;
int ATT;
int DEF;
int ATTP;
};
};
};
// 10 { %RECORDFORMAT ROWF(%RECORD %ARRAY R(1:8)(SQF))
// 11 %RECORDFORMAT ROWF(%RECORD (SQF) %ARRAY R(1:8))
struct ROWF {
union {
struct {
struct SQF R[8];
};
};
};
// 12
// 13 %OWN %RECORD(ROWF)%ARRAY BRD(1:8)
static struct ROWF BRD[8];
struct _imp_dv BRD_dv = {BRD, sizeof(struct ROWF) /*, dims, <bounds> */};
// 14 %OWN %RECORD(ROWF)%ARRAY BRDOLD(1:8)
static struct ROWF BRDOLD[8];
struct _imp_dv BRDOLD_dv = {BRDOLD, sizeof(struct ROWF) /*, dims, <bounds> */};
// 15 %INTEGERARRAY VAL(-6:6)
int VAL[13];
struct _imp_dv VAL_dv = {VAL, sizeof(int) /*, dims, <bounds> */};
// 16
// 17 !! PIECE = BRD(Y)_R(X)_P
// 18
// 19 %RECORDFORMAT LISTF(%RECORD(LISTF)%NAME L, %INTEGER SCORE %or %integer HOLD, %C
struct LISTF {
union {
struct {
struct LISTF *L;
int SCORE;
};
struct {
int HOLD;
unsigned char FR;
unsigned char TO;
int SPEC;
int CHK;
};
};
};
// 20+ %BYTEINTEGER FR, TO, %INTEGER SPEC, CHK)
// 21 !! SCORE - CONTAINS SCORE FOR THE MOVE
// 22 !! SPEC - CONTAINS FLAGS FOR QUEENING, CASTLING
// 23 !! CHK - OPPOSING KING IS IN CHECK
// 24
// 25 !!%RECORDFORMAT QHF(%RECORD(LISTF)%NAME L,%INTEGER HOLD)
// 26 {%RECORDSPEC QHF_L(LISTF)
// 27 !!
// 28 %RECORDFORMAT PTF(%INTEGERNAME P)
struct PTF {
union {
struct {
int *P;
};
};
};
// 29 %RECORD(PTF)%ARRAY PT(1:64)
struct PTF PT[64];
struct _imp_dv PT_dv = {PT, sizeof(struct PTF) /*, dims, <bounds> */};
// 30 !!
// 31 %CONSTINTEGER KING = 6; ! NB: AND -6
// 32 %CONSTINTEGER QUEEN = 5; ! AND -5
// 33 %CONSTINTEGER ROOK = 4; ! AND -4
// 34 %CONSTINTEGER PAWN = 1; ! AND -1
// 35 !!
// 36
// 37 %RECORD(LISTF)%NAME FREELIST
struct LISTF *FREELIST;
// 38 %RECORD(LISTF{QHF}) MOVE
struct LISTF MOVE;
// 39 %RECORD(LISTF)%ARRAY LISTA(0:4000)
struct LISTF LISTA[4001];
struct _imp_dv LISTA_dv = {LISTA, sizeof(struct LISTF) /*, dims, <bounds> */};
// 40 %RECORD (SQF) %NAME SQ
struct SQF *SQ;
// 41 !!
// 42 %OWNINTEGERARRAY PINX(1:32) = 0(32)
static int PINX[32] = {[0 ... 31] = 0};
struct _imp_dv PINX_dv = {PINX, sizeof(int) /*, dims, <bounds> */};
// 43 %OWNINTEGERARRAY PINY(1:32) = 0(32)
static int PINY[32] = {[0 ... 31] = 0};
struct _imp_dv PINY_dv = {PINY, sizeof(int) /*, dims, <bounds> */};
// 44 %INTEGERARRAY PINDX, PINPY(1:32)
int PINDX[32];
struct _imp_dv PINDX_dv = {PINDX, sizeof(int) /*, dims, <bounds> */};
int PINPY[32];
struct _imp_dv PINPY_dv = {PINPY, sizeof(int) /*, dims, <bounds> */};
// 45 %OWNINTEGER PIN PT, PX, PY
static int PINPT;
static int PX;
static int PY;
// 46 !!
// 47 %RECORDFORMAT SQIF(%RECORD(SQF)%NAME SQ)
struct SQIF {
union {
struct {
struct SQF *SQ;
};
};
};
// 48 {%RECORDSPEC SQIF_SQ(SQF)
// 49 %RECORD(SQIF)%ARRAY SQI(1:64)
struct SQIF SQI[64];
struct _imp_dv SQI_dv = {SQI, sizeof(struct SQIF) /*, dims, <bounds> */};
// 50 %CONSTINTEGERARRAY BIT VAL(1:6)=256,64,32,8,2,1
const int BITVAL[6] = {256, 64, 32, 8, 2, 1};
struct _imp_dv BITVAL_dv = {BITVAL, sizeof(int) /*, dims, <bounds> */};
// 51 !!
// 52 %CONSTINTEGERARRAY PAWN 2D(9:72) = %C
const int PAWN2D[64] = {0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
5,
0,
0,
3,
3,
3,
20,
20,
3,
3,
3,
4,
6,
6,
50,
50,
6,
6,
4,
8,
9,
30,
55,
55,
30,
9,
8,
10,
10,
35,
60,
60,
35,
10,
10,
[48 ... 55] = 100,
[56 ... 63] = 500};
struct _imp_dv PAWN2D_dv = {PAWN2D, sizeof(int) /*, dims, <bounds> */};
// 53+ 0, 0, 0, 0, 0, 0, 0, 0,
// 54+ 0, 0, 0, 0, 0, 5, 0, 0,
// 55+ 3, 3, 3, 20, 20, 3, 3, 3,
// 56+ 4, 6, 6, 50, 50, 6, 6, 4,
// 57+ 8, 9, 30, 55, 55, 30, 9, 8,
// 58+ 10, 10, 35, 60, 60, 35, 10, 10,
// 59+ 100(8),
// 60+ 500(8)
// 61 !!
// 62 %CONSTBYTEINTEGERARRAY POSX(1:12) = %C
const unsigned char POSX[12] = {2, 3, 6, 7, 58, 59, 62, 63, 1, 8, 57, 64};
struct _imp_dv POSX_dv = {POSX, sizeof(unsigned char) /*, dims, <bounds> */};
// 63+ 2, 3, 6, 7, 58, 59, 62, 63, 1, 8, 57, 64
// 64 %CONSTINTEGERARRAY POSP(1:12) = %C
const int POSP[12] = {-2, -3, -3, -2, 2, 3, 3, 2, -4, -4, 4, 4};
struct _imp_dv POSP_dv = {POSP, sizeof(int) /*, dims, <bounds> */};
// 65+ -2, -3, -3, -2, 2, 3, 3, 2, -4, -4, 4, 4
// 66 %CONSTINTEGERARRAY POSPP(1:12) = %C
const int POSPP[12] = {[0 ... 3] = -7, [4 ... 7] = 7, [8 ... 9] = -10, [10 ... 11] = 10};
struct _imp_dv POSPP_dv = {POSPP, sizeof(int) /*, dims, <bounds> */};
// 67+ -7(4), 7(4), -10(2), 10(2)
// 68 !!
// 69 %CONSTINTEGERARRAY NOLEG MOVE(-1:1) = -24000, 0, 24000
const int NOLEGMOVE[3] = {-24000, 0, 24000};
struct _imp_dv NOLEGMOVE_dv = {NOLEGMOVE, sizeof(int) /*, dims, <bounds> */};
// 70 !!
// 71 %OWNBYTEINTEGERARRAY KMOVE(-1:1) = 0(3)
static unsigned char KMOVE[3] = {[0 ... 2] = 0};
struct _imp_dv KMOVE_dv = {KMOVE, sizeof(unsigned char) /*, dims, <bounds> */};
// 72 %OWNINTEGERARRAY KCAS(-1:1) = 0(3)
static int KCAS[3] = {[0 ... 2] = 0};
struct _imp_dv KCAS_dv = {KCAS, sizeof(int) /*, dims, <bounds> */};
// 73 !!
// 74 %RECORD (LISTF)LM
struct LISTF LM;
// 75 %RECORD (LISTF{QHF})MMOVE
struct LISTF MMOVE;
// 76 !!
// 77
// 78
// 79 %INTEGER I, X, Y, PLAY
int I;
int X;
int Y;
int PLAY;
// 80 %OWNLONGREAL TIME, TIME2, TIMTT = 15
static double TIME;
static double TIME2;
static double TIMTT = 15;
// 81 %OWNINTEGER NO = 1, SCOREA, XDEPTH, PDEPTH, MON, JUST ONE PLY
static int NO = 1;
static int SCOREA;
static int XDEPTH;
static int PDEPTH;
static int MON;
static int JUSTONEPLY;
// 82 %OWNINTEGER CHK, LAST CHK, PIN REMOVE
static int CHK;
static int LASTCHK;
static int PINREMOVE;
// 83 !!
// 84 %EXTERNALLONGREALFNSPEC CPU TIME
extern double CPUTIME(void);
auto int NPLY(int WHICH, int DEPTH, struct LISTF *CHAIN);
auto int SORTANDPRUNE(struct LISTF * LIST, int WIDTH, int WHICH);
auto int SCORE(int WHICH, struct LISTF *L);
auto int MOVES(int WHICH, int SCRQ);
auto int ONEPLY(int WHICH, int WIDTH);
auto int CHANGEBOARD(struct LISTF * B);
auto void RESTOREBOARD(struct LISTF * B);
auto void BURP(struct LISTF * X, int W);
auto void TELL(struct LISTF * MOVE, int WHICH);
auto void PRINTBOARD(void);
auto void PRINTMOVE(struct LISTF * LIST);
auto int CHECKYOURMOVE(struct LISTF * LIST);
auto void YOURMOVE(void);
// 85 !!
// 86 %INTEGERFNSPEC N PLY(%INTEGER WHICH, DEPTH, %RECORD(LISTF)%NAME CHAIN)
// 87 %INTEGERFNSPEC SORT AND PRUNE(%RECORD(LISTF)%NAME LIST, %C
// 88+ %INTEGER WIDTH, WHICH)
// 89 %INTEGERFNSPEC SCORE(%INTEGER WHICH, %RECORD (LISTF)%NAME L)
// 90 %INTEGERFNSPEC MOVES(%INTEGER WHICH, SCRQ)
// 91 %INTEGERFNSPEC ONEPLY(%INTEGER WHICH, WIDTH)
// 92 %INTEGERFNSPEC CHANGE BOARD(%RECORD(LISTF{QHF})%NAME B)
// 93 %ROUTINESPEC RESTORE BOARD(%RECORD(LISTF{QHF})%NAME B)
// 94 %ROUTINESPEC BURP(%RECORD (LISTF{QHF}) %NAME X, %INTEGER W)
// 95 %ROUTINESPEC TELL(%RECORD (LISTF)%NAME MOVE, %INTEGER WHICH)
// 96 %ROUTINESPEC PRINT BOARD
// 97 %ROUTINESPEC PRINTMOVE(%RECORD (LISTF)%NAME LIST)
// 98 %INTEGERFNSPEC CHECK YOUR MOVE(%RECORD (LISTF)%NAME LIST)
// 99 %ROUTINESPEC YOUR MOVE
// 100
// 101 !**** INITIALISATION ETC
// 102
// 103 %CYCLE I = 0, 1, 4000-1
// %for I = 0, 1, 4000 - 1 %cycle
{
int _final = 4000 - 1;
if (invalid_for_loop(0, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle I = 0, 1, 4000 - 1");
I = -1;
L_0001:
if (I == _final) goto L_0002;
I += 1;
// 104 LISTA(I)_L == LISTA(I+1)
LISTA[I].L = (struct LISTF *)/*?*/ &LISTA[I + 1];
// 105 %REPEAT
goto L_0001;
}
L_0002:;
// 106 FREELIST == LISTA(0)
FREELIST = (struct LISTF *)/*?*/ &LISTA[0];
// 107 !!
// 108 SELECTINPUT(1)
_imp_SELECTINPUT(1);
// 109 %CYCLE I = -6, 1, 6
// %for I = -6, 1, 6 %cycle
{
I = -7;
L_0004:
if (I == 6) goto L_0005;
I += 1;
// 110 READ(VAL(I))
_imp_READ(/*?*/ &VAL[I + 6]);
// 111 %REPEAT
goto L_0004;
}
L_0005:;
// 112 READ(PDEPTH)
_imp_READ(/*?*/ &PDEPTH);
// 113 READ(MON); READ(PLAY)
_imp_READ(/*?*/ &MON);
_imp_READ(/*?*/ &PLAY);
// 114 I = 1
I = 1;
// 115 %CYCLE Y = 1,1,8
// %for Y = 1, 1, 8 %cycle
{
Y = 0;
L_0006:
if (Y == 8) goto L_0007;
Y += 1;
// 116 %CYCLE X = 1,1,8
// %for X = 1, 1, 8 %cycle
{
X = 0;
L_0008:
if (X == 8) goto L_0009;
X += 1;
// 117 SQ == BRD(Y)_R(X)
SQ = (struct SQF *)/*?*/ &BRD[Y - 1].R[X - 1];
// 118 READ(SQ_P)
_imp_READ(/*?*/ &SQ->P);
// 119 SQI(I)_SQ == SQ
SQI[I - 1].SQ = (struct SQIF *)SQ;
// 120 PT(I)_P == SQ_P; I = I+1
PT[I - 1].P = (int *)/*?*/ &SQ->P;
I = I + 1;
// 121 %REPEAT
goto L_0008;
}
L_0009:;
// 122 %REPEAT
goto L_0006;
}
L_0007:;
// 123 SELECT INPUT(0)
_imp_SELECTINPUT(0);
// 124 MMOVE_HOLD = 0; MOVE_HOLD = 0
MMOVE.HOLD = 0;
MOVE.HOLD = 0;
// 125 LM_SCORE = 0; LM_CHK = 0
LM.SCORE = 0;
LM.CHK = 0;
// 126 MMOVE_L == LM
MMOVE.L = (struct LISTF *)/*?*/ &LM;
// 127 PRINTSTRING("Version 2.5
_imp_PRINTSTRING(_imp_str_literal(
"Version 2.5\nHOW DIFFICULT A GAME DO YOU WANT?\n 2 = NORMAL STRENGTH, 3 = MORE DIFFICULT\n"));
// 128+ HOW DIFFICULT A GAME DO YOU WANT?
// 129+ 2 = NORMAL STRENGTH, 3 = MORE DIFFICULT
// 130+ ")
// 131 PROMPT("2-4?")
PROMPT(_imp_str_literal("2-4?"));
// 132 READ(PDEPTH); SKIPSYMBOL
_imp_READ(/*?*/ &PDEPTH);
_imp_SKIPSYMBOL();
// 133 PROMPT("Move?")
PROMPT(_imp_str_literal("Move?"));
// 134 PRINTBOARD
PRINTBOARD();
// 135 !!
// 136 !!
// 137 !! N B WHITE PIECES ARE -VE, BLACK ARE +VE
// 138 !!
// 139 !**** MAIN LOOP
// 140 TIME2 = CPUTIME
TIME2 = CPUTIME();
// 141 %CYCLE
L_000B:;
// 142 %IF PLAY = 1 %START
if (PLAY != 1) goto L_000C;
// 143 MOVE_L == RECORD(N PLY(-1, 0, MOVE))
MOVE.L = (struct LISTF *)_imp_RECORD(NPLY(-1, 0, /*?*/ &MOVE));
// 144 TELL(MOVE_L, -1)
TELL(MOVE.L, -1);
// 145 I =CHANGE BOARD(MOVE)
I = CHANGEBOARD(/*?*/ &MOVE);
// 146 %FINISHELSESTART
goto L_000D;
L_000C:;
// 147 YOURMOVE
YOURMOVE();
// 148 BURP(MMOVE, -1)
BURP(/*?*/ &MMOVE, -1);
// 149 %FINISH
L_000D:;
// 150 TIME = CPUTIME
TIME = CPUTIME();
// 151 MOVE_L == RECORD(N PLY(+1, 0, MMOVE_L))
MOVE.L = (struct LISTF *)_imp_RECORD(NPLY(1, 0, MMOVE.L));
// 152 BURP(MOVE, +1)
BURP(/*?*/ &MOVE, 1);
// 153 PRINTBOARD
PRINTBOARD();
// 154 SELECT OUTPUT(2); PRINTBOARD; SELECT OUTPUT(0)
_imp_SELECTOUTPUT(2);
PRINTBOARD();
_imp_SELECTOUTPUT(0);
// 155 NO = NO+1
NO = NO + 1;
// 156 %REPEAT
goto L_000B;
// 157
// 158 !!
// 159 %ROUTINE RELEASE CHAIN(%RECORD(LISTF)%NAME L)
void RELEASECHAIN(struct LISTF * L) {
// 160 {%RECORDSPEC L(LISTF)
// 161 %RECORD(LISTF)%NAME L2
struct LISTF *L2;
// 162 L2 == L
L2 = (struct LISTF *)L;
// 163 %WHILE ADDR(L_L) # 0 %CYCLE
L_000E:;
if (_imp_ADDR(L->L) == 0) goto L_000F;
// 164 L == L_L; ! GO TO BOTTOM OF CHAIN
L = (struct LISTF *)L->L;
// 165 %REPEAT
goto L_000E;
L_000F:;
// 166 L_L == FREELIST
L->L = (struct LISTF *)FREELIST;
// 167 FREELIST == RECORD(ADDR(L2))
FREELIST = (struct LISTF *)_imp_RECORD(_imp_ADDR(L2));
// 168 %END
return;
} /* end of RELEASECHAIN */
// 169 !!
// 170 %INTEGERFN N PLY(%INTEGER WHICH, DEPTH, %RECORD(LISTF)%NAME CHAIN)
int NPLY(int WHICH, int DEPTH, struct LISTF *CHAIN) {
// 171 %INTEGER I, XWHICH, J, SWIDTH, CI, FLAG
int I;
int XWHICH;
int J;
int SWIDTH;
int CI;
int FLAG;
// 172 %RECORD(LISTF{QHF})%NAME BPT
struct LISTF *BPT;
// 173 %RECORD(LISTF{QHF})%ARRAY B(1:40)
struct LISTF B[40];
struct _imp_dv B_dv = {B, sizeof(struct LISTF) /*, dims, <bounds> */};
// 174 %RECORD(LISTF)%NAME LIST, LISTX
struct LISTF *LIST;
struct LISTF *LISTX;
// 175
// 176 %CONSTINTEGERARRAY XWIDTH(0:10) = 8, 8, 3(9)
const int XWIDTH[11] = {8, 8, [2 ... 10] = 3};
struct _imp_dv XWIDTH_dv = {XWIDTH, sizeof(int) /*, dims, <bounds> */};
// 177 !!
// 178 XDEPTH = DEPTH; ! HOLD FOR GLOBAL USE
XDEPTH = DEPTH;
// 179 DEPTH = DEPTH+1
DEPTH = DEPTH + 1;
// 180 SWIDTH = XWIDTH(DEPTH)
SWIDTH = XWIDTH[DEPTH];
// 181 %IF DEPTH=PDEPTH %THEN SWIDTH=1
if (DEPTH != PDEPTH) goto L_0010;
SWIDTH = 1;
L_0010:;
// 182 LAST CHK = CHAIN_CHK
LASTCHK = CHAIN->CHK;
// 183 LIST == RECORD(ONE PLY(WHICH, SWIDTH))
LIST = (struct LISTF *)_imp_RECORD(ONEPLY(WHICH, SWIDTH));
// 184 I = 1
I = 1;
// 185 B(1)_L == RECORD(0)
B[0].L = (struct LISTF *)_imp_RECORD(0);
// 186 FLAG = 0
FLAG = 0;
// 187 %WHILE ADDR(LIST)#0 %CYCLE
L_0011:;
if (_imp_ADDR(LIST) == 0) goto L_0012;
// 188 BPT == B(I)
BPT = (struct LISTF *)/*?*/ &B[I - 1];
// 189 BPT_L == LIST
BPT->L = (struct LISTF *)LIST;
// 190 LIST == LIST_L
LIST = (struct LISTF *)LIST->L;
// 191 %IF MON#0 %START
if (MON == 0) goto L_0013;
// 192 SELECT OUTPUT(2)
_imp_SELECTOUTPUT(2);
// 193 SPACES(DEPTH*3)
_imp_SPACES(DEPTH * 3);
// 194 WRITE(DEPTH, 1); SPACES(2); PRINTMOVE(BPT_L)
_imp_WRITE(DEPTH, 1);
_imp_SPACES(2);
PRINTMOVE(BPT->L);
// 195 %IF LAST CHK#0 %THEN PRINTSTRING(" FORCED")
if (LASTCHK == 0) goto L_0014;
_imp_PRINTSTRING(_imp_str_literal(" FORCED"));
L_0014:;
// 196 NEWLINE
_imp_NEWLINE();
// 197 SELECT OUTPUT(0)
_imp_SELECTOUTPUT(0);
// 198 %FINISH
L_0013:;
// 199 I = I+1
I = I + 1;
// 200 ! %EXIT %IF LIST == NULL; ! ONLY ONE MOVE ALLOWED
// 201 ! %EXIT %IF ADDR(LIST) = 0 %AND I = 2; ! SEE ABOVE
// 202 XWHICH = WHICH!!X'FFFFFFFE'
XWHICH = WHICH ^ (-2);
// 203 %IF DEPTH < PDEPTH %START
if (DEPTH >= PDEPTH) goto L_0015;
// 204
// 205 CI = CHANGE BOARD(BPT)
CI = CHANGEBOARD(BPT);
// 206 LISTX == RECORD(N PLY(XWHICH, DEPTH, BPT_L))
LISTX = (struct LISTF *)_imp_RECORD(NPLY(XWHICH, DEPTH, BPT->L));
// 207 LAST CHK = CHAIN_CHK; ! REALLY FOR MONITORING
LASTCHK = CHAIN->CHK;
// 208 RESTORE BOARD(BPT)
RESTOREBOARD(BPT);
// 209 %UNLESS ADDR(LISTX)=0 %START
if (_imp_ADDR(LISTX) == 0) goto L_0016;
// 210 BPT_L_SCORE = LISTX_SCORE; ! GET BEST OPP PIECE SCORE
BPT->L->SCORE = LISTX->SCORE;
// 211 RELEASE CHAIN(LISTX); FLAG = FLAG+1
RELEASECHAIN(LISTX);
FLAG = FLAG + 1;
// 212 %FINISHELSESTART
goto L_0017;
L_0016:;
// 213 BPT_L_SCORE = NO LEG MOVE(WHICH)
BPT->L->SCORE = NOLEGMOVE[WHICH + 1];
// 214 ! %IF BPT_L_CHK = 0 %THEN BPT_L_SCORE = 0; ! ????
// 215 %FINISH
L_0017:;
// 216 %FINISH
L_0015:;
// 217 %IF I > SWIDTH %START
if (I <= SWIDTH) goto L_0018;
// 218 %IF FLAG # 0 %OR I = 2 %THEN %EXIT; ! MOVE FOUND
if (FLAG != 0) goto L_0019;
if (I != 2) goto L_001A;
L_0019:;
goto L_0012;
L_001A:;
// 219 %IF MON # 0 %START
if (MON == 0) goto L_001B;
// 220 SELECT OUTPUT(2)
_imp_SELECTOUTPUT(2);
// 221 PRINTSTRING("FORCED TO INCREASE PLYWIDTH
_imp_PRINTSTRING(_imp_str_literal("FORCED TO INCREASE PLYWIDTH\n"));
// 222+ ")
// 223 SELECT OUTPUT(0)
_imp_SELECTOUTPUT(0);
// 224 %FINISH
L_001B:;
// 225 !! IF NO LEGAL MOVE, SEARCH ALL MOVES ON THIS LEVEL
// 226 %FINISH
L_0018:;
// 227 %REPEAT
goto L_0011;
L_0012:;
// 228 RELEASE CHAIN(LIST) %IF ADDR(LIST)#0
if (_imp_ADDR(LIST) == 0) goto L_001C;
RELEASECHAIN(LIST);
L_001C:;
// 229 LIST == RECORD(0)
LIST = (struct LISTF *)_imp_RECORD(0);
// 230 %IF I = 1 %THEN %RESULT = 0; ! NO LEGAL MOVE
if (I != 1) goto L_001D;
return 0;
L_001D:;
// 231 %IF I = 2 %THEN %RESULT = ADDR(B(1)_L); ! SINGLE RESULT
if (I != 2) goto L_001E;
return _imp_ADDR(B[0].L);
L_001E:;
// 232 %CYCLE J = 1, 1, I-1
// %for J = 1, 1, I - 1 %cycle
{
int _final = I - 1;
if (invalid_for_loop(1, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle J = 1, 1, I - 1");
J = 0;
L_001F:
if (J == _final) goto L_0020;
J += 1;
// 233 B(J)_L_L == LIST
B[J - 1].L->L = (struct LISTF *)LIST;
// 234 LIST == B(J)_L; ! STACK THE RESULTS
LIST = (struct LISTF *)B[J - 1].L;
// 235 %REPEAT
goto L_001F;
}
L_0020:;
// 236 %RESULT = SORT AND PRUNE(LIST, 1, WHICH)
return SORTANDPRUNE(LIST, 1, WHICH);
// 237 ! GET THE 'BEST' RESULT
// 238 ! NB RESULT == SORT ON PDP11
// 239
// 240 %END
} /* end of NPLY */
// 241
// 242
// 243 %INTEGERFN ONE PLY(%INTEGER WHICH, WIDTH)
int ONEPLY(int WHICH, int WIDTH) {
// 244 %RECORD(LISTF)%NAME LIST
struct LISTF *LIST;
// 245
// 246
// 247 !! BRDOLD = BRD; ! HOLD IT (TO ERASE ATT&DEF
// 248 LIST == RECORD(MOVES(WHICH, 0))
LIST = (struct LISTF *)_imp_RECORD(MOVES(WHICH, 0));
// 249 LIST == RECORD (SORT AND PRUNE(LIST, WIDTH, WHICH))
LIST = (struct LISTF *)_imp_RECORD(SORTANDPRUNE(LIST, WIDTH, WHICH));
// 250 %RESULT = ADDR(LIST)
return _imp_ADDR(LIST);
// 251 %END
} /* end of ONEPLY */
// 252
// 253 !!
// 254 %INTEGERFN EXVAL(%INTEGER OCC,SIDE1,SIDE2)
int EXVAL(int OCC, int SIDE1, int SIDE2) {
// 255 %INTEGER GAIN,LOSS,NEW
int GAIN;
int LOSS;
int NEW;
// 256 %CONSTINTEGERARRAY PCE(1:31)=3,2(6),1(24)
const int PCE[31] = {3, [1 ... 6] = 2, [7 ... 30] = 1};
struct _imp_dv PCE_dv = {PCE, sizeof(int) /*, dims, <bounds> */};
// 257 !! %CONSTINTEGERARRAY VAL(1:6)=100,300,350,500,900,5000
// 258 %CONSTINTEGERARRAY BIT(1:6)=256,64,32,8,2,1
const int BIT[6] = {256, 64, 32, 8, 2, 1};
struct _imp_dv BIT_dv = {BIT, sizeof(int) /*, dims, <bounds> */};
// 259 !* +VE RESULT => ATTACKING SIDE HAS GAINED SOMETHING
// 260 GAIN=VAL(OCC)
GAIN = VAL[OCC + 6];
// 261 %IF SIDE1<0 %START
if (SIDE1 >= 0) goto L_0021;
// 262 PRINTSTRING("PROGRAM ERROR, NEXT MOVE MAY BE STUPID!
_imp_PRINTSTRING(_imp_str_literal("PROGRAM ERROR, NEXT MOVE MAY BE STUPID!\n"));
// 263+ ")
// 264 %RESULT = 0
return 0;
// 265 %FINISH
L_0021:;
// 266 %IF SIDE2=0 %THENRESULT=GAIN
if (SIDE2 != 0) goto L_0022;
return GAIN;
L_0022:;
// 267 NEW=SIDE1>>5
NEW = (unsigned int)SIDE1 >> 5;
// 268 %IF NEW#0 %THEN NEW=PCE(NEW) %ELSE NEW=PCE(SIDE1)+3
if (NEW == 0) goto L_0023;
NEW = PCE[NEW - 1];
goto L_0024;
L_0023:;
NEW = PCE[SIDE1 - 1] + 3;
L_0024:;
// 269 LOSS=EXVAL(NEW,SIDE2,SIDE1-BIT(NEW))
LOSS = EXVAL(NEW, SIDE2, SIDE1 - BIT[NEW - 1]);
// 270 %IF LOSS<0 %THENRESULT=GAIN %ELSERESULT=GAIN-LOSS
if (LOSS >= 0) goto L_0025;
return GAIN;
L_0025:;
return GAIN - LOSS;
// 271 %END
} /* end of EXVAL */
// 272 !!
// 273 %ROUTINE CHECK PINS(%INTEGER WHICH)
void CHECKPINS(int WHICH) {
// 274 %INTEGER I, K, BV
int I;
int K;
int BV;
// 275 %RECORD(SQF)%NAME SQ
struct SQF *SQ;
// 276 !! THIS ROUTINE REMOVES THE 'ATTACKS' AND 'DEFENSES' OF ALL THE
// 277 !! PINNED PIECES.
// 278 !! THEY ARE NOT DELETED IF THE PINNED PIECE IS ATTACKING THE
// 279 !! PINNING PIECE
// 280 !!
// 281 %RETURN %IF PIN PT=0
if (PINPT != 0) goto L_0026;
return;
L_0026:;
// 282 %CYCLE I = 1, 1, PIN PT
// %for I = 1, 1, PINPT %cycle
{
int _final = PINPT;
if (invalid_for_loop(1, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle I = 1, 1, PINPT");
I = 0;
L_0027:
if (I == _final) goto L_0028;
I += 1;
// 283 PX = PINX(I); PY = PINY(I)
PX = PINX[I - 1];
PY = PINY[I - 1];
// 284 SQ == SQI(PINDX(I))_SQ; ! ATTACKERS SQUARE
SQ = (struct SQF *)SQI[PINDX[I - 1] - 1].SQ;
// 285 BV = BIT VAL(PINPY(I))
BV = BITVAL[PINPY[I - 1] - 1];
// 286 %IF SQ_ATT&BV#0 %START
if (SQ->ATT & BV == 0) goto L_0029;
// 287 !! NO PIN
// 288 %FINISHELSESTART
goto L_002A;
L_0029:;
// 289 PIN REMOVE = PINPY(I); ! IF ATT>PINNED DEFENSE!
PINREMOVE = PINPY[I - 1];
// 290 K = MOVES(WHICH, 3)
K = MOVES(WHICH, 3);
// 291 SCOREA = SCOREA+SQ_P*5
SCOREA = SCOREA + SQ->P * 5;
// 292 %FINISH
L_002A:;
// 293 %REPEAT
goto L_0027;
}
L_0028:;
// 294 %END
return;
} /* end of CHECKPINS */
// 295 !!
// 296 %INTEGERFN TRY ANOTHER PLY(%INTEGER WHICH)
int TRYANOTHERPLY(int WHICH) {
// 297 %RECORD(LISTF)%NAME LIST2
struct LISTF *LIST2;
// 298 %INTEGER X, WW, XMON
int X;
int WW;
int XMON;
// 299 %CONSTINTEGERARRAY WWW(-1:1) = 25, 0, -25
const int WWW[3] = {25, 0, -25};
struct _imp_dv WWW_dv = {WWW, sizeof(int) /*, dims, <bounds> */};
// 300 %RESULT = 0 %IF JUST ONE PLY = 1; ! ONLY ONE LEVEL
if (JUSTONEPLY != 1) goto L_002B;
return 0;
L_002B:;
// 301 JUST ONE PLY = 1; XMON = MON; MON = 1
JUSTONEPLY = 1;
XMON = MON;
MON = 1;
// 302 WW = WHICH!!X'FFFFFFFE'
WW = WHICH ^ (-2);
// 303 LIST2 == RECORD(MOVES(WW, 0))
LIST2 = (struct LISTF *)_imp_RECORD(MOVES(WW, 0));
// 304 JUST ONE PLY = 0; MON = XMON
JUSTONEPLY = 0;
MON = XMON;
// 305 %IF ADDR(LIST2) = 0 %START
if (_imp_ADDR(LIST2) != 0) goto L_002C;
// 306 %RESULT = -NOLEGMOVE(WW)//2
return -(((long)NOLEGMOVE[WW + 1] / (long)2));
// 307 %FINISHELSESTART
L_002C:;
// 308 LIST2 == RECORD(SORT AND PRUNE(LIST2, 1, WW))
LIST2 = (struct LISTF *)_imp_RECORD(SORTANDPRUNE(LIST2, 1, WW));
// 309 X = LIST2_SCORE
X = LIST2->SCORE;
// 310 %FINISH
// 311 RELEASE CHAIN(LIST2) %UNLESS ADDR(LIST2)=0
if (_imp_ADDR(LIST2) == 0) goto L_002D;
RELEASECHAIN(LIST2);
L_002D:;
// 312 %RESULT = X+WWW(WW)
return X + WWW[WW + 1];
// 313 %END
} /* end of TRYANOTHERPLY */
// 314 !!
// 315 %INTEGER %FN SCORE(%INTEGER WHICH, %RECORD(LISTF)%NAME L)
int SCORE(int WHICH, struct LISTF *L) {
// 316 {%RECORDSPEC L(LISTF)
// 317 %INTEGER SCOREB, X, Y, I, P, Q, QQ, PAWNB, WHX, W2
int SCOREB;
int X;
int Y;
int I;
int P;
int Q;
int QQ;
int PAWNB;
int WHX;
int W2;
// 318 %INTEGER GAIN, SQU, LOSS, NPH, NPH2, BAD, SCOREC
int GAIN;
int SQU;
int LOSS;
int NPH;
int NPH2;
int BAD;
int SCOREC;
// 319 %RECORD(LISTF{QHF}) HOLD
struct LISTF HOLD;
// 320 %RECORD(LISTF)%NAME LIST2
struct LISTF *LIST2;
// 321 %RECORD(SQF)%NAME SQ
struct SQF *SQ;
// 322 !!
// 323 !! BRD = BRDOLD; ! CLEAR ATT & DEF
// 324 PIN PT = 0
PINPT = 0;
// 325 %CYCLE I = 1, 1, 64
// %for I = 1, 1, 64 %cycle
{
I = 0;
L_002E:
if (I == 64) goto L_002F;
I += 1;
// 326 SQI(I)_SQ_ATT = 0; SQI(I)_SQ_DEF = 0
SQI[I - 1].SQ->ATT = 0;
SQI[I - 1].SQ->DEF = 0;
// 327 %REPEAT
goto L_002E;
}
L_002F:;
// 328 WHX = WHICH&BIT; ! GET TYPE
WHX = WHICH & (-2147483648);
// 329 L_CHK = 0; ! CLEAR FLAG
L->CHK = 0;
// 330 HOLD_L == L; ! MAP TO MOVE
HOLD.L = (struct LISTF *)L;
// 331 P = CHANGE BOARD(HOLD); ! AND MAKE IT
P = CHANGEBOARD(/*?*/ &HOLD);
// 332 SCOREB = 0; SCOREA = 0; SCOREC = 0
SCOREB = 0;
SCOREA = 0;
SCOREC = 0;
// 333 P = MOVES(WHICH, 1)
P = MOVES(WHICH, 1);
// 334 SQU = 0
SQU = 0;
// 335 BAD = 0; NPH = 0; NPH2 = 0
BAD = 0;
NPH = 0;
NPH2 = 0;
// 336 %CYCLE Y = 1, 1, 8
// %for Y = 1, 1, 8 %cycle
{
Y = 0;
L_0030:
if (Y == 8) goto L_0031;
Y += 1;
// 337 %CYCLE X = 1, 1, 8
// %for X = 1, 1, 8 %cycle
{
X = 0;
L_0032:
if (X == 8) goto L_0033;
X += 1;
// 338 SQU = SQU+1
SQU = SQU + 1;
// 339 SQ == SQI(SQU)_SQ
SQ = (struct SQF *)SQI[SQU - 1].SQ;
// 340 Q = SQ_P
Q = SQ->P;
// 341 %IF Q#0 %START; ! PIECE ON SQUARE
if (Q == 0) goto L_0034;
// 342 %IF Q < 0 %START
if (Q >= 0) goto L_0035;
// 343 QQ = -Q; W2 = -1
QQ = -Q;
W2 = -1;
// 344 %FINISHELSESTART
goto L_0036;
L_0035:;
// 345 QQ = Q; W2 = 1
QQ = Q;
W2 = 1;
// 346 %FINISH
L_0036:;
// 347
// 348 !!
// 349 P = 0
P = 0;
// 350 %IF QQ = 1 %START; ! PAWN
if (QQ != 1) goto L_0037;
// 351 %IF Q > 0 %THEN PAWNB= 9-Y %ELSE %C
if (Q <= 0) goto L_0038;
PAWNB = 9 - Y;
goto L_0039;
L_0038:;
PAWNB = Y;
L_0039:;
// 352+ PAWNB = Y
// 353 P = PAWN 2D(PAWNB*8+X)*Q
P = PAWN2D[PAWNB * 8 + X - 9] * Q;
// 354 %FINISH
L_0037:;
// 355 !!
// 356 %IF Q&BIT = WHX %START
if (Q & (-2147483648) != WHX) goto L_003A;
// 357 !*
// 358 !* 'MY' PIECEON SQU X,Y
// 359 !*
// 360 %IF QQ=6 %START; ! 'MY' KING
if (QQ != 6) goto L_003B;
// 361 %IF SQ_ATT # 0 %START
if (SQ->ATT == 0) goto L_003C;
// 362 RESTORE BOARD(HOLD)
RESTOREBOARD(/*?*/ &HOLD);
// 363 %RESULT = MAX SCORE
return -50000;
// 364 %FINISH
L_003C:;
// 365 ! ILLEGAL MOVE
// 366 %FINISH
L_003B:;
// 367 %IF SQ_ATT > 0 %START; ! MY PIECE UNDER ATTACK
if (SQ->ATT <= 0) goto L_003D;
// 368 GAIN = EXVAL(QQ, SQ_ATT, SQ_DEF)
GAIN = EXVAL(QQ, SQ->ATT, SQ->DEF);
// 369 %IF GAIN > 0 %START
if (GAIN <= 0) goto L_003E;
// 370 GAIN = GAIN+P
GAIN = GAIN + P;
// 371 SCOREA = SCOREA-(GAIN*W2)//10
SCOREA = SCOREA - ((long)(GAIN * W2) / (long)10);
// 372 %IF GAIN > BAD %THEN BAD = GAIN
if (GAIN <= BAD) goto L_003F;
BAD = GAIN;
L_003F:;
// 373 ! PROBLEMS WITH POSITIONAL VALUE
// 374 %FINISH
L_003E:;
// 375 %FINISH
L_003D:;
// 376 !!
// 377 ! PIECE EFFECTIVELY LOST
// 378 %FINISHELSESTART
goto L_0040;
L_003A:;
// 379 !*
// 380 !* OPP PIECE (SEE WHICH) ON X,Y
// 381 !*
// 382 %IF SQ_ATT # 0 %START
if (SQ->ATT == 0) goto L_0041;
// 383 GAIN = EXVAL(QQ, SQ_ATT, SQ_DEF)
GAIN = EXVAL(QQ, SQ->ATT, SQ->DEF);
// 384 %IF GAIN > 0 %START
if (GAIN <= 0) goto L_0042;
// 385 %IF GAIN >NPH %START
if (GAIN <= NPH) goto L_0043;
// 386 NPH2 = NPH; NPH = GAIN
NPH2 = NPH;
NPH = GAIN;
// 387 %FINISHELSESTART
goto L_0044;
L_0043:;
// 388 %IF GAIN > NPH2 %THEN NPH2 = GAIN
if (GAIN <= NPH2) goto L_0045;
NPH2 = GAIN;
L_0045:;
// 389 %FINISH
L_0044:;
// 390 %FINISH
L_0042:;
// 391 %IF QQ = 6 %START
if (QQ != 6) goto L_0046;
// 392 L_CHK = Q
L->CHK = Q;
// 393 %FINISH
L_0046:;
// 394 %FINISH
L_0041:;
// 395 %FINISH
L_0040:;
// 396 SCOREB = SCOREB+P+VAL(Q)
SCOREB = SCOREB + P + VAL[Q + 6];
// 397 %FINISH
L_0034:;
// 398 %REPEAT
goto L_0032;
}
L_0033:;
// 399 %REPEAT
goto L_0030;
}
L_0031:;
// 400 LOSS = 0
LOSS = 0;
// 401 %IF BAD > 0 %START; ! PLAYER ABOUT TO LOSE
if (BAD <= 0) goto L_0047;
// 402 %IF ((BAD > 300 %AND NPH > 400) %OR NPH>400) %C
if (BAD <= 300) goto L_0048;
if (NPH > 400) goto L_000A;
L_0048:;
if (NPH <= 400) goto L_0049;
L_000A:;
if (BAD >= 500) goto L_0049;
SCOREC = TRYANOTHERPLY(WHICH);
L_0049:;
// 403+ %AND BAD < 500 %THEN SCOREC = TRY ANOTHER PLY(WHICH)
// 404 NPH = NPH//3
NPH = ((long)NPH / (long)3);
// 405 LOSS = BAD
LOSS = BAD;
// 406 %IF NPH > BAD %THEN LOSS = NPH2//3 %ELSE %C
if (NPH <= BAD) goto L_004A;
LOSS = ((long)NPH2 / (long)3);
goto L_004B;
L_004A:;
LOSS = LOSS - NPH;
L_004B:;
// 407+ LOSS = LOSS-NPH
// 408 %FINISHELSESTART
goto L_004C;
L_0047:;
// 409 %IF NPH2 # 0 %THEN LOSS = -NPH2
if (NPH2 == 0) goto L_004D;
LOSS = -NPH2;
L_004D:;
// 410 LOSS = LOSS-NPH//6
LOSS = LOSS - ((long)NPH / (long)6);
// 411 %FINISH
L_004C:;
// 412 SCOREB = SCOREB+KCAS(-1)+KCAS(1)
SCOREB = SCOREB + KCAS[0] + KCAS[2];
// 413 %CYCLE I = 1, 1, 12; ! CHECK B&N POS
// %for I = 1, 1, 12 %cycle
{
I = 0;
L_004E:
if (I == 12) goto L_004F;
I += 1;
// 414 SCOREB = SCOREB+POSPP(I) %IF POSP(I) # PT(POSX(I))_P
if (POSP[I - 1] == *PT[POSX[I - 1] - 1].P) goto L_0050;
SCOREB = SCOREB + POSPP[I - 1];
L_0050:;
// 415 %REPEAT
goto L_004E;
}
L_004F:;
// 416 %IF L_CHK # 0 %START
if (L->CHK == 0) goto L_0051;
// 417 SCOREC = TRY ANOTHER PLY(WHICH) %UNLESS SCOREC#0
if (SCOREC != 0) goto L_0052;
SCOREC = TRYANOTHERPLY(WHICH);
L_0052:;
// 418 %FINISH
L_0051:;
// 419 RESTORE BOARD(HOLD); ! UNDO THE MOVE
RESTOREBOARD(/*?*/ &HOLD);
// 420 %IF MON&64 # 0 %START
if (MON & 64 == 0) goto L_0053;
// 421 SELECT OUTPUT(2)
_imp_SELECTOUTPUT(2);
// 422 PRINTSTRING("SCORE:")
_imp_PRINTSTRING(_imp_str_literal("SCORE:"));
// 423 WRITE(SCOREA, 1); WRITE(SCOREB, 1); WRITE(SCOREC, 1)
_imp_WRITE(SCOREA, 1);
_imp_WRITE(SCOREB, 1);
_imp_WRITE(SCOREC, 1);
// 424 WRITE(BAD, 1); WRITE(NPH, 1); WRITE(NPH2, 1)
_imp_WRITE(BAD, 1);
_imp_WRITE(NPH, 1);
_imp_WRITE(NPH2, 1);
// 425 WRITE(LOSS, 1); NEWLINE
_imp_WRITE(LOSS, 1);
_imp_NEWLINE();
// 426 SELECT OUTPUT(0)
_imp_SELECTOUTPUT(0);
// 427 %FINISH
L_0053:;
// 428 %RESULT = SCOREC %IF SCOREC # 0
if (SCOREC == 0) goto L_0054;
return SCOREC;
L_0054:;
// 429 %RESULT = SCOREB+SCOREA-LOSS*WHICH
return SCOREB + SCOREA - LOSS * WHICH;
// 430 %END
} /* end of SCORE */
// ?LIST2 unused
// 431 !!
// 432 %INTEGERFN MOVES(%INTEGER WHICH, SCRQ)
int MOVES(int WHICH, int SCRQ) {
// 433 %INTEGER X, Y, Q, QQ, WHICHX, A, B, K, I, TYPE, W2, DIAG
int X;
int Y;
int Q;
int QQ;
int WHICHX;
int A;
int B;
int K;
int I;
int TYPE;
int W2;
int DIAG;
// 434 %INTEGER SPEC, PIN FLAG, PIN PIECE, POX, POY, SQU, IMODK
int SPEC;
int PINFLAG;
int PINPIECE;
int POX;
int POY;
int SQU;
int IMODK;
// 435 %RECORD(ROWF)%NAME ROW
struct ROWF *ROW;
// 436 %RECORD(LISTF)%NAME LIST
struct LISTF *LIST;
// 437 %OWNINTEGERARRAY KCASCH( -1:1) = 1, 0, 8
static int KCASCH[3] = {1, 0, 8};
struct _imp_dv KCASCH_dv = {KCASCH, sizeof(int) /*, dims, <bounds> */};
// 438 %SWITCH MOVE(1:6)
int MOVE_index;
int MOVE_line;
char *MOVE_file;
static const void *MOVE[6] = {&&case_MOVE_1, &&case_MOVE_2, &&case_MOVE_3,
&&case_MOVE_4, &&case_MOVE_5, &&case_MOVE_6};
// 439 !!
// 440 %INTEGER %FN DOM(%INTEGER X0, Y0)
int DOM(int X0, int Y0) {
// 441 %RECORD(SQF)%NAME SQ
struct SQF *SQ;
// 442 %INTEGER I, J, K
int I;
int J;
int K;
// 443 %RECORD(LISTF)%NAME LIST2
struct LISTF *LIST2;
// 444 %RECORD(LISTF)%NAME N
struct LISTF *N;
// 445 !!
// 446 !*
// 447 !* SCRQ = 0 STANDARD ENTRY FOR ONE PLY
// 448 !* +1 ENTRY FROM SCORE
// 449 !* +2
// 450 !* +3 PINNED PIECE ENTRY
// 451 !*
// 452 %UNLESS 1 <= X0 <=8 %AND 1 <=Y0<=8 %THEN %RESULT = 0
{
// Double-sided test on X0 (Part I)
int tmp;
if (1 > (tmp = X0)) goto L_0003;
// Double-sided test on X0 (Part II)
if (tmp > 8) goto L_0003;
}
{
// Double-sided test on Y0 (Part I)
int tmp;
if (1 > (tmp = Y0)) goto L_0003;
// Double-sided test on Y0 (Part II)
if (tmp <= 8) goto L_0055;
}
L_0003:;
return 0;
L_0055:;
// 453 SQ == BRD(Y0)_R(X0)
SQ = (struct SQF *)/*?*/ &BRD[Y0 - 1].R[X0 - 1];
// 454 K = SQ_P
K = SQ->P;
// 455 %IF SCRQ <= 0 %START
if (SCRQ > 0) goto L_0056;
// 456 %IF K#0 %AND K&BIT = Q&BIT %THEN %C
if (K == 0) goto L_0057;
if (K & (-2147483648) != Q & (-2147483648)) goto L_0057;
return 0;
L_0057:;
// 457+ %RESULT = 0
// 458 %IF QQ=PAWN %START
if (QQ != 1) goto L_0058;
// 459 %IF (TYPE=0 %AND K#0) %OR %C
if (TYPE != 0) goto L_0059;
if (K != 0) goto L_005A;
L_0059:;
if (TYPE != 1) goto L_005B;
if (K != 0) goto L_005B;
L_005A:;
return 0;
L_005B:;
// 460+ (TYPE=1 %AND K=0) %THEN %RESULT = 0
// 461 %IF Y0=1 %OR Y0=8 %THEN SPEC=5*Q; ! QUEEN
if (Y0 == 1) goto L_005C;
if (Y0 != 8) goto L_005D;
L_005C:;
SPEC = 5 * Q;
L_005D:;
// 462 %FINISH
L_0058:;
// 463 SPEC = 0
SPEC = 0;
// 464 N == FREE LIST; FREE LIST == RECORD(ADDR(N_L))
N = (struct LISTF *)FREELIST;
FREELIST = (struct LISTF *)_imp_RECORD(_imp_ADDR(N->L));
// 465 %IF ADDR(FREE LIST) = 0 %START
if (_imp_ADDR(FREELIST) != 0) goto L_005E;
// 466 PRINTSTRING("OUT OF FREE CELLS!!!
_imp_PRINTSTRING(_imp_str_literal("OUT OF FREE CELLS!!!\n"));
// 467+ ")
// 468 %STOP
_imp_stop(0);
// 469 %FINISH
L_005E:;
// 470 N_FR = X<<4+Y
N->FR = (X << 4) + Y;
// 471 N_TO = X0<<4+Y0
N->TO = (X0 << 4) + Y0;
// 472 N_SPEC = SPEC
N->SPEC = SPEC;
// 473 %IF 6 <= TYPE <= 7 %START
{
// Double-sided test on TYPE (Part I)
int tmp;
if (6 > (tmp = TYPE)) goto L_005F;
// Double-sided test on TYPE (Part II)
if (tmp > 7) goto L_005F;
}
// 474 N_SPEC = TYPE
N->SPEC = TYPE;
// 475 N_TO = N_FR
N->TO = N->FR;
// 476 %FINISH
L_005F:;
// 477 N_SCORE = SCORE(WHICH, N)
N->SCORE = SCORE(WHICH, N);
// 478 !!
// 479 %IF TYPE = 6 %START; ! ILLEGAL CASTLE CHECK
if (TYPE != 6) goto L_0060;
// 480 %IF ROW_R(6)_ATT # 0 %THEN N_SCORE = MAX SCORE
if (ROW->R[5].ATT == 0) goto L_0061;
N->SCORE = -50000;
L_0061:;
// 481 %FINISH
L_0060:;
// 482 %IF TYPE = 7 %START; ! DITTO
if (TYPE != 7) goto L_0062;
// 483 %IF ROW_R(4)_ATT # 0 %THEN N_SCORE = MAX SCORE
if (ROW->R[3].ATT == 0) goto L_0063;
N->SCORE = -50000;
L_0063:;
// 484 %FINISH
L_0062:;
// 485 !!
// 486 !!
// 487 %IF N_SCORE = MAX SCORE %START; ! WAS ILLEGAL
if (N->SCORE != -50000) goto L_0064;
// 488 N_L == FREE LIST; ! RE-LINK IT
N->L = (struct LISTF *)FREELIST;
// 489 FREE LIST == RECORD(ADDR(N))
FREELIST = (struct LISTF *)_imp_RECORD(_imp_ADDR(N));
// 490 %IF K#0 %THEN %RESULT = 0; ! PIECE IN WAY, NO FURTHER
if (K == 0) goto L_0065;
return 0;
L_0065:;
// 491 %RESULT= 1; ! MUST TRAVERSE ENTIRE B,R OR Q PATH
return 1;
// 492 %FINISH
L_0064:;
// 493 !!
// 494 !!
// 495 %IF MON&2=2 %START
if (MON & 2 != 2) goto L_0066;
// 496 SELECT OUTPUT(2)
_imp_SELECTOUTPUT(2);
// 497 SPACES(20)
_imp_SPACES(20);
// 498 WRITE(XDEPTH, 5)
_imp_WRITE(XDEPTH, 5);
// 499 PRINTSTRING("---")
_imp_PRINTSTRING(_imp_str_literal("---"));
// 500 PRINTMOVE(N)
PRINTMOVE(N);
// 501 NEWLINE
_imp_NEWLINE();
// 502 SELECT OUTPUT(0)
_imp_SELECTOUTPUT(0);
// 503 %FINISH
L_0066:;
// 504 !!
// 505 N_L == LIST; LIST == RECORD(ADDR(N))
N->L = (struct LISTF *)LIST;
LIST = (struct LISTF *)_imp_RECORD(_imp_ADDR(N));
// 506 %IF K=0 %THEN J=1 %ELSE J=0
if (K != 0) goto L_0067;
J = 1;
goto L_0068;
L_0067:;
J = 0;
L_0068:;
// 507 %FINISHELSESTART
goto L_0069;
L_0056:;
// 508 J = 2
J = 2;
// 509 %IF K # 0 %START
if (K == 0) goto L_006A;
// 510 %IF QQ=PAWN %AND TYPE=0 %THEN %RESULT = 0
if (QQ != 1) goto L_006B;
if (TYPE != 0) goto L_006B;
return 0;
L_006B:;
// 511 J = 0; ! POSSIBLY NO FURTHER
J = 0;
// 512 IMODK = IMOD(K)
IMODK = _imp_IMOD(K);
// 513 %IF K&BIT = Q&BIT %START; ! ITS A DEFENCE
if (K & (-2147483648) != Q & (-2147483648)) goto L_006C;
// 514 %IF QQ = 5 %START; ! Q 'BEHIND'
if (QQ != 5) goto L_006D;
// 515 %IF (DIAG=1 %AND IMODK=3) %OR %C
if (DIAG != 1) goto L_006E;
if (IMODK == 3) goto L_006F;
L_006E:;
if (DIAG != 0) goto L_0070;
if (IMODK != 4) goto L_0070;
L_006F:;
J = 1;
L_0070:;
// 516+ (DIAG=0 %AND IMODK=4) %THEN J=1
// 517 %FINISHELSESTART
goto L_0071;
L_006D:;
// 518 %IF IMODK=5 %START
if (IMODK != 5) goto L_0072;
// 519 %IF 3<=QQ<=4 %THEN J=1
{
// Double-sided test on QQ (Part I)
int tmp;
if (3 > (tmp = QQ)) goto L_0073;
// Double-sided test on QQ (Part II)
if (tmp > 4) goto L_0073;
}
J = 1;
L_0073:;
// 520 %FINISH
L_0072:;
// 521 %FINISH
L_0071:;
// 522 ! IF A PIECE DOUBLES UP, THEN KEEP GOING
// 523 %IF SCRQ # 3 %START
if (SCRQ == 3) goto L_0074;
// 524 %IF PINFLAG = 0 %THEN %C
if (PINFLAG != 0) goto L_0075;
SQ->DEF = SQ->DEF + BITVAL[QQ - 1];
L_0075:;
// 525+ SQ_DEF = SQ_DEF+BIT VAL(QQ)
// 526 %FINISHELSESTART
goto L_0076;
L_0074:;
// 527 SQ_DEF = SQ_DEF-BIT VAL(QQ)
SQ->DEF = SQ->DEF - BITVAL[QQ - 1];
// 528 %FINISH
L_0076:;
// 529 %FINISHELSESTART
goto L_0077;
L_006C:;
// 530 %IF SCRQ = 3 %START
if (SCRQ != 3) goto L_0078;
// 531 ! PIECE QQ IS ATTACKING K
// 532 %IF PIN REMOVE >= IMODK %THEN %C
if (PINREMOVE < IMODK) goto L_0079;
SQ->ATT = SQ->ATT - BITVAL[QQ - 1];
L_0079:;
// 533+ SQ_ATT = SQ_ATT-BIT VAL(QQ)
// 534 %FINISHELSESTART
goto L_007A;
L_0078:;
// 535 %IF PINFLAG=0 %START
if (PINFLAG != 0) goto L_007B;
// 536 SQ_ATT = SQ_ATT+BIT VAL(QQ)
SQ->ATT = SQ->ATT + BITVAL[QQ - 1];
// 537 PINFLAG=1; J=3
PINFLAG = 1;
J = 3;
// 538 PINPIECE=IMODK; POX=X0; POY=Y0
PINPIECE = IMODK;
POX = X0;
POY = Y0;
// 539 %FINISHELSESTART
goto L_007C;
L_007B:;
// 540 %IF IMODK>3 %AND IMODK>PIN PIECE %START
if (IMODK <= 3) goto L_007D;
if (IMODK <= PINPIECE) goto L_007D;
// 541 %IF PIN PT#0 %START
if (PINPT == 0) goto L_007E;
// 542
// 543 %CYCLE I = 1,1,PIN PT
// %for I = 1, 1, PINPT %cycle
{
int _final = PINPT;
if (invalid_for_loop(1, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle I = 1, 1, PINPT");
I = 0;
L_007F:
if (I == _final) goto L_0080;
I += 1;
// 544 %IF PINX(I)=POX %AND PINY(I)=POY %C
if (PINX[I - 1] != POX) goto L_0082;
if (PINY[I - 1] != POY) goto L_0082;
goto U_1000;
L_0082:;
// 545+ %THEN ->NO PIN
// 546 %REPEAT
goto L_007F;
}
L_0080:;
// 547 %FINISH
L_007E:;
// 548 PIN PT = PIN PT+1
PINPT = PINPT + 1;
// 549 PINX(PINPT) = POX
PINX[PINPT - 1] = POX;
// 550 PINY(PINPT) = POY
PINY[PINPT - 1] = POY;
// 551 PINDX(PINPT) = SQU
PINDX[PINPT - 1] = SQU;
// 552 PINPY(PINPT) = PIN PIECE
PINPY[PINPT - 1] = PINPIECE;
// 553 NO PIN:
U_1000:;
// 554 %FINISH
L_007D:;
// 555 %FINISH
L_007C:;
// 556 %FINISH
L_007A:;
// 557 %FINISH
L_0077:;
// 558 %FINISH
L_006A:;
// 559 SCOREA = SCOREA+W2
SCOREA = SCOREA + W2;
// 560 %FINISH
L_0069:;
// 561 %RESULT = J
return J;
// 562 %END
} /* end of DOM */
// ?LIST2 unused
// 563 !!
// 564 DIAG = 0
DIAG = 0;
// 565 LIST == RECORD(0)
LIST = (struct LISTF *)_imp_RECORD(0);
// 566 WHICHX = WHICH&BIT
WHICHX = WHICH & (-2147483648);
// 567 !!
// 568 %IF SCRQ = 3 %START; ! PIN ENTRY
if (SCRQ != 3) goto L_0083;
// 569 X = PX; Y = PY
X = PX;
Y = PY;
// 570 SQU = (Y-1)*8+X
SQU = (Y - 1) * 8 + X;
// 571 -> PIN ENTRY
goto U_1001;
// 572 %FINISH
L_0083:;
// 573
// 574 !!
// 575 SQU = 0
SQU = 0;
// 576 %CYCLE Y = 1,1, 8
// %for Y = 1, 1, 8 %cycle
{
Y = 0;
L_0084:
if (Y == 8) goto L_0085;
Y += 1;
// 577
// 578 %CYCLE X = 1, 1, 8
// %for X = 1, 1, 8 %cycle
{
X = 0;
L_0087:
if (X == 8) goto L_0088;
X += 1;
// 579 TYPE = -1
TYPE = -1;
// 580 SQU = SQU+1
SQU = SQU + 1;
// 581 PIN ENTRY:
U_1001:;
// 582 Q = PT(SQU)_P; ! PICK UP PIECE(X,Y)
Q = *PT[SQU - 1].P;
// 583 %IF Q # 0 %AND (Q&BIT = WHICHX %OR %C
if (Q == 0) goto L_008A;
if (Q & (-2147483648) == WHICHX) goto L_008B;
if (SCRQ <= 0) goto L_008A;
L_008B:;
// 584+ SCRQ > 0) %START
// 585 %IF Q<0 %THEN QQ=-Q %AND W2=-1 %ELSE %C
if (Q >= 0) goto L_008C;
QQ = -Q;
W2 = -1;
goto L_008D;
L_008C:;
QQ = Q;
W2 = 1;
L_008D:;
// 586+ QQ = Q %AND W2 = +1
// 587 -> MOVE(QQ)
MOVE_line = __LINE__;
MOVE_file = __FILE__;
MOVE_index = QQ;
goto case_MOVE_dispatch;
// 588
// 589 MOVE(1): ! PAWN
case_MOVE_1:;
// 590 TYPE = 0
TYPE = 0;
// 591 PIN FLAG = 0
PINFLAG = 0;
// 592 K = DOM(X, Y-W2)
K = DOM(X, Y - W2);
// 593 PIN FLAG = 0
PINFLAG = 0;
// 594 K=DOM(X, Y-W2-W2) %IF (Y=2 %OR Y=7) %AND K#0
if (Y == 2) goto L_008F;
if (Y != 7) goto L_0090;
L_008F:;
if (K == 0) goto L_0090;
K = DOM(X, Y - W2 - W2);
L_0090:;
// 595 TYPE = 1
TYPE = 1;
// 596 PIN FLAG = 0
PINFLAG = 0;
// 597 K = DOM(X-1, Y-W2); PIN FLAG = 0; K=DOM(X+1, Y-W2)
K = DOM(X - 1, Y - W2);
PINFLAG = 0;
K = DOM(X + 1, Y - W2);
// 598 ->OUT
goto U_1002;
// 599 !!
// 600 MOVE(2): ! KNIGHT
case_MOVE_2:;
// 601 %CYCLE A = -2, 4, 2
// %for A = -2, 4, 2 %cycle
{
A = -6;
L_0091:
if (A == 2) goto L_0092;
A += 4;
// 602 %CYCLE B = -1, 2, 1
// %for B = -1, 2, 1 %cycle
{
B = -3;
L_0094:
if (B == 1) goto L_0095;
B += 2;
// 603 PIN FLAG = 0
PINFLAG = 0;
// 604 K = DOM(X+A, Y+B)
K = DOM(X + A, Y + B);
// 605 PIN FLAG = 0
PINFLAG = 0;
// 606 K = DOM(X+B, Y+A)
K = DOM(X + B, Y + A);
// 607 %REPEAT
goto L_0094;
}
L_0095:;
// 608 %REPEAT
goto L_0091;
}
L_0092:;
// 609 -> OUT
goto U_1002;
// 610 !!!
// 611 MOVE(3): ! BISHOP
case_MOVE_3:;
// 612 MOVE(5): ! QUEEN
case_MOVE_5:;
// 613 DIAG = 1
DIAG = 1;
// 614 I = 0; PIN FLAG = 0
I = 0;
PINFLAG = 0;
// 615 %CYCLE
L_0097:;
// 616 I = I-1
I = I - 1;
// 617 K = DOM(X+I, Y+I)
K = DOM(X + I, Y + I);
// 618 %REPEAT %UNTIL K = 0
if (K == 0) goto L_0098;
goto L_0097;
L_0098:;
// 619 I = 0; PIN FLAG = 0
I = 0;
PINFLAG = 0;
// 620 %CYCLE
L_0099:;
// 621 I = I-1
I = I - 1;
// 622 K = DOM(X-I, Y+I)
K = DOM(X - I, Y + I);
// 623 %REPEAT %UNTIL K = 0
if (K == 0) goto L_009A;
goto L_0099;
L_009A:;
// 624 I = 0; PIN FLAG = 0
I = 0;
PINFLAG = 0;
// 625 %CYCLE
L_009B:;
// 626 I = I-1
I = I - 1;
// 627 K = DOM(X+I, Y-I)
K = DOM(X + I, Y - I);
// 628 %REPEAT %UNTIL K = 0
if (K == 0) goto L_009C;
goto L_009B;
L_009C:;
// 629 I = 0; PIN FLAG = 0
I = 0;
PINFLAG = 0;
// 630 %CYCLE
L_009D:;
// 631 I = I-1
I = I - 1;
// 632 K = DOM(X-I, Y-I)
K = DOM(X - I, Y - I);
// 633 %REPEAT %UNTIL K = 0
if (K == 0) goto L_009E;
goto L_009D;
L_009E:;
// 634 -> OUT %IF QQ # QUEEN; ! THE BISHOP
if (QQ == 5) goto L_009F;
goto U_1002;
L_009F:;
// 635
// 636 MOVE(4): ! ROOK
case_MOVE_4:;
// 637 DIAG = 0
DIAG = 0;
// 638 K = 1; I = 0; PIN FLAG = 0
K = 1;
I = 0;
PINFLAG = 0;
// 639 %CYCLE
L_00A0:;
// 640 I = I-1
I = I - 1;
// 641 K = DOM(X, Y+I)
K = DOM(X, Y + I);
// 642 %REPEAT %UNTIL K = 0
if (K == 0) goto L_00A1;
goto L_00A0;
L_00A1:;
// 643 I = 0; PIN FLAG = 0
I = 0;
PINFLAG = 0;
// 644 %CYCLE
L_00A2:;
// 645 I = I+1
I = I + 1;
// 646 K = DOM(X+I, Y)
K = DOM(X + I, Y);
// 647 %REPEAT %UNTIL K = 0
if (K == 0) goto L_00A3;
goto L_00A2;
L_00A3:;
// 648 I = 0; PIN FLAG = 0
I = 0;
PINFLAG = 0;
// 649 %CYCLE
L_00A4:;
// 650 I = I+1
I = I + 1;
// 651 K = DOM(X, Y+I)
K = DOM(X, Y + I);
// 652 %REPEAT %UNTIL K = 0
if (K == 0) goto L_00A5;
goto L_00A4;
L_00A5:;
// 653 I = 0; PIN FLAG = 0
I = 0;
PINFLAG = 0;
// 654 %CYCLE
L_00A6:;
// 655 I = I-1
I = I - 1;
// 656 K = DOM(X+I, Y)
K = DOM(X + I, Y);
// 657 %REPEAT %UNTIL K = 0
if (K == 0) goto L_00A7;
goto L_00A6;
L_00A7:;
// 658 -> OUT
goto U_1002;
// 659
// 660
// 661 !!
// 662 MOVE(6): ! KING
case_MOVE_6:;
// 663 ROW == BRD(Y)
ROW = (struct ROWF *)/*?*/ &BRD[Y - 1];
// 664 %CYCLE A = -1, 1, 1
// %for A = -1, 1, 1 %cycle
{
A = -2;
L_00A8:
if (A == 1) goto L_00A9;
A += 1;
// 665 %CYCLE B = -1, 1, 1
// %for B = -1, 1, 1 %cycle
{
B = -2;
L_00AA:
if (B == 1) goto L_00AB;
B += 1;
// 666 %IF A#0 %OR B#0 %START
if (A != 0) goto L_00AC;
if (B == 0) goto L_00AD;
L_00AC:;
// 667 PIN FLAG = 0
PINFLAG = 0;
// 668 K = DOM(X+A, Y+B)
K = DOM(X + A, Y + B);
// 669 ! %IF K#0 %AND W2#WHICH %THEN K MOB=K MOB+1
// 670 %FINISH
L_00AD:;
// 671 %REPEAT
goto L_00AA;
}
L_00AB:;
// 672 %REPEAT
goto L_00A8;
}
L_00A9:;
// 673 %IF LAST CHK # Q %AND %C
if (LASTCHK == Q) goto L_00AE;
if (KCASCH[W2 + 1] != Y) goto L_00AE;
if (KMOVE[W2 + 1] != 0) goto L_00AE;
// 674+ KCASCH(W2) = Y %AND KMOVE(W2)=0 %START
// 675 ! CORRECT ROW AND ABLE TO CASTLE
// 676 %IF ROW_R(6)_P = 0 = ROW_R(7)_P %AND %C
{
// Double-sided test on 0 (Part I)
int tmp;
if (ROW->R[5].P != (tmp = 0)) goto L_00AF;
// Double-sided test on 0 (Part II)
if (tmp != ROW->R[6].P) goto L_00AF;
}
if (ROW->R[7].P != 4 * W2) goto L_00AF;
// 677+ ROW_R(8)_P = ROOK*W2 %START
// 678 TYPE = 6; K = DOM(7, Y); ! DO CASTLE
TYPE = 6;
K = DOM(7, Y);
// 679 %FINISH
L_00AF:;
// 680 %IF ROW_R(4)_P = 0 =ROW_R(3)_P %AND %C
{
// Double-sided test on 0 (Part I)
int tmp;
if (ROW->R[3].P != (tmp = 0)) goto L_00B0;
// Double-sided test on 0 (Part II)
if (tmp != ROW->R[2].P) goto L_00B0;
}
if (ROW->R[1].P != 0) goto L_00B0;
if (ROW->R[0].P != 4 * W2) goto L_00B0;
// 681+ ROW_R(2)_P = 0 %AND ROW_R(1)_P = ROOK*W2 %C
// 682+ %START
// 683 TYPE = 7; K = DOM(3, Y)
TYPE = 7;
K = DOM(3, Y);
// 684 %FINISH
L_00B0:;
// 685 %FINISH
L_00AE:;
// 686 !!
// 687 OUT:
U_1002:;
// 688 %FINISH
L_008A:;
// 689 %RESULT = 0 %IF SCRQ = 3
if (SCRQ != 3) goto L_00B1;
return 0;
L_00B1:;
// 690 %REPEAT
goto L_0087;
}
L_0088:;
// 691 %REPEAT
goto L_0084;
}
L_0085:;
// 692 CHECK PINS(WHICH) %IF SCRQ > 0
if (SCRQ <= 0) goto L_00B2;
CHECKPINS(WHICH);
L_00B2:;
// 693 ! ONLY ON SCORE ENTRY
// 694
// 695 %RESULT = ADDR(LIST)
return _imp_ADDR(LIST);
// 696 %END
case_MOVE_dispatch:
if (MOVE_index < 1 || MOVE_index > 6)
_imp_signalf(6, 3, MOVE_index, "->MOVE(%d) out of bounds at %s line %d", MOVE_index, MOVE_file, MOVE_line);
goto *MOVE[MOVE_index - 1];
} /* end of MOVES */
// 697 !!
// 698 %INTEGERFN SORT AND PRUNE(%RECORD(LISTF)%NAME LIST, %C
int SORTANDPRUNE(struct LISTF * LIST, int WIDTH, int WHICH) {
// 699+ %INTEGER WIDTH, WHICH)
// 700
// 701
// 702 %INTEGER I, MAX
int I;
int MAX;
// 703 %RECORD(LISTF)%NAME M1, M2, L, LN, RES
struct LISTF *M1;
struct LISTF *M2;
struct LISTF *L;
struct LISTF *LN;
struct LISTF *RES;
// 704 %CONSTINTEGERARRAY MAXA(-1:1) = 25000, 0, -25000
const int MAXA[3] = {25000, 0, -25000};
struct _imp_dv MAXA_dv = {MAXA, sizeof(int) /*, dims, <bounds> */};
// 705 !!
// 706
// 707 %RESULT = 0 %IF ADDR(LIST) = 0
if (_imp_ADDR(LIST) != 0) goto L_00B3;
return 0;
L_00B3:;
// 708
// 709 RES == RECORD(0)
RES = (struct LISTF *)_imp_RECORD(0);
// 710 %CYCLE I = 1, 1, WIDTH
// %for I = 1, 1, WIDTH %cycle
{
int _final = WIDTH;
if (invalid_for_loop(1, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle I = 1, 1, WIDTH");
I = 0;
L_00B4:
if (I == _final) goto L_00B5;
I += 1;
// 711 M1 == RECORD(0)
M1 = (struct LISTF *)_imp_RECORD(0);
// 712 M2 == M1; LN == M1
M2 = (struct LISTF *)M1;
LN = (struct LISTF *)M1;
// 713 MAX = MAXA(WHICH)
MAX = MAXA[WHICH + 1];
// 714
// 715 L == LIST
L = (struct LISTF *)LIST;
// 716 %%EXIT %IF ADDR(L) = 0
if (_imp_ADDR(L) != 0) goto L_00B6;
goto L_00B5;
L_00B6:;
// 717
// 718 %WHILE ADDR(L) # 0 %CYCLE
L_00B7:;
if (_imp_ADDR(L) == 0) goto L_00B8;
// 719 %IF (WHICH<0 %AND L_SCORE<MAX) %OR %C
if (WHICH >= 0) goto L_00B9;
if (L->SCORE < MAX) goto L_00BA;
L_00B9:;
if (WHICH <= 0) goto L_00BB;
if (L->SCORE <= MAX) goto L_00BB;
L_00BA:;
// 720+ (WHICH>0 %AND L_SCORE>MAX) %START
// 721 !!
// 722 M2 == L; M1 == LN; MAX = L_SCORE
M2 = (struct LISTF *)L;
M1 = (struct LISTF *)LN;
MAX = L->SCORE;
// 723 %FINISH
L_00BB:;
// 724 !!
// 725 LN == L; L == L_L
LN = (struct LISTF *)L;
L = (struct LISTF *)L->L;
// 726 %REPEAT
goto L_00B7;
L_00B8:;
// 727
// 728 !!
// 729 L == M2_L; ! PICKUP ITS POINTER
L = (struct LISTF *)M2->L;
// 730 M2_L == RES
M2->L = (struct LISTF *)RES;
// 731 RES == M2; ! NOTE LINKS BACKWARDS
RES = (struct LISTF *)M2;
// 732 %IF ADDR(M1) = 0 %THEN LIST == L %ELSE %C
if (_imp_ADDR(M1) != 0) goto L_00BC;
LIST = (struct LISTF *)L;
goto L_00BD;
L_00BC:;
M1->L = (struct LISTF *)L;
L_00BD:;
// 733+ M1_L == L
// 734 %REPEAT
goto L_00B4;
}
L_00B5:;
// 735
// 736 %IF ADDR(LIST) # 0 %THEN RELEASE CHAIN(LIST)
if (_imp_ADDR(LIST) == 0) goto L_00BE;
RELEASECHAIN(LIST);
L_00BE:;
// 737 L == RECORD (0)
L = (struct LISTF *)_imp_RECORD(0);
// 738 %WHILE ADDR(RES) # 0 %CYCLE
L_00BF:;
if (_imp_ADDR(RES) == 0) goto L_00C0;
// 739 M1 == RES_L; ! NEXT LINK
M1 = (struct LISTF *)RES->L;
// 740 RES_L == L; ! LINK TO NEXT
RES->L = (struct LISTF *)L;
// 741 L == RES
L = (struct LISTF *)RES;
// 742 RES == M1
RES = (struct LISTF *)M1;
// 743 %REPEAT
goto L_00BF;
L_00C0:;
// 744 %RESULT = ADDR(L)
return _imp_ADDR(L);
// 745 %END
} /* end of SORTANDPRUNE */
// 746 !!
// 747 %INTEGERFN CHANGE BOARD(%RECORD(LISTF{QHF})%NAME B)
int CHANGEBOARD(struct LISTF * B) {
// 748
// 749 %RECORD(SQF)%NAME SQ
struct SQF *SQ;
// 750 %RECORD(ROWF)%NAME ROW
struct ROWF *ROW;
// 751 %RECORD(LISTF)%NAME LIST
struct LISTF *LIST;
// 752 %INTEGER FROM, TO, X, Y, X0, Y0, KING, CAS, ROOK
int FROM;
int TO;
int X;
int Y;
int X0;
int Y0;
int KING;
int CAS;
int ROOK;
// 753 LIST == B_L
LIST = (struct LISTF *)B->L;
// 754 FROM = LIST_FR; TO = LIST_TO
FROM = LIST->FR;
TO = LIST->TO;
// 755 X = FROM>>4; X0 = TO>>4
X = (unsigned int)FROM >> 4;
X0 = (unsigned int)TO >> 4;
// 756 Y = FROM&15; Y0 = TO&15
Y = FROM & 15;
Y0 = TO & 15;
// 757 SQ == BRD(Y0)_R(X0)
SQ = (struct SQF *)/*?*/ &BRD[Y0 - 1].R[X0 - 1];
// 758 B_HOLD = SQ_P
B->HOLD = SQ->P;
// 759 %IF LIST_SPEC # 0 %START
if (LIST->SPEC == 0) goto L_00C1;
// 760 %IF LIST_SPEC >= 6 %START; ! CASTLE
if (LIST->SPEC < 6) goto L_00C2;
// 761 %IF SQ_P<0 %START
if (SQ->P >= 0) goto L_00C3;
// 762 CAS = 1; KING = -6; ROOK = -4; KCAS(-1) = -30
CAS = 1;
KING = -6;
ROOK = -4;
KCAS[0] = -30;
// 763 %FINISHELSESTART
goto L_00C4;
L_00C3:;
// 764 CAS = 8; KING = 6; ROOK = 4; KCAS(1) = 30
CAS = 8;
KING = 6;
ROOK = 4;
KCAS[2] = 30;
// 765 %FINISH
L_00C4:;
// 766 ROW == BRD(CAS)
ROW = (struct ROWF *)/*?*/ &BRD[CAS - 1];
// 767 %IF LIST_SPEC = 6 %START; ! KING SIDE
if (LIST->SPEC != 6) goto L_00C5;
// 768 ROW_R(7)_P = KING; ROW_R(6)_P = ROOK
ROW->R[6].P = KING;
ROW->R[5].P = ROOK;
// 769 ROW_R(8)_P = 0
ROW->R[7].P = 0;
// 770 %FINISHELSESTART
goto L_00C6;
L_00C5:;
// 771 ROW_R(3)_P = KING; ROW_R(4)_P = ROOK
ROW->R[2].P = KING;
ROW->R[3].P = ROOK;
// 772 ROW_R(1)_P = 0
ROW->R[0].P = 0;
// 773 %FINISH
L_00C6:;
// 774 SQ_P = 0
SQ->P = 0;
// 775 %RESULT = KING
return KING;
// 776 %FINISH
L_00C2:;
// 777 SQ_P = LIST_SPEC
SQ->P = LIST->SPEC;
// 778 %FINISHELSESTART
goto L_00C7;
L_00C1:;
// 779 SQ_P = BRD(Y)_R(X)_P
SQ->P = BRD[Y - 1].R[X - 1].P;
// 780 %FINISH
L_00C7:;
// 781 BRD(Y)_R(X)_P = 0
BRD[Y - 1].R[X - 1].P = 0;
// 782 %RESULT = SQ_P
return SQ->P;
// 783 %END
} /* end of CHANGEBOARD */
// 784 !!
// 785 %ROUTINE RESTORE BOARD(%RECORD(LISTF{QHF})%NAME B)
void RESTOREBOARD(struct LISTF * B) {
// 786 %RECORD(SQF)%NAME SQ
struct SQF *SQ;
// 787 %RECORD(ROWF)%NAME ROW
struct ROWF *ROW;
// 788 %RECORD(LISTF)%NAME LIST
struct LISTF *LIST;
// 789 %INTEGER FROM, TO, X, Y, X0, Y0, KING, CAS, ROOK
int FROM;
int TO;
int X;
int Y;
int X0;
int Y0;
int KING;
int CAS;
int ROOK;
// 790 LIST == B_L
LIST = (struct LISTF *)B->L;
// 791 FROM = LIST_FR; TO = LIST_TO
FROM = LIST->FR;
TO = LIST->TO;
// 792 X = FROM>>4; X0 = TO>>4
X = (unsigned int)FROM >> 4;
X0 = (unsigned int)TO >> 4;
// 793 Y = FROM&15; Y0 = TO&15
Y = FROM & 15;
Y0 = TO & 15;
// 794 SQ == BRD(Y0)_R(X0)
SQ = (struct SQF *)/*?*/ &BRD[Y0 - 1].R[X0 - 1];
// 795 %IF LIST_SPEC # 0 %START
if (LIST->SPEC == 0) goto L_00C8;
// 796 %IF LIST_SPEC >= 6 %START; ! CASTLE
if (LIST->SPEC < 6) goto L_00C9;
// 797 %IF Y0 = 1 %START
if (Y0 != 1) goto L_00CA;
// 798 CAS = 1; KING = -6; ROOK = -4; KCAS(-1) = 0
CAS = 1;
KING = -6;
ROOK = -4;
KCAS[0] = 0;
// 799 %FINISHELSESTART
goto L_00CB;
L_00CA:;
// 800 CAS = 8; KING = 6; ROOK = 4; KCAS(1) = 0
CAS = 8;
KING = 6;
ROOK = 4;
KCAS[2] = 0;
// 801 %FINISH
L_00CB:;
// 802 ROW == BRD(CAS)
ROW = (struct ROWF *)/*?*/ &BRD[CAS - 1];
// 803 %IF LIST_SPEC = 6 %START; ! KING SIDE
if (LIST->SPEC != 6) goto L_00CC;
// 804 ROW_R(8)_P = ROOK
ROW->R[7].P = ROOK;
// 805 ROW_R(7)_P = 0; ROW_R(6)_P = 0
ROW->R[6].P = 0;
ROW->R[5].P = 0;
// 806 %FINISHELSESTART
goto L_00CD;
L_00CC:;
// 807 ROW_R(1)_P = ROOK
ROW->R[0].P = ROOK;
// 808 ROW_R(3)_P = 0; ROW_R(4)_P = 0
ROW->R[2].P = 0;
ROW->R[3].P = 0;
// 809 %FINISH
L_00CD:;
// 810 SQ_P = KING
SQ->P = KING;
// 811 %RETURN
return;
// 812 %FINISH
L_00C9:;
// 813 %IF Y0=8 %THEN SQ_P=-1 %ELSE SQ_P=1
if (Y0 != 8) goto L_00CE;
SQ->P = -1;
goto L_00CF;
L_00CE:;
SQ->P = 1;
L_00CF:;
// 814 %FINISH
L_00C8:;
// 815 BRD(Y)_R(X)_P = SQ_P
BRD[Y - 1].R[X - 1].P = SQ->P;
// 816 SQ_P = B_HOLD
SQ->P = B->HOLD;
// 817 %END
return;
} /* end of RESTOREBOARD */
// 818 !!
// 819 !!
// 820 %ROUTINE BURP(%RECORD(LISTF{QHF})%NAME X, %INTEGER W)
void BURP(struct LISTF * X, int W) {
// 821 %INTEGER I
int I;
// 822 !!
// 823 TELL(X_L, W)
TELL(X->L, W);
// 824 SELECT OUTPUT(2)
_imp_SELECTOUTPUT(2);
// 825 PRINTSYMBOL('*'); TELL(X_L, W)
_imp_PRINTSYMBOL(42);
TELL(X->L, W);
// 826 SELECT OUTPUT(0)
_imp_SELECTOUTPUT(0);
// 827 ! %IF W > 0 %AND TIMTT < 3 %AND PDEPTH#1 %THEN PDEPTH=PDEPTH+1
// 828 I = CHANGE BOARD(X)
I = CHANGEBOARD(X);
// 829 %IF I = KING*W %THEN KMOVE(W) = 1
if (I != 6 * W) goto L_00D0;
KMOVE[W + 1] = 1;
L_00D0:;
// 830 %END
return;
} /* end of BURP */
// 831 !!
// 832 %ROUTINE TELL(%RECORD(LISTF)%NAME MOVE, %INTEGER WHICH)
void TELL(struct LISTF * MOVE, int WHICH) {
// 833
// 834 %IF ADDR(MOVE) = 0 %START
if (_imp_ADDR(MOVE) != 0) goto L_00D1;
// 835 %IF WHICH < 0 %THEN PRINTSTRING("I Win
if (WHICH >= 0) goto L_00D2;
_imp_PRINTSTRING(_imp_str_literal("I Win\n"));
goto L_00D3;
L_00D2:;
_imp_PRINTSTRING(_imp_str_literal("YOU WIN\n"));
L_00D3:;
// 836+ ") %ELSE %C
// 837+ PRINTSTRING("YOU WIN
// 838+ ")
// 839 %STOP
_imp_stop(0);
// 840 %FINISH
L_00D1:;
// 841 !!
// 842 WRITE(NO, 1)
_imp_WRITE(NO, 1);
// 843 %IF WHICH > 0 %THEN SPACES(25) %ELSE SPACES(4)
if (WHICH <= 0) goto L_00D4;
_imp_SPACES(25);
goto L_00D5;
L_00D4:;
_imp_SPACES(4);
L_00D5:;
// 844 PRINTMOVE(MOVE)
PRINTMOVE(MOVE);
// 845 PRINTSTRING("(")
_imp_PRINTSTRING(_imp_str_literal("("));
// 846 %IF WHICH > 0 %START
if (WHICH <= 0) goto L_00D6;
// 847 TIMTT = CPUTIME-TIME
TIMTT = CPUTIME() - TIME;
// 848 PRINT(TIMTT, 1, 2)
_imp_PRINT(TIMTT, 1, 2);
// 849 %FINISHELSESTART
goto L_00D7;
L_00D6:;
// 850 PRINT(CPUTIME-TIME2, 1, 2)
_imp_PRINT(CPUTIME() - TIME2, 1, 2);
// 851 %FINISH
L_00D7:;
// 852 PRINTSTRING(" Secs)
_imp_PRINTSTRING(_imp_str_literal(" Secs)\n"));
// 853+ ")
// 854 %END
return;
} /* end of TELL */
// 855 !!
// 856 %ROUTINE PRINTBOARD
void PRINTBOARD(void) {
// 857 %CONSTBYTEINTEGERARRAY BLACK(1:64) = %C
const unsigned char BLACK[64] = {0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1,
0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0,
1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0};
struct _imp_dv BLACK_dv = {BLACK, sizeof(unsigned char) /*, dims, <bounds> */};
// 858+ 0, 1, 0, 1, 0, 1, 0, 1,
// 859+ 1, 0, 1, 0, 1, 0, 1, 0,
// 860+ 0, 1, 0, 1, 0, 1, 0, 1,
// 861+ 1, 0, 1, 0, 1, 0, 1, 0,
// 862+ 0, 1, 0, 1, 0, 1, 0, 1,
// 863+ 1, 0, 1, 0, 1, 0, 1, 0,
// 864+ 0, 1, 0, 1, 0, 1, 0, 1,
// 865+ 1, 0, 1, 0, 1, 0, 1, 0
// 866 !!
// 867 %ROUTINE LINE
void LINE(void) {
// 868 PRINTSTRING(" !---!---!---!---!---!---!---!---!
_imp_PRINTSTRING(_imp_str_literal(" !---!---!---!---!---!---!---!---!\n"));
// 869+ ")
// 870 %END
return;
} /* end of LINE */
// 871 !!
// 872 %CONSTBYTEINTEGERARRAY PX(-6:6) = %C
const unsigned char PX[13] = {107, 113, 114, 98, 110, 112, 32, 80, 78, 66, 82, 81, 75};
struct _imp_dv PX_dv = {PX, sizeof(unsigned char) /*, dims, <bounds> */};
// 873+ 'k', 'q', 'r', 'b', 'n', 'p',
// 874+ ' ', 'P', 'N', 'B', 'R', 'Q', 'K'
// 875 %INTEGER X,Y, I, P, Q
int X;
int Y;
int I;
int P;
int Q;
// 876 %RECORD(ROWF)%NAME ROW
struct ROWF *ROW;
// 877 !!
// 878 Q = 1
Q = 1;
// 879 %CYCLE Y = 8, -1, 1
// %for Y = 8, -1, 1 %cycle
{
Y = 9;
L_00D8:
if (Y == 1) goto L_00D9;
Y -= 1;
// 880 ROW == BRD(Y)
ROW = (struct ROWF *)/*?*/ &BRD[Y - 1];
// 881 LINE
LINE();
// 882 WRITE(Y, 1)
_imp_WRITE(Y, 1);
// 883 %CYCLE X = 1, 1, 8
// %for X = 1, 1, 8 %cycle
{
X = 0;
L_00DA:
if (X == 8) goto L_00DB;
X += 1;
// 884 PRINTSTRING("! ")
_imp_PRINTSTRING(_imp_str_literal("! "));
// 885 P = ROW_R(X)_P
P = ROW->R[X - 1].P;
// 886 %IF P # 0 %THEN PRINTSYMBOL(PX(P)) %ELSE %START
if (P == 0) goto L_00DC;
_imp_PRINTSYMBOL(PX[P + 6]);
goto L_00DD;
L_00DC:;
// 887 %IF BLACK(Q) = 1 %THEN PRINTSYMBOL('*') %C
if (BLACK[Q - 1] != 1) goto L_00DE;
_imp_PRINTSYMBOL(42);
goto L_00DF;
L_00DE:;
_imp_PRINTSYMBOL(32);
L_00DF:;
// 888+ %ELSE PRINTSYMBOL(' ')
// 889 %FINISH
L_00DD:;
// 890 %IF P > 0 %THEN PRINTSYMBOL('+') %ELSE %C
if (P <= 0) goto L_00E0;
_imp_PRINTSYMBOL(43);
goto L_00E1;
L_00E0:;
_imp_PRINTSYMBOL(32);
L_00E1:;
// 891+ PRINTSYMBOL(' ')
// 892 Q = Q+1
Q = Q + 1;
// 893 %REPEAT
goto L_00DA;
}
L_00DB:;
// 894 PRINTSTRING("!
_imp_PRINTSTRING(_imp_str_literal("!\n"));
// 895+ ")
// 896 %REPEAT
goto L_00D8;
}
L_00D9:;
// 897 LINE
LINE();
// 898 PRINTSTRING(" A B C D E F G H
_imp_PRINTSTRING(_imp_str_literal(" A B C D E F G H\n"));
// 899+ ")
// 900 %END
return;
} /* end of PRINTBOARD */
// ?I unused
// 901 !!
// 902 !!
// 903 %ROUTINE PRINTMOVE(%RECORD(LISTF)%NAME LIST)
void PRINTMOVE(struct LISTF * LIST) {
// 904 %INTEGER I,J,K
int I;
int J;
int K;
// 905 %ROUTINE BURP(%INTEGER X)
void BURP(int X) {
// 906 PRINTSYMBOL((X>>4)+'A'-1)
_imp_PRINTSYMBOL(((unsigned int)X >> 4) + 65 - 1);
// 907 PRINTSYMBOL(X&15+'0')
_imp_PRINTSYMBOL((X & 15) + 48);
// 908 SPACE
_imp_SPACE();
// 909 %END
return;
} /* end of BURP */
// 910 !!
// 911 BURP(LIST_FR); BURP(LIST_TO)
BURP(LIST->FR);
BURP(LIST->TO);
// 912 %IF LIST_CHK # 0 %THEN PRINTSYMBOL('+')
if (LIST->CHK == 0) goto L_00E2;
_imp_PRINTSYMBOL(43);
L_00E2:;
// 913 WRITE(LIST_SCORE, 5)
_imp_WRITE(LIST->SCORE, 5);
// 914 %END
return;
} /* end of PRINTMOVE */
// ?K unused
// ?J unused
// ?I unused
// 915 !!
// 916 %INTEGER %FN CHECK YOUR MOVE(%RECORD(LISTF)%NAME LIST)
int CHECKYOURMOVE(struct LISTF * LIST) {
// 917 %RECORD(LISTF)%NAME L2, MM
struct LISTF *L2;
struct LISTF *MM;
// 918 %INTEGER I
int I;
// 919 MM == MMOVE_L
MM = (struct LISTF *)MMOVE.L;
// 920 L2 == LIST
L2 = (struct LISTF *)LIST;
// 921 %WHILE ADDR(LIST) # 0 %CYCLE
L_00E3:;
if (_imp_ADDR(LIST) == 0) goto L_00E4;
// 922 %IF LIST_FR = MM_FR %AND LIST_TO = MM_TO %C
if (LIST->FR != MM->FR) goto L_00E5;
if (LIST->TO != MM->TO) goto L_00E5;
// 923+ %START
// 924 MM_SCORE = LIST_SCORE; MM_CHK = LIST_CHK
MM->SCORE = LIST->SCORE;
MM->CHK = LIST->CHK;
// 925 %RESULT = 1
return 1;
// 926 %FINISH
L_00E5:;
// 927 LIST == LIST_L
LIST = (struct LISTF *)LIST->L;
// 928 %REPEAT
goto L_00E3;
L_00E4:;
// 929 %RESULT = 0
return 0;
// 930 %END
} /* end of CHECKYOURMOVE */
// ?I unused
// 931 !!
// 932 %INTEGERFN PRINT MOVES(%RECORD(LISTF)%NAME LIST)
int PRINTMOVES(struct LISTF * LIST) {
// 933 %RECORD(LISTF)%NAME L
struct LISTF *L;
// 934 SELECT OUTPUT(2)
_imp_SELECTOUTPUT(2);
// 935 LIST == RECORD(SORT AND PRUNE(LIST, 100, -1))
LIST = (struct LISTF *)_imp_RECORD(SORTANDPRUNE(LIST, 100, -1));
// 936 L == LIST
L = (struct LISTF *)LIST;
// 937 %CYCLE
L_00E6:;
// 938 PRINTMOVE(L); NEWLINE
PRINTMOVE(L);
_imp_NEWLINE();
// 939 L == L_L
L = (struct LISTF *)L->L;
// 940 %EXIT %IF ADDR(L) = 0
if (_imp_ADDR(L) != 0) goto L_00E7;
goto L_00E8;
L_00E7:;
// 941 %REPEAT
goto L_00E6;
L_00E8:;
// 942 SELECT OUTPUT(0)
_imp_SELECTOUTPUT(0);
// 943 %RESULT = ADDR(LIST)
return _imp_ADDR(LIST);
// 944 %END
} /* end of PRINTMOVES */
// 945
// 946 %ROUTINE YOUR MOVE
void YOURMOVE(void) {
// 947 %INTEGER %FN READM(%INTEGERNAME X, Y)
int READM(int *X, int *Y) {
// 948 %INTEGER I,J
int I;
int J;
// 949 SKIPSYMBOL %WHILE NEXTSYMBOL=NL
L_00E9:;
if (_imp_NEXTSYMBOL() != 10) goto L_00EA;
_imp_SKIPSYMBOL();
goto L_00E9;
L_00EA:;
// 950 READSYMBOL(I)
_imp_READSYMBOL(/*?*/ &I);
// 951 SKIPSYMBOL %WHILE NEXTSYMBOL=NL
L_00EB:;
if (_imp_NEXTSYMBOL() != 10) goto L_00EC;
_imp_SKIPSYMBOL();
goto L_00EB;
L_00EC:;
// 952 READSYMBOL(J)
_imp_READSYMBOL(/*?*/ &J);
// 953 X = I-'A'+1; Y = J-'0'
*X = I - 65 + 1;
*Y = J - 48;
// 954 %RESULT = 0
return 0;
// 955 %END
} /* end of READM */
// 956
// 957 %INTEGER I, X, Y, X0, Y0, K
int I;
int X;
int Y;
int X0;
int Y0;
int K;
// 958 %RECORD(LISTF)%NAME LIST
struct LISTF *LIST;
// 959 !!
// 960 JUST ONE PLY = 1; ! DONT ALLOW LOOK AHEAD (NO POINT)
JUSTONEPLY = 1;
// 961 LIST == RECORD(MOVES(-1, 0)); ! GET OPPS LEGAL MOVES
LIST = (struct LISTF *)_imp_RECORD(MOVES(-1, 0));
// 962 JUST ONE PLY = 0
JUSTONEPLY = 0;
// 963 %IF ADDR(LIST) = 0 %THEN TELL(LIST, -1); ! CHECKMATE
if (_imp_ADDR(LIST) != 0) goto L_00ED;
TELL(LIST, -1);
L_00ED:;
// 964 %IF MON&1#0 %THEN LIST == RECORD(PRINT MOVES(LIST))
if (MON & 1 == 0) goto L_00EE;
LIST = (struct LISTF *)_imp_RECORD(PRINTMOVES(LIST));
L_00EE:;
// 965 AGAIN:
U_1003:;
// 966 LM_SPEC = 0
LM.SPEC = 0;
// 967 %IF NEXTSYMBOL='M' %START; ! MONITOR
if (_imp_NEXTSYMBOL() != 77) goto L_00EF;
// 968 SKIPSYMBOL
_imp_SKIPSYMBOL();
// 969 PROMPT("MON?"); READ(MON); SKIPSYMBOL
PROMPT(_imp_str_literal("MON?"));
_imp_READ(/*?*/ &MON);
_imp_SKIPSYMBOL();
// 970 PROMPT("Move?")
PROMPT(_imp_str_literal("Move?"));
// 971 ->AGAIN
goto U_1003;
// 972 %FINISH
L_00EF:;
// 973 %IF NEXTSYMBOL='X' %START
if (_imp_NEXTSYMBOL() != 88) goto L_00F0;
// 974 SKIPSYMBOL; SKIPSYMBOL; !PPROFILE
_imp_SKIPSYMBOL();
_imp_SKIPSYMBOL();
// 975 %FINISH
L_00F0:;
// 976 %IF NEXTSYMBOL = 'P' %START
if (_imp_NEXTSYMBOL() != 80) goto L_00F1;
// 977 PROMPT("NEW PLY?"); SKIPSYMBOL
PROMPT(_imp_str_literal("NEW PLY?"));
_imp_SKIPSYMBOL();
// 978 READ(PDEPTH); SKIPSYMBOL
_imp_READ(/*?*/ &PDEPTH);
_imp_SKIPSYMBOL();
// 979 PROMPT("Move?")
PROMPT(_imp_str_literal("Move?"));
// 980 -> AGAIN
goto U_1003;
// 981 %FINISH
L_00F1:;
// 982 %IF NEXTSYMBOL='O' %START; ! CASTLE
if (_imp_NEXTSYMBOL() != 79) goto L_00F2;
// 983 X = 0
X = 0;
// 984 SKIPSYMBOL; READSYMBOL(I)
_imp_SKIPSYMBOL();
_imp_READSYMBOL(/*?*/ &I);
// 985 %IF I # '-' %THEN -> NO
if (I == 45) goto L_00F3;
goto U_1004;
L_00F3:;
// 986 READSYMBOL(I); -> NO %IF I#'O'
_imp_READSYMBOL(/*?*/ &I);
if (I == 79) goto L_00F4;
goto U_1004;
L_00F4:;
// 987 %IF NEXTSYMBOL = '-' %START; ! QUEEN SIDE
if (_imp_NEXTSYMBOL() != 45) goto L_00F5;
// 988 X = 1; SKIPSYMBOL; SKIPSYMBOL
X = 1;
_imp_SKIPSYMBOL();
_imp_SKIPSYMBOL();
// 989 %FINISH
L_00F5:;
// 990 LM_SPEC = 6+X
LM.SPEC = 6 + X;
// 991 LM_FR = 5<<4+1
LM.FR = (5 << 4) + 1;
// 992 LM_TO = 5<<4+1
LM.TO = (5 << 4) + 1;
// 993 %FINISHELSESTART
goto L_00F6;
L_00F2:;
// 994 I = READM(X, Y); I=READM(X0, Y0)
I = READM(/*?*/ &X, /*?*/ &Y);
I = READM(/*?*/ &X0, /*?*/ &Y0);
// 995 %IF NEXTSYMBOL='(' %START
if (_imp_NEXTSYMBOL() != 40) goto L_00F7;
// 996 SKIPSYMBOL; READSYMBOL(K); SKIPSYMBOL
_imp_SKIPSYMBOL();
_imp_READSYMBOL(/*?*/ &K);
_imp_SKIPSYMBOL();
// 997 LM_SPEC = (K-'0')*(-1)
LM.SPEC = (K - 48) * (-1);
// 998 %FINISH
L_00F7:;
// 999
// 1000 %UNLESS 0<X<9 %AND 0<X0<9 %AND %C
{
// Double-sided test on X (Part I)
int tmp;
if (0 >= (tmp = X)) goto L_0089;
// Double-sided test on X (Part II)
if (tmp >= 9) goto L_0089;
}
{
// Double-sided test on X0 (Part I)
int tmp;
if (0 >= (tmp = X0)) goto L_0089;
// Double-sided test on X0 (Part II)
if (tmp >= 9) goto L_0089;
}
{
// Double-sided test on Y (Part I)
int tmp;
if (0 >= (tmp = Y)) goto L_0089;
// Double-sided test on Y (Part II)
if (tmp >= 9) goto L_0089;
}
{
// Double-sided test on Y0 (Part I)
int tmp;
if (0 >= (tmp = Y0)) goto L_0089;
// Double-sided test on Y0 (Part II)
if (tmp < 9) goto L_00F8;
}
L_0089:;
// 1001+ 0<Y<9 %AND 0<Y0<9 %START
// 1002 NO: PRINTSTRING("INVALID MOVE - MY FORMAT IS D2D4
U_1004:;
_imp_PRINTSTRING(_imp_str_literal("INVALID MOVE - MY FORMAT IS D2D4\n"));
// 1003+ ")
// 1004 %CYCLE
L_00F9:;
// 1005 READSYMBOL(I)
_imp_READSYMBOL(/*?*/ &I);
// 1006 %EXIT %IF I=NL
if (I != 10) goto L_00FA;
goto L_00FB;
L_00FA:;
// 1007 %REPEAT
goto L_00F9;
L_00FB:;
// 1008 ->AGAIN
goto U_1003;
// 1009 %FINISH
L_00F8:;
// 1010
// 1011 !!
// 1012 LM_FR = X<<4+Y
LM.FR = (X << 4) + Y;
// 1013 LM_TO = X0<<4+Y0
LM.TO = (X0 << 4) + Y0;
// 1014 %FINISH
L_00F6:;
// 1015 MMOVE_L == LM
MMOVE.L = (struct LISTF *)/*?*/ &LM;
// 1016 %IF CHECK YOUR MOVE(LIST) = 0 %THEN ->NO
if (CHECKYOURMOVE(LIST) != 0) goto L_00FC;
goto U_1004;
L_00FC:;
// 1017 SKIPSYMBOL
_imp_SKIPSYMBOL();
// 1018 RELEASE CHAIN(LIST)
RELEASECHAIN(LIST);
// 1019 %END
return;
} /* end of YOURMOVE */
// 1020 %ENDOFPROGRAM
_imp_stop(0);
return 0;
end_0:;
}