EXTERNALROUTINE BACKGAMMON (STRING(255) ST)
 OWNINTEGER BBOFF,WBOFF,DICE1,DICE2,BARFL,BRDVAL,BSTVAL,COMPVAL
 OWNINTEGER M1,M2,M3,M4,V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,I,J,K,RUNNING
 OWNINTEGER NOMOV,BARPT1,BARPT2,PT1,PT2,L,M,N,TEMP,BSTMOV1,BSTMOV2
 OWNINTEGER BSTPT1,BSTPT2,W1,W2,W3,W4,W5,W6,W7,W8,W9,W10
 OWNINTEGER SECOND,BV1,BV2,BV3,BV4,BV5,BV6,BV7,BV8,BV9,BV10
 CONSTINTEGERARRAY ODDS(1:12)=35,38,44,47,47,53,18,21,15,12,6,9
 RECORDFORMAT F(INTEGER WS,BS)
 OWNRECORD(f)ARRAY BOARD(0:25){(F)}
 OWNINTEGER G,H,PT3,PT4,DICE3,DICE4,BSTPT3,BSTPT4,BARPT3,BARPT4
 INTEGERFN HOMEB
 INTEGER NO,I
 NO=BBOFF
 CYCLE I=1,1,6
     NO=NO+BOARD(I)_BS
 REPEAT
 IF NO=15 THENRESULT = 1 ELSERESULT = 0
 END

 ROUTINE DOBLACK
 INTEGER PT,NO,M,D1,D2,D3,D4,TOT
   PROMPT ("Point:")
 CYCLE
    READ(D1); READ(D2)
    IF D1>6 OR D2>6 THEN PRINTSTRING("No way") AND NEWLINE ELSEEXIT
 REPEAT
 IF D1=D2 THEN D3=D1 AND D4=D2 ELSE D3=0 AND D4=0
 PRINTSTRING("Your throw was")
 WRITE(D1,2); WRITE(D2,2)
 NEWLINE
 IF BOARD(25)_BS>0 THENSTART
    IF BOARD(25-D1)_WS>1 AND BOARD(25-D2)_WS>1 C
       THEN PRINTSTRING("You cannot move") AND NEWLINE ANDRETURN
    IF BOARD(25)_BS#1 THENSTART
       IF D1#D2 THENSTART
          IF BOARD(25-D1)_WS>1 THENSTART
             BOARD(25-D2)_BS=BOARD(25-D2)_BS+1
             BOARD(25)_BS=BOARD(25)_BS-1
             BOARD(25-D2)_WS=0
             BOARD(0)_WS=BOARD(0)_WS+1
             PRINTSTRING("I have made your move")
             NEWLINE
             RETURN
          FINISH
          IF BOARD(25-D2)_WS>1 THENSTART
             BOARD(25-D1)_BS=BOARD(25-D1)_BS+1
             BOARD(25)_BS=BOARD(25)_BS-1
             BOARD(25-D1)_WS=0
             BOARD(0)_WS=BOARD(0)_WS+1
             PRINTSTRING("I have made your move")
             NEWLINE
             RETURN
          FINISH
       FINISH
    FINISH
 FINISH
 PRINTSTRING("Make your move"); NEWLINE
 CYCLE M=1,1,4
AGN: TOT=D1+D2+D3+D4
 IF TOT=0 THENRETURN
 READ(PT); IF PT=100 THENRETURN; READ(NO)
 IF BOARD(PT)_BS=0 THEN PRINTSTRING("No blacks on point") C
    AND NEWLINE AND ->AGN
 IF BOARD(25)_BS#0 AND PT#25 THEN C
    PRINTSTRING("You have pieces on the bar") AND NEWLINE AND ->AGN
 IF PT-NO<=0 THENSTART
    IF HOMEB=0 THEN PRINTSTRING("Not all home") AND C
       NEWLINE AND ->AGN; ->LEGMOV
 FINISH
 IF BOARD(PT-NO)_WS>1 THEN PRINTSTRING("White has point") C
    AND NEWLINE AND ->AGN
LEGMOV: IF NO=D1 THEN D1=0 ELSESTART
    IF NO=D2 THEN D2=0 ELSESTART
       IF NO=D3 THEN D3=0 ELSESTART
          IF NO=D4 THEN D4=0 ELSESTART
             PRINTSTRING("Illegal move"); NEWLINE; ->AGN
          FINISH
       FINISH
    FINISH
 FINISH
 IF PT-NO <=0 THEN ->BBEARO
 BOARD(PT)_BS=BOARD(PT)_BS-1
 BOARD(PT-NO)_BS=BOARD(PT-NO)_BS+1
 IF BOARD(PT-NO)_WS=1 THEN BOARD(PT-NO)_WS=0 C
    AND BOARD(0)_WS=BOARD(0)_WS+1
 ->SKP
BBEARO: BBOFF=BBOFF+1
 BOARD(PT)_BS=BOARD(PT)_BS-1
 IF BBOFF=15 THENRETURN
SKP: REPEAT
 END

 ROUTINE INITIALIZE
 WBOFF=0
 BBOFF=0
 BOARD(1)_WS=2
 BOARD(6)_BS=5
 BOARD(8)_BS=3
 BOARD(12)_WS=5
 BOARD(13)_BS=5
 BOARD(17)_WS=3
 BOARD(19)_WS=5
 BOARD(24)_BS=2
 END

 ROUTINE PRINTSTATE
 INTEGER I,J,K,M
 NEWLINES(2)
 PRINTSTRING(" 12  11  10   9   8   7      6   5   4   3   2   1")
 NEWLINE
 PRINTSTRING("___________________________________________________")
 CYCLE I=0,1,6
    NEWLINE
    SPACES(2)
    CYCLE J=12,-1,1
       IF BOARD(J)_WS>I THEN PRINTSYMBOL('W') AND ->RPT
       IF BOARD(J)_BS>I THEN PRINTSYMBOL('B') AND ->RPT
       SPACE
RPT:   IF J=7 THEN PRINTSTRING("  **  ") ELSE SPACES(3)
    REPEAT
 REPEAT
 CYCLE K=6,-1,0
    NEWLINE
    SPACES(2)
    CYCLE M=13,1,24
       IF BOARD(M)_WS>K THEN PRINTSYMBOL('W') AND ->RPT2
       IF BOARD(M)_BS>K THEN PRINTSYMBOL('B') AND ->RPT2
       SPACE
RPT2:  IF M=18 THEN PRINTSTRING("  **  ") ELSE SPACES(3)
    REPEAT
 REPEAT
 NEWLINE
 PRINTSTRING("____________________________________________________")
 NEWLINE
 PRINTSTRING(" 13  14  15  16  17  18      19  20  21  22  23  24")
 NEWLINE
 IF BOARD(0)_WS>0 THENSTART
    NEWLINE
    PRINTSTRING("There are")
    WRITE(BOARD(0)_WS,2)
    PRINTSTRING(" whites on the bar")
 FINISH
 IF BOARD(25)_BS>0 THENSTART
    NEWLINE
    PRINTSTRING("there are")
    WRITE(BOARD(25)_BS,2)
    PRINTSTRING(" blacks on the bar")
 FINISH
 IF WBOFF>0 THENSTART
    NEWLINE
    PRINTSTRING("white has born off")
    WRITE(WBOFF,3)
 FINISH
 IF BBOFF>0 THENSTART
    NEWLINE
    PRINTSTRING("black has born off")
    WRITE(BBOFF,3)
 FINISH
 NEWLINE
 END

 INTEGERFN BBAR
 RESULT = BOARD(25)_BS
 END

 INTEGERFN WBAR
 RESULT = BOARD(0)_WS
 END

 INTEGERFN BSIN
 INTEGER I,J; J=0
 CYCLE I=1,1,25
    IF BOARD(I)_BS=1 THEN J=J+1
 REPEAT
 RESULT = J
 END

 INTEGERFN WSIN
 INTEGER I,J; J=0
 CYCLE I=0,1,24
    IF BOARD(I)_WS=1 THEN J=J+1
 REPEAT
 RESULT = J
 END

 INTEGERFN BSINCL
 INTEGER I,J,K,SUM; SUM=0
 CYCLE I=25,-1,1
    IF BOARD(I)_BS=1 THENSTART
    IF I-12<0 THEN J=0 ELSE J=I-12
    CYCLE K=I-1,-1,J
       IF BOARD(K)_WS>0 THEN SUM=SUM+ODDS(I-K)
    REPEAT
    FINISH
 REPEAT
 RESULT = SUM
 END

 INTEGERFN WSINCL
 INTEGER I,J,K,SUM; SUM=0
 CYCLE I=0,1,24
    IF BOARD(I)_WS=1 THENSTART
    IF I+12>25 THEN J=25 ELSE J=I+12
    CYCLE K=I+1,1,J
       IF BOARD(K)_BS>0 THEN SUM=SUM+ODDS(K-I)
    REPEAT
    FINISH
 REPEAT
 RESULT = SUM
 END

 INTEGERFN WPTSHOME
 INTEGER I,J; J=0
 CYCLE I=19,1,24
    IF BOARD(I)_WS>1 THEN J=J+1
 REPEAT
 RESULT = J
 END

 INTEGERFN BPTSHOME
 INTEGER I,J; J=0
 CYCLE I=1,1,6
    IF BOARD(I)_BS>1 THEN J=J+1
 REPEAT
 RESULT = J
 END

 INTEGERFN WPTS
 INTEGER I,J; J=0
 CYCLE I=1,1,24
    IF BOARD(I)_WS>1 THEN J=J+1
 REPEAT
 RESULT = J
 END

 INTEGERFN BPTS
 INTEGER I,J;J=0
 CYCLE I=1,1,24
    IF BOARD(K)_BS>1 THEN J=J+1
 REPEAT 
 RESULT = J
 END

 INTEGERFN WPTSSUCC
 INTEGER I,J,K; K=0
 CYCLE J=1,1,22
    IF BOARD(J)_BS>0 THENSTART
       CYCLE I=J+1,1,23
          IF BOARD(I)_WS>1 THENSTART
             IF BOARD(I+1)_WS>1 THEN K=K+1
          FINISH
       REPEAT
       EXIT
    FINISH
 REPEAT
 RESULT = K
 END

 INTEGERFN BPTSSUCC
 INTEGER I,J,K; K=0   
 CYCLE J=24,-1,3
    IF BOARD(J)_WS>0 THENSTART
       CYCLE I=J-1,-1,2
          IF BOARD(I)_BS>1 THENSTART
             IF BOARD(I-1)_BS>1 THEN K=K+1
          FINISH
       REPEAT
       EXIT
    FINISH
 REPEAT
 RESULT = K
 END

 INTEGERFN BFST3
 INTEGER I,J; J=0
 CYCLE I=22,1,25
    J=J+BOARD(I)_BS
 REPEAT
 RESULT = J
 END

 INTEGERFN WFST3
 INTEGER I,J; J=0
 CYCLE I=0,1,3
    J=J+BOARD(I)_WS
 REPEAT
 RESULT = J
 END

 INTEGERFN BFST6
 INTEGER I,J; J=0
 CYCLE I=19,1,25
    J=J+BOARD(I)_BS
 REPEAT
 RESULT = J
 END

 INTEGERFN WFST6
 INTEGER I,J; J=0
 CYCLE I=0,1,6
    J=J+BOARD(I)_WS
 REPEAT
 RESULT = J
 END

 INTEGERFN BFST12
 INTEGER I,J
 J=BFST6
 CYCLE I=13,1,18
    J=J+BOARD(I)_BS
 REPEAT
 RESULT = J
 END

 INTEGERFN WFST12
 INTEGER I,J
 J=WFST6
 CYCLE I=7,1,12
    J=BOARD(I)_WS+J
 REPEAT
 RESULT = J
 END

 INTEGERFN WHOME
 INTEGER I,J; J=0
 CYCLE I=19,1,24
    J=J+BOARD(I)_WS
 REPEAT
 RESULT = J
 END

 INTEGERFN BHOME
 INTEGER I,J; J=0
 CYCLE I=1,1,6
    J=J+BOARD(I)_BS
 REPEAT
 RESULT = J
 END

 INTEGERFN WTOGO
 INTEGER I,J,K,SUM; SUM=0
 CYCLE I=0,1,18
    J=BOARD(I)_WS
    IF J>0 THENSTART
       CYCLE K=1,1,J
          SUM=SUM+19-I
       REPEAT
    FINISH
 REPEAT
 RESULT = SUM
 END

 INTEGERFN BTOGO
 INTEGER I,J,K,SUM; SUM=0
 CYCLE I=7,1,25
    J=BOARD(I)_BS
    IF J>0 THENSTART
       CYCLE K=1,1,J
          SUM=SUM+I-6
       REPEAT
    FINISH
 REPEAT
 RESULT = SUM
 END

 ROUTINE GBRDVAL
 V1=W1*(BBAR-WBAR)
 V2=W2*(BSIN-WSIN)
 V3=W3*(BSINCL-WSINCL)//10
 V4=W4*(WPTSHOME-BPTSHOME)
 V5=W5*(WPTS-BPTS)
 V6=W6*(WPTSSUCC-BPTSSUCC)
 V7=W7*(BFST6-WFST6)
 V8=W8*(BTOGO//6-WTOGO//6)
 V9=W9*(BFST3-WFST3)
 V10=W10*(WHOME-BHOME)
 BRDVAL=V1+V2+V3+V4+V5+V6+V7+V8+V9+V10
 END

 ROUTINE GBRD
 V1=W1*(BBAR)
 V2=W2*(-WSIN)
 V3=W3*(-WSINCL)//10
 V4=W4*(WPTSHOME)
 V5=W5*(WPTS)
 V6=W6*(WPTSSUCC)
 V7=W7*(-WFST6)
 V8=W8*(-WTOGO)//6
 V9=W9*(-WFST3)
 V10=W10*(WHOME)
 BRDVAL=V1+V2+V3+V4+V5+V6+V7+V8+V9+V10
 IF BRDVAL>BSTVAL THENSTART
    BV1=V1; BV2=V2; BV3=V3; BV4=V4; BV5=V5; BV6=V6; BV7=V7; BV8=V8
    BV9=V9; BV10=V10; BSTVAL=BRDVAL; BSTMOV1=DICE1; BSTPT1=PT1
    BSTMOV2=DICE2; BSTPT2=PT2; BSTPT3=PT3; BSTPT4=PT4
 FINISH
 END


 ROUTINE MTSTMOV (INTEGER P,D,INTEGERNAME BP)
 BOARD(P)_WS=BOARD(P)_WS-1
 BOARD(P+D)_WS=BOARD(P+D)_WS+1
 IF BOARD(P+D)_BS=1 THEN BOARD(P+D)_BS=0 C
    AND BOARD(25)_BS=BOARD(25)_BS+1 AND BP=1
 END

 ROUTINE CLTSTMOV (INTEGER P,D,INTEGERNAME BP)
 BOARD(P)_WS=BOARD(P)_WS+1
 BOARD(P+D)_WS=BOARD(P+D)_WS-1
 IF BP=1 THEN BOARD(P+D)_BS=1 AND BOARD(25)_BS=BOARD(25)_BS-1 C
    AND BP=0
 END

 ROUTINE MMOVE (INTEGER P,D)
 BOARD(P)_WS=BOARD(P)_WS-1
 BOARD(P+D)_WS=BOARD(P+D)_WS+1
 BOARD(25)_BS=BOARD(25)_BS+BOARD(P+D)_BS
 BOARD(P+D)_BS=0
 END

 ROUTINE GOOD (INTEGERNAME S,WT)
 IF S=0 THENRETURN
 IF S<0 THEN WT=WT-1 ELSE WT=WT+1
 END

 ROUTINE BAD (INTEGERNAME S,WT)
 IF S=0 THENRETURN
 IF S>0 THEN WT=WT-1 ELSE WT=WT+1
 END

 ROUTINE LOADWTS
   W1 = 19
   W2 = 117
   W3 = 102
   W4 = 15
   W5 = 15
   W6 = 12
   W7 = 64
   W8 = 43
   W9 = 62
   W10 = 15
 END

 ROUTINE DUMPWTS
 SELECTOUTPUT(2)
 NEWLINES(3); WRITE(W1,1); NEWLINE; WRITE(W2,1)
 NEWLINE; WRITE(W3,1); NEWLINE; WRITE(W4,1)
 NEWLINE; WRITE(W5,1); NEWLINE; WRITE(W6,1)
 NEWLINE; WRITE(W7,1); NEWLINE; WRITE(W8,1)
 NEWLINE; WRITE(W9,1); NEWLINE; WRITE(W10,1)
 END

 INTEGERFN WBEARO
 INTEGER I,J; J=WBOFF
 CYCLE I=19,1,24
    J=J+BOARD(I)_WS
 REPEAT
 RESULT = J
 END

 ROUTINE DOBEST(INTEGER D)
 IF D#0 THENSTART
    IF BOARD(25-D)_WS>0 THENSTART
       BOARD(25-D)_WS=BOARD(25-D)_WS-1
       WBOFF=WBOFF+1
    FINISHELSESTART
       IF BOARD(25-D+1)_WS>0 THENSTART
          BOARD(25-D+1)_WS=BOARD(25-D+1)_WS-1
          WBOFF=WBOFF+1
       FINISHELSESTART
          CYCLE M=19,1,25-D
             IF WBOFF<8 THENSTART
                IF BOARD(M)_WS>2 THEN MMOVE(M,D) ANDRETURN
             FINISHELSESTART
                IF BOARD(M)_WS>1 THEN MMOVE(M,D) ANDRETURN
             FINISH
          REPEAT
           CYCLE M=19,1,24
              IF DICE2+M<25 THENSTART
                 IF BOARD(M)_WS>0 THEN MMOVE(M,DICE2) ANDRETURN
              FINISHELSESTART
                 IF BOARD(M)_WS>0 THENSTART
                    BOARD(M)_WS=BOARD(M)_WS-1
                    WBOFF=WBOFF+1; RETURN
                 FINISH
              FINISH
           REPEAT
       FINISH
    FINISH
 FINISH
 END

 ROUTINE MTSTBOFF(INTEGER NUM,DIE)
 IF NUM+DIE<25 THENSTART
    IF BOARD(NUM+DIE)_BS=0 THEN MMOVE(NUM,DIE) ELSE NOMOV=1
 FINISHELSESTART
    BOARD(NUM)_WS=BOARD(NUM)_WS-1
    WBOFF=WBOFF+1
 FINISH
 END

 ROUTINE CLTSTBOFF(INTEGER NUM,DIE)
 TEMP=0
 IF NUM+DIE<25 THEN CLTSTMOV(NUM,DIE,TEMP) ELSESTART
    BOARD(NUM)_WS=BOARD(NUM)_WS+1
    WBOFF=WBOFF-1
 FINISH
 END

 !
 !
 !
 LOADWTS
 SELECTINPUT(0)
 CLOSESTREAM(1)
 INITIALIZE
 PRINTSTATE
STRT: CYCLE
 READ(DICE1); READ(DICE2); BSTVAL=X'80000000'
 IF DICE1=DICE2 THEN DICE3=DICE1 AND DICE4=DICE2 C
    ELSE DICE3=0 AND DICE4=0
 RUNNING=0
 IF WBEARO=15 THEN -> BEAROFF
 TEMP=BBOFF
 CYCLE L=0,1,24
    IF BOARD(L)_WS>0 THENEXIT
    TEMP=TEMP+BOARD(L)_BS
 REPEAT
 IF TEMP=15 THEN RUNNING=1 AND -> RUN
 M1=0;M2=0;M3=0;M4=0;BARFL=0
 IF WBAR>0 THENSTART
    IF WBAR>1 THENSTART
       IF BOARD(DICE1)_BS<2 THEN MMOVE(0,DICE1)
       IF BOARD(DICE2)_BS<2 THEN MMOVE(0,DICE2)
       -> DONE
    FINISH
    IF BOARD(DICE1)_BS>1 AND BOARD(DICE2)_BS>1 THEN -> DONE
    BARFL=1
 FINISH
 CYCLE K=1,1,2
 IF K=1 THEN SECOND=0 ELSESTART
    TEMP=DICE1; DICE1=DICE2; DICE2=TEMP; SECOND=1
 FINISH
 CYCLE I=0,1,23
    IF BOARD(I)_WS>0 THEN PT1=I ELSE -> CYC1
    IF PT1+DICE1<25 AND BOARD(PT1+DICE1)_BS<2 THENSTART
       MTSTMOV(PT1,DICE1,BARPT1); M1=1
       IF WBEARO=15 THEN DICE1=0 AND -> BEAROFF
       IF SECOND=1 THEN N=I+1 ELSE N=I
       CYCLE J=N,1,24
          IF BOARD(J)_WS>0 THEN PT2=J ELSE -> CYC2
          IF PT2+DICE2<25 AND BOARD(PT2+DICE2)_BS<2 THENSTART
             MTSTMOV(PT2,DICE2,BARPT2); M2=1
             IF DICE1=DICE2 THENSTART
                IF WBEARO=15 THEN DICE2=0 AND DICE1=0 AND -> BEAROFF
                CYCLE G=J,1,23
                   IF BOARD(G)_WS>0 THEN PT3=G ELSE -> CYC3
                   IF PT3+DICE1<25 AND BOARD(PT3+DICE1)_BS<2 C
                      THENSTART
                      MTSTMOV(PT3,DICE1,BARPT3); M3=1
                      IF WBEARO=15 THEN DICE1=0 AND DICE2=0 C
                         AND DICE3=0 AND -> BEAROFF
                      CYCLE H=G,1,23
                         IF BOARD(H)_WS>0 THEN PT4=H ELSE -> CYC4
                         IF PT4+DICE2<25 AND BOARD(PT4+DICE2)_BS<2 C
                            THENSTART
                            MTSTMOV(PT4,DICE2,BARPT4); M4=1
                            GBRD
                            CLTSTMOV(PT4,DICE2,BARPT4)
                         FINISH
CYC4:                 REPEAT
                      IF M4=0 THEN GBRD AND BSTVAL=X'80000000'
                      CLTSTMOV(PT3,DICE1,BARPT3)
                   FINISH
CYC3:           REPEAT
                IF M3=0 THEN GBRD AND BSTVAL=X'80000000'
             FINISHELSE GBRD
             CLTSTMOV(PT2,DICE2,BARPT2)
          FINISH
CYC2:  REPEAT
       IF M2=0 THEN GBRD AND BSTVAL=X'80000000'
       CLTSTMOV(PT1,DICE1,BARPT1)
    FINISH
    EXITIF BARFL=1
CYC1: REPEAT
 EXITIF DICE1=DICE2
 REPEAT
 IF M1=1 THEN MMOVE(BSTPT1,BSTMOV1)
 IF M2=1 THEN MMOVE(BSTPT2,BSTMOV2)
 IF DICE1=DICE2 THENSTART
    IF M3=1 THEN MMOVE(BSTPT3,BSTMOV1)
    IF M4=1 THEN MMOVE(BSTPT4,BSTMOV2)
 FINISH
DONE: IF WBOFF=15 THEN PRINTSTRING("yeah") AND NEWLINE ANDEXIT
 PRINTSTATE; DOBLACK
 IF BBOFF=15 THEN PRINTSTRING("pity") AND NEWLINE ANDEXIT
 IF RUNNING=1 THEN -> STRT
 GBRDVAL
 IF BRDVAL=COMPVAL THEN -> STRT
 IF COMPVAL<BRDVAL THENSTART
    GOOD(BV1,W1); GOOD(BV2,W2); GOOD(BV3,W3); GOOD(BV4,W4)
    GOOD(BV5,W5); GOOD(BV6,W6); GOOD(BV7,W7); GOOD(BV8,W8)
    GOOD(BV9,W9); GOOD(BV10,W10)
 FINISHELSESTART
    BAD(BV1,W1); BAD(BV2,W2); BAD(BV3,W3); BAD(BV4,W4); BAD(BV5,W5)       
    BAD(BV6,W6); BAD(BV7,W7); BAD(BV8,W8); BAD(BV9,W9); BAD(BV10,W10)
 FINISH
 COMPVAL=BRDVAL; -> STRT
RUN: IF DICE2>DICE1 THENSTART
    TEMP=DICE2; DICE2=DICE1; DICE1=TEMP
 FINISH
 TEMP=0
 CYCLE I=1,1,18
    IF BOARD(I)_WS>0 THENSTART
       MMOVE(I,DICE1); TEMP=1
       CYCLE J=I,1,18
          IF BOARD(J)_WS>0 THENSTART
             IF DICE1#DICE2 THEN MMOVE(J,DICE2) C
                ELSE MMOVE(J,DICE1); TEMP=2
             IF DICE1=DICE2 THENSTART
                CYCLE G=J,1,18
                   IF BOARD(G)_WS>0 THENSTART
                      MMOVE(G,DICE1); TEMP=3
                      CYCLE H=G,1,18
                         IF BOARD(H)_WS>0 THENSTART
                            MMOVE(H,DICE2); TEMP=4
                            EXIT
                         FINISH
                      REPEAT
                      EXIT
                   FINISH
                REPEAT
             FINISH
             EXIT
          FINISH
       REPEAT
       EXIT
    FINISH
 REPEAT
 IF DICE1=DICE2 AND TEMP=4 THEN -> DONE
 IF DICE1#DICE2 AND TEMP=2 THEN -> DONE
 IF DICE1#DICE2 THEN DICE1=0 AND -> BEAROFF
 DICE1=0
 IF TEMP>1 THEN DICE2=0
 IF TEMP>2 THEN DICE3=0
BEAROFF: RUNNING=1
 TEMP=WBOFF
 CYCLE M=24,-1,19
    IF BOARD(M)_BS>0 THEN -> SAFETY
    TEMP=TEMP+BOARD(M)_WS
    IF TEMP=15 THENEXIT
 REPEAT
 IF DICE1>DICE2 THENSTART
    TEMP=DICE2; DICE2=DICE1; DICE1=TEMP
 FINISH
 IF DICE1#0 THENSTART
    IF BOARD(25-DICE1)_WS>0 THENSTART
       BOARD(25-DICE1)_WS=BOARD(25-DICE1)_WS-1
       WBOFF=WBOFF+1
    FINISHELSESTART
       IF BOARD(25-DICE1+1)_WS>0 THENSTART
          BOARD(25-DICE1+1)_WS=BOARD(25-DICE1+1)_WS-1
          WBOFF=WBOFF+1
       FINISHELSESTART
          CYCLE M=19,1,25-DICE1
             IF WBOFF<8 THENSTART
                IF BOARD(M)_WS>2 THEN MMOVE(M,DICE1) AND -> SEC
             FINISHELSESTART
                IF BOARD(M)_WS>1 THEN MMOVE(M,DICE1) AND -> SEC
             FINISH
          REPEAT
          CYCLE M=19,1,24
             IF DICE2+M<25 THENSTART
                IF BOARD(M)_WS>0 THEN MMOVE(M,DICE1) ANDEXIT
             FINISH
             IF M+DICE2=25 THENSTART
                IF BOARD(M)_WS>1 THEN MMOVE(M,DICE1) ANDEXIT
             FINISH
             IF DICE2+M>25 THENSTART
                IF BOARD(M)_WS>0 THENSTART
                   IF M+DICE1<25 THEN MMOVE(M,DICE1) ELSE C
                     WBOFF=WBOFF+1 AND BOARD(M)_WS=BOARD(M)_WS-1
                   EXIT
                FINISH
             FINISH
          REPEAT
       FINISH
    FINISH
 FINISH
SEC: DOBEST(DICE2)
 IF DICE4=0 THEN ->DONE
 DOBEST(DICE3)
 DOBEST(DICE4)
 ->DONE
SAFETY: IF DICE4#0 THENSTART
    IF DICE3=0 THEN DICE1=DICE4 AND DICE4=0 ELSESTART
       IF DICE2=0 THENSTART
          DICE1=DICE4; DICE4=0; DICE2=DICE3; DICE3=0
       FINISHELSESTART
          IF DICE1=0 THEN DICE1=DICE4 AND DICE4=0
       FINISH
    FINISH
 FINISHELSESTART
    IF DICE1=0 THEN DICE1=DICE2 AND DICE2=0
 FINISH
 IF DICE1<DICE2 THENSTART
    TEMP=DICE2; DICE2=DICE1; DICE1=TEMP
 FINISH
 CYCLE K=35,3,56
 CYCLE I=19,1,24
    IF BOARD(I)_WS>0 THENSTART
       NOMOV=0; MTSTBOFF(I,DICE1)
       IF NOMOV=1 THEN ->REP1
       IF DICE2=0 THENSTART
          IF WSINCL<K THEN ->DONE
       FINISHELSESTART
          CYCLE J=19,1,24
             IF BOARD(J)_WS>0 THENSTART
                NOMOV=0; MTSTBOFF(J,DICE2)
                IF NOMOV=1 THEN ->REP2
                IF DICE3=0 THENSTART
                   IF WSINCL<K THEN ->DONE
                FINISHELSESTART
                   CYCLE G=19,1,24
                      IF BOARD(G)_WS>0 THENSTART
                         NOMOV=0; MTSTBOFF(G,DICE3)
                         IF NOMOV=1 THEN ->REP3
                         IF DICE4=0 THENSTART
                            IF WSINCL<K THEN ->DONE
                         FINISHELSESTART
                            CYCLE H=19,1,24
                               IF BOARD(H)_WS>0 THENSTART
                                  NOMOV=0; MTSTBOFF(H,DICE4)
                                  IF NOMOV=1 THEN ->REP4
                                  IF WSINCL<K THEN ->DONE
                                  CLTSTBOFF(H,DICE4)
                               FINISH
REP4:                       REPEAT
                         FINISH
                         CLTSTBOFF(G,DICE3)
                      FINISH
REP3:              REPEAT
                FINISH
                CLTSTBOFF(J,DICE2)
             FINISH
REP2:     REPEAT
       FINISH
       CLTSTBOFF(I,DICE1)
    FINISH
REP1: REPEAT
 REPEAT
 REPEAT
 DUMPWTS
END

begin
  backgammon("")
end

ENDOFFILE