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