#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %EXTERNALROUTINE BACKGAMMON (%STRING(255) ST)

void BACKGAMMON(_imp_string255 ST) {
  //     2   %OWNINTEGER BBOFF,WBOFF,DICE1,DICE2,BARFL,BRDVAL,BSTVAL,COMPVAL

  static int BBOFF;
  static int WBOFF;
  static int DICE1;
  static int DICE2;
  static int BARFL;
  static int BRDVAL;
  static int BSTVAL;
  static int COMPVAL;

  //     3   %OWNINTEGER M1,M2,M3,M4,V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,I,J,K,RUNNING

  static int M1;
  static int M2;
  static int M3;
  static int M4;
  static int V1;
  static int V2;
  static int V3;
  static int V4;
  static int V5;
  static int V6;
  static int V7;
  static int V8;
  static int V9;
  static int V10;
  static int I;
  static int J;
  static int K;
  static int RUNNING;

  //     4   %OWNINTEGER NOMOV,BARPT1,BARPT2,PT1,PT2,L,M,N,TEMP,BSTMOV1,BSTMOV2

  static int NOMOV;
  static int BARPT1;
  static int BARPT2;
  static int PT1;
  static int PT2;
  static int L;
  static int M;
  static int N;
  static int TEMP;
  static int BSTMOV1;
  static int BSTMOV2;

  //     5   %OWNINTEGER BSTPT1,BSTPT2,W1,W2,W3,W4,W5,W6,W7,W8,W9,W10

  static int BSTPT1;
  static int BSTPT2;
  static int W1;
  static int W2;
  static int W3;
  static int W4;
  static int W5;
  static int W6;
  static int W7;
  static int W8;
  static int W9;
  static int W10;

  //     6   %OWNINTEGER SECOND,BV1,BV2,BV3,BV4,BV5,BV6,BV7,BV8,BV9,BV10

  static int SECOND;
  static int BV1;
  static int BV2;
  static int BV3;
  static int BV4;
  static int BV5;
  static int BV6;
  static int BV7;
  static int BV8;
  static int BV9;
  static int BV10;

  //     7   %CONSTINTEGERARRAY ODDS(1:12)=35,38,44,47,47,53,18,21,15,12,6,9

  const int ODDS[12] = {35, 38, 44, 47, 47, 53, 18, 21, 15, 12, 6, 9};

  //     8   %RECORDFORMAT F(%INTEGER WS,BS)

  struct F {
    union {
      struct {
        int WS;
        int BS;
      };
    };
  };

  //     9   %OWNRECORD(f)%ARRAY BOARD(0:25){(F)}

  static struct F BOARD[26];

  //    10   %OWNINTEGER G,H,PT3,PT4,DICE3,DICE4,BSTPT3,BSTPT4,BARPT3,BARPT4

  static int G;
  static int H;
  static int PT3;
  static int PT4;
  static int DICE3;
  static int DICE4;
  static int BSTPT3;
  static int BSTPT4;
  static int BARPT3;
  static int BARPT4;

  //    11   %INTEGERFN HOMEB

  int HOMEB(void) {
    //    12   %INTEGER NO,I

    int NO;
    int I;

    //    13   NO=BBOFF

    NO = BBOFF;

    //    14   %CYCLE I=1,1,6

    // %for I = 1, 1, 6 %cycle
    {
      I = 0;
    L_0001:
      if (I == 6) goto L_0002;
      I += 1;

      //    15       NO=NO+BOARD(I)_BS

      NO = NO + BOARD[I].BS;

      //    16   %REPEAT

      goto L_0001;
    }

  L_0002:;

  //    17   %IF NO=15 %THENRESULT = 1 %ELSERESULT = 0

    if (NO != 15) goto L_0004;
    return 1;
  L_0004:;
    return 0;

    //    18   %END

  } /* end of HOMEB */

  //    19
  //    20   %ROUTINE DOBLACK

  void DOBLACK(void) {
    //    21   %INTEGER PT,NO,M,D1,D2,D3,D4,TOT

    int PT;
    int NO;
    int M;
    int D1;
    int D2;
    int D3;
    int D4;
    int TOT;

    //    22     PROMPT ("Point:")

    _imp_PROMPT(_imp_str_literal_size(15, "Point:"));

    //    23   %CYCLE

  L_0005:;

  //    24      READ(D1); READ(D2)

    _imp_READ(/*?*/ &D1);
    _imp_READ(/*?*/ &D2);

    //    25      %IF D1>6 %OR D2>6 %THEN PRINTSTRING("No way") %AND NEWLINE %ELSEEXIT

    if (D1 > 6) goto L_0006;
    if (D2 <= 6) goto L_0007;
  L_0006:;
    _imp_PRINTSTRING(_imp_str_literal("No way"));
    _imp_NEWLINE();
    goto L_0008;
  L_0007:;
    goto L_0009;
  L_0008:;

  //    26   %REPEAT

    goto L_0005;
  L_0009:;

  //    27   %IF D1=D2 %THEN D3=D1 %AND D4=D2 %ELSE D3=0 %AND D4=0

    if (D1 != D2) goto L_000A;
    D3 = D1;
    D4 = D2;
    goto L_000B;
  L_000A:;
    D3 = 0;
    D4 = 0;
  L_000B:;

  //    28   PRINTSTRING("Your throw was")

    _imp_PRINTSTRING(_imp_str_literal("Your throw was"));

    //    29   WRITE(D1,2); WRITE(D2,2)

    _imp_WRITE(D1, 2);
    _imp_WRITE(D2, 2);

    //    30   NEWLINE

    _imp_NEWLINE();

    //    31   %IF BOARD(25)_BS>0 %THENSTART

    if (BOARD[25].BS <= 0) goto L_000C;

      //    32      %IF BOARD(25-D1)_WS>1 %AND BOARD(25-D2)_WS>1 %C

    if (BOARD[25 - D1].WS <= 1) goto L_000D;
    if (BOARD[25 - D2].WS <= 1) goto L_000D;
    _imp_PRINTSTRING(_imp_str_literal("You cannot move"));
    _imp_NEWLINE();
    return;
  L_000D:;

  //    33+        %THEN PRINTSTRING("You cannot move") %AND NEWLINE %ANDRETURN
  //    34      %IF BOARD(25)_BS#1 %THENSTART

    if (BOARD[25].BS == 1) goto L_000E;

      //    35         %IF D1#D2 %THENSTART

    if (D1 == D2) goto L_000F;

      //    36            %IF BOARD(25-D1)_WS>1 %THENSTART

    if (BOARD[25 - D1].WS <= 1) goto L_0010;

      //    37               BOARD(25-D2)_BS=BOARD(25-D2)_BS+1

    BOARD[25 - D2].BS = BOARD[25 - D2].BS + 1;

    //    38               BOARD(25)_BS=BOARD(25)_BS-1

    BOARD[25].BS = BOARD[25].BS - 1;

    //    39               BOARD(25-D2)_WS=0

    BOARD[25 - D2].WS = 0;

    //    40               BOARD(0)_WS=BOARD(0)_WS+1

    BOARD[0].WS = BOARD[0].WS + 1;

    //    41               PRINTSTRING("I have made your move")

    _imp_PRINTSTRING(_imp_str_literal("I have made your move"));

    //    42               NEWLINE

    _imp_NEWLINE();

    //    43               %RETURN

    return;

    //    44            %FINISH

  L_0010:;

  //    45            %IF BOARD(25-D2)_WS>1 %THENSTART

    if (BOARD[25 - D2].WS <= 1) goto L_0011;

      //    46               BOARD(25-D1)_BS=BOARD(25-D1)_BS+1

    BOARD[25 - D1].BS = BOARD[25 - D1].BS + 1;

    //    47               BOARD(25)_BS=BOARD(25)_BS-1

    BOARD[25].BS = BOARD[25].BS - 1;

    //    48               BOARD(25-D1)_WS=0

    BOARD[25 - D1].WS = 0;

    //    49               BOARD(0)_WS=BOARD(0)_WS+1

    BOARD[0].WS = BOARD[0].WS + 1;

    //    50               PRINTSTRING("I have made your move")

    _imp_PRINTSTRING(_imp_str_literal("I have made your move"));

    //    51               NEWLINE

    _imp_NEWLINE();

    //    52               %RETURN

    return;

    //    53            %FINISH

  L_0011:;

  //    54         %FINISH

  L_000F:;

  //    55      %FINISH

  L_000E:;

  //    56   %FINISH

  L_000C:;

  //    57   PRINTSTRING("Make your move"); NEWLINE

    _imp_PRINTSTRING(_imp_str_literal("Make your move"));
    _imp_NEWLINE();

    //    58   %CYCLE M=1,1,4

    // %for M = 1, 1, 4 %cycle
    {
      M = 0;
    L_0012:
      if (M == 4) goto L_0013;
      M += 1;

      //    59  AGN: TOT=D1+D2+D3+D4

    U_1000:;
      TOT = D1 + D2 + D3 + D4;

      //    60   %IF TOT=0 %THENRETURN

      if (TOT != 0) goto L_0014;
      return;
    L_0014:;

    //    61   READ(PT); %IF PT=100 %THENRETURN; READ(NO)

      _imp_READ(/*?*/ &PT);
      if (PT != 100) goto L_0015;
      return;
    L_0015:;
      _imp_READ(/*?*/ &NO);

      //    62   %IF BOARD(PT)_BS=0 %THEN PRINTSTRING("No blacks on point") %C

      if (BOARD[PT].BS != 0) goto L_0016;
      _imp_PRINTSTRING(_imp_str_literal("No blacks on point"));
      _imp_NEWLINE();
      goto U_1000;
    L_0016:;

    //    63+     %AND NEWLINE %AND ->AGN
    //    64   %IF BOARD(25)_BS#0 %AND PT#25 %THEN %C

      if (BOARD[25].BS == 0) goto L_0017;
      if (PT == 25) goto L_0017;
      _imp_PRINTSTRING(_imp_str_literal("You have pieces on the bar"));
      _imp_NEWLINE();
      goto U_1000;
    L_0017:;

    //    65+     PRINTSTRING("You have pieces on the bar") %AND NEWLINE %AND ->AGN
    //    66   %IF PT-NO<=0 %THENSTART

      if (PT - NO > 0) goto L_0018;

        //    67      %IF HOMEB=0 %THEN PRINTSTRING("Not all home") %AND %C

      if (HOMEB() != 0) goto L_0019;
      _imp_PRINTSTRING(_imp_str_literal("Not all home"));
      _imp_NEWLINE();
      goto U_1000;
    L_0019:;

    //    68+        NEWLINE %AND ->AGN; ->LEGMOV

      goto U_1001;

      //    69   %FINISH

    L_0018:;

    //    70   %IF BOARD(PT-NO)_WS>1 %THEN PRINTSTRING("White has point") %C

      if (BOARD[PT - NO].WS <= 1) goto L_001A;
      _imp_PRINTSTRING(_imp_str_literal("White has point"));
      _imp_NEWLINE();
      goto U_1000;
    L_001A:;

    //    71+     %AND NEWLINE %AND ->AGN
    //    72  LEGMOV: %IF NO=D1 %THEN D1=0 %ELSESTART

    U_1001:;
      if (NO != D1) goto L_001B;
      D1 = 0;
      goto L_001C;
    L_001B:;

    //    73      %IF NO=D2 %THEN D2=0 %ELSESTART

      if (NO != D2) goto L_001D;
      D2 = 0;
      goto L_001E;
    L_001D:;

    //    74         %IF NO=D3 %THEN D3=0 %ELSESTART

      if (NO != D3) goto L_001F;
      D3 = 0;
      goto L_0020;
    L_001F:;

    //    75            %IF NO=D4 %THEN D4=0 %ELSESTART

      if (NO != D4) goto L_0021;
      D4 = 0;
      goto L_0022;
    L_0021:;

    //    76               PRINTSTRING("Illegal move"); NEWLINE; ->AGN

      _imp_PRINTSTRING(_imp_str_literal("Illegal move"));
      _imp_NEWLINE();
      goto U_1000;

      //    77            %FINISH

    L_0022:;

    //    78         %FINISH

    L_0020:;

    //    79      %FINISH

    L_001E:;

    //    80   %FINISH

    L_001C:;

    //    81   %IF PT-NO <=0 %THEN ->BBEARO

      if (PT - NO > 0) goto L_0023;
      goto U_1002;
    L_0023:;

    //    82   BOARD(PT)_BS=BOARD(PT)_BS-1

      BOARD[PT].BS = BOARD[PT].BS - 1;

      //    83   BOARD(PT-NO)_BS=BOARD(PT-NO)_BS+1

      BOARD[PT - NO].BS = BOARD[PT - NO].BS + 1;

      //    84   %IF BOARD(PT-NO)_WS=1 %THEN BOARD(PT-NO)_WS=0 %C

      if (BOARD[PT - NO].WS != 1) goto L_0024;
      BOARD[PT - NO].WS = 0;
      BOARD[0].WS = BOARD[0].WS + 1;
    L_0024:;

    //    85+     %AND BOARD(0)_WS=BOARD(0)_WS+1
    //    86   ->SKP

      goto U_1003;

      //    87  BBEARO: BBOFF=BBOFF+1

    U_1002:;
      BBOFF = BBOFF + 1;

      //    88   BOARD(PT)_BS=BOARD(PT)_BS-1

      BOARD[PT].BS = BOARD[PT].BS - 1;

      //    89   %IF BBOFF=15 %THENRETURN

      if (BBOFF != 15) goto L_0025;
      return;
    L_0025:;

    //    90  SKP: %REPEAT

    U_1003:;
      goto L_0012;
    }

  L_0013:;

  //    91   %END

    return;
  } /* end of DOBLACK */

  //    92
  //    93   %ROUTINE INITIALIZE

  void INITIALIZE(void) {
    //    94   WBOFF=0

    WBOFF = 0;

    //    95   BBOFF=0

    BBOFF = 0;

    //    96   BOARD(1)_WS=2

    BOARD[1].WS = 2;

    //    97   BOARD(6)_BS=5

    BOARD[6].BS = 5;

    //    98   BOARD(8)_BS=3

    BOARD[8].BS = 3;

    //    99   BOARD(12)_WS=5

    BOARD[12].WS = 5;

    //   100   BOARD(13)_BS=5

    BOARD[13].BS = 5;

    //   101   BOARD(17)_WS=3

    BOARD[17].WS = 3;

    //   102   BOARD(19)_WS=5

    BOARD[19].WS = 5;

    //   103   BOARD(24)_BS=2

    BOARD[24].BS = 2;

    //   104   %END

    return;
  } /* end of INITIALIZE */

  //   105
  //   106   %ROUTINE PRINTSTATE

  void PRINTSTATE(void) {
    //   107   %INTEGER I,J,K,M

    int I;
    int J;
    int K;
    int M;

    //   108   NEWLINES(2)

    _imp_NEWLINES(2);

    //   109   PRINTSTRING(" 12  11  10   9   8   7      6   5   4   3   2   1")

    _imp_PRINTSTRING(_imp_str_literal(" 12  11  10   9   8   7      6   5   4   3   2   1"));

    //   110   NEWLINE

    _imp_NEWLINE();

    //   111   PRINTSTRING("___________________________________________________")

    _imp_PRINTSTRING(_imp_str_literal("___________________________________________________"));

    //   112   %CYCLE I=0,1,6

    // %for I = 0, 1, 6 %cycle
    {
      I = -1;
    L_0026:
      if (I == 6) goto L_0027;
      I += 1;

      //   113      NEWLINE

      _imp_NEWLINE();

      //   114      SPACES(2)

      _imp_SPACES(2);

      //   115      %CYCLE J=12,-1,1

      // %for J = 12,  -1, 1 %cycle
      {
        J = 13;
      L_0028:
        if (J == 1) goto L_0029;
        J -= 1;

        //   116         %IF BOARD(J)_WS>I %THEN PRINTSYMBOL('W') %AND ->RPT

        if (BOARD[J].WS <= I) goto L_002B;
        _imp_PRINTSYMBOL(87);
        goto U_1004;
      L_002B:;

      //   117         %IF BOARD(J)_BS>I %THEN PRINTSYMBOL('B') %AND ->RPT

        if (BOARD[J].BS <= I) goto L_002C;
        _imp_PRINTSYMBOL(66);
        goto U_1004;
      L_002C:;

      //   118         SPACE

        _imp_SPACE();

        //   119  RPT:   %IF J=7 %THEN PRINTSTRING("  **  ") %ELSE SPACES(3)

      U_1004:;
        if (J != 7) goto L_002D;
        _imp_PRINTSTRING(_imp_str_literal("  **  "));
        goto L_002E;
      L_002D:;
        _imp_SPACES(3);
      L_002E:;

      //   120      %REPEAT

        goto L_0028;
      }

    L_0029:;

    //   121   %REPEAT

      goto L_0026;
    }

  L_0027:;

  //   122   %CYCLE K=6,-1,0

  // %for K = 6,  -1, 0 %cycle
    {
      K = 7;
    L_002F:
      if (K == 0) goto L_0030;
      K -= 1;

      //   123      NEWLINE

      _imp_NEWLINE();

      //   124      SPACES(2)

      _imp_SPACES(2);

      //   125      %CYCLE M=13,1,24

      // %for M = 13, 1, 24 %cycle
      {
        M = 12;
      L_0031:
        if (M == 24) goto L_0032;
        M += 1;

        //   126         %IF BOARD(M)_WS>K %THEN PRINTSYMBOL('W') %AND ->RPT2

        if (BOARD[M].WS <= K) goto L_0033;
        _imp_PRINTSYMBOL(87);
        goto U_1005;
      L_0033:;

      //   127         %IF BOARD(M)_BS>K %THEN PRINTSYMBOL('B') %AND ->RPT2

        if (BOARD[M].BS <= K) goto L_0034;
        _imp_PRINTSYMBOL(66);
        goto U_1005;
      L_0034:;

      //   128         SPACE

        _imp_SPACE();

        //   129  RPT2:  %IF M=18 %THEN PRINTSTRING("  **  ") %ELSE SPACES(3)

      U_1005:;
        if (M != 18) goto L_0035;
        _imp_PRINTSTRING(_imp_str_literal("  **  "));
        goto L_0036;
      L_0035:;
        _imp_SPACES(3);
      L_0036:;

      //   130      %REPEAT

        goto L_0031;
      }

    L_0032:;

    //   131   %REPEAT

      goto L_002F;
    }

  L_0030:;

  //   132   NEWLINE

    _imp_NEWLINE();

    //   133   PRINTSTRING("____________________________________________________")

    _imp_PRINTSTRING(_imp_str_literal("____________________________________________________"));

    //   134   NEWLINE

    _imp_NEWLINE();

    //   135   PRINTSTRING(" 13  14  15  16  17  18      19  20  21  22  23  24")

    _imp_PRINTSTRING(_imp_str_literal(" 13  14  15  16  17  18      19  20  21  22  23  24"));

    //   136   NEWLINE

    _imp_NEWLINE();

    //   137   %IF BOARD(0)_WS>0 %THENSTART

    if (BOARD[0].WS <= 0) goto L_0037;

      //   138      NEWLINE

    _imp_NEWLINE();

    //   139      PRINTSTRING("There are")

    _imp_PRINTSTRING(_imp_str_literal("There are"));

    //   140      WRITE(BOARD(0)_WS,2)

    _imp_WRITE(BOARD[0].WS, 2);

    //   141      PRINTSTRING(" whites on the bar")

    _imp_PRINTSTRING(_imp_str_literal(" whites on the bar"));

    //   142   %FINISH

  L_0037:;

  //   143   %IF BOARD(25)_BS>0 %THENSTART

    if (BOARD[25].BS <= 0) goto L_0038;

      //   144      NEWLINE

    _imp_NEWLINE();

    //   145      PRINTSTRING("there are")

    _imp_PRINTSTRING(_imp_str_literal("there are"));

    //   146      WRITE(BOARD(25)_BS,2)

    _imp_WRITE(BOARD[25].BS, 2);

    //   147      PRINTSTRING(" blacks on the bar")

    _imp_PRINTSTRING(_imp_str_literal(" blacks on the bar"));

    //   148   %FINISH

  L_0038:;

  //   149   %IF WBOFF>0 %THENSTART

    if (WBOFF <= 0) goto L_0039;

      //   150      NEWLINE

    _imp_NEWLINE();

    //   151      PRINTSTRING("white has born off")

    _imp_PRINTSTRING(_imp_str_literal("white has born off"));

    //   152      WRITE(WBOFF,3)

    _imp_WRITE(WBOFF, 3);

    //   153   %FINISH

  L_0039:;

  //   154   %IF BBOFF>0 %THENSTART

    if (BBOFF <= 0) goto L_003A;

      //   155      NEWLINE

    _imp_NEWLINE();

    //   156      PRINTSTRING("black has born off")

    _imp_PRINTSTRING(_imp_str_literal("black has born off"));

    //   157      WRITE(BBOFF,3)

    _imp_WRITE(BBOFF, 3);

    //   158   %FINISH

  L_003A:;

  //   159   NEWLINE

    _imp_NEWLINE();

    //   160   %END

    return;
  } /* end of PRINTSTATE */

  //   161
  //   162   %INTEGERFN BBAR

  int BBAR(void) {
    //   163   %RESULT = BOARD(25)_BS

    return BOARD[25].BS;

    //   164   %END

  } /* end of BBAR */

  //   165
  //   166   %INTEGERFN WBAR

  int WBAR(void) {
    //   167   %RESULT = BOARD(0)_WS

    return BOARD[0].WS;

    //   168   %END

  } /* end of WBAR */

  //   169
  //   170   %INTEGERFN BSIN

  int BSIN(void) {
    //   171   %INTEGER I,J; J=0

    int I;
    int J;
    J = 0;

    //   172   %CYCLE I=1,1,25

    // %for I = 1, 1, 25 %cycle
    {
      I = 0;
    L_003B:
      if (I == 25) goto L_003C;
      I += 1;

      //   173      %IF BOARD(I)_BS=1 %THEN J=J+1

      if (BOARD[I].BS != 1) goto L_003D;
      J = J + 1;
    L_003D:;

    //   174   %REPEAT

      goto L_003B;
    }

  L_003C:;

  //   175   %RESULT = J

    return J;

    //   176   %END

  } /* end of BSIN */

  //   177
  //   178   %INTEGERFN WSIN

  int WSIN(void) {
    //   179   %INTEGER I,J; J=0

    int I;
    int J;
    J = 0;

    //   180   %CYCLE I=0,1,24

    // %for I = 0, 1, 24 %cycle
    {
      I = -1;
    L_003E:
      if (I == 24) goto L_003F;
      I += 1;

      //   181      %IF BOARD(I)_WS=1 %THEN J=J+1

      if (BOARD[I].WS != 1) goto L_0040;
      J = J + 1;
    L_0040:;

    //   182   %REPEAT

      goto L_003E;
    }

  L_003F:;

  //   183   %RESULT = J

    return J;

    //   184   %END

  } /* end of WSIN */

  //   185
  //   186   %INTEGERFN BSINCL

  int BSINCL(void) {
    //   187   %INTEGER I,J,K,SUM; SUM=0

    int I;
    int J;
    int K;
    int SUM;
    SUM = 0;

    //   188   %CYCLE I=25,-1,1

    // %for I = 25,  -1, 1 %cycle
    {
      I = 26;
    L_0041:
      if (I == 1) goto L_0042;
      I -= 1;

      //   189      %IF BOARD(I)_BS=1 %THENSTART

      if (BOARD[I].BS != 1) goto L_0043;

        //   190      %IF I-12<0 %THEN J=0 %ELSE J=I-12

      if (I - 12 >= 0) goto L_0044;
      J = 0;
      goto L_0045;
    L_0044:;
      J = I - 12;
    L_0045:;

    //   191      %CYCLE K=I-1,-1,J

    // %for K = I - 1,  -1, J %cycle
      {
        int _initial = I - 1, _final = J;
        if (invalid_for_loop(_initial, -1, _final)) _imp_signal(5, 1, 0, "Illegal cycle K = I - 1,  -1, J");
        K = _initial - (-1);
      L_0046:
        if (K == _final) goto L_0047;
        K -= 1;

        //   192         %IF BOARD(K)_WS>0 %THEN SUM=SUM+ODDS(I-K)

        if (BOARD[K].WS <= 0) goto L_0049;
        SUM = SUM + ODDS[I - K - 1];
      L_0049:;

      //   193      %REPEAT

        goto L_0046;
      }

    L_0047:;

    //   194      %FINISH

    L_0043:;

    //   195   %REPEAT

      goto L_0041;
    }

  L_0042:;

  //   196   %RESULT = SUM

    return SUM;

    //   197   %END

  } /* end of BSINCL */

  //   198
  //   199   %INTEGERFN WSINCL

  int WSINCL(void) {
    //   200   %INTEGER I,J,K,SUM; SUM=0

    int I;
    int J;
    int K;
    int SUM;
    SUM = 0;

    //   201   %CYCLE I=0,1,24

    // %for I = 0, 1, 24 %cycle
    {
      I = -1;
    L_004A:
      if (I == 24) goto L_004B;
      I += 1;

      //   202      %IF BOARD(I)_WS=1 %THENSTART

      if (BOARD[I].WS != 1) goto L_004C;

        //   203      %IF I+12>25 %THEN J=25 %ELSE J=I+12

      if (I + 12 <= 25) goto L_004D;
      J = 25;
      goto L_004E;
    L_004D:;
      J = I + 12;
    L_004E:;

    //   204      %CYCLE K=I+1,1,J

    // %for K = I + 1, 1, J %cycle
      {
        int _initial = I + 1, _final = J;
        if (invalid_for_loop(_initial, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle K = I + 1, 1, J");
        K = _initial - (1);
      L_004F:
        if (K == _final) goto L_0050;
        K += 1;

        //   205         %IF BOARD(K)_BS>0 %THEN SUM=SUM+ODDS(K-I)

        if (BOARD[K].BS <= 0) goto L_0051;
        SUM = SUM + ODDS[K - I - 1];
      L_0051:;

      //   206      %REPEAT

        goto L_004F;
      }

    L_0050:;

    //   207      %FINISH

    L_004C:;

    //   208   %REPEAT

      goto L_004A;
    }

  L_004B:;

  //   209   %RESULT = SUM

    return SUM;

    //   210   %END

  } /* end of WSINCL */

  //   211
  //   212   %INTEGERFN WPTSHOME

  int WPTSHOME(void) {
    //   213   %INTEGER I,J; J=0

    int I;
    int J;
    J = 0;

    //   214   %CYCLE I=19,1,24

    // %for I = 19, 1, 24 %cycle
    {
      I = 18;
    L_0052:
      if (I == 24) goto L_0053;
      I += 1;

      //   215      %IF BOARD(I)_WS>1 %THEN J=J+1

      if (BOARD[I].WS <= 1) goto L_0054;
      J = J + 1;
    L_0054:;

    //   216   %REPEAT

      goto L_0052;
    }

  L_0053:;

  //   217   %RESULT = J

    return J;

    //   218   %END

  } /* end of WPTSHOME */

  //   219
  //   220   %INTEGERFN BPTSHOME

  int BPTSHOME(void) {
    //   221   %INTEGER I,J; J=0

    int I;
    int J;
    J = 0;

    //   222   %CYCLE I=1,1,6

    // %for I = 1, 1, 6 %cycle
    {
      I = 0;
    L_0055:
      if (I == 6) goto L_0056;
      I += 1;

      //   223      %IF BOARD(I)_BS>1 %THEN J=J+1

      if (BOARD[I].BS <= 1) goto L_0057;
      J = J + 1;
    L_0057:;

    //   224   %REPEAT

      goto L_0055;
    }

  L_0056:;

  //   225   %RESULT = J

    return J;

    //   226   %END

  } /* end of BPTSHOME */

  //   227
  //   228   %INTEGERFN WPTS

  int WPTS(void) {
    //   229   %INTEGER I,J; J=0

    int I;
    int J;
    J = 0;

    //   230   %CYCLE I=1,1,24

    // %for I = 1, 1, 24 %cycle
    {
      I = 0;
    L_0058:
      if (I == 24) goto L_0059;
      I += 1;

      //   231      %IF BOARD(I)_WS>1 %THEN J=J+1

      if (BOARD[I].WS <= 1) goto L_005A;
      J = J + 1;
    L_005A:;

    //   232   %REPEAT

      goto L_0058;
    }

  L_0059:;

  //   233   %RESULT = J

    return J;

    //   234   %END

  } /* end of WPTS */

  //   235
  //   236   %INTEGERFN BPTS

  int BPTS(void) {
    //   237   %INTEGER I,J;J=0

    int I;
    int J;
    J = 0;

    //   238   %CYCLE I=1,1,24

    // %for I = 1, 1, 24 %cycle
    {
      I = 0;
    L_005B:
      if (I == 24) goto L_005C;
      I += 1;

      //   239      %IF BOARD(K)_BS>1 %THEN J=J+1

      if (BOARD[K].BS <= 1) goto L_005D;
      J = J + 1;
    L_005D:;

    //   240   %REPEAT

      goto L_005B;
    }

  L_005C:;

  //   241   %RESULT = J

    return J;

    //   242   %END

  } /* end of BPTS */

  //   243
  //   244   %INTEGERFN WPTSSUCC

  int WPTSSUCC(void) {
    //   245   %INTEGER I,J,K; K=0

    int I;
    int J;
    int K;
    K = 0;

    //   246   %CYCLE J=1,1,22

    // %for J = 1, 1, 22 %cycle
    {
      J = 0;
    L_005E:
      if (J == 22) goto L_005F;
      J += 1;

      //   247      %IF BOARD(J)_BS>0 %THENSTART

      if (BOARD[J].BS <= 0) goto L_0060;

        //   248         %CYCLE I=J+1,1,23

        // %for I = J + 1, 1, 23 %cycle
      {
        int _initial = J + 1;
        if (invalid_for_loop(_initial, 1, 23)) _imp_signal(5, 1, 0, "Illegal cycle I = J + 1, 1, 23");
        I = _initial - (1);
      L_0061:
        if (I == 23) goto L_0062;
        I += 1;

        //   249            %IF BOARD(I)_WS>1 %THENSTART

        if (BOARD[I].WS <= 1) goto L_0063;

          //   250               %IF BOARD(I+1)_WS>1 %THEN K=K+1

        if (BOARD[I + 1].WS <= 1) goto L_0064;
        K = K + 1;
      L_0064:;

      //   251            %FINISH

      L_0063:;

      //   252         %REPEAT

        goto L_0061;
      }

    L_0062:;

    //   253         %EXIT

      goto L_005F;

      //   254      %FINISH

    L_0060:;

    //   255   %REPEAT

      goto L_005E;
    }

  L_005F:;

  //   256   %RESULT = K

    return K;

    //   257   %END

  } /* end of WPTSSUCC */

  //   258
  //   259   %INTEGERFN BPTSSUCC

  int BPTSSUCC(void) {
    //   260   %INTEGER I,J,K; K=0

    int I;
    int J;
    int K;
    K = 0;

    //   261   %CYCLE J=24,-1,3

    // %for J = 24,  -1, 3 %cycle
    {
      J = 25;
    L_0065:
      if (J == 3) goto L_0066;
      J -= 1;

      //   262      %IF BOARD(J)_WS>0 %THENSTART

      if (BOARD[J].WS <= 0) goto L_0067;

        //   263         %CYCLE I=J-1,-1,2

        // %for I = J - 1,  -1, 2 %cycle
      {
        int _initial = J - 1;
        if (invalid_for_loop(_initial, -1, 2)) _imp_signal(5, 1, 0, "Illegal cycle I = J - 1,  -1, 2");
        I = _initial - (-1);
      L_0068:
        if (I == 2) goto L_0069;
        I -= 1;

        //   264            %IF BOARD(I)_BS>1 %THENSTART

        if (BOARD[I].BS <= 1) goto L_006A;

          //   265               %IF BOARD(I-1)_BS>1 %THEN K=K+1

        if (BOARD[I - 1].BS <= 1) goto L_006B;
        K = K + 1;
      L_006B:;

      //   266            %FINISH

      L_006A:;

      //   267         %REPEAT

        goto L_0068;
      }

    L_0069:;

    //   268         %EXIT

      goto L_0066;

      //   269      %FINISH

    L_0067:;

    //   270   %REPEAT

      goto L_0065;
    }

  L_0066:;

  //   271   %RESULT = K

    return K;

    //   272   %END

  } /* end of BPTSSUCC */

  //   273
  //   274   %INTEGERFN BFST3

  int BFST3(void) {
    //   275   %INTEGER I,J; J=0

    int I;
    int J;
    J = 0;

    //   276   %CYCLE I=22,1,25

    // %for I = 22, 1, 25 %cycle
    {
      I = 21;
    L_006C:
      if (I == 25) goto L_006D;
      I += 1;

      //   277      J=J+BOARD(I)_BS

      J = J + BOARD[I].BS;

      //   278   %REPEAT

      goto L_006C;
    }

  L_006D:;

  //   279   %RESULT = J

    return J;

    //   280   %END

  } /* end of BFST3 */

  //   281
  //   282   %INTEGERFN WFST3

  int WFST3(void) {
    //   283   %INTEGER I,J; J=0

    int I;
    int J;
    J = 0;

    //   284   %CYCLE I=0,1,3

    // %for I = 0, 1, 3 %cycle
    {
      I = -1;
    L_006E:
      if (I == 3) goto L_006F;
      I += 1;

      //   285      J=J+BOARD(I)_WS

      J = J + BOARD[I].WS;

      //   286   %REPEAT

      goto L_006E;
    }

  L_006F:;

  //   287   %RESULT = J

    return J;

    //   288   %END

  } /* end of WFST3 */

  //   289
  //   290   %INTEGERFN BFST6

  int BFST6(void) {
    //   291   %INTEGER I,J; J=0

    int I;
    int J;
    J = 0;

    //   292   %CYCLE I=19,1,25

    // %for I = 19, 1, 25 %cycle
    {
      I = 18;
    L_0070:
      if (I == 25) goto L_0071;
      I += 1;

      //   293      J=J+BOARD(I)_BS

      J = J + BOARD[I].BS;

      //   294   %REPEAT

      goto L_0070;
    }

  L_0071:;

  //   295   %RESULT = J

    return J;

    //   296   %END

  } /* end of BFST6 */

  //   297
  //   298   %INTEGERFN WFST6

  int WFST6(void) {
    //   299   %INTEGER I,J; J=0

    int I;
    int J;
    J = 0;

    //   300   %CYCLE I=0,1,6

    // %for I = 0, 1, 6 %cycle
    {
      I = -1;
    L_0072:
      if (I == 6) goto L_0073;
      I += 1;

      //   301      J=J+BOARD(I)_WS

      J = J + BOARD[I].WS;

      //   302   %REPEAT

      goto L_0072;
    }

  L_0073:;

  //   303   %RESULT = J

    return J;

    //   304   %END

  } /* end of WFST6 */

  //   305
  //   306   %INTEGERFN BFST12

  int BFST12(void) {
    //   307   %INTEGER I,J

    int I;
    int J;

    //   308   J=BFST6

    J = BFST6();

    //   309   %CYCLE I=13,1,18

    // %for I = 13, 1, 18 %cycle
    {
      I = 12;
    L_0074:
      if (I == 18) goto L_0075;
      I += 1;

      //   310      J=J+BOARD(I)_BS

      J = J + BOARD[I].BS;

      //   311   %REPEAT

      goto L_0074;
    }

  L_0075:;

  //   312   %RESULT = J

    return J;

    //   313   %END

  } /* end of BFST12 */

  //   314
  //   315   %INTEGERFN WFST12

  int WFST12(void) {
    //   316   %INTEGER I,J

    int I;
    int J;

    //   317   J=WFST6

    J = WFST6();

    //   318   %CYCLE I=7,1,12

    // %for I = 7, 1, 12 %cycle
    {
      I = 6;
    L_0076:
      if (I == 12) goto L_0077;
      I += 1;

      //   319      J=BOARD(I)_WS+J

      J = BOARD[I].WS + J;

      //   320   %REPEAT

      goto L_0076;
    }

  L_0077:;

  //   321   %RESULT = J

    return J;

    //   322   %END

  } /* end of WFST12 */

  //   323
  //   324   %INTEGERFN WHOME

  int WHOME(void) {
    //   325   %INTEGER I,J; J=0

    int I;
    int J;
    J = 0;

    //   326   %CYCLE I=19,1,24

    // %for I = 19, 1, 24 %cycle
    {
      I = 18;
    L_0078:
      if (I == 24) goto L_0079;
      I += 1;

      //   327      J=J+BOARD(I)_WS

      J = J + BOARD[I].WS;

      //   328   %REPEAT

      goto L_0078;
    }

  L_0079:;

  //   329   %RESULT = J

    return J;

    //   330   %END

  } /* end of WHOME */

  //   331
  //   332   %INTEGERFN BHOME

  int BHOME(void) {
    //   333   %INTEGER I,J; J=0

    int I;
    int J;
    J = 0;

    //   334   %CYCLE I=1,1,6

    // %for I = 1, 1, 6 %cycle
    {
      I = 0;
    L_007A:
      if (I == 6) goto L_007B;
      I += 1;

      //   335      J=J+BOARD(I)_BS

      J = J + BOARD[I].BS;

      //   336   %REPEAT

      goto L_007A;
    }

  L_007B:;

  //   337   %RESULT = J

    return J;

    //   338   %END

  } /* end of BHOME */

  //   339
  //   340   %INTEGERFN WTOGO

  int WTOGO(void) {
    //   341   %INTEGER I,J,K,SUM; SUM=0

    int I;
    int J;
    int K;
    int SUM;
    SUM = 0;

    //   342   %CYCLE I=0,1,18

    // %for I = 0, 1, 18 %cycle
    {
      I = -1;
    L_007C:
      if (I == 18) goto L_007D;
      I += 1;

      //   343      J=BOARD(I)_WS

      J = BOARD[I].WS;

      //   344      %IF J>0 %THENSTART

      if (J <= 0) goto L_007E;

        //   345         %CYCLE K=1,1,J

        // %for K = 1, 1, J %cycle
      {
        int _final = J;
        if (invalid_for_loop(1, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle K = 1, 1, J");
        K = 0;
      L_007F:
        if (K == _final) goto L_0080;
        K += 1;

        //   346            SUM=SUM+19-I

        SUM = SUM + 19 - I;

        //   347         %REPEAT

        goto L_007F;
      }

    L_0080:;

    //   348      %FINISH

    L_007E:;

    //   349   %REPEAT

      goto L_007C;
    }

  L_007D:;

  //   350   %RESULT = SUM

    return SUM;

    //   351   %END

  } /* end of WTOGO */

  //   352
  //   353   %INTEGERFN BTOGO

  int BTOGO(void) {
    //   354   %INTEGER I,J,K,SUM; SUM=0

    int I;
    int J;
    int K;
    int SUM;
    SUM = 0;

    //   355   %CYCLE I=7,1,25

    // %for I = 7, 1, 25 %cycle
    {
      I = 6;
    L_0081:
      if (I == 25) goto L_0082;
      I += 1;

      //   356      J=BOARD(I)_BS

      J = BOARD[I].BS;

      //   357      %IF J>0 %THENSTART

      if (J <= 0) goto L_0083;

        //   358         %CYCLE K=1,1,J

        // %for K = 1, 1, J %cycle
      {
        int _final = J;
        if (invalid_for_loop(1, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle K = 1, 1, J");
        K = 0;
      L_0084:
        if (K == _final) goto L_0085;
        K += 1;

        //   359            SUM=SUM+I-6

        SUM = SUM + I - 6;

        //   360         %REPEAT

        goto L_0084;
      }

    L_0085:;

    //   361      %FINISH

    L_0083:;

    //   362   %REPEAT

      goto L_0081;
    }

  L_0082:;

  //   363   %RESULT = SUM

    return SUM;

    //   364   %END

  } /* end of BTOGO */

  //   365
  //   366   %ROUTINE GBRDVAL

  void GBRDVAL(void) {
    //   367   V1=W1*(BBAR-WBAR)

    V1 = W1 * (BBAR() - WBAR());

    //   368   V2=W2*(BSIN-WSIN)

    V2 = W2 * (BSIN() - WSIN());

    //   369   V3=W3*(BSINCL-WSINCL)//10

    V3 = ((long)(W3 * (BSINCL() - WSINCL())) / (long)10);

    //   370   V4=W4*(WPTSHOME-BPTSHOME)

    V4 = W4 * (WPTSHOME() - BPTSHOME());

    //   371   V5=W5*(WPTS-BPTS)

    V5 = W5 * (WPTS() - BPTS());

    //   372   V6=W6*(WPTSSUCC-BPTSSUCC)

    V6 = W6 * (WPTSSUCC() - BPTSSUCC());

    //   373   V7=W7*(BFST6-WFST6)

    V7 = W7 * (BFST6() - WFST6());

    //   374   V8=W8*(BTOGO//6-WTOGO//6)

    V8 = W8 * (((long)BTOGO() / (long)6) - ((long)WTOGO() / (long)6));

    //   375   V9=W9*(BFST3-WFST3)

    V9 = W9 * (BFST3() - WFST3());

    //   376   V10=W10*(WHOME-BHOME)

    V10 = W10 * (WHOME() - BHOME());

    //   377   BRDVAL=V1+V2+V3+V4+V5+V6+V7+V8+V9+V10

    BRDVAL = V1 + V2 + V3 + V4 + V5 + V6 + V7 + V8 + V9 + V10;

    //   378   %END

    return;
  } /* end of GBRDVAL */

  //   379
  //   380   %ROUTINE GBRD

  void GBRD(void) {
    //   381   V1=W1*(BBAR)

    V1 = W1 * BBAR();

    //   382   V2=W2*(-WSIN)

    V2 = W2 * -WSIN();

    //   383   V3=W3*(-WSINCL)//10

    V3 = ((long)(W3 * -WSINCL()) / (long)10);

    //   384   V4=W4*(WPTSHOME)

    V4 = W4 * WPTSHOME();

    //   385   V5=W5*(WPTS)

    V5 = W5 * WPTS();

    //   386   V6=W6*(WPTSSUCC)

    V6 = W6 * WPTSSUCC();

    //   387   V7=W7*(-WFST6)

    V7 = W7 * -WFST6();

    //   388   V8=W8*(-WTOGO)//6

    V8 = ((long)(W8 * -WTOGO()) / (long)6);

    //   389   V9=W9*(-WFST3)

    V9 = W9 * -WFST3();

    //   390   V10=W10*(WHOME)

    V10 = W10 * WHOME();

    //   391   BRDVAL=V1+V2+V3+V4+V5+V6+V7+V8+V9+V10

    BRDVAL = V1 + V2 + V3 + V4 + V5 + V6 + V7 + V8 + V9 + V10;

    //   392   %IF BRDVAL>BSTVAL %THENSTART

    if (BRDVAL <= BSTVAL) goto L_0086;

      //   393      BV1=V1; BV2=V2; BV3=V3; BV4=V4; BV5=V5; BV6=V6; BV7=V7; BV8=V8

    BV1 = V1;
    BV2 = V2;
    BV3 = V3;
    BV4 = V4;
    BV5 = V5;
    BV6 = V6;
    BV7 = V7;
    BV8 = V8;

    //   394      BV9=V9; BV10=V10; BSTVAL=BRDVAL; BSTMOV1=DICE1; BSTPT1=PT1

    BV9 = V9;
    BV10 = V10;
    BSTVAL = BRDVAL;
    BSTMOV1 = DICE1;
    BSTPT1 = PT1;

    //   395      BSTMOV2=DICE2; BSTPT2=PT2; BSTPT3=PT3; BSTPT4=PT4

    BSTMOV2 = DICE2;
    BSTPT2 = PT2;
    BSTPT3 = PT3;
    BSTPT4 = PT4;

    //   396   %FINISH

  L_0086:;

  //   397   %END

    return;
  } /* end of GBRD */

  //   398
  //   399
  //   400   %ROUTINE MTSTMOV (%INTEGER P,D,%INTEGERNAME BP)

  void MTSTMOV(int P, int D, int *BP) {
    //   401   BOARD(P)_WS=BOARD(P)_WS-1

    BOARD[P].WS = BOARD[P].WS - 1;

    //   402   BOARD(P+D)_WS=BOARD(P+D)_WS+1

    BOARD[P + D].WS = BOARD[P + D].WS + 1;

    //   403   %IF BOARD(P+D)_BS=1 %THEN BOARD(P+D)_BS=0 %C

    if (BOARD[P + D].BS != 1) goto L_0087;
    BOARD[P + D].BS = 0;
    BOARD[25].BS = BOARD[25].BS + 1;
    *BP = 1;
  L_0087:;

  //   404+     %AND BOARD(25)_BS=BOARD(25)_BS+1 %AND BP=1
  //   405   %END

    return;
  } /* end of MTSTMOV */

  //   406
  //   407   %ROUTINE CLTSTMOV (%INTEGER P,D,%INTEGERNAME BP)

  void CLTSTMOV(int P, int D, int *BP) {
    //   408   BOARD(P)_WS=BOARD(P)_WS+1

    BOARD[P].WS = BOARD[P].WS + 1;

    //   409   BOARD(P+D)_WS=BOARD(P+D)_WS-1

    BOARD[P + D].WS = BOARD[P + D].WS - 1;

    //   410   %IF BP=1 %THEN BOARD(P+D)_BS=1 %AND BOARD(25)_BS=BOARD(25)_BS-1 %C

    if (*BP != 1) goto L_0088;
    BOARD[P + D].BS = 1;
    BOARD[25].BS = BOARD[25].BS - 1;
    *BP = 0;
  L_0088:;

  //   411+     %AND BP=0
  //   412   %END

    return;
  } /* end of CLTSTMOV */

  //   413
  //   414   %ROUTINE MMOVE (%INTEGER P,D)

  void MMOVE(int P, int D) {
    //   415   BOARD(P)_WS=BOARD(P)_WS-1

    BOARD[P].WS = BOARD[P].WS - 1;

    //   416   BOARD(P+D)_WS=BOARD(P+D)_WS+1

    BOARD[P + D].WS = BOARD[P + D].WS + 1;

    //   417   BOARD(25)_BS=BOARD(25)_BS+BOARD(P+D)_BS

    BOARD[25].BS = BOARD[25].BS + BOARD[P + D].BS;

    //   418   BOARD(P+D)_BS=0

    BOARD[P + D].BS = 0;

    //   419   %END

    return;
  } /* end of MMOVE */

  //   420
  //   421   %ROUTINE GOOD (%INTEGERNAME S,WT)

  void GOOD(int *S, int *WT) {
    //   422   %IF S=0 %THENRETURN

    if (*S != 0) goto L_0089;
    return;
  L_0089:;

  //   423   %IF S<0 %THEN WT=WT-1 %ELSE WT=WT+1

    if (*S >= 0) goto L_008A;
    *WT = *WT - 1;
    goto L_008B;
  L_008A:;
    *WT = *WT + 1;
  L_008B:;

  //   424   %END

    return;
  } /* end of GOOD */

  //   425
  //   426   %ROUTINE BAD (%INTEGERNAME S,WT)

  void BAD(int *S, int *WT) {
    //   427   %IF S=0 %THENRETURN

    if (*S != 0) goto L_008C;
    return;
  L_008C:;

  //   428   %IF S>0 %THEN WT=WT-1 %ELSE WT=WT+1

    if (*S <= 0) goto L_008D;
    *WT = *WT - 1;
    goto L_008E;
  L_008D:;
    *WT = *WT + 1;
  L_008E:;

  //   429   %END

    return;
  } /* end of BAD */

  //   430
  //   431   %ROUTINE LOADWTS

  void LOADWTS(void) {
    //   432     W1 = 19

    W1 = 19;

    //   433     W2 = 117

    W2 = 117;

    //   434     W3 = 102

    W3 = 102;

    //   435     W4 = 15

    W4 = 15;

    //   436     W5 = 15

    W5 = 15;

    //   437     W6 = 12

    W6 = 12;

    //   438     W7 = 64

    W7 = 64;

    //   439     W8 = 43

    W8 = 43;

    //   440     W9 = 62

    W9 = 62;

    //   441     W10 = 15

    W10 = 15;

    //   442   %END

    return;
  } /* end of LOADWTS */

  //   443
  //   444   %ROUTINE DUMPWTS

  void DUMPWTS(void) {
    //   445   SELECTOUTPUT(2)

    _imp_SELECTOUTPUT(2);

    //   446   NEWLINES(3); WRITE(W1,1); NEWLINE; WRITE(W2,1)

    _imp_NEWLINES(3);
    _imp_WRITE(W1, 1);
    _imp_NEWLINE();
    _imp_WRITE(W2, 1);

    //   447   NEWLINE; WRITE(W3,1); NEWLINE; WRITE(W4,1)

    _imp_NEWLINE();
    _imp_WRITE(W3, 1);
    _imp_NEWLINE();
    _imp_WRITE(W4, 1);

    //   448   NEWLINE; WRITE(W5,1); NEWLINE; WRITE(W6,1)

    _imp_NEWLINE();
    _imp_WRITE(W5, 1);
    _imp_NEWLINE();
    _imp_WRITE(W6, 1);

    //   449   NEWLINE; WRITE(W7,1); NEWLINE; WRITE(W8,1)

    _imp_NEWLINE();
    _imp_WRITE(W7, 1);
    _imp_NEWLINE();
    _imp_WRITE(W8, 1);

    //   450   NEWLINE; WRITE(W9,1); NEWLINE; WRITE(W10,1)

    _imp_NEWLINE();
    _imp_WRITE(W9, 1);
    _imp_NEWLINE();
    _imp_WRITE(W10, 1);

    //   451   %END

    return;
  } /* end of DUMPWTS */

  //   452
  //   453   %INTEGERFN WBEARO

  int WBEARO(void) {
    //   454   %INTEGER I,J; J=WBOFF

    int I;
    int J;
    J = WBOFF;

    //   455   %CYCLE I=19,1,24

    // %for I = 19, 1, 24 %cycle
    {
      I = 18;
    L_008F:
      if (I == 24) goto L_0090;
      I += 1;

      //   456      J=J+BOARD(I)_WS

      J = J + BOARD[I].WS;

      //   457   %REPEAT

      goto L_008F;
    }

  L_0090:;

  //   458   %RESULT = J

    return J;

    //   459   %END

  } /* end of WBEARO */

  //   460
  //   461   %ROUTINE DOBEST(%INTEGER D)

  void DOBEST(int D) {
    //   462   %IF D#0 %THENSTART

    if (D == 0) goto L_0091;

      //   463      %IF BOARD(25-D)_WS>0 %THENSTART

    if (BOARD[25 - D].WS <= 0) goto L_0092;

      //   464         BOARD(25-D)_WS=BOARD(25-D)_WS-1

    BOARD[25 - D].WS = BOARD[25 - D].WS - 1;

    //   465         WBOFF=WBOFF+1

    WBOFF = WBOFF + 1;

    //   466      %FINISHELSESTART

    goto L_0093;
  L_0092:;

  //   467         %IF BOARD(25-D+1)_WS>0 %THENSTART

    if (BOARD[25 - D + 1].WS <= 0) goto L_0094;

      //   468            BOARD(25-D+1)_WS=BOARD(25-D+1)_WS-1

    BOARD[25 - D + 1].WS = BOARD[25 - D + 1].WS - 1;

    //   469            WBOFF=WBOFF+1

    WBOFF = WBOFF + 1;

    //   470         %FINISHELSESTART

    goto L_0095;
  L_0094:;

  //   471            %CYCLE M=19,1,25-D

  // %for M = 19, 1, 25 - D %cycle
    {
      int _final = 25 - D;
      if (invalid_for_loop(19, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle M = 19, 1, 25 - D");
      M = 18;
    L_0096:
      if (M == _final) goto L_0097;
      M += 1;

      // ?Non-local
      //   472               %IF WBOFF<8 %THENSTART

      if (WBOFF >= 8) goto L_0099;

        //   473                  %IF BOARD(M)_WS>2 %THEN MMOVE(M,D) %ANDRETURN

      if (BOARD[M].WS <= 2) goto L_009A;
      MMOVE(M, D);
      return;
    L_009A:;

    //   474               %FINISHELSESTART

      goto L_009B;
    L_0099:;

    //   475                  %IF BOARD(M)_WS>1 %THEN MMOVE(M,D) %ANDRETURN

      if (BOARD[M].WS <= 1) goto L_009C;
      MMOVE(M, D);
      return;
    L_009C:;

    //   476               %FINISH

    L_009B:;

    //   477            %REPEAT

      goto L_0096;
    }

  L_0097:;

  //   478             %CYCLE M=19,1,24

  // %for M = 19, 1, 24 %cycle
    {
      M = 18;
    L_009D:
      if (M == 24) goto L_009E;
      M += 1;

      // ?Non-local
      //   479                %IF DICE2+M<25 %THENSTART

      if (DICE2 + M >= 25) goto L_009F;

        //   480                   %IF BOARD(M)_WS>0 %THEN MMOVE(M,DICE2) %ANDRETURN

      if (BOARD[M].WS <= 0) goto L_00A0;
      MMOVE(M, DICE2);
      return;
    L_00A0:;

    //   481                %FINISHELSESTART

      goto L_00A1;
    L_009F:;

    //   482                   %IF BOARD(M)_WS>0 %THENSTART

      if (BOARD[M].WS <= 0) goto L_00A2;

        //   483                      BOARD(M)_WS=BOARD(M)_WS-1

      BOARD[M].WS = BOARD[M].WS - 1;

      //   484                      WBOFF=WBOFF+1; %RETURN

      WBOFF = WBOFF + 1;
      return;

      //   485                   %FINISH

    L_00A2:;

    //   486                %FINISH

    L_00A1:;

    //   487             %REPEAT

      goto L_009D;
    }

  L_009E:;

  //   488         %FINISH

  L_0095:;

  //   489      %FINISH

  L_0093:;

  //   490   %FINISH

  L_0091:;

  //   491   %END

    return;
  } /* end of DOBEST */

  //   492
  //   493   %ROUTINE MTSTBOFF(%INTEGER NUM,DIE)

  void MTSTBOFF(int NUM, int DIE) {
    //   494   %IF NUM+DIE<25 %THENSTART

    if (NUM + DIE >= 25) goto L_00A3;

      //   495      %IF BOARD(NUM+DIE)_BS=0 %THEN MMOVE(NUM,DIE) %ELSE NOMOV=1

    if (BOARD[NUM + DIE].BS != 0) goto L_00A4;
    MMOVE(NUM, DIE);
    goto L_00A5;
  L_00A4:;
    NOMOV = 1;
  L_00A5:;

  //   496   %FINISHELSESTART

    goto L_00A6;
  L_00A3:;

  //   497      BOARD(NUM)_WS=BOARD(NUM)_WS-1

    BOARD[NUM].WS = BOARD[NUM].WS - 1;

    //   498      WBOFF=WBOFF+1

    WBOFF = WBOFF + 1;

    //   499   %FINISH

  L_00A6:;

  //   500   %END

    return;
  } /* end of MTSTBOFF */

  //   501
  //   502   %ROUTINE CLTSTBOFF(%INTEGER NUM,DIE)

  void CLTSTBOFF(int NUM, int DIE) {
    //   503   TEMP=0

    TEMP = 0;

    //   504   %IF NUM+DIE<25 %THEN CLTSTMOV(NUM,DIE,TEMP) %ELSESTART

    if (NUM + DIE >= 25) goto L_00A7;
    CLTSTMOV(NUM, DIE, /*?*/ &TEMP);
    goto L_00A8;
  L_00A7:;

  //   505      BOARD(NUM)_WS=BOARD(NUM)_WS+1

    BOARD[NUM].WS = BOARD[NUM].WS + 1;

    //   506      WBOFF=WBOFF-1

    WBOFF = WBOFF - 1;

    //   507   %FINISH

  L_00A8:;

  //   508   %END

    return;
  } /* end of CLTSTBOFF */

  //   509
  //   510   !
  //   511   !
  //   512   !
  //   513   LOADWTS

  LOADWTS();

  //   514   SELECTINPUT(0)

  _imp_SELECTINPUT(0);

  //   515   CLOSESTREAM(1)

  _imp_CLOSESTREAM(1);

  //   516   INITIALIZE

  INITIALIZE();

  //   517   PRINTSTATE

  PRINTSTATE();

  //   518  STRT: %CYCLE

U_1006:;
L_00A9:;

//   519   READ(DICE1); READ(DICE2); BSTVAL=X'80000000'

  _imp_READ(/*?*/ &DICE1);
  _imp_READ(/*?*/ &DICE2);
  BSTVAL = -2147483648;

  //   520   %IF DICE1=DICE2 %THEN DICE3=DICE1 %AND DICE4=DICE2 %C

  if (DICE1 != DICE2) goto L_00AA;
  DICE3 = DICE1;
  DICE4 = DICE2;
  goto L_00AB;
L_00AA:;
  DICE3 = 0;
  DICE4 = 0;
L_00AB:;

//   521+     %ELSE DICE3=0 %AND DICE4=0
//   522   RUNNING=0

  RUNNING = 0;

  //   523   %IF WBEARO=15 %THEN -> BEAROFF

  if (WBEARO() != 15) goto L_00AC;
  goto U_1007;
L_00AC:;

//   524   TEMP=BBOFF

  TEMP = BBOFF;

  //   525   %CYCLE L=0,1,24

  // %for L = 0, 1, 24 %cycle
  {
    L = -1;
  L_00AD:
    if (L == 24) goto L_00AE;
    L += 1;

    //   526      %IF BOARD(L)_WS>0 %THENEXIT

    if (BOARD[L].WS <= 0) goto L_00AF;
    goto L_00AE;
  L_00AF:;

  //   527      TEMP=TEMP+BOARD(L)_BS

    TEMP = TEMP + BOARD[L].BS;

    //   528   %REPEAT

    goto L_00AD;
  }

L_00AE:;

//   529   %IF TEMP=15 %THEN RUNNING=1 %AND -> RUN

  if (TEMP != 15) goto L_00B0;
  RUNNING = 1;
  goto U_1008;
L_00B0:;

//   530   M1=0;M2=0;M3=0;M4=0;BARFL=0

  M1 = 0;
  M2 = 0;
  M3 = 0;
  M4 = 0;
  BARFL = 0;

  //   531   %IF WBAR>0 %THENSTART

  if (WBAR() <= 0) goto L_00B1;

    //   532      %IF WBAR>1 %THENSTART

  if (WBAR() <= 1) goto L_00B2;

    //   533         %IF BOARD(DICE1)_BS<2 %THEN MMOVE(0,DICE1)

  if (BOARD[DICE1].BS >= 2) goto L_00B3;
  MMOVE(0, DICE1);
L_00B3:;

//   534         %IF BOARD(DICE2)_BS<2 %THEN MMOVE(0,DICE2)

  if (BOARD[DICE2].BS >= 2) goto L_00B4;
  MMOVE(0, DICE2);
L_00B4:;

//   535         -> DONE

  goto U_1009;

  //   536      %FINISH

L_00B2:;

//   537      %IF BOARD(DICE1)_BS>1 %AND BOARD(DICE2)_BS>1 %THEN -> DONE

  if (BOARD[DICE1].BS <= 1) goto L_00B5;
  if (BOARD[DICE2].BS <= 1) goto L_00B5;
  goto U_1009;
L_00B5:;

//   538      BARFL=1

  BARFL = 1;

  //   539   %FINISH

L_00B1:;

//   540   %CYCLE K=1,1,2

// %for K = 1, 1, 2 %cycle
  {
    K = 0;
  L_00B6:
    if (K == 2) goto L_00B7;
    K += 1;

    //   541   %IF K=1 %THEN SECOND=0 %ELSESTART

    if (K != 1) goto L_00B8;
    SECOND = 0;
    goto L_00B9;
  L_00B8:;

  //   542      TEMP=DICE1; DICE1=DICE2; DICE2=TEMP; SECOND=1

    TEMP = DICE1;
    DICE1 = DICE2;
    DICE2 = TEMP;
    SECOND = 1;

    //   543   %FINISH

  L_00B9:;

  //   544   %CYCLE I=0,1,23

  // %for I = 0, 1, 23 %cycle
    {
      I = -1;
    L_00BA:
      if (I == 23) goto L_00BB;
      I += 1;

      //   545      %IF BOARD(I)_WS>0 %THEN PT1=I %ELSE -> CYC1

      if (BOARD[I].WS <= 0) goto L_00BC;
      PT1 = I;
      goto L_00BD;
    L_00BC:;
      goto U_100A;
    L_00BD:;

    //   546      %IF PT1+DICE1<25 %AND BOARD(PT1+DICE1)_BS<2 %THENSTART

      if (PT1 + DICE1 >= 25) goto L_00BE;
      if (BOARD[PT1 + DICE1].BS >= 2) goto L_00BE;

        //   547         MTSTMOV(PT1,DICE1,BARPT1); M1=1

      MTSTMOV(PT1, DICE1, /*?*/ &BARPT1);
      M1 = 1;

      //   548         %IF WBEARO=15 %THEN DICE1=0 %AND -> BEAROFF

      if (WBEARO() != 15) goto L_00BF;
      DICE1 = 0;
      goto U_1007;
    L_00BF:;

    //   549         %IF SECOND=1 %THEN N=I+1 %ELSE N=I

      if (SECOND != 1) goto L_00C0;
      N = I + 1;
      goto L_00C1;
    L_00C0:;
      N = I;
    L_00C1:;

    //   550         %CYCLE J=N,1,24

    // %for J = N, 1, 24 %cycle
      {
        int _initial = N;
        if (invalid_for_loop(_initial, 1, 24)) _imp_signal(5, 1, 0, "Illegal cycle J = N, 1, 24");
        J = _initial - (1);
      L_00C2:
        if (J == 24) goto L_00C3;
        J += 1;

        //   551            %IF BOARD(J)_WS>0 %THEN PT2=J %ELSE -> CYC2

        if (BOARD[J].WS <= 0) goto L_00C5;
        PT2 = J;
        goto L_00C6;
      L_00C5:;
        goto U_100B;
      L_00C6:;

      //   552            %IF PT2+DICE2<25 %AND BOARD(PT2+DICE2)_BS<2 %THENSTART

        if (PT2 + DICE2 >= 25) goto L_00C7;
        if (BOARD[PT2 + DICE2].BS >= 2) goto L_00C7;

          //   553               MTSTMOV(PT2,DICE2,BARPT2); M2=1

        MTSTMOV(PT2, DICE2, /*?*/ &BARPT2);
        M2 = 1;

        //   554               %IF DICE1=DICE2 %THENSTART

        if (DICE1 != DICE2) goto L_00C8;

          //   555                  %IF WBEARO=15 %THEN DICE2=0 %AND DICE1=0 %AND -> BEAROFF

        if (WBEARO() != 15) goto L_00C9;
        DICE2 = 0;
        DICE1 = 0;
        goto U_1007;
      L_00C9:;

      //   556                  %CYCLE G=J,1,23

      // %for G = J, 1, 23 %cycle
        {
          int _initial = J;
          if (invalid_for_loop(_initial, 1, 23)) _imp_signal(5, 1, 0, "Illegal cycle G = J, 1, 23");
          G = _initial - (1);
        L_00CA:
          if (G == 23) goto L_00CB;
          G += 1;

          //   557                     %IF BOARD(G)_WS>0 %THEN PT3=G %ELSE -> CYC3

          if (BOARD[G].WS <= 0) goto L_00CD;
          PT3 = G;
          goto L_00CE;
        L_00CD:;
          goto U_100C;
        L_00CE:;

        //   558                     %IF PT3+DICE1<25 %AND BOARD(PT3+DICE1)_BS<2 %C

          if (PT3 + DICE1 >= 25) goto L_00CF;
          if (BOARD[PT3 + DICE1].BS >= 2) goto L_00CF;

            //   559+                       %THENSTART
            //   560                        MTSTMOV(PT3,DICE1,BARPT3); M3=1

          MTSTMOV(PT3, DICE1, /*?*/ &BARPT3);
          M3 = 1;

          //   561                        %IF WBEARO=15 %THEN DICE1=0 %AND DICE2=0 %C

          if (WBEARO() != 15) goto L_00D0;
          DICE1 = 0;
          DICE2 = 0;
          DICE3 = 0;
          goto U_1007;
        L_00D0:;

        //   562+                          %AND DICE3=0 %AND -> BEAROFF
        //   563                        %CYCLE H=G,1,23

        // %for H = G, 1, 23 %cycle
          {
            int _initial = G;
            if (invalid_for_loop(_initial, 1, 23)) _imp_signal(5, 1, 0, "Illegal cycle H = G, 1, 23");
            H = _initial - (1);
          L_00D1:
            if (H == 23) goto L_00D2;
            H += 1;

            //   564                           %IF BOARD(H)_WS>0 %THEN PT4=H %ELSE -> CYC4

            if (BOARD[H].WS <= 0) goto L_00D4;
            PT4 = H;
            goto L_00D5;
          L_00D4:;
            goto U_100D;
          L_00D5:;

          //   565                           %IF PT4+DICE2<25 %AND BOARD(PT4+DICE2)_BS<2 %C

            if (PT4 + DICE2 >= 25) goto L_00D6;
            if (BOARD[PT4 + DICE2].BS >= 2) goto L_00D6;

              //   566+                             %THENSTART
              //   567                              MTSTMOV(PT4,DICE2,BARPT4); M4=1

            MTSTMOV(PT4, DICE2, /*?*/ &BARPT4);
            M4 = 1;

            //   568                              GBRD

            GBRD();

            //   569                              CLTSTMOV(PT4,DICE2,BARPT4)

            CLTSTMOV(PT4, DICE2, /*?*/ &BARPT4);

            //   570                           %FINISH

          L_00D6:;

          //   571  CYC4:                 %REPEAT

          U_100D:;
            goto L_00D1;
          }

        L_00D2:;

        //   572                        %IF M4=0 %THEN GBRD %AND BSTVAL=X'80000000'

          if (M4 != 0) goto L_00D7;
          GBRD();
          BSTVAL = -2147483648;
        L_00D7:;

        //   573                        CLTSTMOV(PT3,DICE1,BARPT3)

          CLTSTMOV(PT3, DICE1, /*?*/ &BARPT3);

          //   574                     %FINISH

        L_00CF:;

        //   575  CYC3:           %REPEAT

        U_100C:;
          goto L_00CA;
        }

      L_00CB:;

      //   576                  %IF M3=0 %THEN GBRD %AND BSTVAL=X'80000000'

        if (M3 != 0) goto L_00D8;
        GBRD();
        BSTVAL = -2147483648;
      L_00D8:;

      //   577               %FINISHELSE GBRD

        goto L_00D9;
      L_00C8:;
        GBRD();
      L_00D9:;

      //   578               CLTSTMOV(PT2,DICE2,BARPT2)

        CLTSTMOV(PT2, DICE2, /*?*/ &BARPT2);

        //   579            %FINISH

      L_00C7:;

      //   580  CYC2:  %REPEAT

      U_100B:;
        goto L_00C2;
      }

    L_00C3:;

    //   581         %IF M2=0 %THEN GBRD %AND BSTVAL=X'80000000'

      if (M2 != 0) goto L_00DA;
      GBRD();
      BSTVAL = -2147483648;
    L_00DA:;

    //   582         CLTSTMOV(PT1,DICE1,BARPT1)

      CLTSTMOV(PT1, DICE1, /*?*/ &BARPT1);

      //   583      %FINISH

    L_00BE:;

    //   584      %EXITIF BARFL=1

      if (BARFL != 1) goto L_00DB;
      goto L_00BB;
    L_00DB:;

    //   585  CYC1: %REPEAT

    U_100A:;
      goto L_00BA;
    }

  L_00BB:;

  //   586   %EXITIF DICE1=DICE2

    if (DICE1 != DICE2) goto L_00DC;
    goto L_00B7;
  L_00DC:;

  //   587   %REPEAT

    goto L_00B6;
  }

L_00B7:;

//   588   %IF M1=1 %THEN MMOVE(BSTPT1,BSTMOV1)

  if (M1 != 1) goto L_00DD;
  MMOVE(BSTPT1, BSTMOV1);
L_00DD:;

//   589   %IF M2=1 %THEN MMOVE(BSTPT2,BSTMOV2)

  if (M2 != 1) goto L_00DE;
  MMOVE(BSTPT2, BSTMOV2);
L_00DE:;

//   590   %IF DICE1=DICE2 %THENSTART

  if (DICE1 != DICE2) goto L_00DF;

    //   591      %IF M3=1 %THEN MMOVE(BSTPT3,BSTMOV1)

  if (M3 != 1) goto L_00E0;
  MMOVE(BSTPT3, BSTMOV1);
L_00E0:;

//   592      %IF M4=1 %THEN MMOVE(BSTPT4,BSTMOV2)

  if (M4 != 1) goto L_00E1;
  MMOVE(BSTPT4, BSTMOV2);
L_00E1:;

//   593   %FINISH

L_00DF:;

//   594  DONE: %IF WBOFF=15 %THEN PRINTSTRING("yeah") %AND NEWLINE %ANDEXIT

U_1009:;
  if (WBOFF != 15) goto L_00E2;
  _imp_PRINTSTRING(_imp_str_literal("yeah"));
  _imp_NEWLINE();
  goto L_00E3;
L_00E2:;

//   595   PRINTSTATE; DOBLACK

  PRINTSTATE();
  DOBLACK();

  //   596   %IF BBOFF=15 %THEN PRINTSTRING("pity") %AND NEWLINE %ANDEXIT

  if (BBOFF != 15) goto L_00E4;
  _imp_PRINTSTRING(_imp_str_literal("pity"));
  _imp_NEWLINE();
  goto L_00E3;
L_00E4:;

//   597   %IF RUNNING=1 %THEN -> STRT

  if (RUNNING != 1) goto L_00E5;
  goto U_1006;
L_00E5:;

//   598   GBRDVAL

  GBRDVAL();

  //   599   %IF BRDVAL=COMPVAL %THEN -> STRT

  if (BRDVAL != COMPVAL) goto L_00E6;
  goto U_1006;
L_00E6:;

//   600   %IF COMPVAL<BRDVAL %THENSTART

  if (COMPVAL >= BRDVAL) goto L_00E7;

    //   601      GOOD(BV1,W1); GOOD(BV2,W2); GOOD(BV3,W3); GOOD(BV4,W4)

  GOOD(/*?*/ &BV1, /*?*/ &W1);
  GOOD(/*?*/ &BV2, /*?*/ &W2);
  GOOD(/*?*/ &BV3, /*?*/ &W3);
  GOOD(/*?*/ &BV4, /*?*/ &W4);

  //   602      GOOD(BV5,W5); GOOD(BV6,W6); GOOD(BV7,W7); GOOD(BV8,W8)

  GOOD(/*?*/ &BV5, /*?*/ &W5);
  GOOD(/*?*/ &BV6, /*?*/ &W6);
  GOOD(/*?*/ &BV7, /*?*/ &W7);
  GOOD(/*?*/ &BV8, /*?*/ &W8);

  //   603      GOOD(BV9,W9); GOOD(BV10,W10)

  GOOD(/*?*/ &BV9, /*?*/ &W9);
  GOOD(/*?*/ &BV10, /*?*/ &W10);

  //   604   %FINISHELSESTART

  goto L_00E8;
L_00E7:;

//   605      BAD(BV1,W1); BAD(BV2,W2); BAD(BV3,W3); BAD(BV4,W4); BAD(BV5,W5)

  BAD(/*?*/ &BV1, /*?*/ &W1);
  BAD(/*?*/ &BV2, /*?*/ &W2);
  BAD(/*?*/ &BV3, /*?*/ &W3);
  BAD(/*?*/ &BV4, /*?*/ &W4);
  BAD(/*?*/ &BV5, /*?*/ &W5);

  //   606      BAD(BV6,W6); BAD(BV7,W7); BAD(BV8,W8); BAD(BV9,W9); BAD(BV10,W10)

  BAD(/*?*/ &BV6, /*?*/ &W6);
  BAD(/*?*/ &BV7, /*?*/ &W7);
  BAD(/*?*/ &BV8, /*?*/ &W8);
  BAD(/*?*/ &BV9, /*?*/ &W9);
  BAD(/*?*/ &BV10, /*?*/ &W10);

  //   607   %FINISH

L_00E8:;

//   608   COMPVAL=BRDVAL; -> STRT

  COMPVAL = BRDVAL;
  goto U_1006;

  //   609  RUN: %IF DICE2>DICE1 %THENSTART

U_1008:;
  if (DICE2 <= DICE1) goto L_00E9;

    //   610      TEMP=DICE2; DICE2=DICE1; DICE1=TEMP

  TEMP = DICE2;
  DICE2 = DICE1;
  DICE1 = TEMP;

  //   611   %FINISH

L_00E9:;

//   612   TEMP=0

  TEMP = 0;

  //   613   %CYCLE I=1,1,18

  // %for I = 1, 1, 18 %cycle
  {
    I = 0;
  L_00EA:
    if (I == 18) goto L_00EB;
    I += 1;

    //   614      %IF BOARD(I)_WS>0 %THENSTART

    if (BOARD[I].WS <= 0) goto L_00EC;

      //   615         MMOVE(I,DICE1); TEMP=1

    MMOVE(I, DICE1);
    TEMP = 1;

    //   616         %CYCLE J=I,1,18

    // %for J = I, 1, 18 %cycle
    {
      int _initial = I;
      if (invalid_for_loop(_initial, 1, 18)) _imp_signal(5, 1, 0, "Illegal cycle J = I, 1, 18");
      J = _initial - (1);
    L_00ED:
      if (J == 18) goto L_00EE;
      J += 1;

      //   617            %IF BOARD(J)_WS>0 %THENSTART

      if (BOARD[J].WS <= 0) goto L_00EF;

        //   618               %IF DICE1#DICE2 %THEN MMOVE(J,DICE2) %C

      if (DICE1 == DICE2) goto L_00F0;
      MMOVE(J, DICE2);
      goto L_00F1;
    L_00F0:;
      MMOVE(J, DICE1);
    L_00F1:;

    //   619+                 %ELSE MMOVE(J,DICE1); TEMP=2

      TEMP = 2;

      //   620               %IF DICE1=DICE2 %THENSTART

      if (DICE1 != DICE2) goto L_00F2;

        //   621                  %CYCLE G=J,1,18

        // %for G = J, 1, 18 %cycle
      {
        int _initial = J;
        if (invalid_for_loop(_initial, 1, 18)) _imp_signal(5, 1, 0, "Illegal cycle G = J, 1, 18");
        G = _initial - (1);
      L_00F3:
        if (G == 18) goto L_00F4;
        G += 1;

        //   622                     %IF BOARD(G)_WS>0 %THENSTART

        if (BOARD[G].WS <= 0) goto L_00F6;

          //   623                        MMOVE(G,DICE1); TEMP=3

        MMOVE(G, DICE1);
        TEMP = 3;

        //   624                        %CYCLE H=G,1,18

        // %for H = G, 1, 18 %cycle
        {
          int _initial = G;
          if (invalid_for_loop(_initial, 1, 18)) _imp_signal(5, 1, 0, "Illegal cycle H = G, 1, 18");
          H = _initial - (1);
        L_00F7:
          if (H == 18) goto L_00F8;
          H += 1;

          //   625                           %IF BOARD(H)_WS>0 %THENSTART

          if (BOARD[H].WS <= 0) goto L_00FA;

            //   626                              MMOVE(H,DICE2); TEMP=4

          MMOVE(H, DICE2);
          TEMP = 4;

          //   627                              %EXIT

          goto L_00F8;

          //   628                           %FINISH

        L_00FA:;

        //   629                        %REPEAT

          goto L_00F7;
        }

      L_00F8:;

      //   630                        %EXIT

        goto L_00F4;

        //   631                     %FINISH

      L_00F6:;

      //   632                  %REPEAT

        goto L_00F3;
      }

    L_00F4:;

    //   633               %FINISH

    L_00F2:;

    //   634               %EXIT

      goto L_00EE;

      //   635            %FINISH

    L_00EF:;

    //   636         %REPEAT

      goto L_00ED;
    }

  L_00EE:;

  //   637         %EXIT

    goto L_00EB;

    //   638      %FINISH

  L_00EC:;

  //   639   %REPEAT

    goto L_00EA;
  }

L_00EB:;

//   640   %IF DICE1=DICE2 %AND TEMP=4 %THEN -> DONE

  if (DICE1 != DICE2) goto L_00FB;
  if (TEMP != 4) goto L_00FB;
  goto U_1009;
L_00FB:;

//   641   %IF DICE1#DICE2 %AND TEMP=2 %THEN -> DONE

  if (DICE1 == DICE2) goto L_00FC;
  if (TEMP != 2) goto L_00FC;
  goto U_1009;
L_00FC:;

//   642   %IF DICE1#DICE2 %THEN DICE1=0 %AND -> BEAROFF

  if (DICE1 == DICE2) goto L_00FD;
  DICE1 = 0;
  goto U_1007;
L_00FD:;

//   643   DICE1=0

  DICE1 = 0;

  //   644   %IF TEMP>1 %THEN DICE2=0

  if (TEMP <= 1) goto L_00FE;
  DICE2 = 0;
L_00FE:;

//   645   %IF TEMP>2 %THEN DICE3=0

  if (TEMP <= 2) goto L_00FF;
  DICE3 = 0;
L_00FF:;

//   646  BEAROFF: RUNNING=1

U_1007:;
  RUNNING = 1;

  //   647   TEMP=WBOFF

  TEMP = WBOFF;

  //   648   %CYCLE M=24,-1,19

  // %for M = 24,  -1, 19 %cycle
  {
    M = 25;
  L_0100:
    if (M == 19) goto L_0101;
    M -= 1;

    //   649      %IF BOARD(M)_BS>0 %THEN -> SAFETY

    if (BOARD[M].BS <= 0) goto L_0102;
    goto U_100E;
  L_0102:;

  //   650      TEMP=TEMP+BOARD(M)_WS

    TEMP = TEMP + BOARD[M].WS;

    //   651      %IF TEMP=15 %THENEXIT

    if (TEMP != 15) goto L_0103;
    goto L_0101;
  L_0103:;

  //   652   %REPEAT

    goto L_0100;
  }

L_0101:;

//   653   %IF DICE1>DICE2 %THENSTART

  if (DICE1 <= DICE2) goto L_0104;

    //   654      TEMP=DICE2; DICE2=DICE1; DICE1=TEMP

  TEMP = DICE2;
  DICE2 = DICE1;
  DICE1 = TEMP;

  //   655   %FINISH

L_0104:;

//   656   %IF DICE1#0 %THENSTART

  if (DICE1 == 0) goto L_0105;

    //   657      %IF BOARD(25-DICE1)_WS>0 %THENSTART

  if (BOARD[25 - DICE1].WS <= 0) goto L_0106;

    //   658         BOARD(25-DICE1)_WS=BOARD(25-DICE1)_WS-1

  BOARD[25 - DICE1].WS = BOARD[25 - DICE1].WS - 1;

  //   659         WBOFF=WBOFF+1

  WBOFF = WBOFF + 1;

  //   660      %FINISHELSESTART

  goto L_0107;
L_0106:;

//   661         %IF BOARD(25-DICE1+1)_WS>0 %THENSTART

  if (BOARD[25 - DICE1 + 1].WS <= 0) goto L_0108;

    //   662            BOARD(25-DICE1+1)_WS=BOARD(25-DICE1+1)_WS-1

  BOARD[25 - DICE1 + 1].WS = BOARD[25 - DICE1 + 1].WS - 1;

  //   663            WBOFF=WBOFF+1

  WBOFF = WBOFF + 1;

  //   664         %FINISHELSESTART

  goto L_0109;
L_0108:;

//   665            %CYCLE M=19,1,25-DICE1

// %for M = 19, 1, 25 - DICE1 %cycle
  {
    int _final = 25 - DICE1;
    if (invalid_for_loop(19, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle M = 19, 1, 25 - DICE1");
    M = 18;
  L_010A:
    if (M == _final) goto L_010B;
    M += 1;

    //   666               %IF WBOFF<8 %THENSTART

    if (WBOFF >= 8) goto L_010C;

      //   667                  %IF BOARD(M)_WS>2 %THEN MMOVE(M,DICE1) %AND -> SEC

    if (BOARD[M].WS <= 2) goto L_010D;
    MMOVE(M, DICE1);
    goto U_100F;
  L_010D:;

  //   668               %FINISHELSESTART

    goto L_010E;
  L_010C:;

  //   669                  %IF BOARD(M)_WS>1 %THEN MMOVE(M,DICE1) %AND -> SEC

    if (BOARD[M].WS <= 1) goto L_010F;
    MMOVE(M, DICE1);
    goto U_100F;
  L_010F:;

  //   670               %FINISH

  L_010E:;

  //   671            %REPEAT

    goto L_010A;
  }

L_010B:;

//   672            %CYCLE M=19,1,24

// %for M = 19, 1, 24 %cycle
  {
    M = 18;
  L_0110:
    if (M == 24) goto L_0111;
    M += 1;

    //   673               %IF DICE2+M<25 %THENSTART

    if (DICE2 + M >= 25) goto L_0112;

      //   674                  %IF BOARD(M)_WS>0 %THEN MMOVE(M,DICE1) %ANDEXIT

    if (BOARD[M].WS <= 0) goto L_0113;
    MMOVE(M, DICE1);
    goto L_0111;
  L_0113:;

  //   675               %FINISH

  L_0112:;

  //   676               %IF M+DICE2=25 %THENSTART

    if (M + DICE2 != 25) goto L_0114;

      //   677                  %IF BOARD(M)_WS>1 %THEN MMOVE(M,DICE1) %ANDEXIT

    if (BOARD[M].WS <= 1) goto L_0115;
    MMOVE(M, DICE1);
    goto L_0111;
  L_0115:;

  //   678               %FINISH

  L_0114:;

  //   679               %IF DICE2+M>25 %THENSTART

    if (DICE2 + M <= 25) goto L_0116;

      //   680                  %IF BOARD(M)_WS>0 %THENSTART

    if (BOARD[M].WS <= 0) goto L_0117;

      //   681                     %IF M+DICE1<25 %THEN MMOVE(M,DICE1) %ELSE %C

    if (M + DICE1 >= 25) goto L_0118;
    MMOVE(M, DICE1);
    goto L_0119;
  L_0118:;
    WBOFF = WBOFF + 1;
    BOARD[M].WS = BOARD[M].WS - 1;
  L_0119:;

  //   682+                      WBOFF=WBOFF+1 %AND BOARD(M)_WS=BOARD(M)_WS-1
  //   683                     %EXIT

    goto L_0111;

    //   684                  %FINISH

  L_0117:;

  //   685               %FINISH

  L_0116:;

  //   686            %REPEAT

    goto L_0110;
  }

L_0111:;

//   687         %FINISH

L_0109:;

//   688      %FINISH

L_0107:;

//   689   %FINISH

L_0105:;

//   690  SEC: DOBEST(DICE2)

U_100F:;
  DOBEST(DICE2);

  //   691   %IF DICE4=0 %THEN ->DONE

  if (DICE4 != 0) goto L_011A;
  goto U_1009;
L_011A:;

//   692   DOBEST(DICE3)

  DOBEST(DICE3);

  //   693   DOBEST(DICE4)

  DOBEST(DICE4);

  //   694   ->DONE

  goto U_1009;

  //   695  SAFETY: %IF DICE4#0 %THENSTART

U_100E:;
  if (DICE4 == 0) goto L_011B;

    //   696      %IF DICE3=0 %THEN DICE1=DICE4 %AND DICE4=0 %ELSESTART

  if (DICE3 != 0) goto L_011C;
  DICE1 = DICE4;
  DICE4 = 0;
  goto L_011D;
L_011C:;

//   697         %IF DICE2=0 %THENSTART

  if (DICE2 != 0) goto L_011E;

    //   698            DICE1=DICE4; DICE4=0; DICE2=DICE3; DICE3=0

  DICE1 = DICE4;
  DICE4 = 0;
  DICE2 = DICE3;
  DICE3 = 0;

  //   699         %FINISHELSESTART

  goto L_011F;
L_011E:;

//   700            %IF DICE1=0 %THEN DICE1=DICE4 %AND DICE4=0

  if (DICE1 != 0) goto L_0120;
  DICE1 = DICE4;
  DICE4 = 0;
L_0120:;

//   701         %FINISH

L_011F:;

//   702      %FINISH

L_011D:;

//   703   %FINISHELSESTART

  goto L_0121;
L_011B:;

//   704      %IF DICE1=0 %THEN DICE1=DICE2 %AND DICE2=0

  if (DICE1 != 0) goto L_0122;
  DICE1 = DICE2;
  DICE2 = 0;
L_0122:;

//   705   %FINISH

L_0121:;

//   706   %IF DICE1<DICE2 %THENSTART

  if (DICE1 >= DICE2) goto L_0123;

    //   707      TEMP=DICE2; DICE2=DICE1; DICE1=TEMP

  TEMP = DICE2;
  DICE2 = DICE1;
  DICE1 = TEMP;

  //   708   %FINISH

L_0123:;

//   709   %CYCLE K=35,3,56

// %for K = 35, 3, 56 %cycle
  {
    K = 32;
  L_0124:
    if (K == 56) goto L_0125;
    K += 3;

    //   710   %CYCLE I=19,1,24

    // %for I = 19, 1, 24 %cycle
    {
      I = 18;
    L_0126:
      if (I == 24) goto L_0127;
      I += 1;

      //   711      %IF BOARD(I)_WS>0 %THENSTART

      if (BOARD[I].WS <= 0) goto L_0128;

        //   712         NOMOV=0; MTSTBOFF(I,DICE1)

      NOMOV = 0;
      MTSTBOFF(I, DICE1);

      //   713         %IF NOMOV=1 %THEN ->REP1

      if (NOMOV != 1) goto L_0129;
      goto U_1010;
    L_0129:;

    //   714         %IF DICE2=0 %THENSTART

      if (DICE2 != 0) goto L_012A;

        //   715            %IF WSINCL<K %THEN ->DONE

      if (WSINCL() >= K) goto L_012B;
      goto U_1009;
    L_012B:;

    //   716         %FINISHELSESTART

      goto L_012C;
    L_012A:;

    //   717            %CYCLE J=19,1,24

    // %for J = 19, 1, 24 %cycle
      {
        J = 18;
      L_012D:
        if (J == 24) goto L_012E;
        J += 1;

        //   718               %IF BOARD(J)_WS>0 %THENSTART

        if (BOARD[J].WS <= 0) goto L_0130;

          //   719                  NOMOV=0; MTSTBOFF(J,DICE2)

        NOMOV = 0;
        MTSTBOFF(J, DICE2);

        //   720                  %IF NOMOV=1 %THEN ->REP2

        if (NOMOV != 1) goto L_0131;
        goto U_1011;
      L_0131:;

      //   721                  %IF DICE3=0 %THENSTART

        if (DICE3 != 0) goto L_0132;

          //   722                     %IF WSINCL<K %THEN ->DONE

        if (WSINCL() >= K) goto L_0133;
        goto U_1009;
      L_0133:;

      //   723                  %FINISHELSESTART

        goto L_0134;
      L_0132:;

      //   724                     %CYCLE G=19,1,24

      // %for G = 19, 1, 24 %cycle
        {
          G = 18;
        L_0135:
          if (G == 24) goto L_0136;
          G += 1;

          //   725                        %IF BOARD(G)_WS>0 %THENSTART

          if (BOARD[G].WS <= 0) goto L_0137;

            //   726                           NOMOV=0; MTSTBOFF(G,DICE3)

          NOMOV = 0;
          MTSTBOFF(G, DICE3);

          //   727                           %IF NOMOV=1 %THEN ->REP3

          if (NOMOV != 1) goto L_0138;
          goto U_1012;
        L_0138:;

        //   728                           %IF DICE4=0 %THENSTART

          if (DICE4 != 0) goto L_0139;

            //   729                              %IF WSINCL<K %THEN ->DONE

          if (WSINCL() >= K) goto L_013A;
          goto U_1009;
        L_013A:;

        //   730                           %FINISHELSESTART

          goto L_013B;
        L_0139:;

        //   731                              %CYCLE H=19,1,24

        // %for H = 19, 1, 24 %cycle
          {
            H = 18;
          L_013C:
            if (H == 24) goto L_013D;
            H += 1;

            //   732                                 %IF BOARD(H)_WS>0 %THENSTART

            if (BOARD[H].WS <= 0) goto L_013F;

              //   733                                    NOMOV=0; MTSTBOFF(H,DICE4)

            NOMOV = 0;
            MTSTBOFF(H, DICE4);

            //   734                                    %IF NOMOV=1 %THEN ->REP4

            if (NOMOV != 1) goto L_0140;
            goto U_1013;
          L_0140:;

          //   735                                    %IF WSINCL<K %THEN ->DONE

            if (WSINCL() >= K) goto L_0141;
            goto U_1009;
          L_0141:;

          //   736                                    CLTSTBOFF(H,DICE4)

            CLTSTBOFF(H, DICE4);

            //   737                                 %FINISH

          L_013F:;

          //   738  REP4:                       %REPEAT

          U_1013:;
            goto L_013C;
          }

        L_013D:;

        //   739                           %FINISH

        L_013B:;

        //   740                           CLTSTBOFF(G,DICE3)

          CLTSTBOFF(G, DICE3);

          //   741                        %FINISH

        L_0137:;

        //   742  REP3:              %REPEAT

        U_1012:;
          goto L_0135;
        }

      L_0136:;

      //   743                  %FINISH

      L_0134:;

      //   744                  CLTSTBOFF(J,DICE2)

        CLTSTBOFF(J, DICE2);

        //   745               %FINISH

      L_0130:;

      //   746  REP2:     %REPEAT

      U_1011:;
        goto L_012D;
      }

    L_012E:;

    //   747         %FINISH

    L_012C:;

    //   748         CLTSTBOFF(I,DICE1)

      CLTSTBOFF(I, DICE1);

      //   749      %FINISH

    L_0128:;

    //   750  REP1: %REPEAT

    U_1010:;
      goto L_0126;
    }

  L_0127:;

  //   751   %REPEAT

    goto L_0124;
  }

L_0125:;

//   752   %REPEAT

  goto L_00A9;
L_00E3:;

//   753   DUMPWTS

  DUMPWTS();

  //   754  %END

  return;
} /* end of BACKGAMMON */

// ?WFST12 unused
// ?BFST12 unused
// ?ST unused
//   755
//   756  %begin

int main(int argc, char **argv) { /*%begin*/
  _imp_initialise(argc, argv);

  //   757    backgammon("")

  BACKGAMMON(_imp_str_literal(""));

  //   758  %end

  _imp_stop(0);
  return 0;
end_0:;
}

//   759
//   760  %ENDOFFILE