#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:;
}