home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / FORTRAN / MISCFORN.ZIP / CHESS.FOR < prev    next >
Encoding:
Text File  |  1987-01-11  |  24.0 KB  |  937 lines

  1. C   MODIFIED FOR CROMEMCO'S Z80 FORTRAN, 20/9/1978
  2.       DIMENSION NICT(16)
  3.       COMMON/BOARD/JBOARD(120)
  4.       COMMON/WHITE/MYPCE(16),MYTYPE(16),MYVAL(6),MYMEN,MYQN,MYKG
  5.       COMMON/BLACK/ISPCE(16),ISTYPE(16),ISVAL(6),ISMEN,ISQN,ISKG
  6.       COMMON/BAL/MATBAL,LEV
  7.       COMMON/KEY/KEY(8),NUMB(8),MEN(6),IA,IB,ID,IR,IO,IW,ISTR,MINUS
  8.       LR=1
  9.       LP=1
  10.       WRITE(LP,101)
  11.   101 FORMAT(1X//1X,19HMIKES CHESS PROGRAM//)
  12.       KECK=0
  13.   149 WRITE(LP,150)
  14.   150 FORMAT(1X,14HLEVEL 0 OR 1 ?)
  15.       READ(LR,160)LEV
  16.   160 FORMAT(I1)
  17.       IF(LEV.LT.0)GO TO 149
  18.       IF(LEV.GT.1)GO TO 149
  19.       MOVE=0
  20.       WRITE(LP,102)
  21.   102 FORMAT(1X,42HCOMPUTER TO PLAY WHITE (0) OR BLACK (1) ? )
  22.       READ(LR,103)KOLOR
  23.   103 FORMAT(I1)
  24.       WRITE(LP,104)
  25.   104 FORMAT(1X)
  26.       IF(KOLOR)20,20,11
  27.    20 CALL HEUR(MOVE)
  28.       CALL TREE(MOV,MATE)
  29.       IF(KECK)30,30,31
  30.    30 IF(MATE)15,15,37
  31.    31 IF(MATE)34,34,33
  32.    33 WRITE(LP,105)
  33.   105 FORMAT(1X,4HMATE/1X,16H  YOU WERE LUCKY)
  34.       GO TO 26
  35.    34 WRITE(LP,104)
  36.       GO TO 32
  37.    15 WRITE(LP,104)
  38.    32 CALL MYGO(LSQ,NSQ,KAPT,MOV,KASTLE,IPROM,KECK)
  39.       WRITE(LP,46)MOVE
  40.    46 FORMAT(1X,I2,2H. ,10HMY MOVE:- )
  41.       IF(KASTLE)55,57,56
  42.    55 WRITE(LP,106)
  43.   106 FORMAT(1X,4HO-OO)
  44.       GO TO 24
  45.    56 WRITE(LP,107)
  46.   107 FORMAT(1X,3HO-O)
  47.       GO TO 24
  48.    57 IF(KAPT)27,27,28
  49.    27 LD=MINUS
  50.       GO TO 29
  51.    28 LD=ISTR
  52.    29 LSQ=LSQ-21
  53.       DO 41 IJ=1,8
  54.       IF(LSQ.LT.10)GO TO 42
  55.       LSQ=LSQ-10
  56.    41 CONTINUE
  57.    42 NSQ=NSQ-21
  58.       DO 43 KJ=1,8
  59.       IF(NSQ.LT.10)GO TO 44
  60.       NSQ=NSQ-10
  61.    43 CONTINUE
  62.    44 IF(KOLOR)71,71,70
  63.    70 IJ=9-IJ
  64.       KJ=9-KJ
  65.    71 WRITE(LP,45)KEY(LSQ),IJ,LD,KEY(NSQ),KJ
  66.    45 FORMAT(1X,A1,I1,A1,A1,I1)
  67.       IF(IPROM)24,24,23
  68.    23 WRITE(LP,108)
  69.   108 FORMAT(1X,24H  PAWN PROMOTES TO QUEEN)
  70.    24 IF(KECK)35,35,36
  71.    35 IF(MATE)37,8,8
  72.    36 IF(MATE)38,39,39
  73.    37 WRITE(LP,109)
  74.   109 FORMAT(1X,11H  STALEMATE)
  75.       GO TO 26
  76.    38 WRITE(LP,110)
  77.   110 FORMAT(1X,11H  CHECKMATE/1X,11H  THANK YOU)
  78.       GO TO 26
  79.    39 WRITE(LP,111)
  80.   111 FORMAT(1X,7H  CHECK)
  81.     8 CONTINUE
  82.    11 WRITE(LP,47)
  83.    47 FORMAT(3X,12HYOUR MOVE:- )
  84.       READ(LR,48)L1,N1,IL,L2,N2
  85.    48 FORMAT(5A1)
  86.       KASTLE=0
  87.       IF(L1.EQ.IB.AND.IL.EQ.IA.AND.L2.EQ.IR)GO TO 200
  88.       IF(L1.EQ.ID.AND.IL.EQ.IA.AND.L2.EQ.IW)GO TO 300
  89.       IF(L1.EQ.IO.AND.IL.EQ.IO)KASTLE=1
  90.       IF(KASTLE.EQ.1.AND.L2.EQ.IO)KASTLE=-1
  91.       IF(KASTLE)63,62,63
  92.    62 DO 401 IJ=1,8
  93.       IF(N1.EQ.NUMB(IJ))GO TO 402
  94.   401 CONTINUE
  95.       GO TO 11
  96.   402 DO 403 KJ=1,8
  97.       IF(N2.EQ.NUMB(KJ))GO TO 404
  98.   403 CONTINUE
  99.       GO TO 11
  100.   404 IF(KOLOR)73,73,72
  101.    72 IJ=9-IJ
  102.       KJ=9-KJ
  103.    73 DO 49 I=1,8
  104.       IF(L1.EQ.KEY(I))GO TO 50
  105.    49 CONTINUE
  106.       GO TO 11
  107.    50 LSQ=10*(IJ-1)+I+21
  108.       DO 51 I=1,8
  109.       IF(L2.EQ.KEY(I))GO TO 52
  110.    51 CONTINUE
  111.       GO TO 11
  112.    52 NSQ=10*(KJ-1)+I+21
  113.    63 CALL ISGO(LSQ,NSQ,ILLEG,KASTLE,ILLCAS,IPROM,KECK)
  114.       IF(IPROM)19,19,18
  115.    18 WRITE(LP,108)
  116.    19 IF(KECK)10,10,9
  117.     9 WRITE(LP,25)
  118.    25 FORMAT(3X,5HCHECK)
  119.    10 IF(ILLCAS)61,61,60
  120.    60 WRITE(LP,112)
  121.   112 FORMAT(1X,27H  ILLEGAL ATTEMPT TO CASTLE)
  122.       GO TO 11
  123.    61 IF(ILLEG)20,13,12
  124.    12 WRITE(LP,113)
  125.   113 FORMAT(1X,14H  ILLEGAL MOVE)
  126.       GO TO 11
  127.    13 WRITE(LP,114)
  128.   114 FORMAT(1X,25H  ILLEGAL MOVE INTO CHECK)
  129.       GO TO 11
  130.   200 WRITE(LP,104)
  131.       IDOT=0
  132.       IF(KOLOR)201,201,202
  133.   201 WRITE(LP,115)
  134.   115 FORMAT(1X,33H           H  G  F  E  D  C  B  A)
  135.       NUM=0
  136.       KL=1
  137.       GO TO 203
  138.   202 WRITE(LP,116)
  139.   116 FORMAT(1X,33H           A  B  C  D  E  F  G  H)
  140.       NUM=9
  141.       KL=-1
  142.   203 DO 216 LINE=21,100,10
  143.       NUM=NUM+KL
  144.       IDOT=1-IDOT
  145.       DO 214 I=1,8
  146.       IPC=ISTR
  147.       KOL=ISTR
  148.       IDOT=IDOT+1
  149.       IF(IDOT-2)218,217,217
  150.   217 IDOT=0
  151.       IPC=MINUS
  152.       KOL=MINUS
  153.   218 IF(KOLOR)223,223,224
  154.   223 IP=LINE+9-I
  155.       GO TO 225
  156.   224 IP=LINE+I
  157.   225 JBI=JBOARD(IP)
  158.       DO 207 IT=1,6
  159.       IF(JBI.EQ.MYVAL(IT))GO TO 208
  160.       IF(JBI.EQ.ISVAL(IT))GO TO 209
  161.   207 CONTINUE
  162.       GO TO 212
  163.   208 IF(KOLOR)211,211,210
  164.   209 IF(KOLOR)210,210,211
  165.   210 KOL=IB
  166.       GO TO 219
  167.   211 KOL=IW
  168.   219 IPC=MEN(IT)
  169.   212 NICT(2*I-1)=KOL
  170.       NICT(2*I)=IPC
  171.   214 CONTINUE
  172.       WRITE(LP,213)NUM,NICT,NUM
  173.   213 FORMAT(8X,I1,1X,8(1X,2A1),3X,I1)
  174.   216 CONTINUE
  175.       IF(KOLOR)220,220,221
  176.   220 WRITE(LP,115)
  177.       GO TO 222
  178.   221 WRITE(LP,116)
  179.   222 WRITE(LP,104)
  180.       GO TO 11
  181.   300 IF(MATBAL+15)301,302,302
  182.   301 WRITE(LP,117)
  183.   117 FORMAT(1X,21H  YES - O.K. ACCEPTED)
  184.       GO TO 26
  185.   302 IF(MATBAL-70)303,304,304
  186.   303 WRITE(LP,118)
  187.   118 FORMAT(1X,21H  NO - OFFER DECLINED)
  188.       GO TO 11
  189.   304 WRITE(LP,119)
  190.   119 FORMAT(1X,20H  YOU MUST BE JOKING)
  191.       GO TO 11
  192.    26 CALL EXIT
  193.       END
  194.       BLOCKDATA
  195.       COMMON/INCRE/INK(16)
  196.       COMMON/BOARD/JBOARD(120)
  197.       COMMON/WHITE/MYPCE(16),MYTYPE(16),MYVAL(6),MYMEN,MYQN,MYKG
  198.       COMMON/BLACK/ISPCE(16),ISTYPE(16),ISVAL(6),ISMEN,ISQN,ISKG
  199.       COMMON/FIELD/KFLD(100),KENT(100),KPRI(6),IJK(10)
  200.       COMMON/KEY/KEY(8),NUMB(8),MEN(6),IA,IB,ID,IR,IO,IW,ISTR,MINUS
  201.       COMMON/LARGE/JBIG,JVBIG
  202.       COMMON/NGAME/NGAME,LIMIT
  203.       COMMON/BAL/MATBAL,LEV
  204.       DATA INK/-9,-11,9,11,1,10,-1,-10,8,12,19,21,-8,-12,-19,-21/
  205.       DATA JBOARD/
  206.      +       1111,1111,1111,1111,1111,1111,1111,1111,1111,1111
  207.      +      ,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111
  208.      +      ,1111,  50,  33,  35,  90, 900,  35,  33,  50,1111
  209.      +      ,1111,  10,  10,  10,  10,  10,  10,  10,  10,1111
  210.      +      ,1111,   0,   0,   0,   0,   0,   0,   0,   0,1111
  211.      +      ,1111,   0,   0,   0,   0,   0,   0,   0,   0,1111
  212.      +      ,1111,   0,   0,   0,   0,   0,   0,   0,   0,1111
  213.      +      ,1111,   0,   0,   0,   0,   0,   0,   0,   0,1111
  214.      +      ,1111, -10, -10, -10, -10, -10, -10, -10, -10,1111
  215.      +      ,1111, -50, -33, -35, -90,-900, -35, -33, -50,1111
  216.      +      ,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111
  217.      +      ,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111/
  218.       DATA MYPCE/36,35,23,28,34,37,24,27,25,22,29,33,38,32,39,26/
  219.       DATA MYTYPE/6, 6, 4, 4, 6, 6, 3, 3, 1, 2, 2, 6, 6, 6, 6, 5/
  220.       DATA NUMB/2H1 ,2H2 ,2H3 ,2H4 ,2H5 ,2H6 ,2H7 ,2H8 /
  221.       DATA MYMEN,MYQN,MYKG,MYVAL/16,1,1,90,50,35,33,900,10/
  222.       DATA ISPCE/86,85,93,98,84,87,94,97,95,92,99,83,88,82,89,96/
  223.       DATA ISTYPE/6, 6, 4, 4, 6, 6, 3, 3, 1, 2, 2, 6, 6, 6, 6, 5/
  224.       DATA ISMEN,ISQN,ISKG,ISVAL/16,1,1,-90,-50,-35,-33,-900,-10/
  225.       DATA KENT/
  226.      +            0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  227.      +          , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  228.      +          , 0, 0, 1, 2, 3, 3, 2, 1, 0, 0
  229.      +          , 0, 1, 3, 4, 5, 5, 4, 3, 1, 0
  230.      +          , 0, 2, 4, 6, 7, 7, 6, 4, 2, 0
  231.      +          , 0, 3, 5, 7, 8, 8, 7, 5, 3, 0
  232.      +          , 0, 3, 5, 7, 8, 8, 7, 5, 3, 0
  233.      +          , 0, 2, 4, 6, 7, 7, 6, 4, 2, 0
  234.      +          , 0, 1, 3, 4, 5, 5, 4, 3, 1, 0
  235.      +          , 0, 0, 1, 2, 3, 3, 2, 1, 0, 0/
  236.       DATA KFLD/100*0/,KPRI/2,0,3,4,0,1/,IJK/10,8,2,7*0/
  237.       DATA KEY/2HA ,2HB ,2HC ,2HD ,2HE ,2HF ,2HG ,2HH /
  238.       DATA MEN/2HQ ,2HR ,2HB ,2HN ,2HK ,2HP /
  239.       DATA IA/2HA /,IB/2HB /,ID/2HD /,IR/2HR /,IO/2HO /,IW/2HW /
  240.      +,ISTR/2H: /,MINUS/2H- /
  241.       DATA NGAME/0/,LIMIT/1090/,MATBAL/0/,JBIG/10000/,JVBIG/30000/
  242.       END
  243.       SUBROUTINE HEUR(MOVE)
  244.       COMMON MOVES(100,4),MARK(100),NMOVE
  245.       COMMON/BOARD/JBOARD(120)
  246.       COMMON/WHITE/MYPCE(16),MYTYPE(16),MYVAL(6),MYMEN,MYQN,MYKG
  247.       COMMON/BLACK/ISPCE(16),ISTYPE(16),ISVAL(6),ISMEN,ISQN,ISKG
  248.       COMMON/FIELD/KFLD(100),KENT(100),KPRI(6),IJK(10)
  249.       COMMON/LARGE/JBIG,JVBIG
  250.       COMMON/NGAME/NGAME,LIMIT
  251.       MOVE=MOVE+1
  252.       IF(MOVE-9)8,7,44
  253.     7 KPRI(5)=1
  254.       KPRI(2)=2
  255.       KPRI(6)=3
  256.    44 IF(NGAME.EQ.1)GO TO 104
  257.       MYTOT=0
  258.       DO 100 I=1,MYMEN
  259.       NJ=MYTYPE(I)
  260.   100 MYTOT=MYTOT+MYVAL(NJ)
  261.       IF(MYTOT-LIMIT)103,103,101
  262.   101 ISTOT=0
  263.       DO 102 I=1,ISMEN
  264.       NJ=ISTYPE(I)
  265.   102 ISTOT=ISTOT+ISVAL(NJ)
  266.       IF(ISTOT+LIMIT)104,103,103
  267.   103 NGAME=1
  268.       KPRI(1)=1
  269.       KPRI(2)=1
  270.       KPRI(5)=4
  271.       KPRI(6)=0
  272.   104 DO 47 I=1,ISMEN
  273.       IF(ISTYPE(I)-5)47,46,47
  274.    46 KI=ISPCE(I)
  275.       GO TO 48
  276.    47 CONTINUE
  277.    48 KFLD(KI)=99
  278.       DO 71 KJ=1,10
  279.       IF(KI.LE.10)GO TO 72
  280.       KI=KI-10
  281.    71 CONTINUE
  282.    72 IPR=0
  283.    73 IPR=IPR+1
  284.       IF(IPR.GT.10)GO TO 8
  285.       I=KI-IPR
  286.       IF(I.LE.0)GO TO 75
  287.       DO 74 L=1,10
  288.       LP=10*(L-1)+I
  289.    74 KFLD(LP)=IJK(IPR)
  290.    75 I=KI+IPR
  291.       IF(I.GT.10)GO TO 77
  292.       DO 76 L=1,10
  293.       LP=10*(L-1)+I
  294.    76 KFLD(LP)=IJK(IPR)
  295.    77 J=KJ-IPR
  296.       IF(J.LE.0)GO TO 79
  297.       DO 78 L=1,10
  298.       LP=10*(J-1)+L
  299.    78 KFLD(LP)=IJK(IPR)
  300.    79 J=KJ+IPR
  301.       IF(J.GT.10)GO TO 73
  302.       DO 80 L=1,10
  303.       LP=10*(J-1)+L
  304.    80 KFLD(LP)=IJK(IPR)
  305.       GO TO 73
  306.     8 NMOVE=0
  307.       CALL MYCAS
  308.       MAN=0
  309.     1 CALL WMOVE(MAN,JV,LSQ,NSQ,KON,IPT,IFN,KC,NX,IP,MORE,0)
  310.       IF(MORE)3,3,2
  311.     2 NMOVE=NMOVE+1
  312.       MOVES(NMOVE,1)=JV
  313.       MOVES(NMOVE,2)=LSQ
  314.       MOVES(NMOVE,3)=NSQ
  315.       MOVES(NMOVE,4)=KON
  316.       JT=MYTYPE(MAN)
  317.       MARK(NMOVE)=KPRI(JT)*(KENT(NSQ)-KENT(LSQ)+KFLD(NSQ)-KFLD(LSQ))
  318.       IBON=0
  319.       IF(JT-6)6,4,4
  320.     4 IF(KON)35,19,35
  321.    19 IF(NSQ-56)24,20,24
  322.    20 IF(LSQ-36)22,21,22
  323.    21 IBON=30
  324.       IF(JBOARD(65).EQ.ISVAL(6).OR.JBOARD(67).EQ.ISVAL(6))IBON=5
  325.       GO TO 5
  326.    22 IF(LSQ-46)5,28,5
  327.    24 IF(NSQ-55)29,25,29
  328.    25 IF(LSQ-35)27,26,27
  329.    26 IBON=20
  330.       IF(JBOARD(64).EQ.ISVAL(6).OR.JBOARD(66).EQ.ISVAL(6))IBON=5
  331.       GO TO 5
  332.    27 IF(LSQ-45)5,28,5
  333.    28 IBON=2
  334.       GO TO 5
  335.    29 IF(LSQ-32)30,31,30
  336.    30 IF(LSQ-39)39,31,39
  337.    31 IBON=-5
  338.       GO TO 5
  339.    39 IF(LSQ-35)52,51,52
  340.    52 IF(LSQ-36)5,51,5
  341.    51 IBON=10
  342.       GO TO 5
  343.    35 IF(MARK(NMOVE))36,37,37
  344.    36 IBON=-5
  345.       GO TO 38
  346.    37 IBON=5
  347.    38 IF(JBOARD(NSQ-10).EQ.MYVAL(6))IBON=IBON-10
  348.       IF(JBOARD(NSQ+10).EQ.MYVAL(6))IBON=IBON-10
  349.       GO TO 5
  350.     6 IF(MOVE.GE.9)GO TO 40
  351.       IF(JT.EQ.4.AND.(NSQ.EQ.42.OR.NSQ.EQ.49))IBON=-15
  352.       IF(NSQ.EQ.45.AND.JBOARD(35).EQ.MYVAL(6))IBON=-50
  353.       IF(NSQ.EQ.46.AND.JBOARD(36).EQ.MYVAL(6))IBON=-50
  354.       IF(JT.EQ.3.AND.LSQ.EQ.27)IBON=IBON+2
  355.       IF(JT.EQ.4.AND.LSQ.EQ.28)IBON=IBON+2
  356.       GO TO 50
  357.     5 IF(MOVE.LT.9)GO TO 50
  358.    40 M2=0
  359.    41 CALL WMOVE(M2,JV2,LSQ2,NSQ2,KON2,IPT2,IFN2,KC2,NX2,IP2,MOR2,0)
  360.       IF(MOR2)45,45,42
  361.    42 IBON=IBON+1
  362.       GO TO 41
  363.    45 IF(LSQ.EQ.44.AND.JBOARD(34).EQ.MYVAL(6))IBON=IBON+5
  364.       IF(LSQ.EQ.47.AND.JBOARD(37).EQ.MYVAL(6))IBON=IBON+5
  365.       IF(NGAME)50,50,105
  366.   105 IF(JT.NE.6)GO TO 50
  367.       IBON=IBON+10
  368.       IF(NSQ-LSQ.EQ.20)IBON=IBON+5
  369.    50 MARK(NMOVE)=MARK(NMOVE)+IBON
  370.       GO TO 1
  371.     3 DO 14 I=1,NMOVE
  372.       JB=-JBIG
  373.       DO 12 J=I,NMOVE
  374.       IF(MARK(J)-JB)12,12,11
  375.    11 IP=J
  376.       JB=MARK(J)
  377.    12 CONTINUE
  378.       DO 13 K=1,4
  379.       INTER=MOVES(I,K)
  380.       MOVES(I,K)=MOVES(IP,K)
  381.    13 MOVES(IP,K)=INTER
  382.       MARK(IP)=MARK(I)
  383.    14 CONTINUE
  384.       RETURN
  385.       END
  386.       SUBROUTINE MYCAS
  387.       COMMON MOVES(100,4),MARK(100),NMOVE
  388.       COMMON/WHITE/MYPCE(16),MYTYPE(16),MYVAL(6),MYMEN,MYQN,MYKG
  389.       COMMON/BOARD/JBOARD(120)
  390.       IF(MYQN)10,10,1
  391.     1 DO 3 I=23,25
  392.       IF(JBOARD(I))10,3,10
  393.     3 CONTINUE
  394.       MAN=0
  395.     4 CALL BMOVE(MAN,JV,LSQ,NSQ,KON,IPT,IFN,KC,NX,IP,MORE,0)
  396.       IF(MORE)6,10,5
  397.     5 IF(NSQ.GE.24.AND.NSQ.LE.26)MORE=0
  398.       GO TO 4
  399.     6 NMOVE=NMOVE+1
  400.       MOVES(NMOVE,1)=-1
  401.       MARK(NMOVE)=40
  402.    10 IF(MYKG)20,20,11
  403.    11 DO 12 I=27,28
  404.       IF(JBOARD(I))20,12,20
  405.    12 CONTINUE
  406.       MAN=0
  407.    13 CALL BMOVE(MAN,JV,LSQ,NSQ,KON,IPT,IFN,KC,NX,IP,MORE,0)
  408.       IF(MORE)15,20,14
  409.    14 IF(NSQ.GE.26.AND.NSQ.LE.28)MORE=0
  410.       GO TO 13
  411.    15 NMOVE=NMOVE+1
  412.       MOVES(NMOVE,1)=0
  413.       MARK(NMOVE)=90
  414.    20 RETURN
  415.       END
  416. C   CREATE AND SEARCH MOVE TREE
  417.       SUBROUTINE TREE(MOV,MATE)
  418.       COMMON/WHITE/MYPCE(16),MYTYPE(16),MYVAL(6),MYMEN,MYQN,MYKG
  419.       COMMON/BLACK/ISPCE(16),ISTYPE(16),ISVAL(6),ISMEN,ISQN,ISKG
  420.       COMMON/BAL/MATBAL,LEV
  421.       COMMON/LARGE/JBIG,JVBIG
  422.       MATE=0
  423.       IJ=1
  424.       IK=1
  425. C  ADJUST DEPTH TO SUIT COMPUTER SPEED
  426. C  LEV=0 FOR SLOW COMPUTERS; LEV=1 FOR FASTER COMPUTERS
  427.       MYKING=MYVAL(5)
  428.       ISKING=ISVAL(5)
  429.       JAB1=-JVBIG
  430.       MOR1=1
  431.       NM=0
  432.    11 CALL FMOVE(JV1,LSQ1,NSQ1,KON1,NM,KAS,IP1,MOR1)
  433.       IF(MOR1)10,10,41
  434.    41 JAB2=JVBIG
  435.       M2=0
  436.    12 CALL BMOVE(M2,JV2,LSQ2,NSQ2,KON2,IPT2,IFN2,KC2,NX2,IP2,MOR2,0)
  437.       IF(MOR2)8,9,42
  438.    42 IF(KON2-MYKING)61,60,61
  439.    60 MOR2=0
  440.       IJ=M2
  441.       GO TO 12
  442.    61 JAB3=JAB1
  443.       M3=0
  444.    13 CALL WMOVE(M3,JV3,LSQ3,NSQ3,KON3,IPT3,IFN3,KC3,NX3,IP3,MOR3,0)
  445.       IF(MOR3)6,7,43
  446.    43 IF(KON3-ISKING)63,62,63
  447.    62 MOR3=0
  448.       IK=M3
  449.       GO TO 13
  450.    63 JAB4=JAB2
  451.       M4=0
  452.       IF(MATBAL-JAB4)21,22,22
  453.    21 JAB4=MATBAL
  454.    22 IF(JAB4.LE.JAB3)GO TO 5
  455.    14 CALL BMOVE(M4,JV4,LSQ4,NSQ4,KON4,IPT4,IFN4,KC4,NX4,IP4,MOR4,1)
  456.       IF(MOR4)4,5,44
  457.    44 IF(KON4-MYKING)70,69,70
  458.    69 JAB4=-JBIG
  459.       GO TO 3
  460.    70 JAB5=JAB3
  461.       M5=0
  462.       IF(MATBAL-JAB5)24,24,23
  463.    23 JAB5=MATBAL
  464.    24 IF(JAB5.GE.JAB4)GO TO 3
  465.    15 CALL WMOVE(M5,JV5,LSQ5,NSQ5,KON5,IPT5,IFN5,KC5,NX5,IP5,MOR5,1)
  466.       IF(MOR5)2,3,45
  467.    45 IF(LEV)46,46,101
  468.    46 IF(MATBAL-JAB5)26,26,120
  469.   120 JAB5=MATBAL
  470.       GO TO 26
  471.   101 IF(KON5-ISKING)103,102,103
  472.   102 JAB5=JBIG
  473.       GO TO 26
  474.   103 JAB6=JAB4
  475.       M6=0
  476.       IF(MATBAL-JAB6)104,105,105
  477.   104 JAB6=MATBAL
  478.   105 IF(JAB6.LE.JAB5)GO TO 26
  479.   106 CALL BMOVE(M6,JV6,LSQ6,NSQ6,KON6,IPT6,IFN6,KC6,NX6,IP6,MOR6,1)
  480.       IF(MOR6)25,26,107
  481.   107 IF(KON6-MYKING)109,108,109
  482.   108 JAB6=-JBIG
  483.       GO TO 117
  484.   109 JAB7=JAB5
  485.       M7=0
  486.       IF(MATBAL-JAB7)111,111,110
  487.   110 JAB7=MATBAL
  488.   111 IF(JAB7.GE.JAB6)GO TO 117
  489.   112 CALL WMOVE(M7,JV7,LSQ7,NSQ7,KON7,IPT7,IFN7,KC7,NX7,IP7,MOR7,1)
  490.       IF(MOR7)116,117,113
  491.   113 IF(MATBAL-JAB7)115,115,114
  492.   114 JAB7=MATBAL
  493.   115 IF(JAB7.GE.JAB6)MOR7=0
  494.       GO TO 112
  495.   116 JAB6=JAB7
  496.   117 IF(JAB6.LE.JAB5)MOR6=0
  497.       GO TO 106
  498.    25 JAB5=JAB6
  499.    26 IF(JAB5.GE.JAB4)MOR5=0
  500.       GO TO 15
  501.     2 JAB4=JAB5
  502.     3 IF(JAB4.LE.JAB3)MOR4=0
  503.       GO TO 14
  504.     4 JAB3=JAB4
  505.       IK=M3
  506.     5 IF(JAB3.GE.JAB2)MOR3=0
  507.       GO TO 13
  508.     6 JAB2=JAB3
  509.       IJ=M2
  510.     7 IN3=MYPCE(IK)
  511.       IN4=MYTYPE(IK)
  512.    33 IF(IK.EQ.1)GO TO 34
  513.       IK1=IK-1
  514.       MYPCE(IK)=MYPCE(IK1)
  515.       MYTYPE(IK)=MYTYPE(IK1)
  516.       IK=IK1
  517.       GO TO 33
  518.    34 MYPCE(1)=IN3
  519.       MYTYPE(1)=IN4
  520.       IF(JAB2.LE.JAB1)MOR2=0
  521.       GO TO 12
  522.     8 JAB1=JAB2
  523.       MOV=NM
  524.     9 IN1=ISPCE(IJ)
  525.       IN2=ISTYPE(IJ)
  526.    31 IF(IJ.EQ.1)GO TO 32
  527.       IJ1=IJ-1
  528.       ISPCE(IJ)=ISPCE(IJ1)
  529.       ISTYPE(IJ)=ISTYPE(IJ1)
  530.       IJ=IJ1
  531.       GO TO 31
  532.    32 ISPCE(1)=IN1
  533.       ISTYPE(1)=IN2
  534.       GO TO 11
  535.    10 IF(JAB1.EQ.-JVBIG)MATE=1
  536.       IF(JAB1.EQ.JVBIG)MATE=-1
  537.       RETURN
  538.       END
  539.       SUBROUTINE FMOVE(JV,LSQ,NSQ,KON,NM,KASTLE,IPROM,MORE)
  540.       COMMON MOVES(100,4),MARK(100),NMOVE
  541.       COMMON/BOARD/JBOARD(120)
  542.       COMMON/BAL/MATBAL,LEV
  543.       COMMON/WHITE/MYPCE(16),MYTYPE(16),MYVAL(6),MYMEN,MYQN,MYKG
  544.       IF(MORE)4,4,5
  545.     5 IF(NM)2,2,1
  546.     1 IF(KASTLE)28,29,27
  547.    27 JBOARD(26)=MYVAL(5)
  548.       JBOARD(27)=0
  549.       JBOARD(28)=0
  550.       JBOARD(29)=MYVAL(2)
  551.       DO 30 I=1,MYMEN
  552.       IF(MYPCE(I).EQ.28)MYPCE(I)=26
  553.       IF(MYPCE(I).EQ.27)MYPCE(I)=29
  554.    30 CONTINUE
  555.       GO TO 2
  556.    28 JBOARD(22)=MYVAL(2)
  557.       JBOARD(24)=0
  558.       JBOARD(25)=0
  559.       JBOARD(26)=MYVAL(5)
  560.       DO 31 I=1,MYMEN
  561.       IF(MYPCE(I).EQ.24)MYPCE(I)=26
  562.       IF(MYPCE(I).EQ.25)MYPCE(I)=22
  563.    31 CONTINUE
  564.       GO TO 2
  565.    29 DO 23 MAN=1,MYMEN
  566.       IF(MYPCE(MAN).EQ.NSQ)GO TO 24
  567.    23 CONTINUE
  568.    24 IF(IPROM)25,25,26
  569.    26 MATBAL=MATBAL-MYVAL(1)+MYVAL(6)
  570.       JV=MYVAL(6)
  571.       MYTYPE(MAN)=6
  572.    25 MYPCE(MAN)=LSQ
  573.       JBOARD(LSQ)=JV
  574.       JBOARD(NSQ)=KON
  575.       MATBAL=MATBAL+KON
  576.     2 NM=NM+1
  577.       IF(NM-NMOVE)4,4,3
  578.     3 MORE=-1
  579.       GO TO 7
  580.     4 IPROM=0
  581.       KASTLE=0
  582.       JV=MOVES(NM,1)
  583.       IF(JV)10,9,8
  584.     9 KASTLE=1
  585.       JBOARD(26)=0
  586.       JBOARD(27)=MYVAL(2)
  587.       JBOARD(28)=MYVAL(5)
  588.       JBOARD(29)=0
  589.       DO 11 I=1,MYMEN
  590.       IF(MYPCE(I).EQ.26)MYPCE(I)=28
  591.       IF(MYPCE(I).EQ.29)MYPCE(I)=27
  592.    11 CONTINUE
  593.       GO TO 7
  594.    10 KASTLE=-1
  595.       JBOARD(22)=0
  596.       JBOARD(24)=MYVAL(5)
  597.       JBOARD(25)=MYVAL(2)
  598.       JBOARD(26)=0
  599.       DO 12 I=1,MYMEN
  600.       IF(MYPCE(I).EQ.26)MYPCE(I)=24
  601.       IF(MYPCE(I).EQ.22)MYPCE(I)=25
  602.    12 CONTINUE
  603.       GO TO 7
  604.     8 LSQ=MOVES(NM,2)
  605.       NSQ=MOVES(NM,3)
  606.       KON=MOVES(NM,4)
  607.       DO 33 MAN=1,MYMEN
  608.       IF(MYPCE(MAN).EQ.LSQ)GO TO 34
  609.    33 CONTINUE
  610.    34 IF(MYTYPE(MAN)-6)6,21,21
  611.    21 IF(NSQ-90)6,22,22
  612.    22 MATBAL=MATBAL+MYVAL(1)-MYVAL(6)
  613.       JV=MYVAL(1)
  614.       MYTYPE(MAN)=1
  615.       IPROM=1
  616.     6 MYPCE(MAN)=NSQ
  617.       JBOARD(LSQ)=0
  618.       JBOARD(NSQ)=JV
  619.       MATBAL=MATBAL-KON
  620.     7 RETURN
  621.       END
  622. C   GENERATE A WHITE MOVE
  623.       SUBROUTINE WMOVE(MAN,JV,LSQ,NSQ,KON,IPT,IFN,KC,NEXT,IP,MORE,KP)
  624.       COMMON/WHITE/MYPCE(16),MYTYPE(16),MYVAL(6),MYMEN,MYQN,MYKG
  625.       COMMON/BOARD/JBOARD(120)
  626.       COMMON/BAL/MATBAL,LEV
  627.       COMMON/INCRE/INK(16)
  628.       IF(MAN)86,86,81
  629.    86 IP=0
  630.       MORE=1
  631.       GO TO 82
  632.    81 IF(IP)65,65,64
  633.    64 MATBAL=MATBAL-MYVAL(1)+MYVAL(6)
  634.       JV=MYVAL(6)
  635.       MYTYPE(MAN)=6
  636.       IP=0
  637.    65 MYPCE(MAN)=LSQ
  638.       JBOARD(LSQ)=JV
  639.       JBOARD(NSQ)=KON
  640.       MATBAL=MATBAL+KON
  641.       IF(MORE)38,38,83
  642.    83 IF(NEXT)16,24,29
  643.    82 MAN=MAN+1
  644.       IF(MAN-MYMEN)84,84,85
  645.    85 MORE=-1
  646.       GO TO 38
  647.    84 LSQ=MYPCE(MAN)
  648.       JV=JBOARD(LSQ)
  649.       NAME=MYTYPE(MAN)
  650.       IF(JV-MYVAL(NAME))82,7,82
  651.     7 GO TO(41,8,9,17,18,40),NAME
  652. C     QUEEN,ROOK OR BISHOP MOVE
  653.    41 IPT=0
  654.       IFN=8
  655.       GO TO 12
  656.     8 IPT=4
  657.       IFN=8
  658.       GO TO 12
  659.     9 IPT=0
  660.       IFN=4
  661.    12 NEXT=-1
  662.    10 IPT=IPT+1
  663.       IF(IPT.GT.IFN)GO TO 82
  664.       KC=INK(IPT)
  665.       NSQ=LSQ
  666.    11 NSQ=NSQ+KC
  667.       KON=JBOARD(NSQ)
  668.       IF(KON)37,36,10
  669.    16 IF(KON)10,11,10
  670. C     KING OR KNIGHT MOVE
  671.    17 IPT=8
  672.       IFN=16
  673.       GO TO 19
  674.    18 IPT=0
  675.       IFN=8
  676.    19 NEXT=0
  677.    24 IPT=IPT+1
  678.       IF(IPT.GT.IFN)GO TO 82
  679.       NSQ=LSQ+INK(IPT)
  680.       KON=JBOARD(NSQ)
  681.       IF(KON)37,36,24
  682. C     PAWN MOVE
  683.    40 NEXT=1
  684.       IPT=0
  685.    29 IPT=IPT+1
  686.       IF(IPT.GT.4)GO TO 82
  687.       IF(IPT-2)27,31,30
  688.    27 NSQ=LSQ+10
  689.       KON=JBOARD(NSQ)
  690.       IF(KON)28,43,28
  691.    43 IF(NSQ-90)36,51,51
  692.    28 IPT=2
  693.       GO TO 29
  694.    31 IF(LSQ-40)32,32,29
  695.    32 NSQ=LSQ+20
  696.       KON=JBOARD(NSQ)
  697.       IF(KON)29,36,29
  698.    30 NSQ=LSQ+INK(IPT)
  699.       KON=JBOARD(NSQ)
  700.       IF(KON)44,29,29
  701.    44 IF(NSQ-90)37,51,51
  702.    36 IF(KP)37,37,83
  703.    51 MATBAL=MATBAL+MYVAL(1)-MYVAL(6)
  704.       JV=MYVAL(1)
  705.       MYTYPE(MAN)=1
  706.       IP=1
  707.    37 MYPCE(MAN)=NSQ
  708.       JBOARD(LSQ)=0
  709.       JBOARD(NSQ)=JV
  710.       MATBAL=MATBAL-KON
  711.    38 RETURN
  712.       END
  713. C   GENERATE A BLACK MOVE
  714.       SUBROUTINE BMOVE(MAN,JV,LSQ,NSQ,KON,IPT,IFN,KC,NEXT,IP,MORE,KP)
  715.       COMMON/BLACK/ISPCE(16),ISTYPE(16),ISVAL(6),ISMEN,ISQN,ISKG
  716.       COMMON/BOARD/JBOARD(120)
  717.       COMMON/BAL/MATBAL,LEV
  718.       COMMON/INCRE/INK(16)
  719.       IF(MAN)86,86,81
  720.    86 IP=0
  721.       MORE=1
  722.       GO TO 82
  723.    81 IF(IP)65,65,64
  724.    64 MATBAL=MATBAL-ISVAL(1)+ISVAL(6)
  725.       JV=ISVAL(6)
  726.       ISTYPE(MAN)=6
  727.       IP=0
  728.    65 ISPCE(MAN)=LSQ
  729.       JBOARD(LSQ)=JV
  730.       JBOARD(NSQ)=KON
  731.       MATBAL=MATBAL+KON
  732.       IF(MORE)38,38,83
  733.    83 IF(NEXT)16,24,29
  734.    82 MAN=MAN+1
  735.       IF(MAN-ISMEN)84,84,85
  736.    85 MORE=-1
  737.       GO TO 38
  738.    84 LSQ=ISPCE(MAN)
  739.       JV=JBOARD(LSQ)
  740.       NAME=ISTYPE(MAN)
  741.       IF(JV-ISVAL(NAME))82,7,82
  742.     7 GO TO(41,8,9,17,18,40),NAME
  743. C     QUEEN,ROOK OR BISHOP MOVE
  744.    41 IPT=0
  745.       IFN=8
  746.       GO TO 12
  747.     8 IPT=4
  748.       IFN=8
  749.       GO TO 12
  750.     9 IPT=0
  751.       IFN=4
  752.    12 NEXT=-1
  753.    10 IPT=IPT+1
  754.       IF(IPT.GT.IFN)GO TO 82
  755.       KC=INK(IPT)
  756.       NSQ=LSQ
  757.    11 NSQ=NSQ+KC
  758.       KON=JBOARD(NSQ)
  759.       IF(KON)10,36,15
  760.    15 IF(KON-1000)37,10,10
  761.    16 IF(KON)10,11,10
  762. C     KING OR KNIGHT MOVE
  763.    17 IPT=8
  764.       IFN=16
  765.       GO TO 19
  766.    18 IPT=0
  767.       IFN=8
  768.    19 NEXT=0
  769.    24 IPT=IPT+1
  770.       IF(IPT.GT.IFN)GO TO 82
  771.       NSQ=LSQ+INK(IPT)
  772.       KON=JBOARD(NSQ)
  773.       IF(KON)24,36,25
  774.    25 IF(KON-1000)37,24,24
  775. C     PAWN MOVE
  776.    40 NEXT=1
  777.       IPT=0
  778.    29 IPT=IPT+1
  779.       IF(IPT.GT.4)GO TO 82
  780.       IF(IPT-2)27,31,30
  781.    27 NSQ=LSQ-10
  782.       KON=JBOARD(NSQ)
  783.       IF(KON)28,43,28
  784.    43 IF(NSQ-30)51,51,36
  785.    28 IPT=2
  786.       GO TO 29
  787.    31 IF(LSQ-80)29,32,32
  788.    32 NSQ=LSQ-20
  789.       KON=JBOARD(NSQ)
  790.       IF(KON)29,36,29
  791.    30 NSQ=LSQ-INK(IPT)
  792.       KON=JBOARD(NSQ)
  793.       IF(KON)29,29,42
  794.    42 IF(KON-1000)44,29,29
  795.    44 IF(NSQ-30)51,51,37
  796.    36 IF(KP)37,37,83
  797.    51 MATBAL=MATBAL+ISVAL(1)-ISVAL(6)
  798.       JV=ISVAL(1)
  799.       ISTYPE(MAN)=1
  800.       IP=1
  801.    37 ISPCE(MAN)=NSQ
  802.       JBOARD(LSQ)=0
  803.       JBOARD(NSQ)=JV
  804.       MATBAL=MATBAL-KON
  805.    38 RETURN
  806.       END
  807.       SUBROUTINE MYGO(LSQ,NSQ,KAPT,MOV,KASTLE,IPROM,KECK)
  808.       COMMON/WHITE/MYPCE(16),MYTYPE(16),MYVAL(6),MYMEN,MYQN,MYKG
  809.       COMMON/BLACK/ISPCE(16),ISTYPE(16),ISVAL(6),ISMEN,ISQN,ISKG
  810.       CALL FMOVE(JV,LSQ,NSQ,KON1,MOV,KASTLE,IPROM,0)
  811.       KAPT=0
  812.       KECK=0
  813.       MAN=0
  814.     1 CALL WMOVE(MAN,JV,LSQ2,NSQ2,KON2,IPT,IFN,KC,NX,IP,MORE,1)
  815.       IF(MORE)3,3,2
  816.     2 IF(KON2.EQ.ISVAL(5))KECK=1
  817.       GO TO 1
  818.     3 IF(KASTLE)12,13,12
  819.    12 MYQN=0
  820.       MYKG=0
  821.       GO TO 11
  822.    13 IF(LSQ.EQ.22)MYQN=0
  823.       IF(LSQ.EQ.29)MYKG=0
  824.       IF(LSQ-26)16,15,16
  825.    15 MYQN=0
  826.       MYKG=0
  827.    16 IF(KON1)7,11,11
  828.     7 IF(NSQ.EQ.92)ISQN=0
  829.       IF(NSQ.EQ.99)ISKG=0
  830.       IJ=0
  831.       KAPT=1
  832.       DO 10 I=1,ISMEN
  833.       IJ=IJ+1
  834.       IF(ISPCE(I)-NSQ)9,8,9
  835.     8 IJ=IJ-1
  836.       GO TO 10
  837.     9 ISPCE(IJ)=ISPCE(I)
  838.       ISTYPE(IJ)=ISTYPE(I)
  839.    10 CONTINUE
  840.       ISMEN=ISMEN-1
  841.    11 RETURN
  842.       END
  843.       SUBROUTINE ISGO(LSQ,NSQ,ILLEG,KASTLE,ILLCAS,IPROM,KECK)
  844.       COMMON/WHITE/MYPCE(16),MYTYPE(16),MYVAL(6),MYMEN,MYQN,MYKG
  845.       COMMON/BLACK/ISPCE(16),ISTYPE(16),ISVAL(6),ISMEN,ISQN,ISKG
  846.       KECK=0
  847.       ILLEG=-1
  848.       ILLCAS=0
  849.       IF(KASTLE)20,23,20
  850.    20 CALL ISCAS(KASTLE,ILLCAS)
  851.       IF(ILLCAS)21,21,19
  852.    21 ISQN=0
  853.       ISKG=0
  854.       GO TO 8
  855.    23 M1=0
  856.     1 CALL BMOVE(M1,JV1,LSQ1,NSQ1,KON1,IPT,IFN,KC,NX1,IPROM,MORE,0)
  857.       IF(MORE)3,7,2
  858.     2 IF(LSQ1.EQ.LSQ.AND.NSQ1.EQ.NSQ)GO TO 4
  859.       GO TO 1
  860.     3 ILLEG=1
  861.       GO TO 19
  862.     4 M2=0
  863.     5 CALL WMOVE(M2,JV2,LSQ2,NSQ2,KON2,IPT,IFN,KC,NX2,IP2,MORE,1)
  864.       IF(MORE)8,1,6
  865.     6 IF(KON2.EQ.ISVAL(5))MORE=0
  866.       GO TO 5
  867.     7 ILLEG=0
  868.       GO TO 19
  869.     8 M2=0
  870.     9 CALL BMOVE(M2,JV2,LSQ2,NSQ2,KON2,IPT,IFN,KC,NX2,IP2,MORE,1)
  871.       IF(MORE)14,14,10
  872.    10 IF(KON2.EQ.MYVAL(5))KECK=1
  873.       GO TO 9
  874.    14 IF(KASTLE)19,22,19
  875.    22 IF(LSQ.EQ.92)ISQN=0
  876.       IF(LSQ.EQ.99)ISKG=0
  877.       IF(LSQ-96)25,24,25
  878.    24 ISQN=0
  879.       ISKG=0
  880.    25 IF(KON1)19,19,15
  881.    15 IF(NSQ.EQ.22)MYQN=0
  882.       IF(NSQ.EQ.29)MYKG=0
  883.       IJ=0
  884.       DO 18 I=1,MYMEN
  885.       IJ=IJ+1
  886.       IF(MYPCE(I)-NSQ)17,16,17
  887.    16 IJ=IJ-1
  888.       GO TO 18
  889.    17 MYPCE(IJ)=MYPCE(I)
  890.       MYTYPE(IJ)=MYTYPE(I)
  891.    18 CONTINUE
  892.       MYMEN=MYMEN-1
  893.    19 RETURN
  894.       END
  895.       SUBROUTINE ISCAS(KASTLE,ILLCAS)
  896.       COMMON/BLACK/ISPCE(16),ISTYPE(16),ISVAL(6),ISMEN,ISQN,ISKG
  897.       COMMON/BOARD/JBOARD(120)
  898.       IF(KASTLE)1,20,10
  899.     1 IF(ISQN)9,9,3
  900.     3 DO 5 I=93,95
  901.       IF(JBOARD(I))9,5,9
  902.     5 CONTINUE
  903.       MAN=0
  904.     6 CALL WMOVE(MAN,JV,LSQ,NSQ,KON,IPT,IFN,KC,NX,IP,MORE,0)
  905.       IF(MORE)30,9,7
  906.     7 IF(NSQ.GE.94.AND.NSQ.LE.96)MORE=0
  907.       GO TO 6
  908.    30 JBOARD(92)=0
  909.       JBOARD(94)=ISVAL(5)
  910.       JBOARD(95)=ISVAL(2)
  911.       JBOARD(96)=0
  912.       DO 31 I=1,ISMEN
  913.       IF(ISPCE(I).EQ.96)ISPCE(I)=94
  914.       IF(ISPCE(I).EQ.92)ISPCE(I)=95
  915.    31 CONTINUE
  916.       GO TO 20
  917.    10 IF(ISKG)9,9,11
  918.    11 DO 13 I=97,98
  919.       IF(JBOARD(I))9,13,9
  920.    13 CONTINUE
  921.       MAN=0
  922.    14 CALL WMOVE(MAN,JV,LSQ,NSQ,KON,IPT,IFN,KC,NX,IP,MORE,0)
  923.       IF(MORE)40,9,15
  924.    15 IF(NSQ.GE.96.AND.NSQ.LE.98)MORE=0
  925.       GO TO 14
  926.    40 JBOARD(96)=0
  927.       JBOARD(97)=ISVAL(2)
  928.       JBOARD(98)=ISVAL(5)
  929.       JBOARD(99)=0
  930.       DO 41 I=1,ISMEN
  931.       IF(ISPCE(I).EQ.96)ISPCE(I)=98
  932.       IF(ISPCE(I).EQ.99)ISPCE(I)=97
  933.    41 CONTINUE
  934.       GO TO 20
  935.     9 ILLCAS=1
  936.    20 RETURN
  937.       END
  938.