summaryrefslogtreecommitdiff
path: root/programs
diff options
context:
space:
mode:
Diffstat (limited to 'programs')
-rw-r--r--programs/ComputerEloList197
-rw-r--r--programs/FewBits252
-rw-r--r--programs/PCratings30
-rw-r--r--programs/SSDF-RatingList994
-rw-r--r--programs/engine-intf.html1895
-rw-r--r--programs/harvar93.txt519
-rw-r--r--programs/minimax.bib1338
-rw-r--r--programs/minimax.dvibin0 -> 32832 bytes
-rw-r--r--programs/pentopt.htm6723
-rw-r--r--programs/testsuites2
-rw-r--r--programs/uniacke.ps12175
-rw-r--r--programs/xboard.html1300
12 files changed, 25425 insertions, 0 deletions
diff --git a/programs/ComputerEloList b/programs/ComputerEloList
new file mode 100644
index 0000000..4c7726d
--- /dev/null
+++ b/programs/ComputerEloList
@@ -0,0 +1,197 @@
+Computerrangliste nach Werner Stowasser
+(Stand: Dezember 1992)
+
+Ausgewertet wurden:
+38.710 Partien "Computer gegen Computer"
+ 6.044 Partien "Mensch gegen Computer"
+
+Erklaerung der Abkuerzungen:
+GR = Grossrechner
+PC = PC-Programm
+
+Nr. Schachcomputer Elo
+----------------------------------------------------------------------
+1. Deep Thought II (GR) 2.520
+2. Deep Thought I (GR) 2.470
+3. Cray Blitz (GR) 2.435
+4. Hitech (GR) 2.400
+5. Mephisto Vancouver 68030 2.322
+6. Mephisto RISC 1 MB ARM2 2.319
+7. Mephisto Lyon 68030 2.310
+8. Saitek Kasparow RISC 2500 512 KB ARM2 2.309
+9. Gideon ChessMachine 512 KB ARM2 (PC) 2.291
+10. The King ChessMachine 512 KB ARM2 (PC) 2.289
+11. M Chess 1.66 AT 80486 (PC) 2.285
+12. Mephisto Portorose 68030 2.281
+13. BeBe (GR) 2.260
+14. Fidelity Elite 68040 2.255
+15. Mephisto Vancouver 68020 2.236
+16. Fidelity Elite 68030 2.235
+17. M Chess 1.41 AT 80486 (PC) 2.228
+18. M Chess 1.66 AT 80386 (PC) 2.224
+19. Fidelity Elite 68020 2.220
+20. Mephisto Lyon 68020 2.210
+21. Belle (GR) 2.200
+22. Mephisto Portorose 68020 2.189
+23. Fidelity Mach IV 68020 2.174
+24. M Chess 1.41 AT 80386 (PC) 2.164
+25. Fidelity Elite Premiere 68000 2.162
+ M Chess 1.66 AT 80286 (PC) 2.162
+ Mephisto Vancouver 68000 2.162
+28. Fritz AT 80486 (PC) 2.158
+29. Mephisto Berlin 68000 2.155
+30. Fidelity Designer Master 68020 2.149
+31. Mephisto Almeria 68020 2.145
+32. Mephisto Lyon 68000 2.133
+33. Fidelity Elite 68000 X 2 2.123
+34. Chessmaster 3000 AT 80486 (PC) 2.121
+35. Fidelity Elite 68000 2.108
+36. Mephisto Portorose 68000 2.090
+37. M Chess 1.41 AT 80286 (PC) 2.087
+38. Fidelity Mach III 68000 2.079
+39. Novag Diablo/Scorpio 68000 2.077
+40. Mephisto Roma 68020 2.072
+41. Rexchess V. 2.3 AT 80386 (PC) 2.068
+42. Fidelity Designer Master 68000 2.067
+ Peri Epsilon 68000 2.067
+44. Mephisto Dallas 68020 2.066
+45. Fritz AT 80386 (PC) 2.065
+46. Zarkov V. 2.5 AT 80386 (PC) 2.064
+47. Mephisto Almeria 68000 2.062
+48. Saitek Kasparow GK 2000 H8 - 10 MHz 2.060
+49. Chessmaster 3000 AT 80386 (PC) 2.023
+50. Mephisto Milano 6502 - 5 MHz 2.020
+51. Mephisto Roma 68000 2.020
+52. Novag Super Expert/Forte C 6502 - 6 MHz 2.018
+53. Mephisto Polgar 6502 - 5 MHz 2.015
+54. Mephisto Dallas 68000 2.014
+55. Mephisto MM V 6502 - 5 MHz 2.011
+56. Mephisto Roma II 68000 2.000
+57. Fidelity Mach II 68000 1.993
+58. Mephisto Academy 6502 - 5 MHz 1.976
+59. Mephisto Amsterdam 68000 1.974
+60. Saitek Leonardo M D 6502 - 10 MHz 1.972
+61. Fidelity Travel Master H8 - 10 MHz 1.968
+62. Novag Super Expert/Forte B 6502 - 6 MHz 1.966
+63. Fritz AT 80286 (PC) 1.959
+64. Fidelity Prestige Avantgarde 6502 - 8 MHz + GME 1.955
+65. Mephisto Mega IV 6502 - 5 MHz 1.954
+66. Mephisto MM IV 6502 - 5 MHz 1.940
+67. Fidelity Excel 68000 1.927
+68. Psion Chess Atari 68000 (PC) 1.925
+69. Fidelity Designer 2100 6502 - 6 MHz 1.922
+70. Saitek Turboking 6502 - 5 MHz 1.919
+71. Saitek Travel Champion H8 - 8 MHz 1.912
+72. Chessmaster 3000 AT 80286 (PC) 1.910
+73. Fidelity Elite Avantgarde 6502 - 5 MHz 1.905
+74. Saitek Leonardo M C 6502 - 8 MHz 1.902
+75. CXG Sphinx Galaxy/Dominator 6502 - 4 MHz 1.900
+76. Novag Super Expert/Forte A 6502 - 5 MHz 1.898
+77. Fidelity Par Excellence 6502 - 5 MHz 1.895
+ Fidelity Phantom 6502 - 5 MHz 1.895
+79. Peri Delta 6502 - 5 MHz 1.891
+80. Conchess Plymate Victoria 6502 - 5,5 MHz 1.885
+81. Novag Expert/Forte B 6502 - 5 MHz 1.880
+82. Novag Expert/Forte A 6502 - 5 MHz 1.872
+83. Mephisto College 6502 - 5 MHz 1.868
+84. Fidelity Kishon Chesster 6502 - 3,6 MHz 1.863
+85. Saitek Leonardo M B 6502 - 6 MHz 1.862
+86. Mephisto Monte Carlo/Supermondial 6502 - 4 MHz 1.860
+87. Mephisto Rebell 6502 - 5 MHz 1.851
+88. Saitek Corona 6502 - 6 MHz 1.850
+89. Fidelity Excel Display 6502 - 3 MHz 1.848
+90. Saitek Leonardo M A 6502 - 6 MHz 1.846
+91. Fidelity Excellence 6502 - 4 MHz 1.845
+92. Novag Constellation Expert 6502 - 4 MHz 1.844
+ Saitek Stratos 6502 - 6 MHz 1.844
+94. Saitek Advanced Trainer H8 - 7 MHz 1.837
+95. Conchess Plymate 6502 - 5,5 MHz 1.835
+ Fidelity Elegance 6502 - 3,6 MHz 1.835
+97. Peri Gamma 6502 - 3 MHz 1.834
+98. Saitek Simultano 6502 - 5 MHz 1.832
+99. Saitek Renaissance 6502 - 4 MHz 1.816
+100. Fidelity Excellence 6502 - 3 MHz 1.810
+101. Mephisto MM II 6502 - 3,7 MHz 1.809
+102. Conchess Plymate 6502 - 4 MHz 1.806
+103. Saitek Turbostar 432 6502 - 4 MHz 1.803
+104. Mephisto Modena 6502 - 4 MHz 1.800
+ Novag Superconstellation 6502 - 4 MHz 1.800
+106. Fidelity Elite Glasgow 6502 - 4 MHz 1.797
+107. Novag Super Nova - Single Chip 1.790
+108. Mephisto Glasgow 68000 1.785
+109. Chessplayer 2150 Atari/Amiga 68000 (PC) 1.784
+110. Fidelity Elite Budapest 6502 - 3,6 MHz 1.772
+111. Saitek Kasparov Blitz/Prisma - Single Chip 1.760
+112. Chessmaster 2100 Amiga 68000 (PC) 1.751
+113. Fidelity Elite A/S 6502 - 3,2 MHz 1.750
+114. Novag Constellation Quattro 6502 - 4 MHz 1.748
+115. Fidelity Prestige 6502 - 4 MHz 1.743
+116. Novag Super Vip - Single Chip 1.742
+117. Mephisto B & P 6502 - 3,7 MHz 1.740
+118. Mephisto Europa 6502 - 3 MHz 1.736
+119. Conchess Glasgow 6502 - 4 MHz 1.735
+120. The Final Chesscard 6502 - 5 MHz (PC) 1.733
+121. Novag Constellation 6502 - 3,6 MHz 1.732
+122. Chess Champion 2175 Atari/Amiga 68000 (PC) 1.712
+123. Fidelity Elite 6502 - 4 MHz 1.710
+124. Novag Constellation Primo - Single Chip 1.703
+125. Chessmaster 2000 Atari 68000 (PC) 1.702
+126. Check-Check AT 80386 (PC) 1.695
+127. Fidelity Playmate-S 6502 - 3,2 MHz 1.690
+128. Conchess Glasgow 6502 - 2 MHz 1.685
+129. Novag Constellation 6502 - 2 MHz 1.677
+130. Mephisto Mondial 6502 - 2 MHz 1.675
+131. Fidelity Sensory 12 6502 - 3 MHz 1.670
+132. Novag Amigo - Single Chip 1.650
+133. Fidelity Sensory Super 9 6502 - 2,5 MHz 1.648
+134. Mephisto Schachschule - Single Chip 1.644
+135. Saitek Cavalier - Single Chip 1.642
+136. Saitek Superstar 6502 - 2 MHz 1.630
+137. Mephisto Excalibur II 68000 1.629
+138. Fidelity Sensory 9 6502 - 2 MHz 1.620
+139. Mephisto Excalibur I 68000 1.608
+140. CXG Sphinx Professor - Single Chip 1.595
+141. CXG Super Enterprise - Single Chip 1.585
+142. Steinitz MGS III 6502 - 2,5 MHz 1.584
+143. Bogol 5.0 ASB 6502 - 3 MHz 1.575
+144. Mephisto Mirage 1806 - 8 MHz 1.562
+145. Morphy MGS III 6502 - 2,5 MHz 1.542
+146. Chess 2001 6502 - 4 MHz 1.540
+147. Mephisto III S ESB 6000 1806 - 6,1 MHz 1.534
+148. Fidelity Champion 6502 - 2 MHz 1.530
+149. Saitek Turbo S 6502 - 3 MHz 1.514
+150. Sandy MGS II 6502 - 2 MHz 1.510
+151. SciSys Mark V 1806 - 2,5 MHz 1.495
+152. Sargon ARB 2.0 / MGS II 1806 - 2 MHz 1.480
+153. Destini MM 6502 2 MHz 1.470
+154. Mephisto III 1806 - 3,5 MHz 1.464
+155. Novag Savant Robot 6502 - 2 MHz 1.462
+156. Regence TSB 4 6502 - 2,5 MHz 1.460
+157. Novag Solo - Single Chip 1.443
+158. CXG Enterprise - Single Chip 1.423
+159. Milton 6502 - 2 MHz 1.420
+160. Saitek Turbo - Single Chip 1.416
+161. Sci Sys President Chess 1806 - 2 MHz 1.414
+162. Mephisto II - 1806 - 3,5 MHz 1.412
+163. Fidelity Sensory Voice - Single Chip 1.394
+164. Fidelity Poppy - Single Chip 1.380
+ SciSys Mark III Super System - Single Chip 1.380
+166. Peri Beta - Single Chip 1.376
+167. Novag Savant Royal Z80 1.375
+168. Novag Savant II Z80 1.366
+169. Fidelity Voice Z80 1.359
+170. Mephisto Mobil - Single Chip 1.355
+171. Chess King Master - Single Chip 1.324
+172. Fidelity CC 7 Z80 1.311
+173. Boris Diplomat - Single Chip 1.300
+ Fidelity CC 10 Z80 1.300
+175. Mephisto Junior - Single Chip 1.294
+176. Fidelity Sensory 6 - Single Chip 1.275
+177. Novag Savant I Z80 1.273
+178. Mephisto Mini - Single Chip 1.268
+179. Boris 2.5 - Single Chip 1.267
+180. Mephisto I - Single Chip 1.252
+181. CXG Sphinx Granada - Single Chip 1.173
+182. SciSys Mark II - Single Chip 1.090
+183. CXG Sphinx Chesscard - Single Chip 1.087
+184. SciSys Mark I - Single Chip 985
diff --git a/programs/FewBits b/programs/FewBits
new file mode 100644
index 0000000..68f0ae5
--- /dev/null
+++ b/programs/FewBits
@@ -0,0 +1,252 @@
+From: [email protected] (toby robison)
+Newsgroups: rec.games.chess
+Subject: Notating positions in as few bits as possible
+Date: 9 Mar 1993
+
+
+HOW TO NOTATE CHESS POSITIONS IN THE FEWEST AVERAGE BITS PER POSITION
+
+This article is Copyright (C) by Toby Robison, Princeton NJ USA 1993.
+Please name the author when quoting from it.
+
+This is a discussion, not a solution to this rather difficult problem.
+
+Several people provided useful information that I will be quoting below:
+- [email protected] (Steven Pigeon)
+- [email protected] (J Nievergelt)
+- [email protected] (Peter Rainer)
+
+
+
+INTRODUCTION:
+
+The problem here is to come with ways to encode chess positions
+that require, on the average, as few bits as possible. We shall
+consider legal positions only (illegal positions being less useful
+and requiring more bits).
+
+We are considering idealized solutions. It should not be necessary
+to encode or decode a position very fast, and we accept that any
+error in the data may make the positions unreadable.
+
+It turns out that this problem is similar
+to general problems of video compression. Consequently we even have
+to consider what sorts of positions are intertesting to us --
+the solution could be different if we want to find the best average
+result for "every legal position", or for "every typical legal position
+that comes up in good games" or in "every typical position of the sorts
+that are published (using a diagram or other direct notation, such
+as Forsyth) in chess publications".
+
+I shall not try to decide which is the proper target for this
+investigation. Just please bear in mind that the open question will
+affect the solutions we consider later. I shall sidestep this issue by
+referring to "common" or "likely" positions, without having any idea
+what these are.
+
+Notating a position also requires indicating which player is "to move"
+and whether each player can castle (on each side). Strictly speaking we
+should also indicate how long since a pawn has moved, whether en passant
+captures are currently possible, and what positions
+have occurred in the game (so that draws by repetition can be properly
+analyzed). However these requirements simply push us back onto the
+solutions that represent the position as the entire game, SO I SHALL
+IGNORE THESE REQUIREMENTS. Let us just assume that one bit is set aside
+to indicate which player is to move, unless the position is a checkmate.
+
+It is clear that the solution is less than 200 bits per position.
+This is quite good considering that there are 64 squares.
+Intuitively we have a budget of about 3 bits (8 possibilities) to
+tell us what's going on at each square (11 possibilities for the ten
+types of pieces and "empty").
+
+
+Apparently other people have been working on this problem in print.
+Peter Rainer sent me this message:
+
+>Your approach to chess game compression is not new,
+>there has been a paper in the ICCA Journal by
+>Ingo Althoeffer discribing the idea.
+>I think it was in 1991 or 1992.
+>Peter Mysliwietz
+
+See also the information from Nievergelt, below.
+
+THE INVESTIGATION:
+
+APPROACH #1:
+
+Steven Pigeon starts with the number of legal chess positions, which he
+says has been claimed to be 10^43 (but he did not check this out).
+That value can be stored in 143 bits, so if we simply state an algorithm
+for ordering all possible chess positions, we simply record the ordinal
+number of the position.
+
+The drawback of this approach is that it requires
+143 bits for ALL positions, but we ought to shoot for a better average than
+that. One way to improve the solution is to find an ordering of all positions
+such that more common positions come first in the ordering. THEN we use
+a method of compressing the ordinal number of a position that favors
+lower numbers. It is HIGHLY SPECULATIVE that any such really useful
+ordering could be found of course. But if we find an ordering that
+morely makes "sensible" positions come before unlikely and bizzarre ones,
+we can waste LOTS of bits on the bizzarre and get an average a lot less
+than 143 for "common" positions.
+
+APPROACH #2:
+
+One basic approach is to record which squares of the board are
+occupied (64 bits), and then try to be extremely efficient about how
+to say what the pieces in those squares are. For example, we could assume
+that following the first 64 bits there is a code to identify the "first"
+piece, then the second, and so on, assuming that we will start at A1 and
+work, say, across and then up the board.
+
+Pigeon puts it this way:
+
+>The trick is to store the board's occupation as an 8x8 bit matrix,
+>(1=occupied,0=free) and then list the pieces in order of presence
+>in some list, where the codes for the pieces are derived from a
+>Huffman adapative coding (since it is exponential coding), and it
+>is the upper bound. Less pieces there is, less space it takes.
+
+>I'd say I should be able to drop it still a few bits, If I can figure
+>a way of "discarding" the 8x8 matrix.
+
+We should note that as the board gets populated, the number of
+possibilites for the remaining pieces is reduced, because we are considering
+only legal positions. For example, both kings cannot be in check, there can
+only be one king of each color, etc. In addition, pawns cannot be on the
+first and last ranks; a white bishop at square A1 prevents a white pawn at
+B2, etc.
+
+This approach is terrific for endgame positions even though it
+wastes 64 bits on the board. Eight-piece positions will require less than
+100 bits. But a position with all 32 pieces threatens to take a lot more
+than 143. Consider for example, that we might need 4.5 bits per piece,
+or 144 bits plus the 64 for the position.
+
+However as Pigeon observes above, if we use a code to represent each piece
+that requires few bits for LIKELY occurrence of given pieces at each square,
+we might do a lot better.
+
+APPROACH #3:
+
+This approach is very much like a pure video compression solution.
+We divide the board up into smaller regions (such as 2 squares by
+2 squares, but it would be better to make a subdivision based on chess
+experience). We then use Huffman or some other probability based encoding to
+characterize the piece patterns in each subregion. This approach takes advantage
+of the fact that (especially in the late middle and endgames), a relatively
+small number of piece patterns is common in each region.
+
+APPROACH #4:
+
+This is also a video-based compression technique. We encode where the
+pices are based on a probabilistic knowledge of where they are likely to be.
+(For example, it takes a lot of bits to place a knight on the rim.)
+With a few additional bits to characterize the TYPE of position, this
+approach might work well.
+
+APPROACH #5:
+
+J. Nievergelt sent me this astonishing claim:
+
+>It should be possible in under 100 bits. If interested, read:
+
+>J Nievergelt: Information content of chess positions, ACM SIGART Newsletter
+>62, 13-14, April 1977.
+
+>reprinted in:
+>Information content of chess positions: Implications for game-specific
+>knowledge of chess players, 283-289 in Machine Intelligence 12, (eds. J. E.
+>Hayes, D. Michie, E. Tyugu) , Clarendon Press, Oxford, 1991.
+
+I have not had a chance to check the reference, but I think 100 bits is
+incredibly few. In effect, it means specifying the state of each square
+in 1.5 bits, or the state of each piece in 3 or 4 bits.
+
+
+IN SUMMARY:
+
+We have a number of speculative approaches, unless Nievergelt has
+really solved the problem. It seems likely that the best solution should
+spend a few bits to characterize the position (opening, early middle,
+late middle, endgame; open or closed), since different solutions may apply to
+each. In particular, for the OPENING the best solution is either to record the
+game moves, or else to encode only those differences that make
+the position different from the starting one.
+
+In any case the validity of any solution must be tested against the
+type of positions we WANT to encode, and I really think a lot
+of experiemntation would be needed (which nobody probably wants to pay for).
+
+Please keep your comments coming, I will try to summarize...
+
+-- toby robison (not robinson)
+
+
+
+
+From: [email protected] (toby robison)
+Newsgroups: rec.games.chess
+Subject: Notating positions in as few bits as possible
+Date: 29 Mar 1993
+
+A number of people responded to me regarding the problem of
+notating chess positions in as few bits as possible.
+The low bidder for REALISTIC positions seems to be J. Nievergelt,
+whose solution, and a related game that looks like fun, are discussed below.
+
+For a solution that includes UNREALISTIC (but legal) positions,
+The key question is how many positions there are.
+I received several assertions regarding the number of possible chess
+positions (roughly 2^143 ?). If one comes up with a method
+for ordering all legal positions, then this number of bits can be
+used to notate them.
+
+
+TO NOTATE REALISTIC positions, see:
+
+J Nievergelt: Information content of chess positions, ACM SIGART Newsletter
+62, 13-14, April 1977. It is also reprinted in:
+Information content of chess positions: Implications for game-specific
+knowledge of chess players, 283-289 in Machine Intelligence 12, (eds. J. E.
+Hayes, D. Michie, E. Tyugu) , Clarendon Press, Oxford, 1991.
+
+or correspond with: [email protected] (J Nievergelt)
+
+
+JN's method is based on the observation that realistic positions are a small
+fraction of the total possible. To verify this, he presents the following game,
+which I encourage others to try (I'm going to try it myself).
+Person A looks at a realistic position. Person B cannot see it, and asks
+A multiple choice questions. Both A and B are KNOWLEDGABLE chess players.
+B tries to figure out the position, using questions that require as few
+total bits of answer-information as possible.
+
+It's obvious that a Y/N question requires one bit to record the answer.
+A question with 4 choices requires 2 bits. Two three-way questions
+together require slightly more than three bits, and so on.
+JN's assertion, based on some experimentation, is that about 70 bits-worth
+of answers are reasonable figure out positions.
+
+NOTE that we assume the questioner and responder can apply chess judgment,
+so questions like "does the pawn structure suggest a closed French Defense?"
+are acceptable. Even more important, the questioner gets to apply judgment
+about what to ask next, depending upon the partial information currently known.
+
+Now to fully comprehend the solution, imagine a sophisticated program that
+both asks and answers the questions, and figures out a position. The position
+is recorded as the answers to the questions the program asked. To recreate the
+position, we run the same program again and supply the same answer bits.
+
+The problem of creating this GENERAL program is very difficult.
+According to JN, it may be impractical to write a program that gets
+anywhere near to the best possible solution. Writing a program that requires
+about 100 bits per position might be practical, though!
+
+The basic assertion looks like fun to test. Can you guess straightforward,
+typical positions, in less than 100 bits of answer info? In 70?
+
+- toby robison (not tony, not robinson)
diff --git a/programs/PCratings b/programs/PCratings
new file mode 100644
index 0000000..d9b48c8
--- /dev/null
+++ b/programs/PCratings
@@ -0,0 +1,30 @@
+From: [email protected] (Ralf Stephan)
+Newsgroups: rec.games.chess
+Subject: Latest ratings for PC programs/cards
+
+
+These are the latest ratings from the Svedish list, the Selective Search/
+News Sheet 41 and the Computer Chess Reports 1/92: (from MUDUL 3/92)
+All ratings are USCF. For BCF, subtract 100; for FIDE, subtract 200.
+
+ Processor Svedish CCR SS
+--------------------------------------------------
+ChessMachine 512k
+ Schroeder v.2.1 ARM/16 2422 2435 2448
+ The King ARM/16 2410 2416 2422
+MChess 1.1-1.66 486/33 2400 2401 2402
+Zarkov 2.6 486/33 2347
+C'Champion 2175 486/33 2343
+MChess 1.1-1.66 386/25-33 2338
+Grandmaster 486/33 ~2300
+Rexchess 2.30 486/33 2290 2294 2298
+Psion 2 486/33 2294 2294
+Zarkov 2.5 486/33 2277 2283 2289
+Knightstalker 486/33 2239 2260 2280
+Rexchess 2.30 386/25-33 2230
+Chessm. 3000 486/33 2187 2174 2161
+Psion 1 486/33 2140 2140
+Colossus x 486/33 2086 2086
+Chessm. 3000 386/25-33 2083
+Chessm. 2100 486/33 2073 2073
+Final Chesscard 6502 1887 1887
diff --git a/programs/SSDF-RatingList b/programs/SSDF-RatingList
new file mode 100644
index 0000000..80e45eb
--- /dev/null
+++ b/programs/SSDF-RatingList
@@ -0,0 +1,994 @@
+ THE SSDF RATING LIST 1993-02-28 34065 games played
+
+ Rating +- Games Won Oppo
+ ------ --- ----- --- ----
+ 1 Chess Machine 30-32 MHz Schr�der 3.1 2388 329 27 91% 2013
+ 2 Chess Machine 30 MHz King 2.0 aggr 2343 70 140 75% 2152
+ 3 Chess Genius 486/50-66 MHz 2301 85 80 64% 2202
+ 4 Chess Machine 30 MHz Schr�der 3.0 2281 68 149 76% 2086
+ 4 MChess Pro 486/33 MHz 2281 67 133 68% 2148
+ 6 Chess Genius 486/33 MHz 2276 69 120 65% 2170
+ 7 Mephisto Lyon 68030 36 MHz 2259 59 250 84% 1975
+ 8 Mephisto Portorose 68030 36 MHz 2245 47 342 82% 1984
+ 8 Mephisto Vancouver 68030 36 MHz 2245 42 346 74% 2060
+ 10 MChess Pro 486/50-66 MHz 2233 83 99 73% 2062
+ 11 Mephisto RISC 1 MB ARM 2 14 MHz 2232 33 521 73% 2057
+ 12 Chess Machine Schr�der 512K ARM2 16MHz 2216 33 528 71% 2057
+ 12 Saitek RISC 2500 ARM2 14 MHz 128K 2216 43 299 68% 2082
+ 14 Chess Machine The King 512K ARM2 16MHz 2209 45 288 72% 2045
+ 15 MChess 1.1-1.71 80486 33 MHz 2198 43 326 74% 2019
+ 16 Mephisto Lyon 68020 12 MHz 2155 24 932 71% 1997
+ 17 Mephisto Vancouver 68020 12 MHz 2153 30 621 71% 1995
+ 18 Mephisto Berlin 68 000 12 MHz 2139 42 335 73% 1966
+ 19 M Chess 1.1-1.66 80386 25-33 MHz 2129 37 396 66% 2011
+ 19 Fritz 2.0 486/33 MHz 2129 76 95 61% 2049
+ 21 Mephisto Portorose 68020 12 MHz 2128 26 816 73% 1955
+ 21 Fidelity Elite 68030 32 MHz (vers.9) 2128 44 324 75% 1935
+ 23 Mephisto Vancouver 68000 12 MHz 2115 30 612 70% 1971
+ 24 Mephisto Lyon 68000 12 MHz 2107 25 806 65% 1997
+ 25 Mephisto MM 4 Turbo Kit 6502 16 MHz 2091 46 292 73% 1916
+ 26 Mephisto Almeria 68020 12 MHz 2088 47 259 70% 1939
+ 27 Fidelity Mach IV 68020 20 MHz 2080 26 760 65% 1972
+ 28 Mephisto Portorose 68000 12 MHz 2047 28 667 66% 1929
+ 29 Kasparov Brute Force H8 10 MHz 2044 137 40 70% 1896
+ 30 Mephisto Polgar 6502 10 MHz 2041 42 283 59% 1978
+ 31 Fidelity Elite 68000 x 2 (vers. 5) 2036 49 209 57% 1986
+ 32 Rex Chess 2.3 80386 25-33 MHz 2030 64 126 59% 1965
+ 33 Mephisto Roma 68020 14 MHz 2029 27 712 65% 1919
+ 34 Fritz 1.0 80486 33 MHz 2021 63 128 56% 1980
+ 35 Mephisto Dallas 68020 14 MHz 2020 34 492 72% 1858
+ 36 Mephisto Almeria 68000 12 MHz 2019 32 534 67% 1896
+ 37 Zarkov 2.5 80386 25-33 MHz 2018 56 168 61% 1939
+ 38 Fritz 1.0 80386 25-33 MHz 2009 67 113 46% 2041
+ 39 Novag Diablo 68000 16 MHz 2001 26 713 54% 1973
+ 40 Fidelity Mach III 68000 16 MHz 1997 15 2049 56% 1957
+ 41 Mephisto MM 5 6502 5 MHz 1979 22 967 54% 1947
+ 42 Mephisto Polgar 6502 5 MHz 1971 19 1314 47% 1992
+ 42 Mephisto Dallas 68000 12 MHz 1971 21 1074 63% 1876
+ 44 Mephisto Roma 68000 12 MHz 1967 18 1452 57% 1920
+ 45 Zarkov 2.6 386/25-33 MHz 1966 105 55 64% 1867
+ 46 Mephisto Milano 6502 5 MHz 1955 31 490 48% 1972
+ 47 Novag Super Expert C 6502 6 MHz Sel 5 1954 19 1242 50% 1956
+ 48 Mephisto Academy 6502 5 MHz 1940 20 1193 48% 1956
+ 49 Rex Chess 2.3 80386 16-20 MHz 1928 53 174 49% 1934
+ 50 Saitek Leonardo Maestro B 6502 18 MHz 1925 72 105 62% 1839
+ 51 Mephisto Amsterdam 68000 12 MHz 1924 22 1020 58% 1870
+ 52 Mephisto Mega IV 6502 4.9 MHz 1916 18 1354 48% 1934
+ 53 Fidelity Excel Mach IIc 68000 12 MHz 1915 23 913 52% 1904
+ 54 Saitek Maestro D 6502 10 MHz 1914 25 730 51% 1905
+ 55 Novag Expert Turbo Kit 6502 16 MHz 1906 67 120 61% 1825
+ 56 Novag Super Expert B 6502 6 MHz sel 4 1904 32 468 51% 1896
+ 56 Kasparov GK-2000 H8 10 MHz 1904 48 223 42% 1960
+ 58 Fidelity Travel Master H8/330 10 MHz 1902 79 123 22% 2117
+ 59 Mephisto MM 4 6502 5 MHz 1901 19 1268 50% 1898
+ 60 Chessmaster 3000 386/25-33 MHz 1900 101 59 36% 2005
+ 61 Mephisto Modena 6502 4 MHz 1886 41 305 41% 1951
+ 62 Psion Atari 68000 8 MHz 1880 18 1463 44% 1924
+ 63 CXG Sphinx Galaxy 6502 4 MHz 1875 19 1293 41% 1943
+ 63 Fidelity Excel Mach IIa 68000 12 MHz 1875 46 226 47% 1895
+ 65 Saitek Turboking II 6502 5 MHz 1872 25 752 41% 1937
+ 66 Conchess Plymate Victoria 6502 5.5 MHz 1862 27 657 40% 1931
+ 67 Fidelity Excel Club 68000 12 MHz 1854 22 931 51% 1845
+ 68 Mephisto Mega IV Brute Force 1840 45 240 50% 1837
+ 69 Fidelity Avant Garde 6502 5 MHz 1832 20 1196 46% 1863
+ 70 Novag Super Expert/Forte A 6502 5 MHz 1831 21 1118 41% 1895
+ 71 Fidelity Par Excellence 6502 5 MHz 1829 23 912 51% 1825
+ 72 Mephisto Rebell 6502 5 MHz 1821 20 1233 40% 1891
+ 73 Saitek Stratos/Analys B 6502 6 MHz 1817 20 1213 38% 1905
+ 74 Novag Forte B 6502 5 MHz 1813 24 837 44% 1857
+ 75 Mephisto Super Mondial 6502 4 MHz 1812 20 1205 39% 1894
+ 75 Conchess Glasgow 6 MHz 1812 158 41 78% 1593
+ 77 Conchess Plymate 6502 5.5 MHz 1808 16 1920 41% 1870
+ 78 Saitek Leonardo Maestro A 6502 6 MHz 1807 30 547 45% 1842
+ 79 Novag Forte A 6502 5 MHz 1806 22 939 49% 1814
+ 79 Saitek Simultano/Corona C 6502 5 MHz 1806 24 927 33% 1929
+ 81 Fidelity Excellence 6502 4 MHz 1798 17 1565 43% 1849
+ 82 Novag Expert 6502 4 MHz 1784 24 812 43% 1837
+ 83 Conchess Plymate 6502 4 MHz 1775 38 343 55% 1739
+ 84 Mephisto MM 2 6502 3.7 MHz 1769 48 208 52% 1752
+ 85 Fidelity Elegance 6502 3.6 MHz 1761 39 339 61% 1685
+ 86 Saitek Turbostar 432 6502 4 MHz 1759 21 1034 46% 1789
+ 87 Fidelity Excellence 6502 3 MHz 1753 22 962 42% 1811
+ 88 Saitek Kasparov Blitz 1736 50 202 41% 1798
+ 89 Novag Super Nova 1732 38 350 40% 1801
+ 90 Novag Super Constellation 6502 4 MHz 1728 17 1695 39% 1807
+ 91 Conchess Glasgow 6502 4 MHz 1712 37 342 50% 1713
+ 92 Chessplayer 2150 Atari/Amiga 1709 67 126 34% 1828
+ 93 Mephisto B&P 6502 3.7 MHz 1700 85 78 38% 1787
+ 94 The Final Chesscard 6502 5 MHz 1695 65 149 28% 1861
+ 95 Mephisto Europa 1685 54 170 45% 1721
+ 96 Novag Super VIP 1684 58 174 32% 1812
+ 97 Fidelity Elite A/S 6502 3.2 MHz 1677 21 1149 38% 1762
+ 98 Chessmaster 2100 Amiga 68000 1676 85 100 25% 1871
+ 99 Saitek Superstar 36K 6502 2 MHz 1675 24 958 31% 1814
+ 100 Chess Champion 2175 Atari/Amiga 1670 62 157 30% 1818
+ 100 Mephisto Exclusive S 1670 80 81 44% 1709
+ 102 Fidelity Prestige 6502 4 MHz 1665 40 341 66% 1545
+ 103 Conchess Glasgow 6502 2 MHz 1663 24 863 35% 1775
+ 104 Novag Quattro 6502 4 MHz 1659 31 560 33% 1786
+ 105 Chessmaster 2000 Atari 68000 8 MHz 1651 45 312 25% 1838
+ 106 Novag Constellation 6502 3.6 MHz 1644 28 596 46% 1674
+ 107 Novag Constellation Primo 1634 58 149 44% 1679
+ 108 Fidelity Elite -81 1604 63 151 69% 1468
+ 109 Novag Constellation 6502 2 MHz 1596 23 865 50% 1599
+ 110 Sargon III 1 MHz 1590 148 27 44% 1630
+ 111 Mephisto Mondial 1581 71 100 46% 1609
+ 112 CXG Super Enterprise 1561 37 410 31% 1700
+ 113 Fidelity Sensory 9 B 1553 87 68 54% 1527
+ 114 Fidelity Sensory 9 A 1494 30 511 50% 1495
+ 115 Steinitz 1480 39 324 45% 1516
+ 116 Mephisto III Modular 1471 53 189 38% 1557
+ 117 Mephisto II 6.1 MHz 1470 33 450 46% 1499
+ 118 Saitek Turbo 16K 1463 85 90 29% 1616
+ 119 Chess 2001 1462 73 101 40% 1536
+ 120 Scisys Superstar 1454 55 179 35% 1561
+ 121 Mephisto III 6.1 MHz 1452 56 194 29% 1608
+ 122 Saitek Turbo S 24K 1431 89 95 24% 1628
+ 123 Conchess -82 2 MHz 1408 41 299 41% 1469
+ 124 GMC 1385 40 306 44% 1427
+ 125 Mephisto II 3.5 MHz 1380 39 306 49% 1388
+ 126 Champion Sensory Challenger 1379 38 336 48% 1395
+ 127 Mark VI 1375 62 163 28% 1538
+ 128 Mark V 1352 38 353 40% 1425
+ 129 Morphy 1334 48 220 41% 1399
+ 130 Progidy 1266 205 28 23% 1473
+ 131 Enterprise S 1182 139 46 24% 1383
+ 132 Boris 2.5 1171 97 75 27% 1348
+
+
+ 1 Chess Machine 30-32 MHz Schr�der 3.1, 2388
+Ch.Gen 486/50 1-0 MChPro 486/33 1-0 Chess M. King 0.5-0.5
+Mach III 9-2 Polgar 5 MHz 13-0
+
+ 2 Chess Machine 30 MHz King 2.0 aggr, 2343
+Ch.Gen 486/50 3-1 MChPro 486/33 11-9 Ch.Gen 486/33 13.5-6.5
+MChPro 486/50 1.5-1.5 Meph. RISC 13.5-6.5 RISC 2500 7.5-2.5
+Vancou. 68000 2.5-1.5 Lyon 68000 8-3 Roma 68020 18.5-1.5
+Mach III 6-0 Meph. MM 5 2-0 Polgar 5 MHz 18-2
+
+ 3 Chess Genius 486/50-66 MHz, 2301
+CM30 Schr 3.0 0.5-0.5 Vancou. 68030 12-8 Chess M Schr� 20.5-9.5
+Chess M. King 8.5-5.5 Diablo 68000 3.5-1.5 Polgar 5 MHz 5-0
+
+ 4 Chess Machine 30 MHz Schr�der 3.0, 2281
+Meph. RISC 11-9 RISC 2500 1.5-2.5 M Chess 486 1-0
+Vancou. 68020 11.5-8.5 Vancou. 68000 17.5-2.5 Lyon 68000 15-5
+Roma 68020 4-1 Diablo 68000 16-4 Mach III 10.5-0.5
+Meph. MM 5 6.5-0.5 Polgar 5 MHz 17.5-2.5
+
+ 5 MChess Pro 486/33 MHz, 2281
+Ch.Gen 486/33 10-9 RISC 2500 6-4 Lyon 68020 8-2
+Vancou. 68020 7-4 Vancou. 68000 14.5-5.5 Lyon 68000 1-1
+Mach III 17-3 Polgar 5 MHz 18-2
+
+ 6 Chess Genius 486/33 MHz, 2276
+Meph. RISC 11-8 RISC 2500 12.5-7.5 Lyon 68020 0-1
+Lyon 68000 1-0 Mach III 18.5-1.5 Polgar 5 MHz 19-1
+
+ 7 Mephisto Lyon 68030 36 MHz, 2259
+Chess M Schr� 1.5-1.5 M Chess 486 4.5-2.5 Lyon 68020 13.5-6.5
+Lyon 68000 14-6 Mach III 18-2 Meph. MM 5 16.5-3.5
+Polgar 5 MHz 15.5-4.5 Roma 68000 17-3 Super Exp. C 16.5-3.5
+Academy 5 MHz 16.5-3.5 Meph. Mega IV 20-0 Psion Atari 19-1
+Turboking II 18.5-1.5 Plym Victoria 19.5-0.5
+
+ 8 Mephisto Portorose 68030 36 MHz, 2245
+Portor. 68020 12.5-7.5 Elite 68030 14.5-5.5 Almeria 68020 14-6
+Portor. 68000 14-6 Elite vers.5 14-6 Almeria 68000 16-4
+Mach III 17.5-2.5 Polgar 5 MHz 15.5-4.5 Dallas 68000 19.5-0.5
+Roma 68000 19-1 Super Exp. C 13-7 Academy 5 MHz 17-3
+Amsterdam 19.5-0.5 Meph. Mega IV 17.5-3.5 Maestro D 10 20-0
+Psion Atari 19-1 Sphinx Galaxy 17.5-2.5 Rebell 5 MHz 1-0
+
+ 9 Mephisto Vancouver 68030 36 MHz, 2245
+MChPro 486/50 1.5-0.5 Meph. RISC 11.5-8.5 Chess M Schr� 11-9
+Chess M. King 10-10 M Chess 486 11-9 Vancou. 68020 16-4
+Vancou. 68000 13.5-6.5 Lyon 68000 13-7 Diablo 68000 15.5-4.5
+Meph. MM 5 18.5-1.5 Polgar 5 MHz 16.5-3.5 Dallas 68000 18.5-1.5
+Roma 68000 18-2 Meph. Milano 15.5-4.5 Meph. Mega IV 17.5-2.5
+Psion Atari 19.5-0.5 Sphinx Galaxy 18.5-1.5 Turboking II 4-0
+
+ 10 MChess Pro 486/50-66 MHz, 2233
+Chess M Schr� 5-7 Chess M. King 2-2 Fritz2 486/33 13.5-6.5
+Vancou. 68000 15-5 Meph. Mega IV 18.5-1.5 Super Exp. B 7.5-0.5
+Psion Atari 8.5-1.5
+
+ 11 Mephisto RISC 1 MB ARM 2 14 MHz, 2232
+Chess M Schr� 10.5-9.5 Chess M. King 11-9 M Chess 486 11-10
+Lyon 68020 11-9 Vancou. 68020 14-6 Berlin 68 000 12-8
+Portor. 68020 13.5-6.5 Vancou. 68000 12-8 Diablo 68000 17.5-2.5
+Mach III 18.5-1.5 Meph. MM 5 17.5-2.5 Polgar 5 MHz 18-2
+Dallas 68000 10.5-0.5 Meph. Milano 17.5-2.5 Super Exp. C 17-3
+Academy 5 MHz 17.5-2.5 Meph. Mega IV 19-1 Kasp. GK-2000 10-0
+Mephisto MM 4 18-2 Meph. Modena 18-2 Psion Atari 18.5-1.5
+Sphinx Galaxy 18-2 Turboking II 18.5-1.5
+
+ 12 Chess Machine Schr�der 512K ARM2 16MHz, 2216
+Chess M. King 2-0 M Chess 486 7-7 Lyon 68020 32.5-27.5
+M Chess 386 26-13 Portor. 68020 0.5-0.5 Vancou. 68000 5-2
+Lyon 68000 31.5-14.5 Rex 2.3 33MHz 1.5-0.5 Zark25 386/33 1.5-0.5
+Fritz1 386/33 1.5-0.5 Diablo 68000 18-2 Mach III 35.5-6.5
+Polgar 5 MHz 22-3 Roma 68000 17.5-7.5 Zark26 386/25 2-0
+Super Exp. C 25.5-4.5 Academy 5 MHz 16-4 Amsterdam 20-0
+Meph. Mega IV 9-1 Super Exp. B 14.5-5.5 Psion Atari 3-0
+Sphinx Galaxy 29.5-1.5 Turboking II 19-1
+
+ 13 Saitek RISC 2500 ARM2 14 MHz 128K, 2216
+M Chess 486 4-0 Vancou. 68020 35.5-24.5 Fritz2 486/33 13.5-6.5
+Vancou. 68000 12-8 Mach IV 68020 28.5-11.5 Fritz1 486/33 12-4
+Mach III 14.5-5.5 Meph. Milano 18-2 Super Exp. C 1.5-1.5
+Kasp. GK-2000 20-0 Travel Master 18-2 Sphinx Galaxy 6-1
+Turboking II 4-1
+
+ 14 Chess Machine The King 512K ARM2 16MHz, 2209
+M Chess 486 8-3 Lyon 68020 3-2 Vancou. 68020 11-8
+Vancou. 68000 0.5-4.5 Lyon 68000 16.5-7.5 Diablo 68000 21.5-2.5
+Mach III 16.5-3.5 Meph. MM 5 1.5-0.5 Super Exp. C 17-3
+Academy 5 MHz 14-6 Meph. Mega IV 9-1 Psion Atari 23.5-2.5
+Sphinx Galaxy 18.5-1.5 Turboking II 19.5-1.5
+
+ 15 MChess 1.1-1.71 80486 33 MHz, 2198
+Lyon 68020 9.5-6.5 Vancou. 68020 3-3 Lyon 68000 1.5-1.5
+Portor. 68000 5-0 Roma 68020 7.5-0.5 Polgar 5 MHz 33-7
+Roma 68000 16.5-3.5 Super Exp. C 17.5-2.5 Academy 5 MHz 17-3
+Amsterdam 19-1 Meph. Mega IV 10-0 Travel Master 16.5-3.5
+Psion Atari 17.5-2.5 Sphinx Galaxy 16.5-3.5 Turboking II 18.5-1.5
+
+ 16 Mephisto Lyon 68020 12 MHz, 2155, (2217 vs humans, 12 games)
+Berlin 68 000 9.5-10.5 M Chess 386 41-33 Lyon 68000 10-10
+Mach IV 68020 22.5-17.5 Portor. 68000 12.5-7.5 Polgar 10 MHz 20-10
+Rex 2.3 33MHz 14.5-5.5 Fritz1 486/33 14-6 Zark25 386/33 14-6
+Fritz1 386/33 14-6 Diablo 68000 13-7 Mach III 19-8
+Meph. MM 5 13.5-6.5 Polgar 5 MHz 18-3 Roma 68000 15-5
+Meph. Milano 16-4 Super Exp. C 17-3 Academy 5 MHz 13-7
+Rex 2.3 20MHz 1.5-0.5 Meph. Mega IV 17-3 Excel Mach 2c 31.5-4.5
+Super Exp. B 7.5-2.5 Mephisto MM 4 18.5-1.5 CM3000 386/33 18.5-1.5
+Meph. Modena 17-3 Psion Atari 18-2 Sphinx Galaxy 15-5
+Turboking II 18-2 Plym Victoria 19.5-1.5 Super Exp. A 17.5-2.5
+Rebell 5 MHz 19-1 Stratos 6 MHz 18.5-1.5 Super Mondial 19.5-0.5
+Plymate 5.5 20-0 Simultano C 19-1 Excellence 4 17-2
+
+ 17 Mephisto Vancouver 68020 12 MHz, 2153
+Berlin 68 000 10.5-10.5 Mach IV 68020 24.5-8.5 Fritz1 386/33 4-1
+Diablo 68000 16.5-3.5 Mach III 2.5-2.5 Meph. MM 5 14.5-5.5
+Polgar 5 MHz 17-4 Meph. Milano 19.5-0.5 Super Exp. C 14.5-5.5
+Academy 5 MHz 18-2 Meph. Mega IV 17-3 Travel Master 17-3
+Mephisto MM 4 16.5-3.5 Meph. Modena 16-4 Psion Atari 17-3
+Sphinx Galaxy 17.5-2.5 Turboking II 17-3 Plym Victoria 17-3
+Super Exp. A 17-3 Rebell 5 MHz 17-3 Stratos 6 MHz 17-3
+Super Mondial 17.5-2.5 Plymate 5.5 20-0 Simultano C 19-1
+
+ 18 Mephisto Berlin 68 000 12 MHz, 2139
+Portor. 68020 10.5-9.5 Diablo 68000 14.5-5.5 Mach III 6.5-0.5
+Meph. MM 5 16-4 Roma 68000 4-1 Meph. Milano 17-3
+Super Exp. C 27-8 Meph. Mega IV 16-4 Kasp. GK-2000 13-7
+Meph. Modena 16.5-3.5 Plym Victoria 14-2 Mega IV BF 8-0
+Super Mondial 16.5-3.5 Plymate 5.5 17-3 Simultano C 19-4
+
+ 19 M Chess 1.1-1.66 80386 25-33 MHz, 2129
+Portor. 68020 7.5-5.5 Lyon 68000 29-22 Rex 2.3 33MHz 7.5-2.5
+Zark25 386/33 2.5-1.5 Mach III 1.5-0.5 Meph. MM 5 16.5-10.5
+Polgar 5 MHz 30-7 Academy 5 MHz 15.5-4.5 CM3000 386/33 2-2
+Sphinx Galaxy 20-2 Plym Victoria 22-4 Rebell 5 MHz 3.5-0.5
+Plymate 5.5 12-0 Maestro A 6 5-0 Simultano C 35.5-4.5
+Expert 4 MHz 6-0
+
+ 20 Fritz 2.0 486/33 MHz, 2129
+Diablo 68000 16-4 Polgar 5 MHz 7-3 Academy 5 MHz 4-1
+Stratos 6 MHz 18-2
+
+ 21 Mephisto Portorose 68020 12 MHz, 2128, (2181 vs humans, 10 games)
+Elite 68030 9.5-14.5 Lyon 68000 10-10 MM 4 Turbo 16 9.5-1.5
+Mach IV 68020 23-17 Portor. 68000 12.5-7.5 Polgar 10 MHz 12.5-7.5
+Roma 68020 2-0 Almeria 68000 13.5-6.5 Mach III 31.5-16.5
+Meph. MM 5 12-8 Polgar 5 MHz 20.5-4.5 Dallas 68000 3.5-0.5
+Roma 68000 18-2 Meph. Milano 15-5 Super Exp. C 33-11
+Academy 5 MHz 12-8 Meph. Mega IV 14.5-5.5 Excel Mach 2c 26.5-5.5
+Maestro D 10 15-6 Super Exp. B 7.5-2.5 Mephisto MM 4 17-3
+Meph. Modena 18-2 Psion Atari 15-5 Sphinx Galaxy 17-3
+Turboking II 17.5-2.5 Plym Victoria 17-3 Avant Garde 19-1
+Super Exp. A 19-1 Rebell 5 MHz 19-1 Stratos 6 MHz 19.5-0.5
+Super Mondial 20.5-4.5 Plymate 5.5 19-1 Simultano C 15-5
+Excellence 4 17-3 Expert 4 MHz 15-1
+
+ 22 Fidelity Elite 68030 32 MHz (vers.9), 2128
+Portor. 68000 12.5-7.5 Mach III 15-6 Polgar 5 MHz 16.5-3.5
+Super Exp. C 12-8 Academy 5 MHz 13-7 Meph. Mega IV 16.5-3.5
+Maestro D 10 17-3 Psion Atari 17-3 Sphinx Galaxy 17.5-2.5
+Super Exp. A 16-4 Rebell 5 MHz 16-3 Super Mondial 19.5-0.5
+Simultano C 16.5-3.5 Excellence 4 18.5-1.5
+
+ 23 Mephisto Vancouver 68000 12 MHz, 2115
+Fritz1 386/33 16-4 Diablo 68000 11-9 Mach III 26-15
+Meph. MM 5 29.5-10.5 Meph. Milano 16-4 Super Exp. C 13.5-6.5
+Academy 5 MHz 15.5-4.5 Meph. Mega IV 16.5-3.5 Excel Mach 2c 18-2
+CM3000 386/33 9-4 Psion Atari 14-6 Sphinx Galaxy 17-3
+Turboking II 18-2 Plym Victoria 16-4 Super Exp. A 18-2
+Rebell 5 MHz 16.5-3.5 Stratos 6 MHz 15-5 Super Mondial 17.5-2.5
+Plymate 5.5 19-1 Simultano C 20-0 Excellence 4 19.5-0.5
+Super Const. 18.5-1.5 Meph. Europa 2-0
+
+ 24 Mephisto Lyon 68000 12 MHz, 2107
+Mach IV 68020 22.5-17.5 Rex 2.3 33MHz 1-0 Fritz1 386/33 6-4
+Diablo 68000 22.5-11.5 Mach III 32.5-6.5 Meph. MM 5 25.5-15.5
+Polgar 5 MHz 16-4 Roma 68000 15-5 Super Exp. C 28-9
+Academy 5 MHz 16.5-3.5 Meph. Mega IV 17-3 Kasp. GK-2000 2-0
+Travel Master 16.5-3.5 Mephisto MM 4 14-6 Psion Atari 17.5-6.5
+Sphinx Galaxy 14-6 Turboking II 17.5-2.5 Plym Victoria 18-2
+Super Exp. A 15.5-4.5 Rebell 5 MHz 16.5-3.5 Stratos 6 MHz 16.5-3.5
+Super Mondial 16.5-3.5 Plymate 5.5 19.5-0.5 Simultano C 17-3
+Excellence 4 17.5-2.5 Super Const. 17-3
+
+ 25 Mephisto MM 4 Turbo Kit 6502 16 MHz, 2091, (2122 vs humans, 9 games)
+Mach IV 68020 16.5-14.5 Roma 68020 7.5-12.5 Mach III 13.5-6.5
+Dallas 68000 21.5-12.5 Roma 68000 14.5-5.5 Amsterdam 1-0
+Excel Mach 2c 4-0 Mephisto MM 4 1-0 Excel Mach 2a 16.5-3.5
+Excel Club 7-2 Super Exp. A 19.5-0.5 Stratos 6 MHz 18.5-1.5
+Forte B 18.5-1.5 Super Mondial 18.5-1.5 Plymate 5.5 16.5-4.5
+Excellence 4 17.5-2.5
+
+ 26 Mephisto Almeria 68020 12 MHz, 2088, (2030 vs humans, 26 games)
+Mach IV 68020 13.5-14.5 Portor. 68000 5.5-6.5 Roma 68020 11.5-8.5
+Almeria 68000 3.5-2.5 Mach III 13-8 Roma 68000 3.5-2.5
+Academy 5 MHz 17.5-2.5 Maestro D 10 2-0 Mephisto MM 4 12.5-7.5
+Psion Atari 17.5-2.5 Sphinx Galaxy 3.5-0.5 Avant Garde 18-2
+Stratos 6 MHz 16.5-3.5 Simultano C 18.5-1.5 Superstar 36K 19-1
+
+ 27 Fidelity Mach IV 68020 20 MHz, 2080, (2177 vs humans, 19 games)
+Roma 68020 24-13 Dallas 68020 13.5-6.5 Almeria 68000 11-9
+Mach III 4-4 Polgar 5 MHz 11.5-8.5 Dallas 68000 7.5-4.5
+Roma 68000 6.5-3.5 Super Exp. C 13-6 Academy 5 MHz 13.5-2.5
+Meph. Mega IV 16.5-3.5 Excel Mach 2c 13-2 Super Exp. B 9.5-2.5
+Travel Master 15-5 Mephisto MM 4 36-11 Psion Atari 17-3
+Sphinx Galaxy 16.5-5.5 Avant Garde 19-1 Par Excell. 15-5
+Rebell 5 MHz 17-6 Stratos 6 MHz 23.5-2.5 Super Mondial 15-2
+Plymate 5.5 36-8 Excellence 4 18.5-1.5 Superstar 36K 20-0
+
+ 28 Mephisto Portorose 68000 12 MHz, 2047
+Elite vers.5 19-15 Roma 68020 10-10 Mach III 15-10
+Meph. MM 5 11-9 Polgar 5 MHz 16-9 Dallas 68000 14-6
+Super Exp. C 21-8 Academy 5 MHz 20-14 Rex 2.3 20MHz 10.5-9.5
+Meph. Mega IV 14.5-5.5 Maestro D 10 18-9 Super Exp. B 13.5-6.5
+Mephisto MM 4 16-4 Psion Atari 21.5-7.5 Sphinx Galaxy 15-5
+Turboking II 17.5-1.5 Super Exp. A 17-3 Rebell 5 MHz 17.5-2.5
+Stratos 6 MHz 17-3 Super Mondial 14-6 Plymate 5.5 16.5-7.5
+Simultano C 16.5-3.5 Excellence 4 19-1 Super Const. 3-1
+Super VIP 15.5-4.5 Elite A/S 3.2 18-2
+
+ 29 Kasparov Brute Force H8 10 MHz, 2044
+Meph. MM 5 9.5-2.5 Excel Mach 2c 13-7 Super Const. 5.5-2.5
+
+ 30 Mephisto Polgar 6502 10 MHz, 2041
+Elite vers.5 13-9 Mach III 21-23 Dallas 68000 14-3
+Roma 68000 14-6 Super Exp. C 15-16 Amsterdam 13-7
+Excel Mach 2c 15-5 Maestro D 10 13-5 Psion Atari 14-6
+Avant Garde 0.5-0.5 Plymate 5.5 16.5-3.5
+
+ 31 Fidelity Elite 68000 x 2 (vers. 5), 2036
+Almeria 68000 5-5 Dallas 68000 12.5-7.5 Roma 68000 11-9
+Academy 5 MHz 12.5-7.5 Maestro D 10 16-6 Psion Atari 13.5-6.5
+Avant Garde 18.5-2.5
+
+ 32 Rex Chess 2.3 80386 25-33 MHz, 2030
+Zark25 386/33 0.5-1.5 Mach III 6.5-5.5 Meph. MM 5 1-1
+Polgar 5 MHz 13.5-6.5 Roma 68000 7.5-2.5 Academy 5 MHz 12-8
+Turbostar 432 7-0 Super Const. 18-2
+
+ 33 Mephisto Roma 68020 14 MHz, 2029, (1979 vs humans, 9 games)
+Fritz1 486/33 0-2 Almeria 68000 11-9 Mach III 20.5-19.5
+Dallas 68000 13.5-6.5 Roma 68000 10.5-9.5 Academy 5 MHz 15-6
+Rex 2.3 20MHz 24-5 Amsterdam 11.5-8.5 Meph. Mega IV 14-6
+Excel Mach 2c 26.5-23.5 Maestro D 10 11-9 Mephisto MM 4 14.5-5.5
+Psion Atari 5-1 Sphinx Galaxy 16.5-3.5 Excel Club 16.5-3.5
+Avant Garde 15.5-4.5 Super Exp. A 14.5-5.5 Rebell 5 MHz 9.5-2.5
+Stratos 6 MHz 18-2 Forte B 13.5-6.5 Super Mondial 16.5-3.5
+Plymate 5.5 17.5-2.5 Maestro A 6 15-5 Excellence 4 17.5-2.5
+Expert 4 MHz 14.5-5.5 Excellence 3 17.5-2.5 Super Const. 19-1
+Elite A/S 3.2 18.5-1.5
+
+ 34 Fritz 1.0 80486 33 MHz, 2021
+Super Exp. C 9.5-10.5 Academy 5 MHz 12-8 Meph. Mega IV 7-3
+Sphinx Galaxy 16.5-3.5 Stratos 6 MHz 14.5-5.5
+
+ 35 Mephisto Dallas 68020 14 MHz, 2020
+Mach III 10.5-9.5 Dallas 68000 13-7 Super Exp. C 1-2
+Amsterdam 26.5-13.5 Meph. Mega IV 12-8 Excel Mach 2c 15-9
+Mephisto MM 4 14.5-5.5 Excel Mach 2a 14-6 Excel Club 21-8
+Avant Garde 23-8 Par Excell. 16.5-3.5 Rebell 5 MHz 15-5
+Forte B 15.5-4.5 Super Mondial 19-4 Plymate 5.5 17.5-2.5
+Maestro A 6 16.5-4.5 Forte A 16.5-7.5 Excellence 4 16.5-3.5
+Expert 4 MHz 20-6 Turbostar 432 14-6 Excellence 3 28.5-2.5
+
+ 36 Mephisto Almeria 68000 12 MHz, 2019
+Mach III 21.5-13.5 Polgar 5 MHz 10.5-9.5 Dallas 68000 10.5-9.5
+Roma 68000 10.5-5.5 Academy 5 MHz 11-9 Amsterdam 12-8
+Meph. Mega IV 13-11 Mephisto MM 4 9-2 Psion Atari 20.5-6.5
+Sphinx Galaxy 11.5-5.5 Super Exp. A 14.5-5.5 Par Excell. 8.5-1.5
+Rebell 5 MHz 15.5-4.5 Stratos 6 MHz 20.5-6.5 Plymate 5.5 16.5-3.5
+Simultano C 16.5-3.5 Excellence 4 18.5-1.5 Excellence 3 18-2
+Super Const. 17.5-2.5 Elite A/S 3.2 17.5-2.5 Superstar 36K 20.5-3.5
+Conchess 2MHz 6.5-0.5
+
+ 37 Zarkov 2.5 80386 25-33 MHz, 2018
+Mach III 12-7 Meph. MM 5 7-5 Polgar 5 MHz 3.5-2.5
+Super Exp. C 6.5-7.5 Academy 5 MHz 10.5-9.5 Super Exp. B 8-2
+Sphinx Galaxy 15.5-4.5 Plym Victoria 4-2 Plymate 5.5 3.5-0.5
+Maestro A 6 9-5 Expert 4 MHz 4-0 Super Const. 1-0
+Chesscard 5 8.5-1.5
+
+ 38 Fritz 1.0 80386 25-33 MHz, 2009
+Mach III 11.5-8.5 Meph. MM 5 3-1 Polgar 5 MHz 1.5-1.5
+Super Exp. C 6.5-5.5 CM3000 386/33 1.5-0.5 Turboking II 4-1
+Plym Victoria 8-2
+
+ 39 Novag Diablo 68000 16 MHz, 2001, (1975 vs humans, 9 games)
+Mach III 10-10 Meph. MM 5 10-10 Polgar 5 MHz 12.5-7.5
+Roma 68000 11.5-8.5 Meph. Milano 10-10 Super Exp. C 15-5
+Academy 5 MHz 12.5-7.5 Meph. Mega IV 12-8 Kasp. GK-2000 14.5-5.5
+Mephisto MM 4 12-8 Psion Atari 15-9 Sphinx Galaxy 15-7
+Turboking II 15.5-4.5 Plym Victoria 13.5-6.5 Super Exp. A 14.5-5.5
+Rebell 5 MHz 15.5-4.5 Stratos 6 MHz 15-5 Super Mondial 14.5-5.5
+Plymate 5.5 16.5-3.5 Simultano C 15-5 Excellence 4 4-0
+Kasp. Blitz 16.5-3.5 Elite A/S 3.2 18.5-1.5 Superstar 36K 19-1
+
+ 40 Fidelity Mach III 68000 16 MHz, 1997, (2067 vs humans, 25 games)
+Meph. MM 5 13.5-11.5 Polgar 5 MHz 60.5-51.5 Dallas 68000 11-9
+Roma 68000 131.5-90.5 Super Exp. C 40-37 Academy 5 MHz 22.5-14.5
+Rex 2.3 20MHz 5-1 Amsterdam 4-3 Meph. Mega IV 23-19
+Excel Mach 2c 23-12 Maestro D 10 21.5-14.5 Super Exp. B 10-8
+Travel Master 2-1 Mephisto MM 4 22-16 Psion Atari 27.5-11.5
+Sphinx Galaxy 18-16 Turboking II 19.5-7.5 Plym Victoria 14-6
+Excel Club 15.5-4.5 Mega IV BF 16.5-3.5 Avant Garde 17.5-3.5
+Super Exp. A 15-5 Par Excell. 29.5-8.5 Rebell 5 MHz 26.5-6.5
+Stratos 6 MHz 31.5-4.5 Forte B 19.5-5.5 Super Mondial 18-3
+Plymate 5.5 34-8 Maestro A 6 2.5-1.5 Forte A 15-5
+Simultano C 18-4 Excellence 4 28-6 Expert 4 MHz 15.5-4.5
+Excellence 3 17-3 Super Nova 18-3 Super Const. 48-11
+Chesspl. 2150 6-0 Meph. Europa 1.5-1.5 Elite A/S 3.2 18.5-1.5
+Cmaster 2100 16-4 Superstar 36K 16.5-3.5 Champion 2175 1-1
+Conchess 2MHz 18.5-1.5
+
+ 41 Mephisto MM 5 6502 5 MHz, 1979, (1757 vs humans, 6 games)
+Polgar 5 MHz 34-34 Roma 68000 11-9 Meph. Milano 10.5-9.5
+Super Exp. C 12.5-7.5 Academy 5 MHz 11-9 Meph. Mega IV 13-7
+Mephisto MM 4 12.5-7.5 Meph. Modena 13.5-6.5 Psion Atari 13.5-6.5
+Sphinx Galaxy 27.5-14.5 Turboking II 14-6 Plym Victoria 16-4
+Excel Club 8-4 Avant Garde 15.5-4.5 Super Exp. A 15-5
+Rebell 5 MHz 14.5-5.5 Stratos 6 MHz 20.5-7.5 Super Mondial 15.5-5.5
+Plymate 5.5 27-15 Simultano C 15.5-4.5 Excellence 4 17-3
+Super Const. 17.5-2.5 Elite A/S 3.2 14.5-5.5 Superstar 36K 17-3
+Conchess 2MHz 14.5-5.5 Cmaster 2000 16.5-3.5
+
+ 42 Mephisto Polgar 6502 5 MHz, 1971
+Dallas 68000 9-11 Roma 68000 8-14 Meph. Milano 10-10
+Super Exp. C 9.5-10.5 Academy 5 MHz 11.5-10.5 Rex 2.3 20MHz 5.5-6.5
+Amsterdam 4.5-4.5 Meph. Mega IV 14.5-5.5 Maestro D 10 22.5-17.5
+Super Exp. B 10-10 Travel Master 10.5-9.5 Mephisto MM 4 33.5-9.5
+Psion Atari 26-6 Sphinx Galaxy 15-9 Avant Garde 17.5-2.5
+Super Exp. A 20.5-17.5 Rebell 5 MHz 15.5-4.5 Stratos 6 MHz 14-6
+Super Mondial 16-4 Plymate 5.5 27.5-4.5 Simultano C 15.5-4.5
+Excellence 4 13.5-6.5 Super Nova 17.5-2.5 Super Const. 19-1
+Chesscard 5 18-2 Elite A/S 3.2 3-2 Conchess 2MHz 19-1
+Cmaster 2000 20-4
+
+ 43 Mephisto Dallas 68000 12 MHz, 1971, (1866 vs humans, 15 games)
+Amsterdam 15.5-14.5 Meph. Mega IV 14.5-9.5 Excel Mach 2c 14.5-5.5
+Maestro D 10 3.5-2.5 Mephisto MM 4 42.5-26.5 Psion Atari 14-6
+Sphinx Galaxy 13.5-6.5 Excel Mach 2a 13.5-6.5 Excel Club 13.5-6.5
+Avant Garde 11.5-8.5 Super Exp. A 17.5-5.5 Par Excell. 40.5-18.5
+Rebell 5 MHz 15.5-4.5 Stratos 6 MHz 18.5-1.5 Forte B 59-23
+Super Mondial 19.5-4.5 Plymate 5.5 33-4 Maestro A 6 13.5-6.5
+Forte A 14.5-5.5 Excellence 4 20-7 Expert 4 MHz 38.5-11.5
+Turbostar 432 27.5-7.5 Excellence 3 16.5-3.5 Super Const. 59-11
+Superstar 36K 18-2 Conchess 2MHz 15-5 Quattro 4 MHz 15.5-4.5
+
+ 44 Mephisto Roma 68000 12 MHz, 1967
+Super Exp. C 16.5-21.5 Academy 5 MHz 11.5-8.5 Rex 2.3 20MHz 3.5-7.5
+Maestro B 18 0.5-2.5 Meph. Mega IV 17-6 Excel Mach 2c 20.5-19.5
+Super Exp. B 4-3 Kasp. GK-2000 13.5-6.5 Mephisto MM 4 19-9
+Psion Atari 27-8 Sphinx Galaxy 13-8 Excel Mach 2a 12-12
+Turboking II 12.5-7.5 Plym Victoria 13-7 Excel Club 16-4
+Mega IV BF 14-6 Avant Garde 20.5-6.5 Super Exp. A 19-5
+Par Excell. 25.5-3.5 Rebell 5 MHz 16.5-4.5 Stratos 6 MHz 36-26
+Forte B 45-15 Super Mondial 14.5-6.5 Plymate 5.5 13-7
+Maestro A 6 17.5-2.5 Forte A 7-1 Simultano C 11.5-5.5
+Excellence 4 17-3 Expert 4 MHz 1-1 Turbostar 432 17.5-4.5
+Excellence 3 36-9 Super Const. 56.5-7.5 Superstar 36K 19-1
+Conchess 2MHz 17.5-2.5 Quattro 4 MHz 18.5-1.5 Cmaster 2000 3.5-0.5
+
+ 45 Zarkov 2.6 386/25-33 MHz, 1966
+Super Exp. B 6.5-3.5 Kasp. GK-2000 12-8 Plym Victoria 4-3
+Par Excell. 4.5-2.5 Super Mondial 1-0 Chesscard 5 7-1
+
+ 46 Mephisto Milano 6502 5 MHz, 1955
+Super Exp. C 8.5-11.5 Meph. Mega IV 15.5-14.5 Kasp. GK-2000 7.5-3.5
+Mephisto MM 4 13.5-6.5 Meph. Modena 11-9 Psion Atari 15.5-4.5
+Sphinx Galaxy 7.5-1.5 Plym Victoria 12.5-7.5 Super Exp. A 15-5
+Stratos 6 MHz 12.5-7.5 Super Mondial 16-4 Plymate 5.5 12-8
+Simultano C 14-6 Elite A/S 3.2 17.5-2.5
+
+ 47 Novag Super Expert C 6502 6 MHz Sel 5, 1954, (1996 vs humans, 15 games)
+Academy 5 MHz 12-8 Rex 2.3 20MHz 0.5-0.5 Meph. Mega IV 11.5-10.5
+Excel Mach 2c 19-11 Maestro D 10 8.5-11.5 Mephisto MM 4 11.5-7.5
+Meph. Modena 13-7 Psion Atari 14.5-5.5 Sphinx Galaxy 21-12
+Turboking II 11-9 Plym Victoria 11-9 Excel Club 11-5
+Avant Garde 13-7 Super Exp. A 10.5-9.5 Rebell 5 MHz 10.5-11.5
+Stratos 6 MHz 13.5-6.5 Super Mondial 15.5-4.5 Plymate 5.5 8.5-11.5
+Simultano C 13-7 Excellence 4 14.5-5.5 Expert 4 MHz 15-5
+Excellence 3 6-4 Super Nova 16-4 Super Const. 36.5-9.5
+Elite A/S 3.2 13.5-6.5 Superstar 36K 18.5-1.5 Conchess 2MHz 15.5-4.5
+Cmaster 2000 19.5-1.5 Const. 2 MHz 9.5-0.5
+
+ 48 Mephisto Academy 6502 5 MHz, 1940, (2057 vs humans, 21 games)
+Amsterdam 12-12 Meph. Mega IV 22-11 Excel Mach 2c 12.5-7.5
+Maestro D 10 17-23 Super Exp. B 14-6 Mephisto MM 4 5-3
+Psion Atari 14-6 Sphinx Galaxy 17.5-24.5 Turboking II 12-8
+Plym Victoria 13.5-6.5 Excel Club 21-19 Avant Garde 13-7
+Super Exp. A 15.5-8.5 Rebell 5 MHz 14.5-5.5 Stratos 6 MHz 12.5-7.5
+Super Mondial 12-8 Plymate 5.5 13.5-6.5 Forte A 12.5-7.5
+Simultano C 34-11 Excellence 4 16.5-3.5 Super Nova 14-6
+Conchess 4MHz 1-0 Elite A/S 3.2 14.5-5.5 Superstar 36K 16-4
+Champion 2175 16-4 Conchess 2MHz 6-0 Cmaster 2000 13-2
+
+ 49 Rex Chess 2.3 80386 16-20 MHz, 1928
+Super Exp. B 2-1 Mephisto MM 4 11-6 Sphinx Galaxy 24.5-15.5
+Excel Club 9.5-4.5 Simultano C 8-11
+
+ 50 Saitek Leonardo Maestro B 6502 18 MHz, 1925
+Meph. Mega IV 3.5-3.5 Psion Atari 7-5 Excel Club 12.5-7.5
+Rebell 5 MHz 12-8 Forte B 12.5-6.5 Plymate 5.5 15-9
+
+ 51 Mephisto Amsterdam 68000 12 MHz, 1924
+Meph. Mega IV 10-10 Excel Mach 2c 12.5-12.5 Expert 16 MHz 10.5-9.5
+Super Exp. B 1-2 Mephisto MM 4 12.5-9.5 Psion Atari 9.5-10.5
+Sphinx Galaxy 13-7 Excel Club 31-23 Avant Garde 96.5-58.5
+Super Exp. A 13-7 Par Excell. 28-12 Rebell 5 MHz 12.5-7.5
+Stratos 6 MHz 13-7 Forte B 11.5-8.5 Super Mondial 13-7
+Plymate 5.5 22-7 Maestro A 6 12.5-7.5 Forte A 41-24
+Excellence 4 15.5-4.5 Expert 4 MHz 5-3 Mephisto MM 2 9-1
+Turbostar 432 20-11 Excellence 3 17.5-4.5 Super Const. 62-16
+Mephisto B&P 3.5-0.5 Prestige 4MHz 3-0 Quattro 4 MHz 16.5-3.5
+
+ 52 Mephisto Mega IV 6502 4.9 MHz, 1916, (1866 vs humans, 28 games)
+Excel Mach 2c 16.5-16.5 Maestro D 10 13-22 Super Exp. B 13-7
+Mephisto MM 4 9.5-10.5 Meph. Modena 12-8 Psion Atari 9-11
+Sphinx Galaxy 17-13 Turboking II 9-11 Plym Victoria 13.5-6.5
+Excel Club 11.5-8.5 Avant Garde 13.5-9.5 Super Exp. A 12-8
+Rebell 5 MHz 20-10 Stratos 6 MHz 12.5-7.5 Forte B 52-26
+Super Mondial 9.5-10.5 Plymate 5.5 17-5 Forte A 13.5-6.5
+Simultano C 30.5-4.5 Excellence 4 20.5-3.5 Expert 4 MHz 14.5-5.5
+Turbostar 432 15-5 Excellence 3 19-9 Super Nova 7.5-2.5
+Super Const. 14.5-5.5 Elite A/S 3.2 20.5-4.5 Superstar 36K 17-3
+Champion 2175 2-0 Quattro 4 MHz 9.5-0.5 Cmaster 2000 3-1
+Const. 2 MHz 18.5-0.5
+
+ 53 Fidelity Excel Mach IIc 68000 12 MHz, 1915
+Mephisto MM 4 13-15 Psion Atari 16.5-3.5 Sphinx Galaxy 13-7
+Excel Club 29-16 Avant Garde 15.5-6.5 Super Exp. A 21.5-20.5
+Par Excell. 6.5-3.5 Rebell 5 MHz 12-8 Stratos 6 MHz 14-6
+Forte B 16.5-3.5 Super Mondial 12.5-7.5 Plymate 5.5 22-10
+Forte A 27-13 Excellence 4 12-8 Expert 4 MHz 13.5-6.5
+Turbostar 432 17-3 Excellence 3 13-7 Super Const. 19.5-10.5
+Elite A/S 3.2 17-3 Superstar 36K 16.5-3.5
+
+ 54 Saitek Maestro D 6502 10 MHz, 1914, (1722 vs humans, 18 games)
+Mephisto MM 4 14-26 Psion Atari 13-7 Sphinx Galaxy 22-18
+Super Exp. A 26.5-16.5 Rebell 5 MHz 24-13 Stratos 6 MHz 25.5-14.5
+Super Mondial 17.5-22.5 Plymate 5.5 23-17 Simultano C 15.5-4.5
+Excellence 4 13.5-6.5 Turbostar 432 2.5-0.5 Super Const. 14.5-5.5
+Elite A/S 3.2 16.5-3.5 Superstar 36K 17.5-2.5
+
+ 55 Novag Expert Turbo Kit 6502 16 MHz, 1906
+Avant Garde 12-8 Rebell 5 MHz 10.5-9.5 Super Mondial 11-9
+Plymate 5.5 14.5-5.5 Turbostar 432 16-4
+
+ 56 Novag Super Expert B 6502 6 MHz sel 4, 1904, (1892 vs humans, 9 games)
+Mephisto MM 4 8-12 CM3000 386/33 1-3 Psion Atari 10.5-9.5
+Sphinx Galaxy 14-6 Avant Garde 0.5-0.5 Super Exp. A 13-7
+Rebell 5 MHz 10.5-9.5 Stratos 6 MHz 13.5-6.5 Super Mondial 13-7
+Plymate 5.5 15-5 Simultano C 21.5-9.5 Excellence 4 11-9
+Excellence 3 3.5-1.5 Chesscard 5 8.5-1.5 Super VIP 15.5-4.5
+Elite A/S 3.2 13-7 Conchess 2MHz 4-1 Const. 2 MHz 1-0
+
+ 57 Kasparov GK-2000 H8 10 MHz, 1904
+Meph. Modena 12.5-7.5 Psion Atari 14-6 Turboking II 11-9
+Rebell 5 MHz 12-8 Chesspl. 2150 14-6
+
+ 59 Mephisto MM 4 6502 5 MHz, 1901
+Psion Atari 19.5-16.5 Sphinx Galaxy 11-9 Excel Mach 2a 12.5-7.5
+Turboking II 5.5-4.5 Plym Victoria 10-10 Excel Club 11-10
+Avant Garde 12-10 Super Exp. A 31-13 Par Excell. 12.5-7.5
+Rebell 5 MHz 16-4 Stratos 6 MHz 18-9 Forte B 14.5-5.5
+Super Mondial 13-7 Plymate 5.5 28.5-11.5 Maestro A 6 12-8
+Forte A 13.5-6.5 Simultano C 11.5-8.5 Excellence 4 11.5-8.5
+Expert 4 MHz 13.5-6.5 Turbostar 432 13.5-6.5 Excellence 3 16.5-3.5
+Super Const. 17-3 Mephisto B&P 6.5-3.5 Elite A/S 3.2 17-3
+Superstar 36K 13.5-6.5 Quattro 4 MHz 14.5-5.5 Cmaster 2000 15.5-1.5
+Super Enterp. 21-5 Turbo S 24K 4-0
+
+ 60 Chessmaster 3000 386/25-33 MHz, 1900
+Super Mondial 2-2 Chesscard 5 8-4
+
+ 61 Mephisto Modena 6502 4 MHz, 1886
+Mega IV BF 2.5-2.5 Super Mondial 13-7 Plymate 5.5 14-6
+Simultano C 10.5-9.5 Meph. Europa 15.5-4.5 Elite A/S 3.2 17-3
+
+ 62 Psion Atari 68000 8 MHz, 1880, (1947 vs humans, 5 games)
+Sphinx Galaxy 10-10 Excel Mach 2a 13.5-6.5 Turboking II 9-12
+Plym Victoria 15-5 Excel Club 32.5-18.5 Avant Garde 13.5-7.5
+Super Exp. A 13.5-11.5 Par Excell. 12.5-7.5 Rebell 5 MHz 19-8
+Stratos 6 MHz 16-20 Forte B 13-7 Super Mondial 15-5
+Plymate 5.5 13-9 Maestro A 6 18-14 Forte A 10.5-9.5
+Excellence 4 19.5-9.5 Expert 4 MHz 20-9 Turbostar 432 14.5-5.5
+Excellence 3 22.5-9.5 Kasp. Blitz 14-6 Super Const. 19-4
+Chesspl. 2150 9-6 Mephisto B&P 3-1 Chesscard 5 8-5
+Super VIP 10-0 Superstar 36K 17-3 Champion 2175 6.5-0.5
+Conchess 2MHz 15.5-4.5 Quattro 4 MHz 15.5-4.5 Cmaster 2000 2-0
+Const. 2 MHz 1-0 Super Enterp. 18.5-1.5
+
+ 63 CXG Sphinx Galaxy 6502 4 MHz, 1875, (1999 vs humans, 28 games)
+Turboking II 8-12 Plym Victoria 11.5-8.5 Mega IV BF 4.5-2.5
+Avant Garde 12-8 Rebell 5 MHz 10-10 Stratos 6 MHz 27-12
+Super Mondial 17-3 Plymate 5.5 11.5-8.5 Maestro A 6 1.5-1.5
+Forte A 4.5-3.5 Simultano C 35.5-24.5 Excellence 4 3.5-1.5
+Expert 4 MHz 10.5-9.5 Excellence 3 8-4 Kasp. Blitz 11.5-8.5
+Chesspl. 2150 13.5-6.5 Super VIP 5-0 Elite A/S 3.2 17-3
+Cmaster 2100 15-5 Champion 2175 8.5-11.5 Conchess 2MHz 23.5-9.5
+Const. 3.6MHz 12.5-5.5 Super Enterp. 3-0
+
+ 64 Fidelity Excel Mach IIa 68000 12 MHz, 1875
+Avant Garde 9.5-10.5 Rebell 5 MHz 12.5-7.5 Plymate 5.5 14-8
+Maestro A 6 15-5 Excellence 3 13.5-6.5
+
+ 65 Saitek Turboking II 6502 5 MHz, 1872
+Plym Victoria 10.5-9.5 Super Exp. A 12.5-7.5 Rebell 5 MHz 10-10
+Stratos 6 MHz 12.5-7.5 Super Mondial 10.5-9.5 Plymate 5.5 12-8
+Simultano C 12.5-7.5 Excellence 4 10.5-9.5 Super Nova 12-8
+Super Const. 15-5 Elite A/S 3.2 13-7 Cmaster 2100 15-5
+Superstar 36K 16-4 Champion 2175 16.5-3.5 Cmaster 2000 15.5-4.5
+
+ 66 Conchess Plymate Victoria 6502 5.5 MHz, 1862, (1841 vs humans, 7 games)
+Mega IV BF 9.5-10.5 Super Exp. A 11.5-8.5 Rebell 5 MHz 11-9
+Stratos 6 MHz 10-10 Super Mondial 11-9 Plymate 5.5 14-6
+Maestro A 6 7-3 Simultano C 11-9 Excellence 4 0.5-0.5
+Chesscard 5 16.5-3.5 Elite A/S 3.2 18.5-1.5 Superstar 36K 14.5-5.5
+Cmaster 2000 17-3
+
+ 67 Fidelity Excel Club 68000 12 MHz, 1854, (1774 vs humans, 6 games)
+Avant Garde 27-23 Super Exp. A 11-15 Rebell 5 MHz 11.5-8.5
+Stratos 6 MHz 13.5-6.5 Forte B 10.5-9.5 Super Mondial 10-10
+Plymate 5.5 18-6 Maestro A 6 13.5-6.5 Forte A 31.5-18.5
+Excellence 4 16-10 Expert 4 MHz 18-6 Turbostar 432 47.5-31.5
+Excellence 3 15-5 Super Const. 12.5-7.5 Elite A/S 3.2 17.5-2.5
+Superstar 36K 13.5-6.5 Conchess 2MHz 15-5 Quattro 4 MHz 14.5-5.5
+Cmaster 2000 7.5-3.5 Const. 2 MHz 2-0 Super Enterp. 7-1
+
+ 68 Mephisto Mega IV Brute Force, 1840
+Super Exp. A 8.5-11.5 Rebell 5 MHz 11-9 Stratos 6 MHz 6.5-13.5
+Super Mondial 12-8 Simultano C 11-9 Expert 4 MHz 8.5-3.5
+Super Const. 16.5-6.5 Elite A/S 3.2 22-3
+
+ 69 Fidelity Avant Garde 6502 5 MHz, 1832
+Super Exp. A 8.5-11.5 Par Excell. 20.5-20.5 Rebell 5 MHz 10-10
+Stratos 6 MHz 12-10 Forte B 11-9 Super Mondial 11-9
+Plymate 5.5 19-17 Maestro A 6 9-11 Forte A 21.5-17.5
+Excellence 4 13-7 Expert 4 MHz 50-35 Plymate 4 MHz 14.5-10.5
+Turbostar 432 20-9 Excellence 3 14-7 Super Const. 23.5-8.5
+Elite A/S 3.2 6-4 Superstar 36K 16-5 Conchess 2MHz 15.5-4.5
+Quattro 4 MHz 15.5-4.5 Cmaster 2000 15.5-4.5 Const. 2 MHz 18-2
+
+ 70 Novag Super Expert/Forte A 6502 5 MHz, 1831, (1718 vs humans, 9 games)
+Rebell 5 MHz 10.5-9.5 Stratos 6 MHz 7-15 Super Mondial 8-12
+Plymate 5.5 12.5-27.5 Maestro A 6 10-10 Simultano C 10-10
+Excellence 4 32-30 Turbostar 432 15-5 Excellence 3 14-6
+Kasp. Blitz 14-6 Super Const. 14-6 Elite A/S 3.2 15.5-4.5
+Superstar 36K 19.5-5.5 Champion 2175 12-8 Conchess 2MHz 14-6
+Quattro 4 MHz 15.5-4.5
+
+ 71 Fidelity Par Excellence 6502 5 MHz, 1829
+Rebell 5 MHz 21-14 Forte B 15-7 Super Mondial 11.5-8.5
+Plymate 5.5 46.5-41.5 Maestro A 6 10-10 Forte A 47.5-37.5
+Excellence 4 17.5-12.5 Expert 4 MHz 19-15 Plymate 4 MHz 5.5-4.5
+Mephisto MM 2 10.5-9.5 Turbostar 432 12.5-7.5 Excellence 3 11.5-8.5
+Super Nova 8-2 Super Const. 44.5-25.5 Chesscard 5 2-4
+Elite A/S 3.2 16-4 Superstar 36K 16.5-3.5 Conchess 2MHz 16-4
+Quattro 4 MHz 16.5-3.5 Const. 3.6MHz 13-7 Turbo S 24K 7-1
+
+ 72 Mephisto Rebell 6502 5 MHz, 1821
+Stratos 6 MHz 12.5-7.5 Forte B 20.5-23.5 Super Mondial 13-7
+Plymate 5.5 12.5-8.5 Maestro A 6 13.5-8.5 Forte A 14-11
+Simultano C 11-13 Excellence 4 9.5-10.5 Expert 4 MHz 10-10
+Turbostar 432 10.5-9.5 Excellence 3 14-6 Super Nova 14.5-10.5
+Super Const. 10.5-9.5 Chesspl. 2150 14-6 Mephisto B&P 2-0
+Meph. Europa 5-1 Elite A/S 3.2 12-8 Superstar 36K 14.5-5.5
+Conchess 2MHz 13.5-6.5 Quattro 4 MHz 13.5-6.5
+
+ 73 Saitek Stratos/Analys B 6502 6 MHz, 1817
+Forte B 8-12 Super Mondial 11-9 Plymate 5.5 8.5-11.5
+Forte A 3-0 Simultano C 10-10 Excellence 4 11-10
+Expert 4 MHz 6-14 Turbostar 432 7.5-4.5 Excellence 3 14-7
+Kasp. Blitz 9-3 Super Nova 14-6 Super Const. 13-7
+Chesscard 5 2-1 Meph. Europa 2-1 Super VIP 9.5-10.5
+Elite A/S 3.2 14-6 Superstar 36K 11-9 Conchess 2MHz 4-0
+Quattro 4 MHz 16-4 Cmaster 2000 14.5-5.5 Const. 2 MHz 6-3
+
+ 74 Novag Forte B 6502 5 MHz, 1813, (1861 vs humans, 28 games)
+Super Mondial 11.5-8.5 Plymate 5.5 25-24 Maestro A 6 9.5-10.5
+Excellence 4 14.5-11.5 Expert 4 MHz 0.5-2.5 Elegance 3.6 3-2
+Turbostar 432 12.5-7.5 Excellence 3 14-6 Super Nova 1.5-0.5
+Super Const. 11-9 Meph. Europa 15.5-4.5 Elite A/S 3.2 14.5-5.5
+Superstar 36K 13-7 Conchess 2MHz 30.5-11.5 Quattro 4 MHz 16.5-3.5
+
+ 75 Mephisto Super Mondial 6502 4 MHz, 1812
+Plymate 5.5 11.5-16.5 Maestro A 6 11-9 Forte A 8-12
+Simultano C 14.5-5.5 Excellence 4 7.5-12.5 Expert 4 MHz 12-8
+Turbostar 432 8.5-11.5 Excellence 3 9-11 Kasp. Blitz 10-10
+Super Const. 10-10 Chesspl. 2150 15-5 Chesscard 5 15-5
+Elite A/S 3.2 14-6 Cmaster 2100 15.5-4.5 Superstar 36K 14-6
+Conchess 2MHz 16-4 Quattro 4 MHz 15.5-4.5
+
+ 76 Conchess Glasgow 6 MHz, 1812
+Super Const. 3.5-1.5 Elite A/S 3.2 8.5-3.5 Const. 2 MHz 9-3
+Mephisto III6 11-1
+
+ 77 Conchess Plymate 6502 5.5 MHz, 1808
+Maestro A 6 14-17 Forte A 47-47 Simultano C 8-11
+Excellence 4 113.5-96.5 Expert 4 MHz 13-9 Mephisto MM 2 2-0
+Elegance 3.6 5.5-4.5 Turbostar 432 20.5-14.5 Excellence 3 14.5-14.5
+Super Nova 9.5-10.5 Super Const. 24.5-7.5 Super VIP 12-8
+Elite A/S 3.2 12.5-7.5 Superstar 36K 11-9 Champion 2175 4-0
+Prestige 4MHz 4-1 Conchess 2MHz 15.5-4.5 Quattro 4 MHz 11-9
+Cmaster 2000 20.5-4.5 Const. 3.6MHz 21.5-4.5 Const. 2 MHz 14.5-5.5
+Sargon III 1M 1-0 Super Enterp. 18.5-1.5
+
+ 78 Saitek Leonardo Maestro A 6502 6 MHz, 1807, (1896 vs humans, 9 games)
+Forte A 8-13 Excellence 4 13-9 Turbostar 432 11-10
+Excellence 3 10.5-9.5 Super Const. 13-7 Superstar 36K 14.5-5.5
+Conchess 2MHz 16-4 Quattro 4 MHz 13-7 Cmaster 2000 1-0
+
+ 79 Novag Forte A 6502 5 MHz, 1806
+Excellence 4 21.5-29.5 Plymate 4 MHz 7-3 Mephisto MM 2 10.5-9.5
+Elegance 3.6 8.5-11.5 Turbostar 432 19.5-14.5 Excellence 3 10.5-12.5
+Super Const. 21.5-11.5 Elite A/S 3.2 16.5-3.5 Superstar 36K 15.5-4.5
+Conchess 2MHz 13-7 Quattro 4 MHz 18-4 Cmaster 2000 3.5-2.5
+Const. 3.6MHz 16-4 Const. 2 MHz 15-3 Super Enterp. 16.5-3.5
+
+ 80 Saitek Simultano/Corona C 6502 5 MHz, 1806
+Excellence 4 14.5-10.5 Kasp. Blitz 11-9 Super Nova 6.5-3.5
+Meph. Europa 2-0 Elite A/S 3.2 22.5-17.5 Cmaster 2100 14-6
+Superstar 36K 11.5-3.5
+
+ 81 Fidelity Excellence 6502 4 MHz, 1798
+Expert 4 MHz 24-22 Plymate 4 MHz 15-14 Mephisto MM 2 12-8
+Turbostar 432 39-39 Excellence 3 12.5-7.5 Kasp. Blitz 13-7
+Super Nova 12.5-7.5 Super Const. 20.5-9.5 Conchess 4MHz 17-7
+Mephisto B&P 0.5-2.5 Super VIP 15.5-4.5 Elite A/S 3.2 13-7
+Superstar 36K 12.5-8.5 Champion 2175 16-4 Conchess 2MHz 17-3
+Quattro 4 MHz 13-7 Cmaster 2000 17.5-2.5 Const. 3.6MHz 24-4
+Const. Primo 5.5-2.5 Const. 2 MHz 2-0
+
+ 82 Novag Expert 6502 4 MHz, 1784
+Plymate 4 MHz 5.5-14.5 Mephisto MM 2 4-6 Elegance 3.6 11.5-8.5
+Turbostar 432 11-9 Excellence 3 22-13 Super Nova 5.5-5.5
+Super Const. 16.5-12.5 Conchess 4MHz 4.5-2.5 Chesspl. 2150 1.5-1.5
+Mephisto B&P 2-0 Superstar 36K 11-9 Conchess 2MHz 14-6
+Quattro 4 MHz 3-1 Const. 3.6MHz 13.5-6.5 Const. Primo 10.5-2.5
+Super Enterp. 10-1
+
+ 83 Conchess Plymate 6502 4 MHz, 1775
+Elegance 3.6 25-22 Turbostar 432 9.5-10.5 Excellence 3 11.5-8.5
+Super Const. 38.5-27.5 Elite A/S 3.2 10-10 Superstar 36K 13-7
+Meph. Excl. S 7.5-2.5 Conchess 2MHz 11-9 Const. 3.6MHz 16.5-9.5
+
+ 84 Mephisto MM 2 6502 3.7 MHz, 1769
+Turbostar 432 16.5-19.5 Excellence 3 7.5-8.5 Super Const. 8.5-6.5
+Elite A/S 3.2 9-5 Superstar 36K 15.5-4.5 Const. 3.6MHz 14-6
+Const. 2 MHz 4-1
+
+ 85 Fidelity Elegance 6502 3.6 MHz, 1761
+Turbostar 432 16.5-13.5 Excellence 3 0.5-1.5 Super Const. 9-8
+Conchess 4MHz 28.5-23.5 Elite A/S 3.2 11.5-3.5 Meph. Excl. S 8-5
+Conchess 2MHz 7.5-4.5 Const. 3.6MHz 17.5-6.5 Const. 2 MHz 14-6
+Super Enterp. 10.5-1.5 Sensory 9 A 3.5-0.5 Steinitz 3-1
+Mephisto IIIM 4-0 Mephisto II 6 4-0 Chess 2001 2.5-1.5
+Scisys supers 4-0 Mephisto III6 3.5-0.5 Conchess -82 2.5-1.5
+Mark VI 3.5-0.5 Morphy 3-1
+
+ 86 Saitek Turbostar 432 6502 4 MHz, 1759
+Excellence 3 13-12 Super Const. 31.5-29.5 Conchess 4MHz 10-9
+Mephisto B&P 17.5-9.5 Elite A/S 3.2 15-5 Superstar 36K 10-10
+Meph. Excl. S 3-2 Prestige 4MHz 7-4 Conchess 2MHz 12-8
+Quattro 4 MHz 12-8 Const. 3.6MHz 14.5-7.5 Const. 2 MHz 18-7
+Sargon III 1M 1.5-0.5 Super Enterp. 17-3 Scisys supers 0-1
+Mephisto III6 18.5-1.5 Turbo S 24K 2-1 GMC 1-0
+
+ 87 Fidelity Excellence 6502 3 MHz, 1753, (1578 vs humans, 5 games)
+Super Nova 0-1 Super Const. 30.5-21.5 Conchess 4MHz 14.5-10.5
+Mephisto B&P 4-5 Super VIP 6.5-2.5 Elite A/S 3.2 14.5-5.5
+Superstar 36K 13.5-6.5 Conchess 2MHz 15.5-11.5 Quattro 4 MHz 15-5
+Const. 3.6MHz 21-11 Const. Primo 15-5 Const. 2 MHz 22-4
+Sargon III 1M 1-1 Super Enterp. 14-8
+
+ 88 Saitek Kasparov Blitz, 1736
+Super Nova 9.5-10.5 Super Enterp. 21-9
+
+ 89 Novag Super Nova, 1732
+Super Const. 10.5-9.5 Meph. Europa 11-9 Conchess 2MHz 13-7
+Const. 2 MHz 13-7 Super Enterp. 10.5-9.5
+
+ 90 Novag Super Constellation 6502 4 MHz, 1728, (1555 vs humans, 9 games)
+Conchess 4MHz 46-44 Chesspl. 2150 1-0 Mephisto B&P 9.5-7.5
+Chesscard 5 13.5-7.5 Super VIP 5-5 Elite A/S 3.2 10-3
+Superstar 36K 11.5-9.5 Champion 2175 13.5-6.5 Meph. Excl. S 10.5-5.5
+Prestige 4MHz 9.5-10.5 Conchess 2MHz 12.5-11.5 Quattro 4 MHz 14.5-5.5
+Const. 3.6MHz 19.5-5.5 Const. Primo 0.5-0.5 Const. 2 MHz 26-11
+Sargon III 1M 9-3 Meph. Mondial 10-4 Super Enterp. 10.5-1.5
+Sensory 9 A 4.5-1.5 Steinitz 4-0 Mephisto IIIM 16-1
+Mephisto II 6 4-0 Chess 2001 2.5-1.5 Scisys supers 3.5-1.5
+Mephisto III6 21-5 Conchess -82 3-1 GMC 4.5-0.5
+Mark VI 4-0 Mark V 9.5-0.5 Morphy 4-0
+
+ 91 Conchess Glasgow 6502 4 MHz, 1712
+Elite A/S 3.2 8.5-6.5 Superstar 36K 6-8 Meph. Excl. S 6-7
+Prestige 4MHz 27-12 Const. 3.6MHz 10.5-9.5 Const. 2 MHz 8.5-2.5
+Super Enterp. 5.5-4.5 Scisys supers 1-0 GMC 1-0
+
+ 92 Chessplayer 2150 Atari/Amiga, 1709
+Conchess 2MHz 11.5-8.5 Const. Primo 0-1
+
+ 94 The Final Chesscard 6502 5 MHz, 1695
+Const. 2 MHz 5.5-0.5
+
+ 95 Mephisto Europa, 1685
+Elite A/S 3.2 10.5-9.5 Superstar 36K 9.5-10.5 Conchess 2MHz 13.5-6.5
+Const. 2 MHz 7.5-6.5 Super Enterp. 14-6
+
+ 96 Novag Super VIP, 1684
+Elite A/S 3.2 12-8 Conchess 2MHz 5-15
+
+ 97 Fidelity Elite A/S 6502 3.2 MHz, 1677
+Superstar 36K 11.5-8.5 Meph. Excl. S 1.5-1.5 Conchess 2MHz 11.5-8.5
+Quattro 4 MHz 11.5-8.5 Const. 3.6MHz 12.5-16.5 Const. Primo 11-9
+Const. 2 MHz 7-5 Sensory 9 B 3-1 Sensory 9 A 41-13
+Steinitz 28-9 Mephisto IIIM 7-3 Mephisto II 6 11.5-3.5
+Chess 2001 9.5-0.5 Scisys supers 11.5-1.5 Mephisto III6 17.5-3.5
+Turbo S 24K 15-5 Conchess -82 7-1 GMC 1-0
+Mark VI 7-1 Morphy 8.5-0.5 Boris 2.5 0-1
+
+ 99 Saitek Superstar 36K 6502 2 MHz, 1675
+Conchess 2MHz 11.5-8.5 Quattro 4 MHz 11.5-11.5 Cmaster 2000 9.5-10.5
+Const. 3.6MHz 16.5-13.5 Const. Primo 9.5-10.5 Const. 2 MHz 11-9
+Meph. Mondial 10.5-9.5 Turbo 16K 15-5 Mephisto III6 2.5-1.5
+
+ 100 Chess Champion 2175 Atari/Amiga, 1670
+Conchess 2MHz 7.5-12.5 Cmaster 2000 0.5-1.5
+
+ 101 Mephisto Exclusive S, 1670
+Conchess 2MHz 2-2 Const. 3.6MHz 8.5-6.5 Scisys supers 1-0
+GMC 1-0
+
+ 102 Fidelity Prestige 6502 4 MHz, 1665
+Conchess 2MHz 3.5-3.5 Const. 3.6MHz 5-5 Elite -81 11-11
+Const. 2 MHz 15.5-6.5 Sensory 9 B 8-4 Sensory 9 A 28-6
+Steinitz 10.5-3.5 Mephisto II 6 52-12 Chess 2001 2-0
+Scisys supers 8.5-3.5 Mephisto III6 2-0 Conchess -82 14-4
+Champion chal 4.5-2.5 Mark VI 23-1 Mark V 8.5-1.5
+Morphy 3-0
+
+ 103 Conchess Glasgow 6502 2 MHz, 1663
+Quattro 4 MHz 7-13 Cmaster 2000 8-12 Const. 3.6MHz 8.5-13.5
+Const. Primo 11.5-8.5 Const. 2 MHz 12.5-7.5 Meph. Mondial 1.5-4.5
+Super Enterp. 12.5-7.5 Mephisto IIIM 1.5-0.5 Turbo S 24K 16-4
+GMC 2-0
+
+ 104 Novag Quattro 6502 4 MHz, 1659
+Cmaster 2000 9-11 Const. 3.6MHz 12-8 Const. Primo 11-9
+Super Enterp. 14.5-6.5
+
+ 106 Novag Constellation 6502 3.6 MHz, 1644
+Const. 2 MHz 20-14 Meph. Mondial 9.5-6.5 Super Enterp. 1-1
+Sensory 9 B 1-1 Sensory 9 A 3-1 Steinitz 2.5-1.5
+Mephisto IIIM 21.5-8.5 Mephisto II 6 4-0 Turbo 16K 16-4
+Chess 2001 5.5-0.5 Scisys supers 8.5-0.5 Turbo S 24K 15-5
+Conchess -82 4-0 GMC 4.5-1.5 Mark VI 4-0
+Morphy 3.5-0.5
+
+ 107 Novag Constellation Primo, 1634
+Const. 2 MHz 3.5-2.5 Super Enterp. 13-7
+
+ 108 Fidelity Elite -81, 1604
+Const. 2 MHz 4-6 Sensory 9 A 11-5 Steinitz 1-1
+Mephisto II 6 21.5-10.5 Conchess -82 11-3 GMC 13-1
+Mephisto II 3 9-1 Champion chal 11.5-3.5 Mark VI 1-1
+Mark V 9.5-4.5
+
+ 109 Novag Constellation 6502 2 MHz, 1596
+Sargon III 1M 1-1 Meph. Mondial 13-7 Super Enterp. 34-25
+Sensory 9 B 8-6 Sensory 9 A 34-22 Steinitz 46-17
+Mephisto IIIM 24-12 Mephisto II 6 26.5-10.5 Turbo 16K 16-4
+Chess 2001 13-4 Scisys supers 33.5-20.5 Mephisto III6 15.5-8.5
+Conchess -82 19.5-5.5 GMC 1-1 Mephisto II 3 1-0
+Mark VI 14-2 Mark V 2-0 Morphy 3.5-1.5
+Progidy 9-0 Boris 2.5 1-0
+
+ 110 Sargon III 1 MHz, 1590
+Conchess -82 6.5-1.5
+
+ 111 Mephisto Mondial, 1581
+Turbo 16K 11.5-8.5 Mephisto III6 3-1
+
+ 112 CXG Super Enterprise, 1561
+Turbo 16K 5-5 Mephisto III6 10.5-3.5 Enterprise S 8.5-1.5
+
+ 113 Fidelity Sensory 9 B, 1553
+Sensory 9 A 1-1 Mephisto IIIM 4-4 Scisys supers 7.5-4.5
+Mephisto III6 1-1 Conchess -82 3.5-0.5 Mark VI 4-0
+Morphy 3.5-0.5
+
+ 114 Fidelity Sensory 9 A, 1494
+Steinitz 17-18 Mephisto IIIM 13.5-14.5 Mephisto II 6 40.5-29.5
+Chess 2001 1-3 Scisys supers 2-2 Mephisto III6 10.5-4.5
+Conchess -82 18.5-9.5 GMC 18.5-7.5 Mephisto II 3 28.5-11.5
+Champion chal 15.5-6.5 Mark VI 10-7 Mark V 21.5-16.5
+Morphy 1-0 Progidy 4-0 Boris 2.5 3-0
+
+ 115 Steinitz, 1480, (1546 vs humans, 0 games)
+Mephisto IIIM 3-1 Mephisto II 6 20-17 Chess 2001 9-11
+Scisys supers 16-8 Mephisto III6 3.5-1.5 Conchess -82 8.5-3.5
+GMC 17.5-12.5 Mephisto II 3 3.5-1.5 Mark VI 10-8
+Morphy 2.5-2.5 Boris 2.5 1-0
+
+ 116 Mephisto III Modular, 1471
+Mephisto II 6 1-5 Chess 2001 2-4 Scisys supers 5-1
+Mephisto III6 5-3 Conchess -82 2-2 GMC 3-1
+Mark VI 7.5-4.5 Morphy 2-2
+
+ 117 Mephisto II 6.1 MHz, 1470
+Chess 2001 2-2 Scisys supers 3-3 Mephisto III6 2-3
+Conchess -82 24-16 GMC 13.5-4.5 Mephisto II 3 15-4
+Champion chal 6-2 Mark VI 16-10 Mark V 29-9
+Morphy 4-1 Progidy 3-2 Boris 2.5 1.5-1.5
+
+ 119 Chess 2001, 1462
+Scisys supers 2-4 Mephisto III6 3-3 Conchess -82 1.5-2.5
+Mark VI 2.5-1.5 Morphy 3-1
+
+ 120 Scisys Superstar, 1454
+Mephisto III6 4.5-3.5 Conchess -82 2-2 GMC 1-0
+Mark VI 3-1 Morphy 1.5-2.5
+
+ 121 Mephisto III 6.1 MHz, 1452
+Conchess -82 4-0 Mark VI 3-1 Morphy 3-2
+Boris 2.5 1-0
+
+ 122 Saitek Turbo S 24K, 1431
+Champion chal 7-13
+
+ 123 Conchess -82 2 MHz, 1408
+GMC 2-6 Mephisto II 3 13-5 Champion chal 14.5-11.5
+Mark VI 3.5-4.5 Mark V 14.5-7.5 Morphy 9.5-4.5
+Enterprise S 12-4 Boris 2.5 1.5-0.5
+
+ 124 GMC, 1385
+Mephisto II 3 20-19 Champion chal 40-40 Mark V 37.5-27.5
+Boris 2.5 2-0
+
+ 125 Mephisto II 3.5 MHz, 1380
+Champion chal 28.5-14.5 Mark V 25.5-22.5 Morphy 42-28
+Progidy 1.5-0.5 Boris 2.5 10-1
+
+ 126 Champion Sensory Challenger, 1379
+Mark V 45-36 Morphy 12.5-11.5 Enterprise S 9.5-0.5
+
+ 127 Mark VI, 1375
+Morphy 3-1
+
+ 128 Mark V, 1352
+Morphy 6.5-5.5 Progidy 4-4 Boris 2.5 4.5-0.5
+
+ 129 Morphy, 1334
+Boris 2.5 24.5-10.5
+
+ 131 Enterprise S, 1182
+Boris 2.5 5-5
+
diff --git a/programs/engine-intf.html b/programs/engine-intf.html
new file mode 100644
index 0000000..07a2976
--- /dev/null
+++ b/programs/engine-intf.html
@@ -0,0 +1,1895 @@
+<html>
+<head>
+<title>Chess Engine Communication Protocol</title>
+</head>
+
+<body>
+<hr noshade size="2">
+<h1>Chess Engine Communication Protocol</h1>
+<h2><a href="http://www.tim-mann.org/">Tim Mann</a></h2>
+<p>
+$Id: engine-intf.html,v 2.1 2003/10/27 19:21:00 mann Exp $<br>
+Version 2; implemented in xboard/WinBoard 4.2.1 and later.<br>
+Changes since version 1 are indicated in <font color=red>red</font>.
+<hr noshade size="2">
+
+<ul>
+<li><a href="#1">1. Introduction</a>
+<li><a href="#2">2. Connection</a>
+<li><a href="#3">3. Debugging</a>
+<li><a href="#4">4. How it got this way</a>
+<li><a href="#5">5. WinBoard requires Win32 engines</a>
+<li><a href="#6">6. Hints on input/output</a>
+<li><a href="#7">7. Signals</a>
+<li><a href="#8">8. Commands from xboard to the engine</a>
+<li><a href="#9">9. Commands from the engine to xboard</a>
+<li><a href="#10">10. Thinking Output</a>
+<li><a href="#11">11. Time control</a>
+<li><a href="#12">12. Analyze Mode</a>
+<li><a href="#13">13. Idioms and backward compatibility features</a>
+</ul>
+
+<hr noshade size="2">
+
+<h2><a name="1">1. Introduction</a></h2>
+
+<p>
+This document is a set of rough notes on the protocol that xboard and
+WinBoard use to communicate with gnuchessx and other chess engines.
+These notes may be useful if you want to connect a different chess
+engine to xboard. Throughout the notes, "xboard" means both xboard
+and WinBoard except where they are specifically contrasted.
+</p>
+
+<p>
+There are two reasons I can imagine someone wanting to do this:
+</p>
+<ol>
+<li>You have, or are developing, a chess engine but you don't want to
+write your own graphical interface.
+<li>You have, or are developing,a chess engine, and you want to
+interface it to the Internet Chess Server.
+</ol>
+
+<p>
+In case (2), if you are using xboard, you will need to configure the
+"Zippy" code into it, but WinBoard includes this code already. See
+the file <a
+href="http://www.tim-mann.org/xboard/zippy.README">zippy.README</a>
+in the xboard or WinBoard distribution for more information.
+
+</p>
+
+<p>
+These notes are unpolished, but I've attempted to make them complete
+in this release. If you notice any errors, omissions, or misleading
+statements, let me know.
+</p>
+
+<p>
+I'd like to hear from everyone who is trying to interface their own
+chess engine to xboard/WinBoard. Please join the mailing list for
+authors of xboard/WinBoard compatible chess engines and post a message
+about what you're doing. The list is now hosted by Yahoo Groups; you
+can join at <a href="http://groups.yahoo.com/group/chess-engines"
+>http://groups.yahoo.com/group/chess-engines</a>, or you can read the
+list there without joining. The list is filtered to prevent spam.
+</p>
+
+<h2><a name="2">2. Connection</a></h2>
+
+<p>
+An xboard chess engine runs as a separate process from xboard itself,
+connected to xboard through a pair of anonymous pipes. The engine
+does not have to do anything special to set up these pipes. xboard
+sets up the pipes itself and starts the engine with one pipe as its
+standard input and the other as its standard output. The engine then
+reads commands from its standard input and writes responses to its
+standard output. This is, unfortunately, a little more complicated to
+do right than it sounds; see <a href="#6">section 6</a> below.
+</p>
+
+<p>
+And yes, contrary to some people's expectations, exactly the same
+thing is true for WinBoard. Pipes and standard input/output are
+implemented in Win32 and work fine. You don't have to use DDE, COM,
+DLLs, BSOD, or any of the other infinite complexity that
+Microsoft has created just to talk between two programs. A WinBoard
+chess engine is a Win32 console program that simply reads from its
+standard input and writes to its standard output. See sections
+<a href="#5">5</a> and <a href="#6">6</a> below for additional details.
+</p>
+
+<h2><a name="3">3. Debugging</a></h2>
+
+<p>
+To diagnose problems in your engine's interaction with xboard, use the
+-debug flag on xboard's command line to see the messages that are
+being exchanged. In WinBoard, these messages are written to the file
+WinBoard.debug instead of going to the screen.
+</p>
+
+<p>
+You can turn debug mode on or off while WinBoard is running by
+pressing Ctrl+Alt+F12. You can turn debug mode on or off while xboard
+is running by binding DebugProc to a shortcut key (and pressing the
+key!); see the instructions on shortcut keys in the xboard man page.
+</p>
+
+<p>
+While your engine is running under xboard/WinBoard, you can send a
+command directly to the engine by pressing Shift+1 (xboard) or Alt+1
+(WinBoard 4.0.3 and later). This brings up a dialog that you can type
+your command into. Press Shift+2 (Alt+2) instead to send to the
+second chess engine in Two Machines mode. On WinBoard 4.0.2 and earlier,
+Ctrl+Alt is used in place of Alt; this had to be changed due to a conflict
+with typing the @-sign on some European keyboards.
+</p>
+
+<h2><a name="4">4. How it got this way</a></h2>
+
+<p>
+Originally, xboard was just trying to talk to the existing
+command-line interface of GNU Chess 3.1+ and 4, which was designed
+for people to type commands to. So the communication protocol is very
+ad-hoc. It might have been good to redesign it early on, but because
+xboard and GNU Chess are separate programs, I didn't want to force
+people to upgrade them together to versions that matched. I
+particularly wanted to keep new versions of xboard working with old
+versions of GNU Chess, to make it easier to compare the play of old
+and new gnuchess versions. I didn't foresee the need for a clean
+protocol to be used with other chess engines in the future.
+</p>
+
+<p>
+Circumstances have changed over the years, and now there are many more
+engines that work with xboard. I've had to make the protocol
+description more precise, I've added some features that GNU Chess
+does not support, and I've specified the standard semantics of a few
+features to be slightly different from what GNU Chess 4 does.
+</p>
+
+<p>
+<font color=red>
+This release of the protocol specification is the first to carry a
+version number of its own -- version 2. Previous releases simply
+carried a last-modified date and were loosely tied to specific
+releases of xboard and WinBoard. The version number "1" applies
+generally to all those older versions of the protocol.
+</font>
+
+<font color=red>
+<p>Protocol version 2 remains compatible with older engines but has
+several new capabilities. In particular, it adds the
+"feature" command, a new mechanism for making backward-compatible
+changes and extensions to the protocol. Engines that do not support a
+particular new feature do not have to use it; new features are not
+enabled unless the engine specifically requests them using the feature
+command. If an engine does not send the feature command at all, the
+protocol behavior is nearly identical to version 1. Several new
+features can be selected by the feature command in version 2,
+including the "ping" command (recommended for all engines), the
+"setboard" command, and many optional parameters. Additional features
+will probably be added in future versions.
+</p>
+</font>
+
+<h2><a name="5">5. WinBoard requires Win32 engines</a></h2>
+
+<p>
+Due to some Microsoft brain damage that I don't understand, WinBoard
+does not work with chess engines that were compiled to use a DOS
+extender for 32-bit addressing. (Probably not with 16-bit DOS or
+Windows programs either.) WinBoard works only with engines that are
+compiled for the Win32 API. You can get a free compiler that targets
+the Win32 API from <a href="http://sources.redhat.com/cygwin/"
+>http://sources.redhat.com/cygwin/</a>. I think DJGPP 2.x should also
+work if you use the RSXNTDJ extension, but I haven't tried it. Of
+course, Microsoft Visual C++ will work. Most likely the other
+commercial products that support Win32 will work too (Borland, etc.),
+but I have not tried them. Delphi has been successfully used to write
+engines for WinBoard; if you want to do this, Tony Werten has donated
+some <a href="http://www.tim-mann.org/winboard/delphi.txt" >sample
+code</a> that should help you get started.
+</p>
+
+<h2><a name="6">6. Hints on input/output</a></h2>
+
+<p>
+Beware of using buffered I/O in your chess engine. The C stdio
+library, C++ streams, and the I/O packages in most other languages use
+buffering both on input and output. That means two things. First,
+when your engine tries to write some characters to xboard, the library
+stashes them in an internal buffer and does not actually write them to
+the pipe connected to xboard until either the buffer fills up or you
+call a special library routine asking for it to be flushed. (In C
+stdio, this routine is named <tt>fflush</tt>.) Second, when your engine tries
+to read some characters from xboard, the library does not read just
+the characters you asked for -- it reads all the characters that are
+currently available (up to some limit) and stashes any characters you
+are not yet ready for in an internal buffer. The next time you ask to
+read, you get the characters from the buffer (if any) before the
+library tries to read more data from the actual pipe.
+</p>
+
+<p>
+Why does this cause problems? First, on the output side, remember
+that your engine produces output in small quantities (say, a few
+characters for a move, or a line or two giving the current analysis),
+and that data always needs to be delivered to xboard/WinBoard for
+display immediately. If you use buffered output, the data you print
+will sit in a buffer in your own address space instead of being
+delivered.
+</p>
+
+<p>
+You can usually fix the output buffering problem by asking for the
+buffering to be turned off. In C stdio, you do this by calling
+<tt>setbuf(stdout, NULL)</tt>. A more laborious and error-prone
+method is to carefully call <tt>fflush(stdout)</tt> after every line
+you output; I don't recommend this. In C++, you can try
+<tt>cout.setf(ios::unitbuf)</tt>, which is documented in current
+editions of "The C++ Programming Language," but not older ones.
+Another C++ method that might work is
+<tt>cout.rdbuf()-&gt;setbuf(NULL, 0)</tt>. Alternatively, you can
+carefully call <tt>cout.flush()</tt> after every line you output;
+again, I don't recommend this.
+</p>
+
+<p>
+Another way to fix the problem is to use unbuffered operating system
+calls to write directly to the file descriptor for standard output.
+On Unix, this means <tt>write(1, ...)</tt> -- see the man page for write(2).
+On Win32, you can use either the Unix-like <tt>_write(1, ...)</tt> or Win32
+native routines like <tt>WriteFile</tt>.
+</p>
+
+<p>
+Second, on the input side, you are likely to want to poll during your
+search and stop it if new input has come in. If you implement
+pondering, you'll need this so that pondering stops when the user
+makes a move. You should also poll during normal thinking on your
+move, so that you can implement the "?" (move now) command, and so
+that you can respond promptly to a "result", "force", or "quit"
+command if xboard wants to end the game or terminate your engine.
+Buffered input makes polling more complicated -- when you poll, you
+must stop your search if there are <em>either</em> characters in the buffer
+<em>or</em> characters available from the underlying file descriptor.
+</p>
+
+<p>
+The most direct way to fix this problem is to use unbuffered operating
+system calls to read (and poll) the underlying file descriptor
+directly. On Unix, use <tt>read(0, ...)</tt> to read from standard input, and
+use <tt>select()</tt> to poll it. See the man pages read(2) and select(2).
+(Don't follow the example of GNU Chess 4 and use the FIONREAD ioctl to
+poll for input. It is not very portable; that is, it does not exist
+on all versions of Unix, and is broken on some that do have it.) On
+Win32, you can use either the Unix-like <tt>_read(0, ...)</tt> or the native
+Win32 <tt>ReadFile()</tt> to read. Unfortunately, under Win32, the function to
+use for polling is different depending on whether the input device is
+a pipe, a console, or something else. (More Microsoft brain damage
+here -- did they never hear of device independence?) For pipes, you
+can use <tt>PeekNamedPipe</tt> to poll (even when the pipe is unnamed).
+For consoles,
+you can use <tt>GetNumberOfConsoleInputEvents</tt>. For sockets only, you can
+use <tt>select()</tt>. It might be possible to use
+<tt>WaitForSingleObject</tt> more
+generally, but I have not tried it. Some code to do these things can
+be found in Crafty's utility.c, but I don't guarantee that it's all
+correct or optimal.
+</p>
+
+<p>
+A second way to fix the problem might be to ask your I/O library not
+to buffer on input. It should then be safe to poll the underlying
+file descriptor as described above. With C, you can try calling
+<tt>setbuf(stdin, NULL)</tt>. However, I have never tried this. Also, there
+could be problems if you use <tt>scanf()</tt>, at least with certain patterns,
+because <tt>scanf()</tt> sometimes needs to read one extra character and "push
+it back" into the buffer; hence, there is a one-character pushback
+buffer even if you asked for stdio to be unbuffered. With C++, you
+can try <tt>cin.rdbuf()-&gt;setbuf(NULL, 0)</tt>, but again, I have never tried
+this.
+</p>
+
+<p>
+A third way to fix the problem is to check whether there are
+characters in the buffer whenever you poll. C I/O libraries generally
+do not provide any portable way to do this. Under C++, you can use
+<tt>cin.rdbuf()-&gt;in_avail()</tt>. This method has been reported to
+work with
+EXchess. Remember that if there are no characters in the buffer, you
+still have to poll the underlying file descriptor too, using the
+method described above.
+</p>
+
+<p>
+A fourth way to fix the problem is to use a separate thread to read
+from stdin. This way works well if you are familiar with thread
+programming. This thread can be blocked waiting for input to come in
+at all times, while the main thread of your engine does its thinking.
+When input arrives, you have the thread put the input into a buffer
+and set a flag in a global variable. Your search routine then
+periodically tests the global variable to see if there is input to
+process, and stops if there is. WinBoard and my Win32 ports of ICC
+timestamp and FICS timeseal use threads to handle multiple input
+sources.
+</p>
+
+<h2><a name="7">7. Signals</a></h2>
+
+<p>Engines that run on Unix need to be concerned with two Unix
+signals: <tt>SIGTERM</tt> and <tt>SIGINT</tt>. This applies both to
+engines that run under xboard and (the unusual case of) engines that
+WinBoard remotely runs on a Unix host using the -firstHost or
+-secondHost feature. It does not apply to engines that run on
+Windows, because Windows does not have Unix-style signals.
+<font color=red>
+Beginning with version 2, you can now turn off the use of
+either or both
+signals. See the "feature" command in <a href="#6">section 9</a> below.
+</font>
+</p>
+
+<p>First, when an engine is sent the "quit" command, it is also given
+a <tt>SIGTERM</tt> signal shortly afterward to make sure it goes away.
+If your engine reliably responds to "quit", and the signal causes
+problems for you, you should either ignore it by calling
+<tt>signal(SIGTERM, SIG_IGN)</tt> at the start of your program,
+or disable it with the "feature" command.</p>
+
+<p>Second, xboard will send an interrupt signal (<tt>SIGINT</tt>) at
+certain times when it believes the engine may not be listening to user
+input (thinking or pondering). WinBoard currently does this only when
+the engine is running remotely using the -firstHost or -secondHost
+feature, not when it is running locally. You probably need to know
+only enough about this grungy feature to keep it from getting in your
+way.
+</p>
+
+<p>
+The <tt>SIGINT</tt>s are basically tailored to the needs of GNU Chess 4
+on systems where its input polling code is broken or disabled.
+Because they work in a rather peculiar way, it is recommended that you
+either ignore <tt>SIGINT</tt> by having your engine call
+<tt>signal(SIGINT, SIG_IGN)</tt>, or disable it with the "feature"
+command.</p>
+
+<p>
+Here are details for the curious. If xboard needs to send a command
+when it is the chess engine's move (such as before the "?" command),
+it sends a <tt>SIGINT</tt> first. If xboard needs to send commands when it is
+not the chess engine's move, but the chess engine may be pondering
+(thinking on its opponent's time) or analyzing (analysis or analyze
+file mode), xboard sends a <tt>SIGINT</tt> before the first such command only.
+Another <tt>SIGINT</tt> is not sent until another move is made, even if xboard
+issues more commands. This behavior is necessary for GNU Chess 4. The
+first <tt>SIGINT</tt> stops it from pondering until the next move, but on some
+systems, GNU Chess 4 will die if it receives a <tt>SIGINT</tt> when not
+actually thinking or pondering.
+</p>
+
+<p>
+There are two reasons why WinBoard does not send the Win32 equivalent
+of <tt>SIGINT</tt> (which is called <tt>CTRL_C_EVENT</tt>) to local
+engines. First, the Win32 GNU Chess 4 port does not need it. Second, I
+could not find a way to get it to work. Win32 seems to be designed
+under the assumption that only console applications, not windowed
+applications, would ever want to send a <tt>CTRL_C_EVENT</tt>.
+</p>
+
+<h2><a name="8">8. Commands from xboard to the engine</a></h2>
+
+<p>
+All commands from xboard to the engine end with a newline (\n), even
+where that is not explicitly stated. All your output to xboard must
+be in complete lines; any form of prompt or partial line will cause
+problems.
+</p>
+
+<p>
+At the beginning of each game, xboard sends an initialization string.
+This is currently "new\nrandom\n" unless the user changes it with the
+initString or secondInitString option.
+</p>
+
+<p>
+xboard normally reuses the same chess engine process for multiple
+games. At the end of a game, xboard will send the "force" command
+(see below) to make sure your engine stops thinking about the current
+position. It will later send the initString again to start a new
+game. If your engine can't play multiple games, you can disable reuse
+<font color=red>
+either with the "feature" command (beginning in protocol version
+2; see below) or
+</font>
+with xboard's -xreuse (or -xreuse2) command line
+option. xboard will then ask the process to quit after each game and
+start a new process for the next game.
+</p>
+
+<dl>
+<dt><strong>xboard</strong>
+<dd>This command will be sent once immediately after your engine
+process is started. You can use it to put your engine into "xboard
+mode" if that is needed. If your engine prints a prompt to ask for
+user input, you must turn off the prompt and output a newline when the
+"xboard" command comes in.
+<p>
+
+<dt><font color=red><strong>protover N</strong></font>
+<dd><font color=red>
+Beginning in protocol version 2 (in which N=2), this command will
+be sent immediately after the "xboard" command. If you receive some
+other command immediately after "xboard" (such as "new"), you can
+assume that protocol version 1 is in use. The "protover" command is
+the only new command that xboard always sends in version 2. All other
+new commands to the engine are sent only if the engine first enables
+them with the "feature" command. Protocol versions will always be
+simple integers so that they can easily be compared.
+
+<p>Your engine should reply to the protover command by sending the
+"feature" command (see below) with the list of non-default feature
+settings that you require, if any.
+
+<p>Your engine should never refuse to run due to receiving a higher
+protocol version number than it is expecting! New protocol versions
+will always be compatible with older ones by default; the larger
+version number is simply a hint that additional "feature" command
+options added in later protocol versions may be accepted.
+</font>
+<p>
+
+<dt><font color=red><strong>accepted</strong></font>
+<dt><font color=red><strong>rejected</strong></font>
+<dd><font color=red>
+These commands may be sent to your engine in reply to the "feature"
+command; see its documentation below.
+</font>
+<p>
+
+<dt><strong>new</strong>
+<dd>Reset the board to the standard chess starting position. Set
+White on move. Leave force mode and set the engine to play Black.
+Associate the engine's clock with Black and the opponent's clock with
+White. Reset clocks and time controls to the start of a new game.
+Stop clocks. Do not ponder on this move, even if pondering is on.
+Remove any search depth limit previously set by the sd command.
+<p>
+
+<dt><strong>variant VARNAME</strong>
+<dd>If the game is not standard chess, but a variant, this command is
+sent after "new" and before the first move or "edit" command. Currently
+defined variant names are:
+
+<table>
+<tr align="left"><th>wildcastle<td>Shuffle chess where king can castle from d file
+<tr align="left"><th>nocastle<td>Shuffle chess with no castling at all
+<tr align="left"><th>fischerandom<td>Fischer Random (not supported yet)
+<tr align="left"><th>bughouse<td>Bughouse, ICC/FICS rules
+<tr align="left"><th>crazyhouse<td>Crazyhouse, ICC/FICS rules
+<tr align="left"><th>losers<td>Win by losing all pieces or getting mated (ICC)
+<tr align="left"><th>suicide<td>Win by losing all pieces including king,
+or by having fewer pieces when one player has no legal moves (FICS)
+<tr align="left"><th><font color=red>giveaway</font>
+<td><font color=red>Win by losing all pieces including king,
+or by having no legal moves (ICC)</font>
+<tr align="left"><th>twokings<td>Weird ICC wild 9
+<tr align="left"><th>kriegspiel<td>Kriegspiel (engines not supported)
+<tr align="left"><th>atomic<td>Atomic
+<tr align="left"><th>3check<td>Win by giving check 3 times
+<tr align="left"><th>unknown<td>Unknown variant (not supported)
+</table>
+<p>
+
+<dt><strong>quit</strong>
+<dd>The chess engine should immediately exit. This command is used
+when xboard is itself exiting, and also between games if the -xreuse
+command line option is given (or -xreuse2 for the second engine).
+See also <a href="#7">Signals</a> above.
+<p>
+
+<dt><strong>random</strong>
+<dd>This command is specific to GNU Chess 4. You can either ignore it
+completely (that is, treat it as a no-op) or implement it as GNU Chess
+does. The command toggles "random" mode (that is, it sets random =
+!random). In random mode, the engine adds a small random value to its
+evaluation function to vary its play. The "new" command sets random
+mode off.
+<p>
+
+<dt><strong>force</strong>
+<dd>Set the engine to play neither color ("force mode"). Stop clocks.
+The engine should check that moves received in force mode are legal
+and made in the proper turn, but should not think, ponder, or make
+moves of its own.
+<p>
+
+<dt><strong>go</strong>
+<dd>Leave force mode and set the engine to play the color that is on
+move. Associate the engine's clock with the color that is on move,
+the opponent's clock with the color that is not on move. Start the engine's
+clock. Start thinking and eventually make a move.
+<p>
+
+<dt><font color=red><strong>playother</strong></font>
+<dd>
+<font color=red>
+(This command is new in protocol version 2. It is not
+sent unless you enable it with the feature command.)
+Leave force mode and set the engine to play the color that is <i>not</i> on
+move. Associate the opponent's clock with the color that is on move,
+the engine's clock with the color that is not on move. Start the opponent's
+clock. If pondering is enabled, the engine should begin pondering.
+If the engine later receives a move, it should start thinking and eventually
+reply.
+</font>
+<p>
+
+<dt><strong>white</strong>
+<dd>
+<font color=red>
+(This command is obsolete as of protocol version 2, but is still
+sent in some situations to accommodate older engines unless you disable it
+with the feature command.)
+</font>
+Set White on move. Set the engine to play Black. Stop clocks.
+<p>
+
+<dt><strong>black</strong>
+<dd>
+<font color=red>
+(This command is obsolete as of protocol version 2, but is still
+sent in some situations to accommodate older engines unless you disable it
+with the feature command.)
+</font>
+Set Black on move. Set the engine to play White. Stop clocks.
+<p>
+
+<dt><strong>level MPS BASE INC</strong>
+<dd>Set time controls. See the <a href="#11">Time Control</a> section below.
+<p>
+
+<dt><strong>st TIME</strong>
+<dd>Set time controls. See the <a href="#11">Time Control</a> section
+below. The commands "level" and "st" are not used together.
+<p>
+
+<dt><strong>sd DEPTH</strong>
+<dd>The engine should limit its thinking to DEPTH ply.
+<p>
+
+<dt><strong>time N</strong>
+<dd>Set a clock that always belongs to the engine. N is a number in
+ centiseconds (units of 1/100 second). Even if the engine changes to
+ playing the opposite color, this clock remains with the engine.
+<p>
+
+<dt><strong>otim N</strong>
+
+<dd>Set a clock that always belongs to the opponent. N is a number in
+centiseconds (units of 1/100 second). Even if the opponent changes to
+playing the opposite color, this clock remains with the opponent.
+<p>
+If needed for purposes of board display in force mode (where the
+engine is not participating in the game) the time clock should be
+associated with the last color that the engine was set to play, the
+otim clock with the opposite color.
+</p>
+
+<p>
+<font color=red>
+Beginning in protocol version 2, if you can't handle the time and
+otim commands, you can use the "feature" command to disable them; see
+below.
+</font>
+The following techniques from older protocol versions also
+work: You can ignore the time and otim commands (that is, treat them
+as no-ops), or send back "Error (unknown command): time" the first
+time you see "time".
+</p>
+
+<dt><strong>MOVE</strong>
+<dd>See below for the syntax of moves. If the move is illegal, print
+an error message; see the section "<a href="#9">Commands from the engine to
+xboard</a>". If the move is legal and in turn, make it. If not in force
+mode, stop the opponent's clock, start the engine's clock, start
+thinking, and eventually make a move.
+<p>
+When xboard sends your engine a move, it normally sends coordinate
+algebraic notation. Examples:
+<p>
+<table>
+<tr align="left"><td>Normal moves:<td>e2e4
+<tr align="left"><td>Pawn promotion:<td>e7e8q
+<tr align="left"><td>Castling:<td>e1g1, e1c1, e8g8, e8c8
+<tr align="left"><td>Bughouse/crazyhouse drop:<td>P@h3
+<tr align="left"><td>ICS Wild 0/1 castling:<td>d1f1, d1b1, d8f8, d8b8
+<tr align="left"><td>FischerRandom castling:<td>O-O, O-O-O (oh, not zero)
+</table>
+
+<p>
+<font color=red>
+Beginning in protocol version 2, you can use the feature command
+to select SAN (standard algebraic notation) instead; for example, e4,
+Nf3, exd5, Bxf7+, Qxf7#, e8=Q, O-O, or P@h3. Note that the last form,
+P@h3, is a extension to the PGN standard's definition of SAN, which does
+not support bughouse or crazyhouse.
+</font>
+</p>
+
+<p>
+xboard doesn't reliably detect illegal moves, because it does not keep
+track of castling unavailability due to king or rook moves, or en
+passant availability. If xboard sends an illegal move, send back an
+error message so that xboard can retract it and inform the user; see
+the section "<a href="#9">Commands from the engine to xboard</a>".
+</p>
+
+<dt><font color=red><strong>usermove MOVE</strong></font>
+<dd><font color=red>
+By default, moves are sent to the engine without a command name;
+the notation is just sent as a line by itself.
+Beginning in protocol version 2, you can use the feature command
+to cause the command name "usermove" to be sent before the move.
+Example: "usermove e2e4".
+</font>
+</p>
+
+<dt><strong>?</strong>
+<dd>Move now. If your engine is thinking, it should move immediately;
+ otherwise, the command should be ignored (treated as a no-op). It
+ is permissible for your engine to always ignore the ? command. The
+ only bad consequence is that xboard's Move Now menu command will do
+ nothing.
+<p>
+It is also permissible for your engine to move immediately if it gets
+any command while thinking, as long as it processes the command right
+after moving, but it's preferable if you don't do this. For example,
+xboard may send post, nopost, easy, hard, force, quit,
+<font color=red>
+or other commands
+</font>
+while the engine is on move.
+</p>
+
+<dt><font color=red><strong>ping N</strong></font>
+<dd>
+<font color=red>
+In this command, N is a decimal number. When you receive the command,
+reply by sending the string <strong>pong N</strong>, where N is the
+same number you received. Important: You must not reply to a "ping"
+command until you have finished executing all commands that you
+received before it. Pondering does not count; if you receive a ping
+while pondering, you should reply immediately and continue pondering.
+Because of the way xboard uses the ping command, if you implement the
+other commands in this protocol, you should never see a "ping" command
+when it is your move; however, if you do, you must not send the "pong"
+reply to xboard until after you send your move. For example, xboard
+may send "?" immediately followed by "ping". If you implement the "?"
+command, you will have moved by the time you see the subsequent ping
+command. Similarly, xboard may send a sequence like "force", "new",
+"ping". You must not send the pong response until after you have
+finished executing the "new" command and are ready for the new game to
+start.
+
+<p>
+The ping command is new in protocol version 2 and will not be sent
+unless you enable it with the "feature" command. Its purpose is to
+allow several race conditions that could occur in previous versions of
+the protocol to be fixed, so it is highly recommended that you
+implement it. It is especially important in simple engines that do
+not ponder and do not poll for input while thinking, but it is needed in all
+engines.
+</p>
+</font>
+
+<dt><strong>draw</strong>
+<dd>The engine's opponent offers the engine a draw. To accept the
+draw, send "offer draw". To decline, ignore the offer (that is, send
+nothing). If you're playing on ICS, it's possible for the draw offer
+to have been withdrawn by the time you accept it, so don't assume the
+game is over because you accept a draw offer. Continue playing until
+xboard tells you the game is over. See also "offer draw" below.
+<p>
+
+<dt><strong>result RESULT {COMMENT}</strong>
+<dd>After the end of each game, xboard will send you a result command.
+You can use this command to trigger learning. RESULT is either 1-0,
+0-1, 1/2-1/2, or *, indicating whether white won, black won, the game
+was a draw, or the game was unfinished. The COMMENT string is purely
+a human-readable comment; its content is unspecified and subject to
+change. In ICS mode, it is passed through from ICS uninterpreted.
+Example: <pre>result 1-0 {White mates}</pre>
+<p>
+Here are some notes on interpreting the "result" command. Some apply
+only to playing on ICS ("Zippy" mode).
+</p>
+
+<p>
+If you won but did not just play a mate, your opponent must have
+resigned or forfeited. If you lost but were not just mated, you
+probably forfeited on time, or perhaps the operator resigned manually.
+If there was a draw for some nonobvious reason, perhaps your opponent
+called your flag when he had insufficient mating material (or vice
+versa), or perhaps the operator agreed to a draw manually.
+</p>
+
+<p>
+You will get a result command even if you already know the game ended
+-- for example, after you just checkmated your opponent. In fact, if
+you send the "RESULT {COMMENT}" command (discussed below), you will
+simply get the same thing fed back to you with "result" tacked in
+front. You might not always get a "result *" command, however. In
+particular, you won't get one in local chess engine mode when the user
+stops playing by selecting Reset, Edit Game, Exit or the like.
+</p>
+
+<dt><font color=red><strong>setboard FEN</strong></font>
+<dd><font color=red>
+The setboard command is the new way to set up positions, beginning
+in protocol version 2. It is not used unless it has been selected
+with the feature command. Here FEN is a position in Forsythe-Edwards
+Notation, as defined in the PGN standard.
+
+<p><i>Illegal positions:</i> Note that either setboard or edit can
+be used to send an illegal position to the engine. The user can
+create any position with xboard's Edit Position command (even, say,
+an empty board, or a board with 64 white kings and no black ones).
+If your engine receives a position that it considers illegal,
+I suggest that you send the response "tellusererror Illegal position",
+and then respond to any attempted move with "Illegal move" until
+the next new, edit, or setboard command.</p>
+</font>
+<p>
+
+<dt><strong>edit</strong>
+<dd>
+<font color=red>
+The edit command is the old way to set up positions. For compatibility
+with old engines, it is still used by default, but new engines may prefer
+to use the feature command (see below) to cause xboard to use setboard instead.
+</font>
+The edit command puts the chess engine into a special mode, where
+it accepts the following subcommands:
+<table>
+<tr align="left"><th>c<td>change current piece color, initially white
+<tr align="left"><th>Pa4 (for example)<td>place pawn of current color on a4
+<tr align="left"><th>xa4 (for example)<td>empty the square a4 (not used by xboard)
+<tr align="left"><th>#<td>clear board
+<tr align="left"><th>.<td>leave edit mode
+</table>
+<font color=red>
+See the Idioms section below for additional subcommands used in
+ChessBase's implementation of the protocol.
+</font>
+
+<p>The edit command does not change the side to move. To set up a
+black-on-move position, xboard uses the following command sequence:
+</p>
+<pre>
+ new
+ force
+ a2a3
+ edit
+ &lt;edit commands&gt;
+ .
+</pre>
+
+<p>
+This sequence is used to avoid the "black" command, which is now
+considered obsolete and which many engines never did implement as
+specified in this document.
+</p>
+
+<p>
+After an edit command is complete, if a king and a rook are on their
+home squares, castling is assumed to be available to them. En passant
+capture is assumed to be illegal on the current move regardless of the
+positions of the pawns. The clock for the 50 move rule starts at
+zero, and for purposes of the draw by repetition rule, no prior
+positions are deemed to have occurred.
+</p>
+
+<dt><strong>hint</strong>
+<dd>If the user asks for a hint, xboard sends your engine the command
+"hint". Your engine should respond with "Hint: xxx", where xxx is a
+suggested move. If there is no move to suggest, you can ignore the
+hint command (that is, treat it as a no-op).
+<p>
+
+<dt><strong>bk</strong>
+<dd>If the user selects "Book" from the xboard menu, xboard will send
+your engine the command "bk". You can send any text you like as the
+response, as long as each line begins with a blank space or tab (\t)
+character, and you send an empty line at the end. The text pops up in
+a modal information dialog.
+<p>
+
+<dt><strong>undo</strong>
+<dd>If the user asks to back up one move, xboard will send you the
+"undo" command. xboard will not send this command without putting you
+in "force" mode first, so you don't have to worry about what should
+happen if the user asks to undo a move your engine made. (GNU Chess 4
+actually switches to playing the opposite color in this case.)
+<p>
+
+<dt><strong>remove</strong>
+<dd>If the user asks to retract a move, xboard will send you the
+"remove" command. It sends this command only when the user is on
+move. Your engine should undo the last two moves (one for each
+player) and continue playing the same color.
+<p>
+
+<dt><strong>hard</strong>
+<dd>Turn on pondering (thinking on the opponent's time, also known as
+"permanent brain"). xboard will not make any assumption about what
+your default is for pondering or whether "new" affects this setting.
+<p>
+
+<dt><strong>easy</strong>
+<dd>Turn off pondering.
+<p>
+
+<dt><strong>post</strong>
+<dd>Turn on thinking/pondering output.
+See <a href="#10">Thinking Output</a> section.
+<p>
+
+<dt><strong>nopost</strong>
+<dd>Turn off thinking/pondering output.
+<p>
+
+<dt><strong>analyze</strong>
+<dd>Enter analyze mode. See <a href="#12">Analyze Mode</a> section.
+<p>
+
+<dt><strong>name X</strong> <dd>This command informs the engine of its
+opponent's name. When the engine is playing on a chess server, xboard
+obtains the opponent's name from the server.
+<font color=red>
+When the engine is
+playing locally against a human user, xboard obtains the user's login
+name from the local operating system. When the engine is playing
+locally against another engine, xboard uses either the other engine's
+filename or the name that the other engine supplied in the myname
+option to the feature command. By default, xboard uses the name
+command only when the engine is playing on a chess server. Beginning
+in protocol version 2, you can change this with the name option to the
+feature command; see below.
+</font>
+<p>
+
+<dt><strong>rating</strong>
+<dd>In ICS mode, xboard obtains the ICS opponent's rating from the
+"Creating:" message that appears before each game. (This message may
+not appear on servers using outdated versions of the FICS code.) In
+Zippy mode, it sends these ratings on to the chess engine using the
+"rating" command. The chess engine's own rating comes first, and if
+either opponent is not rated, his rating is given as 0.
+<font color=red>
+In the future this command may also be used in other modes, if ratings
+are known.
+</font>
+Example: <pre>rating 2600 1500</pre>
+<p>
+
+<dt><font color=red><strong>ics HOSTNAME</strong></font>
+<dd><font color=red>
+If HOSTNAME is "-", the engine is playing against a local
+opponent; otherwise, the engine is playing on an Internet Chess Server
+(ICS) with the given hostname. This command is new in protocol
+version 2 and is not sent unless the engine has enabled it with
+the "feature" command. Example: "ics freechess.org"
+</font>
+<p>
+
+<dt><strong>computer</strong>
+<dd>The opponent is also a computer chess engine. Some engines alter
+their playing style when they receive this command.
+<p>
+
+<dt><font color=red><strong>pause</strong></font>
+<dt><font color=red><strong>resume</strong></font>
+<dd><font color=red>(These commands are new in protocol
+version 2 and will not be sent unless feature pause=1 is set. At
+this writing, xboard actually does not use the commands at all, but it
+or other interfaces may use them in the future.)
+The "pause" command puts the engine into a special state where it
+does not think, ponder, or otherwise consume significant CPU time.
+The current thinking or pondering (if any) is suspended and both
+player's clocks are stopped. The only command that the interface may
+send to the engine while it is in the paused state is "resume". The
+paused thinking or pondering (if any) resumes from exactly where it
+left off, and the clock of the player on move resumes running from
+where it stopped.
+</font>
+</dl>
+
+<h3>Bughouse commands:</h3>
+
+<p>
+xboard now supports bughouse engines when in Zippy mode. See
+<a href="http://www.tim-mann.org/xboard/zippy.README"
+>zippy.README</a> for information on Zippy mode and how to turn on the
+bughouse support. The bughouse move format is given above. xboard
+sends the following additional commands to the engine when in bughouse
+mode.
+Commands to inform your engine of the partner's game state may
+be added in the future.
+</p>
+
+<dl>
+<dt><strong>partner &lt;player&gt;</strong>
+<dd>&lt;player&gt; is now your partner for future games. Example: <pre>partner mann</pre>
+<p>
+
+<dt><strong>partner</strong>
+<dd>Meaning: You no longer have a partner.
+<p>
+
+<dt><strong>ptell &lt;text&gt;</strong>
+<dd>Your partner told you &lt;text&gt;, either with a ptell or an ordinary tell.
+<p>
+
+<dt><strong>holding [&lt;white&gt;] [&lt;black&gt;]</strong>
+<dd>White currently holds &lt;white&gt;; black currently holds &lt;black&gt;.
+ Example: <pre>holding [PPPRQ] []</pre>
+
+<dt><strong>holding [&lt;white&gt;] [&lt;black&gt;] &lt;color&gt;&lt;piece&gt;</strong>
+<dd>White currently holds &lt;white&gt;; black currently holds &lt;black&gt;, after
+ &lt;color&gt; acquired &lt;piece&gt;. Example: <pre>holding [PPPRQ] [R] BR</pre>
+</dl>
+
+<h2><a name="9">9. Commands from the engine to xboard</a></h2>
+
+<p>
+<font color=red>
+In general, an engine should not send any output to xboard that is not
+described in this document. As the protocol is extended, newer
+versions of xboard may recognize additional strings as commands that
+were previously not assigned a meaning.
+</font>
+</p>
+
+<dl>
+<dt><font color=red>
+<strong>feature FEATURE1=VALUE1 FEATURE2=VALUE2 ...</strong>
+</font>
+
+<dd><font color=red>
+Beginning with version 2, the protocol includes the "feature"
+command, which lets your engine control certain optional protocol
+features. Feature settings are written as FEATURE=VALUE, where
+FEATURE is a name from the list below and VALUE is the value to be
+assigned. Features can take string, integer, or boolean values; the
+type of value is listed for each feature. String values are written
+in double quotes (for example, <tt>feature myname="Miracle Chess
+0.9"</tt>), integers are written in decimal, and boolean values are
+written as 0 for false, 1 for true. Any number of features can be set
+in one feature command, or multiple feature commands can be given.
+
+<p>
+Your engine should send one or more feature commands immediately after
+receiving the "protover" command, since xboard needs to know the
+values of some features before sending further commands to the engine.
+Because engines that predate protocol version 2 do not send "feature",
+xboard uses a timeout mechanism: when it first starts your engine, it
+sends "xboard" and "protover N", then listens for feature commands for
+two seconds before sending any other commands. To end this timeout
+and avoid the wait, set the feature "done=1" at the end of your last
+feature command. To increase the timeout, if needed, set the feature
+"done=0" before your first feature command and "done=1" at the end.
+If needed, it is okay for your engine to set done=0 soon as it starts,
+even before it receives the xboard and protover commands. This can be
+useful if your engine takes a long time to initialize itself. It
+should be harmless even if you are talking to a (version 1) user
+interface that does not understand the "feature" command, since such
+interfaces generally ignore commands from the engine that they do not
+understand.
+</p>
+
+<p>
+The feature command is designed to let the protocol change without
+breaking engines that were written for older protocol versions. When
+a new feature is added to the protocol, its default value is always
+chosen to be compatible with older versions of the protocol that did
+not have the feature. Any feature that your engine does not set in a
+"feature" command retains its default value, so as the protocol
+changes, you do not have to change your engine to keep up with it
+unless you want to take advantage of a new feature. Because some
+features are improvements to the protocol, while others are meant to
+cater to engines that do not implement all the protocol features, the
+recommended setting for a feature is not always the same as the
+default setting. The listing below gives both default and recommended
+settings for most features.
+</p>
+
+<p>
+You may want to code your engine so as to be able to work with
+multiple versions of the engine protocol. Protocol version 1 does not
+send the protover command and does not implement the feature command;
+if you send a feature command in protocol version 1, it will have no
+effect and there will be no response. In protocol version 2 or later,
+each feature F that you set generates the response "accepted F" if the
+feature is implemented, or "rejected F" if it is not. Thus an engine
+author can request any feature without having to keep track of which
+protocol version it was introduced in; you need only check whether the
+feature is accepted or rejected. This mechanism also makes it
+possible for a user interface author to implement a subset of a
+protocol version by rejecting some features that are defined in that
+version; however, you should realize that engine authors are likely to
+code for xboard and may not be prepared to have a feature that they
+depend on be rejected.
+</p>
+
+<p>
+Here are the features that are currently defined.
+</p>
+</font>
+
+<dl>
+<dt><font color=red>
+<strong>ping</strong> (boolean, default 0, recommended 1)
+</font>
+<dd><font color=red>
+If ping=1, xboard may use the protocol's new "ping" command;
+if ping=0, xboard will not use the command.
+</font>
+
+<dt><font color=red>
+<strong>setboard</strong> (boolean, default 0, recommended 1)
+</font>
+<dd><font color=red>
+If setboard=1, xboard will use the protocol's new "setboard" command
+to set up positions; if setboard=0, it will use the older "edit" command.
+</font>
+
+<dt><font color=red>
+<strong>playother</strong> (boolean, default 0, recommended 1)
+</font>
+<dd><font color=red>
+If playother=1, xboard will use the protocol's new "playother" command
+when appropriate; if playother=0, it will not use the command.
+</font>
+
+<dt><font color=red>
+<strong>san</strong> (boolean, default 0)
+</font>
+<dd><font color=red>
+If san=1, xboard will send moves to the engine in standard algebraic
+notation (SAN); for example, Nf3. If san=0, xboard will send moves in
+coordinate notation; for example, g1f3. See MOVE in
+<a href="#8">section 8</a> above for more details of both kinds of notation.
+</font>
+
+<dt><font color=red>
+<strong>usermove</strong> (boolean, default 0)
+</font>
+<dd><font color=red>
+If usermove=1, xboard will send moves to the engine with the
+command "usermove MOVE"; if usermove=0, xboard will send just the move,
+with no command name.
+</font>
+
+<dt><font color=red>
+<strong>time</strong> (boolean, default 1, recommended 1)
+</font>
+<dd><font color=red>
+If time=1, xboard will send the "time" and "otim" commands to
+update the engine's clocks; if time=0, it will not.
+</font>
+
+<dt><font color=red>
+<strong>draw</strong> (boolean, default 1, recommended 1)
+</font>
+<dd><font color=red>
+If draw=1, xboard will send the "draw" command if the engine's opponent
+offers a draw; if draw=0, xboard will not inform the engine about
+draw offers. Note that if draw=1, you may receive a draw offer while you
+are on move; if this will cause you to move immediately, you should set
+draw=0.
+</font>
+
+<dt><font color=red>
+<strong>sigint</strong> (boolean, default 1)
+</font>
+<dd><font color=red>
+If sigint=1, xboard may send SIGINT (the interrupt signal) to
+the engine as <a href="#7">section 7</a> above; if sigint=0, it will
+not.
+</font>
+
+<dt><font color=red>
+<strong>sigterm</strong> (boolean, default 1)
+</font>
+<dd><font color=red>
+If sigterm=1, xboard may send SIGTERM (the termination signal) to
+the engine as <a href="#7">section 7</a> above; if sigterm=0, it will
+not.
+</font>
+
+<dt><font color=red>
+<strong>reuse</strong> (boolean, default 1, recommended 1)
+</font>
+<dd><font color=red>
+If reuse=1, xboard may reuse your engine for multiple games. If
+reuse=0 (or if the user has set the -xreuse option on xboard's command
+line), xboard will kill the engine process after every game and start
+a fresh process for the next game.
+</font>
+
+<dt><font color=red>
+<strong>analyze</strong> (boolean, default 1, recommended 1)
+</font>
+<dd><font color=red>
+If analyze=0, xboard will not try to use the "analyze" command; it
+will pop up an error message if the user asks for analysis mode. If
+analyze=1, xboard will try to use the command if the user asks for
+analysis mode.
+</font>
+
+<dt><font color=red>
+<strong>myname</strong> (string, default determined from engine filename)
+</font>
+<dd><font color=red>
+This feature lets you set the name that xboard will use for your
+engine in window banners, in the PGN tags of saved game files, and when
+sending the "name" command to another engine.
+</font>
+
+<dt><font color=red>
+<strong>variants</strong> (string, see text below)
+</font>
+<dd><font color=red>
+This feature indicates which chess variants your engine accepts.
+It should be a comma-separated list of variant names. See the table
+under the "variant" command in <a href="#8">section 8</a> above. If
+you do not set this feature, xboard will assume by default that your
+engine supports all variants. (However, the -zippyVariants
+command-line option still limits which variants will be accepted in
+Zippy mode.) It is recommended that you set this feature to the
+correct value for your engine (just "normal" in most cases) rather
+than leaving the default in place, so that the user will get an
+appropriate error message if he tries to play a variant that your
+engine does not support.
+</font>
+
+<dt><font color=red>
+<strong>colors</strong> (boolean, default 1, recommended 0)
+</font>
+<dd><font color=red>
+If colors=1, xboard uses the obsolete "white" and "black"
+commands in a stylized way that works with most older chess engines
+that require the commands. See the "<a href="#13">Idioms</a>" section
+below for details. If colors=0, xboard does not use the "white" and
+"black" commands at all.
+</font>
+
+<dt><font color=red>
+<strong>ics</strong> (boolean, default 0)
+</font>
+<dd><font color=red>
+If ics=1, xboard will use the protocol's new "ics" command
+to inform the engine of whether or not it is playing on a chess server;
+if ics=0, it will not.
+</font>
+
+<dt><font color=red>
+<strong>name</strong> (boolean, see text below)
+</font>
+<dd><font color=red>
+If name=1, xboard will use the protocol's "name" command
+to inform the engine of the opponent's name; if name=0, it will not.
+By default, name=1 if the engine is playing on a chess server; name=0 if not.
+</font>
+
+<dt><font color=red>
+<strong>pause</strong> (boolean, default 0)
+</font>
+<dd><font color=red>
+If pause=1, xboard may use the protocol's new "pause" command;
+if pause=0, xboard assumes that the engine does not support this command.
+</font>
+
+<dt><font color=red>
+<strong>done</strong> (integer, no default)
+</font>
+<dd><font color=red>
+If you set done=1 during the initial two-second timeout after
+xboard sends you the "xboard" command, the
+timeout will end and xboard will not look for any more feature
+commands before starting normal operation.
+If you set done=0, the initial timeout is increased to one hour;
+in this case, you must set done=1 before xboard will enter normal operation.
+</font>
+</dl>
+<p>
+
+<dt><strong>Illegal move: MOVE</strong>
+<dt><strong>Illegal move (REASON): MOVE</strong>
+<dd>If your engine receives a MOVE command that is recognizably a move
+but is not legal in the current position, your engine must print an
+error message in one of the above formats so that xboard can pass the
+error on to the user and retract the move. The (REASON) is entirely
+optional. Examples:
+
+<pre>
+ Illegal move: e2e4
+ Illegal move (in check): Nf3
+ Illegal move (moving into check): e1g1
+</pre>
+<p>
+Generally, xboard will never send an ambiguous move, so it does not
+matter whether you respond to such a move with an Illegal move message
+or an Error message.
+</p>
+
+<dt><strong>Error (ERRORTYPE): COMMAND</strong>
+<dd>If your engine receives a command it does not understand or does
+not implement, it should print an error message in the above format so
+that xboard can parse it. Examples:
+<pre>
+ Error (ambiguous move): Nf3
+ Error (unknown command): analyze
+ Error (command not legal now): undo
+ Error (too many parameters): level 1 2 3 4 5 6 7
+</pre>
+
+<dt><strong>move MOVE</strong>
+<dd>Your engine is making the move MOVE. Do not echo moves from
+xboard with this command; send only new moves made by the engine.
+
+<font color=red>
+<p>For the actual move text from your chess engine (in place of MOVE
+above), your move should be either
+<ul>
+<li>in coordinate notation (e.g.,
+e2e4, e7e8q) with castling indicated by the King's two-square move (e.g.,
+e1g1), or
+<li>in Standard Algebraic Notation (SAN) as defined in the
+Portable Game Notation standard (e.g, e4, Nf3, O-O, cxb5, Nxe4, e8=Q),
+with the extension piece@square (e.g., P@f7) to handle piece placement
+in bughouse and crazyhouse.
+</ul>
+xboard itself also accepts some variants of SAN, but for compatibility
+with non-xboard interfaces, it is best not to rely on this behavior.
+</p>
+
+<p>Warning: Even though all versions of this protocol specification
+have indicated that xboard accepts SAN moves, some non-xboard
+interfaces are known to accept only coordinate notation. See the
+Idioms section for more information on the known limitations of some
+non-xboard interfaces. It should be safe to send SAN moves if you
+receive a "protover 2" (or later) command from the interface, but
+otherwise it is best to stick to coordinate notation for maximum
+compatibility. An even more conservative approach would be for your
+engine to send SAN to the interface only if you have set feature san=1
+(which causes the interface to send SAN to you) and have received
+"accepted san" in reply.
+</p>
+</font>
+
+<dt><strong>RESULT {COMMENT}</strong> <dd>When your engine detects
+that the game has ended by rule, your engine must output a line of the
+form "RESULT {comment}" (without the quotes), where RESULT is a PGN
+result code (1-0, 0-1, or 1/2-1/2), and comment is the reason. Here
+"by rule" means that the game is definitely over because of what
+happened on the board. In normal chess, this includes checkmate,
+stalemate, triple repetition, the 50 move rule, or insufficient
+material; it does not include loss on time or the like.
+Examples:
+<pre>
+ 0-1 {Black mates}
+ 1-0 {White mates}
+ 1/2-1/2 {Draw by repetition}
+ 1/2-1/2 {Stalemate}
+</pre>
+
+<p>
+xboard relays the result to the user, the ICS, the other engine in Two
+Machines mode, and the PGN save file as required.
+</p>
+
+<dt><strong>resign</strong>
+<dd>If your engine wants to resign, it can send the command "resign".
+Alternatively, it can use the "RESULT {comment}" command if the string
+"resign" is included in the comment; for example "0-1 {White
+resigns}". xboard relays the resignation to the user, the ICS, the
+other engine in Two Machines mode, and the PGN save file as required.
+<p>
+
+<dt><strong>offer draw</strong>
+<dd>If your engine wants to offer a draw by agreement (as opposed to
+claiming a draw by rule), it can send the command "offer draw".
+xboard relays the offer to the user, the ICS, the other engine in Two
+Machines mode, and the PGN save file as required. In Machine White,
+Machine Black, or Two Machines mode, the offer is considered valid
+until your engine has made two more moves.
+<p>
+
+<dt><font color=red><strong>tellopponent MESSAGE</strong></font>
+<dd><font color=red>
+This command lets the engine give a message to its opponent,
+independent of whether the opponent is a user on the local machine or
+a remote ICS user (Zippy mode). MESSAGE consists of any characters,
+including whitespace, to the end of the line. When the engine is
+playing against a user on the local machine, xboard pops up an
+information dialog containing the message. When the engine is playing
+against an opponent on the ICS (Zippy mode), xboard sends "say
+MESSAGE\n" to the ICS.
+<p>
+
+<dt><strong>tellothers MESSAGE</strong>
+<dd>This command lets the engine give a message to people watching the
+game other than the engine's opponent. MESSAGE consists of any
+characters, including whitespace, to the end of the line. When the
+engine is playing against a user on the local machine, this command
+does nothing. When the engine is playing against an opponent on the
+ICS (Zippy mode), xboard sends "whisper MESSAGE\n" to the ICS.
+<p>
+
+<dt><strong>tellall MESSAGE</strong>
+<dd>This command lets the engine give a message to its opponent and
+other people watching the game,
+independent of whether the opponent is a user on the local machine or
+a remote ICS user (Zippy mode). MESSAGE consists of any characters,
+including whitespace, to the end of the line. When the engine is
+playing against a user on the local machine, xboard pops up an
+information dialog containing the message. When the engine is playing
+against an opponent on the ICS (Zippy mode), xboard sends "kibitz
+MESSAGE\n" to the ICS.
+</font>
+<p>
+
+<dt><strong>telluser MESSAGE</strong>
+<dd>xboard pops up an information dialog containing the message.
+MESSAGE consists of any characters, including whitespace, to the end
+of the line.
+<p>
+
+<dt><strong>tellusererror MESSAGE</strong>
+<dd>xboard pops up an error dialog containing the message.
+MESSAGE consists of any characters, including whitespace, to the end
+of the line.
+<p>
+
+<dt><strong>askuser REPTAG MESSAGE</strong>
+<dd>Here REPTAG is a string containing no whitespace, and MESSAGE
+consists of any characters, including whitespace, to the end of the
+line. xboard pops up a question dialog that says MESSAGE and
+has a typein box. If the user types in "bar", xboard sends "REPTAG
+bar" to the engine. The user can cancel the dialog and send nothing.
+<p>
+
+<dt><strong>tellics MESSAGE</strong>
+<dd>In Zippy mode, xboard sends "MESSAGE\n" to ICS. MESSAGE consists
+of any characters, including whitespace, to the end of the line.
+<p>
+
+<dt><font color=red><strong>tellicsnoalias MESSAGE</strong></font>
+<dd><font color=red>
+In Zippy mode, xboard sends "xMESSAGE\n" to ICS, where "x" is a
+character that prevents the ICS from expanding command aliases, if
+xboard knows of such a character. (On chessclub.com and chess.net,
+"/" is used; on freechess.org, "$" is used.) MESSAGE consists of any
+characters, including whitespace, to the end of the line.
+</font>
+</dl>
+<p>
+
+<h2><a name="10">10. Thinking Output</a></h2>
+
+<p>
+If the user asks your engine to "show thinking", xboard sends your
+engine the "post" command. It sends "nopost" to turn thinking off.
+In post mode, your engine sends output lines to show the progress of
+its thinking. The engine can send as many or few of these lines as it
+wants to, whenever it wants to. Typically they would be sent when the
+PV (principal variation) changes or the depth changes. The thinking
+output should be in the following format:
+</p>
+
+<pre>ply score time nodes pv</pre>
+
+Where:
+<table>
+<tr align="left"><th>ply<td>Integer giving current search depth.
+<tr align="left"><th>score<td>Integer giving current evaluation in centipawns.
+<tr align="left"><th>time<td>Current search time in centiseconds (ex:
+1028 = 10.28 seconds).
+
+<tr align="left"><th>nodes<td>Nodes searched.
+<tr align="left"><th>pv<td>Freeform text giving current "best" line.
+You can continue the pv onto another line if you start each
+continuation line with at least four space characters.
+</table>
+
+<p>
+Example:
+</p>
+
+<pre> 9 156 1084 48000 Nf3 Nc6 Nc3 Nf6</pre>
+
+<p>
+Meaning:
+</p>
+
+9 ply, score=1.56, time = 10.84 seconds, nodes=48000,
+PV = "Nf3 Nc6 Nc3 Nf6"
+
+<p>
+Longer example from actual Crafty output:
+</p>
+<pre>
+ 4 109 14 1435 1. e4 d5 2. Qf3 dxe4 3. Qxe4 Nc6
+ 4 116 23 2252 1. Nf3 Nc6 2. e4 e6
+ 4 116 27 2589 1. Nf3 Nc6 2. e4 e6
+ 5 141 44 4539 1. Nf3 Nc6 2. O-O e5 3. e4
+ 5 141 54 5568 1. Nf3 Nc6 2. O-O e5 3. e4
+</pre>
+
+<p>
+You can use the PV to show other things; for instance, while in book,
+Crafty shows the observed frequency of different reply moves in its
+book. In situations like this where your engine is not really
+searching, start the PV with a '(' character:
+</p>
+
+<pre>
+ 0 0 0 0 (e4 64%, d4 24%)
+</pre>
+
+<p>
+GNU Chess output is very slightly different. The ply number is
+followed by an extra nonblank character, and the time is in seconds,
+not hundredths of seconds. For compatibility, xboard accepts the
+extra character and takes it as a flag indicating the different time
+units. Example:
+</p>
+
+<pre>
+ 2. 14 0 38 d1d2 e8e7
+ 3+ 78 0 65 d1d2 e8e7 d2d3
+ 3& 14 0 89 d1d2 e8e7 d2d3
+ 3& 76 0 191 d1e2 e8e7 e2e3
+ 3. 76 0 215 d1e2 e8e7 e2e3
+ 4& 15 0 366 d1e2 e8e7 e2e3 e7e6
+ 4. 15 0 515 d1e2 e8e7 e2e3 e7e6
+ 5+ 74 0 702 d1e2 f7f5 e2e3 e8e7 e3f4
+ 5& 71 0 1085 d1e2 e8e7 e2e3 e7e6 e3f4
+ 5. 71 0 1669 d1e2 e8e7 e2e3 e7e6 e3f4
+ 6& 48 0 3035 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4
+ 6. 48 0 3720 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4
+ 7& 48 0 6381 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4
+ 7. 48 0 10056 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4
+ 8& 66 1 20536 d1e2 e8e7 e2e3 e7e6 e3d4 g7g5 a2a4 f7f5
+ 8. 66 1 24387 d1e2 e8e7 e2e3 e7e6 e3d4 g7g5 a2a4 f7f5
+ 9& 62 2 38886 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 a2a4 h5h4
+ d4e4
+ 9. 62 4 72578 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 a2a4 h5h4
+ d4e4
+10& 34 7 135944 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 c2c4 h5h4
+ d4e4 f7f5 e4f4
+10. 34 9 173474 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 c2c4 h5h4
+ d4e4 f7f5 e4f4
+</pre>
+
+<p>If your engine is pondering (thinking on its opponent's time) in post
+mode, it can show its thinking then too. In this case your engine may
+omit the hint move (the move it is assuming its opponent will make)
+from the thinking lines <em>if and only if</em> it sends xboard the move in
+the usual "Hint: xxx" format before sending the first line.
+</p>
+
+<h2><a name="11">11. Time control</a></h2>
+
+<p>
+xboard supports three styles of time control: conventional chess clocks,
+the ICS-style incremental clock, and an exact number of seconds per move.
+</p>
+
+<p>In conventional clock mode, every time control period is the same.
+That is, if the time control is 40 moves in 5 minutes, then after each
+side has made 40 moves, they each get an additional 5 minutes, and so
+on, ad infinitum. At some future time it would be nice to support a
+series of distinct time controls. This is very low on my personal
+priority list, but code donations to the xboard project are accepted,
+so feel free to take a swing at it. I suggest you talk to me first,
+though.
+</p>
+
+<p>
+The command to set a conventional time control looks like this:
+</p>
+
+<pre>
+ level 40 5 0
+ level 40 0:30 0
+</pre>
+
+<p>
+The 40 means that there are 40 moves per time control. The 5 means
+there are 5 minutes in the control. In the second example, the 0:30
+means there are 30 seconds. The final 0 means that we are in
+conventional clock mode.
+</p>
+
+<p>
+The command to set an incremental time control looks like this:
+</p>
+
+<pre>
+ level 0 2 12
+</pre>
+
+<p>
+Here the 0 means "play the whole game in this time control period",
+the 2 means "base=2 minutes", and the 12 means "inc=12 seconds". As
+in conventional clock mode, the second argument to level can be in
+minutes and seconds.
+</p>
+
+<p>
+At the start of the game, each player's clock is set to base minutes.
+Immediately after a player makes a move, inc seconds are added to his
+clock. A player's clock counts down while it is his turn. Your flag
+can be called whenever your clock is zero or negative. (Your clock
+can go negative and then become positive again because of the
+increment.)
+</p>
+
+<p>
+A special rule on some ICS implementations: if you ask for a game with
+base=0, the clocks really start at 10 seconds instead of 0. xboard
+itself does not know about this rule, so it passes the 0 on to the
+engine instead of changing it to 0:10.
+</p>
+
+<p>
+ICS also has time odds games. With time odds, each player has his own
+(base, inc) pair, but otherwise things work the same as in normal
+games. The Zippy xboard accepts time odds games but ignores the fact
+that the opponent's parameters are different; this is perhaps not
+quite the right thing to do, but gnuchess doesn't understand time
+odds. Time odds games are always unrated.
+</p>
+
+<p>
+The command to set an exact number of seconds per move looks like this:
+</p>
+
+<pre>
+ st 30
+</pre>
+
+<p>
+This means that each move must be made in at most 30 seconds. Time not used
+on one move does not accumulate for use on later moves.
+</p>
+
+<h2><a name="12">12. Analyze Mode</a></h2>
+
+<p>xboard supports analyzing fresh games, edited positions, and games
+from files. However, all of these look the same from the chess
+engine's perspective. Basically, the engine just has to respond to the
+"analyze" command.
+<font color=red>
+Beginning in protocol version 2,
+if your engine does not support analyze mode, it should use
+the feature command to set analyze=0.
+</font>
+The older method of
+printing the error message "Error (unknown command): analyze" in
+response to the "analyze" command will also work, however.
+</p>
+
+<p>
+To enter analyze mode, xboard sends the command sequence "post", "analyze".
+Analyze mode in your engine should be
+similar to force mode, except that your engine thinks about what move
+it would make next if it were on move. Your engine should accept the
+following commands while in analyze mode:
+</p>
+
+<ul>
+<li>Any legal move, as in force mode
+<li><strong>undo</strong>&nbsp;&nbsp; Back up one move and analyze previous position.
+<li><strong>new</strong>&nbsp;&nbsp; Reset position to start of game but stay in analyze mode.
+<li><font color=red><strong>setboard</strong> if you have set feature setboard=1; otherwise <strong>edit</strong>. Exiting edit mode returns to analyze mode.
+</font>
+<li><strong>exit</strong>&nbsp;&nbsp; Leave analyze mode.
+<li><strong>.</strong>&nbsp;&nbsp; Send a search status update (optional); see below.
+<li><font color=red>
+<strong>bk</strong>&nbsp;&nbsp; Show book moves from this position,
+if any; see above.</font>
+<li><font color=red>
+<strong>hint</strong>&nbsp;&nbsp; Show the predicted move from this
+position, if any; see above.</font>
+</ul>
+
+<p>
+If the user selects "Periodic Updates", xboard will send the string
+".\n" to the chess engine periodically during analyze mode, unless the
+last PV received began with a '(' character.
+</p>
+
+<p>
+The chess engine should respond to ".\n" with a line like this:
+</p>
+
+<pre>
+stat01: time nodes ply mvleft mvtot <font color=red>mvname</font>
+</pre>
+
+Where:
+<table>
+<tr align="left"><th>time<td>Elapsed search time in centiseconds (ie: 567 = 5.67 seconds).
+<tr align="left"><th>nodes<td>Nodes searched so far.
+<tr align="left"><th>ply<td>Search depth so far.
+<tr align="left"><th>mvleft<td>Number of moves left to consider at this depth.
+<tr align="left"><th>mvtot<td>Total number of moves to consider.
+<tr align="left"><th><font color=red>mvname</font><td><font color=red>
+Move currently being considered (SAN or coordinate notation). Optional;
+added in protocol version 2.</font>
+</table>
+
+<p>
+Examples:
+</p>
+<pre>
+ stat01: 1234 30000 7 5 30
+ stat01: 1234 30000 7 5 30 Nf3
+</pre>
+
+<p>
+Meaning:
+</p>
+
+<p>After 12.34 seconds, I've searched 7 ply/30000 nodes, there are a
+ total of 30 legal moves, and I have 5 more moves to search
+ before going to depth 8. In the second example, of the 30 legal
+ moves, the one I am currently searching is Nf3.</p>
+
+<p>
+Implementation of the "." command is optional. If the engine does not
+respond to the "." command with a "stat01..." line, xboard will stop
+sending "." commands. If the engine does not implement this command,
+the analysis window will use a shortened format to display the engine
+info.
+</p>
+
+<p>
+To give the user some extra information, the chess engine can output
+the strings "++\n" and "--\n", to indicate that the current search is
+failing high or low, respectively. You don't have to send anything
+else to say "Okay, I'm not failing high/low anymore." xboard will
+figure this out itself.
+</p>
+
+<h2><a name="13">13. Idioms and backward compatibility features</a></h2>
+
+<p>
+Some engines have variant interpretations of the force/go/white/black,
+time/otim, and hard/easy command sets.
+In order to accommodate these older engines, xboard uses these commands
+only according to the stylized patterns ("idioms") given in this section.
+The obsolete white and black commands
+have historically been particularly troublesome, and it is recommended
+that new engines set the feature colors=0 and/or ignore the commands.
+</p>
+
+<dl>
+
+<dt><strong>time N</strong>
+<dt><strong>otim N</strong>
+<dt><strong>MOVE</strong>
+<dd>Sent when the opponent makes a move and the engine is already
+playing the opposite color.
+<p>
+
+<dt><strong>white</strong>
+<dt><strong>go</strong>
+<dd>Sent when the engine is in force mode or playing Black but should
+switch to playing White. This sequence is sent only when White is
+already on move.
+<font color=red>
+If you set the feature colors=0, "white" is not sent.
+</font>
+<p>
+
+<dt><strong>black</strong>
+<dt><strong>go</strong>
+<dd>Sent when the engine is in force mode or playing White but should
+switch to playing Black. This sequence is sent only when Black is
+already on move.
+<font color=red>
+If you set the feature colors=0, "black" is not sent.
+</font>
+<p>
+
+<dt><strong>white</strong>
+<dt><strong>time N</strong>
+<dt><strong>otim N</strong>
+<dt><strong>black</strong>
+<dt><strong>go</strong>
+<dd>Sent when Black is on move, the engine is in force mode or playing
+White, and the engine's clock needs to be updated before it starts
+playing.
+The initial "white" is a kludge to accommodate GNU Chess
+4's variant interpretation of these commands.
+<font color=red>
+If you set the feature colors=0, "white" and "black" are not sent.
+</font>
+<p>
+
+<dt><strong>black</strong>
+<dt><strong>time N</strong>
+<dt><strong>otim N</strong>
+<dt><strong>white</strong>
+<dt><strong>go</strong>
+<dd>Sent when White is on move, the engine is in force mode or playing
+Black, and the engine's clock needs to be updated before it starts
+playing. See previous idiom.
+The initial "black" is a kludge to accommodate GNU Chess
+4's variant interpretation of these commands.
+<font color=red>
+If you set the feature colors=0, "black" and "white" are not sent.
+</font>
+<p>
+
+<dt><strong>hard</strong>
+<dt><strong>easy</strong>
+<dd>Sent in sequence to turn off pondering if xboard is not sure
+whether it is on. When xboard is sure, it will send "hard" or "easy"
+alone. xboard does this because "easy" is a toggle in GNU Chess 4 but
+"hard" is an absolute on.
+
+</dl>
+
+<p>
+To support older engines, certain additional commands from the engine
+to xboard are also recognized. (These are commands by themselves, not
+values to be placed in the comment field of the PGN result code.)
+These forms are not recommended for new engines; use the PGN result
+code commands or the resign command instead.
+</p>
+
+<table>
+<tr align="left"><th>Command <th>Interpreted as
+<tr align="left"><td>White resigns <td>0-1 {White resigns}
+<tr align="left"><td>Black resigns <td>1-0 {Black resigns}
+<tr align="left"><td>White <td>1-0 {White mates}
+<tr align="left"><td>Black <td>0-1 {Black mates}
+<tr align="left"><td>Draw <td>1/2-1/2 {Draw}
+<tr align="left"><td>computer mates <td>1-0 {White mates} or 0-1 {Black mates}
+<tr align="left"><td>opponent mates <td>1-0 {White mates} or 0-1 {Black mates}
+<tr align="left"><td>computer resigns <td>0-1 {White resigns} or 1-0 {Black resigns}
+<tr align="left"><td>game is a draw <td>1/2-1/2 {Draw}
+<tr align="left"><td>checkmate <td>1-0 {White mates} or 0-1 {Black mates}
+</table>
+
+<p>
+Commands in the above table are recognized if they begin a line and
+arbitrary characters follow, so (for example) "White mates" will be
+recognized as "White", and "game is a draw by the 50 move rule" will
+be recognized as "game is a draw". All the commands are
+case-sensitive.
+</p>
+
+<p>
+An alternative move syntax is also recognized:
+</p>
+
+<table>
+<tr align="left"><th>Command <th>Interpreted as
+<tr align="left"><td>NUMBER ... MOVE <td>move MOVE
+</table>
+
+<p>
+Here NUMBER means any string of decimal digits, optionally ending in a
+period. MOVE is any string containing no whitespace. In this command
+format, xboard requires the "..." even if your engine is playing
+White. A command of the form NUMBER MOVE will be ignored. This odd
+treatment of the commands is needed for compatibility with gnuchessx.
+The original reasons for it are lost in the mists of time, but I
+suspect it was originally a bug in the earliest versions of xboard,
+before I started working on it, which someone "fixed" in the wrong
+way, by creating a special version of gnuchess (gnuchessx) instead of
+changing xboard.
+</p>
+
+<p>
+Any line that contains the words "offer" and "draw" is recognized as
+"offer draw".
+</p>
+
+<p>
+The "Illegal move" message is recognized even if spelled "illegal
+move" and even if the colon (":") is omitted. This accommodates GNU
+Chess 4, which prints messages like "Illegal move (no matching
+move)e2e4", and old versions of Crafty, which print just "illegal move".
+</p>
+
+<p>
+In Zippy mode, for compatibility with older versions of Crafty,
+xboard passes through to ICS any line that begins "kibitz", "whisper",
+"tell", or "draw". Do not use this feature in new code. Instead, use the
+commands "tellall", "tellothers", "tellopponent", "tellics" (if needed),
+"1/2-1/2 {COMMENT}", or "offer draw", as appropriate.
+</p>
+
+<p>
+<font color=red>
+If the engine responds to the "sd DEPTH" command with an error message
+indicating the command is not supported (such as "Illegal move: sd"),
+xboard sets an internal flag and subsequently uses the command
+"depth\nDEPTH" instead, for the benefit of GNU Chess 4. Note the
+newline in the middle of this command! New engines should not rely on
+this feature.
+</font>
+</p>
+
+<p>
+<font color=red>
+If the engine responds to the "st TIME" command with an error message
+indicating the command is not supported (such as "Illegal move: st"),
+xboard sets an internal flag and subsequently uses the command "level
+1 TIME" instead, for the benefit of GNU Chess 4. Note that this is
+not a standard use of the level command, as TIME seconds are not added
+after each player makes 1 move; rather, each move is made in at most
+TIME seconds. New engines should not implement or rely on this
+feature.
+</font>
+</p>
+
+<font color=red>
+<p>
+In support of the -firstHost/-secondHost features, which allow a chess
+engine to be run on another machine using the rsh protocol, xboard recognizes
+error messages that are likely to come from rsh as fatal errors. The following
+messages are currently recognized:
+</p>
+
+<blockquote>
+unknown host<br>
+No remote directory<br>
+not found<br>
+No such file<br>
+can't alloc<br>
+Permission denied<br>
+</blockquote>
+</font>
+
+<p>
+<font color=red>
+ChessBase/Fritz now implements the xboard/winboard protocol and can use
+WinBoard-compatible engines in its GUI. ChessBase's version of the
+protocol is generally the same as version 1, except that they have
+added the commands <strong>fritz</strong>, <strong>reset</strong>, and
+<strong>ponder</strong>, and the edit subcommands
+<strong>castle</strong> and <strong>ep</strong>. If you want your
+engine to work well with the ChessBase/Fritz GUI, you may need to
+implement these additional commands, and you should also be aware of
+the peculiar way that ChessBase uses the protocol. See their <a
+href="http://www.chessbase.com/Products/engines/winboard/tech.htm"
+>web page</a> for documentation.
+</font>
+</p>
+
+<p>
+<font color=red>
+ChessMaster 8000 also implements version 1 of the xboard/winboard
+protocol and can use WinBoard-compatible engines. The original
+release of CM8000 also has one additional restriction: only pure
+coordinate notation (e.g., e2e4) is accepted in the move command. A
+patch to correct this should be available from The Learning Company
+(makers of CM8000) in February 2001.
+</font>
+</p>
+
+<hr noshade size="2">
+<address>converted to HTML by <a href="http://www.jakob.at/steffen/">Steffen A. Jakob</a></address>
+</body>
+</html>
diff --git a/programs/harvar93.txt b/programs/harvar93.txt
new file mode 100644
index 0000000..7ce4506
--- /dev/null
+++ b/programs/harvar93.txt
@@ -0,0 +1,519 @@
+4TH HARVARD CUP HUMAN VERSUS COMPUTER CHESS CHALLENGE
+Saturday, 6 November 1993, 10:00 AM-5:30 PM
+The Computer Museum, Boston
+
+
+
+HUMANS: Patrick Wolff, Michael Rohde, Boris Gulko, Joel Benjamin,
+Ilya Gurevich, Alexander Ivanov -- all International Grandmasters.
+
+PROGRAMS: Kasparov's Gambit (Electronic Arts), BattleChess 4000
+SVGA (Interplay Productions), Socrates Exp (Heuristic Software),
+M-Chess Professional (M Chess) -- all running on 60MHz Intel Pentium
+processor-based systems. Renaissance SPARC (Saitek Industries
+Ltd.) -- SPARC processor. ChessSystem R30 (TASC B.V.) -- ARM processor.
+
+RULES: Six rounds, six games per round, time control G/25, minimum
+10 minute intermission between rounds. Chief Arbiter -- Joel Salman.
+
+PRIZES: 1st place (human), $1000; 2nd place (human), $500. Top
+human and top computer have their names engraved on the permanent
+Malcolm H. Weiner Trophy and are invited back to the 5th Harvard Cup.
+
+SPONSORS: Intel Corporation, Electronic Arts, Interplay
+Productions, Heuristic Software/Machiavelli Designs Inc., M Chess,
+Saitek Industries Ltd., TASC B.V., Prodigy, USA Today Information
+Center, Amerigames International, American Chess Foundation, IBM
+PC Company (official computer equipment supplier), United States
+Chess Federation (official chess equipment supplier). Special
+thanks to The Computer Museum and its staff, the Harvard Chess
+Club and its members, the Millburn Ridgefield Corporation,
+Malcolm H. Wiener, and everyone who volunteered and helped make
+the event a success.
+
+RESULTS:
+
+PLAYER (FIDE) SocExp CSR30 MCPro BC400 RenSPARC KGambit TOTAL
+Benjamin (2620) b 1-0 b 1-0 w 1-0 b 1-0 w 1-0 w 1-0 6.0
+Ivanov (2535) b 0-1 w 1-0 b 1-0 b 1-0 w 1-0 w 1-0 5.0
+Gulko (2635) b 1/2 w 1-0 b =-= w =-= b 1-0 w 1-0 4.5
+Wolff (2585) w 1-0 b =-= w 0-1 b 1-0 w 1-0 b 1-0 4.5
+Gurevich (2575) w =-= w 0-1 b 1-0 w 1-0 b 1-0 b 1-0 4.5
+Rohde (2575) w 0-1 b 0-1 w 1-0 w 0-1 b =-= b 1-0 2.5
+ TOTAL 3.0 2.5 1.5 1.5 0.5 0.0 27-9
+ TPR* 2588 2528 2395 2395 2168 ----
+ SE* 142 144 164 164 257 ---
+
+(Tournament performance ratings and standard errors calculated by
+Mark Glickman using Newton-Raphson algorithm.)
+
+Final score: Humans 27 -- Computers 9 (75%-25%)
+Top Humans: Joel Benjamin, 6-0 ($1000)
+ Alexander Ivanov, 5-1 ($500)
+Top Computer: Socrates Exp, 3-3
+
+
+ROUND 1
+
+Alexander Ivanov -- Kasparov's Gambit
+4th Harvard Cup (1) 1993
+1 e4 e5 2 Nf3 Nc6 3 Bb5 a6 4 Ba4 Nf6 5 0-0 Be7 6 Re1 b5 7 Bb3 d6 8
+c3 0-0 9 h3 Nb8 10 d4 Nbd7 11 Nbd2 Bb7 12 Bc2 Re8 13 Nf1 Bf8 14
+Ng3 g6 15 a4 Bg7 16 Bd3 c6 17 Bg5 h6 18 Bd2 Kh7 19 h4 exd4 20 cxd4
+Kg8 21 Qc1 Kh7 22 h5 c5 23 hxg6+ fxg6 24 e5 dxe5 25 dxe5 Ng4 26
+Bxg6+ Kxg6 27 Qc2+ Kf7 28 Qf5+ Kg8 29 Qxg4 Bxf3 30 Qxf3 Nxe5 31
+Qd1 Nc4 32 Rxe8+ Qxe8 33 Bc3 Rd8 34 Qg4 Ne5 35 Bxe5 Qxe5 36 axb5
+axb5 37 Nf5 Kh8 38 Ra6 Qxb2 39 Rg6 Rd4 40 Nxd4 Qa1+ 41 Kh2 Qxd4 42
+Qxd4 Bxd4 43 Rxh6+ Kg7 44 Rb6 Bxf2 45 Rxb5 Bd4 46 Kg3 Kf6 47 Kf4
+Be5+ 48 Ke4 Bd4 49 Rb8 Kg5 50 Rc8 Kf6 51 g4 Kf7 52 Rd8 Kg6 53 Kf4
+Bg7 54 Rd6+ Kf7 55 Kf5 Ke7 56 Re6+ Kd7 57 g5 Bd4 58 Re4 Kd6 59 g6
+Bg7 60 Re6+ Kd7 61 Ra6 Ke7 62 Ra7+ Kf8 63 Ra8+ Ke7 64 Rc8 Bd4 65
+Kg5 Kd6 66 Kh6 Kd7 67 Rxc5 Kd6 68 Rc8 1-0
+
+Ilya Gurevich -- BattleChess 4000 SVGA
+4th Harvard Cup (1) 1993
+1 e4 e5 2 Nf3 d6 3 d4 Nf6 4 Nc3 Nbd7 5 Bc4 Be7 6 a4 exd4 7 Nxd4
+Ne5 8 Ba2 0-0 9 0-0 Bd7 10 f4 Bg4 11 Qe1 Ng6 12 h3 Bd7 13 Qf2 Qe8
+14 Bd2 Bxa4 15 Nxa4 Nxe4 16 Qe3 Bh4 17 Nc3 Ng3 18 Rf3 Qxe3+ 19
+Bxe3 a6 20 Bf2 Nh5 21 Bxh4 Nxh4 22 Rf2 Rae8 23 g4 Nf6 24 Kh2 Re3
+25 Re2 Rxe2+ 26 Ndxe2 Re8 27 Kg3 Ng6 28 Kf3 Nh4+ 29 Kf2 h5 30 g5
+Ne4+ 31 Nxe4 Rxe4 32 Bd5 Rb4 33 b3 Kf8 34 Bc4 c6 35 Ra4 Rxa4 36
+bxa4 Ng6 37 Bd3 b5 38 axb5 cxb5 39 Bxg6 fxg6 40 Ke3 Kf7 41 Nd4 d5
+42 Kd3 b4 43 Nc6 Ke6 44 Nxb4 a5 45 Nc6 a4 46 Nd4+ Kf7 47 Kc3 a3
+48 Kb3 a2 49 Kxa2 Ke7 50 Kb3 Kd7 51 Kb4 1-0
+
+Socrates Exp -- Joel Benjamin
+4th Harvard Cup (1) 1993
+1 e4 c5 2 c3 d5 3 exd5 Qxd5 4 d4 Nf6 5 Nf3 Nc6 6 Na3 Bg4 7 Be2
+cxd4 8 cxd4 e5 9 dxe5 Qxd1+ 10 Bxd1 Bb4+ 11 Bd2 Bxd2+ 12 Kxd2 0-0-0+
+13 Kc1 Ne4 14 Rf1 Rd5 15 Nd2 Nxd2 16 Bxg4+ Kb8 17 Re1 Rhd8 18
+f4 Rc5+ 19 Nc2 Nb4 20 Bd1 Nxc2 21 Bxc2 Rdc8 22 Kxd2 Rxc2+ 23 Ke3
+Rxb2 24 Re2 Rc3+ 25 Kf2 Rxe2+ 26 Kxe2 Ra3 27 Kd2 g6 28 g3 h5 29
+Ke2 b5 30 Kd2 Kb7 31 Kc2 Kb6 32 Kb2 Re3 33 Rc1 Re2+ 34 Rc2 Rxc2+
+35 Kxc2 Kc5 36 Kd3 Kd5 37 Ke3 a5 38 Kd3 b4 39 Ke3 a4 40 Kd3 Kc5 41
+h3 Kd5 42 g4 h4 43 f5 gxf5 44 gxf5 Kxe5 45 f6 Kxf6 46 Kc4 b3 47
+axb3 axb3 48 Kxb3 Ke5 49 Kc3 Kf4 50 Kd4 Kg3 51 Ke4 Kxh3 0-1
+
+Patrick Wolff -- M-Chess Professional 3.42
+4th Harvard Cup (1) 1993
+1 e4 c5 2 Nf3 d6 3 d4 cxd4 4 Nxd4 Nf6 5 Nc3 a6 6 Bc4 e6 7 Bb3 b5 8
+0-0 Be7 9 Qf3 Qc7 10 Qg3 b4 11 Nce2 0-0 12 Bh6 Ne8 13 c3 bxc3 14
+Nxc3 Nd7 15 Bxe6 fxe6 16 Nxe6 Qc4 17 Bxg7 Qxe6 18 Bxf8+ Kxf8 19 f4
+Rb8 20 b3 Nef6 21 Rae1 Qg4 22 Qxg4 Nxg4 23 h3 Ngf6 24 e5 Ne8 25
+Nd5 Bh4 26 Re3 dxe5 27 fxe5+ Kg7 28 Re4 Bg5 29 Rg4 Kh6 30 Rf5 Ndf6
+31 Rgxg5 Bxf5 32 Rxf5 Nxd5 33 g4 Ng7 34 Rf7 Ne6 35 Kg2 Rc8 36 Kg3
+Ng5 37 Ra7 Rc3+ 38 Kf2 Nxh3+ 39 Ke1 Re3+ 40 Kd2 Nhf4 41 Rxa6+ Kg5
+42 Ra7 Re2+ 43 Kc1 Nd3+ 0-1
+
+Renaissance SPARC -- Boris Gulko
+4th Harvard Cup (1) 1993
+1 c4 e5 2 Nf3 e4 3 Nd4 Nc6 4 Nxc6 dxc6 5 Nc3 Nf6 6 g3 Bc5 7 Qb3 0-0
+8 Bg2 Re8 9 0-0 h5 10 Na4 Bd4 11 e3 Be5 12 Nc5 h4 13 Nxb7 Qe7 14
+d4 exd3 15 Na5 hxg3 16 Nxc6 gxf2+ 17 Kh1 Qd6 18 c5 Qxc5 19 Nxe5
+Qxe5 20 Rxf2 Bf5 21 Bxa8 Rxa8 22 a4 Ng4 23 Rf4 Be4+ 24 Kg1 Qh5 25
+Qxf7+ Qxf7 26 Rxf7 Kxf7 27 Bd2 Ke6 28 Rc1 Rh8 29 Rc4 Kd5 30 Rd4+
+Ke5 31 Ba5 c5 32 Bc7+ Kf5 33 Rd7 Nf6 34 Rd6 Ne8 35 Rd8 Nxc7 36
+Rxh8 d2 37 Rf8+ Ke5 38 Rf1 Bc2 39 a5 d1/Q 0-1
+
+ChessSystem R30 -- Michael Rohde
+4th Harvard Cup (1) 1993
+1 d4 Nf6 2 c4 e6 3 Nf3 Bb4+ 4 Bd2 c5 5 Bxb4 cxb4 6 g3 0-0 7 Nbd2
+Nc6 8 Bg2 d6 9 0-0 e5 10 Qc2 Bg4 11 e3 a5 12 dxe5 dxe5 13 Rfd1 Qe7
+14 Ne4 Rad8 15 h3 Bf5 16 Nfd2 Kh8 17 g4 Bg6 18 Rac1 Rd7 19 g5 Ng8
+20 Nf1 Rfd8 21 Nfg3 h6 22 h4 f5 23 Rxd7 Rxd7 24 h5 fxe4 25 hxg6
+Qxg5 26 Bxe4 Nf6 27 Bf5 Rd8 28 Kf1 Nh5 29 Nxh5 Qxh5 30 Be4 Ne7 31
+Bxb7 Nxg6 32 c5 Nh4 33 c6 Qg4 34 c7 Qh3+ 35 Ke1 Rc8 36 Rd1 1-0
+
+
+ROUND 2
+
+Kasparov's Gambit -- Ilya Gurevich
+4th Harvard Cup (2) 1993
+1 d4 Nf6 2 c4 g6 3 Nc3 d5 4 Bf4 Bg7 5 e3 c5 6 dxc5 Qa5 7 Rc1 Ne4 8
+cxd5 Nxc3 9 Qd2 Qxa2 10 bxc3 Qa5 11 Nf3 Nd7 12 c6 bxc6 13 dxc6 Nc5
+14 Qb2 Na4 15 Qa3 0-0 16 Nd4 e5 17 Nb3 Qd5 18 Bxe5 Bxe5 19 Qxa4
+Rb8 20 Nd4 Rb2 21 Qxa7 Bh3 22 Qa3 Rfb8 23 c4 Qe4 24 f3 Qh4+ 25 g3
+Qh6 26 Nb5 Bxf1 27 c7 Re8 28 Rxf1 Qxh2 29 Qd3 Bxc7 30 Kd1 Red8 31
+Nd4 Qg2 32 Ra1 Be5 33 Kc1 Bxd4 34 exd4 Re8 0-1
+
+BattleChess 4000 SVGA -- Joel Benjamin
+4th Harvard Cup (2) 1993
+1 e4 c5 2 Nc3 Nc6 3 f4 e6 4 Nf3 Nge7 5 d4 cxd4 6 Nxd4 d5 7 Nxc6
+bxc6 8 Be3 Rb8 9 Rb1 Qc7 10 Qd2 dxe4 11 Nxe4 Nd5 12 Bc4 f5 13 Bxd5
+cxd5 14 Nc3 Ba6 15 Bd4 Bd6 16 Qe3 Kf7 17 g3 Rb4 18 a3 Rc4 19 b4
+Rc8 20 Kd2 Qd7 21 Rhe1 Be7 22 Rb3 Rxd4+ 23 Qxd4 Bf6 24 Qf2 Bc4 25
+Rbb1 d4 26 Nd1 d3 27 c3 Qa4 28 Rc1 Qxa3 29 h4 Bb3 30 c4 Qxb4+ 31
+Nc3 Bc2 32 Qxa7+ Kg8 33 Re5 Bxe5 34 fxe5 Qxc4 35 Qa3 Qd4 36 Rf1
+Qxe5 37 Rf4 h6 38 Qb4 Rxc3 39 Qxc3 Qe2+ 40 Kc1 Qd1+ 41 Kb2 Qb1+ 42
+Ka3 d2 43 Rd4 d1/Q 44 Rxd1 Bxd1 45 Qc8+ Kh7 46 Qxe6 Qb3+ 47 Qxb3
+Bxb3 48 Kxb3 Kg6 49 Kc4 Kh5 50 Kd3 Kg4 51 Ke2 Kxg3 52 h5 Kg4 53
+Kd3 Kxh5 54 Kc4 f4 0-1
+
+Michael Rohde -- Socrates Exp
+4th Harvard Cup (2) 1993
+1 Nf3 Nf6 2 c4 b6 3 Nc3 Bb7 4 d4 d5 5 cxd5 Nxd5 6 Qc2 e6 7 e4 Nxc3
+8 bxc3 Nd7 9 Bd3 Be7 10 0-0 0-0 11 Bf4 c5 12 d5 exd5 13 exd5 Bxd5
+14 Bxh7+ Kh8 15 Bf5 Bxf3 16 gxf3 Bg5 17 Bd6 Be7 18 Bg3 Nf6 19 Rfe1
+Rg8 20 Rad1 Qf8 21 Qe2 Re8 22 Bc2 Bd6 23 Qf1 Rxe1 24 Qxe1 Bxg3 25
+hxg3 Qa8 26 Qe7 Qxf3 27 Re1 Qxc3 28 Bb1 Ra8 29 Rd1 Re8 30 Rd8 Qc1+
+31 Kg2 Rxd8 32 Qxd8+ Ng8 33 Be4 Qh6 34 Bd5 Qh5 35 Qd7 Nf6 36 Qc8+
+Kh7 37 Bf3 Qe5 38 Qb7 Qe6 39 Qxa7 c4 40 a4 c3 41 Qc7 Qb3 42 Qc8 c2
+43 Qh3+ Kg6 44 Qc8 Qb2 45 Be2 c1/Q 46 Bd3+ Kg5 47 Qf5+ Kh6 48 Qh3
+Nh5 49 Qf5 Qf6 0-1
+
+M-Chess Professional 3.42 -- Alexander Ivanov
+4th Harvard Cup (2) 1993
+1 e4 g6 2 d4 Bg7 3 Nc3 c6 4 Bc4 b5 5 Bb3 a5 6 a4 b4 7 Nce2 d5 8 e5
+Na6 9 Bg5 f6 10 exf6 exf6 11 Bf4 Ne7 12 h3 0-0 13 Nf3 g5 14 Bg3
+Ng6 15 h4 g4 16 Nd2 h5 17 c3 Bf5 18 0-0 Bh6 19 Bc2 Bxc2 20 Qxc2 f5
+21 Nb3 Kg7 22 Be5+ Kh7 23 Ng3 Qxh4 24 Nxf5 Qg5 25 Nxh6 Kxh6 26
+Nxa5 Rac8 27 Bd6 Rf6 28 Bxb4 Nxb4 29 cxb4 Nh4 30 Kh1 Nf3 31 g3
+Nxd4 32 Qc3 Nf3 33 Rfd1 Kg7 34 Nb3 h4 35 Nd4 Kf7 36 Kg2 Rh8 37
+gxh4 Nxh4+ 38 Kf1 g3 39 f3 Ng6 40 b5 Nf4 41 Ne2 Rh1+ 42 Ng1 Rxg1+
+43 Kxg1 Ne2+ 44 Kg2 Nxc3 45 Rd3 Ne2 46 Rb3 Nf4+ 47 Kf1 g2+ 48 Kf2
+Re6 49 Re3 Nh3+ 50 Ke2 Qxe3+ 51 Kd1 Qd3+ 52 Kc1 g1/R mate 0-1
+
+Patrick Wolff -- Renaissance SPARC
+4th Harvard Cup (2) 1993
+1 e4 c5 2 Nf3 d6 3 d4 Nf6 4 Nc3 cxd4 5 Nxd4 g6 6 Be3 Bg7 7 f3 0-0
+8 Qd2 Nc6 9 Bc4 Qa5 10 0-0-0 Bd7 11 Bb3 Rfc8 12 h4 Ne5 13 Kb1 Nc4
+14 Bxc4 Rxc4 15 Nb3 Qc7 16 h5 gxh5 17 Bh6 Kh8 18 Bxg7+ Kxg7 19 Nd5
+Nxd5 20 Qg5+ Kf8 21 exd5 Rc8 22 Qh6+ Ke8 23 Qxh7 Kd8 24 Rd2 Be8 25
+Re1 a5 26 Nd4 Rb4 27 Qe4 Qd7 28 Rde2 Rc7 29 a3 Rb6 30 Kc1 Qa4 31
+Nf5 Qb3 32 Qxe7+ Rxe7 33 cxb3 Rxe2 34 Rxe2 Bd7 35 Nd4 h4 36 Kd2
+Bc8 37 Re1 h3 38 g4 a4 39 b4 Bd7 40 Rh1 Ra6 41 Rxh3 Rb6 42 Rh7 Be8
+43 g5 Kc8 44 f4 Ra6 45 f5 Rb6 46 f6 Kd8 47 g6 fxg6 48 Ne6+ Kc8 49
+Re7 Bf7 50 Rxf7 Kb8 51 Rd7 Ka7 52 f7 1-0
+
+Boris Gulko -- ChessSystem R30
+4th Harvard Cup (2) 1993
+1 d4 c6 2 Nf3 Nf6 3 Bf4 d6 4 e3 Nd5 5 Bg3 Qb6 6 Qc1 g6 7 c4 Nf6 8
+Nc3 Bf5 9 Be2 Bg7 10 0-0 0-0 11 c5 dxc5 12 Na4 Qb4 13 Nxc5 Nbd7 14
+a3 Qb6 15 Na4 Qb3 16 Nc3 Nb6 17 Nd2 Qe6 18 Re1 Nfd5 19 e4 Nxc3 20
+bxc3 Bg4 21 f3 Bh5 22 Rb1 Rfc8 23 Qc2 c5 24 d5 Qf6 25 e5 Qg5 26 f4
+Qh6 27 c4 Bxe2 28 Rxe2 Qh5 29 Nf3 Rc7 30 h3 Qf5 31 Qxf5 gxf5 32
+Rc2 Bh6 33 Ne1 Bg7 34 Nd3 f6 35 Bf2 fxe5 36 fxe5 Na4 37 Re1 Rac8
+38 Nf4 Rd7 39 Bh4 b5 40 cxb5 c4 41 e6 Rb7 42 Bxe7 Bc3 43 Rd1 Rxe7
+44 d6 Rg7 45 Nd5 Rb8 46 Nxc3 Nc5 47 Re2 Kf8 48 Rd5 Rg3 49 Rxc5
+Rxc3 50 d7 Ke7 51 Rc8 Rd3 52 Rxb8 1-0
+
+
+ROUND 3
+
+Boris Gulko -- Kasparov's Gambit
+4th Harvard Cup (3) 1993
+1 d4 Nf6 2 Bf4 Nc6 3 Nf3 e6 4 c4 Bb4+ 5 Nbd2 d6 6 a3 Bxd2+ 7 Qxd2
+0-0 8 e3 Qe8 9 Be2 e5 10 Bg3 e4 11 Ng1 Bf5 12 Bh4 Qe7 13 Bd1 a6 14
+Ne2 h6 15 Nc3 g5 16 Bg3 Rad8 17 h4 g4 18 h5 d5 19 cxd5 Nxd5 20
+Nxd5 Rxd5 21 Bb3 Rd7 22 Rc1 Be6 23 Bxe6 Qxe6 24 Rc5 f5 25 0-0 Qf7
+26 Qc2 Rfd8 27 Rc1 Re8 28 Qc4 Qxc4 29 R1xc4 Rf8 30 b4 Rff7 31 a4
+Ne7 32 Bxc7 Nd5 33 Be5 Nb6 34 Rc1 Nxa4 35 Rc8+ Rf8 36 Rxf8+ Kxf8
+37 Rc8+ Ke7 38 Rh8 Nb2 39 Rxh6 Nd3 40 Rh7+ Ke6 41 Rxd7 1-0
+
+Michael Rohde -- BattleChess 4000 SVGA
+4th Harvard Cup (3) 1993
+1 Nf3 Nf6 2 c4 g6 3 Nc3 d5 4 cxd5 Nxd5 5 Qa4+ Nc6 6 Nxd5 Qxd5 7 e4
+Qe6 8 Bb5 Bd7 9 0-0 Bg7 10 d3 Qd6 11 Be3 Bxb2 12 Rab1 Bg7 13 d4 a6
+14 e5 Qe6 15 d5 Qxd5 16 Rfd1 Qe6 17 Bc4 Nxe5 18 Bxe6 Nxf3+ 19 gxf3
+Bxa4 20 Bb3 Bc6 21 Bd5 Bxd5 22 Rxd5 e6 23 Rd2 b6 24 Rc2 Be5 25 f4
+Bd6 26 Kg2 0-0 27 Rc6 Rfd8 28 Kf3 Kf8 29 Ke2 Ke7 30 h3 Kf6 31 Rd1
+Rab8 32 Kf3 Kf5 33 Rg1 h6 34 h4 Rd7 35 Rcc1 Be7 36 Rh1 h5 37 Rc6
+Rb7 38 Rh2 Rd3 39 Rh1 Bd6 40 Rg1 Bxf4 [time] 0-1
+
+Socrates Exp -- Alexander Ivanov
+4th Harvard Cup (3) 1993
+1 e4 g6 2 d4 Bg7 3 Nf3 d6 4 Be2 b6 5 0-0 Bb7 6 Nc3 e6 7 d5 e5 8
+Be3 Nd7 9 a4 Ne7 10 a5 a6 11 axb6 cxb6 12 Qd2 0-0 13 Bh6 b5 14
+Bxg7 Kxg7 15 Rfe1 h6 16 Rad1 Rc8 17 Bd3 Qc7 18 Nh4 g5 19 Nf3 Nc5
+20 Rc1 Ng6 21 Qe3 Qd7 22 Bf1 b4 23 Na2 a5 24 Nd2 f5 25 exf5 Rxf5
+26 Nc4 Qc7 27 Qh3 Rcf8 28 Ne3 R5f6 29 Qh5 Bc8 30 Qe2 Rxf2 31 Qxf2
+Rxf2 32 Kxf2 Ne4+ 33 Kg1 Qf7 34 Bd3 Qf2+ 35 Kh1 Nc5 36 Re2 Qh4 37
+Bf5 Ba6 38 g3 Qd4 39 c3 bxc3 40 bxc3 Qa4 41 c4 Ne7 42 Rcc2 Qe8 43
+Rf2 Bc8 44 Bxc8 Qxc8 45 Nc3 Nd3 46 Rfd2 Nb4 47 Rb2 Qc5 48 Re2 Qd4
+49 Nb5 Qe4+ 50 Kg1 Qg6 51 Nc7 Kg8 52 Ne6 Qd3 53 Re1 Ng6 54 Rbb1 h5
+55 Nxg5 h4 56 Rbd1 Qb3 57 Ne4 Nd3 58 Rb1 Qa2 59 Rb8+ Kf7 60 Rf1+
+Ke7 61 Nf5+ Kd7 62 Rb7+ Kd8 63 Nxd6 h3 64 Rf8+ Nxf8 65 Nf7+ 1-0
+
+Joel Benjamin -- M-Chess Professional 3.42
+4th Harvard Cup (3) 1993
+1 d4 Nf6 2 Nf3 d5 3 c4 e6 4 Nc3 c5 5 cxd5 exd5 6 Bg5 Be7 7 e3 Nc6
+8 dxc5 0-0 9 Rc1 h6 10 Bh4 Be6 11 Be2 Bxc5 12 Nxd5 Qa5+ 13 Qd2
+Qxd2+ 14 Nxd2 Bxd5 15 Rxc5 g5 16 Bg3 Bxg2 17 Rg1 Bh3 18 f4 Nh7 19
+Nf3 Rfc8 20 fxg5 b6 21 Rc3 hxg5 22 Ba6 Bg4 23 Bxc8 Rxc8 24 Ne5
+Nxe5 25 Bxe5 Rxc3 26 Bxc3 Be6 27 Kf2 f6 28 Bd4 a6 29 a3 b5 30 Rc1
+Bc4 31 Rc3 Kf7 32 b3 Bd5 33 Rc7+ Kg6 34 b4 Nf8 35 Ra7 Ne6 36 Rxa6
+Nxd4 37 exd4 Kf5 38 Ke3 Kg6 39 Rd6 Bb3 40 Rb6 Bc4 41 Rc6 Bb3 42
+Rc3 Be6 43 Rc5 Bd7 44 d5 f5 45 Rc7 f4+ 46 Kd4 Bf5 47 d6 Kf6 48 d7
+Ke7 49 d8/Q+ Kxd8 50 Rc5 Bd7 51 Rxg5 f3 52 Ke3 f2 53 Kxf2 Ke7 54
+h4 Kf6 55 Ke3 Be8 56 Kf4 Bc6 57 h5 1-0
+
+Renaissance SPARC -- Ilya Gurevich
+4th Harvard Cup (3) 1993
+1 Nf3 Nf6 2 d4 g6 3 c4 Bg7 4 Nc3 d5 5 Qa4+ Bd7 6 Qb3 dxc4 7 Qxc4
+a6 8 Bf4 b5 9 Qc5 0-0 10 Bxc7 Qc8 11 Be5 Qxc5 12 dxc5 Nc6 13 e3
+Nxe5 14 Nxe5 Rfc8 15 Nd3 Bf5 16 a4 Bxd3 17 Bxd3 b4 18 Na2 Nd7 19
+c6 Nc5 20 Nxb4 a5 21 Rc1 Nb3 22 Rc4 axb4 23 Rxb4 Na5 24 Be4 Nxc6
+25 Bxc6 Rxc6 26 0-0 Rc2 27 b3 Bf6 28 Rd1 Ra2 29 Rb7 Rc8 30 g3 Rcc2
+31 Rf1 Bg5 32 Kg2 Bxe3 33 Rxe7 Bxf2 34 Kh3 h5 35 Kh4 Kg7 36 Kh3
+Kh6 37 Rxf7 Bg1 38 g4 Rxh2+ 39 Kg3 h4+ 40 Kf4 Rhf2+ 41 Ke4 Rxf7 42
+Rxf7 h3 43 Rf8 h2 44 Rh8+ Kg5 45 Kd3 Kxg4 46 Rh6 g5 47 Rh7 Kg3 48
+Rh5 g4 49 a5 Kg2 50 Ke4 h1/Q 0-1
+
+ChessSystem R30 -- Patrick Wolff
+4th Harvard Cup (3) 1993
+1 e4 c5 2 c3 Nf6 3 e5 Nd5 4 d4 cxd4 5 cxd4 d6 6 Nf3 Nc6 7 Nc3 dxe5
+8 dxe5 Nxc3 9 Qxd8+ Nxd8 10 bxc3 Bd7 11 Bd3 e6 12 0-0 Rc8 13 Bd2
+h6 14 Rfe1 Bc5 15 Nd4 0-0 16 Nb3 Be7 17 Rad1 Nc6 18 f4 Rfd8 19 Be3
+Be8 20 Bf2 Kf8 21 Re3 b6 22 Rh3 Nb8 23 Bd4 Ba4 24 f5 exf5 25 Bxf5
+Bd7 26 Rf3 Kg8 27 Bxd7 Rxd7 28 Re1 Nc6 29 Rxf7 Nxd4 30 Nxd4 Kxf7
+31 e6+ Ke8 32 exd7+ Kxd7 33 Rd1 Bf6 34 Nb5+ Ke6 35 Nxa7 Rxc3 36
+Nb5 Rc6 37 Re1+ Kd5 38 Rd1+ Kc4 39 Rc1+ Kd5 40 Rd1+ Ke4 41 a4 Ke3
+42 Re1+ Kd3 43 Kf2 Kc2 44 Kf3 Kb3 45 Re4 Rc4 46 Rxc4 Kxc4 47 Nc7
+Kb4 48 Nd5+ Ka5 49 Ke4 Bd8 50 Nc3 Kb4 51 Kd3 Kb3 52 g3 Be7 53 Nd5
+Bc5 54 Nc3 Bb4 55 Nd5 Ba5 56 Ne7 h5 57 Nd5 Kxa4 58 Nf4 b5 59 Nxh5
+Ka3 60 Nxg7 b4 61 Nf5 b3 62 Ne3 Bc7 63 Nd5 b2 64 Kc2 Ka2 65 Nc3+
+Ka1 1/2-1/2
+
+
+ROUND 4
+
+Joel Benjamin -- Kasparov's Gambit
+4th Harvard Cup (4) 1993
+1 d4 Nf6 2 Nf3 d5 3 c4 e6 4 Nc3 Be7 5 Bg5 0-0 6 e3 h6 7 Bh4 Ne4 8
+Bxe7 Qxe7 9 Rc1 Nxc3 10 Rxc3 c6 11 Bd3 dxc4 12 Rxc4 Nd7 13 0-0 e5
+14 dxe5 Nxe5 15 Re4 Nxf3+ 16 Qxf3 Be6 17 Bc4 Rad8 18 Bxe6 fxe6 19
+Qe2 Rd5 20 h3 Rfd8 21 b4 Rd2 22 Qc4 R8d5 23 a4 Kh8 24 b5 c5 25 a5
+b6 26 a6 e5 27 Rg4 Qd7 28 Rg6 Rb2 29 Rc6 Rb4 30 Qe2 Rd2 31 Qf3 Kg8
+32 Qg3 Rxb5 33 Rxh6 Qd3 34 Re1 Rbb2 35 Rg6 Qd7 36 Qxe5 Rxf2 37 Kh2
+Ra2 38 e4 Rad2 39 Re3 Rf7 40 Reg3 Re7 41 Qb8+ Qd8 42 Qf4 Rd4 43
+Qg5 Qd7 44 e5 Rd5 45 Qh4 Rexe5 46 Rh6 Qe7 47 Rh8+ Kf7 48 Rf3+ Ke6
+49 Qg4+ Kd6 50 Qc8 Qc7 51 Qa8 Kd7 52 Rg3 Rg5 53 Re8 Kd6 54 Rge3 c4
+55 Rd8+ Qxd8 56 Qxd8+ Kc6 57 Qc8+ Kb5 58 Qc7 Rd2 59 Rg3 Rxg3 60
+Kxg3 Kxa6 61 Qxc4+ Kb7 62 h4 a5 63 Qf4 [time] 1-0
+
+BattleChess 4000 SVGA -- Patrick Wolff
+4th Harvard Cup (4) 1993
+1 e4 c5 2 Nf3 d6 3 d4 cxd4 4 Nxd4 Nf6 5 Nc3 Nc6 6 Bg5 e6 7 Qd2 Be7
+8 0-0-0 0-0 9 Nb3 Qb6 10 f3 Rd8 11 Be3 Qc7 12 Qf2 d5 13 Kb1 dxe4
+14 Rxd8+ Bxd8 15 Nxe4 Nxe4 16 fxe4 b6 17 Bf4 e5 18 Be3 Be6 19 Bb5
+Be7 20 Rd1 Nd8 21 Qg3 Nb7 22 Bh6 Bf6 23 Rf1 Qd8 24 Be3 Nd6 25 Rd1
+Qc7 26 Bd3 Qc6 27 Nd2 Rc8 28 Rf1 Kh8 29 h4 Nc4 30 Nxc4 Bxc4 31 Bf2
+Bxh4 32 Qh3 Bxd3 33 Qxd3 Rd8 34 Qe2 Bxf2 35 Qxf2 Qxe4 36 Qxf7 Qf4
+37 a3 Rd1+ 38 Rxd1 Qxf7 39 Rd8+ Qg8 40 Rxg8+ Kxg8 41 b4 h5 42 c4
+h4 43 c5 bxc5 44 bxc5 Kf7 45 Kc2 g5 46 Kd3 g4 47 c6 Ke6 48 Ke3 Kd6
+49 Ke2 Kxc6 50 Kf1 h3 51 gxh3 gxh3 52 Kf2 e4 0-1
+
+Ilya Gurevich -- Socrates Exp
+4th Harvard Cup (4) 1993
+1 e4 e5 2 Nf3 Nf6 3 Nxe5 d6 4 Nf3 Nxe4 5 d3 Nf6 6 d4 g6 7 Bd3 Bg7
+8 Qe2+ Be6 9 Ng5 Qe7 10 0-0 Nc6 11 c3 Bf5 12 Qxe7+ Nxe7 13 Bxf5
+Nxf5 14 Re1+ Kf8 15 Na3 h6 16 Nf3 Re8 17 Bf4 g5 18 Bg3 Nd5 19 Nc2
+Nde7 20 Re4 Nxg3 21 hxg3 f5 22 Re2 Nd5 23 Rae1 Rxe2 24 Rxe2 Kf7 25
+Kf1 Bf6 26 Nd2 h5 27 Nc4 h4 28 N4e3 hxg3 29 fxg3 Ne7 30 Kf2 Rh7 31
+Nb4 Rh2 32 Nbd5 Nxd5 33 Nxd5 Bd8 34 Ne3 Kg6 35 g4 f4 36 Nf5 Bf6 37
+Re8 Rh8 38 Rxh8 Bxh8 39 Kf3 Kf6 40 Ke4 Ke6 41 d5+ Kf7 42 g3 fxg3
+43 Nxg3 Be5 44 Ne2 Kg6 45 Nc1 Kf6 46 Nd3 Bh2 47 c4 a5 48 a3 a4 49
+Kd4 Bg1+ 50 Kc3 Bc5 51 b4 axb3 52 Kxb3 Bd4 53 Kb4 Ke7 54 Kb5 Kd7
+55 a4 c6+ 56 Kb4 Be3 57 Kc3 c5 58 Ne1 Bf4 59 Nf3 b6 60 Ng1 Ke7 61
+Ne2 Be5+ 62 Kd3 Kf6 63 Ke4 Bb2 64 Ng3 Bc1 65 Nh1 Bf4 66 Nf2 Be5 67
+Kf3 Ke7 68 Ne4 Bf4 69 Ke2 Kd7 70 Kd3 Ke7 71 Kc2 Ke8 72 Kb3 Ke7 73
+a5 bxa5 74 Ka4 Kd7 75 Kxa5 Kd8 76 Kb6 Kd7 77 Kb7 Be3 78 Nc3 Bd2 79
+Na4 Ba5 80 Nb6+ Ke8 81 Kc6 Kd8 82 Nd7 Ke7 83 Nb8 Bc3 84 Kc7 Ba5+
+85 Kc8 Kf6 86 Kd7 Be1 87 Kxd6 Bg3+ 88 Kxc5 Bxb8 89 Kc6 Be5 90 d6
+Ke6 91 c5 Bf4 92 Kb7 Bxd6 93 cxd6 Kxd6 94 Kb6 Ke5 95 Kc5 Kf4 96
+Kd4 Kxg4 97 Ke4 Kg3 98 Kf5 g4 99 Ke4 Kf2 100 Kf4 g3 [time] 1/2-1/2
+
+M-Chess Professional 3.42 -- Boris Gulko
+4th Harvard Cup (4) 1993
+1 e4 g6 2 d4 Bg7 3 Nc3 Nc6 4 d5 Nb8 5 Nf3 d6 6 Bd3 Nf6 7 0-0 0-0 8
+h3 Nbd7 9 Be3 c6 10 Bd4 Qc7 11 Be2 Re8 12 Qd2 a6 13 Qg5 c5 14 Be3
+b5 15 Qh4 b4 16 Na4 e6 17 dxe6 Rxe6 18 Ng5 Re7 19 Bc4 Bb7 20 Rad1
+Ne5 21 Bd5 Bxd5 22 exd5 Rae8 23 Nxc5 h6 24 Nge4 Nxe4 25 Nxe4 Nd7
+26 Ng3 Qxc2 27 Qxb4 Qxb2 28 Qxb2 Bxb2 29 Bxh6 Ba3 30 f3 f5 31 Bg5
+Re5 32 Bf4 R5e7 33 Kh2 Nb6 34 h4 Kf7 35 h5 Kf6 36 h6 Rh7 37 Rd3
+Bc5 38 Bc1 g5 39 Bb2+ Kg6 40 Bd4 Rxh6+ 41 Kg1 Bxd4+ 42 Rxd4 Rh4 43
+Rd2 Re5 44 Rb1 Rxd5 45 Rxd5 Nxd5 46 Rd1 Ne3 47 Rxd6+ Kf7 48 Rxa6
+Rc4 49 Ra3 Rc1+ 50 Kh2 Re1 51 Rb3 Kg6 52 a4 f4 53 Rb6+ Kg7 54 Nh5+
+Kf7 55 g3 Nf1+ 56 Kg2 Nxg3 57 Nxg3 fxg3 58 a5 Ra1 59 a6 Ra4 60
+Kxg3 Kg7 61 Kf2 Ra3 62 Ke2 Kh7 63 Rc6 Kg7 64 Rd6 Kh7 65 Rb6 Kg7 66
+Re6 Kh7 67 Rd6 Kg7 68 Rd7+ Kg6 69 a7 Kf5 70 Rf7+ Kg6 71 Rb7 Kf5 72
+Rc7 Kf6 73 Rh7 Kf5 74 Rb7 Kf4 75 Rf7+ Ke5 76 Kf2 Ke6 77 Rg7 Kf6 78
+Rc7 Kg6 79 Re7 Kf6 80 Rh7 Kg6 81 Rd7 Kf6 82 Rb7 Kg6 83 Ke1 Kf5 84
+Kd2 Kf4 85 Rf7+ Ke5 86 Rd7 Kf4 87 Kc2 Ra6 88 Rf7+ Ke3 89 Kc3 Ra1
+90 Kc4 Ra2 91 Kc5 Ra1 92 Kb6 Rb1+ 93 Kc7 Rc1+ 94 Kb8 Rb1+ 95 Rb7
+Ra1 96 Rb3+ Kf4 97 a8/Q Rxa8+ 98 Kxa8 1/2-1/2
+
+Renaissance SPARC -- Michael Rohde
+4th Harvard Cup (4) 1993
+1 Nf3 Nf6 2 d4 e6 3 c4 b6 4 Nc3 Bb4 5 Bg5 h6 6 Bd2 Bb7 7 e3 0-0 8
+Bd3 d6 9 0-0 Nbd7 10 Qa4 c5 11 a3 Bxc3 12 Bxc3 Ne4 13 Be1 Rc8 14
+d5 Ndf6 15 dxe6 fxe6 16 Nh4 Ng4 17 Ng6 Qg5 18 Nxf8 Nxe3 19 fxe3
+Nd2 20 Bh7+ Kh8 21 Bg3 Nxf1 22 Nxe6 Qxe3+ 23 Kxf1 Qxe6 24 Qc2 Qe3
+25 Bxd6 Re8 26 Bg6 Re6 27 Bg3 Rxg6 28 Re1 Qg5 29 Re5 Qf6+ 30 Kg1
+Bc6 31 Qe2 Kh7 32 Qd3 Qf7 33 b4 cxb4 34 axb4 Qd7 35 Qxd7 Bxd7 36
+Re7 Bf5 37 Rxa7 Re6 38 Rc7 Re2 39 Bf2 Be4 40 g4 Kg8 41 Bxb6 Rg2+
+42 Kf1 Rxg4 43 Rd7 Bf5 44 Rd8+ Kf7 45 Bd4 Bd3+ 46 Kf2 Bxc4 47 Kf3
+Rg5 48 Rd7+ Kf8 49 Rc7 Bb5 50 Kf4 Rg2 51 h3 Bd3 52 Kf3 Rg5 1/2-1/2
+
+Alexander Ivanov -- ChessSystem R30
+4th Harvard Cup (4) 1993
+1 e4 c5 2 Nf3 Nc6 3 d4 cxd4 4 Nxd4 Nf6 5 Nc3 g6 6 Nxc6 bxc6 7 e5
+Ng8 8 Bc4 Bg7 9 Bf4 Qa5 10 0-0 Bxe5 11 Bxe5 Qxe5 12 Re1 Qf4 13 Re4
+Qf6 14 Re3 d5 15 Bxd5 Bf5 16 Ne4 Bxe4 17 Bxe4 Rc8 18 c3 Nh6 19 Qa4
+Kf8 20 Qxa7 Ng4 21 Rg3 Qe6 22 Qd4 Nf6 23 Bd3 c5 24 Qe3 Qxe3 25
+Rxe3 c4 26 Bf1 e6 27 a4 Ke7 28 a5 Rc5 29 Ra4 Nd5 30 Re2 Ra8 31 Rd2
+Raxa5 32 Rxa5 Rxa5 33 Bxc4 Ra1+ 34 Bf1 Ra2 35 Re2 h5 36 g3 g5 37
+Rc2 g4 38 Bc4 Ra1+ 39 Kg2 Kd6 40 Rd2 Kc5 41 Bxd5 exd5 42 Rd4 Ra7
+43 b4+ Kc6 44 c4 dxc4 45 Rxc4+ Kb5 46 Rc5+ Kxb4 47 Rxh5 Kc3 48 Rf5
+Rc7 49 Rf4 Kd3 50 Rxg4 f6 51 Rf4 Rf7 52 h4 Rf8 53 g4 Rg8 54 Kf3
+Rg6 55 h5 Rh6 56 Rf5 Kd4 57 Kf4 Kd3 58 f3 Kd4 59 Ra5 Kd3 60 Ra3+
+Kc4 61 Kf5 Kb5 62 Re3 Kc5 63 Re6 Kd5 64 Rxf6 1-0
+
+
+ROUND 5
+
+Kasparov's Gambit -- Michael Rohde
+4th Harvard Cup (5) 1993
+1 d4 Nf6 2 c4 e6 3 Nc3 Bb4 4 Nf3 b6 5 Bg5 h6 6 Bd2 Bb7 7 e3 0-0 8
+Bd3 d6 9 0-0 Nbd7 10 a3 Bxc3 11 Bxc3 Ne4 12 Be1 f5 13 Nd2 Ndf6 14
+f3 Ng5 15 Bg3 Qe7 16 b4 Rad8 17 Qa4 a6 18 Kh1 Rb8 19 Rae1 Ba8 20
+Qxa6 Bc6 21 c5 d5 22 Bc2 Qd7 23 cxb6 Bb5 24 bxc7 Bxa6 25 cxb8/Q
+Rxb8 26 Bxb8 Bxf1 27 h4 Nf7 28 Rxf1 Qc8 29 Bxf5 exf5 30 Bf4 Qc3 31
+Nb1 Qb2 32 Bg3 Nh5 33 Kh2 Nxg3 34 Kxg3 Nd6 35 Re1 Nc4 36 Kh3 Qf2
+0-1
+
+Boris Gulko -- BattleChess 4000 SVGA
+4th Harvard Cup (5) 1993
+1 d4 Nf6 2 Bf4 d5 3 e3 Bf5 4 c4 Nc6 5 Nc3 e6 6 Nf3 Bb4 7 a3 Bxc3+
+8 bxc3 0-0 9 Bg5 Qe7 10 Bd3 Bxd3 11 Qxd3 dxc4 12 Qxc4 h6 13 Bh4
+Qd8 14 0-0 Qd5 15 Qd3 Ne4 16 Rab1 Nd6 17 Nd2 Ne5 18 Qe2 Ng6 19 Bg3
+Qc6 20 c4 Nf5 21 Rb4 Nxg3 22 hxg3 b6 23 Qh5 Rad8 24 Rc1 Rd6 25 Qb5
+e5 26 Qxc6 Rxc6 27 d5 Rd6 28 e4 Re8 29 c5 Rd7 30 Ra4 Ra8 31 cxb6
+cxb6 32 Rc6 Re8 33 Rac4 f6 34 a4 Ra8 35 Kf1 Kf7 36 Nf3 Ne7 37 Rc7
+Ke8 38 Rc2 Kd8 39 R7c3 Rc8 40 Rxc8+ Nxc8 41 Ke2 Nd6 42 Kd3 f5 43
+Nxe5 fxe4+ 44 Kd4 Rc7 45 Nc6+ Ke8 46 g4 Kd7 47 Re2 Kc8 48 Ke5 Kd7
+49 Rc2 Rc8 50 Kd4 Rc7 51 Rc3 Ke8 52 Ke5 Kd7 53 Kd4 Ke8 54 Re3 Kf7
+55 f3 exf3 56 gxf3 h5 57 Re6 Rxc6 58 dxc6 Kxe6 59 gxh5 Ne8 60 Kc4
+Kd6 61 Kd4 Nf6 62 c7 Kxc7 63 Ke5 Nh5 64 Kf5 Ng3+ 65 Kg6 Ne2 66
+Kxg7 Nd4 67 f4 Ne6+ 68 Kf6 Nxf4 69 Ke5 Ne2 70 Kd5 Nc3+ 71 Kc4 Nxa4
+72 Kb5 Nc5 73 Kb4 Kd6 74 Kb5 Kd5 75 Kb4 a6 76 Kc3 a5 77 Kb2 b5 78
+Kc3 b4+ 79 Kb2 Kc4 80 Kc2 Nd3 81 Kd2 b3 82 Ke3 b2 83 Ke4 a4 84 Kf5
+a3 85 Ke6 Nb4 [time] 1/2-1/2
+
+Patrick Wolff -- Socrates Exp
+4th Harvard Cup (5) 1993
+1 e4 e5 2 Nf3 Nf6 3 Nc3 Bb4 4 Nxe5 0-0 5 Be2 Re8 6 Nd3 Bxc3 7 dxc3
+Nxe4 8 c4 d6 9 0-0 Nc6 10 Nf4 Ne5 11 f3 Nc5 12 Re1 Bf5 13 Be3 Ng6
+14 Qd2 Bxc2 15 Nh5 Bf5 16 g4 Bd7 17 b4 Ne6 18 f4 Nef8 19 f5 Ne5 20
+Bh6 Qh4 21 Qf4 Bc6 22 Bxg7 Nf3+ 23 Bxf3 Rxe1+ 24 Rxe1 Qxe1+ 25 Kg2
+Bxf3+ 26 Qxf3 Qxb4 27 Bc3 Qxc4 28 Nf6+ Kh8 29 Qe3 Qxa2+ 30 Kh3 Qb1
+31 Nd5+ f6 32 Nxf6 Qf1+ 33 Kh4 Qc4 34 Nxh7+ Qxc3 35 Qxc3+ Kxh7 36
+Qxc7+ Kg8 37 f6 Ne6 38 Qe7 Kh8 39 Qxe6 Rf8 40 g5 a5 41 g6 Rg8 42
+Qf7 Rxg6 43 Qxg6 a4 44 Qg7 mate 1-0
+
+M-Chess Professional 3.42 -- Ilya Gurevich
+4th Harvard Cup (5) 1993
+1 e4 c5 2 Nf3 e6 3 d4 cxd4 4 Nxd4 a6 5 Bd3 Qc7 6 0-0 Nf6 7 Be3 Be7
+8 Nc3 d6 9 Qf3 Nbd7 10 Qg3 0-0 11 Be2 Re8 12 Bh6 Bf8 13 Bd2 b5 14
+a3 Bb7 15 f3 Rac8 16 Kh1 d5 17 Qxc7 Rxc7 18 exd5 Nxd5 19 Bd3 Nc5
+20 Nxd5 Bxd5 21 Be2 g6 22 Bg5 Rcc8 23 Rfd1 Na4 24 Rab1 Ba2 25 Ra1
+Nxb2 26 Rxa2 Nxd1 27 Bxd1 Red8 28 Bxd8 Rxd8 29 c3 e5 30 Rd2 exd4
+31 Rxd4 Rxd4 32 cxd4 Bxa3 33 Kg1 Bb2 34 d5 Kf8 35 Kf2 Ke7 36 Ke3
+Kd6 37 Kd3 a5 38 Be2 Be5 39 Kc2 b4 40 Kb3 Bxh2 41 Ka4 Kxd5 42 Bd1
+Kd4 43 Kxa5 Bd6 44 Bb3 Ke3 45 Bxf7 Kf2 46 Bd5 Kxg2 47 Be4 Kg3 48
+Kb5 Kf4 49 Kc6 h5 50 Kxd6 h4 51 Bxg6 h3 52 Kc5 h2 53 Kxb4 h1/Q 54
+Be4 Qc1 0-1
+
+Alexander Ivanov -- Renaissance SPARC
+4th Harvard Cup (5) 1993
+1 e4 c6 2 d4 d5 3 e5 Bf5 4 h4 h5 5 c4 e6 6 Nc3 Nd7 7 cxd5 cxd5 8
+Bg5 Be7 9 Qd2 Bxg5 10 hxg5 Rc8 11 Be2 Bg6 12 Nb5 Rc2 13 Qb4 Qxg5
+14 Nf3 Qxg2 15 Rg1 Qh3 16 Nd6+ Kd8 17 Nxb7+ Kc7 18 Qd6+ Kc8 19 Ba6
+Rc7 20 Nc5+ Kd8 21 Ng5 Qf5 22 Ngxe6+ fxe6 23 Nxe6+ Qxe6 24 Qxe6
+Ne7 25 Rxg6 Rc6 26 Qxc6 Nxc6 27 Rxc6 1-0
+
+ChessSystem R30 -- Joel Benjamin
+4th Harvard Cup (5) 1993
+1 e4 c5 2 c3 d5 3 exd5 Qxd5 4 d4 Nf6 5 Nf3 Nc6 6 dxc5 Qxd1+ 7 Kxd1
+e5 8 b4 Bf5 9 Nbd2 0-0-0 10 b5 Na5 11 Nxe5 Bxc5 12 Nxf7 Ne4 13 Ke1
+Nxf2 14 Be2 Nxh1 15 Nxh8 Rxh8 16 g4 Bg6 17 a4 Nf2 18 Ba3 Re8 19
+Bxc5 Nd3+ 20 Kf1 Nxc5 21 Ra3 Rf8+ 22 Kg1 Rd8 23 Nf3 Nab3 24 c4 Nd4
+25 Nxd4 Rxd4 26 a5 Bd3 27 Bxd3 Rxd3 28 Rxd3 Nxd3 29 h3 Kc7 30 Kg2
+Kd6 31 Kf3 Ne5+ 32 Ke4 Nxc4 33 Kd4 Nxa5 0-1
+
+
+ROUND 6
+
+Kasparov's Gambit -- Patrick Wolff
+4th Harvard Cup (6) 1993
+1 d4 Nf6 2 c4 c5 3 d5 b5 4 cxb5 a6 5 bxa6 g6 6 e4 Nxe4 7 Qa4 Nf6 8
+a7 Na6 9 Nf3 Bg7 10 Bxa6 Rxa7 11 Nc3 0-0 12 Qc4 Bxa6 13 Qxc5 Qb8
+14 a4 Rc8 15 Qa3 Rb7 16 a5 Rb3 17 Qa2 Ng4 18 h3 Ne5 19 Nxe5 Bxe5
+20 f4 Bxc3+ 21 bxc3 Rbxc3 22 Bd2 Rc2 23 Qb1 Rxd2 24 Qxb8 Re2+ 0-1
+
+BattleChess 4000 SVGA -- Alexander Ivanov
+4th Harvard Cup (6) 1993
+1 d4 g6 2 Nf3 Bg7 3 c3 d6 4 e4 Nf6 5 Bd3 Nbd7 6 0-0 e5 7 Bg5 h6 8
+Bd2 0-0 9 Na3 b6 10 Re1 Bb7 11 Nb5 a6 12 Na3 Re8 13 Qc2 exd4 14
+cxd4 d5 15 e5 Ne4 16 b4 c5 17 bxc5 bxc5 18 Rab1 Qc8 19 Bf4 g5 20
+Be3 cxd4 21 Bxd4 g4 22 e6 Rxe6 23 Bxg7 gxf3 24 Qxc8+ Bxc8 25 Bd4
+Ndc5 26 Bxe4 Nxe4 27 g3 Nd2 28 Rbd1 Re2 29 Nc2 Ne4 30 Nb4 Be6 31
+a3 Rc8 32 Rc1 Rc4 33 Red1 Rxd4 34 Rxd4 Rxf2 35 Kh1 Rg2 36 Rf1 Nf2+
+37 Rxf2 Rxf2 38 h4 Re2 39 Rf4 d4 40 Nd3 Bd5 41 Kg1 Rg2+ 42 Kf1 Rd2
+43 Ne5 d3 44 Rg4+ Kf8 45 Rd4 Be6 46 Nxf3 Ra2 47 Ke1 Rxa3 48 Kd2
+Ke7 49 Rxd3 Rxd3+ 50 Kxd3 Kd6 51 Ke4 Bd5+ 52 Kf4 Bxf3 53 Kxf3 Ke5
+54 Ke3 a5 55 Kd3 Kf5 56 Kc4 Kg4 57 Kd4 Kxg3 58 h5 Kg4 59 Kd3 f5 60
+Kc4 f4 61 Kd3 a4 62 Kc3 f3 63 Kb4 f2 64 Kxa4 f1/Q 65 Kb4 Kxh5 66
+Kc5 Kg4 67 Kd5 Kf5 68 Kd4 Qd1+ 69 Kc5 Ke5 70 Kb5 Kd5 71 Kb6 Kd6 72
+Kb7 Qb3+ 73 Ka8 Kc7 0-1
+
+Socrates Exp -- Boris Gulko
+4th Harvard Cup (6) 1993
+1 e4 g6 2 d4 Bg7 3 Nf3 d6 4 Be2 Nf6 5 Nc3 0-0 6 0-0 Nc6 7 d5 Nb8 8
+Bf4 Nh5 9 Be3 e5 10 dxe6 fxe6 11 Qd2 Nc6 12 Rad1 Qe7 13 Ng5 Bd7 14
+Nb5 Rac8 15 Bxh5 gxh5 16 f4 h6 17 Nf3 Rf7 18 Kh1 a6 19 Nc3 Rcf8 20
+g3 Qf6 21 Nh4 b5 22 a3 Na5 23 Qe1 Nc4 24 Bc1 Bc6 25 Rf3 Rd7 26 b3
+Nb6 27 Rfd3 Qf7 28 Nf3 Re7 29 Be3 Nd7 30 Bf2 Nf6 31 Bd4 Ng4 32
+Bxg7 Qxg7 33 h3 Nf6 34 Kh2 Nd7 35 Nd4 Bb7 36 Re3 h4 37 f5 Ne5 38
+gxh4 Kh8 39 Rg3 Qf6 40 Nxe6 Rxe6 41 fxe6 Nf3+ 42 Rxf3 Qxf3 43 Nd5
+Rg8 44 Qc3+ Qxc3 45 Nxc3 Re8 46 Nd5 Rxe6 47 Nxc7 Rxe4 48 Rxd6 Re2+
+49 Kg3 Rxc2 50 Nxa6 Rc3+ 51 Kg4 Bxa6 52 Rxh6+ Kg7 53 Rxa6 Rxb3 54
+h5 b4 55 h6+ Kh7 56 a4 Rc3 57 Rb6 Rc4+ 58 Kf3 b3 59 a5 Ra4 60 a6
+b2 61 Rxb2 Rxa6 62 Rb4 Kxh6 63 Kg4 Rc6 64 h4 Ra6 65 h5 Rc6 66 Re4
+Ra6 67 Rc4 Rb6 68 Ra4 Rc6 69 Rd4 Rb6 70 Rc4 Ra6 71 Re4 Rb6 72 Rf4
+Rc6 73 Rb4 Rd6 74 Rh4 Rc6 75 Rd4 Rb6 76 Rc4 Ra6 77 Re4 Rb6 78 Ra4
+Rc6 79 Kg4 Rb6 80 Rd4 Rc6 81 Rf4 1/2-1/2
+
+Michael Rohde -- M-Chess Professional 3.42
+4th Harvard Cup (6) 1993
+1 Nf3 d5 2 c4 e6 3 d4 Nf6 4 Nc3 c5 5 cxd5 exd5 6 g3 Nc6 7 Bg2 Be7
+8 0-0 0-0 9 Bg5 cxd4 10 Nxd4 Re8 11 Rc1 Bg4 12 h3 Bd7 13 Nb3 Be6
+14 e3 Rc8 15 Qd2 Ne4 16 Nxe4 Bxg5 17 Nxg5 Qxg5 18 Rfd1 Qh5 19 Kh2
+Bg4 20 Re1 Bf3 21 Nd4 Bxg2 22 Kxg2 f6 23 Rc5 Nxd4 24 Qxd4 Rxc5 25
+Qxc5 b6 26 Qd4 Re4 27 Qd3 Ra4 28 Rc1 Rxa2 29 Rc8+ Kf7 30 Rc7+ Kf8
+31 Qb3 Ra5 32 Qb4+ Rc5 33 Rxc5 bxc5 34 Qxc5+ Kg8 35 Qxa7 Qe8 36
+Qd4 Qb5 37 b4 Kf7 38 Qa7+ Kf8 39 Qa5 Qb7 40 Qc5+ Ke8 41 Kf1 Qd7 42
+h4 Qh3+ 43 Ke1 Qh1+ 44 Ke2 Qe4 45 b5 Qg4+ 46 Ke1 Qd7 47 b6 h6 48
+Kd2 g6 49 Kc3 h5 50 Kb4 Qb7 51 Qd6 Qc8 52 Qxd5 Ke7 53 Qc5+ Kd7 54
+Qxc8+ Kxc8 55 e4 1-0
+
+Joel Benjamin -- Renaissance SPARC
+4th Harvard Cup (6) 1993
+1 d4 d5 2 c4 c6 3 Nc3 Nf6 4 e3 e6 5 Nf3 Nbd7 6 Bd3 Bd6 7 e4 dxe4 8
+Nxe4 Nxe4 9 Bxe4 0-0 10 0-0 c5 11 Bc2 Qb6 12 Qd3 g6 13 Be3 Be7 14
+Rad1 Qxb2 15 Rb1 Qxa2 16 Ra1 Qxa1 17 Rxa1 Rd8 18 dxc5 Nxc5 19 Qc3
+Bd7 20 Ne5 f5 21 Bxc5 Bxc5 22 Nxd7 Rxd7 23 Qe5 Bd4 24 Qxe6+ Rf7 25
+Rd1 Rd8 26 c5 Rdd7 27 Rxd4 Rde7 28 Bb3 Rxe6 29 Bxe6 1-0
+
+Ilya Gurevich -- ChessSystem R30
+4th Harvard Cup (6) 1993
+1 e4 e5 2 Nf3 Nc6 3 Bb5 a6 4 Ba4 Nf6 5 0-0 Be7 6 Re1 b5 7 Bb3 0-0
+8 d4 Nxd4 9 Nxd4 exd4 10 e5 Ne8 11 c3 dxc3 12 Nxc3 Bb7 13 Nd5 d6
+14 e6 f5 15 Bf4 Nf6 16 Nxe7+ Qxe7 17 Rc1 Rae8 18 Qd4 Ne4 19 Qa7 c5
+20 Rxe4 fxe4 21 Bxd6 Qxd6 22 e7+ c4 23 exf8/Q+ Rxf8 24 Rd1 Qf6 25
+Bc2 Qxb2 26 Bb1 c3 27 Qc5 Qe2 28 Rf1 Qd2 29 Qe5 c2 30 Qe6+ Kh8 31
+Bxc2 Qxc2 32 Qe7 Qc8 33 h3 Bd5 34 a3 Qf5 35 Qa7 Bc4 36 Rd1 Bd3 37
+Rc1 Qf6 38 Qe3 a5 39 Rc7 b4 40 axb4 axb4 41 Rb7 Qc3 42 Qb6 Qa1+ 43
+Kh2 Qe5+ 44 Kg1 Qc3 45 Kh2 h6 46 h4 Qe5+ 47 Kg1 Rc8 48 g3 Qa1+ 49
+Kh2 Rc1 50 Kh3 Rh1+ 51 Kg4 Qe5 0-1
+
diff --git a/programs/minimax.bib b/programs/minimax.bib
new file mode 100644
index 0000000..6723d69
--- /dev/null
+++ b/programs/minimax.bib
@@ -0,0 +1,1338 @@
+@STRING{header = "
+-----------------------------------------------------------------------------
+File: minimax.bib
+Version: V01-005 of April 2nd, 1993
+Author: Claude G. Diderich
+ 30, Avenue S.Reymondin, CH-1009 Pully, Switzerland, Europe
+Copyright: (c) 1992..93 by Claude G. Diderich, Switzerland
+ Non commercial usage permitted as long as the above copyright no-
+ tice is included.
+Note: Please send all modifications and additions to this file to
+ [email protected] indicates if a copy of the article
+ is available to me (If you have a copy of an article marked NO,
+ I would be gratefull if you could send me a copy of it).Any other
+ indication in the AVAILABLE field are for personal use of the
+ author.
+Thanks: I would like to thank the following persons (in alphabetical or-
+MONTH der) for their contributions:
+ David Barnard <[email protected]>,
+ Bruno Charlier <[email protected]>
+ Van-Dat Cung <[email protected]>,
+ Rainer Feldmann <[email protected]>,
+ Marc Gengler <[email protected]>,
+ Rattikorn Hewett <[email protected]>,
+ Toshihide Ibaraki <[email protected]>,
+ L. V. Kale <[email protected]>,
+ Richard E. Korf <[email protected]>,
+ Bradley C. Kuszmauk <[email protected]>,
+ T. A. Marsland <[email protected]>,
+ Judea Pearl <[email protected]>,
+ Wim Pijls <[email protected]>,
+ Udo Sprute <[email protected]>
+-----------------------------------------------------------------------------
+"}
+
+@STRING{artint = "Artificial Intelligence"}
+@STRING{ieeetoc = "{IEEE} Transactions on Computers"}
+@STRING{ieeetopami = "{IEEE} Transactions on Pattern Analysis and
+ Machine Intelligence"}
+@STRING{ijprai = "International Journal of Pattern
+ Recognition and Artificial Intelligence"}
+@STRING{iccaj = "ICCA Journal"}
+@STRING{jalgo = "Journal of Algorithms"}
+@STRING{jpdc = "Journal of Parallel and Distributed Computing"}
+@STRING{parcomp = "Parallel Computing"}
+@STRING{infocon = "Information and Control"}
+@STRING{spex = "Software: Practice and Experience"}
+
+@INPROCEEDINGS{Abra88,
+ AUTHOR = "Bruce Abramson and Richard E. Korf",
+ TITLE = "A Model of Two-player Evaluation Functions",
+ BOOKTITLE = "Proceedings of the Sixth National Conference on Artificial
+ Intelligence (AAAI-87)",
+ ADDRESS = "Seattle, WA",
+ YEAR = 1987,
+ MONTH = Jul,
+ PAGES = "90--94",
+ AVAILABLE = "ETHICS"
+}
+
+@ARTICLE{Abra89,
+ AUTHOR = "Bruce Abramson",
+ TITLE = "Control Strategies for Two-Player Games",
+ JOURNAL = acmcs,
+ VOLUME = 21,
+ NUMBER = 2,
+ PAGES = "137--161",
+ MONTH = Jun,
+ YEAR = 1989
+}
+
+
+@TECHREPORT{Akl79,
+ AUTHOR = "Selim G. Akl and David T. Barnard and Ralph J. Doran",
+ TITLE = "Searching Game Trees in Parallel",
+ INSTITUTION = "Queen's University, Department of Computing and
+ Information Science",
+ YEAR = 1979,
+ MONTH = Nov,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@INPROCEEDINGS{Akl80,
+ AUTHOR = "Selim G. Akl and David T. Barnard and Ralph J. Doran",
+ TITLE = "Simulation and Analysis in Deriving Time and Storage
+ Requirements for a Parallel Alpha-beta Algorithm",
+ BOOKTITLE = "International Conference on Parallel Processing",
+ PAGES = "231--234",
+ YEAR = 1980,
+ AVAILABLE = "ETHICS"
+}
+
+@ARTICLE{Akl82,
+ AUTHOR = "Akl, Selim G. and Barnard, David T. and Doran, Ralph J.",
+ TITLE = "Design, Analysis, and Implementation of a Parallel Tree
+ Search Algorithm",
+ JOURNAL = ieeetopami,
+ YEAR = 1982,
+ VOLUME = "PAMI-4",
+ NUMBER = 2,
+ MONTH = Mar,
+ PAGES = "192--203"
+}
+
+@INBOOK{Akl89,
+ AUTHOR = "Selim G. Akl",
+ TITLE = "The Design and Analysis of Parallel Algorithms",
+ CHAPTER = "12 -- Traversing Combinatorial Spaces",
+ PAGES = "310--340",
+ PUBLISHER = "Prentice Hall",
+ ADDRESS = "Englewood Cliffs, NJ",
+ YEAR = 1989,
+ AVAILABLE = "EPFL-BC"
+}
+
+@TECHREPORT{Almq88,
+ AUTHOR = "Kenneth Almquist and Neil McKenzie and Kenneth Sloan",
+ TITLE = "An Inquiry into Parallel Algorithms for Searching
+ Game Trees",
+ INSTITUTION = "University of Washington, Department of Computer Science",
+ ADDRESS = "Seattle, WA",
+ YEAR = 1988,
+ MONTH = Dec,
+ NUMBER = "88-12-03"
+}
+
+@TECHREPORT{Alth88,
+ AUTHOR = {Ingo Alth\"ofer},
+ TITLE = "A Parallel Game Tree Search Algorithm with a Linear
+ Speedup",
+ YEAR = 1988,
+ MONTH = Dec,
+ NOTE = "submitted to Journal of Algorithms, accepted 1992",
+ INSTITUTION = {University of Bielefeld, Faculty for Mathematics},
+ ADDRESS = "Bielefeld, Germany"
+}
+
+@ARTICLE{Alth90,
+ AUTHOR = {Ingo Alth\"ofer},
+ TITLE = "An Incremental Negamax Algorithm",
+ JOURNAL = artint,
+ YEAR = 1990,
+ VOLUME = 43,
+ PAGES = "57--65"
+}
+
+@ARTICLE{Alth91,
+ AUTHOR = {Ingo Alth\"ofer and Bernhard Balkenhol},
+ TITLE = "A Game Tree with Distinct Leaf Values which is easy
+ for the Alpha-beta Algorithm",
+ JOURNAL = artint,
+ PAGES = "183--190",
+ VOLUME = 52,
+ YEAR = 1991,
+ AVAILABLE = "EPFL-DMA"
+}
+
+@PHDTHESIS{Amig91,
+ AUTHOR = "Claude Amiguet",
+ TITLE = "Contr\^oleurs Distribu\'es pour la Programmation
+ Heuristique",
+ SCHOOL = "Swiss Federal Institute of Technology, Department of
+ Computer Science",
+ NUMBER = 910,
+ ADDRESS = "Lausanne, Switzerland",
+ YEAR = 1991,
+ NOTE = "In french"
+}
+
+@INPROCEEDINGS{Bal86a,
+ AUTHOR = "Henri E. Bal and Robbert {van Renesse}",
+ TITLE = "Parallel Alpha-Beta Search",
+ BOOKTITLE = "Proceedings NGI-SION Symposium Stimulerende Informatica",
+ ADDRESS = "Utrecht, Netherlands",
+ PAGES = "379--385",
+ MONTH = Apr,
+ YEAR = 1986,
+ AVAILABLE = "EPFL-LITH"
+}
+
+@ARTICLE{Ball86b,
+ AUTHOR = "Henri E. Bal and Robbert {van Renesse}",
+ TITLE = "A Summary of Parallel Alpha-Beta Search Results",
+ JOURNAL = iccaj,
+ YEAR = 1986,
+ VOLUME = 9,
+ NUMBER = 3,
+ PAGES = "146--149",
+ MONTH = Sep,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Ball83,
+ AUTHOR = "Bruce W. Ballard",
+ TITLE = "The *-Minimax Search Procedure for Trees Containing Chance
+ Nodes",
+ JOURNAL = artint,
+ VOLUME = 21,
+ PAGES = "327--350",
+ YEAR = 1983
+}
+
+@ARTICLE{Baud78a,
+ AUTHOR = "G\'erard M. Baudet",
+ TITLE = "On the Branching Factor of the Alpha-Beta Pruning
+ Algorithm",
+ JOURNAL = artint,
+ VOLUME = 10,
+ PAGES = "173--199",
+ YEAR = 1978
+}
+
+@PHDTHESIS{Baud78b,
+ AUTHOR = "G\'erard M. Baudet",
+ TITLE = "The Design and Analysis of Algorithms for Asynchronous
+ Multiprocessors",
+ SCHOOL = "Carnegie Mellon University",
+ YEAR = 1978,
+ NUMBER = "CMU-CS-78-116",
+ ADDRESS = "Pittsburgh, PA",
+ AVAILABLE = "ETHICS MICROFICHES"
+}
+
+@INBOOK{Beal80,
+ AUTHOR = "D. F. Beal",
+ CHAPTER = "An Analysis of Minimax",
+ TITLE = "Advances in Computer Chess 2",
+ YEAR = 1980,
+ NOTE = "Editor: M. R. B. Clarke",
+ PAGES = "103--109",
+ PUBLISHER = "Edinburgh University Press.",
+ AVAILABLE = "ETHICS"
+}
+
+@PHDTHESIS{Berl75,
+ AUTHOR = "Hans Jack Berliner",
+ TITLE = "Chess as Problem Solving",
+ SCHOOL = "Carnegie Mellon University",
+ YEAR = 1975,
+ ADDRESS = "Pittsburgh, PA",
+ AVAILABLE = "ETHICS MICROFICHES"
+}
+
+@ARTICLE{Berl89,
+ AUTHOR = "Hans Jack Berliner and Carl Eberling",
+ TITLE = "Pattern Knowledge and Search: {T}he {SUPREME}
+ Architecture",
+ JOURNAL = artint,
+ YEAR = 1989,
+ VOLUME = 38,
+ NUMBER = 2,
+ PAGES = "161--198"
+}
+
+@ARTICLE{Berl90,
+ AUTHOR = "Hans Jack Berliner and Gordon Goetsch and
+ Murray S. Campbell and Carl Ebeling",
+ TITLE = "Measuring the Performance Potential of Chess Programs",
+ JOURNAL = artint,
+ YEAR = 1990,
+ VOLUME = 43,
+ NUMBER = 1,
+ MONTH = Apr,
+ PAGES = "7--21",
+ AVAILABLE = "EPFL-DMA"
+}
+
+@TECHREPORT{Bohm89,
+ AUTHOR = {Max B\"ohm and Ewald Speckenmeyer},
+ TITLE = "A Dynamic Processor Tree for Solving Game Trees in
+ Parallel",
+ INSTITUTION = "University of Dortmund, Fachbereich Informatik",
+ ADDRESS = "Dortmund, Germany",
+ YEAR = 1989,
+ AVAILABLE = "Also in: Proceedings SOR '89"
+}
+
+@TECHREPORT{Bord90,
+ AUTHOR = "Andrei Z. Broder and Anna R. Karlin and Prabhakar
+ Raghavan and Eli Upfal",
+ TITLE = "On the Parallel Complexity of Evaluating Game-Trees",
+ INSTITUTION = "IBM Research Division",
+ NUMBER = "RR RJ 7729",
+ MONTH = Oct,
+ YEAR = 1990,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@INBOOK{Brat82,
+ AUTHOR = "I. Bratko and M. Gams",
+ CHAPTER = "Error Analysis of the Minimax Principle",
+ TITLE = "Advances in Computer Chess 3",
+ YEAR = 1982,
+ NOTE = "Editor: M. R. B. Clarke",
+ PAGES = "1--15",
+ PUBLISHER = "Pergamon Press",
+ AVAILABLE = "ETHICS"
+}
+
+@ARTICLE{Camp83,
+ AUTHOR = "Murray S. Campbell and T. A. Marsland",
+ TITLE = "A Comparison of Minimax Tree Search Algorithms",
+ JOURNAL = artint,
+ VOLUME = 20,
+ PAGES = "347--367",
+ YEAR = 1983
+}
+
+@ARTICLE{Chak92,
+ AUTHOR = "P. P. Chakrabarti and S. Ghose",
+ TITLE = "A General Best First Search Algorithm in And/Or Graphs",
+ JOURNAL = jalgo,
+ VOLUME = 13,
+ NUMBER = 2,
+ PAGES = "177-187",
+ MONTH = Jun,
+ YEAR = 1992,
+ AVAILABLE = "EPFL-DMA"
+}
+
+@TECHREPORT{Cung91,
+ AUTHOR = "Van-Dat Cung and Catherine Roucairol",
+ TITLE = "Parallel Minimax Tree Searching",
+ INSTITUTION = "INRIA",
+ TYPE = "RR",
+ NUMBER = 1549,
+ YEAR = 1991,
+ MONTH = Nov,
+ NOTE = "In French, will appear in English"
+}
+
+@ARTICLE{Darw83,
+ AUTHOR = "Nevin M. Darwish",
+ TITLE = "A Quantitative Analysis of the Alpha-Beta Pruning
+ Algorithm",
+ JOURNAL = artint,
+ VOLUME = 21,
+ PAGES = "405--433",
+ YEAR = 1983
+}
+
+@TECHREPORT{Dide92,
+ AUTHOR = "Claude G. Diderich",
+ TITLE = "Evaluation des Performances de l'Algorithme {SSS*} avec
+ Phases de Synchronisation sur une Machine Parall\`ele \`a
+ M\'emoires Distribu\'ees",
+ ADDRESS = "Lausanne, Switzerland",
+ INSTITUTION = "Swiss Federal Institute of Technology, Department of
+ Computer Science, Laboratory for Theoretical Computer
+ Science",
+ MONTH = Jun,
+ YEAR = 1992,
+ NOTE = "In french",
+ AVAILABLE = "Contact <[email protected]> for a copy"
+}
+
+@MASTERSTHESIS{Feld87,
+ AUTHOR = "Rainer Feldmann and Peter Mysliwietz",
+ TITLE = "{Parallele Spielbaumsuche}",
+ NOTE = "Diplomarbeit, In german",
+ SCHOOL = "University of Paderborn",
+ ADDRESS = "Paderborn, Germany",
+ YEAR = 1987,
+ MONTH = Dec
+}
+
+@ARTICLE{Feld89,
+ AUTHOR = "Rainer Feldmann and Burkhard Monien and Peter Mysliwietz and
+ Oliver Vornberger",
+ TITLE = "Distributed Game Tree Search",
+ JOURNAL = iccaj,
+ VOLUME = 12,
+ NUMBER = 2,
+ YEAR = 1989,
+ PAGES = "65--73",
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@INPROCEEDINGS{Feld90a,
+ AUTHOR = "Rainer Feldmann and Burkhard Monien and Peter Mysliwietz and
+ Oliver Vornberger",
+ TITLE = "Distributed Game Tree Search",
+ BOOKTITLE = "Parallel Algorithms for Machine Intelligence and Vision",
+ EDITOR = "Vipin Kumar, P. S. Gopalakrishnan, Laveen N. Kanal",
+ PUBLISHER = "Springer-Verlag",
+ PAGES = "66--101",
+ YEAR = 1990,
+ AVAILABLE = "EPFL-BC"
+}
+
+@INBOOK{Feld90b,
+ AUTHOR = "Rainer Feldmann and Peter Mysliwietz and Burkhard Monien",
+ TITLE = "Advances in Computer Chess 6",
+ CHAPTER = "1 --- A Fully Distributed Chess Program",
+ PAGES = "1--27",
+ PUBLISHER = "Ellis Horwood",
+ YEAR = 1990,
+ AVAILABLE = "ETHICS",
+ NOTE = "Editor: D. Beal",
+}
+
+@INPROCEEDINGS{Feld90c,
+ AUTHOR = "Rainer Feldmann, Peter Mysliwietz, Burkhard Monien",
+ TITLE = "{Spielbaumsuche auf einem Transputernetzwerk}",
+ BOOKTITLE = "Parallel - Algorithmen und -Rechnerstrukturen (PARS),
+ Workshop Sprachen und Systeme zur Parallelverarbeitung",
+ PUBLISHER = {Gesellschaft f\"ur Informatik},
+ YEAR = 1990,
+ MONTH = Jan,
+ NOTE = "In german"
+}
+
+@INPROCEEDINGS{Feld91a,
+ AUTHOR = "Rainer Feldmann and Peter Mysliwietz and Burkhard Monien",
+ TITLE = "Distributed Game Tree Search on a Massively
+ Parallel System",
+ BOOKTITLE = "Data structures and efficient algorithms: Final
+ report on the {DFG} special joint initiative",
+ PUBLISHER = "Springer-Verlag",
+ EDITOR = "B. Monien, Th. Ottmann",
+ PAGES = "270--288",
+ VOLUME = "LNCS 594",
+ MONTH = Sep,
+ YEAR = 1991,
+ AVAILABLE = "EPFL-BC"
+}
+
+@INPROCEEDINGS{Feld91b,
+ AUTHOR = "Rainer Feldmann and Peter Mysliwietz and Burkhard Monien",
+ TITLE = "Experiments with a Fully Distributed Chess Program",
+ BOOKTITLE = "Heuristic Programming in Artificial Intelligence 3",
+ EDITOR = "J. van den Herik, V. Allis",
+ YEAR = 1991,
+ PAGES = "72--87",
+ NOTE = "Also in: Tech.Report, University Paderborn,
+ Paderborn, Germany"
+
+}
+
+@INPROCEEDINGS{Felt88,
+ AUTHOR = "E. W. Felten and S. W. Otto",
+ TITLE = "Chess on a Hypercube",
+ BOOKTITLE = "The Third Conference on Hypercube Concurrent
+ Computers and Applications",
+ EDITOR = "Geoffrey Fox",
+ PAGES = "1329--1341",
+ VOLUME = "II-Applications",
+ YEAR = 1988,
+ ADDRESS = "Passadena, CA",
+ AVAILABLE = "ETHICS"
+}
+
+@INPROCEEDINGS{Ferg88,
+ AUTHOR = "C. Ferguson and Richard E. Korf",
+ TITLE = "Distributed Tree Search and its application to
+ alpha-beta pruning",
+ BOOKTITLE = "Proceedings of the Seventh National Conference Artificial
+ Intelligence (AAAI-88)",
+ ADDRESS = "Minneapolis, MN",
+ YEAR = 1988,
+ MONTH = Aug,
+ PAGES = "128--132",
+ AVAILABLE = "ETHICS"
+}
+
+@INPROCEEDINGS{Fink80,
+ AUTHOR = "Raphael A. Finkel and John P. Fishburn",
+ TITLE = "Parallel Alpha-Beta Search on Arachne",
+ BOOKTITLE = "IEEE International Conference on Parallel Processing",
+ PAGES = "235--243",
+ YEAR = 1980,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Fink82,
+ AUTHOR = "Raphael A. Finkel and John P. Fishburn",
+ TITLE = "Parallelism in Alpha-Beta Search",
+ JOURNAL = artint,
+ YEAR = 1982,
+ VOLUME = 19,
+ PAGES = "89--106"
+}
+
+@ARTICLE{Fink83,
+ AUTHOR = "Raphael A. Finkel and John P. Fishburn",
+ TITLE = "Improved Speedup Bounds for Parallel Alpha-Beta Search",
+ JOURNAL = ieeetopami,
+ YEAR = 1983,
+ VOLUME = "PAMI-5",
+ NUMBER = 1,
+ PAGES = "89--92"
+}
+
+@INBOOK{Fish84,
+ AUTHOR = "John P. Fishburn",
+ TITLE = "Analysis of Speedup in Distributed Algorithms",
+ CHAPTER = "4 -- {P}arallel Alpha-Beta Search",
+ PAGES = "11-54",
+ PUBLISHER = "UMI Research Press",
+ YEAR = 1984,
+ VOLUME = 14,
+ SERIES = "Computer Science: Distributed Database Systems",
+ NOTE = "Revision of thesis (PhD) -- University of Wisconsin,
+ Madison, 1981"
+}
+
+@TECHREPORT{Full73,
+ AUTHOR = "S. H. Fuller and J. G. Gaschnig and J. J. Gillogly",
+ TITLE = "An Analysis of the Alpha-beta Pruning Algorithm",
+ ADDRESS = "Pittsburgh",
+ INSTITUTION = "Carnegie-Mellon University, Department of Computer Science",
+ MONTH = Jul,
+ YEAR = 1973,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@INPROCEEDINGS{Hewe92,
+ AUTHOR = "R. Hewett and K. Ganesan",
+ TITLE = "Consistent Linear Speedup in Parallel Alpha-Beta Search",
+ BOOKTITLE = "ICCI'92, Computing and Information",
+ PUBLISHER = "IEEE Computer Society Press",
+ PAGES = "237--240",
+ YEAR = 1992,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Hiro87,
+ AUTHOR = "Usui Hiromoto and Yamashita Masafumi and Imai Masaharu and
+ Ibaraki, Toshihide",
+ TITLE = "Parallel Searches of Game Trees",
+ JOURNAL = "Systems and Computers in Japan",
+ NUMBER = "8",
+ PAGES = "97--109",
+ VOLUME = 18,
+ YEAR = 1987,
+ AVAILABLE = "ETHICS"
+}
+
+@ARTICLE{Hora90,
+ AUTHOR = "Helmut Horacek",
+ TITLE = "Reasonning with Uncertainty in Computer Chess",
+ JOURNAL = artint,
+ YEAR = 1990,
+ VOLUME = 43,
+ PAGES = "37--56"
+}
+
+@INBOOK{Hsu89,
+ AUTHOR = "Feng-Hsiung Hsu and T. S. Anantharaman and
+ Murray S. Campbell and A. Nowatzyk",
+ TITLE = "Computers, Chess, and Cognition",
+ CHAPTER = "5 Deep Thought",
+ PAGES = "55--78",
+ YEAR = 1990,
+ PUBLISHER = "Springer Verlag",
+ AVAILABLE = "ETHICS"
+}
+
+@PHDTHESIS{Hsu90,
+ AUTHOR = "Feng-Hsiung Hsu",
+ TITLE = "Large Scale Parallelization of Alpha-Beta Search: An
+ Algorithmic and Architectural Study with Computer Chess",
+ SCHOOL = "Carnegie Mellon University",
+ MONTH = Feb,
+ YEAR = 1990,
+ NUMBER = "CMU-CS-90-108",
+ ADDRESS = "Pittsburgh, PA"
+}
+
+@ARTICLE{Hunt88,
+ AUTHOR = "Matthew M. Huntbach and F. Warren Burton",
+ TITLE = "Alpha-Beta Search on Virtual Tree Machines",
+ JOURNAL = "Information Sciences",
+ PAGES = "3--17",
+ VOLUME = 44,
+ YEAR = 1988,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Hyat89,
+ AUTHOR = "R. M. Hyatt and B. W. Suter",
+ TITLE = "A Parallel Alpha/Beta Tree Searching Algorithm",
+ JOURNAL = "Parallel Computing",
+ PAGES = "299--308",
+ VOLUME = 10,
+ YEAR = 1989,
+ AVAILABLE = "EPFL-BC"
+}
+
+@ARTICLE{Ibar86,
+ AUTHOR = "Toshihide Ibaraki",
+ TITLE = "Generalization of Alpha-Beta and {SSS*} Search Procedures",
+ JOURNAL = artint,
+ YEAR = 1986,
+ VOLUME = 29,
+ PAGES = "73--117"
+}
+
+@INPROCEEDINGS{Ibar87,
+ AUTHOR = "Toshihide Ibaraki",
+ TITLE = "Game Solving Procedure {H*} is Unsurpassed",
+ BOOKTITLE = "Discrete Algorithms and Complexity",
+ EDITOR = "D. S. Johnson and al.",
+ PAGES = "185--200",
+ YEAR = 1987,
+ PUBLISHER = "Academic Press, Inc.",
+ AVAILABLE = "ETHICS"
+}
+
+@INPROCEEDINGS{Ibar91a,
+ AUTHOR = "Toshihide Ibaraki",
+ TITLE = "Search Algorithms for Minimax Game Trees",
+ BOOKTITLE = "Comference: Twenty Years NP-Completeness",
+ ADDRESS = "Sicily, Italy",
+ MONTH = Jun,
+ YEAR = 1991,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Ibar91b,
+ AUTHOR = "Toshihide Ibaraki and Yoshiroh Katoh",
+ TITLE = "Searching Minimax Game Trees Under Memory Space Constraint",
+ JOURNAL = "Annals of Mathematics and Artificial Intelligence",
+ PAGES = "141--153",
+ VOLUME = 1,
+ YEAR = 1990,
+ AVAILABLE = "ETHICS"
+}
+
+@ARTICLE{Kain91,
+ AUTHOR = "Kaindl, Hermann and Shams, Reza and Horacek, Helmut",
+ TITLE = "Minimax Search Algorithms with and without Aspiration
+ Windows",
+ JOURNAL = ieeetopami,
+ YEAR = 1991,
+ VOLUME = "PAMI-13",
+ NUMBER = 12,
+ MONTH = Dec,
+ PAGES = "1225--1235"
+}
+
+@INPROCEEDINGS{Karp89,
+ AUTHOR = "Richard M. Karp and Yanjun Zhang",
+ TITLE = "On parallel evaluation of game trees",
+ BOOKTITLE = "First ACM Annual symposium on parallel algorithms and
+ architectures (SPAA'89)",
+ PUBLISHER = "ACM",
+ ADDRESS = "New York, NY",
+ PAGES = "409--420",
+ YEAR = 1989,
+ AVAILABLE = "ETHICS"
+}
+
+@ARTICLE{Kato88,
+ AUTHOR = "Y. Katoh and Toshihide Ibaraki",
+ TITLE = "Game Solving Procedure {SSS*} is Unsurpassed",
+ JOURNAL = "Systems and computers in Japan",
+ YEAR = 1988,
+ VOLUME = 19,
+ NUMBER = 7,
+ PAGES = "93-103",
+ AVAILABLE = "ETHICS"
+}
+
+@MASTERSTHESIS{Klei90,
+ AUTHOR = "Theo Klein Paste and Patrick {van der Laag}",
+ TITLE = "An Analysis of the {SSS*} Algorithm",
+ SCHOOL = "Erasmus University Rotterdam",
+ ADDRESS = "Rotterdam, NL",
+ YEAR = 1990,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Knut75,
+ AUTHOR = "Donald E. Knuth and Ronald W. Moore",
+ TITLE = "An Analysis of Alpha-Beta Pruning",
+ JOURNAL = artint,
+ VOLUME = 6,
+ NUMBER = 4,
+ PAGES = "293--326",
+ YEAR = 1975
+}
+
+@ARTICLE{Korf85,
+ AUTHOR = "Richard E. Korf",
+ TITLE = "Iterative Deepening: {An} Optimal Admissible Tree Search",
+ JOURNAL = artint,
+ VOLUME = 27,
+ YEAR = 1985,
+ PAGES = "97--109",
+ AVAILABLE = "EPFL-DMA"
+}
+
+@INPROCEEDINGS{Korf89,
+ AUTHOR = "Richard E. Korf",
+ TITLE = "Generalized Game Trees",
+ BOOKTITLE = "Proceedings of the International Joint Conference on
+ Artificial Intelligence (IJCAI-89)",
+ ADDRESS = "Detroit, MI",
+ YEAR = 1989,
+ MONTH = Aug,
+ PAGES = "328--333",
+ AVAILABLE = "ETHICS"
+}
+
+@ARTICLE{Korf90,
+ AUTHOR = "Richard E. Korf",
+ TITLE = "Depth-Limited Search for Real-Time Problem Solving",
+ JOURNAL = "The Journal of Real-Time Systems",
+ PAGES = "7--24",
+ YEAR = 1990,
+ AVAILABLE = "EPFL-LITH"
+}
+
+@ARTICLE{Korf91,
+ AUTHOR = "Richard E. Korf",
+ TITLE = "Multi-Player alpha-beta pruning",
+ JOURNAL = artint,
+ MONTH = Feb,
+ NUMBER = 1,
+ YEAR = 1991,
+ VOLUME = 48,
+ PAGES = "99--111",
+ AVAILABLE = "EPFL-DMA"
+}
+
+@PHDTHESIS{Kraa90,
+ AUTHOR = "H.-J. Kraas",
+ TITLE = "Zur {Parallelisierung} des {SSS*-Algorithmus}",
+ SCHOOL = "University of Braunschweig",
+ ADDRESS = "Braunschweig, Germany",
+ YEAR = 1990,
+ NOTE = "In german, \Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Kuma83,
+ AUTHOR = "Vipin Kumar and Laveen N. Kanal",
+ TITLE = "A General Branch and Bound Formulation for Understanding
+ and Synthesizing And/Or Tree Search Procedures",
+ JOURNAL = artint,
+ PAGES = "179--198",
+ VOLUME = 21,
+ YEAR = 1983,
+ AVAILABLE = "EPFL-DMA"
+}
+
+@ARTICLE{Kuma84,
+ AUTHOR = "Vipin Kumar and Laveen N. Kanal",
+ TITLE = "Parallel Branch-and-Bound Formulations for
+ {AND/OR} Tree Search",
+ JOURNAL = ieeetopami,
+ MONTH = Nov,
+ NUMBER = 6,
+ PAGES = "768--778",
+ VOLUME = "PAMI-6",
+ YEAR = 1984,
+ AVAILABLE = "EPFL-BC"
+}
+
+@INPROCEEDINGS{Kuma88,
+ AUTHOR = "Vipin Kumar and Laveen N. Kanal",
+ TITLE = "A General Branch and Bound Formulation for And/Or Graph
+ and Game Tree Search",
+ BOOKTITLE = "Search in Artificial Intelligence",
+ PUBLISHER = "Springer Verlag",
+ YEAR = 1988,
+ AVAILABLE = "ETHICS"
+}
+
+@INPROCEEDINGS{Leif85,
+ AUTHOR = "Daniel B. Leifker and Laveen N. Kanal",
+ TITLE = "A Hybrid {SSS*}/Alpha-Beta Algorithm for Parallel
+ Search of Game Trees",
+ BOOKTITLE = "Proceedings of the International Joint Conference on
+ Artificial Intelligence (IJCAI-85)",
+ PAGES = "1044--1046",
+ YEAR = 1985,
+ AVAILABLE = "ETHICS"
+}
+
+@ARTICLE{Leve92,
+ AUTHOR = "Willem G. Levelt and M. Frans Kaashoek and Henri E.
+ Bal and Andrew S. Tanenbaum",
+ TITLE = "A Comparison of Two Paradigms for Distributed
+ Shared Memory",
+ JOURNAL = spex,
+ VOLUME = 22,
+ NUMBER = 11,
+ MONTH = Nov,
+ YEAR = 1992,
+ PAGES = "985--1010"
+}
+
+@ARTICLE{Li90,
+ AUTHOR = "Liwu Li and T. A. Marsland",
+ TITLE = "Probability-Based Game Tree Pruning",
+ JOURNAL = jalgo,
+ YEAR = 1990,
+ MONTH = Mar,
+ NUMBER = 1,
+ VOLUME = 11,
+ PAGES = "27--43",
+ AVAILABLE = "EPFL-DMA"
+}
+
+@TECHREPORT{Lind83,
+ AUTHOR = "Gary Lindstrom",
+ TITLE = "The Key Node Method: A Highly-Parallel Alpha-Beta
+ Algorithm",
+ ADDRESS = "Salt Lake City",
+ INSTITUTION = "University of Utah, Department of Computer Science",
+ MONTH = Mar,
+ NUMBER = "UUCS 83-101",
+ YEAR = 1983,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@MASTERSTHESIS{Low91,
+ AUTHOR = "Chin-Chau Low",
+ TITLE = "Parallel Game Tree Searching with Lower and Upper Bounds",
+ SCHOOL = "University of Illinois at Urbana Campaign",
+ ADDRESS = "IL",
+ YEAR = 1991,
+ ADVISOR = "L.V.Kale"
+}
+
+@ARTICLE{Mars82,
+ AUTHOR = "T. A. Marsland and Murray S. Campbell",
+ TITLE = "Parallel Search of Strongly Ordered Game Trees",
+ JOURNAL = acmcs,
+ VOLUME = 14,
+ NUMBER = 4,
+ PAGES = "533--551",
+ MONTH = Dec,
+ YEAR = 1982
+}
+
+@INPROCEEDINGS{Mars83a,
+ AUTHOR = "T. A. Marsland",
+ TITLE = "Relative Efficiency of Alpha-Beta Implementations",
+ BOOKTITLE = "Proceedings of the International Joint Conference on
+ Artificial Intelligence (IJCAI-83)",
+ YEAR = 1983,
+ PAGES = "763--766",
+ ADDRESS = "Karlsruhe, Germany",
+ MONTH = Aug,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@TECHREPORT{Mars83b,
+ AUTHOR = "T. A. Marsland and Fred Popowich",
+ TITLE = "Multiprocessor Tree Searching System Design",
+ INSTITUTION = "University of Alberta, Department of Computer Science",
+ YEAR = 1983,
+ NUMBER = "TR 83-06",
+ ADDRESS = "Edmonton, Canada",
+ MONTH = Jul
+}
+
+@ARTICLE{Mars85,
+ AUTHOR = "T. A. Marsland and Fred Popowich",
+ TITLE = "Parallel Game-Tree Search",
+ JOURNAL = ieeetopami,
+ YEAR = 1985,
+ VOLUME = "PAMI-7",
+ NUMBER = 4,
+ MONTH = Jul,
+ PAGES = "442--452"
+}
+
+@ARTICLE{Mars87,
+ AUTHOR = "Marsland, T. A. and Reinefeld, Alexander and Schaeffer,
+ Jonathan",
+ TITLE = "Low Overhead Alternatives to {SSS*}",
+ JOURNAL = artint,
+ VOLUME = 31,
+ PAGES = "185--199",
+ YEAR = 1987
+}
+
+@INBOOK{Mars88,
+ AUTHOR = "T.A. Marsland and M. Olafsson and Jonathan Schaeffer",
+ TITLE = "Multiprocessor Tree-Search Experiments",
+ BOOKTITLE = "Advances in Computer Chess IV",
+ NOTE = "D.F. Beal (Editor)",
+ PUBLISHER = "Pergamon Press",
+ PAGES = "37--51",
+ YEAR = 1986,
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{McAl88,
+ AUTHOR = "David Allen McAllester",
+ TITLE = "Conspiracy Numbers for Min-Max Searching",
+ JOURNAL = artint,
+ VOLUME = 35,
+ PAGES = "287--310",
+ YEAR = 1988
+}
+
+@ARTICLE{Meul90,
+ AUTHOR = "M. van der Meulen",
+ TITLE = "Conspiracy Number Search",
+ JOURNAL = iccaj,
+ VOLUME = 13,
+ NUMBER = 1,
+ YEAR = 1990,
+ MONTH = Mar,
+ PAGES = "3--14",
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@PHDTHESIS{Mich83,
+ AUTHOR = "Gerard P. Michon",
+ TITLE = "Recursive Random Games: {A} Probabilistic Model for
+ Perfect Information Games",
+ SCHOOL = "University of California at Los Angeles, Computer
+ Science Department",
+ ADDRESS = "Los Angeles, CA",
+ NUMBER = "840029 (R-32)",
+ YEAR = 1983
+}
+
+@INPROCEEDINGS{Moni87,
+ AUTHOR = "Burkhard Monien and Oliver Vornberger",
+ TITLE = "Parallel Processing of Combinatorial Search Trees",
+ BOOKTITLE = " Proceedings International Workshop on Parallel
+ Algorithms and Architectures, Math. Research Nr. 38,
+ Akademie - Verlag Berlin",
+ PAGES = "60--69",
+ YEAR = 1987,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Nau82,
+ AUTHOR = "Danna S. Nau",
+ TITLE = "The Last Player Theorem",
+ JOURNAL = artint,
+ VOLUME = 18,
+ PAGES = "53--65",
+ YEAR = 1982
+}
+
+@ARTICLE{Nau83,
+ AUTHOR = "Danna S. Nau",
+ TITLE = "Pathology on Game Trees Revisited, and an Alternative to
+ Minimaxing",
+ JOURNAL = artint,
+ VOLUME = 21,
+ PAGES = "221--244",
+ YEAR = 1983
+}
+
+@ARTICLE{Newb77,
+ AUTHOR = "Monroe M. Newborn",
+ TITLE = "The Efficiency of the Alpha-Beta Search on Trees with
+ Branch-dependent Terminal Node Scores",
+ JOURNAL = artint,
+ VOLUME = 8,
+ PAGES = "137--153",
+ YEAR = 1977
+}
+
+@ARTICLE{Newb88,
+ AUTHOR = "Monroe M. Newborn",
+ TITLE = "Unsynchronized Iteratively Deepening Parallel Alpha-Beta
+ Search",
+ JOURNAL = ieeetopami,
+ YEAR = 1988,
+ VOLUME = "PAMI-10",
+ NUMBER = 5,
+ PAGES = "687--694"
+}
+
+@BOOK{Nils80,
+ AUTHOR = "Nils J. Nilsson",
+ TITLE = "Principles of Artificial Intelligence",
+ PUBLISHER = "Tioga Publishing Company",
+ ADDRESS = "Palo Alto, CA",
+ YEAR = 1980,
+ AVAILABLE = "ETHICS"
+}
+
+@ARTICLE{Pear80,
+ AUTHOR = "Judea Pearl",
+ TITLE = "Asymptotical Properties of Minimax Trees and Game
+ Searching Procedures",
+ JOURNAL = artint,
+ VOLUME = 14,
+ NUMBER = 2,
+ PAGES = "113--138",
+ YEAR = 1980
+}
+
+@ARTICLE{Pear82,
+ AUTHOR = "Judea Pearl",
+ TITLE = "The Solution for the Branching Factor of the Alpha-Beta
+ Pruning Algorithm and its Optimality",
+ JOURNAL = cacm,
+ MONTH = Aug,
+ YEAR = 1982,
+ VOLUME = 25,
+ NUMBER = 8,
+ PAGES = "559--564"
+}
+
+@ARTICLE{Pear83,
+ AUTHOR = "Judea Pearl",
+ TITLE = "On the Nature of Pathology in Game Searching",
+ JOURNAL = artint,
+ VOLUME = 20,
+ YEAR = 1983,
+ PAGES = "427--453",
+ AVAILABLE = "EPFL-DMA"
+}
+
+@BOOK{Pear84,
+ AUTHOR = "Judea Pearl",
+ TITLE = "Heuristics -- Intelligent Search Strategies for Computer
+ Problem Solving",
+ PUBLISHER = "Addison-Wesley Publishing Co.",
+ ADDRESS = "Reading, MA",
+ YEAR = 1984
+}
+
+@PHDTHESIS{Pijl91,
+ AUTHOR = "Wim Pijls",
+ TITLE = "Shortest Paths and Game Trees",
+ SCHOOL = "Erasmus University Rotterdam",
+ YEAR = 1991,
+ MONTH = Nov,
+ ADDRESS = "Rotterdam, NL"
+}
+
+@TECHREPORT{Pijl92a,
+ AUTHOR = "Wim Pijls and Arie Bruin",
+ TITLE = "Another View of the {SSS*} Algorithm",
+ INSTITUTION = "Erasmus University Rotterdam",
+ YEAR = 1992,
+ MONTH = Jan,
+ ADDRESS = "Rotterdam, NL",
+ NOTE = "Also in: Algorithms, Proceedings of the International
+ Symposium, SIGAL'90, Tokyo, Japan, Aug. 1990"
+}
+
+@TECHREPORT{Pijl92b,
+ AUTHOR = "Wim Pijls and Arie Bruin",
+ TITLE = "Searching Informed Game Trees",
+ INSTITUTION = "Erasmus University Rotterdam",
+ YEAR = 1992,
+ ADDRESS = "Rotterdam, NL",
+ NOTE = "Extended abstract. Also in: Proceedings CSN '92
+ (Computer Science in the Netherlands), Mathematical
+ Center, Amsterdam, 1992"
+}
+
+@TECHREPORT{Pijl92c,
+ AUTHOR = "Wim Pijls and Arie Bruin",
+ TITLE = "Searching Informed Game Trees",
+ INSTITUTION = "Erasmus University Rotterdam",
+ YEAR = 1992,
+ MONTH = Oct,
+ ADDRESS = "Rotterdam, NL",
+ NUMBER = "EUR-CS-92-02"
+}
+
+@INBOOK{Powl90,
+ AUTHOR = "Powley, C. and C. Ferguson and Richard E. Korf",
+ TITLE = "Parallel heuristic search: Two approaches",
+ BOOKTITLE = "Parallel Algorithms for Machine Intelligence and Vision",
+ YEAR = 1990,
+ PAGES = "42--65",
+ PUBLISHER = "Springer-Verlag",
+ AVAILABLE = "EPFL",
+ NOTE = "Edited by V. Kumar, P. S. Gopalakrishnan and L.N."
+}
+
+@TECHREPORT{Popo83,
+ AUTHOR = "Fred Popowich and T. A. Marsland",
+ TITLE = "Parabelle: Experiences With a Parallel Chess Program",
+ YEAR = 1983,
+ MONTH = Aug,
+ INSTITUTION = "University of Alberta, Department of Computer Science",
+ ADDRESS = "Edmonton, Canada",
+ NUMBER = "TR 83-07",
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Powl91,
+ AUTHOR = "C. Powley and Richard E. Korf",
+ TITLE = "Single Agent Parallel Window Search",
+ JOURNAL = ieeetopami,
+ YEAR = 1991,
+ VOLUME = "PAMI-13",
+ NUMBER = 5,
+ MONTH = May,
+ PAGES = "466--477"
+}
+
+@ARTICLE{Prak88,
+ AUTHOR = "Bettadapu Prakash and T. A. Marsland",
+ TITLE = "Accuracy and Savings in Depth-Limited Capture Search",
+ JOURNAL = "International Journal of Man-Machine Studies",
+ YEAR = 1988,
+ VOLUME = 29,
+ NUMBER = 6,
+ PAGES = "497--502",
+ AVAILABLE = "ETHICS"
+}
+
+@INPROCEEDINGS{Rein85,
+ AUTHOR = "Alexander Reinefeld and Jonathan Schaeffer and
+ T. A. Marsland",
+ TITLE = "Information Acquisition in Minimal Window Search",
+ BOOKTITLE = "Proceedings of the International Joint Conference on
+ Artificial Intelligence (IJCAI-85)",
+ PAGES = "1040--1043",
+ VOLUME = 2,
+ YEAR = 1985,
+ AVAILABLE = "ETHICS"
+}
+
+@BOOK{Rein89,
+ AUTHOR = "Alexander Reinefeld",
+ TITLE = "Spielbaum Suchverfahren",
+ PUBLISHER = "Springer Verlag",
+ VOLUME = "Informatik-Fachberichte 200",
+ YEAR = 1989,
+ AVAILABLE = "NO"
+}
+
+@TECHREPORT{Reza92,
+ AUTHOR = "Jaleh Rezaie and Raphael Finkel",
+ TITLE = "A Comparison of some Parallel Game-Tree Search Algorithms",
+ INSTITUTION = "University of Kentucky, Department of Computer Science",
+ ADDRESS = "Lexington, USA",
+ YEAR = 1992
+}
+
+@ARTICLE{Rive87,
+ AUTHOR = "Ronald L. Rivest",
+ TITLE = "Game Tree Searching by Min/Max Approximation",
+ JOURNAL = artint,
+ YEAR = 1987,
+ VOLUME = 34,
+ NUMBER = 1,
+ PAGES = "77--96"
+}
+
+@TECHREPORT{Roiz81,
+ AUTHOR = "Igor Roizen",
+ TITLE = "On the Average Number of Terminal Nodes Examined by
+ Alpha-Beta",
+ INSTITUTION = "University of California at Los Angeles, Cognitive
+ Systems Laboratory",
+ YEAR = 1981,
+ NUMBER = "UCLA-ENG-CSL-8108",
+ ADDRESS = "Los Angeles, CA",
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Roiz83,
+ AUTHOR = "Igor Roizen and Judea Pearl",
+ TITLE = "A Minimax Algorithm Better than Alpha-Beta? Yes and No",
+ JOURNAL = artint,
+ VOLUME = 21,
+ PAGES = "199--230",
+ YEAR = 1983
+}
+
+@ARTICLE{Scha83,
+ AUTHOR = "Jonathan Schaeffer",
+ TITLE = "The History Heuristic",
+ JOURNAL = iccaj,
+ VOLUME = 6,
+ NUMBER = 3,
+ PAGES = "16--19",
+ YEAR = 1983,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Scha89a,
+ AUTHOR = "Jonathan Schaeffer",
+ TITLE = "Distributed Game-Tree Searching",
+ JOURNAL = jpdc,
+ VOLUME = 6,
+ PAGES = "90--114",
+ YEAR = 1989
+}
+
+@ARTICLE{Scha89b,
+ AUTHOR = "Jonathan Schaeffer",
+ TITLE = "The History Heuristic and Alpha-Beta Search Enhancements
+ in Practice",
+ JOURNAL = ieeetopami,
+ YEAR = 1989,
+ VOLUME = "PAMI-11",
+ NUMBER = 1,
+ MONTH = Nov,
+ PAGES = "1203--1212"
+}
+
+@ARTICLE{Scha90,
+ AUTHOR = "Jonathan Schaeffer",
+ TITLE = "Conspiracy Numbers",
+ JOURNAL = artint,
+ YEAR = 1990,
+ VOLUME = 43,
+ PAGES = "67--84"
+}
+
+@INBOOK{Schr86,
+ AUTHOR = {G. Schr\"ufer},
+ CHAPTER = "Presence and Absence of Pathology on Game Trees",
+ TITLE = "Advances in Computer Chess 4",
+ YEAR = 1986,
+ NOTE = "Editor: D. F. Beal",
+ PAGES = "101--112",
+ PUBLISHER = "Pergamon Press",
+ AVAILABLE = "ETHICS"
+}
+
+@PHDTHESIS{Schr88,
+ AUTHOR = {G. Schr\"ufer},
+ TITLE = {{Minimax-Suchen Kosten, Qualit\"at und Algorithmen}},
+ SCHOOL = "University of Braunschweig",
+ ADDRESS = "Braunschweig, West Germany",
+ YEAR = 1988,
+ NOTE = "In german, \Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Shan50,
+ AUTHOR = "Claude E. Shannon",
+ TITLE = "Programming a Computer for Playing Chess",
+ JOURNAL = "Philosophical Magazine",
+ VOLUME = 41,
+ PAGES = "256--275",
+ YEAR = 1950,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Shen85,
+ AUTHOR = "Chien-Chung Shen and Wen-Hsiang Tsai",
+ TITLE = "A Graph Matching Approach to Optimal Task Assignment
+ in Distributed Computing Systems Using a Minimax Criterion",
+ JOURNAL = ieeetoc,
+ VOLUME = "C-34",
+ MONTH = Mar,
+ YEAR = 1985,
+ PAGES = "197--203",
+ AVAILABLE = "EPFL-LITH"
+}
+
+@ARTICLE{Shin91,
+ AUTHOR = "Rajjan Shinghal and Sofia Shved",
+ TITLE = "Proposed Modifications to Parallel State Space
+ Search of Game Trees",
+ JOURNAL = ijprai,
+ NUMBER = 5,
+ VOLUME = "5",
+ PAGES = "809--833",
+ YEAR = 1991,
+ AVAILABLE = "ETHICS"
+}
+
+@ARTICLE{Slag69,
+ AUTHOR = "James H. Slagle and John K. Dixon",
+ TITLE = "Experiments With SOme Programs That Search Game Trees",
+ JOURNAL = jacm,
+ VOLUME = 16,
+ NUMBER = 2,
+ YEAR = 1969,
+ MONTH = Apr,
+ PAGES = "189--207"
+}
+
+@INPROCEEDINGS{Stei90,
+ AUTHOR = "Igor Steinberg and Marvin Solomon",
+ TITLE = "Searching Game Trees in Parallel",
+ BOOKTITLE = "International Conference on Parallel Processing",
+ PAGES = "III-9 -- III-17",
+ YEAR = 1990,
+ NOTE = "\Star",
+ AVAILABLE = "NO"
+}
+
+@ARTICLE{Stoc79,
+ AUTHOR = "G. C. Stockman",
+ TITLE = "A Minimax Algorithm Better than alpha-beta?",
+ JOURNAL = artint,
+ VOLUME = 12,
+ NUMBER = 2,
+ PAGES = "179--196",
+ YEAR = 1979
+}
+
+@ARTICLE{Tars83,
+ AUTHOR = "M. Tarsi",
+ TITLE = "Optimal Search on Some Game Trees",
+ JOURNAL = jacm,
+ YEAR = 1983,
+ VOLUME = 30,
+ PAGES = "389--396",
+ MONTH = Jul,
+ NOTE = "Also as Tech. Report UCLA-ENG-CSL-8108"
+}
+
+@INPROCEEDINGS{Vorn87,
+ AUTHOR = "Oliver Vornberger and Burkhard Monien",
+ TITLE = "Parallel Alpha-Beta versus Parallel {SSS*}",
+ BOOKTITLE = "IFIP Conference on Distributed Processing",
+ ADDRESS = "Amsterdam, NL",
+ PUBLISHER = "North-Holland",
+ PAGES = "613--625",
+ MONTH = Oct,
+ YEAR = 1987,
+ AVAILABLE = "ETHICS"
+}
diff --git a/programs/minimax.dvi b/programs/minimax.dvi
new file mode 100644
index 0000000..9b00755
--- /dev/null
+++ b/programs/minimax.dvi
Binary files differ
diff --git a/programs/pentopt.htm b/programs/pentopt.htm
new file mode 100644
index 0000000..9cc5788
--- /dev/null
+++ b/programs/pentopt.htm
@@ -0,0 +1,6723 @@
+<html>
+<head>
+<title>How to optimize for the Pentium family of microprocessors</title>
+<style><!--
+ body{font-family:arial,sans-serif;color:black,background-color:"#F0FFE0"}
+ p{font-family:arial,sans-serif;}
+ ol{font-family:arial,sans-serif;}
+ ul{font-family:arial,sans-serif;}
+ pre{font-family:courier,monospace}
+ kbd{font-family:courier,monospace;font-weight:540}
+ h1{font-size:"300%";font-weight:700;text-align:center}
+ h2{font-size:"150%";font-weight:600;text-align:left;padding-top:1em}
+ h3{font-size:"110%";font-weight:600;text-align:left}
+ h4{font-size:"100%";font-weight:500;text-align:left;text-decoration:underline}
+ td.a2{font-size:"150%";font-weight:600}
+ td.a3{font-size:"110%";font-weight:600}
+ td.a4{font-size:"100%";font-weight:600}
+--></style>
+</head>
+
+<body text="#000000" bgcolor="#F0FFE0" link="#0000E0" vlink="#E000E0" alink="#FF0000">
+<center><h1>How to optimize for the Pentium<br>
+family of microprocessors</h1>
+<p>
+<small>Copyright &#169; 1996, 2000 by Agner Fog. Last modified 2000-07-03.</small>
+</center>
+<p>&nbsp;</p>
+
+<h2>Contents</h2>
+<ol>
+<li><a href="#1">Introduction</a>
+<li><a href="#2">Literature</a>
+<li><a href="#3">Calling assembly functions from high level language</a>
+<li><a href="#4">Debugging and verifying</a>
+<li><a href="#5">Memory model</a>
+<li><a href="#6">Alignment</a>
+<li><a href="#7">Cache</a>
+<li><a href="#8">First time versus repeated execution</a>
+<li><a href="#9">Address generation interlock (PPlain and PMMX)</a>
+<li><a href="#10">Pairing integer instructions (PPlain and PMMX)</a>
+ <ol><li><a href="#10_1">Perfect pairing</a>
+ <li><a href="#10_2">Imperfect pairing</a>
+ </ol>
+<li><a href="#11">Splitting complex instructions into simpler ones (PPlain and PMMX)</a>
+<li><a href="#12">Prefixes (PPlain and PMMX)</a>
+<li><a href="#13">Overview of PPro, PII and PIII pipeline</a>
+<li><a href="#14">Instruction decoding (PPro, PII and PIII)</a>
+<li><a href="#15">Instruction fetch (PPro, PII and PIII)</a>
+<li><a href="#16">Register renaming (PPro, PII and PIII)</a>
+ <ol><li><a href="#16_1">Eliminating dependencies</a>
+ <li><a href="#16_2">Register read stalls</a></ol>
+<li><a href="#17">Out of order execution (PPro, PII and PIII)</a>
+<li><a href="#18">Retirement (PPro, PII and PIII)</a>
+<li><a href="#19">Partial stalls (PPro, PII and PIII)</a>
+ <ol><li><a href="#19_1">Partial register stalls</a>
+ <li><a href="#19_2">Partial flags stalls</a>
+ <li><a href="#19_3">Flags stalls after shifts and rotates</a>
+ <li><a href="#19_4">Partial memory stalls</a></ol>
+<li><a href="#20">Dependency chains (PPro, PII and PIII)</a>
+<li><a href="#21">Searching for bottlenecks (PPro, PII and PIII)</a>
+<li><a href="#22">Jumps and branches (all processors)</a>
+ <ol><li><a href="#22_1">Branch prediction in PPlain</a>
+ <li><a href="#22_2">Branch prediction in PMMX, PPro, PII and PIII</a>
+ <li><a href="#22_3">Avoiding jumps (all processors)</a>
+ <li><a href="#22_4">Avoiding conditional jumps by using flags (all processors)</a>
+ <li><a href="#22_5">Replacing conditional jumps by conditional moves (PPro, PII and PIII)</a></ol>
+<li><a href="#23">Reducing code size (all processors)</a>
+<li><a href="#24">Scheduling floating point code (PPlain and PMMX)</a>
+<li><a href="#25">Loop optimization (all processors)</a>
+ <ol><li><a href="#25_1">Loops in PPlain and PMMX</a>
+ <li><a href="#25_2">Loops in PPro, PII and PIII</a></ol>
+<li><a href="#26">Problematic Instructions</a>
+ <ol><li><a href="#26_1">XCHG (all processors)</a>
+ <li><a href="#26_2">Rotates through carry (all processors)</a>
+ <li><a href="#26_3">String instructions (all processors)</a>
+ <li><a href="#26_4">Bit test (all processors)</a>
+ <li><a href="#26_5">Integer multiplication (all processors)</a>
+ <li><a href="#26_6">WAIT instruction (all processors)</a>
+ <li><a href="#26_7">FCOM + FSTSW AX (all processors)</a>
+ <li><a href="#26_8">FPREM (all processors)</a>
+ <li><a href="#26_9">FRNDINT (all processors)</a>
+ <li><a href="#26_10">FSCALE and exponential function (all processors)</a>
+ <li><a href="#26_11">FPTAN (all processors)</a>
+ <li><a href="#26_12">FSQRT (PIII)</a>
+ <li><a href="#26_13">MOV [MEM], ACCUM (PPlain and PMMX)</a>
+ <li><a href="#26_14">TEST instruction (PPlain and PMMX)</a>
+ <li><a href="#26_15">Bit scan (PPlain and PMMX)</a>
+ <li><a href="#26_16">FLDCW (PPro, PII and PIII)</a>
+ </ol>
+<li><a href="#27">Special topics</a>
+ <ol><li><a href="#27_1">LEA instruction (all processors)</a>
+ <li><a href="#27_2">Division (all processors)</a>
+ <li><a href="#27_3">Freeing floating point registers (all processors)</a>
+ <li><a href="#27_4">Transitions between floating point and MMX instructions PMMX, PII and PIII)</a>
+ <li><a href="#27_5">Converting from floating point to integer (All processors)</a>
+ <li><a href="#27_6">Using integer instructions to do floating point operations (All processors)</a>
+ <li><a href="#27_7">Using floating point instructions to do integer operations (PPlain and PMMX)</a>
+ <li><a href="#27_8">Moving blocks of data (All processors)</a>
+ <li><a href="#27_9">Self-modifying code (All processors)</a>
+ <li><a href="#27_10">Detecting processor type (All processors)</a>
+ </ol>
+<li><a href="#28">List of instruction timings for PPlain and PMMX</a>
+ <ol><li><a href="#28_1">Integer instructions</a>
+ <li><a href="#28_2">Floating point instructions</a>
+ <li><a href="#28_3">MMX instructions (PMMX)</a></ol>
+<li><a href="#29">List of instruction timings and micro-op breakdown for PPro, PII and PIII</a>
+ <ol><li><a href="#29_1">Integer instructions</a>
+ <li><a href="#29_2">Floating point instructions</a>
+ <li><a href="#29_3">MMX instructions (PII and PIII)</a>
+ <li><a href="#29_4">XMM instructions (PIII)</a>
+ </ol>
+<li><a href="#30">Testing speed</a>
+<li><a href="#31">Comparison of the different microprocessors</a>
+</ol>
+
+<p>&nbsp;</p>
+<h2><a name="1">1</a>. Introduction</h2>
+<p>This manual describes in detail how to write optimized assembly language
+code, with particular focus on the Pentium&#174; family of microprocessors.
+<p>
+Most of the information herein is based on my own research. Many people have
+sent me useful information and corrections for this manual, and I keep
+updating it whenever I have new important information. This manual is
+therefore more accurate, detailed, comprehensive and exact than any other
+source of information, and it contains many details not found anywhere else.
+This information will enable you in many cases to calculate exactly how many
+clock cycles a piece of code will take. I do not claim, though, that all
+information in this manual is exact: Some timings etc. can be difficult or
+impossible to measure exactly, and I do not have access to the inside information
+on technical implementations that the writers of Intel manuals have.
+<p>
+The following versions of Pentium processors are discussed in this manual:<p>
+<table border=1>
+<tr><td class="a3">abbreviation</td><td class="a3">name</td></tr>
+<tr><td>PPlain</td><td>plain old Pentium (without MMX)</td></tr>
+<tr><td>PMMX</td><td>Pentium with MMX</td></tr>
+<tr><td>PPro</td><td>Pentium Pro</td></tr>
+<tr><td>PII</td><td>Pentium II (including Celeron and Xeon)</td></tr>
+<tr><td>PIII</td><td>Pentium III (including variants)</td></tr>
+</table>
+<p>
+The assembly language syntax used in this manual is MASM 5.10 syntax.
+There is no official standard for X86 assembly language, but this is the
+closest you can get to a de facto standard since most assemblers have a
+MASM 5.10 compatible mode. (I do not recommend using MASM version 5.10 though,
+because it has a serious bug in 32 bit mode. Use TASM or a later version of MASM).
+<p>
+Some of the remarks in this manual may seem like a criticism of Intel. This should not be
+taken to mean that other brands are better. The Pentium family of microprocessors
+compare well with competing brands, they are better documented, and have better
+testability features. For these reasons, no competing brand has been subjected to the same
+level of independent research by me or by anybody else.
+<p>
+Programming in assembly language is much more difficult than high level language. Making
+bugs is very easy, and finding them is very difficult. Now you have been warned! It is
+assumed that the reader is already experienced in assembly programming. If not, then
+please read some books on the subject and get some programming experience before you
+begin to do complicated optimizations.
+<p>
+The hardware design of the PPlain and PMMX chips has many features which are
+optimized specifically for some commonly used instructions or instruction combinations,
+rather than using general optimization methods. Consequently, the rules for optimizing
+software for this design are complicated and have many exceptions, but the possible gain
+in performance may be substantial. The PPro, PII and PIII processors have a very
+different design where the processor takes care of much of the optimization work by
+executing instructions out of order, but the more complicated design of these processors
+generate many potential bottlenecks, so there may be a lot to gain
+by optimizing manually for these processors. The Pentium 4 processor has yet
+another design, and the optimization guidelines for Pentium 4 are quite different
+from previous versions. This manual does not cover the Pentium 4 - the reader is
+referred to manuals from Intel.
+<p>
+Before you start to convert your code to assembly, make sure that your algorithm is optimal.
+Often you can improve a piece of code much more by improving the algorithm than by
+converting it to assembly code.
+<p>
+Next, you have to identify the critical parts of your program. Often more than 99% of the
+CPU time is spent in the innermost loop of a program. In this case you should optimize only
+this loop and leave everything else in high level language. Some assembly programmers
+waste a lot of energy optimizing the wrong parts of their programs, the only significant effect
+of their effort being that the programs become more difficult to debug and maintain!
+<p>
+If it is not obvious where the critical parts of your program are then you may use a profiler to
+find them. If it turns out that the bottleneck is disk access, then you may modify your
+program to make disk access sequential in order to improve disk caching, rather than
+turning to assembly programming. If the bottleneck is graphics output then you may look for
+a way of reducing the number of calls to graphic procedures.
+<p>
+Some high level language compilers offer relatively good optimization for specific
+processors, but further optimization by hand can usually make it much better.
+<p>
+Please don't send your programming questions to me. I am not gonna do your homework
+for you!
+<p>
+Good luck with your hunt for nanoseconds!
+<p>
+<h2><a name="2">2</a>. Literature</h2><p>
+A lot of useful literature and tutorials can be downloaded for free from Intel's www site or
+acquired in print or on CD-ROM. It is recommended that you study this literature in order to
+get acquainted with the microprocessor architecture. However, the documents from Intel are
+not always accurate - especially the tutorials have many errors (evidently, they haven't
+tested their own examples).
+<p>
+I will not give the URL's here because the file locations change very often. You can find the
+documents you need by using the search facilities at:
+<a href="http://developer.intel.com" target="external">developer.intel.com</a> or follow the
+links from <a href="http://www.agner.org/assem">www.agner.org/assem</a>
+<p>
+Some documents are in .PDF format. If you don't have software for viewing or printing .PDF
+files, then you may download the Acrobat file reader from <a href="http://www.adobe.com" target="external">www.adobe.com</a>
+<p>
+The use of MMX and XMM (SIMD) instructions for optimizing specific applications are described in several
+application notes. The instruction set is described in various manuals and tutorials.
+<p>
+VTUNE is a software tool from Intel for optimizing code. I have not tested it and can
+therefore not give any evalutation of it here.
+<p>
+A lot of other sources than Intel also have useful information. These sources are listed in
+the FAQ for the newsgroup comp.lang.asm.x86. For other internet ressources follow the
+links from <a href="http://www.agner.org/assem">www.agner.org/assem</a>
+<p>
+<h2><a name="3">3</a>. Calling assembly functions from high level language</h2><p>
+You can either use inline assembly or code a subroutine entirely in assembly language and
+link it into your project. If you choose the latter option, then it is recommended that you use
+a compiler which is capable of translating high level code directly to assembly. This assures
+that you get the function calling method right. Most C++ compilers can do this.
+<p>
+The methods for function calling and name mangling can be quite complicated. There are
+many different calling conventions, and the different brands of compilers are not compatible
+in this respect. If you are calling assembly language subroutines from C++, then the best
+method in terms of consistency and compatibility is to declare your functions <kbd>extern "C"</kbd>
+and <kbd>_cdecl</kbd>. The assembly code must then have the function name prefixed by an
+underscore (<kbd>_</kbd>) and be assembled with case sensitivity on externals (option -mx).
+<p>
+If you need to make overloaded functions, overloaded operators, member
+functions, and other C++ specialties then you have to code it in C++ first and
+make your compiler translate it to assembly in order to get the right linking
+information and calling method. These details are different for different brands
+of compilers. If you want an assembly function with any other calling method
+than <kbd>extern "C"</kbd> and <kbd>_cdecl</kbd> to be callable from code
+compiled with different compilers then you need to give it one public name
+for each compiler. For example an overloaded square function:
+<pre> ; int square (int x);
+ SQUARE_I PROC NEAR ; integer square function
+ @square$qi LABEL NEAR ; link name for Borland compiler
+ ?square@@YAHH@Z LABEL NEAR ; link name for Microsoft compiler
+ _square__Fi LABEL NEAR ; link name for Gnu compiler
+ PUBLIC @square$qi, ?square@@YAHH@Z, _square__Fi
+ MOV EAX, [ESP+4]
+ IMUL EAX
+ RET
+ SQUARE_I ENDP
+
+ ; double square (double x);
+ SQUARE_D PROC NEAR ; double precision float square function
+ @square$qd LABEL NEAR ; link name for Borland compiler
+ ?square@@YANN@Z LABEL NEAR ; link name for Microsoft compiler
+ _square__Fd LABEL NEAR ; link name for Gnu compiler
+ PUBLIC @square$qd, ?square@@YANN@Z, _square__Fd
+ FLD QWORD PTR [ESP+4]
+ FMUL ST(0), ST(0)
+ RET
+ SQUARE_D ENDP</pre>
+<p>
+The way of transferring parameters depends on the calling convention:</pre><p>
+<table border=1 cellpadding=1 cellspacing=1><tr>
+<td class="a3">&nbsp;calling convention&nbsp;</td>
+<td class="a3">&nbsp;parameter order on stack&nbsp;</td>
+<td class="a3">&nbsp;parameters removed by&nbsp;</td></tr>
+<tr><td>&nbsp;_cdecl&nbsp;</td><td>&nbsp;first par. at low address&nbsp;
+</td><td>&nbsp;caller&nbsp;</td></tr><tr><td>&nbsp;_stdcall&nbsp;</td><td>
+&nbsp;first par. at low address&nbsp;</td><td>&nbsp;subroutine&nbsp;</td></tr>
+<tr><td>&nbsp;_fastcall&nbsp;</td><td>&nbsp;compiler specific&nbsp;
+</td><td>&nbsp;subroutine&nbsp;</td></tr>
+<tr><td>&nbsp;_pascal&nbsp;</td><td>&nbsp;first par. at high address&nbsp;
+</td><td>&nbsp;subroutine&nbsp;</td>
+</tr></table>
+<p>
+<u>Register usage in 16 bit mode DOS or Windows, C or C++:</u><br>
+16-bit return value in <kbd>AX</kbd>, 32-bit return value in <kbd>DX:AX</kbd>,
+floating point return value in <kbd>ST(0)</kbd>. Registers <kbd>AX, BX, CX,
+DX, ES</kbd> and arithmetic flags may be changed by the procedure; all other
+registers must be saved and restored. A procedure can rely on <kbd>SI, DI, BP, DS</kbd>
+and <kbd>SS</kbd> being unchanged across a call to another procedure.
+<p>
+<u>Register usage in 32 bit Windows, C++ and other programming languages:</u><br>
+Integer return value in <kbd>EAX</kbd>, floating point return value in <kbd>ST(0)</kbd>.
+Registers <kbd>EAX, ECX, EDX</kbd> (not <kbd>EBX</kbd>) may be changed by the procedure; all other
+registers must be saved and restored. Segment registers cannot be changed, not even
+temporarily. <kbd>CS, DS, ES,</kbd> and <kbd>SS</kbd> all point to the flat segment group. <kbd>FS</kbd> is used by the
+operating system. <kbd>GS</kbd> is unused, but reserved. Flags may be changed by the procedure
+with the following restrictions: The direction flag is 0 by default. The direction flag may be
+set temporarily, but must be cleared before any call or return. The interrupt flag cannot be
+cleared. The floating point register stack is empty at the entry of a procedure and must be
+empty at return, except for <kbd>ST(0)</kbd> if it is used for return value. MMX registers may be
+changed by the procedure and if so cleared by <kbd>EMMS</kbd> before returning and before calling any
+other procedure that may use floating point registers. All XMM registers may be modified
+by procedures. Rules for passing parameters and return values in XMM registers
+are described in Intel's application note AP 589. A procedure can rely on
+<kbd>EBX, ESI, EDI, EBP</kbd> and all segment registers being unchanged across
+a call to another procedure.
+<p>
+
+<h2><a name="4">4</a>. Debugging and verifying</h2><p>
+Debugging assembly code can be quite hard and frustrating, as you probably already have
+discovered. I would recommend that you start with writing the piece of code you want to
+optimize as a subroutine in a high level language. Next, write a test program that will test
+your subroutine thoroughly. Make sure the test program goes into all branches and
+boundary cases.
+<p>
+When your high level language subroutine works with your test program then you are ready
+to translate the code to assembly language.
+<p>
+Now you can start to optimize. Each time you have made a modification you should run it
+on the test program to see if it works correctly.
+Number all your versions and save them so that you can go back and test them again in
+case you discover an error that the test program didn't catch (such as writing to a wrong
+address).
+<p>
+Test the speed of the most critical part of your program with the method described in
+chapter <a href="#30">30</a> or with a test program. If the code is significantly slower than expected, then the
+most probable causes are: cache misses (chapter <a href="#7">7</a>), misaligned
+operands (chapter <a href="#6">6</a>), first
+time penalty (chapter <a href="#8">8</a>), branch mispredictions
+(chapter <a href="#22">22</a>), instruction fetch problems
+(chapter <a href="#15">15</a>), register read stalls (<a href="#16">16</a>),
+ or long dependency chains (chapter <a href="#20">20</a>).
+<p>
+Highly optimized code tends to be very difficult to read and understand for others, and even
+for yourself when you get back to it after some time. In order to make it possible to maintain
+the code it is important that you organize it into small logical units (procedures or macros)
+with a well-defined interface and appropriate comments. The more complicated the code is
+to read, the more important is a good documentation.
+<p>
+<h2><a name="5">5</a>. Memory model</h2><p>
+The Pentiums are designed primarily for 32 bit code, and the performance is
+inferior on 16 bit code. Segmenting your code and data also degrades performance
+significantly, so you should generally prefer 32 bit flat mode, and an operating
+system which supports this mode. The code examples shown in this
+manual assume a 32 bit flat memory model, unless otherwise specified.
+<p>
+<h2><a name="6">6</a>. Alignment</h2><p>
+All data in RAM should be aligned to addresses divisible by 2, 4, 8, or 16 according to this
+scheme:
+<table border=1 cellpadding=1 cellspacing=1><tr><td>
+&nbsp;
+</td><td colspan=2 align=center class="a3">alignment</td></tr>
+<tr><td align=center class="a3">&nbsp;operand size&nbsp;</td>
+<td align=center class="a3">&nbsp;PPlain and PMMX&nbsp;</td>
+<td align=center class="a3">&nbsp;PPro, PII and PIII&nbsp;</td></tr>
+<tr><td>&nbsp;1 (byte)&nbsp;</td>
+<td align=center>1</td><td align=center>1</td></tr>
+<tr><td>&nbsp;2 (word)&nbsp;</td><td align=center>2</td>
+<td align=center>2</td></tr>
+<tr><td>&nbsp;4 (dword)&nbsp;</td>
+<td align=center align=center>4</td><td align=center>4</td></tr>
+<tr><td>&nbsp;6 (fword)&nbsp;</td>
+<td align=center>4</td><td align=center>8</td></tr>
+<tr><td>&nbsp;8 (qword)&nbsp;</td>
+<td align=center>8</td><td align=center>8</td></tr>
+<tr><td>&nbsp;10 (tbyte)&nbsp;</td>
+<td align=center>8</td><td align=center>16</td></tr>
+<tr><td>&nbsp;16 (oword)&nbsp;</td>
+<td align=center>n.a.</td><td align=center>16</td></tr>
+</table>
+<p>
+On PPlain and PMMX, misaligned data will take at least 3 clock cycles extra to access if a 4
+byte boundary is crossed. The penalty is higher when a cache line boundary is crossed.
+<p>
+On PPro, PII and PIII, misaligned data will cost you 6-12 clocks extra when a
+cache line boundary is crossed. Misaligned operands smaller than 16 bytes that
+do not cross a 32 byte boundary give no penalty.
+<p>
+Aligning data by 8 or 16 on a dword size stack may be a problem. A common method is to set up
+an aligned frame pointer. A function with aligned local data may look like this:
+<pre>_FuncWithAlign PROC NEAR
+ PUSH EBP ; prolog code
+ MOV EBP, ESP
+ AND EBP, -8 ; align frame pointer by 8
+ FLD DWORD PTR [ESP+8] ; function parameter
+ SUB ESP, LocalSpace + 4 ; allocate local space
+ FSTP QWORD PTR [EBP-LocalSpace] ; store something in aligned space
+ ...
+ ADD ESP, LocalSpace + 4 ; epilog code. restore ESP
+ POP EBP ; (AGI stall on PPlain/PMMX)
+ RET
+_FuncWithAlign ENDP</pre>
+<p>
+While aligning data is always important, aligning code is not necessary on the PPlain and
+PMMX. Principles for aligning code on PPro, PII and PIII are explained in chapter <a href="#15">15</a>.
+<p>
+<h2><a name="7">7</a>. Cache</h2><p>
+The PPlain and PPro have 8 kb of on-chip cache (level one cache) for code, and 8 kb for
+data. The PMMX, PII and PIII have 16 kb for code and 16 kb for data. Data in the level 1 cache
+can be read or written to in just one clock cycle, whereas a cache miss may cost many
+clock cycles. It is therefore important that you understand how the cache works in order to
+use it most efficiently.
+<p>
+The data cache consists of 256 or 512 lines of 32 bytes each. Each time you read a data
+item which is not cached, the processor will read an entire cache line from memory. The
+cache lines are always aligned to a physical address divisible by 32. When you have read a
+byte at an address divisible by 32, then the next 31 bytes can be read or written to at almost
+no extra cost. You can take advantage of this by arranging data items which are used near
+each other together into aligned blocks of 32 bytes of memory. If, for example, you have a
+loop which accesses two arrays, then you may interleave the two arrays into one array of
+structures, so that data which are used together are also stored together.
+<p>
+If the size of an array or other data structure is a multiple of 32 bytes, then you should
+preferably align it by 32.
+<p>
+The cache is set-associative. This means that a cache line can not be assigned to an
+arbitrary memory address. Each cache line has a 7-bit set-value which must match bits 5
+through 11 of the physical RAM address (bit 0-4 define the 32 bytes within a cache line).
+The PPlain and PPro have two cache lines for each of the 128 set-values, so there are two
+possible cache lines to assign to any RAM address. The PMMX, PII and PIII have four.
+<p>
+The consequence of this is that the cache can hold no more than two or four different data
+blocks which have the same value in bits 5-11 of the address. You can determine if two
+addresses have the same set-value by the following method: Strip off the lower 5 bits of
+each address to get a value divisible by 32. If the difference between the two truncated
+addresses is a multiple of 4096 (=1000H), then the addresses have the same set-value.
+<p>
+Let me illustrate this by the following piece of code, where ESI holds an address divisible by
+32:
+
+<pre>AGAIN: MOV EAX, [ESI]
+ MOV EBX, [ESI + 13*4096 + 4]
+ MOV ECX, [ESI + 20*4096 + 28]
+ DEC EDX
+ JNZ AGAIN</pre>
+<p>
+The three addresses used here all have the same set-value because the differences
+between the truncated addresses are multipla of 4096. This loop will perform very poorly on
+the PPlain and PPro. At the time you read <kbd>ECX</kbd> there is no free cache
+line with the proper set-value so the processor takes the least recently used
+of the two possible cache lines, that is the one which was used for <kbd>EAX</kbd>, and
+fills it with the data from <kbd>[ESI+20*4096]</kbd> to
+<kbd>[ESI+20*4096+31]</kbd> and reads <kbd>ECX</kbd>.
+Next, when reading <kbd>EAX</kbd>, you find that the cache
+line that held the value for <kbd>EAX</kbd> has now been discarded, so you
+take the least recently used
+line, which is the one holding the <kbd>EBX</kbd> value, and so on..
+You have nothing but cache misses and the loop takes something like 60 clock
+cycles. If the third line is changed to:
+<pre> MOV ECX, [ESI + 20*4096 + 32]</pre>
+<p>
+then we have crossed a 32 byte boundary, so that we do not have the same set-value as in
+the first two lines, and there will be no problem assigning a cache line to each of the three
+addresses. The loop now takes only 3 clock cycles (except for the first time) - a very
+considerable improvement! As already mentioned, the PMMX, PII and PIII have 4-way caches
+so that you have four cache lines with the same set-value. (Some Intel documents
+erroneously say that the PII cache is 2-way).
+<p>
+It may be very difficult to determine if your data addresses have the same set-values,
+especially if they are scattered around in different segments. The best thing you can do to
+avoid problems of this kind is to keep all data used in the critical part or your program within
+one contiguous block not bigger than the cache, or two contiguous blocks no bigger than
+half that size (for example one block for static data and another block for data on the stack).
+This will make sure that your cache lines are used optimally.
+<p>
+If the critical part of your code accesses big data structures or random data addresses, then
+you may want to keep all frequently used variables (counters, pointers, control variables,
+etc.) within a single contiguous block of max 4 kbytes so that you have a complete set of
+cache lines free for accessing random data. Since you probably need stack space anyway
+for subroutine parameters and return addresses, the best thing is to copy all frequently
+used static data to dynamic variables on the stack, and copy them back again outside the
+critical loop if they have been changed.
+<p>
+Reading a data item which is not in the level one cache causes an entire cache line to be
+filled from the level two cache, which takes approximately 200 ns (that is 20 clocks on a
+100 MHz system or 40 clocks on a 200 MHz system), but the bytes you ask for first are
+available already after 50-100 ns. If the data item is not in the level two cache either, then
+you will get a delay of something like 200-300 ns. This delay will be somewhat longer if you
+cross a DRAM page boundary. (The size of a DRAM page is 1 kb for 4 and 8 MB 72 pin
+RAM modules, and 2 kb for 16 and 32 MB modules).
+<p>
+When reading big blocks of data from memory, the speed is limited by the time it takes to fill
+cache lines. You can sometimes improve speed by reading data in a non-sequential order:
+before you finish reading data from one cache line start reading the first item from the next
+cache line. This method can increase reading speed by 20 - 40% when reading from main
+memory or level 2 cache on PPlain and PMMX, and from level 2 cache on PPro, PII and PIII. A
+disadvantage of this method is of course that the program code becomes extremely clumsy
+and complicated. For further information on this trick see <a href="http://www.intelligentfirm.com" target="external">www.intelligentfirm.com</a>.
+<p>
+When you write to an address which is not in the level 1 cache, then the value will go right
+through to the level 2 cache or to the RAM (depending on how the level 2 cache is set up)
+on the PPlain and PMMX. This takes approximately 100 ns. If you write eight or more times
+to the same 32 byte block of memory without also reading from it, and the block is not in the
+level one cache, then it may be advantageous to make a dummy read from the block first to
+load it into a cache line. All subsequent writes to the same block will then go to the cache
+instead, which takes only one clock cycle. On PPlain and PMMX, there is sometimes a
+small penalty for writing repeatedly to the same address without reading in between.
+<p>
+On PPro, PII and PIII, a write miss will normally load a cache line, but it is possible to setup an
+area of memory to perform differently, for example video RAM (See Pentium Pro Family
+Developer's Manual, vol. 3: Operating System Writer's Guide").
+<p>
+Other ways of speeding up memory reads and writes are discussed in chapter
+<a href="#27_8">27.8</a> below.
+<p>
+The PPlain and PPro have two write buffers, PMMX, PII and PIII have four. On the PMMX, PII and
+PIII you may have up to four unfinished writes to uncached memory without delaying the
+subsequent instructions. Each write buffer can handle operands up to 64 bits wide.
+<p>
+Temporary data may conveniently be stored on the stack because the stack area is very
+likely to be in the cache. However, you should be aware of the alignment problems
+if your data elements are bigger than the stack word size.
+<p>
+If the life ranges of two data structures do not overlap, then they may share
+the same RAM area to increase cache efficiency. This is consistent with the
+common practice of allocating space for temporary variables on the stack.
+<p>
+Storing temporary data in registers is of course even more efficient. Since registers is a
+scarce ressource you may want to use <kbd>[ESP]</kbd> rather than <kbd>[EBP]</kbd> for addressing data on the
+stack, in order to free <kbd>EBP</kbd> for other purposes. Just don't forget that the value of <kbd>ESP</kbd>
+changes every time you do a <kbd>PUSH</kbd> or <kbd>POP</kbd>.
+(You cannot use <kbd>ESP</kbd> under 16-bit Windows
+because the timer interrupt will modify the high word of <kbd>ESP</kbd> at unpredictable places in your
+code.)
+<p>
+There is a separate cache for code, which is similar to the data cache. The size of the code
+cache is 8 kb on PPlain and PPro and 16 kb on the PMMX, PII and PIII. It is important that the
+critical part of your code (the innermost loops) fit in the code cache. Frequently used pieces
+of code or routines which are used together should preferable be stored near each other.
+Seldom used branches or procedures should be put away in the bottom of your code or
+somewhere else.
+<p>
+<h2><a name="8">8</a>. First time versus repeated execution</h2><p>
+A piece of code usually takes much more time the first time it is executed than when it is
+repeated. The reasons are the following:
+<ol>
+<li>Loading the code from RAM into the cache takes longer time than executing it.
+<li>Any data accessed by the code has to be loaded into the cache, which may take much
+more time than executing the instructions. When the code is repeated then the data are
+more likely to be in the cache.
+<li>Jump instructions will not be in the branch target buffer the first time they execute, and
+therefore are less likely to be predicted correctly. See chapter <a href="#22">22</a>.
+<li>In the PPlain, decoding the code is a bottleneck. If it takes one clock cycle to determine
+the length of an instruction, then it is not possible to decode two instructions per clock
+cycle, because the processor doesn't know where the second instruction begins. The
+PPlain solves this problem by remembering the length of any instruction which has
+remained in the cache since last time it was executed. As a consequence of this, a set
+of instructions will not pair in the PPlain the first time they are executed, unless the first
+of the two instructions is only one byte long. The PMMX, PPro, PII and PIII have no penalty
+on first time decoding.
+</ol><p>
+For these four reasons, a piece of code inside a loop will generally take much more time the
+first time it executes than the subsequent times.
+<p>
+If you have a big loop which doesn't fit into the code cache then you will get penalties all the
+time because it doesn't run from the cache. You should therefore try to reorganize the loop
+to make it fit into the cache.
+<p>
+If you have very many jumps, calls, and branches inside a loop, then you may get the
+penalty of branch target buffer misses repeatedly.
+<p>
+Likewise, if a loop repeatedly accesses a data structure too big for the data cache, then you
+will get the penalty of data cache misses all the time.
+<p>
+<h2><a name="9">9</a>. Address generation interlock (PPlain and PMMX)</h2><p>
+It takes one clock cycle to calculate the address needed by an instruction which accesses
+memory. Normally, this calculation is done at a separate stage in the pipeline while the
+preceding instruction or instruction pair is executing. But if the address depends on the
+result of an instruction executing in the preceding clock cycle, then you have to wait an
+extra clock cycle for the address to be calculated. This is called an AGI stall.
+Example:<br>
+<kbd>ADD EBX,4 / MOV EAX,[EBX] ; AGI stall</kbd><br>
+The stall in this example can be removed by putting some other instructions in between
+<kbd>ADD EBX,4</kbd> and <kbd>MOV EAX,[EBX]</kbd> or by rewriting the code to:
+<kbd>MOV EAX,[EBX+4] / ADD EBX,4</kbd>
+<p>
+You can also get an AGI stall with instructions which use <kbd>ESP</kbd> implicitly
+for addressing, such
+as <kbd>PUSH, POP, CALL,</kbd> and <kbd>RET</kbd>, if <kbd>ESP</kbd> has been
+changed in the preceding clock cycle by
+instructions such as <kbd>MOV, ADD,</kbd> or <kbd>SUB</kbd>.
+The PPlain and PMMX have special circuitry to
+predict the value of <kbd>ESP</kbd> after a stack operation so that you do not
+get an AGI delay after
+changing <kbd>ESP</kbd> with <kbd>PUSH, POP,</kbd> or <kbd>CALL</kbd>.
+You can get an AGI stall after <kbd>RET</kbd> only if it has an
+immediate operand to add to <kbd>ESP</kbd>.
+<p>
+Examples:
+<pre>ADD ESP,4 / POP ESI ; AGI stall
+POP EAX / POP ESI ; no stall, pair
+MOV ESP,EBP / RET ; AGI stall
+CALL L1 / L1: MOV EAX,[ESP+8] ; no stall
+RET / POP EAX ; no stall
+RET 8 / POP EAX ; AGI stall</pre>
+<p>
+The <kbd>LEA</kbd> instruction is also subject to an AGI stall if it uses a
+base or index register which
+has been changed in the preceding clock cycle. Example:
+<pre>INC ESI / LEA EAX,[EBX+4*ESI] ; AGI stall</pre>
+<p>
+PPro, PII and PIII have no AGI stalls for memory reads and <kbd>LEA</kbd>, but they do have
+AGI stalls for memory writes. This is not very significant unless the subsequent
+code has to wait for the write to finish.<p>
+<h2><a name="10">10</a>. Pairing integer instructions (PPlain and PMMX)</h2>
+<h3><a name="10_1">10.1 Perfect pairing</a></h3><p>
+The PPlain and PMMX have two pipelines for executing instructions, called the U-pipe and
+the V-pipe. Under certain conditions it is possible to execute two instructions
+simultaneously, one in the U-pipe and one in the V-pipe. This can almost double the speed.
+It is therefore advantageous to reorder your instructions to make them pair.
+<p>
+The following instructions are pairable in either pipe:
+<ul><li><kbd>MOV</kbd> register, memory, or immediate into register or memory
+<li><kbd>PUSH</kbd> register or immediate, <kbd>POP</kbd> register
+<li><kbd>LEA, NOP</kbd>
+<li><kbd>INC, DEC, ADD, SUB, CMP, AND, OR, XOR,</kbd>
+<li>and some forms of <kbd>TEST</kbd> (see chapter <a href="#26_14">26.14</a>)
+</ul><p>
+The following instructions are pairable in the U-pipe only:
+<ul><li><kbd>ADC, SBB</kbd>
+<li><kbd>SHR, SAR, SHL, SAL</kbd> with immediate count
+<li><kbd>ROR, ROL, RCR, RCL</kbd> with an immediate count of 1
+</ul><p>
+The following instructions can execute in either pipe but are only pairable
+when in the V-pipe:
+<ul><li>near call
+<li>short and near jump
+<li>short and near conditional jump.
+</ul><p>
+All other integer instructions can execute in the U-pipe only, and are not pairable.
+<p>
+Two consecutive instructions will pair when the following conditions are met:
+<p>
+<u>1.</u> The first instruction is pairable in the U-pipe and the second
+instruction is pairable in the V-pipe.
+<p>
+<u>2.</u> The second instruction does not read or write a register which the first
+instruction writes to.<br>
+Examples:
+<pre> MOV EAX, EBX / MOV ECX, EAX ; read after write, do not pair
+ MOV EAX, 1 / MOV EAX, 2 ; write after write, do not pair
+ MOV EBX, EAX / MOV EAX, 2 ; write after read, pair OK
+ MOV EBX, EAX / MOV ECX, EAX ; read after read, pair OK
+ MOV EBX, EAX / INC EAX ; read and write after read, pair OK</pre>
+<p>
+<u>3.</u> In rule 2 partial registers are treated as full registers. Example:
+<pre> MOV AL, BL / MOV AH, 0</pre><p>
+writes to different parts of the same register, do not pair
+<p>
+<u>4.</u> Two instructions which both write to parts of the flags register can pair despite rule 2 and
+3. Example:
+<pre> SHR EAX, 4 / INC EBX ; pair OK</pre>
+<p>
+<u>5.</u> An instruction which writes to the flags can pair with a conditional jump despite rule 2.
+Example:
+<pre> CMP EAX, 2 / JA LabelBigger ; pair OK</pre>
+<p>
+<u>6.</u> The following instruction combinations can pair despite the fact that they both modify the
+stack pointer:
+<pre> PUSH + PUSH, PUSH + CALL, POP + POP</pre>
+<p>
+<u><a name="10-7">7.</a></u> There are restrictions on the pairing of instructions with prefix.
+There are several types of prefixes:
+<ul>
+<li>instructions addressing a non-default segment have a segment prefix.
+<li>instructions using 16 bit data in 32 bit mode, or 32 bit data in 16 bit mode have an
+operand size prefix.
+<li>instructions using 32 bit base or index registers in 16 bit mode have an address size
+prefix.
+<li>repeated string instructions have a repeat prefix.
+<li>locked instructions have a <kbd>LOCK</kbd> prefix.
+<li>many instructions which were not implemented on the 8086 processor have a two byte
+opcode where the first byte is <kbd>0FH</kbd>. The <kbd>0FH</kbd> byte behaves
+as a prefix on the PPlain, but
+not on the other versions. The most common instructions with <kbd>0FH</kbd>
+prefix are: <kbd>MOVZX,
+MOVSX, PUSH FS, POP FS, PUSH GS, POP GS, LFS, LGS, LSS, SETcc, BT,
+BTC, BTR, BTS, BSF, BSR, SHLD, SHRD,</kbd> and <kbd>IMUL</kbd> with two operands and no
+immediate operand.
+</ul>
+<p>
+On the PPlain, a prefixed instruction can only execute in the U-pipe, except for conditional
+near jumps.
+<p>
+On the PMMX, instructions with operand size, address size, or <kbd>0FH</kbd>
+prefix can execute in
+either pipe, whereas instructions with segment, repeat, or lock prefix can
+only execute in the U-pipe.
+<p>
+<u>8.</u> An instruction which has both a displacement and immediate data is not pairable on the
+PPlain and only pairable in the U-pipe on the PMMX:
+<pre> MOV DWORD PTR DS:[1000], 0 ; not pairable or only in U-pipe
+ CMP BYTE PTR [EBX+8], 1 ; not pairable or only in U-pipe
+ CMP BYTE PTR [EBX], 1 ; pairable
+ CMP BYTE PTR [EBX+8], AL ; pairable</pre><p>
+ (Another problem with instructions which have both a displacement and
+ immediate data on the PMMX is that such instructions may be longer
+ than 7 bytes, which means that only one instruction can be decoded
+ per clock cycle, as explained in chapter <a href="#12">12</a>.)
+<p>
+<u>9.</u> Both instructions must be preloaded and decoded. This is explained in
+chapter <a href="#8">8</a>.
+<p>
+<u>10.</u> There are special pairing rules for MMX instructions on the PMMX:
+<ul>
+<li>MMX shift, pack or unpack instructions can execute in either pipe but cannot pair with
+other MMX shift, pack or unpack instructions.
+<li>MMX multiply instructions can execute in either pipe but cannot pair with other MMX
+multiply instructions. They take 3 clock cycles and the last 2 clock cycles can overlap
+with subsequent instructions in the same way as floating point instructions can (see
+chapter <a href="#24">24</a>).
+<li>an MMX instruction which accesses memory or integer registers can execute only in the
+U-pipe and cannot pair with a non-MMX instruction.
+</ul>
+<p>
+
+<h3><a name="10_2">10.2 Imperfect pairing</a></h3><p>
+There are situations where the two instructions in a pair will not execute simultaneously, or
+only partially overlap in time. They should still be considered a pair, though, because the
+first instruction executes in the U-pipe, and the second in the V-pipe. No subsequent
+instruction can start to execute before both instructions in the imperfect pair have finished.
+<p>
+Imperfect pairing will happen in the following cases:
+<p>
+<u>1.</u> If the second instructions suffers an AGI stall (see chapter <a href="#9">9</a>).
+<p>
+<u>2.</u> Two instructions cannot access the same DWORD of memory simultaneously.
+The following examples assume that <kbd>ESI</kbd> is divisible by 4:<br>
+<kbd> MOV AL, [ESI] / MOV BL, [ESI+1]</kbd><br>
+The two operands are within the same DWORD, so they cannot execute
+simultaneously. The pair takes 2 clock cycles.<br>
+<kbd> MOV AL, [ESI+3] / MOV BL, [ESI+4]</kbd><br>
+Here the two operands are on each side of a DWORD boundary, so they
+pair perfectly, and take only one clock cycle.
+<p>
+<u>3.</u> Rule 2 is extended to the case where bit 2-4 is the same in the two addresses (cache
+bank conflict). For DWORD addresses this means that the difference between the two
+addresses should not be divisible by 32. Examples:
+<pre> MOV [ESI], EAX / MOV [ESI+32000], EBX ; imperfect pairing
+ MOV [ESI], EAX / MOV [ESI+32004], EBX ; perfect pairing</pre>
+<p>
+Pairable integer instructions which do not access memory take one clock cycle to
+execute, except for mispredicted jumps. <kbd>MOV</kbd> instructions to or from
+memory also take
+only one clock cycle if the data area is in the cache and properly aligned. There is no
+speed penalty for using complex addressing modes such as scaled index registers.
+<p>
+A pairable integer instruction which reads from memory, does some calculation, and
+stores the result in a register or flags, takes 2 clock cycles. (read/modify instructions).
+<p>
+A pairable integer instruction which reads from memory, does some calculation, and
+writes the result back to the memory, takes 3 clock cycles. (read/modify/write
+instructions).
+<p>
+<u>4.</u> If a read/modify/write instruction is paired with a read/modify or read/modify/write
+instruction, then they will pair imperfectly.
+
+<p>
+The number of clock cycles used is given in the following table:
+<table border=1 cellpadding=1 cellspacing=1><tr>
+<td align="center" class="a3">
+First instruction</td>
+<td colspan=3 align="center" class="a3">Second instruction</td></tr>
+<tr><td>&nbsp;</td><td align=center>&nbsp;MOV or register only&nbsp;
+</td><td align=center>&nbsp;read/modify&nbsp;</td>
+<td align=center>&nbsp;read/modify/write&nbsp;</td></tr>
+<tr><td align=center>&nbsp;MOV or register only&nbsp;</td>
+<td align=center>&nbsp;1&nbsp;</td>
+<td align=center>&nbsp;2&nbsp;</td>
+<td align=center>&nbsp;3&nbsp;</td></tr>
+<tr><td align=center>&nbsp;read/modify&nbsp;</td>
+<td align=center>&nbsp;2&nbsp;</td>
+<td align=center>&nbsp;2&nbsp;</td>
+<td align=center>&nbsp;3&nbsp;</td></tr>
+<tr><td align=center>&nbsp;read/modify/write&nbsp;</td>
+<td align=center>&nbsp;3&nbsp;</td>
+<td align=center>&nbsp;4&nbsp;</td>
+<td align=center>&nbsp;5&nbsp;</td></tr>
+</table>
+
+<p>Example:<br><kbd> ADD [mem1], EAX / ADD EBX, [mem2] ; 4 clock cycles<br> ADD EBX, [mem2] / ADD [mem1], EAX ; 3 clock cycles</kbd>
+<p>
+<u>5.</u> When two paired instructions both take extra time due to cache misses, misalignment,
+or jump misprediction, then the pair will take more time than each instruction, but less
+than the sum of the two.
+<p>
+<u>6.</u> A pairable floating point instruction followed by <kbd>FXCH</kbd>
+ will make imperfect pairing if the
+next instruction is not a floating point instruction.
+<p>
+<p>In order to avoid imperfect pairing you have to know which instructions go into the U-pipe,
+and which to the V-pipe. You can find out this by looking backwards in your code and
+search for instructions which are unpairable, pairable only in one of the pipes, or cannot pair
+due to one of the rules above.
+<p>
+Imperfect pairing can often be avoided by reordering your instructions.
+Example:
+ <br>
+<pre>L1: MOV EAX,[ESI]
+ MOV EBX,[ESI]
+ INC ECX</pre><p>
+
+Here the two <kbd>MOV</kbd> instructions form an imperfect pair because they both access the same
+memory location, and the sequence takes 3 clock cycles. You can improve the code by
+reordering the instructions so that <kbd>INC ECX</kbd> pairs with one of the
+<kbd>MOV</kbd> instructions.
+
+<pre>L2: MOV EAX,OFFSET A
+ XOR EBX,EBX
+ INC EBX
+ MOV ECX,[EAX]
+ JMP L1</pre><p>
+
+The pair <kbd>INC EBX / MOV ECX,[EAX]</kbd> is imperfect because the latter
+instruction has an
+AGI stall. The sequence takes 4 clocks. If you insert a <kbd>NOP</kbd> or any other instruction so that
+<kbd>MOV ECX,[EAX]</kbd> pairs with <kbd>JMP L1</kbd> instead, then the sequence takes only 3 clocks.
+<p>
+<a name="imperfectpush">
+The next example is in 16 bit mode, assuming that <kbd>SP</kbd> is divisible by 4:</a>
+
+<pre>L3: PUSH AX
+ PUSH BX
+ PUSH CX
+ PUSH DX
+ CALL FUNC</pre><p>
+
+Here the <kbd>PUSH</kbd> instructions form two imperfect pairs, because both operands in each pair go
+into the same dword of memory. <kbd>PUSH BX</kbd> could possibly pair perfectly
+with <kbd>PUSH CX</kbd>
+(because they go on each side of a DWORD boundary) but it doesn't because it has already
+been paired with <kbd>PUSH AX</kbd>. The sequence therefore takes 5 clocks. If you insert a <kbd>NOP</kbd> or
+any other instruction so that <kbd>PUSH BX</kbd> pairs with <kbd>PUSH CX</kbd>,
+and <kbd>PUSH DX</kbd> with <kbd>CALL FUNC</kbd>,
+then the sequence will take only 3 clocks. Another way to solve the problem is to make sure
+that <kbd>SP</kbd> is not divisible by 4. Knowing whether <kbd>SP</kbd> is
+divisible by 4 or not in 16 bit mode can
+be difficult, so the best way to avoid this problem is to use 32 bit mode.
+
+<p>
+
+<h2><a name="11">11</a>. Splitting complex instructions into simpler ones (PPlain and PMMX)</h2><p>
+You may split up read/modify and read/modify/write instructions to improve pairing.
+Example:<br>
+<kbd> ADD [mem1],EAX / ADD [mem2],EBX ; 5 clock cycles</kbd><br>
+This code may be split up into a sequence which takes only 3 clock cycles:
+<pre> MOV ECX,[mem1] / MOV EDX,[mem2] / ADD ECX,EAX / ADD EDX,EBX
+ MOV [mem1],ECX / MOV [mem2],EDX</pre><p>
+
+Likewise you may split up non-pairable instructions into pairable instructions:
+<pre> PUSH [mem1]
+ PUSH [mem2] ; non-pairable</pre><p>
+Split up into:
+<pre> MOV EAX,[mem1]
+ MOV EBX,[mem2]
+ PUSH EAX
+ PUSH EBX ; everything pairs</pre><p>
+
+Other examples of non-pairable instructions which may be split up into simpler pairable
+instructions:<br>
+<kbd>CDQ</kbd> split into: <kbd>MOV EDX,EAX / SAR EDX,31</kbd><br>
+<kbd>NOT EAX</kbd> change to <kbd>XOR EAX,-1</kbd><br>
+<kbd>NEG EAX</kbd> split into <kbd>XOR EAX,-1 / INC EAX</kbd><br>
+<kbd>MOVZX EAX,BYTE PTR [mem]</kbd> split into <kbd> XOR EAX,EAX / MOV AL,BYTE PTR [mem]</kbd><br>
+<kbd>JECXZ</kbd> split into <kbd>TEST ECX,ECX / JZ</kbd><br>
+<kbd>LOOP</kbd> split into <kbd>DEC ECX / JNZ</kbd><br>
+<kbd>XLAT</kbd> change to <kbd>MOV AL,[EBX+EAX]</kbd>
+<p>
+If splitting instructions doesn't improve speed, then you may keep the complex or
+nonpairable instructions in order to reduce code size.
+<p>
+Splitting instructions is not needed on the PPro, PII and PIII, except when the split instructions
+generate fewer uops.
+<p>
+<h2><a name="12">12</a>. Prefixes (PPlain and PMMX)</h2><p>
+An instruction with one or more prefixes may not be able to execute in the V-pipe (se
+<a href="#10-7">chapter 10, sect. 7</a>), and it may take more than one clock cycle to decode.
+<p>
+On the PPlain, the decoding delay is one clock cycle for each prefix except for the <kbd>0FH</kbd>
+prefix of conditional near jumps.
+<p>
+The PMMX has no decoding delay for <kbd>0FH</kbd> prefix.
+Segment and repeat prefixes take one
+clock extra to decode. Address and operand size prefixes take two clocks extra to decode.
+The PMMX can decode two instructions per clock cycle if the first instruction has a
+segment or repeat prefix or no prefix, and the second instruction has no prefix. Instructions
+with address or operand size prefixes can only decode alone on the PMMX. Instructions with
+more than one prefix take one clock extra for each prefix.
+<p>
+Address size prefixes can be avoided by using 32 bit mode. Segment prefixes can be
+avoided in 32 bit mode by using a flat memory model. Operand size prefixes can be avoided
+in 32 bit mode by using only 8 bit and 32 bit integers.
+<p>
+Where prefixes are unavoidable, the decoding delay may be masked if a preceding
+instruction takes more than one clock cycle to execute. The rule for the PPlain is that any
+instruction which takes N clock cycles to execute (not to decode) can 'overshadow' the
+decoding delay of N-1 prefixes in the next two (sometimes three) instructions or instruction
+pairs. In other words, each extra clock cycle that an instruction takes to execute can be
+used to decode one prefix in a later instruction. This shadowing effect even extends across
+a predicted branch. Any instruction which takes more than one clock cycle to execute, and
+any instruction which is delayed because of an AGI stall, cache miss, misalignment, or any
+other reason except decoding delay and branch misprediction, has a shadowing effect.
+<p>
+The PMMX has a similar shadowing effect, but the mechanism is different. Decoded
+instructions are stored in a transparent first-in-first-out (FIFO) buffer, which can hold up to
+four instructions. As long as there are instructions in the FIFO buffer you get no delay.
+When the buffer is empty then instructions are executed as soon as they are decoded. The
+buffer is filled when instructions are decoded faster than they are executed, i.e. when you
+have unpaired or multi-cycle instructions. The FIFO buffer is emptied when instructions
+execute faster than they are decoded, i.e. when you have decoding delays due to prefixes.
+The FIFO buffer is empty after a mispredicted branch. The FIFO buffer can receive two
+instructions per clock cycle provided that the second instruction is without prefixes and
+none of the instructions are longer than 7 bytes. The two execution pipelines (U and V) can
+each receive one instruction per clock cycle from the FIFO buffer.
+<p>
+Examples: <br>
+<kbd> CLD / REP MOVSD</kbd><br>
+The <kbd>CLD</kbd> instruction takes two clock cycles and can therefore overshadow the decoding
+delay of the <kbd>REP</kbd> prefix. The code would take one clock cycle more if the <kbd>CLD</kbd> instruction was
+placed far from the <kbd>REP MOVSD.</kbd>
+<br>
+<kbd> CMP DWORD PTR [EBX],0 / MOV EAX,0 / SETNZ AL</kbd><br>
+The <kbd>CMP</kbd> instruction takes two clock cycles here because it is a read/modify instruction. The
+<kbd>0FH</kbd> prefix of the <kbd>SETNZ</kbd> instruction is decoded during the second clock cycle of the <kbd>CMP </kbd>
+instruction, so that the decoding delay is hidden on the PPlain (The PMMX has no
+decoding delay for the <kbd>0FH</kbd>).
+<p>
+Prefix penalties in PPro, PII and PIII are described in chapter <a href="#14">14</a>.
+<p>
+<h2><a name="13">13</a>. Overview of PPro, PII and PIII pipeline</h2><p>
+The architecture of the PPro, PII and PIII microprocessors is well explained and illustrated in
+various manuals and tutorials from Intel. It is recommended that you study this material in
+order to get an understanding of how these microprocessors work. I will describe the
+structure briefly here with particular focus on those elements that are important for
+optimizing code.
+<p>
+Instruction codes are fetched from the code cache in aligned 16-byte chunks into a double
+buffer that can hold two 16-byte chunks. The code is passed on from the double buffer to
+the decoders in blocks which I will call ifetch blocks (instruction fetch blocks). The ifetch
+blocks are usually 16 bytes long, but not aligned. The purpose of the double-buffer is to
+make it possible to decode an instruction that crosses a 16-byte boundary (i.e. an address
+divisible by 16).
+<p>
+The ifetch block goes to the instruction length decoder, which determines where each
+instruction begins and ends, and next to the instruction decoders. There are three decoders
+so that you can decode up to three instructions in each clock cycle. A group of up to three
+instructions that are decoded in the same clock cycle is called a decode group.
+<p>
+The decoders translate instructions into micro-operations, abbreviated uops. Simple
+instructions generate only one uop, while more complex instructions may generate several
+uops. For example, the instruction <kbd>ADD EAX,[MEM]</kbd> is decoded into two uops: one for
+reading the source operand from memory, and one for doing the addition. The purpose of
+splitting instructions into uops is to make the handling later in the system more effective.
+<p>
+The three decoders are called D0, D1, and D2. D0 can handle all instructions, while D1
+and D2 can handle only simple instructions that generate one uop.
+<p>
+The uops from the decoders go via a short queue to the register allocation table (RAT). The
+execution of uops work on temporary registers which are later written to the permanent
+registers <kbd>EAX, EBX</kbd>, etc. The purpose of the RAT is to tell the uops which temporary
+registers to use, and to allow register renaming (see later).
+<p>
+After the RAT, the uops to go the reorder buffer (ROB). The purpose of the ROB is to
+enable out-of-order execution. A uop stays in the reservation station until the operands it
+needs are available. If an operand for one uop is delayed because a previous uop that
+generates the operand is not finished yet, then the ROB may find another uop later in the
+queue that can be executed in the meantime in order to save time.
+<p>
+The uops that are ready for execution are sent to the execution units, which are clustered
+around five ports: Port 0 and 1 can handle arithmetic operations, jumps, etc. Port 2 takes
+care of all reads from memory, port 3 calculates addresses for memory writes, and port 4
+does memory writes.
+<p>
+When an instruction has been executed then it is marked in the ROB as ready to retire. It then goes to
+the retirement station. Here the contents of the temporary registers used by the uops are
+written to the permanent registers. While uops can be executed out of order, they must be
+retired in order.
+<p>
+In the following chapters, I will describe in detail how to optimize the throughput of each step
+in the pipeline.
+<p>
+<h2><a name="14">14</a>. Instruction decoding (PPro, PII and PIII)</h2><p>
+I am describing instruction decoding before instruction fetching here because you need to
+know how the decoders work in order to understand the possible delays in instruction
+fetching.
+<p>
+The decoders can handle three instructions per clock cycle, but only when certain
+conditions are met. Decoder D0 can handle any instruction that generates up to 4 uops in a
+single clock cycle. Decoders D1 and D2 can handle only instructions that generate 1 uop
+and these instructions can be no more than 8 bytes long.
+<p>
+To summarize the rules for decoding two or three instructions in the same clock cycle:
+<ul>
+<li>The first instruction (D0) generates no more than 4 uops,
+<li>The second and third instructions generate no more than 1 uop each,
+<li>The second and third instructions are no more than 8 bytes long each,
+<li>The instructions must be contained within the same 16 bytes ifetch block (see next
+chapter).
+</ul><p>
+There is no limit to the length of the instruction in D0 (despite Intel manuals saying
+something else), as long as the three instructions fit into one 16 bytes ifetch block.
+<p>
+An instruction that generates more than 4 uops takes two or more clock cycles to decode,
+and no other instructions can decode in parallel.
+<p>
+It follows from the rules above that the decoders can produce a maximum of 6 uops per
+clock cycle if the first instruction in each decode group generates 4 uops and the next two
+generate 1 uop each. The minimum production is 2 uops per clock cycle, which you get
+when all instructions generate 2 uops each, so that D1 and D2 are never used.
+<p>
+For maximum throughput, it is recommended that you order your instructions according to
+the 4-1-1 pattern: instructions that generate 2 to 4 uops can be interspearsed with two
+simple 1-uop instructions for free, in the sense that they do not add to the decoding time.
+Example:
+<pre>MOV EBX, [MEM1] ; 1 uop (D0)
+INC EBX ; 1 uop (D1)
+ADD EAX, [MEM2] ; 2 uops (D0)
+ADD [MEM3], EAX ; 4 uops (D0)</pre><p>
+This takes 3 clock cycles to decode. You can save one clock cycle by reordering the
+instructions into two decode groups:
+<pre>ADD EAX, [MEM2] ; 2 uops (D0)
+MOV EBX, [MEM1] ; 1 uop (D1)
+INC EBX ; 1 uop (D2)
+ADD [MEM3], EAX ; 4 uops (D0)</pre><p>
+
+The decoders now generate 8 uops in two clock cycles, which is probably satisfactory.
+Later stages in the pipeline can handle only 3 uops per clock cycle so with a decoding rate
+higher than this you can assume that decoding is not a bottleneck. However, complications
+in the fetch mechanism can delay decoding as described in the next chapter, so to be safe
+you may want to aim at a decoding rate higher than 3 uops per clock cycle.
+<p>
+You can see how many uops each instruction generates in the tables in chapter <a href="#29">29</a>.
+<p>
+Instruction prefixes can also incur penalties in the decoders. Instructions can have several
+kinds of prefixes:
+ <ul>
+<li>An operand size prefix is needed when you have a 16-bit operand in a 32-bit
+environment or vice versa. (Except for instructions that can only have one operand size,
+such as <kbd>FNSTSW AX</kbd>). An operand size prefix gives a penalty of a few clocks if the
+instruction has an immediate operand of 16 or 32 bits because the length of the operand
+is changed by the prefix. Examples:
+<pre> ADD BX, 9 ; no penalty because immediate operand is 8 bits
+ MOV WORD PTR [MEM16], 9 ; penalty because operand is 16 bits </pre>
+The last instruction should be changed to:
+<pre> MOV EAX, 9
+ MOV WORD PTR [MEM16], AX ; no penalty because no immediate</pre>
+<li>An address size prefix is used when you use 32-bit addressing in 16 bit mode or vice
+versa. This is seldom needed and should generally be avoided. The address size prefix
+gives a penalty whenever you have an explicit memory operand (even when there is no
+displacement) because the interpretation of the r/m bits in the instruction code is
+changed by the prefix. Instructions with only implicit memory operands, such as string
+instructions, have no penalty with address size prefix.
+<li>Segment prefixes are used when you address data in a non-default data segment.
+Segment prefixes give no penalty on the PPro, PII and PIII.
+<li>Repeat prefixes and lock prefixes give no penalty in the decoders.
+<li>There is always a penalty if you have more than one prefix. This penalty is usually one
+clock per prefix.
+</ul>
+<p>
+<h2><a name="15">15</a>. Instruction fetch (PPro, PII and PIII)</h2><p>
+The code is fetched in aligned 16-bytes chunks from the code cache and placed in the
+double buffer, which is called so because it can contain two such chunks. The code is then
+taken from the double buffer and fed to the decoders in blocks which are usually 16 bytes
+long, but not necessarily aligned by 16. I will call these blocks ifetch blocks (instruction fetch
+blocks). If an ifetch block crosses a 16 byte boundary in the code then it needs to take from
+both chunks in the double buffer. So the purpose of the double buffer is to allow instruction
+fetching across 16 byte boundaries.
+<p>
+The double buffer can fetch one 16-bytes chunk per clock cycle and can generate one
+ifetch block per clock cycle. The ifetch blocks are usually 16 bytes long, but can be shorter
+if there is a predicted jump in the block. (See chapter <a href="#22">22</a> about jump prediction).
+<p>
+Unfortunately, the double buffer is not big enough for handling fetches around jumps
+without delay. If the ifetch block that contains the jump instruction crosses a 16-byte
+boundary then the double buffer needs to keep two consecutive aligned 16-bytes chunks of
+code in order to generate it. If the first instruction after the jump crosses a 16-byte
+boundary, then the double buffer needs to load two new 16-bytes chunks of code before a
+valid ifetch block can be generated. This means that, in the worst case, the decoding of the
+first instruction after a jump can be delayed for two clock cycles. You get one penalty for a
+16-byte boundary in the ifetch block containing the jump instruction, and one penalty for a
+16-byte boundary in the first instruction after the jump. You can get bonus if you have more
+than one decode group in the ifetch block that contains the jump because this gives the
+double buffer extra time to fetch one or two 16-byte chunks of code in advance for the
+instructions after the jump. The bonuses can compensate for the penalties according to the
+table below. If the double buffer has fetched only one 16-byte chunk of code after the jump,
+then the first ifetch block after the jump will be identical to this chunk, that is, aligned to a
+16-byte boundary. In other words, the first ifetch block after the jump will not begin at the
+first instruction, but at the nearest preceding address divisible by 16. If the double buffer
+has had time to load two 16-byte chunks, then the new ifetch block can cross a 16-byte
+boundary and begin at the first instruction after the jump. These rules are summarized in
+the following <a name="ifetchtable">table:</a><p>
+
+<table border=1 cellpadding=1 cellspacing=1><tr><td class="a3">
+Number of<br>decode groups<br>in ifetch-block<br>containing jump</td>
+<td class="a3">16-byte<br>boundary in this<br>ifetch-block</td>
+<td class="a3">16-byte<br>boundary in first<br>instruction after<br>jump</td>
+<td class="a3"><br><br>decoder delay</td>
+<td class="a3">alignment of first<br>ifetch after jump</td></tr>
+<tr><td align="center">1</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">by 16</td></tr>
+<tr><td align="center">1</td>
+<td align="center">0</td>
+<td align="center">1</td>
+<td align="center">1</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">1</td>
+<td align="center">1</td>
+<td align="center">0</td>
+<td align="center">1</td>
+<td align="center">by 16</td></tr>
+<tr><td align="center">1</td>
+<td align="center">1</td>
+<td align="center">1</td>
+<td align="center">2</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">2</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">2</td>
+<td align="center">0</td>
+<td align="center">1</td>
+<td align="center">0</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">2</td>
+<td align="center">1</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">by 16</td></tr>
+<tr><td align="center">2</td>
+<td align="center">1</td>
+<td align="center">1</td>
+<td align="center">1</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">3 or more</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">3 or more</td>
+<td align="center">0</td>
+<td align="center">1</td>
+<td align="center">0</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">3 or more</td>
+<td align="center">1</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">3 or more</td>
+<td align="center">1</td>
+<td align="center">1</td>
+<td align="center">0</td>
+<td align="center">to instruction</td></tr>
+</table>
+<p>Jumps delay the fetching so that a loop always takes at least two clock cycles more per
+iteration than the number of 16 byte boundaries in the loop.
+<p>
+A further problem with the instruction fetch mechanism is that a new ifetch block is not
+generated until the previous one is exhausted. Each ifetch block can contain several
+decode groups. If a 16 bytes long ifetch block ends with an unfinished instruction, then the
+next ifetch block will begin at the beginning of that instruction. The first instruction in an
+ifetch block always goes to decoder D0, and the next two instructions go to D1 and D2, if
+possible. The consequence of this is that D1 and D2 are used less than optimally. If the
+code is structured according to the recommended 4-1-1 pattern, and an instruction intended
+to go into D1 or D2 happens to be the first instruction in an ifetch block, then that instruction
+has to go into D0 with the result that one clock cycle is wasted.
+This is probably a hardware design flaw. At least it is suboptimal design.
+The consequence of this problem is that the time it takes to decode a piece of
+code can vary considerably depending on where the first ifetch block begins.
+<p>
+If decoding speed is critical and you want to avoid these problems then you have to know
+where each ifetch block begins. This is quite a tedious job. First you need to make your
+code segment paragraph-aligned in order to know where the 16-byte boundaries are. Then
+you have to look at the output listing from your assembler to see how long each instruction
+is. (It is recommended that you study how instructions are coded so that you can predict the
+lengths of the instructions.) If you know where one ifetch block begins then you can find
+where the next ifetch block begins in the following way: Make the block 16 bytes long. If it
+ends at an instruction boundary then the next block will begin there. If it ends with an
+unfinished instruction then the next block will begin at the beginning of this instruction.
+(Only the lengths of the instructions counts here, it doesn't matter how many uops they
+generate or what they do). This way you can work your way all through the code and mark
+where each ifetch block begins. The only problem is knowing where to start. If you know
+where one ifetch block is then you can find all the subsequent ones, but you have to know
+where the first one begins. Here are some guidelines:
+ <ul>
+<li>The first ifetch block after a jump, call, or return can begin either at the first instruction or
+at the nearest preceding 16-bytes boundary, according to the table above. If you align
+the first instruction to begin at a 16-byte boundary then you can be sure that the first
+ifetch block begins here. You may want to align important subroutine entries and loop
+entries by 16 for this purpose.
+
+<li>If the combined length of two consecutive instructions is more than 16 bytes then you
+can be certain that the second one doesn't fit into the same ifetch block as the first one,
+and consequently you will always have an ifetch block beginning at the second
+instruction. You can use this as a starting point for finding where subsequent ifetch
+blocks begin.
+
+<li>The first ifetch block after a branch misprediction begins at a 16-byte boundary. As
+explained in chapter <a href="#22_2">22.2</a>, a loop that repeats more than 5 times will always have a
+misprediction when it exits. The first ifetch block after such a loop will therefore begin at
+the nearest preceding 16-byte boundary.
+
+<li>Other serializing events also cause the next ifetch block to start at a 16-byte boundary.
+Such events include interrupts, exceptions, self-modifying code, and serializing
+instructions such as <kbd>CPUID, IN,</kbd> and <kbd>OUT</kbd>.
+</ul>
+<p>
+
+I am sure you want an example now:
+
+<pre>
+ address instruction length uops expected decoder
+ ----------------------------------------------------------------------
+ 1000h MOV ECX, 1000 5 1 D0
+ 1005h LL: MOV [ESI], EAX 2 2 D0
+ 1007h MOV [MEM], 0 10 2 D0
+ 1011h LEA EBX, [EAX+200] 6 1 D1
+ 1017h MOV BYTE PTR [ESI], 0 3 2 D0
+ 101Ah BSR EDX, EAX 3 2 D0
+ 101Dh MOV BYTE PTR [ESI+1],0 4 2 D0
+ 1021h DEC ECX 1 1 D1
+ 1022h JNZ LL 2 1 D2</pre>
+<p>
+Let's assume that the first ifetch block begins at address 1000h and ends at 1010h. This is
+before the end of the <kbd>MOV [MEM],0</kbd> instruction so the next ifetch block will begin at 1007h
+and end at 1017h. This is at an instruction boundary so the third ifetch block will begin at
+1017h and cover the rest of the loop. The number of clock cycles it takes to decode this is
+the number of D0 instructions, which is 5 per iteration of the LL loop. The last ifetch block
+contained three decode blocks covering the last five instructions, and it has one 16-byte
+boundary (1020h). Looking at the table above we find that the first ifetch block after the
+jump will begin at the first instruction after the jump, that is the <kbd>LL</kbd>
+label at 1005h, and end at
+1015h. This is before the end of the <kbd>LEA</kbd> instruction, so the next ifetch block will go from
+1011h to 1021h, and the last one from 1021h covering the rest. Now the <kbd>LEA</kbd> instruction
+and the <kbd>DEC</kbd> instruction both fall at the beginning of an ifetch block which forces them to go
+into D0. We now have 7 instructions in D0 and the loop takes 7 clocks to decode in the
+second iteration. The last ifetch block contains only one decode group
+ (<kbd>DEC ECX / JNZ LL</kbd>) and has no 16-byte boundary. According to the table, the next ifetch block after the
+jump will begin at a 16-byte boundary, which is 1000h. This will give us the same situation
+as in the first iteration, and you will see that the loop takes alternatingly 5 and 7 clock cycles
+to decode. Since there are no other bottlenecks, the complete loop will take 6000 clocks to
+run 1000 iterations. If the starting address had been different so that you had a 16-byte
+boundary in the first or the last instruction of the loop then it would take 8000 clocks. If you
+reorder the loop so that no D1 or D2 instructions fall at the beginning of an ifetch block then
+you can make it take only 5000 clocks.
+<p>
+The example above was deliberately constructed so that fetch and decoding is the only
+bottleneck. The easiest way to avoid this problem is to structure your code to generate
+much more than 3 uops per clock cycle so that decoding will not be a bottleneck despite the
+penalties described here. In small loops this may not be possible and then you have to find
+out how to optimize the instruction fetch and decoding.
+<p>
+One thing you can do is to change the starting address of your procedure in order to avoid
+16-byte boundaries where you don't want them. Remember to make your code segment
+paragraph aligned so that you know where the boundaries are.
+<p>
+If you insert an <kbd>ALIGN 16</kbd> directive before the loop entry then the assembler will put in
+<kbd>NOP</kbd>'s and other filler instructions up to the nearest 16 byte boundary. Most assemblers use
+the instruction <kbd>XCHG EBX,EBX</kbd> as a 2-byte filler (the so called 2-byte <kbd>NOP</kbd>). Whoever got
+this idea, it's a bad one because this instruction takes more time than two <kbd>NOP</kbd>'s on most
+processors! If the loop executes many times then whatever is outside the loop is
+unimportant in terms of speed and you don't have to care about the suboptimal filler
+instructions. But if the time taken by the fillers is important then you may
+select the filler instructions manually.
+You may as well use filler instructions that do something useful, such as refreshing
+a register in order to avoid register read stalls (see chapter <a href="#16_2">16.2</a>)
+For example, if you are using register <kbd>EBP</kbd> for addressing but seldom
+write to it, then you may use <kbd>MOV EBP,EBP</kbd> or <kbd>ADD EBP, 0</kbd> as
+filler in order to reduce the possibilities of register read stalls.
+If you have nothing useful to do, you may use <kbd>FXCH ST(0)</kbd> as a good filler
+because it doesn't put any load on the execution ports, provided that <kbd>ST(0)</kbd>
+contains a valid floating point value.
+<p>
+Another possible remedy is to reorder your instructions in order to get the ifetch boundaries
+where they don't hurt. This can be quite a difficult puzzle and it is not always possible to find
+a satisfactory solution.
+<p>
+Yet another possibility is to manipulate instruction lengths. Sometimes you can substitute
+one instruction with another one with a different length. Many instructions can be coded in
+different versions with different lengths. The assembler always chooses the shortest
+possible version of an instruction, but it is often possible to hard-code a longer version. For
+example, <kbd>DEC ECX</kbd> is one byte long, <kbd>SUB ECX,1</kbd> is 3 bytes, and you can code a 6 bytes
+version with a long immediate operand using this trick:
+<pre> SUB ECX, 9999
+ ORG $-4
+ DD 1</pre><p>
+Instructions with a memory operand can be made one byte longer with a SIB byte, but the
+easiest way of making an instruction one byte longer is to add a <kbd>DS:</kbd>
+segment prefix (<kbd>DB 3Eh</kbd>).
+The microprocessors generally accept redundant and meaningless prefixes (except
+<kbd>LOCK</kbd>) as long as the instruction length does not exceed 15 bytes. Even instructions without
+a memory operand can have a segment prefix. So if you want the <kbd>DEC ECX</kbd> instruction to be
+2 bytes long, write:
+<pre> DB 3Eh
+ DEC ECX</pre><p>
+Remember that you get a penalty in the decoder if an instruction has more than one prefix.
+It is possible that instructions with meaningless prefixes - especially repeat and
+lock prefixes - will be used in future processors for new instructions when there are no
+more vacant instruction codes, but I would consider it safe to use a segment prefix
+with any instruction.
+<p>
+With these methods it will usually be possible to put the ifetch boundaries where you want
+them, although it can be a tedious puzzle.
+<p>
+<h2><a name="16">16</a>. Register renaming (PPro, PII and PIII)</h2>
+<h3><a name="16_1">16.1 Eliminating dependencies</a></h3><p>
+Register renaming is an advanced technique used by these microprocessors to remove
+dependencies between different parts of the code. Example:
+<pre> MOV EAX, [MEM1]
+ IMUL EAX, 6
+ MOV [MEM2], EAX
+ MOV EAX, [MEM3]
+ INC EAX
+ MOV [MEM4], EAX</pre><p>
+Here the last three instructions are independent of the first three in the sense that they don't
+need any result from the first three instructions. To optimize this on earlier processors you
+would have to use a different register instead of <kbd>EAX</kbd> in the last three instructions and
+reorder the instructions so that the last three instructions could execute in parallel with the
+first three instructions. The PPro, PII and PIII processors do this for you automatically. They
+assign a new temporary register for <kbd>EAX</kbd> every time you write to it. Thereby the
+<kbd>MOV EAX,[MEM3]</kbd> instruction becomes independent of the preceding instructions.
+With out-of-order execution it is likely to finish the move to <kbd>[MEM4]</kbd> before the slow
+<kbd>IMUL</kbd> instruction is finished.
+<p>
+Register renaming goes fully automatically. A new temporary register is assigned as an
+alias for the permanent register every time an instruction writes to this register. An
+instruction that both reads and writes a register also causes renaming. For example the
+<kbd>INC EAX</kbd> instruction above uses one temporary register for input and another temporary
+register for output. This does not remove any dependency, of course, but it has some
+significance for subsequent register reads as I will explain later.
+<p>
+All general purpose registers, stack pointer, flags, floating point registers,
+MMX registers, XMM registers and segment registers can be renamed.
+Control words, and the floating point status word cannot be renamed and this is the
+reason why the use of these registers is slow. There are 40 universal temporary
+registers so it is unlikely that you will run out of temporary registers.
+<p>
+A common way of setting a register to zero is <kbd>XOR EAX,EAX</kbd> or
+<kbd>SUB EAX,EAX</kbd>. These
+instructions are not recognized as independent of the previous value of the register. If you
+want to remove the dependency on slow preceding instructions then use
+<kbd> MOV EAX,0.</kbd>
+<p>
+Register renaming is controlled by the register alias table (RAT) and the reorder buffer
+(ROB). The uops from the decoders go to the RAT via a queue, and then to the ROB and
+the reservation station. The RAT can handle only 3 uops per clock cycle. This means that
+the overall throughput of the microprocessor can never exceed 3 uops per clock cycle on
+average.
+<p>
+There is no practical limit to the number of renamings. The RAT can rename three registers
+per clock cycle, and it can even rename the same register three times in one clock cycle.
+<p>
+<h3><a name="16_2">16.2</a> Register read stalls</h3><p>
+But there is another limitation which may be quite serious, and that is that you
+can only read two different permanent register names per clock cycle. This
+limitation applies to all registers used by an instruction except those registers
+that the instruction writes to only.
+Example:
+<pre> MOV [EDI + ESI], EAX
+ MOV EBX, [ESP + EBP]</pre><p>
+The first instruction generates two uops: one that reads <kbd>EAX</kbd>
+and one that reads <kbd>EDI</kbd> and
+<kbd>ESI</kbd>. The second instruction generates one uop that reads
+<kbd>ESP</kbd> and <kbd>EBP</kbd>. <kbd>EBX</kbd> does not
+count as a read because it is only written to by the instruction. Let's assume that these
+three uops go through the RAT together. I will use the word triplet for a group of three
+consecutive uops that go through the RAT together. Since the ROB can handle only two
+permanent register reads per clock cycle and we need five register reads, our triplet will be
+delayed for two extra clock cycles before it comes to the reservation station. With 3 or 4
+register reads in the triplet it would be delayed by one clock cycle.
+<p>
+The same register can be read more than once in the same triplet without adding to the
+count. If the instructions above are changed to:
+<pre> MOV [EDI + ESI], EDI
+ MOV EBX, [EDI + EDI]</pre><p>
+then you will need only two register reads (<kbd>EDI</kbd> and <kbd>ESI</kbd>) and the triplet will not be delayed.
+<p>
+A register that is going to be written to by a pending uop is stored in the ROB so that it can
+be read for free until it is written back, which takes at least 3 clock cycles,
+and usually more. Write-back is the end of the execution stage where the value
+becomes available. In other words, you can read any number of registers in the
+RAT without stall if their values are not yet available from the execution units.
+The reason for this is that when a value becomes available it is immediately
+written directly to any subsequent ROB entries that need it. But if the value
+has already been written back to a temporary or permanent register when a
+subsequent uop that needs it goes into the RAT, then the value has to be read
+from the register file, which has only two read ports. There are three pipeline
+stages from the RAT to the execution unit so you can be certain that a register
+written to in one uop-triplet can be read for free in at least the next three
+triplets. If the writeback is delayed by reordering, slow instructions,
+dependency chains, cache misses, or by any other kind of stall, then the
+register can be read for free further down the instruction stream.
+<p>
+Example:
+<pre> MOV EAX, EBX
+ SUB ECX, EAX
+ INC EBX
+ MOV EDX, [EAX]
+ ADD ESI, EBX
+ ADD EDI, ECX</pre><p>
+These 6 instructions generate 1 uop each. Let's assume that the first 3 uops go through the
+RAT together. These 3 uops read register <kbd>EBX</kbd>, <kbd>ECX</kbd>, and <kbd>EAX</kbd>. But since we are writing to
+<kbd>EAX</kbd> before reading it, the read is free and we get no stall. The next three uops read <kbd>EAX</kbd>,
+<kbd>ESI</kbd>, <kbd>EBX</kbd>, <kbd>EDI</kbd>, and <kbd>ECX</kbd>. Since both <kbd>EAX</kbd>, <kbd>EBX</kbd> and <kbd>ECX</kbd> have been modified in the
+preceding triplet and not yet written back then they can be read for free, so that only <kbd>ESI</kbd>
+and <kbd>EDI</kbd> count, and we get no stall in the second triplet either. If the
+<kbd>SUB ECX,EAX</kbd>
+instruction in the first triplet is changed to <kbd>CMP ECX,EAX</kbd> then <kbd>ECX</kbd> is not written to and we
+will get a stall in the second triplet for reading <kbd>ESI</kbd>, <kbd>EDI</kbd> and <kbd>ECX</kbd>. Similarly, if the <kbd>INC</kbd>
+<kbd>EBX</kbd> instruction in the first triplet is changed to <kbd>NOP</kbd> or something else then we will get a stall
+in the second triplet for reading <kbd>ESI</kbd>, <kbd>EBX</kbd> and <kbd>EDI</kbd>.
+<p>
+No uop can read more than two registers. Therefore, all instructions that need
+to read more than two registers are split up into two or more uops.
+<p>
+To count the number of register reads, you have to include all registers which are read by
+the instruction. This includes integer registers, the flags register, the stack pointer,
+floating point registers and MMX registers.
+An XMM register counts as two registers,
+except when only part of it is used, as e.g. in <kbd>ADDSS</kbd> and <kbd>MOVHLPS</kbd>.
+Segment registers and the instruction pointer do not count.
+For example, in <kbd>SETZ AL</kbd> you count the flags
+register but not <kbd>AL</kbd>. <kbd>ADD EBX,ECX</kbd> counts both <kbd>EBX</kbd> and <kbd>ECX</kbd>, but not the flags because
+they are written to only. <kbd>PUSH EAX</kbd> reads <kbd>EAX</kbd> and the
+stack pointer and then writes to the stack pointer.
+<p>
+The <kbd>FXCH</kbd> instruction is a special case. It works by renaming, but doesn't read any values
+so that it doesn't count in the rules for register read stalls. An <kbd>FXCH</kbd> instruction behaves
+like 1 uop that neither reads nor writes any registers with regard to the rules for register read
+stalls.
+<p>
+Don't confuse uop triplets with decode groups. A decode group can generate from 1 to 6
+uops, and even if the decode group has three instructions and generates three uops there
+is no guarantee that the three uops will go into the RAT together.
+<p>
+The queue between the decoders and the RAT is so short (10 uops) that you cannot
+assume that register read stalls do not stall the decoders or that fluctuations
+in decoder throughput do not stall the RAT.
+<p>
+It is very difficult to predict which uops go through the RAT together unless the queue is
+empty, and for optimized code the queue should be empty only after mispredicted branches.
+Several uops generated by the same instruction do not necessarily go through the RAT
+together; the uops are simply taken consecutively from the queue, three at at time. The
+sequence is not broken by a predicted jump: uops before and after the jump can go through
+the RAT together. Only a mispredicted jump will discard the queue and start over again so
+that the next three uops are sure to go into the RAT together.
+<p>
+If three consecutive uops read more than two different registers then you would of course
+prefer that they do not go through the RAT together. The probability that they do is one
+third. The penalty of reading three or four written-back registers in one triplet of uops is one
+clock cycle. You can think of the one clock delay as equivalent to the load of three more
+uops through the RAT. With the probability of 1/3 of the three uops going into the RAT
+together, the average penalty will be the equivalent of 3/3 = 1 uop. To calculate the average
+time it will take for a piece of code to go through the RAT, add the number of potential
+register read stalls to the number of uops and divide by three. You can see that It doesn't
+pay to remove the stall by putting in an extra instruction unless you know for sure which
+uops go into the RAT together or you can prevent more than one potential register read stall
+by one extra instruction.
+<p>
+In situations where you aim at a throughput of 3 uops per clock, the limit of two permanent
+register reads per clock cycle may be a problematic bottleneck to handle. Possible ways to
+remove register read stalls are:
+<ul><li>keep uops that read the same register close together so that they are likely to go into the
+same triplet.
+<li>keep uops that read different registers spaced so that they cannot go into the same
+triplet.
+<li>place uops that read a register no more than 3 - 4 triplets after an instruction that writes
+to or modifies this register to make sure it hasn't been written back before it is read (it
+doesn't matter if you have a jump between as long as it is predicted). If you have reason
+to expect the register write to be delayed for whatever reason then you can safely read
+the register somewhat further down the instruction stream.
+<li>use absolute addresses instead of pointers in order to reduce the number of register
+reads.
+<li>you may rename a register in a triplet where it doesn't cause a stall in order to prevent a
+read stall for this register in one or more later triplets. Example:
+<kbd>MOV ESP,ESP / ... / MOV EAX,[ESP+8]</kbd>.
+This method costs an extra uop and therefore doesn't pay unless the expected average
+number of read stalls prevented is more than 1/3.
+</ul>
+<p>
+For instructions that generate more than one uop you may want to know the order of the
+uops generated by the instruction in order to make a precise analysis of the possibility of
+register read stalls. I have therefore listed the most common cases below.
+<p>
+<u>Writes to memory</u><br>
+A memory write generates two uops. The first one (to port 4) is a store operation, reading
+the register to store. The second uop (port 3) calculates the memory address, reading any
+pointer registers. Examples:<br>
+<kbd>MOV [EDI], EAX</kbd><br>
+First uop reads <kbd>EAX</kbd>, second uop reads <kbd>EDI</kbd>.<br>
+<kbd>FSTP QWORD PTR [EBX+8*ECX]</kbd><br>
+First uop reads <kbd>ST(0)</kbd>, second uop reads <kbd>EBX</kbd> and <kbd>ECX.</kbd>
+<p>
+<u>Read and modify</u><br>
+An instruction that reads a memory operand and modifies a register by some arithmetic or
+logical operation generates two uops. The first one (port 2) is a memory load instruction
+reading any pointer registers, the second uop is an arithmetic instruction (port 0 or 1)
+reading and writing to the destination register and possibly writing to the flags.
+Example:<br>
+<kbd>ADD EAX, [ESI+20]</kbd><br>
+First uop reads <kbd>ESI,</kbd> second uop reads <kbd>EAX</kbd> and writes <kbd>EAX</kbd> and flags.
+<p>
+<u>Read/modify/write</u><br>
+A read/modify/write instruction generates four uops. The first uop (port 2) reads any pointer
+registers, the second uop (port 0 or 1) reads and writes to any source register and possibly
+writes to the flags, the third uop (port 4) reads only the temporary result which doesn't count
+here, the fourth uop (port 3) reads any pointer registers again. Since the first and the fourth
+uop cannot go into the RAT together you cannot take advantage of the fact that they read
+the same pointer registers. Example:<br>
+<kbd>OR [ESI+EDI], EAX</kbd><br>
+The first uop reads <kbd>ESI</kbd> and <kbd>EDI</kbd>, the second uop reads <kbd>EAX</kbd> and writes <kbd>EAX</kbd> and the
+flags, the third uop reads only the temporary result, the fourth uop reads <kbd>ESI</kbd> and <kbd>EDI</kbd> again. No
+matter how these uops go into the RAT you can be sure that the uop that reads <kbd>EAX</kbd> goes
+together with one of the uops that read <kbd>ESI</kbd> and <kbd>EDI</kbd>. A register read stall is therefore
+inevitable for this instruction unless one of the registers has been modified recently.
+<p>
+<u>Push register</u><br>
+A push register instruction generates 3 uops. The first one (port 4) is a store instruction,
+reading the register. The second uop (port 3) generates the address, reading the stack
+pointer. The third uop (port 0 or 1) subtracts the word size from the stack pointer, reading
+and modifying the stack pointer.
+<p>
+<u>Pop register</u><br>
+A pop register instruction generates 2 uops. The first uop (port 2) loads the value, reading
+the stack pointer and writing to the register. The second uop (port 0 or 1) adjusts the stack
+pointer, reading and modifying the stack pointer.
+<p>
+<u>Call</u><br>
+A near call generates 4 uops (port 1, 4, 3, 01). The first two uops read only the instruction
+pointer which doesn't count because it cannot be renamed. The third uop reads the stack
+pointer. The last uop reads and modifies the stack pointer.
+<p>
+<u>Return</u><br>
+A near return generates 4 uops (port 2, 01, 01, 1). The first uop reads the stack pointer.
+The third uop reads and modifies the stack pointer.
+<p>
+An example of how to avoid a register read stall is given in example 2.6.
+<p>
+<h2><a name="17">17</a>. Out of order execution (PPro, PII and PIII)</h2><p>
+The reorder buffer (ROB) can hold 40 uops. Each uop waits in the ROB until all its
+operands are ready and there is a vacant execution unit for it. This makes out-of-order
+execution possible. If one part of the code is delayed because of a cache miss then it won't
+delay later parts of the code if they are independent of the delayed operations.
+<p>
+Writes to memory cannot execute out of order relative to other writes. There are four write
+buffers, so if you expect many cache misses on writes or you are writing to uncached
+memory then it is recommended that you schedule four writes at at time and make sure the
+processor has something else to do before you give it the next four writes. Memory reads
+and other instructions can execute out of order, except <kbd>IN, OUT</kbd> and serializing
+instructions.
+<p>
+If your code writes to a memory address and soon after reads from the same address, then
+the read may by mistake be executed before the write because the ROB doesn't know the
+memory addresses at the time of reordering. This error is detected when the write address
+is calculated, and then the read operation (which was executed speculatively)
+has to be re-done. The penalty for this is approximately 3 clocks. The only way to avoid this penalty is to
+make sure the execution unit has other things to do between a write and a subsequent read
+from the same memory address.
+<p>
+There are several execution units clustered around five ports. Port 0 and 1 are for
+arithmetic operations etc. Simple move, arithmetic and logic operations can go to either port 0 or 1,
+whichever is vacant first. Port 0 also handles multiplication, division, integer shifts and
+rotates, and floating point operations. Port 1 also handles jumps and some MMX
+and XMM operations. Port 2 handles all reads from memory and a few string and XMM operations, port 3 calculates addresses for memory
+write, and port 4 executes all memory write operations. In chapter <a href="#29">29</a> you'll find a complete
+list of the uops generated by code instructions with an indication of which ports they go to.
+Note that all memory write operations require two uops, one for port 3 and one for port 4,
+while memory read operations use only one uop (port 2).
+<p>
+In most cases each port can receive one new uop per clock cycle. This means that you can
+execute up to 5 uops in the same clock cycle if they go to five different ports, but since
+there is a limit of 3 uops per clock earlier in the pipeline you will never execute more than 3
+uops per clock on average.
+<p>
+You must make sure that no execution port receives more than one third of the uops if you
+want to maintain a throughput of 3 uops per clock. Use the table of uops in chapter
+<a href="#29">29</a> and
+count how many uops go to each port. If port 0 and 1 are saturated while port 2 is free then
+you can improve your code by replacing some <kbd>MOV register,register</kbd>
+or <kbd>MOV register,immediate</kbd> instructions with
+ <kbd>MOV register,memory</kbd> in order to move some
+of the load from port 0 and 1 to port 2.
+<p>
+Most uops take only one clock cycle to execute, but multiplications, divisions, and many
+floating point operations take more:
+<p>
+Floating point addition and subtraction takes 3 clocks, but the execution unit is fully
+pipelined so that it can receive a new <kbd>FADD</kbd> or <kbd>FSUB</kbd>
+in every clock cycle before the
+preceding ones are finished (provided, of course, that they are independent).
+<p>
+Integer multiplication takes 4 clocks, floating point multiplication 5, and
+MMX multiplication 3 clocks. Integer and MMX multiplication is pipelined so
+that it can receive a new instruction every clock cycle. Floating point
+multiplication is partially pipelined: The execution unit can receive a new
+<kbd>FMUL</kbd> instruction two clocks after the preceding one, so that the
+maximum throughput is one <kbd>FMUL</kbd> per two clock cycles. The holes
+between the <kbd>FMUL</kbd>'s cannot be filled by integer multiplications
+because they use the same circuitry. XMM additions and multiplications take
+3 and 4 clocks respectively, and are fully pipelined. But since each logical XMM
+register is implemented as two physical 64-bit registers, you need two uops for a
+packed XMM operation, and the throughput will then be one arithmetic XMM
+instruction every two clock cycles. XMM add and multiply instructions can execute
+in parallel because they don't use the same execution port.
+<p>
+Integer and floating point division takes up to 39 clocks and is not pipelined. This means
+that the execution unit cannot begin a new division until the previous division is finished.
+The same applies to squareroot and transcendental functions.
+<p>
+Also jump instructions, calls, and returns are not fully pipelined. You cannot execute a new
+jump in the first clock cycle after a preceding jump. So the maximum throughput for jumps,
+calls, and returns is one for every two clocks.
+<p>
+You should, of course, avoid instructions that generate many uops.
+The <kbd>LOOP XX</kbd>
+instruction, for example, should be replaced by <kbd>DEC ECX / JNZ XX</kbd>.
+<p>
+If you have consecutive <kbd>POP</kbd> instructions then you may break them up to reduce the
+number of uops:
+<pre>POP ECX / POP EBX / POP EAX ; can be changed to:
+MOV ECX,[ESP] / MOV EBX,[ESP+4] / MOV EAX,[ESP] / ADD ESP,12</pre>
+The former code generates 6 uops, the latter generates only 4 and decodes faster.
+Doing the same with <kbd>PUSH</kbd> instructions is less advantageous because the split-up code is likely to
+generate register read stalls unless you have other instructions to put in between or the
+registers have been renamed recently. Doing it with <kbd>CALL</kbd> and <kbd>RET</kbd>
+instructions will
+interfere with prediction in the return stack buffer. Note also that the
+<kbd>ADD ESP</kbd> instruction can cause an AGI stall in earlier processors.
+<p>
+<h2><a name="18">18</a>. Retirement (PPro, PII and PIII)</h2><p>
+Retirement is a process where the temporary registers used by the uops are copied into the
+permanent registers <kbd>EAX, EBX</kbd>, etc.
+When a uop has been executed it is marked in the ROB as ready to retire.
+<p>
+The retirement station can handle three uops per clock cycle. This may not seem like a
+problem because the throughput is already limited to 3 uops per clock in the RAT. But
+retirement may still be a bottleneck for two reasons. Firstly, instructions must retire in order.
+If a uop is executed out of order then it cannot retire before all preceding uops in the order
+have retired. And the second limitation is that taken jumps must retire in the first of the three
+slots in the retirement station. Just like decoder D1 and D2 can be idle if the next instruction
+only fits into D0, the last two slots in the retirement station can be idle if the next uop to
+retire is a taken jump. This is significant if you have a small loop where the number of uops
+in the loop is not divisible by three.
+<p>
+All uops stay in the reorder buffer (ROB) until they retire. The ROB can hold 40 uops. This
+sets a limit to the number of instructions that can execute during the long delay of a division
+or other slow operation. Before the division is finished the ROB will be filled up with
+executed uops waiting to retire. Only when the division is finished and retired can the
+subsequent uops begin to retire, because retirement takes place in order.
+<p>
+In case of speculative execution of predicted branches (see chapter <a href="#22">22</a>) the speculatively
+executed uops cannot retire until it is certain that the prediction was correct. If the prediction
+turns out to be wrong then the speculatively executed uops are discarded without
+retirement.
+<p>
+The following instructions cannot execute speculatively: memory writes,
+<kbd>IN, OUT</kbd>, and serializing instructions.
+<p>
+<h2><a name="19">19</a>. Partial stalls (PPro, PII and PIII)</h2>
+<h3><a name="19_1">19.1 Partial register stalls</a></h3><p>
+Partial register stall is a problem that occurs when you write to part of a 32
+bit register and later read from the whole register or a bigger part of it.
+Example:
+<pre> MOV AL, BYTE PTR [M8]
+ MOV EBX, EAX ; partial register stall</pre><p>
+This gives a delay of 5-6 clocks. The reason is that a temporary register has been assigned
+to <kbd>AL</kbd> (to make it independent of <kbd>AH</kbd>).
+The execution unit has to wait until the write to <kbd>AL</kbd> has
+retired before it is possible to combine the value from <kbd>AL</kbd> with the
+value of the rest of <kbd>EAX</kbd>.
+The stall can be avoided by changing to code to:
+<pre> MOVZX EBX, BYTE PTR [MEM8]
+ AND EAX, 0FFFFFF00h
+ OR EBX, EAX</pre>
+<p>
+Of course you can also avoid the partial stalls by putting in other instructions after the write
+to the partial register so that it has time to retire before you read from the full register.
+<p>
+You should be aware of partial stalls whenever you mix different data sizes (8, 16, and 32
+bits):
+<pre> MOV BH, 0
+ ADD BX, AX ; stall
+ INC EBX ; stall</pre><p>
+
+You don't get a stall when reading a partial register after writing to the full register, or a
+bigger part of it:
+<pre> MOV EAX, [MEM32]
+ ADD BL, AL ; no stall
+ ADD BH, AH ; no stall
+ MOV CX, AX ; no stall
+ MOV DX, BX ; stall</pre><p>
+
+The easiest way to avoid partial register stalls is to always use full registers
+and use <kbd>MOVZX</kbd> or <kbd>MOVSX</kbd> when reading from smaller memory
+operands. These instructions are fast on the
+PPro, PII and PIII, but slow on earlier processors. Therefore, a compromise is
+offered when you
+want your code to perform reasonably well on all processors. The replacement
+for <kbd>MOVZX EAX,BYTE PTR [M8]</kbd> looks like this:
+<pre> XOR EAX, EAX
+ MOV AL, BYTE PTR [M8]</pre><p>
+
+The PPro, PII and PIII processors make a special case out of this combination
+to avoid a partial
+register stall when later reading from <kbd>EAX</kbd>.
+The trick is that a register is tagged as empty
+when it is <kbd>XOR</kbd>'ed with itself. The processor remembers that the upper 24 bits of
+<kbd>EAX</kbd> are zero, so that a partial stall can be avoided. This mechanism
+works only on certain combinations:
+<pre> XOR EAX, EAX
+ MOV AL, 3
+ MOV EBX, EAX ; no stall
+
+ XOR AH, AH
+ MOV AL, 3
+ MOV BX, AX ; no stall
+
+ XOR EAX, EAX
+ MOV AH, 3
+ MOV EBX, EAX ; stall
+
+ SUB EBX, EBX
+ MOV BL, DL
+ MOV ECX, EBX ; no stall
+
+ MOV EBX, 0
+ MOV BL, DL
+ MOV ECX, EBX ; stall
+
+ MOV BL, DL
+ XOR EBX, EBX ; no stall</pre><p>
+
+Setting a register to zero by subtracting it from itself works the same as the
+<kbd>XOR</kbd>, but setting it to zero with the <kbd>MOV</kbd> instruction
+doesn't prevent the stall.
+<p>
+You can set the <kbd>XOR</kbd> outside a loop:
+<pre> XOR EAX, EAX
+ MOV ECX, 100
+LL: MOV AL, [ESI]
+ MOV [EDI], EAX ; no stall
+ INC ESI
+ ADD EDI, 4
+ DEC ECX
+ JNZ LL</pre><p>
+The processor remembers that the upper 24 bits of <kbd>EAX</kbd> are zero as
+long as you don't get
+an interrupt, misprediction, or other serializing event.
+<p>
+You should remember to neutralize any partial register you have used before calling a
+subroutine that might push the full register:
+<pre> ADD BL, AL
+ MOV [MEM8], BL
+ XOR EBX, EBX ; neutralize BL
+ CALL _HighLevelFunction</pre><p>
+Most high level language procedures push <kbd>EBX</kbd> at the start of the
+procedure which would generate a partial register stall in the example above
+if you hadn't neutralized <kbd>BL</kbd>.
+<p>
+Setting a register to zero with the <kbd>XOR</kbd> method doesn't break its dependency on earlier
+instructions:
+<pre> DIV EBX
+ MOV [MEM], EAX
+ MOV EAX, 0 ; break dependency
+ XOR EAX, EAX ; prevent partial register stall
+ MOV AL, CL
+ ADD EBX, EAX</pre><p>
+Setting <kbd>EAX</kbd> to zero twice here seems redundant, but without
+the <kbd>MOV EAX,0</kbd> the last
+instructions would have to wait for the slow <kbd>DIV</kbd> to finish, and
+without <kbd>XOR EAX,EAX</kbd> you
+would have a partial register stall.
+<p>
+The <kbd>FNSTSW AX</kbd> instruction is special: in 32 bit mode it behaves as
+if writing to the entire <kbd>EAX</kbd>. In fact, it does something like this
+in 32 bit mode:<br>
+<kbd> AND EAX,0FFFF0000h / FNSTSW TEMP / OR EAX,TEMP</kbd><br>
+hence, you don't get a partial register stall when reading <kbd>EAX</kbd>
+after this instruction in 32 bit mode:
+<pre> FNSTSW AX / MOV EBX,EAX ; stall only if 16 bit mode
+ MOV AX,0 / FNSTSW AX ; stall only if 32 bit mode</pre>
+
+<p>
+<h3><a name="19_2">19.2 Partial flags stalls</a></h3><p>
+The flags register can also cause partial register stalls:
+<pre> CMP EAX, EBX
+ INC ECX
+ JBE XX ; partial flags stall</pre><p>
+The <kbd>JBE</kbd> instruction reads both the carry flag and the zero flag.
+Since the <kbd>INC</kbd> instruction
+changes the zero flag, but not the carry flag, the <kbd>JBE</kbd> instruction has to wait for the two
+preceding instructions to retire before it can combine the carry flag from the <kbd>CMP</kbd> instruction
+and the zero flag from the <kbd>INC</kbd> instruction. This situation is likely to be a bug rather than an
+intended combination of flags. To correct it change <kbd>INC ECX</kbd> to <kbd>ADD ECX,1</kbd>.
+ A similar
+bug that causes a partial flags stall is <kbd>SAHF / JL XX</kbd>. The <kbd>JL</kbd>
+instruction tests the sign
+flag and the overflow flag, but <kbd>SAHF</kbd> doesn't change the overflow flag.
+To correct it, change
+<kbd>JL XX</kbd> to <kbd>JS XX</kbd>.
+<p>
+Unexpectedly (and contrary to what Intel manuals say) you also get a partial flags stall after
+an instruction that modifies some of the flag bits when reading only unmodified flag bits:
+<pre> CMP EAX, EBX
+ INC ECX
+ JC XX ; partial flags stall</pre><p>
+but not when reading only modified bits:
+<pre> CMP EAX, EBX
+ INC ECX
+ JE XX ; no stall</pre><p>
+
+Partial flags stalls are likely to occur on instructions that read many or
+all flags bits, i.e. <kbd>LAHF, PUSHF, PUSHFD</kbd>. The following instructions cause
+partial flags stalls when followed by <kbd>LAHF</kbd> or <kbd>PUSHF(D)</kbd>:
+<kbd>INC, DEC, TEST</kbd>, bit tests, bit scan, <kbd>CLC, STC, CMC, CLD, STD, CLI, STI, MUL,
+IMUL</kbd>, and all shifts and rotates.
+The following instructions do not cause partial flags stalls:
+<kbd>AND, OR, XOR, ADD, ADC, SUB, SBB, CMP, NEG</kbd>.
+It is strange that <kbd>TEST</kbd> and <kbd>AND</kbd> behave differently while, by definition, they
+do exactly the same thing to the flags. You may use a <kbd>SETcc</kbd>
+ instruction instead of <kbd>LAHF</kbd>
+or <kbd>PUSHF(D)</kbd> for storing the value of a flag in order to avoid a stall.
+<p>
+Examples:
+<pre> INC EAX / PUSHFD ; stall
+ ADD EAX,1 / PUSHFD ; no stall
+
+ SHR EAX,1 / PUSHFD ; stall
+ SHR EAX,1 / OR EAX,EAX / PUSHFD ; no stall
+
+ TEST EBX,EBX / LAHF ; stall
+ AND EBX,EBX / LAHF ; no stall
+ TEST EBX,EBX / SETZ AL ; no stall
+
+ CLC / SETZ AL ; stall
+ CLD / SETZ AL ; no stall</pre><p>
+The penalty for partial flags stalls is approximately 4 clocks.
+<p>
+
+<h3><a name="19_3">19.3 Flags stalls after shifts and rotates</a></h3><p>
+You can get a stall resembling the partial flags stall when reading any flag
+bit after a shift or rotate, except for shifts and rotates by one (short form):
+<pre> SHR EAX,1 / JZ XX ; no stall
+ SHR EAX,2 / JZ XX ; stall
+ SHR EAX,2 / OR EAX,EAX / JZ XX ; no stall
+
+ SHR EAX,5 / JC XX ; stall
+ SHR EAX,4 / SHR EAX,1 / JC XX ; no stall
+
+ SHR EAX,CL / JZ XX ; stall, even if CL = 1
+ SHRD EAX,EBX,1 / JZ XX ; stall
+ ROL EBX,8 / JC XX ; stall</pre><p>
+
+The penalty for these stalls is approximately 4 clocks.
+<p>
+
+<h3><a name="19_4">19.4 Partial memory stalls</a></h3><p>
+A partial memory stall is somewhat analogous to a partial register stall. It occurs when you
+mix data sizes for the same memory address:
+<pre> MOV BYTE PTR [ESI], AL
+ MOV EBX, DWORD PTR [ESI] ; partial memory stall</pre><p>
+Here you get a stall because the processor has to combine the byte written from AL with the
+next three bytes, which were in memory before, to get the four bytes needed for
+reading into <kbd>EBX</kbd>. The penalty is approximately 7-8 clocks.
+<p>
+Unlike the partial register stalls, you also get a partial memory stall when you write a bigger
+operand to memory and then read part of it, if the smaller part doesn't start at the same
+address:
+<pre> MOV DWORD PTR [ESI], EAX
+ MOV BL, BYTE PTR [ESI] ; no stall
+ MOV BH, BYTE PTR [ESI+1] ; stall</pre><p>
+You can avoid this stall by changing the last line to <kbd>MOV BH,AH</kbd>,
+but such a solution is not
+possible in a situation like this:
+<pre> FISTP QWORD PTR [EDI]
+ MOV EAX, DWORD PTR [EDI]
+ MOV EDX, DWORD PTR [EDI+4] ; stall</pre><p>
+
+Interestingly, you can also get a partial memory stall when writing and reading completely
+different addresses if they happen to have the same set-value in different cache banks:
+<pre> MOV BYTE PTR [ESI], AL
+ MOV EBX, DWORD PTR [ESI+4092] ; no stall
+ MOV ECX, DWORD PTR [ESI+4096] ; stall</pre>
+<p>
+<h2><a name="20">20</a>. Dependency chains (PPro, PII and PIII)</h2><p>
+A series of instructions where each instruction depends on the result of the preceding one
+is called a dependency chain. Long dependency chains should be avoided, if possible,
+because they prevent out-of-order and parallel execution.
+<p>
+Example:
+<pre> MOV EAX, [MEM1]
+ ADD EAX, [MEM2]
+ ADD EAX, [MEM3]
+ ADD EAX, [MEM4]
+ MOV [MEM5], EAX</pre><p>
+In this eaxmple, the <kbd>ADD</kbd> instructions generate 2 uops each, one for reading from memory
+(port 2), and one for adding (port 0 or 1). The read uops can execute out or order, while the
+add uops must wait for the previous uops to finish. This dependency chain does not take
+very long to execute, because each addition adds only 1 clock to the execution time. But if
+you have slow instructions like multiplications, or even worse: divisions, then you should
+definitely do something to break the dependency chain. The way to do this is to use multiple
+accumulators:
+<pre> MOV EAX, [MEM1] ; start first chain
+ MOV EBX, [MEM2] ; start other chain in different accumulator
+ IMUL EAX, [MEM3]
+ IMUL EBX, [MEM4]
+ IMUL EAX, EBX ; join chains in the end
+ MOV [MEM5], EAX</pre><p>
+Here, the second <kbd>IMUL</kbd> instruction can start before the first one is finished.
+Since the <kbd>IMUL</kbd> instruction has a delay of 4 clocks and is fully pipelined, you
+may have up to 4 accumulators.
+<p>
+Division is not pipelined so you cannot do the same with chained divisions,
+but you can of course multiply all the divisors and do only one division in
+the end.
+<p>
+Floating point instructions have a longer delay than integer instructions, so
+you should definitely break up long dependency chains with floating point
+instructions:
+<pre> FLD [MEM1] ; start first chain
+ FLD [MEM2] ; start second chain in different accumulator
+ FADD [MEM3]
+ FXCH
+ FADD [MEM4]
+ FXCH
+ FADD [MEM5]
+ FADD ; join chains in the end
+ FSTP [MEM6]</pre><p>
+You need a lot of <kbd>FXCH</kbd> instructions for this, but don't worry: they
+are cheap. <kbd>FXCH</kbd>
+instructions are resolved in the RAT by register renaming so they don't
+put any load on the execution ports. An <kbd>FXCH</kbd> does count as 1 uop in the RAT,
+ROB, and retirement station, though.
+<p>
+If the dependency chain is long you may need three accumulators:
+<pre> FLD [MEM1] ; start first chain
+ FLD [MEM2] ; start second chain
+ FLD [MEM3] ; start third chain
+ FADD [MEM4] ; third chain
+ FXCH ST(1)
+ FADD [MEM5] ; second chain
+ FXCH ST(2)
+ FADD [MEM6] ; first chain
+ FXCH ST(1)
+ FADD [MEM7] ; third chain
+ FXCH ST(2)
+ FADD [MEM8] ; second chain
+ FXCH ST(1)
+ FADD ; join first and third chain
+ FADD ; join with second chain
+ FSTP [MEM9]</pre><p>
+
+Avoid storing intermediate data in memory and read them immediately afterwards:
+<pre> MOV [TEMP], EAX
+ MOV EBX, [TEMP]</pre><p>
+There is a penalty for attempting to read from a memory address before a previous write to
+that address is finished. In the example above, change the last instruction to
+<kbd>MOV EBX,EAX</kbd>
+or put some other instructions in between.
+<p>
+There is one situation where you cannot avoid storing intermediate data in memory, and
+that is when transferring data from an integer register to a floating point register, or vice
+versa. For example:
+<pre> MOV EAX, [MEM1]
+ ADD EAX, [MEM2]
+ MOV [TEMP], EAX
+ FILD [TEMP]</pre><p>
+If you don't have anything to put in between the write to <kbd>TEMP</kbd> and the
+read from <kbd>TEMP</kbd>, then
+you may consider using a floating point register instead of <kbd>EAX</kbd>:
+<pre> FILD [MEM1]
+ FIADD [MEM2]</pre><p>
+
+Consecutive jumps, calls, or returns may also be considered dependency chains. The
+throughput for these instructions is one jump per two clock cycles. It is therefore
+recommended that you give the microprocessor something else to do between the jumps.
+<p>
+<h2><a name="21">21</a>. Searching for bottlenecks (PPro, PII and PIII)</h2><p>
+When optimizing code for these processors, it is important to analyze where the
+bottlenecks are. Spending time on optimizing away one bottleneck doesn't make sense if
+there is another bottleneck which is narrower.
+<p>
+If you expect code cache misses then you should restructure your code to keep the most
+used parts of code together.
+<p>
+If you expect many data cache misses then forget about everything else and concentrate
+on how to restructure your data to reduce the number of cache misses (chapter <a href="#7">7</a>), and
+avoid long dependency chains after a data read cache miss (chapter <a href="#20">20</a>).
+<p>
+If you have many divisions then try to reduce them (chapter <a href="#27_2">27.2</a>) and make sure the
+processor has something else to do during the divisions.
+<p>
+Dependency chains tend to hamper out-of-order execution (chapter <a href="#20">20</a>). Try to break long
+dependency chains, especially if they contain slow instructions such as multiplication,
+division, and floating point instructions.
+<p>
+If you have many jumps, calls, or returns, and especially if the jumps are poorly predictable,
+then try if some of them can be avoided. Replace conditional jumps with conditional moves
+if possible, and replace small procedures with macros (chapter <a href="#22_3">22.3</a>).
+<p>
+If you are mixing different data sizes (8, 16, and 32 bit integers) then look out for partial
+stalls. If you use <kbd>PUSHF</kbd> or <kbd>LAHF</kbd> instructions then look out for partial flags stalls. Avoid
+testing flags after shifts or rotates by more than 1 (chapter <a href="#19">19</a>).
+<p>
+If you aim at a throughput of 3 uops per clock cycle then be aware of possible delays in
+instruction fetch and decoding (chapter and <a href="#14">14</a> and <a href="#15">15</a>), especially in small loops.
+<p>
+The limit of two permanent register reads per clock cycle may reduce your throughput to
+less than 3 uops per clock cycle (chapter <a href="#16_2">16.2</a>). This is likely to happen if you often read
+registers more than 4 clock cycles after they last were modified. This may, for example,
+happen if you often use pointers for addressing your data but seldom modify the pointers.
+<p>
+A throughput of 3 uops per clock requires that no execution port gets more than one third of
+the uops (chapter <a href="#17">17</a>).
+<p>
+The retirement station can handle 3 uops per clock, but may be slightly less effective for
+taken jumps (chapter <a href="#18">18</a>).
+
+<p>
+<h2><a name="22">22</a>. Jumps and branches (all processors)</h2><p>
+The Pentium family of processors attempt to predict where a jump will go to, and whether a
+conditional jump will be taken or fall through. If the prediction is correct, then it can save a
+considerable amount of time by loading the subsequent instructions into the pipeline and
+start decoding them before the jump is executed. If the prediction turns out to be wrong,
+then the pipeline has to be flushed, which will cost a penalty depending on the length of the
+pipeline.
+<p>
+The predictions are based on a Branch Target Buffer (BTB) which stores the history for
+each branch or jump instruction and makes predictions based on the prior history of
+executions of each instruction. The BTB is organized like a set-associative cache where
+new entries are allocated according to a pseudo-random replacement method.
+<p>
+When optimizing code, it is important to minimize the number of misprediction penalties.
+This requires a good understanding of how the jump prediction works.
+<p>
+The branch prediction mechanisms are not described adequately in Intel manuals or
+anywhere else. I am therefore giving a very detailed description here. This information is
+based on my own research (with the help of Karki Jitendra Bahadur for the PPlain).
+<p>
+In the following, I will use the term 'control transfer instruction' for any instruction which can
+change the instruction pointer, including conditional and unconditional, direct and indirect,
+near and far, jumps, calls, and returns. All these instructions use prediction.
+<p>
+
+<h3><a name="22_1">22.1 Branch prediction in PPlain</a></h3><p>
+The branch prediction mechanism for the PPlain is very different from the other three
+processors. Information found in Intel documents and elsewhere on this subject is directly
+misleading, and following the advises given is such documents is likely to lead to
+sub-optimal code.
+<p>
+The PPlain has a branch target buffer (BTB), which can hold information for up to 256 jump
+instructions. The BTB is organized like a 4-way set-associative cache with 64 entries per
+way. This means that the BTB can hold no more than 4 entries with the same set value.
+Unlike the data cache, the BTB uses a pseudo random replacement algorithm, which
+means that a new entry will not necessarily displace the least recently used entry of the
+same set-value. How the set-value is calculated will be explained later. Each BTB entry
+stores the address of the jump target and a prediction state, which can have four different
+values:
+<p>
+state 0: "strongly not taken" <br>
+state 1: "weakly not taken" <br>
+state 2: "weakly taken" <br>
+state 3: "strongly taken"<p>
+
+A branch instruction is predicted to jump when in state 2 or 3, and to fall through when in
+state 0 or 1. The state transition works like a two-bit counter, so that the state is
+incremented when the branch is taken, and decremented when it falls through. The counter
+saturates, rather than wrap around, so that it does not decrement beyond 0 or increment
+beyond 3. Ideally, this would provide a reasonably good prediction, because a branch
+instruction would have to deviate twice from what it does most of the time, before the
+prediction changes.
+<p>
+However, this mechanism has been compromised by the fact that state 0 also means
+'unused BTB entry'. So a BTB entry in state 0 is the same as no BTB entry. This makes
+sense, because a branch instruction is predicted to fall through if it has no BTB entry. This
+improves the utilization of the BTB, because a branch instruction which is seldom taken will
+most of the time not take up any BTB entry.
+<p>
+Now, if a jumping instruction has no BTB entry, then a new BTB entry will be generated,
+and this new entry will always be set to state 3. This means that it is impossible to go from
+state 0 to state 1 (except for a very special case discussed later). From state 0 you can only
+go to state 3, if the branch is taken. If the branch falls through, then it will stay out of the
+BTB.
+<p>
+This is a serious design flaw. By throwing state 0 entries out of the BTB and always setting
+new entries to state 3, the designers apparently have given priority to minimizing the first
+time penalty for unconditional jumps and branches often taken, and ignored that this
+seriously compromises the basic idea behind the mechanism and reduces the performance
+in small innermost loops. The consequence of this flaw is, that a branch instruction which
+falls through most of the time will have up to three times as many mispredictions as a
+branch instruction which is taken most of the time. (Apparently, Intel engineers
+have been unaware of this flaw until I published my findings).
+<p>
+You may take this asymmetry into account by organizing your branches so that they are
+taken more often than not. Consider for example this if-then-else construction:
+<pre> TEST EAX,EAX
+ JZ A
+ &lt;branch 1&gt;
+ JMP E
+A: &lt;branch 2&gt;
+E:</pre>
+<p>
+If branch 1 is executed more often than branch 2, and branch 2 is seldom executed twice in
+succession, then you can reduce the number of branch mispredictions by up to a factor 3
+by swapping the two branches so that the branch instruction will jump more often than fall
+through:
+<pre> TEST EAX,EAX
+ JNZ A
+ &lt;branch 2&gt;
+ JMP E
+A: &lt;branch 1&gt;
+E:</pre><p>
+
+(This is contrary to the recommendations in Intel's manuals and tutorials).
+<p>
+There may be reasons to put the most often executed branch first, however:
+<ol>
+<li>Putting seldom executed branches away in the bottom of your code can improve code
+cache utilization.
+<li>A branch instruction seldom taken will stay out of the BTB most of the time, possibly
+improving BTB utilization.
+<li>The branch instruction will be predicted as not taken if it has been flushed out of the
+BTB by other branch instructions.
+<li>The asymmetry in branch prediction only exists on the PPlain.
+</ol>
+<p>
+These considerations have little weight, however, for small critical loops, so I would still
+recommend organizing branches with a skewed distribution so that the branch instruction is
+taken more often than not, unless branch 2 is executed so seldom, that misprediction
+doesn't matter.
+<p>
+Likewise, you should preferably organize loops with the testing branch instruction at the
+bottom, as in this example:
+<pre> MOV ECX, [N]
+L: MOV [EDI],EAX
+ ADD EDI,4
+ DEC ECX
+ JNZ L</pre><p>
+If N is high, then the JNZ instruction here will be taken more often than not, and never fall
+through twice in succession.
+<p>
+Consider the situation where a branch is taken every second time. The first time it jumps
+the BTB entry will go into state 3, and will then alternate between state 2 and 3. It is
+predicted to jump all the time, which gives 50% mispredictions. <a name="worstpred">Assume now that it deviates
+from this regular pattern and falls through an extra time</a>. The jump pattern is:<pre>
+01010100101010101010101, where 0 means nojump, and 1 means jump.
+ ^</pre>
+The extra nojump is indicated with a <kbd>^</kbd> above. After this incident, the BTB entry will alternate
+between state 1 and 2, which gives 100% mispredictions. It will continue in this unfortunate
+mode until there is another deviation from the 0101 pattern. This is the worst case for this
+branch prediction mechanism.
+<p>
+<h4>22.1.2 BTB is looking ahead (PPlain)</h4>
+The BTB mechanism is counting instruction pairs, rather than single instructions, so you
+have to know how instructions are pairing in order to analyze where a BTB entry is stored.
+The BTB entry for any control instruction is attached to the address of the U-pipe
+instruction in the preceding instruction pair. (An unpaired instruction counts as one pair).
+Example:
+<pre> SHR EAX,1
+ MOV EBX,[ESI]
+ CMP EAX,EBX
+ JB L</pre><p>
+Here <kbd>SHR</kbd> pairs with <kbd>MOV</kbd>, and <kbd>CMP</kbd> pairs with
+<kbd>JB</kbd>. The BTB entry for <kbd>JB L</kbd> is thus
+attached to the address of the <kbd>SHR EAX,1</kbd> instruction. When this BTB entry is met, and if it
+is in state 2 or 3, then the Pentium will read the target address from the BTB entry, and load
+the instructions following L into the pipeline. This happens before the branch instruction has
+been decoded, so the Pentium relies solely on the information in the BTB when doing this.
+<p>
+You may remember, that instructions are seldom pairing the first time they are executed
+(see chapter <a href="#8">8</a>). If the instructions above are not pairing, then the BTB entry should be
+attached to the address of the <kbd>CMP</kbd> instruction, and this entry would be wrong on the next
+execution, when instructions are pairing. However, in most cases the PPlain is smart
+enough to not make a BTB entry when there is an unused pairing opportunity, so you don't
+get a BTB entry until the second execution, and hence you won't get a prediction until the
+third execution. (In the rare case, where every second instruction is a single-byte
+instruction, you may get a BTB entry on the first execution which becomes invalid in the
+second execution, but since the instruction it is attached to will then go to the V-pipe, it is
+ignored and gives no penalty. A BTB entry is only read if it is attached to the address of a
+U-pipe instruction).
+<p>
+A BTB entry is identified by its set-value which is equal to bits 0-5 of the address it is
+attached to. Bits 6-31 are then stored in the BTB as a tag. Addresses which are spaced a
+multiple of 64 bytes apart will have the same set-value. You can have no more than four
+BTB entries with the same set-value. If you want to check whether your jump instructions
+contend for the same BTB entries, then you have to compare bits 0-5 of the addresses of
+the U-pipe instructions in the preceding instruction pairs. This is very tedious, and I have
+never heard of anybody doing so. There are no tools available to do this job for you.
+<p>
+<h4>22.1.3 Consecutive branches (PPlain)</h4><p>
+When a jump is mispredicted, then the pipeline gets flushed. If the next instruction pair
+executed also contains a control transfer instruction, then the PPlain won't load its target
+because it cannot load a new target while the pipeline is being flushed. The result is that the
+second jump instruction is predicted to fall through regardless of the state of its BTB entry.
+Therefore, if the second jump is also taken, then you will get another penalty. The state of
+the BTB entry for the second jump instruction does get correctly updated, though. If you
+have a long chain of control transfer instructions, and the first jump in the chain is
+mispredicted, then the pipeline will get flushed all the time, and you will get nothing but
+mispredictions until you meet an instruction pair which does not jump. The most extreme
+case of this is a loop which jumps to itself: It will get a misprediction penalty for each
+iteration.
+<p>
+This is not the only problem with consecutive control transfer instructions. Another problem
+is that you can have another branch instruction between a BTB entry and the control
+transfer instruction it belongs to. If the first branch instruction jumps to somewhere else,
+then strange things may happen. Consider this example:
+<pre> SHR EAX,1
+ MOV EBX,[ESI]
+ CMP EAX,EBX
+ JB L1
+ JMP L2
+
+L1: MOV EAX,EBX
+ INC EBX</pre><p>
+
+When <kbd>JB L1</kbd> falls through, then you will get a BTB entry for
+<kbd>JMP L2</kbd> attached to the
+address of <kbd>CMP EAX,EBX</kbd>. But what will happen when <kbd>JB L1</kbd>
+later is taken? At the time
+when the BTB entry for <kbd>JMP L2</kbd> is read, the processor doesn't know that the next
+instruction pair does not contain a jump instruction, so it will actually predict the instruction
+pair <kbd>MOV EAX,EBX / INC EBX</kbd> to jump to <kbd>L2</kbd>.
+The penalty for predicting non-jump
+instructions to jump is 3 clock cycles. The BTB entry for <kbd>JMP L2</kbd> will get its state
+decremented, because it is applied to something which doesn't jump. If we keep going to
+<kbd>L1</kbd>, then the BTB entry for <kbd>JMP L2</kbd> will be decremented to state 1 and 0, so that the
+problem will disappear until next time <kbd>JMP L2</kbd> is executed.
+<p>
+The penalty for predicting the non-jumping instructions to jump only occurs when the jump
+to <kbd>L1</kbd> is predicted. In the case that <kbd>JB L1</kbd> is mispredictedly
+jumping, then the pipeline gets
+flushed and we won't get the false <kbd>L2</kbd> target loaded, so in this case we will not see the
+penalty of predicting the non-jumping instructions to jump, but we do get the BTB entry for
+<kbd>JMP L2</kbd> decremented.
+<p>
+Suppose, now, that we replace the <kbd>INC EBX</kbd> instruction above with another jump
+instruction. This third jump instruction will then use the same BTB entry as
+<kbd>JMP L2</kbd> with
+the possible penalty of predicting a wrong target, (unless it happens to also
+have <kbd>L2</kbd> as target).
+<p>
+To summarize, consecutive jumps can lead to the following problems:
+<ul>
+<li>failure to load a jump target when the pipeline is being flushed by a preceding
+mispredicted jump.
+<li>a BTB entry being mis-applied to non-jumping instructions and predicting them to jump.
+<li>a second consequence of the above is that a mis-applied BTB entry will get its state
+decremented, possibly leading to a later misprediction of the jump it belongs to. Even
+unconditional jumps can be predicted to fall through for this reason.
+<li>two jump instructions may share the same BTB entry, leading to the prediction of a
+wrong target.
+</ul>
+<p>
+
+All this mess may give you a lot of penalties, so you should definitely avoid having an
+instruction pair containing a jump immediately after another poorly predictable control
+transfer instruction or its target.
+<p>
+It is time for another illustrative example:
+<pre> CALL P
+ TEST EAX,EAX
+ JZ L2
+L1: MOV [EDI],EBX
+ ADD EDI,4
+ DEC EAX
+ JNZ L1
+L2: CALL P</pre><p>
+
+This looks like a quite nice and normal piece of code: A function call, a loop which is
+bypassed when the count is zero, and another function call. How many problems can you
+spot in this program?
+<p>
+First, we may note that the function <kbd>P</kbd> is called alternatingly from two different locations.
+This means that the target for the return from <kbd>P</kbd> will be changing all the time. Consequently,
+the return from <kbd>P</kbd> will always be mispredicted.
+<p>
+Assume, now, that <kbd>EAX</kbd> is zero. The jump to <kbd>L2</kbd> will not have its target loaded because the
+mispredicted return caused a pipeline flush. Next, the second <kbd>CALL P</kbd> will also fail to have
+its target loaded because <kbd>JZ L2</kbd> caused a pipeline flush. Here we have the situation where
+a chain of consecutive jumps makes the pipeline flush repeatedly because the first jump
+was mispredicted. The BTB entry for <kbd>JZ L2</kbd> is stored at the address of <kbd>P</kbd>'s return
+instruction. This BTB entry will now be mis-applied to whatever comes after the second
+<kbd>CALL P</kbd>, but that doesn't give a penalty because the pipeline is flushed by the mispredicted
+second return.
+<p>
+Now, let's see what happens if <kbd>EAX</kbd> has a nonzero value the next time:
+<kbd>JZ L2</kbd> is always
+predicted to fall through because of the flush. The second <kbd>CALL P</kbd>
+has a BTB entry at the
+address of <kbd>TEST EAX,EAX</kbd>. This entry will be mis-applied to the
+<kbd>MOV/ADD</kbd> pair, predicting
+it to jump to <kbd>P</kbd>. This causes a flush which prevents <kbd>JNZ L1</kbd>
+from loading its target. If we
+have been here before, then the second <kbd>CALL P</kbd> will have another BTB entry at the
+address of <kbd>DEC EAX</kbd>. On the second and third iteration of the loop, this entry will also be
+mis-applied to the <kbd>MOV/ADD</kbd> pair, until it has had its state decremented to 1 or 0. This will
+not cause a penalty on the second iteration because the flush from <kbd>JNZ L1</kbd> prevents it
+from loading its false target, but on the third iteration it will. The subsequent iterations of the
+loop have no penalties, but when it exits, <kbd>JNZ L1</kbd> is mispredicted. The flush would now
+prevent <kbd>CALL P</kbd> from loading its target, were it not for the fact that the BTB entry for
+<kbd>CALL P</kbd> has already been destroyed by being mis-applied several times.
+<p>
+We can improve this code by putting in some <kbd>NOP</kbd>'s to separate all consecutive jumps:
+<pre> CALL P
+ TEST EAX,EAX
+ NOP
+ JZ L2
+L1: MOV [EDI],EBX
+ ADD EDI,4
+ DEC EAX
+ JNZ L1
+L2: NOP
+ NOP
+ CALL P</pre><p>
+The extra <kbd>NOP</kbd>'s cost 2 clock cycles, but they save much more.
+Furthermore, <kbd>JZ L2</kbd> is now
+moved to the U-pipe which reduces its penalty from 4 to 3 when mispredicted. The only
+problem that remains is that the returns from <kbd>P</kbd> are always mispredicted. This problem can
+only be solved by replacing the call to <kbd>P</kbd> by an inline macro (if you have enough code
+cache).
+<p>
+The lesson to learn from this example is that you should always look carefully for
+consecutive jumps and see if you can save time by inserting some <kbd>NOP</kbd>'s. You should be
+particularly aware of those situations where misprediction is unavoidable, such as loop exits
+and returns from procedures which are called from varying locations. If you have something
+useful to put in, instead of the <kbd>NOP</kbd>'s, then you should of course do so.
+<p>
+Multiway branches (case statements) may be implemented either as a tree of branch
+instructions or as a list of jump addresses. If you choose to use a tree of branch
+instructions, then you have to include some <kbd>NOP</kbd>'s or other instructions to separate the
+consecutive branches. A list of jump addresses may therefore be a better solution on the
+PPlain. The list of jump addresses should be placed in the data segment. Never put data in
+the code segment!
+<p>
+<h4>22.1.4 Tight loops (PPlain)</h4><p>
+In a small loop you will often access the same BTB entry repeatedly with small intervals.
+This never causes a stall. Rather than waiting for a BTB entry to be updated, the PPlain
+somehow bypasses the pipeline and gets the resulting state from the last jump before it has
+been written to the BTB. This mechanism is almost transparent to the user, but it does in
+some cases have funny effects: You can see a branch prediction going from state 0 to state
+1, rather than to state 3, if the zero has not yet been written to the BTB. This happens if the
+loop has no more than four instruction pairs. In loops with only two instruction pairs you
+may sometimes have state 0 for two consecutive iterations without going out of the BTB. In
+such small loops it also happens in rare cases that the prediction uses the state resulting
+from two iterations ago, rather than from the last iteration. These funny effects will usually
+not have any negative effects on performance.
+<p>
+<h3><a name="22_2">22.2 Branch prediction in PMMX, PPro, PII and PIII</a></h3>
+<h4>22.2.1 BTB organization (PMMX, PPro, PII and PIII)</h4><p>
+The branch target buffer (BTB) of the PMMX has 256 entries organized as 16 ways * 16
+sets. Each entry is identified by bits 2-31 of the address of the last byte of the control
+transfer instruction it belongs to. Bits 2-5 define the set, and bits 6-31 are stored in the BTB
+as a tag. Control transfer instructions which are spaced 64 bytes apart have the
+same set-value and may therefore occasionally push each other out of the BTB. Since there are 16
+ways per set, this won't happen too often.
+<p>
+The branch target buffer (BTB) of the PPro, PII and PIII has 512 entries organized as 16 ways *
+32 sets. Each entry is identified by bits 4-31 of the address of the last byte of the control
+transfer instruction it belongs to. Bits 4-8 define the set, and all bits are stored in the BTB as
+a tag. Control transfer instructions which are spaced 512 bytes apart have the
+same set-value and may therefore occasionally push each other out of the BTB. Since there are 16
+ways per set, this won't happen too often.
+<p>
+The PPro, PII and PIII allocate a BTB entry to any control transfer instruction the first time it is
+executed. The PMMX allocates it the first time it jumps. A branch instruction which never
+jumps will stay out of the BTB on the PMMX. As soon as it has jumped once, it will stay in
+the BTB, even if it never jumps again.
+<p>
+An entry may be pushed out of the BTB when another control transfer instruction with the
+same set-value needs a BTB entry.
+<p>
+<h4>22.2.2 Misprediction penalty (PMMX, PPro, PII and PIII)</h4><p>
+In the PMMX, the penalty for misprediction of a conditional jump is 4 clocks in the U-pipe,
+and 5 clocks if it is executed in the V-pipe. For all other control transfer instructions it is 4
+clocks.
+<p>
+In the PPro, PII and PIII, the misprediction penalty is very high due to the long pipeline. A
+misprediction usually costs between 10 and 20 clock cycles. It is therefore very important to
+be aware of poorly predictable branches when running on PPro, PII and PIII.
+<p>
+<h4>22.2.3 Pattern recognition for conditional jumps (PMMX, PPro, PII and PIII)</h4><p>
+These processors have an advanced pattern recognition mechanism which will correctly
+predict a branch instruction which, for example, is taken every fourth time and falls through
+the other three times. In fact, they can predict any repetitive pattern of jumps and nojumps
+with a period of up to five, and many patterns with higher periods.
+<p>
+The mechanism is a so-called "two-level adaptive branch prediction scheme", invented by
+T.-Y. Yeh and Y. N. Patt. It is based on the same kind of two-bit counters as described
+above for the PPlain (but without the assymmetry flaw). The counter is incremented when
+the jump is taken and decremented when not taken. There is no wrap-around when
+counting up from 3 or down from 0. A branch instruction is predicted to be taken when the
+corresponding counter is in state 2 or 3, and to fall through when in state 0 or 1. An
+impressive improvement is now obtained by having sixteen such counters for each BTB
+entry. It selects one of these sixteen counters based on the history of the branch instruction
+for the last four executions. If, for example, the branch instruction jumps once and then falls
+through three times, then you have the history bits 1000 (1=jump, 0=nojump). This will
+make it use counter number 8 (1000 binary = 8) for predicting the next time and update
+counter 8 afterwards.
+<p>
+If the sequence 1000 is always followed by a 1, then counter number 8 will soon end up in
+its highest state (state 3) so that it will always predict a 1000 sequence to be followed by a
+1. It will take two deviations from this pattern to change the prediction. The repetitive pattern
+100010001000 will have counter 8 in state 3, and counter 1, 2 and 4 in state 0. The other
+twelve counters will be unused.
+<p>
+<h4>22.2.4 Perfectly predicted patterns (PMMX, PPro, PII and PIII)</h4><p>
+A repetitive branch pattern is predicted perfectly by this mechanism if
+every 4-bit sub-sequence in the period is unique.
+Below is a list of repetitive branch patterns which are predicted perfectly:<p>
+<table border=1 cellpadding=1 cellspacing=1>
+<tr><td class="a3">&nbsp;period&nbsp;</td>
+<td class="a3">&nbsp;perfectly predicted patterns&nbsp;</td></tr>
+<tr><td>1-5</td><td>all</td></tr>
+<tr><td>6</td><td>000011, 000101, 000111, 001011</td></tr>
+<tr><td>7</td><td>0000101, 0000111, 0001011</td></tr>
+<tr><td>8</td><td>00001011, 00001111, 00010011, 00010111, 00101101</td></tr>
+<tr><td>9</td><td>000010011, 000010111, 000100111, 000101101</td></tr>
+<tr><td>10</td><td>0000100111, 0000101101, 0000101111, 0000110111, 0001010011, 0001011101</td></tr>
+<tr><td>11</td><td>00001001111, 00001010011, 00001011101, 00010100111</td></tr>
+<tr><td>12</td><td>000010100111, 000010111101, 000011010111, 000100110111, 000100111011</td></tr>
+<tr><td>13</td><td>0000100110111, 0000100111011, 0000101001111</td></tr>
+<tr><td>14</td><td>00001001101111, 00001001111011, 00010011010111, 00010011101011, 00010110011101, 00010110100111</td></tr>
+<tr><td>15</td><td>000010011010111, 000010011101011, 000010100110111,
+000010100111011, 000010110011101, 000010110100111,
+000010111010011, 000011010010111</td></tr>
+<tr><td>16</td><td>0000100110101111, 0000100111101011, 0000101100111101,
+0000101101001111</td></tr>
+</table>
+<p>When reading this table, you should be aware that if a pattern is predicted correctly than the
+same pattern reversed (read backwards) is also predicted correctly, as well as the same
+pattern with all bits inverted. Example:
+In the table we find the pattern: 0001011.
+Reversing this pattern gives: 1101000.
+Inverting all bits gives: 1110100.
+Both reversing and inverting: 0010111.
+These four patterns are all recognizable. Rotating the pattern one place to the left gives:
+0010110. This is of course not a new pattern, only a phase shifted version of the same
+pattern. All patterns which can be derived from one of the patterns in the table by reversing,
+inverting and rotating are also recognizable. For reasons of brevity, these are not listed.
+<p>
+It takes two periods for the pattern recognition mechanism to learn a regular repetitive
+pattern after the BTB entry has been allocated. The pattern of mispredictions in the learning
+period is not reproducible. This is probably because the BTB entry contained something
+prior to allocation. Since BTB entries are allocated according to a random scheme, there is
+little chance of predicting what happens during the initial learning period.
+<p>
+
+<h4>22.2.5 Handling deviations from a regular pattern (PMMX, PPro, PII and PIII)</h4><p>
+The branch prediction mechanism is also extremely good at handling 'almost regular'
+patterns, or deviations from the regular pattern. Not only does it learn what the regular
+pattern looks like. It also learns what deviations from the regular pattern look like. If
+deviations are always of the same type, then it will remember what comes after the irregular
+event, and the deviation will cost only one misprediction.
+<p>
+Example:
+<pre>
+0001110001110001110001011100011100011100010111000
+ ^ ^</pre><p>
+In this sequence, a 0 means nojump, a 1 means jump. The mechanism learns that the
+repeated sequence is 000111. The first irregularity is an unexpected 0, which I have
+marked with a <kbd>^</kbd>. After this 0 the next three jumps may be mispredicted, because it hasn't
+learned what comes after 0010, 0101, and 1011. After one or two irregularities of the same
+kind it has learned that after 0010 comes a 1, after 0101 comes 1, and after 1011 comes 1.
+This means that after at most two irregularities of the same kind, it has learned to handle
+this kind of irregularity with only one misprediction.
+<p>
+The prediction mechanism is also very effective when alternating between two different
+regular patterns. If, for example, we have the pattern 000111 (with period 6) repeated many
+times, then the pattern 01 (period 2) many times, and then return to the 000111 pattern,
+then the mechanism doesn't have to relearn the 000111 pattern, because the counters
+used in the 000111 sequence have been left un-touched during the 01 sequence. After a
+few alternations between the two patterns, it has also learned to handle the changes of
+pattern with only one misprediction for each time the pattern is switched.
+<p>
+<h4>22.2.6 Patterns which are not predicted perfectly (PMMX, PPro, PII and PIII)</h4><p>
+The simplest branch pattern which cannot be predicted perfectly is a branch which is taken
+on every 6'th execution. The pattern is:
+<pre>000001000001000001
+ ^^ ^^ ^^
+ ab ab ab</pre><p>
+The sequence 0000 is alternatingly followed by a 0, in the positions marked a above, and
+by a 1, in the positions marked b. This affects counter number 0 which will count up and
+down all the time. If counter 0 happens to start in state 0 or 1, then it will alternate between
+state 0 and 1. This will lead to a misprediction in position b. If counter 0 happens to start in
+state 3, then it will alternate between state 2 and 3 which will cause a misprediction in
+position a. The worst case is when it starts in state 2. It will alternate between state 1 and 2
+with the unfortunate consequence that we get a misprediction both in position a and b. (This
+is analogous to the worst case for the PPlain explained <a href="#worstpred">above</a>). Which of these four
+situations we will get depends on the history of the BTB entry prior to allocation to this
+branch. This is beyond our control because of the random allocation method.
+<p>
+In principle, it is possible to avoid the worst case situation where we have two mispredictions
+per cycle by giving it an initial branch sequence which is specially designed for putting the
+counter in the desired state. Such an approach cannot be recommended, however,
+because of the considerable extra code complexity required, and because whatever
+information we have put into the counter is likely to be lost during the next timer interrupt or
+task switch.
+<p>
+<h4>22.2.7 Completely random patterns (PMMX, PPro, PII and PIII)</h4><p>
+The powerful capability of pattern recognition has a minor drawback in the case of
+completely random sequences with no regularities.
+<p>
+The following table lists the experimental fraction of mispredictions for a completely random
+sequence of jumps and nojumps:<p>
+
+<table border=1 cellpadding=1 cellspacing=1><tr>
+<td align="center" class="a3">&nbsp;fraction of jumps/nojumps&nbsp;</td>
+<td align="center" class="a3">&nbsp;fraction of mispredictions&nbsp;</td></tr>
+<tr><td align="center">0.001/0.999</td>
+<td align="center">0.001001</td></tr>
+<tr><td align="center">0.01/0.99</td>
+<td align="center">0.0101</td></tr>
+<tr><td align="center">0.05/0.95</td>
+<td align="center">0.0525</td></tr>
+<tr><td align="center">0.10/0.90</td>
+<td align="center">0.110</td></tr>
+<tr><td align="center">0.15/0.85</td>
+<td align="center">0.171</td></tr>
+<tr><td align="center">0.20/0.80</td>
+<td align="center">0.235</td></tr>
+<tr><td align="center">0.25/0.75</td>
+<td align="center">0.300</td></tr>
+<tr><td align="center">0.30/0.70</td>
+<td align="center">0.362</td></tr>
+<tr><td align="center">0.35/0.65</td>
+<td align="center">0.418</td></tr>
+<tr><td align="center">0.40/0.60</td>
+<td align="center">0.462</td></tr>
+<tr><td align="center">0.45/0.55</td>
+<td align="center">0.490</td></tr>
+<tr><td align="center">0.50/0.50</td>
+<td align="center">0.500</td></tr>
+</table>
+<p>
+The fraction of mispredictions is slightly higher than it would be without pattern recognition
+because the processor keeps trying to find repeated patterns in a sequence which has no
+regularities.
+<p>
+<h4>22.2.8 Tight loops (PMMX)</h4><p>
+The branch prediction is not reliable in tiny loops where the pattern recognition mechanism
+doesn't have time to update its data before the next branch is met. This means that simple
+patterns, which would normally be predicted perfectly, are not recognized. Incidentally,
+some patterns which normally would not be recognized, are predicted perfectly in tight
+loops. For example, a loop which always repeats 6 times would have the branch pattern
+111110 for the branch instruction at the bottom of the loop. This pattern would normally
+have one or two mispredictions per iteration, but in a tight loop it has none. The same
+applies to a loop which repeats 7 times. Most other repeat counts are predicted poorer in
+tight loops than normally. This means that a loop which iterates 6 or 7 times should
+preferably be tight, whereas other loops should preferably not be tight. You may unroll a
+loop if necessary to make it less tight.
+<p>
+To find out whether a loop will behave as 'tight' on the PMMX you may follow the following
+rule of thumb: Count the number of instructions in the loop. If the number is 6 or less, then
+the loop will behave as tight. If you have more than 7 instructions, then you can be
+reasonably sure that the pattern recognition functions normally. Strangely enough, it doesn't
+matter how many clock cycles each instruction takes, whether it has stalls, or whether it is
+paired or not. Complex integer instructions do not count. A loop can have lots of complex
+integer instructions and still behave as a tight loop. A complex integer instruction
+is a non-pairable integer instruction which always takes more than one clock cycle. Complex floating
+point instructions and MMX instructions still count as one. Note, that this rule of thumb is
+heuristic and not completely reliable. In important cases you may want to do your own
+testing. You can use performance monitor counter number 35H for the PMMX to count
+branch mispredictions. Test results may not be completely deterministic, because branch
+predictions may depend on the history of the BTB entry prior to allocation.
+<p>
+Tight loops on PPro, PII and PIII are predicted normally, and take minimum two clock cycles per
+iteration.
+<p>
+<h4>22.2.9 Indirect jumps and calls (PMMX, PPro, PII and PIII)</h4><p>
+There is no pattern recognition for indirect jumps and calls, and the BTB can remember no
+more than one target for an indirect jump. It is simply predicted to go to the same target as it
+did last time.
+<p>
+<h4>22.2.10 JECXZ and LOOP (PMMX)</h4><p>
+There is no pattern recognition for these two instructions in the PMMX. They are simply
+predicted to go the same way as last time they were executed. These two instructions
+should be avoided in time-critical code for PMMX. (In PPro, PII and PIII they are predicted using
+pattern recognition, but the loop instruction is still inferior to <kbd>DEC ECX / JNZ</kbd>).
+<p>
+<h4>22.2.11 Returns (PMMX, PPro, PII and PIII)</h4><p>
+The PMMX, PPro, PII and PIII processors have a Return Stack Buffer (RSB) which is used for
+predicting return instructions. The RSB works as a First-In-Last-Out buffer. Each time a
+call instruction is executed, the corresponding return address is pushed into the RSB. And
+each time a return instruction is executed, a return address is pulled out of the RSB and
+used for prediction of the return. This mechanism makes sure that return instructions are
+correctly predicted when the same subroutine is called from several different locations.
+<p>
+In order to make sure this mechanism works correctly, you must make sure that all calls
+and returns are matched. Never jump out of a subroutine without a return and never use a
+return as an indirect jump if speed is critical.
+<p>
+The RSB can hold four entries in the PMMX, sixteen in the PPro, PII and PIII. In the case where
+the RSB is empty, the return instruction is predicted in the same way as an indirect jump,
+i.e. it is expected to go to the same target as it did last time.
+<p>
+On the PMMX, when subroutines are nested deeper than four levels then the innermost
+four levels use the RSB, whereas all subsequent returns from the outer levels use the
+simpler prediction mechanism as long as there are no new calls. A return instruction which
+uses the RSB still occupies a BTB entry. Four entries in the RSB of the PMMX doesn't
+sound of much, but it is probably sufficient. Subroutine nesting deeper than four levels is
+certainly not unusual, but only the innermost levels matter in terms of speed, except
+possibly for recursive procedures.
+<p>
+On the PPro, PII and PIII, when subroutines are nested deeper than sixteen levels then the
+innermost 16 levels use the RSB, whereas all subsequent returns from the outer levels are
+mispredicted. Recursive subroutines should therefore not go deeper than 16 levels.
+<p>
+<h4>22.2.12 Static prediction in PMMX</h4><p>
+A control transfer instruction which has not been seen before or which is not in the BTB is
+always predicted to fall through on the PMMX. It doesn't matter whether it goes forward or
+backwards.
+<p>
+A branch instruction will not get a BTB entry if it always falls through. As soon as it is taken
+once, it will get into the BTB and stay there no matter how many times it falls through. A
+control transfer instruction can only go out of the BTB when it is pushed out by another
+control transfer instruction which steals its BTB entry.
+<p>
+Any control transfer instruction which jumps to the address immediately following itself will
+not get a BTB entry. Example: <pre>
+ JMP SHORT LL
+LL:</pre><p>
+This instruction will never get a BTB entry and therefore always have a misprediction
+penalty.
+<p>
+<h4>22.2.13 Static prediction in PPro, PII and PIII</h4><p>
+On PPro, PII and PIII, a control transfer instruction which has not been seen before or which is
+not in the BTB is predicted to fall through if it goes forwards, and to be taken if it goes
+backwards (e.g. a loop). Static prediction takes longer time than dynamic prediction on
+these processors.
+<p>
+If your code is unlikely to be cached then it is preferred to have the most frequently
+executed branch fall through in order to improve prefetching.
+<p>
+<h4>22.2.14 Close jumps (PMMX)</h4><p>
+On the PMMX, there is a risk that two control transfer instructions will share the same BTB
+entry if they are too close to each other. The obvious result is that they will always be
+mispredicted.
+<p>
+The BTB entry for a control transfer instruction is identified by bits 2-31 of the address of
+the last byte in the instruction. If two control transfer instructions are so close together that
+they differ only in bits 0-1 of the address, then we have the problem of a shared BTB entry.
+Example:
+<pre> CALL P
+ JNC SHORT L</pre><p>
+If the last byte of the <kbd>CALL</kbd> instruction and the last byte of the <kbd>JNC</kbd> instruction lie within the
+same dword of memory, then we have the penalty. You have to look at the output list file
+from the assembler to see whether the two addresses are separated by a DWORD boundary
+or not. (A DWORD boundary is an address divisible by 4).
+<p>
+There are various ways to solve this problem: <br>
+1. Move the code sequence a little up or down in memory so that you get a dword
+boundary between the two addresses.<br>
+2. Change the short jump to a near jump (with 4 bytes displacement) so that the end of the
+instruction is moved further down. There is no way you can force the assembler to use
+anything but the shortest form of an instruction so you have to hard-code the near
+branch if you choose this solution.<br>
+3. Put in some instruction between the <kbd>CALL</kbd> and the <kbd>JNC</kbd> instructions. This is the easiest
+method, and the only method if you don't know where DWORD boundaries are because
+your segment is not dword aligned or because the code keeps moving up and down as
+you make changes in the preceding code:<br>
+<pre> CALL P
+ MOV EAX,EAX ; two bytes filler to be safe
+ JNC SHORT L</pre><p>
+If you want to avoid problems on the PPlain too, then put in two <kbd>NOP</kbd>'s instead to prevent
+pairing (see section 22.1.3 above).
+ <p>
+The <kbd>RET</kbd> instruction is particularly prone to this problem because it is only one byte long:
+<pre> JNZ NEXT
+ RET</pre><p>
+Here you may need up to three bytes of fillers:
+<pre> JNZ NEXT
+ NOP
+ MOV EAX,EAX
+ RET</pre>
+<p>
+<h4>22.2.15 Consecutive calls or returns (PMMX)</h4><p>
+There is a penalty when the first instruction pair following the target label of a call contains
+another call instruction or if a return follows immediately after another return. Example:
+<pre>FUNC1 PROC NEAR
+ NOP ; avoid call after call
+ NOP
+ CALL FUNC2
+ CALL FUNC3
+ NOP ; avoid return after return
+ RET
+FUNC1 ENDP</pre><p>
+Two <kbd>NOP</kbd>'s are required before <kbd>CALL FUNC2</kbd> because a single
+<kbd>NOP</kbd> would pair with the
+<kbd>CALL</kbd>. One <kbd>NOP</kbd> is enough before the <kbd>RET</kbd> because
+<kbd>RET</kbd> is unpairable. No <kbd>NOP</kbd>'s are required
+between the two <kbd>CALL</kbd> instructions because there is no penalty for call after return. (On the
+PPlain you would need two <kbd>NOP</kbd>'s here too).
+<p>
+The penalty for chained calls only occurs when the same subroutines are called from more
+than one location (probably because the RSB needs updating). Chained returns always
+have a penalty. There is sometimes a small stall for a jump after a call, but no penalty for
+return after call; call after return; jump, call, or return after jump; or jump after return.
+<p>
+<h4>22.2.16 Chained jumps (PPro, PII and PIII)</h4><p>
+A jump, call, or return cannot be executed in the first clock cycle after a previous jump, call,
+or return. Therefore, chained jumps will take two clock cycles for each jump, and you may
+want to make sure that the processor has something else to do in parallel. For the same
+reason, a loop will take at least two clock cycles per iteration on these processors.
+<p>
+<h4>22.2.17 Designing for branch predictabiligy (PMMX, PPro, PII and PIII)</h4><p>
+Multiway branches (switch/case statements) are implemented either as an indirect jump
+using a list of jump addresses, or as a tree of branch instructions. Since indirect jumps are
+poorly predicted, the latter method may be preferred if easily predicted patterns can be
+expected and you have enough BTB entries. In case you decide to use the former method,
+then it is recommended that you put the list of jump addresses in the data segment.
+<p>
+You may want to reorganize your code so that branch patterns which are not predicted
+perfectly can be replaced by other patterns which are. Consider, for example, a loop which
+always executes 20 times. The conditional jump at the bottom of the loop is taken 19 times
+and falls through every 20'th time. This pattern is regular, but not recognized by the pattern
+recognition mechanism, so the fall-through is always mispredicted. You may make two
+nested loops by four and five, or unroll the loop by four and let it execute 5 times, in order to
+have only recognizable patterns. This kind of complicated schemes are only worth the extra
+code on the PPro, PII and PIII processors where mispredictions are very expensive. For higher
+loop counts there is no reason to do anything about the single misprediction.
+<p>
+<h3><a name="22_3">22.3. Avoiding jumps (all processors)</a></h3><p>
+There can be many reasons why you may want reduce the number of jumps, calls and
+returns:
+<ul>
+<li>jump mispredictions are very expensive,
+<li>there are various penalties for consecutive or chained jumps, depending on the
+processor,
+<li>jump instructions may push one another out of the branch target buffer because of the
+random replacement algorithm,
+<li>a return takes 2 clocks on PPlain and PMMX, calls and returns generate 4 uops on
+PPro, PII and PIII.
+<li>on PPro, PII and PIII, instruction fetch may be delayed after a jump
+(chapter <a href="#15">15</a>), and
+retirement may be slightly less effective for taken jumps then for other uops
+(chapter <a href="#18">18</a>).
+</ul>
+<p>
+Calls and returns can be avoided by replacing small procedures with inline macros.
+And in many cases it is possible to reduce the number of jumps by restructuring
+your code. For example, a jump to a jump should be replaced by a jump to the final
+target. In some cases this is even possible with conditional jumps if the condition
+is the same or is known. A jump to a return can be replaced by a return. If you want
+to eliminate a return to a return, then you should not manipulate the stack pointer
+because that would interfere with the prediction mechanism of the return stack buffer.
+Instead, you can replace the preceding call with a jump. For example
+<kbd>CALL PRO1 / RET</kbd> can be replaced by <kbd>JMP PRO1</kbd> if
+<kbd>PRO1</kbd> ends with the same kind of <kbd>RET</kbd>.
+<p>
+You may also eliminate a jump by dublicating the code jumped to. This can be
+useful if you have a two-way branch inside a loop or before a return. Example:
+<pre>A: CMP [EAX+4*EDX],ECX
+ JE B
+ CALL X
+ JMP C
+B: CALL Y
+C: INC EDX
+ JNZ A
+ MOV ESP, EBP
+ POP EBP
+ RET</pre><p>
+The jump to <kbd>C</kbd> may be eliminated by dublicating the loop epilog:
+<pre>A: CMP [EAX+4*EDX],ECX
+ JE B
+ CALL X
+ INC EDX
+ JNZ A
+ JMP D
+B: CALL Y
+C: INC EDX
+ JNZ A
+D: MOV ESP, EBP
+ POP EBP
+ RET</pre><p>
+The most often executed branch should come first here. The jump to <kbd>D</kbd>
+is outside the loop and therefore less critical. If this jump is executed so often
+that it needs optimizing too, then replace it with the three instructions following
+<kbd>D</kbd>.
+<p>
+<h3><a name="22_4">22.4. Avoiding conditional jumps by using flags (all processors)</a></h3><p>
+The most important jumps to eliminate are conditional jumps, especially if
+they are poorly predictable. Sometimes it is possible to obtain the same effect
+as a branch by ingenious manipulation of bits and flags. For example you may
+calculate the absolute value of a signed number
+without branching:
+<pre> CDQ
+ XOR EAX,EDX
+ SUB EAX,EDX</pre><p>
+(On PPlain and PMMX, use <kbd>MOV EDX,EAX / SAR EDX,31</kbd> instead of <kbd>CDQ</kbd>).
+<p>
+The carry flag is particularly useful for this kind of tricks:<br>
+Setting carry if a value is zero: <kbd>CMP [VALUE],1</kbd><br>
+Setting carry if a value is not zero: <kbd>XOR EAX,EAX / CMP EAX,[VALUE]</kbd><br>
+Incrementing a counter if carry: <kbd>ADC EAX,0</kbd><br>
+Setting a bit for each time the carry is set: <kbd>RCL EAX,1</kbd><br>
+Generating a bit mask if carry is set: <kbd>SBB EAX,EAX</kbd><br>
+Setting a bit on an arbitrary condition: <kbd>SETcond AL</kbd><br>
+Setting all bits on an arbitrary condition: <kbd>XOR EAX,EAX / SETNcond AL / DEC EAX</kbd><br>
+(remember to reverse the condition in the last example)
+<p>
+The following example finds the minimum of two unsigned numbers: if (b &lt; a) a = b;
+<pre> SUB EBX,EAX
+ SBB ECX,ECX
+ AND ECX,EBX
+ ADD EAX,ECX</pre><p>
+The next example chooses between two numbers: if (a != 0) a = b; else a = c;
+<pre> CMP EAX,1
+ SBB EAX,EAX
+ XOR ECX,EBX
+ AND EAX,ECX
+ XOR EAX,EBX</pre><p>
+Whether or not such tricks are worth the extra code depends on how predictable a
+conditional jump would be, whether the extra pairing or scheduling opportunities of the branch-free code
+can be utilized, and whether there are other jumps following immediately after which could
+suffer the penalties of consecutive jumps.
+<p>
+<h3><a name="22_5">22.5. Replacing conditional jumps by conditional moves (PPro, PII and PIII)</a></h3><p>
+The PPro, PII and PIII processors have conditional move instructions intended specifically for
+avoiding branches because branch misprediction is very time-consuming on these
+processors. There are conditional move instructions for both integer and floating point
+registers. For code that will run only on these processors you may replace poorly
+predictable branches with conditional moves whenever possible. If you want your code to
+run on all processors then you may make two versions of the most critical parts of the code,
+one for processors that support conditional move instructions and one for those that don't
+(see chapter <a href="#27_10">27.10</a> for how to detect if conditional moves are supported).
+<p>
+The misprediction penalty for a branch may be so high that it is advantageous to replace it
+with conditional moves even when it costs several extra instructions. But a conditional move
+instruction has the disadvantage that it makes dependency chains longer. The conditional move
+waits for both register operands to be ready even
+though only one of them is needed. A conditional move is waiting for three operands to be
+ready: the condition flag and the two move operands. You have to consider if any of these
+three operands are likely to be delayed by dependency chains or cache misses. If the
+condition flag is available long before the move operands then you may as well use a
+branch, because a possible branch misprediction could be resolved while waiting for the
+move operands. In situations where you have to wait long for a move operand that may not
+be needed after all, the branch will be faster than the conditional move despite a possible
+misprediction penalty. The opposite situation is when the condition flag is delayed while
+both move operands are available early. In this situation the conditional move is preferred
+over the branch if misprediction is likely.
+
+<p>
+<h2><a name="23">23</a>. Reducing code size (all processors)</h2><p>
+As explained in chapter <a href="#7">7</a>, the code cache is 8 or 16 kb. If you have problems keeping the
+critical parts of your code within the code cache, then you may consider reducing the size of
+your code.
+<p>
+ 32 bit code is usually bigger than 16 bit code because addresses and data constants take 4
+bytes in 32 bit code and only 2 bytes in 16 bit code. However, 16 bit code has other
+penalties such as prefixes and problems with accessing adjacent words simultaneously
+(see chapter 10.2 <a href="#imperfectpush">above</a>). Some other methods for reducing the size or your code are discussed
+below.
+<p>
+Both jump addresses, data addresses, and data constants take less space if they can be
+expressed as a sign-extended byte, i.e. if they are within the interval from -128 to +127.
+<p>
+For jump addresses this means that short jumps take two bytes of code, whereas jumps
+beyond 127 bytes take 5 bytes if unconditional and 6 bytes if conditional.
+<p>
+Likewise, data addresses take less space if they can be expressed as a pointer and a
+displacement between -128 and +127.
+Example:<br>
+<kbd> MOV EBX,DS:[100000] / ADD EBX,DS:[100004] ; 12 bytes</kbd><br>
+Reduce to:<br>
+<kbd> MOV EAX,100000 / MOV EBX,[EAX] / ADD EBX,[EAX+4] ; 10 bytes</kbd>
+<p>
+The advantage of using a pointer obviously increases if you use it many times. Storing data
+on the stack and using <kbd>EBP</kbd> or <kbd>ESP</kbd> as pointer will thus make your code smaller than if you
+use static memory locations and absolute addresses, provided of course that your data are
+within +/-127 bytes of the pointer. Using <kbd>PUSH</kbd> and <kbd>POP</kbd> to write and read temporary data is
+even shorter.
+<p>
+ Data constants may also take less space if they are between -128 and +127. Most
+instructions with immediate operands have a short form where the operand is a
+sign-extended single byte. Examples:
+<pre> PUSH 200 ; 5 bytes
+ PUSH 100 ; 2 bytes
+
+ ADD EBX,128 ; 6 bytes
+ SUB EBX,-128 ; 3 bytes</pre><p>
+
+ The most important instruction with an immediate operand which doesn't have such a short
+form is <kbd>MOV</kbd>.<br>
+Examples:
+<pre> MOV EAX, 0 ; 5 bytes</pre><p>
+ May be changed to:<br>
+<pre> XOR EAX,EAX ; 2 bytes</pre><p>
+And
+<pre> MOV EAX, 1 ; 5 bytes</pre><p>
+ May be changed to:
+<pre> XOR EAX,EAX / INC EAX ; 3 bytes</pre><p>
+or:
+<pre> PUSH 1 / POP EAX ; 3 bytes</pre><p>
+And
+<pre> MOV EAX, -1 ; 5 bytes</pre><p>
+May be changed to:
+<pre> OR EAX, -1 ; 3 bytes</pre>
+<p>
+If the same address or constant is used more than once then you may load it
+into a register. A <kbd>MOV</kbd>
+with a 4-byte immediate operand may sometimes be replaced by an arithmetic
+instruction if the value of the register before the <kbd>MOV</kbd> is known. Example:
+<pre> MOV [mem1],200 ; 10 bytes
+ MOV [mem2],200 ; 10 bytes
+ MOV [mem3],201 ; 10 bytes
+ MOV EAX,100 ; 5 bytes
+ MOV EBX,150 ; 5 bytes</pre><p>
+Assuming that <kbd>mem1</kbd> and <kbd>mem3</kbd> are both within -128/+127
+bytes of <kbd>mem2</kbd>, this may be changed to:
+<pre> MOV EBX, OFFSET mem2 ; 5 bytes
+ MOV EAX,200 ; 5 bytes
+ MOV [EBX+mem1-mem2],EAX ; 3 bytes
+ MOV [EBX],EAX ; 2 bytes
+ INC EAX ; 1 byte
+ MOV [EBX+mem3-mem2],EAX ; 3 bytes
+ SUB EAX,101 ; 3 bytes
+ LEA EBX,[EAX+50] ; 3 bytes</pre><p>
+Be aware of the AGI stall in the <kbd>LEA</kbd> instruction (for PPlain and PMMX).
+<p>
+You may also consider that different instructions have different lengths. The following
+instructions take only one byte and are therefore very attractive:
+<kbd>PUSH reg</kbd>, <kbd>POP reg, INC reg32, DEC reg32</kbd>.<br>
+<kbd>INC</kbd> and <kbd>DEC</kbd> with 8 bit registers take 2 bytes, so
+<kbd>INC EAX</kbd> is shorter than <kbd>INC AL</kbd>.
+<p>
+<kbd>XCHG EAX,reg</kbd> is also a single-byte instruction and thus takes less space
+than <kbd>MOV EAX,reg</kbd>, but it is slower.
+<p>
+Some instructions take one byte less when they use the accumulator than when they use
+any other register. <br>
+Examples:
+
+<pre> MOV EAX,DS:[100000] is smaller than MOV EBX,DS:[100000]
+ ADD EAX,1000 is smaller than ADD EBX,1000</pre><p>
+
+ Instructions with pointers take one byte less when they have only a base pointer
+ (not <kbd>ESP</kbd>)
+and a displacement than when they have a scaled index register, or both base pointer and
+index register, or <kbd>ESP</kbd> as base pointer. <br>
+Examples:
+<pre> MOV EAX,[array][EBX] is smaller than MOV EAX,[array][EBX*4]
+ MOV EAX,[EBP+12] is smaller than MOV EAX,[ESP+12]</pre><p>
+ Instructions with <kbd>EBP</kbd> as base pointer and no displacement and no index take one byte more
+than with other registers:
+<pre> MOV EAX,[EBX] is smaller than MOV EAX,[EBP], but
+ MOV EAX,[EBX+4] is same size as MOV EAX,[EBP+4].</pre><p>
+ Instructions with a scaled index pointer and no base pointer must have a four byte
+displacement, even when it is 0:
+<pre> LEA EAX,[EBX+EBX] is shorter than LEA EAX,[2*EBX].</pre>
+<p>
+<h2><a name="24">24</a>. Scheduling floating point code (PPlain and PMMX)</h2><p>
+Floating point instructions cannot pair the way integer instructions can, except for one
+special case, defined by the following rules:
+<ul>
+<li>the first instruction (executing in the U-pipe) must be <kbd>FLD, FADD, FSUB, FMUL,
+FDIV, FCOM, FCHS,</kbd> or <kbd>FABS</kbd>.
+<li>the second instruction (in V-pipe) must be <kbd>FXCH</kbd>
+<li>the instruction following the <kbd>FXCH</kbd> must be a floating point instruction, otherwise the
+<kbd>FXCH</kbd> will pair imperfectly and take an extra clock cycle.
+</ul><p>
+This special pairing is important, as will be explained shortly.
+<p>
+While floating point instructions in general cannot be paired, many can be pipelined, i.e. one
+instruction can begin before the previous instruction has finished. Example:
+<pre> FADD ST(1),ST(0) ; clock cycle 1-3
+ FADD ST(2),ST(0) ; clock cycle 2-4
+ FADD ST(3),ST(0) ; clock cycle 3-5
+ FADD ST(4),ST(0) ; clock cycle 4-6</pre><p>
+Obviously, two instructions cannot overlap if the second instruction needs the result of the
+first. Since almost all floating point instructions involve the top of stack register,
+<kbd>ST(0)</kbd>, there are seemingly not very many possibilities for making an instruction independent of the
+result of previous instructions. The solution to this problem is register renaming. The <kbd>FXCH</kbd>
+instruction does not in reality swap the contents of two registers, it only swaps their names.
+Instructions which push or pop the register stack also work by renaming. Floating point
+register renaming has been highly optimized on the Pentiums so that a register may be
+renamed while in use. Register renaming never causes stalls - it is even possible to rename
+a register more than once in the same clock cycle, as for example when you pair <kbd>FLD</kbd> or
+<kbd>FCOMPP</kbd> with <kbd>FXCH</kbd>.
+<p>
+By the proper use of <kbd>FXCH</kbd> instructions you may obtain a lot of overlapping in your floating
+point code. Example:
+<pre> FLD [a1] ; clock cycle 1
+ FADD [a2] ; clock cycle 2-4
+ FLD [b1] ; clock cycle 3
+ FADD [b2] ; clock cycle 4-6
+ FLD [c1] ; clock cycle 5
+ FADD [c2] ; clock cycle 6-8
+ FXCH ST(2) ; clock cycle 6
+ FADD [a3] ; clock cycle 7-9
+ FXCH ST(1) ; clock cycle 7
+ FADD [b3] ; clock cycle 8-10
+ FXCH ST(2) ; clock cycle 8
+ FADD [c3] ; clock cycle 9-11
+ FXCH ST(1) ; clock cycle 9
+ FADD [a4] ; clock cycle 10-12
+ FXCH ST(2) ; clock cycle 10
+ FADD [b4] ; clock cycle 11-13
+ FXCH ST(1) ; clock cycle 11
+ FADD [c4] ; clock cycle 12-14
+ FXCH ST(2) ; clock cycle 12</pre><p>
+In the above example we are interleaving three independent threads. Each <kbd>FADD</kbd> takes 3
+clock cycles, and we can start a new <kbd>FADD</kbd> in each clock cycle. When we have started an
+<kbd>FADD</kbd> in the 'a' thread we have time to start two new <kbd>FADD</kbd>
+instructions in the '<kbd>b</kbd>' and '<kbd>c</kbd>'
+threads before returning to the '<kbd>a</kbd>' thread, so every third
+<kbd>FADD</kbd> belongs to the same thread.
+We are using <kbd>FXCH</kbd> instructions every time to get the register that belongs to the desired
+thread into <kbd>ST(0)</kbd>. As you can see in the example above, this generates a regular pattern,
+but note well that the <kbd>FXCH</kbd> instructions repeat with a period of two while the threads have a
+period of three. This can be quite confusing, so you have to 'play computer' in order to know
+which registers are where.
+<p>
+All versions of the instructions <kbd>FADD, FSUB, FMUL,</kbd> and
+<kbd>FILD</kbd> take 3 clock cycles and are
+able to overlap, so that these instructions may be scheduled using the method described
+above. Using a memory operand does not take more time than a register operand if the
+memory operand is in the level 1 cache and properly aligned.
+<p>
+By now you must be used to rules having exceptions, and the overlapping rule is no
+exception: You cannot start an <kbd>FMUL</kbd> instruction one clock cycle
+after another <kbd>FMUL</kbd>
+instruction, because the <kbd>FMUL</kbd> circuitry is not perfectly pipelined.
+It is recommended that you
+put another instruction in between two <kbd>FMUL</kbd>'s. Example:
+<pre> FLD [a1] ; clock cycle 1
+ FLD [b1] ; clock cycle 2
+ FLD [c1] ; clock cycle 3
+ FXCH ST(2) ; clock cycle 3
+ FMUL [a2] ; clock cycle 4-6
+ FXCH ; clock cycle 4
+ FMUL [b2] ; clock cycle 5-7 (stall)
+ FXCH ST(2) ; clock cycle 5
+ FMUL [c2] ; clock cycle 7-9 (stall)
+ FXCH ; clock cycle 7
+ FSTP [a3] ; clock cycle 8-9
+ FXCH ; clock cycle 10 (unpaired)
+ FSTP [b3] ; clock cycle 11-12
+ FSTP [c3] ; clock cycle 13-14</pre><p>
+Here you have a stall before <kbd>FMUL [b2]</kbd> and before <kbd>FMUL [c2]</kbd>
+because another <kbd>FMUL</kbd>
+started in the preceding clock cycle. You can improve this code by putting
+<kbd>FLD</kbd> instructions in between the <kbd>FMUL</kbd>'s:
+<pre> FLD [a1] ; clock cycle 1
+ FMUL [a2] ; clock cycle 2-4
+ FLD [b1] ; clock cycle 3
+ FMUL [b2] ; clock cycle 4-6
+ FLD [c1] ; clock cycle 5
+ FMUL [c2] ; clock cycle 6-8
+ FXCH ST(2) ; clock cycle 6
+ FSTP [a3] ; clock cycle 7-8
+ FSTP [b3] ; clock cycle 9-10
+ FSTP [c3] ; clock cycle 11-12</pre><p>
+In other cases you may put <kbd>FADD, FSUB</kbd>, or anything else in
+between <kbd>FMUL</kbd>'s to avoid the stalls.
+<p>
+Overlapping floating point instructions requires of course that you have some independent
+threads that you can interleave. If you have only one big formula to execute, then you may
+compute parts of the formula in parallel to achieve overlapping. If, for example, you want to
+add six numbers, then you may split the operations into two threads with three numbers in
+each, and add the two threads in the end:
+
+<pre> FLD [a] ; clock cycle 1
+ FADD [b] ; clock cycle 2-4
+ FLD [c] ; clock cycle 3
+ FADD [d] ; clock cycle 4-6
+ FXCH ; clock cycle 4
+ FADD [e] ; clock cycle 5-7
+ FXCH ; clock cycle 5
+ FADD [f] ; clock cycle 7-9 (stall)
+ FADD ; clock cycle 10-12 (stall)</pre><p>
+
+Here we have a one clock stall before <kbd>FADD [f]</kbd> because it is waiting
+for the result of <kbd>FADD [d]</kbd> and a two clock stall before the last
+<kbd>FADD</kbd> because it is waiting for the result of
+<kbd>FADD [f]</kbd>. The latter stall can be hidden by filling in some integer
+instructions, but the first stall can not because an integer instruction at
+this place would make the <kbd>FXCH</kbd> pair imperfectly.
+<p>
+The first stall can be avoided by having three threads rather than two, but
+that would cost an extra <kbd>FLD</kbd> so we do not save anything by having
+three threads rather than two unless there are at least eight numbers to add.
+<p>
+Not all floating point instructions can overlap. And some floating point
+instructions can overlap more subsequent integer instructions than subsequent
+floating point instructions. The <kbd>FDIV</kbd> instruction, for example,
+takes 39 clock cycles. All but the first clock cycle can
+overlap with integer instructions, but only the last two clock cycles can
+overlap with floating point instructions. Example:
+<pre> FDIV ; clock cycle 1-39 (U-pipe)
+ FXCH ; clock cycle 1-2 (V-pipe, imperfect pairing)
+ SHR EAX,1 ; clock cycle 3 (U-pipe)
+ INC EBX ; clock cycle 3 (V-pipe)
+ CMC ; clock cycle 4-5 (non-pairable)
+ FADD [x] ; clock cycle 38-40 (U-pipe, waiting while FPU busy)
+ FXCH ; clock cycle 38 (V-pipe)
+ FMUL [y] ; clock cycle 40-42 (U-pipe, waiting for result of FDIV)</pre><p>
+The first <kbd>FXCH</kbd> pairs with the <kbd>FDIV</kbd>, but takes an extra
+clock cycle because it is not followed by a floating point instruction.
+The <kbd>SHR / INC</kbd> pair starts before the <kbd>FDIV</kbd> is finished, but
+has to wait for the <kbd>FXCH</kbd> to finish. The <kbd>FADD</kbd> has to wait
+till clock 38 because new floating point instructions can only execute during
+the last two clock cycles of the <kbd>FDIV</kbd>. The second <kbd>FXCH</kbd>
+pairs with the <kbd>FADD</kbd>. The <kbd>FMUL</kbd> has to wait for the <kbd>FDIV</kbd>
+to finish because it uses the result of the division.
+<p>
+If you have nothing else to put in after a floating point instruction with a
+large integer overlap, such as <kbd>FDIV</kbd> or <kbd>FSQRT</kbd>, then you
+may put in a dummy read from an address which you expect to need later in
+the program to make sure it is in the level one cache. Example:
+<pre> FDIV QWORD PTR [EBX]
+ CMP [ESI],ESI
+ FMUL QWORD PTR [ESI]</pre><p>
+Here we use the integer overlap to pre-load the value at <kbd>[ESI]</kbd> into
+the cache while the <kbd>FDIV</kbd> is being computed (we don't care what
+the result of the <kbd>CMP</kbd> is).
+<p>
+Chapter <a href="#28">28</a> gives a complete listing of floating point instructions, and
+what they can pair or overlap with.
+<p>
+There is no penalty for using a memory operand on floating point instuctions
+because the arithmetic unit is one step later in the pipeline than the read
+unit. The tradeoff of this comes when you store floating point data to memory.
+The <kbd>FST</kbd> or <kbd>FSTP</kbd> instruction with a memory
+operand takes two clock cycles in the execution stage, but it needs the data one clock
+earlier so you will get a one clock stall if the value to store is not ready one clock cycle in
+advance. This is analogous to an AGI stall. Example:
+<pre> FLD [a1] ; clock cycle 1
+ FADD [a2] ; clock cycle 2-4
+ FLD [b1] ; clock cycle 3
+ FADD [b2] ; clock cycle 4-6
+ FXCH ; clock cycle 4
+ FSTP [a3] ; clock cycle 6-7
+ FSTP [b3] ; clock cycle 8-9</pre><p>
+
+The <kbd>FSTP [a3]</kbd> stalls for one clock cycle because the result of
+<kbd>FADD [a2]</kbd> is not ready
+in the preceding clock cycle. In many cases you cannot hide this type of stall without
+scheduling your floating point code into four threads or putting some integer instructions in
+between. The two clock cycles in the execution stage of the <kbd>FST(P)</kbd> instruction cannot pair
+or overlap with any subsequent instructions.
+<p>
+Instructions with integer operands such as <kbd>FIADD, FISUB, FIMUL, FIDIV, FICOM</kbd> may
+be split up into simpler operations in order to improve overlapping. Example:
+<pre> FILD [a] ; clock cycle 1-3
+ FIMUL [b] ; clock cycle 4-9</pre><p>
+Split up into:
+<pre> FILD [a] ; clock cycle 1-3
+ FILD [b] ; clock cycle 2-4
+ FMUL ; clock cycle 5-7</pre><p>
+In this example, you save two clocks by overlapping the two FILD instructions.
+<p>
+<h2><a name="25">25</a>. Loop optimization (all processors)</h2><p>
+When analyzing a program you often find that most of the time consumption lies in the
+innermost loop. The way to improve the speed is to carefully optimize the most
+time-consuming loop using assembly language. The rest of the program may be left in high-level
+language.
+<p>
+In all the following examples it is assumed that all data are in the level 1 cache. If the speed
+is limited by cache misses then there is no reason to optimize the instructions. Rather, you
+should concentrate on organizing your data in a way that minimizes cache misses (see
+chapter <a href="#7">7</a>).
+<p>
+<h3><a name="25_1">25.1. Loops in PPlain and PMMX</a></h3><p>
+A loop generally contains a counter controlling how many times to iterate, and often array
+access reading or writing one array element for each iteration. I have chosen as example a
+procedure which reads integers from an array, changes the sign of each integer, and stores
+the results in another array.
+<p>
+A C language code for this procedure would be:
+<pre>void ChangeSign (int * A, int * B, int N) {
+ int i;
+ for (i=0; i&lt;N; i++) B[i] = -A[i];}</pre>
+<p>
+Translating to assembly, we might write the procedure like this:
+<p>
+<h4>Example 1.1:</h4><p>
+<pre>_ChangeSign PROC NEAR
+ PUSH ESI
+ PUSH EDI
+A EQU DWORD PTR [ESP+12]
+B EQU DWORD PTR [ESP+16]
+N EQU DWORD PTR [ESP+20]
+ MOV ECX, [N]
+ JECXZ L2
+ MOV ESI, [A]
+ MOV EDI, [B]
+ CLD
+L1: LODSD
+ NEG EAX
+ STOSD
+ LOOP L1
+L2: POP EDI
+ POP ESI
+ RET ; (no extra pop if _cdecl calling convention)
+_ChangeSign ENDP</pre><p>
+This looks like a nice solution, but it is not optimal because it uses slow non-pairable
+instructions. It takes 11 clock cycles per iteration if all data are in the level one cache.
+<p>
+<h4>Using pairable instructions only (PPlain and PMMX)</h4>
+<h4>Example 1.2:</h4><p>
+<pre> MOV ECX, [N]
+ MOV ESI, [A]
+ TEST ECX, ECX
+ JZ SHORT L2
+ MOV EDI, [B]
+L1: MOV EAX, [ESI] ; u
+ XOR EBX, EBX ; v (pairs)
+ ADD ESI, 4 ; u
+ SUB EBX, EAX ; v (pairs)
+ MOV [EDI], EBX ; u
+ ADD EDI, 4 ; v (pairs)
+ DEC ECX ; u
+ JNZ L1 ; v (pairs)
+L2:</pre><p>
+Here we have used pairable instructions only, and scheduled the instructions so that
+everything pairs. It now takes only 4 clock cycles per iteration. We could have obtained the
+same speed without splitting the NEG instruction, but the other unpairable instructions
+should be split up.
+<p>
+<h4>Using the same register for counter and index</h4>
+<h4>Example 1.3:</h4><p>
+<pre> MOV ESI, [A]
+ MOV EDI, [B]
+ MOV ECX, [N]
+ XOR EDX, EDX
+ TEST ECX, ECX
+ JZ SHORT L2
+L1: MOV EAX, [ESI+4*EDX] ; u
+ NEG EAX ; u
+ MOV [EDI+4*EDX], EAX ; u
+ INC EDX ; v (pairs)
+ CMP EDX, ECX ; u
+ JB L1 ; v (pairs)
+L2:</pre><p>
+Using the same register for counter and index gives us fewer instructions in the body of the
+loop, but it still takes 4 clocks because we have two unpaired instructions.
+<p>
+<h4>Letting the counter end at zero (PPlain and PMMX)</h4><p>
+We want to get rid of the <kbd>CMP</kbd> instruction in example 1.3 by letting the counter end at zero
+and use the zero flag for detecting when we are finished as we did in example 1.2. One way
+to do this would be to execute the loop backwards taking the last array elements first.
+However, data caches are optimized for accessing data forwards, not backwards, so if
+cache misses are likely, then you should rather start the counter at -N and count through
+negative values up to zero. The base registers should then point to the end of the arrays
+rather than the beginning:
+<p>
+<h4>Example 1.4:</h4><p>
+<pre> MOV ESI, [A]
+ MOV EAX, [N]
+ MOV EDI, [B]
+ XOR ECX, ECX
+ LEA ESI, [ESI+4*EAX] ; point to end of array A
+ SUB ECX, EAX ; -N
+ LEA EDI, [EDI+4*EAX] ; point to end of array B
+ JZ SHORT L2
+L1: MOV EAX, [ESI+4*ECX] ; u
+ NEG EAX ; u
+ MOV [EDI+4*ECX], EAX ; u
+ INC ECX ; v (pairs)
+ JNZ L1 ; u
+L2:</pre><p>
+We are now down at five instructions in the loop body but it still takes 4 clocks because of
+poor pairing. (If the addresses and sizes of the arrays are constants we may save two
+registers by substituting <kbd>A+SIZE A</kbd> for <kbd>ESI</kbd>
+and <kbd>B+SIZE B</kbd> for <kbd>EDI</kbd>). Now let's see how we
+can improve pairing.
+<p>
+<h4>Pairing calculations with loop overhead (PPlain and PMMX)</h4><p>
+We may want to improve pairing by intermingling calculations with the loop control
+instructions. If we want to put something in between <kbd>INC ECX</kbd>
+and <kbd>JNZ L1</kbd>, it has to be
+something that doesn't affect the zero flag. The <kbd>MOV [EDI+4*ECX],EBX</kbd>
+instruction after <kbd>INC ECX</kbd> would generate an AGI delay, so we have
+to be more ingenious:
+<p>
+<h4>Example 1.5:</h4><p>
+<pre> MOV EAX, [N]
+ XOR ECX, ECX
+ SHL EAX, 2 ; 4 * N
+ JZ SHORT L3
+ MOV ESI, [A]
+ MOV EDI, [B]
+ SUB ECX, EAX ; - 4 * N
+ ADD ESI, EAX ; point to end of array A
+ ADD EDI, EAX ; point to end of array B
+ JMP SHORT L2
+L1: MOV [EDI+ECX-4], EAX ; u
+L2: MOV EAX, [ESI+ECX] ; v (pairs)
+ XOR EAX, -1 ; u
+ ADD ECX, 4 ; v (pairs)
+ INC EAX ; u
+ JNC L1 ; v (pairs)
+ MOV [EDI+ECX-4], EAX
+L3:</pre><p>
+I have used a different way to calculate the negative of <kbd>EAX</kbd> here:
+inverting all bits and adding one. The reason why I am using this method is
+that I can use a dirty trick with the
+<kbd>INC</kbd> instruction: <kbd>INC</kbd> doesn't change the carry flag,
+whereas <kbd>ADD</kbd> does. I am using <kbd>ADD</kbd>
+rather than <kbd>INC</kbd> to increment my loop counter and testing the carry
+flag rather than the zero
+flag. It is then possible to put the <kbd>INC EAX</kbd> in between without
+affecting the carry flag. You
+may think that we could have used <kbd>LEA EAX,[EAX+1]</kbd> here instead of
+<kbd>INC EAX</kbd>, at least
+that doesn't change any flags, but the <kbd>LEA</kbd> instruction would have
+an AGI stall so that's not
+the best solution. Note that the trick with the <kbd>INC</kbd> instruction
+not changing the carry flag is useful only on PPlain and PMMX, but will
+cause a partial flags stall on PPro, PII and PIII.
+<p>
+I have obtained perfect pairing here and the loop now takes only 3 clock cycles.
+Whether you want to increment the loop counter by 1 (as in example 1.4) or by 4
+(as in example 1.5) is a matter of taste, it makes no difference in loop timing.
+<p>
+<h4>Overlapping the end of one operation with the beginning of the next (PPlain and PMMX)</h4><p>
+The method used in example 1.5 is not very generally applicable so we may look for other
+methods of improving pairing opportunities. One way is to reorganize the loop so that the
+end of one operation overlaps with the beginning of the next. I will call this convoluting the
+loop. A convoluted loop has an unfinished operation at the end of each loop iteration which
+will be finished in the next run. Actually, example 1.5 did pair the last <kbd>MOV</kbd> of one iteration
+with the first <kbd>MOV</kbd> of the next, but we want to explore this method further:
+<p>
+<h4>Example 1.6:</h4><p>
+<pre> MOV ESI, [A]
+ MOV EAX, [N]
+ MOV EDI, [B]
+ XOR ECX, ECX
+ LEA ESI, [ESI+4*EAX] ; point to end of array A
+ SUB ECX, EAX ; -N
+ LEA EDI, [EDI+4*EAX] ; point to end of array B
+ JZ SHORT L3
+ XOR EBX, EBX
+ MOV EAX, [ESI+4*ECX]
+ INC ECX
+ JZ SHORT L2
+L1: SUB EBX, EAX ; u
+ MOV EAX, [ESI+4*ECX] ; v (pairs)
+ MOV [EDI+4*ECX-4], EBX ; u
+ INC ECX ; v (pairs)
+ MOV EBX, 0 ; u
+ JNZ L1 ; v (pairs)
+L2: SUB EBX, EAX
+ MOV [EDI+4*ECX-4], EBX
+L3:</pre><p>
+
+Here we begin reading the second value before we have stored the first, and
+this of course improves pairing opportunities. The <kbd>MOV EBX,0</kbd>
+instruction has been put in between <kbd>INC ECX</kbd> and <kbd>JNZ L1</kbd>
+not to improve pairing but to avoid AGI stall.
+<p>
+<h4>Rolling out a loop (PPlain and PMMX)</h4><p>
+The most generally applicable way to improve pairing opportunities is to do two operations
+for each run and do half as many runs. This is called rolling out a loop:
+<p>
+<h4>Example 1.7:</h4><p>
+<pre> MOV ESI, [A]
+ MOV EAX, [N]
+ MOV EDI, [B]
+ XOR ECX, ECX
+ LEA ESI, [ESI+4*EAX] ; point to end of array A
+ SUB ECX, EAX ; -N
+ LEA EDI, [EDI+4*EAX] ; point to end of array B
+ JZ SHORT L2
+ TEST AL,1 ; test if N is odd
+ JZ SHORT L1
+ MOV EAX, [ESI+4*ECX] ; N is odd. do the odd one
+ NEG EAX
+ MOV [EDI+4*ECX], EAX
+ INC ECX ; make counter even
+ JZ SHORT L2 ; N = 1
+L1: MOV EAX, [ESI+4*ECX] ; u
+ MOV EBX, [ESI+4*ECX+4] ; v (pairs)
+ NEG EAX ; u
+ NEG EBX ; u
+ MOV [EDI+4*ECX], EAX ; u
+ MOV [EDI+4*ECX+4], EBX ; v (pairs)
+ ADD ECX, 2 ; u
+ JNZ L1 ; v (pairs)
+L2:</pre>
+<p>
+Now we are doing two operations in parallel which gives the best pairing opportunities. We
+have to test if <kbd>N</kbd> is odd and if so do one operation outside the loop because the loop can
+only do an even number of operations.
+<p>
+The loop has an AGI stall at the first <kbd>MOV</kbd> instruction because
+<kbd>ECX</kbd> has been incremented in
+the preceding clock cycle. The loop therefore takes 6 clock cycles for two operations.
+<p>
+<h4>Reorganizing a loop to remove AGI stall (PPlain and PMMX)</h4>
+<h4>Example 1.8:</h4><p>
+<pre> MOV ESI, [A]
+ MOV EAX, [N]
+ MOV EDI, [B]
+ XOR ECX, ECX
+ LEA ESI, [ESI+4*EAX] ; point to end of array A
+ SUB ECX, EAX ; -N
+ LEA EDI, [EDI+4*EAX] ; point to end of array B
+ JZ SHORT L3
+ TEST AL,1 ; test if N is odd
+ JZ SHORT L2
+ MOV EAX, [ESI+4*ECX] ; N is odd. do the odd one
+ NEG EAX ; no pairing opportunity
+ MOV [EDI+4*ECX-4], EAX
+ INC ECX ; make counter even
+ JNZ SHORT L2
+ NOP ; add NOP's if JNZ L2 not predictable
+ NOP
+ JMP SHORT L3 ; N = 1
+L1: NEG EAX ; u
+ NEG EBX ; u
+ MOV [EDI+4*ECX-8], EAX ; u
+ MOV [EDI+4*ECX-4], EBX ; v (pairs)
+L2: MOV EAX, [ESI+4*ECX] ; u
+ MOV EBX, [ESI+4*ECX+4] ; v (pairs)
+ ADD ECX, 2 ; u
+ JNZ L1 ; v (pairs)
+ NEG EAX
+ NEG EBX
+ MOV [EDI+4*ECX-8], EAX
+ MOV [EDI+4*ECX-4], EBX
+L3:</pre>
+<p>
+The trick is to find a pair of instructions that do not use the loop counter as index and
+reorganize the loop so that the counter is incremented in the preceding clock cycle. We are
+now down at 5 clock cycles for two operations which is close to the best possible.
+<p>
+If data caching is critical, then you may improve the speed further by
+interleaving the <kbd>A</kbd> and <kbd>B</kbd> arrays into one structured array
+so that each <kbd>B[i]</kbd> comes immediately after the
+corresponding <kbd>A[i]</kbd>. If the structured array is aligned by at least
+8 then <kbd>B[i]</kbd> will always be
+in the same cache line as <kbd>A[i]</kbd>, so you will never have a cache
+miss when writing <kbd>B[i]</kbd>.
+This may of course have a tradeoff in other parts of the program so you
+have to weigh the costs against the benefits.
+<p>
+<h4>Rolling out by more than 2 (PPlain and PMMX)</h4><p>
+You may think of doing more than two operations per iteration in order to reduce the loop
+overhead per operation. But since the loop overhead in most cases can be reduced to only
+one clock cycle per iteration, then rolling out the loop by 4 rather than by 2 would only save
+1/4 clock cycle per operation, which is hardly worth the effort. Only if the loop overhead
+cannot be reduced to one clock cycle and if N is very big, should you think of unrolling by 4.
+<p>
+The drawbacks of excessive loop unrolling are:
+<ol>
+<li>You need to calculate N MODULO R, where R is the unrolling factor, and do N
+MODULO R operations before or after the main loop in order to make the remaining
+number of operations divisible by R. This takes a lot of extra code and poorly predictable
+branches. And the loop body of course also becomes bigger.
+<li>A Piece of code usually takes much more time the first time it executes, and the penalty
+of first time execution is bigger the more code you have, especially if N is small.
+<li>Excessive code size makes the utilization of the code cache less effective.
+</ol>
+<p>
+<h4>Handling multiple 8 or 16 bit operands simultaneously in 32 bit registers (PPlain and PMMX)</h4><p>
+If you need to manipulate arrays of 8 or 16 bit operands, then there is a problem with
+unrolled loops because you may not be able to pair two memory access operations. For
+example <kbd>MOV AL,[ESI] / MOV BL,[ESI+1]</kbd> will not pair if the two operands are within
+the same dword of memory. But there may be a much smarter method, namely to handle
+four bytes at a time in the same 32 bit register.
+<p>
+The following example adds 2 to all elements of an array of bytes:
+<p>
+<h4>Example 1.9:</h4><p>
+<pre> MOV ESI, [A] ; address of byte array
+ MOV ECX, [N] ; number of elements in byte array
+ TEST ECX, ECX ; test if N is 0
+ JZ SHORT L2
+ MOV EAX, [ESI] ; read first four bytes
+L1: MOV EBX, EAX ; copy into EBX
+ AND EAX, 7F7F7F7FH ; get lower 7 bits of each byte in EAX
+ XOR EBX, EAX ; get the highest bit of each byte
+ ADD EAX, 02020202H ; add desired value to all four bytes
+ XOR EBX, EAX ; combine bits again
+ MOV EAX, [ESI+4] ; read next four bytes
+ MOV [ESI], EBX ; store result
+ ADD ESI, 4 ; increment pointer
+ SUB ECX, 4 ; decrement loop counter
+ JA L1 ; loop
+L2:</pre><p>
+This loop takes 5 clock cycles for every 4 bytes. The array should of course be aligned by
+4. If the number of elements in the array is not divisible by four, then you may padd it in the
+end with a few extra bytes to make the length divisible by four. This loop will always read
+past the end of the array, so you should make sure the array is not placed at the end of a
+segment to avoid a general protection error.
+<p>
+Note that I have masked out the highest bit of each byte to avoid a possible carry from
+each byte into the next when adding. I am using <kbd>XOR</kbd> rather than
+<kbd>ADD</kbd> when putting in the high bit again to avoid carry.
+<p>
+The <kbd>ADD ESI,4</kbd> instruction could have been avoided by using the loop counter as index
+as in example 1.4. However, this would give an odd number of instructions in the loop
+body, so there would be one unpaired instruction and the loop would still take 5 clocks.
+Making the branch instruction unpaired would save one clock after the last operation when
+the branch is mispredicted, but we would have to spend an extra clock cycle in the prolog
+code to setup a pointer to the end of the array and calculate -N, so the two methods will be
+exactly equally fast. The method presented here is the simplest and shortest.
+<p>
+The next example finds the length of a zero-terminated string by searching
+for the first byte of zero. It is faster than using <kbd>REP SCASB</kbd>:
+<p>
+<h4><a name="1-10">Example 1.10:</a></h4><p>
+<pre>STRLEN PROC NEAR
+ MOV EAX,[ESP+4] ; get pointer
+ MOV EDX,7
+ ADD EDX,EAX ; pointer+7 used in the end
+ PUSH EBX
+ MOV EBX,[EAX] ; read first 4 bytes
+ ADD EAX,4 ; increment pointer
+L1: LEA ECX,[EBX-01010101H] ; subtract 1 from each byte
+ XOR EBX,-1 ; invert all bytes
+ AND ECX,EBX ; and these two
+ MOV EBX,[EAX] ; read next 4 bytes
+ ADD EAX,4 ; increment pointer
+ AND ECX,80808080H ; test all sign bits
+ JZ L1 ; no zero bytes, continue loop
+ TEST ECX,00008080H ; test first two bytes
+ JNZ SHORT L2
+ SHR ECX,16 ; not in the first 2 bytes
+ ADD EAX,2
+L2: SHL CL,1 ; use carry flag to avoid a branch
+ POP EBX
+ SBB EAX,EDX ; compute length
+ RET
+STRLEN ENDP</pre><p>
+Again we have used the method of overlapping the end of one operation with the beginning
+of the next to improve pairing. I have not unrolled the loop because it is likely to repeat
+relatively few times. The string should of course be aligned by 4. The code will always read
+past the end of the string, so the string should not be placed at the end of a segment.
+<p>
+The loop body has an odd number of instructions so there is one unpaired. Making the
+branch instruction unpaired rather than one of the other instructions has the advantage that
+it saves 1 clock cycle when the branch is mispredicted.
+<p>
+The <kbd>TEST ECX,00008080H</kbd> instruction is non-pairable. You could use the pairable
+instruction <kbd>OR CH,CL</kbd> here instead, but then you would have to put
+in a <kbd>NOP</kbd> or something to avoid the penalties of consecutive branches.
+Another problem with <kbd>OR CH,CL</kbd> is that it
+would cause a partial register stall on a PPro, PII and PIII. So I have chosen to keep the
+unpairable <kbd>TEST</kbd> instruction.
+<p>
+Handling 4 bytes simultaneously can be quite difficult. The code uses a formula which
+generates a nonzero value for a byte if, and only if, the byte is zero. This makes it possible
+to test all four bytes in one operation. This algorithm involves the subtraction of 1 from all
+bytes (in the <kbd>LEA</kbd> instruction). I have not masked out the highest bit of each byte before
+subtracting, as I did in the previous example, so the subtraction may generate a borrow to
+the next byte, but only if it is zero, and this is exactly the situation where we don't care what
+the next byte is, because we are searching forwards for the first zero. If we were searching
+backwards then we would have to re-read the dword after detecting a zero, and then test all
+four bytes to find the last zero, or use <kbd>BSWAP</kbd> to reverse the order of the bytes.
+<p>
+If you want to search for a byte value other than zero, then you may <kbd>XOR</kbd> all four bytes
+with the value you are searching for, and then use the method above to search for zero.
+<p>
+<h4>Loops with MMX operations (PMMX)</h4><p>
+Handling multiple operands in the same register is easier on the MMX processors because
+they have special instructions and special 64 bit registers for exactly this purpose.
+<p>
+Returning to the problem of adding two to all bytes in an array, we may take advantage of
+the MMX instructions:
+<h4>Example 1.11:</h4><p>
+<pre>.data
+ALIGN 8
+ADDENTS DQ 0202020202020202h ; specify byte to add eight times
+A DD ? ; address of byte array
+N DD ? ; number of iterations
+
+.code
+ MOV ESI, [A]
+ MOV ECX, [N]
+ MOVQ MM2, [ADDENTS]
+ JMP SHORT L2
+ ; top of loop
+L1: MOVQ [ESI-8], MM0 ; store result
+L2: MOVQ MM0, MM2 ; load addents
+ PADDB MM0, [ESI] ; add eight bytes in one operation
+ ADD ESI, 8
+ DEC ECX
+ JNZ L1
+ MOVQ [ESI-8], MM0 ; store last result
+ EMMS</pre><p>
+The store instruction is moved to after the loop control instructions in order to avoid a store stall.
+<p>
+This loop takes 4 clocks because the <kbd>PADDB</kbd> instruction doesn't pair
+with <kbd>ADD ESI,8</kbd>. (A MMX instruction with memory access cannot pair
+with a non-MMX instruction or with another MMX instruction with memory access).
+We could get rid of <kbd>ADD ESI,8</kbd> by using <kbd>ECX</kbd> as index,
+but that would give an AGI stall.
+<p>
+Since the loop overhead is considerable we might want to unroll the loop:
+<p>
+<h4>Example 1.12:</h4><p>
+<pre>.data
+ALIGN 8
+ADDENTS DQ 0202020202020202h ; specify byte to add eight
+times
+A DD ? ; address of byte array
+N DD ? ; number of iterations
+
+.code
+ MOVQ MM2, [ADDENTS]
+ MOV ESI, [A]
+ MOV ECX, [N]
+ MOVQ MM0, MM2
+ MOVQ MM1, MM2
+L3: PADDB MM0, [ESI]
+ PADDB MM1, [ESI+8]
+ MOVQ [ESI], MM0
+ MOVQ MM0, MM2
+ MOVQ [ESI+8], MM1
+ MOVQ MM1, MM2
+ ADD ESI, 16
+ DEC ECX
+ JNZ L3
+ EMMS</pre><p>
+This unrolled loop takes 6 clocks per iteration for adding 16 bytes.
+The <kbd>PADDB</kbd> instructions are not paired. The two threads are
+interleaved to avoid a store stall.
+<p>
+Using the MMX instructions has a high penalty if you are using floating point
+instructions shortly afterwards, so there may still be situations where you
+want to use 32 bit registers as in example 1.9.
+<p>
+<h4>Loops with floating point operations (PPlain and PMMX)</h4><p>
+The methods of optimizing floating point loops are basically the same as for integer loops,
+although the floating point instructions are overlapping rather than pairing.
+<p>
+Consider the C language code:
+<pre> int i, n; double * X; double * Y; double DA;
+ for (i=0; i&lt;n; i++) Y[i] = Y[i] - DA * X[i];</pre><p>
+This piece of code (called DAXPY) has been studied extensively because it is the key to
+solving linear equations.
+<p>
+<h4>Example 1.13:</h4><p>
+<pre>DSIZE = 8 ; data size
+ MOV EAX, [N] ; number of elements
+ MOV ESI, [X] ; pointer to X
+ MOV EDI, [Y] ; pointer to Y
+ XOR ECX, ECX
+ LEA ESI, [ESI+DSIZE*EAX] ; point to end of X
+ SUB ECX, EAX ; -N
+ LEA EDI, [EDI+DSIZE*EAX] ; point to end of Y
+ JZ SHORT L3 ; test for N = 0
+ FLD DSIZE PTR [DA]
+ FMUL DSIZE PTR [ESI+DSIZE*ECX] ; DA * X[0]
+ JMP SHORT L2 ; jump into loop
+L1: FLD DSIZE PTR [DA]
+ FMUL DSIZE PTR [ESI+DSIZE*ECX] ; DA * X[i]
+ FXCH ; get old result
+ FSTP DSIZE PTR [EDI+DSIZE*ECX-DSIZE] ; store Y[i]
+L2: FSUBR DSIZE PTR [EDI+DSIZE*ECX] ; subtract from Y[i]
+ INC ECX ; increment index
+ JNZ L1 ; loop
+ FSTP DSIZE PTR [EDI+DSIZE*ECX-DSIZE] ; store last result
+L3:</pre><p>
+Here we are using the same methods as in example 1.6: Using the loop counter as index
+register and counting through negative values up to zero. The end of one operation
+overlaps with the beginning of the next.
+<p>
+The interleaving of floating point operations work perfectly here:
+The 2 clock stall between <kbd>FMUL</kbd> and <kbd>FSUBR</kbd> is filled
+with the <kbd>FSTP</kbd> of the previous result. The 3 clock stall between
+<kbd>FSUBR</kbd> and <kbd>FSTP</kbd> is filled with the loop overhead and the
+first two instructions of the next operation. An AGI stall has been avoided
+by reading the only parameter that doesn't depend on the index in the first clock cycle after the index has been incremented.
+<p>
+This solution takes 6 clock cycles per operation, which is better than the
+unrolled solution published by Intel!
+<p>
+<h4>Unrolling floating point loops (PPlain and PMMX)</h4><p>
+<a name="unrollby3">The DAXPY loop unrolled by 3 is quite complicated:</a>
+<h4>Example 1.14:</h4><p>
+<pre>DSIZE = 8 ; data size
+IF DSIZE EQ 4
+SHIFTCOUNT = 2
+ELSE
+SHIFTCOUNT = 3
+ENDIF
+
+ MOV EAX, [N] ; number of elements
+ MOV ECX, 3*DSIZE ; counter bias
+ SHL EAX, SHIFTCOUNT ; DSIZE*N
+ JZ L4 ; N = 0
+ MOV ESI, [X] ; pointer to X
+ SUB ECX, EAX ; (3-N)*DSIZE
+ MOV EDI, [Y] ; pointer to Y
+ SUB ESI, ECX ; end of pointer - bias
+ SUB EDI, ECX
+ TEST ECX, ECX
+ FLD DSIZE PTR [ESI+ECX] ; first X
+ JNS SHORT L2 ; less than 4 operations
+L1: ; main loop
+ FMUL DSIZE PTR [DA]
+ FLD DSIZE PTR [ESI+ECX+DSIZE]
+ FMUL DSIZE PTR [DA]
+ FXCH
+ FSUBR DSIZE PTR [EDI+ECX]
+ FXCH
+ FLD DSIZE PTR [ESI+ECX+2*DSIZE]
+ FMUL DSIZE PTR [DA]
+ FXCH
+ FSUBR DSIZE PTR [EDI+ECX+DSIZE]
+ FXCH ST(2)
+ FSTP DSIZE PTR [EDI+ECX]
+ FSUBR DSIZE PTR [EDI+ECX+2*DSIZE]
+ FXCH
+ FSTP DSIZE PTR [EDI+ECX+DSIZE]
+ FLD DSIZE PTR [ESI+ECX+3*DSIZE]
+ FXCH
+ FSTP DSIZE PTR [EDI+ECX+2*DSIZE]
+ ADD ECX, 3*DSIZE
+ JS L1 ; loop
+L2: FMUL DSIZE PTR [DA] ; finish leftover operation
+ FSUBR DSIZE PTR [EDI+ECX]
+ SUB ECX, 2*DSIZE ; change pointer bias
+ JZ SHORT L3 ; finished
+ FLD DSIZE PTR [DA] ; start next operation
+ FMUL DSIZE PTR [ESI+ECX+3*DSIZE]
+ FXCH
+ FSTP DSIZE PTR [EDI+ECX+2*DSIZE]
+ FSUBR DSIZE PTR [EDI+ECX+3*DSIZE]
+ ADD ECX, 1*DSIZE
+ JZ SHORT L3 ; finished
+ FLD DSIZE PTR [DA]
+ FMUL DSIZE PTR [ESI+ECX+3*DSIZE]
+ FXCH
+ FSTP DSIZE PTR [EDI+ECX+2*DSIZE]
+ FSUBR DSIZE PTR [EDI+ECX+3*DSIZE]
+ ADD ECX, 1*DSIZE
+L3: FSTP DSIZE PTR [EDI+ECX+2*DSIZE]
+L4:</pre><p>
+The reason why I am showing you how to unroll a loop by 3 is not to recommend
+it, but to warn you how difficult it is! Be prepared to spend a considerable amount of time debugging
+and verifying your code when doing something like this. There are several problems to take
+care of: In most cases, you cannot remove all stalls from a floating point loop unrolled by
+less than 4 unless you convolute it (i.e. there are unfinished operations at the end of each
+run which are being finished in the next run). The last <kbd>FLD</kbd> in the main loop above is the
+beginning of the first operation in the next run. It would be tempting here to make a solution
+which reads past the end of the array and then discards the extra value in the end, as in
+example 1.9 and 1.10, but that is not recommended in floating point loops because the
+reading of the extra value might generate a denormal operand exception in case the
+memory position after the array doesn't contain a valid floating point number. To avoid this,
+we have to do at least one more operation after the main loop.
+<p>
+The number of operations to do outside an unrolled loop would normally be N MODULO R,
+where N is the number of operations, and R is the unrolling factor. But in the case of a
+convoluted loop, we have to do one more, i.e. (N-1) MODULO R + 1, for the
+abovementioned reason.
+<p>
+Normally, we would prefer to do the extra operations before the main loop, but here we have
+to do them afterwards for two reasons: One reason is to take care of the leftover operand
+from the convolution. The other reason is that calculating the number of extra operations
+requires a division if R is not a power of 2, and a division is time consuming. Doing the extra
+operations after the loop saves the division.
+<p>
+The next problem is to calculate how to bias the loop counter so that it will change sign at
+the right time, and adjust the base pointers so as to compensate for this bias. Finally, you
+have to make sure the leftover operand from the convolution is handled correctly for all
+values of N.
+<p>
+The epilog code doing 1-3 operations could have been implemented as a separate loop, but
+that would cost an extra branch misprediction, so the solution above is faster.
+<p>Now that I have scared you by demonstrating how difficult it is to unroll by 3, I will show you
+that it is much easier to unroll by 4:
+<p>
+<h4>Example 1.15:</h4><p>
+<pre>DSIZE = 8 ; data size
+ MOV EAX, [N] ; number of elements
+ MOV ESI, [X] ; pointer to X
+ MOV EDI, [Y] ; pointer to Y
+ XOR ECX, ECX
+ LEA ESI, [ESI+DSIZE*EAX] ; point to end of X
+ SUB ECX, EAX ; -N
+ LEA EDI, [EDI+DSIZE*EAX] ; point to end of Y
+ TEST AL,1 ; test if N is odd
+ JZ SHORT L1
+ FLD DSIZE PTR [DA] ; do the odd operation
+ FMUL DSIZE PTR [ESI+DSIZE*ECX]
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX]
+ INC ECX ; adjust counter
+ FSTP DSIZE PTR [EDI+DSIZE*ECX-DSIZE]
+L1: TEST AL,2 ; test for possibly 2 more operations
+ JZ L2
+ FLD DSIZE PTR [DA] ; N MOD 4 = 2 or 3. Do two more
+ FMUL DSIZE PTR [ESI+DSIZE*ECX]
+ FLD DSIZE PTR [DA]
+ FMUL DSIZE PTR [ESI+DSIZE*ECX+DSIZE]
+ FXCH
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX]
+ FXCH
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX+DSIZE]
+ FXCH
+ FSTP DSIZE PTR [EDI+DSIZE*ECX]
+ FSTP DSIZE PTR [EDI+DSIZE*ECX+DSIZE]
+ ADD ECX, 2 ; counter is now divisible by 4
+L2: TEST ECX, ECX
+ JZ L4 ; no more operations
+L3: ; main loop:
+ FLD DSIZE PTR [DA]
+ FLD DSIZE PTR [ESI+DSIZE*ECX]
+ FMUL ST,ST(1)
+ FLD DSIZE PTR [ESI+DSIZE*ECX+DSIZE]
+ FMUL ST,ST(2)
+ FLD DSIZE PTR [ESI+DSIZE*ECX+2*DSIZE]
+ FMUL ST,ST(3)
+ FXCH ST(2)
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX]
+ FXCH ST(3)
+ FMUL DSIZE PTR [ESI+DSIZE*ECX+3*DSIZE]
+ FXCH
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX+DSIZE]
+ FXCH ST(2)
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX+2*DSIZE]
+ FXCH
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX+3*DSIZE]
+ FXCH ST(3)
+ FSTP DSIZE PTR [EDI+DSIZE*ECX]
+ FSTP DSIZE PTR [EDI+DSIZE*ECX+2*DSIZE]
+ FSTP DSIZE PTR [EDI+DSIZE*ECX+DSIZE]
+ FSTP DSIZE PTR [EDI+DSIZE*ECX+3*DSIZE]
+ ADD ECX, 4 ; increment index by 4
+ JNZ L3 ; loop
+L4:</pre>
+<p>
+It is usually quite easy to find a stall-free solution when unrolling by 4, and there is no need
+for convolution. The number of extra operations to do outside the main loop is N MODULO
+4, which can be calculated easily without division, simply by testing the two lowest bits in N.
+The extra operations are done before the main loop rather than after, to make the handling
+of the loop counter simpler.
+<p>
+The tradeoff of loop unrolling is that the extra operations outside the loop are slower due to
+incomplete overlapping and possible branch mispredictions, and the first time penalty is
+higher because of increased code size.
+<p>
+As a general recommendation, I would say that if N is big or if convoluting the loop without
+unrolling cannot remove enough stalls, then you should unroll critical integer loops by 2 and
+floating point loops by 4.
+<p>
+<h3><a name="25_2">25.2 Loops in PPro, PII and PIII</a></h3><p>
+In the previous chapter (<a href="#25_1">25.1</a>) I explained how to use convolution and loop unrolling in order
+to improve pairing in PPlain and PMMX. On the PPro, PII and PIII there is no reason to do this
+thanks to the out-of-order execution mechanism. But there are other quite difficult problems
+to take care of, most importantly ifetch boundaries and register read stalls.
+<p>
+I have chosen the same example as in chapter <a href="#25_1">25.1</a>
+for the previous microprocessors: a procedure which reads integers from an
+array, changes the sign of each integer, and stores the results in another array.
+<p>
+A C language code for this procedure would be:
+<pre>void ChangeSign (int * A, int * B, int N) {
+ int i;
+ for (i=0; i&lt;N; i++) B[i] = -A[i];}</pre><p>
+Translating to assembly, we might write the procedure like this:
+<h4>Example 2.1:</h4><p>
+<pre>_ChangeSign PROC NEAR
+ PUSH ESI
+ PUSH EDI
+A EQU DWORD PTR [ESP+12]
+B EQU DWORD PTR [ESP+16]
+N EQU DWORD PTR [ESP+20]
+
+ MOV ECX, [N]
+ JECXZ L2
+ MOV ESI, [A]
+ MOV EDI, [B]
+ CLD
+L1: LODSD
+ NEG EAX
+ STOSD
+ LOOP L1
+L2: POP EDI
+ POP ESI
+ RET
+_ChangeSign ENDP</pre><p>
+This looks like a nice solution, but it is not optimal because it uses the non-optimal
+instructions <kbd>LOOP, LODSD</kbd> and <kbd>STOSD</kbd> that generate many uops.
+It takes 6-7 clock cycles per iteration if all data are in the level one cache.
+Avoiding these instructions we get:
+<h4>Example 2.2:</h4><p>
+<pre> MOV ECX, [N]
+ JECXZ L2
+ MOV ESI, [A]
+ MOV EDI, [B]
+ALIGN 16
+L1: MOV EAX, [ESI] ; len=2, p2rESIwEAX
+ ADD ESI, 4 ; len=3, p01rwESIwF
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI], EAX ; len=2, p4rEAX, p3rEDI
+ ADD EDI, 4 ; len=3, p01rwEDIwF
+ DEC ECX ; len=1, p01rwECXwF
+ JNZ L1 ; len=2, p1rF
+L2:</pre><p>
+The comments are interpreted as follows: the <kbd>MOV EAX,[ESI]</kbd>
+instruction is 2 bytes long, it generates one uop for port 2 that reads
+<kbd>ESI</kbd> and writes to (renames) <kbd>EAX</kbd>. This
+information is needed for analyzing the possible bottlenecks.
+<p>
+Let's first analyze the instruction decoding (chapter <a href="#14">14</a>): One of the
+instructions generates 2 uops (<kbd>MOV [EDI],EAX</kbd>).
+This instruction must go into decoder D0. There are three
+decode groups in the loop so it can decode in 3 clock cycles.
+<p>
+Next, let's look at the instruction fetch (chapter <a href="#15">15</a>): If an ifetch boundary prevents the first
+three instructions from decoding together then there will be three decode groups in the last
+ifetch block so that the next iteration will have the ifetch block starting at the first instruction
+where we want it, and we will get a delay only in the first iteration. A worse situation would
+be a 16-byte boundary and an ifetch boundary in one of the last three instructions.
+According to the <a href="#ifetchtable">ifetch table</a>, this will generate a delay of 1 clock and cause the next
+iteration to have its first ifetch block aligned by 16, so that the problem continues through all
+iterations. The result is a fetch time of 4 clocks per iteration rather than 3. There are two
+ways to prevent this situation: the first method is to control where the ifetch blocks lie on the
+first iteration; the second method is to control where the 16-byte boundaries are. The latter
+method is the easiest. Since the entire loop has only 15 bytes of code you can avoid any
+16-byte boundary by aligning the loop entry by 16, as shown above. This will put the entire
+loop into a single ifetch block so that no further analysis of instruction fetching is needed.
+<p>
+The third problem to look at is register read stalls (chapter <a href="#16">16</a>). No register is read in this
+loop without being written to at least a few clock cycles before, so there can be no register
+read stalls.
+<p>
+The fourth analysis is execution (chapter <a href="#17">17</a>). Counting the uops for the different ports we
+get:<br>
+port 0 or 1: 4 uops<br>
+port 1 only: 1 uop<br>
+port 2: 1 uop<br>
+port 3: 1 uop<br>
+port 4: 1 uop<br>
+Assuming that the uops that can go to either port 0 or 1 are distributed optimally, the
+execution time will be 2.5 clocks per iteration.
+<p>
+The last analysis is retirement (chapter <a href="#18">18</a>). Since the number of uops in the loop is not
+divisible by 3, the retirement slots will not be used optimally when the jump has to retire in
+the first slot. The time needed for retirement is the number of uops divided by 3, and
+rounded up to nearest integer. This gives 3 clocks for retirement.
+<p>
+In conclusion, the loop above can execute in 3 clocks per iteration if the loop entry is
+aligned by 16. I am assuming that the conditional jump is predicted every time except on the
+exit of the loop (chapter <a href="#22_2">22.2</a>).
+<p>
+<h4>Using the same register for counter and index and letting the counter end at zero (PPro, PII and PIII)</h4>
+<h4><a name="2-3">Example 2.3:</a></h4><p>
+<pre> MOV ECX, [N]
+ MOV ESI, [A]
+ MOV EDI, [B]
+ LEA ESI, [ESI+4*ECX] ; point to end of array A
+ LEA EDI, [EDI+4*ECX] ; point to end of array B
+ NEG ECX ; -N
+ JZ SHORT L2
+ALIGN 16
+L1: MOV EAX, [ESI+4*ECX] ; len=3, p2rESIrECXwEAX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI+4*ECX], EAX ; len=3, p4rEAX, p3rEDIrECX
+ INC ECX ; len=1, p01rwECXwF
+ JNZ L1 ; len=2, p1rF
+L2:</pre><p>
+Here we have reduced the number of uops to 6 by using the same register as counter and
+index. The base pointers point to the end of the arrays so that the index can count up
+through negative values to zero.
+<p>
+Decoding: There are two decode groups in the loop so it will decode in 2 clocks.
+<p>
+Instruction fetch: A loop always takes at least one clock cycle more than the the number of
+16 byte blocks. Since there are only 11 bytes of code in the loop it is possible to have it all
+in one ifetch block. By aligning the loop entry by 16 we can make sure that we don't get
+more than one 16-byte block so that it is possible to fetch in 2 clocks.
+<p>
+Register read stalls: The <kbd>ESI</kbd> and <kbd>EDI</kbd> registers are read, but not modified inside the loop.
+They will therefore be counted as permanent register reads, but not in the same triplet.
+Register <kbd>EAX, ECX</kbd>, and flags are modified inside the loop and read
+before they are written back so they will cause no permanent register reads.
+The conclusion is that there are no register read stalls.
+<p>
+Execution:<br>
+port 0 or 1: 2 uops<br>
+port 1: 1 uop<br>
+port 2: 1 uop<br>
+port 3: 1 uop<br>
+port 4: 1 uop<br>
+Execution time: 1.5 clocks.
+<p>
+Retirement:<br>
+6 uops = 2 clocks.
+<p>
+Conclusion: this loop takes only 2 clock cycles per iteration.
+<p>
+If you use absolute addresses instead of <kbd>ESI</kbd> and <kbd>EDI</kbd> then the loop will take 3 clocks
+because it cannot be contained in a single 16-byte block.
+<p>
+<h4>Unrolling a loop (PPro, PII and PIII)</h4><p>
+Doing more than one operation in each run and doing correspondingly fewer runs is called
+loop unrolling. In previous processors you would unroll loops to get parallel execution by
+pairing (chapter <a href="#25_1">25.1</a>). In PPro, PII and PIII this is not needed because the out-of-order
+execution mechanism takes care of that. There is no need to use two different registers
+either, because register renaming takes care of this. The purpose of unrolling here is to
+reduce the loop overhead per iteration.
+<p>
+The following example is the same as example 2.2 , but unrolled by 2, which means that
+you do two operations per iteration and half as many iterations
+<h4>Example 2.4:</h4><p>
+<pre> MOV ECX, [N]
+ MOV ESI, [A]
+ MOV EDI, [B]
+ SHR ECX, 1 ; N/2
+ JNC SHORT L1 ; test if N was odd
+ MOV EAX, [ESI] ; do the odd one first
+ ADD ESI, 4
+ NEG EAX
+ MOV [EDI], EAX
+ ADD EDI, 4
+L1: JECXZ L3
+
+ALIGN 16
+L2: MOV EAX, [ESI] ; len=2, p2rESIwEAX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI], EAX ; len=2, p4rEAX, p3rEDI
+ MOV EAX, [ESI+4] ; len=3, p2rESIwEAX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI+4], EAX ; len=3, p4rEAX, p3rEDI
+ ADD ESI, 8 ; len=3, p01rwESIwF
+ ADD EDI, 8 ; len=3, p01rwEDIwF
+ DEC ECX ; len=1, p01rwECXwF
+ JNZ L2 ; len=2, p1rF
+L3:</pre><p>
+In example 2.2 the loop overhead (i.e. adjusting pointers and counter, and jumping back)
+was 4 uops and the 'real job' was 4 uops. When unrolling the loop by two you do the 'real
+job' twice and the overhead once, so you get 12 uops in all. This reduces the overhead from
+50% to 33% of the uops. Since the unrolled loop can do only an even number of operations
+you have to check if N is odd and if so do one operation outside the loop.
+<p>
+Analyzing instruction fetching in this loop we find that a new ifetch block begins in the
+<kbd>ADD ESI,8</kbd> instruction, forcing it into decoder D0. This makes the loop decode in 5 clock cycles
+and not 4 as we wanted. We can solve this problem by coding the preceding instruction in a
+longer version. Change <kbd>MOV [EDI+4],EAX </kbd> to:
+<pre> MOV [EDI+9999],EAX ; make instruction with long displacement
+ ORG $-4
+ DD 4 ; rewrite displacement to 4</pre><p>
+This will force a new ifetch block to begin at the long <kbd>MOV [EDI+4],EAX</kbd>
+instruction, so that decoding time is now down at 4 clocks. The rest of the
+pipeline can handle 3 uops per clock so that the expected execution time is 4
+clocks per iteration, or 2 clocks per operation.
+<p>
+Testing this solution shows that it actually takes a little more. My measurements showed
+approximately 4.5 clocks per iteration. This is probably due to a sub-optimal reordering of
+the uops. Possibly, the ROB doesn't find the optimal execution-order for the uops but
+submits them in a less than optimal order. This problem was not predicted, and only testing
+can reveal such a problem. We may help the ROB by doing some of the reordering
+manually:
+<h4>Example 2.5:</h4><p>
+<pre>ALIGN 16
+L2: MOV EAX, [ESI] ; len=2, p2rESIwEAX
+ MOV EBX, [ESI+4] ; len=3, p2rESIwEBX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI], EAX ; len=2, p4rEAX, p3rEDI
+ ADD ESI, 8 ; len=3, p01rwESIwF
+ NEG EBX ; len=2, p01rwEBXwF
+ MOV [EDI+4], EBX ; len=3, p4rEBX, p3rEDI
+ ADD EDI, 8 ; len=3, p01rwEDIwF
+ DEC ECX ; len=1, p01rwECXwF
+ JNZ L2 ; len=2, p1rF
+L3:</pre><p>
+The loop now executes in 4 clocks per iteration. This solution also solves the problem with
+instruction fetch blocks. The cost is that we need an extra register because we cannot take
+advantage of register renaming.
+<p>
+<h4>Rolling out by more than 2</h4><p>
+Loop unrolling is recommended when the loop overhead constitutes a high proportion of the
+total execution time. In example 2.3 the overhead is only 2 uops, so the gain by unrolling is
+little, but I will show you how to unroll it anyway, just for the exercise.
+<p>
+The 'real job' is 4 uops and the overhead 2. Unrolling by two we get 2*4+2 = 10 uops. The
+retirement time will be 10/3, rounded up to an integer, that is 4 clock cycles. This calculation
+shows that nothing is gained by unrolling this by two. Unrolling by four we get:
+<h4>Example 2.6:</h4><p>
+<pre> MOV ECX, [N]
+ SHL ECX, 2 ; number of bytes to handle
+ MOV ESI, [A]
+ MOV EDI, [B]
+ ADD ESI, ECX ; point to end of array A
+ ADD EDI, ECX ; point to end of array B
+ NEG ECX ; -4*N
+ TEST ECX, 4 ; test if N is odd
+ JZ SHORT L1
+ MOV EAX, [ESI+ECX] ; N is odd. do the odd one
+ NEG EAX
+ MOV [EDI+ECX], EAX
+ ADD ECX, 4
+L1: TEST ECX, 8 ; test if N/2 is odd
+ JZ SHORT L2
+ MOV EAX, [ESI+ECX] ; N/2 is odd. do two extra
+ NEG EAX
+ MOV [EDI+ECX], EAX
+ MOV EAX, [ESI+ECX+4]
+ NEG EAX
+ MOV [EDI+ECX+4], EAX
+ ADD ECX, 8
+L2: JECXZ SHORT L4
+
+ALIGN 16
+L3: MOV EAX, [ESI+ECX] ; len=3, p2rESIrECXwEAX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI+ECX], EAX ; len=3, p4rEAX, p3rEDIrECX
+ MOV EAX, [ESI+ECX+4] ; len=4, p2rESIrECXwEAX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI+ECX+4], EAX ; len=4, p4rEAX, p3rEDIrECX
+ MOV EAX, [ESI+ECX+8] ; len=4, p2rESIrECXwEAX
+ MOV EBX, [ESI+ECX+12] ; len=4, p2rESIrECXwEAX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI+ECX+8], EAX ; len=4, p4rEAX, p3rEDIrECX
+ NEG EBX ; len=2, p01rwEAXwF
+ MOV [EDI+ECX+12], EBX ; len=4, p4rEAX, p3rEDIrECX
+ ADD ECX, 16 ; len=3, p01rwECXwF
+ JS L3 ; len=2, p1rF
+L4:</pre><p>
+The ifetch blocks are where we want them. Decode time is 6 clocks.
+<p>
+Register read stalls is a problem here because <kbd>ECX</kbd> has retired near the end of the loop
+and we need to read both <kbd>ESI, EDI,</kbd> and <kbd>ECX</kbd>. The instructions have been reordered in
+order to avoid reading ESI near the bottom so that we can avoid a register read stall. In
+other words, the reason for reordering instructions and use an extra register (<kbd>EBX</kbd>) is not the
+same as in the previous example.
+<p>
+There are 12 uops and the loop executes in 6 clocks per iteration, or 1.5 clocks per
+operation.
+<p>
+It may be tempting to unroll loops by a high factor in order to get the maximum speed. But
+since the loop overhead in most cases can be reduced to something like one clock cycle
+per iteration then unrolling the loop by 4 rather than by 2 would save only 1/4 clock cycle
+per operation which is hardly worth the effort. Only if the loop overhead is high compared to
+the rest of the loop and N is very big should you think of unrolling by 4. Unrolling by more
+than 4 does not make sense.
+<p>
+The drawbacks of excessive loop unrolling are:
+<ol>
+<li>You need to calculate N MODULO R, where R is the unrolling factor, and do N
+MODULO R operations before or after the main loop in order to make the remaining
+number of operations divisible by R. This takes a lot of extra code and poorly predictable
+branches. And the loop body of course also becomes bigger.
+<li>A Piece of code usually takes much more time the first time it executes, and the penalty
+of first time execution is bigger the more code you have, especially if N is small.
+<li>Excessive code size makes the utilization of the code cache less effective.
+</ol>
+<p>
+Using an unrolling factor which is not a power of 2 makes the calculation of N MODULO R
+quite difficult, and is generally not recommended unless N is known to be divisible by R.
+<a href="#unrollby3">Example 1.14</a> shows how to unroll by 3.
+<p>
+<h4>Handling multiple 8 or 16 bit operands simultaneously in 32 bit registers (PPro, PII and PIII)</h4><p>
+It is sometimes possible to handle four bytes at a time in the same 32 bit register. The
+following example adds 2 to all elements of an array of bytes:
+<h4><a name="2-7">Example 2.7:</a></h4><p>
+<pre> MOV ESI, [A] ; address of byte array
+ MOV ECX, [N] ; number of elements in byte array
+ JECXZ L2
+ALIGN 16
+ DB 7 DUP (90H) ; 7 NOP's for controlling alignment
+
+ L1: MOV EAX, [ESI] ; read four bytes
+ MOV EBX, EAX ; copy into EBX
+ AND EAX, 7F7F7F7FH ; get lower 7 bits of each byte in EAX
+ XOR EBX, EAX ; get the highest bit of each byte
+ ADD EAX, 02020202H ; add desired value to all four bytes
+ XOR EBX, EAX ; combine bits again
+ MOV [ESI], EBX ; store result
+ ADD ESI, 4 ; increment pointer
+ SUB ECX, 4 ; decrement loop counter
+ JA L1 ; loop
+L2:</pre><p>
+Note that I have masked out the highest bit of each byte to avoid a possible carry from each
+byte into the next one when adding. I am using <kbd>XOR</kbd> rather than
+<kbd>ADD</kbd> when putting in the high bit again to avoid carry.
+The array should of course be aligned by 4.
+<p>
+This loop should ideally take 4 clocks per iteration, but it takes somewhat
+more due to the dependency chain and difficult reordering. On PII and PIII
+you can do the same more effectively using MMX registers.
+<p>
+The next example finds the length of a zero-terminated string by searching for the first byte
+of zero. It is much faster than using <kbd>REPNE SCASB</kbd>:
+<h4><a name="2-8">Example 2.8:</a></h4><p>
+<pre>_strlen PROC NEAR
+ PUSH EBX
+ MOV EAX,[ESP+8] ; get pointer to string
+ LEA EDX,[EAX+3] ; pointer+3 used in the end
+L1: MOV EBX,[EAX] ; read first 4 bytes
+ ADD EAX,4 ; increment pointer
+ LEA ECX,[EBX-01010101H] ; subtract 1 from each byte
+ NOT EBX ; invert all bytes
+ AND ECX,EBX ; and these two
+ AND ECX,80808080H ; test all sign bits
+ JZ L1 ; no zero bytes, continue loop
+ MOV EBX,ECX
+ SHR EBX,16
+ TEST ECX,00008080H ; test first two bytes
+ CMOVZ ECX,EBX ; shift right if not in the first 2 bytes
+ LEA EBX,[EAX+2]
+ CMOVZ EAX,EBX
+ SHL CL,1 ; use carry flag to avoid branch
+ SBB EAX,EDX ; compute length
+ POP EBX
+ RET
+_strlen ENDP</pre><p>
+This loop takes 3 clocks for each iteration testing 4 bytes. The string should of course be
+aligned by 4. The code may read past the end of the string, so the string should not be
+placed at the end of a segment.
+<p>
+Handling 4 bytes simultaneously can be quite difficult. This code uses a formula which
+generates a nonzero value for a byte if, and only if, the byte is zero. This makes it possible
+to test all four bytes in one operation. This algorithm involves the subtraction of 1 from all
+bytes (in the <kbd>LEA ECX</kbd> instruction). I have not masked out the highest bit of each byte
+before subtracting, as I did in example <a href="#2-7">2.7</a>, so the subtraction may generate a borrow to the
+next byte, but only if it is zero, and this is exactly the situation where we don't care what the
+next byte is, because we are searching forwards for the first zero. If we were searching
+backwards then we would have to re-read the dword after detecting a zero, and then test all
+four bytes to find the last zero, or use <kbd>BSWAP</kbd> to reverse the order of the bytes. If you want
+to search for a byte value other than zero, then you may <kbd>XOR</kbd> all four bytes with the value
+you are searching for, and then use the method above to search for zero.
+<p>
+<h4>Loops with MMX instructions (PII and PIII)</h4><p>
+Using MMX instructions we can compare 8 bytes in one operation:
+<h4><a name="2-9">Example 2.9:</a></h4><p>
+<pre>_strlen PROC NEAR
+ PUSH EBX
+ MOV EAX,[ESP+8]
+ LEA EDX,[EAX+7]
+ PXOR MM0,MM0
+L1: MOVQ MM1,[EAX] ; len=3 p2rEAXwMM1
+ ADD EAX,8 ; len=3 p01rEAX
+ PCMPEQB MM1,MM0 ; len=3 p01rMM0rMM1
+ MOVD EBX,MM1 ; len=3 p01rMM1wEBX
+ PSRLQ MM1,32 ; len=4 p1rMM1
+ MOVD ECX,MM1 ; len=3 p01rMM1wECX
+ OR ECX,EBX ; len=2 p01rECXrEBXwF
+ JZ L1 ; len=2 p1rF
+ MOVD ECX,MM1
+ TEST EBX,EBX
+ CMOVZ EBX,ECX
+ LEA ECX,[EAX+4]
+ CMOVZ EAX,ECX
+ MOV ECX,EBX
+ SHR ECX,16
+ TEST BX,BX
+ CMOVZ EBX,ECX
+ LEA ECX,[EAX+2]
+ CMOVZ EAX,ECX
+ SHR BL,1
+ SBB EAX,EDX
+ EMMS
+ POP EBX
+ RET
+_strlen ENDP</pre><p>
+This loop has 7 uops for port 0 and 1 which gives an average execution time of 3.5 clocks
+per iteration. The measured time is 3.8 clocks which shows that the ROB handles the
+situation reasonably well despite a dependency chain that is 6 uops long. Testing 8 bytes in
+less than 4 clocks is incredibly much faster than <kbd>REPNE SCASB</kbd>.
+<p>
+<h4>Loops with floating point instructions (PPro, PII and PIII)</h4><p>
+The methods for optimizing floating point loops are basically the same as for integer loops,
+but you should be more aware of dependency chains because of the long latencies of
+instruction execution.
+<p>
+Consider the C language code:
+<pre> int i, n; double * X; double * Y; double DA;
+ for (i=0; i&lt;n; i++) Y[i] = Y[i] - DA * X[i];</pre><p>
+This piece of code (called DAXPY) has been studied extensively because it is the key to
+solving linear equations.
+<h4>Example 2.10:</h4><p>
+<pre>DSIZE = 8 ; data size (4 or 8)
+ MOV ECX, [N] ; number of elements
+ MOV ESI, [X] ; pointer to X
+ MOV EDI, [Y] ; pointer to Y
+ JECXZ L2 ; test for N = 0
+ FLD DSIZE PTR [DA] ; load DA outside loop
+ALIGN 16
+ DB 2 DUP (90H) ; 2 NOP's for alignment
+L1: FLD DSIZE PTR [ESI] ; len=3 p2rESIwST0
+ ADD ESI,DSIZE ; len=3 p01rESI
+ FMUL ST,ST(1) ; len=2 p0rST0rST1
+ FSUBR DSIZE PTR [EDI] ; len=3 p2rEDI, p0rST0
+ FSTP DSIZE PTR [EDI] ; len=3 p4rST0, p3rEDI
+ ADD EDI,DSIZE ; len=3 p01rEDI
+ DEC ECX ; len=1 p01rECXwF
+ JNZ L1 ; len=2 p1rF
+ FSTP ST ; discard DA
+L2:</pre><p>
+The dependency chain is 10 clock cycles long, but the loop takes only 4 clocks per iteration
+because it can begin a new operation before the previous one is finished. The purpose of
+the alignment is to prevent a 16-byte boundary in the last ifetch block.
+<p>
+<h4>Example 2.11:</h4><p>
+<pre>DSIZE = 8 ; data size (4 or 8)
+ MOV ECX, [N] ; number of elements
+ MOV ESI, [X] ; pointer to X
+ MOV EDI, [Y] ; pointer to Y
+ LEA ESI, [ESI+DSIZE*ECX] ; point to end of array
+ LEA EDI, [EDI+DSIZE*ECX] ; point to end of array
+ NEG ECX ; -N
+ JZ SHORT L2 ; test for N = 0
+ FLD DSIZE PTR [DA] ; load DA outside loop
+ALIGN 16
+L1: FLD DSIZE PTR [ESI+DSIZE*ECX] ; len=3 p2rESIrECXwST0
+ FMUL ST,ST(1) ; len=2 p0rST0rST1
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX] ; len=3 p2rEDIrECX, p0rST0
+ FSTP DSIZE PTR [EDI+DSIZE*ECX] ; len=3 p4rST0, p3rEDIrECX
+ INC ECX ; len=1 p01rECXwF
+ JNZ L1 ; len=2 p1rF
+ FSTP ST ; discard DA
+L2:</pre><p>
+Here we have used the same trick as in example <a href="#2-3">2.3</a>. Ideally, this loop should take 3
+clocks, but measurements say approximately 3.5 clocks due to the long dependency chain.
+Unrolling the loop doesn't save much.
+<p>
+<h4>Loops with XMM instructions (PIII)</h4><p>
+The XMM instructions on the PIII allow you to operate on four single precision
+floating point numbers in parallel. The operands must be aligned by 16.
+<p>
+The DAXPY algorithm is not very suited for XMM instructions because the precision
+is poor, it may not be possible to align the operands by 16, and you need some
+extra code if the number of operations is not a multiple of four. I am showing
+the code here anyway, just to give an example of a loop with XMM instructions:
+<h4>Example 2.12:</h4><p>
+<pre> MOV ECX, [N] ; number of elements
+ MOV ESI, [X] ; pointer to X
+ MOV EDI, [Y] ; pointer to Y
+ SHL ECX, 2
+ ADD ESI, ECX ; point to end of X
+ ADD EDI, ECX ; point to end of Y
+ NEG ECX ; -4*N
+ MOV EAX, [DA] ; load DA outside loop
+ XOR EAX, 80000000H ; change sign of DA
+ PUSH EAX
+ MOVSS XMM1, [ESP] ; -DA
+ ADD ESP, 4
+ SHUFPS XMM1, XMM1, 0 ; copy -DA to all four positions
+ CMP ECX, -16
+ JG L2
+L1: MOVAPS XMM0, [ESI+ECX] ; len=4 2*p2rESIrECXwXMM0
+ ADD ECX, 16 ; len=3 p01rwECXwF
+ MULPS XMM0, XMM1 ; len=3 2*p0rXMM0rXMM1
+ CMP ECX, -16 ; len=3 p01rECXwF
+ ADDPS XMM0, [EDI+ECX-16] ; len=5 2*p2rEDIrECX, 2*p1rXMM0
+ MOVAPS [EDI+ECX-16], XMM0 ; len=5 2*p4rXMM0, 2*p3rEDIrECX
+ JNG L1 ; len=2 p1rF
+L2: JECXZ L4 ; check if finished
+ MOVAPS XMM0, [ESI+ECX] ; 1-3 operations missing, do 4 more
+ MULPS XMM0, XMM1
+ ADDPS XMM0, [EDI+ECX]
+ CMP ECX, -8
+ JG L3
+ MOVLPS [EDI+ECX], XMM0 ; store two more results
+ ADD ECX, 8
+ MOVHLPS XMM0, XMM0
+L3: JECXZ L4
+ MOVSS [EDI+ECX], XMM0 ; store one more result
+L4:</pre><p>
+The <kbd>L1</kbd> loop takes 5-6 clocks for 4 operations.
+The <kbd>ECX</kbd> instructions have been placed before and after the
+<kbd>MULPS XMM0, XMM1</kbd> instruction in order to avoid a register read port stall
+generated by the reading of the two parts of the <kbd>XMM1</kbd> register
+together with <kbd>ESI</kbd> or <kbd>EDI</kbd> in the RAT. The extra code after
+<kbd>L2</kbd> takes care of the situation where N is not divisible by 4.
+Note that this code may read past the end of A and B. This may delay the last
+operation if the extra memory positions read do not contain normal floating
+point numbers. If possible, put in some dummy extra data to make the number
+of operations divisible by 4 and leave out the extra code after <kbd>L2</kbd>.
+<p>
+<h2><a name="26">26</a>. Problematic Instructions</h2>
+<h3><a name="26_1">26.1 XCHG (all processors)</a></h3><p>
+The <kbd>XCHG register,[memory]</kbd> instruction is dangerous. By default this instruction has
+an implicit <kbd>LOCK</kbd> prefix which prevents it from using the cache. This instruction is therefore
+very time consuming, and should always be avoided.
+<p>
+<h3><a name="26_2">26.2 Rotates through carry (all processors)</a></h3><p>
+<kbd>RCR</kbd> and <kbd>RCL</kbd> with a count different from one are slow and should be avoided.
+<p>
+<h3><a name="26_3">26.3 String instructions (all processors)</a></h3><p>
+String instructions without a repeat prefix are too slow and should be replaced by simpler
+instructions. The same applies to <kbd>LOOP</kbd> on all processors and to
+<kbd>JECXZ</kbd> on PPlain and PMMX.
+<p>
+<kbd>REP MOVSD</kbd> and <kbd>REP STOSD</kbd> are quite fast if the repeat
+count is not too small. Always use the DWORD version if possible, and make
+sure that both source and destination are aligned by 8.
+<p>
+Some other methods of moving data are faster under certain conditions. See
+chapter <a href="#27_8">27.8</a> for details.
+<p>
+Note that while the <kbd>REP MOVS</kbd> instruction writes a word to the destination, it reads the next
+word from the source in the same clock cycle. You can have a cache bank conflict if bit 2-4
+are the same in these two addresses. In other words, you will get a penalty of one clock
+extra per iteration if <kbd>ESI+(wordsize)-EDI</kbd> is divisible by 32. The easiest way to avoid
+cache bank conflicts is to use the DWORD version and align both source and destination by
+8. Never use <kbd>MOVSB</kbd> or <kbd>MOVSW</kbd> in optimized code, not even in 16 bit mode.
+<p>
+<kbd>REP MOVS</kbd> and <kbd>REP STOS</kbd> can perform very fast by moving an entire cache line at a time
+on PPro, PII and PIII. This happens only when the following conditions are met:
+<ul>
+<li>both source and destination must be aligned by 8
+<li>direction must be forward (direction flag cleared)
+<li>the count (<kbd>ECX</kbd>) must be greater than or equal to 64
+<li>the difference between <kbd>EDI</kbd> and <kbd>ESI</kbd> must be numerically greater than or equal to 32
+<li>the memory type for both source and destination must be either writeback or
+write-combining (you can normally assume this).
+</ul><p>
+Under these conditions the number of uops issued is approximately 215+2*<kbd>ECX</kbd> for
+<kbd>REP MOVSD</kbd> and 185+1.5*<kbd>ECX</kbd> for <kbd>REP STOSD,</kbd>
+giving a speed of approximately 5 bytes per
+clock cycle for both instructions, which is almost 3 times as fast as when the above
+conditions are not met.
+<p>
+The byte and word versions also benefit from this fast mode, but they are less effective than
+the dword versions.
+<p>
+<kbd>REP STOSD</kbd> is optimal under the same conditions as <kbd>REP MOVSD</kbd>.
+<p>
+<kbd>REP LOADS, REP SCAS,</kbd> and <kbd>REP CMPS</kbd> are not optimal, and
+may be replaced by loops. See example <a href="#1-10">1.10</a>, <a href="#2-8">2.8</a>
+and <a href="#2-9">2.9</a> for alternatives to <kbd>REPNE SCASB. REP CMPS</kbd>
+may suffer cache bank conflicts if bit 2-4 are the same in <kbd>ESI</kbd> and
+<kbd>EDI</kbd>.
+<p>
+<h3><a name="26_4">26.4 Bit test (all processors)</a></h3><p>
+<kbd>BT, BTC, BTR</kbd>, and <kbd>BTS</kbd> instructions should preferably be replaced by instructions like
+<kbd>TEST, AND, OR, XOR</kbd>, or shifts on PPlain and PMMX. On PPro, PII and PIII, bit tests with a
+memory operand should be avoided.
+<p>
+<h3><a name="26_5">26.5 Integer multiplication (all processors)</a></h3><p>
+An integer multiplication takes approximately 9 clock cycles on PPlain and PMMX and 4 on
+PPro, PII and PIII. It is therefore often advantageous to replace a multiplication by a constant
+with a combination of other instructions such as <kbd>SHL, ADD, SUB</kbd>,
+and <kbd>LEA</kbd>. Example:<br>
+<kbd>IMUL EAX,10</kbd><br>
+can be replaced with<br>
+<kbd>MOV EBX,EAX / ADD EAX,EAX / SHL EBX,3 / ADD EAX,EBX</kbd><br>
+or<br>
+<kbd>LEA EAX,[EAX+4*EAX] / ADD EAX,EAX</kbd>
+<p>
+Floating point multiplication is faster than integer multiplication on PPlain and PMMX, but
+the time spent on converting integers to float and converting the product back again is
+usually more than the time saved by using floating point multiplication, except when the
+number of conversions is low compared with the number of multiplications. MMX
+multiplication is fast, but is only available with 16-bit operands.
+<p>
+<h3><a name="26_6">26.6 WAIT instruction (all processors)</a></h3><p>
+You can often increase speed by omitting the <kbd>WAIT</kbd> instruction.
+The <kbd>WAIT</kbd> instruction has three functions:
+<p>
+<u>a.</u> The old 8087 processor requires a <kbd>WAIT</kbd> before every
+floating point instruction to make sure the coprocessor is ready to receive it.
+<p>
+<u>b.</u> <kbd>WAIT</kbd> is used for coordinating memory access between the floating point unit and the
+integer unit. Examples:
+<pre><u>b.1.</u> FISTP [mem32]
+ WAIT ; wait for FPU to write before..
+ MOV EAX,[mem32] ; reading the result with the integer unit
+
+<u>b.2.</u> FILD [mem32]
+ WAIT ; wait for FPU to read value..
+ MOV [mem32],EAX ; before overwriting it with integer unit
+
+<u>b.3.</u> FLD QWORD PTR [ESP]
+ WAIT ; prevent an accidental interrupt from..
+ ADD ESP,8 ; overwriting value on stack</pre>
+<p>
+<u>c.</u> <kbd>WAIT</kbd> is sometimes used to check for exceptions. It will generate an interrupt if an
+unmasked exception bit in the floating point status word has been set by a preceding
+floating point instruction.
+<p>
+<u>Regarding a:</u><br>
+The function in point a is never needed on any other processors than the old 8087. Unless
+you want your code to be compatible with the 8087 you should tell your assembler not to
+put in these <kbd>WAIT</kbd>'s by specifying a higher processor. A 8087 floating point emulator also
+inserts <kbd>WAIT</kbd> instructions. You should therefore tell your assembler not to generate
+emulation code unless you need it.
+<p>
+<u>Regarding b:</u><br>
+<kbd>WAIT</kbd> instructions to coordinate memory access are definitely needed on the 8087 and
+80287 but not on the Pentiums. It is not quite clear whether it is needed on the 80387 and
+80486. I have made several tests on these Intel processors and not been able to provoke
+any error by omitting the <kbd>WAIT</kbd> on any 32 bit Intel processor, although Intel manuals say that
+the <kbd>WAIT</kbd> is needed for this purpose except after <kbd>FNSTSW</kbd>
+ and <kbd>FNSTCW</kbd>. Omitting <kbd>WAIT</kbd>
+instructions for coordinating memory access is not 100 % safe, even when writing 32 bit
+code, because the code may be able to run on the very rare combination of a 80386 main
+processor with a 287 coprocessor, which requires the <kbd>WAIT</kbd>. Also, I have no information on
+non-Intel processors, and I have not tested all possible hardware and software
+combinations, so there may be other situations where the <kbd>WAIT</kbd> is needed.
+<p>
+If you want to be certain that your code will work on any 32 bit processor (including
+non-Intel processors) then I would recommend that you include the <kbd>WAIT</kbd> here in order to be
+safe.
+<p>
+<u>Regarding c:</u><br>
+The assembler automatically inserts a <kbd>WAIT</kbd> for this purpose before the following
+instructions: <kbd>FCLEX, FINIT, FSAVE, FSTCW, FSTENV, FSTSW</kbd>. You can omit the <kbd>WAIT</kbd>
+by writing FNCLEX, etc. My tests show that the WAIT is unneccessary in most cases
+because these instructions without <kbd>WAIT</kbd> will still generate an interrupt on exceptions except
+for <kbd>FNCLEX</kbd> and <kbd>FNINIT</kbd> on the 80387. (There is some inconsistency about whether the
+<kbd>IRET</kbd> from the interrupt points to the <kbd>FN..</kbd> instruction or to the next instruction).
+<p>
+Almost all other floating point instructions will also generate an interrupt if a previous floating
+point instruction has set an unmasked exception bit, so the exception is likely to be detected
+sooner or later anyway. You may insert a <kbd>WAIT</kbd> after the last floating point instruction in your
+program to be sure to catch all exceptions.
+<p>
+You may still need the <kbd>WAIT</kbd> if you want to know exactly where an exception occurred in
+order to be able to recover from the situation. Consider, for example, the code under b.3
+above: If you want to be able to recover from an exception generated by the <kbd>FLD</kbd> here, then
+you need the <kbd>WAIT</kbd> because an interrupt after <kbd>ADD ESP,8</kbd> would overwrite the value to load.
+<kbd>FNOP</kbd> may be faster than <kbd>WAIT</kbd> and serve the same purpose.
+<p>
+<h3><a name="26_7">26.7 FCOM + FSTSW AX (all processors)</a></h3><p>
+The <kbd>FNSTSW</kbd> instruction is very slow on all processors. The PPro, PII and PIII
+processors have
+<kbd>FCOMI</kbd> instructions to avoid the slow <kbd>FNSTSW</kbd>.
+Using <kbd>FCOMI</kbd> instead of the common
+sequence <kbd>FCOM / FNSTSW AX / SAHF</kbd> will save you 8 clock cycles. You should
+therefore use <kbd>FCOMI</kbd> to avoid <kbd>FNSTSW</kbd> wherever possible, even in cases where it costs
+some extra code.
+<p>
+On processors without <kbd>FCOMI</kbd> instructions, the usual way of doing floating point
+comparisons is:
+<pre> FLD [a]
+ FCOMP [b]
+ FSTSW AX
+ SAHF
+ JB ASmallerThanB</pre><p>
+You may improve this code by using <kbd>FNSTSW AX</kbd> rather than
+<kbd>FSTSW AX</kbd> and test <kbd>AH</kbd>
+directly rather than using the non-pairable <kbd>SAHF</kbd>
+(TASM version 3.0 has a bug with the <kbd>FNSTSW AX</kbd> instruction):
+<pre> FLD [a]
+ FCOMP [b]
+ FNSTSW AX
+ SHR AH,1
+ JC ASmallerThanB</pre>
+<p>
+Testing for zero or equality:
+<pre> FTST
+ FNSTSW AX
+ AND AH,40H
+ JNZ IsZero ; (the zero flag is inverted!)</pre>
+<p>
+Test if greater:
+<pre> FLD [a]
+ FCOMP [b]
+ FNSTSW AX
+ AND AH,41H
+ JZ AGreaterThanB</pre>
+<p>
+Do not use <kbd>TEST AH,41H</kbd> as it is not pairable on PPlain and PMMX.
+<p>
+On the PPlain and PMMX, the <kbd>FNSTSW</kbd> instruction takes 2 clocks, but it is delayed for an
+additional 4 clocks after any floating point instruction because it is waiting for the status
+word to retire from the pipeline. This delay comes even after <kbd>FNOP</kbd>
+which cannot change the status word, but not after integer instructions.
+You can fill the latency between <kbd>FCOM</kbd> and
+<kbd>FNSTSW</kbd> with integer instructions taking up to four clock cycles.
+A paired <kbd>FXCH</kbd> immediately
+after <kbd>FCOM</kbd> doesn't delay the <kbd>FNSTSW</kbd>, not even if the pairing is imperfect:
+<pre> FCOM ; clock 1
+ FXCH ; clock 1-2 (imperfect pairing)
+ INC DWORD PTR [EBX] ; clock 3-5
+ FNSTSW AX ; clock 6-7</pre>
+<p>
+You may want to use <kbd>FCOM</kbd> rather than <kbd>FTST</kbd>
+here because <kbd>FTST</kbd> is not pairable.
+Remember to include the <kbd>N</kbd> in <kbd>FNSTSW</kbd>. <kbd>FSTSW</kbd>
+(without <kbd>N</kbd>) has a <kbd>WAIT</kbd> prefix which delays
+it further.
+<p>
+It is sometimes faster to use integer instructions for comparing floating point values, as
+described in chapter <a href="#27_6">27.6</a>.
+<p>
+<h3><a name="26_8">26.8 FPREM (all processors)</a></h3><p>
+The <kbd>FPREM</kbd> and <kbd>FPREM1</kbd> instructions are slow on all
+processors. You may replace it by the following algorithm: Multiply by
+the reciprocal divisor, get the fractional part by subtracting
+the truncated value, then multiply by the divisor.
+(see chapter <a href="#27_5">27.5</a> on how to truncate)
+<p>
+Some documents say that these instructions may give incomplete reductions and
+that it is therefore necessary to repeat the <kbd>FPREM</kbd> or
+<kbd>FPREM1</kbd> instruction until the reduction is complete.
+I have tested this on several processors beginning with the old 8087 and I have
+found no situation where a repetition of the <kbd>FPREM</kbd> or <kbd>FPREM1</kbd>
+was needed.
+<p>
+<h3><a name="26_9">26.9 FRNDINT (all processors)</a></h3><p>
+This instruction is slow on all processors. Replace it by:
+<pre>
+ FISTP QWORD PTR [TEMP]
+ FILD QWORD PTR [TEMP]</pre><p>
+This code is faster despite a possible penalty for attempting to read from
+<kbd>[TEMP]</kbd> before the write is finished. It is recommended to put
+other instructions in between in order to avoid
+this penalty. See chapter <a href="#27_5">27.5</a> on how to truncate.
+<p>
+<h3><a name="26_10">26.10 FSCALE and exponential function (all processors)</a></h3><p>
+<kbd>FSCALE</kbd> is slow on all processors. Computing integer powers
+of 2 can be done much faster by inserting the desired power in the exponent
+field of the floating point number.
+To calculate 2<sup>N</sup>, where N is a signed integer, select from the examples below the one that
+fits your range of N:
+<p>
+For |N| &lt; 2<sup>7</sup>-1 you can use single precision:
+<pre> MOV EAX, [N]
+ SHL EAX, 23
+ ADD EAX, 3F800000H
+ MOV DWORD PTR [TEMP], EAX
+ FLD DWORD PTR [TEMP]</pre>
+<p>
+For |N| &lt; 2<sup>10</sup>-1 you can use double precision:
+<pre> MOV EAX, [N]
+ SHL EAX, 20
+ ADD EAX, 3FF00000H
+ MOV DWORD PTR [TEMP], 0
+ MOV DWORD PTR [TEMP+4], EAX
+ FLD QWORD PTR [TEMP]</pre>
+<p>
+For |N| &lt; 2<sup>14</sup>-1 use long double precision:
+<pre> MOV EAX, [N]
+ ADD EAX, 00003FFFH
+ MOV DWORD PTR [TEMP], 0
+ MOV DWORD PTR [TEMP+4], 80000000H
+ MOV DWORD PTR [TEMP+8], EAX
+ FLD TBYTE PTR [TEMP]</pre>
+<p>
+<kbd>FSCALE</kbd> is often used in the calculation of exponential functions. The following code shows
+an exponential function without the slow <kbd>FRNDINT</kbd> and <kbd>FSCALE</kbd> instructions:
+<p>
+<pre>; extern "C" long double _cdecl exp (double x);
+_exp PROC NEAR
+PUBLIC _exp
+ FLDL2E
+ FLD QWORD PTR [ESP+4] ; x
+ FMUL ; z = x*log2(e)
+ FIST DWORD PTR [ESP+4] ; round(z)
+ SUB ESP, 12
+ MOV DWORD PTR [ESP], 0
+ MOV DWORD PTR [ESP+4], 80000000H
+ FISUB DWORD PTR [ESP+16] ; z - round(z)
+ MOV EAX, [ESP+16]
+ ADD EAX,3FFFH
+ MOV [ESP+8],EAX
+ JLE SHORT UNDERFLOW
+ CMP EAX,8000H
+ JGE SHORT OVERFLOW
+ F2XM1
+ FLD1
+ FADD ; 2^(z-round(z))
+ FLD TBYTE PTR [ESP] ; 2^(round(z))
+ ADD ESP,12
+ FMUL ; 2^z = e^x
+ RET
+
+UNDERFLOW:
+ FSTP ST
+ FLDZ ; return 0
+ ADD ESP,12
+ RET
+
+OVERFLOW:
+ PUSH 07F800000H ; +infinity
+ FSTP ST
+ FLD DWORD PTR [ESP] ; return infinity
+ ADD ESP,16
+ RET
+
+_exp ENDP</pre>
+<p>
+<h3><a name="26_11">26.11 FPTAN (all processors)</a></h3><p>
+According to the manuals, <kbd>FPTAN</kbd> returns two values X and Y and
+leaves it to the programmer to divide Y with X to get the result, but in
+fact it always returns 1 in X so you can save the division. My tests show that
+on all 32 bit Intel processors with floating point unit or coprocessor,
+<kbd>FPTAN</kbd> always returns 1 in X regardless of the argument. If you want to
+be absolutely sure that your code will run correctly on all processors, then
+you may test if X is 1, which is faster than dividing with X. The Y value may
+be very high, but never infinity, so you don't have to test if Y contains a
+valid number if you know that the argument is valid.
+<p>
+<h3><a name="26_12">26.12 FSQRT (PIII)</a></h3><p>
+A fast way of calculating an approximate squareroot on the PIII is to multiply
+the reciprocal squareroot of x by x:<br>
+SQRT(x) = x * RSQRT(x)<br>
+The instruction <kbd>RSQRTSS</kbd> or <kbd>RSQRTPS</kbd> gives the reciprocal
+squareroot with a precision of 12 bits. You can improve the precision to 23 bits
+by using the Newton-Raphson formula described in Intel's application note AP-803:<br>
+x<sub>0</sub> = <kbd>RSQRTSS</kbd>(a)<br>
+x<sub>1</sub> = 0.5 * x<sub>0</sub> * (3 - (a * x<sub>0</sub>)) * x<sub>0</sub>)<br>
+where x<sub>0</sub> is the first approximation to the reciprocal squareroot of
+a, and x<sub>1</sub> is a better approximation. The order of evaluation is
+important. You must use this formula before multiplying with a to get the squareroot.
+<p>
+<h3><a name="26_13">26.13 MOV [MEM], ACCUM (PPlain and PMMX)</a></h3><p>
+The instructions <kbd>MOV [mem],AL &nbsp; MOV [mem],AX &nbsp; MOV [mem],EAX</kbd>
+ are treated by the pairing circuitry as if they were writing to the accumulator.
+ Thus the following instructions do not pair:
+<pre> MOV [mydata], EAX
+ MOV EBX, EAX</pre>
+<p>
+This problem occurs only with the short form of the <kbd>MOV</kbd>
+ instruction which can not have a
+base or index register, and which can only have the accumulator as source.
+You can avoid the problem by using another register, by reordering your
+instructions, by using a pointer, or by hard-coding the general form of
+the <kbd>MOV</kbd> instruction.
+<p>
+In 32 bit mode you can write the general form of <kbd>MOV [mem],EAX</kbd>:
+<pre> DB 89H, 05H
+ DD OFFSET DS:mem</pre>
+<p>
+In 16 bit mode you can write the general form of <kbd>MOV [mem],AX</kbd>:
+<pre> DB 89H, 06H
+ DW OFFSET DS:mem</pre>
+<p>
+To use <kbd>AL</kbd> instead of <kbd>(E)AX</kbd>, you replace <kbd>89H</kbd>
+ with <kbd>88H</kbd>
+<p>
+This flaw has not been fixed in the PMMX.
+<p>
+<h3><a name="26_14">26.14 TEST instruction (PPlain and PMMX)</a></h3><p>
+The <kbd>TEST</kbd> instruction with an immediate operand is only
+pairable if the destination is <kbd>AL</kbd>, <kbd>AX</kbd>, or <kbd>EAX</kbd>.
+<p>
+<kbd>TEST register,register</kbd>
+ and <kbd>TEST register,memory</kbd> is always pairable.
+<p>
+Examples:
+<pre> TEST ECX,ECX ; pairable
+ TEST [mem],EBX ; pairable
+ TEST EDX,256 ; not pairable
+ TEST DWORD PTR [EBX],8000H ; not pairable</pre><p>
+To make it pairable, use any of the following methods:
+<pre> MOV EAX,[EBX] / TEST EAX,8000H
+ MOV EDX,[EBX] / AND EDX,8000H
+ MOV AL,[EBX+1] / TEST AL,80H
+ MOV AL,[EBX+1] / TEST AL,AL ; (result in sign flag)</pre><p>
+(The reason for this non-pairability is probably that the first byte of the 2-byte instruction is
+the same as for some other non-pairable instructions, and the processor cannot afford to
+check the second byte too when determining pairability.)
+<p>
+<h3><a name="26_15">26.15 Bit scan (PPlain and PMMX)</a></h3><p>
+<kbd>BSF</kbd> and <kbd>BSR</kbd> are the poorest optimized instructions on
+the PPlain and PMMX, taking
+approximately 11 + 2*n clock cycles, where n is the number of zeros skipped.
+<p>
+The following code emulates <kbd>BSR ECX,EAX</kbd>:
+<pre> TEST EAX,EAX
+ JZ SHORT BS1
+ MOV DWORD PTR [TEMP],EAX
+ MOV DWORD PTR [TEMP+4],0
+ FILD QWORD PTR [TEMP]
+ FSTP QWORD PTR [TEMP]
+ WAIT ; WAIT only needed for compatibility with old 80287 processor
+ MOV ECX, DWORD PTR [TEMP+4]
+ SHR ECX,20 ; isolate exponent
+ SUB ECX,3FFH ; adjust
+ TEST EAX,EAX ; clear zero flag
+BS1:</pre>
+<p>
+The following code emulates <kbd>BSF ECX,EAX</kbd>:
+<pre> TEST EAX,EAX
+ JZ SHORT BS2
+ XOR ECX,ECX
+ MOV DWORD PTR [TEMP+4],ECX
+ SUB ECX,EAX
+ AND EAX,ECX
+ MOV DWORD PTR [TEMP],EAX
+ FILD QWORD PTR [TEMP]
+ FSTP QWORD PTR [TEMP]
+ WAIT ; WAIT only needed for compatibility with old 80287 processor
+ MOV ECX, DWORD PTR [TEMP+4]
+ SHR ECX,20
+ SUB ECX,3FFH
+ TEST EAX,EAX ; clear zero flag
+BS2:</pre>
+<p>
+These emulation codes should not be used on the PPro, PII and PIII, where the bit scan
+instructions take only 1 or 2 clocks, and where the emulation codes shown above have two
+partial memory stalls.
+<p>
+<h3><a name="26_16">26.16 FLDCW (PPro, PII and PIII)</a></h3><p>
+The PPro, PII and PIII have a serious stall after the
+<kbd>FLDCW</kbd> instruction if followed by any floating
+point instruction which reads the control word (which almost all floating
+point instructions do).
+<p>
+When C or C++ code is compiled it often generates a lot of
+<kbd>FLDCW</kbd> instructions because conversion of floating point numbers
+to integers is done with truncation while other floating
+point instructions use rounding. After translation to assembly, you can
+improve this code by using rounding instead of truncation where possible,
+or by moving the <kbd>FLDCW</kbd> out of a loop
+where truncation is needed inside the loop.
+<p>
+See chapter <a href="#27_5">27.5</a> on how to convert floating point numbers to integers
+whitout changing the control word.
+<p>
+<h2><a name="27">27</a>. Special topics</h2>
+<h3><a name="27_1">27.1 LEA instruction (all processors)</a></h3><p>
+The <kbd>LEA</kbd> instruction is useful for many purposes because it can do
+a shift, two additions, and a move in just one instruction taking one clock cycle.
+Example:<br>
+<kbd>LEA EAX,[EBX+8*ECX-1000]</kbd><br>
+is much faster than<br>
+<kbd>MOV EAX,ECX / SHL EAX,3 / ADD EAX,EBX / SUB EAX,1000</kbd><br>
+The <kbd>LEA</kbd> instruction can also be used to do an add or shift without
+changing the flags. The source and destination need not have the same word size,
+so <kbd>LEA EAX,[BX]</kbd> is a possible
+replacement for <kbd>MOVZX EAX,BX</kbd>, although suboptimal on most processors.
+<p>
+You must be aware, however, that the <kbd>LEA</kbd> instruction will suffer
+an AGI stall on the PPlain and PMMX if it uses a base or index register
+which has been written to in the preceding clock cycle.
+<p>
+Since the <kbd>LEA</kbd> instruction is pairable in the v-pipe on PPlain and
+PMMX and shift instructions are not, you may use <kbd>LEA</kbd> as
+a substitute for a <kbd>SHL</kbd> by 1, 2, or 3 if you want the
+instruction to execute in the V-pipe.
+<p>
+The 32 bit processors have no documented addressing mode with a scaled index register
+and nothing else, so an instruction like <kbd>LEA EAX,[EAX*2]</kbd>
+is actually coded as <kbd>LEA EAX,[EAX*2+00000000]</kbd>
+with an immediate displacement of 4 bytes. You may reduce the
+instruction size by instead writing <kbd>LEA EAX,[EAX+EAX]</kbd> or even
+better <kbd>ADD EAX,EAX</kbd>.
+The latter code cannot have an AGI delay in PPlain and PMMX. If you happen to have a register
+which is zero (like a loop counter after a loop), then you may use it
+as a base register to reduce the code size:
+<p>
+<pre>LEA EAX,[EBX*4] ; 7 bytes
+LEA EAX,[ECX+EBX*4] ; 3 bytes</pre>
+<p>
+<h3><a name="27_2">27.2 Division (all processors)</a></h3><p>
+Division is quite time consuming. On PPro, PII and PIII an integer division
+takes 19, 23, or 39 clocks for byte, word, and dword divisors respectively.
+On PPlain and PMMX an unsigned integer division takes approximately the same,
+while a signed integer division takes somewhat more. It is therefore
+preferable to use the smallest operand size possible that won't generate an
+overflow, even if it costs an operand size prefix, and use unsigned
+division if possible.
+<p>
+<h4>Integer division by a constant (all processors)</h4><p>
+Integer division by a power of two can be done by shifting right. Dividing an
+unsigned integer by 2<sup>N</sup>:
+<pre> SHR EAX, N</pre><p>
+Dividing a signed integer by 2<sup>N</sup>:
+<pre> CDQ
+ AND EDX, (1 SHL N) -1 ; or SHR EDX, 32-N
+ ADD EAX, EDX
+ SAR EAX, N</pre><p>
+The <kbd>SHR</kbd> alternative is shorter than the <kbd>AND</kbd> if N > 7,
+but can only go to execution port 0 (or u-pipe), whereas <kbd>AND</kbd> can
+go to either port 0 or 1 (u or v-pipe).
+<p>
+Dividing by a constant can be done by multiplying with the reciprocal.
+To calculate the unsigned integer division q = x / d, you first calculate
+the reciprocal of the divisor, f = 2<sup>r</sup> / d, where r defines the position of the binary
+decimal point (radix point). Then multiply x with f and shift
+right r positions. The maximum value of r is 32+b, where b is the number of binary digits in d
+minus 1. (b is the highest integer for which 2<sup>b</sup> &lt;= d). Use r = 32+b to cover the maximum
+range for the value of the dividend x.
+<p>
+This method needs some refinement in order to compensate for rounding errors.
+The following algorithm will give you the correct result for unsigned integer
+division with truncation, i.e. the same result as the <kbd>DIV</kbd>
+instruction gives (Thanks to Terje Mathisen who invented this method):
+ <pre>
+ b = (the number of significant bits in d) - 1
+ r = 32 + b
+ f = 2<sup>r</sup> / d
+ If f is an integer then d is a power of 2: goto case A.
+ If f is not an integer, then check if the fractional part of f is &lt; 0.5
+ If the fractional part of f &lt; 0.5: goto case B.
+ If the fractional part of f &gt; 0.5: goto case C.
+
+ case A: (d = 2<sup>b</sup>)
+ result = x SHR b
+
+ case B: (fractional part of f &lt; 0.5)
+ round f down to nearest integer
+ result = ((x+1) * f) SHR r
+
+ case C: (fractional part of f &gt; 0.5)
+ round f up to nearest integer
+ result = (x * f) SHR r
+ </pre>
+<p>
+Example:<br>
+Assume that you want to divide by 5.<br>
+5 = 00000101b.<br>
+b = (number of significant binary digits) - 1 = 2<br>
+r = 32+2 = 34<br>
+f = 2<sup>34</sup> / 5 = 3435973836.8 = 0CCCCCCCC.CCC...(hexadecimal)<br>
+The fractional part is greater than a half: use case C.<br>
+Round f up to 0CCCCCCCDh.
+<p>
+The following code divides <kbd>EAX</kbd> by 5 and returns the result in <kbd>EDX</kbd>:
+<pre> MOV EDX,0CCCCCCCDh
+ MUL EDX
+ SHR EDX,2</pre>
+<p>
+After the multiplication, <kbd>EDX</kbd> contains the product shifted right
+32 places. Since r = 34 you have to shift 2 more places to get the result.
+To divide by 10 you just change the last line to <kbd>SHR EDX,3</kbd>.
+<p>
+In case B you would have:
+<pre> INC EAX
+ MOV EDX,f
+ MUL EDX
+ SHR EDX,b</pre>
+<p>
+This code works for all values of x except 0FFFFFFFFH which gives zero because of
+overflow in the <kbd>INC</kbd> instruction. If x = 0FFFFFFFFH is possible, then change the code to:
+<pre> MOV EDX,f
+ ADD EAX,1
+ JC DOVERFL
+ MUL EDX
+DOVERFL:SHR EDX,b</pre>
+<p>
+If the value of x is limited, then you may use a lower value of r, i.e.
+fewer digits. There can be several reasons to use a lower value of r:
+<ul>
+<li>you may set r = 32 to avoid the <kbd>SHR EDX,b</kbd> in the end.
+<li>you may set r = 16+b and use a multiplication instruction that
+gives a 32 bit result rather
+than 64 bits. This will free the <kbd>EDX</kbd> register:
+<pre> IMUL EAX,0CCCDh / SHR EAX,18</pre>
+<li>you may choose a value of r that gives case C rather than case
+B in order to avoid the <kbd>INC EAX</kbd> instruction
+</ul>
+<p>
+The maximum value for x in these cases is at least 2<sup>r-b</sup>,
+sometimes higher. You have to do a systematic test if you want to know the
+exact maximum value of x for which your code works correctly.
+<p>
+You may want to replace the slow multiplication instruction with faster instructions as
+explained in chapter <a href="#26"_5>26.5</a>.
+<p>
+The following example divides <kbd>EAX</kbd> by 10 and returns the result
+in <kbd>EAX</kbd>. I have chosen r=17 rather than 19 because it happens
+to give a code, which is easier to optimize, and covers
+the same range for x. f = 2<sup>17</sup> / 10 = 3333h, case B: q = (x+1)*3333h:
+<pre> LEA EBX,[EAX+2*EAX+3]
+ LEA ECX,[EAX+2*EAX+3]
+ SHL EBX,4
+ MOV EAX,ECX
+ SHL ECX,8
+ ADD EAX,EBX
+ SHL EBX,8
+ ADD EAX,ECX
+ ADD EAX,EBX
+ SHR EAX,17</pre>
+<p>
+A systematic test shows that this code works correctly for all x &lt; 10004H.
+<p>
+<h4>Repeated integer division by the same value (all processors)</h4><p>
+If the divisor is not known at assembly time, but you are dividing
+repeatedly with the same divisor, then you may use the same method as above.
+The code has to distinguish between
+case A, B and C and calculate f before doing the divisions.
+<p>
+The code that follows shows how to do multiple divisions with the same divisor (unsigned
+division with truncation). First call <kbd>SET_DIVISOR</kbd> to specify the
+divisor and calculate the
+reciprocal, then call <kbd>DIVIDE_FIXED</kbd> for each value to divide by the same divisor.
+<pre>
+.data
+
+RECIPROCAL_DIVISOR DD ? ; rounded reciprocal divisor
+CORRECTION DD ? ; case A: -1, case B: 1, case C: 0
+BSHIFT DD ? ; number of bits in divisor - 1
+
+.code
+
+SET_DIVISOR PROC NEAR ; divisor in EAX
+ PUSH EBX
+ MOV EBX,EAX
+ BSR ECX,EAX ; b = number of bits in divisor - 1
+ MOV EDX,1
+ JZ ERROR ; error: divisor is zero
+ SHL EDX,CL ; 2^b
+ MOV [BSHIFT],ECX ; save b
+ CMP EAX,EDX
+ MOV EAX,0
+ JE SHORT CASE_A ; divisor is a power of 2
+ DIV EBX ; 2^(32+b) / d
+ SHR EBX,1 ; divisor / 2
+ XOR ECX,ECX
+ CMP EDX,EBX ; compare remainder with divisor/2
+ SETBE CL ; 1 if case B
+ MOV [CORRECTION],ECX ; correction for rounding errors
+ XOR ECX,1
+ ADD EAX,ECX ; add 1 if case C
+ MOV [RECIPROCAL_DIVISOR],EAX ; rounded reciprocal divisor
+ POP EBX
+ RET
+CASE_A: MOV [CORRECTION],-1 ; remember that we have case A
+ POP EBX
+ RET
+SET_DIVISOR ENDP
+
+DIVIDE_FIXED PROC NEAR ; dividend in EAX, result in EAX
+ MOV EDX,[CORRECTION]
+ MOV ECX,[BSHIFT]
+ TEST EDX,EDX
+ JS SHORT DSHIFT ; divisor is power of 2
+ ADD EAX,EDX ; correct for rounding error
+ JC SHORT DOVERFL ; correct for overflow
+ MUL [RECIPROCAL_DIVISOR] ; multiply with reciprocal divisor
+ MOV EAX,EDX
+DSHIFT: SHR EAX,CL ; adjust for number of bits
+ RET
+DOVERFL:MOV EAX,[RECIPROCAL_DIVISOR] ; dividend = 0FFFFFFFFH
+ SHR EAX,CL ; do division by shifting
+ RET
+DIVIDE_FIXED ENDP</pre><p>
+This code gives the same result as the <kbd>DIV</kbd> instruction for
+0 &lt;= x &lt; 2<sup>32</sup>, 0 &lt; d &lt; 2<sup>32</sup>.<br>
+Note: The line <kbd>JC DOVERFL</kbd> and its target are not needed if
+you are certain that x &lt; 0FFFFFFFFH.
+<p>
+If powers of 2 occur so seldom that it is not worth optimizing for them,
+then you may leave out the jump to <kbd>DSHIFT</kbd> and instead do a
+multiplication with <kbd>CORRECTION</kbd> = 0 for case A.
+<p>
+If the divisor is changed so often that the procedure <kbd>SET_DIVISOR</kbd> needs optimizing, then you may
+replace the <kbd>BSR</kbd> instruction with the code given in chapter
+<a href="#26_15">26.15</a> for the PPlain and PMMX processors.
+<p>
+<h4>Floating point division (all processors)</h4><p>
+Floating point division takes 38 or 39 clock cycles for the highest precision.
+You can save time by specifying a lower precision in the floating point
+control word (On PPlain and PMMX, only <kbd>FDIV</kbd> and <kbd>FIDIV</kbd> are faster at low
+precision; on PPro, PII and PIII, this also applies
+to <kbd>FSQRT</kbd>. No other instructions can be speeded up this way).
+<p>
+<h4><a name="paralleldiv">Parallel division (PPlain and PMMX)</a></h4><p>
+On PPlain and PMMX, it is possible to do a floating point division and an integer division in
+parallel to save time. On PPro, PII and PIII this is not possible, because integer division and
+floating point division use the same circuitry.<br>
+Example: A = A1 / A2; B = B1 / B2
+<pre> FILD [B1]
+ FILD [B2]
+ MOV EAX, [A1]
+ MOV EBX, [A2]
+ CDQ
+ FDIV
+ DIV EBX
+ FISTP [B]
+ MOV [A], EAX</pre><p>
+(make sure you set the floating point control word to the desired rounding method)
+<p>
+<h4>Using reciprocal instruction for fast division (PIII)</h4><p>
+On PIII you can use the fast reciprocal instruction <kbd>RCPSS</kbd> or
+<kbd>RCPPS</kbd> on the divisor and then multiply with the dividend. However,
+the precision is only 12 bits. You can increase the precision to 23 bits by
+using the Newton-Raphson method described in Intel's application note AP-803:<br>
+x<sub>0</sub> = <kbd>RCPSS</kbd>(d)<br>
+x<sub>1</sub> = x<sub>0</sub> * (2 - d * x<sub>0</sub>)
+= 2*x<sub>0</sub> - d * x<sub>0</sub> * x<sub>0</sub><br>
+where x<sub>0</sub> is the first approximation to the reciprocal of the divisor, d,
+and x<sub>1</sub> is a better approximation. You must use this formula before
+multiplying with the dividend:
+<pre> MOVAPS XMM1, [DIVISORS] ; load divisors
+ RCPPS XMM0, XMM1 ; approximate reciprocal
+ MULPS XMM1, XMM0 ; Newton-Raphson formula
+ MULPS XMM1, XMM0
+ ADDPS XMM0, XMM0
+ SUBPS XMM0, XMM1
+ MULPS XMM0, [DIVIDENDS] ; results in XMM0</pre><p>
+This makes four divisions in 18 clock cycles with a precision of 23 bits.
+Increasing the precision further by repeating the Newton-Raphson formula
+in the floating point registers is possible, but not very advantageous.
+<p>
+If you want to use this method for integer divisions then you have to check for
+rounding errors. The following code makes four divisions with truncation on packed
+word size integers in approximately 42 clock cycles. It gives exact results for
+0 <= dividend < 7FFFFH and 0 < divisor <= 7FFFFH:
+<pre> MOVQ MM1, [DIVISORS] ; load four divisors
+ MOVQ MM2, [DIVIDENDS] ; load four dividends
+ PUNPCKHWD MM4, MM1 ; unpack divisors to DWORDs
+ PSRAD MM4, 16
+ PUNPCKLWD MM3, MM1
+ PSRAD MM3, 16
+ CVTPI2PS XMM1, MM4 ; convert divisors to float, upper two operands
+ MOVLHPS XMM1, XMM1
+ CVTPI2PS XMM1, MM3 ; convert lower two operands
+ PUNPCKHWD MM4, MM2 ; unpack dividends to DWORDs
+ PSRAD MM4, 16
+ PUNPCKLWD MM3, MM2
+ PSRAD MM3, 16
+ CVTPI2PS XMM2, MM4 ; convert dividends to float, upper two operands
+ MOVLHPS XMM2, XMM2
+ CVTPI2PS XMM2, MM3 ; convert lower two operands
+ RCPPS XMM0, XMM1 ; approximate reciprocal of divisors
+ MULPS XMM1, XMM0 ; improve precision with Newton-Raphson method
+ PCMPEQW MM4, MM4 ; make four integer 1's in the meantime
+ PSRLW MM4, 15
+ MULPS XMM1, XMM0
+ ADDPS XMM0, XMM0
+ SUBPS XMM0, XMM1 ; reciprocal divisors with 23 bit precision
+ MULPS XMM0, XMM2 ; multiply with dividends
+ CVTTPS2PI MM0, XMM0 ; truncate lower two results
+ MOVHLPS XMM0, XMM0
+ CVTTPS2PI MM3, XMM0 ; truncate upper two results
+ PACKSSDW MM0, MM3 ; pack the four results into MM0
+ MOVQ MM3, MM1 ; multiply results with divisors...
+ PMULLW MM3, MM0 ; to check for rounding errors
+ PADDSW MM0, MM4 ; add 1 to compensate for later subtraction
+ PADDSW MM3, MM1 ; add divisor. this should be > dividend
+ PCMPGTW MM3, MM2 ; check if too small
+ PADDSW MM0, MM3 ; subtract 1 if not too small
+ MOVQ [QUOTIENTS], MM0 ; save the four results</pre><p>
+This code checks if the result is too small and makes the appropriate
+correction. It is not necessary to check if the result is too big.
+<p>
+<h4>Avoiding divisions (all processors)</h4><p>
+Obviously, you should always try to minimize the number of divisions. Floating point division
+with a constant or repeated division with the same value should of course be done by
+multiplying with the reciprocal. But there are many other situations where you can reduce
+the number of divisions. For example:
+if (A/B &gt; C)... can be rewritten as if (A &gt; B*C)... when B is positive, and the opposite when
+B is negative.
+<p>
+A/B + C/D can be rewritten as (A*D + C*B) / (B*D)
+<p>
+If you are using integer division, then you should be aware that the rounding errors may be
+different when you rewrite the formulas.
+<p>
+<h3><a name="27_3">27.3 Freeing floating point registers (all processors)</a></h3><p>
+You have to free all used floating point registers before exiting a subroutine,
+except for any register used for the result.
+<p>
+The fastest way of freeing one register is <kbd>FSTP ST</kbd>.
+The fastest way of freeing two registers is <kbd>FCOMPP</kbd> on PPlain and PMMX;
+on PPro, PII and PIII you may use either
+<kbd>FCOMPP</kbd> or two times <kbd>FSTP ST</kbd>, whichever fits best into
+the decoding sequence.
+<p>
+It is not recommended to use <kbd>FFREE</kbd>.
+<p>
+<h3><a name="27_4">27.4 Transitions between floating point and MMX instructions (PMMX, PII and PIII)</a></h3><p>
+You must issue an <kbd>EMMS</kbd> instruction after your last MMX instruction if there
+is a possibility that floating point code follows later.
+<p>
+On PMMX there is a high penalty for switching between floating point and MMX
+instructions. The first floating point instruction after an
+<kbd>EMMS</kbd> takes approximately 58 clocks extra, and the first MMX instruction
+after a floating point instruction takes approximately 38 clocks extra.
+<p>
+On PII and PIII there is no such penalty. The delay after <kbd>EMMS</kbd>
+can be hidden by putting in integer
+instructions between <kbd>EMMS</kbd> and the first floating point instruction.
+<p>
+<h3><a name="27_5">27.5 Converting from floating point to integer (All processors)</a></h3><p>
+All conversions from floating point to integer, and vice versa, must go via a memory
+location:
+<pre> FISTP DWORD PTR [TEMP]
+ MOV EAX, [TEMP]</pre><p>
+On PPro, PII and PIII, this code is likely to have a penalty for attempting to
+read from <kbd>[TEMP]</kbd> before the write to <kbd>[TEMP]</kbd> is finished
+because the <kbd>FIST</kbd> instruction is slow (see chapter <a href="#17">17</a>).
+It doesn't help to put in a <kbd>WAIT</kbd> (see chapter <a href="#26_6">26.6</a>).
+It is recommended that you put in other instructions between the write to
+<kbd>[TEMP]</kbd> and the read from <kbd>[TEMP]</kbd> if possible in
+order to avoid this penalty. This applies to all the examples that follow.
+<p>
+The specifications for the C and C++ language requires that conversion
+from floating point
+numbers to integers use truncation rather than rounding. The method used by most C
+libraries is to change the floating point control word to indicate truncation before using an
+<kbd>FISTP</kbd> instruction and changing it back again afterwords. This method is very slow on all
+processors. On PPro, PII and PIII, the floating point control word cannot be renamed, so all
+subsequent floating point instructions must wait for the <kbd>FLDCW</kbd> instruction to retire.
+<p>
+Whenever you have a conversion from floating point to integer in C or C++, you should
+think of whether you can use rounding to nearest integer instead of truncation. If your
+standard library doesn't have a fast round function then make your own using the code
+examples listed below.
+<p>
+If you need truncation inside a loop then you should change the control word only outside
+the loop if the rest of the floating point instructions in the loop can work correctly in
+truncation mode.
+<p>
+You may use various tricks for truncating without changing the control word, as illustrated in
+the examples below. These examples presume that the control word is set to default, i.e.
+rounding to nearest or even.
+<p>
+<h4>Rounding to nearest or even</h4><p>
+<pre>; extern "C" int round (double x);
+_round PROC NEAR
+PUBLIC _round
+ FLD QWORD PTR [ESP+4]
+ FISTP DWORD PTR [ESP+4]
+ MOV EAX, DWORD PTR [ESP+4]
+ RET
+_round ENDP</pre>
+<p>
+<h4>Truncation towards zero</h4><p>
+<pre>; extern "C" int truncate (double x);
+_truncate PROC NEAR
+PUBLIC _truncate
+ FLD QWORD PTR [ESP+4] ; x
+ SUB ESP, 12 ; space for local variables
+ FIST DWORD PTR [ESP] ; rounded value
+ FST DWORD PTR [ESP+4] ; float value
+ FISUB DWORD PTR [ESP] ; subtract rounded value
+ FSTP DWORD PTR [ESP+8] ; difference
+ POP EAX ; rounded value
+ POP ECX ; float value
+ POP EDX ; difference (float)
+ TEST ECX, ECX ; test sign of x
+ JS SHORT NEGATIVE
+ ADD EDX, 7FFFFFFFH ; produce carry if difference &lt; -0
+ SBB EAX, 0 ; subtract 1 if x-round(x) &lt; -0
+ RET
+NEGATIVE:
+ XOR ECX, ECX
+ TEST EDX, EDX
+ SETG CL ; 1 if difference &gt; 0
+ ADD EAX, ECX ; add 1 if x-round(x) &gt; 0
+ RET
+_truncate ENDP</pre>
+<p>
+<h4>Truncation towards minus infinity</h4><p>
+<pre>; extern "C" int ifloor (double x);
+_ifloor PROC NEAR
+PUBLIC _ifloor
+ FLD QWORD PTR [ESP+4] ; x
+ SUB ESP, 8 ; space for local variables
+ FIST DWORD PTR [ESP] ; rounded value
+ FISUB DWORD PTR [ESP] ; subtract rounded value
+ FSTP DWORD PTR [ESP+4] ; difference
+ POP EAX ; rounded value
+ POP EDX ; difference (float)
+ ADD EDX, 7FFFFFFFH ; produce carry if difference &lt; -0
+ SBB EAX, 0 ; subtract 1 if x-round(x) &lt; -0
+ RET
+_ifloor ENDP</pre>
+<p>
+These procedures work for -2<sup>31</sup> &lt; x &lt; 2<sup>31</sup>-1.
+They do not check for overflow or NAN's.
+<p>
+The PIII has instructions for truncation of single precision floating point
+numbers: <kbd>CVTTSS2SI</kbd> and <kbd>CVTTPS2PI</kbd>. These instructions
+are very useful if the single precision is satisfactory, but if you are converting
+a float with higher precision to single precision in order to use these truncation
+instructions then you have the problem that the number may be rounded up in the
+conversion to single precision.
+<p>
+<h4>Alternative to FISTP instruction (PPlain and PMMX)</h4>
+<p>
+Converting a floating point number to integer is normally done like this:
+<pre> FISTP DWORD PTR [TEMP]
+ MOV EAX, [TEMP]</pre>
+<p>
+An alternative method is:
+<pre>.DATA
+ALIGN 8
+TEMP DQ ?
+MAGIC DD 59C00000H ; f.p. representation of 2^51 + 2^52
+
+.CODE
+ FADD [MAGIC]
+ FSTP QWORD PTR [TEMP]
+ MOV EAX, DWORD PTR [TEMP]</pre>
+<p>
+Adding the 'magic number' of 2<sup>51</sup> + 2<sup>52</sup> has the effect
+that any integer between -2<sup>31</sup> and +2<sup>31</sup>
+ will be aligned in the lower 32 bits when storing as a double precision floating
+point number. The result is the same as you get with <kbd>FISTP</kbd> for all rounding methods except
+truncation towards zero. The result is different from <kbd>FISTP</kbd> if the control word specifies
+truncation or in case of overflow. You may need a <kbd>WAIT</kbd> instruction for
+compatibility with the old 80287 processor, see chapter <a href="#26_6">26.6</a>.
+<p>
+This method is not faster than using <kbd>FISTP</kbd>, but it gives better
+scheduling opportunities on
+PPlain and PMMX because there is a 3 clock void between <kbd>FADD</kbd>
+ and <kbd>FSTP</kbd> which may be
+filled with other instrucions. You may multiply or divide the number by a
+power of 2 in the same operation by doing the opposite to the magic number.
+You may also add a constant by
+adding it to the magic number, which then has to be double precision.
+<p>
+<h3><a name="27_6">27.6 Using integer instructions to do floating point operations (all processors)</a></h3><p>
+Integer instructions are generally faster than floating point instructions, so it is often
+advantageous to use integer instructions for doing simple floating point operations. The
+most obvious example is moving data. Example:<br>
+<kbd> FLD QWORD PTR [ESI] / FSTP QWORD PTR [EDI]</kbd><br>
+Change to:<br>
+<kbd> MOV EAX,[ESI] / MOV EBX,[ESI+4] / MOV [EDI],EAX / MOV [EDI+4],EBX</kbd><br>
+<p>
+<h4>Testing if a floating point value is zero:</h4><p>
+The floating point value of zero is usually represented as 32 or 64 bits of zero, but there is a
+pitfall here: The sign bit may be set! Minus zero is regarded as a valid floating point number,
+and the processor may actually generate a zero with the sign bit set if for example
+multiplying a negative number with zero. So if you want to test if a floating point number is
+zero, you should not test the sign bit. Example:<br>
+<kbd> FLD DWORD PTR [EBX] / FTST / FNSTSW AX / AND AH,40H / JNZ IsZero</kbd><br>
+Use integer instructions instead, and shift out the sign bit:<br>
+<kbd> MOV EAX,[EBX] / ADD EAX,EAX / JZ IsZero</kbd><br>
+If the floating point number is double precision (QWORD) then you only have to
+test bit 32-62. If they are zero, then the lower half will also be zero if it is a normal floating point number.
+<p>
+<h4>Testing if negative:</h4><p>
+A floating point number is negative if the sign bit is set and at least one other bit is set.
+Example:<br>
+<kbd> MOV EAX,[NumberToTest] / CMP EAX,80000000H / JA IsNegative</kbd>
+<p>
+<h4>Manipulating the sign bit:</h4><p>
+You can change the sign of a floating point number simply by flipping the
+sign bit. Example:<br>
+<kbd> XOR BYTE PTR [a] + (TYPE a) - 1, 80H</kbd>
+<p>
+Likewise you may get the absolute value of a floating point number by simply ANDing out
+the sign bit.
+<p>
+<h4>Comparing numbers:</h4><p>
+Floating point numbers are stored in a unique format which allows you to use integer
+instructions for comparing floating point numbers, except for the sign bit. If you are certain
+that two floating point numbers both are normal and positive then you may simply compare
+them as integers. Example:<br>
+<kbd> FLD [a] / FCOMP [b] / FNSTSW AX / AND AH,1 / JNZ ASmallerThanB</kbd><br>
+Change to:<br>
+<kbd> MOV EAX,[a] / MOV EBX,[b] / CMP EAX,EBX / JB ASmallerThanB</kbd><br>
+This method only works if the two numbers have the same precision and you are certain
+that none of the numbers have the sign bit set.
+<p>
+If negative numbers are possible, then you have to convert the negative numbers to
+2-complement, and do a signed compare:
+<pre> MOV EAX, [a]
+ MOV EBX, [b]
+ MOV ECX, EAX
+ MOV EDX, EBX
+ SAR ECX, 31 ; copy sign bit
+ AND EAX, 7FFFFFFFH ; remove sign bit
+ SAR EDX, 31
+ AND EBX, 7FFFFFFFH
+ XOR EAX, ECX ; make 2-complement if sign bit was set
+ XOR EBX, EDX
+ SUB EAX, ECX
+ SUB EBX, EDX
+ CMP EAX, EBX
+ JL ASmallerThanB ; signed comparison</pre><p>
+This method works for all normal floating point numbers, including -0.
+<p>
+<h3><a name="27_7">27.7 Using floating point instructions to do integer operations (PPlain and PMMX)</a></h3><p>
+<h4>Integer multiplication (PPlain and PMMX)</h4><p>
+Floating point multiplication is faster than integer multiplication on the PPlain and PMMX,
+but the price for converting integer factors to float and converting the result back to integer
+is high, so floating point multiplication is only advantageous if the number of conversions
+needed is low compared with the number of multiplications. (It may be tempting to use
+denormal floating point operands to save some of the conversions here, but the handling of
+denormals is very slow, so this is not a good idea!)
+<p>
+On the PMMX, MMX multiplication instructions are faster than integer multiplication, and
+can be pipelined to a throughput of one multiplication per clock cycle, so this may be the
+best solution for doing fast multiplication on the PMMX, if you can live with 16 bit precision.
+<p>
+Integer multiplication is faster than floating point on PPro, PII and PIII.
+<p>
+<h4>Integer division (PPlain and PMMX)</h4><p>
+Floating point division is not faster than integer division, but you can do other integer
+operations (including integer division, but not integer multiplication) while the floating point
+unit is working on the division (See example <a href="#paralleldiv">above</a>).
+<p>
+<h4>Converting binary to decimal numbers (all processors)</h4><p>
+Using the <kbd>FBSTP</kbd> instruction is a simple and convenient way of converting a binary number
+to decimal, although not necessarily the fastest method.
+<p>
+<h3><a name="27_8">27.8 Moving blocks of data (all processors)</a></h3><p>
+There are several ways of moving blocks of data. The most common method is
+<kbd>REP MOVSD</kbd>, but under certain conditions other methods are faster.
+<p>
+On PPlain and PMMX it is faster to move 8 bytes at a time using floating
+point registers if the destination is not in the cache:
+<pre>TOP: FILD QWORD PTR [ESI]
+ FILD QWORD PTR [ESI+8]
+ FXCH
+ FISTP QWORD PTR [EDI]
+ FISTP QWORD PTR [EDI+8]
+ ADD ESI, 16
+ ADD EDI, 16
+ DEC ECX
+ JNZ TOP</pre>
+<p>
+The source and destination should of course be aligned by 8. The extra time used by the
+slow <kbd>FILD</kbd> and <kbd>FISTP</kbd> instructions is compensated for by the fact that you only have to do
+half as many write operations. Note that this method is only advantageous on the PPlain
+and PMMX and only if the destination is not in the level 1 cache. You cannot use
+<kbd>FLD</kbd> and <kbd>FSTP</kbd> (without <kbd>I</kbd>) on arbitrary bit patterns because denormal numbers
+are handled slowly and certain bit patterns are not preserved unchanged.
+<p>
+On the PMMX processor it is faster to use MMX instructions to move eight bytes
+at a time if the destination is not in the cache:
+<pre>TOP: MOVQ MM0,[ESI]
+ MOVQ [EDI],MM0
+ ADD ESI,8
+ ADD EDI,8
+ DEC ECX
+ JNZ TOP</pre>
+<p>
+There is no need to unroll this loop or optimize it further if cache misses are expected,
+because memory access is the bottleneck here, not instruction execution.
+<p>
+On PPro, PII and PIII processors the <kbd>REP MOVSD</kbd> instruction is particularly
+fast when the following conditions are met (see chapter <a href="#26_3">26.3</a>):
+<ul>
+<li>both source and destination must be aligned by 8
+<li>direction must be forward (direction flag cleared)
+<li>the count (<kbd>ECX</kbd>) must be greater than or equal to 64
+<li>the difference between <kbd>EDI</kbd> and <kbd>ESI</kbd> must be numerically greater than or equal to 32
+<li>the memory type for both source and destination must be either writeback or
+write-combining (you can normally assume this).
+</ul>
+<p>
+On the PII it is faster to use MMX registers if the above conditions are not met
+and the destination is likely to be in the level 1 cache. The loop may be rolled
+out by two, and the source and destination should of course be aligned by 8.
+<p>
+On the PIII the fastest way of moving data is to use the <kbd>MOVAPS</kbd>
+instruction if the above conditions are not met or if the destination is in
+the level 1 or level 2 cache:
+<pre> SUB EDI, ESI
+TOP: MOVAPS XMM0, [ESI]
+ MOVAPS [ESI+EDI], XMM0
+ ADD ESI, 16
+ DEC ECX
+ JNZ TOP</pre><p>
+Unlike <kbd>FLD</kbd>, <kbd>MOVAPS</kbd> can handle any bit pattern without
+problems. Remember that source and destination must be aligned by 16.
+<p>
+If the number of bytes to move is not divisible by 16 then you may round up
+to the nearest number divisible by 16 and put some extra space at the end of
+the destination buffer to receive the superfluous bytes. If this is not possible
+then you have to move the remaining bytes by other methods.
+<p>
+On the PIII you also have the option of writing directly to RAM memory without
+involving the cache by using the <kbd>MOVNTQ</kbd> or <kbd>MOVNTPS</kbd>
+instruction. This can be useful if you don't want the destination to go into
+a cache. <kbd>MOVNTPS</kbd> is only slightly faster than <kbd>MOVNTQ</kbd>.
+<p>
+<h3><a name="27_9">27.9 Self-modifying code (All processors)</a></h3><p>
+The penalty for executing a piece of code immediately after modifying it is approximately 19
+clocks for PPlain, 31 for PMMX, and 150-300 for PPro, PII and PIII. The 80486 and earlier
+processors require a jump between the modifying and the modified code in order to flush
+the code cache.
+<p>
+To get permission to modify code in a protected operating system you need to call special
+system functions: In 16-bit Windows call ChangeSelector, in 32-bit Windows call
+VirtualProtect and FlushInstructionCache (or put the code in a data segment).
+<p>
+Self-modifying code is not considered good programming practice, but it may be justified if
+the gain in speed is considerable.
+<p>
+<h3><a name="27_10">27.10 Detecting processor type (All processors)</a></h3><p>
+I think it is fairly obvious by now that what is optimal for one microprocessor may not be
+optimal for another. You may make the most critical parts of you program in different
+versions, each optimized for a specific microprocessor and selecting the desired version at
+run time after detecting which microprocessor the program is running on. If you are using
+instructions that are not supported by all microprocessors (i.e. conditional
+moves, <kbd>FCOMI</kbd>, MMX and XMM instructions) then you must first check if the program is running on a microprocessor
+that supports these instructions. The subroutine below checks the type of microprocessor
+and the features supported.
+<p>
+<pre>; define CPUID instruction if not known by assembler:
+CPUID MACRO
+ DB 0FH, 0A2H
+ENDM
+
+; C++ prototype:
+; extern "C" long int DetectProcessor (void);
+
+; return value:
+; bits 8-11 = family (5 for PPlain and PMMX, 6 for PPro, PII and PIII)
+; bit 0 = floating point instructions supported
+; bit 15 = conditional move and FCOMI instructions supported
+; bit 23 = MMX instructions supported
+; bit 25 = XMM instructions supported
+
+_DetectProcessor PROC NEAR
+PUBLIC _DetectProcessor
+ PUSH EBX
+ PUSH ESI
+ PUSH EDI
+ PUSH EBP
+ ; detect if CPUID instruction supported by microprocessor:
+ PUSHFD
+ POP EAX
+ MOV EBX, EAX
+ XOR EAX, 1 SHL 21 ; check if CPUID bit can toggle
+ PUSH EAX
+ POPFD
+ PUSHFD
+ POP EAX
+ XOR EAX, EBX
+ AND EAX, 1 SHL 21
+ JZ SHORT DPEND ; CPUID instruction not supported
+ XOR EAX, EAX
+ CPUID ; get number of CPUID functions
+ TEST EAX, EAX
+ JZ SHORT DPEND ; CPUID function 1 not supported
+ MOV EAX, 1
+ CPUID ; get family and features
+ AND EAX, 000000F00H ; family
+ AND EDX, 0FFFFF0FFH ; features flags
+ OR EAX, EDX ; combine bits
+DPEND: POP EBP
+ POP EDI
+ POP ESI
+ POP EBX
+ RET
+_DetectProcessor ENDP</pre>
+<p>
+Note that some operating systems do not allow XMM instructions.
+Information on how to check for operating system support of XMM instructions can
+be found in Intel's application note AP-900: "Identifying support for Streaming
+SIMD Extensions in the Processor and Operating System".
+More information on microprocessor identification can be found in Intel's
+application note AP-485: "Intel Processor Identification and the CPUID Instruction".
+<p>
+To code the conditional move, MMX, XMM instructions etc. on an assembler that doesn't have
+these instructions use the macros at <a href="http://www.agner.org/assem/macros.zip">www.agner.org/assem/macros.zip</a>
+<p>
+<h2><a name="28">28</a>. List of instruction timings for PPlain and PMMX</h2>
+<h3><a name="28_1">28.1 Integer instructions</a></h3><p>
+<b>Explanations:</b><br>
+<u>Operands:</u><br>
+r = register, m = memory, i = immediate data, sr = segment register<br>
+m32 = 32 bit memory operand, etc.
+<p>
+<u>Clock cycles:</u><br>
+The numbers are minimum values. Cache misses, misalignment, and exceptions may
+increase the clock counts considerably.
+<p>
+<u>Pairability:</u><br>
+u = pairable in u-pipe, v = pairable in v-pipe, uv = pairable in either pipe,
+np = not pairable.
+<p>
+
+<table border=1 cellpadding=4 cellspacing=1>
+<tr><td class="a3">&nbsp;Instruction&nbsp;</td>
+<td class="a3">&nbsp;Operands&nbsp;</td>
+<td class="a3">&nbsp;Clock cycles&nbsp;</td>
+<td class="a3">&nbsp;Pairability&nbsp;</td></tr>
+<tr><td>NOP</td><td>&nbsp;</td><td>1</td><td>uv</td></tr>
+<tr><td>MOV</td><td>r/m, r/m/i</td><td>1</td><td>uv</td></tr>
+<tr><td>MOV</td><td>r/m, sr</td><td>1</td><td>np</td></tr>
+<tr><td>MOV</td><td>sr , r/m</td><td>&gt;= 2 b)</td><td>np</td></tr>
+<tr><td>MOV</td><td>m , accum</td><td>1</td><td>uv h)</td></tr>
+<tr><td>XCHG</td><td>(E)AX, r</td><td>2</td><td>np</td></tr>
+<tr><td>XCHG</td><td>r , r</td><td>3</td><td>np</td></tr>
+<tr><td>XCHG</td><td>r , m</td><td>&gt;15</td><td>np</td></tr>
+<tr><td>XLAT</td><td>&nbsp;</td><td>4</td><td>np</td></tr>
+<tr><td>PUSH</td><td>r/i</td><td>1</td><td>uv</td></tr>
+<tr><td>POP</td><td>r</td><td>1</td><td>uv</td></tr>
+<tr><td>PUSH</td><td>m</td><td>2</td><td>np</td></tr>
+<tr><td>POP</td><td>m</td><td>3</td><td>np</td></tr>
+<tr><td>PUSH</td><td>sr</td><td>1 b)</td><td>np</td></tr>
+<tr><td>POP</td><td>sr</td><td>&gt;= 3 b)</td><td>np</td></tr>
+<tr><td>PUSHF</td><td>&nbsp;</td><td>3-5</td><td>np</td></tr>
+<tr><td>POPF</td><td>&nbsp;</td><td>4-6</td><td>np</td></tr>
+<tr><td>PUSHA POPA</td><td>&nbsp;</td><td>5-9 i)</td><td>np</td></tr>
+<tr><td>PUSHAD POPAD</td><td>&nbsp;</td><td>5</td><td>np</td></tr>
+<tr><td>LAHF SAHF</td><td>&nbsp;</td><td>2</td><td>np</td></tr>
+<tr><td>MOVSX MOVZX</td><td>r , r/m</td><td>3 a)</td><td>np</td></tr>
+<tr><td>LEA</td><td>r , m</td><td>1</td><td>uv</td></tr>
+<tr><td>LDS LES LFS LGS LSS</td><td>m</td><td>4 c)</td><td>np</td></tr>
+<tr><td>ADD SUB AND OR XOR</td><td>r , r/i</td><td>1</td><td>uv</td></tr>
+<tr><td>ADD SUB AND OR XOR</td><td>r , m</td><td>2</td><td>uv</td></tr>
+<tr><td>ADD SUB AND OR XOR</td><td>m , r/i</td><td>3</td><td>uv</td></tr>
+<tr><td>ADC SBB</td><td>r , r/i</td><td>1</td><td>u</td></tr>
+<tr><td>ADC SBB</td><td>r , m</td><td>2</td><td>u</td></tr>
+<tr><td>ADC SBB</td><td>m , r/i</td><td>3</td><td>u</td></tr>
+<tr><td>CMP</td><td>r , r/i</td><td>1</td><td>uv</td></tr>
+<tr><td>CMP</td><td>m , r/i</td><td>2</td><td>uv</td></tr>
+<tr><td>TEST</td><td>r , r</td><td>1</td><td>uv</td></tr>
+<tr><td>TEST</td><td>m , r</td><td>2</td><td>uv</td></tr>
+<tr><td>TEST</td><td>r , i</td><td>1</td><td>f)</td></tr>
+<tr><td>TEST</td><td>m , i</td><td>2</td><td>np</td></tr>
+<tr><td>INC DEC</td><td>r</td><td>1</td><td>uv</td></tr>
+<tr><td>INC DEC</td><td>m</td><td>3</td><td>uv</td></tr>
+<tr><td>NEG NOT</td><td>r/m</td><td>1/3</td><td>np</td></tr>
+<tr><td>MUL IMUL</td><td>r8/r16/m8/m16</td><td>11</td><td>np</td></tr>
+<tr><td>MUL IMUL</td><td>all other versions</td><td>9 d)</td><td>np</td></tr>
+<tr><td>DIV</td><td>r8/m8</td><td>17</td><td>np</td></tr>
+<tr><td>DIV</td><td>r16/m16</td><td>25</td><td>np</td></tr>
+<tr><td>DIV</td><td>r32/m32</td><td>41</td><td>np</td></tr>
+<tr><td>IDIV</td><td>r8/m8</td><td>22</td><td>np</td></tr>
+<tr><td>IDIV</td><td>r16/m16</td><td>30</td><td>np</td></tr>
+<tr><td>IDIV</td><td>r32/m32</td><td>46</td><td>np</td></tr>
+<tr><td>CBW CWDE</td><td>&nbsp;</td><td>3</td><td>np</td></tr>
+<tr><td>CWD CDQ</td><td>&nbsp;</td><td>2</td><td>np</td></tr>
+<tr><td>SHR SHL SAR SAL</td><td>r , i</td><td>1</td><td>u</td></tr>
+<tr><td>SHR SHL SAR SAL</td><td>m , i</td><td>3</td><td>u</td></tr>
+<tr><td>SHR SHL SAR SAL</td><td>r/m, CL</td><td>4/5</td><td>np</td></tr>
+<tr><td>ROR ROL RCR RCL</td><td>r/m, 1</td><td>1/3</td><td>u</td></tr>
+<tr><td>ROR ROL</td><td>r/m, i(&gt;&lt;1)</td><td>1/3</td><td>np</td></tr>
+<tr><td>ROR ROL</td><td>r/m, CL</td><td>4/5</td><td>np</td></tr>
+<tr><td>RCR RCL</td><td>r/m, i(&gt;&lt;1)</td><td>8/10</td><td>np</td></tr>
+<tr><td>RCR RCL</td><td>r/m, CL</td><td>7/9</td><td>np</td></tr>
+<tr><td>SHLD SHRD</td><td>r, i/CL</td><td>4 a)</td><td>np</td></tr>
+<tr><td>SHLD SHRD</td><td>m, i/CL</td><td>5 a)</td><td>np</td></tr>
+<tr><td>BT</td><td>r, r/i</td><td>4 a)</td><td>np</td></tr>
+<tr><td>BT</td><td>m, i</td><td>4 a)</td><td>np</td></tr>
+<tr><td>BT</td><td>m, i</td><td>9 a)</td><td>np</td></tr>
+<tr><td>BTR BTS BTC</td><td>r, r/i</td><td>7 a)</td><td>np</td></tr>
+<tr><td>BTR BTS BTC</td><td>m, i</td><td>8 a)</td><td>np</td></tr>
+<tr><td>BTR BTS BTC</td><td>m, r</td><td>14 a)</td><td>np</td></tr>
+<tr><td>BSF BSR</td><td>r , r/m</td><td>7-73 a)</td><td>np</td></tr>
+<tr><td>SETcc</td><td>r/m</td><td>1/2 a)</td><td>np</td></tr>
+<tr><td>JMP CALL</td><td>short/near</td><td>1 e)</td><td>v</td></tr>
+<tr><td>JMP CALL</td><td>far</td><td>&gt;= 3 e)</td><td>np</td></tr>
+<tr><td>conditional jump</td><td>short/near</td><td>1/4/5/6 e)</td><td>v</td></tr>
+<tr><td>CALL JMP</td><td>r/m</td><td>2/5 e</td><td>np</td></tr>
+<tr><td>RETN</td><td>&nbsp;</td><td>2/5 e</td><td>np</td></tr>
+<tr><td>RETN</td><td>i</td><td>3/6 e)</td><td>np</td></tr>
+<tr><td>RETF</td><td>&nbsp;</td><td>4/7 e)</td><td>np</td></tr>
+<tr><td>RETF</td><td>i</td><td>5/8 e)</td><td>np</td></tr>
+<tr><td>J(E)CXZ</td><td>short</td><td>4-11 e)</td><td>np</td></tr>
+<tr><td>LOOP</td><td>short</td><td>5-10 e)</td><td>np</td></tr>
+<tr><td>BOUND</td><td>r , m</td><td>8</td><td>np</td></tr>
+<tr><td>CLC STC CMC CLD STD</td><td>&nbsp;</td><td>2</td><td>np</td></tr>
+<tr><td>CLI STI</td><td>&nbsp;</td><td>6-9</td><td>np</td></tr>
+<tr><td>LODS</td><td>&nbsp;</td><td>2</td><td>np</td></tr>
+<tr><td>REP LODS</td><td>&nbsp;</td><td>7+3*n g)</td><td>np</td></tr>
+<tr><td>STOS</td><td>&nbsp;</td><td>3</td><td>np</td></tr>
+<tr><td>REP STOS</td><td>&nbsp;</td><td>10+n g)</td><td>np</td></tr>
+<tr><td>MOVS</td><td>&nbsp;</td><td>4</td><td>np</td></tr>
+<tr><td>REP MOVS</td><td>&nbsp;</td><td>12+n g)</td><td>np</td></tr>
+<tr><td>SCAS</td><td>&nbsp;</td><td>4</td><td>np</td></tr>
+<tr><td>REP(N)E SCAS</td><td>&nbsp;</td><td>9+4*n g)</td><td>np</td></tr>
+<tr><td>CMPS</td><td>&nbsp;</td><td>5</td><td>np</td></tr>
+<tr><td>REP(N)E CMPS</td><td>&nbsp;</td><td>8+4*n g)</td><td>np</td></tr>
+<tr><td>BSWAP</td><td>&nbsp;</td><td>1 a)</td><td>np</td></tr>
+<tr><td>CPUID</td><td>&nbsp;</td><td>13-16 a)</td><td>np</td></tr>
+<tr><td>RDTSC</td><td>&nbsp;</td><td>6-13 a) j)</td><td>np</td></tr>
+</table>
+<p>
+<b>Notes:</b><br>
+a) this instruction has a <kbd>0FH</kbd> prefix which takes one clock cycle extra to
+ decode on a PPlain unless preceded by a multicycle instruction (see
+ chapter <a href="#12">12</a>).<br>
+b) versions with <kbd>FS</kbd> and <kbd>GS</kbd> have a <kbd>0FH</kbd>
+ prefix. see note a.<br>
+c) versions with <kbd>SS, FS</kbd>, and <kbd>GS</kbd> have a <kbd>0FH</kbd> prefix. see note a.<br>
+d) versions with two operands and no immediate have a <kbd>0FH</kbd> prefix, see note a.<br>
+e) see chapter <a href="#22">22</a><br>
+f) only pairable if register is accumulator. see chapter <a href="#26_14">26.14</a>.<br>
+g) add one clock cycle for decoding the repeat prefix unless preceded by a
+ multicycle instruction (such as <kbd>CLD</kbd>. see chapter <a href="#12">12</a>).<br>
+h) pairs as if it were writing to the accumulator. see chapter <a href="#26_14">26.14</a>.<br>
+i) 9 if <kbd>SP</kbd> divisible by 4. <a href="#imperfectpush">See 10.2</a><br>
+j) on PPlain: 6 in priviledged or real mode, 11 in nonpriviledged, error in
+ virtual mode. On PMMX: 8 and 13 clocks respectively.<br>
+<p>
+<h3><a name="28_2">28.2 Floating point instructions</a></h3><p>
+<p>
+<b>Explanations:</b><br>
+<u>Operands:</u><br>
+r = register, m = memory, m32 = 32 bit memory operand, etc.
+<p>
+<u>Clock cycles:</u><br>
+The numbers are minimum values. Cache misses, misalignment, denormal operands, and
+exceptions may increase the clock counts considerably.
+<p>
+<u>Pairability:</u><br>
++ = pairable with <kbd>FXCH</kbd>, np = not pairable with <kbd>FXCH</kbd>.
+<p>
+<u>i-ov:</u><br>
+Overlap with integer instructions. i-ov = 4 means that the last four clock cycles can overlap
+with subsequent integer instructions.
+<p>
+<u>fp-ov:</u><br>
+Overlap with floating point instructions. fp-ov = 2 means that the last two clock cycles can
+overlap with subsequent floating point instructions.
+(<kbd>WAIT</kbd> is considered a floating point instruction here)<p>
+
+<table border=1 cellpadding=4 cellspacing=1>
+<tr><td class="a3">&nbsp;Instruction&nbsp;</td>
+<td class="a3">&nbsp;Operand&nbsp;</td>
+<td class="a3">&nbsp;Clock cycles&nbsp;</td>
+<td class="a3">&nbsp;Pairability&nbsp;</td>
+<td class="a3">&nbsp;i-ov&nbsp;</td>
+<td class="a3">&nbsp;fp-ov&nbsp;</td></tr>
+<tr><td>FLD</td><td>r/m32/m64</td><td>1</td><td>+</td><td>0</td><td>0</td></tr>
+<tr><td>FLD</td><td>m80</td><td>3</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FBLD</td><td>m80</td><td>48-58</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FST(P)</td><td>r</td><td>1</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FST(P)</td><td>m32/m64</td><td>2 m)</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FST(P)</td><td>m80</td><td>3 m)</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FBSTP</td><td>m80</td><td>148-154</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FILD</td><td>m</td><td>3</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FIST(P)</td><td>m</td><td>6</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FLDZ FLD1</td><td>&nbsp;</td><td>2</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FLDPI FLDL2E etc.</td><td>&nbsp;</td><td>5 s)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FNSTSW</td><td>AX/m16</td><td>6 q)</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FLDCW</td><td>m16</td><td>8</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FNSTCW</td><td>m16</td><td>2</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FADD(P)</td><td>r/m</td><td>3</td><td>+</td><td>2</td><td>2</td></tr>
+<tr><td>FSUB(R)(P)</td><td>r/m</td><td>3</td><td>+</td><td>2</td><td>2</td></tr>
+<tr><td>FMUL(P)</td><td>r/m</td><td>3</td><td>+</td><td>2</td><td>2 n)</td></tr>
+<tr><td>FDIV(R)(P)</td><td>r/m</td><td>19/33/39 p)</td><td>+</td><td>38 o)</td><td>2</td></tr>
+<tr><td>FCHS FABS</td><td>&nbsp;</td><td>1</td><td>+</td><td>0</td><td>0</td></tr>
+<tr><td>FCOM(P)(P) FUCOM</td><td>r/m</td><td>1</td><td>+</td><td>0</td><td>0</td></tr>
+<tr><td>FIADD FISUB(R)</td><td>m</td><td>6</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FIMUL</td><td>m</td><td>6</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FIDIV(R)</td><td>m</td><td>22/36/42 p)</td><td>np</td><td>38 o)</td><td>2</td></tr>
+<tr><td>FICOM</td><td>m</td><td>4</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FTST</td><td>&nbsp;</td><td>1</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FXAM</td><td>&nbsp;</td><td>17-21</td><td>np</td><td>4</td><td>0</td></tr>
+<tr><td>FPREM</td><td>&nbsp;</td><td>16-64</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FPREM1</td><td>&nbsp;</td><td>20-70</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FRNDINT</td><td>&nbsp;</td><td>9-20</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FSCALE</td><td>&nbsp;</td><td>20-32</td><td>np</td><td>5</td><td>0</td></tr>
+<tr><td>FXTRACT</td><td>&nbsp;</td><td>12-66</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FSQRT</td><td>&nbsp;</td><td>70</td><td>np</td><td>69 o)</td><td>2</td></tr>
+<tr><td>FSIN FCOS</td><td>&nbsp;</td><td>65-100 r)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FSINCOS</td><td>&nbsp;</td><td>89-112 r)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>F2XM1</td><td>&nbsp;</td><td>53-59 r)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FYL2X</td><td>&nbsp;</td><td>103 r)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FYL2XP1</td><td>&nbsp;</td><td>105 r)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FPTAN</td><td>&nbsp;</td><td>120-147 r)</td><td>np</td><td>36 o)</td><td>0</td></tr>
+<tr><td>FPATAN</td><td>&nbsp;</td><td>112-134 r)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FNOP</td><td>&nbsp;</td><td>1</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FXCH</td><td>r</td><td>1</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FINCSTP FDECSTP</td><td>&nbsp;</td><td>2</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FFREE</td><td>r</td><td>2</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FNCLEX</td><td>&nbsp;</td><td>6-9</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FNINIT</td><td>&nbsp;</td><td>12-22</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FNSAVE</td><td>m</td><td>124-300</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FRSTOR</td><td>m</td><td>70-95</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>WAIT</td><td>&nbsp;</td><td>1</td><td>np</td><td>0</td><td>0</td></tr>
+</table>
+<p>
+<b>Notes:</b><br>
+m) The value to store is needed one clock cycle in advance.<br>
+n) 1 if the overlapping instruction is also an <kbd>FMUL</kbd>.<br>
+o) Cannot overlap integer multiplication instructions.<br>
+p) <kbd>FDIV</kbd> takes 19, 33, or 39 clock cycles for 24, 53, and 64 bit precision
+respectively. <kbd>FIDIV</kbd> takes 3 clocks more. The precision is defined by bit
+8-9 of the floating point control word.<br>
+q) The first 4 clock cycles can overlap with preceding integer instructions.
+See chapter <a href="#26_7">26.7</a>.<br>
+r) clock counts are typical. Trivial cases may be faster, extreme cases may
+be slower.<br>
+s) may be up to 3 clocks more when output needed for <kbd>FST</kbd>,
+<kbd>FCHS</kbd>, or <kbd>FABS</kbd>.
+<p>
+<h3><a name="28_3">28.3 MMX instructions (PMMX)</a></h3><p>
+<p>
+A list of MMX instruction timings is not needed because they all take one clock cycle,
+except the MMX multiply instructions which take 3. MMX multiply instructions can be
+overlapped and pipelined to yield a throughput of one multiplication per clock cycle.
+<p>
+The <kbd>EMMS</kbd> instruction takes only one clock cycle, but the first floating point instruction after
+an <kbd>EMMS</kbd> takes approximately 58 clocks extra, and the first MMX instruction after a floating
+point instruction takes approximately 38 clocks extra. There is no penalty for an MMX
+instruction after <kbd>EMMS</kbd> on the PMMX (but a possible small penalty on the PII and PIII).
+<p>
+There is no penalty for using a memory operand in an MMX instruction because the MMX
+arithmetic unit is one step later in the pipeline than the load unit. But the penalty comes
+when you store data from an MMX register to memory or to a 32 bit register: The data have
+to be ready one clock cycle in advance. This is analogous to the floating point store
+instructions.
+<p>
+All MMX instructions except <kbd>EMMS</kbd> are pairable in either pipe. Pairing rules for MMX
+instructions are described in chapter <a href="#10">10</a>.
+<p>
+<h2><a name="29">29</a>. List of instruction timings and micro-op breakdown for PPro, PII and PIII</h2><p>
+<b>Explanations:</b><br>
+<u>Operands:</u><br>
+r = register, m = memory, i = immediate data, sr = segment register,
+m32 = 32 bit memory operand, etc.
+<p>
+<u>Micro-ops:</u><br>
+The number of micro-ops that the instruction generates for each execution port.<br>
+p0: port 0: ALU, etc.<br>
+p1: port 1: ALU, jumps<br>
+p01: instructions that can go to either port 0 or 1, whichever is vacant first.<br>
+p2: port 2: load data, etc.<br>
+p3: port 3: address generation for store<br>
+p4: port 4: store data
+<p>
+<u>Delay:</u><br>
+This is the delay that the instruction generates in a dependency chain.
+(This is not the same as the time spent in the execution unit. Values may be
+inaccurate in situations where they cannot be measured exactly, especially with
+memory operands).
+The numbers are minimum values. Cache misses, misalignment, and exceptions
+may increase the clock counts considerably. Floating point operands are
+presumed to be normal numbers. Denormal numbers, NANs and infinity increase
+the delays by 50-150 clocks, except in XMM move, shuffle and boolean instructions.
+Floating point overflow, underflow, denormal or NAN results give a similar delay.
+<p>
+<u>Throughput:</u><br>
+The maximum throughput for several instructions of the same kind. For example, a
+throughput of 1/2 for <kbd>FMUL</kbd> means that a new <kbd>FMUL</kbd> instruction can start executing
+every 2 clock cycles.<p>
+
+<table border="1" cellpadding="4" cellspacing="1">
+<tr>
+<td colspan="10" class="a2"><a name="29_1">29.1 Integer instructions</a></td>
+</tr>
+<tr>
+<td class="a3">Instruction</td>
+<td class="a3">Operands</td>
+<td colspan="6" class="a3">micro-ops</td>
+<td class="a3">delay</td>
+<td class="a3">throughput</td>
+</tr>
+<tr><td>&nbsp;</td><td>&nbsp;</td><td class="a3">p0</td><td class="a3">p1</td>
+<td class="a3">p01</td><td class="a3">p2</td><td class="a3">p3</td><td class="a3">p4</td>
+<td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>NOP</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>MOV</td><td>r,r/i</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>MOV</td><td>r,m</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>MOV</td><td>m,r/i</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>MOV</td><td>r,sr</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>MOV</td><td>m,sr</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>MOV</td><td>sr,r</td><td colspan="3">8</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>5</td><td>&nbsp;</td></tr>
+<tr><td>MOV</td><td>sr,m</td><td colspan="3">7</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>8</td><td>&nbsp;</td></tr>
+<tr><td>MOVSX MOVZX</td><td>r,r</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>MOVSX MOVZX</td><td>r,m</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>CMOVcc</td><td>r,r</td><td>1</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>CMOVcc</td><td>r,m</td><td>1</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>XCHG</td><td>r,r</td><td>&nbsp;</td><td>&nbsp;</td><td>3</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>XCHG</td><td>r,m</td><td>&nbsp;</td><td>&nbsp;</td><td>4</td>
+<td>1</td><td>1</td><td>1</td><td>high b)</td><td>&nbsp;</td></tr>
+<tr><td>XLAT</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>PUSH</td><td>r/i</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>POP</td><td>r</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>POP</td><td>(E)SP</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>PUSH</td><td>m</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>POP</td><td>m</td><td>&nbsp;</td><td>&nbsp;</td><td>5</td>
+<td>1</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>PUSH</td><td>sr</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td>
+<td>&nbsp;</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>POP</td><td>sr</td><td>&nbsp;</td><td>&nbsp;</td><td>8</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>PUSHF(D)</td><td>&nbsp;</td><td>3</td><td>&nbsp;</td><td>11</td>
+<td>&nbsp;</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>POPF(D)</td><td>&nbsp;</td><td>10</td><td>&nbsp;</td><td>6</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>PUSHA(D)</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td>
+<td>&nbsp;</td><td>8</td><td>8</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>POPA(D)</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td>
+<td>8</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>LAHF SAHF</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>LEA</td><td>r,m</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1 c)</td><td>&nbsp;</td></tr>
+<tr><td>LDS LES LFS LGS LSS</td><td>m</td><td>&nbsp;</td><td>&nbsp;</td><td>8</td>
+<td>3</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>ADD SUB AND OR XOR</td><td>r,r/i</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>ADD SUB AND OR XOR</td><td>r,m</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>ADD SUB AND OR XOR</td><td>m,r/i</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>ADC SBB</td><td>r,r/i</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>ADC SBB</td><td>r,m</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>ADC SBB</td><td>m,r/i</td><td>&nbsp;</td><td>&nbsp;</td><td>3</td>
+<td>1</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>CMP TEST</td><td>r,r/i</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>CMP TEST</td><td>m,r/i</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>INC DEC NEG NOT</td><td>r</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>INC DEC NEG NOT</td><td>m</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>AAS DAA DAS</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>AAD</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>2</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>4</td><td>&nbsp;</td></tr>
+<tr><td>AAM</td><td>&nbsp;</td><td>1</td><td>1</td><td>2</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>15</td><td>&nbsp;</td></tr>
+<tr><td>MUL IMUL</td><td>r,(r),(i)</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>4</td><td>1/1</td></tr>
+<tr><td>MUL IMUL</td><td>(r),m</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>4</td><td>1/1</td></tr>
+<tr><td>DIV IDIV</td><td>r8</td><td>2</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>19</td><td>1/12</td></tr>
+<tr><td>DIV IDIV</td><td>r16</td><td>3</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>23</td><td>1/21</td></tr>
+<tr><td>DIV IDIV</td><td>r32</td><td>3</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>39</td><td>1/37</td></tr>
+<tr><td>DIV IDIV</td><td>m8</td><td>2</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>19</td><td>1/12</td></tr>
+<tr><td>DIV IDIV</td><td>m16</td><td>2</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>23</td><td>1/21</td></tr>
+<tr><td>DIV IDIV</td><td>m32</td><td>2</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>39</td><td>1/37</td></tr>
+<tr><td>CBW CWDE</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>CWD CDQ</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>SHR SHL SAR ROR ROL</td><td>r,i/CL</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>SHR SHL SAR ROR ROL</td><td>m,i/CL</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>RCR RCL</td><td>r,1</td><td>1</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>RCR RCL</td><td>r8,i/CL</td><td>4</td><td>&nbsp;</td><td>4</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>RCR RCL</td><td>r16/32,i/CL</td><td>3</td><td>&nbsp;</td><td>3</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>RCR RCL</td><td>m,1</td><td>1</td><td>&nbsp;</td><td>2</td>
+<td>1</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>RCR RCL</td><td>m8,i/CL</td><td>4</td><td>&nbsp;</td><td>3</td>
+<td>1</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>RCR RCL</td><td>m16/32,i/CL</td><td>4</td><td>&nbsp;</td><td>2</td>
+<td>1</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>SHLD SHRD</td><td>r,r,i/CL</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>SHLD SHRD</td><td>m,r,i/CL</td><td>2</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>BT</td><td>r,r/i</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>BT</td><td>m,r/i</td><td>1</td><td>&nbsp;</td><td>6</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>BTR BTS BTC</td><td>r,r/i</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>BTR BTS BTC</td><td>m,r/i</td><td>1</td><td>&nbsp;</td><td>6</td>
+<td>1</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>BSF BSR</td><td>r,r</td><td>&nbsp;</td><td>1</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>BSF BSR</td><td>r,m</td><td>&nbsp;</td><td>1</td><td>1</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>SETcc</td><td>r</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>SETcc</td><td>m</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>JMP</td><td>short/near</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1/2</td></tr>
+<tr><td>JMP</td><td>far</td><td colspan="3">21</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>JMP</td><td>r</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1/2</td></tr>
+<tr><td>JMP</td><td>m(near)</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1/2</td></tr>
+<tr><td>JMP</td><td>m(far)</td><td colspan="3">21</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>conditional jump</td><td>short/near</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1/2</td></tr>
+<tr><td>CALL</td><td>near</td><td>&nbsp;</td><td>1</td><td>1</td>
+<td>&nbsp;</td><td>1</td><td>1</td><td>&nbsp;</td><td>1/2</td></tr>
+<tr><td>CALL</td><td>far</td><td colspan="3">28</td>
+<td>1</td><td>2</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>CALL</td><td>r</td><td>&nbsp;</td><td>1</td><td>2</td>
+<td>&nbsp;</td><td>1</td><td>1</td><td>&nbsp;</td><td>1/2</td></tr>
+<tr><td>CALL</td><td>m(near)</td><td>&nbsp;</td><td>1</td><td>4</td>
+<td>1</td><td>1</td><td>1</td><td>&nbsp;</td><td>1/2</td></tr>
+<tr><td>CALL</td><td>m (far)</td><td colspan="3">28</td>
+<td>2</td><td>2</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>RETN</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>2</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1/2</td></tr>
+<tr><td>RETN</td><td>i</td><td>&nbsp;</td><td>1</td><td>3</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1/2</td></tr>
+<tr><td>RETF</td><td>&nbsp;</td><td colspan="3">23</td>
+<td>3</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>RETF</td><td>i</td><td colspan="3">23</td><td>3</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>J(E)CXZ</td><td>short</td><td>&nbsp;</td><td>1</td><td>1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>LOOP</td><td>short</td><td>2</td><td>1</td><td>8</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>LOOP(N)E</td><td>short</td><td>2</td><td>1</td><td>8</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>ENTER</td><td>i,0</td><td>&nbsp;</td><td>&nbsp;</td><td>12</td><td>&nbsp;</td>
+<td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>ENTER</td><td>a,b</td><td colspan="3">ca. 18+4b</td><td>&nbsp;</td>
+<td>b-1</td><td>2b</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>LEAVE</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>BOUND</td><td>r,m</td><td>7</td><td>&nbsp;</td><td>6</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>CLC STC CMC</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>CLD STD</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>4</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>CLI</td><td>&nbsp;</td><td colspan="3">9</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>STI</td><td>&nbsp;</td><td colspan="3">17</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>INTO</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>5</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>LODS</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>REP LODS</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td colspan="2">10+6n</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>STOS</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>REP STOS</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td colspan="4">ca. 5n a)</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>MOVS</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>3</td>
+<td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>REP MOVS</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td colspan="4">ca. 6n a)</td>
+<td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>SCAS</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>REP(N)E SCAS</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td colspan="2">12+7n</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>CMPS</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>4</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>REP(N)E CMPS</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td colspan="2">12+9n</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>BSWAP</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>CPUID</td><td>&nbsp;</td><td colspan="3">23-48</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>RDTSC</td><td>&nbsp;</td><td colspan="3">31</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>IN</td><td>&nbsp;</td><td colspan="3">18</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&gt;300</td><td>&nbsp;</td></tr>
+<tr><td>OUT</td><td>&nbsp;</td><td colspan="3">18</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&gt;300</td><td>&nbsp;</td></tr>
+<tr><td>PREFETCHNTA&nbsp; d)</td><td>m</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;</td><td>
+&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>PREFETCHT0&nbsp; d)</td><td>m</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>PREFETCHT1&nbsp; d)</td><td>m</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>PREFETCHT2&nbsp; d)</td><td>m</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;</td><td>
+&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>SFENCE&nbsp; d)</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>
+&nbsp;1</td><td>&nbsp;</td><td>1/6</td></tr>
+</TABLE><p>
+<b>Notes:</b><br>
+a) faster under certain conditions: see chapter <a href="#26_3">26.3</a>.<br>
+b) see chapter <a href="#26_1">26.1</a><br>
+c) 3 if constant without base or index register<br>
+d) PIII only.
+<p>
+
+<table border="1" cellpadding="4" cellspacing="1">
+<tr>
+<td colspan="10" class="a2"><a name="29_2">29.2 Floating point instructions</a></td>
+</tr>
+<tr>
+<td class="a3">Instruction</td>
+<td class="a3">Operands</td>
+<td colspan="6" align="center" class="a3">micro-ops</td>
+<td class="a3">delay</td>
+<td class="a3">throughput</td>
+</tr>
+<tr>
+<td>&nbsp;</td>
+<td>&nbsp;</td>
+<td class="a4">p0</td>
+<td class="a4">p1</td>
+<td class="a4">p01</td>
+<td class="a4">p2</td>
+<td class="a4">p3</td>
+<td class="a4">p4</td>
+<td>&nbsp;</td>
+<td>&nbsp;</td>
+</tr>
+<tr><td>FLD</td><td>r</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FLD</td><td>m32/64</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td></tr>
+<tr><td>FLD</td><td>m80</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FBLD</td><td>m80</td><td>38</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FST(P)</td><td>r</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FST(P)</td><td>m32/m64</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>1</td><td>1</td><td>1</td><td>&nbsp;</td></tr>
+<tr><td>FSTP</td><td>m80</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>2</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FBSTP</td><td>m80</td><td>165</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>2</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FXCH</td><td>r</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>0</td><td>3/1 f)</td></tr>
+<tr><td>FILD</td><td>m</td><td>3</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>5</td><td>&nbsp;</td></tr>
+<tr><td>FIST(P)</td><td>m</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>1</td><td>1</td><td>5</td><td>&nbsp;</td></tr>
+<tr><td>FLDZ</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td colspan="2">FLD1 FLDPI FLDL2E etc.</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FCMOVcc</td><td>r</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td></tr>
+<tr><td>FNSTSW</td><td>AX</td><td>3</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>7</td><td>&nbsp;</td></tr>
+<tr><td>FNSTSW</td><td>m16</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FLDCW</td><td>m16</td><td>1</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>10</td><td>&nbsp;</td></tr>
+<tr><td>FNSTCW</td><td>m16</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>1</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FADD(P) FSUB(R)(P)</td><td>r</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/1</td></tr>
+<tr><td>FADD(P) FSUB(R)(P)</td><td>m</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>3-4</td><td>1/1</td></tr>
+<tr><td>FMUL(P)</td><td>r</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>5</td><td>1/2 g)</td></tr>
+<tr><td>FMUL(P)</td><td>m</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>5-6</td><td>1/2 g)</td></tr>
+<tr><td>FDIV(R)(P)</td><td>r</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>38 h)</td><td>1/37</td></tr>
+<tr><td>FDIV(R)(P)</td><td>m</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>38 h)</td><td>1/37</td></tr>
+<tr><td>FABS</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FCHS</td><td>&nbsp;</td><td>3</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td></tr>
+<tr><td>FCOM(P) FUCOM</td><td>r</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td></tr>
+<tr><td>FCOM(P) FUCOM</td><td>m</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td></tr>
+<tr><td>FCOMPP FUCOMPP</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td></tr>
+<tr><td>FCOMI(P) FUCOMI(P)</td><td>r</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td></tr>
+<tr><td>FCOMI(P) FUCOMI(P)</td><td>m</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td></tr>
+<tr><td>FIADD FISUB(R)</td><td>m</td><td>6</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FIMUL</td><td>m</td><td>6</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FIDIV(R)</td><td>m</td><td>6</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FICOM(P)</td><td>m</td><td>6</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FTST</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td></tr>
+<tr><td>FXAM</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td></tr>
+<tr><td>FPREM</td><td>&nbsp;</td><td>23</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FPREM1</td><td>&nbsp;</td><td>33</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FRNDINT</td><td>&nbsp;</td><td>30</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FSCALE</td><td>&nbsp;</td><td>56</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FXTRACT</td><td>&nbsp;</td><td>15</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FSQRT</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>69</td><td>e,i)</td></tr>
+<tr><td>FSIN FCOS</td><td>&nbsp;</td><td colspan="3">17-97</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>27-103</td><td>e)</td></tr>
+<tr><td>FSINCOS</td><td>&nbsp;</td><td colspan="3">18-110</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>29-130</td><td>e)</td></tr>
+<tr><td>F2XM1</td><td>&nbsp;</td><td colspan="3">17-48</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>66</td><td>e)</td></tr>
+<tr><td>FYL2X</td><td>&nbsp;</td><td colspan="3">36-54</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>103</td><td>e)</td></tr>
+<tr><td>FYL2XP1</td><td>&nbsp;</td><td colspan="3">31-53</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>98-107</td><td>e)</td></tr>
+<tr><td>FPTAN</td><td>&nbsp;</td><td colspan="3">21-102</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>13-143</td><td>e)</td></tr>
+<tr><td>FPATAN</td><td>&nbsp;</td><td colspan="3">25-86</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>44-143</td><td>e)</td></tr>
+<tr><td>FNOP</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FINCSTP FDECSTP</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FFREE</td><td>r</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FFREEP</td><td>r</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FNCLEX</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>3</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FNINIT</td><td>&nbsp;</td><td colspan="3">13</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FNSAVE</td><td>&nbsp;</td><td colspan="3">141</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>FRSTOR</td><td>&nbsp;</td><td colspan="3">72</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>WAIT</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+</table>
+
+<p><b>Notes:</b><br>
+e) not pipelined<br>
+f) <kbd>FXCH</kbd> generates 1 micro-op that is resolved by register renaming without
+ going to any port.<br>
+g) <kbd>FMUL</kbd> uses the same circuitry as integer multiplication. Therefore, the
+ combined throughput of mixed floating point and integer multiplications is
+ 1 <kbd>FMUL</kbd> + 1 <kbd>IMUL</kbd> per 3 clock cycles.<br>
+h) <kbd>FDIV</kbd> delay depends on precision specified in control word:
+ precision 64 bits gives delay 38, precision 53 bits gives delay 32,
+ precision 24 bits gives delay 18. Division by a power of 2 takes 9 clocks.
+ Throughput is 1/(delay-1).<br>
+i) faster for lower precision.
+<p>
+
+<table border=1 cellpadding=4 cellspacing=1><tr>
+<td colspan="10" class="a2"><a name="29_3">29.3 MMX instructions (PII and PIII)</a></td></tr>
+<tr><td class="a3">Instruction</td>
+<td class="a3">Operands</td>
+<td colspan="6" align="center" class="a3">micro-ops</td>
+<td class="a3">delay</td>
+<td class="a3">throughput</td></tr>
+<tr><td>&nbsp;</td><td>&nbsp;</td>
+<td class="a4">p0</td><td class="a4">p1</td><td class="a4">p01</td>
+<td class="a4">p2</td><td class="a4">p3</td><td class="a4">p4</td>
+<td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>MOVD MOVQ</td><td>r,r</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;
+</td><td>&nbsp;</td><td>&nbsp;</td><td>2/1</td></tr>
+<tr><td>MOVD MOVQ</td><td>r64,m32/64</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;
+</td><td>&nbsp;</td><td>&nbsp;</td><td>1/1</td></tr>
+<tr><td>MOVD MOVQ</td><td>m32/64,r64</td><td>&nbsp;
+</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>
+1</td><td>&nbsp;</td><td>1/1</td></tr>
+<tr><td>PADD PSUB PCMP</td><td>r64,r64</td>&nbsp;
+<td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;
+</td><td>&nbsp;</td><td>&nbsp;</td><td>1/1</td></tr>
+<tr><td>PADD PSUB PCMP</td><td>r64,m64</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>1</td><td>&nbsp;
+</td><td>&nbsp;</td><td>&nbsp;</td><td>1/1</td></tr>
+<tr><td>PMUL PMADD</td><td>r64,r64</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;
+</td><td>&nbsp;</td><td>3</td><td>1/1</td></tr>
+<tr><td>PMUL PMADD</td><td>r64,m64</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;
+</td><td>&nbsp;</td><td>3</td><td>1/1</td></tr>
+<tr><td>PAND PANDN POR <br>PXOR</td>
+<td>r64,r64</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;
+</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>2/1</td></tr>
+<tr><td>PAND PANDN POR<br>PXOR</td><td>r64,m64</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>1</td><td>&nbsp;
+</td><td>&nbsp;</td><td>&nbsp;</td><td>1/1</td></tr>
+<tr><td>PSRA PSRL PSLL</td><td>r64,r64/i</td>
+<td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;
+</td><td>&nbsp;</td><td>&nbsp;</td><td>1/1</td></tr>
+<tr><td>PSRA PSRL PSLL</td><td>r64,m64</td>
+<td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>1</td><td>&nbsp;
+</td><td>&nbsp;</td><td>&nbsp;</td><td>1/1</td></tr>
+<tr><td>PACK PUNPCK</td><td>r64,r64</td>
+<td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;
+</td><td>&nbsp;</td><td>&nbsp;</td><td>1/1</td></tr>
+<tr><td>PACK PUNPCK</td><td>r64,m64</td>
+<td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>1</td><td>&nbsp;
+</td><td>&nbsp;</td><td>&nbsp;</td><td>1/1</td></tr>
+<tr><td>EMMS</td><td>&nbsp;</td><td colspan="3">11</td><td>&nbsp;</td><td>&nbsp;
+</td><td>&nbsp;</td><td>6 k)</td><td>&nbsp;</td></tr>
+<tr><td>MASKMOVQ&nbsp; d)</td><td>r64,r64</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;</td>
+<td>&nbsp;1</td><td>&nbsp;1</td><td>2-8</td><td>1/30-1/2</td></tr>
+<tr><td>PMOVMSKB&nbsp; d)</td><td>r32,r64</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;1/1</td></tr>
+<tr><td>MOVNTQ&nbsp; d)</td><td>m64,r64</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;1</td><td>&nbsp;1</td><td>&nbsp;</td><td>1/30-1/1</td></tr>
+<tr><td>PSHUFW&nbsp; d)</td><td>r64,r64,i</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;1/1</td></tr>
+<tr><td>PSHUFW&nbsp; d)</td><td>r64,m64,i</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;</td><td>&nbsp;1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;2</td><td>&nbsp;1/1</td></tr>
+<tr><td>PEXTRW&nbsp; d)</td><td>r32,r64,i</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;2</td><td>&nbsp;1/1</td></tr>
+<tr><td>PISRW&nbsp; d)</td><td>r64,r32,i</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;1/1</td></tr>
+<tr><td>PISRW&nbsp; d)</td><td>r64,m16,i</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;</td><td>&nbsp;1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;2</td><td>&nbsp;1/1</td></tr>
+<tr><td>PAVGB PAVGW&nbsp; d)</td><td>r64,r64</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;2/1</td></tr>
+<tr><td>PAVGB PAVGW&nbsp; d)</td><td>r64,m64</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;2</td><td>&nbsp;1/1</td></tr>
+<tr><td>PMINUB PMAXUB PMINSW PMAXSW&nbsp; d)</td><td>r64,r64</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;2/1</td></tr>
+<tr><td>PMINUB PMAXUB PMINSW PMAXSW&nbsp; d)</td><td>r64,m64</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;2</td><td>&nbsp;1/1</td></tr>
+<tr><td>PMULHUW&nbsp; d)</td><td>r64,r64</td><td>&nbsp;1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;3</td><td>&nbsp;1/1</td></tr>
+<tr><td>PMULHUW&nbsp; d)</td><td>r64,m64</td><td>&nbsp;1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;4</td><td>&nbsp;1/1</td></tr>
+<tr><td>PSADBW&nbsp; d)</td><td>r64,r64</td><td>&nbsp;2</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;5</td><td>&nbsp;1/2</td></tr>
+<tr><td>PSADBW&nbsp; d)</td><td>r64,m64</td><td>&nbsp;2</td><td>&nbsp;</td><td>&nbsp;1</td><td>&nbsp;1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;6</td><td>&nbsp;1/2</td></tr>
+</table><p>
+<b>Notes:</b><br>
+d) PIII only.<br>
+k) you may hide the delay by inserting other instructions between <kbd>EMMS</kbd> and any
+subsequent floating point instruction.
+<p>
+<table border="1" callpadding="4" cellspacing="1"><tr>
+<td colspan="10" class="a2"><a name="29_4">29.4 XMM instructions (PIII)</a></td></tr>
+<tr><td class="a3">Instruction</td>
+<td class="a3">Operands</td>
+<td colspan="6" align="center" class="a3">micro-ops</td>
+<td class="a3">delay</td>
+<td class="a3">throughput</td></tr>
+<tr><td>&nbsp;</td><td>&nbsp;</td>
+<td class="a4">&nbsp;p0&nbsp;</td><td class="a4">&nbsp;p1&nbsp;</td>
+<td class="a4">&nbsp;p01&nbsp;</td><td class="a4">&nbsp;p2&nbsp;</td>
+<td class="a4">&nbsp;p3&nbsp;</td><td class="a4">&nbsp;p4&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>MOVAPS</td><td>r128,r128</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td><td>&nbsp;
+</td><td>&nbsp;</td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVAPS</td><td>r128,m128</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>&nbsp;
+</td><td>&nbsp;</td><td>2</td><td>1/2</td></tr>
+<tr><td>MOVAPS</td><td>m128,r128</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>2</td><td>2</td><td>3</td><td>1/2</td></tr>
+<tr><td>MOVUPS</td><td>r128,m128</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>4</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>1/4</td></tr>
+<tr><td>MOVUPS</td><td>m128,r128</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>4</td>
+<td>4</td><td>3</td><td>1/4</td></tr>
+<tr><td>MOVSS</td><td>r128,r128</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVSS</td><td>r128,m32</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVSS</td><td>m32,r128</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>1</td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVHPS MOVLPS</td><td>r128,m64</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVHPS MOVLPS</td><td>m64,r128</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>1</td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVLHPS MOVHLPS</td><td>r128,r128</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVMSKPS</td><td>r32,r128</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVNTPS</td><td>m128,r128</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;2</td><td>&nbsp;2</td><td>&nbsp;</td><td>1/15-1/2</td></tr>
+<tr><td>CVTPI2PS</td><td>r128,r64</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/1</td></tr>
+<tr><td>CVTPI2PS</td><td>r128,m64</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>4</td><td>1/2</td></tr>
+<tr><td>CVTPS2PI CVTTPS2PI</td><td>r64,r128</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/1</td></tr>
+<tr><td>CVTPS2PI</td><td>r64,m128</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>2</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>4</td><td>1/1</td></tr>
+<tr><td>CVTSI2SS</td><td>r128,r32</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>4</td><td>1/2</td></tr>
+<tr><td>CVTSI2SS</td><td>r128,m32</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td><td>2</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>5</td><td>1/2</td></tr>
+<tr><td>CVTSS2SI CVTTSS2SI</td><td>r32,r128</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/1</td></tr>
+<tr><td>CVTSS2SI</td><td>r32,m128</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>4</td><td>1/2</td></tr>
+<tr><td>ADDPS SUBPS</td><td>r128,r128</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/2</td></tr>
+<tr><td>ADDPS SUBPS</td><td>r128,m128</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td><td>2</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/2</td></tr>
+<tr><td>ADDSS SUBSS</td><td>r128,r128</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/1</td></tr>
+<tr><td>ADDSS SUBSS</td><td>r128,m32</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/1</td></tr>
+<tr><td>MULPS</td><td>r128,r128</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>4</td><td>1/2</td></tr>
+<tr><td>MULPS</td><td>r128,m128</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>4</td><td>1/2</td></tr>
+<tr><td>MULSS</td><td>r128,r128</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>4</td><td>1/1</td></tr>
+<tr><td>MULSS</td><td>r128,m32</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>4</td><td>1/1</td></tr>
+<tr><td>DIVPS</td><td>r128,r128</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>48</td><td>1/34</td></tr>
+<tr><td>DIVPS</td><td>r128,m128</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>48</td><td>1/34</td></tr>
+<tr><td>DIVSS</td><td>r128,r128</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>18</td><td>1/17</td></tr>
+<tr><td>DIVSS</td><td>r128,m32</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>18</td><td>1/17</td></tr>
+<tr><td>ANDPS ANDNPS ORPS XORPS</td><td>r128,r128</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>1/2</td></tr>
+<tr><td>ANDPS ANDNPS ORPS XORPS</td><td>r128,m128</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>1/2</td></tr>
+<tr><td>MAXPS MINPS</td><td>r128,r128</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/2</td>&nbsp;</tr>
+<tr><td>MAXPS MINPS</td><td>r128,m128</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td><td>2</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/2</td></tr>
+<tr><td>MAXSS MINSS</td><td>r128,r128</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/1</td></tr>
+<tr><td>MAXSS MINSS</td><td>r128,m32</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/1</td></tr>
+<tr><td>CMPccPS</td><td>r128,r128</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/2</td></tr>
+<tr><td>CMPccPS</td><td>r128,m128</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td><td>2</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/2</td></tr>
+<tr><td>CMPccSS</td><td>r128,r128</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/1</td></tr>
+<tr><td>CMPccSS</td><td>r128,m32</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/1</td></tr>
+<tr><td>COMISS UCOMISS</td><td>r128,r128</td><td>&nbsp;</td><td>1</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>1/1</td></tr>
+<tr><td>COMISS UCOMISS</td><td>r128,m32</td><td>&nbsp;</td><td>1</td>
+<td>&nbsp;</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>1/1</td></tr>
+<tr><td>SQRTPS</td><td>r128,r128</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>56</td><td>1/56</td></tr>
+<tr><td>SQRTPS</td><td>r128,m128</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>57</td><td>1/56</td></tr>
+<tr><td>SQRTSS</td><td>r128,r128</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>30</td><td>1/28</td></tr>
+<tr><td>SQRTSS</td><td>r128,m32</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>31</td><td>1/28</td></tr>
+<tr><td>RSQRTPS</td><td>r128,r128</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>1/2</td></tr>
+<tr><td>RSQRTPS</td><td>r128,m128</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/2</td></tr>
+<tr><td>RSQRTSS</td><td>r128,r128</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>1/1</td></tr>
+<tr><td>RSQRTSS</td><td>r128,m32</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>1/1</td></tr>
+<tr><td>RCPPS</td><td>r128,r128</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>1/2</td></tr>
+<tr><td>RCPPS</td><td>r128,m128</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/2</td></tr>
+<tr><td>RCPSS</td><td>r128,r128</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>1</td><td>1/1</td></tr>
+<tr><td>RCPSS</td><td>r128,m32</td><td>1</td><td>&nbsp;</td><td>&nbsp;</td>
+<td>1</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>1/1</td></tr>
+<tr><td>SHUFPS</td><td>r128,r128,i</td><td>&nbsp;</td><td>2</td><td>1</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>1/2</td></tr>
+<tr><td>SHUFPS</td><td>r128,m128,i</td><td>&nbsp;</td><td>2</td><td>&nbsp;</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>2</td><td>1/2</td></tr>
+<tr><td>UNPCKHPS UNPCKLPS</td><td>r128,r128</td><td>&nbsp;</td><td>2</td>
+<td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/2</td></tr>
+<tr><td>UNPCKHPS UNPCKLPS</td><td>r128,m128</td><td>&nbsp;</td><td>2</td>
+<td>&nbsp;</td><td>2</td><td>&nbsp;</td><td>&nbsp;</td><td>3</td><td>1/2</td></tr>
+<tr><td>LDMXCSR</td><td>m32</td><td colspan="3">11</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>15</td><td>1/15</td></tr>
+<tr><td>STMXCSR</td><td>m32</td><td colspan="3">6</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>7</td><td>1/9</td></tr>
+<tr><td>FXSAVE</td><td>m4096</td><td colspan="3">116</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>62</td><td>&nbsp;</td></tr>
+<tr><td>FXRSTOR</td><td>m4096</td><td colspan="3">89</td>
+<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>68</td><td>&nbsp;</td></tr>
+</table>
+<p>
+<h2><a name="30">30</a>. Testing speed</h2><p>
+The Pentium family of processors have an internal 64 bit clock counter which can be read
+into <kbd>EDX:EAX</kbd> using the instruction <kbd>RDTSC</kbd>
+(read time stamp counter). This is very useful for
+testing exactly how many clock cycles a piece of code takes.
+<p>
+The program below is useful for measuring the number of clock cycles a piece of code
+takes. The program executes the code to test 10 times and stores the 10 clock counts.
+The program can be used in both 16 and 32 bit mode on the PPlain and PMMX:
+<pre>;************ Test program for PPlain and PMMX: ********************
+
+ITER EQU 10 ; number of iterations
+OVERHEAD EQU 15 ; 15 for PPlain, 17 for PMMX
+
+RDTSC MACRO ; define RDTSC instruction
+ DB 0FH,31H
+ENDM
+;************ Data segment: ********************
+.DATA ; data segment
+ALIGN 4
+COUNTER DD 0 ; loop counter
+TICS DD 0 ; temporary storage of clock
+RESULTLIST DD ITER DUP (0) ; list of test results
+;************ Code segment: ********************
+.CODE ; code segment
+BEGIN: MOV [COUNTER],0 ; reset loop counter
+TESTLOOP: ; test loop
+;************ Do any initializations here: ********************
+ FINIT
+;************ End of initializations ********************
+ RDTSC ; read clock counter
+ MOV [TICS],EAX ; save count
+ CLD ; non-pairable filler
+REPT 8
+ NOP ; eight NOP's to avoid shadowing effect
+ENDM
+
+;************ Put instructions to test here: ********************
+ FLDPI ; this is only an example
+ FSQRT
+ RCR EBX,10
+ FSTP ST
+;***************** End of instructions to test ********************
+
+ CLC ; non-pairable filler with shadow
+ RDTSC ; read counter again
+ SUB EAX,[TICS] ; compute difference
+ SUB EAX,OVERHEAD ; subtract clocks used by fillers etc.
+ MOV EDX,[COUNTER] ; loop counter
+ MOV [RESULTLIST][EDX],EAX ; store result in table
+ ADD EDX,TYPE RESULTLIST ; increment counter
+ MOV [COUNTER],EDX ; store counter
+ CMP EDX,ITER * (TYPE RESULTLIST)
+ JB TESTLOOP ; repeat ITER times
+
+; insert here code to read out the values in RESULTLIST</pre>
+<p>
+The 'filler' instructions before and after the piece of code to test are are
+included in order to get consistent results on the PPlain. The <kbd>CLD</kbd>
+is a non-pairable instruction which has been inserted to make sure the pairing
+is the same the first time as the subsequent times. The
+eight <kbd>NOP</kbd> instructions are inserted to prevent any prefixes in the
+code to test to be decoded in the shadow of the preceding instructions on
+the PPlain. Single byte instructions are used here to obtain the same pairing
+the first time as the subsequent times. The <kbd>CLC</kbd> after the
+code to test is a non-pairable instruction which has a shadow under which
+the <kbd>0FH</kbd> prefix of the <kbd>RDTSC</kbd> can be decoded so that
+it is independent of any shadowing effect from the code
+to test on the PPlain.
+<p>
+On The PMMX you may want to insert <kbd>XOR EAX,EAX / CPUID</kbd>
+before the instructions to test if you want the FIFO instruction buffer
+to be empty, or some time-consuming instruction
+(f.ex. <kbd>CLI</kbd> or <kbd>AAD</kbd>) if you want the FIFO buffer to
+be full (<kbd>CPUID</kbd> has no shadow under which
+prefixes of subsequent instructions can decode).
+<p>
+On the PPro, PII and PIII you have to insert <kbd>XOR EAX,EAX / CPUID</kbd>
+before and after each <kbd>RDTSC</kbd> to prevent it from executing
+in parallel with anything else, and remove the filler
+instructions. (<kbd>CPUID</kbd> is a serializing instruction which means
+that it flushes the pipeline and waits for all pending operations to
+finish before proceeding. This is useful for testing purposes.)
+<p>
+The <kbd>RDTSC</kbd> instruction cannot execute in virtual mode on the
+PPlain and PMMX, so if you are running DOS programs you must run
+in real mode. (Press F8 while booting and select
+"safe mode command prompt only" or "bypass startup files").
+<p>
+The complete test program is available from <a href="http://www.agner.org/assem/">www.agner.org/assem/</a>.
+<p>
+The Pentium processors have special performance monitor counters which can count
+events such as cache misses, misalignments, various stalls, etc. Details about how to use the
+performance monitor counters are not covered by this manual but can be found in
+"Intel Architecture Software Developer's Manual", vol. 3, Appendix A.
+<p>
+<h2><a name="31">31</a>. Comparison of the different microprocessors</h2><p>
+The following table summarizes some important differences between the microprocessors in
+the Pentium family:
+<p>
+
+<table border=1 cellpadding=4 cellspacing=1>
+<tr><td>&nbsp;</td>
+<td class="a3">&nbsp;PPlain&nbsp;</td>
+<td class="a3">&nbsp;PMMX&nbsp;</td>
+<td class="a3">&nbsp;PPro&nbsp;</td>
+<td class="a3">&nbsp;PII&nbsp;</td>
+<td class="a3">&nbsp;PIII&nbsp;</td>
+</tr><tr>
+<td>code cache, kb</td>
+<td>8</td>
+<td>16</td>
+<td>8</td>
+<td>16</td>
+<td>16</td>
+</tr><tr>
+<td>data cache, kb</td>
+<td>8</td>
+<td>16</td>
+<td>8</td>
+<td>16</td>
+<td>16</td>
+</tr><tr>
+<td>built in level 2 cache, kb</td>
+<td>0</td>
+<td>0</td>
+<td>256</td>
+<td>512 *)</td>
+<td>512 *)</td></tr>
+<tr>
+<td>MMX instructions</td>
+<td>no</td>
+<td>yes</td>
+<td>no</td>
+<td>yes</td>
+<td>yes</td></tr>
+<tr>
+<td>XMM instructions</td>
+<td>no</td>
+<td>no</td>
+<td>no</td>
+<td>no</td>
+<td>yes</td></tr>
+<tr>
+<td>conditional move instructruct.</td>
+<td>no</td>
+<td>no</td>
+<td>yes</td>
+<td>yes</td>
+<td>yes</td>
+</tr><tr>
+<td>out of order execution</td>
+<td>no</td>
+<td>no</td>
+<td>yes</td>
+<td>yes</td>
+<td>yes</td>
+</tr><tr>
+<td>branch prediction</td>
+<td>poor</td>
+<td>good</td>
+<td>good</td>
+<td>good</td>
+<td>good</td>
+</tr><tr>
+<td>branch target buffer entries</td>
+<td>256</td>
+<td>256</td>
+<td>512</td>
+<td>512</td>
+<td>512</td>
+</tr><tr>
+<td>return stack buffer size</td>
+<td>0</td>
+<td>4</td>
+<td>16</td>
+<td>16</td>
+<td>16</td>
+</tr><tr>
+<td>branch misprediction penalty</td>
+<td>3-4</td>
+<td>4-5</td>
+<td>10-20</td>
+<td>10-20</td>
+<td>10-20</td>
+</tr><tr>
+<td>partial register stall</td>
+<td>0</td>
+<td>0</td>
+<td>5</td>
+<td>5</td>
+<td>5</td>
+</tr><tr>
+<td>FMUL latency</td>
+<td>3</td>
+<td>3</td>
+<td>5</td>
+<td>5</td>
+<td>5</td>
+</tr><tr>
+<td>FMUL throughput</td>
+<td>1/2</td>
+<td>1/2</td>
+<td>1/2</td>
+<td>1/2</td>
+<td>1/2</td>
+</tr><tr>
+<td>IMUL latency</td>
+<td>9</td>
+<td>9</td>
+<td>4</td>
+<td>4</td>
+<td>4</td>
+</tr><tr>
+<td>IMUL throughput</td>
+<td>1/9</td>
+<td>1/9</td>
+<td>1/1</td>
+<td>1/1</td>
+<td>1/1</td>
+</tr></table>
+<p>*) Celeron: 0-128, Xeon: 512 or more, many other variants available.
+On some versions the level 2 cache runs at half speed.
+<p>
+<u>Comments to the table:</u><br>
+Code cache size is important if the critical part of your program is not limited to a small
+memory space.
+<p>
+Data cache size is important for all programs that handle more than small amounts of data
+in the critical part.
+<p>
+MMX and XMM instructions are useful for programs that handle massively parallel
+data, such as sound and image processing. In other applications it may not be
+possible to take advantage of the MMX and XMM instructions.
+<p>
+Conditional move instructructions are useful for avoiding poorly predictable conditional
+jumps.
+<p>
+Out of order execution improves performance, especially on non-optimized code. It includes
+automatic instruction reordering and register renaming.
+<p>
+Processors with a good branch prediction method can predict simple repetitive patterns. A
+good branch prediction is most important if the branch misprediction penalty is high.
+<p>
+A return stack buffer improves prediction of return instructions when a subroutine is called
+alternatingly from different locations.
+<p>
+Partial register stalls make handling of mixed data sizes (8, 16, 32 bit) more difficult.
+<p>
+The latency of a multiplication instruction is the time it takes in a dependency chain. A
+throughput of 1/2 means that the execution can be pipelined so that a new multiplication
+can begin every second clock cycle. This defines the speed for handling parallel data.
+<p>
+Most of the optimizations described in this document have little or no negative effects on
+other microprocessors, including non-Intel processors, but there are some problems to be
+aware of.
+<p>
+Scheduling floating point code for the PPlain and PMMX often requires a lot of
+extra <kbd>FXCH</kbd> instructions. This will slow down execution on older microprocessors, but not on the
+Pentium family and advanced non-Intel processors.
+<p>
+Taking advantage of the MMX instructions in the PMMX, PII and PIII processors or the
+conditional moves in the PPro, PII and PIII will create problems if you want your code to be
+compatible with earlier microprocessors. The solution may be to write several versions of
+your code, each optimized for a particular processor. Your program should detect which
+processor it is running on and select the appropriate version of code
+(chapter <a href="#27_10">27.10</a>).
+<p>
+</body>
+</html>
+
diff --git a/programs/testsuites b/programs/testsuites
new file mode 100644
index 0000000..dce0c2e
--- /dev/null
+++ b/programs/testsuites
@@ -0,0 +1,2 @@
+http://www.fortunecity.de/wolkenkratzer/apple/28/chess.html
+
diff --git a/programs/uniacke.ps b/programs/uniacke.ps
new file mode 100644
index 0000000..63abc46
--- /dev/null
+++ b/programs/uniacke.ps
@@ -0,0 +1,12175 @@
+%!PS-Adobe-2.0
+%%Creator: dvips 5.512 Copyright 1986, 1993 Radical Eye Software
+%%Title: uniacke.dvi
+%%CreationDate: Thu May 18 00:16:31 1995
+%%Pages: 238
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%EndComments
+%DVIPSCommandLine: dvips -o uniacke.ps uniacke
+%DVIPSSource: TeX output 1995.05.18:0011
+%%BeginProcSet: tex.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}
+B /TR{translate}N /isls false N /vsize 11 72 mul N /@rigin{isls{[0 -1 1 0 0 0]
+concat}if 72 Resolution div 72 VResolution div neg scale isls{Resolution hsize
+-72 div mul 0 TR}if Resolution VResolution vsize -72 div 1 add mul TR matrix
+currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put
+setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed
+true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N
+/IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix
+fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{
+CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn
+put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0
+0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data
+dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128
+ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127
+sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type
+/stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N
+/cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get
+S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height
+sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0
+-1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{/cc X dup
+type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1
+ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}
+B /I{cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add
+.99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage userdict
+/eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook}
+if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255
+{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76
+div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N
+/ruley 0 N /v{/ruley X /rulex X V}B /V{}B /RV statusdict begin /product where{
+pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4
+getinterval(NeXT)eq or}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1
+TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1
+-.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{
+gsave transform round exch round exch itransform moveto rulex 0 rlineto 0
+ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N
+/tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
+B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 M}B
+/w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 w}B /r{
+p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save
+N}B /eos{SS restore}B end
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 300 300
+(/home/a2/edf/jcw/uni/uniacke.dvi) @start /Fa 1 42 df<000000600000000000600000
+0000003000000000001800000000001800000000000C0000000000060000000000030000FFFFFF
+FF8000FFFFFFFFC000000000007000000000001C00000000000F800000000003E0000000000780
+000000001E00000000003800000000006000FFFFFFFFC000FFFFFFFF8000000000070000000000
+0600000000000C0000000000180000000000300000000000300000000000600000000000600000
+2B1C7D9932>41 D E /Fb 2 13 df<07C0000C3040101040201880601880C00C80C00D00C00E00
+800E00800C00C01C00C02C0060C4803F0300120E7E8D17>11 D<000F0000308000C0C000804001
+00600200C00400C0040080040180083F00083E0008010008018010018010018010018010018030
+0300300300300600280C0044180043E000400000400000800000800000800000800000131D7F96
+14>I E /Fc 1 81 df<FFFFFFFFE0FFFFFFFFF07000001FF078000001F03C000000781C000000
+180E0000000C0F000000040700000004038000000203C000000001E000000000E0000000007000
+000000780000000038000000001C000000001E000000000F000000000700000000038000000003
+800000000300000000070000000006000000000C00000000180000000038000000003000000000
+6000000000C000000001C00000000180000002030000000406000000040E0000000C0C00000018
+180000007830000001F07000001FF07FFFFFFFF0FFFFFFFFE0272A7E7F2C>80
+D E /Fd 2 2 df<FFFFC0FFFFC012027D871A>0 D<40E04003037D880A>I
+E /Fe 33 121 df<40E06020202040408003097D820A>59 D<00200060006000C000C000C00180
+01800180030003000300060006000C000C000C00180018001800300030003000600060006000C0
+00C000C0000B1D7E9511>61 D<07FFE000E03801C01801C01C01C01C01C01C0380380380700380
+E003FFC00700E00700700700300700380E00700E00700E00E00E00E01C0380FFFE0016147F9319
+>66 D<003F0800C0980300700600300C0030180030380020700000700000700000E00000E00000
+E00000E000406000806000803001003002000C1C0007E00015147E9318>I<07FFFC00E01C01C0
+0C01C00C01C00C01C00803820803820003820003FE000704000704000704000700000E00000E00
+000E00000E00001C0000FFC00016147F9315>70 D<07FC1FC000E0060001C0080001C0100001C0
+600001C080000381000003860000038E0000039E0000076700000787000007038000070380000E
+01C0000E01C0000E00E0000E00E0001C00F000FF83FC001A147F931C>75
+D<07FE0000E00001C00001C00001C00001C0000380000380000380000380000700000700000700
+000700200E00400E00400E00800E01801C0780FFFF0013147F9317>I<003F0001C1C003006006
+00700C0030180038380038700038700038700038E00070E00070E00070E000E0E000C06001C070
+03803806001C1C0007E00015147E9319>79 D<07FFE000E07001C01801C01C01C01C01C01C0380
+380380380380700381C007FF000700000700000700000E00000E00000E00000E00001C0000FF80
+0016147F9315>I<07FFC000E07001C01801C01C01C01C01C01C0380380380700380C003FF0007
+03C00701C00700E00700E00E01C00E01C00E01C00E01C21C01C4FF807817147F9319>82
+D<00F8800305800603000401000C01000C01000C00000E00000FE00007F80001FC00001C00000E
+00000E00400C00400C00400800601800D020008FC00011147E9314>I<1FFFF8381C1820381820
+380840380840381080701000700000700000700000E00000E00000E00000E00001C00001C00001
+C00001C0000380003FF8001514809314>I<FF1FE0FC3803803038038020380780403807804038
+0B8080380B818038138100383382003C2382001C43C4001C41CC001C81C8001D81D0001D01D000
+1E01E0001E01E0001C01C0001C018000180180001E147E931F>87 D<07B00C7010703060606060
+606060C0C0C0C8C0C841C862D03C700D0D7E8C12>97 D<7C000C00180018001800180030003700
+388030C060C060C060C060C0C180C180C1004300660038000A147E930F>I<07800C4010E031C0
+600060006000C000C0004020404021801E000B0D7E8C0F>I<007C000C00180018001800180030
+07B00C7010703060606060606060C0C0C0C8C0C841C862D03C700E147E9311>I<07800C401020
+304060407F8060004000C0004020604021801E000B0D7E8C10>I<0038006C007C004C00C000C0
+00C007F800C001800180018001800180030003000300030003000300060006006600E400C80070
+000E1A7F9310>I<01D8023804380C3018301830183030603060306010E019C00EC000C000C061
+80E180C3007C000D137F8C10>I<3E0006000C000C000C000C00180019E01E3018303830303030
+3030306060606460C460C4C0C8C0700E147E9313>I<06070600000000384C4C8C981818303262
+62643808147F930C>I<3E0006000C000C000C000C001800187018B819383230340038003E0063
+00631063106310C320C1C00D147E9312>107 D<7C0C181818183030303060606060C0D0D0D0D0
+6006147E930A>I<30F87C00590C86004E0D06009C0E0600980C0600180C0600180C060030180C
+0030180C8030181880301818806030190060300E00190D7F8C1D>I<30F8590C4E0C9C0C980C18
+0C180C30183019303130316032601C100D7F8C15>I<03800C6018203030603060306030C060C0
+6040C0608023001E000C0D7E8C10>I<0C78168C130426062606060606060C0C0C0C0C080C101A
+2019C018001800300030003000FC000F13818C11>I<072008E010E030C060C060C060C0C180C1
+80C180438067003B00030003000600060006003F800B137E8C0F>I<31E05A704C709C60980018
+0018003000300030003000600060000C0D7F8C0F>I<0700188019C0318038001E000F00038041
+80E180C10082007C000A0D7E8C10>I<02000600060006000C00FF800C000C0018001800180018
+00300031003100320032001C0009127F910D>I<0E3C13CE238E430C43000300030006000608C6
+08E610CA2071C00F0D7F8C13>120 D E /Ff 15 107 df<FFFFFF80FFFFFF8019027D8A20>0
+D<60F0F06004047C8B0C>I<000400000006000000060000000600000006000000060000000600
+00000600000006000000060000000600000006000000060000FFFFFFE0FFFFFFE0000600000006
+0000000600000006000000060000000600000006000000060000000600000006000000060000FF
+FFFFE0FFFFFFE01B1C7E9A20>6 D<03C00FF01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFF7FFE7FFE
+3FFC1FF80FF003C010107E9115>15 D<000001800000078000001E00000078000001E000000780
+00001E00000078000001E00000078000001E00000078000000E0000000780000001E0000000780
+000001E0000000780000001E0000000780000001E0000000780000001E00000007800000018000
+0000000000000000000000000000000000000000000000000000007FFFFF00FFFFFF8019227D99
+20>20 D<C0000000F00000003C0000000F00000003C0000000F00000003C0000000F00000003C0
+000000F00000003C0000000F000000038000000F0000003C000000F0000003C000000F0000003C
+000000F0000003C000000F0000003C00000070000000C000000000000000000000000000000000
+0000000000000000000000000000007FFFFF00FFFFFF8019227D9920>I<07C000201FE000203F
+F80020783C0060E01F00E0C00783C08003FF808000FF0080007C000000000007C000201FE00020
+3FF80020783C0060E01F00E0C00783C08003FF808000FF0080007C001B137E9320>25
+D<01000300030007800B4013206318830403000300030003000300030003000300030003000300
+0300030003000300030003000300030003000300030003000300030003000300030003000E257D
+9C15>34 D<07E0003F000FF800F180183E018040200F03002040078400104003CC00108001D800
+088000F000088000F00008800078000880007800088000DC000840019E001040010F0010200607
+8020100C03E0C00C7800FF8007E0003F0025127E912A>49 D<007FF801FFF80780000E00001800
+00300000300000600000600000C00000C00000C00000FFFFF8FFFFF8C00000C00000C000006000
+006000003000003000001800000E000007800001FFF8007FF8151A7D961C>I<400004C0000C60
+00186000186000183000303000303000301800601800601FFFE00FFFC00C00C00C00C006018006
+018003030003030003030001860001860001860000CC0000CC0000CC0000780000780000780000
+3000003000161E809C17>56 D<400002C00006C00006C00006C00006C00006C00006C00006C000
+06C00006C00006C00006C00006C00006C00006C00006C00006C00006C0000660000C60000C3000
+181C00700F01E003FF8000FE00171A7E981C>91 D<003C00E001C0018003800380038003800380
+03800380038003800380038003800380030007001C00F0001C0007000300038003800380038003
+8003800380038003800380038003800380018001C000E0003C0E297D9E15>102
+D<F0001C00070003000380038003800380038003800380038003800380038003800380018001C0
+00E0003C00E001C001800380038003800380038003800380038003800380038003800380030007
+001C00F0000E297D9E15>I<C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0
+C0C0C0C0C0C0C0C0C0C0C0C0C0C002297B9E0C>106 D E /Fg 26 116 df<000101808053>48
+D<C000000000000000000000004020080402010040201000804010080402008040200100802010
+080401008040020100402010080201008004020080402010040201000804010080402008040200
+100802010080401008040020100402010080201008004020080402F90040201000004010080506
+0080402010008020100A0201008040200100402012020201008040020080402202040201008004
+01008042020804020100080201008202100804020010040201010420100804002008040201F840
+201008004010080402508040201000002010080489008040201000402010090601008040200080
+4020160302010080400100804028008402010080020100807000680402010004020100C0001008
+0402000804020180000C1008040010080402000002201008002010080400000140201000402010
+080000008040200000402010002000408040100080402000200021008020010080400020001201
+0040020100C0002000140200800402018000200008040100080402800020000808020010080480
+07FF00081004002010090000200004200800402011000020000440100000402100002000048020
+100080410000200005004020010081000020000600804002010100000000040100800402010000
+000004020100080401800000000804020010080280000000080804002010044000000010100800
+402008400000001020100000401020000000204020100080201007FF004080402001004028F800
+F88100804002008047000007020100800401008400000104020100080201040000010804020010
+04020400000110080400200804040000012010080040100808000000C02010000020100807FF00
+80402010004020187800F0808040200080402980000C8100804001008056000003420100800201
+0098000000C402010004020106000003080402000804020180000C10080400100804027800F020
+1008002010080407FF80402010004020100805050080402000004020100A020100804010008040
+201C018201008020010081C0F0007C0E01004002017E7F000007F3F2008004038000000000000E
+0100080C0000002000000182001010000000D80000004400206000000306000000380040800003
+FE01FE00000800004007FC040201FF00101000A0382008040201E020200110C040100804021840
+400209008020100804048080040601004020100803010008040200804020100402001008040100
+804020080400201008020100804010080040201004020100802010000000000000000000000008
+555581D353>65 D<00000000F80000000000000001040000000000000002020000000000000002
+020000000000000002020000000000000002020000000000000002020000000000000001040000
+000000000000F80000000000000000500000000000000000880000000000000001040000000000
+000006030000000000000008008000000000000030006000000000000040001000000000000180
+000C00000000000200000200000000000400000100000000000800000080000000001000200040
+000000002000200020000000004000200010000000004000200010000000008000200008000000
+008000200008000000008007FF0008000000010000200004000000010000200004000000010000
+200004000000010000200004000000010000200004000000010000000004000000010000000004
+000000008000000008000000008000000008000000004000000010000000004000000010000000
+002000000020000000001007FF00400000000008F800F880000000000700000700000000000400
+000100000000000400000100000000000400000100000000000400000100000000000800000080
+000000000807FF008000000000087800F080000000000980000C80000000001600000340000000
+0018000000C0000000000600000300000000000180000C0000000000007800F000000000000007
+FF000000000000000104000000000000000202000000000000000C0180000000000180F000780C
+0000007E7F000007F3F000038000000000000E000C000000200000018010000000D80000004060
+0000030600000030800003FC01FE0000084007FC000001FF001020380000000000E02010C00000
+0000001840090000000000000480060000000000000300454779CA53>I<C00000000000000000
+000000402008040201004020100080401008040200804020010080201018040100804002010040
+20300802010080040200804030100402010008040100807020080402001008020100B040100804
+00201004020FFF8020100800402008040FFF804020100000401008043200804020100080201008
+340100804020010040201038020100804002008040203004020100800401008040300804020100
+08020100807010080402001004020100B020100804002008040201F84020100800401008040304
+80402010000020100806030080402010004020100C010100804020008040201401020100804001
+00804028008402010080020100804800880402010004020100880090080402000807FE010800A0
+11FE0400100C03820800C02E018800202000640800807000300040400018080080C00010000080
+000408008100000810018000030401060000042001000000940108000004400300000064011000
+00048006000000240120000003000A00000012024000000200120000000A028000000200220000
+000603000000020042000000070500000002000200000003060000000210010000000104000000
+042001000000018C00000004400280000000880000000880048000000088000000090008400000
+008800000012001020000000500000002400202000000050000000280040300000005000000050
+00004800000070000000A010008400000070000001402001040000002000000180400202000000
+2000000300800401000000200000060100080300007FFFF0000402001004803F80000FE0080400
+200887C00000001F0808004010780000000000F010000020400000000000102010004040000000
+000010402000804000000000001080400100C00000000000110080020120003FFFE00022010004
+02200FC0001F80240200080420F000000078280400100827000000000730080020103800000000
+00E010004020200000000000202000004020001FFFC00020401000806007E0003F002080200100
+A078000000F0210040020143800000000E12008004025C0000000001D401000804600000000000
+380200100830000000000070040020100C0000000001A00800402013C00000001E401000004020
+3E000003E080201000804021FFFFFE010040200100804010080402008040020100802010080401
+008004020100402010080201000804020080402010040200100804010080402008040020100802
+0100804010080040201004020100802010000000000000000000000008555581D353>74
+D<00000000040000000000000000000C0000000000000000000C0000000000000000000C000000
+0000000000000C000000000000000003FFE00000000000000003FFE000000000000000000C0000
+000000000000000C0000000000000000000C0000000000000000000C0000000000000000000C00
+00000000000000000C0000000000000000000C0000000000000000003E00000000000000000045
+000000000000000000808000000000000000010040000000000000000100400000000000000002
+002000000000000000020020000000000000000200200000000000FF00020020007F80000300E0
+020020038060000800180200200C00080010000602002030000400200001020020400002004000
+00C100418000010040000021004200000100400000110044000001008000000900480000008080
+0000048090000000808000000280A0000000808000000180C00000008080000001414000000080
+80000000C180000000804000000041000000010040000000630000000100200000002200000002
+002000000022000000020010000000220000000400080000001400000008000800000014000000
+080004000000140000001000020000001C0000002000010000001C000000400001000000080000
+00400000800000080000008000004000000800000100000040001FFFFC0001000000200FE00003
+F80200000021F000000007C20000001E00000000003C0000001000000000000400000010000000
+000004000000100000000000040000001000000000000400000008000FFFF800080000000803F0
+0007E008000000083C0000001E0800000009C000000001C80000000E0000000000380000000800
+0000000008000000080007FFF000080000000801F8000FC008000000081E0000003C0800000010
+E00000000384000000170000000000740000001800000000000C0000000C000000000018000000
+0300000000006000000000F00000000780000000000F800000F80000000000007FFFFF00000000
+494A7BD053>I<C000000000000000000000004020080402010040201000804010080402008040
+200100802010F8040100804002010040210408020100800402008042021004020100080407C082
+02201F040200100808210202402088040020101012020280405008004020101402030040601000
+00401018050600C04020100080301008FC0140404020010050101058024040804007C090102050
+0440411F800821082040500820822080101207C08050101F044040101403410088201408404030
+18052201884024104040501009240288806420404010101128048900A440405008202110088A01
+448060A007C04110108C0245009F400140811021040446011480032101084104088402250004A2
+010881041084042A000894020901042082084C00109806060104410210480020880A0401048102
+20880040881204020301024088000084220206020202810810008442020A020203010820018482
+02120206020108400243020122020C02021080044202014202140206110008410201840124020C
+1200104106008401480214140020408A0084018802281800404092008401080248100000406200
+4401100290101000C0420048009003101020012022003800A002202040022022002800A0022020
+80042012002820A0024021000820140018D8C00140220010200C181B06C0C180240020200C27FC
+01FF21802800402005C00000001D0030000061FE0000000003FC20100092000000000000024020
+011C00000000000001C04002100000000000000040800408000000000000008100080800000000
+0000008200100400003FFFE000010400200A0007C0001F0002080040110078000000F004100000
+2083800000000E0820100040980000000000C8402000806000000000003080400100C000000000
+001100800201200000000000220100040220001FFFC00024020008041003E0003E004804001008
+103C000001E0500800201009C00000001CA0100040201E0000000003C020000040280000000000
+80401000804800000000008080200100900000000000410040020110003FFFE000420080040220
+1FC0001FC0240100080421E00000003C28020010082E0000000003B00400201070000000000070
+0800402030000000000060100000402E0000000003802010008041E00000003D0040200100805F
+FFFFFFC20080400201008020100804010080040201004020100802010008040200804020100402
+001008040100804020080400201008020100804010080040201004020100802010000000000000
+000000000008555581D353>I<C000000000000000000000004020080402010040201000804010
+080402008040200100802010080401008040020100402010080201008004020080402010040201
+0008040100824020080402001008060106804010080400201005820900802010080040200C4411
+01004020100000401238208200804020100080220C408401008040200100420240880201008040
+0200820180500402010080040102060060080402010008020238003FF008040200100402C00000
+0E1008040020080700000001A010080040100A0000000060201000002014000000001840201000
+4028000000000480402000805000000000030080400100A0000000000101008002014000000000
+008201000402800000000000440200080500E000000000280400100901C0000000003008002011
+03C0000000001010004021038000000000102000004107000000000008401000810E0000000000
+088020010108000000000005004002010000000400000600800402000000020000020100080600
+0000040000020200100A0000000400000104002014000000040000010800402400000004000001
+1000004800000008000000A010009000000008000000C020011000000010000000804002200000
+006000000040800440000000E0000000410008400000036000000042001080000004A000000044
+00208000001920000000280041000000E220000000300001000003042000000020100118000408
+200000002020023C001810200000001040027C0020204000000010800678004040400000001100
+0A700080804000000012001240008100C000000014002100010201800000000800410041040280
+00000008000080420805000000000810004084100A00000000082000B104201200000000084001
+0E08402400000000088002011080480000000005000402E1009000000000060008040201200000
+000004001008040240000000000400201008048000000000040040201009000000000004000040
+201200000000000410008040240000000000042001008048000000000004400201008800000000
+000480040201100000000000050008040210000000000002001008042000000000000200201008
+200000000000020040201020000000000002000040202000000000000210008040200000000000
+02200100807FFFFFFFFFFFFE400201008020100804010080040201004020100802010008040200
+804020100402001008040100804020080400201008020100804010080040201004020100802010
+000000000000000000000008555581D353>I<0000000080000000000000018001800000000000
+000160024000000000000001100440000000000000008C08200000000000000083102000000000
+0000008090200000000000000080601000000000000000818010000000000000008E000FFC0000
+00000000B0000003800000000000C0000000600000000000800000001800000000010000000006
+000000000200000000010000000004000000000080000000080000000000400000001000000000
+002000000020000000000010000000403800000000080000004070000000000800000040F00000
+00000400000040E0000000000400000041C0000000000200000043800000000002000000420000
+000000010000004000000100000100000080000000800000800000800000010000008000008000
+000100000040000100000001000000400001000000010000004000020000000200000020000400
+000002000000200004000000040000002000080000001800000010001000000038000000100010
+000000C80000001000200000010800000010002000000608000000080040000038080000000800
+400000C0080000000800460001000800000008008F0006000800000004009F0008001000000004
+009E0010001000000004009C002000100000000400900020001000000004004000400020000000
+02004010400020000000020020108000400000000200102100008000000002000C410000800000
+000200038200010000000002000044000200000000010000380004000000000100000000080000
+000001000000001000000000010000000020000000000100000000400000000001000000008000
+000000010000000100000000000100000002000000000001000000020000000000010000000400
+000000000100000004000000000000800000080000000000008000000800000000000080000008
+00000000000080000008000000000000800000080000000000008000000FFFFFFFFFFFFF804948
+7BCD53>I<C0000000000000000000000040200804020100402010008040100804020080402001
+008020100804010080400201004020100802010080040200804020100402010008040100804020
+08040200100802010080401008040020100402010080201008004020080403FD00402010000040
+100806030080402010008020100800810080402001004020100042010080400200804030004402
+010080040100806000280402010008020100A00030080402001004020120002010080400200804
+022000202010080040100804200020402010000020100810004080402010004020101000410080
+402000804020180082010080400100804024010402010080020100804F07880402010004020100
+B000700804020008040201C0001810080400100804030000042010080020100806000002402010
+004020100C00000180402000004020140000010080401000804028000000810080200100804800
+000082010040020100900000004402008004020110000000480401000804021000000050080200
+100804100000006010040020100810000000402008004020101000000040401000004020080000
+008080201000804018000000810040200100802400000102008040020100440000010401008004
+02008200000208020100080401010000041004020010080201C000182008040020100402200020
+4010080040200804C00018802010000040100B0000070040201000802014000001008040200100
+4038000000C10080400200806000000022010080040100C0000000140201000802018000000008
+0402001004030000000004080400200806000000000210080040100A0000000002201000002014
+000000000140201000402800000000008040200080480000000000808040010090000000000041
+008002011000000000004201000402200000000000240200080420000000000028040010082000
+000000003008002010200000000000201000402040000000000010200000404000000000001040
+1000804000000000001080200100C0000000000011004002014000000000001200800402400000
+000000140100080440000000000018020010084000000000001004002010400000000000100800
+402040000000000010100000403FFFFFFFFFFFE020100080402008040201004020010080401008
+040200804002010080201008040100800402010040201008020100080402008040201004020010
+080401008040200804002010080201008040100800402010040201008020100000000000000000
+00000008555581D353>I<000003F800000000000C060000000000100100000000002000800000
+000020008000000000400040000000004000400000000040004000000000400040000000004000
+4000000000200080000000002000800000000010010000000000080200000000001E0F00000000
+006000C00000000180003000000002000008000000040000040000000800000200000008000002
+000000100000010000001000000100000020000000800000200000008000002000000080000020
+000000800000200000008000002000000080000010000001000000100000010000000800000200
+000008000002000000040000040000000200000800000001800030000000004000400000000180
+00300000000600000C000000080000020000003000000180000040000000400000800000002000
+010000000010000200000000080004000000000400040000000004000800000000020010000000
+000100100000000001002000000000008020000000000080400000000000404000000000004040
+000000000040400000000000408000000000002080000000000020800000000000208000000000
+002080000000000020800000000000208000000000002080000000000020800000000000208000
+00000000207FFFFFFFFFFFC0334370CA53>I<0000000007C00000000000000000082000000000
+0000000010100000000000003E00101000F8000000004100101001040000000080801010020200
+0000008080101002020000000080800820020200000000808007C0020200000000808002800202
+00003E0080800280020200F84100410002800104010480803E00028000F8020280800A00044000
+A00202808009000440012002028080090004400120020280800900044001200202410008800440
+022001043E0008800440022000F80A0008800820022000A0090008400820042001200500084008
+200420014004801040082004100240048010200820081002400440102008200810044004401020
+101008100440042010101010101008400420101010101010084004201010101010100840021010
+081010201010800210100810102010108002081008200820102080020810042008401020800204
+100420084010408002041004200840104080020210022008801080800202100240048010808001
+01100140050011010001011001400500110100010090014105001201000100A000C6C6000A0100
+010060C0D836060C01000100613FE00FF90C010001002E00000000E80100010FF0000000001FE1
+000090000000000000120000E00000000000000E00008000000000000002000040000000000000
+04000040000000000000040000200001FFFF000008000010003E0000F8001000000803C0000007
+80200000041C000000007040000004C00000000006400000030000000000018000000200000000
+000080000001000000000001000000010000FFFE000100000000801F0001F0020000000081E000
+000F02000000004E00000000E40000000070000000001C00000000400000000004000000004000
+0000000400000000800000000002000000008001FFFF00020000000100FE0000FE01000000010F
+00000001E10000000170000000001D000000038000000000038000000180000000000300000000
+70000000001C000000000F00000001E00000000000FFFFFFFE0000004F4B7ED053>I<1FF807FF
+C03FF010080400402010100804004020101008040040201010080400402010100FFC007FE01010
+000000000010100000000000101000000000001010000000000010100000000000101FFFFFFFFF
+FFF008000000000020040000000000400300000000018000800000000200004000000004000030
+0000001800001FFFFFFFF000001000000010000010000000100000100000001000001000000010
+000010000000100000100000001000001000000010000010000000100000100000001000001000
+000010000010000000100000100000001000001000000010000010000000100000100000001000
+001000000010000010000000100000100000001000001000000010000010000000100000100000
+0010000010000000100000100000001000001FFFFFFFF000002000000008000040000000080000
+800000000400008000000002000100000000010002000000000080040000000000400FFFFFFFFF
+FFE008000000000020080000000000200800000000002008000000000020080000000000200800
+0000000020FFFFFFFFFFFFFE800000000000028000000000000280000000000002800000000000
+0280000000000002FFFFFFFFFFFFFE374072C753>I<C000000000000000000000004020080402
+010040201000804010080402008040200100802010080401008040020100402010080201008004
+020080402010040201000804010080402008040200100802010080401008040020100402010080
+201008004020080402010040201000004010080402008040201000802010080401008040200100
+7FF01FFF827FE080400200A0102800844021008004012010480088402201000802201088009040
+240200100420110800A0402804002008201FF800FFC03008004010200000000000201000002020
+0000000000202010004020000000000020402000806000000000002080400100A0000000000021
+008002013FFFFFFFFFFFE201000402100000000000440200080408000000000088040010080600
+000000031008002010090000000004201000402010800000000840200000402060000000308040
+100080403FFFFFFFE10080200100806000000022010040020100A0000000240200800402012000
+000028040100080402200000003008020010080420000000201004002010082000000020200800
+402010200000002040100000402020000000208020100080402000000021004020010080200000
+00220080400201006000000024010080040200A000000028020100080401200000003004020010
+080220000000200804002010042000000020100800402008200000002020100000401020000000
+204020100080202000000020804020010040200000002100804002008060000000220100800401
+00A000000024020100080201200000002804020010040220000000300804002008043FFFFFFFE0
+100800401008400000001020100000201080000000104020100040210000000008804020008041
+000000000500804001008200000000020100800201040000000001020100040208000000000084
+020008041FFFFFFFFFFFC804001008100000000000500800201010000000000060100040201000
+000000004020000040300000000000404010008050000000000040802001009000000000004100
+400201FFFFFFFFFFFFFE0080040300000000000004010008050000000000000402001009000000
+000000040400201100000000000004080040210000000000000410000041FFFFFFFFFFFFFC2010
+008040200804020100402001008040100804020080400201008020100804010080040201004020
+100802010008040200804020100402001008040100804020080400201008020100804010080040
+201004020100802010000000000000000000000008555581D353>I<C000000000000000000000
+004020080402010040201000804010080402008040200100802010080401008040020100402010
+080201008004020080402010040201000804010080402008040200100802010080401008040020
+100402010080201008004020080402010040201000004010080402008040201000802010080401
+008040200100402010080201008040020080402010040201008004010080402008040201000802
+010080401008040200100402010080201008040020080402010040201008004010080402008040
+201000002010080401008040201000402010080201008040200080402010040201008040010080
+402008040201008002010080401008040201000402010080201008040200080402010040201008
+040010080402008040201008002010080401008040201000402010080201008040200000402010
+040201008040100080402008040201008020010080401008040201004002010080201008040200
+800402010040201008040100080402008040201008020010080401008040201004002010080201
+008040200800402010040201008040100000402008040201008020100080401008040201004020
+010080201008040200804002010040201008040100800402008040201008020100080401008040
+201004020010080201008040200804002010040201008040100800402008040201008020100000
+401008040201004020100080201008040200804020010040201008040100804002008040201008
+020100800401008040201004020100080201008040200804020010040201008040100804002008
+040201008020100800401008040201004020100000201008040200804020100040201008040100
+804020008040201008020100804001008040201004020100800201008040200804020100040201
+008040100804020008040201008020100804001008040201004020100800201008040200804020
+100040201008040100804020000040201008020100804010008040201004020100802001008040
+200804020100400201008040100804020080040201008020100804010008040201004020100802
+001008040200804020100400201008040100804020080040201008020100804010000040201004
+020100802010008040200804020100402001008040100804020080400201008020100804010080
+040201004020100802010008040200804020100402001008040100804020080400201008020100
+804010080040201004020100802010000000000000000000000008555581D353>90
+D<C000000000000000000000004020080402010040201000804010080402008040200100802010
+080401008040020100402010080201008004020080402010040201000804010080402008040200
+100802010080401008040020100402010080201008004020080402F900402010000040100805FE
+0080402010008020100BFE01008040200100402013FE02010080400200804023FE040201008004
+01008043FE08040201000802010083FE10080402001004020101FC20100804002008040201F840
+2010080040100804022080402010000020100804F900804020100040201009FE01008040200080
+402013FE0201008040010080402FFF8402010080020100805FFFC80402010004020100FFFFF008
+04020008040201FFFFF81008040010080403FFFFFE2010080020100807FFFFFF40201000402010
+0FFFFFFF804020000040201FFFFFFFC08040100080403FFFCFFFE10080200100807FFFCFFFF201
+0040020100FFFFCFFFF4020080040201FFFFCFFFF8040100080402FFF800FFF8080200100804FF
+F800FFF8100400201009FFFFCFFFFC200800402011FFFFCFFFFC401000004021FFFFCFFFFC8020
+10008041FFFFCFFFFD004020010081FFFFFFFFFE008040020101FFFFFFFFFC010080040201FFFF
+FFFFFC020100080401FFFFFFFFF8040200100802FFFFFFFFF80804002010047FFFFFFFF0100800
+4020087FFFFFFFF02010000040103FFC01FFE04020100080201FC0001FC08040200100402F01FC
+0781008040020080471FFFC70201008004010083FFFFFE0402010008020103FFFFFE0804020010
+040207FFFFFF1008040020080407FFFFFF2010080040100807FFFFFF402010000020100FF800FF
+804020100040201FC0001F808040200080402F03FE07810080400100804C1FFFC1820100800201
+008C7FFFF18402010004020105FFFFFD0804020008040201FFFFFC10080400100804027FFFF020
+1008002010080407FF80402010004020100804F900804020000040201009FE0100804010008040
+2017FF0201008020010080403FFFC40201004002011FFFFFFFFFFFC200800403FFFFFFFFFFFFFC
+01000807FFFFFFFFFFFFFF0200100FFFFFFF8FFFFFFF8400203FFFFFFF03FFFFFFE800407FFFFF
+F2017FFFFFF000007FFE1004020103FFF01000BFE020080402013FE020011F8040100804020FC0
+40020F008020100804038080040601004020100803010008040200804020100402001008040100
+804020080400201008020100804010080040201004020100802010000000000000000000000008
+555581D353>97 D<00000001F00000000000000003F80000000000000007FC0000000000000007
+FC0000000000000007FC0000000000000007FC0000000000000007FC0000000000000003F80000
+000000000001F00000000000000000400000000000000001F00000000000000003F80000000000
+000007FC000000000000001FFF000000000000003FFF80000000000000FFFFE0000000000001FF
+FFF0000000000007FFFFFC00000000000FFFFFFE00000000001FFFFFFF00000000003FFFFFFF80
+000000007FFF9FFFC000000000FFFF9FFFE000000000FFFF9FFFE000000001FFFF9FFFF0000000
+01FFF001FFF000000001FFF001FFF000000003FFFF9FFFF800000003FFFF9FFFF800000003FFFF
+9FFFF800000003FFFF9FFFF800000003FFFFFFFFF800000003FFFFFFFFF800000003FFFFFFFFF8
+00000001FFFFFFFFF000000001FFFFFFFFF000000000FFFFFFFFE000000000FFFFFFFFE0000000
+007FF803FFC0000000003F80003F80000000001E03F80F00000000000E3FFF8E000000000007FF
+FFFC000000000007FFFFFC00000000000FFFFFFE00000000000FFFFFFE00000000000FFFFFFE00
+000000000FF001FE00000000001F80003F00000000001E07FC0F0000000000183FFF8300000000
+0018FFFFE300000000000BFFFFFA000000000003FFFFF8000000000000FFFFE00000000000000F
+FE0000000000000001F00000000000000003F8000000000000000FFE000000000000003FFF8000
+0000003FFFFFFFFFFF800003FFFFFFFFFFFFF8000FFFFFFFFFFFFFFE001FFFFFFF1FFFFFFF007F
+FFFFFC07FFFFFFC0FFFFFFE000FFFFFFE0FFFC0000000007FFE07FC000000000007FC03F000000
+0000001F801C0000000000000700080000000000000200434778CA53>I<C00000000000000000
+000000402008040201004020100080401008040200804020010080201018040100804002010040
+20300802010080040200804030100402010008040100807020080402001008020100B040100804
+00201004020FFF8020100800402008040FFF804020100000401008043200804020100080201008
+340100804020010040201038020100804002008040203004020100800401008040300804020100
+08020100807010080402001004020100B020100804002008040201F84020100800401008040304
+80402010000020100806030080402010004020100CF901008040200080402015FD020100804001
+00804029FC8402010080020100804BFE8804020100040201008BFE90080402000807FE010BFEA0
+11FE0400100C03820BFEC02E0188002023F8640BFE8070FE3000404FFE180BFE80C3FF9000009F
+FF840BFE810FFFC81001BFFFE305FD063FFFE420013FFFF095FD087FFFE440037FFFFC65FD11FF
+FFF480067FFFFE25FD23FFFFF3000A7FFFFF12FA47FFFFF200127FFFFF8AFA8FFFFFF200227FFF
+FFC6FB1FFFFFF200427FFFFFE7753FFFFFF200027FFFFFF3767FFFFFF210013FFFFFF1747FFFFF
+E420013FFFFFF9ACFFFFFFE440029FFFFFFCA9FFFFFFC880049FFFFFFC89FFFFFFC900084FFFFF
+FE8BFFFFFF92001027FFFFFE53FFFFFF24002027FFFFFE53FFFFFF28004033FFFFFF57FFFFFE50
+000049FFFFFF77FFFFFCA0100084FFFFFF77FFFFF940200104FFFFFF27FFFFF9804002027FFFFF
+27FFFFF3008004013FFC000001FFE6010008033F800000000FE40200100498001FFFC000C80400
+20088007FFFFFF000808004010607FFFFFFFF0301000002027FFFFFFFFFF20201000403FFFFFFF
+FFFFE0402000807FFFFFFFFFFFE080400100BFFFFFFFFFFFE1008002013FFFC0001FFFE2010004
+023FF00000007FE4020008043F001FFFC007E8040010083807FFFFFF00F008002010307FFFFFFF
+F0601000402033FFFFFFFFFE60200000403FFFC0001FFFE0401000807FF8000000FFE080200100
+BF801FFFC00FE1004002013C03FFFFFE01E200800402303FFFFFFFE0640100080421FFFFFFFFFC
+280200100807FFFFFFFFFF10040020100BFFFFFFFFFE2008004020103FFFFFFFE0401000004020
+11FFFFFD0080201000804020080402010040200100804010080402008040020100802010080401
+008004020100402010080201000804020080402010040200100804010080402008040020100802
+0100804010080040201004020100802010000000000000000000000008555581D353>106
+D<00000000040000000000000000000C0000000000000000000C0000000000000000000C000000
+0000000000000C000000000000000003FFE00000000000000003FFE000000000000000000C0000
+000000000000000C0000000000000000000C0000000000000000000C0000000000000000000C00
+00000000000000000C0000000000000000000C0000000000000000003E00000000000000000045
+000000000000000000808000000000000000013E4000000000000000017F400000000000000002
+7F200000000000000002FFA00000000000000002FFA00000000000FF0002FFA0007F80000300E0
+02FFA00380600008FE1802FFA00C3F880013FF8602FFA030FFE40027FFE102FFA043FFF2004FFF
+F8C17F418FFFF9004FFFFC217F421FFFF9005FFFFF117F447FFFFD009FFFFF897F48FFFFFC809F
+FFFFC4BE91FFFFFC809FFFFFE2BEA3FFFFFC809FFFFFF1BEC7FFFFFC809FFFFFF95D4FFFFFFC80
+9FFFFFFCDD9FFFFFFC804FFFFFFC5D1FFFFFF9004FFFFFFE6B3FFFFFF90027FFFFFF2A7FFFFFF2
+0027FFFFFF227FFFFFF20013FFFFFFA2FFFFFFE40009FFFFFF94FFFFFFC80009FFFFFF94FFFFFF
+C80004FFFFFFD5FFFFFF9000027FFFFFDDFFFFFF2000013FFFFFDDFFFFFE4000013FFFFFC9FFFF
+FE4000009FFFFFC9FFFFFC8000004FFF0000007FF90000004FE000000003F9000000260007FFF0
+00320000002001FFFFFFC002000000181FFFFFFFFC0C00000009FFFFFFFFFFC80000000FFFFFFF
+FFFFF80000000FFFFFFFFFFFF80000000FFFFFFFFFFFF80000000FFFF00007FFF80000000FFC00
+00001FF80000000FC007FFF001F80000000E01FFFFFFC0380000000C1FFFFFFFFC180000000CFF
+FFFFFFFF980000000FFFF00007FFF80000000FFE0000003FF80000000FE007FFF003F80000000F
+00FFFFFF80780000000C0FFFFFFFF818000000087FFFFFFFFF0800000001FFFFFFFFFFC0000000
+00FFFFFFFFFF80000000000FFFFFFFF80000000000007FFFFF0000000049497BD053>I<C00000
+0000000000000000004020080402010040201000804010080402008040200100802010F8040100
+80400201004021FC08020100800402008043FE10040201000804010083FE2008040200100803C1
+03FE401E080400201007E203FE803F10080040200FF403FF007FA0100000401FF805FE00FFC020
+1000802FF008FC017F80402001004FF01028027F808040078087E02070043F010F800FC103C040
+70081E021F801FE2018080701008043FC01FE402C100F02018083FC03FE805C20170403C103FC0
+5FF009C40270805C203FC01FE011E804F900BC403FD00FC021F008FA013C805FA0078041E010FC
+023D008F4001C081F020F8047E01188002C101F040F8087C02190004E201F080F8107C043A0008
+E403F901FC20FC083C0010F805FA01FC40FC10780020F009FC01FC81FC207800407811FC03FD01
+FC40F000007821FC05FE01FC80F01000F841FE09FC03FD00F020017C81FE13FE07FE01F040027D
+01FE23FE0BFC03F080047E01FF43FE17FC07F100087E03FF83FE27FE0BF200107F07FF03FE47FE
+17F400203F0BFF87FF8FFE27E800403F93FF87FF0FFE4FF000007FA3FF87FF0FFE8FE01000BFC3
+FFCFFF1FFF1FE020013FC3FFD7FF1FFE1FE040023FE3FFE7FF1FFE3FE080043FE3FFEFFFBFFE3F
+E100083FF3FFEFFFBFFE7FE200101FF3FFEFFFFFFE7FC400201FFFFFFFFFFFFEFFC800403FFBFF
+FFFFFFFEFFD000005FFFFFFFFFFFFFFFE010009FFFFFFFFFFFFFFFC020011FFFFFFFFFFFFFFFC0
+40021FFFFFFFFFFFFFFFC080040FFFFFFFFFFFFFFF81000807FFFFFFFFFFFFFF02001007FFFFC0
+001FFFFF0400200BFFF8000000FFFE08004011FF801FFFC00FFC10000020FC03FFFFFE01F82010
+0040603FFFFFFFE0304020008061FFFFFFFFFC3080400100BFFFFFFFFFFFE1008002013FFFF000
+7FFFE2010004021FFE000003FFC4020008041FF007FF007FC8040010080FC0FFFFF81F90080020
+100F07FFFFFF07A010004020141FFFFFFFC14020000040247FFFFFFFF180401000804FFFFFFFFF
+FF80802001008FFFC0001FFF81004002010FF8000000FF82008004021F801FFFC00FC401000804
+1C03FFFFFE01C802001008303FFFFFFFE0700400201021FFFFFFFFFC200800402027FFFFFFFFFF
+20100000402FFFFFFFFFFF802010008041FFFFFFFFFD0040200100805FFFFFFFC2008040020100
+802010080401008004020100402010080201000804020080402010040200100804010080402008
+0400201008020100804010080040201004020100802010000000000000000000000008555581D3
+53>I<C00000000000000000000000402008040201004020100080401008040200804020010080
+201008040100804002010040201008020100800402008040201004020100080401008040200804
+02001008020102804010080400201007020700802010080040200BC40F010040201000004013E8
+1F020080402010008023F83F040100804020010043FE7F880201008040020083FFFF9004020100
+80040103FFFFE00804020100080203FFFFC01008040200100403FFFFFFF810080400200805FFFF
+C00F2010080040100BFFFFC000C0201000002013FFFFFFE020402010004027FFFFFFFE18804020
+00804FFFFFFFFF8500804001009FFFFFFFFFC201008002013FFFFFFFFFF102010004027FFFFFFF
+FFF88402000804FF1FFFFFFFFC4804001008FE3FFFFFFFFE1008002010FC3FFFFFFFFF20100040
+20FC7FFFFFFFFF1020000040F8FFFFFFFFFF9040100080F1FFFFFFFFFF8880200100F7FFFFFFFF
+FFC900400201FFFFFFFFFFFFC600800403FFFFFFFFFFFFE401000805FFFFFFFFFFFFE00200100B
+FFFFFFFFFFFFF204002013FFFFFFFFFFFFF208004027FFFFFFFFFFFFF110000047FFFFFFFFFFFF
+F92010008FFFFFFFFFFFFFF94020011FFFFFFFFFFFFFF88040023FFFFFFFFFFFFFFC8080043FFF
+FFFF3FFFFFFC8100087FFFFFFE7FFFFFFC820010FFFFFFF8BFFFFFFC440020FFFFFFF13FFFFFFE
+480041FFFFFFC23FFFFFFE500001FFFFFF043FFFFFFE601001E7FFFC083FFFFFFE202003C3FFF0
+103FFFFFFF20400383FFE0207FFFFFFF20800787FFC0407FFFFFFF21000B8FFF80807FFFFFFF32
+0013BFFF0100FFFFFFFF140021FFFF0201FFFFFFFF980041FFFE0402FFFFFFFF900000FFFE0805
+FFFFFFFF9010007FFC100BFFFFFFFF9020009FFC2013FFFFFFFF98400101F84027FFFFFFFF9880
+0201F0804FFFFFFFFF89000402E1009FFFFFFFFFCA00080402013FFFFFFFFFCC00100804027FFF
+FFFFFFC80020100804FFFFFFFFFFC80040201009FFFFFFFFFFCC0000402013FFFFFFFFFFCC1000
+804027FFFFFFFFFFCC200100804FFFFFFFFFFFCC400201008FFFFFFFFFFFC4800402011FFFFFFF
+FFFFE5000804021FFFFFFFFFFFE6001008043FFFFFFFFFFFE4002010083FFFFFFFFFFFE4004020
+103FFFFFFFFFFFE4000040203FFFFFFFFFFFE4100080403FFFFFFFFFFFFC200100807FFFFFFFFF
+FFFC40020100802010080401008004020100402010080201000804020080402010040200100804
+010080402008040020100802010080401008004020100402010080201000000000000000000000
+0008555581D353>I<0000000080000000000000C00180000000000000F003C0000000000000F8
+07C0000000000000FE0FC0000000000000FF9FE0000000000000FFFFE0000000000000FFFFF000
+0000000000FFFFF0000000000000FFFFFFFE00000000007FFFF003C000000000FFFFF000300000
+0000FFFFFFF80800000001FFFFFFFF8600000003FFFFFFFFE100000007FFFFFFFFF08000000FFF
+FFFFFFFC4000001FFFFFFFFFFE2000003FC7FFFFFFFF1000003F8FFFFFFFFF8000003F0FFFFFFF
+FFC800003F1FFFFFFFFFC400003E3FFFFFFFFFE400003C7FFFFFFFFFE200003DFFFFFFFFFFF200
+003FFFFFFFFFFFF100007FFFFFFFFFFFF900007FFFFFFFFFFFF80000FFFFFFFFFFFFFC8000FFFF
+FFFFFFFFFC8001FFFFFFFFFFFFFC4001FFFFFFFFFFFFFE4003FFFFFFFFFFFFFE4007FFFFFFFFFF
+FFFE200FFFFFFFFFFFFFFF200FFFFFFFCFFFFFFF201FFFFFFF8FFFFFFF203FFFFFFE0FFFFFFF10
+3FFFFFFC0FFFFFFF907FFFFFF00FFFFFFF907FFFFFC00FFFFFFF9079FFFF000FFFFFFF88F0FFFC
+000FFFFFFFC8E0FFF8001FFFFFFFC8E1FFF0001FFFFFFFC8E3FFE0001FFFFFFFCCEFFFC0001FFF
+FFFFC47FFFC0003FFFFFFFE47FFF80003FFFFFFFE43FFF80007FFFFFFFE41FFF0000FFFFFFFFE4
+07FF0000FFFFFFFFE6007E0001FFFFFFFFE6007C0003FFFFFFFFE200380007FFFFFFFFF2000000
+0FFFFFFFFFF20000001FFFFFFFFFF20000003FFFFFFFFFF20000007FFFFFFFFFF3000000FFFFFF
+FFFFF3000001FFFFFFFFFFF3000003FFFFFFFFFFF3000003FFFFFFFFFFF1000007FFFFFFFFFFF9
+000007FFFFFFFFFFF900000FFFFFFFFFFFF900000FFFFFFFFFFFF900000FFFFFFFFFFFF900000F
+FFFFFFFFFFF900000FFFFFFFFFFFFF00000FFFFFFFFFFFFF48477BCC53>I<C000000000000000
+000000004020080402010040201000804010080402008040200100802010080401008040020100
+402010080201008004020080402010040201000804010080402008040200100802010080401008
+040020100402010080201008004020080403FD00402010000040100807FF008040201000802010
+0FFF8100804020010040201FFFC201008040020080403FFFC402010080040100807FFFE8040201
+0008020100BFFFF008040200100402013FFFE010080400200804023FFFE020100800401008043F
+FFE040201000002010081FFFC080402010004020101FFFC100804020008040201FFF8201008040
+0100804027FF04020100800201008047FF080402010004020100BFFFF00804020008040201FFFF
+F81008040010080403FFFFFC2010080020100807FFFFFE402010004020100BFFFFFE8040200000
+402017FFFFFF0080401000804027FFFFFF010080200100804FFFFFFF820100400201008FFFFFFF
+840200800402010FFFFFFF880401000804020FFFFFFF900802001008040FFFFFFFA01004002010
+080FFFFFFFC02008004020100FFFFFFF804010000040200FFFFFFF8080201000804017FFFFFF01
+00402001008027FFFFFF0200804002010043FFFFFE0401008004020083FFFFFE08020100080401
+01FFFFFC1004020010080201FFFFF820080400201004023FFFE040100800402008047FFFF08020
+100000401009FFFFFD0040201000802017FFFFFF008040200100403FFFFFFFC10080400200807F
+FFFFFFE2010080040100FFFFFFFFF4020100080201FFFFFFFFF8040200100403FFFFFFFFFC0804
+00200807FFFFFFFFFE10080040100BFFFFFFFFFE201000002017FFFFFFFFFF40201000402FFFFF
+FFFFFF80402000804FFFFFFFFFFF80804001009FFFFFFFFFFFC1008002011FFFFFFFFFFFC20100
+04021FFFFFFFFFFFC4020008043FFFFFFFFFFFE8040010083FFFFFFFFFFFF0080020103FFFFFFF
+FFFFE0100040207FFFFFFFFFFFF0200000407FFFFFFFFFFFF0401000807FFFFFFFFFFFF0802001
+00FFFFFFFFFFFFF1004002017FFFFFFFFFFFF2008004027FFFFFFFFFFFF4010008047FFFFFFFFF
+FFF8020010087FFFFFFFFFFFF0040020107FFFFFFFFFFFF0080040207FFFFFFFFFFFF010000040
+7FFFFFFFFFFFF02010008040200804020100402001008040100804020080400201008020100804
+010080040201004020100802010008040200804020100402001008040100804020080400201008
+020100804010080040201004020100802010000000000000000000000008555581D353>I<0000
+03F800000000000FFE00000000001FFF00000000003FFF80000000003FFF80000000007FFFC000
+0000007FFFC0000000007FFFC0000000007FFFC0000000007FFFC0000000003FFF80000000003F
+FF80000000001FFF00000000000FFE00000000000FFE00000000007FFFC000000001FFFFF00000
+0003FFFFF800000007FFFFFC00000007FFFFFC0000000FFFFFFE0000000FFFFFFE0000001FFFFF
+FF0000001FFFFFFF0000001FFFFFFF0000001FFFFFFF0000001FFFFFFF0000001FFFFFFF000000
+1FFFFFFF0000001FFFFFFF0000000FFFFFFE0000000FFFFFFE00000007FFFFFC00000007FFFFFC
+00000003FFFFF800000001FFFFF0000000007FFFC000000000FFFFE000000003FFFFF80000000F
+FFFFFE0000003FFFFFFF8000007FFFFFFFC00000FFFFFFFFE00001FFFFFFFFF00003FFFFFFFFF8
+0007FFFFFFFFFC0007FFFFFFFFFC000FFFFFFFFFFE001FFFFFFFFFFF001FFFFFFFFFFF003FFFFF
+FFFFFF803FFFFFFFFFFF803FFFFFFFFFFF807FFFFFFFFFFFC07FFFFFFFFFFFC07FFFFFFFFFFFC0
+FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFF
+FFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE033
+4370CA53>I<0000000007C000000000000000000FE000000000000000001FF000000000000000
+001FF00000000000001E001FF000F0000000003F001FF001F8000000007F801FF003FC00000000
+7F800FE003FC000000007F8007C003FC000000007F80010003FC00003C003F00038001F800787E
+001E00038000F000FCFF0004000380004001FEFF000600038000C001FEFF000E00038000E001FE
+FF000E00038000E001FEFF000F0007C001E001FE7E000F0007C001E000FC3C000F0007C001E000
+7806000F8007C003E000C006000F8007C003E000C007000F8007C003E001C007000FC00FE007E0
+01C007800FC00FE007E003C007800FE00FE00FE003C003C00FE00FE00FE0078003C00FE00FE00F
+E0078003C00FF00FE01FE0078003E00FF01FF01FE00F8003E00FF01FF01FE00F8003F00FF81FF0
+3FE01F8003F01FF81FF03FF01F8003F81FF81FF03FF03F8001F81FFC3FF87FF03F0001FC1FFC3F
+F87FF07F0001FC1FFC3FF87FF07F0001FE1FFE3FF8FFF0FF0001FE1FFE3FF8FFF0FF0001FF1FFE
+3FF8FFF1FF0001FF1FFF7FFDFFF1FF0001FF9FFF7FFDFFF3FF0000FF9FFF7FFDFFF3FE0000FFDF
+FFFFFFFFF7FE0000FFDFFFFFFFFFF7FE0000FFFFFFFFFFFFFFFE0000FFFFFFFFFFFFFFFE0000FF
+FFFFFFFFFFFFFE0000FFFFFFFFFFFFFFFE00007FFFFFFFFFFFFFFC00003FFFFFFFFFFFFFF80000
+3FFFFE0000FFFFF800001FFFC0000007FFF000000FFC00FFFE007FE0000007E01FFFFFF00FC000
+000301FFFFFFFF01800000030FFFFFFFFFE180000001FFFFFFFFFFFF00000001FFFF8003FFFF00
+000000FFF000001FFE00000000FF803FF803FE000000007E07FFFFC0FC00000000783FFFFFF83C
+0000000020FFFFFFFE080000000023FFFFFFFF88000000007FFFFFFFFFFC000000007FFE0000FF
+FC000000007FC0000007FC00000000FC00FFFE007E00000000E01FFFFFF00E0000000181FFFFFF
+FF03000000010FFFFFFFFFE1000000013FFFFFFFFFF9000000007FFFFFFFFFFC000000000FFFFF
+FFFFE00000000000FFFFFFFE0000004F4B7ED053>I<3FF007FF007FE03FF007FF007FE03FF007
+FF007FE03FF007FF007FE03FF007FF007FE03FFFFFFFFFFFE03FFFFFFFFFFFE03FFFFFFFFFFFE0
+3FFFFFFFFFFFE03FFFFFFFFFFFE030000000000060300000000000400FFFFFFFFFFF8007FFFFFF
+FFFE0001FFFFFFFFFC0000FFFFFFFFF0000030000000600000100000004000001FFFFFFFC00000
+1FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFF
+C000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001F
+FFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC0
+00001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001000
+0000400000100000006000003FFFFFFFF000007FFFFFFFF80000FFFFFFFFFC0001FFFFFFFFFE00
+03FFFFFFFFFF0000000000000000080000000000800FFFFFFFFFFF800FFFFFFFFFFF800FFFFFFF
+FFFF800FFFFFFFFFFF800FFFFFFFFFFF8008000000000080080000000000F8FFFFFFFFFFFFF8FF
+FFFFFFFFFFF8FFFFFFFFFFFFF8FFFFFFFFFFFFF8FFFFFFFFFFFFF8FFFFFFFFFFFFF8353F71C653
+>I<C0000000000000000000000040200804020100402010008040100804020080402001008020
+100804010080400201004020100802010080040200804020100402010008040100804020080402
+001008020100804010080400201004020100802010080040200804020100402010000040100804
+020080402010008020100804010080402001004020100802010080400200BFF027FF047FE10080
+04013FF047FF087FE2010008023FF087FF107FE4020010043FF107FF207FE8040020083FF207FF
+407FF0080040103FFFFFFFFFFFE0100000203FFFFFFFFFFFE0201000403FFFFFFFFFFFE0402000
+807FFFFFFFFFFFE080400100BFFFFFFFFFFFE10080020130000000000062010004023000000000
+0044020008040FFFFFFFFFFF880400100807FFFFFFFFFE100800201009FFFFFFFFFC2010004020
+10FFFFFFFFF0402000004020300000006080401000804030000000410080200100805FFFFFFFC2
+0100400201009FFFFFFFC40200800402011FFFFFFFC80401000804021FFFFFFFD0080200100804
+1FFFFFFFE01004002010081FFFFFFFC02008004020101FFFFFFFC04010000040201FFFFFFFC080
+20100080401FFFFFFFC10040200100803FFFFFFFC20080400201005FFFFFFFC40100800402009F
+FFFFFFC80201000804011FFFFFFFD00402001008021FFFFFFFE00804002010041FFFFFFFC01008
+004020081FFFFFFFC02010000040101FFFFFFFC04020100080201FFFFFFFC08040200100403FFF
+FFFFC10080400200805FFFFFFFC20100800401009FFFFFFFC40201000802011FFFFFFFC8040200
+1004021FFFFFFFD0080400200804100000006010080040100810000000602010000020103FFFFF
+FFF04020100040207FFFFFFFF8804020008040FFFFFFFFFD008040010081FFFFFFFFFE01008002
+0103FFFFFFFFFF0201000402000000000000040200080408000000000088040010080FFFFFFFFF
+FF90080020100FFFFFFFFFFFA0100040201FFFFFFFFFFFC0200000402FFFFFFFFFFF8040100080
+4FFFFFFFFFFF80802001008800000000008100400201080000000000FA00800402FFFFFFFFFFFF
+FC01000804FFFFFFFFFFFFF802001008FFFFFFFFFFFFF804002010FFFFFFFFFFFFF808004020FF
+FFFFFFFFFFF810000040FFFFFFFFFFFFF820100080402008040201004020010080401008040200
+804002010080201008040100800402010040201008020100080402008040201004020010080401
+008040200804002010080201008040100800402010040201008020100000000000000000000000
+08555581D353>I E /Fh 49 122 df<00F000030C000E06041C07043807083007087007907007
+90E003A0E003A0E003C0E00380E00380E00380600780601B883061900F80E016127E911B>11
+D<0001F000061800080C00100C00200E00400E00800E00801C01001C010018010038020FF00210
+C0020FE00200300400300400300400380400380800700800700800700800E01800E01800C01401
+80140300230E0020F80020000020000040000040000040000040000080000080000017257F9C17
+>I<60F0F06004047C830C>58 D<60F0F0701010101020204080040C7C830C>I<0000038000000F
+0000003C000000F0000003C000000F0000003C000000F0000003C000000F0000003C000000F000
+0000F00000003C0000000F00000003C0000000F00000003C0000000F00000003C0000000F00000
+003C0000000F000000038019187D9520>I<00010003000600060006000C000C000C0018001800
+180030003000300060006000C000C000C0018001800180030003000300060006000C000C000C00
+180018001800300030003000600060006000C000C00010297E9E15>I<E0000000780000001E00
+00000780000001E0000000780000001E0000000780000001E0000000780000001E000000078000
+00078000001E00000078000001E00000078000001E00000078000001E00000078000001E000000
+78000000E000000019187D9520>I<00000C0000000C0000001C0000001C0000003C0000007C00
+00005C0000009C0000008E0000010E0000010E0000020E0000040E0000040E0000080E0000080E
+0000100E0000200E00003FFE000040070000400700008007000100070001000700020007000200
+0700060007001E000700FF807FF01C1D7F9C1F>65 D<01FFFF00003C01C0003800E0003800F000
+3800700038007000700070007000F0007000F0007001E000E003C000E0078000E01F0000FFFC00
+01C00F0001C0078001C003C001C003C0038003C0038003C0038003C0038003C007000780070007
+0007000E0007001C000E007800FFFFC0001C1C7E9B1F>I<0001F808000E061800380138006000
+F001C0007003800070070000300F0000200E0000201C0000203C0000203C000000780000007800
+000078000000F0000000F0000000F0000000F0000000F0000100F0000100F00001007000020070
+00020030000400380008001C0010000E0060000701800000FE00001D1E7E9C1E>I<01FFFF8000
+3C01E000380070003800380038001C0038001C0070001C0070001E0070001E0070001E00E0001E
+00E0001E00E0001E00E0001E01C0003C01C0003C01C0003C01C000380380007803800070038000
+F0038000E0070001C0070003800700070007001C000E007800FFFFC0001F1C7E9B22>I<01FFFF
+F8003C0078003800180038001000380010003800100070001000700010007010100070100000E0
+200000E0200000E0600000FFE00001C0400001C0400001C0400001C04000038080400380004003
+80008003800080070001000700010007000300070006000E003E00FFFFFC001D1C7E9B1F>I<01
+FFFFF0003C00F00038003000380020003800200038002000700020007000200070102000701000
+00E0200000E0200000E0600000FFE00001C0400001C0400001C0400001C0400003808000038000
+000380000003800000070000000700000007000000070000000F000000FFF000001C1C7E9B1B>
+I<01FFC3FF80003C0078000038007000003800700000380070000038007000007000E000007000
+E000007000E000007000E00000E001C00000E001C00000E001C00000FFFFC00001C003800001C0
+03800001C003800001C0038000038007000003800700000380070000038007000007000E000007
+000E000007000E000007000E00000F001E0000FFE1FFC000211C7E9B23>72
+D<03FFC0003C0000380000380000380000380000700000700000700000700000E00000E00000E0
+0000E00001C00001C00001C00001C0000380000380000380000380000700000700000700000700
+000F0000FFF000121C7E9B12>I<01FFC07F80003C001E00003800180000380020000038004000
+0038008000007002000000700400000070080000007010000000E040000000E0C0000000E1E000
+0000E2E0000001C470000001D070000001E038000001C0380000038038000003801C000003801C
+000003800E000007000E000007000E0000070007000007000700000F00078000FFE03FF000211C
+7E9B23>75 D<01FFE0003C0000380000380000380000380000700000700000700000700000E000
+00E00000E00000E00001C00001C00001C00001C00003800203800203800203800407000407000C
+0700180700380E00F0FFFFF0171C7E9B1C>I<01FE0000FF003E0000F0002E0001E0002E0002E0
+002E0002E0002E0004E0004E0009C0004E0009C000470011C000470011C0008700238000870043
+800087004380008700838001070107000107010700010382070001038207000203840E00020388
+0E000203880E000203900E000403A01C000403A01C000401C01C000C01C01C001C01803C00FF81
+03FF80281C7E9B28>I<01FC00FF80001C001C00002E001800002E001000002E00100000270010
+0000470020000043002000004380200000438020000081C040000081C040000081C040000080E0
+40000100E080000100708000010070800001007080000200390000020039000002003900000200
+1D000004001E000004000E000004000E00000C000E00001C00040000FF80040000211C7E9B21>
+I<0003F800000E0E000038038000E001C001C001C0038000E0070000E00F0000F01E0000F01C00
+00F03C0000F03C0000F0780000F0780000F0780000F0F00001E0F00001E0F00001E0F00003C0F0
+0003C0F0000780F0000780F0000F0070000E0070001C00380038003C0070001C01C00007078000
+01FC00001C1E7E9C20>I<01FFFF00003C03C0003800E0003800F00038007000380070007000F0
+007000F0007000F0007000E000E001E000E003C000E0078000E01E0001FFF00001C0000001C000
+0001C0000003800000038000000380000003800000070000000700000007000000070000000F00
+0000FFE000001C1C7E9B1B>I<0003F800000E0E000038038000E001C001C001C0038000E00700
+00E00F0000F01E0000F01C0000F03C0000F03C0000F0780000F0780000F0780000F0F00001E0F0
+0001E0F00001E0F00003C0F00003C0F0000380F0000780F0000F00703C0E0070421C0038823800
+388370001C83C0000787810001FF8100000383000003820000038E000003FC000003F8000001F8
+000001E0001C257E9C21>I<01FFFE00003C03C0003800E0003800F00038007000380070007000
+F0007000F0007000F0007001E000E001C000E0078000E01E0000FFF00001C0300001C0180001C0
+1C0001C01C0003801C0003801C0003801C0003801C0007003C0007003C0807003C0807003C100F
+001E10FFE00E20000007C01D1D7E9B20>I<000FC100303300400F008006018006030006030006
+06000406000407000007000007800003F00001FF0000FFC0003FE00003E00000F0000070000030
+0000302000302000306000606000606000C0600080F00300CC060083F800181E7E9C19>I<1FFF
+FFF01C03807030070030200700206007002040070020400E0020800E0020800E0020000E000000
+1C0000001C0000001C0000001C0000003800000038000000380000003800000070000000700000
+007000000070000000E0000000E0000000E0000000E0000001E000007FFF00001C1C7F9B18>I<
+7FF03FE00F0007000E0006000E0004000E0004000E0004001C0008001C0008001C0008001C0008
+003800100038001000380010003800100070002000700020007000200070002000E0004000E000
+4000E0004000E0008000E0008000E00100006002000060040000300800001830000007C000001B
+1D7D9B1C>I<FFC00FF01E0003801C0003001C0002001C0004001E0004000E0008000E0008000E
+0010000E0020000E0020000E0040000E0080000E0080000F010000070100000702000007040000
+0704000007080000071800000710000007A0000003A0000003C000000380000003800000030000
+00030000001C1D7D9B18>I<FFC1FFC1FF1C003C003C1C001C00101C001C00201C003C00201C00
+7C00401C005C00401C009C00801C009C00801C011C01001C011C01001C021C02001C021C04001C
+041C04001C081C08001E081C08000E101C10000E101C10000E200E20000E200E60000E400E4000
+0E400E80000E800E80000F000F00000F000F00000E000E00000E000E00000C000C00000C000800
+00281D7D9B27>I<00800080208020802080208020802080208020E027E03FE0FF80FC80E08020
+802080208020802080208020802080208020802080208020E027E03FE0FF80FC80E08020802080
+20802080200020000B277E9D10>93 D<01E3000717000C0F00180F00380E00300E00700E00700E
+00E01C00E01C00E01C00E01C00E03880E03880E038806078803199001E0E0011127E9116>97
+D<01F0030C0E0C1C1E383C301870007000E000E000E000E000E000E0046008601030601F800F12
+7E9112>99 D<0007E00000E00000E00001C00001C00001C00001C0000380000380000380000380
+01E7000717000C0F00180F00380E00300E00700E00700E00E01C00E01C00E01C00E01C00E03880
+E03880E038806078803199001E0E00131D7E9C16>I<01F007080C0818043808300870307FC0E0
+00E000E000E000E000E0046008601030600F800E127E9113>I<0001E0000630000E78000CF000
+1C60001C00001C00001C00003C0000380000380003FFC000380000380000700000700000700000
+700000700000E00000E00000E00000E00000E00001C00001C00001C00001C00001C00001800003
+8000038000630000F30000F60000E4000078000015257E9C14>I<007180018B80030780060780
+0E07000C07001C07001C0700380E00380E00380E00380E00381C00381C00381C00183C0008F800
+073800003800003800007000607000F06000F0E000E180007E0000111A7F9114>I<0FC00001C0
+0001C0000380000380000380000380000700000700000700000700000E3E000EC3000F03800E03
+801E03801C03801C03801C0380380700380700380700380E00700E20700E20701C20701C40E00C
+80600700131D7E9C18>I<01C003C003C001800000000000000000000000001C00270047004700
+870087000E000E001C001C001C003800388038807080710032001C000A1C7E9B0E>I<0FC00001
+C00001C0000380000380000380000380000700000700000700000700000E07000E18800E21C00E
+23C01C47801C83001D00001E00003F800039C00038E00038E00070E10070E10070E10070E200E0
+6200603C00121D7E9C16>107 D<1F800380038007000700070007000E000E000E000E001C001C
+001C001C0038003800380038007000700070007000E400E400E400E40064003800091D7E9C0C>
+I<381F004E61804681C04701C08F01C08E01C00E01C00E01C01C03801C03801C03801C07003807
+10380710380E10380E2070064030038014127E9119>110 D<00F800030C000E06001C03001803
+00300300700380700380E00700E00700E00700E00E00E00E00E01C0060180060300030E0000F80
+0011127E9114>I<07078009C86008D03008E03011C03011C03801C03801C03803807003807003
+80700380600700E00700C00701800783000E86000E78000E00000E00001C00001C00001C00001C
+00003C0000FF8000151A819115>I<01C206260C1E181E381C301C701C701CE038E038E038E038
+E070E070E07060F023E01CE000E000E001C001C001C001C003C01FF80F1A7E9113>I<383C4E42
+4687470F8E1E8E0C0E000E001C001C001C001C0038003800380038007000300010127E9113>I<
+01F0060C04040C0E180C1C001F000FE00FF003F80038201C7018F018F010803060601F800F127E
+9113>I<00C001C001C001C00380038003800380FFF00700070007000E000E000E000E001C001C
+001C001C00382038203840384018800F000C1A80990F>I<1C00C02701C04701C04701C0870380
+8703800E03800E03801C07001C07001C07001C0700180E20180E20180E201C1E200C264007C380
+13127E9118>I<1C02270747074703870187010E010E011C021C021C021C041804180818081C10
+0C2007C010127E9114>I<1C00C02701C04701C04701C08703808703800E03800E03801C07001C
+07001C07001C0700180E00180E00180E001C1E000C3C0007DC00001C00001800603800F03000F0
+6000E0C0004180003E0000121A7E9114>121 D E /Fi 48 123 df<00FCF807839C0E079C1C07
+081C07001C07001C07001C07001C0700FFFFE01C07001C07001C07001C07001C07001C07001C07
+001C07001C07001C07001C07001C0700FF1FE01617809615>11 D<00FC000782000E07001C0700
+1C02001C00001C00001C00001C0000FFFF001C07001C07001C07001C07001C07001C07001C0700
+1C07001C07001C07001C07001C0700FF1FE01317809614>I<60F0F070101020204040040A7D96
+0A>39 D<60F0F070101020204040040A7D830A>44 D<60F0F06004047D830A>46
+D<07C018303018701C600C600CE00EE00EE00EE00EE00EE00EE00EE00EE00E600C600C701C3018
+1C7007C00F157F9412>48 D<0F8030E040708030C038E0384038003800700070006000C0018003
+0006000C08080810183FF07FF0FFF00D157E9412>50 D<00300030007000F001F0017002700470
+08701870107020704070C070FFFE0070007000700070007003FE0F157F9412>52
+D<01F00608080C181C301C70006000E000E3E0EC30F018F00CE00EE00EE00E600E600E300C3018
+183007C00F157F9412>54 D<FFFE001C03801C00E01C00601C00701C00701C00701C00701C00E0
+1C01C01FFF801FFFC01C00E01C00701C00301C00381C00381C00381C00381C00701C00E01C01C0
+FFFF0015177F9619>66 D<00FC100383300E00B01C0070380030300030700010600010E00010E0
+0000E00000E00000E00000E00000E000106000107000103000203800201C00400E008003830000
+FC0014177E9619>I<FFFFE01C00E01C00601C00201C00101C00101C00101C04001C04001C0400
+1C0C001FFC001C0C001C04001C04081C04081C00081C00181C00101C00101C00301C00F0FFFFF0
+15177F9618>69 D<FFFFE01C00E01C00601C00201C00101C00101C00101C04001C04001C04001C
+0C001FFC001C0C001C04001C04001C04001C00001C00001C00001C00001C00001C0000FFC00014
+177F9617>I<007E080381980600580C0038180018300018700008700008E00008E00000E00000
+E00000E00000E003FEE000387000387000383000381800380C00380600380380D8007F0817177E
+961C>I<FFE00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E
+000E000E000E000E00FFE00B177F960D>73 D<FFC0001C00001C00001C00001C00001C00001C00
+001C00001C00001C00001C00001C00001C00001C00001C00201C00201C00201C00601C00601C00
+401C00C01C03C0FFFFC013177F9616>76 D<FC00FE1E00381F001017001013801011C01011C010
+10E010107010103810103810101C10100E10100F101007101003901001D01001D01000F0100070
+100030380030FE001017177F961A>78 D<00FC000303000E01C01C00E038007030003070003860
+0018E0001CE0001CE0001CE0001CE0001CE0001CE0001C7000387000383000303800701C00E00E
+01C003030000FC0016177E961B>I<0FC4302C601C400CC004C004C004E00070007F003FE00FF8
+01FC001C000E0006800680068006C004E008D81087E00F177E9614>83 D<7FFFF8603818403808
+403808803804803804803804003800003800003800003800003800003800003800003800003800
+00380000380000380000380000380000380007FFC016177F9619>I<FF80FE1C00381C00101C00
+101C00101C00101C00101C00101C00101C00101C00101C00101C00101C00101C00101C00101C00
+101C00100E0020060020030040018180007E0017177F961A>I<FF83FC1F01E00E008007008007
+810003820001C20001E40000E800007800007800003800007C00005E00008E0001870001078002
+03800601C00401E00C00E01C00F0FF03FE17177F961A>88 D<1FC0386038301038003803F81E38
+30387038E039E039E07970FF1F1E100E7F8D12>97 D<FC00001C00001C00001C00001C00001C00
+001C00001C00001C00001CF8001F06001C03001C03801C01801C01C01C01C01C01C01C01C01C01
+801C03801C03001B0E0010F8001217809614>I<07F01838303870106000E000E000E000E00060
+0070083008183007C00D0E7F8D10>I<007E00000E00000E00000E00000E00000E00000E00000E
+00000E0007CE001C3E00300E00700E00600E00E00E00E00E00E00E00E00E00600E00700E00301E
+00182E0007CFC012177F9614>I<0FC0186030307038E018FFF8E000E000E00060007008301018
+3007C00D0E7F8D10>I<03E006700E701C201C001C001C001C001C00FF801C001C001C001C001C
+001C001C001C001C001C001C001C00FF800C1780960B>I<0F9E18E33060707070707070306018
+C02F80200060003FE03FF83FFC600EC006C006C006600C38380FE010157F8D12>I<FC00001C00
+001C00001C00001C00001C00001C00001C00001C00001C7C001D8E001E07001C07001C07001C07
+001C07001C07001C07001C07001C07001C07001C0700FF9FE01317809614>I<183C3C18000000
+00007C1C1C1C1C1C1C1C1C1C1C1C1CFF081780960A>I<03000780078003000000000000000000
+00001F800380038003800380038003800380038003800380038003800380038003804380E300E7
+007C00091D82960B>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C3F
+801C1C001C18001C20001C40001CC0001FE0001CF0001C70001C78001C3C001C1E001C1E00FF3F
+C01217809613>I<FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C
+001C001C001C001C001C001C00FF80091780960A>I<FC7C1F001D8E63801E0781C01C0701C01C
+0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C0FF9FE7F8
+1D0E808D1E>I<FC7C001D8E001E07001C07001C07001C07001C07001C07001C07001C07001C07
+001C07001C0700FF9FE0130E808D14>I<07C018303018600C600CE00EE00EE00EE00EE00E701C
+3018183007C00F0E7F8D12>I<FCF8001F0E001C03001C03801C01801C01C01C01C01C01C01C01
+C01C01801C03801C07001F0E001CF8001C00001C00001C00001C00001C0000FF80001214808D14
+>I<07C2001C2600381E00700E00600E00E00E00E00E00E00E00E00E00600E00700E00301E001C
+2E0007CE00000E00000E00000E00000E00000E00007FC012147F8D13>I<FCF01D381E381C101C
+001C001C001C001C001C001C001C001C00FF800D0E808D0E>I<1F4060C0C040C040E000FF007F
+801FC001E080608060C060E0C09F000B0E7F8D0E>I<080008000800180018003800FF80380038
+003800380038003800380038403840384038401C800F000A147F930E>I<FC3F001C07001C0700
+1C07001C07001C07001C07001C07001C07001C07001C07001C0F000E170003E7E0130E808D14>
+I<FE1F3C0E3C0C1C081C080E100E100720072003C003C003C001800180100E7F8D13>I<FCFE7C
+3838383838101C3C201C3C201C4C200E4E400E4E400E8640078780078780070380030300030300
+160E7F8D19>I<FE3F3C181C100E20074007C0038001C002E004F008701838383CFC7F100E7F8D
+13>I<FE1F3C0E3C0C1C081C080E100E100720072003C003C003C00180018001000100E200E200
+A400780010147F8D13>I<FFF0C0E080E081C08380878007000E001E081C08381870107030FFF0
+0D0E7F8D10>I E /Fj 5 54 df<0C003C00CC000C000C000C000C000C000C000C000C000C000C
+000C000C00FF8009107E8F0F>49 D<1F00618040C08060C0600060006000C00180030006000C00
+102020207FC0FFC00B107F8F0F>I<1F00218060C060C000C0008001800F00008000400060C060
+C060804060801F000B107F8F0F>I<0300030007000F000B001300330023004300C300FFE00300
+0300030003001FE00B107F8F0F>I<20803F002C002000200020002F0030802040006000600060
+C06080C061801F000B107F8F0F>I E /Fk 10 62 df<01020408103020606040C0C0C0C0C0C0C0
+C0C0C040606020301008040201081E7E950D>40 D<80402010080C040606020303030303030303
+0303020606040C0810204080081E7E950D>I<0060000060000060000060000060000060000060
+00006000006000006000FFFFF0FFFFF00060000060000060000060000060000060000060000060
+0000600000600014167E9119>43 D<0C001C00EC000C000C000C000C000C000C000C000C000C00
+0C000C000C000C000C000C00FFC00A137D9211>49 D<1F0060C06060F070F03060300070007000
+6000C001C00180020004000810101020207FE0FFE00C137E9211>I<0FC0307070387038703800
+38003000E00FC0007000380018001C601CF01CF018E03860701FC00E137F9211>I<006000E000
+E00160026006600C600860106020606060C060FFFC0060006000600060006003FC0E137F9211>
+I<60607FC07F8044004000400040004F0070C040E0006000700070E070E070E06040E021C01F00
+0C137E9211>I<07C00C201070207060006000C000CF00D0C0E060C020C030C030C03040306020
+206010C00F000C137E9211>I<7FFFE0FFFFF0000000000000000000000000000000000000FFFF
+F07FFFE0140A7E8B19>61 D E /Fl 69 124 df<003FE3F801F03F1C03C03E3E07C07C3E0F807C
+3E0F807C1C0F807C000F807C000F807C000F807C000F807C00FFFFFFC0FFFFFFC00F807C000F80
+7C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F
+807C000F807C000F807C007FE1FFC07FE1FFC01F1D809C1C>11 D<003FC00001F0300003C03800
+07C07C000F807C000F807C000F8038000F8000000F8000000F8000000F800000FFFFFC00FFFFFC
+000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F80
+7C000F807C000F807C000F807C000F807C007FE1FF807FE1FF80191D809C1B>I<002000400180
+0380030006000E001C001C003C0038003800780078007800F800F000F000F000F000F000F000F0
+00F000F000F800780078007800380038003C001C001C000E000600030003800180004000200B29
+7C9E13>40 D<800040003000380018000C000E000700070007800380038003C003C003C003E001
+E001E001E001E001E001E001E001E001E003E003C003C003C0038003800780070007000E000C00
+180038003000400080000B297D9E13>I<00038000000380000003800000038000000380000003
+80000003800000038000000380000003800000038000000380000003800000038000FFFFFFFCFF
+FFFFFCFFFFFFFC0003800000038000000380000003800000038000000380000003800000038000
+0003800000038000000380000003800000038000000380001E1F7D9925>43
+D<78FCFCFEFE7A0202040408083040070E7D850D>I<FFE0FFE0FFE0FFE00B047F8A10>I<78FCFC
+FCFC7806067D850D>I<000180000380000380000700000700000700000E00000E00001C00001C
+00001C0000380000380000380000700000700000E00000E00000E00001C00001C00001C0000380
+000380000380000700000700000E00000E00000E00001C00001C00001C00003800003800007000
+00700000700000E00000E00000C0000011297D9E18>I<03F8000F1E001C07003C078038038078
+03C07803C07803C0F803E0F803E0F803E0F803E0F803E0F803E0F803E0F803E0F803E0F803E0F8
+03E0F803E07803C07803C03803803C07801C07000F1E0003F800131B7E9A18>I<00600001E000
+0FE000FFE000F3E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E000
+03E00003E00003E00003E00003E00003E00003E00003E00003E00003E0007FFF807FFF80111B7D
+9A18>I<07F8001FFE00383F80780FC0FC07C0FC07E0FC03E0FC03E07803E00007E00007C00007
+C0000F80001F00001E0000380000700000E0000180600300600600600800E01FFFC03FFFC07FFF
+C0FFFFC0FFFFC0131B7E9A18>I<03F8001FFE003C1F003C0F807C07C07E07C07C07C03807C000
+0F80000F80001E00003C0003F800001E00000F800007C00007C00007E03007E07807E0FC07E0FC
+07E0FC07C0780F80781F001FFE0007F800131B7E9A18>I<000180000380000780000F80001F80
+003F80006F8000CF80008F80018F80030F80060F800C0F80180F80300F80600F80C00F80FFFFF8
+FFFFF8000F80000F80000F80000F80000F80000F8001FFF801FFF8151B7F9A18>I<1801801FFF
+001FFE001FFC001FF8001FC00018000018000018000018000019F8001E0E00180F801007800007
+C00007E00007E00007E07807E0F807E0F807E0F807C0F007C0600F80381F001FFE0007F000131B
+7E9A18>I<007E0003FF000781800F03C01E07C03C07C03C0380780000780000F80000F8F800FB
+0E00FA0780FC0380FC03C0F803E0F803E0F803E0F803E07803E07803E07803C03C03C03C07801E
+0F0007FE0003F800131B7E9A18>I<6000007FFFE07FFFE07FFFC07FFF807FFF80E00300C00600
+C00C00C0180000300000300000600000E00000E00001E00001C00003C00003C00003C00003C000
+07C00007C00007C00007C00007C00007C000038000131C7D9B18>I<03F8000FFE001E0F803807
+803803C07803C07803C07E03C07F83807FC7003FFE001FFC000FFE0007FF801DFF80387FC0781F
+E0F007E0F003E0F001E0F001E0F001E07801C07803803E07801FFE0003F800131B7E9A18>I<03
+F8000FFE001E0F003C07807807807803C0F803C0F803C0F803E0F803E0F803E0F803E07807E038
+07E03C0BE00E1BE003E3E00003E00003C00003C03807C07C07807C0700780F00383C001FF8000F
+E000131B7E9A18>I<78FCFCFCFC7800000000000078FCFCFCFC7806127D910D>I<000380000003
+80000007C0000007C0000007C000000FE000000FE000001FF000001BF000001BF0000031F80000
+31F8000061FC000060FC0000E0FE0000C07E0000C07E0001803F0001FFFF0003FFFF8003001F80
+03001F8006000FC006000FC00E000FE00C0007E0FFC07FFEFFC07FFE1F1C7E9B24>65
+D<FFFFF800FFFFFF000FC01F800FC00FC00FC007C00FC007E00FC007E00FC007E00FC007E00FC0
+07E00FC007C00FC00F800FC03F000FFFFE000FC00F800FC007C00FC007E00FC003E00FC003F00F
+C003F00FC003F00FC003F00FC003F00FC007E00FC007E00FC01FC0FFFFFF00FFFFFC001C1C7E9B
+22>I<001FE02000FFF8E003F80FE007C003E00F8001E01F0000E03E0000E03E0000607E000060
+7C000060FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0000007C0000
+607E0000603E0000603E0000C01F0000C00F80018007C0030003F80E0000FFFC00001FE0001B1C
+7D9B22>I<FFFFF800FFFFFF000FC01FC00FC007E00FC001F00FC001F80FC000F80FC000FC0FC0
+007C0FC0007C0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0F
+C0007C0FC0007C0FC0007C0FC000F80FC000F80FC001F00FC007E00FC01FC0FFFFFF00FFFFF800
+1F1C7E9B25>I<FFFFFF00FFFFFF000FC01F000FC007000FC003000FC003800FC003800FC18180
+0FC181800FC181800FC180000FC380000FFF80000FFF80000FC380000FC180000FC180000FC180
+600FC180600FC000E00FC000C00FC000C00FC001C00FC001C00FC003C00FC00F80FFFFFF80FFFF
+FF801B1C7E9B1F>I<FFFFFF00FFFFFF000FC01F000FC007000FC003000FC003800FC003800FC0
+01800FC181800FC181800FC180000FC180000FC380000FFF80000FFF80000FC380000FC180000F
+C180000FC180000FC180000FC000000FC000000FC000000FC000000FC000000FC00000FFFF0000
+FFFF0000191C7E9B1E>I<000FF008007FFE3801FC07F807E001F80F8000781F0000783F000038
+3E0000387E0000187C000018FC000000FC000000FC000000FC000000FC000000FC000000FC007F
+FFFC007FFF7C0001F87E0001F83E0001F83F0001F81F0001F80F8001F807E001F801FC07F8007F
+FE78000FF818201C7D9B26>I<FFFC3FFFFFFC3FFF0FC003F00FC003F00FC003F00FC003F00FC0
+03F00FC003F00FC003F00FC003F00FC003F00FC003F00FFFFFF00FFFFFF00FC003F00FC003F00F
+C003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F0
+FFFC3FFFFFFC3FFF201C7E9B25>I<FFFFFFFF07E007E007E007E007E007E007E007E007E007E0
+07E007E007E007E007E007E007E007E007E007E007E007E007E007E0FFFFFFFF101C7F9B12>I<
+FFFC07FFFFFC07FF0FC000E00FC001C00FC003800FC006000FC00C000FC038000FC070000FC0E0
+000FC1C0000FC3C0000FC7E0000FCFE0000FFBF0000FF3F8000FE1F8000FC0FC000FC0FE000FC0
+7E000FC03F000FC01F800FC01FC00FC00FC00FC007E00FC007F0FFFC3FFFFFFC3FFF201C7E9B25
+>75 D<FFFF00FFFF000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC000
+0FC0000FC0000FC0000FC0000FC0000FC0030FC0030FC0030FC0070FC0070FC0060FC00E0FC01E
+0FC07EFFFFFEFFFFFE181C7E9B1D>I<FFC00003FFFFE00007FF0FE00007F00DF0000DF00DF000
+0DF00DF0000DF00CF80019F00CF80019F00C7C0031F00C7C0031F00C3E0061F00C3E0061F00C1F
+00C1F00C1F00C1F00C1F00C1F00C0F8181F00C0F8181F00C07C301F00C07C301F00C03E601F00C
+03E601F00C01FC01F00C01FC01F00C01FC01F00C00F801F00C00F801F0FFC0701FFFFFC0701FFF
+281C7E9B2D>I<FFE003FFFFE003FF0FF000300FF800300DFC00300CFE00300C7E00300C3F0030
+0C1F80300C1FC0300C0FE0300C07F0300C03F0300C01F8300C01FC300C00FE300C007F300C003F
+300C001FB00C001FF00C000FF00C0007F00C0003F00C0001F00C0000F00C0000F0FFC00070FFC0
+0030201C7E9B25>I<003FE00001F07C0003C01E000F800F801F0007C01E0003C03E0003E07E00
+03F07C0001F07C0001F0FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC
+0001F87C0001F07E0003F07E0003F03E0003E03F0007E01F0007C00F800F8003C01E0001F07C00
+003FE0001D1C7D9B24>I<FFFFF800FFFFFE000FC03F800FC00F800FC007C00FC007E00FC007E0
+0FC007E00FC007E00FC007E00FC007C00FC007C00FC00F800FC03F000FFFFC000FC000000FC000
+000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00000FFFC
+0000FFFC00001B1C7E9B21>I<003FE00001F07C0003C01E000F800F801F0007C01F0007C03E00
+03E07E0003F07C0001F07C0001F0FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC
+0001F8FC0001F87C0001F07C0001F07E0003F03E0003E03E0703E01F08C7C00F906F8003D07E00
+01F87C00003FF8080000380800003C1800003FF800001FF800001FF000000FF0000007E0000003
+C01D247D9B24>I<FFFFF00000FFFFFE00000FC03F00000FC00F80000FC007C0000FC007E0000F
+C007E0000FC007E0000FC007E0000FC007E0000FC007C0000FC00F80000FC03E00000FFFF00000
+0FC07C00000FC03E00000FC03F00000FC01F80000FC01F80000FC01F80000FC01F80000FC01F80
+000FC01F80000FC01F81800FC01F81800FC00FC180FFFC07C300FFFC01FE00211C7E9B24>I<07
+F8201FFEE03C07E07801E07000E0F000E0F00060F00060F80000FE0000FFE0007FFE003FFF003F
+FF800FFFC007FFE0007FE00003F00001F00000F0C000F0C000F0C000E0E000E0F001C0FC03C0EF
+FF0083FC00141C7D9B1B>I<7FFFFFE07FFFFFE0781F81E0701F80E0601F8060E01F8070C01F80
+30C01F8030C01F8030C01F8030001F8000001F8000001F8000001F8000001F8000001F8000001F
+8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800007
+FFFE0007FFFE001C1C7E9B21>I<FFFC03FFFFFC03FF0FC000300FC000300FC000300FC000300F
+C000300FC000300FC000300FC000300FC000300FC000300FC000300FC000300FC000300FC00030
+0FC000300FC000300FC000300FC000300FC0003007C0003007C0006003E000E001F001C000FC07
+80007FFE00000FF800201C7E9B25>I<FFFC01FF80FFFC01FF800FC000180007E000300007E000
+300007F000700003F000600003F800E00001F800C00001FC00C00000FC01800000FC018000007E
+030000007E030000007F070000003F060000003F8E0000001F8C0000001FCC0000000FD8000000
+0FD800000007F000000007F000000007F000000003E000000003E000000001C000000001C00000
+211C7F9B24>I<FFFC7FFE0FFCFFFC7FFE0FFC0FC007E000C00FC007F000C00FE003F001C007E0
+03F0018007E007F8018003F007F8030003F007F8030003F80CFC070001F80CFC060001F81CFE06
+0001FC187E0E0000FC187E0C0000FC387F0C00007E303F1800007E303F1800007F601FB800003F
+601FB000003FE01FF000003FC00FF000001FC00FE000001FC00FE000000F8007C000000F8007C0
+00000F0003C0000007000380000007000380002E1C7F9B31>I<0FF8001C1E003E0F803E07803E
+07C01C07C00007C0007FC007E7C01F07C03C07C07C07C0F807C0F807C0F807C0780BC03E13F80F
+E1F815127F9117>97 D<FF0000FF00001F00001F00001F00001F00001F00001F00001F00001F00
+001F00001F3F801FE1E01F80701F00781F003C1F003C1F003E1F003E1F003E1F003E1F003E1F00
+3E1F003C1F003C1F00781F80701EC1E01C3F00171D7F9C1B>I<03FC000E0E001C1F003C1F0078
+1F00780E00F80000F80000F80000F80000F80000F800007800007801803C01801C03000E0E0003
+F80011127E9115>I<000FF0000FF00001F00001F00001F00001F00001F00001F00001F00001F0
+0001F001F9F00F07F01C03F03C01F07801F07801F0F801F0F801F0F801F0F801F0F801F0F801F0
+7801F07801F03C01F01C03F00F0FFE03F9FE171D7E9C1B>I<01FC000F07001C03803C01C07801
+C07801E0F801E0F801E0FFFFE0F80000F80000F800007800007C00603C00601E00C00F038001FC
+0013127F9116>I<007F0001E38003C7C00787C00F87C00F83800F80000F80000F80000F80000F
+8000FFF800FFF8000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F
+80000F80000F80000F80007FF8007FF800121D809C0F>I<03F8F00E0F381E0F381C07303C0780
+3C07803C07803C07801C07001E0F000E0E001BF8001000001800001800001FFF001FFFC00FFFE0
+1FFFF07801F8F00078F00078F000787000707800F01E03C007FF00151B7F9118>I<FF0000FF00
+001F00001F00001F00001F00001F00001F00001F00001F00001F00001F0FC01F31E01F40F01F80
+F81F80F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F8FFE7
+FFFFE7FF181D7F9C1B>I<1E003F003F003F003F001E00000000000000000000000000FF00FF00
+1F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B1E7F9D0E>I<
+007800FC00FC00FC00FC007800000000000000000000000003FC03FC007C007C007C007C007C00
+7C007C007C007C007C007C007C007C007C007C007C007C007C707CF87CF878F8F070E01F800E26
+839D0F>I<FF0000FF00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F
+0FF81F0FF81F03801F07001F0C001F18001F70001FF8001FFC001FBC001F3E001F1F001F0F001F
+0F801F07C01F03E0FFC7FCFFC7FC161D7F9C19>I<FF00FF001F001F001F001F001F001F001F00
+1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FF
+E00B1D7F9C0E>I<FF0FC07E00FF31E18F001F40F207801F80FC07C01F80FC07C01F00F807C01F
+00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C0
+1F00F807C01F00F807C0FFE7FF3FF8FFE7FF3FF825127F9128>I<FF0FC0FF31E01F40F01F80F8
+1F80F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F8FFE7FF
+FFE7FF18127F911B>I<01FC000F07801C01C03C01E07800F07800F0F800F8F800F8F800F8F800
+F8F800F8F800F87800F07800F03C01E01E03C00F078001FC0015127F9118>I<FF3F80FFE1E01F
+80F01F00781F007C1F003C1F003E1F003E1F003E1F003E1F003E1F003E1F003C1F007C1F00781F
+80F01FC1E01F3F001F00001F00001F00001F00001F00001F0000FFE000FFE000171A7F911B>I<
+03F0600F0CE01E07E03C03E07C03E07803E0F803E0F803E0F803E0F803E0F803E0F803E07803E0
+7C03E03C03E01C07E00E0FE003F3E00003E00003E00003E00003E00003E00003E0001FFC001FFC
+161A7E9119>I<FE3E00FE47001E8F801E8F801E8F801F07001F00001F00001F00001F00001F00
+001F00001F00001F00001F00001F0000FFF000FFF00011127F9114>I<1FD830786018E018E018
+F000FF807FE07FF01FF807FC007CC01CC01CE01CE018F830CFC00E127E9113>I<030003000300
+0300070007000F000F003FFCFFFC1F001F001F001F001F001F001F001F001F001F0C1F0C1F0C1F
+0C0F08079803F00E1A7F9913>I<FF07F8FF07F81F00F81F00F81F00F81F00F81F00F81F00F81F
+00F81F00F81F00F81F00F81F00F81F00F81F01F80F01F80786FF01F8FF18127F911B>I<FFC1FC
+FFC1FC1F00601F80E00F80C00FC0C007C18007C18003E30003E30001F60001F60001FE0000FC00
+00FC0000780000780000300016127F9119>I<FF8FF8FEFF8FF8FE1F03E0301F03E0301F83E070
+0F83F0600F86F06007C6F0C007CEF8C007EC79C003EC7D8003F83D8001F83F0001F83F0001F01F
+0000F01E0000E00E0000E00E001F127F9122>I<FFC7FCFFC7FC1F81800F838007C70003EE0001
+FC0001F80000F800007C0000FE0001DF00039F00070F800607C00C03E0FF07FCFF07FC16127F91
+19>I<FFC1FCFFC1FC1F00601F80E00F80C00FC0C007C18007C18003E30003E30001F70001F600
+00FE0000FC0000FC00007800007800003000003000007000706000F86000F8C000F98000730000
+3E0000161A7F9119>I<3FFF803C1F00303F00303E00607C0060FC0060F80001F00003F00007E0
+0007C1800F81801F81801F03803E03007E07007C0F00FFFF0011127F9115>I<FFFFFE1701808B
+18>I E /Fm 78 124 df<0001FC3C00060E67000C0EC7001C0DC6001C01C0003801C000380380
+0038038000380380003803800070038007FFFFF800700700007007000070070000E0070000E00E
+0000E00E0000E00E0000E00E0001C00E0001C01C0001C01C0001C01C0001C01C0003801C000380
+3800038038000380380003003800070030000700700006006000C6606000E470C000C861800070
+3E00002025819C19>11 D<0001FC000703000C03001C07001C0300180000380000380000380000
+380000700007FFFC00701C00701C00701C00E03800E03800E03800E03800E07001C07001C07001
+C07001C0E201C0E201C0E20380E4038064038038038000030000070000060000C60000E40000CC
+00007000001825819C17>I<0001FDC000070FC0000C0FC0001C0F80001C038000380380003803
+800038070000380700003807000070070007FFFE0000700E0000700E0000700E0000E01C0000E0
+1C0000E01C0000E01C0000E0380001C0380001C0380001C0380001C0710001C071000380710003
+8072000380320003801C0003800000030000000700000006000000C6000000E4000000CC000000
+700000001A25819C18>I<00E000100190003003080060060C01C00E0B8F800C0871801C080300
+1C0806001C080C00381018003810300038106000382060003820C0001841800018830000070607
+00000C0C800018184000183040003070400060604000C0E0400180E0400300E0400601C0800C01
+C0800C01C0801801C1003001C1006000C200C000C400800038001C217A9E22>37
+D<183C3C3C0404080810204080060C779C0D>39 D<00030006000800180030006000C000C00180
+03000300060006000C000C001C0018001800380030003000700070006000600060006000E000E0
+00E000E000E0006000600060006000600020003000100008000800102A7B9E11>I<0010001000
+08000C000400060006000600060006000700070007000700070006000600060006000E000E000C
+000C001C001800180038003000300060006000C000C001800300030006000C00180010006000C0
+00102A809E11>I<0030000060000060000060001841803C47000ECE0007B80001E00003C0000E
+F00039B800711E00C10C000300000300000300000600001112799E15>I<183878380808101020
+404080050C7D830D>44 D<FFC0FFC0FFC00A037D890F>I<3078F06005047C830D>I<0000020000
+0600000600000C00000C0000180000300000300000600000600000C00000C00001800001800003
+00000600000600000C00000C0000180000180000300000300000600000C00000C0000180000180
+000300000300000600000C00000C0000180000180000300000300000600000600000C000008000
+0017297F9E15>I<003C0000C6000183000303000603000603800E03800C03801C03801C030038
+0700380700380700380700700E00700E00700E00700E00E01C00E01C00E01C00E03800E03800E0
+3000C06000E0600060C0007180001E0000111D7B9B15>I<00020006000C001C007C039C003800
+3800380038007000700070007000E000E000E000E001C001C001C001C003800380038003800780
+FFF00F1C7C9B15>I<003C0000C3000101800201800201C00441C00441C00841C00841C00841C0
+1083801083801107000E0600000C0000180000300000C000010000060000080000100100100200
+2002004006007E0C00C7F80083F80080E000121D7C9B15>I<003E0000C1800101800200C00400
+C00440C00841C00841C00841C0088380070380000700000E0001F800003800000C00000C00000E
+00000E00000E00000E00700E00E01C00801C0080380080300040600021C0001F0000121D7C9B15
+>I<0001800001C0000380000380000380000300000700000700000600000E00000C00001C0000
+180000180000300000300000600000400000C600018E00010E00020E00061C000C1C00181C003F
+1C0040F800803F0000380000380000700000700000700000700000E00000600012247E9B15>I<
+00C06000FFC001FF8001FE00010000010000020000020000020000020000047800058C00060600
+040600080600000700000700000600000E00000E00700E00700C00E01C00801800803800403000
+40600021C0001F0000131D7C9B15>I<000F0000308000C0800183800383800300000600000E00
+000C00001C00001CF0003B18003C0C00380C00780C00700E00700E00700E00601C00E01C00E01C
+00E01C00E03800E03800E0700060600060C0002180001E0000111D7B9B15>I<09C04017E0801F
+E0803C6100302700601A00400600400400800C0080080000180000100000300000600000600000
+600000C00000C00001C0000180000380000380000300000700000700000700000E00000E00000C
+0000121D799B15>I<001E000061000081800180800300C00300C0060180060180060180070300
+07860003CC0003F00001F000037800063C00081E00180E00300E00600600600600600600C00C00
+C00C00C0180060100060200030C0000F0000121D7C9B15>I<003C0000C6000183000303000603
+000E03000C03801C03801C03001C0300380700380700380700380F00380E00181E00181E000C6C
+00079C00001C00001800003800003000006000E0C000E0C0008180008600007C0000111D7B9B15
+>I<060F0F06000000000000000000003078F06008127C910D>I<03000780078003000000000000
+000000000000000000000000000000180038007800380008000800100010002000400040008000
+091A7D910D>I<0FFFFFE01FFFFFF0000000000000000000000000000000000000000000000000
+0000000000000000FFFFFF807FFFFF001C0C7C8F20>61 D<01E006180808100C100C200C400C40
+1C8018E038E070C1E003C007800F001C0038003080308031001E00000000000000000000003000
+7800F00060000E1E789D15>63 D<00001800000018000000380000003800000078000000780000
+00B8000001B800000138000002380000023C0000041C0000041C0000081C0000181C0000101C00
+00201C0000201C00007FFC0000401C0000801C0001801C0001001C0002001C0002001C0004000E
+000C000E001C001E00FF00FFC01A1D7E9C1F>65 D<01FFFE00003C0780003803C0003801C00038
+01C0003801C0007001C0007003C0007003C00070078000E0070000E00E0000E03C0000FFF80001
+C01C0001C00E0001C00F0001C00F0003800F0003800F0003800F0003800F0007001E0007001C00
+07003C00070078000E01E000FFFF80001A1C7D9B1D>I<0003F020001E0C60003002E000E003C0
+01C001C0038001C0070000C00E0000801E0000801C0000803C0000803C00000078000000780000
+0078000000F0000000F0000000F0000000F0000000F0000400F0000400F0000400F00008007000
+08007000100038002000180040000C0180000706000001F800001B1E7A9C1E>I<01FFFE00003C
+0780003801C0003801C0003800E0003800E0007000F00070007000700070007000F000E000F000
+E000F000E000F000E000F001C001E001C001E001C001E001C001C0038003C00380038003800780
+0380070007000E0007001C0007003800070070000E01C000FFFF00001C1C7D9B1F>I<01FFFFE0
+003C00E0003800600038004000380040003800400070004000700040007020400070200000E040
+0000E0400000E0C00000FFC00001C0800001C0800001C0800001C0800003810100038001000380
+020003800200070004000700040007000C00070018000E007800FFFFF0001B1C7D9B1C>I<01FF
+FFC0003C01C0003800C00038008000380080003800800070008000700080007020800070200000
+E0400000E0400000E0C00000FFC00001C0800001C0800001C0800001C080000381000003800000
+0380000003800000070000000700000007000000070000000F000000FFF000001A1C7D9B1B>I<
+0003F020001E0C60003002E000E003C001C001C0038001C0070000C00E0000801E0000801C0000
+803C0000803C000000780000007800000078000000F0000000F0000000F001FFC0F0001E00F000
+1C00F0001C00F0001C00F0001C00700038007000380038003800180078000C0090000707100001
+F800001B1E7A9C20>I<01FFCFFE003C01E0003801C0003801C0003801C0003801C00070038000
+700380007003800070038000E0070000E0070000E0070000FFFF0001C00E0001C00E0001C00E00
+01C00E0003801C0003801C0003801C0003801C00070038000700380007003800070038000F0078
+00FFE7FF001F1C7D9B1F>I<01FFC0003C00003800003800003800003800007000007000007000
+00700000E00000E00000E00000E00001C00001C00001C00001C000038000038000038000038000
+0700000700000700000700000F0000FFE000121C7E9B10>I<007FF00007800007000007000007
+00000700000E00000E00000E00000E00001C00001C00001C00001C000038000038000038000038
+0000700000700000700000700060E000E0E000C0C00081C0008380004700003C0000141D7B9B16
+>I<01FFC0FF003C003C0038003000380040003800800038010000700200007004000070100000
+70200000E0400000E0C00000E1C00000E5C00001C8E00001D0E00001E0E00001C0700003807000
+0380700003803800038038000700380007001C0007001C0007001C000F001E00FFE0FF80201C7D
+9B20>I<01FFE0003C0000380000380000380000380000700000700000700000700000E00000E0
+0000E00000E00001C00001C00001C00001C0000380080380080380080380100700100700300700
+600700E00E03C0FFFFC0151C7D9B1A>I<01FE0007F8003E000780002E000F00002E001700002E
+001700002E002700004E002E00004E004E00004E004E00004E008E00008E011C00008E011C0000
+8E021C00008E021C00010704380001070438000107083800010710380002071070000207207000
+02072070000207407000040740E000040780E000040700E0000C0700E0001C0601E000FF861FFC
+00251C7D9B25>I<01FC03FE001C0070003C0060002E0040002E0040002E004000470080004700
+8000470080004380800083810000838100008181000081C1000101C2000101C2000100E2000100
+E2000200E4000200740002007400020074000400380004003800040038000C0018001C001000FF
+8010001F1C7D9B1F>I<0007F000001C1C0000700E0000E0070001C0038003800380070003800E
+0003C01E0003C01C0003C03C0003C03C0003C0780003C0780003C0780003C0F0000780F0000780
+F0000780F0000F00F0000F00F0000E00F0001E00F0003C0070003800700070007800E0003801C0
+001C0380000E0E000003F800001A1E7A9C20>I<01FFFC00003C070000380380003801C0003801
+C0003801C0007003C0007003C0007003C00070038000E0078000E0070000E00E0000E0380001FF
+E00001C0000001C0000001C0000003800000038000000380000003800000070000000700000007
+000000070000000F000000FFE000001A1C7D9B1C>I<0007F000001C1C0000700E0000E0070001
+C0078003800380070003800E0003C01E0003C01C0003C03C0003C03C0003C0780003C0780003C0
+780003C0F0000780F0000780F0000780F0000F00F0000F00F0000E00F0001E00F0001C00707838
+00708070007104E0003905C0001D0780000F0E040003FE040000060C0000060800000E1800000F
+F0000007F0000007E000000380001A257A9C20>I<01FFF800003C0E0000380700003803800038
+03800038038000700780007007800070078000700F0000E00E0000E01C0000E0700000FFC00001
+C0C00001C0600001C0700001C07000038070000380700003807000038070000700F0000700F040
+0700F0400700F0800F007880FFE0790000001E001A1D7D9B1E>I<000F8400304C00403C008018
+01001803001803001806001006001006000007000007000003E00003FC0001FF00007F800007C0
+0001C00001C00000C00000C02000C02000C0600180600180600300600200F00400CC180083E000
+161E7D9C17>I<1FFFFFC01C0701C0300E00C0200E0080600E0080400E0080401C0080801C0080
+801C0080001C000000380000003800000038000000380000007000000070000000700000007000
+0000E0000000E0000000E0000000E0000001C0000001C0000001C0000001C0000003C000007FFE
+00001A1C799B1E>I<7FF0FF800F001C000E0018000E0010000E0010000E0010001C0020001C00
+20001C0020001C0020003800400038004000380040003800400070008000700080007000800070
+008000E0010000E0010000E0010000E0020000E0020000E0040000E00400006008000030300000
+104000000F800000191D779B1F>I<FF803FC01C000F001C0004001C0008001C0008001C001000
+1C0010001C0020001C0040001C0040001E0080000E0080000E0100000E0200000E0200000E0400
+000E0400000E0800000E1800000E1000000E200000072000000740000007C00000078000000700
+00000700000006000000060000001A1D779B1F>I<FF83FF0FF03C007001C038007001803800F0
+01003800F0020038017002003801700400380270040038027008001C047008001C047010001C08
+7010001C087020001C107020001C107040001C207040001C207080001C407180001C407100001C
+807200001D807200001D007400001E007400001E007800001C007800001C007000001800700000
+18006000001000600000241D779B29>I<01FF81FE001E00F0001C0060001E0080000E0180000E
+0100000F02000007040000070800000790000003A0000003C0000001C0000001C0000001E00000
+02E0000004E0000008F0000010700000207000006038000040380000803C0001001C0002001C00
+06001E001E001E00FF80FFC01F1C7E9B1F>I<FFC00FE00E0007800E0006000F00040007000800
+0700180007801000038020000380400003C0800001C1800001C1000001E2000000E4000000EC00
+0000F80000007000000070000000E0000000E0000000E0000000E0000001C0000001C0000001C0
+000001C00000038000003FF800001B1C789B1F>I<03CC063C0C3C181C3838303870387038E070
+E070E070E070E0E2C0E2C0E261E462643C380F127B9115>97 D<3F00070007000E000E000E000E
+001C001C001C001C0039C03E60383038307038703870387038E070E070E070E060E0E0C0C0C1C0
+618063003C000D1D7B9C13>I<01F007080C08181C3838300070007000E000E000E000E000E000
+E008E010602030C01F000E127B9113>I<001F8000038000038000070000070000070000070000
+0E00000E00000E00000E0003DC00063C000C3C00181C00383800303800703800703800E07000E0
+7000E07000E07000E0E200C0E200C0E20061E4006264003C3800111D7B9C15>I<01E007100C10
+18083810701070607F80E000E000E000E000E000E0086010602030C01F000D127B9113>I<0003
+C0000670000C70001C60001C00001C0000380000380000380000380000380003FF800070000070
+0000700000700000700000E00000E00000E00000E00000E00001C00001C00001C00001C00001C0
+00038000038000038000030000030000070000C60000E60000CC00007800001425819C0D>I<00
+F3018F030F06070E0E0C0E1C0E1C0E381C381C381C381C383830383038187818F00F7000700070
+00E000E0C0C0E1C0C3007E00101A7D9113>I<0FC00001C00001C0000380000380000380000380
+000700000700000700000700000E78000E8C000F0E000E0E001C0E001C0E001C0E001C0E00381C
+00381C00381C00383800703880703880707080707100E03200601C00111D7D9C15>I<01800380
+010000000000000000000000000000001C002600470047008E008E000E001C001C001C00380038
+00710071007100720072003C00091C7C9B0D>I<0006000E000600000000000000000000000000
+0000F00118021802180438043800380038007000700070007000E000E000E000E001C001C001C0
+01C003800380C300E700CE0078000F24819B0D>I<0FC00001C00001C000038000038000038000
+0380000700000700000700000700000E0F000E11000E23800E43801C83001C80001D00001E0000
+3F800039C00038E00038E00070E20070E20070E20070E400E06400603800111D7D9C13>I<1F80
+0380038007000700070007000E000E000E000E001C001C001C001C003800380038003800700070
+0070007000E400E400E400E40068003800091D7C9C0B>I<3C1E0780266318C04683A0E04703C0
+E08E0380E08E0380E00E0380E00E0380E01C0701C01C0701C01C0701C01C070380380E0388380E
+0388380E0708380E0710701C0320300C01C01D127C9122>I<3C3C002646004687004707008E07
+008E07000E07000E07001C0E001C0E001C0E001C1C00381C40381C40383840383880701900300E
+0012127C9117>I<01E007180C0C180C380C300E700E700EE01CE01CE01CE018E038E030E06060
+C031801E000F127B9115>I<07870004D98008E0C008E0C011C0E011C0E001C0E001C0E00381C0
+0381C00381C00381800703800703000707000706000E8C000E70000E00000E00001C00001C0000
+1C00001C00003C0000FF8000131A7F9115>I<03C4062C0C3C181C3838303870387038E070E070
+E070E070E0E0C0E0C0E061E063C03DC001C001C0038003800380038007803FF00E1A7B9113>I<
+3C3C26C2468747078E068E000E000E001C001C001C001C0038003800380038007000300010127C
+9112>I<01F006080C080C1C18181C001F001FC00FF007F0007800386030E030C030806060C01F
+000E127D9111>I<00C001C001C001C00380038003800380FFE00700070007000E000E000E000E
+001C001C001C001C00384038403840388019000E000B1A7D990E>I<1E03002707004707004707
+00870E00870E000E0E000E0E001C1C001C1C001C1C001C1C003838803838801838801839001C59
+00078E0011127C9116>I<1E06270E470E4706870287020E020E021C041C041C041C0818083808
+181018200C4007800F127C9113>I<1E01832703874703874703838707018707010E07010E0701
+1C0E021C0E021C0E021C0E04180C04181C04181C081C1C100C263007C3C018127C911C>I<070E
+0019910010E38020E38041C30041C00001C00001C0000380000380000380000380000702006702
+00E70400CB04008B080070F00011127D9113>I<1E03270747074707870E870E0E0E0E0E1C1C1C
+1C1C1C1C1C38383838183818381C7007F00070007000E0E0C0E1C0818047003C00101A7C9114>
+I<038207C20FEC08381008001000200040008001000200040008081008383067F043E081C00F12
+7D9111>I<FFFFC012017C8B15>I E /Fn 23 121 df<00001E000000003E00000000FE00000003
+FE0000003FFE0000FFFFFE0000FFFFFE0000FFFFFE0000FFCFFE0000000FFE0000000FFE000000
+0FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000
+000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00
+00000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE
+0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000F
+FE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000000
+0FFE0000000FFE00007FFFFFFFC07FFFFFFFC07FFFFFFFC07FFFFFFFC0223879B731>49
+D<0007FE0000007FFFE00001FFFFF80003FFFFFE0007F01FFF000F8007FF801F0001FFC03E0000
+FFE07F8000FFF07FC0007FF0FFE0007FF8FFF0003FF8FFF0003FFCFFF0003FFCFFF0003FFCFFF0
+003FFC7FE0003FFC3FC0003FFC1F80003FFC0000003FFC0000003FF80000007FF80000007FF000
+00007FF0000000FFE0000000FFC0000001FF80000001FF00000003FE00000007FC00000007F800
+00000FF00000001FC00000003F800000007F00000000FC00000001F800000001F0003C0003E000
+3C0007C0003C000F000078001E000078003C00007800780000F800F00000F801FFFFFFF803FFFF
+FFF007FFFFFFF00FFFFFFFF01FFFFFFFF03FFFFFFFF07FFFFFFFF0FFFFFFFFF0FFFFFFFFE0FFFF
+FFFFE0FFFFFFFFE026387BB731>I<0003FF8000001FFFF000007FFFFE0000FE03FF0001F000FF
+8003C000FFC00780007FE00FF0007FF00FF8007FF01FFC007FF81FFE007FF81FFE007FF81FFE00
+7FF81FFE007FF81FFE007FF80FFC007FF007F8007FF003F0007FF0000000FFE0000000FFC00000
+01FF80000001FF00000003FE00000007FC0000001FF000000FFFC000000FFF8000000FFFF80000
+0003FE00000000FF800000007FE00000003FF00000003FF80000003FFC0000001FFC0000001FFE
+0000001FFE0200001FFF1FC0001FFF3FE0001FFF7FF0001FFF7FF0001FFFFFF8001FFFFFF8001F
+FFFFF8001FFEFFF8001FFEFFF0001FFE7FF0003FFC7FE0003FFC3FC0003FF81F80007FF01FE000
+FFE007FC03FFC003FFFFFF0001FFFFFE00003FFFF0000007FF800028397CB731>I<00000007C0
+000000000FC0000000000FC0000000001FC0000000003FC0000000007FC000000000FFC0000000
+00FFC000000001FFC000000003FFC000000007FFC00000000FFFC00000000FFFC00000001EFFC0
+0000003CFFC00000007CFFC0000000F8FFC0000000F0FFC0000001E0FFC0000003C0FFC0000007
+C0FFC000000F80FFC000000F00FFC000001E00FFC000003C00FFC000007C00FFC00000F800FFC0
+0000F000FFC00001E000FFC00003C000FFC00007C000FFC0000F8000FFC0000F0000FFC0001E00
+00FFC0003C0000FFC0007C0000FFC000F80000FFC000FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFF
+C0FFFFFFFFFFC0000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0000000
+01FFC000000001FFC000000001FFC000000001FFC000000001FFC0000007FFFFFFC00007FFFFFF
+C00007FFFFFFC00007FFFFFFC02A377DB631>I<04000000C00F800007C00FF8007FC00FFFFFFF
+800FFFFFFF000FFFFFFE000FFFFFFC000FFFFFF8000FFFFFF0000FFFFFE0000FFFFF80000FFFFE
+00000FFFF800000F800000000F800000000F800000000F800000000F800000000F800000000F80
+0000000F800000000F81FF00000F8FFFE0000FBFFFF8000FFE03FE000FF000FF000FC000FF800F
+80007FC00F00007FE00700007FF00000003FF00000003FF80000003FF80000003FF80000003FFC
+0000003FFC0600003FFC1F80003FFC3FC0003FFC7FE0003FFCFFE0003FFCFFF0003FFCFFF0003F
+FCFFF0003FF8FFE0003FF8FFE0003FF87FC0007FF07F00007FF03C00007FE03E0000FFC01F0000
+FF800FC003FF0007F00FFE0003FFFFFC0001FFFFF000007FFFC000000FFC000026397BB731>I<
+00000FF80000007FFF000003FFFF80000FFC07C0001FE001E0003FC001F0007F0007F000FF000F
+F001FE001FF803FC003FF807FC003FF80FFC003FF80FF8003FF81FF8001FF01FF8000FE03FF800
+07C03FF00000003FF00000007FF00000007FF00000007FF00000007FF07FF000FFF0FFFE00FFF1
+F7FF00FFF3807F80FFF6003FE0FFFE001FF0FFFC001FF0FFFC000FF8FFF8000FFCFFF8000FFCFF
+F8000FFEFFF8000FFEFFF0000FFEFFF0000FFFFFF0000FFFFFF0000FFF7FF0000FFF7FF0000FFF
+7FF0000FFF7FF0000FFF7FF0000FFF3FF0000FFF3FF0000FFE3FF0000FFE1FF0000FFE1FF8000F
+FC0FF8000FFC0FF8001FF807FC001FF003FC001FF001FE003FE000FF80FFC0007FFFFF00001FFF
+FE000007FFF8000000FFC00028397CB731>I<1E00000000001F00000000001FF0000000001FFF
+FFFFFFC01FFFFFFFFFC01FFFFFFFFFC03FFFFFFFFFC03FFFFFFFFF803FFFFFFFFF003FFFFFFFFE
+003FFFFFFFFC003FFFFFFFF8003FFFFFFFF0007FFFFFFFF0007C000007E0007C00000FC0007800
+001F80007800001F00007800003E0000F000007E0000F00000FC0000F00001F80000000003F000
+00000003E00000000007E0000000000FC0000000000F80000000001F80000000003F8000000000
+3F00000000007F00000000007F0000000000FF0000000000FE0000000001FE0000000001FE0000
+000003FE0000000003FE0000000003FE0000000007FC0000000007FC0000000007FC000000000F
+FC000000000FFC000000000FFC000000000FFC000000000FFC000000001FFC000000001FFC0000
+00001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001F
+FC000000000FF80000000007F00000000003E00000002A3B7BB931>I<0001FF8000000FFFF800
+003FFFFE00007F00FF0000F8003F8001F0000FC003E0000FE007C00007F007C00007F00FC00003
+F80FC00003F81FC00003F81FC00003F81FE00003F81FF00003F81FF80003F81FFC0007F01FFF00
+07F01FFFC007E00FFFF00FE00FFFFC1FC007FFFE3F8007FFFFFF0003FFFFFC0001FFFFF80000FF
+FFFE00007FFFFF00003FFFFF80003FFFFFE000FFFFFFF001FDFFFFF007F07FFFF80FE01FFFFC1F
+C007FFFC3F8001FFFE3F8000FFFE7F00003FFF7F00000FFFFE000003FFFE000001FFFE000000FF
+FE000000FFFE0000007FFE0000007FFE0000007EFE0000007E7F0000007E7F000000FC3F800000
+FC3FC00001F81FE00003F00FF00007E007FE007FC003FFFFFF8000FFFFFE00003FFFF8000003FF
+800028397CB731>I<00000001F80000000000000001F80000000000000003FC00000000000000
+03FC0000000000000007FE0000000000000007FE0000000000000007FE000000000000000FFF00
+0000000000000FFF000000000000001FFF800000000000001FFF800000000000001FFF80000000
+0000003FFFC00000000000003FFFC00000000000007FFFE00000000000007DFFE0000000000000
+7DFFE0000000000000FDFFF0000000000000F8FFF0000000000001F8FFF8000000000001F07FF8
+000000000001F07FF8000000000003F07FFC000000000003E03FFC000000000007E03FFE000000
+000007C01FFE00000000000FC01FFF00000000000F801FFF00000000000F800FFF00000000001F
+800FFF80000000001F0007FF80000000003F0007FFC0000000003E0003FFC0000000003E0003FF
+C0000000007E0003FFE0000000007C0001FFE000000000FC0001FFF000000000F80000FFF00000
+0000F80000FFF000000001FFFFFFFFF800000001FFFFFFFFF800000003FFFFFFFFFC00000003FF
+FFFFFFFC00000003E000003FFC00000007E000003FFE00000007C000001FFE0000000FC000001F
+FF0000000F8000000FFF0000001F8000000FFF8000001F0000000FFF8000001F00000007FF8000
+003F00000007FFC000003E00000003FFC000007E00000003FFE00000FF00000001FFE000FFFFFC
+0001FFFFFFF0FFFFFC0001FFFFFFF0FFFFFC0001FFFFFFF0FFFFFC0001FFFFFFF0443B7DBA4B>
+65 D<FFFFFFFFFFC00000FFFFFFFFFFFC0000FFFFFFFFFFFF0000FFFFFFFFFFFFC000007FF000
+01FFF000007FF000007FF800007FF000003FFC00007FF000001FFE00007FF000001FFE00007FF0
+00000FFF00007FF000000FFF00007FF0000007FF80007FF0000007FF80007FF0000007FF80007F
+F0000007FF80007FF0000007FF80007FF0000007FF80007FF0000007FF80007FF0000007FF0000
+7FF000000FFF00007FF000000FFF00007FF000001FFE00007FF000001FFC00007FF000003FF800
+007FF000007FF000007FF00001FFE000007FF0000FFF8000007FFFFFFFFE0000007FFFFFFFFE00
+00007FFFFFFFFFC000007FF000007FF000007FF000001FFC00007FF000000FFE00007FF0000007
+FF00007FF0000007FF80007FF0000003FFC0007FF0000003FFC0007FF0000001FFE0007FF00000
+01FFE0007FF0000001FFF0007FF0000001FFF0007FF0000001FFF0007FF0000001FFF0007FF000
+0001FFF0007FF0000001FFF0007FF0000001FFF0007FF0000001FFF0007FF0000001FFE0007FF0
+000003FFE0007FF0000003FFC0007FF0000007FFC0007FF000000FFF80007FF000001FFF00007F
+F000003FFE00007FF00001FFFC00FFFFFFFFFFFFF800FFFFFFFFFFFFE000FFFFFFFFFFFF8000FF
+FFFFFFFFF800003C3B7CBA46>I<0000001FFF000030000001FFFFE000F000000FFFFFFC01F000
+007FFFFFFE03F00001FFFE007F87F00003FFE0000FCFF0000FFF000003FFF0001FFC000001FFF0
+003FF80000007FF0007FF00000003FF000FFC00000003FF001FFC00000001FF003FF800000000F
+F007FF000000000FF00FFF0000000007F00FFE0000000007F01FFE0000000003F01FFE00000000
+03F03FFC0000000003F03FFC0000000001F03FFC0000000001F07FFC0000000001F07FF8000000
+0001F07FF80000000000007FF8000000000000FFF8000000000000FFF8000000000000FFF80000
+00000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF800
+0000000000FFF8000000000000FFF8000000000000FFF80000000000007FF80000000000007FF8
+0000000000007FF80000000000007FFC0000000000F03FFC0000000000F03FFC0000000000F03F
+FC0000000000F01FFE0000000000F01FFE0000000001E00FFE0000000001E00FFF0000000001E0
+07FF0000000003C003FF8000000003C001FFC0000000078000FFE00000000F00007FF00000001F
+00003FF80000003E00001FFC0000007C00000FFF000001F8000003FFE00007F0000001FFFE003F
+C00000007FFFFFFF000000000FFFFFFC0000000001FFFFF000000000001FFF0000003C3D7BBB47
+>I<FFFFFFFFFFC0000000FFFFFFFFFFFC000000FFFFFFFFFFFF800000FFFFFFFFFFFFE0000000
+7FF80003FFF80000007FF800003FFE0000007FF800000FFF0000007FF8000003FF8000007FF800
+0001FFC000007FF8000000FFE000007FF80000007FF000007FF80000003FF800007FF80000003F
+F800007FF80000001FFC00007FF80000001FFC00007FF80000000FFE00007FF80000000FFE0000
+7FF80000000FFF00007FF800000007FF00007FF800000007FF00007FF800000007FF80007FF800
+000007FF80007FF800000007FF80007FF800000007FF80007FF800000007FFC0007FF800000007
+FFC0007FF800000007FFC0007FF800000007FFC0007FF800000007FFC0007FF800000007FFC000
+7FF800000007FFC0007FF800000007FFC0007FF800000007FFC0007FF800000007FFC0007FF800
+000007FFC0007FF800000007FFC0007FF800000007FF80007FF800000007FF80007FF800000007
+FF80007FF800000007FF80007FF800000007FF00007FF80000000FFF00007FF80000000FFF0000
+7FF80000000FFE00007FF80000001FFE00007FF80000001FFC00007FF80000003FFC00007FF800
+00003FF800007FF80000007FF000007FF8000000FFE000007FF8000001FFC000007FF8000003FF
+8000007FF800000FFF0000007FF800003FFE0000007FF80003FFF80000FFFFFFFFFFFFF00000FF
+FFFFFFFFFF800000FFFFFFFFFFFE000000FFFFFFFFFFC0000000423B7CBA4C>I<FFFFFFFFFFFF
+F000FFFFFFFFFFFFF000FFFFFFFFFFFFF000FFFFFFFFFFFFF000007FF80001FFF800007FF80000
+1FF800007FF8000007F800007FF8000003F800007FF8000001F800007FF8000000F800007FF800
+0000F800007FF80000007C00007FF80000007C00007FF80000007C00007FF80000003C00007FF8
+0000003C00007FF8003C003C00007FF8003C003C00007FF8003C001E00007FF8003C001E00007F
+F8003C001E00007FF8003C000000007FF8007C000000007FF8007C000000007FF800FC00000000
+7FF803FC000000007FFFFFFC000000007FFFFFFC000000007FFFFFFC000000007FFFFFFC000000
+007FF803FC000000007FF800FC000000007FF8007C000000007FF8007C000000007FF8003C0000
+00007FF8003C000780007FF8003C000780007FF8003C000780007FF8003C000F00007FF8003C00
+0F00007FF80000000F00007FF80000000F00007FF80000001F00007FF80000001F00007FF80000
+001E00007FF80000003E00007FF80000003E00007FF80000003E00007FF80000007E00007FF800
+0000FE00007FF8000001FC00007FF8000003FC00007FF8000007FC00007FF800001FFC00007FF8
+0001FFFC00FFFFFFFFFFFFFC00FFFFFFFFFFFFF800FFFFFFFFFFFFF800FFFFFFFFFFFFF800393B
+7CBA41>I<001FFF00000001FFFFF0000003FFFFFC000007F007FE00000FF801FF00001FFC00FF
+80001FFC007FC0001FFC007FE0001FFC003FE0000FF8003FF0000FF8003FF00007F0003FF00001
+C0003FF0000000003FF0000000003FF0000000003FF0000000FFFFF000000FFFFFF000007FF83F
+F00001FF803FF00007FE003FF0000FF8003FF0001FF0003FF0003FE0003FF0007FE0003FF0007F
+E0003FF000FFC0003FF000FFC0003FF000FFC0003FF000FFC0003FF000FFC0007FF0007FE0007F
+F0007FE000DFF0003FF0039FF8001FFC0F0FFFF007FFFE0FFFF001FFFC07FFF0003FE000FFF02C
+267DA530>97 D<000000003FC00000003FFFC00000003FFFC00000003FFFC00000003FFFC00000
+0001FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FF
+C000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC00000
+0000FFC000000000FFC000000000FFC000000000FFC00000FFC0FFC0000FFFF8FFC0003FFFFEFF
+C000FFE03FFFC001FF000FFFC003FE0003FFC007FC0001FFC00FF80000FFC01FF00000FFC01FF0
+0000FFC03FF00000FFC03FE00000FFC07FE00000FFC07FE00000FFC07FE00000FFC0FFE00000FF
+C0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE0
+0000FFC0FFE00000FFC07FE00000FFC07FE00000FFC07FE00000FFC03FF00000FFC03FF00000FF
+C01FF00000FFC00FF80001FFC007F80003FFC003FC0007FFC001FE000FFFE000FFC07EFFFF003F
+FFFCFFFF000FFFF0FFFF0001FF80FFFF303C7DBB37>100 D<0001FFC000000FFFF800003FFFFE
+0000FF80FF0001FE003F8007FC001FC00FF8000FE00FF8000FF01FF00007F03FF00007F83FF000
+07F87FE00007F87FE00003FC7FE00003FC7FE00003FCFFE00003FCFFFFFFFFFCFFFFFFFFFCFFFF
+FFFFFCFFE0000000FFE0000000FFE0000000FFE00000007FE00000007FE00000007FE00000003F
+E00000003FF000003C1FF000003C1FF000003C0FF800007807FC0000F803FE0001F001FF0007E0
+00FFC03FC0003FFFFF000007FFFC000000FFE00026267DA52D>I<00FF00000000FFFF00000000
+FFFF00000000FFFF00000000FFFF0000000007FF0000000003FF0000000003FF0000000003FF00
+00000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00000000
+03FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00
+00000003FF007FC00003FF01FFF80003FF07FFFC0003FF0F03FE0003FF1C01FF0003FF3001FF80
+03FF6000FF8003FFE000FFC003FFC000FFC003FF8000FFC003FF8000FFC003FF8000FFC003FF00
+00FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC0
+03FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF00
+00FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC0
+03FF0000FFC003FF0000FFC0FFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFF303C7C
+BB37>104 D<01F00007FC000FFE000FFE001FFF001FFF001FFF001FFF001FFF000FFE000FFE00
+07FC0001F00000000000000000000000000000000000000000000000000000000000000000FF00
+FFFF00FFFF00FFFF00FFFF0007FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00
+03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00
+03FF0003FF0003FF0003FF0003FF0003FF0003FF00FFFFF8FFFFF8FFFFF8FFFFF8153D7DBC1B>
+I<00FE007FC000FFFE01FFF800FFFE07FFFC00FFFE0F03FE00FFFE1C01FF0007FE3001FF8003FE
+6000FF8003FEE000FFC003FEC000FFC003FF8000FFC003FF8000FFC003FF8000FFC003FF0000FF
+C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF
+0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FF
+C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF
+0000FFC003FF0000FFC0FFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFF30267CA537
+>110 D<00FF01FF8000FFFF0FFFF000FFFF3FFFFC00FFFFFE03FF00FFFFF000FF8003FFC0007F
+C003FF80003FE003FF00003FF003FF00001FF803FF00001FFC03FF00000FFC03FF00000FFE03FF
+00000FFE03FF000007FE03FF000007FF03FF000007FF03FF000007FF03FF000007FF03FF000007
+FF03FF000007FF03FF000007FF03FF000007FF03FF000007FF03FF000007FE03FF000007FE03FF
+00000FFE03FF00000FFC03FF00000FFC03FF00001FF803FF00001FF803FF00003FF003FF80003F
+E003FFC0007FC003FFF001FF8003FFFC07FF0003FF3FFFFC0003FF0FFFF00003FF01FF000003FF
+0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF000000
+0003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00000000FFFF
+FC000000FFFFFC000000FFFFFC000000FFFFFC00000030377DA537>112
+D<00FE03F000FFFE0FFE00FFFE1FFF00FFFE3C3F80FFFE707FC007FE60FFE003FEE0FFE003FEC0
+FFE003FFC0FFE003FF807FC003FF807FC003FF803F8003FF800E0003FF00000003FF00000003FF
+00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003
+FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF000000
+03FF00000003FF00000003FF000000FFFFFE0000FFFFFE0000FFFFFE0000FFFFFE000023267DA5
+29>114 D<0007800000078000000780000007800000078000000F8000000F8000000F8000000F
+8000001F8000001F8000003F8000003F8000007F800000FF800001FF800007FF80001FFFFFF0FF
+FFFFF0FFFFFFF0FFFFFFF001FF800001FF800001FF800001FF800001FF800001FF800001FF8000
+01FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF80
+0001FF800001FF800001FF803C01FF803C01FF803C01FF803C01FF803C01FF803C01FF803C01FF
+803C00FF807800FFC078007FC070003FE0E0001FFFC00007FF800001FF001E377EB626>116
+D<FFFFF007FFFCFFFFF007FFFCFFFFF007FFFCFFFFF007FFFC01FF8000FC0000FFC000F80000FF
+E001F000007FF003E000003FF007C000001FF80FC000000FFC1F8000000FFE1F00000007FF3E00
+000003FFFC00000001FFF800000000FFF0000000007FE0000000007FF0000000003FF800000000
+1FF8000000001FFC000000003FFE000000007FFF00000000FBFF80000001F9FF80000003F0FFC0
+000003E07FE0000007C07FF000000F803FF800001F001FFC00003E000FFC00007C0007FE0000FC
+0003FF0001FC0003FF80FFFF801FFFFEFFFF801FFFFEFFFF801FFFFEFFFF801FFFFE2F267EA534
+>120 D E /Fo 40 122 df<FFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFF
+FEFFFFFFFEFFFFFFFEFFFFFFFE1F0A7F9B28>45 D<07E00FF03FFC3FFC7FFEFFFFFFFFFFFFFFFF
+FFFFFFFF7FFE3FFC3FFC0FF007E01010788F21>I<00001FF800000001FFFF80000007FFFFE000
+001FFFFFF800003FF81FFC0000FFE007FF0001FF8001FF8003FF0000FFC003FF0000FFC007FE00
+007FE007FE00007FE00FFC00003FF00FFC00003FF01FFC00003FF81FFC00003FF83FFC00003FFC
+3FF800001FFC3FF800001FFC7FF800001FFE7FF800001FFE7FF800001FFE7FF800001FFE7FF800
+001FFE7FF800001FFEFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFF
+FFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800
+001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFF
+FFF800001FFFFFF800001FFFFFF800001FFF7FF800001FFE7FF800001FFE7FF800001FFE7FF800
+001FFE7FF800001FFE7FF800001FFE3FF800001FFC3FFC00003FFC3FFC00003FFC1FFC00003FF8
+1FFC00003FF81FFC00003FF80FFC00003FF00FFE00007FF007FE00007FE003FF0000FFC003FF80
+01FFC001FFC003FF8000FFE007FF00007FF81FFE00001FFFFFF8000007FFFFE0000001FFFF8000
+00001FF8000030457BC33B>48 D<03000000038007F000001F8007FF0003FF8007FFFFFFFF8007
+FFFFFFFF0007FFFFFFFE0007FFFFFFFC0007FFFFFFF80007FFFFFFF00007FFFFFFE00007FFFFFF
+C00007FFFFFF000007FFFFFE000007FFFFF8000007FFFFC0000007DFFC00000007C00000000007
+C00000000007C00000000007C00000000007C00000000007C00000000007C00000000007C00000
+000007C00000000007C00000000007C07FF8000007C3FFFF000007CFFFFFE00007FFFFFFF00007
+FFC03FFC0007FE000FFE0007F80007FF0007E00007FF8007C00003FFC003800003FFE000000003
+FFE000000001FFF000000001FFF000000001FFF800000001FFF800000001FFF800000001FFF800
+000001FFFC07800001FFFC1FE00001FFFC3FF00001FFFC7FF80001FFFC7FF80001FFFCFFFC0001
+FFFCFFFC0001FFFCFFFC0001FFFCFFFC0001FFF8FFF80001FFF8FFF80001FFF87FF00001FFF07F
+E00003FFF07F800003FFE03F000003FFE03F000007FFC01F80000FFF800FE0001FFF0007F0003F
+FE0003FE00FFFC0001FFFFFFF80000FFFFFFE000003FFFFF8000000FFFFC00000001FFC000002E
+457AC33B>53 D<0000000003E000000000000000000007F000000000000000000007F000000000
+00000000000FF80000000000000000000FF80000000000000000000FF80000000000000000001F
+FC0000000000000000001FFC0000000000000000003FFE0000000000000000003FFE0000000000
+000000007FFF0000000000000000007FFF0000000000000000007FFF000000000000000000FFFF
+800000000000000000FFFF800000000000000001FFFFC00000000000000001FFFFC00000000000
+000001FFFFC00000000000000003FFFFE00000000000000003EFFFE00000000000000007EFFFF0
+0000000000000007CFFFF00000000000000007C7FFF0000000000000000FC7FFF8000000000000
+000F83FFF8000000000000001F83FFFC000000000000001F03FFFC000000000000001F01FFFC00
+0000000000003F01FFFE000000000000003E00FFFE000000000000007E00FFFF00000000000000
+7C007FFF00000000000000FC007FFF80000000000000F8007FFF80000000000000F8003FFF8000
+0000000001F8003FFFC0000000000001F0001FFFC0000000000003F0001FFFE0000000000003E0
+001FFFE0000000000003E0000FFFE0000000000007E0000FFFF0000000000007C00007FFF00000
+0000000FC00007FFF800000000000F800007FFF800000000000F800003FFF800000000001F8000
+03FFFC00000000001F000001FFFC00000000003FFFFFFFFFFE00000000003FFFFFFFFFFE000000
+00007FFFFFFFFFFF00000000007FFFFFFFFFFF00000000007FFFFFFFFFFF0000000000FC000000
+7FFF8000000000F80000003FFF8000000001F80000003FFFC000000001F00000003FFFC0000000
+01F00000001FFFC000000003F00000001FFFE000000003E00000000FFFE000000007E00000000F
+FFF000000007C00000000FFFF000000007C000000007FFF00000000FC000000007FFF80000000F
+8000000003FFF80000001F8000000003FFFC0000001F0000000003FFFC0000007FC000000001FF
+FC0000FFFFFFC00007FFFFFFFF80FFFFFFC00007FFFFFFFF80FFFFFFC00007FFFFFFFF80FFFFFF
+C00007FFFFFFFF80FFFFFFC00007FFFFFFFF8051487CC75A>65 D<FFFFFFFFFFFFE00000FFFFFF
+FFFFFFFE0000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFF000FFFFFFFFFFFFFFF800001FFF800001
+FFFE00001FFF8000007FFF00001FFF8000003FFF80001FFF8000001FFFC0001FFF8000000FFFC0
+001FFF80000007FFE0001FFF80000007FFF0001FFF80000007FFF0001FFF80000003FFF0001FFF
+80000003FFF8001FFF80000003FFF8001FFF80000003FFF8001FFF80000003FFF8001FFF800000
+03FFF8001FFF80000003FFF8001FFF80000003FFF8001FFF80000003FFF8001FFF80000003FFF0
+001FFF80000007FFF0001FFF80000007FFE0001FFF8000000FFFE0001FFF8000000FFFC0001FFF
+8000001FFF80001FFF8000003FFF00001FFF8000007FFE00001FFF800001FFFC00001FFF800007
+FFF000001FFFFFFFFFFFC000001FFFFFFFFFFE0000001FFFFFFFFFFF8000001FFFFFFFFFFFF000
+001FFF800000FFFC00001FFF8000003FFF00001FFF8000000FFFC0001FFF80000007FFE0001FFF
+80000003FFF0001FFF80000003FFF8001FFF80000001FFF8001FFF80000001FFFC001FFF800000
+00FFFC001FFF80000000FFFE001FFF80000000FFFE001FFF80000000FFFE001FFF80000000FFFF
+001FFF800000007FFF001FFF800000007FFF001FFF800000007FFF001FFF800000007FFF001FFF
+80000000FFFF001FFF80000000FFFF001FFF80000000FFFF001FFF80000000FFFE001FFF800000
+00FFFE001FFF80000001FFFE001FFF80000001FFFC001FFF80000003FFFC001FFF80000007FFF8
+001FFF80000007FFF0001FFF8000001FFFE0001FFF8000003FFFE0001FFF800001FFFF80FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFC00FFFFFFFFFFFFFFF000FFFFFFFFFFFFFFC000FFFFFFFFFFFF
+F8000048477CC654>I<000000003FFE00000E0000000FFFFFC0001E0000007FFFFFF8003E0000
+03FFFFFFFE00FE00000FFFFFFFFF81FE00003FFFF800FFC3FE0000FFFF80000FF7FE0001FFFC00
+0003FFFE0007FFF0000001FFFE000FFFC00000007FFE001FFF800000003FFE003FFF000000001F
+FE007FFE000000000FFE00FFFC0000000007FE01FFF80000000007FE03FFF00000000003FE03FF
+F00000000001FE07FFE00000000001FE07FFE00000000000FE0FFFC00000000000FE0FFFC00000
+0000007E1FFFC000000000007E1FFF8000000000007E3FFF8000000000007E3FFF800000000000
+3E3FFF8000000000003E7FFF8000000000003E7FFF0000000000003E7FFF000000000000007FFF
+00000000000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF000000
+00000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF000000000000
+00FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF
+000000000000007FFF000000000000007FFF000000000000007FFF000000000000007FFF800000
+0000003E3FFF8000000000003E3FFF8000000000003E3FFF8000000000003E1FFF800000000000
+3E1FFFC000000000003E0FFFC000000000007C0FFFC000000000007C07FFE000000000007C07FF
+E00000000000F803FFF00000000000F803FFF00000000001F801FFF80000000001F000FFFC0000
+000003E0007FFE0000000007E0003FFF000000000FC0001FFF800000001F80000FFFC00000003F
+000007FFF0000000FE000001FFFC000001FC000000FFFF80000FF80000003FFFF8007FF0000000
+0FFFFFFFFFC000000003FFFFFFFF00000000007FFFFFFC00000000000FFFFFE00000000000003F
+FE000000474979C756>I<FFFFFFFFFFFFFFFE00FFFFFFFFFFFFFFFE00FFFFFFFFFFFFFFFE00FF
+FFFFFFFFFFFFFE00FFFFFFFFFFFFFFFF00001FFFC00001FFFF00001FFFC000001FFF00001FFFC0
+000007FF00001FFFC0000003FF00001FFFC0000000FF00001FFFC00000007F00001FFFC0000000
+7F00001FFFC00000003F00001FFFC00000003F80001FFFC00000001F80001FFFC00000001F8000
+1FFFC00000001F80001FFFC00000000F80001FFFC00000000F80001FFFC0007C000F80001FFFC0
+007C000F80001FFFC0007C0007C0001FFFC0007C0007C0001FFFC0007C0007C0001FFFC0007C00
+07C0001FFFC000FC000000001FFFC000FC000000001FFFC000FC000000001FFFC001FC00000000
+1FFFC003FC000000001FFFC01FFC000000001FFFFFFFFC000000001FFFFFFFFC000000001FFFFF
+FFFC000000001FFFFFFFFC000000001FFFFFFFFC000000001FFFC01FFC000000001FFFC003FC00
+0000001FFFC001FC000000001FFFC000FC000000001FFFC000FC000000001FFFC000FC00000000
+1FFFC0007C00007C001FFFC0007C00007C001FFFC0007C00007C001FFFC0007C0000F8001FFFC0
+007C0000F8001FFFC0007C0000F8001FFFC000000000F8001FFFC000000001F8001FFFC0000000
+01F0001FFFC000000001F0001FFFC000000001F0001FFFC000000003F0001FFFC000000003F000
+1FFFC000000007F0001FFFC000000007E0001FFFC00000000FE0001FFFC00000001FE0001FFFC0
+0000003FE0001FFFC00000007FE0001FFFC0000000FFE0001FFFC0000003FFC0001FFFC000000F
+FFC0001FFFC00000FFFFC0FFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFF80FF
+FFFFFFFFFFFFFF80FFFFFFFFFFFFFFFF8046467CC54E>69 D<FFFFFFFFFFFFFFFC00FFFFFFFFFF
+FFFFFC00FFFFFFFFFFFFFFFC00FFFFFFFFFFFFFFFC00FFFFFFFFFFFFFFFE00001FFFC00003FFFE
+00001FFFC000003FFE00001FFFC000000FFE00001FFFC0000003FE00001FFFC0000001FE00001F
+FFC0000000FE00001FFFC0000000FE00001FFFC00000007E00001FFFC00000007F00001FFFC000
+00003F00001FFFC00000003F00001FFFC00000001F00001FFFC00000001F00001FFFC00000001F
+00001FFFC00000001F00001FFFC0007C001F00001FFFC0007C000F80001FFFC0007C000F80001F
+FFC0007C000F80001FFFC0007C000F80001FFFC0007C000000001FFFC000FC000000001FFFC000
+FC000000001FFFC000FC000000001FFFC001FC000000001FFFC003FC000000001FFFC01FFC0000
+00001FFFFFFFFC000000001FFFFFFFFC000000001FFFFFFFFC000000001FFFFFFFFC000000001F
+FFFFFFFC000000001FFFC01FFC000000001FFFC003FC000000001FFFC001FC000000001FFFC000
+FC000000001FFFC000FC000000001FFFC000FC000000001FFFC0007C000000001FFFC0007C0000
+00001FFFC0007C000000001FFFC0007C000000001FFFC0007C000000001FFFC0007C000000001F
+FFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC000
+00000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC000000000
+00001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001F
+FFC00000000000001FFFC00000000000001FFFC00000000000FFFFFFFFFF00000000FFFFFFFFFF
+00000000FFFFFFFFFF00000000FFFFFFFFFF00000000FFFFFFFFFF0000000041467CC54B>I<00
+0000003FFE00000E000000000FFFFFC0001E000000007FFFFFF8003E00000003FFFFFFFE00FE00
+00000FFFFFFFFF81FE0000003FFFF800FFC3FE000000FFFF80000FF7FE000001FFFC000003FFFE
+000007FFF0000001FFFE00000FFFC00000007FFE00001FFF800000003FFE00003FFF000000001F
+FE00007FFE000000000FFE0000FFFC0000000007FE0001FFF80000000007FE0003FFF000000000
+03FE0003FFF00000000001FE0007FFE00000000001FE0007FFE00000000000FE000FFFC0000000
+0000FE000FFFC000000000007E001FFFC000000000007E001FFF8000000000007E003FFF800000
+0000007E003FFF8000000000003E003FFF8000000000003E007FFF8000000000003E007FFF0000
+000000003E007FFF00000000000000007FFF0000000000000000FFFF0000000000000000FFFF00
+00000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF
+0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FF
+FF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000007FFFFFFFFE
+7FFF0000007FFFFFFFFE7FFF0000007FFFFFFFFE7FFF8000007FFFFFFFFE7FFF8000007FFFFFFF
+FE3FFF8000000000FFFE003FFF8000000000FFFE003FFF8000000000FFFE001FFF8000000000FF
+FE001FFFC000000000FFFE000FFFC000000000FFFE000FFFC000000000FFFE0007FFE000000000
+FFFE0007FFE000000000FFFE0003FFF000000000FFFE0003FFF800000000FFFE0001FFF8000000
+00FFFE0000FFFC00000000FFFE00007FFE00000000FFFE00003FFF00000000FFFE00001FFF8000
+0000FFFE00000FFFE0000001FFFE000007FFF0000003FFFE000001FFFC000007FFFE000000FFFF
+80001FFFFE0000003FFFFC00FFC7FE0000000FFFFFFFFF83FE00000003FFFFFFFE00FE00000000
+7FFFFFF8003E000000000FFFFFE0000E00000000003FFE000000004F4979C75D>I<FFFFFFFFF8
+01FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0
+FFFFFFFFF801FFFFFFFFF0001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000
+003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF800000
+1FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC0000000
+3FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001F
+FFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003F
+FF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFF
+C00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF
+8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFFF
+FFFFFFFFFF8000001FFFFFFFFFFFFFFF8000001FFFFFFFFFFFFFFF8000001FFFFFFFFFFFFFFF80
+00001FFFFFFFFFFFFFFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC000
+00003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000
+001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000
+003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF800000
+1FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC0000000
+3FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001F
+FFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003F
+FF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFF
+C00000003FFF8000001FFFC00000003FFF8000FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFF
+FFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF054477CC6
+5D>I<FFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFE000FFFE000000FFFE00000
+0FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000
+000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE0
+00000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFF
+E000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000F
+FFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE00000
+0FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000
+000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE0
+00000FFFE000000FFFE000000FFFE000000FFFE000FFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFF
+FFFEFFFFFFFFFE27477DC62D>I<FFFFFFFFF80000FFFFFFC0FFFFFFFFF80000FFFFFFC0FFFFFF
+FFF80000FFFFFFC0FFFFFFFFF80000FFFFFFC0FFFFFFFFF80000FFFFFFC0001FFFC000000003FF
+8000001FFFC000000001FE0000001FFFC000000003F80000001FFFC000000007F00000001FFFC0
+0000000FE00000001FFFC00000001FC00000001FFFC00000007F800000001FFFC0000000FE0000
+00001FFFC0000001FC000000001FFFC0000003F8000000001FFFC0000007F0000000001FFFC000
+001FE0000000001FFFC000003FC0000000001FFFC000007F00000000001FFFC00000FE00000000
+001FFFC00001FC00000000001FFFC00007F800000000001FFFC0000FF000000000001FFFC0001F
+C000000000001FFFC0003F8000000000001FFFC0007F0000000000001FFFC000FE000000000000
+1FFFC003FC0000000000001FFFC007FC0000000000001FFFC00FFE0000000000001FFFC01FFF00
+00000000001FFFC03FFF8000000000001FFFC0FFFF8000000000001FFFC1FFFFC000000000001F
+FFC3FFFFE000000000001FFFC7FFFFF000000000001FFFCFEFFFF000000000001FFFDFC7FFF800
+000000001FFFFF87FFFC00000000001FFFFE03FFFC00000000001FFFFC01FFFE00000000001FFF
+F800FFFF00000000001FFFF000FFFF80000000001FFFE0007FFF80000000001FFFC0003FFFC000
+0000001FFFC0001FFFE0000000001FFFC0001FFFF0000000001FFFC0000FFFF0000000001FFFC0
+0007FFF8000000001FFFC00003FFFC000000001FFFC00003FFFE000000001FFFC00001FFFE0000
+00001FFFC00000FFFF000000001FFFC000007FFF800000001FFFC000007FFFC00000001FFFC000
+003FFFC00000001FFFC000001FFFE00000001FFFC000000FFFF00000001FFFC000000FFFF80000
+001FFFC0000007FFF80000001FFFC0000003FFFC0000001FFFC0000001FFFE0000001FFFC00000
+01FFFF0000001FFFC0000000FFFF0000001FFFC00000007FFF8000001FFFC0000000FFFFC000FF
+FFFFFFF8007FFFFFFFE0FFFFFFFFF8007FFFFFFFE0FFFFFFFFF8007FFFFFFFE0FFFFFFFFF8007F
+FFFFFFE0FFFFFFFFF8007FFFFFFFE053477CC65D>75 D<00000003FFF0000000000000007FFFFF
+80000000000003FFFFFFF000000000000FFFFFFFFC00000000003FFF807FFF0000000000FFF800
+07FFC000000003FFE00001FFF000000007FFC00000FFF80000000FFF0000003FFC0000001FFE00
+00001FFE0000003FFC0000000FFF0000007FFC0000000FFF800000FFF800000007FFC00001FFF0
+00000003FFE00003FFF000000003FFF00003FFE000000001FFF00007FFE000000001FFF80007FF
+C000000000FFF8000FFFC000000000FFFC000FFFC000000000FFFC001FFF80000000007FFE001F
+FF80000000007FFE003FFF80000000007FFF003FFF80000000007FFF003FFF80000000007FFF00
+7FFF00000000003FFF807FFF00000000003FFF807FFF00000000003FFF807FFF00000000003FFF
+807FFF00000000003FFF80FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000003F
+FFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF0000000000
+3FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000
+003FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC07FFF000000
+00003FFF807FFF00000000003FFF807FFF80000000007FFF807FFF80000000007FFF803FFF8000
+0000007FFF003FFF80000000007FFF003FFF80000000007FFF001FFFC000000000FFFE001FFFC0
+00000000FFFE001FFFC000000000FFFE000FFFE000000001FFFC000FFFE000000001FFFC0007FF
+E000000001FFF80003FFF000000003FFF00003FFF800000007FFF00001FFF800000007FFE00000
+FFFC0000000FFFC000007FFE0000001FFF8000007FFF0000003FFF8000003FFF8000007FFF0000
+000FFFC00000FFFC00000007FFF00003FFF800000003FFFC000FFFF000000000FFFF807FFFC000
+0000007FFFFFFFFF80000000000FFFFFFFFC000000000003FFFFFFF00000000000007FFFFF8000
+000000000003FFF0000000004A4979C759>79 D<FFFFFFFFFFFF800000FFFFFFFFFFFFFC0000FF
+FFFFFFFFFFFF0000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFF000001FFF80000FFFFC00001FFF80
+0001FFFE00001FFF8000007FFF00001FFF8000003FFF80001FFF8000001FFFC0001FFF8000000F
+FFC0001FFF8000000FFFE0001FFF8000000FFFE0001FFF80000007FFF0001FFF80000007FFF000
+1FFF80000007FFF0001FFF80000007FFF8001FFF80000007FFF8001FFF80000007FFF8001FFF80
+000007FFF8001FFF80000007FFF8001FFF80000007FFF8001FFF80000007FFF8001FFF80000007
+FFF8001FFF80000007FFF0001FFF80000007FFF0001FFF80000007FFF0001FFF8000000FFFE000
+1FFF8000000FFFE0001FFF8000000FFFC0001FFF8000001FFF80001FFF8000003FFF80001FFF80
+00007FFF00001FFF800001FFFE00001FFF80000FFFF800001FFFFFFFFFFFF000001FFFFFFFFFFF
+C000001FFFFFFFFFFE0000001FFFFFFFFFF00000001FFFC00000000000001FFFC0000000000000
+1FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0
+0000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000
+0000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000000000
+1FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0
+0000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000
+0000001FFFC00000000000001FFFC00000000000001FFFC00000000000FFFFFFFFF800000000FF
+FFFFFFF800000000FFFFFFFFF800000000FFFFFFFFF800000000FFFFFFFFF80000000045477CC6
+51>I<FFFFFFFFFFFC0000000000FFFFFFFFFFFFF000000000FFFFFFFFFFFFFE00000000FFFFFF
+FFFFFFFF80000000FFFFFFFFFFFFFFE0000000001FFF80001FFFF8000000001FFF800001FFFC00
+0000001FFF8000007FFF000000001FFF8000003FFF800000001FFF8000001FFF800000001FFF80
+00000FFFC00000001FFF8000000FFFE00000001FFF8000000FFFE00000001FFF80000007FFF000
+00001FFF80000007FFF00000001FFF80000007FFF80000001FFF80000007FFF80000001FFF8000
+0007FFF80000001FFF80000007FFF80000001FFF80000007FFF80000001FFF80000007FFF80000
+001FFF80000007FFF80000001FFF80000007FFF80000001FFF80000007FFF00000001FFF800000
+07FFF00000001FFF8000000FFFE00000001FFF8000000FFFE00000001FFF8000000FFFC0000000
+1FFF8000001FFF800000001FFF8000003FFF000000001FFF800000FFFE000000001FFF800003FF
+F8000000001FFF80001FFFF0000000001FFFFFFFFFFFC0000000001FFFFFFFFFFE00000000001F
+FFFFFFFFF800000000001FFFFFFFFFFE00000000001FFF80007FFF80000000001FFF80001FFFC0
+000000001FFF800007FFE0000000001FFF800003FFF0000000001FFF800001FFF8000000001FFF
+800001FFFC000000001FFF800000FFFE000000001FFF800000FFFE000000001FFF8000007FFE00
+0000001FFF8000007FFF000000001FFF8000007FFF000000001FFF8000007FFF000000001FFF80
+00007FFF000000001FFF8000007FFF000000001FFF8000007FFF000000001FFF8000007FFF0000
+00001FFF8000007FFF800000001FFF8000007FFF800000001FFF8000007FFF800000001FFF8000
+007FFF800000001FFF8000007FFF800000001FFF8000007FFF8000E0001FFF8000007FFF8001F0
+001FFF8000007FFFC001F0001FFF8000007FFFC001F0001FFF8000003FFFC001F0001FFF800000
+3FFFC003F0001FFF8000001FFFE003E0001FFF8000000FFFE007E0FFFFFFFFF00007FFF007C0FF
+FFFFFFF00003FFFC1F80FFFFFFFFF00001FFFFFF00FFFFFFFFF000007FFFFE00FFFFFFFFF00000
+1FFFFC000000000000000000FFF00054487CC659>82 D<00007FF00007000007FFFF000F00001F
+FFFFC01F00007FFFFFF03F0000FFFFFFFC7F0003FFC00FFEFF0007FE0000FFFF0007FC00003FFF
+000FF000001FFF001FF0000007FF001FE0000003FF003FE0000001FF003FC0000001FF007FC000
+0000FF007FC00000007F007FC00000007F00FFC00000003F00FFC00000003F00FFC00000003F00
+FFE00000003F00FFE00000001F00FFF00000001F00FFF80000001F00FFFC0000001F00FFFF0000
+0000007FFFC0000000007FFFFE000000007FFFFFE00000003FFFFFFF0000003FFFFFFFF000001F
+FFFFFFFC00001FFFFFFFFF00000FFFFFFFFFC00007FFFFFFFFE00007FFFFFFFFF00003FFFFFFFF
+F80000FFFFFFFFFC00007FFFFFFFFE00003FFFFFFFFE00000FFFFFFFFF000001FFFFFFFF000000
+3FFFFFFF80000001FFFFFF800000000FFFFFC000000000FFFFC0000000001FFFC0000000000FFF
+E00000000007FFE00000000003FFE07800000001FFE0F800000000FFE0F800000000FFE0F80000
+00007FE0F8000000007FE0F8000000007FE0FC000000007FE0FC000000007FC0FC000000007FC0
+FE000000007FC0FE000000007F80FF00000000FF80FF80000000FF80FFC0000000FF00FFE00000
+01FE00FFF8000003FE00FFFE000007FC00FFFF80000FF800FFFFFC007FF000FE3FFFFFFFE000FC
+0FFFFFFF8000F803FFFFFF0000F0007FFFF80000E00003FFC00000334979C742>I<3FFFFFFFFF
+FFFFFFFF003FFFFFFFFFFFFFFFFF003FFFFFFFFFFFFFFFFF003FFFFFFFFFFFFFFFFF003FFFFFFF
+FFFFFFFFFF003FFF0003FFF8003FFF007FF80003FFF80007FF807FE00003FFF80001FF807FC000
+03FFF80000FF807F800003FFF800007F807F000003FFF800003F807F000003FFF800003F807E00
+0003FFF800001F807E000003FFF800001F807E000003FFF800000F807C000003FFF800000F807C
+000003FFF800000F807C000003FFF800000F807C000003FFF800000F80FC000003FFF800000FC0
+F8000003FFF8000007C0F8000003FFF8000007C0F8000003FFF8000007C0F8000003FFF8000007
+C0F8000003FFF8000007C000000003FFF80000000000000003FFF80000000000000003FFF80000
+000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF800
+00000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF8
+0000000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FF
+F80000000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003
+FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF800000000000000
+03FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF8000000000000
+0003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF80000000000
+000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF800000000
+00000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF8000000
+0000000003FFF80000000000000003FFF8000000000003FFFFFFFFFFF800000003FFFFFFFFFFF8
+00000003FFFFFFFFFFF800000003FFFFFFFFFFF800000003FFFFFFFFFFF800004A467CC553>I<
+0007FFFC000000007FFFFFC0000001FFFFFFF8000003FFFFFFFE000007FE001FFF000007FF0003
+FFC0000FFF8001FFE0000FFF8000FFF0000FFF80007FF0000FFF80007FF8000FFF80007FF80007
+FF00003FFC0007FF00003FFC0003FE00003FFC0000F800003FFC00000000003FFC00000000003F
+FC00000000003FFC00000000003FFC00000007FFFFFC000000FFFFFFFC000007FFFFFFFC00003F
+FFE03FFC0000FFFE003FFC0003FFF0003FFC0007FFC0003FFC000FFF00003FFC001FFE00003FFC
+003FFC00003FFC007FF800003FFC007FF800003FFC00FFF000003FFC00FFF000003FFC00FFF000
+003FFC00FFF000003FFC00FFF000003FFC00FFF000007FFC007FF80000FFFC007FF80001EFFC00
+3FFC0003EFFC003FFF0007CFFF000FFFC03F8FFFF807FFFFFF07FFFC01FFFFFC03FFFC007FFFF0
+01FFFC0003FF80007FF8362E7DAD3A>97 D<007FC00000000000FFFFC00000000000FFFFC00000
+000000FFFFC00000000000FFFFC00000000000FFFFC0000000000003FFC0000000000001FFC000
+0000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0
+000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FF
+C0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001
+FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC00FFC000000
+01FFC07FFFC0000001FFC3FFFFF0000001FFCFFFFFFC000001FFDFF00FFF000001FFFF8003FF80
+0001FFFE0001FFC00001FFF800007FE00001FFF000007FF00001FFE000003FF80001FFE000001F
+FC0001FFE000001FFC0001FFE000001FFE0001FFE000001FFE0001FFE000000FFF0001FFE00000
+0FFF0001FFE000000FFF0001FFE000000FFF0001FFE000000FFF8001FFE000000FFF8001FFE000
+000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE0
+00000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF0001FFE000000FFF0001FF
+E000000FFF0001FFE000001FFE0001FFE000001FFE0001FFE000001FFC0001FFE000001FFC0001
+FFE000003FF80001FFF000003FF80001FFF800007FF00001FFFC0000FFE00001FFFE0001FFC000
+01FFBF0007FF800001FF1FE01FFE000001FE0FFFFFFC000001FC03FFFFF0000001F800FFFF8000
+0001F0001FF800000039487CC742>I<00001FFFC0000000FFFFF8000007FFFFFE00001FFFFFFF
+80007FFC00FFC000FFE001FFC001FFC003FFE003FF8003FFE007FF0003FFE00FFE0003FFE00FFE
+0003FFE01FFC0001FFC01FFC0001FFC03FFC0000FF803FFC00003E007FF8000000007FF8000000
+007FF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8
+00000000FFF800000000FFF800000000FFF800000000FFF8000000007FF8000000007FF8000000
+007FFC000000003FFC000000003FFC000000001FFC000000F81FFE000000F80FFE000000F80FFF
+000001F007FF800003F003FFC00007E001FFE0000FC000FFF0001F80007FFE00FF00001FFFFFFE
+000007FFFFF8000000FFFFE00000001FFE00002D2E7CAD35>I<00000000007FC00000000000FF
+FFC00000000000FFFFC00000000000FFFFC00000000000FFFFC00000000000FFFFC00000000000
+03FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000000000
+0001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000
+000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC00000
+00000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000
+00000FFC01FFC0000000FFFF81FFC0000007FFFFE1FFC000001FFFFFF9FFC000007FFC03FFFFC0
+0000FFF0007FFFC00001FFC0001FFFC00003FF80000FFFC00007FF000007FFC0000FFE000003FF
+C0000FFE000003FFC0001FFC000003FFC0001FFC000003FFC0003FFC000003FFC0003FFC000003
+FFC0007FF8000003FFC0007FF8000003FFC0007FF8000003FFC000FFF8000003FFC000FFF80000
+03FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF800
+0003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC0007FF8000003FFC0007FF8
+000003FFC0007FF8000003FFC0003FF8000003FFC0003FFC000003FFC0003FFC000003FFC0001F
+FC000003FFC0001FFC000003FFC0000FFE000007FFC00007FF00000FFFC00003FF00001FFFC000
+01FFC0003FFFC00000FFE000FFFFE000007FF807FBFFFF80001FFFFFF3FFFF800007FFFFC3FFFF
+800001FFFF03FFFF8000001FF803FFFF8039487CC742>I<00001FFE00000001FFFFE0000007FF
+FFF800001FFFFFFE00007FFC07FF0000FFE001FF8001FFC0007FC003FF80003FE007FF00003FF0
+0FFE00001FF01FFE00000FF81FFC00000FF83FFC00000FFC3FFC000007FC7FFC000007FC7FF800
+0007FC7FF8000007FE7FF8000007FEFFF8000007FEFFF8000007FEFFFFFFFFFFFEFFFFFFFFFFFE
+FFFFFFFFFFFEFFFFFFFFFFFCFFF800000000FFF800000000FFF800000000FFF8000000007FF800
+0000007FF8000000007FFC000000003FFC000000003FFC000000003FFC0000001C1FFE0000003E
+0FFE0000003E07FF0000007E07FF000000FC03FF800001F801FFC00003F0007FF0001FE0003FFE
+00FFC0001FFFFFFF800007FFFFFE000000FFFFF80000000FFF80002F2E7DAD36>I<000000FFC0
+00000007FFF80000003FFFFC000000FFFFFF000001FFC1FF000007FF03FF80000FFC03FF80000F
+F807FFC0001FF807FFC0003FF007FFC0003FF007FFC0003FE003FF80007FE003FF80007FE001FF
+00007FE000FE00007FE0003800007FE0000000007FE0000000007FE0000000007FE0000000007F
+E0000000007FE0000000007FE0000000007FE0000000007FE0000000007FE0000000FFFFFFFE00
+00FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000007FF0000000007FF0000000007F
+F0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF00000
+00007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007F
+F0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF00000
+00007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007F
+F0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF00000
+00007FF00000003FFFFFF800003FFFFFF800003FFFFFF800003FFFFFF800003FFFFFF800002A48
+7DC724>I<00000000001F8000007FF000FFE00007FFFF03FFF0001FFFFFC7FFF0007FFFFFFFC7
+F800FFE03FFE0FF801FF800FFC0FF803FF0007FE0FF807FE0003FF07F007FE0003FF07F00FFC00
+01FF81C00FFC0001FF80000FFC0001FF80001FFC0001FFC0001FFC0001FFC0001FFC0001FFC000
+1FFC0001FFC0001FFC0001FFC0001FFC0001FFC0000FFC0001FF80000FFC0001FF80000FFC0001
+FF800007FE0003FF000007FE0003FF000003FF0007FE000001FF800FFC000000FFE03FF8000001
+FFFFFFF0000001DFFFFFC0000003C7FFFF00000003C07FF000000007C0000000000007C0000000
+000007C0000000000007C0000000000007E0000000000007F0000000000007F8000000000007FF
+FFFFF0000007FFFFFFFF000003FFFFFFFFE00003FFFFFFFFF80001FFFFFFFFFE0001FFFFFFFFFF
+0000FFFFFFFFFF80007FFFFFFFFF8003FFFFFFFFFFC00FFFFFFFFFFFC01FF800001FFFE03FE000
+0001FFE07FC00000007FF07FC00000003FF0FF800000001FF0FF800000001FF0FF800000001FF0
+FF800000001FF0FF800000001FF07FC00000003FE07FC00000003FE03FE00000007FC03FF00000
+00FFC01FFC000003FF800FFF00000FFF0003FFF000FFFC0000FFFFFFFFF000003FFFFFFFC00000
+07FFFFFE000000003FFFC0000035447DAE3B>I<007FC00000000000FFFFC00000000000FFFFC0
+0000000000FFFFC00000000000FFFFC00000000000FFFFC0000000000003FFC0000000000001FF
+C0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001
+FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC00000000000
+01FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000000000
+0001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC001FFC0
+000001FFC00FFFF8000001FFC03FFFFE000001FFC0FFFFFF000001FFC1FC07FF800001FFC3E003
+FFC00001FFC7C001FFC00001FFCF0001FFE00001FFDE0000FFE00001FFDC0000FFE00001FFFC00
+00FFF00001FFF80000FFF00001FFF00000FFF00001FFF00000FFF00001FFF00000FFF00001FFE0
+0000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FF
+E00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001
+FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000
+01FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF0
+0001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FF
+F00001FFE00000FFF000FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07F
+FFFFE0FFFFFFC07FFFFFE03B487CC742>I<00FC0001FE0003FF0007FF800FFFC01FFFE01FFFE0
+1FFFE01FFFE01FFFE01FFFE00FFFC007FF8003FF0001FE0000FC00000000000000000000000000
+000000000000000000000000000000000000000000007FC0FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0
+03FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0
+01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0
+01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF18497CC820>I<007FC000000000FFFFC000000000FFFFC000000000FFFFC000000000FF
+FFC000000000FFFFC00000000003FFC00000000001FFC00000000001FFC00000000001FFC00000
+000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF
+C00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0000000
+0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0
+007FFFF801FFC0007FFFF801FFC0007FFFF801FFC0007FFFF801FFC0007FFFF801FFC0000FFE00
+01FFC00007F00001FFC0000FE00001FFC0003FC00001FFC0007F800001FFC000FE000001FFC001
+FC000001FFC007F8000001FFC00FF0000001FFC01FC0000001FFC03F80000001FFC0FF00000001
+FFC1FE00000001FFC3FF00000001FFCFFF80000001FFDFFFC0000001FFFFFFC0000001FFFFFFE0
+000001FFFFFFF0000001FFFCFFF8000001FFF87FFC000001FFE03FFC000001FFC01FFE000001FF
+C01FFF000001FFC00FFF800001FFC007FFC00001FFC003FFC00001FFC001FFE00001FFC001FFF0
+0001FFC000FFF80001FFC0007FFC0001FFC0003FFC0001FFC0001FFE0001FFC0000FFF0001FFC0
+000FFF8001FFC0000FFFC0FFFFFF807FFFFFFFFFFF807FFFFFFFFFFF807FFFFFFFFFFF807FFFFF
+FFFFFF807FFFFF38487CC73F>107 D<007FC000FFFFC000FFFFC000FFFFC000FFFFC000FFFFC0
+0003FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF
+C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001
+FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000
+01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0
+0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF
+C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001
+FFC00001FFC00001FFC000FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF8019487CC720>I<00
+7FC001FFC00000FFE00000FFFFC00FFFF80007FFFC0000FFFFC03FFFFE001FFFFF0000FFFFC0FF
+FFFF007FFFFF8000FFFFC1FC07FF80FE03FFC000FFFFC3E003FFC1F001FFE00003FFC7C001FFC3
+E000FFE00001FFCF0001FFE78000FFF00001FFDE0000FFEF00007FF00001FFDC0000FFEE00007F
+F00001FFFC0000FFFE00007FF80001FFF80000FFFC00007FF80001FFF00000FFF800007FF80001
+FFF00000FFF800007FF80001FFF00000FFF800007FF80001FFE00000FFF000007FF80001FFE000
+00FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF0
+00007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007F
+F80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001
+FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE000
+00FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF0
+00007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007F
+F80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001
+FFE00000FFF000007FF80001FFE00000FFF000007FF800FFFFFFC07FFFFFE03FFFFFF0FFFFFFC0
+7FFFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF0FFFFFFC07FFFFF
+E03FFFFFF05C2E7CAD63>I<007FC001FFC00000FFFFC00FFFF80000FFFFC03FFFFE0000FFFFC0
+FFFFFF0000FFFFC1FC07FF8000FFFFC3E003FFC00003FFC7C001FFC00001FFCF0001FFE00001FF
+DE0000FFE00001FFDC0000FFE00001FFFC0000FFF00001FFF80000FFF00001FFF00000FFF00001
+FFF00000FFF00001FFF00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000
+01FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF0
+0001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FF
+F00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000
+FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE000
+00FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000FFFFFFC07FFFFFE0FFFFFF
+C07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE03B2E7CAD42>I<00000F
+FF0000000000FFFFF000000007FFFFFE0000001FFFFFFF8000003FFC03FFC00000FFE0007FF000
+01FF80001FF80003FF00000FFC0007FE000007FE000FFE000007FF000FFC000003FF001FFC0000
+03FF803FFC000003FFC03FF8000001FFC03FF8000001FFC07FF8000001FFE07FF8000001FFE07F
+F8000001FFE0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001
+FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF07FF8
+000001FFE07FF8000001FFE07FF8000001FFE07FF8000001FFE03FFC000003FFC03FFC000003FF
+C01FFC000003FF801FFE000007FF800FFE000007FF0007FF00000FFE0003FF80001FFC0001FFC0
+003FF80000FFE0007FF000007FFC03FFE000001FFFFFFF80000007FFFFFE00000000FFFFF00000
+00000FFF000000342E7DAD3B>I<007FC00FFC000000FFFFC07FFFC00000FFFFC3FFFFF00000FF
+FFCFFFFFFC0000FFFFDFF01FFF0000FFFFFF8007FF800003FFFE0001FFC00001FFF80000FFE000
+01FFF00000FFF00001FFE000007FF80001FFE000003FFC0001FFE000003FFC0001FFE000003FFE
+0001FFE000001FFE0001FFE000001FFF0001FFE000001FFF0001FFE000001FFF0001FFE000000F
+FF0001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE00000
+0FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000
+000FFF8001FFE000000FFF0001FFE000001FFF0001FFE000001FFF0001FFE000001FFE0001FFE0
+00001FFE0001FFE000003FFC0001FFE000003FFC0001FFE000007FF80001FFF000007FF80001FF
+F80000FFF00001FFFC0001FFE00001FFFE0003FFC00001FFFF0007FF800001FFFFE03FFE000001
+FFEFFFFFFC000001FFE3FFFFF0000001FFE0FFFF80000001FFE01FF800000001FFE00000000000
+01FFE0000000000001FFE0000000000001FFE0000000000001FFE0000000000001FFE000000000
+0001FFE0000000000001FFE0000000000001FFE0000000000001FFE0000000000001FFE0000000
+000001FFE0000000000001FFE0000000000001FFE0000000000001FFE00000000000FFFFFFC000
+000000FFFFFFC000000000FFFFFFC000000000FFFFFFC000000000FFFFFFC00000000039427CAD
+42>I<00FF803F8000FFFF80FFF000FFFF83FFFC00FFFF87FFFE00FFFF8FC3FF00FFFF8F07FF00
+03FF9E0FFF8001FFBC0FFF8001FFB80FFF8001FFF80FFF8001FFF00FFF8001FFF007FF0001FFF0
+07FF0001FFE003FE0001FFE000F80001FFE000000001FFE000000001FFC000000001FFC0000000
+01FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0
+00000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0000000
+01FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0
+00000001FFC000000001FFC0000000FFFFFFE00000FFFFFFE00000FFFFFFE00000FFFFFFE00000
+FFFFFFE00000292E7CAD31>114 D<000FFF00E0007FFFF3E001FFFFFFE007FFFFFFE00FF800FF
+E01FC0001FE03F80000FE03F000007E07F000003E07F000003E0FF000003E0FF000003E0FF8000
+03E0FFC0000000FFF0000000FFFE000000FFFFF800007FFFFFC0007FFFFFF0003FFFFFFC001FFF
+FFFF000FFFFFFF8007FFFFFFC003FFFFFFE000FFFFFFF0003FFFFFF00003FFFFF800001FFFF800
+0000FFFC0000001FFC7800000FFCF8000007FCF8000003FCFC000003FCFC000003FCFE000003F8
+FE000003F8FF000003F8FF800007F0FFC0000FF0FFF0001FE0FFFC00FFC0FFFFFFFF80FC7FFFFE
+00F81FFFF800E003FF8000262E7CAD2F>I<0001F000000001F000000001F000000001F0000000
+01F000000001F000000003F000000003F000000003F000000007F000000007F000000007F00000
+000FF00000000FF00000001FF00000003FF00000003FF00000007FF0000001FFF0000003FFF000
+000FFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC000FFF0000000FFF0000000FFF0
+000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FF
+F0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000
+FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF001F000FFF001F000FFF001F0
+00FFF001F000FFF001F000FFF001F000FFF001F000FFF001F000FFF001F0007FF001E0007FF803
+E0003FF803E0003FFC07C0001FFE0F80000FFFFF800007FFFE000001FFFC0000001FF00024427E
+C12E>I<007FE000003FF000FFFFE0007FFFF000FFFFE0007FFFF000FFFFE0007FFFF000FFFFE0
+007FFFF000FFFFE0007FFFF00003FFE00001FFF00001FFE00000FFF00001FFE00000FFF00001FF
+E00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001
+FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000
+01FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF0
+0001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FF
+F00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00001
+FFF00001FFE00001FFF00001FFE00001FFF00001FFE00003FFF00000FFE00007FFF00000FFE000
+0F7FF000007FE0001F7FF000007FF0003E7FF800003FFC00FC7FFFE0001FFFFFF87FFFE00007FF
+FFE07FFFE00001FFFF807FFFE000003FFE007FFFE03B2E7CAD42>I<FFFFFF8001FFFFFFFFFF80
+01FFFFFFFFFF8001FFFFFFFFFF8001FFFFFFFFFF8001FFFF01FFE000001FC001FFF000001F8001
+FFF000001F8000FFF800001F0000FFF800003F00007FF800003E00007FFC00007E00003FFC0000
+7C00003FFE0000FC00001FFE0000F800001FFF0001F800000FFF0001F000000FFF8003F0000007
+FF8003E0000007FFC007E0000007FFC007E0000003FFE007C0000003FFE00FC0000001FFE00F80
+000001FFF01F80000000FFF01F00000000FFF83F000000007FF83E000000007FFC7E000000003F
+FC7C000000003FFEFC000000001FFEF8000000001FFFF8000000001FFFF8000000000FFFF00000
+00000FFFF00000000007FFE00000000007FFE00000000003FFC00000000003FFC00000000001FF
+800000000001FF800000000000FF000000000000FF0000000000007E0000000000003C00000038
+2E7DAD3F>I<FFFFFF07FFFFE007FFFEFFFFFF07FFFFE007FFFEFFFFFF07FFFFE007FFFEFFFFFF
+07FFFFE007FFFEFFFFFF07FFFFE007FFFE03FFC0001FFC00003FC003FFE0000FFC00001F8001FF
+E0000FFC00001F0001FFE0000FFE00001F0001FFF00007FE00003F0000FFF0000FFF00003E0000
+FFF8000FFF00007E00007FF8000FFF00007C00007FF8001FFF80007C00003FFC001FFF8000F800
+003FFC003FFFC000F800003FFE003EFFC001F800001FFE003EFFC001F000001FFE007EFFE003F0
+00000FFF007C7FE003E000000FFF00FC7FF003E000000FFF80F83FF007E0000007FF80F83FF007
+C0000007FF81F83FF80FC0000003FFC1F01FF80F80000003FFC3F01FFC0F80000003FFE3E00FFC
+1F80000001FFE3E00FFC1F00000001FFE7E00FFE3F00000000FFF7C007FE3E00000000FFFFC007
+FF3E00000000FFFF8003FF7E000000007FFF8003FF7C000000007FFF8003FFFC000000003FFF00
+01FFF8000000003FFF0001FFF8000000003FFE0000FFF8000000001FFE0000FFF0000000001FFE
+0000FFF0000000000FFC00007FE0000000000FFC00007FE0000000000FF800003FE00000000007
+F800003FC00000000007F800003FC00000000003F000001F800000000001E000000F0000004F2E
+7DAD56>I<7FFFFFC000FFFF807FFFFFC000FFFF807FFFFFC000FFFF807FFFFFC000FFFF807FFF
+FFC000FFFF8000FFF000000FE00000FFF800000FC00000FFF800000FC000007FFC00000F800000
+7FFC00001F8000003FFC00001F0000003FFE00003F0000001FFE00003E0000001FFF00007E0000
+000FFF00007C0000000FFF8000FC00000007FF8000F800000007FFC001F800000003FFC001F000
+000003FFE003F000000003FFE003F000000001FFF003E000000001FFF007E000000000FFF007C0
+00000000FFF80FC0000000007FF80F80000000007FFC1F80000000003FFC1F00000000003FFE3F
+00000000001FFE3E00000000001FFF7E00000000000FFF7C00000000000FFFFC00000000000FFF
+FC000000000007FFF8000000000007FFF8000000000003FFF0000000000003FFF0000000000001
+FFE0000000000001FFE0000000000000FFC0000000000000FFC00000000000007F800000000000
+007F800000000000003F000000000000003F000000000000003F000000000000003E0000000000
+00007E000000000000007C00000000000000FC000000001F8000F8000000003FC001F800000000
+7FE001F000000000FFF003F000000000FFF003E000000000FFF007E000000000FFF00FC0000000
+00FFF01F8000000000FFF03F80000000007FE07F00000000007F43FE00000000003FFFF8000000
+00001FFFF0000000000007FFC0000000000001FE00000000000039427EAD3F>121
+D E /Fp 87 124 df<007E1F0001C1B1800303E3C00703C3C00E03C1800E01C0000E01C0000E01
+C0000E01C0000E01C0000E01C000FFFFFC000E01C0000E01C0000E01C0000E01C0000E01C0000E
+01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C000
+0E01C0007F87FC001A1D809C18>11 D<007E0001C1800301800703C00E03C00E01800E00000E00
+000E00000E00000E0000FFFFC00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01
+C00E01C00E01C00E01C00E01C00E01C00E01C00E01C07F87F8151D809C17>I<007FC001C1C003
+03C00703C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFFFC00E01C00E01C00E01C00E
+01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C07F
+CFF8151D809C17>I<003F07E00001C09C18000380F018000701F03C000E01E03C000E00E01800
+0E00E000000E00E000000E00E000000E00E000000E00E00000FFFFFFFC000E00E01C000E00E01C
+000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E0
+1C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C007FC7FCFF80211D
+809C23>I<60F0F0F0F0F0F0F060606060606060606060606060000000000060F0F060041E7C9D
+0C>33 D<6060F0F0F8F86868080808080808101010102020404080800D0C7F9C15>I<0F0000C0
+188000C030600380703807006027FB00E0100600E0100C00E0100C00E0101800E0101800E01030
+00E0106000602060007020C00030418000188180000F0303C00006062000060C10000C1C080018
+18080018380400303804006038040060380400C0380400C03804018038040300180803001C0806
+000C100C000620040003C01E217E9E23>37 D<60F0F8680808081010204080050C7C9C0C>39
+D<004000800100020006000C000C0018001800300030007000600060006000E000E000E000E000
+E000E000E000E000E000E000E000E000600060006000700030003000180018000C000C00060002
+000100008000400A2A7D9E10>I<800040002000100018000C000C000600060003000300038001
+800180018001C001C001C001C001C001C001C001C001C001C001C001C001800180018003800300
+0300060006000C000C00180010002000400080000A2A7E9E10>I<01800180018001804182F18F
+399C0FF003C003C00FF0399CF18F4182018001800180018010127E9E15>I<0006000000060000
+000600000006000000060000000600000006000000060000000600000006000000060000000600
+0000060000FFFFFFE0FFFFFFE00006000000060000000600000006000000060000000600000006
+00000006000000060000000600000006000000060000000600001B1C7E9720>I<60F0F0701010
+101020204080040C7C830C>I<FFE0FFE00B0280890E>I<60F0F06004047C830C>I<0001000300
+0600060006000C000C000C0018001800180030003000300060006000C000C000C0018001800180
+030003000300060006000C000C000C00180018001800300030003000600060006000C000C00010
+297E9E15>I<03C00C301818300C300C700E60066006E007E007E007E007E007E007E007E007E0
+07E007E007E007E00760066006700E300C300C18180C3007E0101D7E9B15>I<030007003F00C7
+000700070007000700070007000700070007000700070007000700070007000700070007000700
+0700070007000F80FFF80D1C7C9B15>I<07C01830201C400C400EF00FF80FF807F8077007000F
+000E000E001C001C00380070006000C00180030006010C01180110023FFE7FFEFFFE101C7E9B15
+>I<07E01830201C201C781E780E781E381E001C001C00180030006007E00030001C001C000E00
+0F000F700FF80FF80FF80FF00E401C201C183007E0101D7E9B15>I<000C00000C00001C00003C
+00003C00005C0000DC00009C00011C00031C00021C00041C000C1C00081C00101C00301C00201C
+00401C00C01C00FFFFC0001C00001C00001C00001C00001C00001C00001C0001FFC0121C7F9B15
+>I<300C3FF83FF03FC020002000200020002000200023E024302818301C200E000E000F000F00
+0F600FF00FF00FF00F800E401E401C2038187007C0101D7E9B15>I<00F0030C06040C0E181E30
+1E300C700070006000E3E0E430E818F00CF00EE006E007E007E007E007E007600760077006300E
+300C18180C3003E0101D7E9B15>I<4000007FFF807FFF007FFF00400200800400800400800800
+00100000100000200000600000400000C00000C00001C000018000018000038000038000038000
+038000078000078000078000078000078000078000030000111D7E9B15>I<03E00C301008200C
+20066006600660067006780C3E083FB01FE007F007F818FC307E601E600FC007C003C003C003C0
+0360026004300C1C1007E0101D7E9B15>I<03C00C301818300C700C600EE006E006E007E007E0
+07E007E0076007700F300F18170C2707C700060006000E300C780C78187010203030C00F80101D
+7E9B15>I<60F0F0600000000000000000000060F0F06004127C910C>I<60F0F060000000000000
+0000000060F0F0701010101020204080041A7C910C>I<7FFFFFC0FFFFFFE00000000000000000
+000000000000000000000000000000000000000000000000FFFFFFE07FFFFFC01B0C7E8F20>61
+D<030007800780030000000000000000000000010001000200020002000200060004000C001800
+38007000E000E01EE01EE01EE00E600430180FE00F1D7E9414>I<0FE03038401CE00EF00EF00E
+F00E000C001C0030006000C0008001800100010001000100010001000000000000000000000003
+000780078003000F1D7E9C14>I<000600000006000000060000000F0000000F0000000F000000
+17800000178000001780000023C0000023C0000023C0000041E0000041E0000041E0000080F000
+0080F0000180F8000100780001FFF80003007C0002003C0002003C0006003E0004001E0004001E
+000C001F001E001F00FF80FFF01C1D7F9C1F>65 D<FFFFC00F00F00F00380F003C0F001C0F001E
+0F001E0F001E0F001E0F001C0F003C0F00780F01F00FFFE00F00780F003C0F001E0F000E0F000F
+0F000F0F000F0F000F0F000F0F001E0F001E0F003C0F0078FFFFE0181C7E9B1D>I<001F808000
+E0618001801980070007800E0003801C0003801C00018038000180780000807800008070000080
+F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000070000080780000
+8078000080380000801C0001001C0001000E000200070004000180080000E03000001FC000191E
+7E9C1E>I<FFFFC0000F00F0000F003C000F000E000F0007000F0007000F0003800F0003C00F00
+01C00F0001C00F0001E00F0001E00F0001E00F0001E00F0001E00F0001E00F0001E00F0001E00F
+0001C00F0001C00F0003C00F0003800F0007800F0007000F000E000F001C000F007000FFFFC000
+1B1C7E9B20>I<FFFFFC0F003C0F000C0F00040F00040F00060F00020F00020F02020F02000F02
+000F02000F06000FFE000F06000F02000F02000F02000F02010F00010F00020F00020F00020F00
+060F00060F000C0F003CFFFFFC181C7E9B1C>I<FFFFF80F00780F00180F00080F00080F000C0F
+00040F00040F02040F02000F02000F02000F06000FFE000F06000F02000F02000F02000F02000F
+00000F00000F00000F00000F00000F00000F00000F8000FFF800161C7E9B1B>I<001F808000E0
+618001801980070007800E0003801C0003801C00018038000180780000807800008070000080F0
+000000F0000000F0000000F0000000F0000000F0000000F000FFF0F0000F807000078078000780
+78000780380007801C0007801C0007800E00078007000B800180118000E06080001F80001C1E7E
+9C21>I<FFF3FFC00F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C
+000F003C000F003C000F003C000F003C000FFFFC000F003C000F003C000F003C000F003C000F00
+3C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C00FFF3FFC01A
+1C7E9B1F>I<FFF00F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F
+000F000F000F000F000F000F000F000F000F000F00FFF00C1C7F9B0F>I<1FFF00F80078007800
+7800780078007800780078007800780078007800780078007800780078007800787078F878F878
+F878F0F040E021C01F00101D7F9B15>I<FFF03FE00F000F000F000C000F0008000F0010000F00
+20000F0040000F0080000F0100000F0200000F0400000F0E00000F1F00000F2F00000F2780000F
+4780000F83C0000F01E0000F01E0000F00F0000F00F8000F0078000F003C000F003C000F001E00
+0F001F000F001F80FFF07FF01C1C7E9B20>I<FFF8000F80000F00000F00000F00000F00000F00
+000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00080F00
+080F00080F00180F00180F00100F00300F00700F01F0FFFFF0151C7E9B1A>I<FF8000FF800F80
+00F8000F8000F8000BC00178000BC00178000BC001780009E002780009E002780008F004780008
+F004780008F0047800087808780008780878000878087800083C107800083C107800083C107800
+081E207800081E207800081E207800080F407800080F4078000807807800080780780008078078
+0008030078001C03007800FF8307FF80211C7E9B26>I<FF007FC00F800E000F8004000BC00400
+09E0040009E0040008F0040008F8040008780400083C0400083C0400081E0400080F0400080F04
+00080784000807C4000803C4000801E4000801E4000800F40008007C0008007C0008003C000800
+3C0008001C0008000C001C000C00FF8004001A1C7E9B1F>I<003F800000E0E000038038000700
+1C000E000E001C0007003C00078038000380780003C0780003C0700001C0F00001E0F00001E0F0
+0001E0F00001E0F00001E0F00001E0F00001E0F00001E0700001C0780003C0780003C038000380
+3C0007801C0007000E000E0007001C000380380000E0E000003F80001B1E7E9C20>I<FFFF800F
+00E00F00780F003C0F001C0F001E0F001E0F001E0F001E0F001E0F001C0F003C0F00780F00E00F
+FF800F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F0000FF
+F000171C7E9B1C>I<003F800000E0E0000380380007001C000E000E001C0007003C0007803800
+0380780003C0780003C0700001C0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0F0
+0001E0F00001E0700001C0780003C0780003C0380003803C0E07801C1107000E208E0007205C00
+03A0780000F0E020003FE0200000602000003060000038E000003FC000003FC000001F8000000F
+001B257E9C20>I<FFFF00000F01E0000F0078000F003C000F001C000F001E000F001E000F001E
+000F001E000F001C000F003C000F0078000F01E0000FFF00000F03C0000F00E0000F00F0000F00
+78000F0078000F0078000F0078000F0078000F0078000F0078100F0078100F0038100F003C20FF
+F01C20000007C01C1D7E9B1F>I<07E0801C1980300580700380600180E00180E00080E00080E0
+0080F00000F800007C00007FC0003FF8001FFE0007FF0000FF80000F800007C00003C00001C080
+01C08001C08001C0C00180C00180E00300D00200CC0C0083F800121E7E9C17>I<7FFFFFC0700F
+01C0600F00C0400F0040400F0040C00F0020800F0020800F0020800F0020000F0000000F000000
+0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000
+000F0000000F0000000F0000000F0000000F0000001F800003FFFC001B1C7F9B1E>I<FFF07FC0
+0F000E000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004
+000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F00
+04000F0004000700080007800800038010000180100000C020000070C000001F00001A1D7E9B1F
+>I<FFE00FF01F0003C00F0001800F0001000F800300078002000780020003C0040003C0040003
+C0040001E0080001E0080001F0080000F0100000F0100000F830000078200000782000003C4000
+003C4000003C4000001E8000001E8000001F8000000F0000000F00000006000000060000000600
+001C1D7F9B1F>I<FFE0FFE0FF1F001F003C1E001E00180F001F00100F001F00100F001F001007
+801F00200780278020078027802003C027804003C043C04003C043C04003E043C04001E081E080
+01E081E08001E081E08000F100F10000F100F10000F100F100007900FA00007A007A00007A007A
+00003E007C00003C003C00003C003C00003C003C00001800180000180018000018001800281D7F
+9B2B>I<7FF0FFC00FC03E000780180003C0180003E0100001E0200001F0600000F04000007880
+00007D8000003D0000001E0000001F0000000F0000000F8000000F80000013C0000023E0000021
+E0000041F00000C0F8000080780001007C0003003C0002001E0006001F001F003F80FFC0FFF01C
+1C7F9B1F>I<FFF007FC0F8001E00780008007C0018003C0010003E0020001F0020000F0040000
+F8040000780800007C1800003C1000001E2000001F2000000F4000000FC0000007800000078000
+000780000007800000078000000780000007800000078000000780000007800000078000007FF8
+001E1C809B1F>I<7FFFF07C01F07001E06003C06003C0400780400F80400F00401E00001E0000
+3C00007C0000780000F00000F00001E00003E00003C0100780100780100F00101F00301E00203C
+00203C00607800E0F803E0FFFFE0141C7E9B19>I<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0
+C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0FEFE07297C9E0C>I<FEFE06060606060606
+060606060606060606060606060606060606060606060606060606060606FEFE0729809E0C>93
+D<0810204040808080B0F87830050C7D9C0C>96 D<1FC000307000783800781C00301C00001C00
+001C0001FC000F1C00381C00701C00601C00E01C40E01C40E01C40603C40304E801F870012127E
+9115>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C7C
+001D86001E03001C01801C01C01C00C01C00E01C00E01C00E01C00E01C00E01C00E01C00C01C01
+C01C01801E030019060010F800131D7F9C17>I<07E00C301878307870306000E000E000E000E0
+00E000E00060007004300418080C3007C00E127E9112>I<003F00000700000700000700000700
+00070000070000070000070000070000070003E7000C1700180F00300700700700600700E00700
+E00700E00700E00700E00700E00700600700700700300700180F000C370007C7E0131D7E9C17>
+I<03E00C301818300C700E6006E006FFFEE000E000E000E00060007002300218040C1803E00F12
+7F9112>I<00F8018C071E061E0E0C0E000E000E000E000E000E00FFE00E000E000E000E000E00
+0E000E000E000E000E000E000E000E000E000E000E007FE00F1D809C0D>I<00038003C4C00C38
+C01C3880181800381C00381C00381C00381C001818001C38000C300013C0001000003000001800
+001FF8001FFF001FFF803003806001C0C000C0C000C0C000C06001803003001C0E0007F800121C
+7F9215>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C
+7C001C87001D03001E03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C
+03801C03801C03801C0380FF9FF0141D7F9C17>I<18003C003C00180000000000000000000000
+00000000FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF
+80091D7F9C0C>I<00C001E001E000C000000000000000000000000000000FE000E000E000E000
+E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E060E0F0C0F1C0
+61803E000B25839C0D>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C
+00001C00001C3FC01C0F001C0C001C08001C10001C20001C40001CE0001DE0001E70001C78001C
+38001C3C001C1C001C0E001C0F001C0F80FF9FE0131D7F9C16>I<FC001C001C001C001C001C00
+1C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C
+001C001C00FF80091D7F9C0C>I<FC7E07E0001C838838001D019018001E01E01C001C01C01C00
+1C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C
+001C01C01C001C01C01C001C01C01C001C01C01C00FF8FF8FF8021127F9124>I<FC7C001C8700
+1D03001E03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C0380
+1C03801C0380FF9FF014127F9117>I<03F0000E1C00180600300300700380600180E001C0E001
+C0E001C0E001C0E001C0E001C06001807003803003001806000E1C0003F00012127F9115>I<FC
+7C001D86001E03001C01801C01C01C00C01C00E01C00E01C00E01C00E01C00E01C00E01C01C01C
+01C01C01801E03001D06001CF8001C00001C00001C00001C00001C00001C00001C0000FF800013
+1A7F9117>I<03C1000C3300180B00300F00700700700700E00700E00700E00700E00700E00700
+E00700600700700700300F00180F000C370007C700000700000700000700000700000700000700
+000700003FE0131A7E9116>I<FCE01D301E781E781C301C001C001C001C001C001C001C001C00
+1C001C001C001C00FFC00D127F9110>I<1F9030704030C010C010E010F8007F803FE00FF000F8
+80388018C018C018E010D0608FC00D127F9110>I<04000400040004000C000C001C003C00FFE0
+1C001C001C001C001C001C001C001C001C001C101C101C101C101C100C100E2003C00C1A7F9910
+>I<FC1F801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C
+03801C03801C07800C07800E1B8003E3F014127F9117>I<FF07E03C03801C01001C01000E0200
+0E020007040007040007040003880003880003D80001D00001D00000E00000E00000E000004000
+13127F9116>I<FF3FCFE03C0F03801C0701801C0701001C0B01000E0B82000E0B82000E118200
+0711C4000711C4000720C40003A0E80003A0E80003C0680001C0700001C0700001803000008020
+001B127F911E>I<7F8FF00F03800F030007020003840001C80001D80000F00000700000780000
+F800009C00010E00020E000607000403801E07C0FF0FF81512809116>I<FF07E03C03801C0100
+1C01000E02000E020007040007040007040003880003880003D80001D00001D00000E00000E000
+00E000004000004000008000008000F08000F10000F300006600003C0000131A7F9116>I<7FFC
+70386038407040F040E041C003C0038007000F040E041C043C0C380870087038FFF80E127F9112
+>I<FFFFF01401808B15>I E /Fq 1 98 df<00040000000E0000000E0000000E0000001F000000
+1F0000003F800000278000002780000043C0000043C0000043C0000081E0000081E0000101F000
+0100F0000100F00003FFF8000200780006007C0004003C0004003C000C001E000C001E003C003F
+00FF00FFE01B1A7F991F>97 D E /Fr 62 123 df<0001FF81FE00001FFFEFFF80007F80FF87C0
+00FC00FE0FE001F801FE0FE003F801FC0FE007F001FC0FE007F001FC07C007F001FC000007F001
+FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC0000FFFFFFFFF800
+FFFFFFFFF800FFFFFFFFF80007F001FC000007F001FC000007F001FC000007F001FC000007F001
+FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC0000
+07F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001
+FC000007F001FC000007F001FC000007F001FC00007FFF1FFFE0007FFF1FFFE0007FFF1FFFE000
+2B2A7FA928>11 D<0001FF0000001FFFC000007F80F00000FC00F80001F801F80003F803FC0007
+F003FC0007F003FC0007F003FC0007F001F80007F000F00007F000000007F000000007F0000000
+07F0000000FFFFFFFC00FFFFFFFC00FFFFFFFC0007F001FC0007F001FC0007F001FC0007F001FC
+0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001
+FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F0
+01FC0007F001FC007FFF1FFFC07FFF1FFFC07FFF1FFFC0222A7FA926>I<0001FF803FE000001F
+FFE3FFF800007F80FFF01E0000FE007F801F0001F800FF003F0003F801FF007F8007F001FE007F
+8007F001FE007F8007F001FE007F8007F000FE003F0007F000FE001E0007F000FE00000007F000
+FE00000007F000FE00000007F000FE000000FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80
+07F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE
+003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007
+F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE00
+3F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F807FFF0FFFE3FFF87FFF
+0FFFE3FFF87FFF0FFFE3FFF8352A7FA939>14 D<FFFF80FFFF80FFFF80FFFF80FFFF80FFFF8011
+067F9017>45 D<1C003E007F00FF80FF80FF807F003E001C0009097B8813>I<003F800001FFF0
+0007E0FC000FC07E001F803F001F803F003F001F803F001F807F001FC07F001FC07F001FC07F00
+1FC0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF
+001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE07F001FC07F001FC07F001FC07F001FC0
+3F001F803F001F801F803F001F803F000FC07E0007E0FC0001FFF000003F80001B277DA622>48
+D<000E00001E00007E0007FE00FFFE00FFFE00F8FE0000FE0000FE0000FE0000FE0000FE0000FE
+0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE
+0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE007FFFFE7FFFFE7FFF
+FE17277BA622>I<00FF800003FFF0000FFFFC001F03FE003800FF007C007F80FE003FC0FF003F
+C0FF003FE0FF001FE0FF001FE07E001FE03C003FE000003FE000003FC000003FC000007F800000
+7F000000FE000000FC000001F8000003F0000003E00000078000000F0000001E0000003C00E000
+7000E000E000E001C001C0038001C0070001C00FFFFFC01FFFFFC03FFFFFC07FFFFFC0FFFFFF80
+FFFFFF80FFFFFF801B277DA622>I<007F800003FFF00007FFFC000F81FE001F00FF003F80FF00
+3F807F803F807F803F807F801F807F800F007F800000FF000000FF000000FE000001FC000001F8
+000007F00000FFC00000FFF0000001FC0000007E0000007F0000007F8000003FC000003FC00000
+3FE000003FE03C003FE07E003FE0FF003FE0FF003FE0FF003FC0FF007FC07E007F807C007F003F
+01FE001FFFFC0007FFF00000FF80001B277DA622>I<00000E0000001E0000003E0000007E0000
+00FE000000FE000001FE000003FE0000077E00000E7E00000E7E00001C7E0000387E0000707E00
+00E07E0000E07E0001C07E0003807E0007007E000E007E000E007E001C007E0038007E0070007E
+00E0007E00FFFFFFF8FFFFFFF8FFFFFFF80000FE000000FE000000FE000000FE000000FE000000
+FE000000FE000000FE00007FFFF8007FFFF8007FFFF81D277EA622>I<0C0003000F803F000FFF
+FE000FFFFC000FFFF8000FFFF0000FFFE0000FFFC0000FFE00000E0000000E0000000E0000000E
+0000000E0000000E0000000E7FC0000FFFF8000F80FC000E003E000C003F0000001F8000001FC0
+00001FC000001FE000001FE018001FE07C001FE0FE001FE0FE001FE0FE001FE0FE001FC0FC001F
+C078003F8078003F803C007F001F01FE000FFFF80003FFF00000FF80001B277DA622>I<0007F0
+00003FFC0000FFFE0001FC0F0003F01F8007E03F800FC03F801FC03F801F803F803F801F003F80
+00007F0000007F0000007F000000FF000000FF0FC000FF3FF800FF707C00FFC03E00FFC03F00FF
+801F80FF801FC0FF001FC0FF001FE0FF001FE0FF001FE07F001FE07F001FE07F001FE07F001FE0
+3F001FE03F001FC01F801FC01F803F800FC03F0007E07E0003FFFC0000FFF000003FC0001B277D
+A622>I<380000003E0000003FFFFFF03FFFFFF03FFFFFF07FFFFFE07FFFFFC07FFFFF807FFFFF
+0070000E0070000E0070001C00E0003800E0007000E000E0000000E0000001C000000380000007
+800000078000000F0000000F0000001F0000001F0000003F0000003E0000003E0000007E000000
+7E0000007E0000007E000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000
+00FE0000007C0000003800001C297CA822>I<003FC00001FFF00003FFFC0007C07E000F003F00
+1E001F001E000F803E000F803E000F803F000F803F000F803FC00F003FF01F001FFC1E001FFE3C
+000FFFF80007FFE00003FFF80001FFFC0001FFFE0007FFFF000F0FFF801E03FFC03C01FFC07C00
+7FE078001FE0F80007E0F80007E0F80003E0F80003E0F80003E0F80003C07C0003C07C0007803F
+000F001FC03E000FFFFC0003FFF800007FC0001B277DA622>I<007F800001FFF00007FFF8000F
+E0FC001F807E003F803F007F003F007F001F80FF001F80FF001FC0FF001FC0FF001FC0FF001FE0
+FF001FE0FF001FE0FF001FE07F001FE07F003FE03F003FE01F807FE00F807FE007C1DFE003FF9F
+E0007E1FE000001FE000001FC000001FC000001FC000003F801F003F803F803F003F803F003F80
+7E003F807C001F01F8001E03F0000FFFE00007FF800001FE00001B277DA622>I<1C003E007F00
+FF80FF80FF807F003E001C000000000000000000000000000000000000001C003E007F00FF80FF
+80FF807F003E001C00091B7B9A13>I<000003800000000007C00000000007C0000000000FE000
+0000000FE0000000000FE0000000001FF0000000001FF0000000003FF8000000003FF800000000
+3FF80000000073FC0000000073FC00000000F3FE00000000E1FE00000000E1FE00000001C0FF00
+000001C0FF00000003C0FF80000003807F80000007807FC0000007003FC0000007003FC000000E
+003FE000000E001FE000001E001FF000001C000FF000001FFFFFF000003FFFFFF800003FFFFFF8
+0000780007FC0000700003FC0000700003FC0000E00001FE0000E00001FE0001E00001FF0001C0
+0000FF0001C00000FF00FFFE001FFFFEFFFE001FFFFEFFFE001FFFFE2F297EA834>65
+D<FFFFFFF80000FFFFFFFF8000FFFFFFFFC00003F8001FF00003F8000FF80003F80007FC0003F8
+0003FC0003F80003FC0003F80003FE0003F80001FE0003F80001FE0003F80001FE0003F80003FE
+0003F80003FC0003F80003FC0003F80007F80003F8000FF00003F8001FE00003F800FFC00003FF
+FFFE000003FFFFFFE00003F80007F00003F80003FC0003F80001FE0003F80001FE0003F80000FF
+0003F80000FF0003F80000FF8003F80000FF8003F80000FF8003F80000FF8003F80000FF8003F8
+0000FF8003F80000FF0003F80001FF0003F80003FE0003F80007FC0003F8001FF800FFFFFFFFF0
+00FFFFFFFFC000FFFFFFFE000029297DA831>I<00003FF001800003FFFE0380000FFFFF878000
+3FF007DF8000FF8001FF8001FE00007F8003FC00003F8007F000001F800FF000000F801FE00000
+07801FE0000007803FC0000007803FC0000003807FC0000003807F80000003807F8000000000FF
+8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000
+0000FF8000000000FF80000000007F80000000007F80000000007FC0000003803FC0000003803F
+C0000003801FE0000003801FE0000007000FF00000070007F000000E0003FC00001E0001FE0000
+3C0000FF8000F800003FF007E000000FFFFFC0000003FFFF000000003FF8000029297CA832>I<
+FFFFFFF80000FFFFFFFF8000FFFFFFFFE00003FC001FF80003FC0007FC0003FC0001FE0003FC00
+00FF0003FC00007F8003FC00003FC003FC00001FC003FC00001FE003FC00001FE003FC00000FF0
+03FC00000FF003FC00000FF003FC00000FF003FC00000FF803FC00000FF803FC00000FF803FC00
+000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF8
+03FC00000FF003FC00000FF003FC00000FF003FC00001FE003FC00001FE003FC00001FC003FC00
+003FC003FC00007F8003FC00007F0003FC0001FE0003FC0003FC0003FC001FF800FFFFFFFFE000
+FFFFFFFF8000FFFFFFFC00002D297DA835>I<FFFFFFFFE0FFFFFFFFE0FFFFFFFFE003FC001FE0
+03FC0007F003FC0001F003FC0001F003FC0000F003FC00007003FC00007003FC00007003FC01C0
+7803FC01C03803FC01C03803FC01C03803FC03C00003FC03C00003FC0FC00003FFFFC00003FFFF
+C00003FFFFC00003FC0FC00003FC03C00003FC03C00003FC01C00E03FC01C00E03FC01C00E03FC
+01C01C03FC00001C03FC00001C03FC00001C03FC00003C03FC00003803FC00007803FC0000F803
+FC0001F803FC0003F803FC001FF8FFFFFFFFF0FFFFFFFFF0FFFFFFFFF027297DA82D>I<FFFFFF
+FFC0FFFFFFFFC0FFFFFFFFC003FC003FC003FC000FE003FC0003E003FC0001E003FC0001E003FC
+0000E003FC0000E003FC0000E003FC0000F003FC03807003FC03807003FC03807003FC03800003
+FC07800003FC07800003FC1F800003FFFF800003FFFF800003FFFF800003FC1F800003FC078000
+03FC07800003FC03800003FC03800003FC03800003FC03800003FC00000003FC00000003FC0000
+0003FC00000003FC00000003FC00000003FC00000003FC00000003FC000000FFFFFC0000FFFFFC
+0000FFFFFC000024297DA82B>I<00007FE003000003FFFC0700001FFFFF0F00003FF00FFF0000
+FF8001FF0001FE0000FF0003F800003F0007F000003F000FF000001F001FE000000F001FE00000
+0F003FC000000F003FC0000007007FC0000007007F80000007007F8000000000FF8000000000FF
+8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000
+0000FF8001FFFFF87F8001FFFFF87F8001FFFFF87FC00000FF003FC00000FF003FC00000FF001F
+E00000FF001FE00000FF000FF00000FF0007F00000FF0003F80000FF0001FE0000FF0000FF8001
+FF00003FF007BF00001FFFFF1F000003FFFE0F0000007FF003002D297CA836>I<FFFFF01FFFFE
+FFFFF01FFFFEFFFFF01FFFFE03FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00
+007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F80
+03FC00007F8003FC00007F8003FC00007F8003FC00007F8003FFFFFFFF8003FFFFFFFF8003FFFF
+FFFF8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F80
+03FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00
+007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F80FFFFF01FFFFEFFFFF01FFFFE
+FFFFF01FFFFE2F297DA836>I<FFFFFCFFFFFCFFFFFC01FE0001FE0001FE0001FE0001FE0001FE
+0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE
+0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE
+0001FE0001FE0001FE00FFFFFCFFFFFCFFFFFC16297EA81A>I<FFFFF001FFFCFFFFF001FFFCFF
+FFF001FFFC03FC00001E0003FC00003C0003FC0000780003FC0000F00003FC0001E00003FC0003
+C00003FC0007000003FC001E000003FC003C000003FC0078000003FC00F0000003FC01E0000003
+FC0380000003FC07C0000003FC1FC0000003FC3FE0000003FC7FF0000003FCFFF8000003FDE7F8
+000003FF83FC000003FF01FE000003FE01FF000003FC00FF000003FC007F800003FC003FC00003
+FC003FC00003FC001FE00003FC000FF00003FC000FF80003FC0007F80003FC0003FC0003FC0001
+FE0003FC0001FF0003FC0000FF0003FC00007F80FFFFF00FFFFEFFFFF00FFFFEFFFFF00FFFFE2F
+297DA836>75 D<FFFFFC0000FFFFFC0000FFFFFC000003FC00000003FC00000003FC00000003FC
+00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003
+FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC000000
+03FC00000003FC00000003FC0001C003FC0001C003FC0001C003FC0001C003FC0003C003FC0003
+8003FC00038003FC00078003FC00078003FC000F8003FC000F8003FC001F8003FC007F8003FC01
+FF00FFFFFFFF00FFFFFFFF00FFFFFFFF0022297DA829>I<FFFE0000001FFFC0FFFE0000001FFF
+C0FFFF0000003FFFC003FF0000003FF00003FF0000003FF00003BF80000077F00003BF80000077
+F000039FC00000E7F000039FC00000E7F000038FE00001C7F000038FE00001C7F0000387F00003
+87F0000387F0000387F0000387F0000387F0000383F8000707F0000383F8000707F0000381FC00
+0E07F0000381FC000E07F0000380FE001C07F0000380FE001C07F0000380FF003807F00003807F
+003807F00003807F003807F00003803F807007F00003803F807007F00003801FC0E007F0000380
+1FC0E007F00003800FE1C007F00003800FE1C007F00003800FE1C007F000038007F38007F00003
+8007F38007F000038003FF0007F000038003FF0007F000038001FE0007F000038001FE0007F000
+038000FC0007F000038000FC0007F000FFFE00FC01FFFFC0FFFE007801FFFFC0FFFE007801FFFF
+C03A297DA841>I<FFFC0000FFFEFFFE0000FFFEFFFF0000FFFE03FF8000038003FF8000038003
+BFC0000380039FE0000380039FF0000380038FF80003800387F80003800383FC0003800381FE00
+03800381FF0003800380FF80038003807FC0038003803FC0038003801FE0038003800FF0038003
+800FF80380038007FC0380038003FC0380038001FE0380038000FF0380038000FF83800380007F
+C3800380003FE3800380001FE3800380000FF38003800007FB8003800007FF8003800003FF8003
+800001FF8003800000FF80038000007F80038000007F80038000003F80038000001F8003800000
+0F80FFFE00000780FFFE00000380FFFE000003802F297DA836>I<0000FFE000000007FFFC0000
+003FC07F8000007F001FC00001FC0007F00003F80003F80007F00001FC000FF00001FE001FE000
+00FF001FE00000FF003FC000007F803FC000007F807FC000007FC07F8000003FC07F8000003FC0
+7F8000003FC0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000
+003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE07F8000003FC07FC000007FC0
+7FC000007FC03FC000007F803FC000007F801FE00000FF001FE00000FF000FF00001FE0007F000
+01FC0003F80003F80001FC0007F00000FF001FE000003FC07F8000000FFFFE00000000FFE00000
+2B297CA834>I<FFFFFFF800FFFFFFFF00FFFFFFFFC003FC003FE003FC000FF003FC0007F803FC
+0007FC03FC0003FC03FC0003FE03FC0003FE03FC0003FE03FC0003FE03FC0003FE03FC0003FE03
+FC0003FE03FC0003FC03FC0007FC03FC0007F803FC000FF003FC003FE003FFFFFF8003FFFFFE00
+03FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0000
+0003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00
+0000FFFFF00000FFFFF00000FFFFF0000027297DA82F>I<0000FFE000000007FFFC0000003FC0
+7F8000007F001FC00001FC0007F00003F80003F80007F00001FC000FF00001FE001FE00000FF00
+1FE00000FF003FC000007F803FC000007F807FC000007FC07FC000007FC07F8000003FC07F8000
+003FC0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0
+FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE07F8000003FC07F8000003FC07FC000
+007FC03FC000007F803FC000007F801FE00000FF001FE01F00FF000FF03F81FE0007F060C1FC00
+03F8C063F80001FCC077F00000FFC07FE000003FE07F8000000FFFFE00000000FFFE0060000000
+3E00600000003F00600000001F81E00000001FFFE00000001FFFC00000000FFFC00000000FFFC0
+00000007FF8000000007FF8000000003FF0000000001FE000000000078002B357CA834>I<FFFF
+FFE00000FFFFFFFE0000FFFFFFFF800003FC007FE00003FC000FF00003FC0007F80003FC0007FC
+0003FC0003FC0003FC0003FE0003FC0003FE0003FC0003FE0003FC0003FE0003FC0003FE0003FC
+0003FE0003FC0003FC0003FC0007F80003FC0007F80003FC001FE00003FC007FC00003FFFFFE00
+0003FFFFF0000003FC00FC000003FC007F000003FC003F800003FC003F800003FC001FC00003FC
+001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FF00003FC001FF0
+0003FC001FF00003FC001FF00703FC001FF80703FC000FF80703FC0007F80EFFFFF003FE1CFFFF
+F001FFF8FFFFF0003FF030297DA834>I<007F806003FFF0E007FFF9E00F807FE01F001FE03E00
+07E07C0003E07C0001E0FC0001E0FC0001E0FC0000E0FE0000E0FE0000E0FF000000FFC000007F
+FE00007FFFE0003FFFFC001FFFFE000FFFFF8007FFFFC003FFFFE000FFFFE00007FFF000007FF0
+00000FF8000007F8000003F8600001F8E00001F8E00001F8E00001F8F00001F0F00001F0F80003
+F0FC0003E0FF0007C0FFE01F80F3FFFF00E0FFFE00C01FF0001D297CA826>I<7FFFFFFFFFC07F
+FFFFFFFFC07FFFFFFFFFC07F803FC03FC07E003FC007C078003FC003C078003FC003C070003FC0
+01C0F0003FC001E0F0003FC001E0E0003FC000E0E0003FC000E0E0003FC000E0E0003FC000E0E0
+003FC000E000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0
+000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000
+003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0
+000000003FC0000000003FC0000000003FC00000007FFFFFE000007FFFFFE000007FFFFFE0002B
+287EA730>I<FFFFF001FFFCFFFFF001FFFCFFFFF001FFFC03FC0000070003FC0000070003FC00
+00070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC00000700
+03FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC00
+00070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC00000700
+03FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070001FC00
+000E0001FE00000E0000FE00001C00007E00001C00007F00003800003FC000F000000FF007E000
+0007FFFFC0000001FFFF000000001FF800002E297DA835>I<FFFFF0003FFF80FFFFF0003FFF80
+FFFFF0003FFF8003FE000001E00001FE000001C00001FF000003C00000FF000003800000FF0000
+038000007F8000070000007F8000070000007FC0000F0000003FC0000E0000003FE0001E000000
+1FE0001C0000001FF0001C0000000FF000380000000FF0003800000007F8007000000007F80070
+00000007FC00F000000003FC00E000000003FE01E000000001FE01C000000001FF01C000000000
+FF038000000000FF038000000000FF8780000000007F8700000000007FCF00000000003FCE0000
+0000003FFE00000000001FFC00000000001FFC00000000000FF800000000000FF800000000000F
+F8000000000007F0000000000007F0000000000003E0000000000003E0000000000001C0000000
+31297FA834>I<FFFFE07FFFF007FFF0FFFFE07FFFF007FFF0FFFFE07FFFF007FFF003FC0001FE
+00001C0003FC0001FE00001C0001FE0001FF0000380001FE0000FF0000380001FF0000FF000078
+0000FF0000FF8000700000FF0000FF8000700000FF8000FF8000F000007F8001FFC000E000007F
+8001FFC000E000003FC003FFE001C000003FC0039FE001C000003FE0039FE003C000001FE0070F
+F0038000001FE0070FF0038000001FF00F0FF0078000000FF00E07F8070000000FF00E07F80700
+000007F81E07FC0E00000007F81C03FC0E00000007FC1C03FC1E00000003FC3801FE1C00000003
+FC3801FE1C00000001FE7801FF3800000001FE7000FF3800000001FE7000FF3800000000FFF000
+FFF000000000FFE0007FF000000000FFE0007FF0000000007FC0003FE0000000007FC0003FE000
+0000003FC0003FC0000000003F80001FC0000000003F80001FC0000000001F80001F8000000000
+1F00000F80000000001F00000F80000000000E00000700000044297FA847>I<01FF800007FFF0
+000F81F8001FC07E001FC07E001FC03F000F803F8007003F8000003F8000003F8000003F80000F
+FF8000FFFF8007FC3F800FE03F803F803F803F003F807F003F80FE003F80FE003F80FE003F80FE
+003F807E007F807F00DF803F839FFC0FFF0FFC01FC03FC1E1B7E9A21>97
+D<001FF80000FFFE0003F01F0007E03F800FC03F801F803F803F801F007F800E007F0000007F00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF0000007F0000007F0000007F
+8000003F8001C01F8001C00FC0038007E0070003F01E0000FFFC00001FE0001A1B7E9A1F>99
+D<00003FF80000003FF80000003FF800000003F800000003F800000003F800000003F800000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F800001F
+E3F80000FFFBF80003F03FF80007E00FF8000FC007F8001F8003F8003F8003F8007F0003F8007F
+0003F8007F0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800
+FF0003F8007F0003F8007F0003F8007F0003F8003F8003F8001F8003F8000F8007F80007C00FF8
+0003F03BFF8000FFF3FF80003FC3FF80212A7EA926>I<003FE00001FFF80003F07E0007C01F00
+0F801F801F800F803F800FC07F000FC07F0007C07F0007E0FF0007E0FF0007E0FFFFFFE0FFFFFF
+E0FF000000FF000000FF0000007F0000007F0000007F0000003F8000E01F8000E00FC001C007E0
+038003F81F0000FFFE00001FF0001B1B7E9A20>I<0007F0003FFC00FE3E01F87F03F87F03F07F
+07F07F07F03E07F00007F00007F00007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007F000
+07F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F000
+07F00007F00007F00007F00007F00007F00007F0007FFF807FFF807FFF80182A7EA915>I<00FF
+81F003FFE7F80FC1FE7C1F80FC7C1F007C383F007E107F007F007F007F007F007F007F007F007F
+007F007F007F003F007E001F007C001F80FC000FC1F8001FFFE00018FF80003800000038000000
+3C0000003E0000003FFFF8001FFFFF001FFFFF800FFFFFC007FFFFE01FFFFFF03E0007F07C0001
+F8F80000F8F80000F8F80000F8F80000F87C0001F03C0001E01F0007C00FC01F8003FFFE00007F
+F0001E287E9A22>I<FFE0000000FFE0000000FFE00000000FE00000000FE00000000FE0000000
+0FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000
+000FE00000000FE07F00000FE1FFC0000FE787E0000FEE03F0000FF803F0000FF803F8000FF003
+F8000FF003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE0
+03F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000F
+E003F8000FE003F800FFFE3FFF80FFFE3FFF80FFFE3FFF80212A7DA926>I<07000F801FC03FE0
+3FE03FE01FC00F8007000000000000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE00F
+E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE
+0F2B7DAA14>I<000700000F80001FC0003FE0003FE0003FE0001FC0000F800007000000000000
+0000000000000000000000000000000001FFE001FFE001FFE0000FE0000FE0000FE0000FE0000F
+E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000F
+E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE07C0FE0FE0FE0FE0F
+C0FE1F80FE1F007C3E003FFC000FF000133784AA15>I<FFE00000FFE00000FFE000000FE00000
+0FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000
+000FE000000FE01FFC0FE01FFC0FE01FFC0FE007800FE00F000FE01E000FE03C000FE078000FE0
+E0000FE3C0000FE7C0000FEFE0000FFFE0000FFFF0000FF3F8000FE3F8000FC1FC000FC0FE000F
+C07F000FC07F000FC03F800FC01FC00FC00FC00FC00FE0FFFC3FFEFFFC3FFEFFFC3FFE1F2A7EA9
+24>I<FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0
+0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00F
+E00FE0FFFEFFFEFFFE0F2A7DA914>I<FFC07F800FF000FFC1FFE03FFC00FFC383F0707E000FC6
+03F8C07F000FCC01F9803F000FD801FF003F800FF001FE003F800FF001FE003F800FE001FC003F
+800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001
+FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F80
+0FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F80FFFE1FFFC3FFF8FFFE1FFF
+C3FFF8FFFE1FFFC3FFF8351B7D9A3A>I<FFC07F0000FFC1FFC000FFC787E0000FCE03F0000FD8
+03F0000FD803F8000FF003F8000FF003F8000FE003F8000FE003F8000FE003F8000FE003F8000F
+E003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F800
+0FE003F8000FE003F8000FE003F8000FE003F800FFFE3FFF80FFFE3FFF80FFFE3FFF80211B7D9A
+26>I<003FE00001FFFC0003F07E000FC01F801F800FC03F800FE03F0007E07F0007F07F0007F0
+7F0007F0FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F87F0007
+F07F0007F03F800FE03F800FE01F800FC00FC01F8007F07F0001FFFC00003FE0001D1B7E9A22>
+I<FFE1FE0000FFE7FF8000FFFE07E0000FF803F0000FF001F8000FE000FC000FE000FE000FE000
+FF000FE0007F000FE0007F000FE0007F800FE0007F800FE0007F800FE0007F800FE0007F800FE0
+007F800FE0007F800FE0007F000FE000FF000FE000FF000FE000FE000FE001FC000FF001F8000F
+F803F0000FFE0FE0000FE7FF80000FE1FC00000FE00000000FE00000000FE00000000FE0000000
+0FE00000000FE00000000FE00000000FE00000000FE0000000FFFE000000FFFE000000FFFE0000
+0021277E9A26>I<FFC1F0FFC7FCFFCE3E0FD87F0FD87F0FF07F0FF03E0FF01C0FE0000FE0000F
+E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000F
+E000FFFF00FFFF00FFFF00181B7E9A1C>114 D<03FE300FFFF01E03F03800F0700070F00070F0
+0070F80070FC0000FFE0007FFE007FFF803FFFE01FFFF007FFF800FFF80003FC0000FC60007CE0
+003CF0003CF00038F80038FC0070FF01E0F7FFC0C1FF00161B7E9A1B>I<007000007000007000
+00700000F00000F00000F00001F00003F00003F00007F0001FFFF0FFFFF0FFFFF007F00007F000
+07F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F03807F038
+07F03807F03807F03807F03803F03803F87001F86000FFC0001F8015267FA51B>I<FFE03FF800
+FFE03FF800FFE03FF8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8
+000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003
+F8000FE003F8000FE003F8000FE003F8000FE003F8000FE007F80007E007F80007E00FF80003F0
+3BFF8001FFF3FF80003FC3FF80211B7D9A26>I<FFFE03FF80FFFE03FF80FFFE03FF8007F00070
+0007F000700007F800F00003F800E00003FC01E00001FC01C00001FC01C00000FE03800000FE03
+8000007F070000007F070000007F8F0000003F8E0000003FDE0000001FDC0000001FDC0000000F
+F80000000FF80000000FF800000007F000000007F000000003E000000003E000000001C0000021
+1B7F9A24>I<FFFE7FFC0FFEFFFE7FFC0FFEFFFE7FFC0FFE0FE007E000E007F003F001C007F003
+F001C007F807F803C003F807F8038003F807F8038001FC0EFC070001FC0EFC070001FE1EFC0F00
+00FE1C7E0E0000FE1C7E0E0000FF383F1E00007F383F1C00007F783F3C00003FF01FB800003FF0
+1FB800003FF01FF800001FE00FF000001FE00FF000000FC007E000000FC007E000000FC007E000
+00078003C00000078003C0002F1B7F9A32>I<FFFC0FFF00FFFC0FFF00FFFC0FFF0007F003C000
+03F807800001FC07800000FE0F000000FF1E0000007F3C0000003FF80000001FF00000000FF000
+00000FF000000007F000000007F80000000FFC0000001FFE0000001EFE0000003C7F000000783F
+800000F01FC00001E01FE00001C00FE00003C007F000FFF01FFF80FFF01FFF80FFF01FFF80211B
+7F9A24>I<FFFE03FF80FFFE03FF80FFFE03FF8007F000700007F000700007F800F00003F800E0
+0003FC01E00001FC01C00001FC01C00000FE03800000FE038000007F070000007F070000007F8F
+0000003F8E0000003FDE0000001FDC0000001FDC0000000FF80000000FF80000000FF800000007
+F000000007F000000003E000000003E000000001C000000001C000000003800000000380000038
+078000007C07000000FE0F000000FE0E000000FE1E000000FE3C0000007C780000003FE0000000
+0FC000000021277F9A24>I<3FFFFF803FFFFF803F007F003C00FE003801FE007803FC007803F8
+007007F800700FF000700FE000001FC000003FC000007F8000007F000000FF000001FE038001FC
+038003F8038007F803800FF007800FE007801FE007003FC00F003F801F007F007F00FFFFFF00FF
+FFFF00191B7E9A1F>I E /Fs 4 94 df<003F000000E180000380C020070060400E0070401C00
+70403C0070803C003880780039007800390078003A00F0003A00F0003C00F0003800F000380070
+003800700078003000B800380338401C1C188007E00F001B157E941F>11
+D<00007C00000183000002018000040180000801C0001001C0002001C0002001C0004001C00040
+038000800380008003000080070001000E000107FC0001083800010FDC0002000E0002000E0002
+000F0002000F0004000F0004000F0004000F0004000F0008001E0008001E0008001C0008003C00
+14003800140070001400E0001201C00021838000207C0000200000002000000040000000400000
+004000000040000000800000008000000080000000800000001A2D7EA21C>I<70F8F8F8700505
+7C840E>58 D<00400040004020402040204020402040204020402040207021F027F03FF0FFC0FE
+40F840E0402040204020402040204020402040204020402040204020402040207021F027F03FF0
+FFC0FE40F840E04020402040204020402000200020000C2F7DA313>93 D
+E /Ft 71 124 df<001F83E000706E3000C07C780180F8780380F0780700700007007000070070
+00070070000700700007007000070070000700700007007000FFFFFFC007007000070070000700
+700007007000070070000700700007007000070070000700700007007000070070000700700007
+0070000700700007007000070070000700700007007000070078007FE3FF801D2380A21C>11
+D<001FC0000070200000C010000180380003807800070078000700300007000000070000000700
+000007000000070000000700000007000000FFFFF8000700780007003800070038000700380007
+003800070038000700380007003800070038000700380007003800070038000700380007003800
+07003800070038000700380007003800070038007FE1FF80192380A21B>I<001FD80000703800
+00C078000180780003807800070038000700380007003800070038000700380007003800070038
+000700380007003800FFFFF8000700380007003800070038000700380007003800070038000700
+380007003800070038000700380007003800070038000700380007003800070038000700380007
+00380007003800070038007FF3FF80192380A21B>I<000FC07F00007031C08000E00B00400180
+1E00E003803E01E007003C01E007001C00C007001C000007001C000007001C000007001C000007
+001C000007001C000007001C0000FFFFFFFFE007001C01E007001C00E007001C00E007001C00E0
+07001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00
+E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00E07FF1FF
+CFFE272380A229>I<00200040008001000300060004000C000C00180018003000300030007000
+600060006000E000E000E000E000E000E000E000E000E000E000E000E000E000E0006000600060
+007000300030003000180018000C000C0004000600030001000080004000200B327CA413>40
+D<800040002000100018000C000400060006000300030001800180018001C000C000C000C000E0
+00E000E000E000E000E000E000E000E000E000E000E000E000E000C000C000C001C00180018001
+80030003000600060004000C00180010002000400080000B327DA413>I<70F8FCFC7404040404
+080810102040060F7C840E>44 D<FFE0FFE00B027F8B10>I<70F8F8F87005057C840E>I<01F000
+071C000C06001803003803803803807001C07001C07001C07001C0F001E0F001E0F001E0F001E0
+F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E07001C07001C07001C0
+7803C03803803803801C07000C0600071C0001F00013227EA018>48 D<008003800F80F3800380
+038003800380038003800380038003800380038003800380038003800380038003800380038003
+8003800380038003800380038007C0FFFE0F217CA018>I<03F0000C1C001007002007804003C0
+4003C08003E0F003E0F801E0F801E0F801E02003E00003E00003C00003C0000780000700000E00
+001C0000180000300000600000C0000180000100000200200400200800201800603000403FFFC0
+7FFFC0FFFFC013217EA018>I<03F8000C1E001007002007804007C07807C07803C07807C03807
+C0000780000780000700000F00000E0000380003F000001C00000F000007800007800003C00003
+C00003E02003E07003E0F803E0F803E0F003C04003C0400780200780100F000C1C0003F0001322
+7EA018>I<000200000600000E00000E00001E00001E00002E00004E00004E00008E00008E0001
+0E00020E00020E00040E00040E00080E00100E00100E00200E00200E00400E00800E00FFFFF800
+0E00000E00000E00000E00000E00000E00000E00001F0001FFF015217FA018>I<1000801E0700
+1FFF001FFE001FF80013E00010000010000010000010000010000010000010F800130E00140700
+1803801003800001C00001C00001E00001E00001E00001E07001E0F001E0F001E0E001C08001C0
+4003C04003802007001006000C1C0003F00013227EA018>I<007E0001C1000300800601C00E03
+C01C03C0180180380000380000780000700000700000F0F800F30C00F40600F40300F80380F801
+C0F001C0F001E0F001E0F001E0F001E0F001E07001E07001E07001E03801C03801C01803801C03
+000C0600070C0001F00013227EA018>I<4000006000007FFFE07FFFC07FFFC0400080C0010080
+010080020080020000040000080000080000100000300000200000600000600000600000E00000
+C00000C00001C00001C00001C00001C00003C00003C00003C00003C00003C00003C00003C00003
+C00001800013237DA118>I<01F800060E000803001001802001802000C06000C06000C06000C0
+7000C07801803E01003F02001FC4000FF80003F80003FC00067F00083F80100F803007C06001C0
+6000E0C000E0C00060C00060C00060C000606000406000C03000801803000E0E0003F00013227E
+A018>I<01F000060C000C0600180700380380700380700380F001C0F001C0F001C0F001E0F001
+E0F001E0F001E0F001E07001E07003E03803E01805E00C05E00619E003E1E00001C00001C00001
+C0000380000380300300780700780600700C002018001030000FC00013227EA018>I<70F8F8F8
+70000000000000000000000070F8F8F87005157C940E>I<FFFFFFFEFFFFFFFE00000000000000
+00000000000000000000000000000000000000000000000000FFFFFFFEFFFFFFFE1F0C7D9126>
+61 D<0001800000018000000180000003C0000003C0000003C0000005E0000005E000000DF000
+0008F0000008F0000010F800001078000010780000203C0000203C0000203C0000401E0000401E
+0000401E0000800F0000800F0000FFFF000100078001000780030007C0020003C0020003C00400
+03E0040001E0040001E00C0000F00C0000F03E0001F8FF800FFF20237EA225>65
+D<FFFFF8000F800E0007800780078003C0078003E0078001E0078001F0078001F0078001F00780
+01F0078001F0078001E0078003E0078007C007800F8007803E0007FFFE0007800780078003C007
+8001E0078001F0078000F0078000F8078000F8078000F8078000F8078000F8078000F8078001F0
+078001F0078003E0078007C00F800F00FFFFFC001D227EA123>I<0007E0100038183000E00630
+01C00170038000F0070000F00E0000701E0000701C0000303C0000303C0000307C000010780000
+1078000010F8000000F8000000F8000000F8000000F8000000F8000000F8000000F80000007800
+0000780000107C0000103C0000103C0000101C0000201E0000200E000040070000400380008001
+C0010000E0020000381C000007E0001C247DA223>I<FFFFF0000F801E0007800700078003C007
+8001C0078000E0078000F007800078078000780780007C0780003C0780003C0780003C0780003E
+0780003E0780003E0780003E0780003E0780003E0780003E0780003E0780003E0780003C078000
+3C0780007C0780007807800078078000F0078000E0078001E0078003C0078007000F801E00FFFF
+F8001F227EA125>I<FFFFFFC00F8007C0078001C0078000C00780004007800040078000600780
+0020078000200780002007802020078020000780200007802000078060000780E00007FFE00007
+80E000078060000780200007802000078020000780200807800008078000080780001007800010
+07800010078000300780003007800070078000E00F8003E0FFFFFFE01D227EA121>I<FFFFFFC0
+0F8007C0078001C0078000C0078000400780004007800060078000200780002007800020078020
+20078020000780200007802000078060000780E00007FFE0000780E00007806000078020000780
+200007802000078020000780000007800000078000000780000007800000078000000780000007
+800000078000000FC00000FFFE00001B227EA120>I<0007F008003C0C1800E0021801C001B803
+8000F8070000780F0000381E0000381E0000183C0000183C0000187C0000087800000878000008
+F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8001FFF780000F8780000
+787C0000783C0000783C0000781E0000781E0000780F00007807000078038000B801C000B800E0
+0318003C0C080007F00020247DA226>I<FFFC3FFF0FC003F0078001E0078001E0078001E00780
+01E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E007
+8001E007FFFFE0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0
+078001E0078001E0078001E0078001E0078001E0078001E0078001E00FC003F0FFFC3FFF20227E
+A125>I<FFFC0FC007800780078007800780078007800780078007800780078007800780078007
+80078007800780078007800780078007800780078007800780078007800FC0FFFC0E227EA112>
+I<FFFC03FF000FC000F80007800060000780004000078000800007800100000780020000078004
+00000780080000078010000007802000000780400000078080000007818000000783C000000787
+E000000789E000000788F000000790F0000007A078000007C03C000007803C000007801E000007
+800F000007800F00000780078000078007C000078003C000078001E000078001E000078000F000
+078000F8000FC000FC00FFFC07FF8021227EA126>75 D<FFFE00000FC000000780000007800000
+078000000780000007800000078000000780000007800000078000000780000007800000078000
+000780000007800000078000000780000007800000078000000780000007800000078000800780
+00800780008007800080078001800780018007800100078003000780030007800F000F803F00FF
+FFFF0019227EA11E>I<FFC00003FF0FC00003F007C00003E005E00005E005E00005E004F00009
+E004F00009E004F00009E004780011E004780011E004780011E0043C0021E0043C0021E0043C00
+21E0041E0041E0041E0041E0040F0081E0040F0081E0040F0081E004078101E004078101E00407
+8101E00403C201E00403C201E00401E401E00401E401E00401E401E00400F801E00400F801E004
+00F801E004007001E00E007001E01F007003F0FFE0203FFF28227EA12D>I<FF8007FF07C000F8
+07C0007005E0002004F0002004F0002004780020047C0020043C0020041E0020041F0020040F00
+2004078020040780200403C0200401E0200401E0200400F0200400F8200400782004003C200400
+3E2004001E2004000F2004000F20040007A0040003E0040003E0040001E0040001E0040000E00E
+0000601F000060FFE0002020227EA125>I<000FE00000783C0000E00E0003C00780078003C00F
+0001E00E0000E01E0000F03C0000783C0000787C00007C7C00007C7800003C7800003CF800003E
+F800003EF800003EF800003EF800003EF800003EF800003EF800003EF800003E7800003C7C0000
+7C7C00007C3C0000783E0000F81E0000F00F0001E00F0001E0078003C003C0078000E00E000078
+3C00000FE0001F247DA226>I<FFFFF0000F803C0007800F0007800780078007C0078003C00780
+03E0078003E0078003E0078003E0078003E0078003E0078003C0078007C00780078007800F0007
+803C0007FFF0000780000007800000078000000780000007800000078000000780000007800000
+0780000007800000078000000780000007800000078000000FC00000FFFC00001B227EA121>I<
+000FE00000783C0000E00E0003C00780078003C00F0001E00E0000E01E0000F03E0000F83C0000
+787C00007C7C00007C7800003C7800003CF800003EF800003EF800003EF800003EF800003EF800
+003EF800003EF800003EF800003E7800003C7C00007C7C00007C3C0000783C0000781E0380F00E
+0420E00F0801E0078813C003C8178000E80E00007C3C02000FEC0200000C0200000C0200000E06
+00000F0E000007FC000007FC000007F8000003F8000001E01F2D7DA226>I<FFFFE000000F803C
+000007800E00000780078000078007C000078003C000078003E000078003E000078003E0000780
+03E000078003E000078003C000078007C000078007800007800E000007803C000007FFE0000007
+80700000078038000007801C000007801E000007800E000007800F000007800F000007800F0000
+07800F000007800F800007800F800007800F800007800F808007800FC080078007C0800FC003C1
+00FFFC01E2000000007C0021237EA124>I<03F0200C0C601802603001E07000E0600060E00060
+E00060E00020E00020E00020F00000F000007800007F00003FF0001FFE000FFF0003FF80003FC0
+0007E00001E00000F00000F0000070800070800070800070800070C00060C00060E000C0F000C0
+C80180C6070081FC0014247DA21B>I<7FFFFFF878078078600780184007800840078008400780
+08C007800C80078004800780048007800480078004000780000007800000078000000780000007
+800000078000000780000007800000078000000780000007800000078000000780000007800000
+078000000780000007800000078000000780000007800000078000000FC00003FFFF001E227EA1
+23>I<FFFC07FF0FC000F807800070078000200780002007800020078000200780002007800020
+078000200780002007800020078000200780002007800020078000200780002007800020078000
+20078000200780002007800020078000200780002007800020078000200380004003C0004003C0
+004001C0008000E000800060010000300600001C08000003F00020237EA125>I<FFF0007FC01F
+80001F000F00000C000780000C000780000800078000080003C000100003C000100003E0003000
+01E000200001E000200000F000400000F000400000F000400000780080000078008000007C0180
+00003C010000003C010000001E020000001E020000001F020000000F040000000F040000000F8C
+0000000788000000078800000003D000000003D000000003F000000001E000000001E000000000
+C000000000C000000000C0000022237FA125>I<FFF03FFC03FE1F8007E000F80F0003C000700F
+0003C000200F0003C00020078001E00040078001E00040078001E0004003C002F0008003C002F0
+008003C002F0008001E00478010001E00478010001E00478010000F0083C020000F0083C020000
+F0083C020000F8183E06000078101E04000078101E0400007C101E0400003C200F0800003C200F
+0800003C200F0800001E40079000001E40079000001E40079000000F8003E000000F8003E00000
+0F8003E00000070001C00000070001C00000070001C0000003000180000002000080002F237FA1
+32>I<7FF807FF0007E001F80003C000E00003E000C00001E000800000F001000000F803000000
+78020000007C040000003E0C0000001E080000001F100000000FB000000007A000000007C00000
+0003E000000001E000000001F000000003F80000000278000000047C0000000C3E000000081E00
+0000101F000000300F80000020078000004007C00000C003E000008001E000010001F000030000
+F000070000F8001F8001FC00FFE007FFC022227FA125>I<0FE0001838003C0C003C0E00180700
+00070000070000070000FF0007C7001E07003C0700780700700700F00708F00708F00708F00F08
+7817083C23900FC1E015157E9418>97 D<0E0000FE00001E00000E00000E00000E00000E00000E
+00000E00000E00000E00000E00000E00000E00000E1F000E61C00E80600F00300E00380E003C0E
+001C0E001E0E001E0E001E0E001E0E001E0E001E0E001E0E001C0E003C0E00380F00700C80600C
+41C0083F0017237FA21B>I<01FE000703000C07801C0780380300780000700000F00000F00000
+F00000F00000F00000F00000F000007000007800403800401C00800C010007060001F80012157E
+9416>I<0000E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000
+E00000E00000E001F8E00704E00C02E01C01E03800E07800E07000E0F000E0F000E0F000E0F000
+E0F000E0F000E0F000E07000E07800E03800E01801E00C02E0070CF001F0FE17237EA21B>I<01
+FC000707000C03801C01C03801C07801E07000E0F000E0FFFFE0F00000F00000F00000F00000F0
+00007000007800203800201C00400E008007030000FC0013157F9416>I<003C00C6018F038F03
+0F070007000700070007000700070007000700FFF8070007000700070007000700070007000700
+07000700070007000700070007000700070007807FF8102380A20F>I<00007001F198071E180E
+0E181C07001C07003C07803C07803C07803C07801C07001C07000E0E000F1C0019F00010000010
+00001800001800001FFE000FFFC00FFFE03800F0600030400018C00018C00018C0001860003060
+00303800E00E038003FE0015217F9518>I<0E0000FE00001E00000E00000E00000E00000E0000
+0E00000E00000E00000E00000E00000E00000E00000E1F800E60C00E80E00F00700F00700E0070
+0E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0070
+0E0070FFE7FF18237FA21B>I<1C001E003E001E001C0000000000000000000000000000000000
+0E00FE001E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E
+00FFC00A227FA10E>I<01C003E003E003E001C00000000000000000000000000000000001E00F
+E001E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E0
+00E000E000E000E000E060E0F0C0F18061803E000B2C82A10F>I<0E0000FE00001E00000E0000
+0E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E03FC0E01F00E01C0
+0E01800E02000E04000E08000E10000E38000EF8000F1C000E1E000E0E000E07000E07800E03C0
+0E01C00E01E00E00F00E00F8FFE3FE17237FA21A>I<0E00FE001E000E000E000E000E000E000E
+000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00
+0E000E000E000E000E000E00FFE00B237FA20E>I<0E1FC07F00FE60E183801E807201C00F003C
+00E00F003C00E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E00
+3800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E
+003800E0FFE3FF8FFE27157F942A>I<0E1F80FE60C01E80E00F00700F00700E00700E00700E00
+700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0070FFE7
+FF18157F941B>I<01FC000707000C01801800C03800E0700070700070F00078F00078F00078F0
+0078F00078F00078F000787000707800F03800E01C01C00E038007070001FC0015157F9418>I<
+0E1F00FE61C00E80600F00700E00380E003C0E001C0E001E0E001E0E001E0E001E0E001E0E001E
+0E001E0E003C0E003C0E00380F00700E80E00E41C00E3F000E00000E00000E00000E00000E0000
+0E00000E00000E00000E0000FFE000171F7F941B>I<01F8200704600E02601C01603801E07800
+E07800E0F000E0F000E0F000E0F000E0F000E0F000E0F000E07000E07800E03801E01C01E00C02
+E0070CE001F0E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000FFE171F
+7E941A>I<0E3CFE461E8F0F0F0F060F000E000E000E000E000E000E000E000E000E000E000E00
+0E000E000F00FFF010157F9413>I<0F8830786018C018C008C008E008F0007F803FE00FF001F8
+003C801C800C800CC00CC008E018D0308FC00E157E9413>I<0200020002000200060006000600
+0E001E003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E040E040E040E040E
+040E040708030801F00E1F7F9E13>I<0E0070FE07F01E00F00E00700E00700E00700E00700E00
+700E00700E00700E00700E00700E00700E00700E00700E00700E00F00E00F006017003827800FC
+7F18157F941B>I<FFC1FE1E00780E00300E00200E002007004007004003808003808003808001
+C10001C10000E20000E20000E20000740000740000380000380000380000100017157F941A>I<
+FF8FF8FF1E01E03C1C01C0180E01C0180E01E0100E01E010070260200702702007027020038430
+40038438400384384001C8188001C81C8001C81C8000F00D0000F00F0000F00F00006006000060
+06000060060020157F9423>I<FF83FE1F01F00E00C007008003810003830001C20000E4000078
+00007800003800003C00004E00008E000187000103800201C00401E00C00E03E01F0FF03FE1715
+7F941A>I<FFC1FE1E00780E00300E00200E002007004007004003808003808003808001C10001
+C10000E20000E20000E20000740000740000380000380000380000100000100000200000200000
+2000004000F04000F08000F180004300003C0000171F7F941A>I<3FFFC0380380300780200700
+600E00401C00403C0040380000700000E00001E00001C0000380400700400F00400E00C01C0080
+380080780180700780FFFF8012157F9416>I<FFFFFE1701808C18>I E /Fu
+64 124 df<000FF83F00007FFDFFC001F81FE3E003E03F87E007C03F87E00F803F07E00F803F03
+C00F801F00000F801F00000F801F00000F801F00000F801F00000F801F0000FFFFFFFC00FFFFFF
+FC000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F80
+1F00000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F
+801F00000F801F00000F801F00007FF0FFF0007FF0FFF00023237FA221>11
+D<000FF000007FFC0001F80E0003E01F0007C03F000F803F000F803F000F801E000F800C000F80
+00000F8000000F8000000F800000FFFFFF00FFFFFF000F801F000F801F000F801F000F801F000F
+801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F00
+0F801F000F801F000F801F000F801F007FF0FFE07FF0FFE01B237FA21F>I<FFFCFFFCFFFCFFFC
+0E047F8C13>45 D<387CFEFEFE7C3807077C8610>I<00FE0007FFC00F83E01F01F03E00F83E00
+F87C007C7C007C7C007CFC007CFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC00
+7EFC007EFC007EFC007EFC007E7C007C7C007C7C007C3E00F83E00F81F01F00F83E007FFC000FE
+0017207E9F1C>48 D<00180000780001F800FFF800FFF80001F80001F80001F80001F80001F800
+01F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F800
+01F80001F80001F80001F80001F80001F80001F8007FFFE07FFFE013207C9F1C>I<03FC000FFF
+003C1FC07007E07C07F0FE03F0FE03F8FE03F8FE01F87C01F83803F80003F80003F00003F00007
+E00007C0000F80001F00003E0000380000700000E01801C0180380180700180E00380FFFF01FFF
+F03FFFF07FFFF0FFFFF0FFFFF015207D9F1C>I<00FE0007FFC00F07E01E03F03F03F03F81F83F
+81F83F81F81F03F81F03F00003F00003E00007C0001F8001FE0001FF000007C00001F00001F800
+00FC0000FC3C00FE7E00FEFF00FEFF00FEFF00FEFF00FC7E01FC7801F81E07F00FFFC001FE0017
+207E9F1C>I<0000E00001E00003E00003E00007E0000FE0001FE0001FE00037E00077E000E7E0
+01C7E00187E00307E00707E00E07E00C07E01807E03807E07007E0E007E0FFFFFEFFFFFE0007E0
+0007E00007E00007E00007E00007E00007E000FFFE00FFFE17207E9F1C>I<1000201E01E01FFF
+C01FFF801FFF001FFE001FF8001BC00018000018000018000018000019FC001FFF001E0FC01807
+E01803E00003F00003F00003F80003F83803F87C03F8FE03F8FE03F8FC03F0FC03F07007E03007
+C01C1F800FFF0003F80015207D9F1C>I<001F8000FFE003F07007C0F00F01F81F01F83E01F83E
+01F87E00F07C00007C0000FC0800FC7FC0FCFFE0FD80F0FF00F8FE007CFE007CFC007EFC007EFC
+007EFC007E7C007E7C007E7C007E3C007C3E007C1E00F80F00F00783E003FFC000FF0017207E9F
+1C>I<6000007800007FFFFE7FFFFE7FFFFC7FFFF87FFFF87FFFF0E00060E000C0C00180C00300
+C00300000600000C00001C0000180000380000780000780000F00000F00000F00001F00001F000
+01F00003F00003F00003F00003F00003F00003F00003F00001E00017227DA11C>I<00FE0003FF
+C00703E00E00F01C00F01C00783C00783E00783F00783F80783FE0F01FF9E01FFFC00FFF8007FF
+C003FFE007FFF01E7FF83C1FFC7807FC7801FEF000FEF0003EF0001EF0001EF0001CF8001C7800
+383C00381F01F00FFFC001FF0017207E9F1C>I<01FE0007FF800F83E01E01F03E00F07C00F87C
+0078FC007CFC007CFC007CFC007EFC007EFC007EFC007E7C00FE7C00FE3E01FE1E037E0FFE7E07
+FC7E00207E00007C00007C1E007C3F00F83F00F83F00F03F01E01E03C01C0F800FFE0003F80017
+207E9F1C>I<387CFEFEFE7C380000000000000000387CFEFEFE7C3807167C9510>I<0000700000
+00007000000000F800000000F800000000F800000001FC00000001FC00000003FE00000003FE00
+000003FE00000006FF000000067F0000000E7F8000000C3F8000000C3F800000183FC00000181F
+C00000381FE00000300FE00000300FE00000600FF000006007F00000E007F80000FFFFF80000FF
+FFF800018001FC00018001FC00038001FE00030000FE00030000FE000600007F000600007F00FF
+E00FFFF8FFE00FFFF825227EA12A>65 D<FFFFFF8000FFFFFFE00007F001F80007F000FC0007F0
+007E0007F0007E0007F0007F0007F0007F0007F0007F0007F0007F0007F0007F0007F0007E0007
+F000FE0007F000FC0007F003F80007FFFFF00007FFFFF00007F001FC0007F0007E0007F0003F00
+07F0003F8007F0001F8007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001F
+C007F0003F8007F0003F8007F0007F0007F001FE00FFFFFFF800FFFFFFC00022227EA128>I<00
+03FE0080001FFF818000FF01E38001F8003F8003E0001F8007C0000F800F800007801F80000780
+3F000003803F000003807F000001807E000001807E00000180FE00000000FE00000000FE000000
+00FE00000000FE00000000FE00000000FE00000000FE000000007E000000007E000001807F0000
+01803F000001803F000003801F800003000F8000030007C000060003F0000C0001F800380000FF
+00F000001FFFC0000003FE000021227DA128>I<FFFFFF8000FFFFFFF00007F003FC0007F0007E
+0007F0003F0007F0001F8007F0000FC007F00007E007F00007E007F00007F007F00003F007F000
+03F007F00003F007F00003F807F00003F807F00003F807F00003F807F00003F807F00003F807F0
+0003F807F00003F807F00003F807F00003F007F00003F007F00003F007F00007E007F00007E007
+F0000FC007F0001F8007F0003F0007F0007E0007F003FC00FFFFFFF000FFFFFF800025227EA12B
+>I<FFFFFFFCFFFFFFFC07F000FC07F0003C07F0001C07F0000C07F0000E07F0000E07F0000607
+F0180607F0180607F0180607F0180007F0380007F0780007FFF80007FFF80007F0780007F03800
+07F0180007F0180007F0180307F0180307F0000307F0000607F0000607F0000607F0000E07F000
+0E07F0001E07F0003E07F001FCFFFFFFFCFFFFFFFC20227EA125>I<FFFFFFF8FFFFFFF807F001
+F807F0007807F0003807F0001807F0001C07F0001C07F0000C07F0000C07F0180C07F0180C07F0
+180007F0180007F0380007F0780007FFF80007FFF80007F0780007F0380007F0180007F0180007
+F0180007F0180007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00000
+FFFFE000FFFFE0001E227EA123>I<0003FE0040001FFFC0C0007F00F1C001F8003FC003F0000F
+C007C00007C00FC00003C01F800003C03F000001C03F000001C07F000000C07E000000C07E0000
+00C0FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00
+0FFFFC7E000FFFFC7F00001FC07F00001FC03F00001FC03F00001FC01F80001FC00FC0001FC007
+E0001FC003F0001FC001FC003FC0007F80E7C0001FFFC3C00003FF00C026227DA12C>I<FFFF83
+FFFEFFFF83FFFE07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0
+001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007FFFFFFC007
+FFFFFFC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC0
+07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001F
+C0FFFF83FFFEFFFF83FFFE27227EA12C>I<FFFFE0FFFFE003F80003F80003F80003F80003F800
+03F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800
+03F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800FFFFE0
+FFFFE013227FA115>I<FFFF803FFCFFFF803FFC07F000038007F000070007F0000E0007F00018
+0007F000300007F000E00007F001C00007F003800007F007000007F00E000007F018000007F038
+000007F0FC000007F1FE000007F3FE000007F77F000007FE7F800007F83F800007F01FC00007F0
+1FE00007F00FE00007F007F00007F007F80007F003F80007F001FC0007F001FE0007F000FF0007
+F0007F0007F0007F8007F0003FC0FFFF83FFFCFFFF83FFFC26227EA12C>75
+D<FFFFE000FFFFE00007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0
+000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007
+F0000007F0000007F0001807F0001807F0001807F0001807F0003807F0003807F0007007F00070
+07F000F007F001F007F007F0FFFFFFF0FFFFFFF01D227EA122>I<FFF000000FFFFFF800001FFF
+07F800001FE006FC000037E006FC000037E006FC000037E0067E000067E0067E000067E0063F00
+00C7E0063F0000C7E0061F800187E0061F800187E0060FC00307E0060FC00307E0060FC00307E0
+0607E00607E00607E00607E00603F00C07E00603F00C07E00601F81807E00601F81807E00601F8
+1807E00600FC3007E00600FC3007E006007E6007E006007E6007E006003FC007E006003FC007E0
+06001F8007E006001F8007E006001F8007E006000F0007E0FFF00F00FFFFFFF00600FFFF30227E
+A135>I<FFF8001FFEFFFC001FFE07FC0000C007FE0000C006FF0000C0067F8000C0063FC000C0
+061FE000C0060FE000C0060FF000C00607F800C00603FC00C00601FE00C00600FE00C00600FF00
+C006007F80C006003FC0C006001FE0C006000FF0C0060007F0C0060007F8C0060003FCC0060001
+FEC0060000FFC00600007FC00600007FC00600003FC00600001FC00600000FC006000007C00600
+0003C006000003C0FFF00001C0FFF00000C027227EA12C>I<0007FC0000003FFF800000FC07E0
+0003F001F80007E000FC000FC0007E001F80003F001F80003F003F00001F803F00001F807F0000
+1FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00
+000FE0FE00000FE0FE00000FE0FE00000FE07E00000FC07F00001FC07F00001FC03F00001F803F
+80003F801F80003F000FC0007E0007E000FC0003F001F80000FC07E000003FFF80000007FC0000
+23227DA12A>I<FFFFFF00FFFFFFE007F007F007F001FC07F000FC07F0007E07F0007E07F0007F
+07F0007F07F0007F07F0007F07F0007F07F0007E07F0007E07F000FC07F001FC07F007F007FFFF
+E007FFFF0007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0
+000007F0000007F0000007F0000007F00000FFFF8000FFFF800020227EA126>I<0007FC000000
+3FFF800000FC07E00003F001F80007E000FC000FC0007E001F80003F001F80003F003F00001F80
+3F00001F807F00001FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000F
+E0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07E00000FC07F00001FC07F0000
+1FC03F00001F803F81F03F801F83F83F000FC70C7E0007E606FC0003F607F80000FF07E000003F
+FF80000007FF80200000038020000003C020000003E0E0000003FFE0000001FFC0000001FFC000
+0000FFC0000000FF800000007F000000001E00232C7DA12A>I<FFFFFE0000FFFFFFC00007F007
+F00007F001F80007F000FC0007F0007E0007F0007F0007F0007F0007F0007F0007F0007F0007F0
+007F0007F0007F0007F0007E0007F000FC0007F001F80007F007F00007FFFFC00007FFFF800007
+F00FE00007F007F00007F003F80007F001FC0007F001FC0007F001FC0007F001FC0007F001FC00
+07F001FC0007F001FC0007F001FC0007F001FC0607F000FE0607F000FF0CFFFF803FF8FFFF800F
+F027227EA12A>I<01FC0407FF8C1F03FC3C007C7C003C78001C78001CF8000CF8000CFC000CFC
+0000FF0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE0003FF00007F00003F00
+003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE080FF8018227DA11F>I<
+7FFFFFFF807FFFFFFF807E03F80F807803F807807003F803806003F80180E003F801C0E003F801
+C0C003F800C0C003F800C0C003F800C0C003F800C00003F800000003F800000003F800000003F8
+00000003F800000003F800000003F800000003F800000003F800000003F800000003F800000003
+F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8000000
+03F8000003FFFFF80003FFFFF80022227EA127>I<FFFF803FFCFFFF803FFC07F000018007F000
+018007F000018007F000018007F000018007F000018007F000018007F000018007F000018007F0
+00018007F000018007F000018007F000018007F000018007F000018007F000018007F000018007
+F000018007F000018007F000018007F000018007F000018007F000018007F000018003F0000300
+03F800030001F800060000FC000E00007E001C00003F80F800000FFFE0000001FF000026227EA1
+2B>I<FFFF800FFEFFFF800FFE07F00000C007F80000C003F800018003F800018001FC00030001
+FC00030001FE00070000FE00060000FF000600007F000C00007F800C00003F801800003F801800
+003FC03800001FC03000001FE03000000FE06000000FF060000007F0C0000007F0C0000007F9C0
+000003F980000003FD80000001FF00000001FF00000000FE00000000FE00000000FE000000007C
+000000007C00000000380000000038000027227FA12A>I<FFFF0FFFF01FFEFFFF0FFFF01FFE0F
+F000FF0000E007F0007F0000C007F0007F0000C003F8007F80018003F8003F80018003FC003F80
+038001FC003FC0030001FC003FC0030000FE007FE0060000FE006FE0060000FF006FE00600007F
+00C7F00C00007F00C7F00C00007F80C7F81C00003F8183F81800003F8183F81800001FC383FC30
+00001FC301FC3000001FE301FC3000000FE600FE6000000FE600FE6000000FF600FFE0000007FC
+007FC0000007FC007FC0000003FC007F80000003F8003F80000003F8003F80000001F0001F0000
+0001F0001F00000000F0001E00000000E0000E00000000E0000E000037227FA13A>I<07FC001F
+FF803F07C03F03E03F01E03F01F01E01F00001F00001F0003FF003FDF01FC1F03F01F07E01F0FC
+01F0FC01F0FC01F0FC01F07E02F07E0CF81FF87F07E03F18167E951B>97
+D<FF000000FF0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F00
+00001F0000001F0000001F0000001F0FE0001F3FF8001FF07C001F801E001F001F001F000F801F
+000F801F000FC01F000FC01F000FC01F000FC01F000FC01F000FC01F000FC01F000FC01F000F80
+1F001F801F801F001FC03E001EE07C001C3FF800180FC0001A237EA21F>I<00FF8007FFE00F83
+F01F03F03E03F07E03F07C01E07C0000FC0000FC0000FC0000FC0000FC0000FC00007C00007E00
+007E00003E00301F00600FC0E007FF8000FE0014167E9519>I<0001FE000001FE0000003E0000
+003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E00
+01FC3E0007FFBE000F81FE001F007E003E003E007E003E007C003E00FC003E00FC003E00FC003E
+00FC003E00FC003E00FC003E00FC003E00FC003E007C003E007C003E003E007E001E00FE000F83
+BE0007FF3FC001FC3FC01A237EA21F>I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC
+00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C00007E00003E00181F00300FC07003
+FFC000FF0015167E951A>I<003F8000FFC001E3E003C7E007C7E00F87E00F83C00F80000F8000
+0F80000F80000F80000F8000FFFC00FFFC000F80000F80000F80000F80000F80000F80000F8000
+0F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80007FF8007FF800
+13237FA211>I<03FC1E0FFF7F1F0F8F3E07CF3C03C07C03E07C03E07C03E07C03E07C03E03C03
+C03E07C01F0F801FFF0013FC003000003000003800003FFF801FFFF00FFFF81FFFFC3800FC7000
+3EF0001EF0001EF0001EF0001E78003C7C007C3F01F80FFFE001FF0018217E951C>I<FF000000
+FF0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000
+001F0000001F0000001F07E0001F1FF8001F307C001F403C001F803E001F803E001F003E001F00
+3E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F
+003E001F003E001F003E00FFE1FFC0FFE1FFC01A237EA21F>I<1C003E007F007F007F003E001C
+000000000000000000000000000000FF00FF001F001F001F001F001F001F001F001F001F001F00
+1F001F001F001F001F001F001F001F00FFE0FFE00B247EA310>I<0038007C00FE00FE00FE007C
+0038000000000000000000000000000003FE03FE003E003E003E003E003E003E003E003E003E00
+3E003E003E003E003E003E003E003E003E003E003E003E003E003E783EFC3EFC3CFC7C78F87FE0
+1F800F2E83A311>I<FF000000FF0000001F0000001F0000001F0000001F0000001F0000001F00
+00001F0000001F0000001F0000001F0000001F0000001F00FF801F00FF801F0038001F0060001F
+01C0001F0380001F0700001F0E00001F1C00001F7E00001FFF00001FCF00001F0F80001F07C000
+1F03E0001F01E0001F01F0001F00F8001F007C001F003C00FFE0FFC0FFE0FFC01A237EA21E>I<
+FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F
+001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B237EA210>I<FF
+07F007F000FF1FFC1FFC001F303E303E001F403E403E001F801F801F001F801F801F001F001F00
+1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F
+001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00
+1F00FFE0FFE0FFE0FFE0FFE0FFE02B167E9530>I<FF07E000FF1FF8001F307C001F403C001F80
+3E001F803E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F
+003E001F003E001F003E001F003E001F003E001F003E00FFE1FFC0FFE1FFC01A167E951F>I<00
+FE0007FFC00F83E01E00F03E00F87C007C7C007C7C007CFC007EFC007EFC007EFC007EFC007EFC
+007EFC007E7C007C7C007C3E00F81F01F00F83E007FFC000FE0017167E951C>I<FF0FE000FF3F
+F8001FF07C001F803E001F001F001F001F801F001F801F000FC01F000FC01F000FC01F000FC01F
+000FC01F000FC01F000FC01F000FC01F001F801F001F801F803F001FC03E001FE0FC001F3FF800
+1F0FC0001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F000000FFE000
+00FFE000001A207E951F>I<00FE030007FF87000FC1C7001F006F003F003F007E003F007E001F
+007C001F00FC001F00FC001F00FC001F00FC001F00FC001F00FC001F00FC001F007E001F007E00
+1F003E003F001F007F000FC1DF0007FF9F0001FC1F0000001F0000001F0000001F0000001F0000
+001F0000001F0000001F0000001F000000FFE00000FFE01B207E951E>I<FE1F00FE3FC01E67E0
+1EC7E01E87E01E87E01F83C01F00001F00001F00001F00001F00001F00001F00001F00001F0000
+1F00001F00001F00001F0000FFF000FFF00013167E9517>I<0FF3003FFF00781F00600700E003
+00E00300F00300FC00007FE0007FF8003FFE000FFF0001FF00000F80C00780C00380E00380E003
+80F00700FC0E00EFFC00C7F00011167E9516>I<01800001800001800001800003800003800007
+80000780000F80003F8000FFFF00FFFF000F80000F80000F80000F80000F80000F80000F80000F
+80000F80000F80000F80000F81800F81800F81800F81800F81800F830007C30003FE0000F80011
+207F9F16>I<FF01FE00FF01FE001F003E001F003E001F003E001F003E001F003E001F003E001F
+003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F007E00
+1F00FE000F81BE0007FF3FC001FC3FC01A167E951F>I<FFE01FE0FFE01FE00F8006000F800600
+0FC00E0007C00C0007E01C0003E0180003E0180001F0300001F0300000F8600000F86000007CC0
+00007CC000007FC000003F8000003F8000001F0000001F0000000E0000000E00001B167F951E>
+I<FFE7FF07F8FFE7FF07F81F007800C00F807801800F807C01800F807C018007C07E030007C0DE
+030007E0DE070003E0DF060003E18F060001F18F0C0001F38F8C0001FB079C0000FB07D80000FE
+03D800007E03F000007E03F000007C01F000003C01E000003800E000001800C00025167F9528>
+I<FFE07FC0FFE07FC00F801C0007C0380003E0700003F0600001F8C00000F98000007F8000003F
+0000001F0000001F8000003FC0000037C0000063E00000C1F00001C0F8000380FC0007007E000E
+003E00FF80FFE0FF80FFE01B167F951E>I<FFE01FE0FFE01FE00F8006000F8006000FC00E0007
+C00C0007E01C0003E0180003E0180001F0300001F0300000F8600000F86000007CC000007CC000
+007FC000003F8000003F8000001F0000001F0000000E0000000E0000000C0000000C0000001800
+0078180000FC380000FC300000FC60000069C000007F8000001F0000001B207F951E>I<7FFFF0
+7FFFF07C03E07007C0600FC0E01F80C01F00C03E00C07E0000FC0000F80001F00003F03007E030
+07C0300F80701F80703F00603E00E07C03E0FFFFE0FFFFE014167E9519>I<FFFFFFE0FFFFFFE0
+1B02808E1C>I E /Fv 23 119 df<00000003FF00000C0000003FFFF0001C000001FFFFFC001C
+000007FF007F003C00001FF0000F807C00007FC00003C0FC0000FF000000F0FC0003FC00000079
+FC0007F80000003FFC000FF00000001FFC001FE00000000FFC003FC000000007FC007F80000000
+03FC00FF8000000003FC01FF0000000001FC01FE0000000001FC03FE0000000000FC07FC000000
+0000FC07FC00000000007C0FFC00000000007C0FF800000000007C1FF800000000003C1FF80000
+0000003C3FF000000000003C3FF000000000003C3FF000000000001C7FF000000000001C7FF000
+000000001C7FE000000000001C7FE0000000000000FFE0000000000000FFE0000000000000FFE0
+000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE0000000000000FF
+E0000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE0000000000000
+FFE00000000000007FE00000000000007FE00000000000007FF000000000001C7FF00000000000
+1C3FF000000000001C3FF000000000001C3FF000000000001C1FF800000000001C1FF800000000
+00380FF80000000000380FFC00000000003807FC00000000003807FC00000000007003FE000000
+00007001FE0000000000E001FF0000000000E000FF8000000001C0007F8000000001C0003FC000
+00000380001FE00000000700000FF00000000E000007F80000001C000003FC00000038000000FF
+000000700000007FC00001E00000001FF00007C000000007FF007F0000000001FFFFFE00000000
+003FFFF0000000000003FF8000003E497AC74B>67 D<FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FF
+FFFFFFFFFFFF80007FF800000FFF80003FF0000000FFC0001FF00000003FC0001FF00000001FC0
+001FF00000000FC0001FF000000007C0001FF000000003C0001FF000000003C0001FF000000001
+C0001FF000000001E0001FF000000001E0001FF000000000E0001FF000000000E0001FF0000000
+00E0001FF000000000E0001FF000000000E0001FF00000000070001FF00000000070001FF00001
+C00070001FF00001C00070001FF00001C00000001FF00001C00000001FF00001C00000001FF000
+01C00000001FF00001C00000001FF00003C00000001FF00003C00000001FF00007C00000001FF0
+000FC00000001FF0003FC00000001FFFFFFFC00000001FFFFFFFC00000001FFFFFFFC00000001F
+F0003FC00000001FF0000FC00000001FF00007C00000001FF00003C00000001FF00003C0000000
+1FF00001C00000001FF00001C00000001FF00001C00000001FF00001C00000001FF00001C0000E
+001FF00001C0000E001FF00001C0000E001FF0000000001C001FF0000000001C001FF000000000
+1C001FF0000000001C001FF0000000001C001FF0000000003C001FF0000000003C001FF0000000
+0038001FF00000000038001FF00000000078001FF00000000078001FF000000000F8001FF00000
+0000F8001FF000000001F0001FF000000001F0001FF000000003F0001FF00000000FF0001FF000
+00001FF0003FF00000007FF0007FF8000007FFF0FFFFFFFFFFFFFFE0FFFFFFFFFFFFFFE0FFFFFF
+FFFFFFFFE03F477DC646>69 D<FFFFFFFEFFFFFFFEFFFFFFFE007FFC00003FF800001FF000001F
+F000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF00000
+1FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000
+001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF0
+00001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001F
+F000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF00000
+1FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000
+001FF000003FF800007FFC00FFFFFFFEFFFFFFFEFFFFFFFE1F477DC625>73
+D<FFFFFFFFFFC00000FFFFFFFFFFFC0000FFFFFFFFFFFF0000007FF80001FFC000003FF000003F
+F000001FF000000FF800001FF0000007FC00001FF0000003FE00001FF0000001FF00001FF00000
+01FF80001FF0000000FF80001FF0000000FFC0001FF0000000FFE0001FF00000007FE0001FF000
+00007FE0001FF00000007FF0001FF00000007FF0001FF00000007FF0001FF00000007FF0001FF0
+0000007FF0001FF00000007FF0001FF00000007FF0001FF00000007FF0001FF00000007FE0001F
+F00000007FE0001FF0000000FFC0001FF0000000FFC0001FF0000000FF80001FF0000001FF8000
+1FF0000001FF00001FF0000003FE00001FF0000007FC00001FF000000FF800001FF000003FE000
+001FF00001FF8000001FFFFFFFFE0000001FFFFFFFF00000001FF00000000000001FF000000000
+00001FF00000000000001FF00000000000001FF00000000000001FF00000000000001FF0000000
+0000001FF00000000000001FF00000000000001FF00000000000001FF00000000000001FF00000
+000000001FF00000000000001FF00000000000001FF00000000000001FF00000000000001FF000
+00000000001FF00000000000001FF00000000000001FF00000000000001FF00000000000001FF0
+0000000000001FF00000000000001FF00000000000001FF00000000000001FF00000000000001F
+F00000000000001FF00000000000001FF00000000000003FF80000000000007FFC0000000000FF
+FFFFFE00000000FFFFFFFE00000000FFFFFFFE000000003C477DC646>80
+D<3FFFFFFFFFFFFFFF003FFFFFFFFFFFFFFF003FFFFFFFFFFFFFFF003FF8000FFE0007FF003FC0
+0007FC0000FF003F000007FC00003F007E000007FC00001F807C000007FC00000F807C000007FC
+00000F8078000007FC0000078078000007FC0000078078000007FC0000078070000007FC000003
+8070000007FC0000038070000007FC0000038070000007FC0000038070000007FC00000380F000
+0007FC000003C0E0000007FC000001C0E0000007FC000001C0E0000007FC000001C0E0000007FC
+000001C0E0000007FC000001C000000007FC0000000000000007FC0000000000000007FC000000
+0000000007FC0000000000000007FC0000000000000007FC0000000000000007FC000000000000
+0007FC0000000000000007FC0000000000000007FC0000000000000007FC0000000000000007FC
+0000000000000007FC0000000000000007FC0000000000000007FC0000000000000007FC000000
+0000000007FC0000000000000007FC0000000000000007FC0000000000000007FC000000000000
+0007FC0000000000000007FC0000000000000007FC0000000000000007FC0000000000000007FC
+0000000000000007FC0000000000000007FC0000000000000007FC0000000000000007FC000000
+0000000007FC0000000000000007FC0000000000000007FC0000000000000007FC000000000000
+0007FC0000000000000007FC0000000000000007FC0000000000000007FC0000000000000007FC
+0000000000000007FC0000000000000007FC0000000000000007FC0000000000000007FC000000
+000000000FFE000000000000003FFF800000000003FFFFFFFFF800000003FFFFFFFFF800000003
+FFFFFFFFF8000042467CC54B>84 D<0003FE000000001FFFC00000007E03F0000000F000FC0000
+01C0007E00000380003F000007C0001F800007F0001FC0000FF0000FC0000FF8000FE0000FF800
+0FE0000FF80007F00007F00007F00007F00007F00001C00007F00000000007F00000000007F000
+00000007F00000000007F000000001FFF00000007FFFF0000003FF87F000001FF007F000007F80
+07F00001FE0007F00003F80007F00007F00007F0000FE00007F0001FC00007F0003FC00007F000
+3F800007F0007F800007F01C7F800007F01CFF000007F01CFF000007F01CFF000007F01CFF0000
+0FF01CFF00000FF01CFF00000FF01C7F80001BF01C7F800033F01C3FC00031F8381FC00061F838
+0FF001C0FC7003FC0780FFE000FFFE003FC0001FF8001F802E2F7CAD34>97
+D<00003FE0000001FFFE000007E01F80001F8003C0003E0000E0007C00007001F80000F803F800
+03F803F00003FC07F00007FC0FE00007FC1FE00007FC1FC00003F83FC00003F83FC00000E03FC0
+0000007FC00000007F800000007F80000000FF80000000FF80000000FF80000000FF80000000FF
+80000000FF80000000FF80000000FF80000000FF80000000FF800000007F800000007F80000000
+7FC00000003FC00000003FC000000E1FC000000E1FE000000E0FE000001C0FF000001C07F00000
+3803F800003801F800007000FC0000E0007E0001C0001F800780000FE03E000001FFFC0000003F
+E000272F7DAD2E>99 D<000000003FC0000000001FFFC0000000001FFFC0000000001FFFC00000
+0000007FC000000000003FC000000000001FC000000000001FC000000000001FC000000000001F
+C000000000001FC000000000001FC000000000001FC000000000001FC000000000001FC0000000
+00001FC000000000001FC000000000001FC000000000001FC000000000001FC000000000001FC0
+00000000001FC000000000001FC000000000001FC000000000001FC000000000001FC000000000
+001FC00000001FE01FC0000001FFFC1FC0000007F01E1FC000001F80079FC000003F0001DFC000
+007C0000FFC00001F800007FC00003F800003FC00003F000003FC00007E000001FC0000FE00000
+1FC0001FE000001FC0001FC000001FC0003FC000001FC0003FC000001FC0007FC000001FC0007F
+8000001FC0007F8000001FC000FF8000001FC000FF8000001FC000FF8000001FC000FF8000001F
+C000FF8000001FC000FF8000001FC000FF8000001FC000FF8000001FC000FF8000001FC000FF80
+00001FC0007F8000001FC0007F8000001FC0007F8000001FC0003FC000001FC0003FC000001FC0
+001FC000001FC0001FC000001FC0000FE000001FC0000FE000003FC00007F000003FC00003F000
+007FC00001F80000FFC00000FC0001DFE000007E00039FF000001F000F1FFFC0000FE03E1FFFC0
+0003FFF81FFFC000003FC01FE00032497DC739>I<00007F80000003FFF000000FC0FC00003F00
+3F00007C001F8000F8000FC001F80007E003F00007E007E00003F00FE00003F80FE00003F81FC0
+0001FC1FC00001FC3FC00001FC3FC00001FC7F800001FE7F800000FE7F800000FEFF800000FEFF
+800000FEFFFFFFFFFEFFFFFFFFFEFF80000000FF80000000FF80000000FF80000000FF80000000
+FF800000007F800000007F800000007F800000007FC00000003FC00000003FC000000E1FC00000
+0E1FE000000E0FE000001C07E000001C07F000003803F000007001F800007000FC0000E0003E00
+03C0001F8007000007E03E000001FFF80000003FC000272F7DAD2E>I<000007F00000003FFC00
+00007C0E000001F81F000003F03F800007E07FC0000FC07FC0000FC07FC0001F807FC0003F803F
+80003F801F00003F000E00007F000000007F000000007F000000007F000000007F000000007F00
+0000007F000000007F000000007F000000007F000000007F000000007F000000007F000000007F
+000000007F000000007F000000007F000000FFFFFFE000FFFFFFE000FFFFFFE000007F00000000
+7F000000007F000000007F000000007F000000007F000000007F000000007F000000007F000000
+007F000000007F000000007F000000007F000000007F000000007F000000007F000000007F0000
+00007F000000007F000000007F000000007F000000007F000000007F000000007F000000007F00
+0000007F000000007F000000007F000000007F000000007F000000007F000000007F000000007F
+000000007F000000007F000000007F000000007F80000001FFC000007FFFFFC0007FFFFFC0007F
+FFFFC00022497DC820>I<0001FF0003F0000FFFE01FFC001F83F07C3E007E00FDE07E00F8003F
+807E01F8003F003C03F0001F801807F0001FC00007F0001FC0000FE0000FE0000FE0000FE0001F
+E0000FF0001FE0000FF0001FE0000FF0001FE0000FF0001FE0000FF0001FE0000FF0001FE0000F
+F0000FE0000FE0000FE0000FE00007F0001FC00007F0001FC00003F0001F800001F8003F000000
+F8003E000001FE00FC0000019F83F00000030FFFE000000301FF00000007000000000007000000
+000007000000000007000000000007000000000007000000000007800000000007C00000000007
+E00000000003FFFFFE000003FFFFFFE00001FFFFFFF80000FFFFFFFE00007FFFFFFF0001FFFFFF
+FF8003E00001FFC00F8000003FE01F0000000FE03E00000003F03C00000001F07C00000001F878
+00000000F8F800000000F8F800000000F8F800000000F8F800000000F8F800000000F87C000000
+01F07C00000001F03E00000003E01E00000003C00F000000078007C000001F0003E000003E0000
+FC0001F800003F800FE000000FFFFF80000000FFF800002F437DAC34>I<01FE0000000000FFFE
+0000000000FFFE0000000000FFFE000000000003FE000000000001FE000000000000FE00000000
+0000FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE00
+0000000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000000000
+00FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000
+00000000FE000000000000FE000000000000FE000000000000FE007F80000000FE03FFF0000000
+FE0781F8000000FE0C007C000000FE18007E000000FE30003F000000FE60003F800000FEC0001F
+800000FF80001F800000FF80001FC00000FF00001FC00000FF00001FC00000FF00001FC00000FE
+00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC0
+0000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00
+001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC000
+00FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE0000
+1FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00003
+FF80007FF000FFFFFE1FFFFFC0FFFFFE1FFFFFC0FFFFFE1FFFFFC032487CC739>I<01F00003F8
+0007FC000FFE000FFE000FFE000FFE000FFE0007FC0003F80001F0000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000FE00FFFE00FFFE
+00FFFE0003FE0001FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE
+0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE
+0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0003FF
+00FFFFFCFFFFFCFFFFFC16467DC51C>I<01FE00FFFE00FFFE00FFFE0003FE0001FE0000FE0000
+FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000
+FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000
+FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000
+FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000
+FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0003FF80FFFFFEFFFFFEFFFFFE17
+487DC71C>108 D<01FC007FC00007FC0000FFFC01FFF8001FFF8000FFFC0780FC00780FC000FF
+FC0E003E00E003E00003FC18003F018003F00001FC30001F830001F80000FC60001FC60001FC00
+00FCC0001FCC0001FC0000FD80000FD80000FC0000FD80000FF80000FE0000FF00000FF00000FE
+0000FF00000FF00000FE0000FF00000FF00000FE0000FE00000FE00000FE0000FE00000FE00000
+FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE000
+00FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE0
+0000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000F
+E00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE0000
+0FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00
+000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE
+00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0003FF80003FF80003FF80FF
+FFFE0FFFFFE0FFFFFEFFFFFE0FFFFFE0FFFFFEFFFFFE0FFFFFE0FFFFFE4F2D7CAC56>I<01FC00
+7F800000FFFC03FFF00000FFFC0781F80000FFFC0C007C000003FC18007E000001FC30003F0000
+00FC60003F800000FCC0001F800000FD80001F800000FD80001FC00000FF00001FC00000FF0000
+1FC00000FF00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000
+FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001F
+C00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE
+00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC0
+0000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00
+001FC00000FE00001FC00003FF80007FF000FFFFFE1FFFFFC0FFFFFE1FFFFFC0FFFFFE1FFFFFC0
+322D7CAC39>I<00003FE000000001FFFC00000007E03F0000001F800FC000007E0003F00000FC
+0001F80001F80000FC0003F000007E0007F000007F0007E000003F000FE000003F801FC000001F
+C01FC000001FC03FC000001FE03FC000001FE03F8000000FE07F8000000FF07F8000000FF07F80
+00000FF0FF8000000FF8FF8000000FF8FF8000000FF8FF8000000FF8FF8000000FF8FF8000000F
+F8FF8000000FF8FF8000000FF8FF8000000FF8FF8000000FF87F8000000FF07F8000000FF07F80
+00000FF03FC000001FE03FC000001FE03FC000001FE01FC000001FC00FE000003F800FE000003F
+8007F000007F0003F000007E0001F80000FC0000FC0001F800007E0003F000001F800FC000000F
+E03F80000003FFFE000000003FE000002D2F7DAD34>I<01FE00FF000000FFFE07FFF00000FFFE
+1F01FC0000FFFE38007E000003FE70003F800001FEC0001FC00000FF80000FE00000FF800007F0
+0000FF000003F80000FE000003FC0000FE000001FC0000FE000001FE0000FE000001FE0000FE00
+0000FF0000FE000000FF0000FE000000FF8000FE000000FF8000FE0000007F8000FE0000007FC0
+00FE0000007FC000FE0000007FC000FE0000007FC000FE0000007FC000FE0000007FC000FE0000
+007FC000FE0000007FC000FE0000007FC000FE0000007FC000FE0000007F8000FE000000FF8000
+FE000000FF8000FE000000FF0000FE000000FF0000FE000001FE0000FE000001FE0000FE000003
+FC0000FE000003F80000FF000007F00000FF800007F00000FF80000FE00000FFC0001F800000FE
+E0003F000000FE7800FE000000FE1E03F8000000FE0FFFE0000000FE01FE00000000FE00000000
+0000FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE00
+0000000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000000000
+00FE000000000000FE000000000000FE000000000003FF8000000000FFFFFE00000000FFFFFE00
+000000FFFFFE0000000032417DAC39>I<01FC01F800FFFC07FE00FFFC1E1F00FFFC383F8003FC
+607FC001FC607FC000FCC07FC000FCC07FC000FD803F8000FD801F0000FF000E0000FF00000000
+FF00000000FF00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000
+00FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000
+0000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00
+000000FE00000000FE00000000FE00000000FE00000000FF00000003FF800000FFFFFF8000FFFF
+FF8000FFFFFF8000222D7DAC28>114 D<001FF8060000FFFF0E0003F0079E00078001FE000E00
+007E001C00003E003C00003E007800001E007800001E00F800001E00F800000E00F800000E00FC
+00000E00FC00000E00FE00000E00FF000000007FC00000007FF80000003FFFE000001FFFFE0000
+0FFFFF800007FFFFE00003FFFFF00000FFFFFC00001FFFFE000001FFFE0000000FFF00000001FF
+800000007F806000001FC0E000001FC0E000000FC0F000000FC0F0000007C0F0000007C0F00000
+07C0F8000007C0F800000780FC00000780FC00000F00FE00000F00FF00001E00FF80003C00F9E0
+007800F0F803E000E03FFFC000C007FC0000222F7DAD29>I<0007000000070000000700000007
+00000007000000070000000F0000000F0000000F0000000F0000000F0000001F0000001F000000
+3F0000003F0000007F0000007F000000FF000001FF000007FF00001FFFFFFCFFFFFFFCFFFFFFFC
+007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00
+00007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F
+0000007F0000007F0000007F000E007F000E007F000E007F000E007F000E007F000E007F000E00
+7F000E007F000E007F000E007F000E003F000C003F801C001F801C001F8018000FC0380007C030
+0003F0E00001FFC000003F801F417EBF28>I<01FE00003FC000FFFE001FFFC000FFFE001FFFC0
+00FFFE001FFFC00003FE00007FC00001FE00003FC00000FE00001FC00000FE00001FC00000FE00
+001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC000
+00FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE0000
+1FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000
+FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001F
+C00000FE00001FC00000FE00001FC00000FE00003FC00000FE00003FC00000FE00003FC00000FE
+00007FC000007E00007FC000007E00007FC000003F0000DFC000003F00019FE000001F00031FF0
+00000F80061FFFC00007F01C1FFFC00001FFF81FFFC000003FE01FE000322E7CAC39>I<FFFFF8
+007FFFC0FFFFF8007FFFC0FFFFF8007FFFC003FF80001FFE0001FE000007F80000FE000003E000
+00FE000003C00000FF000003C000007F0000038000007F0000038000003F8000070000003F8000
+070000003FC0000F0000001FC0000E0000001FC0000E0000000FE0001C0000000FE0001C000000
+0FF0003C00000007F0003800000007F0003800000003F8007000000003F8007000000003FC00F0
+00000001FC00E000000001FC00E000000000FE01C000000000FE01C000000000FF03C000000000
+7F0380000000007F0380000000003F8700000000003F8700000000003FCF00000000001FCE0000
+0000001FCE00000000000FFC00000000000FFC00000000000FFC000000000007F8000000000007
+F8000000000003F0000000000003F0000000000003F0000000000001E0000000000001E0000000
+322D7EAB37>I E /Fw 38 122 df<78FCFCFCFC7806067B8511>46 D<007F000001C1C0000780
+F0000F0078000E0038001C001C003C001E003C001E003C001E0078000F0078000F0078000F0078
+000F00F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80
+F8000F80F8000F80F8000F80F8000F80F8000F80F8000F8078000F0078000F0078000F0078000F
+003C001E003C001E003C001E001C001C000E0038000F0078000780F00001C1C000007F00001929
+7EA71E>48 D<00100000700001F0000FF000FEF000F0F00000F00000F00000F00000F00000F000
+00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F000
+00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F000
+01F8007FFFE07FFFE013287BA71E>I<007F000001FFC00007C1E0000F0070001E0038001C003C
+003C001C0078001E0078001E00F8000F00F8000F00F8000F00F8000F00F8000F80F8000F80F800
+0F80F8000F8078000F8078001F803C001F803C001F801C002F800E004F800700CF8003810F8000
+7E0F8000000F0000000F0000000F0000001E0000001E0000001E0000003C001C003C003E007800
+3E0070003C00E0001801C0001C0780000FFE000003F8000019297EA71E>57
+D<00001800000000180000000018000000003C000000003C000000003C000000007E000000007E
+00000000FF000000009F000000009F000000011F800000010F800000010F8000000207C0000002
+07C000000207C000000403E000000403E000000403E000000801F000000801F000001801F80000
+1000F800001000F800002000FC000020007C00003FFFFC00007FFFFE000040003E000040003E00
+0080001F000080001F000080001F000100000F800100000F800100000F8002000007C007000007
+C01F80000FE0FFF000FFFFFFF000FFFF282A7EA92D>65 D<FFFFFF8000FFFFFFF00007E000FC00
+03E0007E0003E0003F0003E0001F8003E0000F8003E0000F8003E0000FC003E0000FC003E0000F
+C003E0000FC003E0000FC003E0000F8003E0001F8003E0001F0003E0003E0003E0007C0003E001
+F80003FFFFE00003E000F80003E0003E0003E0001F0003E0000F8003E00007C003E00007E003E0
+0003E003E00003F003E00003F003E00003F003E00003F003E00003F003E00003F003E00007E003
+E00007E003E0000FC003E0001F8003E0003F0007E000FE00FFFFFFF800FFFFFFE00024297EA82A
+>I<0000FF00100007FFE030001FC07830003E000C7000F80006F001F00003F003E00001F007C0
+0000F00F800000700F800000701F000000303F000000303E000000303E000000107E000000107E
+000000107C00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000
+FC00000000FC00000000FC000000007C000000007E000000007E000000103E000000103E000000
+103F000000101F000000200F800000200F8000006007C000004003E000008001F000018000F800
+0300003E000E00001FC038000007FFE0000000FF8000242B7DA92B>I<FFFFFFFF80FFFFFFFF80
+07E0001F8003E000078003E00001C003E00000C003E00000C003E000004003E000004003E00000
+4003E000004003E000002003E001002003E001002003E001000003E001000003E003000003E003
+000003E00F000003FFFF000003FFFF000003E00F000003E003000003E003000003E001000003E0
+01001003E001001003E001001003E000001003E000002003E000002003E000002003E000002003
+E000006003E000006003E00000E003E00001E003E00003C007E0001FC0FFFFFFFFC0FFFFFFFFC0
+24297EA829>69 D<FFFFFFFF00FFFFFFFF0007E0003F0003E000070003E000038003E000018003
+E000018003E000008003E000008003E000008003E000008003E000004003E002004003E0020040
+03E002000003E002000003E002000003E006000003E00E000003FFFE000003FFFE000003E00E00
+0003E006000003E002000003E002000003E002000003E002000003E002000003E000000003E000
+000003E000000003E000000003E000000003E000000003E000000003E000000003E000000003E0
+00000007F0000000FFFFE00000FFFFE0000022297EA827>I<FFFF81FFFFFFFF81FFFF07F0000F
+E003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E000
+07C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E0
+0007C003FFFFFFC003FFFFFFC003E00007C003E00007C003E00007C003E00007C003E00007C003
+E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C0
+03E00007C003E00007C003E00007C003E00007C007F0000FE0FFFF81FFFFFFFF81FFFF28297EA8
+2D>72 D<FFFF80FFFF8007F00003E00003E00003E00003E00003E00003E00003E00003E00003E0
+0003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E0
+0003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E0
+0007F000FFFF80FFFF8011297EA816>I<03FFFF03FFFF0007E00003E00003E00003E00003E000
+03E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E000
+03E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E03003E07803E0FC
+03E0FC03E0FC03C0F807C0400780200F00300E000C3C0003F000182A7DA81F>I<FFFFE000FFFF
+E00007F0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003
+E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E00000
+03E0000003E0000003E0000003E0000003E0000103E0000103E0000103E0000103E0000203E000
+0203E0000203E0000203E0000603E0000603E0000E03E0001E03E0007C07E001FCFFFFFFFCFFFF
+FFFC20297EA825>76 D<FFE0000003FFC0FFE0000003FFC007E0000003F80002F0000005F00002
+F0000005F0000278000009F0000278000009F0000278000009F000023C000011F000023C000011
+F000021E000021F000021E000021F000021E000021F000020F000041F000020F000041F0000207
+800081F0000207800081F0000207800081F0000203C00101F0000203C00101F0000203E00201F0
+000201E00201F0000201E00201F0000200F00401F0000200F00401F0000200F00401F000020078
+0801F0000200780801F00002003C1001F00002003C1001F00002003C1001F00002001E2001F000
+02001E2001F00002000F4001F00002000F4001F00002000F4001F0000200078001F00007000780
+01F0000F80030003F800FFF803007FFFC0FFF803007FFFC032297EA837>I<FFE0001FFFFFF000
+1FFF03F80001F002F80000E0027C000040027E000040023E000040021F000040021F800040020F
+8000400207C000400207E000400203E000400201F000400201F800400200F8004002007C004002
+007E004002003E004002001F004002001F804002000F8040020007C040020003E040020003E040
+020001F040020000F840020000F8400200007C400200003E400200003E400200001F400200000F
+C00200000FC002000007C002000003C002000003C007000001C00F800000C0FFF80000C0FFF800
+004028297EA82D>I<0001FF0000000F01E000003C0078000078003C0000E0000E0001E0000F00
+03C000078007800003C00F800003E01F000001F01F000001F03E000000F83E000000F87E000000
+FC7E000000FC7C0000007C7C0000007CFC0000007EFC0000007EFC0000007EFC0000007EFC0000
+007EFC0000007EFC0000007EFC0000007EFC0000007E7C0000007C7E000000FC7E000000FC7E00
+0000FC3E000000F83F000001F81F000001F01F000001F00F800003E007800003C007C00007C003
+E0000F8000F0001E000078003C00003C007800000F01E0000001FF0000272B7DA92E>I<FFFFFF
+8000FFFFFFF00007E000FC0003E0003E0003E0001F0003E0000F8003E0000FC003E00007C003E0
+0007E003E00007E003E00007E003E00007E003E00007E003E00007E003E00007C003E0000FC003
+E0000F8003E0001F0003E0003E0003E001F80003FFFFE00003E000000003E000000003E0000000
+03E000000003E000000003E000000003E000000003E000000003E000000003E000000003E00000
+0003E000000003E000000003E000000003E000000003E000000003E000000007F0000000FFFF80
+0000FFFF80000023297EA829>I<FFFFFE000000FFFFFFC0000007E003F0000003E000FC000003
+E0003E000003E0001F000003E0001F800003E0000F800003E0000FC00003E0000FC00003E0000F
+C00003E0000FC00003E0000FC00003E0000FC00003E0000F800003E0001F000003E0001E000003
+E0003C000003E000F8000003E003E0000003FFFE00000003E00780000003E001E0000003E000F0
+000003E00078000003E0007C000003E0003C000003E0003E000003E0003E000003E0003E000003
+E0003E000003E0003F000003E0003F000003E0003F000003E0003F000003E0003F008003E0003F
+808003E0001F808007F0000F8100FFFF8007C100FFFF8003C20000000000FC00292A7EA82C>82
+D<00FE010003FF83000F81E3001E0037003C001F0038000F007800070070000700F0000300F000
+0300F0000300F0000100F8000100F8000100FC0000007C0000007F0000003FE000001FFF00000F
+FFE00007FFF80003FFFC00007FFE000007FF0000007F0000001F8000000F80000007C0000007C0
+800003C0800003C0800003C0800003C0C00003C0C0000380C0000380E0000780F0000700F8000E
+00EE001C00C3C07800C1FFF000803FC0001A2B7DA921>I<7FFFFFFFF87FFFFFFFF87C007C00F8
+70007C003860007C001840007C000840007C0008C0007C000CC0007C000C80007C000480007C00
+0480007C000480007C000480007C000400007C000000007C000000007C000000007C000000007C
+000000007C000000007C000000007C000000007C000000007C000000007C000000007C00000000
+7C000000007C000000007C000000007C000000007C000000007C000000007C000000007C000000
+007C000000007C000000007C000000007C00000000FE000000FFFFFE0000FFFFFE0026297EA82B
+>I<FFFF801FFFFFFF801FFF07F00001F003E00000E003E000004003E000004003E000004003E0
+00004003E000004003E000004003E000004003E000004003E000004003E000004003E000004003
+E000004003E000004003E000004003E000004003E000004003E000004003E000004003E0000040
+03E000004003E000004003E000004003E000004003E000004003E000004003E000004003E00000
+4001E000008001F000008001F000008000F000010000780003000078000200003C000C00001F00
+18000007C070000001FFE00000007F0000282A7EA82D>I<01FC00000E0780001001C0003C00E0
+003E00F0003E0078001C00780008007800000078000000780000007800007FF80003E078000F80
+78001F0078003E0078007C00780078007820F8007820F8007820F8007820F800F8207C00F8203C
+013C401F063FC007F80F001B1A7E991E>97 D<007F8001C0700780080F003C1E007C3C007C3C00
+387C0010780000F80000F80000F80000F80000F80000F80000F80000F800007800007C00003C00
+043C00041E00080F001007802001C0C0007F00161A7E991B>99 D<007E0003C3800700E00E00F0
+1C00703C00783C003878003C78003CF8003CF8003CFFFFFCF80000F80000F80000F80000F80000
+7800007C00003C00043C00041E00080E001007002001C0C0007F00161A7E991B>101
+D<001F000070C000E1E001C3E003C3E00381C00780800780000780000780000780000780000780
+00078000078000078000FFFE00FFFE000780000780000780000780000780000780000780000780
+000780000780000780000780000780000780000780000780000780000780000780000780000780
+0007C000FFFE00FFFE00132A7FA912>I<07800000FF800000FF8000000F800000078000000780
+000007800000078000000780000007800000078000000780000007800000078000000780000007
+8000000783F800078C1C0007900E0007A0070007A0078007C0078007C007800780078007800780
+078007800780078007800780078007800780078007800780078007800780078007800780078007
+800780078007800780078007800780078007800780FFFCFFFCFFFCFFFC1E2A7FA921>104
+D<07000F801F801F800F80070000000000000000000000000000000000000007807F807F800F80
+078007800780078007800780078007800780078007800780078007800780078007800780078007
+80FFF8FFF80D297FA811>I<007800FC00FC00FC00FC0078000000000000000000000000000000
+000000007C07FC07FC007C003C003C003C003C003C003C003C003C003C003C003C003C003C003C
+003C003C003C003C003C003C003C003C003C003C003C003C003C003C7038F838F870F07060C01F
+800E3582A812>I<07800000FF800000FF8000000F800000078000000780000007800000078000
+00078000000780000007800000078000000780000007800000078000000780000007807FF00780
+7FF007801F8007801C000780180007802000078040000780800007810000078200000787000007
+9F800007A7800007C7C0000783E0000781E0000781F0000780F8000780780007807C0007803E00
+07801E0007801F0007801F80FFFC7FF8FFFC7FF81D2A7FA920>I<0780FF80FF800F8007800780
+078007800780078007800780078007800780078007800780078007800780078007800780078007
+8007800780078007800780078007800780078007800780078007800780FFFCFFFC0E2A7FA911>
+I<0781F800FC00FF860E030700FF98070C03800FA0079003C007A003D001E007C003E001E007C0
+03E001E0078003C001E0078003C001E0078003C001E0078003C001E0078003C001E0078003C001
+E0078003C001E0078003C001E0078003C001E0078003C001E0078003C001E0078003C001E00780
+03C001E0078003C001E0078003C001E0078003C001E0078003C001E0FFFC7FFE3FFFFFFC7FFE3F
+FF301A7F9933>I<0783F800FF8C1C00FF900E000FA0070007A0078007C0078007C00780078007
+800780078007800780078007800780078007800780078007800780078007800780078007800780
+0780078007800780078007800780078007800780078007800780FFFCFFFCFFFCFFFC1E1A7F9921
+>I<007F000001C1C000070070000E0038001C001C003C001E003C001E0078000F0078000F00F8
+000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F8078000F0078000F00
+3C001E003C001E001E003C000E0038000700700001C1C000007F0000191A7E991E>I<0783F000
+FF8C1C00FFB00F0007A0078007C003C0078003E0078001E0078001F0078001F0078000F8078000
+F8078000F8078000F8078000F8078000F8078000F8078000F0078001F0078001F0078001E00780
+03C007C003C007C0078007A00E0007983C000787E0000780000007800000078000000780000007
+8000000780000007800000078000000780000007800000FFFC0000FFFC00001D267F9921>I<07
+87C0FF98E0FF91F00FA1F007C1F007C0E007C00007800007800007800007800007800007800007
+800007800007800007800007800007800007800007800007800007800007C000FFFE00FFFE0014
+1A7F9917>114 D<07F8401C06C03001C06000C06000C0E00040E00040F00040F800007E00007F
+F0003FFE000FFF0003FF80003FC00007C08001E08001E0C000E0C000E0C000E0E000C0F001C0F8
+0180C4070083F800131A7E9918>I<008000008000008000008000018000018000018000038000
+0380000780000F80001FFF80FFFF80078000078000078000078000078000078000078000078000
+07800007800007800007800007800007804007804007804007804007804007804007804003C080
+01C08000E100003E0012257FA417>I<FFF00FF8FFF00FF80F8003C0078003800780010003C002
+0003C0020003E0020001E0040001E0040000F0080000F0080000F818000078100000781000003C
+2000003C2000003E6000001E4000001E4000000F8000000F800000070000000700000007000000
+020000000200000004000000040000000400000008000070080000F8100000F8100000F8200000
+F0400000608000001F0000001D267F9920>121 D E /Fx 13 90 df<0000030000000000030000
+0000000300000000000780000000000780000000000FC0000000000FC0000000000FC000000000
+17E00000000013E00000000013E00000000023F00000000021F00000000021F00000000040F800
+00000040F80000000040F800000000807C00000000807C00000001807E00000001003E00000001
+003E00000002003F00000002001F00000002001F00000004000F80000004000F80000004000F80
+0000080007C00000080007C00000180007E000001FFFFFE000001FFFFFE00000200003F0000020
+0001F00000200001F00000400001F80000400000F80000400000F800008000007C00008000007C
+00008000007C00010000003E00010000003E00030000003F00030000001F00070000001F001F80
+00003F80FFE00003FFFCFFE00003FFFC2E327EB132>65 D<00003FE0010001FFF8030007F01E03
+001F800307003E000087007800004F00F000002F01E000001F03C000000F078000000F0F800000
+070F000000071F000000031E000000033E000000033C000000017C000000017C000000017C0000
+00017800000000F800000000F800000000F800000000F800000000F800000000F800000000F800
+000000F800000000F800000000F800000000F80000000078000000007C000000007C000000017C
+000000013C000000013E000000011E000000011F000000020F000000020F800000060780000004
+03C000000801E000000800F00000100078000020003E0000C0001F8003800007F00F000001FFFC
+0000003FE00028337CB130>67 D<FFFFFFE00000FFFFFFFC000007E0007F000003E0000F800003
+E00003C00003E00001E00003E00000F00003E00000780003E000003C0003E000001E0003E00000
+1E0003E000000F0003E000000F0003E000000F8003E00000078003E0000007C003E0000007C003
+E0000003C003E0000003C003E0000003E003E0000003E003E0000003E003E0000003E003E00000
+03E003E0000003E003E0000003E003E0000003E003E0000003E003E0000003E003E0000003E003
+E0000003C003E0000003C003E0000007C003E0000007C003E00000078003E00000078003E00000
+0F8003E000000F0003E000001F0003E000001E0003E000003C0003E00000780003E00000F80003
+E00001F00003E00003E00003E0000F800007E0003F0000FFFFFFFC0000FFFFFFE000002B317CB0
+33>I<FFFFFFFFE0FFFFFFFFE007E0000FE003E00001E003E00000F003E000007003E000003003
+E000003003E000001003E000001003E000001003E000001003E000000803E000000803E0000008
+03E000800803E000800003E000800003E000800003E000800003E001800003E001800003E00780
+0003FFFF800003FFFF800003E007800003E001800003E001800003E000800003E000800003E000
+800003E000800203E000800203E000000203E000000403E000000403E000000403E000000403E0
+00000C03E000000C03E000000803E000001803E000001803E000003803E000007803E00001F807
+E0000FF0FFFFFFFFF0FFFFFFFFF027317CB02D>I<FFFFFFFFC0FFFFFFFFC007E0001FC003E000
+03C003E00001E003E00000E003E000006003E000006003E000002003E000002003E000002003E0
+00002003E000001003E000001003E000001003E000801003E000800003E000800003E000800003
+E000800003E001800003E001800003E007800003FFFF800003FFFF800003E007800003E0018000
+03E001800003E000800003E000800003E000800003E000800003E000800003E000000003E00000
+0003E000000003E000000003E000000003E000000003E000000003E000000003E000000003E000
+000003E000000003E000000003E000000007F0000000FFFFC00000FFFFC0000024317CB02B>I<
+FFFF807FFFC0FFFF807FFFC007F00003F80003E00001F00003E00001F00003E00001F00003E000
+01F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F000
+03E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E000
+01F00003E00001F00003E00001F00003E00001F00003FFFFFFF00003FFFFFFF00003E00001F000
+03E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E000
+01F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F000
+03E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E000
+01F00007F00003F800FFFF807FFFC0FFFF807FFFC02A317CB032>72 D<FFFF80FFFF8007F00003
+E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003
+E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003
+E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003
+E00003E00003E00003E00007F000FFFF80FFFF8011317DB017>I<FFFFC00000FFFFC0000007F0
+00000003E000000003E000000003E000000003E000000003E000000003E000000003E000000003
+E000000003E000000003E000000003E000000003E000000003E000000003E000000003E0000000
+03E000000003E000000003E000000003E000000003E000000003E000000003E000000003E00000
+0003E000000003E000000003E000000003E000000003E000000003E000004003E000004003E000
+004003E000004003E000008003E000008003E000008003E000008003E000018003E000018003E0
+00038003E000038003E000078003E0000F0003E0003F0007E000FF00FFFFFFFF00FFFFFFFF0022
+317CB029>76 D<FFE00007FFC0FFF00007FFC003F000007C0002F80000380002FC00001000027C
+00001000023E00001000023E00001000021F00001000021F80001000020F800010000207C00010
+000207E00010000203E00010000203F00010000201F00010000200F80010000200FC0010000200
+7C00100002007E00100002003E00100002001F00100002001F80100002000F80100002000FC010
+00020007C01000020003E01000020003F01000020001F01000020000F81000020000F810000200
+007C10000200007E10000200003E10000200001F10000200001F10000200000F90000200000FD0
+0002000007D00002000003F00002000003F00002000001F00002000001F00002000000F0000200
+000070000700000070000F8000003000FFF800003000FFF8000010002A317CB032>78
+D<00003FC000000001C03800000007000E0000001C0003800000380001C00000F00000F00001E0
+0000780003C000003C00038000001C00078000001E000F0000000F000F0000000F001E00000007
+801E00000007803C00000003C03C00000003C07C00000003E07C00000003E07800000001E07800
+000001E0F800000001F0F800000001F0F800000001F0F800000001F0F800000001F0F800000001
+F0F800000001F0F800000001F0F800000001F0F800000001F0F800000001F07C00000003E07C00
+000003E07C00000003E07C00000003E03C00000003C03E00000007C01E00000007801E00000007
+800F0000000F000F0000000F00078000001E0003C000003C0003C000003C0001E00000780000F0
+0000F00000380001C000001C000380000007000E00000001E078000000003FC000002C337CB134
+>I<FFFFFFC000FFFFFFF80007E0007E0003E0001F0003E000078003E00003C003E00001E003E0
+0001F003E00001F003E00000F003E00000F803E00000F803E00000F803E00000F803E00000F803
+E00000F803E00000F003E00001F003E00001E003E00003E003E00003C003E000078003E0001F00
+03E0007C0003FFFFF00003E000000003E000000003E000000003E000000003E000000003E00000
+0003E000000003E000000003E000000003E000000003E000000003E000000003E000000003E000
+000003E000000003E000000003E000000003E000000003E000000003E000000003E000000007F0
+000000FFFF800000FFFF80000025317CB02D>I<7FFFFFFFFFE07FFFFFFFFFE07E000F8007E078
+000F8001E070000F8000E060000F80006040000F80002040000F800020C0000F800030C0000F80
+003080000F80001080000F80001080000F80001080000F80001080000F80001080000F80001000
+000F80000000000F80000000000F80000000000F80000000000F80000000000F80000000000F80
+000000000F80000000000F80000000000F80000000000F80000000000F80000000000F80000000
+000F80000000000F80000000000F80000000000F80000000000F80000000000F80000000000F80
+000000000F80000000000F80000000000F80000000000F80000000000F80000000000F80000000
+000F80000000000F80000000000F80000000000F80000000001FC00000000FFFFF8000000FFFFF
+80002C317EB030>84 D<FFFE000007FFFFFE000007FF0FF0000001F803F0000000E003F0000000
+C001F80000008000F80000018000FC00000100007E00000200007E00000200003F00000400001F
+80000C00001F80000800000FC00010000007C00010000007E00020000003F00060000001F00040
+000001F80080000000FC0080000000FC01000000007E03000000003E02000000003F0400000000
+1F84000000000F88000000000FD80000000007F00000000007E00000000003E00000000003E000
+00000003E00000000003E00000000003E00000000003E00000000003E00000000003E000000000
+03E00000000003E00000000003E00000000003E00000000003E00000000003E00000000003E000
+00000003E00000000003E00000000007F000000000FFFF80000000FFFF800030317FB032>89
+D E end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300dpi
+TeXDict begin
+%%PaperSize: A4
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 465 315 a Fx(THE)21 b(HA)-6 b(TFIELD)22 b(POL)-6 b(YTECHNIC)578
+531 y Fw(Sc)n(ho)r(ol)19 b(of)h(Information)f(Sciences)378
+807 y(BA)n(CHELOR)i(OF)g(SCIENCE)e(IN)g(COMPUTER)844 882 y(SCIENCE)781
+1158 y(Pro)s(ject)h(Rep)r(ort)629 1425 y Fv(In)m(v)m(estigation)35
+b(of)457 1549 y(T)-9 b(actical)35 b(and)g(P)m(ositional)283
+1674 y(Ev)-6 b(aluation)36 b(in)g(Computer)f(Chess)761 1949
+y Fw(Mark)20 b(J.)f(Uniac)n(k)n(e)851 2343 y(Ma)n(y)g(1990)p
+eop
+%%Page: 0 2
+0 1 bop 870 627 a Fu(Abstract)262 762 y Ft(This)25 b(rep)q(ort)g(examines)e
+(and)j(describ)q(es)f(v)m(arious)h(tec)o(hniques)d(curren)o(tly)262
+820 y(used)16 b(to)h(program)f(a)g(computer)f(to)i(pla)o(y)e(c)o(hess.)324
+914 y(New)k(w)o(a)o(ys)h(of)g(impro)o(ving)e(b)q(oth)j(p)q(ositional)f(and)g
+(tactical)f(abilit)o(y)g(are)262 972 y(in)o(v)o(estigated.)324
+1066 y(An)g(ev)m(aluation)g(function)g(is)g(dev)o(elop)q(ed)f(after)h
+(analysing)h(ho)o(w)g(strong)262 1124 y(c)o(hess)15 b(pla)o(y)o(ers)g(select)
+g(mo)o(v)o(es.)k(The)d(ev)m(aluation)g(function)f(criteria)g(are)h(for-)262
+1182 y(mally)e(de\014ned)i(and)g(co)o(v)o(er)f(b)q(oth)j(p)q(ositional)e(and)
+h(tactical)f(asp)q(ects.)324 1275 y(V)l(arious)c(searc)o(h)f(extension)h
+(heuristics)e(are)i(in)o(v)o(estigated)f(and)h(a)g(metho)q(d)262
+1334 y(of)23 b(encorp)q(orating)i(these)e(selectiv)o(e)e(extensions)i(in)o
+(to)g(an)h(aspiration)g Fs(\013\014)262 1392 y Ft(searc)o(h)15
+b(is)i(dev)o(elop)q(ed.)324 1485 y(The)j(concept)g(of)h(uncertain)o(t)o(y)d
+(is)i(encorp)q(orated)i(in)o(to)d(the)i(ev)m(aluation)262 1543
+y(function)11 b(and)i(a)g(close)e(connection)h(b)q(et)o(w)o(een)f(static)h
+(ev)m(aluation)g(and)h(searc)o(h)262 1601 y(decision)i(making)g(is)h(sho)o
+(wn)h(to)g(b)q(e)f(e\013ectiv)o(e.)324 1695 y(The)e(ideas)g(dev)o(elop)q(ed)f
+(are)h(com)o(bined)e(in)o(to)i(a)g(c)o(hess)g(program)g(encorp)q(o-)262
+1753 y(rating)k(man)o(y)f(state)h(of)h(the)e(art)i(tec)o(hniques.)25
+b(The)18 b(program)g(is)g(sho)o(wn)h(to)262 1811 y(p)q(erform)10
+b(at)i(the)g(exp)q(ert)f(lev)o(el)f(of)i(abilit)o(y)e(b)q(oth)j(tactically)d
+(and)i(p)q(ositionally)l(.)324 1905 y(The)23 b(trade)g(o\013)h(b)q(et)o(w)o
+(een)e(kno)o(wledge)g(and)i(searc)o(h)e(is)h(examined)e(and)262
+1963 y(conclusions)d(ab)q(out)i(the)f(e\013ectiv)o(eness)e(of)i(reducing)g
+(searc)o(h)f(e\013ort)h(b)o(y)g(in-)262 2021 y(creasing)d(kno)o(wledge)g(con)
+o(ten)o(t)f(are)h(dra)o(wn.)p eop
+%%Page: 1 3
+1 2 bop 692 1168 a Fr(Ac)n(kno)n(wledgemen)n(ts)262 1303 y
+Ft(I)10 b(w)o(ould)h(lik)o(e)e(to)i(thank)g(m)o(y)e(pro)s(ject)i(sup)q
+(ervisor,)h(Neil)d(Da)o(v)o(ey)l(,)h(for)h(the)g(man)o(y)262
+1361 y(in)o(teresting)17 b(discussions)h(throughout)i(the)e(y)o(ear)g(and)h
+(Piet)e(T)l(utelaers,)h(for)262 1419 y(designing)e(c)o(hess)g(fon)o(ts)g
+(whic)o(h)g(can)g(b)q(e)h(used)f(in)g(L)1195 1413 y Fq(a)1219
+1419 y Ft(T)1246 1434 y(E)1273 1419 y(X)g(do)q(cumen)o(ts.)967
+2574 y Fp(1)p eop
+%%Page: 2 4
+2 3 bop 262 639 a Fo(Con)m(ten)m(ts)262 912 y Fu(1)45 b(In)n(tro)r(duction)
+1022 b(7)335 970 y Ft(1.1)50 b(A)16 b(Brief)f(History)34 b
+Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h
+(:)f(:)g(:)74 b Ft(8)335 1028 y(1.2)50 b(My)16 b(Bac)o(kground)24
+b Fs(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h
+(:)f(:)g(:)50 b Ft(10)335 1087 y(1.3)g(Aims)14 b(of)j(the)f(Pro)s(ject)j
+Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)50 b Ft(10)262 1193 y Fu(2)45 b(Basic)18 b(Ov)n(erview)924
+b(11)335 1252 y Ft(2.1)50 b(Mac)o(hine)15 b(Represen)o(tation)43
+b Fs(:)24 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(11)335 1310 y(2.2)g(Mo)o(v)o(e)15 b(Generation)38 b Fs(:)24
+b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)
+50 b Ft(13)335 1368 y(2.3)g(Ev)m(aluation)17 b(F)l(unctions)28
+b Fs(:)c(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(14)335 1426 y(2.4)g(Lo)q(ok)17 b(Ahead)29 b Fs(:)c(:)f(:)h(:)f(:)h(:)f
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(15)335 1484 y(2.5)g(Selectiv)o(e)13 b(Searc)o(hing)37
+b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f
+(:)g(:)50 b Ft(17)335 1542 y(2.6)g(F)l(ull)15 b(Width)h(Searc)o(hing)25
+b Fs(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(19)335 1600 y(2.7)g(Quiescence)15 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(20)335 1658 y(2.8)g(Horizon)16 b(E\013ect)k Fs(:)k(:)h(:)f(:)h(:)f(:)h
+(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(20)262 1765 y Fu(3)45 b(Adv)m(anced)18 b(T)-5 b(opics)889
+b(22)335 1823 y Ft(3.1)50 b(T)l(ree)16 b(Searc)o(hing)c Fs(:)24
+b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f
+(:)g(:)50 b Ft(22)447 1881 y(3.1.1)56 b(Alpha)16 b(Beta)g(Searc)o(h)g
+(Algorithm)34 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(22)447 1940 y(3.1.2)56 b(Aspiration)16 b Fs(\013\014)j
+Ft(Searc)o(h)i Fs(:)j(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(25)447 1998 y(3.1.3)56 b(Principle)15 b(V)l(ariation)h
+Fs(\013\014)i Ft(Searc)o(h)33 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(25)447 2056 y(3.1.4)56 b(Iterativ)o(e)14 b(Deep)q(ening)21
+b Fs(:)k(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(28)447 2114 y(3.1.5)56 b(Mo)o(v)o(e)15 b(Ordering)43 b
+Fs(:)25 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(28)447 2172 y(3.1.6)56 b(Null)15 b(Mo)o(v)o(es)45 b Fs(:)25
+b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(29)447 2230 y(3.1.7)56 b(Razoring)19 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b
+Ft(31)335 2288 y(3.2)g(Ev)m(aluation)21 b Fs(:)j(:)h(:)f(:)h(:)f(:)h(:)f(:)h
+(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(33)447 2346 y(3.2.1)56 b(Piece)15 b(Square)h(T)l(ables)e
+Fs(:)25 b(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(33)447 2405 y(3.2.2)56 b(Static)16 b(Ev)m(aluation)32
+b Fs(:)24 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(34)967 2574 y Fp(2)p eop
+%%Page: 3 5
+3 4 bop 447 307 a Ft(3.2.3)56 b(Incremen)o(tal)13 b(Ev)m(aluation)20
+b Fs(:)k(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b
+Ft(35)447 365 y(3.2.4)56 b(Phases)17 b(of)g(Pla)o(y)12 b Fs(:)24
+b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(36)447 423 y(3.2.5)56 b(Planning)19 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b
+Ft(37)335 482 y(3.3)g(Learning)25 b Fs(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)
+f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(37)447 540 y(3.3.1)56 b(Rote)16 b(Learning)21 b Fs(:)j(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(38)447
+598 y(3.3.2)56 b(Advice)15 b(T)l(aking)h Fs(:)24 b(:)h(:)f(:)h(:)f(:)g(:)h(:)
+f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(38)447 656
+y(3.3.3)56 b(Induction)43 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
+(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(39)447 714 y(3.3.4)56
+b(Learning)17 b(b)o(y)f(Analogy)31 b Fs(:)24 b(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)
+h(:)f(:)h(:)f(:)g(:)50 b Ft(39)447 772 y(3.3.5)56 b(P)o(arameter)15
+b(Adjustmen)o(t)26 b Fs(:)e(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(39)335 830 y(3.4)g(Time)14 b(Con)o(trol)39 b Fs(:)24 b(:)h(:)f(:)h(:)f
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(40)262 937 y Fu(4)45 b(The)18 b(Ev)m(aluation)g(F)-5 b(unction)695
+b(42)335 995 y Ft(4.1)50 b(De\014nition)16 b(1)g(:)22 b(Material)35
+b Fs(:)25 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(44)335 1053 y(4.2)g(De\014nition)16 b(2)g(:)22 b(Game)15
+b(Phase)27 b Fs(:)e(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(46)335 1111 y(4.3)g(General)16 b(P)o(ositional)g(Ev)m(aluation)35
+b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(47)447 1170 y(4.3.1)56 b(De\014nition)16 b(3)h(:)k(Mobilit)o(y)32
+b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(47)447 1228 y(4.3.2)56 b(De\014nition)16 b(4)h(:)k(Dev)o(elopmen)o(t)11
+b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(49)447
+1286 y(4.3.3)56 b(De\014nition)16 b(5)h(:)k(Cen)o(tre)15 b(Con)o(trol)49
+b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(50)447 1344
+y(4.3.4)56 b(De\014nition)16 b(6)h(:)k(Square)16 b(Con)o(trol)46
+b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(52)335 1402
+y(4.4)g(P)o(a)o(wn)16 b(Ev)m(aluation)42 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(53)447
+1460 y(4.4.1)56 b(De\014nition)16 b(7)h(:)k(Doubled)16 b(P)o(a)o(wns)38
+b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(53)447 1518
+y(4.4.2)56 b(De\014nition)16 b(8)h(:)k(Isolated)16 b(P)o(a)o(wns)49
+b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(54)447 1576
+y(4.4.3)56 b(De\014nition)16 b(9)h(:)k(W)l(eak)16 b(P)o(a)o(wns)21
+b Fs(:)j(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(54)447
+1634 y(4.4.4)56 b(De\014nition)16 b(10)h(:)k(P)o(assed)c(P)o(a)o(wns)48
+b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(56)447 1693
+y(4.4.5)56 b(De\014nition)16 b(11)h(:)k(P)o(a)o(wn)c(T)l(able)e
+Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(58)447
+1751 y(4.4.6)56 b(De\014nition)16 b(12)h(:)k(P)o(a)o(wn)c(V)l(alue)c
+Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(58)335
+1809 y(4.5)g(Knigh)o(t)16 b(Ev)m(aluation)49 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(60)447
+1867 y(4.5.1)56 b(De\014nition)16 b(13)h(:)k(Knigh)o(t)16 b(V)l(alue)21
+b Fs(:)k(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(60)335 1925
+y(4.6)g(Bishop)16 b(Ev)m(aluation)51 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(61)447 1983
+y(4.6.1)56 b(De\014nition)16 b(14)h(:)k(Bishop)16 b(A)o(ttac)o(k)37
+b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(61)447 2041
+y(4.6.2)56 b(De\014nition)16 b(15)h(:)k(Bishop)16 b(on)h(Kings)f(Diagonal)j
+Fs(:)24 b(:)g(:)50 b Ft(61)447 2099 y(4.6.3)56 b(De\014nition)16
+b(16)h(:)k(Bishop)16 b(P)o(air)g Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)
+g(:)50 b Ft(62)447 2158 y(4.6.4)56 b(De\014nition)16 b(17)h(:)k(Horrwitz)16
+b(Bishops)51 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(62)447
+2216 y(4.6.5)56 b(De\014nition)16 b(18)h(:)k(Enem)o(y)14 b(P)o(a)o(wn)j
+(Obstruction)23 b Fs(:)h(:)g(:)50 b Ft(63)447 2274 y(4.6.6)56
+b(De\014nition)16 b(19)h(:)k(Bishop)16 b(T)l(able)25 b Fs(:)g(:)f(:)h(:)f(:)h
+(:)f(:)h(:)f(:)g(:)50 b Ft(64)447 2332 y(4.6.7)56 b(De\014nition)16
+b(20)h(:)k(Bishop)16 b(V)l(alue)23 b Fs(:)i(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)50 b Ft(64)335 2390 y(4.7)g(Ro)q(ok)17 b(Ev)m(aluation)47
+b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h
+(:)f(:)g(:)50 b Ft(66)447 2448 y(4.7.1)56 b(De\014nition)16
+b(21)h(:)k(Ro)q(ok{King)c(Closeness)42 b Fs(:)24 b(:)h(:)f(:)g(:)50
+b Ft(66)967 2574 y Fp(3)p eop
+%%Page: 4 6
+4 5 bop 447 307 a Ft(4.7.2)56 b(De\014nition)16 b(22)h(:)k(Connected)16
+b(Ro)q(oks)50 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(67)447
+365 y(4.7.3)56 b(De\014nition)16 b(23)h(:)k(Ro)q(ok)c(on)g(Op)q(en)f(File)c
+Fs(:)24 b(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(68)447 423 y(4.7.4)56
+b(De\014nition)16 b(24)h(:)k(Ro)q(ok)c(on)g(Sev)o(en)o(th)e(Rank)44
+b Fs(:)25 b(:)f(:)g(:)50 b Ft(68)447 482 y(4.7.5)56 b(De\014nition)16
+b(25)h(:)k(Ro)q(ok)c(V)l(alue)i Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)50 b Ft(69)335 540 y(4.8)g(Queen)16 b(Ev)m(aluation)23 b
+Fs(:)h(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)
+g(:)50 b Ft(70)447 598 y(4.8.1)56 b(De\014nition)16 b(26)h(:)k(Queen{King)16
+b(Closeness)i Fs(:)24 b(:)h(:)f(:)g(:)50 b Ft(70)447 656 y(4.8.2)56
+b(De\014nition)16 b(27)h(:)k(Queen)16 b(P)o(o)o(w)o(er)23 b
+Fs(:)i(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(71)447 714
+y(4.8.3)56 b(De\014nition)16 b(28)h(:)k(Queen)16 b(V)l(alue)33
+b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(71)335
+772 y(4.9)g(King)16 b(Ev)m(aluation)h Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(72)447
+830 y(4.9.1)56 b(De\014nition)16 b(29)h(:)k(King)16 b(On)h(Op)q(en)f(Files)26
+b Fs(:)f(:)f(:)h(:)f(:)g(:)50 b Ft(72)447 888 y(4.9.2)56 b(De\014nition)16
+b(30)h(:)k(W)l(eak)16 b(Squares)h(around)g(King)30 b Fs(:)24
+b(:)50 b Ft(73)447 946 y(4.9.3)56 b(De\014nition)16 b(31)h(:)k(Mating)16
+b(Net)k Fs(:)k(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(75)447
+1005 y(4.9.4)56 b(De\014nition)16 b(32)h(:)k(Chec)o(k)15 b(Threats)33
+b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(76)447 1063
+y(4.9.5)56 b(De\014nition)16 b(33)h(:)k(King)16 b(T)l(able)30
+b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(77)447
+1121 y(4.9.6)56 b(De\014nition)16 b(34)h(:)k(King)16 b(V)l(alue)28
+b Fs(:)c(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(77)335
+1179 y(4.10)26 b(Static)16 b(T)l(actical)f(Ev)m(aluation)41
+b Fs(:)25 b(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50
+b Ft(79)447 1237 y(4.10.1)32 b(De\014nition)16 b(35)h(:)k(Pinned)16
+b(Pieces)46 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b
+Ft(79)447 1295 y(4.10.2)32 b(De\014nition)16 b(36)h(:)k(A)o(ttac)o(k)o(ed)14
+b(Pieces)43 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(81)335
+1353 y(4.11)26 b(Planning)c Fs(:)i(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)
+f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(82)447
+1411 y(4.11.1)32 b(De\014nition)16 b(37)h(:)k(Pressure)16 b(on)h(King)e
+Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(83)447 1469 y(4.11.2)32
+b(De\014nition)16 b(38)h(:)k(Plan)c(Selection)38 b Fs(:)24
+b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(84)447 1528 y(4.11.3)32
+b(De\014nition)16 b(39)h(:)k(P)o(a)o(wn)c(Square)f(T)l(able)46
+b Fs(:)25 b(:)f(:)h(:)f(:)g(:)50 b Ft(86)447 1586 y(4.11.4)32
+b(De\014nition)16 b(40)h(:)k(Knigh)o(t)16 b(Square)g(T)l(able)g
+Fs(:)25 b(:)f(:)h(:)f(:)g(:)50 b Ft(88)447 1644 y(4.11.5)32
+b(De\014nition)16 b(41)h(:)k(Bishop)16 b(Square)h(T)l(able)g
+Fs(:)25 b(:)f(:)h(:)f(:)g(:)50 b Ft(89)447 1702 y(4.11.6)32
+b(De\014nition)16 b(42)h(:)k(King)16 b(Square)h(T)l(able)22
+b Fs(:)i(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(90)447 1760 y(4.11.7)32
+b(De\014nition)16 b(43)h(:)k(Square)16 b(Con)o(trol)h(T)l(able)41
+b Fs(:)24 b(:)h(:)f(:)g(:)50 b Ft(92)335 1818 y(4.12)26 b(De\014nition)16
+b(44)h(:)k(T)l(otal)c(Ev)m(aluation)g(F)l(unction)f(V)l(alue)32
+b Fs(:)24 b(:)g(:)50 b Ft(94)262 1925 y Fu(5)45 b(T)-5 b(ree)18
+b(Searc)n(hing)940 b(96)335 1983 y Ft(5.1)50 b(Main)16 b(Searc)o(h)22
+b Fs(:)j(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h
+(:)f(:)h(:)f(:)g(:)50 b Ft(97)335 2041 y(5.2)g(Searc)o(h)16
+b(Extensions)i Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f
+(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(99)447 2099 y(5.2.1)56 b(Threats)44
+b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f
+(:)h(:)f(:)g(:)h Ft(100)447 2158 y(5.2.2)56 b(Threat)17 b(Execution)25
+b Fs(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(103)335 2216 y(5.3)50 b(Quiescence)14 b(Decision)g Fs(:)25
+b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(106)335 2274 y(5.4)50 b(Quiescence)14 b(Searc)o(h)h Fs(:)24
+b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(107)262 2381 y Fu(6)45 b(HIAR)n(CS)19 b(5.0)966 b(110)335
+2439 y Ft(6.1)50 b(Program)16 b(History)g(and)h(En)o(vironmen)o(t)40
+b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(110)967
+2574 y Fp(4)p eop
+%%Page: 5 7
+5 6 bop 335 307 a Ft(6.2)50 b(Program)16 b(Structure)40 b Fs(:)25
+b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(111)335 365 y(6.3)50 b(Data)17 b(Structures)24 b Fs(:)h(:)f(:)h(:)f(:)h(:)
+f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(113)447 423 y(6.3.1)56 b(P)o(osition)16 b(Represen)o(tation)46
+b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(114)447
+482 y(6.3.2)56 b(Game)15 b(T)l(ree)e Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(115)447 540
+y(6.3.3)56 b(T)l(ransp)q(osition)18 b(T)l(able)d Fs(:)25 b(:)f(:)g(:)h(:)f(:)
+h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(115)447 598 y(6.3.4)56
+b(Refutation)16 b(T)l(able)41 b Fs(:)24 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f
+(:)h(:)f(:)h(:)f(:)g(:)h Ft(118)447 656 y(6.3.5)56 b(The)16
+b(History)g(Heuristic)c Fs(:)24 b(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f
+(:)g(:)h Ft(119)447 714 y(6.3.6)56 b(Incremen)o(tal)13 b(A)o(ttac)o(k)i(T)l
+(ables)29 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(119)447 772 y(6.3.7)56 b(Game)15 b(History)26 b Fs(:)e(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(121)335
+830 y(6.4)50 b(The)16 b(Algorithms)26 b Fs(:)f(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(122)447
+888 y(6.4.1)56 b(Mo)o(v)o(e)15 b(Generation)36 b Fs(:)24 b(:)h(:)f(:)g(:)h(:)
+f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(122)447 946 y(6.4.2)56
+b(Mo)o(v)o(e)15 b(Ordering)43 b Fs(:)25 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h
+(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(124)447 1005 y(6.4.3)56 b(T)l(ree)16
+b(Searc)o(hing)48 b Fs(:)25 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f
+(:)h(:)f(:)g(:)h Ft(127)447 1063 y(6.4.4)56 b(Ev)m(aluation)19
+b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h
+(:)f(:)g(:)h Ft(131)447 1121 y(6.4.5)56 b(Time)14 b(Allo)q(cation)i(and)h
+(Con)o(trol)c Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(133)335 1179 y(6.5)50 b(E\016ciency)14 b(Asp)q(ects)j Fs(:)24
+b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(139)447 1237 y(6.5.1)56 b(Algorithms)47 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(139)447
+1295 y(6.5.2)56 b(Data)17 b(Structures)22 b Fs(:)j(:)f(:)h(:)f(:)g(:)h(:)f(:)
+h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(139)447 1353 y(6.5.3)56
+b(Co)q(de)17 b(Pro)q(duction)39 b Fs(:)24 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h
+(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(140)262 1460 y Fu(7)45 b(Program)17
+b(P)n(erformance)733 b(141)335 1518 y Ft(7.1)50 b(Bratk)o(o-Kop)q(ec)16
+b(T)l(ests)k Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)
+f(:)h(:)f(:)g(:)h Ft(142)335 1576 y(7.2)50 b(Computer)15 b(Opp)q(osition)i
+Fs(:)24 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(146)335 1634 y(7.3)50 b(Human)15 b(Opp)q(osition)36 b Fs(:)25
+b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(152)335 1693 y(7.4)50 b(Kno)o(wledge)16 b(v)o(ersus)g(Searc)o(h)23
+b Fs(:)h(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(158)335 1751 y(7.5)50 b(In)o(ternal)15 b(Statistics)24 b
+Fs(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)
+g(:)h Ft(160)335 1809 y(7.6)50 b(Summary)14 b(of)i(P)o(erformance)e
+Fs(:)24 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(162)262 1916 y Fu(8)45 b(Conclusion)1007 b(164)335 1974
+y Ft(8.1)50 b(Review)18 b Fs(:)25 b(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(164)335 2032 y(8.2)50 b(Ac)o(hiev)o(em)o(e)o(n)o(ts)33 b
+Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f
+(:)h(:)f(:)g(:)h Ft(166)335 2090 y(8.3)50 b(Implications)14
+b(and)j(F)l(uture)f(Prosp)q(ects)e Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f
+(:)g(:)h Ft(168)262 2197 y Fu(A)31 b(Glossary)1063 b(175)262
+2304 y(B)33 b(Pseudo)19 b(F)-5 b(unctions)844 b(176)262 2411
+y(C)33 b(Time)16 b(Allo)r(cation)i(Graphs)681 b(202)967 2574
+y Fp(5)p eop
+%%Page: 6 8
+6 7 bop 262 307 a Fu(D)30 b(Bratk)n(o-Kop)r(ec)17 b(T)-5 b(est)18
+b(P)n(ositions)572 b(208)262 414 y(E)36 b(T)-5 b(est)18 b(Games)f(Pla)n(y)n
+(ed)805 b(221)335 472 y Ft(E.1)41 b(HIAR)o(CS)15 b(5.0)h(v)o(ersus)g
+(Mephisto)g(Exclusiv)o(e)21 b Fs(:)k(:)f(:)h(:)f(:)h(:)f(:)g(:)h
+Ft(222)447 530 y(E.1.1)47 b(Game)15 b(1)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(222)447
+588 y(E.1.2)47 b(Game)15 b(2)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(223)447
+647 y(E.1.3)47 b(Game)15 b(3)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(224)447
+705 y(E.1.4)47 b(Game)15 b(4)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(225)447
+763 y(E.1.5)47 b(Game)15 b(5)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(226)447
+821 y(E.1.6)47 b(Game)15 b(6)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(227)335
+879 y(E.2)41 b(HIAR)o(CS)15 b(5.0)h(v)o(ersus)g(Mark)g(Uniac)o(k)o(e)21
+b Fs(:)j(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(228)447
+937 y(E.2.1)47 b(Game)15 b(1)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(228)447
+995 y(E.2.2)47 b(Game)15 b(2)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(229)335
+1053 y(E.3)41 b(HIAR)o(CS)15 b(5.0)h(v)o(ersus)g(NOKNO)o(W)45
+b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(231)447
+1111 y(E.3.1)47 b(Game)15 b(1)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(231)447
+1170 y(E.3.2)47 b(Game)15 b(2)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(233)447
+1228 y(E.3.3)47 b(Game)15 b(3)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(234)447
+1286 y(E.3.4)47 b(Game)15 b(4)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(235)967
+2574 y Fp(6)p eop
+%%Page: 7 9
+7 8 bop 262 654 a Fn(Chapter)34 b(1)262 897 y Fo(In)m(tro)s(duction)262
+1148 y Fp(Chess)14 b(is)g(an)g(extraordinary)f(game.)k(The)d(rules)g(are)g
+(clearly)g(de\014ned)h(and)e(quite)h(simple)262 1198 y(to)j(learn,)h(y)o(et)g
+(the)g(game)e(is)h(so)h(complex)e(it)h(has)h(c)o(hallenged)f(mankind)f(for)h
+(cen)o(turies)262 1248 y(and)f(is)g(still)g(as)h(ric)o(h)f(and)h(v)n(aried)f
+(as)h(ev)o(er.)27 b(Suc)o(h)17 b(an)f(enormous)g(amoun)o(t)f(of)h(material)
+262 1298 y(has)11 b(b)q(een)i(written)f(ab)q(out)g(the)g(game)f(that)g(there)
+j(are)e(more)e(b)q(o)q(oks)i(written)g(ab)q(out)g(c)o(hess)262
+1347 y(than)j(all)f(other)j(games)d(put)i(together.)24 b(The)16
+b(game)e(app)q(eals)i(to)f(all)f(ages)i(and)g(abilities)262
+1397 y(from)c(b)q(eginner)i(to)g(exp)q(ert.)365 1480 y("Chess)d(is)f(a)g(sea)
+g(in)g(whic)o(h)f(a)h(gnat)g(ma)o(y)e(drink)h(or)h(an)g(elephan)o(t)g(ma)o(y)
+e(bathe.")1319 1547 y Fm(Indian)k(pr)n(overb.)324 1665 y Fp(Chess)18
+b(epitomises)e(man)o(y)e(of)i(the)i(problems)e(facing)f(the)j(\014eld)e(of)h
+(arti\014cial)e(in)o(telli-)262 1715 y(gence,)j(that)f(of)g(the)h(storage,)g
+(represen)o(tation,)h(retriev)n(al)e(and)g(application)f(of)h(kno)o(wl-)262
+1765 y(edge;)12 b(searc)o(hing)h(in\014nite)e(domains)f(and)i(problem)f
+(solving)f(using)i(inexact)g(information.)262 1815 y(Chess)h(therefore)h(pro)
+o(vides)f(an)f(almost)f(p)q(erfect)j(en)o(vironmen)o(t)e(in)g(whic)o(h)g(to)h
+(exp)q(erimen)o(t)262 1864 y(with)e(new)g(ideas.)18 b(Unlik)o(e)10
+b(most)g(other)i(problem)e(domains,)g(progress)i(can)g(b)q(e)g(accurately)262
+1914 y(measured,)g(see)i([19)o(].)j(Ideas)c(can)g(easily)f(b)q(e)h(put)g(to)f
+(the)i(test,)f(b)q(oth)g(against)f(h)o(uman)f(and)262 1964
+y(computer)g(opp)q(osition)f(in)h(comp)q(etition;)g(and)g(in)g(sp)q(ecially)g
+(designed)i(exp)q(erimen)o(ts.)k(F)m(or)262 2014 y(these)c(reasons,)g(c)o
+(hess)h(is)e(an)g(excellen)o(t)h(researc)o(h)i(en)o(vironmen)o(t)c(in)h(whic)
+o(h)g(to)g(in)o(v)o(estigate)262 2064 y(h)o(uman)h(in)o(tellectual)j(skill)e
+(and)i(arti\014cial)e(in)o(telligence.)23 b(In)16 b(fact,)f(winning)g(the)h
+(h)o(uman)262 2114 y(w)o(orld)c(c)o(hess)k(c)o(hampionship)11
+b(w)o(as)j(de\014ned)g(as)g(one)g(of)f(the)h(fundamen)o(tal)d(aims)h(of)h
+(arti\014-)262 2163 y(cial)g(in)o(telligence.)20 b(It)15 b(is)g(a)f(testimon)
+o(y)f(to)i(the)g(problem's)e(complexit)o(y)g(that)i(after)g(more)262
+2213 y(than)e(fort)o(y)h(y)o(ears)g(of)g(concerted)h(e\013ort)g(this)f(aim)e
+(is)h(still)g(far)h(from)e(b)q(eing)i(realised.)967 2574 y(7)p
+eop
+%%Page: 8 10
+8 9 bop 262 307 a Fr(1.1)69 b(A)23 b(Brief)f(History)262 434
+y Fp(On)12 b(Marc)o(h)h(9th)f(1949,)f(Claude)h(E)h(Shannon,)e(a)h(researc)o
+(her)j(at)d(Bell)h(T)m(elephone)f(Lab)q(ora-)262 483 y(tories,)i(presen)o
+(ted)j(a)d(pap)q(er)i(titled)e("Programming)d(a)j(Computer)g(for)g(Pla)o
+(ying)g(Chess")262 533 y([53)o(].)21 b(This)15 b(w)o(as)g(the)h(\014rst)g
+(pap)q(er)g(of)f(its)g(kind)f(and)h(ev)o(en)h(to)q(da)o(y)f(most)f(computer)h
+(c)o(hess)262 583 y(programs)e(o)o(w)o(e)i(m)o(uc)o(h)e(to)i(Shannon's)g
+(original)e(ideas.)21 b(Essen)o(tially)m(,)13 b(Shannon)i(put)g(for-)262
+633 y(w)o(ard)e(three)i(di\013eren)o(t)g(t)o(yp)q(es)g(of)e(program:)312
+709 y(1.)20 b(T)o(yp)q(e)d Fl(A)p Fp(:)f(A)h(program)d(that)j(do)q(es)g(a)f
+(full)f(width)i(searc)o(h)g(to)g(a)f(giv)o(en)g(depth)h(and)365
+759 y(uses)e(a)f(simple)e(terminal)h(ev)n(aluation)f(function.)312
+839 y(2.)20 b(T)o(yp)q(e)e Fl(B)p Fp(:)f(A)h(program)e(that)h(do)q(es)i(a)e
+(selectiv)o(e)i(searc)o(h)f(of)f(the)h(most)f(promising)365
+889 y(lines.)312 968 y(3.)j(T)o(yp)q(e)13 b Fl(C)p Fp(:)g(A)g(program)e(that)
+h(is)h(goal)e(orien)o(ted,)i(although)f(little)g(detail)g(ab)q(out)h(this)365
+1018 y(approac)o(h)h(w)o(as)g(giv)o(en.)262 1095 y(Alan)j(T)m(uring)g(built)h
+(further)h(on)f(some)f(of)h(these)h(ideas)g(and)f(in)f(1950)g(wrote)i(a)f
+(pap)q(er)262 1144 y(ab)q(out)h(his)g(w)o(ork)h(on)f(computer)g(c)o(hess)i
+(at)e(Manc)o(hester)j(Univ)o(ersit)o(y)d([60)o(].)35 b(Ho)o(w)o(ev)o(er,)262
+1194 y(Shannon's)17 b(ideas)g(w)o(ere)i(not)e(actually)g(incorp)q(orated)h
+(in)o(to)f(a)g(c)o(hess)i(pla)o(ying)d(program)262 1244 y(un)o(til)d(1956)h
+(when)i(a)e(Shannon)h(t)o(yp)q(e)g(A)g(program)e(w)o(as)i(dev)o(elop)q(ed)h
+(at)e(the)i(Los)f(Alamos)262 1294 y(Scien)o(ti\014c)d(Lab)q(oratory)640
+1279 y Fk(1)658 1294 y Fp(.)18 b(In)12 b(1957,)e(Bernstein)k(and)e(Rob)q
+(erts)g(wrote)h(a)e(t)o(yp)q(e)i(B)f(program)262 1344 y(for)j(the)h(IBM)g
+(704)f([9)o(].)22 b(Most)16 b(notably)f(New)o(ell,)g(Simon)f(and)h(Sha)o(w)g
+(wrote)i(a)e(Shannon)262 1393 y(t)o(yp)q(e)d(C)h(program)d(in)i(1958)f([42].)
+17 b(This)12 b(w)o(as)g(the)h(\014rst)g(ev)o(er)g(practical)f(application)f
+(of)h(the)262 1443 y(alpha-b)q(eta)f(algorithm.)k(A)e(n)o(um)o(b)q(er)e(of)h
+(programs)f(follo)o(w)o(ed,)g(but)h(all)f(pla)o(y)o(ed)h(v)o(ery)h(p)q(o)q
+(or)262 1493 y(c)o(hess.)25 b(Despite)16 b(this,)g(man)o(y)e(researc)o(hers)
+19 b(in)c(the)h(\014eld)g(of)f(arti\014cial)g(in)o(telligence)h(w)o(ere)262
+1543 y(v)o(ery)e(con\014den)o(t)g(ab)q(out)g(the)h(p)q(oten)o(tial)e(of)g
+(their)i(mac)o(hines.)365 1619 y("Within)d(10)g(y)o(ears)h(a)g(digital)e
+(computer)i(will)e(b)q(e)i(the)h(w)o(orld's)e(c)o(hess)i(c)o(ham-)365
+1669 y(pion,)f(unless)i(rules)f(bar)g(it)g(from)e(comp)q(etition")1088
+1734 y Fm(Herb)n(ert)h(Simon,)j(1957.)324 1846 y Fp(It)h(w)o(as)h(not)f(un)o
+(til)g(1966)f(that)i(real)g(progress)g(w)o(as)g(made)e(b)o(y)h(Ric)o(hard)g
+(Green)o(blatt)262 1895 y(at)g(MIT)g([23)o(].)27 b(His)17 b(program)f(MacHac)
+o(k-6,)h(w)o(as)h(the)f(\014rst)h(program)e(whic)o(h)h(could)g(b)q(e)262
+1945 y(considered)g(to)g(pla)o(y)e("real)h(c)o(hess".)27 b(It)17
+b(pla)o(y)o(ed)e(in)h(v)n(arious)g(h)o(uman)f(tournamen)o(ts)h(and)262
+1995 y(established)e(p)q(erformance)f(ratings)h(in)f(the)h(1250)f(to)g(1640)g
+(USCF)g(range.)19 b(This)13 b(is)h(quite)262 2045 y(an)f(ac)o(hiev)o(emen)o
+(t,)g(particularly)g(when)h(one)h(considers)g(it)e(w)o(as)h(in)f(1966.)324
+2130 y(In)i(1968,)f(v)n(arious)h(AI)g(researc)o(hers,)j(encouraged)f(b)o(y)e
+(Green)o(blatt's)g(progress)i(made)262 2180 y(a)f(2500)f(dollar)g(b)q(et)i
+(with)f(Da)o(vid)f(Levy)m(,)h(an)g(In)o(ternational)g(Master,)h(that)g(a)f
+(computer)262 2230 y(w)o(ould)g(b)q(e)j(able)e(to)g(b)q(eat)i(him)c(in)i(a)h
+(matc)o(h)e(within)h(10)g(y)o(ears.)30 b(Encouraged)18 b(b)o(y)g(suc)o(h)262
+2280 y(activities)13 b(v)n(arious)g(scien)o(tists)h(from)e(the)i
+(arti\014cial)f(in)o(telligence)g(\014eld)g(got)h(in)o(v)o(olv)o(ed)e(and)262
+2329 y(in)i(1970)g(the)h(\014rst)h(United)f(States)g(Computer)g(Chess)h
+(Championship)c(w)o(as)j(held.)21 b(This)262 2379 y(ev)o(en)o(t)14
+b(has)g(con)o(tin)o(ued)g(to)g(b)q(e)g(held)g(ann)o(ually)f(to)g(the)i
+(presen)o(t)g(da)o(y)m(.)p 262 2411 573 2 v 308 2437 a Fj(1)325
+2449 y Fi(only)10 b(dev)o(elop)q(ed)f(for)i(a)g(6x6)g(b)q(oard)f(with)i(no)f
+(bishops.)967 2574 y Fp(8)p eop
+%%Page: 9 11
+9 10 bop 324 307 a Fp(In)14 b(1974,)f(the)i(\014rst)h(W)m(orld)d(Computer)h
+(Chess)h(Championship)e(w)o(as)h(held)g(in)g(Sto)q(c)o(k-)262
+357 y(holm.)25 b(This)17 b(ev)o(en)o(t)h(w)o(as)f(w)o(on)g(b)o(y)g(a)g
+(Russian)g(program)e(called)i(Kaissa,)h(essen)o(tially)f(a)262
+407 y(Shannon)g(t)o(yp)q(e)h(A)g(program)e(with)i(n)o(umerous)f(enhancemen)o
+(ts.)31 b(Kaissa's)17 b(rating)h(w)o(as)262 457 y(somewhere)c(in)f(the)i
+(1500)e(to)h(1700)f(ELO)h(range;)g(impressiv)o(e)g(for)f(a)h(program,)e(but)i
+(v)o(ery)262 506 y(lo)o(w)d(in)g(w)o(orld)h(c)o(hess)h(terms.)k(This)12
+b(compares)g(with)g(a)g(t)o(ypical)f(2500)g(ELO)h(Grandmaster)262
+556 y(rating,)g(ev)o(en)j(Da)o(vid)e(Levy)h(w)o(as)f(rated)i(at)f(ab)q(out)f
+(2350)g(ELO.)324 641 y(In)i(1977,)f(real)h(progress)h(w)o(as)f(made)f(when)i
+(Chess)g(4)p Fh(:)p Fp(5)e([4],)g(an)h(American)f(program)262
+691 y(written)d(at)g(the)h(North)o(w)o(estern)h(Univ)o(ersit)o(y)m(,)d(comp)q
+(eted)i(in)e(the)i(Minnesota)f(Op)q(en)h(Chess)262 741 y(Championship)h(and)i
+(w)o(on)g(the)g(ev)o(en)o(t)h(with)f(a)g(5-1)g(score.)23 b(This)16
+b(success)h(w)o(as)f(v)o(ery)f(sig-)262 791 y(ni\014can)o(t)h(b)q(ecause)i
+(sev)o(eral)f(Exp)q(erts)h(and)e(Class)h("A")f(pla)o(y)o(ers)g(comp)q(eted.)
+26 b(It)16 b(w)o(as)h(not)262 841 y(ac)o(hiev)o(ed)12 b(as)g(one)h(migh)o(t)d
+(exp)q(ect)k(b)o(y)e(a)f(breakthrough)i(in)f(c)o(hess)i(algorithms,)9
+b(but)k(rather)262 891 y(through)h(the)i(use)g(of)e(one)h(of)f(the)i(latest)f
+("sup)q(er-computers")g(-)g(a)g(CD)f(Cyb)q(er)i(170.)k(In-)262
+940 y(evitably)m(,)8 b(Chess)j(4)p Fh(:)p Fp(6)e(later)h(w)o(on)f(the)h
+(triennial)f(W)m(orld)g(Computer)g(Chess)i(Championship)262
+990 y(with)i(a)h(p)q(erfect)h(4-0)e(score.)324 1075 y(In)j(Septem)o(b)q(er)i
+(1978,)d(Chess)j(4)p Fh(:)p Fp(7)e(c)o(hallenged)g(Da)o(vid)g(Levy)h(for)f
+(the)h(b)q(et)h(made)d(10)262 1125 y(y)o(ears)f(earlier,)g(the)g(program)e
+(did)i(w)o(ell,)f(but)h(lost)f(b)o(y)h(a)g(score)h(of)e(3)1336
+1109 y Fk(1)p 1336 1116 17 2 v 1336 1140 a(2)1357 1125 y Fp(-1)1397
+1109 y Fk(1)p 1397 1116 V 1397 1140 a(2)1418 1125 y Fp(.)324
+1210 y(Programs)h(based)i(on)g(a)f(Shannon)g(t)o(yp)q(e)h(A)g(approac)o(h)f
+(with)g(little)g(kno)o(wledge,)g(but)262 1260 y(v)o(ery)20
+b(fast)g(searc)o(hing)h(had)e(b)q(een)j(dominating)17 b("in)o(telligen)o(t")h
+(selectiv)o(e)k(searc)o(hers)g(for)262 1310 y(some)14 b(5)g(y)o(ears.)22
+b(In)15 b(1978,)f(using)h(this)g(principle)g(of)f(fast)h(sp)q(eed)h(with)f
+(little)f(kno)o(wledge,)262 1360 y(sp)q(ecial)f(c)o(hess)h(hardw)o(are)f(w)o
+(as)g(designed)g(and)g(built)f(b)o(y)h(Ken)g(Thompson)f(and)h(Jo)q(e)g(Con-)
+262 1410 y(don)i([14)o(].)24 b(The)16 b(program,)f(Belle,)h(from)e(Bell)i
+(Lab)q(oratories,)g(running)g(on)f(this)h(sp)q(ecial)262 1460
+y(hardw)o(are)e(ended)h(up)f(winning)e(the)j(1980)e(W)m(orld)f(Computer)i
+(Chess)h(Championship.)324 1545 y(By)f(1983,)f(the)i(strength)g(of)f(deep)h
+(brute)g(force)f(searc)o(hers)j(w)o(as)d(further)h(emphasised)262
+1595 y(when)20 b(the)g(program)e(Cra)o(y)h(Blitz)g([31)o(],)h(running)g(on)f
+(a)g(2)g(pro)q(cessor)j(Cra)o(y)d(XMP/48)262 1644 y(computer,)d(w)o(on)g(the)
+h(4th)f(W)m(orld)f(Computer)h(Chess)h(Championship.)23 b(The)17
+b(follo)o(wing)262 1694 y(y)o(ear)h(an)g(exhibition)g(matc)o(h)f(w)o(as)h
+(arranged)h(b)q(et)o(w)o(een)h(Cra)o(y)e(Blitz)g(and)g(Da)o(vid)f(Levy)m(.)
+262 1744 y(In)j(the)g(matc)o(h,)g(Da)o(vid)f(Levy)h(crushed)i(the)f(mac)o
+(hine)e(4-0.)36 b(This)20 b(clearly)g(indicated)262 1794 y(that)15
+b(although)g(the)h(mac)o(hine)e(w)o(as)h(of)g(master)g(strength)i(in)e(the)h
+(realms)e(of)h(tactics,)i(its)262 1844 y(p)q(ositional)e(and)i(strategic)h
+(pla)o(y)e(w)o(as)h(w)o(eak.)27 b(Cra)o(y)17 b(Blitz)g(retained)h(its)f(w)o
+(orld)f(title)h(in)262 1893 y(1986.)324 1979 y(Curren)o(tly)11
+b(there)g(are)g(2)f(programs)f(of)h(in)o(ternational)f(master)h(strength)1456
+1964 y Fk(1)1476 1979 y Fp(,)h(Hitec)o(h)g(and)262 2029 y(Deep)16
+b(Though)o(t.)24 b(Both)17 b(Hitec)o(h)g(and)e(Deep)i(Though)o(t)f(run)g(on)g
+(sp)q(ecial)g(purp)q(ose)i(hard-)262 2078 y(w)o(are)13 b(and)h(essen)o
+(tially)g(p)q(erform)e(sophisticated)j(brute)f(force)h(searc)o(hes.)20
+b(Deep)14 b(Though)o(t)262 2128 y(is)g(clearly)h(the)g(strongest)h(of)e
+(these)i(programs)d(with)i(an)f(o\016cial)g(rating)g(of)g(2551)f(USCF)262
+2178 y(whic)o(h)j(equates)i(to)e(appro)o(ximately)e(2450)i(ELO.)h(During)f
+(Ma)o(y)g(1989,)g(Deep)h(Though)o(t)262 2228 y(demonstrated)d(this)g
+(strength)i(b)o(y)e(winning)g(the)h(6th)f(W)m(orld)f(Computer)h(Chess)h
+(Cham-)262 2278 y(pionship.)p 262 2312 573 2 v 308 2339 a Fj(1)325
+2351 y Fi(around)10 b(2400)g(ELO,)i(not)f(to)g(b)q(e)g(confused)e(with)j(a)f
+(US)h(master)e(rating)g(of)h(2200)f(USCF)967 2574 y Fp(9)p
+eop
+%%Page: 10 12
+10 11 bop 324 307 a Fp(In)13 b(Octob)q(er)i(1989,)d(Deep)h(Though)o(t)g(c)o
+(hallenged)g(Gary)g(Kasparo)o(v,)g(the)h(w)o(orld)e(c)o(hess)262
+357 y(c)o(hampion,)7 b(to)j(a)f(t)o(w)o(o)g(game)f(exhibition)g(matc)o(h.)15
+b(Kasparo)o(v)10 b(outpla)o(y)o(ed)f(the)h(mac)o(hine)e(not)262
+407 y(only)i(p)q(ositionally)m(,)f(but)j(more)f(surprisingly)g(tactically)m
+(,)f(to)h(win)g(the)h(matc)o(h)f(2-0.)16 b(During)262 457 y(Decem)o(b)q(er)d
+(1989,)f(Deep)h(Though)o(t)g(pla)o(y)o(ed)f(Da)o(vid)g(Levy)h(in)g(a)f(four)h
+(game)e(matc)o(h.)17 b(Deep)262 506 y(Though)o(t)c(illustrated)h(its)g
+(impressiv)o(e)f(abilit)o(y)f(b)o(y)i(winning)e(the)j(matc)o(h)e(4-0.)262
+679 y Fr(1.2)69 b(My)24 b(Bac)n(kground)262 805 y Fp(I)13 b(ha)o(v)o(e)g(b)q
+(een)h(v)o(ery)f(in)o(terested)i(in)e(computer)g(c)o(hess)i(for)e(some)f
+(considerable)i(time.)i(I)d(am)262 855 y(a)f(mem)o(b)q(er)g(of)g(the)i(In)o
+(ternational)f(Computer)f(Chess)i(Asso)q(ciation)f(and)g(ha)o(v)o(e)g
+(written)h(a)262 905 y(n)o(um)o(b)q(er)f(of)g(programs)g(using)g(b)q(oth)h
+(selectiv)o(e)h(and)f(brute)h(force)f(searc)o(hing.)324 990
+y(In)f(August)g(1989,)e(I)i(en)o(tered)h(m)o(y)d(latest)i(program)f(HIAR)o
+(CS)g(4.1)g(in)g(the)h(c)o(hess)i(tour-)262 1040 y(namen)o(t)f(of)h(the)i
+(\014rst)f(ev)o(er)h Fm(Computer)f(Olympiad)p Fp(.)24 b(HIAR)o(CS)16
+b(came)f(a)g(clear)h(6th)g(with)262 1090 y(3)e(out)g(of)g(8)h(p)q(oin)o(ts.)
+20 b(It)15 b(w)o(as)f(running)g(on)h(a)f(7Mhz)h(68000)e(pro)q(cessor,)k(slo)o
+(w)o(er)d(hardw)o(are)262 1140 y(than)f(all)g(of)g(the)h(opp)q(osition,)f
+(for)g(example)f(a)i Fm(Fidelity)g(Ele)n(ctr)n(onics)f Fp(en)o(try)h(from)e
+(Miami)262 1190 y(ran)h(on)h(a)g(68030)e(at)i(44Mhz)g(with)f(25ns)h(1)g(Mb)g
+(DRAM.)262 1362 y Fr(1.3)69 b(Aims)21 b(of)j(the)e(Pro)t(ject)262
+1489 y Fp(It)c(is)g(clear)h(to)f(me)f(that)h(curren)o(t)i(programs)d
+(su\013er)j(from)c(a)i(ma)r(jor)f(w)o(eakness)i(in)f(the)262
+1538 y(p)q(ositional)d(and)h(strategic)i(area)e(of)g(c)o(hess.)28
+b(Belo)o(w)17 b(2000)e(ELO,)i(tactics)g(pla)o(y)f(a)g(ma)r(jor)262
+1588 y(role,)10 b(ho)o(w)o(ev)o(er,)h(ab)q(o)o(v)o(e)e(2000)g(ELO,)i
+(tactical)e(abilit)o(y)g(b)q(ecomes)h(less)h(imp)q(ortan)o(t)d(and)i(go)q(o)q
+(d)262 1638 y(p)q(ositional)h(sense)k(is)f(vital.)i(Curren)o(tly)m(,)d(the)h
+(b)q(est)h(programs)d(are)i(m)o(uc)o(h)e(closer)i(to)f(w)o(orld)262
+1688 y(c)o(hampionship)f(strength)j(tactically)e(than)g(they)i(are)f(p)q
+(ositionally)e(sp)q(eaking.)324 1773 y(In)18 b(m)o(y)f(pro)r(ject,)j(I)e
+(will)f(giv)o(e)g(an)h(o)o(v)o(erview)g(of)g(the)h(sub)r(ject)h(and)e
+(explain)f(v)n(arious)262 1823 y(tec)o(hniques)i(used)h(in)e(curren)o(t)i
+(programs.)30 b(I)19 b(will)e(lo)q(ok)g(in)o(to)h(w)o(a)o(ys)g(of)g(dev)o
+(eloping)g(an)262 1873 y(ev)n(aluation)13 b(function)i(that)g(displa)o(ys)f
+(the)h(p)q(ositional)f(abilit)o(y)f(of)i(an)f(exp)q(ert)j(lev)o(el)d(c)o
+(hess)262 1923 y(pla)o(y)o(er)f(\(appro)o(ximately)e(ELO)i(2000\).)k(I)d
+(will)e(also)g(lo)q(ok)h(in)o(to)f(fresh)j(w)o(a)o(ys)e(of)f(impro)o(ving)262
+1972 y(the)20 b(tactical)f(strength)h(of)f(a)g(c)o(hess)i(program.)33
+b(This)19 b(is)h(particularly)e(imp)q(ortan)o(t)g(for)262 2022
+y(programs)9 b(running)h(on)h(standard)g(micropro)q(cessors)h(whic)o(h)e(ob)o
+(viously)g(cannot)h(comp)q(ete)262 2072 y(with)16 b(the)i(ra)o(w)f(sp)q(eed)h
+(of)f(sp)q(ecial)g(purp)q(ose)h(hardw)o(are.)28 b(I)17 b(then)g(in)o(tend)h
+(to)e(implemen)o(t)262 2122 y(certain)i(asp)q(ects)h(of)e(m)o(y)f(\014ndings)
+h(in)g(a)h(c)o(hess)h(program)d(and)h(ev)n(aluate)g(them)g(against)262
+2172 y(b)q(oth)f(h)o(uman)e(and)i(computer)f(opp)q(osition.)24
+b(I)16 b(also)f(in)o(tend)h(to)g(use)h(the)g(Bratk)o(o-Kop)q(ec)262
+2221 y(exp)q(erimen)o(t)10 b([12)o(])f(to)i(test)g(the)g(relativ)o(e)f
+(tactical)g(and)g(p)q(ositional)f(abilit)o(y)f(of)i(the)h(program.)324
+2307 y(The)h(reader)g(is)f(assumed)g(to)g(ha)o(v)o(e)h(a)f(reasonable)g(kno)o
+(wledge)g(of)g(c)o(hess)i(and)e(algebraic)262 2357 y(c)o(hess)16
+b(notation)e(in)h(order)h(that)f(c)o(hess)h(concepts)h(can)e(b)q(e)h
+(explained)f(to)f(a)h(high)g(enough)262 2406 y(lev)o(el.)957
+2574 y(10)p eop
+%%Page: 11 13
+11 12 bop 262 619 a Fn(Chapter)34 b(2)262 826 y Fo(Basic)40
+b(Ov)m(erview)262 1042 y Fp(In)11 b(later)g(c)o(hapters)h(of)f(this)g(rep)q
+(ort)h(I)f(will)e(explain)i(and)g(put)g(forw)o(ard)g(complex)e(ideas)j(con-)
+262 1092 y(cerning)g(v)n(arious)e(asp)q(ects)j(of)e(computer)h(c)o(hess.)18
+b(In)12 b(order)g(to)f(help)h(the)g(reader)h(cop)q(e)f(with)262
+1142 y(these)i(ideas,)e(this)h(c)o(hapter)h(will)d(giv)o(e)h(a)h(basic)g(o)o
+(v)o(erview)f(of)g(v)n(arious)g(tec)o(hniques)i(used)g(in)262
+1191 y(a)h(con)o(v)o(en)o(tional)f(c)o(hess)j(program.)k(I)16
+b(w)o(ould)e(also)h(advise)h(the)g(reader)h(to)e(follo)o(w)e(up)j(the)262
+1241 y(references)h(giv)o(en)e(for)f(a)h(more)e(complete)i(explanation)e(of)i
+(the)g(tec)o(hniques)h(men)o(tioned,)262 1291 y(as)d(this)h(c)o(hapter)h(is)f
+(b)o(y)g(no)f(means)g(in)o(tended)i(to)f(co)o(v)o(er)g(all)f(areas)h(in)g
+(detail.)262 1427 y Fr(2.1)69 b(Mac)n(hine)22 b(Represen)n(tation)262
+1554 y Fp(A)c(vital)f(elemen)o(t)g(of)h(an)o(y)g(c)o(hess)i(program)c(is)i
+(ho)o(w)g(the)h(c)o(hess)g(b)q(oard)g(and)f(pieces)h(are)262
+1603 y(represen)o(ted)d(in)e(the)g(mac)o(hine.)p 641 1697 673
+5 v 641 2361 5 665 v 646 1780 a Fg(0Z0Z0Z0Z)646 1863 y(Z0Z0Z0Z0)646
+1946 y(0Z0Z0Z0Z)646 2029 y(Z0Z0Z0Z0)646 2112 y(0Z0Z0Z0Z)646
+2195 y(Z0Z0Z0Z0)646 2278 y(0Z0Z0Z0Z)646 2361 y(Z0Z0Z0Z0)p 1310
+2361 V 641 2365 673 5 v 675 1749 a Fl(70)35 b(71)f(72)h(73)g(74)f(75)h(76)g
+(77)675 1832 y(60)g(61)f(62)h(63)g(64)f(65)h(66)g(67)675 1914
+y(50)g(51)f(52)h(53)g(54)f(55)h(56)g(57)675 1997 y(40)g(41)f(42)h(43)g(44)f
+(45)h(46)g(47)675 2080 y(30)g(31)f(32)h(33)g(34)f(35)h(36)g(37)675
+2163 y(20)g(21)f(22)h(23)g(24)f(25)h(26)g(27)675 2246 y(10)g(11)f(12)h(13)g
+(14)f(15)h(16)g(17)675 2329 y(00)g(01)f(02)h(03)g(04)f(05)h(06)g(07)500
+2449 y Fp(Figure)14 b(2.1:)j(A)d(Chess)h(Board)f(indexed)h(b)o(y)e
+(Co-ordinates.)957 2574 y(11)p eop
+%%Page: 12 14
+12 13 bop 262 307 a Fp(Claude)16 b(Shannon)h(suggested)i(in)e(his)g(famous)e
+(1949)h(pap)q(er)i([53)o(],)f(that)g(a)g(c)o(hess)i(b)q(oard)262
+357 y(could)f(b)q(e)i(represen)o(ted)h(in)e(64)f(b)o(ytes,)j(one)e(for)f(eac)
+o(h)i(square)f(on)g(the)h(b)q(oard.)33 b(It)19 b(w)o(as)262
+407 y(prop)q(osed)13 b(that)f(eac)o(h)h(square)h(could)e(b)q(e)h(addressed)h
+(b)o(y)e(the)h(co-ordinate)g(sc)o(heme)g(sho)o(wn)262 457 y(in)f(\014gure)i
+(2.1.)j(Eac)o(h)d(square)g(also)e(had)h(an)g(asso)q(ciated)h(co)q(de)g(whic)o
+(h)g(iden)o(ti\014es)f(the)h(t)o(yp)q(e)262 506 y(of)f(piece)i(\(if)e(an)o
+(y\))h(o)q(ccup)o(ying)g(that)g(square.)20 b(The)14 b(suggested)i(piece)f(co)
+q(des)g(can)g(b)q(e)f(seen)262 556 y(in)f(\014gure)h(2.2.)p
+691 644 574 2 v 690 694 2 50 v 716 679 a Fm(Oc)n(cupie)n(d)h(by)p
+956 694 V 50 w(White)p 1114 694 V 50 w(Black)p 1263 694 V 691
+695 574 2 v 690 743 2 50 v 716 729 a Fp(Empt)o(y)d(Sq)p 956
+743 V 129 w(0)p 1114 743 V 132 w(0)p 1263 743 V 691 745 574
+2 v 690 793 2 50 v 716 778 a(P)o(a)o(wn)p 956 793 V 210 w(1)p
+1114 793 V 125 w(-1)p 1263 793 V 691 795 574 2 v 690 843 2
+50 v 716 828 a(Knigh)o(t)p 956 843 V 184 w(2)p 1114 843 V 125
+w(-2)p 1263 843 V 691 845 574 2 v 690 893 2 50 v 716 878 a(Bishop)p
+956 893 V 186 w(3)p 1114 893 V 125 w(-3)p 1263 893 V 691 895
+574 2 v 690 943 2 50 v 716 928 a(Ro)q(ok)p 956 943 V 214 w(4)p
+1114 943 V 125 w(-4)p 1263 943 V 691 944 574 2 v 690 993 2
+50 v 716 978 a(Queen)p 956 993 V 196 w(5)p 1114 993 V 125 w(-5)p
+1263 993 V 691 994 574 2 v 690 1042 2 50 v 716 1027 a(King)p
+956 1042 V 222 w(6)p 1114 1042 V 125 w(-6)p 1263 1042 V 691
+1044 574 2 v 616 1149 a(Figure)i(2.2:)j(A)d(table)g(sho)o(wing)f(piece)i(co)q
+(des)262 1273 y(This)20 b(metho)q(d)g(is)h(kno)o(wn)f(as)h(the)h("mailb)q(o)o
+(x")17 b(represen)o(tation.)40 b(By)22 b(storing)e(one)h(of)262
+1322 y(these)g(co)q(des)h(in)e(eac)o(h)g(square's)h(address,)i(an)o(y)d(c)o
+(hess)i(p)q(osition)d(can)i(b)q(e)g(represen)o(ted)262 1372
+y(successfully)m(.)d(The)13 b(op)q(ening)f(c)o(hess)j(p)q(osition,)c(enco)q
+(ded)j(using)f(this)f(format)f(can)i(b)q(e)g(seen)262 1422
+y(in)g(\014gure)h(2.3.)p 641 1516 673 5 v 641 2180 5 665 v
+646 1599 a Fg(0Z0Z0Z0Z)646 1682 y(Z0Z0Z0Z0)646 1765 y(0Z0Z0Z0Z)646
+1848 y(Z0Z0Z0Z0)646 1931 y(0Z0Z0Z0Z)646 2014 y(Z0Z0Z0Z0)646
+2097 y(0Z0Z0Z0Z)646 2180 y(Z0Z0Z0Z0)p 1310 2180 V 641 2184
+673 5 v 663 1572 a Ff(\000)p Fl(4)27 b Ff(\000)p Fl(2)f Ff(\000)p
+Fl(3)h Ff(\000)p Fl(5)g Ff(\000)p Fl(6)f Ff(\000)p Fl(3)h Ff(\000)p
+Fl(2)g Ff(\000)p Fl(4)663 1655 y Ff(\000)p Fl(1)g Ff(\000)p
+Fl(1)f Ff(\000)p Fl(1)h Ff(\000)p Fl(1)g Ff(\000)p Fl(1)f Ff(\000)p
+Fl(1)h Ff(\000)p Fl(1)g Ff(\000)p Fl(1)663 1738 y(0)59 b(0)f(0)h(0)g(0)f(0)h
+(0)g(0)663 1821 y(0)g(0)f(0)h(0)g(0)f(0)h(0)g(0)663 1904 y(0)g(0)f(0)h(0)g(0)
+f(0)h(0)g(0)663 1986 y(0)g(0)f(0)h(0)g(0)f(0)h(0)g(0)663 2069
+y(+1)22 b(+1)f(+1)h(+1)g(+1)f(+1)h(+1)g(+1)663 2152 y(+4)g(+2)f(+3)h(+5)g(+6)
+f(+3)h(+2)g(+4)425 2276 y Fp(Figure)14 b(2.3:)j(Mailb)q(o)o(x)12
+b(Represen)o(tation)j(of)e(the)i(Op)q(ening)f(P)o(osition.)324
+2399 y(Most)d(implemen)o(tati)o(ons)d(of)i(the)i(mailb)q(o)o(x)c(idea)i
+(actually)g(use)h(a)g(10)f(x)h(12)f(b)q(oard.)17 b(This)262
+2449 y(10)12 b(x)i(12)f(sc)o(heme)g(giv)o(es)h(a)f(2)g(square)h(edge)g
+(around)g(the)g(b)q(oard,)f(eac)o(h)h('o\013)f(b)q(oard')g(square)957
+2574 y(12)p eop
+%%Page: 13 15
+13 14 bop 262 307 a Fp(con)o(taining)16 b(a)h(co)q(de)h(whic)o(h)g(iden)o
+(ti\014es)g(it)f(as)g(not)h(b)q(eing)f(on)h(the)g(con)o(v)o(en)o(tional)e(b)q
+(oard.)262 357 y(This)11 b(is)h(done)g(in)f(order)h(to)g(detect)h(mo)o(v)o
+(es)e(o\013)g(the)i(edge)f(of)f(the)h(b)q(oard)g(simply)e(b)o(y)h(testing)262
+407 y(the)i(co)q(de)i(of)d(the)i(square)g(b)q(eing)f(mo)o(v)o(ed)f(to.)18
+b(The)c(2)f(square)h(edge)g(is)f(necessary)i(to)e(allo)o(w)262
+457 y(for)g(knigh)o(t)g(mo)o(v)o(es.)324 542 y(A)18 b(generally)g(more)f
+(e\016cien)o(t)i(metho)q(d)e(of)h(represen)o(ting)i(a)e(c)o(hess)h(b)q(oard)g
+(w)o(as)f(\014rst)262 592 y(suggested)f(b)o(y)g(a)f(Russian)g(group)g(in)g
+(1970)g([2)o(].)25 b(It)17 b(in)o(v)o(olv)o(es)e(using)i(64)f(bits,)g(1)h
+(bit)f(p)q(er)262 641 y(square,)d(to)f(represen)o(t)j(a)e(single)f(piece)h
+(of)f(information)e(ab)q(out)j(all)e(squares.)19 b(Eac)o(h)13
+b(64)f(bit)262 691 y(represen)o(tation)g(is)g(kno)o(wn)e(as)i(a)f(bitmap.)k
+(A)d(bitmap)d(could,)i(for)g(example,)f(represen)o(t)k(all)262
+741 y(squares)f(o)q(ccupied)g(b)o(y)g(a)f(white)g(knigh)o(t.)17
+b(Bit\(s\))c(b)q(eing)g(set)g(corresp)q(onding)g(to)g(whatev)o(er)262
+791 y(squares)e(are)g(o)q(ccupied)g(b)o(y)f(white)h(knigh)o(ts.)16
+b(Using)11 b(12)e(suc)o(h)j(bitmaps,)d(6)h(for)g(white)g(pieces)262
+841 y(and)j(6)h(for)f(blac)o(k)h(pieces,)g(an)o(y)g(p)q(osition)f(can)h(b)q
+(e)h(represen)o(ted.)262 1013 y Fr(2.2)69 b(Mo)n(v)n(e)24 b(Generation)262
+1140 y Fp(Using)14 b(a)g(10)g(x)h(12)f(mailb)q(o)o(x)d(represen)o(tation,)16
+b(mo)o(v)o(es)d(are)i(generated)h(b)o(y)e(doing)g(a)g(series)262
+1190 y(of)d(adds)h(and)g(tests.)19 b(F)m(or)12 b(example,)f(to)h(generate)h
+(all)e(white)i(knigh)o(t)e(mo)o(v)o(es)g(from)f(a)i(giv)o(en)262
+1239 y(square)j(the)g(o\013sets:)20 b(+8,)15 b(+19,)f(+21,)g(+12,)g
+Ff(\000)p Fp(8,)g Ff(\000)p Fp(19,)g Ff(\000)p Fp(21)g(and)g
+Ff(\000)p Fp(12)h(m)o(ust)e(b)q(e)i(added)262 1289 y(to)e(the)i(knigh)o(t's)e
+(original)f(lo)q(cation,)g(see)j(\014gure)g(2.4.)p 641 1383
+673 5 v 641 2047 5 665 v 646 1466 a Fg(0Z0Z0Z0Z)646 1549 y(Z0Z0Z0Z0)646
+1632 y(0Z0Z0Z0Z)646 1715 y(Z0Z0Z0Z0)646 1798 y(0Z0Z0Z0Z)646
+1881 y(Z0Z0M0Z0)646 1964 y(0Z0Z0Z0Z)646 2047 y(Z0Z0Z0Z0)p 1310
+2047 V 641 2051 673 5 v 899 1692 a Fl(+19)81 b(+21)817 1775
+y(+8)269 b(+12)817 1941 y Ff(\000)p Fl(12)250 b Ff(\000)p Fl(8)899
+2024 y Ff(\000)p Fl(21)86 b Ff(\000)p Fl(19)447 2151 y Fp(Figure)14
+b(2.4:)j(Mo)o(v)o(e)d(generation)g(of)f(knigh)o(t)h(mo)o(v)o(es)e(using)i
+(o\013sets.)262 2277 y(Eac)o(h)g(of)f(these)i(p)q(oten)o(tial)f("to-squares")
+g(m)o(ust)f(b)q(e)h(tested)i(for)d(2)h(p)q(ossibilities:)324
+2360 y Ff(\017)20 b Fp(Is)14 b(the)h(to-square)f(on)g(the)h(b)q(oard)e(?)324
+2443 y Ff(\017)20 b Fp(Is)14 b(the)h(to-square)f(uno)q(ccupied)h(b)o(y)f(a)g
+(friendly)f(piece)i(?)957 2574 y(13)p eop
+%%Page: 14 16
+14 15 bop 262 307 a Fp(If)9 b(b)q(oth)h(these)h(tests)g(pro)o(v)o(e)f(to)g(b)
+q(e)g(true,)h(then)g(a)e(pseudo)i(legal)e(mo)o(v)o(e)f(has)i(b)q(een)h
+(generated.)262 357 y(Note)i(that)g(this)g(do)q(es)h(not)e(determine)h
+(whether)i(the)e(mo)o(v)o(e)e(actually)h(lea)o(v)o(es)h(the)h(king)e(in)262
+407 y(c)o(hec)o(k,)h(hence)h(it)e(is)h(called)g(pseudo)g(legal.)k(Nearly)12
+b(all)g(programs)f(lea)o(v)o(e)i(this)g(calculation)262 457
+y(un)o(til)h(a)h(more)f(con)o(v)o(enien)o(t)i(time.)21 b(As)15
+b(y)o(ou)g(can)h(see)g(this)g(metho)q(d)e(of)h(mo)o(v)o(e)e(generation)262
+506 y(is)g(quiet)h(simple.)324 592 y(Using)f(a)f(bitmap)g(represen)o(tation,)
+i(mo)o(v)o(e)d(generation)j(is)e(m)o(uc)o(h)g(more)g(e\016cien)o(t)i(with)262
+641 y(resp)q(ect)h(to)f(time,)e(than)h(with)g(the)h(previous)g(metho)q(d.)j
+(The)d(reason)h(for)e(this)g(adv)n(an)o(tage)262 691 y(lies)e(in)g(the)h
+(fact)g(that)f(mo)o(v)o(es)f(are)i(generated)h(b)o(y)f(using)f(bit)o(wise)g
+(logical)f(op)q(erations)i(suc)o(h)262 741 y(as)h("and",)g("or")h(and)f
+("not".)324 826 y(In)k(order)h(for)g(this)f(metho)q(d)g(to)g(generate)i(all)d
+(white)h(knigh)o(t)g(mo)o(v)o(es)f(from)g(a)h(giv)o(en)262
+876 y(square,)f(a)g(bitmap)e(needs)j(to)f(b)q(e)h(fetc)o(hed)g(whic)o(h)f
+(represen)o(ts)i(all)d(mo)o(v)o(es)g(a)g(knigh)o(t)g(can)262
+926 y(mak)o(e)10 b(from)g(the)i(giv)o(en)f(square,)i(call)e(this)h(bitmap)e
+(1.)17 b(Next,)12 b(a)f(bitmap)f(is)i(fetc)o(hed)h(whic)o(h)262
+976 y(represen)o(ts)19 b(the)e(lo)q(cation)f(of)h(all)e(friendly)h(pieces.)29
+b(This)16 b(bitmap)f(is)i(negated)g(and)g(the)262 1026 y(result)d(is)h
+(logically)c(and-ed)k(with)f(bitmap)e(1.)19 b(The)14 b(result)h(is)f(a)g
+(bit,)g(set)h(in)f(the)h(lo)q(cation)262 1075 y(of)g(ev)o(ery)i(pseudo-legal)
+f(mo)o(v)o(e)e(p)q(ossible)j(b)o(y)f(a)g(white)g(knigh)o(t)g(from)e(the)j
+(giv)o(en)e(original)262 1125 y(square.)324 1210 y(As)i(can)g(b)q(e)h(seen)g
+(this)f(metho)q(d)f(is)h(extremely)g(fast.)27 b(It)17 b(do)q(es)g(ho)o(w)o
+(ev)o(er,)h(use)g(m)o(uc)o(h)262 1260 y(more)11 b(memory)e(than)k(the)f
+(mailb)q(o)o(x)e(based)i(metho)q(d)g(b)q(ecause)i(the)e(mo)o(v)o(es)f(of)h
+(ev)o(ery)h(piece)262 1310 y(from)h(an)o(y)i(giv)o(en)g(square)h(m)o(ust)f(b)
+q(e)h(pre-stored.)27 b(The)17 b(metho)q(d)f(also)g(relies)h(on)f(a)g(large)
+262 1360 y(w)o(ord)d(size,)h(suc)o(h)g(as)f(64)g(bits.)18 b(Although)13
+b(it)g(is)g(still)g(feasible)g(with)g(a)g(16)g(or)g(32)g(bit)g(w)o(ord,)262
+1410 y(it)j(is)i(signi\014can)o(tly)e(less)i(e\016cien)o(t.)29
+b(Also)17 b(it)g(is)g(v)o(ery)g(imp)q(ortan)o(t)f(for)h(the)h(computer)f(to)
+262 1460 y(ha)o(v)o(e)11 b(a)h(mac)o(hine)f(instruction)h(whic)o(h)g(can)h
+(giv)o(e)e(the)i(lo)q(cation)e(of)g(the)i(\014rst)g(bit)f(set)g(in)g(an)o(y)
+262 1509 y(w)o(ord;)18 b(without)f(this,)h(the)g(metho)q(d)e(ma)o(y)f(b)q(e)j
+(to)q(o)g(ine\016cien)o(t.)28 b(F)m(or)17 b(a)g(more)f(complete)262
+1559 y(explanation)c(of)i(this)g(tec)o(hnique)g(see)i([15)o(].)324
+1644 y(In)10 b(b)q(oth)g(metho)q(ds)f(the)h(mo)o(v)o(es)f(of)g(v)o(ector)i
+(pieces)g(suc)o(h)f(as)g(bishops,)h(ro)q(oks)f(and)f(queens)262
+1694 y(are)14 b(more)f(complex)g(to)h(generate.)20 b(P)o(a)o(wn)14
+b(mo)o(v)o(es)f(and)h(sp)q(ecial)g(mo)o(v)o(es)f(suc)o(h)i(as)f(castling)262
+1744 y(and)c(en-passan)o(t)g(are)h(also)f(more)f(complicated,)g(but)i(can)f
+(still)f(b)q(e)i(generated)h(using)e(either)262 1794 y(represen)o(tation.)262
+1967 y Fr(2.3)69 b(Ev)l(aluation)23 b(F)-6 b(unctions)262 2093
+y Fp(Giv)o(en)11 b(that)h(mo)o(v)o(es)f(can)i(b)q(e)g(generated)g(ho)o(w)f
+(can)h(the)f(relativ)o(e)g(merits)g(of)g(eac)o(h)g(mo)o(v)o(e)f(b)q(e)262
+2143 y(determined)i(?)18 b(That)c(is)g(the)g(purp)q(ose)h(of)f(the)g
+Fm(Evaluation)i(F)m(unction)p Fp(.)324 2228 y(Shannon)f(prop)q(osed)g(that)g
+(an)g(ev)n(aluation)f(function)g(should)h(tak)o(e)g(accoun)o(t)h(of)e(suc)o
+(h)262 2278 y(features)j(as)f(material,)e(mobilit)o(y)m(,)f(p)q(osition)j(of)
+f(pieces)j(and)e(pa)o(wn)g(structure.)27 b(Eac)o(h)16 b(of)262
+2328 y(these)21 b(factors)f(required)i(an)d(imp)q(ortance)h(w)o(eigh)o(ting)f
+(to)h(b)q(e)g(asso)q(ciated)h(with)f(them.)262 2377 y(Eac)o(h)e(factor)g(w)o
+(ould)f(then)i(b)q(e)f(v)n(alued)g(dep)q(ending)g(on)g(its)g(presence)j(or)d
+(absence)h(in)f(a)262 2427 y(giv)o(en)11 b(p)q(osition,)h(and)g(the)h(asso)q
+(ciated)g(w)o(eigh)o(tings)f(applied.)17 b(All)12 b(the)h(v)n(alues)f(could)g
+(then)957 2574 y(14)p eop
+%%Page: 15 17
+15 16 bop 262 307 a Fp(b)q(e)14 b(added)h(together)g(to)f(giv)o(e)g(a)f
+(single)h(discrete)i(v)n(alue)e(for)g(the)g(p)q(osition.)k(The)d(mo)o(v)o(e)e
+(or)262 357 y(series)j(of)e(mo)o(v)o(es)g(whic)o(h)h(pro)q(duce)i(the)e(most)
+f(desirable)i(p)q(osition)e(from)f(the)j(ev)n(aluation)262
+407 y(function's)d(p)q(oin)o(t)g(of)h(view)f(can)h(then)h(b)q(e)g(c)o(hosen.)
+324 492 y(Almost)9 b(all)g(ev)n(aluation)g(functions)h(use)i(material)c(as)j
+(an)f(o)o(v)o(erriding)f(factor,)i(it)f(is)g(v)o(ery)262 542
+y(rare)k(for)f(ev)o(en)i(the)f(sum)f(of)g(all)f(other)j(factors)f(to)g
+(exceed)h(the)f(v)n(alue)f(of)h(one)g(pa)o(wn.)j(The)262 592
+y(reason)11 b(for)g(this)f(is)h(that)g(b)q(ecause)i(the)e(p)q(ositional)f(v)n
+(alues)g(are)i(so)f(crude,)h(if)e(material)f(w)o(ere)262 641
+y(to)15 b(b)q(e)h(giv)o(en)f(a)o(w)o(a)o(y)f(in)h(exc)o(hange)h(for)g(p)q
+(ositional)e(comp)q(ensation,)g(the)i(mac)o(hine)e(w)o(ould)262
+691 y(more)c(than)h(lik)o(ely)f(lose)h(b)q(ecause)i(its)e(ev)n(aluation)f(of)
+h(the)h(comp)q(ensation)e(w)o(as)h(inaccurate.)324 777 y(In)k(the)g(fort)o(y)
+g(y)o(ears)h(since)f(Shannon's)g(pap)q(er,)h(man)o(y)d(additional)g(ev)n
+(aluation)h(func-)262 826 y(tion)19 b(factors)h(ha)o(v)o(e)f(b)q(een)i
+(suggested)g(and)e(built)g(up)q(on.)36 b(They)20 b(include)g(king)e(safet)o
+(y)m(,)262 876 y(o)q(ccupation)e(of)g(w)o(eak)g(squares,)i(dev)o(elopmen)o
+(t,)e(piece)i(exc)o(hange)f(term)f(etc.)27 b(Ho)o(w)o(ev)o(er,)262
+926 y(ev)o(en)16 b(to)q(da)o(y)f(v)o(ery)g(few)h(ev)n(aluation)e(functions)h
+(w)o(ould)g(ev)o(en)h(consider)g(exc)o(hanging)f(ma-)262 976
+y(terial)e(for)h(other)g(factors)g(suc)o(h)h(as)f(activ)o(e)g(pla)o(y)m(.)324
+1061 y(In)c(programs)e(whic)o(h)i(searc)o(h)h(only)e(a)g(few)h(p)q(ositions,)
+g(the)g(ev)n(aluation)f(function)g(can)h(b)q(e)262 1111 y(quite)15
+b(complex)e(and)i(time)f(consuming.)19 b(Ho)o(w)o(ev)o(er,)d(all)d
+(successful)k(programs)d(searc)o(h)i(a)262 1161 y(large)d(n)o(um)o(b)q(er)f
+(of)h(p)q(ositions)g(and)h(therefore)g(can)g(only)f(sp)q(end)h(a)f(small)f
+(amoun)o(t)f(of)i(time)262 1210 y(ev)n(aluating)i(eac)o(h)j(p)q(osition.)28
+b(F)m(or)17 b(this)h(reason)f(man)o(y)f(of)h(the)h(originally)d(simple)g
+(ideas)262 1260 y(ha)o(v)o(e)d(remained)g(to)g(the)h(presen)o(t)i(da)o(y)d
+(in)g(most)f(programs.)17 b(Some)11 b(ev)n(aluation)h(functions)262
+1310 y(do)i(not)h(ev)o(en)h(ev)n(aluate)f(the)h(whole)f(p)q(osition,)f(but)h
+(rather)h(the)g(v)n(alue)f(of)f(a)h(mo)o(v)o(e)e(itself.)262
+1360 y(This)g(do)q(es)h(not,)f(ho)o(w)o(ev)o(er,)h(consider)g(other)h(in)o
+(teractions)f(that)f(a)h(mo)o(v)o(e)d(ma)o(y)h(ha)o(v)o(e)i(on)f(a)262
+1410 y(p)q(osition.)23 b(F)m(or)16 b(example,)e(a)i(knigh)o(t)f(that)h(mo)o
+(v)o(es)f(rev)o(ealing)h(a)f(bishop)h(pin)g(of)f(a)h(queen)262
+1460 y(to)i(a)g(king.)31 b(The)18 b(T)m(ec)o(hnology)g(program)f([22)o(],)h
+(is)g(an)g(extreme)h(example)e(whic)o(h)h(only)262 1509 y(ev)n(aluates)c
+(material)e(during)i(its)g(searc)o(h.)20 b(A)14 b(one)h(ply)e(p)q(ositional)g
+(v)n(alue)h(is)g(com)o(bined)f(at)262 1559 y(the)h(end)g(of)g(the)g(searc)o
+(h)h(to)f(distinguish)f(b)q(et)o(w)o(een)j(mo)o(v)o(es)c(of)h(equal)h
+(material)e(outcome.)324 1644 y(A)f(go)q(o)q(d)h(explanation)e(of)h(a)g(con)o
+(v)o(en)o(tional)g(c)o(hess)i(ev)n(aluation)d(function)h(can)h(b)q(e)g(found)
+262 1694 y(in)j([4)o(].)24 b(Ev)n(aluation)15 b(functions)h(will)e(b)q(e)j
+(lo)q(ok)o(ed)f(at)f(in)h(m)o(uc)o(h)f(greater)i(detail)e(in)h(future)262
+1744 y(c)o(hapters.)262 1917 y Fr(2.4)69 b(Lo)r(ok)24 b(Ahead)262
+2043 y Fp(In)16 b(order)h(to)f(lo)q(ok)g(ahead)g(in)o(to)g(p)q(ossibilities)g
+(whic)o(h)g(ma)o(y)e(dev)o(elop)j(in)f(the)h(game,)e(it)h(is)262
+2093 y(necessary)c(generate)g(what)f(is)g(called)f(a)h("Game)d(tree".)18
+b(A)11 b(game)e(tree)j(is)f(a)f(diagrammati)o(c)262 2143 y(represen)o(tation)
+i(of)e(p)q(ossible)h(mo)o(v)o(e)e(sequences.)20 b(This)11 b(is)f(ac)o(hiev)o
+(ed)h(b)o(y)g(generating)g(mo)o(v)o(es)262 2193 y(for)k(the)h(side)f(to)g
+(pla)o(y)m(,)f(then)i(replies)g(for)f(the)h(opp)q(onen)o(t,)g(then)g(coun)o
+(ter)g(replies)g(and)g(so)262 2242 y(on,)c(dep)q(ending)h(on)g(the)g(depth)h
+(of)e(lo)q(ok)g(ahead)g(required.)19 b(Figure)13 b(2.5)f(sho)o(ws)h(a)f(p)q
+(ossible)957 2574 y(15)p eop
+%%Page: 16 18
+16 17 bop 262 307 a Fp(lo)q(ok)12 b(ahead)i(game)f(tree)i(from)d(the)j(op)q
+(ening)e(c)o(hess)j(p)q(osition.)623 1489 y(Figure)e(2.5:)j(A)d(P)o(ossible)g
+(lo)q(ok)f(ahead)h(tree.)324 1607 y(Strictly)i(sp)q(eaking)g(the)h(game)e
+(tree)j(is)e(not)g(a)g(tree,)i(but)e(rather)i(a)e(directed)h(graph.)262
+1657 y(This)12 b(is)h(b)q(ecause)i(some)d(no)q(des)i(can)f(b)q(e)h(reac)o
+(hed)g(through)f(di\013eren)o(t)h(paths,)f(kno)o(wn)g(as)g(a)262
+1707 y(transp)q(osition)i(of)f(mo)o(v)o(es.)20 b(F)m(or)15
+b(the)h(purp)q(ose)g(of)f(consistency)h(with)f(other)h(material)d(on)262
+1757 y(the)h(sub)r(ject)h(I)f(will)f(also)g(use)i(the)f(term)f(searc)o(h)i
+(or)f(game)f(tree.)324 1842 y(There)i(are)f(a)g(n)o(um)o(b)q(er)f(of)g(w)o(a)
+o(ys)h(the)g(game)f(tree)i(can)f(b)q(e)g(expanded)h(and)f(searc)o(hed:)324
+1925 y Ff(\017)20 b Fl(Depth)c(\014rst)g(searc)o(h)p Fp(:)k(The)15
+b(\014rst)h(branc)o(h)g(is)f(explored)h(to)f(the)h(required)g(depth)365
+1975 y(b)q(efore)k(the)f(mac)o(hine)e(starts)j(on)e(the)h(next)h(unexplored)f
+(branc)o(h)g(one)g(lev)o(el)f(up.)365 2024 y(This)c(con)o(tin)o(ues)g(un)o
+(til)g(all)e(no)q(des)j(ha)o(v)o(e)f(b)q(een)h(explored)f(to)g(the)g
+(required)h(depth.)324 2107 y Ff(\017)20 b Fl(Breadth)d(\014rst)f(searc)o(h)p
+Fp(:)21 b(All)15 b(no)q(des)i(at)e(one)h(lev)o(el)g(are)g(examined)e(b)q
+(efore)j(pro-)365 2157 y(gressing)i(one)f(lev)o(el)g(do)o(wn)f(the)i(tree)g
+(and)f(examining)d(all)i(no)q(des)i(at)e(that)h(lev)o(el.)365
+2207 y(This)c(con)o(tin)o(ues)g(un)o(til)g(all)e(no)q(des)j(ha)o(v)o(e)f(b)q
+(een)h(explored)f(to)g(the)g(required)h(depth.)324 2290 y Ff(\017)20
+b Fl(Best)13 b(\014rst)f(searc)o(h)p Fp(:)j(A)o(t)d(eac)o(h)g(step)h(the)f
+(most)e(promising)g(no)q(de)i(is)f(selected)i(from)365 2340
+y(all)h(the)h(no)q(des)g(generated)h(so)f(far)f(in)g(the)h(tree.)22
+b(New)15 b(no)q(des)g(are)g(then)g(generated)365 2390 y(from)g(the)i
+(selected)h(no)q(de,)g(and)e(again,)f(the)i(most)f(promising)e(no)q(de)j(is)f
+(selected.)365 2440 y(A)f(no)q(de)g(can)f(b)q(e)h(selected)h(as)f(most)e
+(promising)f(no)i(matter)g(where)h(in)f(the)h(tree)h(it)957
+2574 y(16)p eop
+%%Page: 17 19
+17 18 bop 365 307 a Fp(o)q(ccurs.)19 b(Also)12 b(no)q(des)h(previously)f
+(searc)o(hed,)i(but)f(rejected)h(as)e(unpromising,)f(ma)o(y)365
+357 y(again)i(b)q(ecome)h(promising)d(and)j(b)q(e)h(re-searc)o(hed.)324
+440 y(Note)20 b(that)g(the)h(required)f(depth)h(will)d(b)q(e)j(the)f
+(limiting)d(factor)j(for)f(the)i(breadth)262 490 y(\014rst)e(and)g(depth)h
+(\014rst)g(searc)o(hes.)36 b(The)20 b(b)q(est)g(\014rst)g(searc)o(h)g(m)o
+(ust)e(ha)o(v)o(e)h(some)g(w)o(a)o(y)f(of)262 540 y(terminating,)11
+b(although)i(depth)i(ma)o(y)d(not)h(b)q(e)i(the)f(limiting)d(factor.)324
+625 y(I)g(kno)o(w)g(of)f(no)h(activ)o(e)h(programs)e(whic)o(h)h(uses)h(the)g
+(breadth)g(\014rst)g(searc)o(h.)19 b(Most)11 b(c)o(hess)262
+675 y(programs)i(use)i(a)f(mo)q(di\014ed)f(v)o(ersion)i(of)f(the)h(depth)g
+(\014rst)g(searc)o(h.)21 b(These)15 b(mo)q(di\014cations)262
+725 y(will)10 b(b)q(e)i(explained)g(in)f(c)o(hapter)i(3.)k(The)12
+b(b)q(est)h(\014rst)f(pro)q(cedure)i(is)e(used)g(in)g(some)f(selectiv)o(e)262
+774 y(searc)o(h)20 b(programs.)35 b(Of)20 b(particular)f(in)o(terest)i(is)f
+(the)g(B*)g(tree)h(searc)o(h)g(algorithm)c([6],)262 824 y(a)g(dev)o(elopmen)o
+(t)g(of)g(the)h(b)q(est)h(\014rst)g(searc)o(h.)30 b(This)18
+b(algorithm)d(attempts)i(to)h(allo)o(w)e(for)262 874 y(uncertain)o(t)o(y)e
+(to)g(b)q(e)g(expressed)i(in)e(the)g(searc)o(h)h(tree.)324
+959 y(The)20 b(searc)o(h)g(of)f(a)g(t)o(w)o(o-pla)o(y)o(er)g(game)f(tree)i
+(can)g(b)q(e)g(ac)o(hiev)o(ed)g(b)o(y)f(the)h(use)g(of)f(the)262
+1009 y(minim)o(ax)11 b(pro)q(cedure.)20 b(This)14 b(is)g(based)h(on)f(the)g
+(idea)g(that)g(t)o(w)o(o)g(pla)o(y)o(ers)g(exist,)g(Max)g(and)262
+1059 y(Min.)23 b(Max)16 b(c)o(ho)q(oses)h(mo)o(v)o(es)e(leading)g(to)h(high)f
+(scores,)j(where)f(as)f(Min)g(c)o(ho)q(oses)h(mo)o(v)o(es)262
+1109 y(leading)10 b(to)i(lo)o(w)f(scores.)19 b(Max)12 b(and)f(Min)h(c)o(ho)q
+(ose)g(mo)o(v)o(es)f(at)h(alternate)g(lev)o(els)g(of)f(the)i(tree,)262
+1158 y(o)q(dd)g(and)h(ev)o(en)h(resp)q(ectiv)o(ely)m(.)262
+1331 y Fr(2.5)69 b(Selectiv)n(e)20 b(Searc)n(hing)262 1458
+y Fp(It)13 b(has)g(b)q(een)i(sho)o(wn)e(b)o(y)g(de)h(Gro)q(ot)f([16)o(,)f
+(17])h(that)g(there)h(are)g(on)f(a)o(v)o(erage)g(38)g(mo)o(v)o(es)f(in)h(a)
+262 1507 y(giv)o(en)d(p)q(osition,)h(y)o(et)g(only)f(an)h(a)o(v)o(erage)g(of)
+g(1.76)e(go)q(o)q(d)i(mo)o(v)o(es)1229 1492 y Fk(1)1257 1507
+y Fp(exist)h(in)f(eac)o(h)g(p)q(osition.)17 b(A)262 1557 y(h)o(uman)11
+b(c)o(hess)k(master's)d(searc)o(h)j(tree)f(t)o(ypically)e(in)o(v)o(olv)o(es)g
+(a)h(total)g(of)g(around)g(35)f(mo)o(v)o(es;)262 1607 y(v)n(ariations)18
+b(are)i(explored)h(to)e(an)h(a)o(v)o(erage)g(depth)g(of)g(7)f(plies.)36
+b(It)20 b(is)g(clear)g(from)e(the)262 1657 y(researc)o(h)e(of)f(de)g(Gro)q
+(ot)g(that)g(the)h(h)o(uman)d(c)o(hess)k(master)d(is)h(v)o(ery)g(e\016cien)o
+(t)h(at)f(selecting)262 1707 y(mo)o(v)o(es)8 b(to)h(explore)h(further.)17
+b(It)10 b(therefore)h(seems)e(logical)f(to)h(program)f(a)i(computer)f(whic)o
+(h)262 1756 y(selects)18 b(the)g(most)e(plausible)g(mo)o(v)o(es)g(to)g(b)q(e)
+i(explored)f(next)h(from)d(those)j(a)o(v)n(ailable.)25 b(If)262
+1806 y(suc)o(h)18 b(a)g(program)e(had)i(a)g(selection)h(mec)o(hanism)c(as)j
+(sophisticated)h(as)f(a)g(master's,)g(it)262 1856 y(w)o(ould)c(almost)f
+(certainly)i(pla)o(y)f(at)g(master)h(lev)o(el)g(or)f(ab)q(o)o(v)o(e.)21
+b(This)15 b(metho)q(d)f(is)h(kno)o(w)g(as)262 1906 y Fm(Sele)n(ctive)f(Se)n
+(ar)n(ching)g Fp(or)g(a)g(Shannon)g(t)o(yp)q(e)g(B/C)g(strategy)m(.)324
+1991 y(The)j(Green)o(blatt)f(program)f(w)o(as)i(the)g(\014rst)g(successful)h
+('selectiv)o(e')f(searc)o(hing)g(c)o(hess)262 2041 y(program)12
+b(whic)o(h)j(could)f(pla)o(y)f(at)h(a)h(reasonable)f(lev)o(el.)20
+b(The)14 b(program)f(placed)i(limits)d(on)262 2091 y(the)i(n)o(um)o(b)q(er)f
+(of)g(mo)o(v)o(es)f(whic)o(h)i(could)f(b)q(e)i(searc)o(hed)g(at)e(di\013eren)
+o(t)i(depths.)k(The)14 b(n)o(um)o(b)q(er)262 2141 y(of)h(branc)o(hes)j
+(explored)f(in)f(the)i(\014rst)f(5)f(plies)h(w)o(ere)g(as)g(follo)o(ws:)22
+b(15,)16 b(15,)g(9,)g(9,)h(7.)26 b(This)262 2190 y(tap)q(ering)11
+b(of)h(the)g(searc)o(h)h(mean)o(t)e(that)h(deep)q(er)h(searc)o(hes)h(w)o(ere)
+f(p)q(ossible)f(when)g(compared)262 2240 y(with)k(the)i(full)e(width)h
+(approac)o(h)h(at)f(the)h(time.)26 b(In)18 b(the)g(early)f(1970's,)f(Hans)i
+(Berliner)262 2290 y(considered)c(v)o(ery)g(selectiv)o(e)h(searc)o(hing)f(as)
+f(the)i(w)o(a)o(y)d(forw)o(ard)h(and)h(exp)q(ected)h(the)f(searc)o(h)262
+2340 y(tree)j(w)o(ould)d(con)o(tain)i(less)g(than)g(500)f(no)q(des.)24
+b(It)16 b(is)g(ironic)f(that)h(Hans)g(is)f(no)o(w)h(a)f(ma)r(jor)p
+262 2374 573 2 v 308 2401 a Fj(1)325 2413 y Fi(Grandmaster)8
+b(standard)h(mo)o(v)o(es)957 2574 y Fp(17)p eop
+%%Page: 18 20
+18 19 bop 262 307 a Fp(force)11 b(b)q(ehind)g(Hitec)o(h,)h(a)f(v)o(ery)g
+(strong)g(brute)h(force)g(searc)o(hing)f(program)e(from)h(Carnegie-)262
+357 y(Mellon)j(Univ)o(ersit)o(y)m(.)324 442 y(The)21 b(b)q(est)h(attempt)e
+(at)g(selectiv)o(e)i(searc)o(hing)f(w)o(as)f(made)g(b)o(y)g(Wilkins)f([61],)i
+(who)262 492 y(pro)q(duced)14 b(a)f(kno)o(wledge)g(based)h(program,)d(P)m
+(ARADISE.)i(The)g(program)f(p)q(erformed)h(at)262 542 y(the)h(exp)q(ert)h
+(lev)o(el)f(in)f(the)i(relativ)o(ely)e(narro)o(w)h(domain)d(of)j(tactical)f
+(problems.)324 627 y(All)e(the)h(attempts)g(to)f(create)j(a)d(go)q(o)q(d)h
+(selectiv)o(e)h(searc)o(h)g(program)d(to)i(pla)o(y)e(the)j(whole)262
+677 y(game)j(ha)o(v)o(e)j(hit)f(problems.)30 b(This)18 b(is)g(b)q(ecause)i
+(it)e(is)g(vital)g(to)g(include)g(all)f(imp)q(ortan)o(t)262
+727 y(mo)o(v)o(es)f(in)g(the)i(selectiv)o(e)h(searc)o(h,)g(as)e(an)o(y)g(mo)o
+(v)o(es)f(not)h(selected)i(can)f(nev)o(er)g(b)q(e)g(pla)o(y)o(ed)262
+777 y(o)o(v)o(er)13 b(the)i(b)q(oard.)j(This)c(can)g(cause)h(serious)f
+(tactical)g(threats)h(to)f(b)q(e)g(o)o(v)o(erlo)q(ok)o(ed.)324
+862 y(Some)c(mo)o(v)o(es)h(ma)o(y)e(not)j(app)q(ear)g(immediately)c
+(plausible,)j(although)g(they)h(ma)o(y)e(turn)262 912 y(out)16
+b(to)h(b)q(e)g(v)o(ery)g(strong)g(some)e(mo)o(v)o(es)h(later.)26
+b(F)m(or)16 b(these)i(reasons)g(man)o(y)d(go)q(o)q(d)h(mo)o(v)o(es)262
+961 y(are)d(o)o(v)o(erlo)q(ok)o(ed)f(and)h(not)g(selected)i(b)o(y)e(a)f
+(plausible)g(mo)o(v)o(e)g(generator.)18 b(These)d(problems)262
+1011 y(are)f(b)q(est)h(illustrated)f(b)o(y)f(some)g(examples.)p
+641 1105 673 5 v 641 1769 5 665 v 646 1188 a Fg(rm0Z0skZ)646
+1271 y(o0l0mpop)646 1354 y(bo0ZpZ0Z)646 1437 y(Z0opO0Z0)646
+1520 y(PZ0O0Z0Z)646 1603 y(Z0OBZNZ0)646 1686 y(0ZPZ0OPO)646
+1769 y(S0AQJ0ZR)p 1310 1769 V 641 1773 673 5 v 659 1892 a Fp(Figure)h(2.6:)j
+(White)d(to)f(pla)o(y)g(and)h(win.)324 2010 y(In)g(\014gure)i(2.6,)d(white)i
+(can)f(pla)o(y)g(1.)20 b(Bxh7+)15 b(Kxh7)f(2.)20 b(Ng5+)15
+b(Kg8)f(3.)20 b(Qh5)15 b(leading)262 2060 y(to)j(mate.)31 b(The)20
+b(initial)c(mo)o(v)o(e)h(ma)o(y)g(ho)o(w)o(ev)o(er,)j(not)e(app)q(ear)i
+(plausible)e(to)g(a)h(selectiv)o(e)262 2110 y(searc)o(h)13
+b(program)e(b)q(ecause)k(it)d(app)q(ears)h(to)g(lose)f(the)i(bishop)e(for)g
+(a)h(pa)o(wn.)k(An)o(y)12 b(plausible)262 2159 y(mo)o(v)o(e)i(generator)i
+(whic)o(h)g(did)f(consider)h(Bxh7+)g(plausible)f(w)o(ould)g(need)i(to)f
+('recognise')262 2209 y(in)e(\014gure)i(2.7,)e(an)h(almost)f(iden)o(tical)g
+(p)q(osition,)h(that)g(1.)22 b(Bxh7+)16 b(Kxh7)f(2.)22 b(Ng5+)15
+b(Kg8)262 2259 y(3.)i(Qh5)d(fails)f(to)h(3.)j(...)g(Bd3.)957
+2574 y(18)p eop
+%%Page: 19 21
+19 20 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rm0Z0skZ)646
+482 y(o0l0mpop)646 565 y(bo0ZpZ0Z)646 648 y(Z0opO0Z0)646 731
+y(PZ0O0Z0Z)646 814 y(Z0OBZNZ0)646 897 y(0O0Z0OPO)646 980 y(S0AQJ0ZR)p
+1310 980 V 641 984 673 5 v 605 1101 a Fp(Figure)14 b(2.7:)j(White)c(to)h(pla)
+o(y)m(,)e(no)i(forced)g(win.)324 1218 y(These)f(di\016culties)g(illustrate)f
+(that)g(to)h(k)o(eep)g(the)g(branc)o(hing)f(factor)g(do)o(wn)g(the)h(plau-)
+262 1268 y(sible)g(mo)o(v)o(e)f(generator)i(needs)h(to)e(b)q(e)h(v)o(ery)f
+(selectiv)o(e,)i(while)d(not)i(excluding)f(k)o(ey)g(mo)o(v)o(es.)262
+1318 y(A)o(t)f(the)g(presen)o(t)i(time)c(w)o(e)i(do)g(not)g(ha)o(v)o(e)g(the)
+g(capabilit)o(y)e(to)i(instill)f(enough)h(h)o(uman)e(c)o(hess)262
+1368 y(kno)o(wledge)j(in)o(to)g(a)h(program)e(to)i(mak)o(e)e(this)i(metho)q
+(d)f(e\013ectiv)o(e)j(for)d(the)i(whole)e(game.)262 1540 y
+Fr(2.6)69 b(F)-6 b(ull)22 b(Width)g(Searc)n(hing)262 1667 y
+Fp(Instead)10 b(of)g(selecting)g(promising)e(lines)i(to)g(in)o(v)o(estigate)g
+(further,)h(it)e(is)h(p)q(ossible)g(to)g(explore)262 1716 y(all)15
+b(mo)o(v)o(es)g(to)h(a)g(giv)o(en)f(depth.)26 b(This)16 b(Shannon)g(t)o(yp)q
+(e)h(A)f(metho)q(d)g(is)g(kno)o(wn)g(as)g(a)g Fm(F)m(ul)r(l)262
+1766 y(Width)f(Se)n(ar)n(ch)f Fp(or)g(a)f Fm(Brute)i(F)m(or)n(c)n(e)f(Se)n
+(ar)n(ch)p Fp(.)324 1851 y(This)f(metho)q(d)g(is)h(m)o(uc)o(h)e(easier)j(to)f
+(implem)o(en)o(t)e(than)h(a)h(selectiv)o(e)h(searc)o(h.)k(Ho)o(w)o(ev)o(er,)
+262 1901 y(in)g(order)i(for)f(pla)o(y)g(to)g(b)q(e)h(of)e(a)h(reasonable)h
+(standard)g(a)f(relativ)o(ely)f(deep)i(searc)o(h)h(is)262 1951
+y(necessary)m(.)34 b(The)20 b(problem)d(here)j(is)f(that)g(the)h(n)o(um)o(b)q
+(er)e(of)g(no)q(des)i(in)o(v)o(olv)o(ed)e(in)g(a)h(full)262
+2001 y(width)11 b(searc)o(h)i(gro)o(ws)e(exp)q(onen)o(tially)g(with)g(depth.)
+18 b(In)12 b(a)f(tree)i(of)e(uniform)f(width)h(38,)g(the)262
+2051 y(searc)o(h)j(tree)h(will)d(con)o(tain)h(o)o(v)o(er)h(3)f(billion)f(no)q
+(des)i(after)g(just)g(6)f(plies.)18 b(T)m(o)13 b(cut)h(do)o(wn)g(this)262
+2100 y(exp)q(onen)o(tial)c(explosion,)g(v)n(arious,)g(often)h(complicated)e
+(tec)o(hniques)j(need)g(to)e(b)q(e)i(used.)18 b(In)262 2150
+y(fact,)c(a)g(go)q(o)q(d)g(full)f(width)h(searc)o(h)h(requires)h(man)o(y)c
+(supp)q(ort)k(routines)f(to)f(enable)h(a)f(deep)262 2200 y(searc)o(h)h(to)f
+(b)q(e)g(completed)g(in)g(a)g(reasonable)g(time)f(\(3)h(min)o(utes\).)k
+(Using)c(the)g(tec)o(hniques)262 2250 y(curren)o(tly)g(a)o(v)n(ailable)c(it)j
+(is)g(p)q(ossible)g(to)g(reduce)i(the)f(a)o(v)o(erage)f(branc)o(hing)g
+(factor)g(of)f(a)h(full)262 2300 y(width)h(searc)o(h)i(from)d(38)i(to)g
+(around)g(6)f(to)h(8)g(branc)o(hes.)22 b(This)15 b(is)g(ac)o(hiev)o(ed)g
+(through)g(the)262 2350 y(use)f(of)g(bac)o(kw)o(ard)f(pruning)h(tec)o
+(hniques)h(whic)o(h)f(will)e(b)q(e)j(explained)f(in)f(detail)g(in)h(a)g
+(later)262 2399 y(c)o(hapter.)j(Some)10 b(selectiv)o(e)i(searc)o(h)g
+(programs)d(actually)h(ha)o(v)o(e)h(a)f(branc)o(hing)h(factor)g(higher)262
+2449 y(than)j(8)g(e.g.)20 b(Green)o(blatt's)15 b(MacHac)o(k.)20
+b(In)15 b(suc)o(h)g(cases)h(a)f(full)e(width)h(searc)o(h)i(can)f(reac)o(h)957
+2574 y(19)p eop
+%%Page: 20 22
+20 21 bop 262 307 a Fp(at)14 b(least)i(as)f(deep)h(as)f(the)h(selectiv)o(e)g
+(searc)o(h,)g(without)f(an)o(y)g(of)f(the)i(p)q(ossible)f(dra)o(wbac)o(ks)262
+357 y(whic)o(h)e(w)o(ere)i(outlined)f(in)f(the)h(previous)h(section.)262
+530 y Fr(2.7)69 b(Quiescence)262 656 y Fp(A)19 b(p)q(osition)f(is)h
+(considered)h Fm(Quiesc)n(ent)f Fp(if)f(it)g(is)h(quiet)g(\(inactiv)o(e\).)33
+b(A)19 b(quiet)g(p)q(osition)262 706 y(could)10 b(b)q(e)i(one)f(where)h(no)f
+(imm)o(ediate)e(threats)j(exist.)17 b(It)11 b(is)g(v)o(ery)g(imp)q(ortan)o(t)
+e(in)i(an)o(y)f(c)o(hess)262 756 y(program)k(to)h(determine)h(whether)h(a)f
+(p)q(osition)f(is)g Fm(Quiesc)n(ent)h Fp(or)g(not,)f(b)q(efore)i(applying)262
+805 y(the)12 b(ev)n(aluation)f(function.)17 b(F)m(or)12 b(example,)f(it)h(w)o
+(ould)f(b)q(e)i(wrong)f(to)g(apply)g(an)g(ev)n(aluation)262
+855 y(function)k(to)g(a)g(p)q(osition)g(where)i(a)e(capture)i(had)e(just)h
+(tak)o(en)f(place)h(without)f(c)o(hec)o(king)262 905 y(if)f(a)h(piece)h(can)f
+(b)q(e)h(recaptured.)26 b(P)o(ositions)16 b(can)h(also)e(b)q(e)i(un-quiescen)
+o(t)g(on)f(p)q(ositional)262 955 y(grounds,)d(although)g(the)i(detection)g
+(of)e(suc)o(h)i(p)q(ositions)f(is)f(far)h(more)f(complicated)g(than)262
+1005 y(for)g(quiescence)j(in)o(v)o(olving)c(tactics.)324 1090
+y(An)i(ev)n(aluation)f(function)h(should)g(only)g(b)q(e)g(applied)g(in)g
+(quiescen)o(t)h(p)q(ositions.)k(Most)262 1140 y(curren)o(t)g(programs)d
+(resolv)o(e)j(this)f(problem)e(of)h(quiescence)j(b)o(y)e(doing)f(what)g(is)h
+(kno)o(wn)262 1190 y(as)c(a)g(quiescence)i(searc)o(h.)k(That)14
+b(is,)g(a)g(limited)e(searc)o(h)j(is)f(p)q(erformed)g(un)o(til)f(a)h
+(quiescen)o(t)262 1239 y(p)q(osition)j(is)i(reac)o(hed.)33
+b(Only)19 b(at)f(that)h(stage)g(are)g(factors)g(suc)o(h)g(as)g(material)e
+(balance)262 1289 y(ev)n(aluated.)h(In)c(principle)g(this)h(idea)f(is)g(an)g
+(excellen)o(t)h(one.)k(Ho)o(w)o(ev)o(er,)14 b(in)g(practice)h(most)262
+1339 y(programs)e(only)h(p)q(erform)h(what)f(is)h(kno)o(wn)g(as)g(a)g
+(capture)h(searc)o(h)g(at)f(horizon)f(no)q(des)i(of)262 1389
+y(their)d(main)e(searc)o(h)k(in)d(order)i(to)f(resolv)o(e)h(the)g(quiescence)
+h(problem.)h(In)e(suc)o(h)g(a)e(capture)262 1439 y(searc)o(h)g(the)g(side)g
+(to)f(mo)o(v)o(e)f(can)h(either)h(stop)g(the)g(searc)o(h)g(along)e(a)h(branc)
+o(h)h(and)f(accept)i(the)262 1488 y(curren)o(t)i(ev)n(aluation)e(score)i(or)f
+(mak)o(e)e(more)h(capture)j(mo)o(v)o(es.)h(When)d(no)g(captures)h(exist)262
+1538 y(for)j(the)i(side)g(to)f(mo)o(v)o(e,)f(the)i(p)q(osition)e(is)h
+(considered)i(quiescen)o(t.)35 b(This)19 b("quiescence)262
+1588 y(searc)o(h")i(signi\014can)o(tly)e(impro)o(v)o(es)g(the)i(abilit)o(y)e
+(of)h(the)h(c)o(hess)h(programs)d(that)h(use)h(it.)262 1638
+y(Ho)o(w)o(ev)o(er,)12 b(man)o(y)d(threats)k(can)f(b)q(e)g(o)o(v)o(erlo)q(ok)
+o(ed)f(b)o(y)h(suc)o(h)g(a)g(searc)o(h,)g(for)g(example,)e(a)h(mo)o(v)o(e)262
+1688 y(forking)h(a)i(king)f(and)h(queen.)262 1860 y Fr(2.8)69
+b(Horizon)23 b(E\013ect)262 1987 y Fp(Chess)13 b(programs)e(t)o(ypically)f
+(su\013er)j(from)e(what)h(is)g(kno)o(wn)f(as)h(the)h Fm(Horizon)g(E\013e)n
+(ct)p Fp(.)18 b(This)262 2037 y(e\013ect)13 b(is)e(b)q(est)i(describ)q(ed)h
+(using)d(an)g(example.)16 b(In)c(\014gure)g(2.8,)f(it)g(can)h(b)q(e)g(seen)h
+(that)f(blac)o(k)262 2086 y(is)j(faced)i(with)e(the)i(certain)g(loss)f(of)f
+(its)h(queen)h(for)f(at)g(most)f(a)g(white)h(ro)q(ok.)25 b(Ho)o(w)o(ev)o(er,)
+262 2136 y(if)15 b(a)h(program)f(searc)o(hing)h(2)g(plies)h(w)o(ere)g(pla)o
+(ying)d(blac)o(k)i(it)g(w)o(ould)g(think)f(it)h(could)g(sa)o(v)o(e)262
+2186 y(the)g(queen)h(b)o(y)e(pla)o(ying)f(Bxh2+.)24 b(This)16
+b(app)q(ears)h(to)e(the)i(program)d(to)h(sa)o(v)o(e)h(the)h(queen)262
+2236 y(b)q(ecause)e(its)f(loss)g(is)g(no)o(w)f(pushed)i(o)o(v)o(er)f(the)g
+(program's)f(searc)o(h)i(horizon.)957 2574 y(20)p eop
+%%Page: 21 23
+21 22 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rZ0Z0skZ)646
+482 y(opZ0Zpop)646 565 y(0Z0apm0Z)646 648 y(Z0o0Z0Z0)646 731
+y(0Z0ZPZ0Z)646 814 y(ZPAPZ0Z0)646 897 y(qZPZBOPO)646 980 y(S0ZQZRJ0)p
+1310 980 V 641 984 673 5 v 432 1102 a Fp(Figure)14 b(2.8:)j(Illustration)c
+(of)h(the)g(Horizon)g(E\013ect,)h(Blac)o(k)f(to)f(Pla)o(y)m(.)324
+1221 y(This)g(horizon)g(e\013ect)i(is)f(particularly)e(prev)n(alen)o(t)i(in)f
+(programs)f(whic)o(h)h(explore)h(v)n(ari-)262 1271 y(ations)k(to)g(a)g
+(\014xed)h(depth.)32 b(This)19 b(is)f(b)q(ecause)i(mo)o(v)o(es)e(whic)o(h)g
+(dela)o(y)g(the)h(loss)f(b)q(ey)o(ond)262 1320 y(the)f(depth)h(limit)c(are)j
+(considered)i(go)q(o)q(d.)26 b(A)17 b(program)f(whic)o(h)g(can)i(extend)g
+(its)e(searc)o(h)262 1370 y(depth)h(along)e(v)n(ariations)h(whic)o(h)g(lead)h
+(to)f(non-quiescen)o(t)i(p)q(ositions)e(is)h(b)q(etter)h(able)f(to)262
+1420 y(a)o(v)o(oid)d(problems)h(caused)i(b)o(y)f(the)h(horizon)e(e\013ect.)27
+b(A)16 b(program's)e(abilit)o(y)g(to)i(minim)o(ise)262 1470
+y(the)f(horizon)h(e\013ect)h(is)e(therefore)i(largely)d(dep)q(enden)o(t)j(on)
+e(its)h(de\014nition)f(of)f(quiescence)262 1520 y(and)f(ho)o(w)h
+(non-quiescen)o(t)h(p)q(ositions)e(are)h(resolv)o(ed.)957 2574
+y(21)p eop
+%%Page: 22 24
+22 23 bop 262 654 a Fn(Chapter)34 b(3)262 897 y Fo(Adv)-7 b(anced)39
+b(T)-10 b(opics)262 1148 y Fp(This)11 b(c)o(hapter)i(con)o(tains)f(b)q(oth)g
+(an)f(explanation)g(and)g(review)i(of)e(some)g(of)g(the)h(tec)o(hniques)262
+1198 y(I)k(ha)o(v)o(e)h(researc)o(hed)i(during)e(m)o(y)e(in)o(v)o(estigation)
+h(in)o(to)g(tactical)g(and)h(p)q(ositional)f(ev)n(alua-)262
+1248 y(tion.)26 b(Some)15 b(of)h(the)i(tec)o(hniques)g(represen)o(t)h(the)e
+(state)h(of)e(the)h(art,)g(others)h(ha)o(v)o(e)e(b)q(een)262
+1298 y(rejected)h(b)o(y)e(the)h(computer)f(c)o(hess)i(comm)o(unit)o(y)12
+b(as)j(no)h(longer)f(b)q(eing)g(suitable.)22 b(These)262 1347
+y(older)11 b(tec)o(hniques)i(are)f(in)o(v)o(estigated)g(b)q(ecause)h(they)f
+(ma)o(y)e(con)o(tain)h(ideas)h(relev)n(an)o(t)g(to)f(m)o(y)262
+1397 y(pro)r(ject,)i(and)f(ma)o(y)f(in)h(fact)h(still)f(b)q(e)h(useful)g
+(when)g(com)o(bined)e(with)h(some)g(other)h(ideas)g(of)262
+1447 y(m)o(y)f(o)o(wn.)262 1620 y Fr(3.1)69 b(T)-6 b(ree)22
+b(Searc)n(hing)262 1746 y Fp(This)16 b(section)i(co)o(v)o(ers)g(tec)o
+(hniques)g(for)e(searc)o(hing)h(the)h(game)d(tree.)28 b(The)18
+b(basic)f(alpha{)262 1796 y(b)q(eta)j(searc)o(h)g(algorithm)d(is)i(explained)
+h(and)f(v)n(arious)g(enhancemen)o(ts)h(o)o(v)o(er)f(the)h(basic)262
+1846 y(algorithm)14 b(are)j(presen)o(ted.)28 b(These)18 b(bac)o(kw)o(ard)f
+(pruning)f(algorithms)e(are)j(most)f(appli-)262 1896 y(cable)g(to)g(full)f
+(width)h(searc)o(hing.)25 b(This)16 b(section)h(also)e(con)o(tains)h(a)g
+(brief)g(description)h(of)262 1945 y(t)o(w)o(o)c(forw)o(ard)g(pruning)h(tec)o
+(hniques)h(more)e(applicable)g(to)h(an)g(algorithmic)d(approac)o(h)j(to)262
+1995 y(selectiv)o(e)g(searc)o(hing.)262 2147 y Fu(3.1.1)55
+b(Alpha)19 b(Beta)f(Searc)n(h)h(Algorithm)262 2259 y Fp(In)11
+b(1958,)g(it)h(w)o(as)f(disco)o(v)o(ered)i([42)o(])f(that)g(large)f(sa)o
+(vings)h(could)f(b)q(e)i(made)d(o)o(v)o(er)i(the)h(normal)262
+2309 y(minim)o(ax)f(pro)q(cedure)18 b(b)o(y)e(the)h(use)f(of)g(what)f(is)h
+(no)o(w)g(kno)o(wn)f(as)h(the)h(Alpha-Beta)f(\()p Fh(\013\014)r
+Fp(\))262 2359 y(searc)o(h)j(algorithm.)30 b(The)19 b Fh(\013\014)i
+Fp(algorithm)16 b(uses)k(t)o(w)o(o)e(b)q(ounds,)i(a)e(lo)o(w)o(er)g(b)q(ound)
+h(called)262 2408 y(alpha)d(and)h(an)g(upp)q(er)h(b)q(ound)f(called)g(b)q
+(eta.)29 b(These)18 b(b)q(ounds)g(form)d(a)i(searc)o(h)h(windo)o(w)957
+2574 y(22)p eop
+%%Page: 23 25
+23 24 bop 262 307 a Fp(within)18 b(whic)o(h)i(the)g(true)h(searc)o(h)g(tree)g
+(v)n(alue)e(is)g(kno)o(wn)g(to)h(lie.)35 b(Kn)o(uth)20 b(and)f(Mo)q(ore)262
+357 y(giv)o(e)d(an)i(in)e(depth)j(analysis)d(of)h(this)g(bac)o(kw)o(ard)h
+(pruning)f(algorithm)e(in)h([33)o(].)28 b(Figure)262 407 y(3.1)14
+b(illustrates)h(the)h(application)e(of)h(the)h Fh(\013\014)i
+Fp(b)q(ounds.)23 b(The)16 b(\014gure)g(uses)g(the)g(negamax)262
+457 y(con)o(v)o(en)o(tion)d(where)j(eac)o(h)f(subtree)h(returns)g(its)e(v)n
+(alue)f(negated.)20 b(This)14 b(allo)o(ws)f(eac)o(h)i(side)262
+506 y(to)g(maxim)o(ise)e(its)i(score)h(at)g(eac)o(h)f(lev)o(el)g(of)g(the)h
+(tree,)g(simplifying)c(the)k(implemen)o(tation)262 556 y(of)d(the)h
+(algorithm.)i Fh(\013)d Fp(and)h Fh(\014)i Fp(are)f(initially)c(set)k(to)f
+Ff(\0001)f Fp(and)h(+)p Ff(1)g Fp(resp)q(ectiv)o(ely)m(.)557
+1447 y(Figure)g(3.1:)j(An)d(example)f(Negamax)f(Searc)o(h)j(tree.)324
+1542 y(In)e(the)h(\014gure,)f(no)q(des)h(C)g(and)f(D)g(are)g(searc)o(hed)i
+(and)e(ev)n(aluated,)g(resulting)g(in)g(scores)262 1592 y(of)g
+Ff(\000)p Fp(5)i(and)f Ff(\000)p Fp(2)h(resp)q(ectiv)o(ely)m(.)21
+b(Using)14 b(negamax)f(a)h(score)i(of)e(+2)h(is)f(bac)o(k)o(ed)h(up)g(to)f
+(no)q(de)262 1642 y(B.)j(This)g(v)n(alue)g(then)i(replaces)f(the)h
+Fh(\013)e Fp(v)n(alue)g(at)g(ply)g(1)g(b)q(ecause)j(it)d(is)g(larger)h(than)f
+Fh(\013)p Fp(.)262 1691 y(No)q(de)d(F)f(is)h(then)g(searc)o(hed,)h(whic)o(h)f
+(pro)q(duces)h(a)e(v)n(alue)g(of)g(+1.)18 b(This)c(v)n(alue)f(is)g(not)h
+(large)262 1741 y(enough)f(to)f(a\013ect)i(the)g Fh(\013)e
+Fp(v)n(alue)g(at)h(ply)f(1)h(ab)q(o)o(v)o(e.)k(Hence,)e(there)f(is)f(no)f
+(reason)i(to)e(searc)o(h)262 1791 y(no)q(de)18 b(G)g(since)h(the)g(resulting)
+f(v)n(alue)g(of)g(no)q(de)g(E)h(can)f(only)g(b)q(e)h Ff(\024)g(\000)p
+Fp(1)f(\(negamaxed\).)262 1841 y(Therefore,)h(no)q(de)f(G)f(is)g(said)g(to)h
+(b)q(e)g(cut)g(o\013)f(or)h(pruned)g(from)e(the)i(searc)o(h)h(tree.)30
+b(The)262 1891 y(negamax)12 b(approac)o(h)i(has)g(the)h(e\013ect)g(of)f
+(making)d(all)i(cut)i(o\013s,)e Fh(\014)k Fp(cut)e(o\013s.)j(The)d(pseudo)262
+1940 y(co)q(de)f(for)g(the)g Fh(\013\014)i Fp(algorithm)c(can)i(b)q(e)g
+(found)g(in)f(\014gure)i(3.2.)324 2026 y(The)10 b(normal)f(full)g(width)h
+(minim)o(ax)d(pro)q(cedure,)12 b(applied)e(to)g(a)g(tree)h(of)f(uniform)e
+(width)262 2075 y(W)15 b(and)h(depth)g(d,)g(w)o(ould)g(ha)o(v)o(e)f(to)h
+(searc)o(h)h Fh(W)1020 2060 y Fe(d)1055 2075 y Fp(terminal)e(no)q(des.)25
+b(The)16 b Fh(\013\014)i Fp(algorithm)262 2125 y(under)13 b(optimal)e
+(conditions)h(can)i(prune)g(a)e(tree)j(to)e(the)g(exten)o(t)h(that)f(only)g
+(the)g(follo)o(wing)262 2175 y(terminal)f(no)q(des)i(need)h(to)f(b)q(e)g
+(examined)f([13)o(]:)324 2248 y Ff(\017)20 b Fh(W)410 2233
+y Fk(\()p Fe(d)p Fk(+1\))p Fe(=)p Fk(2)540 2248 y Fp(+)10 b
+Fh(W)627 2233 y Fk(\()p Fe(d)p Fd(\000)p Fk(1\))p Fe(=)p Fk(2)757
+2248 y Ff(\000)g Fp(1)k(at)f(o)q(dd)h(depths.)324 2326 y Ff(\017)20
+b Fp(2)9 b Ff(\001)g Fh(W)461 2311 y Fe(d=)p Fk(2)523 2326
+y Ff(\000)h Fp(1)j(at)h(ev)o(en)h(depths.)262 2399 y(This)g(is)h(kno)o(wn)f
+(as)h(the)h(minim)o(al)12 b(searc)o(h)17 b(tree.)25 b(T)m(o)16
+b(ac)o(hiev)o(e)g(this)g(result,)g(most)f(mo)o(v)o(es)262 2449
+y(m)o(ust)10 b(b)q(e)h(searc)o(hed)i(in)e(a)g(descending)h(order)g(of)f
+(merit.)16 b(Of)11 b(course)i(the)e(true)h(merit)e(of)h(an)o(y)957
+2574 y(23)p eop
+%%Page: 24 26
+24 25 bop 262 503 a Fl(F)l(unction)11 b Fp(AlphaBeta\(P)j(:)g
+Fl(p)q(osition)p Fp(;)c Fh(\013)p Fp(,)j Fh(\014)k Fp(:)h Fl(in)o(teger)p
+Fp(\))11 b Fl(returns)j(in)o(teger)262 603 y(v)m(ar)321 653
+y Fp(m)82 b(:)18 b Fl(mo)o(v)o(e)321 702 y Fp(score,)321 752
+y(b)q(est)44 b(:)18 b Fl(in)o(teger)262 852 y(b)q(egin)321
+952 y(if)12 b Fp(\(T)m(erminal\(P\)\))446 b(/*)13 b Fm(Is)i(p)n(osition)g(P)g
+(terminal)f(?)19 b Fp(*/)380 1001 y Fl(return)11 b Fp(\(Ev)n(aluate\(P)m(,)i
+Fh(\013)p Fp(,)g Fh(\014)r Fp(\)\))189 b(/*)13 b Fm(R)n(eturn)i(sc)n(or)n(e)g
+(at)f(le)n(af)h(no)n(des)f Fp(*/)321 1051 y Fl(endif)321 1151
+y Fp(GenerateMo)o(v)o(es\(P\))408 b(/*)13 b Fm(Gener)n(ate)i(al)r(l)f(moves)i
+(in)e(p)n(osition)h(P)f Fp(*/)321 1201 y(b)q(est)h(:=)e Ff(\0001)524
+b Fp(/*)13 b Fm(b)n(est)i(move)g(sc)n(or)n(e)f(not)i(yet)e(known)h
+Fp(*/)321 1250 y Fl(for)g(eac)o(h)g(mo)o(v)o(e)e Fp(m)f Fl(do)380
+1300 y Fp(/*)h Fm(Se)n(ar)n(ch)i(move)g(m)g(using)g(ne)n(gamax)h(c)n
+(onvention)g(\(p)n(ar)n(ameters)e(r)n(everse)n(d\))f Fp(*/)380
+1350 y(score)i(:=)e Ff(\000)p Fp(AlphaBeta\()p Fh(P)810 1356
+y Fe(m)842 1350 y Fp(,)h Ff(\000)p Fh(\014)r Fp(,)g Ff(\000)p
+Fl(max)p Fp(\()p Fh(\013)p Fp(,)g(b)q(est\)\))380 1400 y Fl(if)e
+Fp(\(score)k Fh(>)e Fp(b)q(est\))439 1450 y(b)q(est)h(:=)e(score)391
+b(/*)13 b Fm(Stor)n(e)i(b)n(est)f(sc)n(or)n(e)h(found)f Fp(*/)439
+1499 y Fl(if)e Fp(\(b)q(est)k Ff(\025)11 b Fh(\014)r Fp(\))498
+1549 y Fl(return)g Fp(\(b)q(est\))315 b(/*)13 b Fh(\014)18
+b Fm(cut)d(o\013)g(:)k(r)n(eturn)14 b(b)n(est)h(sc)n(or)n(e)e
+Fp(*/)439 1599 y Fl(endif)380 1649 y(endif)321 1699 y(endfor)321
+1798 y(return)e Fp(\(b)q(est\))492 b(/*)13 b Fm(R)n(eturn)i(sc)n(or)n(e)g(of)
+f(b)n(est)h(move)g(found)g Fp(*/)262 1898 y Fl(end)d Fp(AlphaBeta)262
+2047 y(The)i Fl(max)p Fp(\()p Fh(\013)p Fp(,)f(b)q(est\))i(op)q(eration)f
+(represen)o(ts)j(the)d('fail)e(soft')h(condition)h(whic)o(h)f(allo)o(ws)g
+(the)262 2097 y(searc)o(h)i(at)e(eac)o(h)i(lev)o(el)e(to)h(return)h(the)g(b)q
+(est)g(v)n(alue)e(found,)g(ev)o(en)h(if)f(this)h(is)g(less)h(than)f
+Fh(\013)p Fp(.)552 2280 y(Figure)g(3.2:)j(Pseudo)d(co)q(de)h(for)f(the)g
+Fh(\013\014)i Fp(Algorithm.)957 2574 y(24)p eop
+%%Page: 25 27
+25 26 bop 262 307 a Fp(mo)o(v)o(e)12 b(is)j(not)f(kno)o(wn)g(b)q(efore)i(it)e
+(is)g(searc)o(hed.)22 b(Therefore,)16 b(heuristics)g(m)o(ust)d(b)q(e)i(used)h
+(to)262 357 y(ac)o(hiev)o(e)d(this)h(ordering.)k(In)13 b(practice)i(the)f
+Fh(\013\014)i Fp(algorithm)11 b(searc)o(hes)16 b(a)d(tree)i(3)e(to)g(6)h
+(times)262 407 y(larger)j(than)h(the)h(minim)o(al)14 b(tree)19
+b(b)q(ecause)h(of)d(sub{optimal)e(ordering.)30 b(Ho)o(w)o(ev)o(er,)19
+b(the)262 457 y(enormous)14 b(sa)o(vings)h(pro)q(duced)i(b)o(y)e(using)g(the)
+h Fh(\013\014)i Fp(algorithm)13 b(are)j(suc)o(h)g(that)f(it)g(b)q(egins)262
+506 y(to)e(mak)o(e)g(full)f(width)i(searc)o(hing)g(a)g(plausible)f
+(alternativ)o(e)h(to)f(selectiv)o(e)i(searc)o(hing.)262 656
+y Fu(3.1.2)55 b(Aspiration)18 b Fs(\013\014)k Fu(Searc)n(h)262
+768 y Fp(The)16 b(basic)g Fh(\013\014)j Fp(searc)o(h)e(is)f(carried)h(out)f
+(with)g(initial)e Fh(\013\014)19 b Fp(v)n(alues)d(set)h(to)f
+Ff(\0001)g Fp(and)g(+)p Ff(1)262 818 y Fp(resp)q(ectiv)o(ely)m(.)22
+b(The)15 b(aspiration)f Fh(\013\014)j Fp(searc)o(h)f(mak)o(es)e(assumptions)g
+(ab)q(out)h(the)h(exp)q(ected)262 868 y(v)n(alue)d(of)i(the)g(searc)o(h)h
+(tree.)21 b(The)15 b Fh(\013\014)i Fp(b)q(ounds)e(are)g(therefore)h
+(initially)c(set)k(to)e(a)h(narro)o(w)262 917 y(windo)o(w)c(cen)o(tered)j
+(around)d(the)i(exp)q(ected)h(searc)o(h)f(tree)g(v)n(alue,)e
+Ff(\006)i Fp(a)e(pa)o(wn,)h(for)f(example.)324 1003 y(Unlik)o(e)j(the)i
+(basic)f Fh(\013\014)i Fp(searc)o(h)f(whic)o(h)f(alw)o(a)o(ys)f(returns)i
+(the)g(true)g(score)g(of)e(the)i(tree,)262 1053 y(an)d(aspiration)g
+Fh(\013\014)j Fp(searc)o(h)f(can)g(pro)q(duce)g(3)e(p)q(ossible)h(outcomes:)
+312 1126 y(1.)20 b Fl(A)f(true)e(score)p Fp(:)22 b(The)16 b(true)h(v)n(alue)f
+(of)f(the)i(tree)g(lies)f(inside)g(the)h(searc)o(h)g(windo)o(w)365
+1176 y(and)d(w)o(as)g(therefore)h(found)f(b)o(y)f(the)i(searc)o(h.)312
+1254 y(2.)20 b Fl(A)c(fail)f(lo)o(w)p Fp(:)i(The)d(true)h(v)n(alue)e(of)g
+(the)i(tree)g(is)f(smaller)e(than)i(the)g Fh(\013)g Fp(b)q(ound.)312
+1332 y(3.)20 b Fl(A)d(fail)d(high)p Fp(:)j(The)e(true)g(v)n(alue)e(of)h(the)h
+(tree)g(is)f(larger)h(than,)e(or)i(equal)e(to,)h(the)h Fh(\014)365
+1382 y Fp(b)q(ound.)262 1455 y(In)i(case)i(1,)f(the)g(searc)o(h)h(has)f(b)q
+(een)h(successful)g(b)q(ecause)g(the)g(b)q(est)f(mo)o(v)o(e)f(and)g(its)h
+(true)262 1505 y(v)n(alue)12 b(has)g(b)q(een)i(found.)k(In)12
+b(cases)i(2)f(and)f(3)h(the)g(searc)o(h)h(has)f(failed)f(to)g(\014nd)h(a)g
+(true)g(v)n(alue)262 1554 y(for)k(the)h(tree)g(b)q(ecause)h(of)e
+Fh(\013\014)j Fp(cut)e(o\013s.)29 b(Ho)o(w)o(ev)o(er,)18 b(the)g(direction)f
+(of)g(the)h(tree's)h(true)262 1604 y(v)n(alue)c(relativ)o(e)g(to)h(the)g
+Fh(\013\014)i Fp(b)q(ounds)f(is)e(no)o(w)h(kno)o(wn.)23 b(When)16
+b(the)h(searc)o(h)g(fails)d(lo)o(w)h(the)262 1654 y(true)f(v)n(alue)e(is)h
+(kno)o(wn)g(to)g(lie)f(in)h(the)h(range)f(\()p Ff(\0001)p Fp(,)p
+Fh(\013)p Fp(\),)f(and)h(when)h(it)f(fails)f(high,)g(the)i(true)262
+1704 y(v)n(alue)g(will)h(lie)g(in)g(the)h(range)g(\()p Fh(\014)r
+Fp(,+)p Ff(1)p Fp(\).)23 b(Using)16 b(the)g(appropriate)g(new)g(searc)o(h)g
+(windo)o(w)262 1754 y(the)e(tree)h(m)o(ust)e(b)q(e)i(re-searc)o(hed)h(to)d
+(\014nd)h(the)h(true)g(score.)324 1839 y(This)k(approac)o(h)h(can)g(pro)q
+(duce)g(a)g(noticeably)f(faster)h(searc)o(h)h(than)e(the)i(basic)e
+Fh(\013\014)262 1889 y Fp(algorithm)c(if)i(the)h(initial)e(windo)o(w)h(is)g
+(w)o(ell)h(c)o(hosen.)30 b(It)18 b(can,)h(ho)o(w)o(ev)o(er,)f(also)f(pro)q
+(duce)262 1939 y(a)e(slo)o(w)o(er)g(searc)o(h)i(if)d(the)i(v)n(alue)f(of)g
+(the)h(tree)h(lies)e(outside)h(the)g(initial)d(windo)o(w,)h(as)i(a)f(re-)262
+1988 y(searc)o(h)h(will)e(b)q(e)i(necessary)m(.)25 b(In)15
+b(c)o(hess,)i(material)d(is)h(rarely)h(w)o(on)f(or)g(lost.)23
+b(Therefore,)17 b(a)262 2038 y(windo)o(w)10 b(of)h(a)g(couple)h(of)e(pa)o
+(wns)i(width)f(will)f(only)g(fail)g(o)q(ccasionally)g(to)i(\014nd)f(a)g(true)
+h(score)262 2088 y(at)j(the)i(\014rst)f(attempt,)f(making)f(this)i(tec)o
+(hnique)g(generally)g(faster)g(than)g(the)g(basic)g Fh(\013\014)262
+2138 y Fp(algorithm.)262 2287 y Fu(3.1.3)55 b(Principle)17
+b(V)-5 b(ariation)19 b Fs(\013\014)i Fu(Searc)n(h)262 2399
+y Fp(The)16 b(aspiration)g Fh(\013\014)i Fp(searc)o(h)g(is)e(e\013ectiv)o(e)i
+(b)q(ecause)f(the)g(reduced)h Fh(\013\014)h Fp(windo)o(w)c(cuts)j(o\013)262
+2449 y(n)o(umerous)13 b(subtrees)k(on)d(the)h(assumption)e(that)i(something)e
+(b)q(etter)j(exists.)k(If)14 b(w)o(e)h(to)q(ok)957 2574 y(25)p
+eop
+%%Page: 26 28
+26 27 bop 262 307 a Fp(this)13 b(reduced)j(windo)o(w)d(idea)h(to)g(its)f
+(limits)f(w)o(e)i(w)o(ould)f(ha)o(v)o(e)h(a)f(minima)o(l)e(windo)o(w.)324
+392 y(A)17 b(minim)o(al)c(windo)o(w)k(uses)h Fh(\013)f Fp(and)f
+Fh(\014)k Fp(v)n(alues)d(set)h(so)f(close)g(together)h(that)g(no)e(tree)262
+442 y(v)n(alue)8 b(can)i(b)q(e)g(enclosed)h(within)e(the)h(windo)o(w.)16
+b(Therefore,)11 b(the)f Fh(\013\014)i Fp(searc)o(h)e(will)e(de\014nitely)262
+492 y(fail)13 b(lo)o(w)h(or)h(high)f(dep)q(ending)h(on)g(where)h(the)g(true)f
+(score)h(lies)f(relativ)o(e)g(to)g(the)g(minim)o(al)262 542
+y(windo)o(w,)10 b(thereb)o(y)i(iden)o(tifying)d(in)i(whic)o(h)f(direction)i
+(the)f(true)h(score)g(lies.)17 b(The)11 b Fl(P)p Fp(rinciple)262
+592 y Fl(V)p Fp(ariation)i Fh(\013\014)18 b Fl(S)p Fp(earc)o(h)d(\()p
+Fl(PVS)p Fp(\))g(uses)h(this)f(idea)g(b)o(y)g(\014rst)h(doing)e(a)h(basic)g
+Fh(\013\014)j Fp(searc)o(h)e(to)262 641 y(\014nd)e(the)i(true)f(v)n(alue)f
+(of)g(the)i(principle)e(v)n(ariation.)19 b(All)14 b(subsequen)o(t)i(searc)o
+(hes)h(are)e(then)262 691 y(done)d(with)g(a)g(minima)o(l)d(windo)o(w)j(cen)o
+(tered)i(on)e(the)h(curren)o(t)h(v)n(alue)e(of)f(the)i(principle)g(line.)262
+741 y(This)h(w)o(orks)g(on)g(the)h(idea)f(that)h(it)f(is)g(m)o(uc)o(h)f
+(easier)i(to)f(sho)o(w)g(that)h(a)f(subtree)i(is)e(inferior)262
+791 y(than)h(determine)g(its)g(true)h(v)n(alue.)22 b(Therefore,)16
+b(when)g(a)f(minim)o(al)d(windo)o(w)i(searc)o(h)j(fails)262
+841 y(lo)o(w,)i(the)g(mo)o(v)o(e)f(is)h(discarded)h(as)f(b)q(eing)g(w)o(orse)
+h(than)f(the)h(mo)o(v)o(e)e(already)h(found.)33 b(If)262 891
+y(ho)o(w)o(ev)o(er,)18 b(it)g(fails)f(high,)h(it)f(m)o(ust)g(b)q(e)i
+(re-searc)o(hed)h(with)e(a)g(windo)o(w)f(wide)h(enough)g(to)262
+940 y(encompass)13 b(the)i(true)f(score.)324 1026 y(Figure)g(3.3)f(sho)o(ws)i
+(the)g(pseudo)g(co)q(de)g(for)e(the)i(PVS)g(algorithm.)h(The)f(pseudo)g(co)q
+(de)262 1075 y(includes)h(Reinefeld's)g(depth)h Ff(\024)g Fp(2)f(enhancemen)o
+(t)h([46)o(].)25 b(This)16 b(enhancemen)o(t)g(uses)i(the)262
+1125 y(fact)12 b(that)h(the)g('fail-soft')d(max)h(op)q(eration)i(allo)o(ws)f
+(true)h(scores)i(rather)e(than)g Fh(\014)i Fp(v)n(alues)e(to)262
+1175 y(b)q(e)f(returned)i(from)d(the)i(last)f(2)g(plies)g(of)f(the)i(tree.)19
+b(Hence,)14 b(at)e(the)g(b)q(ottom)f(2)h(plies)g(of)g(the)262
+1225 y(tree,)i(re-searc)o(hes)j(are)d(unnecessary)m(.)957 2574
+y(26)p eop
+%%Page: 27 29
+27 28 bop 262 342 a Fl(F)l(unction)11 b Fp(PVS\(P)k(:)e Fl(p)q(osition)p
+Fp(;)d Fh(\013)p Fp(,)j Fh(\014)r Fp(,)h(depth)h(:)j Fl(in)o(teger)p
+Fp(\))11 b Fl(returns)j(in)o(teger)262 442 y(v)m(ar)321 491
+y Fp(m)82 b(:)18 b Fl(mo)o(v)o(e)321 541 y Fp(score,)321 591
+y(b)q(est)44 b(:)18 b Fl(in)o(teger)262 691 y(b)q(egin)321
+790 y(if)12 b Fp(\(depth)j(=)f(0\))380 840 y Fl(return)d Fp(\(Ev)n(aluate\(P)
+m(,)i Fh(\013)p Fp(,)g Fh(\014)r Fp(\)\))189 b(/*)13 b Fm(Evaluate)i(le)n(af)
+g(no)n(de)f Fp(*/)321 890 y Fl(endif)321 990 y Fp(GenerateMo)o(v)o(es\(P\))
+408 b(/*)13 b Fm(Gener)n(ate)i(al)r(l)f(moves)i(in)e(p)n(osition)h(P)f
+Fp(*/)321 1039 y(/*)f Fm(Se)n(ar)n(ch)i(principle)f(variation)h(to)g(next)g
+(depth)h(using)f(ne)n(gamax)h(c)n(onvention)f Fp(*/)321 1089
+y(b)q(est)g(:=)e Ff(\000)p Fp(PVS\()p Fh(P)624 1095 y Fk(1)643
+1089 y Fp(,)h Ff(\000)p Fh(\014)r Fp(,)g Ff(\000)p Fh(\013)p
+Fp(,)f(depth)p Ff(\000)p Fp(1\))321 1139 y Fl(if)f Fp(\(b)q(est)j
+Ff(\025)g Fh(\014)r Fp(\))380 1189 y Fl(return)c Fp(\(b)q(est\))433
+b(/*)13 b Fh(\014)k Fm(cut)e(o\013)g(:)k(r)n(eturn)14 b(b)n(est)h(sc)n(or)n
+(e)e Fp(*/)321 1239 y Fl(endif)321 1289 y(for)i(eac)o(h)g(mo)o(v)o(e)e
+Fp(m)f Fl(do)380 1338 y Fh(\013)h Fp(:=)h Fl(max)p Fp(\(b)q(est,)h
+Fh(\013)p Fp(\))339 b(/*)13 b Fm(A)o(l)r(low)h(fail)g(soft)f
+Fp(*/)380 1388 y(/*)g Fm(Se)n(ar)n(ch)i(move)g(m)g(to)g(next)g(depth)h(using)
+f(ne)n(gamax)h(c)n(onvention)f Fp(*/)380 1438 y(score)g(:=)e
+Ff(\000)p Fp(PVS\()p Fh(P)698 1444 y Fe(m)730 1438 y Fp(,)h
+Ff(\000)p Fh(\013)9 b Ff(\000)h Fp(1,)j Ff(\000)p Fh(\013)p
+Fp(,)g(depth)p Ff(\000)p Fp(1\))380 1488 y Fl(if)f Fp(\(score)k
+Fh(>)e Fp(b)q(est\))439 1538 y(/*)f Fm(R)n(e-se)n(ar)n(ch)i(only)g(if)f(sc)n
+(or)n(e)h(is)f(within)h Fh(\013\014)i Fm(window)d(and)i(not)f(a)g(true)f
+Fp(*/)439 1587 y(/*)f Fm(sc)n(or)n(e)i(r)n(eturne)n(d)f(fr)n(om)g(de)n(ep)n
+(est)h(2)g(levels)g(\(R)n(einefeld's)f(enhanc)n(ement\))h Fp(*/)439
+1637 y Fl(if)d Fp(\(\()p Fh(\013)g(<)i Fp(score\))h Fl(and)e
+Fp(\(score)j Fh(<)11 b(\014)r Fp(\))k Fl(and)e Fp(\(depth)i
+Fh(>)f Fp(2\)\))498 1687 y(b)q(est)h(:=)e Ff(\000)p Fp(PVS\()p
+Fh(P)801 1693 y Fe(m)833 1687 y Fh(;)7 b Ff(\000)p Fh(\014)r(;)g
+Ff(\000)p Fp(score,)15 b(depth)p Ff(\000)p Fp(1\))439 1737
+y Fl(else)498 1787 y Fp(b)q(est)g(:=)e(score)439 1836 y Fl(endif)439
+1886 y(if)f Fp(\(b)q(est)k Ff(\025)11 b Fh(\014)r Fp(\))498
+1936 y Fl(return)g Fp(\(b)q(est\))315 b(/*)13 b Fh(\014)k Fm(cut)e(o\013)g(:)
+k(r)n(eturn)14 b(b)n(est)h(sc)n(or)n(e)e Fp(*/)439 1986 y Fl(endif)380
+2036 y(endif)321 2086 y(endfor)321 2185 y(return)e Fp(\(b)q(est\))492
+b(/*)13 b Fm(R)n(eturn)i(sc)n(or)n(e)g(of)f(b)n(est)h(move)g(found)g
+Fp(*/)262 2285 y Fl(end)d Fp(PVS)537 2467 y(Figure)i(3.3:)j(Pseudo)d(co)q(de)
+h(for)f(the)g(PVS)g(Algorithm.)957 2574 y(27)p eop
+%%Page: 28 30
+28 29 bop 262 307 a Fu(3.1.4)55 b(Iterativ)n(e)17 b(Deep)r(ening)262
+419 y Fp(Iterativ)o(e)11 b(deep)q(ening)h([4)o(])f(is)g(a)g(metho)q(d)f(of)h
+(impro)o(ving)d(mo)o(v)o(e)h(ordering,)j(thereb)o(y)g(increas-)262
+469 y(ing)h Fh(\013\014)j Fp(cut)e(o\013s.)19 b(It)14 b(also)f(enables)h(the)
+h(exp)q(ected)h(principle)e(v)n(ariation)e(to)i(b)q(e)g(primed.)324
+554 y(Iterativ)o(e)e(deep)q(ening)h(is)f(ac)o(hiev)o(ed)g(b)o(y)g(p)q
+(erforming)e(a)i(series)h(of)e(searc)o(hes)j(to)e(progres-)262
+604 y(siv)o(ely)e(greater)h(depths)h(e.g.)17 b(1)10 b(ply)m(,)g(2)g(ply)m(,)g
+(3)g(ply)g(etc.)18 b(After)12 b(eac)o(h)f(searc)o(h)h(the)f(1)f(ply)g(mo)o(v)
+o(e)262 654 y(list)j(can)h(b)q(e)h(re-ordered)g(to)f(increase)h(the)g
+(e\016ciency)f(of)g(the)g(subsequen)o(t)i(iterations.)324 739
+y(It)h(migh)o(t)e(b)q(e)j(though)o(t)f(that)h(doing)e(an)h(iterativ)o(e)g
+(searc)o(h)i(to)e(4)g(ply)g(w)o(ould)f(b)q(e)i(less)262 789
+y(e\016cien)o(t)c(than)g(a)g(direct)h(4)e(ply)h(searc)o(h,)h(whic)o(h)f
+(after)g(all)f(will)f(b)q(e)j(done)f(an)o(yw)o(a)o(y)f(as)h(part)262
+839 y(of)d(an)h(iterativ)o(e)g(searc)o(h.)19 b(Ho)o(w)o(ev)o(er,)12
+b(there)i(exists)f(n)o(umerous)e(tec)o(hniques)j(for)d(impro)o(ving)262
+889 y(the)16 b(sp)q(eed)i(of)e(eac)o(h)h(subsequen)o(t)h(iteration)e(b)o(y)g
+(making)e(b)q(est)k(use)f(of)f(the)h(information)262 938 y(gained)d(so)h
+(far.)20 b(These)c(tec)o(hniques)h(include)e(refutation)f(tables,)h(transp)q
+(osition)g(tables,)262 988 y(the)e(history)h(heuristic)g(etc.)19
+b(These)14 b(tec)o(hniques)h(will)d(b)q(e)i(explained)f(in)g(detail)g(later.)
+k(An)262 1038 y(iterativ)o(e)h(PVS)g(com)o(bined)f(with)h(some)g(of)f(the)i
+(tec)o(hniques)h(men)o(tioned)d(can)h(pro)q(duce)262 1088 y(trees)d(v)o(ery)f
+(close)h(to)e(the)i(minim)o(al)10 b(tree)15 b([40)o(].)324
+1173 y(An)j(iterativ)o(e)f(deep)q(ening)i Fh(\013\014)h Fp(searc)o(h)e(also)f
+(has)h(another)g(imp)q(ortan)o(t)e(b)q(ene\014t;)k(the)262
+1223 y(b)q(est)f(mo)o(v)o(e)e(found)h(so)g(far)h(is)f(alw)o(a)o(ys)f(kno)o
+(wn.)32 b(As)18 b(all)g(mo)o(v)o(es)f(are)i(searc)o(hed)h(at)e(eac)o(h)262
+1273 y(iteration,)d(this)g(mo)o(v)o(e)f(is)i(lik)o(ely)e(to)i(b)q(e)g
+(reasonable.)24 b(Therefore,)16 b(if)f(the)i(a)o(v)n(ailable)c(time)262
+1323 y(expires,)h(the)g(b)q(est)h(mo)o(v)o(e)d(found)i(so)g(far)f(could)h(b)q
+(e)g(pla)o(y)o(ed)f(with)h(con\014dence.)20 b(In)13 b(a)h(non{)262
+1372 y(iterativ)o(e)h(searc)o(h,)i(ho)o(w)o(ev)o(er,)f(if)f(the)h(time)f
+(expires,)i(the)f(mo)o(v)o(e)e(selected)k(as)e(b)q(est)g(w)o(ould)262
+1422 y(dep)q(end)f(on)f(what)h(mo)o(v)o(es)e(had)h(b)q(een)h(searc)o(hed)h
+(so)f(far.)k(If)14 b(only)g(p)q(o)q(or)g(mo)o(v)o(es)f(had)h(b)q(een)262
+1472 y(searc)o(hed,)j(only)e(a)h(p)q(o)q(or)g(mo)o(v)o(e)e(could)h(b)q(e)i(c)
+o(hosen.)25 b(This)15 b(is)h(an)g(imp)q(ortan)o(t)e(b)q(ene\014t)j(for)262
+1522 y(comp)q(etitiv)o(e)12 b(c)o(hess)k(programs)c(b)q(ecause)k(they)e(m)o
+(ust)f(con)o(trol)h(their)g(o)o(wn)g(time)e(usage.)262 1673
+y Fu(3.1.5)55 b(Mo)n(v)n(e)19 b(Ordering)262 1785 y Fp(As)g(stressed)i
+(earlier,)e(the)g(order)h(in)e(whic)o(h)g(mo)o(v)o(es)g(are)h(examined)e(is)h
+(critical)h(to)f(the)262 1835 y(e\016ciency)e(of)f Fh(\013\014)r
+Fp(.)23 b(The)16 b(mo)o(v)o(es)e(from)g(eac)o(h)i(no)q(de)g(can)g(b)q(e)g
+(ordered)h(using)e(a)g(v)n(ariet)o(y)g(of)262 1885 y(heuristics:)324
+1968 y Ff(\017)20 b Fp(An)f(iterativ)o(e)f(searc)o(h)h(is)f(a)g(go)q(o)q(d)g
+(basis)g(for)g(impro)o(ving)d(mo)o(v)o(e)i(ordering)h(as)g(the)365
+2018 y(mo)o(v)o(es)12 b(at)g(the)h(ro)q(ot)g(of)f(the)h(tree)h(are)f
+(directly)g(ordered)g(b)o(y)g(a)f(searc)o(h)i(to)e(a)h(depth)g(1)365
+2067 y(ply)f(less)h(than)f(the)h(curren)o(t)h(searc)o(h)g(depth.)k(As)13
+b(the)g(subtree)h(b)q(elo)o(w)e(mo)o(v)o(es)f(at)h(the)365
+2117 y(\014rst)17 b(ply)d(is)i(usually)e(larger)i(than)f(subtrees)j(at)d
+(greater)h(depths,)h(mo)o(v)o(e)d(ordering)365 2167 y(at)g(ply)f(1)h(is)g
+(lik)o(ely)e(to)i(ha)o(v)o(e)g(the)g(greatest)h(e\013ect)h(on)e(o)o(v)o
+(erall)e(tree)j(size.)324 2250 y Ff(\017)20 b Fp(Storing)11
+b(mo)o(v)o(es)f(in)g(a)h(transp)q(osition)g(table)g(represen)o(ts)j(p)q
+(erhaps)e(the)g(b)q(est)g(metho)q(d)365 2300 y(of)k(ordering)h(mo)o(v)o(es)e
+(in)h(an)g(iterativ)o(e)h Fh(\013\014)i Fp(searc)o(h)e([18)o(].)26
+b(This)16 b(is)h(b)q(ecause)h(mo)o(v)o(es)365 2350 y(found)c(to)g(b)q(e)h(b)q
+(est)h(at)e(iteration)g(n)g(are)h(v)o(ery)f(lik)o(ely)f(to)i(remain)d(b)q
+(est)k(at)e(iteration)365 2399 y(n+1.)28 b(Therefore)18 b(mo)o(v)o(es)e
+(stored)i(in)e(the)i(transp)q(osition)f(table)g(should)g(b)q(e)g(tried)365
+2449 y(\014rst)e(if)e(the)i(no)q(de)f(is)g(re-visited.)957
+2574 y(28)p eop
+%%Page: 29 31
+29 30 bop 324 307 a Ff(\017)20 b Fp(Capture)d(mo)o(v)o(es)d(are)i(w)o(orth)f
+(searc)o(hing)h(b)q(efore)h(other)f(less)g(dynamic)e(mo)o(v)o(es)g(b)q(e-)365
+357 y(cause)h(they)f(are)h(more)d(lik)o(ely)h(to)h(refute)g(the)h(curren)o(t)
+g(line)e(of)h(pla)o(y)f(and)g(therefore)365 407 y(cause)i(a)e(cut)h(o\013.)k
+(Capturing)13 b(the)h(piece)g(just)f(mo)o(v)o(ed)f(is)h(generally)g(v)o(ery)h
+(e\013ectiv)o(e)365 457 y(at)g(refuting)g(a)f(giv)o(en)h(line)f(of)g(pla)o(y)
+g([4].)324 539 y Ff(\017)20 b Fp(A)12 b(mo)o(v)o(e)e(that)i(causes)h(a)e(cut)
+i(o\013)e(at)h(a)f(giv)o(en)h(depth)g(should)g(b)q(e)g(tried)g(early)g(as)f
+(part)365 589 y(of)16 b(another)g(v)n(ariation)f(at)h(the)g(same)g(depth.)25
+b(This)16 b(tec)o(hnique)h(is)f(kno)o(wn)g(as)g(the)365 638
+y Fm(Kil)r(ler)d Fp(heuristic)h([4].)324 721 y Ff(\017)20 b
+Fp(The)14 b Fm(History)f Fp(heuristic)h(pro)o(vides)f(a)g(metho)q(d)g(of)g
+("recording)g(eac)o(h)h(mo)o(v)o(es)e(abilit)o(y)365 770 y(to)17
+b(cause)g(a)f(refutation")h([50)o(].)25 b(This)16 b(information)e(can)j(then)
+g(b)q(e)g(used)g(to)g(order)365 820 y(mo)o(v)o(es)c(according)h(to)g(the)g
+(lik)o(eliho)q(o)q(d)e(of)h(them)h(causing)f(a)h(refutation.)324
+902 y Ff(\017)20 b Fp(Metho)q(ds)c(whic)o(h)f(use)g(the)h(ev)n(aluation)d
+(function)i(to)f(score)i(and)f(order)h(mo)o(v)o(es)d(are)365
+952 y(quite)g(accurate,)h(but)f(exp)q(ensiv)o(e;)h(prohibitiv)o(ely)e(so)h
+(at)f(the)i(deep)q(est)h(lev)o(els)e(of)f(the)365 1002 y(tree.)262
+1083 y(The)g(ob)r(jectiv)o(e)g(of)f(mo)o(v)o(e)g(ordering)h(is)f(therefore)j
+(to)d(searc)o(h)i(mo)o(v)o(es)e(in)g(a)h(b)q(est)h(\014rst)f(order.)262
+1133 y(Therefore)21 b(\014nding)f(go)q(o)q(d)g Fh(\013)g Fp(v)n(alues)h(quic)
+o(kly)e(and)h(causing)h(early)f Fh(\014)j Fp(cut)e(o\013s.)38
+b(The)262 1183 y(time)13 b(sp)q(en)o(t)j(ordering)f(mo)o(v)o(es)f(m)o(ust)g
+(b)q(e)h(small)e(or)i(the)h(pro)q(cess)g(will)e(b)q(e)h(self{defeating.)262
+1233 y(Therefore)f(the)g(\014rst)h(\014v)o(e)f(metho)q(ds)f(are)h(most)e
+(common)f(in)i(con)o(temp)q(orary)g(brute)h(force)262 1283
+y(c)o(hess)h(programs.)262 1434 y Fu(3.1.6)55 b(Null)18 b(Mo)n(v)n(es)262
+1546 y Fp(In)d(c)o(hess,)j(unlik)o(e)d(some)g(other)i(games,)e(the)h(option)g
+(of)f(not)h(pla)o(ying)e(a)i(mo)o(v)o(e)e(do)q(es)j(not)262
+1596 y(exist.)h(Ho)o(w)o(ev)o(er,)13 b(this)f(option)g(can)h(b)q(e)h(used)g
+(to)e(go)q(o)q(d)h(e\013ect)h(as)f(part)g(of)f(the)h(searc)o(h)h(tree)262
+1645 y(in)f(order)i(to)e(detect)j(tactical)d(mo)o(v)o(es.)324
+1731 y(The)k(idea)f(is)h(that)g(b)o(y)f(giving)f(up)i(the)h(righ)o(t)e(to)g
+(mo)o(v)o(e,)g(it)g(allo)o(ws)g(the)h(opp)q(onen)o(t)g(a)262
+1781 y(second)i(consecutiv)o(e)h(mo)o(v)o(e.)29 b(If)18 b(this)g(second)i(mo)
+o(v)o(e)c(do)q(es)k(not)e(accomplish)f(an)o(ything)262 1830
+y(b)q(ene\014cial,)i(then)g(it)f(can)g(b)q(e)h(assumed)f(that)h(the)g
+(\014rst)g(mo)o(v)o(e)d(did)i(not)g(represen)o(t)j(an)o(y)262
+1880 y(threat.)d(In)c(this)g(w)o(a)o(y)f(mo)o(v)o(es)g(whic)o(h)h(represen)o
+(t)i(a)d(threat)i(can)f(b)q(e)h(iden)o(ti\014ed.)324 1965 y(This)d(metho)q(d)
+f(assumes)h(that)g(it)g(is)f(alw)o(a)o(ys)g(b)q(etter)j(to)e(mak)o(e)e(a)i
+(mo)o(v)o(e,)e(than)i(no)g(mo)o(v)o(e)262 2015 y(at)f(all)g(\(a)g
+Fm(nul)r(l)i(move)p Fp(\).)18 b(In)12 b(fact)g(in)f(c)o(hess,)i(a)f
+(situation)f(kno)o(wn)g(as)h("zugzw)o(ang")f(can)h(exist)262
+2065 y(where)k(all)e(a)o(v)n(ailable)f(mo)o(v)o(es)h(lead)h(to)g(a)f(loss)i
+(of)e(some)h(sort;)g(whereas)i(if)d(no)h(mo)o(v)o(e)f(w)o(ere)262
+2115 y(made,)c(the)h(loss)h(could)f(b)q(e)h(a)o(v)o(oided.)k(An)11
+b(algorithm)e(using)i(the)h(n)o(ull)e(mo)o(v)o(e)g(to)h(determine)262
+2165 y(threats)k(could)g(therefore)h(o)o(v)o(erlo)q(ok)e(mo)o(v)o(es)f(whic)o
+(h)i(lea)o(v)o(e)f(the)i(opp)q(onen)o(t)f(in)f(zugzw)o(ang.)262
+2214 y(Ho)o(w)o(ev)o(er,)e(zugzw)o(ang)g(is)f(v)o(ery)h(rare)h(and)e(do)q(es)
+i(not)f(cause)g(a)g(signi\014can)o(t)f(problem)g(for)g(the)262
+2264 y(tec)o(hnique.)324 2350 y(Don)j(Beal)h(has)g(done)f(a)h(lot)f(of)g(exp)
+q(erimen)o(tation)g(in)o(to)g(the)h(use)h(of)e(n)o(ull)f(mo)o(v)o(es)h(in)g
+(a)262 2399 y(normal)g Fh(\013\014)20 b Fp(minim)o(ax)14 b(searc)o(h.)28
+b(In)17 b(his)g(pap)q(er)h("Exp)q(erimen)o(ts)f(with)f(the)i(Null)e(Mo)o(v)o
+(e")262 2449 y([5)o(],)i(he)g(prop)q(oses)h(an)f(algorithmic)d(approac)o(h)j
+(to)f(selectiv)o(e)i(searc)o(hing)g(based)f(on)g(n)o(ull)957
+2574 y(29)p eop
+%%Page: 30 32
+30 31 bop 262 653 a Fl(F)l(unction)11 b Fp(Quiescence\(P)17
+b(:)c Fl(p)q(osition)p Fp(;)d Fh(\013)p Fp(,)k Fh(\014)i Fp(:)i
+Fl(in)o(teger)p Fp(\))11 b Fl(returns)j(in)o(teger)262 752
+y(v)m(ar)321 802 y Fp(m)82 b(:)18 b Fl(mo)o(v)o(e)321 852 y
+Fp(score,)321 902 y(b)q(est)44 b(:)18 b Fl(in)o(teger)262 1001
+y(b)q(egin)321 1101 y Fp(/*)13 b Fm(Calculate)h(nul)r(l)h(move)g(sc)n(or)n
+(e.)k(Note)c(:)j(Evaluate)e(may)f(itself)f(b)n(e)h(a)g(se)n(ar)n(ch)e
+Fp(*/)321 1151 y(b)q(est)i(:=)c Ff(\000)p Fp(Ev)n(aluate\(P)m(,)i
+Ff(\000)p Fh(\014)r Fp(,)h Ff(\000)p Fh(\013)p Fp(\))321 1250
+y(GenerateMo)o(v)o(es\(P\))321 1300 y Fl(for)h(eac)o(h)g(mo)o(v)o(e)e
+Fp(m)f Fl(do)380 1350 y(if)g Fp(\(b)q(est)j Ff(\025)d Fh(\014)r
+Fp(\))439 1400 y Fl(return)f Fp(\(b)q(est\))374 b(/*)13 b Fh(\014)18
+b Fm(cut)d(o\013)g(:)k(r)n(eturn)14 b(b)n(est)h(sc)n(or)n(e)e
+Fp(*/)380 1450 y Fl(endif)380 1499 y Fp(/*)g Fm(Se)n(ar)n(ch)i(move)g(m)g(to)
+g(next)g(depth)h(using)f(ne)n(gamax)h(c)n(onvention)f Fp(*/)380
+1549 y(score)g(:=)e Ff(\000)p Fp(Quiescence\()p Fh(P)812 1555
+y Fe(m)847 1549 y Fp(,)g Ff(\000)p Fh(\014)r Fp(,)h Ff(\000)p
+Fp(b)q(est\))380 1599 y Fl(if)e Fp(\(score)k Fh(>)e Fp(b)q(est\))439
+1649 y(b)q(est)h(:=)e(score)391 b(/*)13 b Fm(Stor)n(e)i(b)n(est)f(sc)n(or)n
+(e)h(found)f Fp(*/)380 1699 y Fl(endif)321 1749 y(endfor)321
+1848 y(return)d Fp(\(b)q(est\))492 b(/*)13 b Fm(R)n(eturn)i(sc)n(or)n(e)g(of)
+f(b)n(est)h(move)g(found)g Fp(*/)262 1948 y Fl(end)d Fp(Quiescence)338
+2130 y(Figure)i(3.4:)j(Pseudo)e(co)q(de)g(for)e(a)h(Quiescence)i(searc)o(h)f
+(based)g(on)e(Null)g(Mo)o(v)o(es.)957 2574 y(30)p eop
+%%Page: 31 33
+31 32 bop 262 307 a Fp(mo)o(v)o(es.)15 b(In)c(particular)g(he)g(de\014nes)h
+(a)e(n)o(ull)g(mo)o(v)o(e)f(quiescence)k(searc)o(h)f(whic)o(h)f(is)f(capable)
+h(of)262 357 y("selecting)h(mo)o(v)o(es)e(suc)o(h)i(as)g(c)o(hec)o(ks,)h(mo)o
+(v)o(es)d(out)i(of)f(c)o(hec)o(k,)h(attac)o(ks)g(on)f(pieces,)i(defences,)262
+407 y(blo)q(c)o(ks)j(and)h(other)g(t)o(yp)q(es)h(of)e(sharp)h(tactical)g(mo)o
+(v)o(es)e(that)i(c)o(hess)h(pla)o(y)o(ers)f(concen)o(trate)262
+457 y(on".)g(This)d(is)g(ac)o(hiev)o(ed)g(with)f(no)h(more)f(c)o(hess)i(kno)o
+(wledge)f(than)g(material)e(balance.)324 542 y(Beal)i(uses)g(the)h(score)g
+(returned)g(from)d(a)h(quiescence)j(searc)o(h)f(follo)o(wing)c(a)j(n)o(ull)e
+(mo)o(v)o(e)262 592 y(as)f(a)f(b)q(ound)i(to)e(guide)h(the)h(searc)o(h)g(and)
+f(enable)g(forw)o(ard)g(pruning)g(of)f(inadequate)h(mo)o(v)o(es.)262
+641 y(Beal)j(sho)o(ws)h(that)f(suc)o(h)h(a)f(quiescence)j(searc)o(h)e(is)g
+(capable)f(of)g(a)g(p)q(erformance)g(on)g(Rein-)262 691 y(\014eld's)f(300)h
+(tactical)f(p)q(ositions)h([47)o(],)f(equiv)n(alen)o(t)g(to)h(that)g(of)f
+(the)i(c)o(hess)g(mac)o(hine)e(Belle,)262 741 y(while)g(using)h(only)f(1)p
+Fh(=)p Fp(15th)g(of)g(the)h(e\013ort)h(!)324 826 y(V)m(ery)e(recen)o(tly)m(,)
+g(Hamlen)e([25)o(])i(extended)h(this)f(idea)g(b)o(y)f(applying)g(a)g(full)g
+(width)h(2)f(ply)262 876 y(searc)o(h,)19 b(in)f(addition)f(to)h(the)h(normal)
+d(quiescence)k(searc)o(h,)g(after)e(a)g(n)o(ull)f(mo)o(v)o(e.)29
+b(This)262 926 y(allo)o(w)o(ed)17 b(the)i(algorithm)d(to)i(additionally)f
+(detect)j(tactical)e(plo)o(ys)g(suc)o(h)i(as)e(forks)h(and)262
+976 y(sk)o(ew)o(ers.)24 b(Other)17 b(programs,)d(notably)h(Kaissa)h([1)o(],)f
+(ha)o(v)o(e)g(used)i(the)f(n)o(ull)e(mo)o(v)o(e)g(idea)i(to)262
+1026 y(pro)o(vide)e(faster)g(cut)h(o\013s,)f(without)g(using)g(it)g
+(algorithmical)o(ly)d(to)j(select)h(mo)o(v)o(es)e(as)i(Beal)262
+1075 y(and)e(Hamlen)g(ha)o(v)o(e.)324 1161 y(Beal's)g(n)o(ull)f(mo)o(v)o(e)g
+(quiescence)j(searc)o(h)g(can)e(b)q(e)h(seen)h(in)d(\014gure)i(3.4.)j(It)c
+(is)g(imp)q(ortan)o(t)262 1210 y(to)20 b(realise)h(that)g(Ev)n(aluate)f(ma)o
+(y)f(itself)h(b)q(e)i(a)e(searc)o(h)i(of)e(some)g(kind.)38
+b(In)21 b(fact)g(Beal)262 1260 y(adv)o(o)q(cates)d(the)g(use)h(of)e(a)h(2nd)f
+(lev)o(el)h(n)o(ull)e(mo)o(v)o(e)g(quiescence)k(searc)o(h)f(supp)q(orted)g(b)
+o(y)f(a)262 1310 y(1st)e(lev)o(el)g(quiescence)i(searc)o(h,)f(in)f(place)g
+(of)g(Ev)n(aluate,)f(using)h(material)e(balance)i(as)h(its)262
+1360 y(ev)n(aluation.)262 1512 y Fu(3.1.7)55 b(Razoring)262
+1624 y Fp(Razoring)13 b(is)i(a)g(tec)o(hnique)h(devised)f(b)o(y)g(Birmingham)
+c(and)k(Ken)o(t)h([11)o(].)k(The)c(tec)o(hnique)262 1673 y(uses)i(the)g
+(assumption)e(that)h(a)g(pla)o(y)o(er)g(who)g(has)h(the)g(mo)o(v)o(e)d(can)j
+(alw)o(a)o(ys)e(main)o(tain)f(or)262 1723 y(impro)o(v)o(e)d(his)h(p)q
+(osition)h(b)o(y)f(pla)o(ying)g(a)g(mo)o(v)o(e.)324 1808 y(The)k(tec)o
+(hnique)i(w)o(orks)e(b)o(y)g(using)g(a)g(static)g(ev)n(aluation)f(v)n(alue)h
+(at)g(in)o(terior)g(as)g(w)o(ell)262 1858 y(as)i(terminal)f(no)q(des.)35
+b(This)19 b(v)n(alue)g(is)g(compared)g(to)g(the)h(curren)o(t)h
+Fh(\013)e Fp(v)n(alue)g(with)g(the)262 1908 y(assumption)10
+b(that)h(the)h(opp)q(onen)o(t)g(can)g(alw)o(a)o(ys)e(main)o(tain)f(or)i
+(impro)o(v)o(e)f(his)h(p)q(osition)g(with)262 1958 y(a)g(mo)o(v)o(e.)16
+b(Therefore,)d(the)f(static)h(score)g(is)f(treated)h(as)f(an)f(upp)q(er)i(b)q
+(ound)f(on)g(the)g(p)q(ossible)262 2008 y(scores)j(resulting)f(from)e(the)j
+(opp)q(onen)o(ts)g(a)o(v)n(ailable)d(mo)o(v)o(es.)17 b(Hence,)e(if)e(this)h
+(static)g(v)n(alue)262 2058 y(is)f(no)h(greater)h(than)f(the)h
+Fh(\013)e Fp(v)n(alue,)g(it)h(is)g(assumed)f(that)h(the)h(subtree)h(cannot)e
+(a\013ect)h(the)262 2107 y Fh(\013)g Fp(v)n(alue)h(at)g(this)g(lev)o(el)g
+(and)g(can)g(therefore)i(b)q(e)e(cut)h(o\013.)25 b(Note)16
+b(that)h(this)f(tec)o(hnique)h(is)262 2157 y(only)c(applied)g(from)f(the)j(p)
+q(oin)o(t)e(of)g(view)h(of)f(the)i(pla)o(y)o(er)e(who)h(has)g(just)g(mo)o(v)o
+(ed.)324 2242 y(Figure)h(3.5)e(illustrates)i(the)g(razoring)g(tec)o(hnique)g
+(in)f(action.)20 b(The)15 b(n)o(um)o(b)q(ers)g(to)f(the)262
+2292 y(left)k(of)g(eac)o(h)h(no)q(de)g(represen)o(t)i(the)e(static)g(v)n
+(alues,)h(while)e(the)h(n)o(um)o(b)q(ers)f(to)h(the)g(righ)o(t)262
+2342 y(represen)o(t)e(bac)o(k)o(ed)f(up)f(negamax)f(v)n(alues.)22
+b(No)q(de)15 b(B)h(is)f(examined)f(\014rst)i(giving)e(a)h(static)262
+2392 y(v)n(alue)e(of)h(+7.)21 b(No)q(des)15 b(C)g(and)f(D)g(are)h(then)g
+(searc)o(hed,)h(resulting)f(in)f(v)n(alues)g(of)g Ff(\000)p
+Fp(15)h(and)262 2442 y Ff(\000)p Fp(4)i(resp)q(ectiv)o(ely)m(.)31
+b(A)18 b(v)n(alue)f(of)h(+4)f(using)h(negamax)e(is)i(subsequen)o(tly)h(bac)o
+(k)o(ed)f(up)g(to)957 2574 y(31)p eop
+%%Page: 32 34
+32 33 bop 697 1103 a Fp(Figure)14 b(3.5:)j(Razoring)c(in)h(action.)262
+1236 y(no)q(de)g(B.)g(The)h Fh(\013)f Fp(v)n(alue)f(at)h(this)h(lev)o(el)e
+(is)i(then)f(made)f(equal)h(to)g(+4.)19 b(The)c(mo)o(v)o(e)e(leading)262
+1286 y(to)h(no)q(de)h(E)g(is)g(no)o(w)f(examined)g(and)g(giv)o(en)h(a)f
+(static)h(v)n(alue)f(of)g(+1.)21 b(Using)14 b(the)i(razoring)262
+1335 y(tec)o(hnique,)e(this)g(v)n(alue)f(represen)o(ts)k(an)d(upp)q(er)g(b)q
+(ound,)g(b)q(ecause)i(the)e(opp)q(onen)o(ts)h(mo)o(v)o(es)262
+1385 y(leading)g(to)h(no)q(des)g(F)g(and)g(G)g(are)g(assumed)g(to)g(main)o
+(tain)d(or)j(impro)o(v)o(e)e(the)j(opp)q(onen)o(ts)262 1435
+y(score)g(thereb)o(y)g(decreasing)h(the)e(score)i(at)e(this)g(lev)o(el.)25
+b(As)17 b(the)f(upp)q(er)i(b)q(ound)e(of)g(+1)g(is)262 1485
+y(already)d(less)h(than)f(the)h(curren)o(t)h Fh(\013)d Fp(v)n(alue)h(at)g
+(ply)g(1,)g(no)q(des)h(F)f(and)g(G)g(cannot)h(a\013ect)g(the)262
+1535 y(searc)o(h)h(result)f(and)g(can)g(therefore)h(b)q(e)g(cut)f(o\013)g(b)o
+(y)g(razoring.)324 1620 y(The)19 b(razoring)h(tec)o(hnique)g(can)f(b)q(e)h
+(extended)h(b)o(y)e(using)g(the)h(assumption)e(that)h(a)262
+1670 y(pla)o(y)o(er)f(can)g(impro)o(v)o(e)f(his)h(curren)o(t)i(p)q(osition)e
+(b)o(y)g(pla)o(ying)e(his)j(mo)o(v)o(e,)e(y)o(our)h(mo)o(v)o(e,)g(his)262
+1720 y(mo)o(v)o(e.)29 b(This)18 b(extension)g(of)g(the)h(idea)f(is)g(kno)o
+(wn)f(as)i(deep)g(razoring.)30 b(It)18 b(causes)i(ev)o(en)262
+1769 y(more)12 b(razor)j(cut)f(o\013s,)g(but)g(at)g(a)f(m)o(uc)o(h)g(greater)
+i(risk)f(of)f(cutting)h(out)g(a)g(vital)e(mo)o(v)o(e.)324 1855
+y(Birmingham)h(and)j(Ken)o(t)i(also)e(prop)q(osed)h(a)f(further)i(enhancemen)
+o(t)f(where)h(b)o(y)e(the)262 1904 y(assumption)f(is)h(made)f(that)i(there)g
+(alw)o(a)o(ys)f(exists)h(a)f(mo)o(v)o(e)f(whic)o(h)h(not)g(only)g(impro)o(v)o
+(es)262 1954 y(a)e(pla)o(y)o(ers)h(p)q(osition,)e(but)i(impro)o(v)o(es)e(it)i
+(b)o(y)f(at)h(least)f(3)p Fh(=)p Fp(10ths)h(of)f(a)g(pa)o(wn,)g(for)g
+(example.)262 2004 y(This)e('enhancemen)o(t')f(further)i(increases)h(razored)
+f(cut)g(o\013s,)f(but)g(at)g(the)h(cost)g(of)e(missing)262
+2054 y(p)q(ossibly)i(more)g(vital)g(mo)o(v)o(es.)324 2139 y(I)20
+b(b)q(eliev)o(e)g(the)h(tec)o(hnique)g(w)o(ould)e(b)q(e)i(b)q(etter)g
+(enhanced)h(b)o(y)d(taking)h(an)f(opp)q(osite)262 2189 y(view)14
+b(to)g(the)h(enhancemen)o(t)g(ab)q(o)o(v)o(e.)20 b(F)m(or)14
+b(example,)f(assume)h(that)h(there)g(alw)o(a)o(ys)f(exists)262
+2239 y(a)g(mo)o(v)o(e)g(that)h(will)e(not)i(deteriorate)h(the)g(p)q(osition)e
+(b)o(y)h(more)f(than)h(a)g(threshold,)g(of)g(sa)o(y)262 2289
+y(half)i(a)h(pa)o(wn.)31 b(Di\013eren)o(t)19 b(thresholds)h(could)e(b)q(e)h
+(applied)f(at)g(eac)o(h)h(lev)o(el)f(of)g(the)h(tree,)262 2338
+y(p)q(erhaps)14 b(w)o(eigh)o(ted)f(so)g(that)g(as)g(the)h(searc)o(h)g
+(progresses)h(more)d(deeply)h(do)o(wn)g(the)g(searc)o(h)262
+2388 y(tree,)i(more)e(cut)i(o\013s)f(are)h(made.)i(This)e(enhancemen)o(t)f(w)
+o(ould)g(decrease)i(the)f(n)o(um)o(b)q(er)e(of)262 2438 y(cut)h(o\013s,)g
+(but)g(impro)o(v)o(e)e(the)i(lik)o(eliho)q(o)q(d)f(of)g(including)g(go)q(o)q
+(d)g(mo)o(v)o(es)g(in)g(the)i(searc)o(h)g(tree,)957 2574 y(32)p
+eop
+%%Page: 33 35
+33 34 bop 262 307 a Fp(particularly)13 b(at)g(shallo)o(w)o(er)h(depths)h
+(where)g(missing)d(suc)o(h)i(mo)o(v)o(es)f(can)h(b)q(e)g(fatal.)324
+392 y(I)j(b)q(eliev)o(e)g(the)h(assumption)d(made)h(b)o(y)h(the)h(Razoring)e
+(tec)o(hnique)h(is)g(m)o(uc)o(h)f(w)o(eak)o(er)262 442 y(than)f(that)h(of)f
+(the)i(Null)e(mo)o(v)o(e)f(tec)o(hnique,)i(whic)o(h)g(only)f(assumes)h(that)f
+(it)h(is)f(b)q(etter)j(to)262 492 y(mak)o(e)12 b(a)i(mo)o(v)o(e,)d(than)j(no)
+g(mo)o(v)o(e)e(at)i(all.)262 665 y Fr(3.2)69 b(Ev)l(aluation)262
+791 y Fp(This)11 b(section)h(describ)q(es)i(a)d(n)o(um)o(b)q(er)g(of)g(tec)o
+(hniques)i(for)e(heuristic)i(p)q(ositional)d(ev)n(aluation)262
+841 y(of)j(c)o(hess)j(p)q(ositions.)k(Most)15 b(of)e(these)j(tec)o(hniques)g
+(are)f(b)q(est)h(used)f(in)f(com)o(bination)e(with)262 891
+y(eac)o(h)i(other.)324 976 y(The)g(imp)q(ortance)g(of)f(the)i(ev)n(aluation)d
+(function)i(cannot)h(b)q(e)f(to)q(o)g(highly)f(stressed)k(as)262
+1026 y(it)12 b(is)h(this)g(that)g(giv)o(es)g(a)g(program)e(its)i(distinctiv)o
+(e)g(st)o(yle.)18 b(Ac)o(hieving)13 b(a)g(go)q(o)q(d)f(p)q(osition)h(is)262
+1076 y(often)g(a)h(prelude)h(to)e(a)h(winning)f(tactical)g(com)o(bination.)
+365 1159 y("T)m(actics)h(\015o)o(w)g(from)e(a)h(go)q(o)q(d)h(p)q(osition")970
+1225 y Fm(R)n(ob)n(ert)g(J.)h(Fischer.)262 1377 y Fu(3.2.1)55
+b(Piece)17 b(Square)i(T)-5 b(ables)262 1489 y Fp(Piece)12 b(Square)f
+(\(Pc/Sq\))h(tables)f(are)g(used)h(to)f(hold)f(v)n(alues)h(for)f(pieces)j(o)q
+(ccup)o(ying)d(squares)262 1539 y(on)h(the)h(b)q(oard.)18 b(F)m(or)11
+b(example,)f(a)i(knigh)o(t)f(square)h(table)g(w)o(ould)f(con)o(tain)g(a)h
+(score)h(for)e(eac)o(h)262 1588 y(square)16 b(indicating)e(the)i(merits)e(of)
+h(ha)o(ving)f(a)h(knigh)o(t)f(on)h(that)h(square.)23 b(T)m(ables)15
+b(can)g(b)q(e)262 1638 y(used)g(for)g(eac)o(h)g(t)o(yp)q(e)h(of)e(piece)i
+(and)e(can)h(b)q(e)h(pre-loaded)f(b)q(efore)g(the)h(searc)o(h)g(b)q(egins,)f
+(b)o(y)262 1688 y(doing)i(some)h(preliminary)f(p)q(ositional)g(analysis.)32
+b(Using)19 b(suc)o(h)h(tables,)f(it)g(b)q(ecomes)g(a)262 1738
+y(simple)c(matter)i(to)g(p)q(erform)f(a)h(p)q(ositional)f(ev)n(aluation)g(at)
+h(a)f(giv)o(en)h(no)q(de.)28 b(Giv)o(en)17 b(the)262 1788 y(lo)q(cation)e(of)
+h(eac)o(h)i(piece)f(on)g(the)g(b)q(oard,)g(a)f(v)n(alue)g(can)h(b)q(e)g(lo)q
+(ok)o(ed)f(up)h(in)f(the)i(relev)n(an)o(t)262 1837 y(table)13
+b(and)f(added)i(to)f(the)h(p)q(ositional)d(total)i(for)f(the)i(appropriate)f
+(side,)g(white)h(or)f(blac)o(k.)262 1887 y(Finally)c(the)i(di\013erence)i(b)q
+(et)o(w)o(een)f(the)f(t)o(w)o(o)g(totals)f(is)h(calculated)g(giving)e(an)i(o)
+o(v)o(erall)e(v)n(alue)262 1937 y(for)k(the)i(p)q(osition.)324
+2022 y(The)e(main)e(adv)n(an)o(tage)i(of)f(using)h(these)i(tables)e(is)g(sp)q
+(eed.)20 b(The)13 b(w)o(orlds)g(fastest)h(c)o(hess)262 2072
+y(mac)o(hines,)c(Hitec)o(h)j(and)e(Deep)i(Though)o(t,)e(mak)o(e)g(extensiv)o
+(e)h(use)h(of)e(Pc/Sq)h(tables.)18 b(Ho)o(w-)262 2122 y(ev)o(er,)13
+b(b)q(ecause)h(these)g(tables)f(are)g(generally)g(pre-loaded)f(b)q(efore)i
+(the)f(searc)o(h)h(b)q(egins)f(and)262 2172 y(applied)h(n)h(ply)g(further)h
+(do)o(wn)e(the)i(tree)g(at)f(leaf)g(no)q(des,)g(man)o(y)f(p)q(ositional)f
+(asp)q(ects)k(are)262 2222 y(no)10 b(longer)h(applicable.)16
+b(The)11 b(tables)h(also)e(do)g(not)h(re\015ect)i(up)e(to)g(date)g(piece)h
+(in)o(teractions.)324 2307 y(These)20 b(problems)e(are)h(exasp)q(erated)i(b)o
+(y)d(deep)i(searc)o(hing.)33 b(It)19 b(is)g(therefore)h(ironic)262
+2357 y(that)14 b(the)h(tables)g(are)g(used)h(for)e(the)i(express)g(purp)q
+(ose)g(of)e(deep)h(searc)o(hing)h(due)f(to)f(their)262 2406
+y(e\016ciency)m(.)22 b(It)15 b(is)g(in)o(teresting)h(that)f(the)h(Hitec)o(h)f
+(team)f(at)h(CMU)h(are)f(no)o(w)g(\014nding)g(that)957 2574
+y(33)p eop
+%%Page: 34 36
+34 35 bop 262 307 a Fp(as)14 b(their)h(program)e(impro)o(v)o(es,)g(more)h
+(kno)o(wledge)g(m)o(ust)g(b)q(e)h(migrated)e(from)g(the)i(Pc/Sq)262
+357 y(tables)f(to)f(the)i(leaf)e(no)q(de)h(static)h(ev)n(aluation)d(pro)q
+(cess)k([7)o(].)262 508 y Fu(3.2.2)55 b(Static)18 b(Ev)m(aluation)262
+620 y Fp(In)11 b(most)g(programs,)g(a)g(static)h(ev)n(aluation)f(is)g(p)q
+(erformed)h(at)g(the)g(leaf)f(no)q(des)i(of)e(the)i(main)262
+670 y(searc)o(h.)32 b(In)18 b(full)g(width)g(searc)o(hes,)j(a)d(quiescence)i
+(searc)o(h)g(is)e(usually)f(also)h(applied)g(at)262 720 y(these)f(leaf)e(no)q
+(des,)i(th)o(us)g(creating)f(new)g(leaf)g(no)q(des)g(at)g(a)g(deep)q(er)i
+(lev)o(el)d(whic)o(h)h(are)h(not)262 770 y(usually)c(p)q(ositionally)f(ev)n
+(aluated)h(for)h(e\016ciency)g(reasons.)324 855 y(The)19 b(static)g(ev)n
+(aluation)e(pro)q(cess)j(in)o(v)o(olv)o(es)e(computing)f(the)i(existence)h
+(of)e(v)n(arious)262 905 y(p)q(ositional)11 b(factors.)17 b(Dep)q(ending)c
+(on)f(the)h(degree)h(to)e(whic)o(h)h(these)h(factors)e(exist,)h(appro-)262
+955 y(priate)h(v)n(alues)g(are)h(calculated.)k(Finally)13 b(the)i(v)n(alues)f
+(are)g(w)o(eigh)o(ted)h(according)f(to)g(their)262 1004 y(relativ)o(e)f(imp)q
+(ortance.)324 1090 y(In)20 b(c)o(hess,)j(determining)c(the)i(factors)g(whic)o
+(h)f(con)o(tribute)h(to)f(a)g(go)q(o)q(d)g(p)q(osition)g(is)262
+1139 y(v)o(ery)c(di\016cult.)25 b(Standard)17 b(criteria)g(ha)o(v)o(e)f(b)q
+(een)i(dev)o(elop)q(ed)f(o)o(v)o(er)f(the)h(y)o(ears)g(b)o(y)g(whic)o(h)262
+1189 y(a)f(program)g(can)h(judge)g(a)f(p)q(osition.)27 b(Using)17
+b(suc)o(h)g(criteria)h(curren)o(t)g(programs)e(pla)o(y)g(a)262
+1239 y(reasonable)d(game.)k(Ho)o(w)o(ev)o(er,)c(it)h(is)f(still)f(clear)i
+(from)e(their)i(p)q(ositional)e(pla)o(y)m(,)g(that)h(some)262
+1289 y(subtle)j(factors)g(are)h(still)e(not)h(b)q(eing)f(included.)25
+b(I)16 b(will)e(try)i(to)g(unco)o(v)o(er)h(some)e(of)g(these)262
+1339 y(in)h(the)h(next)g(c)o(hapter.)27 b(The)17 b(most)e(di\016cult)h(task)h
+(remains)e(determining)h(the)h(relativ)o(e)262 1389 y(imp)q(ortance)c(of)g
+(eac)o(h)i(factor)f(or)f(criterion.)19 b(An)14 b(attempt)g(w)o(as)f(made)g
+(to)h(determine)g(the)262 1438 y(relativ)o(e)f(imp)q(ortance)g(of)h(a)f(n)o
+(um)o(b)q(er)g(of)h(ev)n(aluation)e(criteria)i(in)g([51)o(].)k(I)13
+b(think)h(the)g(basic)262 1488 y(idea)9 b(of)h(this)g(researc)o(h)i(is)e(an)g
+(excellen)o(t)h(one,)g(ho)o(w)o(ev)o(er,)f(I)h(feel)f(the)h(sp)q(eci\014c)g
+(order)g(in)f(whic)o(h)262 1538 y(the)k(ev)n(aluation)e(criteria)j(w)o(ere)g
+(tested,)g(in\015uenced)g(the)f(result)h(of)e(the)h(exp)q(erimen)o(ts.)324
+1623 y(Sev)o(eral)e(attempts)g(ha)o(v)o(e)g(b)q(een)i(made)d(to)h(generate)h
+(a)f('b)q(est)h(\014t')f(ev)n(aluation)f(function)262 1673
+y([27)o(,)i(39].)19 b(Most)c(of)f(these)h(studies)h(are)f(based)g(on)f(an)g
+(analysis)g(of)g(grandmaster)f(mo)o(v)o(es.)262 1723 y(The)g(ob)r(jectiv)o(e)
+h(is)f(to)g(\014nd)h(a)f(function)g(whic)o(h)g(selects)i(grandmaster)e(mo)o
+(v)o(es)f(as)h(often)h(as)262 1773 y(p)q(ossible.)j(Suc)o(h)11
+b(attempts)f(ha)o(v)o(e)h(hit)f(serious)h(problems)f(b)q(ecause,)j(as)e(I)f
+(see)i(it,)f(5)f(problem)262 1823 y(areas)k(exist:)312 1904
+y(1.)20 b(A)c(b)q(est)h(\014t)f(can)g(only)e(b)q(e)j(attempted)e(for)h(the)g
+(kno)o(wn)f(functions.)24 b(If)15 b(a)g(program)365 1954 y(do)q(es)d(not)e
+(kno)o(w)g(ab)q(out)h(a)f(particular)h(asp)q(ect)h(of)e(c)o(hess,)i(for)e
+(example)g(w)o(eak)g(pa)o(wns,)365 2003 y(it)j(cannot)g(include)g(suc)o(h)g
+(considerations)h(in)e(its)h(ev)n(aluation)e(pro)q(cess.)20
+b(Therefore,)365 2053 y(p)q(ossibly)14 b(in)o(tro)q(ducing)f(side)i
+(e\013ects)h(in)o(to)d(existing)g(functions.)312 2135 y(2.)20
+b(The)c(criteria)g(b)o(y)g(whic)o(h)f(a)h(h)o(uman)e(c)o(hess)j(pla)o(y)o(er)
+e(ev)n(aluates)h(a)g(p)q(osition)f(are)h(not)365 2185 y(m)o(utually)11
+b(exclusiv)o(e,)j(but)f(subtly)h(link)o(ed.)j(Iden)o(tifying)c(these)i(links)
+d(is)i(v)o(ery)g(di\016-)365 2235 y(cult.)312 2317 y(3.)20
+b(So)11 b(m)o(uc)o(h)g(dep)q(ends)i(on)e(the)h(phase)g(of)f(the)h(game)e
+(e.g.)17 b(middle)9 b(game)h(or)i(end)g(game,)365 2367 y(that)i(I)g(b)q
+(eliev)o(e)g(sp)q(eci\014c)i(functions)e(are)g(required)h(for)e(eac)o(h)i
+(game)d(phase.)312 2449 y(4.)20 b(P)o(ositionally)12 b(mo)o(v)o(es)h(v)n(ary)
+g(with)h(pla)o(y)o(er)f(st)o(yle)h(and)g(mo)q(o)q(d.)957 2574
+y(34)p eop
+%%Page: 35 37
+35 36 bop 312 307 a Fp(5.)20 b(Some)e(mo)o(v)o(es)f(are)i(tactically)f
+(conditioned.)33 b(Suc)o(h)19 b(mo)o(v)o(es)e(m)o(ust)h(b)q(e)h(iden)o
+(ti\014ed)365 357 y(b)q(ecause)d(they)e(a\013ect)h(the)g(p)q(ositional)d(c)o
+(hoice)i(a)o(v)n(ailable.)262 440 y(Ob)o(viously)e(this)i(area)f(w)o(ould)g
+(b)q(ene\014t)i(from)c(more)i(in)o(v)o(olv)o(emen)o(t)e(b)o(y)i(strong)h(c)o
+(hess)h(pla)o(y-)262 490 y(ers.)324 575 y(In)f(practice,)i(static)f(ev)n
+(aluation)e(functions)h(tend)i(to)e(b)q(e)h(primitiv)o(e,)d(particularly)i
+(in)262 625 y(brute)j(force)g(programs,)f(to)g(enable)h(deep)h(searc)o(hing.)
+26 b(Pc/Sq)17 b(tables)g(are)g(used)g(where)262 675 y(p)q(ossible)11
+b(to)g(impro)o(v)o(e)f(e\016ciency)m(.)17 b(Information)9 b(whic)o(h)i
+(cannot)h(b)q(e)g(stored)g(in)f(the)h(tables,)262 725 y(suc)o(h)k(as)g
+(pinned)g(piece)h(information,)c(m)o(ust)i(b)q(e)h(calculated.)24
+b(The)16 b(ev)n(aluation)f(pro)q(cess)262 774 y(can)j(b)q(e)h(supp)q(orted)h
+(b)o(y)e(sp)q(eci\014c)i(hash)e(tables)h(e.g.)31 b(pa)o(wn)18
+b(structure)j(hashing.)31 b(This)262 824 y(enables)15 b(m)o(uc)o(h)f(faster)i
+(ev)n(aluation)e(b)q(ecause)j(calculations)d(do)h(not)g(ha)o(v)o(e)g(to)g(b)q
+(e)h(re-done)262 874 y(when)d(p)q(ositions)g(with)g(iden)o(tical)g(pa)o(wn)g
+(structure,)i(for)e(example,)f(are)i(encoun)o(tered.)20 b(In)262
+924 y(selectiv)o(e)12 b(searc)o(h)h(programs)d(the)j(ev)n(aluation)d(pro)q
+(cess)j(can)f(b)q(e)g(far)f(more)g(complex)f(as)i(the)262 974
+y(reduced)j(n)o(um)o(b)q(er)d(of)h(no)q(des)i(examined)d(allo)o(ws)g(more)g
+(time)h(to)g(b)q(e)h(sp)q(en)o(t)g(at)g(eac)o(h)g(no)q(de.)262
+1023 y(The)j(di\016cult)o(y)f(here)j(is)e(that)g(kno)o(wledge)g(de\014ciency)
+i(cannot)e(b)q(e)h(easily)f(made)f(up)h(b)o(y)262 1073 y(searc)o(hing.)g
+(Therefore,)d(c)o(hess)f(kno)o(wledge)f(acquisition)f(from)f(grandmasters)i
+(m)o(ust)f(pla)o(y)262 1123 y(a)f(vital)g(role)h(in)f(suc)o(h)i(programs.)j
+(A)o(t)c(the)h(presen)o(t)g(time,)e(tec)o(hniques)i(do)f(not)f(exist)i(whic)o
+(h)262 1173 y(w)o(ould)i(allo)o(w)g(grandmaster)h(though)o(t)g(pro)q(cesses)j
+(to)d(b)q(e)h(captured)h(and)e(understo)q(o)q(d)i(in)262 1223
+y(detail,)12 b(let)i(alone,)f(allo)o(w)f(suc)o(h)j(kno)o(wledge)f(to)f(b)q(e)
+i(transferred)h(to)d(the)i(mac)o(hine.)324 1308 y(It)f(should)h(b)q(e)g
+(realised)g(that)f(static)h(ev)n(aluation)e(is)h(not)h(adequate)g(in)f
+(dynamic)e(tac-)262 1358 y(tical)18 b(situations.)33 b(Suc)o(h)20
+b(tactical)f(problems)f(are)h(b)q(etter)i(resolv)o(ed)f(b)o(y)e(some)h(kind)f
+(of)262 1408 y(quiescence)i(searc)o(h.)32 b(I)18 b(b)q(eliev)o(e)h(it)f(is)g
+(the)h(job)f(of)f(the)i(static)g(ev)n(aluation)e(function)h(to)262
+1457 y(realise)13 b(when)g(a)g(p)q(osition)f(is)h(unsuitable)f(for)h(static)g
+(ev)n(aluation)f(and)g(inform)f(the)i(searc)o(h)262 1507 y(pro)q(cess,)i(so)f
+(it)f(can)h(attempt)f(to)h(resolv)o(e)h(the)f(tactical)g(uncertain)o(t)o(y)m
+(.)262 1659 y Fu(3.2.3)55 b(Incremen)n(tal)16 b(Ev)m(aluation)262
+1771 y Fp(Static)e(ev)n(aluation)f(at)i(leaf)e(no)q(des)j(is)e(exp)q(ensiv)o
+(e)i(in)e(terms)g(of)g(time;)f(and)h(Pc/Sq)h(tables)262 1821
+y(do)e(not)h(re\015ect)h(the)g(true)g(merits)e(of)g(a)g(p)q(osition,)g(esp)q
+(ecially)h(as)g(the)h(searc)o(h)f(deep)q(ens.)21 b(A)262 1870
+y(third)12 b(option)g(is)h(a)o(v)n(ailable,)d(that)j(of)g(incremen)o(tally)e
+(up)q(dating)h(the)i(p)q(ositional)d(totals)i(as)262 1920 y(mo)o(v)o(es)f
+(are)i(made.)j(The)e(p)q(ositional)d(totals)i(could)f(b)q(e)i(up)q(dated)f
+(as)g(follo)o(ws:)312 2003 y(1.)20 b(Calculate)9 b(the)h(p)q(ositional)e(v)n
+(alue,)h(for)g(the)h(piece)g(just)g(mo)o(v)o(ed,)e(on)h(its)g(from{square.)
+312 2086 y(2.)20 b(Decremen)o(t)15 b(this)e(v)n(alue)h(from)e(the)i(p)q
+(ositional)f(total)g(for)h(the)g(relev)n(an)o(t)g(side.)312
+2169 y(3.)20 b(Calculate)14 b(the)g(p)q(ositional)e(v)n(alue,)h(for)h(the)g
+(piece)h(just)f(mo)o(v)o(ed,)d(on)j(its)g(to{square.)312 2252
+y(4.)20 b(Incremen)o(t)14 b(this)g(new)h(v)n(alue)e(to)h(the)g(p)q(ositional)
+f(total)g(for)g(the)i(relev)n(an)o(t)f(side.)262 2335 y(This)e(pro)q(cess)i
+(is)e(quite)g(simple)f(and)h(therefore)i(fast,)e(but)h(do)q(es)g(not)f(tak)o
+(e)g(accoun)o(t)h(of)f(the)262 2385 y(e\013ects)j(mo)o(ving)10
+b(a)j(piece)i(ma)o(y)c(ha)o(v)o(e)i(on)g(the)h(p)q(ositional)e(v)n(alue)g(of)
+h(the)h(pieces)g(around)f(it.)262 2435 y(F)m(or)g(example,)f(mo)o(ving)f(a)j
+(piece)h(ma)o(y)c(rev)o(eal)j(or)g(blo)q(c)o(k)g(a)f(n)o(um)o(b)q(er)g(of)h
+(p)q(ossible)g(attac)o(ks.)957 2574 y(35)p eop
+%%Page: 36 38
+36 37 bop 262 307 a Fp(Therefore,)13 b(if)g(the)g(pro)q(cess)i(is)e(to)f(b)q
+(e)i(truly)f(incremen)o(tal)f(it)g(m)o(ust)g(tak)o(e)h(accoun)o(t)h(of)e(suc)
+o(h)262 357 y(factors.)18 b(Ho)o(w)o(ev)o(er,)12 b(suc)o(h)i(a)e(detailed)h
+(incremen)o(tal)f(ev)n(aluation)f(will)g(b)q(e)j(costly)f(in)f(terms)262
+407 y(of)h(time,)f(p)q(erhaps)j(prohibitiv)o(ely)d(so.)324
+492 y(In)i(practice)h(incremen)o(tal)e(ev)n(aluation)f(is)i(used)h(in)e
+(conjunction)h(with)g(a)f(static)h(ev)n(al-)262 542 y(uation)i(at)h(the)h
+(horizon)f(no)q(des)i(of)d(the)i(main)e(searc)o(h.)29 b(Incremen)o(tal)17
+b(ev)n(aluations)f(can)262 592 y(also)e(b)q(e)h(useful)h(during)e(a)h
+(quiescence)i(searc)o(h)f(where)g(there)h(is)e(not)f(enough)i(time)d(for)i(a)
+262 641 y(full)f(static)i(ev)n(aluation.)23 b(This)16 b(is)g(b)q(ecause)h(a)f
+(quiescence)i(searc)o(h)f(also,)e(usually)g(o)q(ccurs)262 691
+y(at)e(the)i(horizon)e(no)q(des)i(of)e(the)i(main)d(searc)o(h.)324
+777 y(The)20 b(Pc/Sq)h(tables)f(explained)g(earlier)g(can)g(also)g(b)q
+(ene\014t)h(from)e(an)h(incremen)o(tal)262 826 y(approac)o(h,)13
+b(to)h(close)g(the)h(gap)e(b)q(et)o(w)o(een)i(kno)o(wledge)f(storage)g(and)g
+(application.)262 976 y Fu(3.2.4)55 b(Phases)19 b(of)g(Pla)n(y)262
+1088 y Fp(The)14 b(game)e(of)i(c)o(hess)h(consists)g(of)e(3)h(main)d(game)i
+(phases:)324 1163 y Ff(\017)20 b Fp(The)15 b(Op)q(ening.)324
+1242 y Ff(\017)20 b Fp(The)15 b(Middle)e(game.)324 1321 y Ff(\017)20
+b Fp(The)15 b(Endgame.)262 1396 y(Di\013eren)o(t)22 b(ev)n(aluation)f
+(criteria)h(are)g(applicable)f(at)h(di\013eren)o(t)h(phases)g(of)e(the)i
+(game.)262 1446 y(Therefore,)f(it)e(is)g(imp)q(ortan)o(t)f(for)g(a)h(c)o
+(hess)i(program)d(to)h(recognise)h(what)f(phase)h(the)262 1496
+y(game)12 b(is)i(in,)f(so)h(the)g(correct)i(ev)n(aluation)c(criteria)i(or)g
+(w)o(eigh)o(tings)f(can)h(b)q(e)h(applied.)324 1581 y(In)i(practice)i(the)f
+(game)e(phases)i(need)h(to)e(b)q(e)h(brok)o(en)g(do)o(wn)f(in)o(to)g(more)f
+(detail,)i(so)262 1631 y(that)e(the)g(transition)g(b)q(et)o(w)o(een)i(phases)
+f(is)f(not)g(large.)24 b(If)16 b(this)g(is)g(not)g(done,)h(there)g(will)262
+1681 y(b)q(e)e(cli\013s)f(in)h(the)g(ev)n(aluation)e(surface)j(where)f(a)g
+(program)e(suddenly)i(b)q(ecomes)g(a)o(w)o(are)f(of)262 1731
+y(some)f(asp)q(ect)k(of)d(the)h(p)q(osition.)20 b(F)m(or)14
+b(example,)g(early)g(in)h(the)g(game)e(the)j(king)e(needs)i(to)262
+1781 y(sta)o(y)c(near)i(the)f(edge)h(of)e(the)i(b)q(oard)f(protected)i(b)o(y)
+d(its)h(pieces.)19 b(As)14 b(the)f(game)f(progresses)262 1830
+y(ho)o(w)o(ev)o(er,)h(the)h(king)f(should)g(b)q(egin)h(to)f(b)q(e)i(mo)o(v)o
+(ed)d(to)h(an)g(activ)o(e)h(p)q(osition)f(ready)h(for)f(the)262
+1880 y(endgame.)j(If)11 b(this)g(pro)q(cess)j(is)d(not)g(p)q(erformed)g
+(gradually)m(,)f(the)i(program)e(ma)o(y)f(\014nd)j(itself)262
+1930 y(in)f(an)h(endgame)g(with)g(its)g(king)f(misplaced,)g(and)h(a)g(sudden)
+h(realisation)f(that)g(things)g(are)262 1980 y(not)f(as)h(go)q(o)q(d)f(as)h
+(predicted)h(b)o(y)f(the)g(ev)n(aluation)f(function)g(at)h(the)g(previous)g
+(game)e(phase.)324 2065 y(Assume,)15 b(for)g(example,)e(w)o(e)j(ha)o(v)o(e)f
+(8)f(game)g(phases,)i(then)g(new)g(ev)n(aluation)d(criteria)262
+2115 y(could)g(b)q(e)g(in)o(tro)q(duced)h(gen)o(tly)m(,)e(or)i(existing)f
+(criteria)g(could)g(b)q(e)h(scaled)g(according)f(to)g(the)262
+2165 y(phase.)324 2250 y(The)h(game)e(phase)j(is)e(a)h(factor)f(of)g(the)i
+(material)d(remaining)f(on)j(the)g(b)q(oard)g(and)f(can)262
+2300 y(therefore)f(b)q(e)f(easily)f(calculated,)h(although)f(deciding)h(when)
+g(one)g(phase)g(should)g(end)g(and)262 2350 y(another)i(should)g(start)h(is)f
+(more)g(di\016cult.)k(This)c(recognition)g(of)g(the)h(game)e(phase)i(m)o(ust)
+262 2399 y(also)e(include)h(realising)f(when)i(p)q(ositional)d(factors)j(can)
+f(b)q(e)h(ignored)e(and)h(the)h(opp)q(onen)o(ts)262 2449 y(king)f(can)h(b)q
+(e)g(driv)o(en)g(to)g(c)o(hec)o(kmate.)957 2574 y(36)p eop
+%%Page: 37 39
+37 38 bop 324 307 a Fp(The)14 b(game)f(phase)i(can)f(also)f(b)q(e)i(used)g
+(to)f(encourage)h(the)f(program)f(to)h(trade)g(pieces)262 357
+y(when)g(ahead)g(in)f(material.)262 509 y Fu(3.2.5)55 b(Planning)262
+621 y Fp(Planning)19 b(pla)o(ys)h(an)g(imp)q(ortan)o(t)f(role)i(in)f(h)o
+(uman)e(c)o(hess.)40 b(It)21 b(could)f(b)q(e)h(said)f(that)h(a)262
+670 y(program)d(is)i(con)o(tin)o(ually)f(planning)f(to)i(maximi)o(se)e(its)i
+(ev)n(aluation)f(function's)h(score.)262 720 y(Ho)o(w)o(ev)o(er,)c(this)g
+(often)g(leads)g(to)g(aimless)e(pla)o(y)m(,)h(w)o(aiting)f(for)i(the)g(opp)q
+(onen)o(t)h(to)e(mak)o(e)g(a)262 770 y(mistak)o(e.)324 855
+y(A)20 b(plan)f(could)h(b)q(e)g(conceiv)o(ed)h(at)e(the)i(ro)q(ot)f(of)f(the)
+h(tree)h(b)o(y)f(an)g(analysis)f(of)g(the)262 905 y(p)q(osition.)29
+b(Sp)q(eci\014c)19 b(goals)d(can)j(b)q(e)f(iden)o(ti\014ed,)g(suc)o(h)h(as)f
+(a)f(king)g(side)h(pa)o(wn)g(rush,)h(for)262 955 y(example.)d(The)f(relev)n
+(an)o(t)f(Pc/Sq)g(tables)g(and)g(static)h(ev)n(aluation)d(criteria)i(can)h(b)
+q(e)f(giv)o(en)262 1005 y(w)o(eigh)o(tings)c(to)h(encourage)h(ac)o(hiev)o
+(emen)o(t)f(of)f(these)j(goals.)j(F)m(or)11 b(example,)f(increasing)h(the)262
+1055 y(b)q(on)o(us)k(for)g(pushing)h(pa)o(wns)f(on)h(the)g(king)e(side.)23
+b(The)16 b(subsequen)o(t)i(searc)o(h)e(w)o(ould)f(then)262
+1104 y(b)q(e)h(biased)f(to)o(w)o(ards)h(selecting)g(mo)o(v)o(es)e(whic)o(h)h
+(ac)o(hiev)o(e)h(these)h('sub{goals'.)k(T)m(o)15 b(further)262
+1154 y(encourage)20 b(the)g(use)g(of)e(a)h(consisten)o(t)i(plan,)e(the)h
+(principle)f(v)n(ariation)f(from)f(the)j(last)262 1204 y(searc)o(h)15
+b(can)g(b)q(e)g(used)h(to)e(direct)h(the)h(curren)o(t)g(searc)o(h.)21
+b(Deviations)14 b(only)f(b)q(eing)i(allo)o(w)o(ed)262 1254
+y(when)f(they)g(are)h(clearly)e(sup)q(erior.)324 1339 y(Chess)k(programs)e
+(generally)h(ha)o(v)o(e)f(no)h(problem)f(in)g(\014nding)h(the)h(correct)g(mo)
+o(v)o(es)e(of)262 1389 y(com)o(binations)i(leading)i(to)g(a)h(gain)e(in)i
+(material.)33 b(Ho)o(w)o(ev)o(er,)21 b(they)f(\014nd)g(it)f(far)h(more)262
+1439 y(di\016cult)13 b(to)g(create)j(p)q(ositions)d(where)i(suc)o(h)g(com)o
+(binations)d(exist.)262 1611 y Fr(3.3)69 b(Learning)262 1738
+y Fp(The)14 b(Learning)g(pro)q(cess)h(can)f(b)q(e)h(split)e(in)o(to)g(5)h
+(main)e(categories:)324 1821 y Ff(\017)20 b Fp(Rote)14 b(Learning.)324
+1904 y Ff(\017)20 b Fp(Advice)15 b(T)m(aking.)324 1987 y Ff(\017)20
+b Fp(Induction.)324 2070 y Ff(\017)g Fp(Learning)14 b(b)o(y)g(Analogy)m(.)324
+2153 y Ff(\017)20 b Fp(P)o(arameter)14 b(Adjustmen)o(t.)262
+2236 y(The)e(\014rst)h(four)f(categories)h(are)g(directly)g(related)g(to)f
+(the)h(w)o(a)o(y)e(h)o(umans)g(learn.)18 b(The)12 b(\014nal)262
+2286 y(category)f(is)g(deriv)o(ed)g(more)f(from)f(the)i(w)o(a)o(y)g(programs)
+e(mak)o(e)h(decisions)h(than)g(the)g(h)o(uman)262 2336 y(learning)i(pro)q
+(cess.)957 2574 y(37)p eop
+%%Page: 38 40
+38 39 bop 262 307 a Fu(3.3.1)55 b(Rote)18 b(Learning)262 419
+y Fp(This)12 b(is)h(the)g(simplest)e(form)g(of)h(mac)o(hine)g(learning.)17
+b(It)12 b(in)o(v)o(olv)o(es)g(the)h(recording)g(of)f(data,)262
+469 y(and)h(use)i(of)e(that)h(same)f(data)h(when)g(faced)g(with)g(exactly)g
+(the)g(same)f(situation)h(again.)324 554 y(Most)i(c)o(hess)h(programs)e(use)i
+(what)e(is)h(kno)o(wn)f(as)h(an)g("Op)q(ening)g(Bo)q(ok".)23
+b(This)16 b(is)g(a)262 604 y(database)i(of)g(pre-stored)h(op)q(ening)f(lines)
+h(of)e(pla)o(y)g(whic)o(h)i(are)f(lo)q(ok)o(ed)g(up)g(and)g(pla)o(y)o(ed)262
+654 y(automatically)12 b(while)k(the)g(t)o(w)o(o)g(pla)o(y)o(ers)g(stic)o(k)g
+(to)g(the)h(stored)g(op)q(ening)e(line)h(of)f(mo)o(v)o(es.)262
+704 y(In)h(more)g(sophisticated)i(c)o(hess)g(programs,)e(p)q(ositions)h(and)g
+(mo)o(v)o(es)e(are)j(stored,)g(rather)262 754 y(than)c(lines)h(of)g(mo)o(v)o
+(es.)20 b(This)15 b(enables)g(a)g(transp)q(osition)g(of)f(mo)o(v)o(es)g(to)h
+(b)q(e)h(detected)h(and)262 803 y(allo)o(ws)11 b(mo)o(v)o(es)f(to)j(b)q(e)f
+(pla)o(y)o(ed)g(whenev)o(er)i(a)e('kno)o(wn')f(p)q(osition)g(is)h(reac)o
+(hed.)19 b(The)13 b(op)q(ening)262 853 y(b)q(o)q(ok)i(is)g(v)o(ery)g(useful)h
+(for)f(a)o(v)o(oiding)e(op)q(ening)i(traps,)h(sa)o(ving)e(time)g(and)h
+(making)e(mo)o(v)o(es)262 903 y(of)h(a)h(v)o(ery)g(high)g(standard)g(whic)o
+(h)g(ha)o(v)o(e)g(y)o(ears)h(of)f(theory)g(and)g(practice)h(b)q(ehind)g
+(them.)262 953 y(Ob)o(viously)i(this)i(tec)o(hnique)g(can)f(only)g(co)o(v)o
+(er)h(the)g(\014rst)g(few)f(mo)o(v)o(es)f(of)h(a)g(game,)g(an)o(y)262
+1003 y(deviation)13 b(causing)g(the)i(program)d(to)i('think')e(for)i(itself.)
+324 1088 y(V)m(arious)i(endgame)f(databases)i(ha)o(v)o(e)f(also)g(b)q(een)i
+(created)g(for)e(elemen)o(tary)f(endings)262 1138 y(suc)o(h)g(as)f(king)g
+(and)g(pa)o(wn)h(against)e(king.)20 b(When)14 b(database)h(p)q(ositions)f
+(are)h(reac)o(hed)h(the)262 1187 y(program)f(can)i(simply)e(lo)q(ok)i(up)g
+(the)h(correct)g(mo)o(v)o(e)e(and)h(pla)o(y)f(it.)28 b(I)17
+b(b)q(eliev)o(e)g(for)g(suc)o(h)262 1237 y(simple)12 b(endings,)i(heuristics)
+i(can)e(b)q(e)h(dev)o(elop)q(ed)g(whic)o(h)f(will)e(allo)o(w)h(correct)j(pla)
+o(y)d(using)262 1287 y(searc)o(h)i(rather)f(than)g(massiv)o(e)f(storage.)324
+1372 y(A)h(more)e(v)o(ersatile)i(tec)o(hnique)h(has)f(b)q(een)g(suggested)i
+(b)o(y)d(Da)o(vid)f(Slate)i([58)o(])f(of)g(Chess)262 1422 y(4.5)h(fame.)20
+b(Slate)15 b(suggests)h(a)f(metho)q(d)f(b)o(y)h(whic)o(h)g(a)g(transp)q
+(osition)g(table)g(can)g(b)q(e)h(used)262 1472 y(to)d(enable)g(a)g(c)o(hess)i
+(program)d(to)h(learn)g(from)f(its)h(exp)q(erience.)20 b(The)14
+b(idea)f(b)q(eing)g(to)h(store)262 1522 y(p)q(ositions)e(where)h(the)h
+(program's)c(ev)n(aluation)i(c)o(hanges)h(dramatically)m(.)h(This)f(allo)o
+(ws)e(the)262 1572 y(program)h(to)j(a)o(v)o(oid)e(falling)f(in)o(to)i(the)h
+(same)f(trap)g(again.)19 b(This)14 b(is)h(of)e(most)h(use)h(in)f(non{)262
+1621 y(b)q(o)q(ok)i(op)q(ening)h(p)q(ositions)g(whic)o(h)f(ma)o(y)f(b)q(e)j
+(encoun)o(tered)h(in)d(another)i(game.)26 b(Fidelit)o(y)262
+1671 y(Electronics)14 b(are)f(using)g(a)f(similar)f(tec)o(hnique)i(in)g(one)g
+(of)f(their)i(latest)f(commercial)d(c)o(hess)262 1721 y(mac)o(hines)i([21].)
+262 1873 y Fu(3.3.2)55 b(Advice)18 b(T)-5 b(aking)262 1985
+y Fp(Advice)16 b(taking)f(c)o(hess)i(programs)e(require)h(the)h(gap)e(b)q(et)
+o(w)o(een)i(the)g(programmi)o(ng)c(lev)o(el)262 2035 y(and)e(a)h(c)o(hess)i
+(masters)e(kno)o(wledge)g(to)f(b)q(e)i(bridged)f(b)o(y)g(some)f(high)h(lev)o
+(el)f(c)o(hess)j(language.)324 2120 y(Most)c(notably)g(Zobrist)g(and)g
+(Carlson)g([64)o(])g(dev)o(elop)q(ed)g(suc)o(h)h(a)f(t)o(yp)q(e)h(of)e
+(advice)h(taking)262 2170 y(program.)15 b(The)e(program)e(w)o(as)h(tutored)h
+(b)o(y)g(Charles)f(Kalme,)f(a)h(US)h(Senior)f(Chess)i(Mas-)262
+2219 y(ter.)22 b(The)15 b('Chess)h(Language')e(used)i(w)o(as)f(relativ)o(ely)
+g(sophisticated,)g(but)h(still)e(required)262 2269 y(mathematical)f(w)o(eigh)
+o(ts)18 b(to)f(b)q(e)g(assigned)h(to)f(patterns.)29 b(Ho)o(w)o(ev)o(er,)18
+b(c)o(hess)h(masters)e(do)262 2319 y(not)d(consciously)h(conceptualise)h(p)q
+(ositions)f(in)f(this)h(w)o(a)o(y)m(.)20 b(Therefore,)c(the)g(advice)f(that)
+262 2369 y(can)f(b)q(e)g(giv)o(en)g(is)f(somewhat)g(di\016cult)g(to)h(assign)
+g(discrete)h(w)o(eigh)o(tings)f(to.)957 2574 y(38)p eop
+%%Page: 39 41
+39 40 bop 324 307 a Fp(The)21 b(program)d(only)i(con)o(tained)g(50)g
+(patterns.)39 b(Researc)o(h)22 b(done)e(b)o(y)g(Simon)f(and)262
+357 y(Gilmarti)o(n)13 b([55)o(])j(indicates)g(that)g(a)f(grandmaster)h(has)g
+(a)f(v)o(o)q(cabulary)g(of)h(ab)q(out)f(50,000)262 407 y(c)o(hess)i
+(patterns.)26 b(Therefore,)17 b(it)f(is)g(not)g(surprising)g(that)h(Zobrist)f
+(and)g(Carlson's)g(pro-)262 457 y(gram)c(only)h(p)q(erformed)g(at)h(the)h(no)
+o(vice)e(lev)o(el.)262 608 y Fu(3.3.3)55 b(Induction)262 720
+y Fp(A)10 b(n)o(um)o(b)q(er)g(of)g(attempts)g(ha)o(v)o(e)g(b)q(een)i(made)d
+(to)h(use)i(induction)e(in)g(c)o(hess)i(programs.)j(Most)262
+770 y(in)o(v)o(olv)o(ed)f(the)j(narro)o(w)f(domain)e(of)i(simple)f(endings)h
+(suc)o(h)h(as)g(king)e(and)h(pa)o(wn)g(against)262 820 y(king)11
+b([54)o(].)17 b(Giv)o(en)12 b(a)g(relativ)o(ely)g(large)g(n)o(um)o(b)q(er)g
+(of)g(training)f(ev)o(en)o(ts,)j(suc)o(h)f(programs)e(are)262
+870 y(able)16 b(to)g(use)i(induction)e(on)g(a)g(set)i(of)e(kno)o(wn)g
+(predicates)i(in)e(order)h(to)g(deriv)o(e)g(a)f(set)h(of)262
+919 y(form)o(ulas.)e(The)d(programs)f(are)h(then)h(able)f(to)f(deal)h(with)g
+(suc)o(h)g(endings)h(with)e(80)h(to)g(90\045)262 969 y(success.)21
+b(Ho)o(w)o(ev)o(er,)15 b(a)f(10)g(to)g(20\045)f(lev)o(el)i(of)e(incorrect)j
+(pla)o(y)m(,)d(esp)q(ecially)h(in)g(suc)o(h)h(simple)262 1019
+y(endings,)e(is)h(not)g(adequate)g(in)g(tournamen)o(t)f(programs.)324
+1104 y(Stev)o(en)f(Skiena)g(states)h(in)e([57)o(],)g("When)h(more)f(complex)f
+(endgames)h(are)i(considered,)262 1154 y(increasingly)19 b(larger)i(n)o(um)o
+(b)q(er)e(of)h(predicates)h(will)e(b)q(e)i(needed,)i(un)o(til)c(forms)g(of)h
+(con-)262 1204 y(structiv)o(e)d(induction)e(or)h(feature)h(formation)c(are)j
+(necessary)m(.)26 b(Systems)16 b(for)f(signi\014can)o(t)262
+1254 y(constructiv)o(e)g(induction)e(simply)f(do)i(not)g(exist.".)262
+1405 y Fu(3.3.4)55 b(Learning)18 b(b)n(y)g(Analogy)262 1517
+y Fp(Learning)10 b(b)o(y)g(analogy)e(is)j(probably)e(the)i(most)e(p)q(o)o(w)o
+(erful)h(metho)q(d)g(applicable)f(to)h(pla)o(ying)262 1567
+y(c)o(hess.)19 b(Unfortunately)14 b(it)f(is)h(also)f(v)o(ery)i(di\016cult)e
+(to)g(ac)o(hiev)o(e)i(on)e(a)h(mac)o(hine.)324 1652 y(It)h(has)f(b)q(een)i
+(found)e(b)o(y)h(de)g(Gro)q(ot)f([16)o(])h(that)f(grandmasters)h(notice)g
+(similarities)d(in)262 1702 y(piece)20 b(placemen)o(t,)f(square)h(con)o(trol)
+e(and)h(pressure.)36 b(These)21 b(concepts)g(are)e(kno)o(wn)g(to)262
+1752 y(strong)14 b(pla)o(y)o(ers)g(in)g(the)h(form)e(of)h(patterns,)h(mo)o(v)
+o(es)e(and)h(goals.)19 b(No)14 b(ma)r(jor)e(w)o(ork)i(seems)262
+1802 y(to)k(ha)o(v)o(e)g(b)q(een)i(done)e(in)g(this)h(imp)q(ortan)o(t)d
+(area.)32 b(This)19 b(seems)f(to)g(me)g(to)g(b)q(e)h(a)f(ma)r(jor)262
+1851 y(omission,)11 b(if)i(kno)o(wledge)h(based)g(programs)f(are)h(to)g
+(succeed)i(in)d(reac)o(hing)h(master)g(lev)o(el.)262 2003 y
+Fu(3.3.5)55 b(P)n(arameter)17 b(Adjustmen)n(t)262 2115 y Fp(This)9
+b(t)o(yp)q(e)i(of)e(learning)g(in)o(v)o(olv)o(es)g(adjusting)g(the)i(w)o
+(eigh)o(ts)f(applied)f(to)h(ev)n(aluation)e(criteria)262 2165
+y(in)h(the)h(ligh)o(t)f(of)g(exp)q(erience.)19 b(Those)10 b(criteria)g(whic)o
+(h)g(lead)f(to)h(impro)o(v)o(ed)e(p)q(erformance)h(are)262
+2214 y(increased,)18 b(whereas)f(those)h(criteria)f(whic)o(h)f(deteriorate)i
+(p)q(erformance)e(are)h(decreased)262 2264 y(or)c(discarded)i(altogether.)324
+2350 y(The)22 b(most)e(notable)h(example)f(of)h(this)g(t)o(yp)q(e)h(of)f(mac)
+o(hine)f(learning)g(is)h(Sam)o(uel's)262 2399 y(draugh)o(ts)c(program)f([48)o
+(,)h(49)o(].)29 b(Ho)o(w)o(ev)o(er,)18 b(c)o(hess)h(is)e(a)g(far)g(more)g
+(complex)f(game)g(than)262 2449 y(draugh)o(ts.)26 b(In)17 b(1961,)e(Max)i(Eu)
+o(w)o(e,)g(ex{w)o(orld)f(c)o(hess)i(c)o(hampion,)d(set)j(up)e(a)h(commi)o
+(ttee)957 2574 y(39)p eop
+%%Page: 40 42
+40 41 bop 262 307 a Fp([20)o(])15 b(to)h(explore)g(the)h(p)q(ossibilities)f
+(of)f(applying)g(Sam)o(uel's)f(tec)o(hniques)j(to)f(c)o(hess.)26
+b(The)262 357 y(commi)o(ttee)16 b(concluded)j(that)f(for)f(c)o(hess)j(Sam)o
+(uel's)c(tec)o(hniques)j("w)o(ould)e(ha)o(v)o(e)g(to)h(deal)262
+407 y(not)f(with)h(31)g(comp)q(onen)o(t)f(n)o(um)o(b)q(ers)g(but)i(with)e(31)
+h(millio)o(n)d(or)j(ev)o(en)h(more")e([28)o(].)30 b(In)262
+457 y(other)14 b(w)o(ords)g(the)h(tec)o(hniques)g(are)f(impractical)e(for)i
+(c)o(hess.)324 542 y(More)h(recen)o(tly)h(Thomas)d(Nitsc)o(he)j([45)o(])e
+(has)h(exp)q(erimen)o(ted)g(with)g(a)f(learning)g(c)o(hess)262
+592 y(program)9 b(whic)o(h)i(adjusts)h(its)f(o)o(wn)g(parameters)g(using)g
+(linear)g(regression.)19 b(The)11 b(program)262 641 y(is)i(capable)h(of)f
+(learning)h(from)e(three)j(di\013eren)o(t)g(sources:)324 725
+y Ff(\017)20 b Fp(Analysing)13 b(Master)i(Games.)324 808 y
+Ff(\017)20 b Fp(Pla)o(ying)13 b(against)g(Human)f(Opp)q(osition.)324
+891 y Ff(\017)20 b Fp(Pla)o(ying)13 b(against)g(itself.)262
+974 y(Suc)o(h)18 b(tec)o(hniques)i(ha)o(v)o(e)e(not)g(b)q(een)h(generally)f
+(successful)i(in)e(comp)q(etitiv)o(e)f(c)o(hess)j(pro-)262
+1023 y(grams.)k(I)17 b(b)q(eliev)o(e)g(the)g(reason)g(for)g(this)f(is)h(that)
+f(most)g(ev)n(aluation)f(functions)i(are)g(not)262 1073 y(made)e(up)j(of)e
+(simple)f(linear)i(features)h(as)f(used)h(b)o(y)f(Nitsc)o(he.)29
+b(Therefore)18 b(making)d(this)262 1123 y(t)o(yp)q(e)f(of)f(learning)g(m)o
+(uc)o(h)g(more)g(di\016cult)g(to)h(apply)m(.)324 1208 y(In)9
+b(conclusion,)h(I)f(think)h(the)g(amoun)o(t)d(of)i(learning)g(necessary)i
+(for)f(a)f(program)f(to)h(reac)o(h)262 1258 y(a)i(high)h(lev)o(el)g(of)g
+(abilit)o(y)e(has)j(b)q(een)g(sev)o(erely)g(under{estimated.)18
+b(Simon)10 b(and)i(Chase)h([56)o(])262 1308 y(found)19 b(that)h(it)g(tak)o
+(es)g(a)g(pla)o(y)o(er)f(ab)q(out)h(a)g(decade)h(of)e(in)o(tense)i(pre{o)q
+(ccupation)g(with)262 1358 y(pla)o(ying)11 b(c)o(hess)j(to)f(b)q(ecome)g(a)g
+(grandmaster.)k(Humans)12 b(are)h(sup)q(erb)i(learners,)f(mac)o(hines)262
+1408 y(are)19 b(clearly)h(not.)34 b(It)20 b(therefore)g(follo)o(ws)e(that)i
+(it)f(will)f(tak)o(e)h(success)j(in)d(most)f(of)h(the)262 1457
+y(categories)e(outlined)f(in)g(this)g(section)i(together)f(with)f(at)g(least)
+h(a)f(decade)i(of)e(full)f(time)262 1507 y(w)o(ork,)9 b(advice)h(and)f
+(training)g(to)g(pro)q(duce)i(a)e(learning,)g(kno)o(wledge{based)h(c)o(hess)h
+(program)262 1557 y(an)o(ywhere)j(near)g(the)h(grandmaster)e(lev)o(el.)262
+1730 y Fr(3.4)69 b(Time)21 b(Con)n(trol)262 1856 y Fp(Chess)11
+b(clo)q(c)o(ks)g(are)g(used)h(in)e(comp)q(etitiv)o(e)g(c)o(hess)i(to)e(allo)o
+(w)f(fair)h(allo)q(cation)f(of)h(time)g(to)g(eac)o(h)262 1906
+y(pla)o(y)o(er)j(for)h(the)h(game.)i(Both)d(pla)o(y)o(ers)g(m)o(ust)f(then)i
+(conform)d(to)i(a)g(set)h(of)e(time)g(con)o(trols.)262 1956
+y(In)f(tournamen)o(t)g(c)o(hess)h(the)h(general)e(time)f(con)o(trol)i(is)f
+(40)g(mo)o(v)o(es)f(in)h(2)g(hours)h(follo)o(w)o(ed)e(b)o(y)262
+2005 y(20)g(mo)o(v)o(es)g(in)h(ev)o(ery)h(subsequen)o(t)g(hour.)18
+b(Some)11 b(time)g(con)o(trols)h(can)g(b)q(e)h("sudden)g(death",)262
+2055 y(e.g.)k(all)c(mo)o(v)o(es)g(in)g(30)g(min)o(utes.)324
+2141 y(An)o(y)j(c)o(hess)h(program)e(written)h(to)g(comp)q(ete)g(with)g(h)o
+(umans)f(or)h(other)g(programs)f(in)262 2190 y(tournamen)o(t)e(games)h(m)o
+(ust)g(therefore)i(ha)o(v)o(e)e(an)h(algorithm)d(to)i(con)o(trol)h(its)f
+(time)g(usage.)262 2240 y(The)g(time)f(sp)q(en)o(t)i(on)e(eac)o(h)i(mo)o(v)o
+(e)d(do)q(es)j(not)f(ha)o(v)o(e)f(to)h(b)q(e)h(constan)o(t,)f(in)f(fact)h(it)
+g(is)g(prefer-)262 2290 y(able)g(that)h(it)f(is)h(not.)20 b(It)15
+b(is)g(wise)g(to)g(pla)o(y)e(ob)o(vious)h(or)h(forced)h(mo)o(v)o(es)d(quic)o
+(kly)h(and)h(tak)o(e)262 2340 y(longer)i(on)h(more)f(di\016cult)g(mo)o(v)o
+(es.)28 b(Therefore,)20 b(a)d(sophisticated)i(time)d(con)o(trol)i(algo-)262
+2390 y(rithm)11 b(m)o(ust)h(detect)i(these)g(cases)h(and)d(allo)q(cate)g(its)
+h(time)f(appropriately)m(.)k(I)d(b)q(eliev)o(e)g(it)g(is)262
+2439 y(also)g(part)h(of)f(suc)o(h)i(an)f(algorithms)d(resp)q(onsibilit)o(y)j
+(to)g(detect)h(when)g(the)f(horizon)g(e\013ect)957 2574 y(40)p
+eop
+%%Page: 41 43
+41 42 bop 262 307 a Fp(ma)o(y)11 b(b)q(e)j(o)q(ccurring)f(and)g(allo)q(cate)g
+(enough)g(time)f(where)i(p)q(ossible)g(to)f(see)h(o)o(v)o(er)f(the)h(hori-)
+262 357 y(zon.)k(T)m(o)13 b(ac)o(hiev)o(e)h(these)h(aims,)c(the)k(algorithm)c
+(m)o(ust)h(kno)o(w)i(what)f(scores)j(the)e(searc)o(h)h(is)262
+407 y(calculating)10 b(at)i(eac)o(h)g(iteration)f(and)h(the)g(state)h(of)e
+(the)i(searc)o(h)f(at)g(a)g(giv)o(en)f(p)q(oin)o(t)g(in)g(time.)324
+492 y(Time)j(con)o(trol)h(problems)f(are)i(eased)h(b)o(y)e(the)h(use)g(of)f
+(iterativ)o(e)g(deep)q(ening)i(b)q(ecause)262 542 y(of)c(the)j(con)o(tin)o
+(uous)e(a)o(v)n(ailabili)o(t)o(y)e(of)i(the)h(b)q(est)h(mo)o(v)o(e)d(found)h
+(so)g(far.)20 b(The)15 b(time)e(used)j(up)262 592 y(thinking)g(ab)q(out)i
+(the)h(curren)o(t)g(mo)o(v)o(e)d(m)o(ust)h(b)q(e)i(c)o(hec)o(k)o(ed)g
+(regularly)e(against)g(the)i(time)262 641 y(allo)q(cation)14
+b(to)j(a)o(v)o(oid)e(the)i(p)q(ossibilities)f(of)g(o)o(v)o(er)g(using)h(time)
+e(or)h(ev)o(en)i(losing)d(on)h(time.)262 691 y(Unfortunately)m(,)g(it)g(is)g
+(not)h(enough)f(to)h(c)o(hec)o(k)g(the)g(time)f(after)g(eac)o(h)h(iteration)f
+(or)h(ev)o(en)262 741 y(after)f(eac)o(h)h(\014rst)g(lev)o(el)g(branc)o(h.)26
+b(This)16 b(is)g(b)q(ecause)i(some)e(branc)o(hes)i(ma)o(y)c(tak)o(e)j(a)f
+(large)262 791 y(amoun)o(t)c(of)j(time)e(to)h(searc)o(h.)22
+b(Therefore,)16 b(a)e(successful)j(time)c(con)o(trol)i(algorithm)d(m)o(ust)
+262 841 y(b)q(e)g(closely)f(link)o(ed)g(to)h(the)g(actual)f(tree)i(searc)o(h)
+g(mec)o(hanism)c(at)j(all)e(but)i(the)h(v)o(ery)f(deep)q(est)262
+891 y(lev)o(els)h(of)h(the)g(tree.)324 976 y(During)h(m)o(y)g(researc)o(h)j
+(I)e(ha)o(v)o(e)g(noticed)g(a)g(distinct)h(lac)o(k)e(of)h(published)g
+(material)e(in)262 1026 y(this)f(area.)18 b(The)13 b(articles)h(b)o(y)f(R.)f
+(Hy)o(att)h([30])f(and)h(H.)g(Berliner)h([7])e(are)i(the)g(only)e(articles)
+262 1075 y(of)j(an)o(y)g(substance)i(in)f(this)g(area.)23 b(I)16
+b(\014nd)g(this)g(rather)g(surprising)g(b)q(ecause)i(as)e(I)f(see)i(it,)262
+1125 y(this)c(is)h(an)g(imp)q(ortan)o(t)e(elemen)o(t)h(of)h(an)o(y)f(strong)h
+(c)o(hess)i(program.)957 2574 y(41)p eop
+%%Page: 42 44
+42 43 bop 262 654 a Fn(Chapter)34 b(4)262 897 y Fo(The)39 b(Ev)-7
+b(aluation)42 b(F)-10 b(unction)262 1148 y Fp(In)11 b(this)g(c)o(hapter)h(I)f
+(will)f(de\014ne)i(and)f(explain)f(the)i(heuristics)g(I)g(consider)g(to)f(b)q
+(e)g(imp)q(ortan)o(t)262 1198 y(in)h(assessing)j(the)f(merits)e(of)h(a)g(c)o
+(hess)i(p)q(osition.)i(I)d(in)o(tend)f(to)g(implemen)o(t)e(these)k(ideas)e
+(in)262 1248 y(a)g(new)h(c)o(hess)i(program)c(called)i("HIAR)o(CS)f(5.0".)324
+1333 y(I)e(hop)q(e)h(to)f(pro)q(duce)h(an)f(ev)n(aluation)f(function)h(whic)o
+(h)g(has)g(the)h(p)q(ositional)e(kno)o(wledge)262 1383 y(at)j(or)g(near)g
+(the)h(exp)q(ert)h(lev)o(el)e(\(2000)f(ELO\).)h(It)g(w)o(ould)g(normally)d
+(tak)o(e)k(a)e(h)o(uman)g(pla)o(y)o(er)262 1433 y(some)17 b(5)h(y)o(ears)g
+(of)g(in)o(tensiv)o(e)g(c)o(hess)i(exp)q(erience)g(and)e(learning)g(to)g(ac)o
+(hiev)o(e)g(this)g(lev)o(el.)262 1483 y(Therefore,)f(m)o(y)e(aim)f(to)i
+(instill)f(enough)i(kno)o(wledge)f(in)g(a)g(program)f(within)g(the)i(short)
+262 1532 y(p)q(erio)q(d)12 b(of)f(time)f(a)o(v)n(ailable)g(for)h(this)h(pro)r
+(ject)h(is)f(daun)o(ting.)k(Ho)o(w)o(ev)o(er,)c(I)g(can)g(dra)o(w)g(on)f(m)o
+(y)262 1582 y(o)o(wn)j(exp)q(erience)j(of)e(tournamen)o(t)f(c)o(hess)j(and)e
+(the)g(exp)q(eriences)j(of)c(some)h(great)g(master)262 1632
+y(pla)o(y)o(ers)e(who)f(ha)o(v)o(e)h(written)h(ab)q(out)f(c)o(hess)i
+(strategy)m(.)j(In)13 b(particular,)f(the)i(famous)d(b)q(o)q(oks)262
+1682 y("My)j(System")h(and)g("Chess)h(Praxis")f(b)o(y)g(Aron)h(Nimzo)o(witsc)
+o(h)e([43)o(,)g(44])h(con)o(tain)f(some)262 1732 y(v)o(ery)h(deep)g(though)o
+(ts)g(on)g(p)q(ositional)e(and)i(strategic)h(pla)o(y)m(.)j(Therefore,)d(I)f
+(will)e(use)j(suc)o(h)262 1781 y(ideas)e(to)f(help)h(dev)o(elop)g(heuristics)
+h(to)f(ev)n(aluate)f(p)q(ositions.)324 1867 y(As)f(I)g(see)h(it,)e(there)i
+(are)f(three)h(main)d(problems)g(facing)h(the)i(dev)o(elopmen)o(t)d(of)i(a)f
+('go)q(o)q(d')262 1916 y(ev)n(aluation)h(function:)324 1999
+y Ff(\017)20 b Fp(Determining)13 b Fl(whic)o(h)f Fp(criteria)i(are)h(imp)q
+(ortan)o(t.)324 2083 y Ff(\017)20 b Fp(Deciding)14 b Fl(when)f
+Fp(the)h(criteria)h(are)f(imp)q(ortan)o(t.)324 2166 y Ff(\017)20
+b Fp(Deciding)14 b Fl(what)f Fp(the)i(relativ)o(e)e(merits)h(of)f(eac)o(h)h
+(criterion)h(should)e(b)q(e.)262 2249 y(It)h(is)g(vital)e(to)i(get)h(all)d
+(three)k(of)d(these)j(asp)q(ects)f('righ)o(t'.)i(F)m(or)d(example,)e(a)i
+(program)f(ma)o(y)262 2298 y(kno)o(w)i(that)g(bishops)h(are)g(strong)g(in)f
+(some)g(p)q(ositions.)22 b(Ho)o(w)o(ev)o(er,)16 b(if)f(it)g(do)q(es)i(not)e
+(kno)o(w)262 2348 y(with)10 b(accuracy)j(when)f(those)g(p)q(ositions)f(o)q
+(ccur,)h(it)f(cannot)h(apply)e(its)h(ev)n(aluation)f(criteria)262
+2398 y(e\013ectiv)o(ely)m(.)20 b(There)c(are)f(no)f(p)q(erfect)j(answ)o(ers,)
+e(often)g(ev)n(aluation)e(criteria)i(ma)o(y)e(con)o(tra-)262
+2448 y(dict)j(eac)o(h)g(other)h(b)q(ecause)h(of)e(an)f(inevitable)h(in)o
+(teraction)g(and)g(o)o(v)o(erlap)g(b)q(et)o(w)o(een)h(eac)o(h)957
+2574 y(42)p eop
+%%Page: 43 45
+43 44 bop 262 307 a Fp(t)o(yp)q(e)15 b(of)g(c)o(hess)i(kno)o(wledge)e
+(represen)o(ted.)25 b(Therefore,)17 b(eac)o(h)f(criterion)g(is)f(not)g(indep)
+q(en-)262 357 y(den)o(t)i(in)f(its)h(o)o(wn)f(righ)o(t,)g(but)h(m)o(ust)f(b)q
+(e)h(considered)h(with)e(all)g(other)h(relev)n(an)o(t)g(criteria.)262
+407 y(Hence,)e(the)h(relativ)o(e)e(w)o(eigh)o(ting)g(for)g(eac)o(h)h(asp)q
+(ect)h(of)f(ev)n(aluation)e(is)h(imp)q(ortan)o(t.)19 b(Ho)o(w-)262
+457 y(ev)o(er,)f(the)g(criteria)f(can)h(only)e(b)q(e)i(considered)g(correct)h
+(in)e(a)g(statistical)g(sense,)i(not)e(an)262 506 y(absolute)c(sense.)324
+592 y(These)k(three)f(main)e(problem)g(areas)i(m)o(ust)e(b)q(e)i(considered)h
+(when)f(dev)o(eloping)f(eac)o(h)262 641 y(heuristic.)36 b(Dev)o(eloping)19
+b(an)h(ev)n(aluation)e(function)i(is)f(a)h(v)o(ery)g(iterativ)o(e)g(pro)q
+(cess.)38 b(In)262 691 y(the)16 b(ligh)o(t)e(of)h(seeing)h(a)f(program)f(pla)
+o(y)h(the)h(game,)e(the)i(heuristics)h(will)d(b)q(e)i(con)o(tin)o(ually)262
+741 y(ev)o(olv)o(ed.)22 b(This)15 b(\014ts)h(in)f(w)o(ell)g(with)g(the)h
+(equiv)n(alen)o(t)e(h)o(uman)g(pro)q(cess)j(where)g(kno)o(wledge)262
+791 y(is)e(con)o(tin)o(ually)f(in)i(a)f(state)i(of)e(ev)o(olution,)g
+(although)g(this)g(is)h(an)g(automatic)d(pro)q(cess)18 b(in)262
+841 y(the)c(case)h(of)e(a)h(h)o(uman)e(pla)o(y)o(er.)324 926
+y(The)f(ev)n(aluation)f(function)h(will)e(deal)i(with)f(the)i(op)q(ening,)f
+(middle)e(game)h(and)g(general)262 976 y(endgame)15 b(to)i(allo)o(w)e(a)i
+(program)e(to)i(pla)o(y)f(the)h(en)o(tire)h(game.)26 b(Kno)o(wledge)17
+b(for)f(sp)q(eci\014c)262 1026 y(endgames,)j(suc)o(h)h(as)g(bishop)f(v)o
+(ersus)h(knigh)o(t)f(endings,)h(will)e(b)q(e)i(omitted)e(b)q(ecause)j(of)262
+1075 y(time)12 b(constrain)o(ts.)20 b(Ho)o(w)o(ev)o(er,)14
+b(their)g(implemen)o(tation)d(is)j(just)g(a)g(matter)g(of)f(applying)g(a)262
+1125 y(similar)e(approac)o(h)j(to)g(that)f(whic)o(h)h(I)g(am)e(applying)h(to)
+g(the)i(more)e(general)h(cases.)324 1210 y(The)f(ev)n(aluation)f(criteria)i
+(will)d(b)q(e)j(de\014ned)g(in)f(a)g(formal)d(manner,)i(using)h(b)q(oth)h
+(func-)262 1260 y(tional)8 b(and)j(algorithmi)o(c)d(descriptions)j(where)h
+(appropriate.)17 b(T)m(o)9 b(raise)i(the)g(lev)o(el)e(of)h(c)o(hess)262
+1310 y(kno)o(wledge)i(whic)o(h)h(can)g(b)q(e)g(concisely)g(represen)o(ted)j
+(b)o(y)c(the)h(de\014nitions,)g(I)g(ha)o(v)o(e)f(written)262
+1360 y(a)k(large)g(n)o(um)o(b)q(er)g(of)f(pseudo)j(co)q(de)f(functions.)26
+b(These)17 b(pre-de\014ned)h(functions)f(will)e(b)q(e)262 1410
+y(used)j(extensiv)o(ely)h(in)e(the)h(de\014nition)g(of)f(ev)n(aluation)f
+(criteria.)30 b(A)18 b(full)f(description)h(of)262 1460 y(these)d(functions)f
+(can)g(b)q(e)g(found)g(in)f(app)q(endix)h(B.)324 1545 y(The)g(ev)n(aluation)e
+(function)i(m)o(ust)f(b)q(e)h(considered)h(as)f(a)g(whole.)j(The)e(p)q
+(ositional)d(fea-)262 1595 y(tures)19 b(for)e(ev)o(en)i(a)f(single)f(t)o(yp)q
+(e)i(of)e(piece)i(are)g(ev)n(aluated)e(o)o(v)o(er)h(a)g(n)o(um)o(b)q(er)f(of)
+h(criteria.)262 1644 y(Therefore,)i(remem)o(b)q(er)e(the)i(criteria)f(are)g
+(not)g(indep)q(enden)o(t,)i(but)e(closely)g(link)o(ed)f(to-)262
+1694 y(gether.)25 b(The)16 b(ev)n(aluation)e(criteria)i(ha)o(v)o(e)g(an)g
+(a\013ect)h(on)e(b)q(oth)h(sides.)25 b(Therefore,)17 b(while)262
+1744 y(w)o(eaknesses)g(are)f(discouraged)g(from)e(one)i(sides)h(p)q(oin)o(t)e
+(of)g(view,)h(their)g(creation)g(in)f(the)262 1794 y(opp)q(onen)o(ts)f(p)q
+(osition)f(is)h(activ)o(ely)f(encouraged.)957 2574 y(43)p eop
+%%Page: 44 46
+44 45 bop 262 307 a Fr(4.1)69 b(De\014nition)21 b(1)i(:)31
+b(Material)262 434 y Fp(Lik)o(e)20 b(all)f(other)i(c)o(hess)h(programs,)e(m)o
+(y)f(ev)n(aluation)f(function)j(will)d(hold)i(material)f(as)262
+483 y(the)13 b(main)e(comp)q(onen)o(t.)16 b(Ho)o(w)o(ev)o(er,)d(unlik)o(e)f
+(most)g(other)h(programs)f(this)h(will)e(not)i(b)q(e)g(the)262
+533 y(o)o(v)o(erriding)d(factor.)17 b(In)11 b(fact,)g(I)g(in)o(tend)g(to)g
+(mak)o(e)f(the)i(ev)n(aluation)d(function)i(sophisticated)262
+583 y(enough)j(to)f(b)q(e)i(willing)c(to)j(giv)o(e)g(up)g(material)d(for)j
+(go)q(o)q(d)f(p)q(ositional)g(comp)q(ensation.)324 668 y(T)m(raditional)j(c)o
+(hess)j(b)q(o)q(oks)f(for)g(b)q(eginners)h(adv)o(o)q(cate)f(the)h(follo)o
+(wing)d(appro)o(ximate)262 718 y(v)n(alues)c(for)f(eac)o(h)i(piece)g(:-)f(P)o
+(a)o(wn,)g(1)g(p)q(oin)o(t;)g(Knigh)o(t,)f(3)h(p)q(oin)o(ts;)h(Bishop,)f(3)g
+(p)q(oin)o(ts;)g(Ro)q(ok,)262 768 y(5)18 b(p)q(oin)o(ts;)j(Queen,)g(9)d(p)q
+(oin)o(ts)h(and)g(King,)g Ff(1)p Fp(.)33 b(Ho)o(w)o(ev)o(er,)20
+b(these)g(piece)g(v)n(alues)e(w)o(ould)262 818 y(require)j(p)q(ositional)e(v)
+n(alues)i(ha)o(ving)e(a)i(non)f(in)o(teger)i(represen)o(tation)g(in)e(most)g
+(cases.)262 867 y(F)m(or)e(reasons)h(of)f(e\016ciency)m(,)i(most)e(con)o
+(temp)q(orary)g(c)o(hess)i(programs)d(use)j(in)o(tegers)f(for)262
+917 y(p)q(ositional)13 b(as)i(w)o(ell)f(as)h(material)d(v)n(alues.)20
+b(Therefore,)c(I)f(prop)q(ose)g(to)g(use)h(a)e(basic)h(pa)o(wn)262
+967 y(v)n(alue)e(of)h(100.)19 b(This)14 b(pro)o(vides)h(a)f(p)q(ositional)f
+(resolution)h(to)g(1/100)f(th)i(of)f(a)g(pa)o(wn.)19 b(The)262
+1017 y(v)n(alues)13 b(of)g(the)i(other)f(pieces)i(will)c(b)q(e)i(assigned)h
+(relativ)o(e)e(to)h(this)g(basic)g(pa)o(wn)g(v)n(alue.)344
+1150 y Fh(M)5 b(T)413 1156 y Fe(col)469 1150 y Fp(=)513 1119
+y Fc(P)556 1130 y Fk(64)556 1163 y Fe(sq)q Fk(=1)734 1150 y
+Fl(if)13 b Fp(\(Occup)o(y\([An)o(y],col,sq\)\))793 1203 y Fl(case)h
+Fp(On\(sq\))h Fl(of)852 1253 y Fp(P)o(a)o(wn)136 b(:)18 b(P)o(a)o(wnV)m(alue)
+852 1303 y(Knigh)o(t)110 b(:)18 b(Knigh)o(tV)m(alue)852 1353
+y(Bishop)112 b(:)18 b(BishopV)m(alue)852 1403 y(Ro)q(ok)140
+b(:)18 b(Ro)q(okV)m(alue)852 1452 y(Queen)122 b(:)18 b(QueenV)m(alue)852
+1502 y(King)148 b(:)18 b(KingV)m(alue)793 1552 y Fl(endcase)734
+1602 y(endif)344 1702 y(where)380 1751 y Fp(P)o(a)o(wnV)m(alue)152
+b(=)14 b(100)380 1801 y(Knigh)o(tV)m(alue)126 b(=)14 b(325)380
+1851 y(BishopV)m(alue)128 b(=)14 b(340)380 1901 y(Ro)q(okV)m(alue)156
+b(=)14 b(520)380 1951 y(QueenV)m(alue)138 b(=)14 b(960)380
+2000 y(KingV)m(alue)164 b(=)14 b(10000)262 2115 y(F)m(ew)20
+b(pla)o(y)o(ers)g(agree)h(on)f(the)h(relativ)o(e)f(merits)f(of)h(a)g(knigh)o
+(t)g(and)g(bishop.)37 b(Both)20 b(are)262 2165 y(suited)c(to)g(di\013eren)o
+(t)h(t)o(yp)q(es)g(of)f(p)q(osition.)23 b(My)16 b(o)o(wn)g(view)g(is)g(that)g
+(programs)f(generally)262 2214 y(use)g(bishops)f(more)g(e\013ectiv)o(ely)h
+(than)f(knigh)o(ts.)20 b(This)14 b(is)g(b)q(ecause)i(programs)e(pla)o(y)f(op)
+q(en)262 2264 y(p)q(ositions)g(b)q(etter)j(than)e(closed)g(ones.)19
+b(Bishops)c(are)f(usually)f(stronger)i(than)f(knigh)o(ts)g(in)262
+2314 y(op)q(en)i(p)q(ositions)f(and)h(inferior)f(in)g(closed)i(p)q(ositions.)
+23 b(Therefore)17 b(I)f(prop)q(ose)h(to)e(set)i(the)262 2364
+y(knigh)o(t)c(and)g(bishop)h(v)n(alues)g(to)f(325)h(and)f(340)g(p)q(oin)o(ts)
+h(resp)q(ectiv)o(ely)m(.)324 2449 y(Ro)q(oks)j(are)i(particularly)e(strong)h
+(pieces)i(when)e(giv)o(en)g(scop)q(e)h(e.g.)30 b(on)18 b(op)q(en)h(\014les.)
+957 2574 y(44)p eop
+%%Page: 45 47
+45 46 bop 262 307 a Fp(They)12 b(are)h(generally)e(w)o(orth)h(ab)q(out)g(a)g
+(knigh)o(t)g(and)g(t)o(w)o(o)f(pa)o(wns.)18 b(I)12 b(will)f(use)h(a)g(ro)q
+(ok)g(v)n(alue)262 357 y(of)h(520)g(p)q(oin)o(ts.)324 442 y(The)h(queen)g(is)
+f(the)i(most)d(p)q(o)o(w)o(erful)h(piece)h(on)g(the)g(b)q(oard.)k(Its)c(scop)
+q(e)g(and)g(con)o(tribu-)262 492 y(tion)e(to)h(tactical)g(c)o(hess)h(mak)o
+(es)e(it)h(ideal)f(for)h(c)o(hess)h(programs.)j(T)m(o)12 b(re\015ect)j(this,)
+e(I)f(in)o(tend)262 542 y(to)h(use)i(a)f(queen)g(v)n(alue)g(of)f(960)g(p)q
+(oin)o(ts.)324 627 y(The)e(king)g(is)g(ob)o(viously)e(the)j(most)e(imp)q
+(ortan)o(t)f(piece.)18 b(It's)12 b(capture)g(will)d(nev)o(er)k(o)q(ccur)262
+677 y(in)j(an)h(actual)f(game.)25 b(Ho)o(w)o(ev)o(er,)18 b(it)e(remains)g
+(useful)h(to)g(assign)g(a)f(v)n(alue)g(to)h(re\015ect)i(its)262
+727 y(ultimate)12 b(imp)q(ortance.)17 b(I)d(will)e(use)j(a)e(v)n(alue)h(of)f
+(10000)f(p)q(oin)o(ts.)324 812 y(It)k(m)o(ust)g(b)q(e)h(remem)o(b)q(ered)f
+(these)i(v)n(alues)e(only)g(represen)o(t)j(the)e(basic)g(piece)g(v)n(alues.)
+262 862 y(When)9 b(p)q(ositions)g(particularly)g(suited)h(to)f(certain)h(t)o
+(yp)q(es)g(of)f(pieces)h(o)q(ccur,)h(the)f(p)q(ositional)262
+912 y(v)n(alue)15 b(of)h(the)g(relev)n(an)o(t)h(piece)g(will)e(increase)i(to)
+f(re\015ect)i(its)e(added)h(imp)q(ortance)e(in)h(the)262 961
+y(curren)o(t)f(p)q(osition.)324 1047 y(A)22 b(total)f(material)e(v)n(alue)j
+(will)e(b)q(e)i(main)o(tained)e(incremen)o(tally)g(throughout)i(the)262
+1096 y(searc)o(h,)c(for)f(reasons)h(of)f(e\016ciency)m(.)28
+b(This)18 b(allo)o(ws)e(the)h(curren)o(t)i(material)c(v)n(alue)i(to)g(b)q(e)
+262 1146 y(almost)12 b(instan)o(tly)h(a)o(v)n(ailable)e(at)j(all)f(no)q(des)h
+(of)g(the)g(tree,)h(in)o(terior)f(and)f(leaf.)p 641 1240 673
+5 v 641 1904 5 665 v 646 1323 a Fg(0Z0ZrskZ)646 1406 y(Zpo0Zpop)646
+1489 y(0ZpZ0Z0Z)646 1572 y(o0Z0l0Z0)646 1655 y(0Z0ZPZnZ)646
+1738 y(Z0M0L0Z0)646 1821 y(POPZ0OPO)646 1904 y(Z0ZRS0J0)p 1310
+1904 V 641 1908 673 5 v 266 2027 a Fp(Figure)h(4.1:)j Fl(Fidelit)o(y)c(68030)
+i(v)h(HIAR)o(CS)g(4.1)p Fp(,)d(1989)g(Olympiad,)e(White)j(to)g(Pla)o(y)m(.)
+324 2145 y(In)g(\014gure)g(4.1,)f(the)h(Material)f(totals)h(for)f(white)h
+(and)g(blac)o(k)f(are)i(as)f(follo)o(ws:)344 2242 y Fh(M)5
+b(T)413 2248 y Fe(W)t(hite)533 2242 y Fp(=)14 b(13025)344 2292
+y Fh(M)5 b(T)413 2298 y Fe(B)q(lack)533 2292 y Fp(=)14 b(13025)957
+2574 y(45)p eop
+%%Page: 46 48
+46 47 bop 262 307 a Fr(4.2)69 b(De\014nition)21 b(2)i(:)31
+b(Game)22 b(Phase)262 434 y Fp(As)14 b(already)f(explained,)g(it)h(is)f(imp)q
+(ortan)o(t)f(to)i(split)f(the)i(game)d(in)o(to)h(phases,)h(so)g(that)g(the)
+262 483 y(ev)n(aluation)c(criteria)j(can)f(b)q(e)h(applied)f(smo)q(othly)m(,)
+e(th)o(us)j(a)o(v)o(oiding)d(notorious)i(cli\013s)g(in)g(the)262
+533 y(ev)n(aluation)g(surface.)324 618 y(T)m(o)e(ac)o(hiev)o(e)i(this)g(smo)q
+(oth)e(transition)h(b)q(et)o(w)o(een)i(di\013eren)o(t)f(ev)n(aluation)e
+(criteria,)i(I)f(will)262 668 y(split)i(the)h(game)f(up)h(in)o(to)f(16)g
+(separate)i(phases.)344 766 y(phase)g(=)f(PS)344 815 y(revPhase)i(=)e(17)f
+Ff(\000)h Fp(phase)344 915 y Fl(where)380 965 y Fp(PS)g(:)159
+b(totalMtl)13 b(=)h Fh(M)5 b(tl)899 971 y Fe(W)t(hite)1005
+965 y Fp(+)10 b Fh(M)5 b(tl)1119 971 y Fe(B)q(lack)616 1015
+y Fl(if)13 b Fp(\(totalMtl)g Ff(\024)h Fp(21870\))658 1065
+y(1)616 1114 y Fl(else)658 1164 y Fp(\(totalMtl)f Ff(\000)h
+Fp(21570\))e(/)i(300)616 1214 y Fl(endif)380 1314 y Fh(M)5
+b(tl)452 1320 y Fe(W)t(hite)563 1314 y Fp(:)41 b(T)m(otal)12
+b(non{pa)o(wn)i(white)g(material.)380 1413 y Fh(M)5 b(tl)452
+1419 y Fe(B)q(lack)556 1413 y Fp(:)48 b(T)m(otal)12 b(non{pa)o(wn)i(blac)o(k)
+f(material.)324 1532 y(In)19 b(the)h(op)q(ening)f(p)q(osition)g(the)h(phase)g
+(will)e(b)q(e)i(16.)34 b(The)20 b(phase)g(then)g(decreases)262
+1581 y(linearly)11 b(as)i(material)d(is)i(captured,)i(except)g(when)f(the)g
+(total)f(non-pa)o(wn)g(material)e(v)n(alue)262 1631 y(falls)i(b)q(elo)o(w)h
+(21870)f(units.)18 b(A)o(t)13 b(this)h(p)q(oin)o(t)f(the)h(phase)g(remains)e
+(at)h(1)h(for)f(the)h(rest)g(of)f(the)262 1681 y(game,)h(unless)i(the)g
+(material)e(v)n(alue)h(rises)h(again)1048 1666 y Fk(1)1066
+1681 y Fp(.)23 b(As)16 b(an)g(example,)e(in)h(\014gure)h(4.1)f(the)262
+1731 y(Game)d(Phase)i(is)g(calculated)g(b)o(y:)k(phase)d(=)f(\(24650)e
+Ff(\000)j Fp(21570\))d(/)i(300)f(=)h(10.)324 1816 y(This)i(phase)i(concept)g
+(will)d(not)i(b)q(e)g(used)h(to)f(decide)h(when)f(rapid)f(dev)o(elopmen)o(t)g
+(of)262 1866 y(pieces)f(should)f(tak)o(e)h(place.)20 b(This)14
+b(will)f(b)q(e)i(left)f(to)g(sp)q(ecial)h(dev)o(elopmen)o(t)e(criteria.)20
+b(The)262 1916 y(concept)15 b(will)e(ho)o(w)o(ev)o(er,)i(b)q(e)g(used)g(to)f
+(progressiv)o(ely)h(mo)q(dify)d(those)j(ev)n(aluation)e(criteria)262
+1966 y(whic)o(h)f(are)h(a\013ected)h(b)o(y)e(material)e(status.)18
+b(F)m(or)12 b(example,)f(passed)j(pa)o(wns)e(b)q(ecome)h(more)262
+2015 y(imp)q(ortan)o(t)f(as)i(the)g(material)e(on)i(the)g(b)q(oard)g
+(diminishes.)324 2101 y(The)h(game)f(phase)i(is)f(based)h(on)f(non{pa)o(wn)g
+(material)e(b)q(ecause)k(in)e(c)o(hess)i(it)d(is)i(gen-)262
+2150 y(erally)d(imp)q(ortan)o(t)f(to)i(trade)g(pieces)h(not)f(pa)o(wns)g
+(when)g(ahead)g(in)g(material.)i(Therefore,)262 2200 y(the)e(phase)h(pro)o
+(vides)g(a)f(metho)q(d)g(of)f(encouraging)i(the)g(program)d(to)i(trade)h
+(pieces)h(when)262 2250 y(ahead)i(in)f(order)i(to)f(increase)h(some)f(fa)o(v)
+o(ourable)f(p)q(ositional)f(criteria)j(suc)o(h)f(as)h(passed)262
+2300 y(pa)o(wn)f(v)n(alues.)34 b(T)m(rading)19 b(pa)o(wns)g(will)f(not)h(b)q
+(e)h(encouraged)g(b)q(ecause)h(the)f(phase)g(will)262 2350
+y(remain)12 b(una\013ected.)p 262 2411 573 2 v 308 2437 a Fj(1)325
+2449 y Fi(b)q(ecause)e(of)h(pa)o(wn)g(promotions)957 2574 y
+Fp(46)p eop
+%%Page: 47 49
+47 48 bop 262 307 a Fr(4.3)69 b(General)22 b(P)n(ositional)g(Ev)l(aluation)
+262 442 y Fu(4.3.1)55 b(De\014nition)17 b(3)i(:)24 b(Mobilit)n(y)262
+554 y Fp(Mobilit)o(y)8 b(is)i(the)h(degree)g(of)f(piece)h(freedom)e(in)h(a)g
+(giv)o(en)g(p)q(osition.)16 b(Study)10 b(has)g(sho)o(wn)h(that)262
+604 y(there)k(is)g(a)f(clear)h(di\013erence)i(b)q(et)o(w)o(een)f(the)f
+(mobilit)o(y)c(of)j(the)h(winning)f(and)g(losing)g(sides)262
+654 y(as)i(the)i(game)d(progresses.)28 b(This)17 b(is)g(to)f(b)q(e)h(exp)q
+(ected)i(when)e(one)g(side)g(has)g(a)g(material)262 703 y(adv)n(an)o(tage.)23
+b(Ho)o(w)o(ev)o(er,)16 b(it)f(has)h(also)g(b)q(een)h(found)e(that)h(the)g
+(side)h(whic)o(h)e(can)h(main)o(tain)262 753 y(the)e(highest)g(mobilit)o(y)d
+(is)j(the)g(side)g(most)f(lik)o(ely)g(to)g(win)h(the)g(game)f([27)o(].)324
+838 y(This)e(sho)o(ws)h(that)f(maximi)o(sing)d(mobilit)o(y)h(is)i(an)g
+(excellen)o(t)i(heuristic.)18 b(In)11 b(fact,)g(Slater)262
+888 y([59)o(])e(is)g(of)g(the)i(opinion)d(that)i(mobilit)o(y)c(in)j(itself)h
+(is)f(a)h(su\016cien)o(t)g(measure)f(of)h(all)e(the)i(factors)262
+938 y(suggested)15 b(b)o(y)f(Shannon)h([53)o(].)k(I)14 b(also)g(consider)h
+(mobilit)o(y)c(to)j(b)q(e)h(an)f(imp)q(ortan)o(t)f(factor,)262
+988 y(although)f(I)i(do)g(think)g(man)o(y)e(other)i(heuristics)h(are)f(also)g
+(imp)q(ortan)o(t.)324 1073 y(In)g(1985,)e(Johnathon)i(Sc)o(hae\013er)i([51)o
+(])d(did)h(some)f(researc)o(h)i(to)f(\014nd)g(the)h(relativ)o(e)f(im-)262
+1123 y(p)q(ortance)e(of)g(v)n(arious)f(ev)n(aluation)f(criteria.)18
+b(In)12 b(this)g(researc)o(h)h(Sc)o(hae\013er)h(found)d(that)h(the)262
+1173 y(mobilit)o(y)f(heuristic)16 b(con)o(tributed)g(more)e(than)h(an)o(y)g
+(other)g(term)g(to)f(program)g(strength.)262 1223 y(In)i(fact,)i(when)f(a)g
+(mobilit)o(y)d(criterion)j(w)o(as)g(added)g(to)g(a)g(program)e(without)h(an)o
+(y)h(p)q(osi-)262 1272 y(tional)e(kno)o(wledge,)h(a)g(rating)g(increase)i(of)
+e(310)f(p)q(oin)o(ts)i(o)q(ccurred.)27 b(This)16 b(w)o(as)h(the)g(\014rst)262
+1322 y(ev)n(aluation)12 b(criterion)i(added.)k(It)c(could)f(therefore)i(b)q
+(e)g(exp)q(ected)g(to)f(mak)o(e)e(a)h(large)h(con-)262 1372
+y(tribution)c(to)h(program)e(p)q(erformance.)17 b(Ho)o(w)o(ev)o(er,)12
+b(suc)o(h)g(a)f(large)f(increase)j(is)e(exceptional)262 1422
+y(and)i(clearly)h(sho)o(ws)h(mobilit)o(y)c(should)j(b)q(e)h(one)f(of)g(the)g
+(ma)r(jor)f(terms)h(in)f(an)o(y)h(ev)n(aluation)262 1472 y(function.)324
+1557 y(Normally)m(,)c(mobilit)o(y)g(is)j(tak)o(en)h(as)g(the)g(n)o(um)o(b)q
+(er)e(of)h(legal)g(or)g(pseudo{legal)g(mo)o(v)o(es.)k(I)262
+1607 y(will)12 b(tak)o(e)i(a)f(sligh)o(tly)g(di\013eren)o(t)i(view)f(and)f
+(use)i(the)f(follo)o(wing)e(de\014nition)h(of)h(mobilit)o(y)o(:)344
+1737 y Fh(M)5 b(B)420 1743 y Fe(col)476 1737 y Fp(=)520 1706
+y Fc(P)564 1716 y Fk(64)564 1749 y Fe(sq)q Fk(=1)640 1737 y
+Fp(\()p Fh(A)687 1743 y Fe(col;sq)782 1737 y Fp(+)k Fh(P)850
+1743 y Fe(col;sq)936 1737 y Fp(\))344 1840 y Fl(where)380 1890
+y Fh(A)411 1896 y Fe(col;sq)510 1890 y Fp(:)47 b Fh(])p Fp(A)o(ttac)o(ks\([P)
+o(a)o(wn,Knigh)o(t,Bishop,Ro)q(ok],)o(col,sq\))380 1989 y Fh(P)407
+1995 y Fe(col;sq)506 1989 y Fp(:)k Fl(if)12 b Fp(\(Occup)o(y\([P)o(a)o
+(wn],col,sq\)\))628 2039 y Fh(])p Fp(Mo)o(v)o(es\([P)o(a)o(wn],col,sq\))569
+2089 y Fl(else)628 2139 y Fp(0)569 2188 y Fl(endif)262 2300
+y Fp(The)19 b(mobilit)o(y)e(of)i(the)h(king)e(is)h(not)h(included)f(in)g
+(this)h(de\014nition)f(b)q(ecause)i(I)e(do)h(not)262 2350 y(consider)f(a)g
+(kings)g(mobilit)o(y)d(mak)o(es)i(an)o(y)g(meaningful)f(con)o(tribution)h(to)
+h(a)g(successful)262 2399 y(strategy)m(.)33 b(The)20 b(king)e(m)o(ust)g(b)q
+(e)i(protected)h(in)e(the)g(op)q(ening)g(and)g(middle)e(game.)33
+b(In)262 2449 y(the)15 b(ending)h(it)f(should)g(b)q(e)h(used)g(activ)o(ely)m
+(.)21 b(Ho)o(w)o(ev)o(er,)16 b(its)f(mobilit)o(y)e(should)i(neither)h(b)q(e)
+957 2574 y(47)p eop
+%%Page: 48 50
+48 49 bop 262 307 a Fp(minim)o(i)o(sed)12 b(nor)h(maxim)o(ised.)i(The)f
+(queens)h(mobilit)o(y)10 b(is)j(also)g(not)g(included)g(although)g(a)262
+357 y(sp)q(ecialised)j(queen)i(mobilit)o(y)13 b(function)j(is)g(included)g
+(in)g(de\014nition)g(27,)f(Queen)j(P)o(o)o(w)o(er.)262 407
+y(Other)13 b(non-pa)o(wn)f(pieces)i(are)f(giv)o(en)f(a)g(b)q(on)o(us)h(for)f
+(eac)o(h)h(square)g(they)g(attac)o(k,)g(including)262 457 y(friendly)g
+(pieces)i(defended.)324 542 y(Unlik)o(e)f(other)i(pieces,)f(pa)o(wns)g
+(cannot)g(mo)o(v)o(e)f(to)g(squares)i(they)g(attac)o(k,)e(therefore)j(I)262
+592 y(ha)o(v)o(e)9 b(giv)o(en)g(pa)o(wns)h(a)f(b)q(on)o(us)h(for)g(squares)g
+(they)h(can)f(mo)o(v)o(e)e(to.)16 b(This)10 b(in)f(e\013ect)i(encourages)262
+641 y(the)j(blo)q(c)o(k)n(ade)g(of)f(enem)o(y)g(pa)o(wns)h(b)o(y)g(pieces.)p
+641 735 673 5 v 641 1399 5 665 v 646 818 a Fg(rZ0l0skZ)646
+901 y(o0o0apop)646 984 y(0ZpZpZ0Z)646 1067 y(Z0OnO0Z0)646 1150
+y(QZ0O0ZbZ)646 1233 y(Z0Z0ZNZ0)646 1316 y(PO0Z0ZPO)646 1399
+y(SNA0ZRJ0)p 1310 1399 V 641 1403 673 5 v 317 1522 a Fp(Figure)g(4.2:)j
+Fl(HIAR)o(CS)f(4.1)g(v)g(Mephisto)p Fp(,)11 b(1989)i(Olympiad,)e(White)i(to)h
+(Pla)o(y)m(.)324 1640 y(Applying)f(these)i(Mobilit)o(y)d(criteria)i(to)g(the)
+h(p)q(osition)e(in)g(\014gure)i(4.2)e(giv)o(es:)344 1738 y
+Fh(M)5 b(B)420 1744 y Fe(W)t(hite)533 1738 y Fp(=)14 b(43)344
+1787 y Fh(M)5 b(B)420 1793 y Fe(B)q(lack)533 1787 y Fp(=)14
+b(47)957 2574 y(48)p eop
+%%Page: 49 51
+49 50 bop 262 307 a Fu(4.3.2)55 b(De\014nition)17 b(4)i(:)24
+b(Dev)n(elopmen)n(t)262 419 y Fp(The)11 b(main)f(ob)r(jectiv)o(e)i(of)e(the)j
+(op)q(ening)e(is)g(to)g(dev)o(elop)h(pieces)g(on)o(to)f(their)h('b)q(est')g
+(a)o(v)n(ailable)262 469 y(squares.)31 b(Dev)o(elopmen)o(t,)17
+b(therefore,)j(ob)o(viously)c(pla)o(ys)i(an)f(imp)q(ortan)o(t)f(role)i(in)g
+(c)o(hess.)262 519 y(Man)o(y)c(op)q(enings)h(o\013er)h(material,)d(generally)
+i(pa)o(wns,)g(in)f(exc)o(hange)i(for)f(rapid)g(dev)o(elop-)262
+569 y(men)o(t.)22 b(A)16 b(dev)o(elop)q(ed)g(side)g(is)g(able)f(to)g(com)o
+(bine)g(pieces)i(in)e(attac)o(k,)g(often)h(catc)o(hing)g(an)262
+618 y(unprepared)e(and)e(undev)o(elop)q(ed)h(opp)q(onen)o(t)g(b)o(y)g
+(surprise.)19 b(I)12 b(b)q(eliev)o(e)h(it)g(is)f(imp)q(ortan)o(t)f(for)262
+668 y(c)o(hess)k(programs)d(not)h(to)h(place)g(to)q(o)f(m)o(uc)o(h)f(faith)h
+(in)g(their)h(op)q(ening)g(b)q(o)q(oks.)k(A)13 b(program)262
+718 y(should)g(kno)o(w)h(ho)o(w)f(and)h(when)g(to)g(dev)o(elop)g(its)g
+(pieces.)344 801 y Fh(D)q(V)403 807 y Fe(col)459 801 y Fp(=)e
+Fh(K)538 807 y Fe(col)592 801 y Ff(\000)d Fh(B)664 807 y Fe(col)709
+801 y Ff(\001)o Fh(phase=)p Fp(3)g Ff(\000)h Fh(N)951 807 y
+Fe(col)995 801 y Ff(\001)p Fh(phase=)p Fp(2)f(+)h Fh(Q)1238
+807 y Fe(col)344 901 y Fl(where)380 950 y Fh(K)415 956 y Fe(col)473
+950 y Fp(:)36 b Fl(if)13 b Fp(\(Castled\(col\)\))580 1000 y(phase)521
+1050 y Fl(else)580 1100 y(if)g Fp(\()p Fl(not)g Fp(\(K)o(CRigh)o(ts\(col\))g
+Fl(or)h Fp(QCRigh)o(ts\(col\)\))639 1150 y Ff(\000)p Fp(2)p
+Ff(\001)p Fh(phase)580 1200 y Fl(else)639 1249 y(if)f Fp(\()p
+Fl(not)g Fp(K)o(CRigh)o(ts\(col\)\))699 1299 y Ff(\000)p Fh(phase=)p
+Fp(2)639 1349 y Fl(else)699 1399 y(if)f Fp(\()p Fl(not)h Fp(QCRigh)o
+(ts\(col\)\))758 1449 y Ff(\000)p Fh(phase=)p Fp(4)699 1498
+y Fl(else)758 1548 y Fp(0)699 1598 y Fl(endif)639 1648 y(endif)580
+1698 y(endif)521 1747 y(endif)380 1847 y Fh(B)411 1853 y Fe(col)469
+1847 y Fp(:)40 b Fh(])p Fp(UnMo)o(v)o(ed\(col,Bishop\))380
+1947 y Fh(N)413 1953 y Fe(col)471 1947 y Fp(:)e Fh(])p Fp(UnMo)o(v)o
+(ed\(col,Knigh)o(t\))380 2046 y Fh(Q)413 2052 y Fe(col)470
+2046 y Fp(:)h Fl(if)13 b Fp(\()p Fh(B)610 2052 y Fe(col)664
+2046 y Fp(+)c Fh(N)738 2052 y Fe(col)794 2046 y Ff(\025)j Fp(2)i
+Fl(and)f Fh(])p Fp(UnMo)o(v)o(ed\(col,Queen\))i(=)f(0\))580
+2096 y Ff(\000)p Fh(phase)c Ff(\001)f Fp(\()p Fh(B)795 2102
+y Fe(col)849 2096 y Fp(+)h Fh(N)924 2102 y Fe(col)968 2096
+y Fp(\))p Fh(=)p Fp(4)521 2146 y Fl(else)580 2196 y Fp(0)521
+2246 y Fl(endif)262 2350 y Fp(These)15 b(dev)o(elopmen)o(t)f(criteria)h
+(encourage)g(castling)f(and)h(p)q(enalise)g(the)g(loss)f(of)g(castling)262
+2399 y(righ)o(ts)d(without)h(ha)o(ving)f(castled.)18 b(Knigh)o(ts)12
+b(and)g(bishops)g(are)g(p)q(enalised)g(for)g(not)g(ha)o(ving)262
+2449 y(mo)o(v)o(ed.)17 b(This)d(has)h(the)g(e\013ect)h(of)d(discouraging)h
+(the)h(program)d(from)h(mo)o(ving)f(the)i(same)957 2574 y(49)p
+eop
+%%Page: 50 52
+50 51 bop 262 307 a Fp(piece)13 b(t)o(wice)h(in)e(the)i(op)q(ening)e(b)q
+(efore)i(dev)o(elopmen)o(t)e(is)h(complete.)k(Where)d(the)f(undev)o(el-)262
+357 y(op)q(ed)h(pieces)h(should)f(b)q(e)g(dev)o(elop)q(ed)h(to)e(is)h
+(de\014ned)h(b)o(y)f(other)g(ev)n(aluation)f(criteria.)324
+442 y(The)e(queen)g(is)f(discouraged)h(from)e(mo)o(ving)f(b)q(efore)j(at)g
+(least)f(3)g(minor)f(pieces)j(\(knigh)o(ts)262 492 y(and)k(bishops\))i(are)f
+(dev)o(elop)q(ed.)28 b(This)17 b(is)g(an)f(attempt)h(to)g(a)o(v)o(oid)e(p)q
+(ositions)i(where)h(the)262 542 y(program's)11 b(queen)k(is)e(dev)o(elop)q
+(ed)h(to)q(o)g(early)m(,)e(allo)o(wing)f(the)j(opp)q(onen)o(t)g(to)g(gain)e
+(a)h(temp)q(o)262 592 y(b)o(y)d(pla)o(ying)f(a)i(dev)o(eloping)f(mo)o(v)o(e)f
+(attac)o(king)h(the)i(queen.)18 b(Applying)10 b(these)i(Dev)o(elopmen)o(t)262
+641 y(criteria)i(to)f(the)i(p)q(osition)e(in)h(\014gure)g(4.2)f(giv)o(es:)344
+738 y Fh(D)q(V)403 744 y Fe(W)t(hite)533 738 y Fp(=)h(14)9
+b Ff(\000)h Fp(4)f Ff(\000)g Fp(7)g Ff(\000)h Fp(7)h(=)h Ff(\000)p
+Fp(4)344 788 y Fh(D)q(V)403 794 y Fe(B)q(lack)533 788 y Fp(=)i(14)9
+b Ff(\000)h Fp(0)f Ff(\000)g Fp(0)g Ff(\000)h Fp(0)h(=)h(14)262
+940 y Fu(4.3.3)55 b(De\014nition)17 b(5)i(:)24 b(Cen)n(tre)19
+b(Con)n(trol)262 1052 y Fp(The)g(imp)q(ortance)g(of)f(con)o(trolling)g(the)i
+(cen)o(tre)h(of)e(the)h(b)q(oard)f(cannot)h(b)q(e)g(to)q(o)f(highly)262
+1102 y(stressed.)37 b(A)19 b(clear)h(connection)g(b)q(et)o(w)o(een)h(winning)
+e(the)h(game)e(and)h(con)o(trolling)f(the)262 1151 y(cen)o(tre)f(has)g(b)q
+(een)g(established)g(in)f([27)o(].)25 b(Ho)o(w)o(ev)o(er,)16
+b(this)h(will)d(come)i(as)g(no)g(surprise)i(to)262 1201 y(an)o(y)13
+b(strong)h(c)o(hess)i(pla)o(y)o(ers.)324 1286 y(The)g(cen)o(tre)i(is)e(con)o
+(trolled)f(b)o(y)h(b)q(oth)g(o)q(ccupation)g(and)g(attac)o(k)g(of)g(cen)o
+(tral)g(squares.)262 1336 y(Therefore)j(m)o(y)e(cen)o(tre)j(con)o(trol)e(ev)n
+(aluation)f(criteria)i(m)o(ust)f(detect)i(suc)o(h)f(factors)g(and)262
+1386 y(encourage)14 b(their)h(ac)o(hiev)o(emen)o(t.)p 641 1480
+673 5 v 641 2144 5 665 v 646 1563 a Fg(0Z0Z0Z0Z)646 1646 y(Z0Z0Z0Z0)646
+1729 y(0Z0Z0Z0Z)646 1812 y(Z0Z0Z0Z0)646 1895 y(0Z0Z0Z0Z)646
+1978 y(Z0Z0Z0Z0)646 2061 y(0Z0Z0Z0Z)646 2144 y(Z0Z0Z0Z0)p 1310
+2144 V 641 2148 673 5 v 687 1539 a Fl(1)58 b(1)h(1)g(1)f(1)h(1)g(1)f(1)687
+1622 y(1)g(2)h(2)g(2)f(2)h(2)g(2)f(1)687 1705 y(1)g(2)h(4)g(4)f(4)h(4)g(2)f
+(1)687 1788 y(1)g(2)h(4)g(8)f(8)h(4)g(2)f(1)687 1871 y(1)g(2)h(4)g(8)f(8)h(4)
+g(2)f(1)687 1954 y(1)g(2)h(4)g(4)f(4)h(4)g(2)f(1)687 2037 y(1)g(2)h(2)g(2)f
+(2)h(2)g(2)f(1)687 2120 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f(1)617
+2246 y Fp(Figure)14 b(4.3:)j(Cen)o(tre)e(Con)o(trol)e(b)q(on)o(us)h(table.)
+344 2396 y Fh(C)s(C)407 2402 y Fe(col)462 2396 y Fp(=)506 2365
+y Fc(P)550 2375 y Fk(64)550 2409 y Fe(sq)q Fk(=1)633 2396 y
+Fh(V)657 2402 y Fe(sq)691 2396 y Ff(\001)o Fp(\()p Fh(A)749
+2402 y Fe(col;sq)845 2396 y Fp(+)9 b Fh(O)918 2402 y Fe(col;sq)1013
+2396 y Fp(+)g Fh(P)1081 2402 y Fe(col;sq)1167 2396 y Fp(\))957
+2574 y(50)p eop
+%%Page: 51 53
+51 52 bop 344 307 a Fl(where)380 357 y Fh(V)404 363 y Fe(sq)452
+357 y Fp(:)105 b(Cen)o(tre)15 b(Con)o(trol)e(b)q(on)o(us)h(table,)f(indexed)i
+(b)o(y)e(sq.)19 b(See)14 b(\014gure)h(4.3.)380 457 y Fh(A)411
+463 y Fe(col;sq)510 457 y Fp(:)47 b Fh(])p Fp(A)o(ttac)o(ks\([An)o
+(y],col,sq\))380 556 y Fh(O)412 562 y Fe(col;sq)511 556 y Fp(:)f
+Fl(if)12 b Fp(\(Occup)o(y\([Knigh)o(t],col,sq\)\))628 606 y(1)569
+656 y Fl(else)628 706 y Fp(0)569 756 y Fl(endif)380 855 y Fh(P)407
+861 y Fe(col;sq)506 855 y Fp(:)51 b Fl(if)12 b Fp(\(A)o(ttac)o(k)o(ed\([P)o
+(a)o(wn],col,sq\)\))628 905 y(1)569 955 y Fl(else)628 1005
+y Fp(0)569 1054 y Fl(endif)262 1181 y Fp(Pieces)i(are)g(giv)o(en)f(b)q(on)o
+(uses)h(for)f(attac)o(king)g(cen)o(tral)g(squares.)19 b(The)14
+b(b)q(on)o(us)g(is)f(dep)q(enden)o(t)262 1231 y(on)k(ho)o(w)f(close)i(the)g
+(square)g(is)f(to)g(the)h(cen)o(tre.)29 b(P)o(a)o(wn)17 b(attac)o(ks)h
+(receiv)o(e)g(an)f(additional)262 1281 y(b)q(on)o(us)f(to)h(re\015ect)h(the)g
+(imp)q(ortance)e(of)g(suc)o(h)h(attac)o(ks.)27 b(Occupation)17
+b(of)f(the)i(cen)o(tre)g(b)o(y)262 1331 y(knigh)o(ts)12 b(is)g(of)g
+(particular)h(imp)q(ortance.)k(A)c(knigh)o(t)e(has)i(a)g(relativ)o(ely)f
+(short)h(range,)g(more)262 1380 y(than)d(an)o(y)h(other)g(piece)h(it)e(needs)
+i(to)f(b)q(e)g(close)g(to)g(the)g(\014eld)g(of)f(action.)17
+b(A)11 b(cen)o(trally)f(placed)262 1430 y(knigh)o(t)j(is)g(b)q(est)i(able)f
+(to)f(exert)i(pressure)h(o)o(v)o(er)e(most)f(of)g(the)h(b)q(oard.)19
+b(Therefore,)14 b(cen)o(tral)262 1480 y(o)q(ccupation)g(b)o(y)f(knigh)o(ts)h
+(receiv)o(es)h(a)f(sp)q(ecial)g(b)q(on)o(us.)324 1565 y(I)e(b)q(eliev)o(e)i
+(that)e(cen)o(tre)j(con)o(trol)d(is)h(imp)q(ortan)o(t)e(throughout)h(the)i
+(game,)d(although)h(its)262 1615 y(imp)q(ortance)d(should)i(diminish)d(as)j
+(the)g(game)e(progresses.)19 b(This)10 b(function)h(will)e(naturally)262
+1665 y(pla)o(y)f(a)i(less)g(prominen)o(t)e(role)i(as)g(pieces)h(are)f(exc)o
+(hanged)g(b)q(ecause)i(of)d(the)h(reduced)h(n)o(um)o(b)q(er)262
+1715 y(of)j(attac)o(ks)h(and)g(p)q(ossible)g(squares)i(o)q(ccupied.)22
+b(Therefore,)16 b(no)f(phase)h(adjustmen)o(t)e(w)o(as)262 1765
+y(felt)f(necessary)m(.)324 1850 y(Applied)e(to)g(the)h(p)q(osition)e(in)h
+(\014gure)g(4.2,)g(the)g(Cen)o(tre)i(Con)o(trol)d(criteria)i(will)d(pro)q
+(duce)262 1900 y(the)14 b(follo)o(wing)d(v)n(alues:)344 1997
+y Fh(C)s(C)407 2003 y Fe(W)t(hite)533 1997 y Fp(=)j(169)344
+2047 y Fh(C)s(C)407 2053 y Fe(B)q(lack)533 2047 y Fp(=)g(183)957
+2574 y(51)p eop
+%%Page: 52 54
+52 53 bop 262 307 a Fu(4.3.4)55 b(De\014nition)17 b(6)i(:)24
+b(Square)19 b(Con)n(trol)262 419 y Fp(During)8 b(the)i(game)e(it)h(is)g(imp)q
+(ortan)o(t)f(to)h(ac)o(hiev)o(e)h(a)f(balance)g(b)q(et)o(w)o(een)i(attac)o(k)
+e(and)h(defence.)262 469 y(As)k(the)h(game)e(progresses)j(this)e(balance)h
+(ma)o(y)d(shift)i(a)g(n)o(um)o(b)q(er)g(of)f(times)h(from)e(defence)262
+519 y(to)k(attac)o(k)h(and)g(visa{v)o(ersa.)28 b(Square)17
+b(con)o(trol)g(can)g(pro)o(vide)g(a)g(metho)q(d)f(of)h(measuring)262
+569 y(the)d(exten)o(t)h(to)f(whic)o(h)f(the)i(program)d(is)i(attac)o(king)f
+(or)h(defending.)324 654 y(W)m(e)i(can)h(de\014ne)h(attac)o(k)f(as)g(the)g(n)
+o(um)o(b)q(er)g(of)f(squares)i(attac)o(k)o(ed)f(in)f(the)i(opp)q(onen)o(ts)
+262 704 y(half)12 b(of)h(the)h(b)q(oard.)k(Defence)d(can)f(b)q(e)g(de\014ned)
+h(as)e(the)i(n)o(um)o(b)q(er)d(of)h(squares)i(attac)o(k)o(ed)f(in)262
+754 y(ones)g(o)o(wn)f(half)g(of)h(the)g(b)q(oard.)324 839 y(A)j(comparison)f
+(b)q(et)o(w)o(een)i(suc)o(h)g(attac)o(k)f(and)g(defence)i(for)e(b)q(oth)g(ev)
+o(en)o(tual)g(winners)262 889 y(and)e(losers)i(is)f(made)f(in)g([27)o(].)24
+b(Analysing)15 b(the)i(results)g(obtained)f(it)f(can)i(b)q(e)f(seen)i(that)
+262 938 y(throughout)c(the)h(game)f(the)h(winners)g(and)g(losers)g(main)o
+(tain)d(appro)o(ximately)g(the)j(same)262 988 y(n)o(um)o(b)q(er)c(of)g
+(squares)i(defended.)18 b(Ho)o(w)o(ev)o(er,)12 b(there)i(is)d(a)h(clear)g
+(di\013erence)i(in)d(the)h(attac)o(k)o(ed)262 1038 y(squares)j(b)q(et)o(w)o
+(een)h(winners)e(and)h(losers)g(as)f(the)h(game)d(progresses.)22
+b(The)14 b(b)q(est)i(strategy)m(,)262 1088 y(therefore,)i(seems)f(to)f(b)q(e)
+h(to)g(maxim)o(i)o(se)e(the)i(attac)o(k)f(while)h(main)o(taini)o(ng)d(an)i
+(adequate)262 1138 y(defence.)344 1240 y Fh(S)r(C)401 1246
+y Fe(col)457 1240 y Fp(=)501 1209 y Fc(P)545 1219 y Fk(64)545
+1252 y Fe(sq)q Fk(=1)621 1240 y Fp(\()p Fh(S)662 1246 y Fe(col;sq)757
+1240 y Ff(\001)9 b Fh(A)809 1246 y Fe(col;sq)895 1240 y Fp(\))344
+1343 y Fl(where)380 1392 y Fh(S)405 1398 y Fe(col;sq)505 1392
+y Fp(:)52 b(2)13 b(tables)h(of)g(square)g(v)n(alues)g(indexed)g(b)o(y)g
+(colour)g(col)f(and)h(square)g(sq.)569 1442 y(See)g(planning)f(section)i
+(4.11.7)d(for)h(details.)380 1542 y Fh(A)411 1548 y Fe(col;sq)510
+1542 y Fp(:)47 b Fh(])p Fp(A)o(ttac)o(ks\([An)o(y],col,sq\))324
+1660 y(I)12 b(will)g(use)h(a)f(table)h(driv)o(en)g(function.)k(This)c(will)e
+(enable)i(pre-loaded)g(v)n(alues)f(deriv)o(ed)262 1710 y(from)k(an)j(initial)
+d(planning)i(phase)h(to)g(b)q(e)g(used.)33 b(A)19 b(planning)e(phase)j(could)
+e(use)i(this)262 1760 y(function)13 b(to)h(go)q(o)q(d)g(e\013ect)h(b)o(y)f
+(iden)o(tifying)f(a)g(basic)h(plan,)f(lik)o(e)h(a)f(king)g(side)i(attac)o(k.)
+j(The)262 1810 y(table)12 b(could)h(then)g(b)q(e)h(pre-loaded)f(with)f(v)n
+(alues)g(whic)o(h)h(w)o(ould)f(encourage)i(the)f(program)262
+1860 y(to)g(attac)o(k)h(certain)h(squares)g(on)e(the)i(king)e(side,)h(for)f
+(example.)324 1945 y(Applying)g(this)h(Square)g(Con)o(trol)f(criterion)h(to)g
+(the)h(p)q(osition)e(in)g(\014gure)i(4.2)e(giv)o(es:)344 2042
+y Fh(S)r(C)401 2048 y Fe(W)t(hite)533 2042 y Fp(=)h(74)344
+2092 y Fh(S)r(C)401 2098 y Fe(B)q(lack)533 2092 y Fp(=)g(62)957
+2574 y(52)p eop
+%%Page: 53 55
+53 54 bop 262 307 a Fr(4.4)69 b(P)n(a)n(wn)23 b(Ev)l(aluation)262
+434 y Fp(P)o(a)o(wns)15 b(pro)o(vide)g(the)h(basic)g(framew)o(ork)d(around)j
+(whic)o(h)f(the)h(game)e(will)g(dev)o(elop.)22 b(The)262 483
+y(correct)15 b(handling)e(of)g(the)i(pa)o(wn)e(structure)j(is)e(vital)f(in)g
+(high)g(lev)o(el)h(c)o(hess.)365 599 y("P)o(a)o(wns)g(are)g(the)h(Soul)e(of)g
+(Chess")838 665 y Fm(Philidor)262 781 y Fp(I)i(b)q(eliev)o(e)g(this)h(is)f
+(the)h(one)f(area)h(whic)o(h)f(ab)q(o)o(v)o(e)g(all)f(others)i(is)g(most)e
+(neglected)i(in)f(c)o(hess)262 831 y(programs.)h(The)11 b(problem)g(is)g
+(that)h(w)o(eak)f(pa)o(wns)h(do)f(not)g(usually)g(cause)i(an)o(y)e(imm)o
+(ediate)262 881 y(deterioration)k(in)g(the)i(o)o(v)o(erall)d(p)q(osition.)22
+b(Ho)o(w)o(ev)o(er,)16 b(o)o(v)o(er)g(a)f(longer)h(term,)e(p)q(erhaps)j(30)
+262 931 y(or)12 b(40)h(plies,)f(the)i(existence)g(of)f(w)o(eak)g(pa)o(wns)f
+(causes)j(n)o(umerous)d(p)q(ositional)g(w)o(eaknesses)262 981
+y(e.g.)17 b(w)o(eak)12 b(squares,)h(space)g(to)f(blo)q(c)o(k)n(ade,)f
+(isolation)f(etc.)19 b(Often)12 b(a)g(game's)f(result)h(hinges)262
+1030 y(on)h(the)i(strength)g(or)f(w)o(eakness)h(of)e(the)h(underlying)g(pa)o
+(wn)f(structure.)324 1116 y(It)e(is)g(notable)g(in)f(a)h(recen)o(t)i([27)o
+(],)d(relativ)o(ely)h(large)f(study)i(of)e(ev)n(aluation)g(criteria,)i(that)
+262 1165 y(there)j(w)o(as)e(no)h(sp)q(eci\014c)h(atten)o(tion)e(giv)o(en)g
+(to)h(pa)o(wn)f(ev)n(aluation.)k(I)c(feel)h(this)g(is)f(a)h(serious)262
+1215 y(omission.)324 1300 y(My)e(pa)o(wn)g(ev)n(aluation)e(criteria)j(will)d
+(b)q(e)j(amongst)e(the)h(most)f(complex)g(and)h(compre-)262
+1350 y(hensiv)o(e)i(of)f(the)h(whole)f(ev)n(aluation)f(function.)18
+b(I)13 b(feel)h(this)g(is)f(critical)g(to)h(o)o(v)o(erall)e(success)262
+1400 y(b)q(ecause)j(man)o(y)c(of)i(the)i(e\013ects)g(caused)g(b)o(y)e(bad)h
+(pa)o(wn)f(pla)o(y)f(cannot)i(b)q(e)g(determined)g(b)o(y)262
+1450 y(searc)o(h.)19 b(Therefore,)14 b(heuristics)h(m)o(ust)e(\014ll)g(this)h
+(gap.)324 1535 y(I)19 b(will)f(split)h(the)h(pa)o(wn)f(ev)n(aluation)f
+(criteria)i(up)f(so)g(they)h(can)g(b)q(e)g(dealt)f(with)g(in)262
+1585 y(su\016cien)o(t)14 b(detail.)262 1736 y Fu(4.4.1)55 b(De\014nition)17
+b(7)i(:)24 b(Doubled)19 b(P)n(a)n(wns)262 1848 y Fp(P)o(a)o(wns)e(are)g
+(doubled)g(if)f(there)j(are)e(at)g(least)g(t)o(w)o(o)g(pa)o(wns)g(of)f(the)i
+(same)e(colour)h(on)g(the)262 1898 y(same)12 b(\014le.)18 b(Doubled)13
+b(pa)o(wns)g(are)h(generally)f(w)o(eak.)k(They)d(are)g(unable)f(to)g(supp)q
+(ort)h(eac)o(h)262 1948 y(other)g(and)g(are)g(vulnerable)g(to)g(attac)o(k)g
+(and)f(blo)q(c)o(k)n(ade.)344 2047 y Fh(D)q(P)406 2053 y Fe(col)462
+2047 y Fp(=)506 2016 y Fc(P)549 2027 y Fk(64)549 2060 y Fe(sq)q
+Fk(=1)651 2047 y Fl(if)g Fp(\(Occup)o(y\([P)o(a)o(wn],col,sq\))g
+Fl(and)g Fp(Doubled\(col,OnFile\(sq\)\)\))710 2100 y Fh(D)744
+2107 y Fe(O)q(nF)t(ile)p Fk(\()p Fe(sq)q Fk(\))651 2150 y Fl(else)710
+2200 y Fp(0)651 2250 y Fl(endif)344 2350 y(where)380 2399 y
+Fh(D)414 2405 y Fe(f)449 2399 y Fp(:)131 b([)p Ff(\000)p Fp(6)p
+Fh(;)7 b Ff(\000)p Fp(8)p Fh(;)g Ff(\000)p Fp(10)p Fh(;)g Ff(\000)p
+Fp(14)p Fh(;)g Ff(\000)p Fp(14)p Fh(;)f Ff(\000)p Fp(10)p Fh(;)h
+Ff(\000)p Fp(8)p Fh(;)f Ff(\000)p Fp(6])651 2449 y(Indexed)15
+b(b)o(y)f(\014le)g(f)f(\(1)h(to)g(8\).)957 2574 y(53)p eop
+%%Page: 54 56
+54 55 bop 262 307 a Fp(Doubled)13 b(pa)o(wns)h(are)g(p)q(enalised,)g(the)g
+(size)h(of)e(the)h(p)q(enalt)o(y)g(dep)q(ends)h(on)f(the)g(\014le.)k(Dou-)262
+357 y(bled)e(pa)o(wns)g(are)g(w)o(orse)h(on)f(a)g(cen)o(tre)h(\014le)f(than)g
+(on)g(the)h(\015ank,)f(not)g(b)q(ecause)i(they)e(are)262 407
+y(considered)c(an)o(y)e(w)o(eak)o(er,)i(but)f(b)q(ecause)i(they)e(hinder)g
+(in)o(ter{piece)h(comm)o(unication.)i(Of-)262 457 y(ten)f(there)i(are)f(comp)
+q(ensations)e(for)h(doubled)g(pa)o(wns,)g(suc)o(h)h(as)f(op)q(en)h(\014les,)f
+(extra)h(cen)o(tre)262 506 y(con)o(trol)i(and)h(square)h(protection,)g(for)f
+(example.)26 b(Ho)o(w)o(ev)o(er,)18 b(these)g(asp)q(ects)h(are)f(dealt)262
+556 y(with)13 b(b)o(y)h(other)g(ev)n(aluation)f(criteria.)324
+641 y(This)d(criterion)g(tak)o(es)h(a)f(simplistic)e(view)i(of)g(the)g(p)q
+(enalties)h(asso)q(ciated)g(with)f(doubled)262 691 y(pa)o(wns)j(b)o(y)g
+(applying)f(a)h(basic)g(p)q(enalt)o(y)m(.)k(A)c(more)g(extensiv)o(e)h
+(analysis)e(of)h(the)h(asso)q(ciated)262 741 y(w)o(eaknesses)19
+b(suc)o(h)f(as)g(vulnerabilit)o(y)e(to)h(attac)o(k,)h(blo)q(c)o(k)n(ade)f
+(etc)i(are)f(addressed)h(in)e(the)262 791 y(general)d(pa)o(wn)f(w)o(eakness)i
+(criteria)f(\(de\014nition)g(9\).)262 943 y Fu(4.4.2)55 b(De\014nition)17
+b(8)i(:)24 b(Isolated)18 b(P)n(a)n(wns)262 1055 y Fp(A)12 b(pa)o(wn)f(is)h
+(isolated)f(if)h(there)h(do)q(es)g(not)e(exist)i(a)e(friendly)h(pa)o(wn)f(on)
+h(either)h(adjacen)o(t)f(\014le.)262 1104 y(Isolated)j(pa)o(wns)h(are)g(w)o
+(eak)g(b)q(ecause)h(they)g(cannot)e(b)q(e)i(supp)q(orted)g(b)o(y)e(friendly)h
+(pa)o(wns)262 1154 y(and)d(lik)o(e)g(doubled)h(pa)o(wns,)g(are)g(vulnerable)g
+(to)g(attac)o(k)f(and)h(blo)q(c)o(k)n(ade.)344 1256 y Fh(I)s(P)392
+1262 y Fe(col)448 1256 y Fp(=)492 1225 y Fc(P)535 1236 y Fk(64)535
+1269 y Fe(sq)q Fk(=1)651 1256 y Fl(if)f Fp(\(Occup)o(y\([P)o(a)o
+(wn],col,sq\))g Fl(and)g Fp(Isolated\(col,OnFile\(sq\)\)\))710
+1309 y Fh(I)728 1316 y Fe(O)q(nF)t(ile)p Fk(\()p Fe(sq)q Fk(\))651
+1359 y Fl(else)710 1409 y Fp(0)651 1459 y Fl(endif)344 1558
+y(where)380 1608 y Fh(I)398 1614 y Fe(f)433 1608 y Fp(:)147
+b([)p Ff(\000)p Fp(6)p Fh(;)7 b Ff(\000)p Fp(10)p Fh(;)g Ff(\000)p
+Fp(14)p Fh(;)g Ff(\000)p Fp(20)p Fh(;)g Ff(\000)p Fp(20)p Fh(;)f
+Ff(\000)p Fp(14)p Fh(;)g Ff(\000)p Fp(10)p Fh(;)h Ff(\000)p
+Fp(6])651 1658 y(Indexed)15 b(b)o(y)f(\014le)g(f)f(\(1)h(to)g(8\).)262
+1777 y(Isolated)19 b(pa)o(wns)h(are)g(p)q(enalised)g(dep)q(ending)g(on)f
+(their)h(cen)o(tralisation.)35 b(An)20 b(isolated)262 1826
+y(pa)o(wn)13 b(on)g(the)i Fl(d)e Fp(or)h Fl(e)f Fp(\014les)i(is)e(considered)
+i(the)g(w)o(eak)o(est.)j(Ho)o(w)o(ev)o(er,)c(an)g(isolated)f(cen)o(tre)262
+1876 y(pa)o(wn)d(has)g(a)g(dynamic)f(strength)i(whic)o(h)g(Nimzo)o(witsc)o(h)
+e(so)h(elo)q(quen)o(tly)g(said)g(w)o(as)g(its)h("lust)262 1926
+y(to)16 b(expand".)28 b(This)17 b(asp)q(ect)i(is)e(co)o(v)o(ered)h(b)o(y)e
+(other)i(ev)n(aluation)e(criteria,)i(for)e(example,)262 1976
+y(cen)o(tre)i(con)o(trol.)29 b(Also)17 b(asp)q(ects)i(concerning)f(the)g(w)o
+(eaknesses)h(of)e(isolated)g(pa)o(wns)g(are)262 2026 y(sp)q(eci\014cally)d
+(addressed)h(in)f(the)g(pa)o(wn)g(w)o(eakness)h(criteria)f(b)q(elo)o(w.)262
+2177 y Fu(4.4.3)55 b(De\014nition)17 b(9)i(:)24 b(W)-5 b(eak)19
+b(P)n(a)n(wns)262 2289 y Fp(P)o(a)o(wns)e(are)h(w)o(eak)f(when)h(they)g(are)g
+(not)g(protected)h(b)o(y)e(friendly)g(pa)o(wns)g(and)h(a)f(single)262
+2339 y(pa)o(wn)f(mo)o(v)o(e)g(cannot)h(b)q(e)h(made)e(whic)o(h)h(ac)o(hiev)o
+(es)g(this)g(protection.)29 b(W)m(eak)16 b(pa)o(wns)h(are)262
+2389 y(therefore)d(vulnerable)e(to)h(attac)o(k.)k(They)c(constitute)h
+(targets)f(whic)o(h)f(the)i(opp)q(onen)o(t)e(can)262 2439 y(aim)e(for.)17
+b(A)12 b(bac)o(kw)o(ard)h(pa)o(wn)f(is)g(therefore,)i(a)e(classic)g(example)g
+(of)f(a)h(w)o(eak)h(pa)o(wn)f(under)957 2574 y(54)p eop
+%%Page: 55 57
+55 56 bop 262 307 a Fp(m)o(y)14 b(de\014nition.)23 b(The)16
+b(idea)f(of)g(this)h(de\014nition)g(is)f(to)h(pic)o(k)f(up)h(as)g(man)o(y)e
+(cases)j(of)e(w)o(eak)262 357 y(pa)o(wns)i(as)h(p)q(ossible)h(in)e(one)h
+(general)g(set)h(of)e(criteria.)31 b(Therefore)19 b(isolated,)f(doubled,)262
+407 y(bac)o(kw)o(ard)13 b(and)h(pa)o(wn)g(c)o(hain)f(bases)i(ma)o(y)d(all)h
+(b)q(e)h(p)q(enalised)g(for)g(w)o(eakness.)324 492 y(In)i("My)f(System")g
+([43)o(],)g(Aron)h(Nimzo)o(witsc)o(h)f(giv)o(es)g(the)h(follo)o(wing)e(c)o
+(hess)j(strategy)262 542 y(for)9 b(handling)g(pa)o(wn)h(c)o(hains,)g("W)m(e)g
+(\014rst)g(direct)h(our)f(op)q(erations)h(against)e(the)i(base,)g(whic)o(h)
+262 592 y(w)o(e)17 b(attac)o(k)g(with)f(a)h(pa)o(wn,)g(and)f(b)o(y)h(threats)
+h(or)f(otherwise,)h(seek)g(to)f(cut)h(o\013)e(the)i(base)262
+641 y(from)13 b(its)j(asso)q(ciates)g(in)f(the)h(c)o(hain.)23
+b(This)15 b(done,)h(w)o(e)g(turn)g(our)f(atten)o(tion)h(to)f(the)h(next)262
+691 y(opp)q(onen)o(t,)d(namely)f(the)i(link)e(whic)o(h)h(has)h(no)o(w)f(b)q
+(ecome)g(the)h(new)g(base".)k(This)13 b(metho)q(d)262 741 y(of)18
+b(handling)g(pa)o(wn)h(c)o(hains)h(will)e(b)q(e)i(encouraged)g(b)o(y)f(this)h
+(de\014nition)f(b)q(ecause)i(w)o(eak)262 791 y(pa)o(wn)11 b(bases)i(are)f
+(iden)o(ti\014ed)g(and)f(progressiv)o(ely)h(p)q(enalised,)g(therefore)h
+(encouraging)f(the)262 841 y(attac)o(king)h(side)h(to)g(build)f(up)h
+(pressure)i(on)e(the)g(w)o(eak)g(pa)o(wn.)344 943 y Fh(W)6
+b(P)416 949 y Fe(col)471 943 y Fp(=)515 912 y Fc(P)559 922
+y Fk(64)559 955 y Fe(sq)q Fk(=1)642 943 y Fh(W)g(K)722 949
+y Fe(col;sq)344 1046 y Fl(where)380 1095 y Fh(W)g(K)460 1101
+y Fe(col;sq)559 1095 y Fp(:)j Fl(if)k Fp(\(Occup)o(y\([P)o(a)o(wn],col,sq\))g
+Fl(and)g Fp(W)m(eak\(col,sq\)\))639 1145 y Fh(W)6 b(K)719 1151
+y Fe(col;sq)817 1145 y Fp(=)12 b Fh(W)900 1151 y Fe(col;sq)995
+1145 y Ff(\000)d Fp(10)g Ff(\001)g Fh(])p Fp(A)o(ttac)o(ks\([P)o(a)o
+(wn],Opp\(col\),)p Fh(sq)1625 1151 y Fe(inf)s(r)q(ont)1744
+1145 y Fp(\))639 1195 y Fl(if)k Fp(\(SemiOp)q(en\(Opp\(col\),OnFile\(sq\)\))
+639 1245 y Fl(and)h Fp(Has\([Ro)q(ok,Queen],Opp\(col\)\)\))699
+1295 y Fh(W)6 b(K)779 1301 y Fe(col;sq)876 1295 y Fp(=)12 b
+Fh(W)6 b(K)1000 1301 y Fe(col;sq)1086 1295 y Ff(\000)14 b Fp(phase/2)639
+1345 y Fl(endif)639 1394 y(if)f Fp(\(A)o(ttac)o(k)o(ed\([Ro)q
+(ok],Opp\(col\),sq\)\))699 1444 y Fh(W)6 b(K)779 1450 y Fe(col;sq)876
+1444 y Fp(=)12 b Fh(W)6 b(K)1000 1450 y Fe(col;sq)1095 1444
+y Ff(\000)k Fp(4)639 1494 y Fl(endif)639 1544 y(if)j Fp(\(Occup)o(y\([An)o
+(y],Opp\(col\),)p Fh(sq)1170 1550 y Fe(inf)s(r)q(ont)1290 1544
+y Fp(\)\))699 1594 y Fh(W)6 b(K)779 1600 y Fe(col;sq)876 1594
+y Fp(=)12 b Fh(W)6 b(K)1000 1600 y Fe(col;sq)1095 1594 y Ff(\000)k
+Fp(8)639 1643 y Fl(endif)580 1693 y(else)639 1743 y Fh(W)c(K)719
+1749 y Fe(col;sq)817 1743 y Fp(=)12 b(0)580 1793 y Fl(endif)380
+1892 y Fh(W)419 1898 y Fe(col;sq)518 1892 y Fp(:)50 b(di\013)14
+b(=)g Fh(])p Fp(Di\013A)o(ttac)o(ks\(Opp\(col\),sq\))580 1942
+y Fl(if)f Fp(\(di\013)h Fh(>)g Fp(0\))639 1992 y Fl(if)f Fp(\(di\013)h
+Fh(<)g Fp(5\))699 2042 y Fh(W)738 2048 y Fe(col;sq)835 2042
+y Fp(=)g([)p Ff(\000)p Fp(10)p Fh(;)7 b Ff(\000)p Fp(18)p Fh(;)g
+Ff(\000)p Fp(26)p Fh(;)g Ff(\000)p Fp(32])758 2092 y(Indexed)14
+b(b)o(y)g(di\013)g(\(1)f(to)h(4\).)639 2142 y Fl(else)699 2191
+y Fh(W)738 2197 y Fe(col;sq)835 2191 y Fp(=)e Ff(\000)p Fp(35)639
+2241 y Fl(endif)580 2291 y(else)639 2341 y Fh(W)678 2347 y
+Fe(col;sq)776 2341 y Fp(=)g Ff(\000)p Fp(4)580 2391 y Fl(endif)957
+2574 y Fp(55)p eop
+%%Page: 56 58
+56 57 bop 262 307 a Fp(W)m(eak)10 b(pa)o(wns)h(are)g(p)q(enalised)g(for)g
+(the)g(sev)o(erit)o(y)g(of)g(the)g(attac)o(k)g(up)q(on)g(them.)16
+b(A)11 b(p)q(enalt)o(y)g(is)262 357 y(levied)h(when)g(a)g(w)o(eak)g(pa)o(wn)g
+(is)g(on)g(a)g(semi-op)q(en)g(\014le)g(and)g(the)h(opp)q(onen)o(t)f(has)h
+(the)f(pieces)262 407 y(to)j(tak)o(e)g(adv)n(an)o(tage)g(of)g(this)g(w)o
+(eakness.)24 b(A)15 b(w)o(eak)h(pa)o(wn)f(whose)h(adv)n(ance)f(is)h
+(restricted)262 457 y(b)o(y)d(enem)o(y)g(pa)o(wn)h(attac)o(ks)g(is)g(further)
+h(p)q(enalised.)324 542 y(The)k(blo)q(c)o(k)n(ade)g(of)f(w)o(eak)h(p)q(oin)o
+(ts)g(form)e(an)i(imp)q(ortan)o(t)e(part)j(of)e(p)q(ositional)g(c)o(hess.)262
+592 y(Therefore)d(w)o(eak)e(pa)o(wns)h(are)h(p)q(enalised)f(for)f(b)q(eing)h
+(blo)q(c)o(k)n(aded)g(b)o(y)g(the)g(opp)q(onen)o(t.)262 742
+y Fu(4.4.4)55 b(De\014nition)17 b(10)i(:)24 b(P)n(assed)c(P)n(a)n(wns)262
+854 y Fp(A)c(pa)o(wn)g(is)g(passed)h(when)g(no)f(enem)o(y)g(pa)o(wns)g(on)g
+(the)h(same)f(or)g(adjacen)o(t)h(\014les)f(hinder)262 904 y(the)i(pa)o(wns)g
+(adv)n(ance)f(to)h(the)g(promotion)e(square.)30 b(A)18 b(passed)h(pa)o(wn)e
+(is)h(of)f(particular)262 954 y(v)n(alue,)e(esp)q(ecially)g(as)h(the)g(game)f
+(progresses)i(in)o(to)e(the)i(endgame.)22 b(It)16 b(not)g(only)f(carries)262
+1004 y(the)h(p)q(oten)o(tial)g(threat)h(of)e(b)q(ecoming)g(a)h(queen,)h(but)f
+(also)g(distracts)h(the)g(enem)o(y)e(pieces)262 1054 y(from)d(other)i(duties)
+h(in)e(order)i(to)e(restrain)i(the)g(passed)f(pa)o(wn.)344
+1151 y Fh(P)6 b(P)404 1157 y Fe(col)459 1151 y Fp(=)503 1120
+y Fc(P)546 1130 y Fk(64)546 1163 y Fe(sq)q Fk(=1)629 1151 y
+Fh(P)g(D)696 1157 y Fe(col;sq)344 1254 y Fl(where)380 1303
+y Fh(P)g(D)447 1309 y Fe(col;sq)546 1303 y Fp(:)58 b Fl(if)13
+b Fp(\(Occup)o(y\([P)o(a)o(wn],col,sq\))g Fl(and)g Fp(P)o(assed\(col,sq\)\))
+675 1353 y Fl(if)g Fp(\(phase)h Fh(>)g Fp(9\))734 1403 y Fh(P)6
+b(D)801 1409 y Fe(col;sq)898 1403 y Fp(=)12 b Fh(P)6 b Fp(4)996
+1410 y Fe(O)q(nRank)q Fk(\()p Fe(col;sq)q Fk(\))675 1453 y
+Fl(else)734 1503 y(if)13 b Fp(\()p Fh(M)5 b(tl)864 1510 y Fe(O)q(pp)p
+Fk(\()p Fe(col)p Fk(\))1008 1503 y Fp(=)14 b(KingV)m(alue\))793
+1553 y Fl(if)f Fp(\()p Fl(not)g Fp(InsideQuadrate\(Opp\(col\),sq\)\))852
+1602 y Fh(P)6 b(D)919 1608 y Fe(col;sq)1016 1602 y Fp(=)12
+b Fh(P)6 b Fp(1)1114 1609 y Fe(O)q(nRank)q Fk(\()p Fe(col;sq)q
+Fk(\))793 1652 y Fl(else)852 1702 y Fh(P)g(D)919 1708 y Fe(col;sq)1016
+1702 y Fp(=)12 b Fh(P)6 b Fp(2)1114 1709 y Fe(O)q(nRank)q Fk(\()p
+Fe(col;sq)q Fk(\))793 1752 y Fl(endif)734 1802 y(else)793 1851
+y Fh(P)g(D)860 1857 y Fe(col;sq)957 1851 y Fp(=)12 b Fh(P)6
+b Fp(3)1055 1858 y Fe(O)q(nRank)q Fk(\()p Fe(col;sq)q Fk(\))734
+1901 y Fl(endif)734 1951 y(if)13 b Fp(\(InsideQuadrate\(Opp\(col\),sq\)\))793
+2001 y Fh(P)6 b(D)860 2007 y Fe(col;sq)957 2001 y Fp(=)12 b
+Fh(P)6 b(D)1068 2007 y Fe(col;sq)1163 2001 y Ff(\000)j Fh(r)q(ev)q(P)d(hase=)
+p Fp(2)734 2051 y Fl(endif)734 2100 y Fh(P)g(D)801 2106 y Fe(col;sq)898
+2100 y Fp(=)12 b Fh(P)6 b(D)1009 2106 y Fe(col;sq)1104 2100
+y Ff(\000)j Fh(])p Fp(Occupied\()p Fh(sq)1382 2106 y Fe(inf)s(r)q(ont)1503
+2100 y Fp(,PSq\(col,sq\)\))p Ff(\001)p Fp(revPhase/4)734 2150
+y Fl(if)30 b Fp(\(A)o(ttac)o(k)o(ed\([P)o(a)o(wn],col,)p Fh(sq)1224
+2156 y Fe(inf)s(r)q(ont)1342 2150 y Fp(\))793 2200 y Fl(or)13
+b Fp(A)o(ttac)o(k)o(ed\([P)o(a)o(wn],col,sq\)\))793 2250 y
+Fh(P)6 b(D)860 2256 y Fe(col;sq)957 2250 y Fp(=)12 b Fh(P)6
+b(D)1068 2256 y Fe(col;sq)1163 2250 y Fp(+)j Fh(U)c(N)1270
+2257 y Fe(O)q(nRank)q Fk(\()p Fe(col;sq)q Fk(\))734 2300 y
+Fl(endif)734 2350 y(if)13 b Fp(\(Occup)o(y\([An)o(y],Opp\(col\),)p
+Fh(sq)1265 2356 y Fe(inf)s(r)q(ont)1384 2350 y Fp(\)\))793
+2399 y Fh(P)6 b(D)860 2405 y Fe(col;sq)957 2399 y Fp(=)12 b
+Fh(P)6 b(D)1068 2405 y Fe(col;sq)1163 2399 y Ff(\000)j Fh(r)q(ev)q(P)d(hase)
+734 2449 y Fl(endif)957 2574 y Fp(56)p eop
+%%Page: 57 59
+57 58 bop 734 307 a Fl(for)15 b(eac)o(h)g(square)f Fp(sq2)f
+Fl(b)q(et)o(w)o(een)g Fp(sq)h Fl(and)f Fp(PSq\(col,sq\))h Fl(do)793
+357 y Fh(P)6 b(D)860 363 y Fe(col;sq)957 357 y Fp(=)12 b Fh(P)6
+b(D)1068 363 y Fe(col;sq)1163 357 y Fp(+)j(4)g Ff(\001)g Fh(])p
+Fp(Di\013A)o(ttac)o(ks\(col,sq2\))734 407 y Fl(endfor)675 457
+y(endif)675 506 y Fh(P)d(D)742 512 y Fe(col;sq)839 506 y Fp(=)12
+b Fh(P)6 b(D)950 512 y Fe(col;sq)1035 506 y Ff(\001)14 b Fp(revPhase/16)616
+556 y Fl(else)675 606 y Fh(P)6 b(D)742 612 y Fe(col;sq)839
+606 y Fp(=)12 b(0)616 656 y Fl(endif)380 756 y Fh(P)6 b Fp(1)434
+762 y Fe(r)465 756 y Fp(:)139 b([0)p Fh(;)7 b Fp(400)p Fh(;)g
+Fp(400)p Fh(;)f Fp(450)o Fh(;)h Fp(5)o(15)p Fh(;)f Fp(600)p
+Fh(;)g Fp(700)o Fh(;)h Fp(0])675 805 y(Indexed)15 b(b)o(y)e(rank)h(r)g(\(1)g
+(to)g(8\).)380 905 y Fh(P)6 b Fp(2)434 911 y Fe(r)465 905 y
+Fp(:)139 b([0)p Fh(;)7 b Fp(40)p Fh(;)g Fp(40)p Fh(;)g Fp(5)o(5)p
+Fh(;)f Fp(80)p Fh(;)g Fp(115)p Fh(;)g Fp(155)o Fh(;)h Fp(0])675
+955 y(Indexed)15 b(b)o(y)e(rank)h(r)g(\(1)g(to)g(8\).)380 1054
+y Fh(P)6 b Fp(3)434 1060 y Fe(r)465 1054 y Fp(:)139 b([0)p
+Fh(;)7 b Fp(22)p Fh(;)g Fp(22)p Fh(;)g Fp(4)o(0)p Fh(;)f Fp(65)p
+Fh(;)g Fp(95)p Fh(;)g Fp(135)p Fh(;)g Fp(0])675 1104 y(Indexed)15
+b(b)o(y)e(rank)h(r)g(\(1)g(to)g(8\).)380 1204 y Fh(P)6 b Fp(4)434
+1210 y Fe(r)465 1204 y Fp(:)139 b([0)p Fh(;)7 b Fp(16)p Fh(;)g
+Fp(16)p Fh(;)g Fp(3)o(2)p Fh(;)f Fp(44)p Fh(;)g Fp(56)p Fh(;)g
+Fp(68)p Fh(;)g Fp(0])675 1254 y(Indexed)15 b(b)o(y)e(rank)h(r)g(\(1)g(to)g
+(8\).)380 1353 y Fh(U)5 b(N)446 1359 y Fe(r)478 1353 y Fp(:)126
+b([0)p Fh(;)7 b Fp(6)p Fh(;)g Fp(6)p Fh(;)g Fp(12)p Fh(;)f
+Fp(28)o Fh(;)h Fp(86)o Fh(;)g Fp(12)o(0)p Fh(;)g Fp(0)o(])675
+1403 y(Indexed)15 b(b)o(y)e(rank)h(r)g(\(1)g(to)g(8\).)262
+1522 y(Using)d(this)g(de\014nition,)g(passed)h(pa)o(wns)f(are)h(classi\014ed)
+g(under)g(4)f(categories.)18 b(This)11 b(allo)o(ws)262 1571
+y(unstoppable)17 b(passed)h(pa)o(wns)g(to)f(b)q(e)h(iden)o(ti\014ed)f(and)g
+(giv)o(en)g(increased)i(b)q(on)o(uses.)29 b(The)262 1621 y(v)n(alue)8
+b(of)h(a)g(passed)i(pa)o(wn)e(is)g(dep)q(enden)o(t)i(on)e(its)h(category)g
+(and)f(the)h(obstructions)g(b)q(et)o(w)o(een)262 1671 y(its)j(curren)o(t)j
+(square)e(and)g(the)h(queening)f(square.)324 1756 y(The)c(passed)h(pa)o(wn)f
+(is)g(p)q(enalised)g(for)g(b)q(eing)g('within)f(range')h(of)f(the)i(enem)o(y)
+e(king.)16 b(The)262 1806 y(blo)q(c)o(k)n(ade)g(of)h(a)g(passed)h(pa)o(wn)f
+(is)g(v)o(ery)g(e\013ectiv)o(e)i(as)e(it)g(is)g(a)g(metho)q(d)f(of)h(mec)o
+(hanically)262 1856 y(stopping)c(the)i(pa)o(wns)f(progress.)365
+1939 y("The)g(passed)h(pa)o(wn)f(is)g(a)f(criminal)f(who)h(should)h(b)q(e)h
+(k)o(ept)f(under)h(lo)q(c)o(k)e(and)365 1989 y(k)o(ey)m(.)18
+b(Mild)13 b(measures,)h(suc)o(h)g(as)g(p)q(olice)g(surv)o(eillance)g(are)g
+(not)g(su\016cien)o(t.")1206 2055 y Fm(A)o(r)n(on)g(Nimzowitsch)262
+2174 y Fp(Therefore,)e(a)e(passed)i(pa)o(wn)e(is)g(p)q(enalised)h(for)g(b)q
+(oth)f(immediate)e(and)j(future)g(blo)q(c)o(k)n(aders.)262
+2223 y(This)18 b(has)h(the)h(b)q(ene\014t)g(of)e(encouraging)h(the)g(opp)q
+(osing)f(side)h(to)g(blo)q(c)o(k)n(ade)f(along)g(the)262 2273
+y(complete)c(path)h(of)g(the)h(passed)g(pa)o(wn.)22 b(Connected)17
+b(or)e(united)h(passed)g(pa)o(wns)f(receiv)o(e)262 2323 y(a)e(b)q(on)o(us)g
+(for)g(their)h(added)g(strength.)19 b(This)13 b(b)q(on)o(us)h(increases)h
+(dramatically)10 b(with)j(rank.)262 2373 y(Con)o(trol)k(is)h(encouraged)i(o)o
+(v)o(er)e(all)f(squares)i(b)q(et)o(w)o(een)h(the)f(pa)o(wn)f(and)g(the)h
+(promotion)262 2423 y(square.)f(The)d(b)q(on)o(uses)g(and)e(p)q(enalties)i
+(are)f(adjusted)g(dep)q(ending)h(on)f(the)g(game)e(phase.)957
+2574 y(57)p eop
+%%Page: 58 60
+58 59 bop 262 307 a Fu(4.4.5)55 b(De\014nition)17 b(11)i(:)24
+b(P)n(a)n(wn)d(T)-5 b(able)344 403 y Fh(P)6 b(T)401 409 y Fe(col)456
+403 y Fp(=)500 372 y Fc(P)544 382 y Fk(64)544 415 y Fe(sq)q
+Fk(=1)675 403 y Fl(if)13 b Fp(\(Occup)o(y\([P)o(a)o(wn],col,sq\)\))734
+456 y Fh(P)6 b(S)r(T)818 462 y Fe(col;sq)675 506 y Fl(else)734
+556 y Fp(0)675 605 y Fl(endif)344 705 y(where)380 755 y Fh(P)g(S)r(T)464
+761 y Fe(col;sq)564 755 y Fp(:)40 b(P)o(a)o(wn)13 b(Square)i(T)m(able.)i
+(Initialised)c(b)q(efore)i(eac)o(h)f(searc)o(h.)616 805 y(See)h(planning)d
+(section)j(4.11.3)d(for)h(details.)262 931 y(A)j(static)g(pa)o(wn)g(square)g
+(table)g(will)f(b)q(e)h(used)h(to)f(store)h(the)g(v)n(alues)e(of)h(eac)o(h)g
+(square)h(for)262 981 y(ha)o(ving)e(a)h(pa)o(wn)g(o)q(ccup)o(y)h(that)f
+(square.)27 b(This)16 b(enables)h(kno)o(wledge)f(calculated)h(at)f(the)262
+1031 y(ro)q(ot)e(to)h(b)q(e)g(e\016cien)o(tly)g(applied)f(at)g(leaf)g(no)q
+(des.)22 b(The)15 b(table)f(will)g(b)q(e)h(calculated)g(b)q(efore)262
+1081 y(commencemen)o(t)c(of)j(the)g(searc)o(h)h(in)e(an)h(initial)e(planning)
+h(phase.)262 1232 y Fu(4.4.6)55 b(De\014nition)17 b(12)i(:)24
+b(P)n(a)n(wn)d(V)-5 b(alue)344 1323 y Fh(P)6 b(V)401 1329 y
+Fe(col)456 1323 y Fp(=)12 b Fh(D)q(P)562 1329 y Fe(col)615
+1323 y Fp(+)e Fh(I)s(P)705 1329 y Fe(col)758 1323 y Fp(+)g
+Fh(W)c(P)872 1329 y Fe(col)925 1323 y Fp(+)j Fh(P)d(P)1026
+1329 y Fe(col)1078 1323 y Fp(+)k Fh(P)c(T)1177 1329 y Fe(col)344
+1423 y Fl(where)380 1473 y Fh(D)q(P)442 1479 y Fe(col)498 1473
+y Fp(:)23 b Fl(Doubled)13 b(P)o(a)o(wns)i(\(De\014niti)o(on)e(7\).)380
+1572 y Fh(I)s(P)428 1578 y Fe(col)498 1572 y Fp(:)23 b Fl(Isolated)14
+b(P)o(a)o(wns)h(\(De\014niti)o(on)e(8\).)380 1672 y Fh(W)6
+b(P)452 1678 y Fe(col)498 1672 y Fp(:)23 b Fl(W)l(eak)17 b(P)o(a)o(wns)e
+(\(De\014niti)o(on)d(9\).)380 1772 y Fh(P)6 b(P)440 1778 y
+Fe(col)498 1772 y Fp(:)23 b Fl(P)o(assed)15 b(P)o(a)o(wns)g(\(De\014niti)o
+(on)d(10\).)380 1871 y Fh(P)6 b(T)437 1877 y Fe(col)498 1871
+y Fp(:)23 b Fl(P)o(a)o(wn)15 b(T)l(able)g(\(De\014niti)o(on)e(11\).)262
+1998 y Fp(All)d(the)j(pa)o(wn)e(ev)n(aluation)f(criteria)i(used)h(in)e(this)h
+(section)g(can)g(b)q(e)g(summed)e(to)i(calculate)262 2048 y(a)h(total)g(pa)o
+(wn)h(v)n(alue)f(for)h(ev)o(ery)g(pa)o(wn)g(of)f(a)h(giv)o(en)f(colour.)957
+2574 y(58)p eop
+%%Page: 59 61
+59 60 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0s0ZrZkZ)646
+482 y(Z0Z0Z0ob)646 565 y(pZ0o0o0o)646 648 y(Z0mPlPZ0)646 731
+y(pZPZPZPZ)646 814 y(Z0Z0L0MP)646 897 y(0Z0M0ZKZ)646 980 y(ZRZ0S0Z0)p
+1310 980 V 641 984 673 5 v 339 1102 a Fp(Figure)14 b(4.4:)j
+Fl(Capablanca)e(v)h(Bogljub)q(o\013)p Fp(,)11 b(London)i(1922,)g(White)g(to)h
+(Pla)o(y)m(.)324 1221 y(Applying)e(these)j(pa)o(wn)f(ev)n(aluation)e
+(criteria)i(to)f(the)h(p)q(osition)f(sho)o(wn)h(in)f(\014gure)h(4.4,)262
+1271 y(will)e(pro)q(duce)j(the)g(follo)o(wing)c(results:)344
+1368 y Fh(P)6 b(V)401 1374 y Fe(W)t(hite)533 1368 y Fp(=)14
+b(0)9 b(+)h(0)f Ff(\000)g Fp(74)g(+)h(0)f(+)g(118)i(=)h(44)344
+1418 y Fh(P)6 b(V)401 1424 y Fe(B)q(lack)533 1418 y Fp(=)14
+b Ff(\000)p Fp(12)9 b Ff(\000)h Fp(32)f Ff(\000)g Fp(70)g(+)g(18)g(+)h(84)h
+(=)g Ff(\000)p Fp(12)957 2574 y(59)p eop
+%%Page: 60 62
+60 61 bop 262 307 a Fr(4.5)69 b(Knigh)n(t)23 b(Ev)l(aluation)262
+434 y Fp(Knigh)o(ts)17 b(are)h(v)o(ery)g(useful)g(pieces,)h(particularly)e
+(in)g(the)h(op)q(ening)f(and)h(middle)e(game.)262 483 y(Knigh)o(ts)10
+b(are)h(esp)q(ecially)g(e\013ectiv)o(e)h(in)e(closed)i(p)q(ositions)e(where)i
+(they)f(can)g('jump')d(o)o(v)o(er)j(an)262 533 y(obstructing)g(pa)o(wn)g(c)o
+(hain.)17 b(A)12 b(knigh)o(t)e(b)q(ecomes)i(v)o(ery)f(strong)h(if)e(it)h
+(reac)o(hes)i(an)e(adv)n(anced)262 583 y(cen)o(tral)i(p)q(ost)h(whic)o(h)g
+(cannot)f(b)q(e)i(attac)o(k)o(ed)e(b)o(y)h(enem)o(y)e(pa)o(wns.)18
+b(In)c(the)g(ending,)f(knigh)o(ts)262 633 y(are)i(generally)g(less)h
+(e\013ectiv)o(e)h(b)q(ecause)g(they)f(only)e(ha)o(v)o(e)h(a)g(short)h(range.)
+23 b(Knigh)o(ts)15 b(also)262 683 y(ha)o(v)o(e)e(the)i(abilit)o(y)d(to)i
+(fork)f(opp)q(osing)g(forces.)262 834 y Fu(4.5.1)55 b(De\014nition)17
+b(13)i(:)24 b(Knigh)n(t)19 b(V)-5 b(alue)344 1001 y Fh(N)5
+b(V)406 1007 y Fe(col)462 1001 y Fp(=)506 970 y Fc(P)549 980
+y Fk(64)549 1013 y Fe(sq)q Fk(=1)675 1001 y Fl(if)13 b Fp(\(Occup)o
+(y\([Knigh)o(t],col,sq\)\))734 1054 y Fh(N)5 b(S)r(T)823 1060
+y Fe(col;sq)675 1104 y Fl(else)734 1153 y Fp(0)675 1203 y Fl(endif)344
+1303 y(where)380 1353 y Fh(N)g(S)r(T)469 1359 y Fe(col;sq)569
+1353 y Fp(:)35 b(Knigh)o(t)13 b(Square)i(T)m(able.)i(Initialised)c(b)q(efore)
+h(eac)o(h)h(searc)o(h.)616 1402 y(See)g(planning)d(section)j(4.11.4)d(for)h
+(details.)262 1529 y(Knigh)o(t)19 b(ev)n(aluation)f(criteria)h(are)h(com)o
+(bined)e(in)h(a)g(knigh)o(t)g(square)h(table.)34 b(Concepts)262
+1579 y(suc)o(h)19 b(as)f(pa)o(wn)g(holes,)i(strong)e(squares,)j(cen)o
+(tralisation)d(and)g(king)g(closeness)i(will)d(b)q(e)262 1629
+y(calculated)d(in)f(an)h(initial)e(planning)g(phase.)324 1714
+y(It)k(m)o(ust)f(b)q(e)i(remem)o(b)q(ered)f(that)h(all)e(ev)n(aluation)g
+(criteria)h(are)h(in)o(trinsically)e(link)o(ed.)262 1764 y(Therefore,)g
+(knigh)o(ts)f(will)e(b)q(e)j(additionally)d(ev)n(aluated)i(b)o(y)g(other)h
+(criteria)g(for)f(suc)o(h)h(fea-)262 1814 y(tures)f(as)f(the)g(pa)o(wn)g(blo)
+q(c)o(k)n(ade,)f(cen)o(tre)j(con)o(trol,)d(square)i(con)o(trol,)f(...)j
+(etc,etc.)k(Applying)262 1864 y(these)15 b(knigh)o(t)e(ev)n(aluation)f
+(criteria)j(to)e(the)i(p)q(osition)e(in)h(\014gure)g(4.4)f(giv)o(es:)344
+1961 y Fh(N)5 b(V)406 1967 y Fe(W)t(hite)533 1961 y Fp(=)14
+b(6)344 2011 y Fh(N)5 b(V)406 2017 y Fe(B)q(lack)533 2011 y
+Fp(=)14 b(6)957 2574 y(60)p eop
+%%Page: 61 63
+61 62 bop 262 307 a Fr(4.6)69 b(Bishop)23 b(Ev)l(aluation)262
+434 y Fp(Bishops)16 b(are)g(e\013ectiv)o(e)h(pieces)g(throughout)f(the)g
+(game,)f(but)h(esp)q(ecially)f(in)h(op)q(en)g(p)q(osi-)262
+483 y(tions)d(where)h(their)g(scop)q(e)h(is)e(less)h(hindered.)k(A)c(bishop)f
+(is)g(often)h(used)g(to)f(pin)g(opp)q(osing)262 533 y(forces)h(and)e(attac)o
+(k)i(w)o(eak)f(p)q(oin)o(ts.)k(A)c(single)g(bishop)g(can)g(only)g(exert)h
+(pressure)h(\(attac)o(k\))262 583 y(on)h(squares)i(of)e(the)h(colour)f(it)g
+(is)h(on.)26 b(Therefore,)18 b(bishops)e(are)h(particularly)f(e\013ectiv)o(e)
+262 633 y(in)f(pairs)i(where)g(they)g(can)g(attac)o(k)f(b)q(oth)g(coloured)h
+(squares.)27 b(In)16 b(the)h(ending,)f(bishops)262 683 y(are)g(as)f(a)h
+(general)f(rule)h(b)q(etter)h(than)f(knigh)o(ts.)23 b(Ho)o(w)o(ev)o(er,)16
+b(there)h(are)f(strategies)h(whic)o(h)262 732 y(diminish)11
+b(a)j(bishops)g(p)q(o)o(w)o(er)g(e.g.)k(pa)o(wn)13 b(obstructions.)262
+883 y Fu(4.6.1)55 b(De\014nition)17 b(14)i(:)24 b(Bishop)19
+b(A)n(ttac)n(k)344 1050 y Fh(B)r(A)408 1056 y Fe(col)464 1050
+y Fp(=)508 1019 y Fc(P)552 1029 y Fk(64)552 1062 y Fe(sq)q
+Fk(=1)675 1050 y Fl(if)13 b Fp(\(Occup)o(y\([Knigh)o(t,Bishop,Ro)q
+(ok,Queen],Opp\(col\),sq\))675 1103 y Fl(and)g Fp(A)o(ttac)o(k)o
+(ed\([Bishop],col,sq\)\))734 1153 y(V)m(alue\(sq\))675 1202
+y Fl(else)734 1252 y Fp(0)675 1302 y Fl(endif)262 1424 y Fp(Bishops)d(are)g
+(giv)o(en)f(a)h(b)q(on)o(us)g(for)f(attac)o(king)g(enem)o(y)g(pieces,)j(the)e
+(v)n(alue)f(of)g(whic)o(h)h(dep)q(ends)262 1473 y(on)18 b(the)h(t)o(yp)q(e)g
+(of)g(piece)g(attac)o(k)o(ed.)33 b(This)18 b(criterion)i(will)d(encourage)i
+(the)h(program)d(to)262 1523 y(harass)c(the)h(enem)o(y)e(forces)i
+(particularly)e(those)i(of)e(high)g(v)n(alue,)g(e.g.)18 b(ro)q(oks)13
+b(and)g(queens.)324 1608 y(Note)18 b(that)f(pa)o(wns)h(are)g(excluded)h(as)e
+(they)i(are)f(more)e(lik)o(ely)g(to)i(obstruct)h(the)f(at-)262
+1658 y(tac)o(king)e(bishop)i(than)f(b)q(e)h(harassed)h(themselv)o(es.)29
+b(See)19 b(de\014nition)e(18,)g(Enem)o(y)g(P)o(a)o(wn)262 1708
+y(Obstruction,)d(for)g(more)e(details.)262 1859 y Fu(4.6.2)55
+b(De\014nition)17 b(15)i(:)24 b(Bishop)19 b(on)g(Kings)f(Diagonal)344
+2025 y Fh(B)r(K)412 2031 y Fe(col)469 2025 y Fp(=)512 1994
+y Fc(P)556 2005 y Fk(64)556 2038 y Fe(sq)q Fk(=1)675 2025 y
+Fl(if)13 b Fp(\(Occup)o(y\([Bishop],col,sq\))675 2078 y Fl(and)g
+Fp(SameDiagonal\(sq,Ki)o(ngSq\(Opp\(col\)\)\)\))734 2128 y(phase/2)675
+2178 y Fl(else)734 2228 y Fp(0)675 2278 y Fl(endif)262 2399
+y Fp(Bishops)f(are)g(encouraged)g(to)g(remain)e(on)i(the)g(same)f(diagonal)f
+(as)h(the)i(enem)o(y)e(king.)16 b(The)262 2449 y(b)q(on)o(us)e(receiv)o(ed)h
+(decreases)h(as)e(the)h(game)d(progresses.)20 b(This)14 b(is)f(an)h(attempt)f
+(to)h(correct)957 2574 y(61)p eop
+%%Page: 62 64
+62 63 bop 262 307 a Fp(a)16 b(w)o(eakness)i(I)e(feel)h(most)f(c)o(hess)i
+(programs)d(ha)o(v)o(e.)26 b(That)17 b(of)f(lea)o(ving)f(the)j(king)e(on)g
+(the)262 357 y(same)e(diagonal)f(as)i(the)h(enem)o(y)e(bishop,)h
+(particularly)f(when)i(it)f(is)g(on)f(a)h(long)f(diagonal)262
+407 y(and)f(a)h(n)o(um)o(b)q(er)f(of)g(pieces)i(are)g(in)o(terp)q(osed.)324
+492 y(The)d(ideas)g(b)q(ehind)g(suc)o(h)h(a)f(strategy)g(are)h(normally)c
+(more)i(long)g(term)g(and)h(therefore)262 542 y(cannot)i(b)q(e)i(clearly)e
+(iden)o(ti\014ed)h(b)o(y)f(searc)o(h.)22 b(Against)14 b(a)g(h)o(uman)f(opp)q
+(onen)o(t)i(this)g(t)o(yp)q(e)g(of)262 592 y(bishop)g(placemen)o(t)g(will)f
+(hop)q(efully)h(pro)o(vide)h(an)f(attac)o(king)g(p)q(oten)o(tial)g(whic)o(h)h
+(disturbs)262 641 y(the)e(opp)q(onen)o(ts)h(liking)d(for)h(the)i(p)q
+(osition.)262 793 y Fu(4.6.3)55 b(De\014nition)17 b(16)i(:)24
+b(Bishop)19 b(P)n(air)344 955 y Fh(B)r(P)404 961 y Fe(col)462
+955 y Fp(=)122 b Fl(if)13 b Fp(\(Has\([Bishop],col\))g Fh(>)h
+Fp(1\))675 1005 y(8)616 1055 y Fl(else)675 1104 y Fp(0)616
+1154 y Fl(endif)262 1281 y Fp(Bishops)i(w)o(ork)g(most)f(e\013ectiv)o(ely)i
+(in)e(pairs.)25 b(This)16 b(is)g(b)q(ecause)i(they)e(can)h(con)o(trol)e(b)q
+(oth)262 1331 y(coloured)i(squares)h(and)f(hence)i(complemen)o(t)c(eac)o(h)j
+(other.)29 b(Therefore,)19 b(this)e(heuristic)262 1381 y(rew)o(ards)d(the)h
+(pla)o(y)o(er)e(who)h(main)o(tains)d(a)j(pair)f(of)h(bishops.)262
+1532 y Fu(4.6.4)55 b(De\014nition)17 b(17)i(:)24 b(Horrwitz)19
+b(Bishops)344 1699 y Fh(H)s(B)413 1705 y Fe(col)469 1699 y
+Fp(=)513 1668 y Fc(P)557 1678 y Fk(64)557 1711 y Fe(sq)q Fk(=1)675
+1699 y Fl(if)13 b Fp(\(A)o(ttac)o(k)o(ed\([Bishop],col,sq\))g
+Fl(and)g Fp(A)o(ttac)o(k)o(ed\([Bishop],col,)p Fh(sq)1730 1705
+y Fe(next)1798 1699 y Fp(\)\))734 1752 y(2)675 1802 y Fl(else)734
+1851 y Fp(0)675 1901 y Fl(endif)262 2028 y Fp(This)e(criterion)i(essen)o
+(tially)f(rew)o(ards)h(a)e(bishop)h(pair)g(for)f(w)o(orking)h(together.)18
+b(When)12 b(t)o(w)o(o)262 2078 y(bishops)i(w)o(ork)g(on)g(adjacen)o(t)g
+(diagonals)f(their)i(scop)q(e)g(and)f(p)q(o)o(w)o(er)h(is)f(greatly)g
+(increased.)262 2128 y(This)h(barrier)h(of)f('bishop)f(p)q(o)o(w)o(er')h(can)
+h(completely)e(restrict)j(an)e(enem)o(y)g(king,)g(particu-)262
+2177 y(larly)f(in)i(an)g(ending)g(where)h(the)f(p)q(osition)g(is)g(op)q(en.)
+24 b(Therefore,)18 b(a)d(b)q(on)o(us)i(is)e(giv)o(en)h(for)262
+2227 y(ev)o(ery)e(pair)g(of)f(adjacen)o(t)h(horizon)o(tal)f(squares)i(attac)o
+(k)o(ed)f(b)o(y)g(bishops.)957 2574 y(62)p eop
+%%Page: 63 65
+63 64 bop 262 307 a Fu(4.6.5)55 b(De\014nition)17 b(18)i(:)24
+b(Enem)n(y)17 b(P)n(a)n(wn)k(Obstruction)344 474 y Fh(E)r(O)409
+480 y Fe(col)464 474 y Fp(=)508 443 y Fc(P)552 453 y Fk(64)552
+486 y Fe(sq)q Fk(=1)635 474 y Fh(O)q(B)699 480 y Fe(col;sq)344
+577 y Fl(where)380 626 y Fh(O)q(B)444 632 y Fe(col;sq)544 626
+y Fp(:)60 b Fl(if)30 b Fp(\(Occup)o(y\([P)o(a)o(wn],Opp\(col\),sq\))14
+b Fl(and)f Fp(A)o(ttac)o(k)o(ed\([Bishop],col,sq\)\))675 676
+y Fl(case)h Fh(])p Fp(A)o(ttac)o(ks\([P)o(a)o(wn],Opp\(col\),sq\))f
+Fl(of)734 726 y Fp(0)h(:)k Fh(O)q(B)863 732 y Fe(col;sq)960
+726 y Fp(=)12 b(2)734 826 y(1)i(:)k Fl(for)d(eac)o(h)g(square)e
+Fp(sq1)h Fl(do)852 875 y(for)h(eac)o(h)h(square)d Fp(sq2)h
+Fl(do)911 925 y(if)f Fp(\(A)o(ttac)o(king\([Bishop],col,sq1,sq\))911
+975 y Fl(and)g Fp(A)o(ttac)o(king\([P)o(a)o(wn],Opp\(col\),sq2,sq\)\))970
+1025 y Fl(if)g Fp(\(SameDiagonal\(sq1,)o(sq2\)\))1029 1075
+y Fh(O)q(B)1093 1081 y Fe(col;sq)1191 1075 y Fp(=)f Ff(\000)p
+Fp(10)970 1125 y Fl(else)1029 1174 y Fh(O)q(B)1093 1180 y Fe(col;sq)1191
+1174 y Fp(=)g Ff(\000)p Fp(6)970 1224 y Fl(endif)911 1274 y(endif)852
+1324 y(endfor)793 1374 y(endfor)734 1473 y Fp(2)i(:)k Fh(O)q(B)863
+1479 y Fe(col;sq)960 1473 y Fp(=)12 b Ff(\000)p Fp(16)675 1523
+y Fl(endcase)616 1573 y(endif)262 1700 y Fp(It)i(is)g(imp)q(ortan)o(t)e(to)i
+(p)q(enalise)h(a)f(bishop)f(whic)o(h)i(is)f(attac)o(king)f(an)h(almost)e(imp)
+q(enetrable)262 1749 y(enem)o(y)17 b(pa)o(wn)g(w)o(all.)29
+b(The)18 b(degree)i(of)d(pa)o(wn)h(protection)g(pro)o(vided)g(b)o(y)g(the)g
+(opp)q(onen)o(t)262 1799 y(to)12 b(the)i(attac)o(k)o(ed)g(enem)o(y)e(pa)o(wn)
+h(is)g(determined)g(and)g(an)g(appropriate)g(p)q(enalt)o(y)g(applied.)262
+1849 y(A)g(bishop)h(attac)o(king)f(an)h(unprotected)h(\(b)o(y)f(pa)o(wns\))g
+(enem)o(y)f(pa)o(wn)h(actually)e(receiv)o(es)k(a)262 1899 y(small)11
+b(b)q(on)o(us)j(to)g(indicate)g(that)g(it)f(ma)o(y)f(b)q(e)j(an)e(e\013ectiv)
+o(e)j(attac)o(k.)324 1984 y(This)c(criterion)h(helps)f(encourage)h(the)g
+(program)e(to)h(place)g(its)h(bishops)f(on)g(diagonals)262
+2034 y(where)j(they)g(can)f(b)q(e)h(most)e(e\013ectiv)o(e.)20
+b(Hence,)15 b(this)f(in)g(e\013ect,)i(complemen)o(ts)c(de\014nition)262
+2084 y(14)h(\(Bishop)h(A)o(ttac)o(k\))g(whic)o(h)f(is)h(also)f(concerned)j
+(with)d(the)h(e\013ectiv)o(eness)j(of)c(attac)o(ks)h(on)262
+2134 y(enem)o(y)f(pieces)i(b)o(y)e(bishops.)957 2574 y(63)p
+eop
+%%Page: 64 66
+64 65 bop 262 307 a Fu(4.6.6)55 b(De\014nition)17 b(19)i(:)24
+b(Bishop)19 b(T)-5 b(able)344 474 y Fh(B)r(T)401 480 y Fe(col)458
+474 y Fp(=)501 443 y Fc(P)545 453 y Fk(64)545 486 y Fe(sq)q
+Fk(=1)675 474 y Fp(if)13 b(\(Occup)o(y\([Bishop],col,sq\)\))734
+527 y Fh(B)r(S)r(T)818 533 y Fe(col;sq)675 577 y Fl(else)734
+626 y Fp(0)675 676 y Fl(endif)344 776 y(where)380 826 y Fh(B)r(S)r(T)464
+832 y Fe(col;sq)565 826 y Fp(:)39 b(Bishop)14 b(Square)g(T)m(able.)k
+(Initialised)12 b(b)q(efore)j(eac)o(h)f(searc)o(h.)616 875
+y(See)h(planning)d(section)j(4.11.5)d(for)h(details.)262 1002
+y(A)h(static)h(bishop)f(square)i(table)e(will)f(b)q(e)i(used)h(to)e(store)h
+(the)g(v)n(alues)g(of)f(eac)o(h)h(square)g(for)262 1052 y(ha)o(ving)e(a)h
+(bishop)h(o)q(ccup)o(y)g(that)g(square.)21 b(This)15 b(enables)g(kno)o
+(wledge)g(calculated)f(at)h(the)262 1102 y(ro)q(ot)f(to)h(b)q(e)g(e\016cien)o
+(tly)g(applied)f(at)g(leaf)g(no)q(des.)22 b(The)15 b(table)f(will)g(b)q(e)h
+(calculated)g(b)q(efore)262 1152 y(commencemen)o(t)c(of)j(the)g(searc)o(h)h
+(in)e(an)h(initial)e(planning)h(phase.)262 1303 y Fu(4.6.7)55
+b(De\014nition)17 b(20)i(:)24 b(Bishop)19 b(V)-5 b(alue)344
+1430 y Fh(B)r(V)401 1436 y Fe(col)457 1430 y Fp(=)12 b Fh(B)r(A)565
+1436 y Fe(col)619 1430 y Fp(+)e Fh(B)r(K)729 1436 y Fe(col)783
+1430 y Fp(+)f Fh(B)r(P)884 1436 y Fe(col)938 1430 y Fp(+)g
+Fh(H)s(B)1048 1436 y Fe(col)1102 1430 y Fp(+)g Fh(E)r(O)1208
+1436 y Fe(col)1261 1430 y Fp(+)h Fh(B)r(T)1360 1436 y Fe(col)344
+1529 y Fl(where)380 1579 y Fh(B)r(A)444 1585 y Fe(col)498 1579
+y Fp(:)23 b Fl(Bishop)14 b(A)o(ttac)o(k)h(\(De\014niti)o(on)e(14\).)380
+1679 y Fh(B)r(K)448 1685 y Fe(col)498 1679 y Fp(:)23 b Fl(Bishop)14
+b(On)h(Kings)g(Diagonal)f(\(De\014niti)o(on)e(15\).)380 1778
+y Fh(B)r(P)440 1784 y Fe(col)498 1778 y Fp(:)23 b Fl(Bishop)14
+b(P)o(air)g(\(De\014nitio)o(n)f(16\).)380 1878 y Fh(H)s(B)449
+1884 y Fe(col)498 1878 y Fp(:)23 b Fl(Horrwitz)15 b(Bishops)f(\(De\014niti)o
+(on)e(17\).)380 1978 y Fh(E)r(O)445 1984 y Fe(col)498 1978
+y Fp(:)23 b Fl(Enem)o(y)15 b(P)o(a)o(wn)h(Obstructio)o(n)d(\(De\014niti)o(on)
+f(18\).)380 2077 y Fh(B)r(T)437 2083 y Fe(col)498 2077 y Fp(:)23
+b Fl(Bishop)14 b(T)l(able)h(\(De\014niti)o(on)e(19\).)262 2204
+y Fp(All)d(the)h(bishop)g(ev)n(aluation)e(criteria)i(de\014ned)h(in)f(this)g
+(section)g(are)h(summed)d(to)i(calculate)262 2254 y(the)j(total)f(bishop)h(v)
+n(alue)f(for)h(a)f(giv)o(en)h(colour.)957 2574 y(64)p eop
+%%Page: 65 67
+65 66 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rZ0Z0skZ)646
+482 y(Z0ZqZpo0)646 565 y(0ZbZ0m0o)646 648 y(opa0oPZ0)646 731
+y(0Z0oPZPZ)646 814 y(OPZBZ0ZQ)646 897 y(0APM0Z0O)646 980 y(Z0Z0SRJ0)p
+1310 980 V 641 984 673 5 v 340 1102 a Fp(Figure)14 b(4.5:)j
+Fl(V)l(an)f(Vliet)d(v)k(Nimzo)o(witsc)o(h)p Fp(,)11 b(Ostend,)j(1907,)f(Blac)
+o(k)h(to)f(pla)o(y)m(.)324 1221 y(Applying)g(these)i(bishop)e(ev)n(aluation)g
+(criteria)h(to)f(the)i(p)q(osition)e(in)g(\014gure)h(4.5)f(giv)o(es:)344
+1368 y Fh(B)r(V)401 1374 y Fe(W)t(hite)533 1368 y Fp(=)h(0)9
+b(+)h(0)f(+)g(8)g(+)h(4)f Ff(\000)g Fp(8)g(+)h(18)h(=)h(22)344
+1418 y Fh(B)r(V)401 1424 y Fe(B)q(lack)533 1418 y Fp(=)i(0)9
+b(+)h(7)f(+)g(8)g(+)h(6)f(+)g(4)g(+)h(20)h(=)h(45)957 2574
+y(65)p eop
+%%Page: 66 68
+66 67 bop 262 307 a Fr(4.7)69 b(Ro)r(ok)23 b(Ev)l(aluation)262
+434 y Fp(The)d(ro)q(ok)f(is)h(a)g(v)o(ery)g(strong)g(piece.)37
+b(Ho)o(w)o(ev)o(er,)21 b(it)e(requires)i('ro)q(om')d(to)h(w)o(ork)h(most)262
+483 y(e\013ectiv)o(ely)m(.)324 569 y(In)14 b(the)g(op)q(ening)g(the)h(main)d
+(ob)r(jectiv)o(e)i(of)g(the)g(ro)q(oks)g(is)g(to)g(unite)g(with)g(one)g
+(another)262 618 y(and)f(supp)q(ort)i(more)e(adv)n(anced)h(pieces.)19
+b(This)14 b(pro)o(vides)g(extra)g(protection)g(and)g(div)o(ersi-)262
+668 y(\014es)g(the)h(a)o(v)n(ailable)c(plans)j(for)g(eac)o(h)g(ro)q(ok.)324
+753 y(In)e(the)i(middle)d(game)g(they)i(should)g(b)q(e)g(placed)g(on)f(the)i
+(\014le)e(where)i(a)e(break)i(through)262 803 y(is)d(lik)o(ely)g(to)h(o)q
+(ccur)h(or)f(to)g(protect)h(a)f(w)o(eak)g(or)g(strong)g(p)q(oin)o(t.)17
+b(Ro)q(oks)12 b(should)f(not)h(usually)262 853 y(lea)o(v)o(e)g(the)h
+(con\014nes)h(of)e(their)g(o)o(wn)h(forces)g(unless)g(they)g(can)g(gain)f
+(material)e(or)j(p)q(enetrate)262 903 y(to)e(the)h(7th)g(rank)f(successfully)
+m(.)18 b(A)12 b(ro)q(ok)g(can)f(mak)o(e)g(a)g(hea)o(vy)g(con)o(tribution)h
+(to)f(an)h(attac)o(k)262 953 y(on)h(the)i(enem)o(y)e(king)g(pro)o(vided)h(it)
+f(can)h(b)q(e)h(mano)q(euvred)e(in)o(to)g(an)h(attac)o(king)f(p)q(osition.)
+324 1038 y(The)e(endgame)f(is)h(where)i(the)e(ro)q(ok)g(truly)g(excels.)18
+b(Its)12 b(range)f(allo)o(ws)f(it)h(to)f(exert)j(pres-)262
+1088 y(sure)i(o)o(v)o(er)f(most)f(of)h(the)h(b)q(oard.)k(It)c(can)f(threaten)
+i(enem)o(y)e(pa)o(wns)g(and)g(cause)i(un)o(timely)262 1138
+y(pa)o(wn)e(adv)n(ances.)21 b(It)14 b(can)h(blo)q(c)o(k)n(ade)f(and)h
+(obstruct)h(enem)o(y)d(pa)o(wns)i(and)g(of)f(course)i(cap-)262
+1187 y(ture)c(them.)17 b(A)12 b(ro)q(ok)g(is)f(excellen)o(t)i(at)f
+(restricting)h(the)f(enem)o(y)g(kings)f(mo)o(v)o(emen)o(t)e(thereb)o(y)262
+1237 y(k)o(eeping)15 b(it)g(a)o(w)o(a)o(y)f(from)g(the)i(\014eld)f(of)g
+(action.)22 b(It)15 b(also)g(has)g(the)h(abilit)o(y)e(to)h(supp)q(ort)h(the)
+262 1287 y(adv)n(ance)d(of)h(friendly)f(passed)i(pa)o(wns)f(and)g(obstruct)h
+(enem)o(y)e(ones.)262 1439 y Fu(4.7.1)55 b(De\014nition)17
+b(21)i(:)24 b(Ro)r(ok{King)18 b(Closeness)344 1605 y Fh(RC)406
+1611 y Fe(col)461 1605 y Fp(=)505 1574 y Fc(P)549 1584 y Fk(64)549
+1618 y Fe(sq)q Fk(=1)675 1605 y Fl(if)13 b Fp(\(Occup)o(y\([Ro)q
+(ok],col,sq\)\))734 1658 y Ff(\000)p Fp(2)p Ff(\001)p Fp
+(KingDistance\(sq,KingSq\(Opp\(col\)\)\))675 1708 y Fl(else)734
+1758 y Fp(0)675 1808 y Fl(endif)262 1934 y Fp(Eac)o(h)18 b(ro)q(ok)g(is)g(p)q
+(enalised)g(for)g(its)g(distance)h(from)d(the)j(enem)o(y)e(king.)30
+b(A)18 b(ro)q(ok)g(on)g(the)262 1984 y(same)13 b(\014le)h(\(or)g(rank\))g(as)
+g(the)g(enem)o(y)g(king)f(w)o(ould)g(not)h(receiv)o(e)h(an)o(y)f(p)q(enalt)o
+(y)g(no)f(matter)262 2034 y(what)j(the)g(corresp)q(onding)h(rank)g(\(or)f
+(\014le\))g(distance)h(is.)25 b(An)o(y)16 b(p)q(enalties)h(giv)o(en)e(will)g
+(b)q(e)262 2084 y(directly)e(related)i(to)e(the)h(minim)n(um)c(rank)j(or)h
+(\014le)f(distance.)19 b(This)14 b(a)o(v)o(oids)e(the)i(pitfall)e(of)262
+2134 y(encouraging)k(a)g(ro)q(ok)g(to)g(mak)o(e)f(w)o(eak)h(mo)o(v)o(es)f(in)
+h(order)h(to)f(attain)f(the)i(b)q(est)h(rank)e Fm(and)262 2183
+y Fp(\014le)d(distance.)18 b(F)m(or)13 b(example,)f(in)h(\014gure)h(4.6,)e
+(this)h(criterion)h(w)o(ould)e Fl(not)h Fp(encourage)h(the)262
+2233 y(mo)o(v)o(es)e(Rh4-h5)h(or)h(Rg3-g4,)e(ho)o(w)o(ev)o(er,)h(it)h
+Fl(w)o(ould)e Fp(encourage)j(the)f(mo)o(v)o(e)f(Rg3-h3.)957
+2574 y(66)p eop
+%%Page: 67 69
+67 68 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0ZrZ0Zna)646
+482 y(ZbZ0ZpZk)646 565 y(pZ0o0o0o)646 648 y(ZpZ0sPZ0)646 731
+y(0Z0Z0M0S)646 814 y(ZNZBZ0S0)646 897 y(qZPL0ZPO)646 980 y(Z0Z0Z0J0)p
+1310 980 V 641 984 673 5 v 275 1102 a Fp(Figure)14 b(4.6:)j(Illustration)c
+(of)g(the)i(Ro)q(ok{King)d(Closeness)j(Heuristic,)f(White)g(to)g(Pla)o(y)m(.)
+262 1254 y Fu(4.7.2)55 b(De\014nition)17 b(22)i(:)24 b(Connected)19
+b(Ro)r(oks)344 1420 y Fh(C)s(R)409 1426 y Fe(col)464 1420 y
+Fp(=)508 1389 y Fc(P)551 1400 y Fk(64)551 1433 y Fe(sq)q Fk(=1)675
+1420 y Fl(if)13 b Fp(\(Occup)o(y\([Ro)q(ok],col,sq\))f Fl(and)h
+Fp(A)o(ttac)o(k)o(ed\([Ro)q(ok],col,sq\)\))734 1473 y(3)675
+1523 y Fl(else)734 1573 y Fp(0)675 1623 y Fl(endif)262 1750
+y Fp(Ro)q(oks)j(are)h(said)f(to)h(b)q(e)g(connected)i(if)c(they)j(defend)f
+(eac)o(h)g(other.)27 b(Ro)q(oks)17 b(are)g(giv)o(en)f(a)262
+1799 y(b)q(on)o(us)g(for)h(b)q(eing)f(connected.)29 b(This)16
+b(encourages)i(ro)q(oks)f(to)f(double)h(up)g(on)f(op)q(en)h(\014les)262
+1849 y(and)12 b(w)o(eak)h(p)q(oin)o(ts.)18 b(Connected)c(ro)q(oks)f(are)g
+(also)g(self)f(supp)q(orting)i(whic)o(h)e(div)o(ersi\014es)i(the)262
+1899 y(options)f(a)o(v)n(ailable.)957 2574 y(67)p eop
+%%Page: 68 70
+68 69 bop 262 307 a Fu(4.7.3)55 b(De\014nition)17 b(23)i(:)24
+b(Ro)r(ok)18 b(on)h(Op)r(en)f(File)344 403 y Fh(RO)408 409
+y Fe(col)463 403 y Fp(=)507 372 y Fc(P)551 382 y Fk(64)551
+415 y Fe(sq)q Fk(=1)675 403 y Fl(if)13 b Fp(\(Occup)o(y\([Ro)q
+(ok],col,sq\)\))734 456 y Fl(if)g Fp(\(Op)q(en\(OnFile\(sq\)\)\))793
+506 y(14)734 556 y Fl(else)793 605 y(if)g Fp(\(SemiOp)q
+(en\(col,OnFile\(sq\)\)\))852 655 y(6)793 705 y Fl(else)852
+755 y Fp(0)793 805 y Fl(endif)734 854 y(endif)675 904 y(else)734
+954 y Fp(0)675 1004 y Fl(endif)262 1119 y Fp(A)h(\014le)h(is)g(op)q(en)g(if)e
+(no)i(pa)o(wns)g(of)f(an)o(y)g(colour)g(exist)h(on)g(the)g(\014le.)21
+b(A)14 b(\014le)h(is)g(semi{op)q(en)e(if)262 1168 y(only)e(enem)o(y)h(pa)o
+(wns)h(exist)g(on)f(the)i(\014le.)j(Ro)q(oks)12 b(receiv)o(e)i(a)f(b)q(on)o
+(us)f(for)h(b)q(eing)f(on)h(an)f(op)q(en)262 1218 y(\014le.)18
+b(Con)o(trol)13 b(of)g(the)i(op)q(en)f(\014le)g(is)g(vital)f(in)h(order)g(to)
+g(b)q(e)h(able)e(to)h(ev)o(en)o(tually)g(p)q(enetrate)262 1268
+y(to)k(the)i(7th)e(and)h(8th)g(ranks.)33 b(Ev)o(en)19 b(if)f(the)h(opp)q
+(onen)o(t)g(has)g(con)o(trol)g(of)f(the)i(\014le)e(it)h(is)262
+1318 y(imp)q(ortan)o(t)12 b(to)h(rew)o(ard)i(attempts)e(whic)o(h)h(c)o
+(hallenge)g(this)g(con)o(trol.)324 1403 y(This)d(heuristic)g(has)h(the)f
+(added)h(b)q(ene\014t)g(of)e(encouraging)h(the)h(program)d(to)i(op)q(en)g
+(\014les)262 1453 y(whic)o(h)i(it)h(can)g(con)o(trol)g(and)f(k)o(eep)i
+(closed)f(those)h(whic)o(h)f(w)o(ould)f(b)q(ene\014t)i(the)f(opp)q(onen)o(t.)
+324 1538 y(A)k(ro)q(ok)g(is)g(also)f(rew)o(arded)j(for)d(b)q(eing)h(on)g(a)g
+(semi{op)q(en)f(\014le.)31 b(The)19 b(enem)o(y)e(pa)o(wn)262
+1588 y(whic)o(h)12 b(mak)o(es)g(the)h(\014le)f(semi{op)q(en)g(is)h(an)f(ob)o
+(vious)g(w)o(eak)h(p)q(oin)o(t)f(to)g(c)o(hallenge)h(with)f(ones)262
+1638 y(o)o(wn)f(pa)o(wns.)18 b(In)12 b(this)g(w)o(a)o(y)f(the)i(opp)q(onen)o
+(t)f(can)h(b)q(e)f(put)h(on)f(the)g(defensiv)o(e)h(and)f(attempts)262
+1688 y(can)f(b)q(e)h(made)e(to)h(build)f(up)i(pressure)h(or)e(fully)f(op)q
+(en)i(the)g(\014le)f(at)g(an)g(opp)q(ortune)h(momen)o(t.)262
+1837 y Fu(4.7.4)55 b(De\014nition)17 b(24)i(:)24 b(Ro)r(ok)18
+b(on)h(Sev)n(en)n(th)f(Rank)344 1933 y Fh(RS)401 1939 y Fe(col)457
+1933 y Fp(=)501 1902 y Fc(P)545 1912 y Fk(64)545 1945 y Fe(sq)q
+Fk(=1)675 1933 y Fl(if)13 b Fp(\(Occup)o(y\([Ro)q(ok],col,sq\))f
+Fl(and)h Fp(OnRank\(col,sq\))h(=)g(7\))734 1986 y Fl(if)f Fp
+(\(OnRank\(col,KingSq\(Opp\(col\)\)\))g Ff(\025)h Fp(7\))793
+2036 y(14)734 2085 y Fl(else)793 2135 y Fp(6)734 2185 y Fl(endif)675
+2235 y(else)734 2285 y Fp(0)675 2334 y Fl(endif)262 2449 y
+Fp(P)o(enetration)j(to)f(the)h(7th)g(rank)g(is)f(the)h(natural)f(consequence)
+j(and)e(goal)e(of)h(ro)q(ok)h(pla)o(y)957 2574 y(68)p eop
+%%Page: 69 71
+69 70 bop 262 307 a Fp(on)13 b(op)q(en)i(\014les.)k(A)c(ro)q(ok)f(on)f(the)i
+(7th)f(rank)g(can)h(wreak)f(ha)o(v)o(o)q(c)g(on)g(the)h(enem)o(y)e(king)h
+(and)262 357 y(pa)o(wns.)20 b(Therefore)15 b(o)q(ccupation)g(of)f(the)h(7th)g
+(rank)f(b)o(y)g(a)h(ro)q(ok)f(receiv)o(es)i(a)e(b)q(on)o(us.)21
+b(This)262 407 y(b)q(on)o(us)14 b(is)f(esp)q(ecially)h(large)g(if)f(the)i
+(enem)o(y)e(king)g(is)h(on)f(the)i(7th)e(or)h(8th)g(ranks.)262
+558 y Fu(4.7.5)55 b(De\014nition)17 b(25)i(:)24 b(Ro)r(ok)18
+b(V)-5 b(alue)344 649 y Fh(RV)400 655 y Fe(col)456 649 y Fp(=)12
+b Fh(RC)562 655 y Fe(col)614 649 y Fp(+)e Fh(C)s(R)721 655
+y Fe(col)773 649 y Fp(+)g Fh(RO)879 655 y Fe(col)931 649 y
+Fp(+)g Fh(RS)1030 655 y Fe(col)344 748 y Fl(where)380 798 y
+Fh(RC)442 804 y Fe(col)498 798 y Fp(:)23 b Fl(Ro)q(ok{King)15
+b(Closeness)f(\(De\014nitio)o(n)f(21\).)380 898 y Fh(C)s(R)445
+904 y Fe(col)498 898 y Fp(:)23 b Fl(Connected)15 b(Ro)q(oks)g(\(De\014nitio)o
+(n)e(22\).)380 997 y Fh(RO)444 1003 y Fe(col)498 997 y Fp(:)23
+b Fl(Ro)q(ok)16 b(on)f(Op)q(en)g(File)g(\(De\014niti)o(on)d(23\).)380
+1097 y Fh(RS)437 1103 y Fe(col)498 1097 y Fp(:)23 b Fl(Ro)q(ok)16
+b(On)f(Sev)o(en)o(th)f(Rank)h(\(De\014nitio)o(n)e(24\).)262
+1219 y Fp(All)g(the)h(ro)q(ok)g(ev)n(aluation)f(criteria)h(de\014ned)h(in)e
+(this)i(section)f(are)h(summed)d(to)i(calculate)262 1269 y(the)g(total)f(ro)q
+(ok)h(v)n(alue)f(for)h(a)f(giv)o(en)h(colour.)p 641 1363 673
+5 v 641 2027 5 665 v 646 1446 a Fg(0ZrZ0ZkZ)646 1529 y(ZqZ0ZpZp)646
+1612 y(po0LpZpZ)646 1695 y(Z0Z0Z0Z0)646 1778 y(PZ0O0Z0Z)646
+1861 y(Z0Z0O0ZP)646 1944 y(0ZrZ0OPZ)646 2027 y(SRZ0Z0J0)p 1310
+2027 V 641 2031 673 5 v 343 2146 a Fp(Figure)g(4.7:)j Fl(Alatorze\013)d(v)i
+(Capablanca)p Fp(,)d(Mosco)o(w,)h(1935,)e(Blac)o(k)i(to)f(pla)o(y)m(.)324
+2261 y(Applying)g(these)i(ro)q(ok)f(ev)n(aluation)e(criteria)i(to)g(the)h(p)q
+(osition)e(in)g(\014gure)i(4.7)e(giv)o(es:)344 2355 y Fh(RV)400
+2361 y Fe(W)t(hite)533 2355 y Fp(=)h Ff(\000)p Fp(22)9 b(+)h(6)f(+)g(6)g(+)h
+(0)h(=)h Ff(\000)p Fp(10)344 2405 y Fh(RV)400 2411 y Fe(B)q(lack)533
+2405 y Fp(=)i Ff(\000)p Fp(10)9 b(+)h(6)f(+)g(28)g(+)h(14)h(=)g(38)957
+2574 y(69)p eop
+%%Page: 70 72
+70 71 bop 262 307 a Fr(4.8)69 b(Queen)22 b(Ev)l(aluation)262
+434 y Fp(The)12 b(queen)h(is)f(the)h(most)d(p)q(o)o(w)o(erful)i(and)g(also)f
+(the)i(most)e(v)n(aluable)g(piece)i(apart)f(from)e(the)262
+483 y(king.)16 b(The)e(queen)f(has)g(great)g(range)g(whic)o(h)g(allo)o(ws)e
+(it)i(to)f(mak)o(e)g(sim)o(ultaneous)f(m)o(ultiple)262 533
+y(attac)o(ks)j(on)f(enem)o(y)h(pieces.)324 618 y(In)e(the)g(op)q(ening)g(a)g
+(queen)h(should)e(not)h(b)q(e)h(exp)q(osed)g(to)f(hostile)g(attac)o(ks)g
+(where)h(a)f(loss)262 668 y(of)k(temp)q(o)h(will)f(o)q(ccur.)30
+b(Therefore,)19 b(lik)o(e)e(ro)q(oks)h(it)f(should)g(b)q(e)h(k)o(ept)g(bac)o
+(k)g(during)f(the)262 718 y(op)q(ening.)324 803 y(In)g(the)h(middle)d(game)h
+(the)i(queen)g(can)f(truly)g(exert)i(its)e(p)q(o)o(w)o(ers.)29
+b(The)17 b(queen)h(can)262 853 y(harass)c(enem)o(y)f(pieces,)h(help)g(build)f
+(up)h(attac)o(king)f(formations)f(and)h(launc)o(h)h(attac)o(ks)g(on)262
+903 y(the)19 b(enem)o(y)g(king.)33 b(Once)21 b(pieces)f(b)q(egin)f(to)h(b)q
+(e)f(exc)o(hanged)h(the)g(p)q(osition)f(in)o(v)n(ariably)262
+953 y(b)q(ecomes)14 b(clearer)h(and)e(allo)o(ws)g(the)h(queen)h(to)f(mo)o(v)o
+(e)e(with)i(more)f(freedom.)324 1038 y(In)h(the)g(ending)g(a)f(queen)i(is)e
+(ruthless,)i(often)f(pic)o(king)f(up)g(stra)o(y)h(pa)o(wns)g(and)g(holding)
+262 1088 y(bac)o(k)h(enem)o(y)g(adv)n(ances.)24 b(Ev)o(en)16
+b(in)f(inferior)g(endgames,)g(the)h(queen)h(can)e(o\013er)i(coun)o(ter)262
+1138 y(c)o(hances)12 b(and)f(can)g(sometimes)e(b)q(e)i(used)h(to)f(dra)o(w)g
+(otherwise)g(lost)g(games)f(b)o(y)h(a)f(rep)q(etition)262 1187
+y(of)j(mo)o(v)o(es.)262 1339 y Fu(4.8.1)55 b(De\014nition)17
+b(26)i(:)24 b(Queen{King)18 b(Closeness)344 1506 y Fh(QC)407
+1512 y Fe(col)462 1506 y Fp(=)506 1475 y Fc(P)550 1485 y Fk(64)550
+1518 y Fe(sq)q Fk(=1)675 1506 y Fl(if)13 b Fp(\(Occup)o
+(y\([Queen],col,sq\)\))734 1559 y Ff(\000)p Fp(2)p Ff(\001)p
+Fp(KingDistance\(sq,KingSq\(Opp\(col\)\)\))675 1608 y Fl(else)734
+1658 y Fp(0)675 1708 y Fl(endif)262 1835 y Fp(The)j(queen)h(is)f(p)q
+(enalised)h(for)f(its)g(distance)h(from)d(the)j(enem)o(y)f(king.)24
+b(A)16 b(queen)h(on)f(the)262 1885 y(same)e(rank)h(\(or)h(\014le\))g(as)f
+(the)h(enem)o(y)f(king)f(will)g(receiv)o(e)j(no)e(p)q(enalt)o(y)h(regardless)
+g(of)f(the)262 1934 y(corresp)q(onding)g(\014le)g(\(or)g(rank\))f(distance.)
+21 b(An)o(y)15 b(p)q(enalties)g(giv)o(en)f(will)g(b)q(e)h(directly)g(pro-)262
+1984 y(p)q(ortional)d(to)i(the)h(minim)n(um)9 b(rank)14 b(or)g(\014le)g
+(distance.)324 2069 y(This)c(criterion)h(therefore)h(encourages)g(the)g
+(queen)f(to)f(k)o(eep)i(close)f(to)f(the)i(enem)o(y)d(king)262
+2119 y(with)k(resp)q(ect)j(to)d(either)h(the)g(rank)g(or)f(\014le)h
+(distance,)g(not)f(b)q(oth.)18 b(If)c(a)f(more)f(dominating)262
+2169 y(queen/king)g(p)q(osition)f(is)h(w)o(arran)o(ted,)h(the)g(king)e(safet)
+o(y)i(criteria)f(will)f(highligh)o(t)f(this)j(and)262 2219
+y(encourage)h(its)g(ac)o(hiev)o(emen)o(t.)957 2574 y(70)p eop
+%%Page: 71 73
+71 72 bop 262 307 a Fu(4.8.2)55 b(De\014nition)17 b(27)i(:)24
+b(Queen)19 b(P)n(o)n(w)n(er)344 474 y Fh(QP)404 480 y Fe(col)459
+474 y Fp(=)503 443 y Fc(P)547 453 y Fk(64)547 486 y Fe(sq)q
+Fk(=1)675 474 y Fl(if)13 b Fp(\(A)o(ttac)o(k)o(ed\([Queen],col,sq\))675
+527 y Fl(and)i(not)e Fp(A)o(ttac)o(k)o(ed\([P)o(a)o(wn,Knigh)o(t,Bishop,Ro)q
+(ok],Opp\(col\),)o(sq\)\))734 577 y(1)675 626 y Fl(else)734
+676 y Fp(0)675 726 y Fl(endif)262 853 y Fp(As)h(explained)f(in)h(the)g
+(mobilit)o(y)d(de\014nition,)i(a)h(straigh)o(t)f(forw)o(ard)h(measure)g(of)f
+(a)g(queens)262 903 y(mobilit)o(y)e(is)k(not)g(adequate.)22
+b(It)15 b(is)g(often)g(the)g(queens)h(placemen)o(t)f(rather)h(than)f(its)f
+(mo-)262 952 y(bilit)o(y)d(whic)o(h)i(is)g(imp)q(ortan)o(t.)j(I)d(feel)g(a)f
+(queens)j(real)e(mobilit)o(y)c(is)k(the)h(n)o(um)o(b)q(er)e(of)g(squares)262
+1002 y(it)i(can)i(actually)e(mo)o(v)o(e)g(to)h(without)f(b)q(eing)i(captured)
+g(b)o(y)f(lo)o(w)o(er)g(v)n(alued)f(enem)o(y)h(pieces.)262
+1052 y(Therefore,)c(the)f(queen)h(is)f(encouraged)h(to)e(maximi)o(se)f(its)i
+(mobilit)o(y)d(to)i(accessible)i(squares)262 1102 y(only)m(.)16
+b(This)d(means)f(attac)o(ks)i(on)e(squares)j(whic)o(h)d(are)i(undefended)g
+(or)f(only)g(defended)h(b)o(y)262 1152 y(the)g(enem)o(y)f(queen)i(or)f(king)f
+(are)h(w)o(orth)o(while.)324 1237 y(I)f(feel)h(this)f(criterion)h(pro)o
+(vides)g(a)f(m)o(uc)o(h)g(b)q(etter)i(ev)n(aluation)d(of)h(a)g(queen's)h
+(degree)h(of)262 1287 y(freedom)e(in)g(a)h(giv)o(en)f(p)q(osition)g(than)h
+(the)h(more)d(traditional)h(mobilit)o(y)e(functions.)262 1438
+y Fu(4.8.3)55 b(De\014nition)17 b(28)i(:)24 b(Queen)19 b(V)-5
+b(alue)344 1600 y Fh(QV)401 1606 y Fe(col)457 1600 y Fp(=)12
+b Fh(QC)564 1606 y Fe(col)616 1600 y Fp(+)e Fh(QP)718 1606
+y Fe(col)344 1700 y Fl(where)380 1750 y Fh(QC)443 1756 y Fe(col)498
+1750 y Fp(:)23 b Fl(Queen{King)14 b(Closeness)g(\(De\014niti)o(on)e(26\).)380
+1849 y Fh(QP)440 1855 y Fe(col)498 1849 y Fp(:)23 b Fl(Queen)15
+b(P)o(o)o(w)o(er)f(\(De\014niti)o(on)f(27\).)262 1976 y Fp(All)f(the)i(queen)
+g(ev)n(aluation)e(criteria)i(de\014ned)g(in)f(this)h(section)g(are)f(summed)f
+(in)h(order)h(to)262 2026 y(calculate)f(the)i(total)e(queen)i(v)n(alue)e(for)
+h(a)f(giv)o(en)h(colour.)324 2111 y(Applying)e(these)j(queen)f(ev)n(aluation)
+e(criteria)h(to)h(the)g(p)q(osition)e(in)h(\014gure)h(4.7)e(giv)o(es:)344
+2208 y Fh(QV)401 2214 y Fe(W)t(hite)533 2208 y Fp(=)i Ff(\000)p
+Fp(4)c(+)f(10)i(=)h(6)344 2258 y Fh(QV)401 2264 y Fe(B)q(lack)533
+2258 y Fp(=)i Ff(\000)p Fp(10)9 b(+)h(13)h(=)h(3)957 2574 y(71)p
+eop
+%%Page: 72 74
+72 73 bop 262 307 a Fr(4.9)69 b(King)23 b(Ev)l(aluation)262
+434 y Fp(The)15 b(king)g(is)g(the)h(most)f(imp)q(ortan)o(t)e(piece)k(on)e
+(the)h(b)q(oard.)22 b(Its)16 b(loss)g(means)e(the)i(end)g(of)262
+483 y(the)e(game.)324 569 y(In)e(the)i(op)q(ening,)e(the)h(king)f(m)o(ust)g
+(seek)i(a)e(sa)o(v)o(e)h(ha)o(v)o(en)g(protected)h(b)o(y)f(its)f(o)o(wn)h(pa)
+o(wns)262 618 y(and)g(pieces.)20 b(This)13 b(is)h(generally)g(b)q(est)h
+(accomplished)e(b)o(y)g(castling.)324 704 y(In)j(the)h(middle)e(game,)g(the)i
+(king)e(m)o(ust)h(still)f(b)q(e)i(protected)h(against)e(attac)o(k.)26
+b(This)262 753 y(protection)16 b(will)e(in)o(v)o(olv)o(e)g(a)h(strong)h(pa)o
+(wn)f(structure)j(in)d(fron)o(t)h(of)e(the)j(king)d(with)i(piece)262
+803 y(co)o(v)o(er)e(for)f(an)o(y)h(w)o(eak)g(p)q(oin)o(ts.)324
+889 y(In)j(the)h(endgame,)g(unlik)o(e)e(other)j(stages)f(of)f(the)h(game,)f
+(the)h(king)e(is)i(a)f(strong)h(at-)262 938 y(tac)o(king)g(piece.)33
+b(A)19 b(king)f(can)h(supp)q(ort)g(its)g(o)o(wn)f(pieces)i(and)f(pa)o(wns)g
+(or)f(p)q(enetrate)j(a)262 988 y(w)o(eak)16 b(enem)o(y)f(pa)o(wn)h(structure)
+j(to)d(win)f(material.)24 b(Late)16 b(activ)n(ation)f(of)h(a)g(king)f(in)h
+(the)262 1038 y(endgame)e(could)h(b)q(e)g(disastrous.)23 b(Therefore,)16
+b(the)g(king)e(m)o(ust)h(b)q(e)g(suitably)g(p)q(ositioned)262
+1088 y(to)e(tak)o(e)h(adv)n(an)o(tage)f(of)g(an)o(y)h(w)o(eaknesses)i(in)d
+(the)i(opp)q(osing)e(forces.)262 1239 y Fu(4.9.1)55 b(De\014nition)17
+b(29)i(:)24 b(King)19 b(On)g(Op)r(en)f(Files)344 1371 y Fh(K)s(O)414
+1377 y Fe(col)470 1371 y Fp(=)513 1339 y Fc(P)557 1350 y Fk(64)557
+1383 y Fe(sq)q Fk(=1)640 1371 y Fh(K)s(F)705 1377 y Fe(col;sq)344
+1473 y Fl(where)380 1523 y Fh(K)s(F)445 1529 y Fe(col;sq)544
+1523 y Fp(:)36 b Fl(if)13 b Fp(\(Occup)o(y\([King],col,sq\))g
+Fl(and)g Fp(Has\([Ro)q(ok,Queen],Opp\(col\)\)\))651 1573 y
+Fl(if)g Fp(\(Op)q(en\(OnFile\(sq\)\)\))710 1623 y Fh(K)s(F)775
+1629 y Fe(col;sq)873 1623 y Fp(=)e Ff(\000)p Fp(2)f Ff(\001)e
+Fh(phase)651 1673 y Fl(else)710 1722 y(if)13 b Fp(\(SemiOp)q
+(en\(Opp\(col\),OnFile\(sq\)\))710 1772 y Fl(or)h Fp(SemiOp)q
+(en\(col,OnFile\(sq\)\)\))769 1822 y Fh(K)s(F)834 1828 y Fe(col;sq)932
+1822 y Fp(=)d Ff(\000)p Fh(phase)710 1872 y Fl(else)769 1922
+y Fh(K)s(F)834 1928 y Fe(col;sq)932 1922 y Fp(=)g(0)710 1971
+y Fl(endif)651 2021 y(endif)651 2071 y(if)i Fp(\(OnFile\(sq\))h(=)h(2)e
+Fl(or)h Fp(3)f Fl(or)h Fp(4)f Fl(or)g Fp(8\))710 2121 y Fl(if)g
+Fp(\(Op)q(en\(OnFile\(sq\))p Ff(\000)p Fp(1\)\))769 2171 y
+Fh(K)s(F)834 2177 y Fe(col;sq)932 2171 y Fp(=)e Ff(\000)p Fh(phase)710
+2221 y Fl(else)769 2270 y(if)i Fp(\(SemiOp)q(en\(Opp\(col\),OnFile\(sq\))p
+Ff(\000)p Fp(1\)\))828 2320 y Fh(K)s(F)893 2326 y Fe(col;sq)991
+2320 y Fp(=)e Ff(\000)p Fh(phase=)p Fp(2)769 2370 y Fl(endif)710
+2420 y(endif)957 2574 y Fp(72)p eop
+%%Page: 73 75
+73 74 bop 651 307 a Fl(else)710 357 y(if)13 b Fp(\(Op)q
+(en\(OnFile\(sq\)+1\)\))769 407 y Fh(K)s(F)834 413 y Fe(col;sq)932
+407 y Fp(=)e Ff(\000)p Fh(phase)710 457 y Fl(else)769 506 y(if)i
+Fp(\(SemiOp)q(en\(Opp\(col\),OnFile\(sq\)+1\)\))828 556 y Fh(K)s(F)893
+562 y Fe(col;sq)991 556 y Fp(=)e Ff(\000)p Fh(phase=)p Fp(2)769
+606 y Fl(endif)710 656 y(endif)651 706 y(endif)592 756 y(else)651
+805 y Fh(K)s(F)716 811 y Fe(col;sq)813 805 y Fp(=)h(0)592 855
+y Fl(endif)262 982 y Fp(The)k(king)f(is)g(p)q(enalised)h(for)g(b)q(eing)g(on)
+f(either)i(an)e(op)q(en)h(or)g(semi{op)q(en)f(\014le.)24 b(It)16
+b(is)f(also)262 1032 y(p)q(enalised)e(for)f(b)q(eing)h(adjacen)o(t)g(to)g(an)
+g(op)q(en)g(or)g(semi{op)q(en)f(\014le)h(under)h(t)o(w)o(o)e(conditions:)312
+1150 y(1.)20 b(The)d(king)e(is)g Fl(not)g Fp(on)h(either)h(the)f('A')f(or)h
+('H')f(\014les)h(and)g(the)g(op)q(en)h(\014le)f(is)f(on)h(the)365
+1200 y(adjacen)o(t)e(\014le)g(nearest)i(the)e(edge)h(of)e(the)h(b)q(oard.)312
+1283 y(2.)20 b(The)15 b(king)e(is)g(on)h(either)h(the)f('A')f(or)h('H')f
+(\014les)i(and)e(the)i(op)q(en)f(\014le)g(is)g(adjacen)o(t.)262
+1401 y(Note)g(these)h(p)q(enalties)g(are)f(only)f(imp)q(osed)g(if)g(the)i
+(opp)q(onen)o(t)f(has)g(the)g(necessary)i(pieces)262 1451 y(to)d(tak)o(e)h
+(adv)n(an)o(tage)f(of)g(the)i(w)o(eakness.)262 1603 y Fu(4.9.2)55
+b(De\014nition)17 b(30)i(:)24 b(W)-5 b(eak)19 b(Squares)f(around)h(King)262
+1715 y Fp(Con)o(trol)10 b(m)o(ust)h(b)q(e)h(held)g(o)o(v)o(er)g(the)g(w)o
+(eak)f(squares)i(around)f(the)g(king.)k(By)c(w)o(eak)g(squares)h(I)262
+1765 y(mean)e(those)j(squares)g(not)f(co)o(v)o(ered)h(b)o(y)f(friendly)g(pa)o
+(wns)g(whic)o(h)g(are)g(therefore,)h(p)q(ossible)262 1815 y(pa)o(wn)e(holes.)
+18 b(These)d(pa)o(wn)d(holes)i(are)f(ideal)g(w)o(eak)g(p)q(oin)o(ts)g(for)f
+(the)i(opp)q(onen)o(t)g(to)f(attac)o(k)262 1864 y(and)g(o)q(ccup)o(y)m(.)344
+1985 y Fh(W)6 b(S)414 1991 y Fe(col)470 1985 y Fp(=)12 b Fh(W)6
+b(K)594 1992 y Fe(col;C)r(entr)q(alP)t(oint)p Fk(\()p Fe(K)r(ing)q(S)r(q)q
+Fk(\()p Fe(col)p Fk(\)\))344 2085 y Fl(where)380 2140 y Fh(W)g(K)460
+2146 y Fe(col;csq)574 2140 y Fp(:)616 2108 y Fc(P)660 2119
+y Fk(64)660 2152 y Fe(sq)q Fk(=1)746 2140 y Fl(if)12 b Fp
+(\(Distance\(sq,csq\))k Ff(\024)e Fp(1)f Fl(and)746 2193 y(not)g
+Fp(\(A)o(ttac)o(k)o(ed\([P)o(a)o(wn],col,sq\))f Fl(or)i Fp(Occup)o(y\([P)o(a)
+o(wn],col,sq\)\)\))805 2242 y Fh(C)s(O)870 2248 y Fe(col;sq)964
+2242 y Fp(+)c Fh(O)q(C)1069 2248 y Fe(col;sq)1163 2242 y Fp(+)g
+Fh(F)c(B)1269 2248 y Fe(col;sq)1363 2242 y Fp(+)k Fh(E)r(B)1469
+2248 y Fe(col;sq)746 2292 y Fl(else)805 2342 y Fp(0)746 2392
+y Fl(endif)957 2574 y Fp(73)p eop
+%%Page: 74 76
+74 75 bop 380 307 a Fh(C)s(O)445 313 y Fe(col;sq)544 307 y
+Fp(:)60 b Fl(if)13 b Fp(\(Con)o(trol\(sq\))g(=)i(col\))675
+357 y Ff(\000)p Fp(1)616 407 y Fl(else)675 457 y Ff(\000)p
+Fp(4)616 506 y Fl(endif)380 606 y Fh(O)q(C)443 612 y Fe(col;sq)542
+606 y Fp(:)62 b Fl(if)13 b Fp(\(Occup)o(y\([An)o(y],Opp\(col\),sq\)\))675
+656 y Ff(\000)p Fp(8)616 706 y Fl(else)675 756 y Fp(0)616 805
+y Fl(endif)380 905 y Fh(F)6 b(B)444 911 y Fe(col;sq)543 905
+y Fp(:)61 b Fl(if)13 b Fp(\(A)o(ttac)o(k)o(ed\([Bishop],col,sq\)\))675
+955 y(6)616 1005 y Fl(else)675 1054 y(if)g Fp(\(Occup)o
+(y\([Bishop],col,sq\)\))746 1104 y(16)675 1154 y Fl(else)746
+1204 y Fp(0)675 1254 y Fl(endif)616 1303 y(endif)380 1403 y
+Fh(E)r(B)444 1409 y Fe(col;sq)544 1403 y Fp(:)60 b Fl(if)13
+b Fp(\(A)o(ttac)o(k)o(ed\([Bishop,Queen],Opp\(col\),sq\)\))675
+1453 y Ff(\000)p Fp(6)616 1503 y Fl(else)675 1553 y Fp(0)616
+1602 y Fl(endif)262 1721 y Fp(Squares)i(on)f(or)h(adjacen)o(t)f(to)h(the)g
+(cen)o(tral)g(p)q(oin)o(t)f(of)f(the)j(king's)d(defensiv)o(e)i(p)q(osition)f
+(are)262 1771 y(p)q(enalised)e(for)f(b)q(eing)h(w)o(eak)g(if)f(they)h(are)h
+(not)e(o)q(ccupied)i(or)f(attac)o(k)o(ed)g(b)o(y)g(friendly)f(pa)o(wns.)262
+1820 y(Squares)k(are)h(quite)f(hea)o(vily)e(p)q(enalised)j(for)e(not)h(b)q
+(eing)g(con)o(trolled)g(b)o(y)f(friendly)h(pieces.)262 1870
+y(Additionally)m(,)9 b(an)k(o)q(ccupied)g(w)o(eak)g(square)g(is)g(hea)o(vily)
+e(p)q(enalised.)18 b(A)13 b(b)q(on)o(us)g(is)f(receiv)o(ed)262
+1920 y(if)f(a)i(friendly)f(bishop)h(attac)o(ks)g(the)g(w)o(eak)g(square)g(or)
+g(o)q(ccupies)h(the)f(actual)g(square)g(itself.)262 1970 y(A)i(p)q(enalt)o(y)
+h(is)f(levied)h(if)f(the)h(opp)q(onen)o(t)g(has)f(a)h(bishop)f(or)h(queen)g
+(whic)o(h)g(can)g(in\014ltrate)262 2020 y(the)e(w)o(eak)g(square.)324
+2105 y(These)19 b(criteria)f(will)f(encourage)i(the)f(program)e(to)i(force)h
+(w)o(eak)f(squares)h(near)f(the)262 2155 y(opp)q(onen)o(ts)12
+b(king)f(and)g(realise)h(whic)o(h)f(of)g(its)h(pieces)g(are)g(therefore)h
+(made)e(more)f(v)n(aluable.)262 2205 y(It)16 b(will)e(also)i(encourage)h
+(vital)e(o)q(ccupation)h(and)g(blo)q(c)o(k)n(ade)g(of)f(these)j(w)o(eak)e(p)q
+(oin)o(ts.)25 b(Of)262 2254 y(course,)20 b(the)f(program)e(will)g(b)q(e)i
+(discouraged)g(from)e(allo)o(wing)f(suc)o(h)k(w)o(eak)e(squares)i(to)262
+2304 y(dev)o(elop)14 b(near)i(its)e(o)o(wn)h(king.)20 b(Ev)o(en)15
+b(if)f(it)g(is)h(forced)g(to)g(accept)h(some)e(w)o(eak)g(squares,)i(it)262
+2354 y(will)9 b(activ)o(ely)i(seek)i(to)e(exc)o(hange)h(the)g(opp)q(onen)o
+(ts)g(most)e(dangerous)i(pieces)g(with)f(resp)q(ect)262 2404
+y(to)i(those)i(w)o(eaknesses.)957 2574 y(74)p eop
+%%Page: 75 77
+75 76 bop 262 307 a Fu(4.9.3)55 b(De\014nition)17 b(31)i(:)24
+b(Mating)19 b(Net)262 419 y Fp(The)g(kings)f(p)q(osition)g(should)g(alw)o(a)o
+(ys)f(b)q(e)j(c)o(hec)o(k)o(ed)f(to)g(see)h(if)d(a)i(mating)d(net)j(is)g(b)q
+(eing)262 469 y(formed)e(around)h(it.)31 b(The)19 b(building)e(of)g(suc)o(h)j
+(a)e(mating)e(net)j(around)f(the)h(opp)q(onen)o(ts)262 519
+y(king)d(is)i(to)f(b)q(e)h(encouraged.)30 b(It)17 b(will,)g(ho)o(w)o(ev)o
+(er,)h(b)q(e)g(discouraged)g(from)e(allo)o(wing)f(the)262 569
+y(opp)q(onen)o(t)f(to)f(ac)o(hiev)o(e)i(similar)c(aims.)344
+666 y Fh(M)5 b(N)422 672 y Fe(col)478 666 y Fp(=)12 b Fh(N)5
+b(T)584 672 y Fe(col)344 766 y Fl(where)380 816 y Fh(N)g(T)442
+822 y Fe(col)500 816 y Fp(:)33 b(W)m(eakSqs)13 b(=)i(0)545
+865 y Fh(N)5 b(T)607 871 y Fe(col)663 865 y Fp(=)11 b(0)545
+915 y Fl(for)k(eac)o(h)g(square)f Fp(sq)g Fl(do)604 965 y(if)f
+Fp(\(Distance\(KingSq\(col\),sq\))h(=)g(1\))663 1015 y(di\013)g(=)g
+Fh(])p Fp(Di\013A)o(ttac)o(ks\(Opp\(col\),sq\))663 1065 y Fl(if)f
+Fp(\(Con)o(trol\(sq\))h(=)g(Opp\(col\))g Fl(or)f Fp(di\013)h
+Fh(>)g Fp(0\))722 1114 y(W)m(eakSqs)g(=)g(W)m(eakSqs)f(+)h(1)722
+1164 y Fl(if)f Fp(\()p Fh(])p Fp(A)o(ttac)o(ks\([An)o(y],Opp\(col\),sq\))h
+Fh(>)g Fp(1\))781 1214 y Fh(N)814 1220 y Fe(col)870 1214 y
+Fp(=)e Fh(N)947 1220 y Fe(col)1000 1214 y Ff(\000)e Fp(4)f
+Ff(\001)g Fh(dif)t(f)14 b Ff(\000)c Fp(2)722 1264 y Fl(endif)663
+1314 y(endif)604 1363 y(endif)545 1413 y(endfor)545 1463 y(if)j
+Fp(\(KingSq\(col\))g(=)h(a8)g Fl(or)f Fp(h8)h Fl(or)f Fp(a1)g
+Fl(or)h Fp(h1\))604 1513 y(W)m(eakSqs)g(=)g(W)m(eakSqs)f(+)h(1)545
+1563 y Fl(endif)545 1613 y Fh(N)578 1619 y Fe(col)634 1613
+y Fp(=)e Fh(N)711 1619 y Fe(col)764 1613 y Ff(\000)e Fh(T)830
+1619 y Fe(W)t(eak)q(S)r(q)q(s)380 1712 y Fh(T)404 1718 y Fe(c)435
+1712 y Fp(:)98 b([0,)13 b(8,)g(20,)g(36,)g(56,)f(80,)h(108,)g(140,)g(180])604
+1762 y(Indexed)i(b)o(y)f(w)o(eak)f(square)i(coun)o(t)f(c)g(\(0)g(to)g(8\))262
+1880 y(An)o(y)f(squares)i(adjacen)o(t)f(to)g(the)g(king)f(are)h(p)q(enalised)
+h(for)e(lac)o(k)g(of)h(con)o(trol.)j(P)o(articularly)262 1930
+y(if)c(the)h(opp)q(onen)o(t)g(has)g(t)o(w)o(o)g(or)g(more)e(pieces)k(in)o
+(terw)o(orking)d(against)g(the)i(square.)324 2015 y(Notice)d(the)f(p)q(enalt)
+o(y)h(for)f(the)h(n)o(um)o(b)q(er)e(of)h(w)o(eak)g(squares)i(whic)o(h)e(ma)o
+(y)e(form)h(a)h(mating)262 2065 y(net)16 b(rises)g(dramatically)m(,)d(the)j
+(larger)g(the)g(n)o(um)o(b)q(er)f(of)g(suc)o(h)h(squares.)25
+b(The)16 b(king)e(is)i(ad-)262 2115 y(ditionally)11 b(p)q(enalised)k(for)e(b)
+q(eing)h(on)g(a)f(corner)i(square.)k(This)14 b(is)g(b)q(ecause)i(the)e(p)q
+(oten)o(tial)262 2165 y(n)o(um)o(b)q(er)c(of)g(escap)q(e)j(squares)f(for)e
+(the)i(king)e(from)f(a)i(corner)h(square)g(are)f(sev)o(erely)h(reduced.)262
+2215 y(This)i(w)o(ould)h(not)f(b)q(e)i(pic)o(k)o(ed)f(up)g(b)o(y)g(the)g
+(general)h(w)o(eak)e(square)i(coun)o(t)f(previously)g(cal-)262
+2265 y(culated.)j(Therefore)d(an)f(adjustmen)o(t)f(is)h(made)e(to)i(allo)o(w)
+e(for)i(this)g(p)q(ossibilit)o(y)m(.)957 2574 y(75)p eop
+%%Page: 76 78
+76 77 bop 262 307 a Fu(4.9.4)55 b(De\014nition)17 b(32)i(:)24
+b(Chec)n(k)19 b(Threats)262 419 y Fp(The)c(kings)g(p)q(osition)f(m)o(ust)g(b)
+q(e)i(monitored)e(and)h(the)g(p)q(oten)o(tial)g(threats)h(of)f(an)o(y)f(c)o
+(hec)o(ks)262 469 y(assessed.)19 b(Chec)o(k)13 b(mo)o(v)o(es)d(can)i(b)q(e)h
+(v)o(ery)f(e\013ectiv)o(e;)h(the)g(v)n(alue)e(of)g(whic)o(h)h(can)g(b)q(e)h
+(an)o(ything)262 519 y(from)d(a)i(gain)f(in)h(temp)q(o)g(to)g(c)o(hec)o
+(kmate)g(itself.)17 b(Of)c(course)g(some)f(c)o(hec)o(k)h(mo)o(v)o(es)e(ma)o
+(y)f(also)262 569 y(b)q(e)i(inferior)f(for)h(the)g(side)g(giving)f(the)h(c)o
+(hec)o(k,)h(p)q(ossibly)e(resulting)h(in)g(the)g(loss)g(of)f(a)g(temp)q(o)262
+618 y(or)i(w)o(orse)i(still)e(the)h(c)o(hec)o(king)h(piece.)j(A)c(w)o(ell)g
+(kno)o(wn)f(c)o(hess)i(sa)o(ying)e(states:)365 737 y("P)o(atzer)i(sees)h(c)o
+(hec)o(k;)e(P)o(atzer)h(giv)o(es)f(c)o(hec)o(k.")262 855 y(Indicating)i(that)
+h(it)g(is)g(not)g(alw)o(a)o(ys)g(wise)g(to)g(put)h(y)o(our)f(opp)q(onen)o(t)g
+(in)g(c)o(hec)o(k.)29 b(In)17 b(fact,)262 905 y(often)f(the)h(threat)g(is)f
+(stronger)i(than)e(the)h(execution.)27 b(This)16 b(criterion)h(m)o(ust)e
+(therefore)262 955 y(determine)d(the)i(relativ)o(e)f(merits)f(of)g(eac)o(h)i
+(c)o(hec)o(k)g(threat)f(and)g(decide)h(what)f(p)q(enalties)g(\(if)262
+1005 y(an)o(y\))g(to)h(assign.)344 1138 y Fh(C)s(T)401 1144
+y Fe(col)457 1138 y Fp(=)d Fh(T)6 b(S)555 1145 y Fe(col;K)r(ing)q(S)r(q)q
+Fk(\()p Fe(col)p Fk(\))344 1237 y Fl(where)380 1287 y Fh(T)g(S)435
+1293 y Fe(col;k)q(sq)553 1287 y Fp(:)t(TChec)o(k)14 b(=)g(0)569
+1337 y Fh(T)6 b(S)624 1343 y Fe(col)680 1337 y Fp(=)11 b(0)569
+1387 y Fl(for)k(eac)o(h)g(square)e Fp(sq)h Fl(do)628 1437 y(for)h(eac)o(h)g
+(square)e Fp(sq1)h Fl(do)687 1486 y(if)e Fp(\(P)o(oten)o(tialChec)o
+(k\(Opp\(col\),sq,sq1\)\))746 1536 y Fl(if)g Fp(\()p Fh(])p
+Fp(Di\013A)o(ttac)o(ks\(Opp\(col\),sq1\))j Fh(>)f Fp(0\))805
+1586 y(TChec)o(k)g(=)g(TChec)o(k)h(+)f(1)805 1636 y Fl(if)f
+Fp(\()p Fh(])p Fp(SafeBlo)q(c)o(ks\(col,ksq,sq1\))g(=)h(0\))864
+1686 y Fl(if)28 b Fp(\()p Fl(not)13 b Fp(Escap)q(e\(col,sq,sq1\)\))923
+1735 y Fh(M)5 b(ateT)h(hr)q(eat)1154 1741 y Fe(col)1210 1735
+y Fp(=)14 b(true)923 1785 y Fh(T)6 b(S)978 1791 y Fe(col)1034
+1785 y Fp(=)12 b Fh(T)6 b(S)1133 1791 y Fe(col)1186 1785 y
+Ff(\000)k Fp(128)864 1835 y Fl(else)923 1885 y Fh(T)c(S)978
+1891 y Fe(col)1034 1885 y Fp(=)12 b Fh(T)6 b(S)1133 1891 y
+Fe(col)1186 1885 y Ff(\000)k Fp(16)864 1935 y Fl(endif)805
+1984 y(else)864 2034 y Fh(T)c(S)919 2040 y Fe(col)975 2034
+y Fp(=)12 b Fh(T)6 b(S)1074 2040 y Fe(col)1127 2034 y Ff(\000)k
+Fp(\(6)f Ff(\000)g Fh(]S)r(af)t(eB)r(l)q(ock)q(s)q Fp(\()p
+Fh(col)q(;)e(k)q(sq)q(;)g(sq)q Fp(1\)\))805 2084 y Fl(endif)746
+2134 y(else)805 2184 y Fh(T)f(S)860 2190 y Fe(col)916 2184
+y Fp(=)12 b Fh(T)6 b(S)1015 2190 y Fe(col)1068 2184 y Ff(\000)k
+Fp(2)746 2234 y Fl(endif)687 2283 y(endif)628 2333 y(endfor)569
+2383 y(endfor)569 2433 y Fh(T)c(S)624 2439 y Fe(col)680 2433
+y Fp(=)11 b Fh(T)6 b(S)778 2439 y Fe(col)832 2433 y Ff(\000)k
+Fh(K)s(T)936 2439 y Fe(T)t(C)r(heck)957 2574 y Fp(76)p eop
+%%Page: 77 79
+77 78 bop 380 357 a Fh(K)s(T)442 363 y Fe(n)479 357 y Fp(:)78
+b([0,14,30,4)o(8,7)o(0,8)o(6,1)o(00,)o(110,)o(120)o(,120)o(,12)o(0,1)o(20,)o
+(120,)o(120)o(,120)o(,12)o(0])628 407 y(Indexed)14 b(b)o(y)g(n)o(um)o(b)q(er)
+f(of)h(lik)o(ely)e(c)o(hec)o(ks)j(n)f(\(0)g(to)g(15\).)262
+525 y(P)o(enalties)20 b(are)h(giv)o(en)f(for)g(p)q(oten)o(tial)g(c)o(hec)o
+(ks)i(if)e(the)h(side)f(giving)f(c)o(hec)o(k)j(has)f(enough)262
+575 y(con)o(trol)16 b(o)o(v)o(er)g(the)h(c)o(hec)o(king)g(square.)27
+b(Chec)o(ks)17 b(are)g(considered)h(more)d(serious)j(if)d(there)262
+625 y(are)i(no)f(safe)h(blo)q(c)o(king)e(mo)o(v)o(es)h(a)o(v)n(ailable)e(for)
+j(the)g(defender.)27 b(In)17 b(fact,)g(if)f(there)i(is)e(also)262
+675 y(no)f(escap)q(e)i(square)f(for)f(the)h(c)o(hec)o(k)o(ed)h(king,)e(the)h
+(situation)f(is)g(considered)i(v)o(ery)f(serious)262 725 y(indeed.)h(The)12
+b Fm(MateThr)n(e)n(at)e Fp(predicate)i(is)f(set)h(to)f(indicate)g(the)h(sev)o
+(erit)o(y)g(of)e(the)i(situation.)262 774 y(Hence,)18 b(increasing)f(the)g(n)
+o(um)o(b)q(er)g(of)f(safe)h(blo)q(c)o(ks)g(is)f(rew)o(arded)i(as)f(is)g
+(creating)g(escap)q(e)262 824 y(squares)e(for)e(the)i(threatened)g(king.)324
+909 y(These)e(criteria,)f(therefore,)i(encourage)f(the)g(program)d(to)i(main)
+o(tain)d(a)j(king)f(p)q(osition)262 959 y(free)g(from)e(c)o(hec)o(ks)k(and)e
+(to)f(pro)o(vide)h(enough)g(p)q(oten)o(tial)g(piece)g(co)o(v)o(er)h(to)f
+(parry)g(an)o(y)f(c)o(hec)o(ks)262 1009 y(receiv)o(ed.)262
+1161 y Fu(4.9.5)55 b(De\014nition)17 b(33)i(:)24 b(King)19
+b(T)-5 b(able)344 1256 y Fh(K)s(T)406 1262 y Fe(col)462 1256
+y Fp(=)506 1225 y Fc(P)550 1236 y Fk(64)550 1269 y Fe(sq)q
+Fk(=1)675 1256 y Fl(if)13 b Fp(\(Occup)o(y\([King],col,sq\)\))734
+1309 y Fh(K)s(S)r(T)823 1315 y Fe(col;sq)675 1359 y Fl(else)734
+1409 y Fp(0)675 1459 y Fl(endif)344 1558 y(where)380 1608 y
+Fh(K)s(S)r(T)469 1614 y Fe(col;sq)570 1608 y Fp(:)34 b(King)13
+b(Square)i(T)m(able.)i(Initialised)c(b)q(efore)h(eac)o(h)h(searc)o(h.)616
+1658 y(See)g(planning)d(section)j(4.11.6)d(for)h(details.)262
+1785 y(A)k(static)g(king)g(square)h(table)f(will)f(b)q(e)i(used)g(to)f(store)
+h(the)g(v)n(alues)f(of)f(eac)o(h)i(square)g(for)262 1835 y(ha)o(ving)e(a)i
+(king)f(o)q(ccup)o(y)h(that)g(square.)31 b(This)17 b(enables)i(kno)o(wledge)e
+(calculated)h(at)g(the)262 1884 y(ro)q(ot)c(to)h(b)q(e)g(e\016cien)o(tly)g
+(applied)f(at)g(leaf)g(no)q(des.)22 b(The)15 b(table)f(will)g(b)q(e)h
+(calculated)g(b)q(efore)262 1934 y(commencemen)o(t)c(of)j(the)g(searc)o(h)h
+(in)e(an)h(initial)e(planning)h(phase.)262 2086 y Fu(4.9.6)55
+b(De\014nition)17 b(34)i(:)24 b(King)19 b(V)-5 b(alue)344 2177
+y Fh(K)s(V)406 2183 y Fe(col)462 2177 y Fp(=)12 b(\()p Fh(K)s(O)592
+2183 y Fe(col)645 2177 y Fp(+)e Fh(W)c(S)757 2183 y Fe(col)810
+2177 y Fp(+)k Fh(M)5 b(N)930 2183 y Fe(col)983 2177 y Fp(+)10
+b Fh(C)s(T)1082 2183 y Fe(col)1126 2177 y Fp(\))f Ff(\001)g
+Fh(phase=)p Fp(16)g(+)g Fh(K)s(T)1452 2183 y Fe(col)344 2277
+y Fl(where)380 2326 y Fh(K)s(O)450 2332 y Fe(col)510 2326 y
+Fp(:)23 b Fl(King)15 b(On)g(Op)q(en)g(Files)f(\(De\014nition)e(29\).)380
+2426 y Fh(W)6 b(S)450 2432 y Fe(col)510 2426 y Fp(:)23 b Fl(W)l(eak)17
+b(Squares)d(around)g(King)h(\(De\014nition)d(30\).)957 2574
+y Fp(77)p eop
+%%Page: 78 80
+78 79 bop 380 357 a Fh(M)5 b(N)458 363 y Fe(col)510 357 y Fp(:)23
+b Fl(Mating)15 b(Net)g(\(De\014nitio)o(n)e(31\).)380 457 y
+Fh(C)s(T)437 463 y Fe(col)510 457 y Fp(:)23 b Fl(Chec)o(k)16
+b(Threats)f(\(De\014niti)o(on)d(32\).)380 556 y Fh(K)s(T)442
+562 y Fe(col)510 556 y Fp(:)23 b Fl(King)15 b(T)l(able)g(\(De\014niti)o(on)d
+(33\).)262 683 y Fp(All)i(the)i(king)f(ev)n(aluation)f(criteria)i(de\014ned)g
+(in)f(this)h(section)g(are)g(summed)e(in)h(order)h(to)262 733
+y(calculate)11 b(the)h(total)f(king)g(v)n(alue)g(for)g(a)g(giv)o(en)g
+(colour.)17 b(The)12 b(v)n(alues)g(are)g(further)g(adjusted)262
+783 y(b)o(y)i(the)h(game)e(phase)i(to)f(tak)o(e)h(accoun)o(t)g(of)f(a)g
+(kings)g(more)g(activ)o(e)g(role)h(as)f(the)i(endgame)262 832
+y(approac)o(hes.)25 b(Therefore,)17 b(the)g(\014rst)f(four)g(features,)h
+(whic)o(h)f(are)h(essen)o(tially)f(concerned)262 882 y(with)f(king)f(safet)o
+(y)m(,)h(are)h(reduced)h(in)e(imp)q(ortance)g(as)h(the)g(game)e(progresses.)
+24 b(The)16 b(king)262 932 y(table,)g(whic)o(h)g(already)g(has)h(information)
+c(relativ)o(e)j(to)h(the)g(kings)f(latest)g(role,)h(will)e(not)262
+982 y(b)q(e)f(adjusted)g(in)g(this)g(w)o(a)o(y)m(.)p 641 1075
+673 5 v 641 1740 5 665 v 646 1158 a Fg(0Z0s0ZkZ)646 1241 y(Z0Z0ZrZp)646
+1324 y(pZpZQZpZ)646 1408 y(Z0o0A0ZP)646 1491 y(0ZNoPZ0Z)646
+1574 y(ZPl0S0Z0)646 1657 y(PZPZ0a0O)646 1740 y(Z0ZRZ0ZK)p 1310
+1740 V 641 1744 673 5 v 336 1862 a Fp(Figure)g(4.8:)j Fl(Capablance)e(v)h
+(Marshall)p Fp(,)c(New)i(Y)m(ork,)f(1909,)f(Blac)o(k)i(to)g(pla)o(y)m(.)324
+1981 y(Applying)f(these)i(king)e(ev)n(aluation)g(criteria)h(to)g(the)g(p)q
+(osition)f(in)h(\014gure)g(4.8)f(giv)o(es:)344 2078 y Fh(K)s(V)406
+2084 y Fe(W)t(hite)533 2078 y Fp(=)h(\()p Ff(\000)p Fp(11)9
+b Ff(\000)h Fp(27)f Ff(\000)g Fp(20)g Ff(\000)g Fp(2\))h Ff(\001)e
+Fp(11)p Fh(=)p Fp(16)g Ff(\000)i Fp(1)h(=)h Ff(\000)p Fp(42)344
+2128 y Fh(K)s(V)406 2134 y Fe(B)q(lack)533 2128 y Fp(=)i(\()p
+Ff(\000)p Fp(5)c Ff(\000)f Fp(43)g Ff(\000)g Fp(36)g Ff(\000)h
+Fp(34\))f Ff(\001)f Fp(11)p Fh(=)p Fp(16)g(+)i(0)h(=)h Ff(\000)p
+Fp(81)957 2574 y(78)p eop
+%%Page: 79 81
+79 80 bop 262 307 a Fr(4.10)69 b(Static)22 b(T)-6 b(actical)21
+b(Ev)l(aluation)262 434 y Fp(The)11 b(follo)o(wing)d(criteria)k(attempt)e(to)
+h(ev)n(aluate)g(tactical)f(asp)q(ects)j(statically)d(from)f(within)262
+483 y(the)h(ev)n(aluation)f(function)h(itself.)17 b(The)11
+b(ob)r(jectiv)o(e)g(of)e(these)j(criteria)f(is)f(to)g(deriv)o(e)h(an)f(accu-)
+262 533 y(rate)g(v)n(alue)g(where)h(p)q(ossible,)f(and)g(where)h(uncertain)o
+(t)o(y)g(exists)g(to)f(giv)o(e)f(an)h(estimate)g(of)f(the)262
+583 y(lik)o(ely)j(v)n(alue)h(and)h(recommend)e(a)i(deep)q(er)h(searc)o(h)g
+(to)f(resolv)o(e)g(the)h(tactical)e(uncertain)o(t)o(y)m(.)262
+633 y(This)g(requires)i(the)g(criteria)f(to)g(detect)h(when)g(a)e(p)q
+(osition)h(is)f(tactically)g(activ)o(e.)262 784 y Fu(4.10.1)55
+b(De\014nition)17 b(35)i(:)25 b(Pinned)18 b(Pieces)262 896
+y Fp(A)d(pin)g(exists)i(if)d(a)i(piece)g(exerts)h(a)e(hidden)h(\(X-ra)o(y\))g
+(attac)o(k)f(through)h(an)f(enem)o(y)g(piece)262 946 y(on)o(to)g(another)i
+(enem)o(y)e(piece)i(whic)o(h)f(is)g(either)g(undefended)i(or)e(of)f(greater)i
+(v)n(alue)f(than)262 996 y(the)e(pinning)f(piece.)324 1081
+y(A)j(pin)g(sev)o(erely)i(restricts)g(the)f(mo)o(v)o(emen)o(t)d(of)i(the)h
+(enem)o(y)f(pieces)i(in)o(v)o(olv)o(ed)d(in)h(the)262 1131
+y(pin.)34 b(A)20 b(pin)f(against)f(the)j(king)d(is)i(the)g(most)e(restrictiv)
+o(e)j(t)o(yp)q(e)f(of)f(pin)g(b)q(ecause)i(the)262 1181 y(mo)o(v)o(emen)o(t)
+14 b(of)i(the)i(pinned)f(piece)h(is)f(illegal)e(in)h(all)g(but)h(the)h(pin)f
+(direction)g(and)g(an)o(ti{)262 1231 y(direction.)25 b(Therefore,)18
+b(a)e(pinned)h(piece's)g(defensiv)o(e)h(and)e(attac)o(king)g(capabilities)f
+(are)262 1281 y(either)f(sev)o(erely)h(diminished)d(or)i(completely)f(lost.)
+344 1378 y Fh(P)6 b(N)410 1384 y Fe(col)465 1378 y Fp(=)12
+b Fh(P)6 b(S)567 1384 y Fe(col)344 1478 y Fl(where)380 1527
+y Fh(P)g(S)438 1533 y Fe(col)495 1527 y Fp(:)14 b Fh(P)6 b(S)579
+1533 y Fe(col)635 1527 y Fp(=)12 b(0)521 1577 y Fl(for)j(eac)o(h)h(square)d
+Fp(sq)h Fl(do)580 1627 y(for)h(eac)o(h)h(square)d Fp(sq1)h
+Fl(do)639 1677 y(for)h(eac)o(h)h(square)d Fp(sq2)h Fl(do)699
+1727 y(if)e Fp(\(Pin\(col,sq,sq1,sq2\)\))758 1777 y Fl(if)g
+Fp(\(V)m(alue\(sq2\))i Fh(>)g Fp(V)m(alue\(sq\))758 1826 y
+Fl(or)h(not)e Fp(A)o(ttac)o(k)o(ed\([An)o(y],Opp\(col\),sq2\)\))817
+1876 y Fh(P)6 b(S)875 1882 y Fe(col)932 1876 y Fp(=)14 b(V)m(alue\(sq2\))g(+)
+g(V)m(alue\(sq1\))g Ff(\000)g Fp(V)m(alue\(sq\))g(+)g(10)817
+1926 y Fl(if)e Fp(\(A)o(ttac)o(k)o(ed\([An)o(y)j Fh(<)f Fp
+(On\(sq1\)],col,sq1\))817 1976 y Fl(or)h(not)e Fp(A)o(ttac)o(k)o(ed\([An)o
+(y],Opp\(col\),sq1\))817 2026 y Fl(or)g Fp(\()p Fh(])p Fp(Di\013A)o(ttac)o
+(ks\(col,sq1\))h Ff(\025)g Fp(0)f Fl(and)h Fp(Con)o(trol\(sq1\))f(=)h
+(col\)\))876 2075 y Fh(T)6 b(hr)q(eat)1006 2081 y Fe(col)1061
+2075 y Fp(=)12 b Fh(T)6 b(hr)q(eat)1235 2081 y Fe(col)1288
+2075 y Fp(+)k(1)876 2125 y Fh(P)c(S)934 2131 y Fe(col)989 2125
+y Fp(=)12 b Fh(P)6 b(S)1091 2131 y Fe(col)1144 2125 y Fp(+)j
+Fh(r)q(ev)q(P)d(hase)817 2175 y Fl(endif)758 2225 y(endif)699
+2275 y(endif)639 2324 y(endfor)580 2374 y(endfor)521 2424 y(endfor)957
+2574 y Fp(79)p eop
+%%Page: 80 82
+80 81 bop 262 307 a Fp(It)11 b(is)f(imp)q(ortan)o(t)g(to)g(b)q(e)i(able)f(to)
+f(iden)o(tify)h(and)f(assess)j(the)e(v)n(alue)g(of)f(pins.)17
+b(This)11 b(de\014nition)262 357 y(giv)o(es)20 b(a)f(b)q(on)o(us)i(for)f
+(pinning)f(an)h(opp)q(onen)o(ts)h(piece.)38 b(Pins)20 b(are)h(tactically)e
+(complex.)262 407 y(Therefore,)12 b(this)f(criterion)h(attempts)f(to)g
+(assess)h(those)g(asp)q(ects)h(whic)o(h)e(can)h(b)q(e)g(statically)262
+457 y(v)n(alued.)22 b(If)15 b(the)h(criterion)g(assesses)i(the)e(pin)f(as)h
+(a)f(tactically)g(dynamic)f(threat,)i(then)g(a)262 506 y(tactical)11
+b(coun)o(t)h(indicating)f(the)h(uncertain)o(t)o(y)h(of)e(the)h(static)h(ev)n
+(aluation)d(is)i(incremen)o(ted.)262 556 y(Basically)m(,)i(this)i(indicates)g
+(that)g(although)e(a)i(static)g(v)n(alue)f(is)h(calculated,)g(the)g(tactical)
+262 606 y(uncertain)o(t)o(y)f(should)g(b)q(e)h(resolv)o(ed)g(b)o(y)f
+(extending)h(the)g(searc)o(h)h(un)o(til)d(a)h(more)f(quiescen)o(t)262
+656 y(p)q(osition)f(is)g(reac)o(hed.)20 b(See)15 b(c)o(hapter)f(5)g(for)g
+(more)e(details.)324 741 y(The)21 b(ev)n(aluation)e(function)h(do)q(es)h(not)
+g(kno)o(w)f(whether)i(a)e(deep)q(er)i(searc)o(h)g(will)d(b)q(e)262
+791 y(successful)c(in)e(\014nding)g(a)g(quiescen)o(t)i(p)q(osition)e(or)g(ev)
+o(en)i(has)e(enough)h(time)e(to)i(undertak)o(e)262 841 y(suc)o(h)g(a)g(task.)
+19 b(Therefore,)c(a)e(v)n(alue)h(indicating)f(its)h(liking)e(for)i(the)g
+(tactical)g(uncertain)o(t)o(y)262 891 y(is)f(included)h(in)g(the)g(o)o(v)o
+(erall)f(static)h(v)n(alue.)p 641 984 673 5 v 641 1648 5 665
+v 646 1067 a Fg(0Z0Z0Zrs)646 1150 y(oQZ0Z0Z0)646 1233 y(0ZRZbj0Z)646
+1316 y(Z0ZqZ0Z0)646 1399 y(0Z0O0m0Z)646 1482 y(Z0Z0ZNZ0)646
+1565 y(PZ0Z0OPO)646 1648 y(Z0Z0S0J0)p 1310 1648 V 641 1652
+673 5 v 384 1771 a Fp(Figure)g(4.9:)j Fl(Dy)o(atlo)o(v)d(v)i(Shashin)p
+Fp(,)11 b(Leningrad,)i(1962,)g(Blac)o(k)g(to)h(pla)o(y)m(.)324
+1889 y(Applying)e(the)i(Pinned)f(Pieces)i(ev)n(aluation)d(criteria)i(to)f
+(the)h(ab)q(o)o(v)o(e)f(p)q(osition)f(giv)o(es:)344 1987 y
+Fh(P)6 b(N)410 1993 y Fe(W)t(hite)533 1987 y Fp(=)14 b(22)344
+2037 y Fh(P)6 b(N)410 2043 y Fe(B)q(lack)533 2037 y Fp(=)14
+b(15)957 2574 y(80)p eop
+%%Page: 81 83
+81 82 bop 262 307 a Fu(4.10.2)55 b(De\014nition)17 b(36)i(:)25
+b(A)n(ttac)n(k)n(ed)19 b(Pieces)344 438 y Fh(AP)402 444 y Fe(col)457
+438 y Fp(=)501 407 y Fc(P)545 417 y Fk(64)545 451 y Fe(sq)q
+Fk(=1)628 438 y Fh(AT)683 444 y Fe(col;sq)344 541 y Fl(where)380
+591 y Fh(AT)435 597 y Fe(col;sq)535 591 y Fp(:)69 b Fl(if)13
+b Fp(\(Occup)o(y\([P)o(a)o(wn,Knigh)o(t,Bishop,Ro)q(ok,Queen],col,sq\))616
+641 y Fl(and)g Fp(A)o(ttac)o(k)o(ed\([An)o(y],Opp\(col\),sq\)\))675
+691 y Fl(if)g Fp(\()p Fl(not)g Fp(A)o(ttac)o(k)o(ed\([An)o(y],col,sq\))675
+740 y Fl(or)g Fp(A)o(ttac)o(k)o(ed\([An)o(y)p Fh(<)p Fp
+(On\(sq\)],Opp\(col\),sq\))675 790 y Fl(or)g Fp(\(Con)o(trol\(sq\))h(=)g
+(Opp\(col\))h Fl(and)e Fh(])p Fp(Di\013A)o(ttac)o(ks\(Opp\(col\),sq\))h
+Fh(>)g Fp(0\)\))734 840 y Fh(AT)789 846 y Fe(col;sq)887 840
+y Fp(=)d Fh(AT)985 846 y Fe(col;sq)1081 840 y Ff(\000)e Fp(8)p
+Ff(\000)14 b Fp(V)m(alue\(sq\))734 890 y Fh(T)6 b(hr)q(eat)864
+896 y Fe(col)920 890 y Fp(=)11 b Fh(T)6 b(hr)q(eat)1093 896
+y Fe(col)1147 890 y Fp(+)j(1)734 940 y Fl(if)k Fp(\(T)m(rapp)q
+(ed\(col,sq\)\))793 989 y Fh(AT)848 995 y Fe(col;sq)946 989
+y Fp(=)e Fh(AT)1044 995 y Fe(col;sq)1140 989 y Ff(\000)e Fh(V)h(al)q(ue)p
+Fp(\()p Fh(sq)q Fp(\))p Ff(\001)k Fp(revPhase)793 1039 y Fh(T)6
+b(hr)q(eat)923 1045 y Fe(col)979 1039 y Fp(=)11 b Fh(T)6 b(hr)q(eat)1152
+1045 y Fe(col)1206 1039 y Fp(+)j(1)734 1089 y Fl(endif)675
+1139 y(else)734 1189 y(if)k Fp(\(Con)o(trol\(sq\))h(=)g(Opp\(col\))g
+Fl(or)f Fh(])p Fp(Di\013A)o(ttac)o(ks\(Opp\(col\),sq\))i Fh(>)f
+Fp(0\))793 1239 y Fh(AT)848 1245 y Fe(col;sq)946 1239 y Fp(=)d
+Fh(AT)1044 1245 y Fe(col;sq)1131 1239 y Ff(\000)p Fp(V)m(alue\(sq\))734
+1288 y Fl(endif)675 1338 y(endif)616 1388 y(endif)262 1506
+y Fp(Pieces)k(whic)o(h)f(are)h(threatened)h(with)e(pro\014table)g(capture)h
+(\(en-prise\))g(b)o(y)f(the)h(opp)q(osing)262 1556 y(side)i(are)g(p)q
+(enalised.)28 b(This)17 b(p)q(enalt)o(y)g(is)g(levied)g(not)g(b)q(ecause)h
+(the)g(loss)f(of)f(the)i(piece)g(is)262 1606 y(considered)f(lik)o(ely)m(,)e
+(but)i(b)q(ecause)h(it)f(is)f(v)o(ery)h(lik)o(ely)e(that)i(a)f(temp)q(o)g
+(will)f(b)q(e)i(w)o(asted)g(in)262 1656 y(protecting)c(or)g(mo)o(ving)d(the)j
+(threatened)i(piece.)j(The)c(threat)f(coun)o(t)g(is)g(incremen)o(ted)g(for)
+262 1705 y(ev)o(ery)h(piece)h(en-prise.)324 1791 y(T)m(rapp)q(ed)j(pieces)h
+(whic)o(h)f(are)g(also)f(en-prise)i(are)f(additionally)d(p)q(enalised)j(and)g
+(the)262 1840 y(threat)e(coun)o(t)f(is)h(further)g(incremen)o(ted.)23
+b(Pieces)17 b(whic)o(h)e(are)h(under)g(pressure,)i(but)e(not)262
+1890 y(en-prise)k(are)g(also)f(p)q(enalised)h(although)e(to)i(a)f(lesser)i
+(exten)o(t.)36 b(The)20 b(threat)g(coun)o(t)g(is)262 1940 y(used)13
+b(to)f(extend)h(the)g(searc)o(h)h(in)e(p)q(ositions)g(where)h(an)f(accurate)i
+(static)e(ev)n(aluation)f(v)n(alue)262 1990 y(cannot)j(b)q(e)g(calculated.)
+324 2075 y(Applying)f(the)h(A)o(ttac)o(k)o(ed)h(Pieces)g(criteria)f(to)g(the)
+g(p)q(osition)g(in)f(\014gure)h(4.9)f(giv)o(es:)344 2166 y
+Fh(AP)402 2172 y Fe(W)t(hite)533 2166 y Fp(=)h Ff(\000)p Fp(18)344
+2215 y Fh(AP)402 2221 y Fe(B)q(lack)533 2215 y Fp(=)g Ff(\000)p
+Fp(9)344 2265 y Fh(T)6 b(hr)q(eat)474 2271 y Fe(W)t(hite)583
+2265 y Fp(=)12 b(2)344 2315 y Fh(T)6 b(hr)q(eat)474 2321 y
+Fe(B)q(lack)576 2315 y Fp(=)12 b(1)262 2391 y(The)19 b(n)o(um)o(b)q(er)g(of)f
+(threats)i(against)f(white)g(\(2\),)h(represen)o(ts)i(a)d(degree)i(of)d
+(uncertain)o(t)o(y)262 2441 y(ab)q(out)13 b(the)i(tactical)e(p)q
+(ossibilities)h(threatened)h(against)e(the)i(white)f(pieces.)957
+2574 y(81)p eop
+%%Page: 82 84
+82 83 bop 262 307 a Fr(4.11)69 b(Planning)262 434 y Fp(Before)18
+b(eac)o(h)g(searc)o(h)h(b)q(egins)e(an)h(analysis)f(of)f(the)j(p)q(osition)d
+(will)g(b)q(e)j(done.)29 b(This)17 b(will)262 483 y(enable)11
+b(v)n(arious)g(piece)h(square)g(tables)g(to)f(b)q(e)h(loaded)f(with)g(v)n
+(alues)g(whic)o(h)g(can)g(b)q(e)h(applied)262 533 y(at)h(leaf)h(no)q(des)g
+(using)g(lo)q(ok)f(up)h(tables.)324 618 y(Ob)o(viously)d(this)g(is)h(m)o(uc)o
+(h)e(faster)j(than)e(rep)q(eatedly)i(calculating)e(information)e(at)i(leaf)
+262 668 y(no)q(des.)18 b(Hence,)d(in)e(an)h(implemen)o(tati)o(on,)d(all)h
+(leaf)h(no)q(de)h(ev)n(aluation)f(criteria)h(whic)o(h)f(are)262
+718 y(essen)o(tially)18 b(static)h(should)g(b)q(e)g(incorp)q(orated)g(in)o
+(to)f(these)i(tables)f(and)g(remo)o(v)o(ed)e(from)262 768 y(the)d(leaf)f(ev)n
+(aluation)f(pro)q(cess.)20 b(Ho)o(w)o(ev)o(er,)13 b(this)h(c)o(hapter)h
+(represen)o(ts)h(a)d(de\014nition)g(of)g(m)o(y)262 818 y(prop)q(osed)19
+b(ev)n(aluation)e(function)h(regardless)h(of)f(implemen)o(tation)d(detail.)31
+b(Therefore,)262 867 y(some)19 b(criteria)i(whic)o(h)f(are)h(suited)g(to)g
+(piece)g(square)h(tables)e(are)h(de\014ned)h(separately)262
+917 y(b)q(ecause)15 b(of)e(their)i(imp)q(ortance.)324 1003
+y(T)m(o)f(com)o(bat)f(the)j(t)o(ypically)d(aimless)h(pla)o(y)g(of)g(c)o(hess)
+j(programs)c(I)i(will)e(include)i(some)262 1052 y(rudimen)o(tary)h(planning)h
+(in)h(the)h(ev)n(aluation)d(function.)31 b(P)o(art)18 b(of)g(the)g(initial)e
+(analysis)262 1102 y(done)h(b)q(efore)g(eac)o(h)h(searc)o(h)g(commences)d
+(will)h(include)h(a)f(selection)i(of)e(an)h(appropriate)262
+1152 y(plan)c(for)g(the)i(curren)o(t)g(p)q(osition.)j(The)c(plans)f(whic)o(h)
+h(will)f(b)q(e)h(recognised)h(are:)312 1270 y(1.)20 b Fl(King)15
+b(side)g(attac)o(k)g(with)g(pa)o(wns)p Fp(.)312 1352 y(2.)20
+b Fl(King)15 b(side)g(attac)o(k)g(with)g(pieces)p Fp(.)312
+1435 y(3.)20 b Fl(King)15 b(side)g(attac)o(k)g(with)g(pieces)f(and)i(pa)o
+(wns)p Fp(.)312 1517 y(4.)k Fl(Queen)15 b(side)f(attac)o(k)i(with)f(pa)o(wns)
+p Fp(.)312 1600 y(5.)20 b Fl(Queen)15 b(side)f(attac)o(k)i(with)f(pieces)p
+Fp(.)312 1683 y(6.)20 b Fl(Queen)15 b(side)f(attac)o(k)i(with)f(pieces)f(and)
+h(pa)o(wns)p Fp(.)312 1765 y(7.)20 b Fl(Using)14 b(pa)o(wns)i(as)g(lev)o(ers)
+p Fp(.)312 1848 y(8.)k Fl(Endgame,)c(king)e(and)i(pa)o(wn)f(co-ordination)o
+Fp(.)262 1965 y(These)e(plans)f(are)g(relativ)o(ely)g(general,)g(but)g
+(should)g(pro)o(vide)g(the)h(program)e(with)h(enough)262 2015
+y(v)n(ariet)o(y)h(to)g(c)o(ho)q(ose)h(a)g(plan)f(relev)n(an)o(t)g(to)h(the)g
+(p)q(osition)f(and)h(attempt)e(to)i(co-ordinate)g(its)262 2065
+y(mo)o(v)o(es)g(to)h(ac)o(hiev)o(e)h(common)c(goals.)22 b(It)16
+b(is)f(not)g(the)h(ob)r(ject)h(of)d(these)j(plans)e(to)h(suggest)262
+2115 y(sp)q(eci\014c)j(mo)o(v)o(es,)e(but)i(rather)g(to)e(allo)o(w)g(the)i
+(searc)o(h)g(to)f(b)q(e)g(guided)g(to)o(w)o(ard)g(the)g(goals)262
+2165 y(iden)o(ti\014ed.)324 2250 y(T)m(o)c(enable)h(the)h(searc)o(h)g(to)f(b)
+q(e)h(guided,)f(the)h(appropriate)f(piece)h(square)g(tables)f(will)262
+2300 y(b)q(e)20 b(up)q(dated)h(in)f(suc)o(h)h(a)f(w)o(a)o(y)g(that)g(mo)o(v)o
+(es)f(whic)o(h)h(con)o(tribute)h(to)f(the)h(ac)o(hiev)o(emen)o(t)262
+2350 y(of)16 b(the)h(c)o(hosen)h(goals)e(will)f(b)q(e)j(encouraged.)28
+b(This)16 b(will)g(hop)q(efully)g(ha)o(v)o(e)g(the)i(e\013ect)g(of)262
+2399 y(pro)o(viding)12 b(a)i(common)d(purp)q(ose)k(to)e(the)i(programs)e(mo)o
+(v)o(es)f(rather)j(than)f(allo)o(wing)d(it)j(to)262 2449 y(pla)o(y)e
+(aimless,)g(although)h(solid)g(mo)o(v)o(es.)957 2574 y(82)p
+eop
+%%Page: 83 85
+83 84 bop 324 307 a Fp(There)17 b(are)f(no)f(sp)q(eci\014c)i(op)q(ening)f
+(plans,)f(ho)o(w)o(ev)o(er,)h(the)g(ev)n(aluation)f(function)g(do)q(es)262
+357 y(pro)o(vide)g(ample)f(criteria)i(suc)o(h)g(as)g(Dev)o(elopmen)o(t,)e
+(Cen)o(tre)j(Con)o(trol)e(etc,)h(to)g(encourage)262 407 y(go)q(o)q(d)d(op)q
+(ening)h(pla)o(y)m(.)324 492 y(The)j(plans)f(a)o(v)n(ailable)e(in)i(the)h
+(middle)d(game)h(are)i(attac)o(k)f(orien)o(ted.)26 b(Ho)o(w)o(ev)o(er,)17
+b(b)q(e-)262 542 y(cause)g(appropriate)g(plans)f(are)h(selected)h(for)e(b)q
+(oth)h(sides)g(this)g(will)e(ha)o(v)o(e)h(the)h(e\013ect)h(of)262
+592 y(making)11 b(eac)o(h)k(side)g(attempt)e(to)h(obstruct)h(the)g(other)g
+(sides)g(plan.)j(This)c(will)f(ob)o(viously)262 641 y(include)h(b)q(oth)g
+(defensiv)o(e)g(and)g(aggressiv)o(e)g(measures.)324 727 y(In)e(the)h
+(endgame,)e(only)g(a)h(general)g(approac)o(h)g(to)g(king{pa)o(wn)f
+(co-ordination)g(will)g(b)q(e)262 777 y(tak)o(en.)18 b(The)13
+b(endgame)g(is)g(a)g(stage)h(of)f(the)h(game)e(where)j(sp)q(eci\014c)f(kno)o
+(wledge)g(and)f(plans)262 826 y(w)o(ould)f(greatly)h(help)h(in)f(the)h
+(handling)e(of)g(certain)i(t)o(yp)q(es)h(of)e(endings)g(whic)o(h)g(ha)o(v)o
+(e)h(more)262 876 y(discernible)d(goals.)17 b(Ho)o(w)o(ev)o(er,)11
+b(suc)o(h)h(a)f(comprehensiv)o(e)g(approac)o(h)g(could)g(form)f(the)i(basis)
+262 926 y(for)h(an)h(en)o(tire)g(pro)r(ject)h(in)f(itself.)262
+1076 y Fu(4.11.1)55 b(De\014nition)17 b(37)i(:)25 b(Pressure)18
+b(on)h(King)344 1243 y Fh(P)6 b(K)412 1249 y Fe(col)467 1243
+y Fp(=)12 b(\()527 1211 y Fc(P)571 1222 y Fk(64)571 1255 y
+Fe(sq)q Fk(=1)654 1243 y Fh(C)s(L)715 1249 y Fe(col;sq)801
+1243 y Fp(\))d(+)h Fh(AD)933 1250 y Fe(col;O)q(nF)t(ile)p Fk(\()p
+Fe(K)r(ing)q(S)r(q)q Fk(\()p Fe(col)p Fk(\)\))344 1345 y Fl(where)380
+1395 y Fh(C)s(L)441 1401 y Fe(col;sq)540 1395 y Fp(:)40 b Fl(if)13
+b Fp(\(T)m(axicab\(KingSq\(col\),sq\))g Ff(\024)h Fp(4)592
+1445 y Fl(and)f Ff(j)h Fp(OnFile\(KingSq\(col\)\))f Ff(\000)i
+Fp(OnFile\(sq\))f Ff(j)d(\024)j Fp(2\))651 1495 y Fh(AT)706
+1502 y Fe(O)q(pp)p Fk(\()p Fe(col)p Fk(\))p Fe(;sq)888 1495
+y Fp(+)9 b Fh(P)d(M)1002 1502 y Fe(O)q(pp)p Fk(\()p Fe(col)p
+Fk(\))p Fe(;sq)1183 1495 y Ff(\000)k Fh(D)q(F)1287 1501 y Fe(col;sq)592
+1545 y Fl(else)651 1594 y Fp(0)592 1644 y Fl(endif)380 1744
+y Fh(AT)435 1750 y Fe(col;sq)535 1744 y Fp(:)45 b Fh(])p Fp(A)o(ttac)o
+(ks\([Ro)q(ok],col,sq\))12 b(+)592 1794 y(2)d Ff(\001)g Fh(])p
+Fp(A)o(ttac)o(ks\([P)o(a)o(wn,Knigh)o(t,Bishop],col,sq\))j(+)592
+1844 y(3)d Ff(\001)g Fh(])p Fp(A)o(ttac)o(ks\([Queen],col,sq\))380
+1948 y Fh(P)d(M)453 1954 y Fe(col;sq)552 1948 y Fp(:)592 1917
+y Fc(P)636 1927 y Fk(64)636 1960 y Fe(sq)q Fk(2=1)769 1948
+y Fl(if)13 b Fp(\(A)o(ttac)o(king\([P)o(a)o(wn],col,sq2,sq\))769
+2001 y Fl(and)g Fh(])p Fp(Mo)o(v)o(es\([P)o(a)o(wn],col,sq2\))g
+Fh(>)h Fp(0\))828 2051 y(2)769 2100 y Fl(else)828 2150 y Fp(0)769
+2200 y Fl(endif)380 2300 y Fh(D)q(F)442 2306 y Fe(col;sq)541
+2300 y Fp(:)39 b Fh(])p Fp(A)o(ttac)o(ks\([Ro)q(ok],col,sq\))12
+b(+)592 2350 y(2)d Ff(\001)g Fh(])p Fp(A)o(ttac)o(ks\([Knigh)o
+(t,Bishop,Queen],col,sq\))k(+)592 2399 y(3)c Ff(\001)g Fh(])p
+Fp(A)o(ttac)o(ks\([P)o(a)o(wn],col,sq\))957 2574 y(83)p eop
+%%Page: 84 86
+84 85 bop 380 307 a Fh(AD)445 313 y Fe(col;k)q(f)551 307 y
+Fp(:)592 276 y Fc(P)636 286 y Fe(k)q(f)s Fk(+1)636 320 y Fe(f)s
+Fk(=)p Fe(k)q(f)s Fd(\000)p Fk(1)769 307 y Fl(if)13 b Fp(\(Op)q(en\(f)s(\))i
+Fl(or)f Fp(SemiOp)q(en\(Opp\(col\),f)s(\)\))828 360 y(3)769
+410 y Fl(else)828 460 y Fp(0)769 510 y Fl(endif)324 636 y Fp(This)19
+b(de\014nition)h(attempts)f(to)g(calculate)h(ho)o(w)f(m)o(uc)o(h)g(pressure)i
+(in)f(terms)f(of)g(the)262 686 y(attac)o(k/defence)14 b(balance)e(is)h
+(curren)o(tly)g(exerted)i(on)d(the)h(king)f(in)h(question.)k(The)d(higher)262
+736 y(the)e(v)n(alue)g(of)g(PK,)g(the)h(more)e(pressure)j(is)f(though)o(t)f
+(to)g(exist.)18 b(This)12 b(de\014nition)g(will)e(form)262
+786 y(the)15 b(basis)f(of)g(a)h(decision)g(as)f(to)h(whether)h(an)e(assault)h
+(against)f(the)h(king)f(is)g(lik)o(ely)g(to)g(b)q(e)262 836
+y(w)o(orth)o(while.)324 921 y(This)i(de\014nition)g(tak)o(es)h(in)o(to)f
+(accoun)o(t)h(attac)o(ks)g(b)o(y)f(b)q(oth)g(sides)i(on)e(squares)h(within)
+262 971 y(a)f(4)g(square,)h(2)f(\014le)g(b)q(oundary)g(of)g(eac)o(h)h(king.)
+25 b(The)16 b(v)n(alue)g(of)g(the)h(attac)o(k)f(dep)q(ends)i(on)262
+1020 y(the)d(t)o(yp)q(e)h(of)e(pieces)i(in)o(v)o(olv)o(ed.)k(The)c(defensiv)o
+(e)f(v)n(alue)g(is)f(calculated)i(in)e(a)h(similar)d(w)o(a)o(y)m(,)262
+1070 y(except)k(the)g(relativ)o(e)e(v)n(alue)h(of)f(the)i(attac)o(ks)f(b)o(y)
+g(pieces)h(are)f(di\013eren)o(t.)23 b(F)m(or)14 b(example,)g(a)262
+1120 y(pa)o(wn)f(is)h(considered)h(to)f(p)q(erform)f(a)g(b)q(etter)j
+(defensiv)o(e)f(role)e(than)h(an)g(attac)o(king)f(one.)324
+1205 y(Mobile)18 b(pa)o(wns)i(in)e(attac)o(k)i(are)f(considered)i(sup)q
+(erior)f(to)f(blo)q(c)o(k)o(ed)g(pa)o(wns.)34 b(Also,)262 1255
+y(an)19 b(allo)o(w)o(ance)g(is)h(made)f(for)h(op)q(en)g(or)g(semi{op)q(en)f
+(\014les)i(a)o(v)n(ailable)d(to)i(the)g(attac)o(king)262 1305
+y(side)f(b)q(ecause)h(this)f(ob)o(viously)e(impro)o(v)o(es)g(the)j(lik)o
+(eliho)q(o)q(d)d(of)h(an)g(attac)o(k)h(on)f(the)h(king)262
+1355 y(succeeding.)262 1506 y Fu(4.11.2)55 b(De\014nition)17
+b(38)i(:)25 b(Plan)18 b(Selection)344 1597 y Fh(P)6 b(S)402
+1603 y Fe(col)460 1597 y Fp(=)100 b Fl(if)13 b Fp(\(phase)i
+Fh(<)f Fp(8\))651 1647 y Fl(if)f Fp(\()p Fh(])p Fp(P)o(a)o(wns)h
+Fh(>)g Fp(0\))710 1697 y Fh(P)6 b(l)q(anT)g(y)q(pe)894 1703
+y Fe(col)953 1697 y Fp(=)14 b(EndGameKP)710 1747 y Fh(P)6 b(l)q(anW)g(ing)907
+1753 y Fe(col)965 1747 y Fp(=)14 b(QueenSide)h Ff([)e Fp(KingSide)651
+1797 y Fl(endif)592 1846 y(else)651 1896 y(if)g Fp(\()p Fh(P)6
+b(K)777 1903 y Fe(O)q(pp)p Fk(\()p Fe(col)p Fk(\))919 1896
+y Fh(>)14 b Fp(phase\))710 1946 y Fl(if)f Fp(\()p Fh(P)6 b(K)836
+1953 y Fe(O)q(pp)p Fk(\()p Fe(col)p Fk(\))978 1946 y Fh(>)14
+b Fp(phase+3)g Fl(or)g Fp(Opp)q(ositeFlanks\))769 1996 y Fh(P)6
+b(l)q(anT)g(y)q(pe)953 2002 y Fe(col)1012 1996 y Fp(=)14 b(P)o(a)o(wnA)o
+(ttac)o(k)g Ff([)f Fp(PieceA)o(ttac)o(k)710 2046 y Fl(else)769
+2096 y Fh(P)6 b(l)q(anT)g(y)q(pe)953 2102 y Fe(col)1012 2096
+y Fp(=)14 b(PieceA)o(ttac)o(k)710 2145 y Fl(endif)710 2195
+y Fh(P)6 b(l)q(anW)g(ing)907 2201 y Fe(col)965 2195 y Fp(=)14
+b(Wing\(KingSq\(Opp\(col\)\)\))651 2245 y Fl(else)710 2295
+y(if)f Fp(\(Opp)q(ositeFlanks\))769 2345 y Fh(P)6 b(l)q(anT)g(y)q(pe)953
+2351 y Fe(col)1012 2345 y Fp(=)14 b(P)o(a)o(wnA)o(ttac)o(k)769
+2394 y Fh(P)6 b(l)q(anW)g(ing)966 2400 y Fe(col)1024 2394 y
+Fp(=)14 b(Wing\(KingSq\(Opp\(col\)\)\))710 2444 y Fl(else)957
+2574 y Fp(84)p eop
+%%Page: 85 87
+85 86 bop 769 307 a Fl(if)13 b Fp(\(phase)i Fh(>)f Fp(10\))828
+357 y Fh(P)6 b(l)q(anT)g(y)q(pe)1012 363 y Fe(col)1071 357
+y Fp(=)14 b(Lev)o(erP)o(a)o(wns)828 407 y Fh(P)6 b(l)q(anW)g(ing)1025
+413 y Fe(col)1083 407 y Fp(=)14 b(QueenSide)h Ff([)f Fp(KingSide)769
+457 y Fl(else)828 506 y Fh(P)6 b(l)q(anT)g(y)q(pe)1012 512
+y Fe(col)1071 506 y Fp(=)14 b(None)769 556 y Fl(endif)710 606
+y(endif)651 656 y(endif)592 706 y(endif)262 832 y Fp(This)k(de\014nition)g
+(attempts)h(to)f(select)i(the)g(b)q(est)g(plan)e(at)g(its)h(disp)q(osal)f
+(based)i(on)e(the)262 882 y(kno)o(wn)e(information.)25 b(It)17
+b(ma)o(y)e(b)q(e)j(the)g(case)g(that)f(no)g(plan)f(is)h(clear,)h(in)f(this)g
+(case)h(no)262 932 y(plan)13 b(will)f(b)q(e)j(selected.)324
+1017 y(In)i(the)g(endgame)f(only)g(one)h(plan)f(is)h(kno)o(wn,)g(that)f(of)h
+(king{pa)o(wn)e(co-ordination.)262 1067 y(In)e(the)h(op)q(ening)g(or)f
+(middle)f(game,)g(if)h(the)h(attac)o(k{defence)h(balance)e(\(pressure\))k(on)
+c(the)262 1117 y(opp)q(onen)o(ts)i(king)e(app)q(ears)i(to)f(o\013er)h(some)f
+(lik)o(eliho)q(o)q(d)e(of)i(success,)i(then)f(a)f(piece)i(attac)o(k)262
+1167 y(plan)d(is)g(considered)i(suitable.)j(If)c(the)g(pressure)i(is)e(ev)o
+(en)g(greater,)h(a)e(pa)o(wn)h(assault)f(plan)262 1217 y(is)g(also)h
+(selected.)20 b(The)15 b(idea)f(here)h(is)f(to)g(only)f(use)i(pa)o(wns)f
+(when)g(there)i(is)e(enough)g(piece)262 1266 y(co)o(v)o(erage)g(to)g(mak)o(e)
+e(their)i(use)h(e\013ectiv)o(e.)324 1352 y(Pressure)21 b(is)d(in)g(fact)g(a)g
+(measure)g(of)g(the)h(balance)f(b)q(et)o(w)o(een)i(attac)o(k)e(and)h
+(defence,)262 1401 y(therefore)i(a)f(king)f(assault)h(plan)g(ma)o(y)e(ev)o
+(en)j(b)q(e)f(considered)i(if)d(no)h(relev)n(an)o(t)g(attac)o(ks)262
+1451 y(curren)o(tly)10 b(exist.)17 b(This)9 b(of)g(course)i(dep)q(ends)g(on)e
+(the)h(enem)o(y)f(defence)i(b)q(eing)e(w)o(eak.)17 b(Hence,)262
+1501 y(once)12 b(a)f(w)o(eakness)h(is)g(detected)h(b)o(y)e(the)h(program)e
+(it)h(ma)o(y)f(switc)o(h)h(its)h(atten)o(tion)f(to)g(a)g(king)262
+1551 y(assault.)18 b(Hop)q(efully)c(this)g(will)f(help)h(the)h(program)d(to)i
+(exhibit)g(a)g(more)f(h)o(uman)g(st)o(yle)h(of)262 1601 y(pla)o(y)m(.)324
+1686 y(Additionally)m(,)8 b(if)i(the)h(kings)f(ha)o(v)o(e)g(castled)h(on)f
+(opp)q(osite)h(\015anks,)f(a)h(plan)e(to)i(encourage)262 1736
+y(an)i(assault)h(b)o(y)g(pa)o(wns)g(will)e(b)q(e)i(selected.)324
+1821 y(If)c(none)h(of)f(these)i(plans)f(are)g(selected,)h(a)f(general)g(goal)
+e(of)h(using)g(pa)o(wn)h(lev)o(ers)g(ma)o(y)e(b)q(e)262 1871
+y(used.)18 b(The)12 b(idea)g(here)h(is)e(to)h(use)h(pa)o(wns)e(as)h(lev)o
+(ers)h(against)e(the)h(enem)o(y)f(pa)o(wn)h(structure,)262
+1921 y(therefore,)i(creating)g(dynamic)e(t)o(yp)q(e)j(p)q(ositions)e(whic)o
+(h)h(are)g(b)q(est)h(suited)f(to)f(a)h(programs)262 1970 y(tactical)f(abilit)
+o(y)m(.)957 2574 y(85)p eop
+%%Page: 86 88
+86 87 bop 262 307 a Fu(4.11.3)55 b(De\014nition)17 b(39)i(:)25
+b(P)n(a)n(wn)20 b(Square)e(T)-5 b(able)p 641 413 673 5 v 641
+1077 5 665 v 646 496 a Fg(0Z0Z0Z0Z)646 579 y(Z0Z0Z0Z0)646 662
+y(0Z0Z0Z0Z)646 745 y(Z0Z0Z0Z0)646 828 y(0Z0Z0Z0Z)646 911 y(Z0Z0Z0Z0)646
+994 y(0Z0Z0Z0Z)646 1077 y(Z0Z0Z0Z0)p 1310 1077 V 641 1081 673
+5 v 675 473 a Fl(0)59 b(0)f(0)h(0)g(0)f(0)h(0)g(0)675 556 y(20)35
+b(20)f(24)h(28)g(28)f(24)h(20)g(20)675 639 y(16)g(16)f(20)h(24)g(24)f(20)h
+(16)g(16)675 722 y(12)g(12)f(16)h(20)g(20)f(16)h(12)g(12)675
+805 y(8)59 b(8)f(12)35 b(16)g(16)f(12)h(8)59 b(8)675 888 y(6)g(6)f(8)h(12)35
+b(12)f(8)59 b(6)g(6)675 971 y(4)g(4)f(6)h(8)g(8)f(6)h(4)g(4)675
+1054 y(0)g(0)f(0)h(0)g(0)f(0)h(0)g(0)479 1180 y Fp(Figure)14
+b(4.10:)i(Initial)d(W)m(eigh)o(tings)f(for)i(P)o(a)o(wn)f(Square)i(T)m(able.)
+344 1292 y Fh(P)6 b(S)r(T)428 1298 y Fe(col;sq)528 1292 y Fp(:)52
+b Fl(for)15 b(eac)o(h)h(square)d Fp(sq)h Fl(do)651 1342 y Fh(P)6
+b(S)r(T)735 1348 y Fe(col;sq)833 1342 y Fp(=)12 b Fh(S)r(T)928
+1348 y Fe(col;sq)1024 1342 y Fp(+)d Fh(K)s(S)1128 1348 y Fe(col;sq)1224
+1342 y Fp(+)h Fh(P)c(A)1330 1348 y Fe(col;sq)1424 1342 y Fp(+)k
+Fh(P)c(L)1527 1348 y Fe(col;sq)592 1392 y Fl(endfor)344 1491
+y(where)380 1541 y Fh(S)r(T)431 1547 y Fe(col;sq)531 1541 y
+Fp(:)49 b(Static)14 b(w)o(eigh)o(tings)f(as)h(de\014ned)h(in)f(\014gure)g
+(4.10.)380 1641 y Fh(K)s(S)443 1647 y Fe(col;sq)543 1641 y
+Fp(:)37 b Fl(if)13 b Fp(\()p Fh(])p Fp(UnMo)o(v)o(ed\(col,King\))g(=)h(0\))
+651 1691 y Fl(if)f Fp(\(KingDistance\(KingSq\(col\),sq\))h
+Fh(<)g Fp(2\))710 1741 y Fl(case)g Fp(Distance\(KingSq\(col\),sq\))g
+Fl(of)769 1790 y Fp(1)g(:)k(phase)769 1840 y(2)c(:)k(phase/2)710
+1890 y Fl(else)769 1940 y Fp(0)710 1990 y Fl(endcase)651 2039
+y(else)710 2089 y Fp(0)651 2139 y Fl(endif)592 2189 y(else)651
+2239 y(if)13 b Fp(\(\(OnFile\(sq\))i(=)f(1)f Fl(or)h Fp(2)f
+Fl(or)h Fp(7)f Fl(or)h Fp(8\))f Fl(and)g Fp(OnRank\(col,sq\))h
+Ff(\024)g Fp(3\))710 2288 y(phase)h(/)e(OnRank\(col,sq\))651
+2338 y Fl(else)710 2388 y Fp(0)651 2438 y Fl(endif)957 2574
+y Fp(86)p eop
+%%Page: 87 89
+87 88 bop 592 307 a Fl(endif)380 407 y Fh(P)6 b(A)444 413 y
+Fe(col;sq)543 407 y Fp(:)37 b Fl(if)13 b Fp(\(\(P)o(a)o(wnA)o(ttac)o(k)h
+Ff(2)d Fh(P)6 b(l)q(anT)g(y)q(pe)1125 413 y Fe(col)1184 407
+y Fl(and)13 b Fp(OnWing\()p Fh(P)6 b(l)q(anW)g(ing)1641 413
+y Fe(col)1684 407 y Fp(,sq\)\))592 457 y Fl(and)13 b Fp(P)o(a)o(wnLev)o
+(er\(OnFile\(sq\),col\)\))651 506 y(40)h Ff(\000)g Fp(8)p Ff(\001)p
+Fp(T)m(axicab\(Lev)o(erSq\(OnFile\(sq\),col\),sq\))592 556
+y Fl(else)651 606 y Fp(0)592 656 y Fl(endif)380 756 y Fh(P)6
+b(L)441 762 y Fe(col;sq)540 756 y Fp(:)40 b Fl(if)13 b Fp(\(Lev)o(erP)o(a)o
+(wns)i Ff(2)c Fh(P)6 b(l)q(anT)g(y)q(pe)1103 762 y Fe(col)1161
+756 y Fl(and)14 b Fp(P)o(a)o(wnLev)o(er\(OnFile\(sq\),col\)\))651
+805 y(10)g Ff(\000)g Fp(2)p Ff(\001)p Fp(T)m(axicab\(Lev)o
+(erSq\(OnFile\(sq\),col\),sq\))592 855 y Fl(else)651 905 y
+Fp(0)592 955 y Fl(endif)262 1082 y Fp(A)f(general)h(table)g(of)f(v)n(alues)h
+(for)f(pa)o(wn)h(o)q(ccupation)g(is)f(used.)19 b(Once)c(a)f(king)f(has)h(mo)o
+(v)o(ed,)262 1131 y(the)19 b(pa)o(wns)f(near)i(the)f(king)f(are)h
+(discouraged)g(from)e(mo)o(ving)f(as)j(this)f(w)o(ould)g(w)o(eak)o(en)262
+1181 y(the)g(pa)o(wn)f(shield)h(around)g(the)g(king.)29 b(Before)19
+b(the)f(king)f(\014rst)i(mo)o(v)o(es,)e(the)h(pa)o(wns)g(on)262
+1231 y(either)e(\015ank)f(are)h(discouraged)g(from)d(mo)o(ving)g(as)i(they)h
+(are)g(lik)o(ely)e(to)h(form)f(the)i(future)262 1281 y(pa)o(wn)i(shield.)32
+b(As)19 b(the)g(game)e(progresses)k(these)f(restrictions)f(are)g(reduced,)i
+(thereb)o(y)262 1331 y(encouraging)13 b(pa)o(wn)h(adv)n(ances.)k(Cen)o(tre)d
+(pa)o(wns)f(are)h(free)f(from)e(suc)o(h)j(restrictions.)324
+1416 y(A)10 b(pa)o(wn)f(attac)o(k)h(plan)f(is)h(implem)o(en)o(ted)e(b)o(y)i
+(encouraging)f(pa)o(wn)h(mo)o(v)o(es)e(up)i(the)h(b)q(oard)262
+1466 y(whic)o(h)h(w)o(ould)g(result)i(in)f(pa)o(wn)f(lev)o(erage.)18
+b(The)c(b)q(on)o(us)f(giv)o(en)f(dep)q(ends)j(on)e(ho)o(w)f(close)i(to)262
+1515 y(the)g(lev)o(er)g(square)h(the)f(pa)o(wn)g(is.)324 1601
+y(A)e(general)h(pa)o(wn)f(lev)o(er)h(plan)f(is)g(actioned)g(in)g(a)h(similar)
+c(manor)i(to)i(the)g(pa)o(wn)f(attac)o(k)262 1651 y(plan)h(ab)q(o)o(v)o(e,)g
+(except)i(the)g(b)q(on)o(uses)g(used)f(are)h(signi\014can)o(tly)e(lo)o(w)o
+(er.)324 1736 y(Remem)o(b)q(er,)19 b(these)i(v)n(alues)e(are)h(for)f(p)q
+(ossible)h(pa)o(wn)f(o)q(ccupation.)35 b(Ev)o(en)20 b(though)262
+1786 y(no)14 b(pa)o(wns)i(exist)f(on)g(the)h(\014le)f(these)h(v)n(alues)f(ma)
+o(y)e(still)h(b)q(e)i(imp)q(ortan)o(t)d(b)q(ecause)k(a)e(pa)o(wn)262
+1835 y(ma)o(y)c(capture)k(on)o(to)e(the)h(said)f(\014le)h(during)f(the)h
+(searc)o(h)h(and)e(should)g(therefore)i(incur)f(the)262 1885
+y(relev)n(an)o(t)f(b)q(on)o(us)i(or)e(p)q(enalt)o(y)m(.)957
+2574 y(87)p eop
+%%Page: 88 90
+88 89 bop 262 307 a Fu(4.11.4)55 b(De\014nition)17 b(40)i(:)25
+b(Knigh)n(t)18 b(Square)g(T)-5 b(able)p 641 413 673 5 v 641
+1077 5 665 v 646 496 a Fg(0Z0Z0Z0Z)646 579 y(Z0Z0Z0Z0)646 662
+y(0Z0Z0Z0Z)646 745 y(Z0Z0Z0Z0)646 828 y(0Z0Z0Z0Z)646 911 y(Z0Z0Z0Z0)646
+994 y(0Z0Z0Z0Z)646 1077 y(Z0Z0Z0Z0)p 1310 1077 V 641 1081 673
+5 v 675 473 a Fl(2)59 b(3)f(4)h(4)g(4)f(4)h(3)g(2)675 556 y(3)g(4)f(6)h(6)g
+(6)f(6)h(4)g(3)675 639 y(4)g(6)f(8)h(8)g(8)f(8)h(6)g(4)675
+722 y(4)g(6)f(8)h(10)35 b(10)f(8)59 b(6)g(4)675 805 y(4)g(6)f(8)h(10)35
+b(10)f(8)59 b(6)g(4)675 888 y(4)g(6)f(8)h(8)g(8)f(8)h(6)g(4)675
+971 y(3)g(4)f(6)h(6)g(6)f(6)h(4)g(3)675 1054 y(2)g(3)f(4)h(4)g(4)f(4)h(3)g(2)
+466 1180 y Fp(Figure)14 b(4.11:)i(Initial)d(W)m(eigh)o(tings)f(for)i(Knigh)o
+(t)f(Square)i(T)m(able.)344 1328 y Fh(N)5 b(S)r(T)433 1334
+y Fe(col;sq)534 1328 y Fp(:)46 b Fl(for)15 b(eac)o(h)h(square)d
+Fp(sq)h Fl(do)651 1377 y Fh(N)5 b(S)r(T)740 1383 y Fe(col;sq)839
+1377 y Fp(=)11 b Fh(S)r(T)933 1383 y Fe(col;sq)1029 1377 y
+Fp(+)f Fh(P)c(H)1139 1383 y Fe(col;sq)1233 1377 y Fp(+)j Fh(K)s(C)1342
+1383 y Fe(col;sq)592 1427 y Fl(endfor)344 1527 y(where)380
+1577 y Fh(S)r(T)431 1583 y Fe(col;sq)531 1577 y Fp(:)18 b(Static)c(w)o(eigh)o
+(tings)f(as)h(de\014ned)h(in)f(\014gure)g(4.11.)380 1676 y
+Fh(P)6 b(H)448 1682 y Fe(col;sq)546 1676 y Fp(:)34 b Fl(if)13
+b Fp(\(P)o(a)o(wnHole\(sq,Opp\(col\)\)\))651 1726 y(phase)592
+1776 y Fl(else)651 1826 y Fp(0)592 1876 y Fl(endif)380 1975
+y Fh(K)s(C)448 1981 y Fe(col;sq)547 1975 y Fp(:)33 b Ff(\000)p
+Fp(T)m(axicab\(KingSq\(col\),sq\))13 b Ff(\000)h Fp(T)m
+(axicab\(KingSq\(Opp\(col\)\),sq\))262 2102 y(Knigh)o(ts)h(are)h(encouraged)h
+(to)e(b)q(e)h(on)g(squares)h(where)f(they)g(ha)o(v)o(e)g(as)g(man)o(y)d
+(options)j(as)262 2152 y(p)q(ossible.)35 b(They)21 b(are)f(also)f(encouraged)
+i(to)e(o)q(ccup)o(y)i(pa)o(wn)e(holes,)i(the)g(b)q(on)o(us)f(b)q(eing)262
+2202 y(dep)q(enden)o(t)f(on)e(the)h(game)e(phase.)30 b(Knigh)o(ts)17
+b(are)h(p)q(enalised)g(for)f(their)h(distance)g(from)262 2251
+y(eac)o(h)g(king.)28 b(This)18 b(encourages)h(a)f(knigh)o(t)f(to)g(main)o
+(tain)e(a)j(p)q(osition)f(from)f(where)i(it)g(is)262 2301 y(p)q(oised)c(to)f
+(attac)o(k)h(the)h(enem)o(y)e(king)g(or)h(protect)h(its)f(o)o(wn)f(king)g(as)
+h(the)h(need)g(arises.)957 2574 y(88)p eop
+%%Page: 89 91
+89 90 bop 262 307 a Fu(4.11.5)55 b(De\014nition)17 b(41)i(:)25
+b(Bishop)18 b(Square)g(T)-5 b(able)p 641 413 673 5 v 641 1077
+5 665 v 646 496 a Fg(0Z0Z0Z0Z)646 579 y(Z0Z0Z0Z0)646 662 y(0Z0Z0Z0Z)646
+745 y(Z0Z0Z0Z0)646 828 y(0Z0Z0Z0Z)646 911 y(Z0Z0Z0Z0)646 994
+y(0Z0Z0Z0Z)646 1077 y(Z0Z0Z0Z0)p 1310 1077 V 641 1081 673 5
+v 675 473 a Fl(0)59 b(2)f(2)h(2)g(2)f(2)h(2)g(0)675 556 y(2)g(8)f(8)h(8)g(8)f
+(8)h(8)g(2)675 639 y(2)g(8)f(10)35 b(10)g(10)f(10)h(8)59 b(2)675
+722 y(2)g(8)f(10)35 b(12)g(12)f(10)h(8)59 b(2)675 805 y(2)g(8)f(10)35
+b(12)g(12)f(10)h(8)59 b(2)675 888 y(2)g(8)f(10)35 b(10)g(10)f(10)h(8)59
+b(2)675 971 y(2)g(8)f(8)h(8)g(8)f(8)h(8)g(2)675 1054 y(0)g(2)f(2)h(2)g(2)f(2)
+h(2)g(0)466 1180 y Fp(Figure)14 b(4.12:)j(Initial)c(W)m(eigh)o(tings)f(for)i
+(Bishop)g(Square)g(T)m(able.)344 1328 y Fh(B)r(S)r(T)428 1334
+y Fe(col;sq)529 1328 y Fp(:)51 b Fl(for)15 b(eac)o(h)h(square)d
+Fp(sq)h Fl(do)651 1377 y Fh(B)r(S)r(T)735 1383 y Fe(col;sq)834
+1377 y Fp(=)e Fh(S)r(T)929 1383 y Fe(col;sq)1025 1377 y Fp(+)e
+Fh(P)c(H)1135 1383 y Fe(col;sq)592 1427 y Fl(endfor)344 1527
+y(where)380 1577 y Fh(S)r(T)431 1583 y Fe(col;sq)531 1577 y
+Fp(:)49 b(Static)14 b(w)o(eigh)o(tings)f(as)h(de\014ned)h(in)f(\014gure)g
+(4.12.)380 1676 y Fh(P)6 b(H)448 1682 y Fe(col;sq)546 1676
+y Fp(:)34 b Fl(if)13 b Fp(\(P)o(a)o(wnHole\(sq,Opp\(col\)\)\))651
+1726 y(phase/2)592 1776 y Fl(else)651 1826 y Fp(0)592 1876
+y Fl(endif)262 2002 y Fp(Bishops)e(are)g(encouraged)h(to)f(k)o(eep)g(on)g
+(long)f(diagonals)f(and)i(ha)o(v)o(e)g(p)q(o)o(w)o(er)g(in)f(as)h(man)o(y)e
+(di-)262 2052 y(rections)i(as)g(p)q(ossible.)17 b(A)11 b(static)g(table)g
+(pro)o(vides)g(appropriate)f(initial)f(b)q(on)o(uses.)18 b(Bishops)262
+2102 y(are)d(additionally)d(encouraged)k(to)f(o)q(ccup)o(y)h(pa)o(wn)e
+(holes,)h(the)h(b)q(on)o(us)f(b)q(eing)g(dep)q(enden)o(t)262
+2152 y(on)e(the)i(game)d(phase.)957 2574 y(89)p eop
+%%Page: 90 92
+90 91 bop 262 307 a Fu(4.11.6)55 b(De\014nition)17 b(42)i(:)25
+b(King)18 b(Square)g(T)-5 b(able)p 641 408 673 5 v 641 1072
+5 665 v 646 491 a Fg(0Z0Z0Z0Z)646 574 y(Z0Z0Z0Z0)646 657 y(0Z0Z0Z0Z)646
+740 y(Z0Z0Z0Z0)646 823 y(0Z0Z0Z0Z)646 906 y(Z0Z0Z0Z0)646 989
+y(0Z0Z0Z0Z)646 1072 y(Z0Z0Z0Z0)p 1310 1072 V 641 1076 673 5
+v 651 463 a Ff(\000)p Fl(2)27 b(+0)22 b Ff(\000)p Fl(4)k Ff(\000)p
+Fl(8)h Ff(\000)p Fl(8)g Ff(\000)p Fl(4)f(+0)c Ff(\000)p Fl(2)651
+546 y Ff(\000)p Fl(2)27 b Ff(\000)p Fl(2)g Ff(\000)p Fl(6)f
+Ff(\000)p Fl(8)h Ff(\000)p Fl(8)g Ff(\000)p Fl(6)f Ff(\000)p
+Fl(2)h Ff(\000)p Fl(2)651 628 y Ff(\000)p Fl(16)s Ff(\000)p
+Fl(16)s Ff(\000)p Fl(18)s Ff(\000)p Fl(20)s Ff(\000)p Fl(20)s
+Ff(\000)p Fl(18)s Ff(\000)p Fl(16)s Ff(\000)p Fl(16)651 711
+y Ff(\000)p Fl(18)s Ff(\000)p Fl(18)s Ff(\000)p Fl(22)s Ff(\000)p
+Fl(26)s Ff(\000)p Fl(26)s Ff(\000)p Fl(22)s Ff(\000)p Fl(18)s
+Ff(\000)p Fl(18)651 794 y Ff(\000)p Fl(18)s Ff(\000)p Fl(18)s
+Ff(\000)p Fl(22)s Ff(\000)p Fl(26)s Ff(\000)p Fl(26)s Ff(\000)p
+Fl(22)s Ff(\000)p Fl(18)s Ff(\000)p Fl(18)651 877 y Ff(\000)p
+Fl(16)s Ff(\000)p Fl(16)s Ff(\000)p Fl(18)s Ff(\000)p Fl(20)s
+Ff(\000)p Fl(20)s Ff(\000)p Fl(18)s Ff(\000)p Fl(16)s Ff(\000)p
+Fl(16)651 960 y Ff(\000)p Fl(2)g Ff(\000)p Fl(2)g Ff(\000)p
+Fl(6)f Ff(\000)p Fl(8)h Ff(\000)p Fl(8)g Ff(\000)p Fl(6)f Ff(\000)p
+Fl(2)h Ff(\000)p Fl(2)651 1043 y Ff(\000)p Fl(2)g(+0)22 b Ff(\000)p
+Fl(4)k Ff(\000)p Fl(8)h Ff(\000)p Fl(8)g Ff(\000)p Fl(4)f(+0)c
+Ff(\000)p Fl(2)485 1165 y Fp(Figure)14 b(4.13:)i(Initial)d(W)m(eigh)o(tings)f
+(for)i(King)f(Square)i(T)m(able.)344 1303 y Fh(K)s(S)r(T)433
+1309 y Fe(col;sq)534 1303 y Fp(:)46 b Fl(for)15 b(eac)o(h)h(square)d
+Fp(sq)h Fl(do)651 1353 y Fh(K)s(S)r(T)740 1359 y Fe(col;sq)839
+1353 y Fp(=)e Fh(S)r(T)934 1359 y Fe(col;sq)1030 1353 y Fp(+)d
+Fh(K)s(E)1140 1359 y Fe(col;sq)1235 1353 y Ff(\000)h Fh(P)c(C)1340
+1359 y Fe(col;sq)592 1403 y Fl(endfor)344 1503 y(where)380
+1553 y Fh(S)r(T)431 1559 y Fe(col;sq)531 1553 y Fp(:)49 b(Static)14
+b(w)o(eigh)o(tings)f(as)h(de\014ned)h(in)f(\014gure)g(4.13.)380
+1652 y Fh(K)s(E)449 1658 y Fe(col;sq)548 1652 y Fp(:)32 b(\()p
+Ff(\000)p Fh(S)r(T)691 1658 y Fe(col;sq)779 1652 y Fp(\))p
+Ff(\001)13 b Fp(revPhase/8)380 1752 y Fh(P)6 b(C)443 1758 y
+Fe(col;sq)541 1752 y Fp(:)39 b Fl(if)13 b Fp(\(EndgameKP)g
+Ff(2)f Fh(P)6 b(l)q(anT)g(y)q(pe)1117 1758 y Fe(col)1161 1752
+y Fp(\))651 1802 y Fl(for)15 b(eac)o(h)h(square)d Fp(sq2)h
+Fl(do)710 1851 y(if)f Fp(\(Occup)o(y\([P)o(a)o(wn],col,sq\)\))769
+1901 y Fl(if)g Fp(\(P)o(assed\(col,sq2\)\))828 1951 y(P)o(a)o(wnMass)i(=)f(P)
+o(a)o(wnMass)g(+)g(4)g Ff(\001)f Fp(T)m(axicab\(sq,sq2\))828
+2001 y(P)o(a)o(wnMass)i(=)f(P)o(a)o(wnMass)g(+)g(T)m
+(axicab\(sq,PSq\(col,sq2\)\))769 2051 y Fl(else)828 2100 y
+Fp(P)o(a)o(wnMass)h(=)f(P)o(a)o(wnMass)g(+)g(T)m(axicab\(sq,sq2\))769
+2150 y Fl(endif)710 2200 y(else)769 2250 y(if)f Fp(\(Occup)o(y\([P)o(a)o
+(wn],Opp\(col\),sq\)\))828 2300 y Fl(if)g Fp(\(P)o(assed\(Opp\(col\),sq2\)\))
+888 2350 y(P)o(a)o(wnMass)h(=)g(P)o(a)o(wnMass)g(+)g(4)g Ff(\001)f
+Fp(T)m(axicab\(sq,sq2\))888 2399 y(P)o(a)o(wnMass)h(=)g(P)o(a)o(wnMass)g(+)g
+(T)m(axicab\(sq,PSq\(col,sq2\)\))828 2449 y Fl(else)957 2574
+y Fp(90)p eop
+%%Page: 91 93
+91 92 bop 888 307 a Fp(P)o(a)o(wnMass)14 b(=)g(P)o(a)o(wnMass)g(+)g(T)m
+(axicab\(sq,sq2\))828 357 y Fl(endif)769 407 y(endif)710 457
+y(endif)651 506 y(endfor)651 556 y Fh(P)6 b(C)714 562 y Fe(col;sq)811
+556 y Fp(=)14 b(\(P)o(a)o(wnMass/)p Fh(])p Fp(P)o(a)o(wns)g
+Ff(\000)p Fp(8\))g Ff(\001)f Fp(\(revPhase)p Ff(\000)p Fp(8\))592
+606 y Fl(else)651 656 y Fp(0)592 706 y Fl(endif)262 832 y Fp(A)o(t)h(the)h(b)
+q(eginning)f(of)g(the)h(game)e(the)i(king)e(is)i(encouraged)g(to)f(seek)i(a)e
+(safe)h(ha)o(v)o(en)f(near)262 882 y(one)j(of)g(the)h(corner)g(squares.)29
+b(As)18 b(the)g(game)e(progresses)j(the)f(king)e(is)h(encouraged)i(to)262
+932 y(pla)o(y)12 b(a)h(more)g(activ)o(e)g(role.)18 b(Ev)o(en)o(tually)m(,)12
+b(the)i(king)f(will)f(receiv)o(e)i(more)f(b)q(on)o(us)h(p)q(oin)o(ts)f(for)
+262 982 y(b)q(eing)h(in)g(the)g(cen)o(tre)i(than)f(near)f(the)h(edge)g(of)f
+(the)h(b)q(oard.)k(Ho)o(w)o(ev)o(er,)14 b(this)g(c)o(hange)h(will)262
+1032 y(b)q(e)f(gradual)f(as)h(it)g(is)f(related)i(to)e(the)i(game)d(phase.)
+324 1117 y(When)k(in)g(the)h(endgame,)f(the)h(king)e(gets)i(b)q(on)o(uses)h
+(for)e(main)o(taining)d(an)j(optim)o(um)262 1167 y(distance)e(from)e(all)h
+(the)h(pa)o(wns)g(with)g(particular)g(emphasis)f(on)g(passed)i(pa)o(wns.)957
+2574 y(91)p eop
+%%Page: 92 94
+92 93 bop 262 307 a Fu(4.11.7)55 b(De\014nition)17 b(43)i(:)25
+b(Square)18 b(Con)n(trol)h(T)-5 b(able)p 641 413 673 5 v 641
+1077 5 665 v 646 496 a Fg(0Z0Z0Z0Z)646 579 y(Z0Z0Z0Z0)646 662
+y(0Z0Z0Z0Z)646 745 y(Z0Z0Z0Z0)646 828 y(0Z0Z0Z0Z)646 911 y(Z0Z0Z0Z0)646
+994 y(0Z0Z0Z0Z)646 1077 y(Z0Z0Z0Z0)p 1310 1077 V 641 1081 673
+5 v 687 473 a Fl(2)58 b(2)h(2)g(2)f(2)h(2)g(2)f(2)687 556 y(2)g(2)h(2)g(2)f
+(2)h(2)g(2)f(2)687 639 y(2)g(2)h(2)g(2)f(2)h(2)g(2)f(2)687
+722 y(2)g(2)h(2)g(2)f(2)h(2)g(2)f(2)687 805 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f(1)
+687 888 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f(1)687 971 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f
+(1)687 1054 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f(1)383 1180 y Fp(Figure)14
+b(4.14:)j(Initial)12 b(W)m(eigh)o(tings)h(for)g(White's)h(Square)g(Con)o
+(trol)f(T)m(able.)p 641 1280 V 641 1944 5 665 v 646 1363 a
+Fg(0Z0Z0Z0Z)646 1446 y(Z0Z0Z0Z0)646 1529 y(0Z0Z0Z0Z)646 1612
+y(Z0Z0Z0Z0)646 1695 y(0Z0Z0Z0Z)646 1778 y(Z0Z0Z0Z0)646 1861
+y(0Z0Z0Z0Z)646 1944 y(Z0Z0Z0Z0)p 1310 1944 V 641 1948 673 5
+v 687 1341 a Fl(1)58 b(1)h(1)g(1)f(1)h(1)g(1)f(1)687 1424 y(1)g(1)h(1)g(1)f
+(1)h(1)g(1)f(1)687 1507 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f(1)687
+1590 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f(1)687 1673 y(2)g(2)h(2)g(2)f(2)h(2)g(2)f
+(2)687 1755 y(2)g(2)h(2)g(2)f(2)h(2)g(2)f(2)687 1838 y(2)g(2)h(2)g(2)f(2)h(2)
+g(2)f(2)687 1921 y(2)g(2)h(2)g(2)f(2)h(2)g(2)f(2)388 2048 y
+Fp(Figure)14 b(4.15:)j(Initial)c(W)m(eigh)o(tings)f(for)i(Blac)o(k's)f
+(Square)i(Con)o(trol)e(T)m(able.)344 2195 y Fh(S)369 2201 y
+Fe(col;sq)469 2195 y Fp(:)111 b Fl(for)15 b(eac)o(h)h(square)d
+Fp(sq)h Fl(do)651 2245 y Fh(S)676 2251 y Fe(col;sq)774 2245
+y Fp(=)e Fh(S)r(T)869 2251 y Fe(col;sq)965 2245 y Fp(+)d Fh(P)d(L)1067
+2251 y Fe(col;sq)592 2295 y Fl(endfor)344 2394 y(where)380
+2444 y Fh(S)r(T)431 2450 y Fe(col;sq)531 2444 y Fp(:)49 b(Static)14
+b(w)o(eigh)o(tings)f(indexed)i(b)o(y)e(colour)h(and)g(square,)g(see)h
+(\014gures)957 2574 y(92)p eop
+%%Page: 93 95
+93 94 bop 592 307 a Fp(4.14)13 b(and)h(4.15)380 407 y Fh(P)6
+b(L)441 413 y Fe(col;sq)540 407 y Fp(:)40 b Fl(if)13 b Fp(\(PieceA)o(ttac)o
+(k)i Ff(2)f Fh(P)6 b(l)q(anT)g(y)q(pe)1107 413 y Fe(col)1165
+407 y Fl(and)13 b Fp(OnWing\()p Fh(P)6 b(l)q(anW)g(ing)1622
+413 y Fe(col)1665 407 y Fp(,sq\))592 457 y Fl(and)13 b Fp(Side\(sq\))i(=)f
+(Opp\(col\)\))651 506 y(2)592 556 y Fl(else)651 606 y Fp(0)592
+656 y Fl(endif)262 783 y Fp(This)k(table)g(will)e(b)q(e)j(used)g(b)o(y)f(the)
+h(ev)n(aluation)e(function)h(criterion,)h(Square)g(Con)o(trol,)262
+832 y(to)14 b(help)h(direct)g(attac)o(ks.)21 b(The)15 b(table)f(is)h
+(initially)d(set)j(up)g(to)f(encourage)i(attac)o(ks)f(in)f(the)262
+882 y(enem)o(y)9 b(half)h(of)g(the)h(b)q(oard.)17 b(This)11
+b(is)f(further)i(mo)q(di\014ed)d(dep)q(ending)i(on)g(the)g(plan)f(selected)
+262 932 y(to)j(further)i(encourage)g(attac)o(ks)f(on)g(the)g(planned)g(attac)
+o(k)g(wing.)957 2574 y(93)p eop
+%%Page: 94 96
+94 95 bop 262 307 a Fr(4.12)69 b(De\014nition)20 b(44)j(:)30
+b(T)-6 b(otal)21 b(Ev)l(aluation)h(F)-6 b(unction)452 382 y(V)g(alue)344
+487 y Fh(T)6 b(E)r(F)g(V)464 493 y Fe(col)522 487 y Fp(=)62
+b Fh(M)5 b(T)685 493 y Fe(col)738 487 y Fp(+)10 b Fh(M)5 b(B)856
+493 y Fe(col)909 487 y Fp(+)10 b Fh(D)q(V)1010 493 y Fe(col)1064
+487 y Fp(+)f Fh(C)s(C)1168 493 y Fe(col)1221 487 y Fp(+)g Fh(S)r(C)1319
+493 y Fe(col)1373 487 y Fp(+)g Fh(P)d(V)1471 493 y Fe(col)1529
+487 y Fp(+)616 537 y Fh(N)f(V)678 543 y Fe(col)731 537 y Fp(+)10
+b Fh(B)r(V)830 543 y Fe(col)884 537 y Fp(+)f Fh(RV)981 543
+y Fe(col)1034 537 y Fp(+)h Fh(QV)1133 543 y Fe(col)1186 537
+y Fp(+)g Fh(K)s(V)1290 543 y Fe(col)1343 537 y Fp(+)g Fh(P)c(N)1451
+543 y Fe(col)1504 537 y Fp(+)j Fh(AP)1603 543 y Fe(col)344
+637 y Fl(where)380 686 y Fh(M)c(T)449 692 y Fe(col)498 686
+y Fp(:)47 b Fl(Material)14 b(\(De\014niti)o(on)f(1\).)380 786
+y Fh(M)5 b(B)456 792 y Fe(col)498 786 y Fp(:)47 b Fl(Mobilit)o(y)13
+b(\(De\014niti)o(on)f(3\).)380 886 y Fh(D)q(V)439 892 y Fe(col)498
+886 y Fp(:)47 b Fl(Dev)o(elopmen)o(t)12 b(\(De\014niti)o(on)g(4\).)380
+985 y Fh(C)s(C)443 991 y Fe(col)498 985 y Fp(:)47 b Fl(Cen)o(tre)14
+b(Con)o(trol)g(\(De\014niti)o(on)f(5\).)380 1085 y Fh(S)r(C)437
+1091 y Fe(col)498 1085 y Fp(:)47 b Fl(Square)15 b(Con)o(trol)e
+(\(De\014nition)f(6\).)380 1185 y Fh(P)6 b(V)437 1191 y Fe(col)498
+1185 y Fp(:)47 b Fl(P)o(a)o(wn)15 b(V)l(alue)g(\(De\014niti)o(on)d(12\).)380
+1284 y Fh(N)5 b(V)442 1290 y Fe(col)498 1284 y Fp(:)47 b Fl(Knigh)o(t)14
+b(V)l(alue)g(\(De\014nitio)o(n)f(13\).)380 1384 y Fh(B)r(V)437
+1390 y Fe(col)498 1384 y Fp(:)47 b Fl(Bishop)14 b(V)l(alue)h(\(De\014nit)o
+(ion)d(20\).)380 1483 y Fh(RV)436 1489 y Fe(col)498 1483 y
+Fp(:)47 b Fl(Ro)q(ok)16 b(V)l(alue)f(\(De\014niti)o(on)d(25\).)380
+1583 y Fh(QV)437 1589 y Fe(col)498 1583 y Fp(:)47 b Fl(Queen)14
+b(V)l(alue)h(\(De\014niti)o(on)e(28\).)380 1683 y Fh(K)s(V)442
+1689 y Fe(col)498 1683 y Fp(:)47 b Fl(King)15 b(V)l(alue)g(\(De\014niti)o(on)
+d(34\).)380 1782 y Fh(P)6 b(N)446 1788 y Fe(col)498 1782 y
+Fp(:)47 b Fl(Pinned)13 b(Pieces)i(\(De\014niti)o(on)d(35\).)380
+1882 y Fh(AP)438 1888 y Fe(col)498 1882 y Fp(:)47 b Fl(A)o(ttac)o(k)o(ed)14
+b(Pieces)h(\(De\014nit)o(ion)d(36\).)262 2009 y Fp(The)j(ev)n(aluation)f
+(function)h(will)f(return)j(a)e(single)g(v)n(alue)g(for)g(the)h(p)q(osition.)
+22 b(T)m(o)14 b(ac)o(hiev)o(e)262 2059 y(this,)d(all)g(the)h(ev)n(aluation)e
+(criteria)i(m)o(ust)f(b)q(e)h(summed.)k(The)c(p)q(osition)f(v)n(alue)g(from)f
+(either)262 2108 y(sides)k(p)q(oin)o(t)g(of)f(view)h(can)g(then)g(b)q(e)h
+(easily)e(calculated,)h(e.g.:)344 2206 y Fh(V)368 2212 y Fe(W)t(hite)477
+2206 y Fp(=)e Fh(T)6 b(E)r(F)g(V)641 2212 y Fe(W)t(hite)747
+2206 y Ff(\000)k Fh(T)c(E)r(F)g(V)909 2212 y Fe(B)q(lack)324
+2324 y Fp(A)19 b(v)o(ery)g(imp)q(ortan)o(t)e(decision)i(is)g(when)g(to)g
+(apply)f(the)i(ev)n(aluation)e(function)g(to)h(a)262 2374 y(p)q(osition.)k
+(After)17 b(a)f(lot)f(of)h(delib)q(eration,)f(I)h(decided)h(the)g(ev)n
+(aluation)e(function)g(will)g(b)q(e)262 2424 y(applied)e(at)h(leaf)f(no)q
+(des)h(of)g(the)g(main)e(searc)o(h)j(in)f(all)e(cases)j(except:)957
+2574 y(94)p eop
+%%Page: 95 97
+95 96 bop 324 307 a Ff(\017)20 b Fp(It)14 b(is)g(nev)o(er)h(applied)e(if)g
+(one)h(side)h(is)e(in-c)o(hec)o(k.)324 390 y Ff(\017)20 b Fp(It)14
+b(is)f(not)g(applied)g(if)f(the)i(de\014cit)g(b)q(et)o(w)o(een)h
+Fh(\013)e Fp(and)g(the)h(curren)o(t)h(material)c(v)n(alue)i(is)365
+440 y(larger)h(than)f(the)i(greatest)g(p)q(ositional)d(v)n(alue)h(so)h(far)f
+(encoun)o(tered)j(in)d(the)h(searc)o(h.)262 558 y(The)h(\014rst)h(condition)e
+(a)o(v)o(oids)h(application)e(to)i(p)q(ositions)g(whic)o(h)g(are)h(clearly)e
+(not)h(quies-)262 608 y(cen)o(t.)24 b(The)16 b(second)h(condition)e(attempts)
+g(to)h(only)f(apply)g(the)h(ev)n(aluation)e(function)i(to)262
+658 y(p)q(ositions)d(whic)o(h)h(ha)o(v)o(e)g(a)f(reasonable)h(c)o(hance)h(of)
+f(a\013ecting)g(the)g(searc)o(h)h(result.)957 2574 y(95)p eop
+%%Page: 96 98
+96 97 bop 262 654 a Fn(Chapter)34 b(5)262 897 y Fo(T)-10 b(ree)40
+b(Searc)m(hing)262 1148 y Fp(The)11 b(ev)n(aluation)e(function)i(con)o(tains)
+f(criteria)i(to)e(assess)j(p)q(ositional)c(and)i(tactical)f(v)n(alues.)262
+1198 y(The)17 b(tactical)f(ev)n(aluation)f(is)i(ho)o(w)o(ev)o(er,)g(far)g
+(from)e(complete)h(in)g(terms)g(of)h(deriving)f(an)262 1248
+y(accurate)g(tactical)f(v)n(alue.)23 b(The)16 b(tactical)f(part)g(of)g(the)h
+(ev)n(aluation)e(function)i(therefore,)262 1298 y(only)11 b(attempts)h(to)g
+(giv)o(e)g(a)g(rough)g(estimate)f(of)h(the)h(tactical)f(p)q(ossibilities.)17
+b(It)12 b(tak)o(es)h(par-)262 1347 y(ticular)h(accoun)o(t)h(of)f(uncertain)o
+(ties)i(in)f(the)g(p)q(osition.)20 b(F)m(or)15 b(example,)e(a)h(p)q(osition)g
+(where)262 1397 y(t)o(w)o(o)e(pieces)j(are)f(sim)o(ultaneously)d(en-prise)k
+(w)o(ould)d(constitute)j(a)e(degree)h(of)f(uncertain)o(t)o(y)262
+1447 y(ab)q(out)g(the)i(true)g(v)n(alue)e(of)g(the)i(p)q(osition.)324
+1532 y(A)f(sw)o(ap)g(o\013)g(algorithm)d([37)o(])i(could)h(ha)o(v)o(e)g(b)q
+(een)h(additionally)c(used)k(to)f(impro)o(v)o(e)e(the)262 1582
+y(accuracy)18 b(of)f(this)g(tactical)g(v)n(alue.)28 b(Ho)o(w)o(ev)o(er,)18
+b(this)f(w)o(ould)g(still)f(not)h(tak)o(e)g(accoun)o(t)h(of)262
+1632 y(pinned)13 b(pieces)i(or)f(exc)o(hanges)h(whic)o(h)e(exp)q(ose)i
+(hidden)f(attac)o(ks)g(on)g(other)g(squares.)19 b(The)262 1682
+y(added)c(complexit)o(y)d(in)o(v)o(olv)o(ed)i(in)g(attempting)f(to)i(correct)
+h(these)g(faults)e(w)o(ould)g(b)q(e)h(v)o(ery)262 1732 y(exp)q(ensiv)o(e)h
+(in)f(terms)f(of)h(pro)q(cessing)h(time.)21 b(Therefore,)16
+b(I)f(feel)h(suc)o(h)g(analysis)e(is)h(b)q(etter)262 1781 y(left)f(to)h(a)g
+(dynamic)e(searc)o(h.)23 b(Using)15 b(v)n(arious)f(additional)g(tree)i
+(pruning)f(mec)o(hanisms,)e(I)262 1831 y(hop)q(e)h(to)g(sho)o(w)f(that)h
+(this)g(searc)o(h)h(can)f(b)q(e)h(done)f(e\016cien)o(tly)m(.)324
+1916 y(Hence,)f(it)f(is)g(imp)q(ortan)o(t)e(to)i(supp)q(ort)h(the)g(ev)n
+(aluation)e(function)h(b)o(y)g(the)g(tree)i(searc)o(h-)262
+1966 y(ing)20 b(of)g(p)q(ossibilities.)39 b(This)20 b(will)g(enable)h(the)h
+(program)d(to)i(explore)g(p)q(ossible)g(mo)o(v)o(e)262 2016
+y(sequences)f(and)e(therefore)h(c)o(hose)g(mo)o(v)o(es)d(whic)o(h)i(lead)g
+(to)g(fa)o(v)o(ourable)e(p)q(ositional)h(and)262 2066 y(tactical)c(outcomes.)
+324 2151 y(In)e(this)h(c)o(hapter,)h(I)f(will)e(explain)h(what)g(searc)o
+(hing)h(sc)o(hemes)h(will)d(b)q(e)i(used)h(and)e(ho)o(w)h(I)262
+2201 y(in)o(tend)g(to)g(complemen)o(t)e(the)j(ev)n(aluation)d(function)i(b)o
+(y)g(the)h(use)g(of)f(a)g(quiescence)i(searc)o(h.)324 2286
+y(The)k(o)o(v)o(erall)f(searc)o(h)h(pro)q(cedure)i(is)e(as)f(follo)o(ws:)24
+b(The)19 b(main)c(searc)o(h)k(will)d(progress)262 2336 y(iterativ)o(ely)f(to)
+i(deep)q(er)h(lev)o(els)e(of)g(the)h(searc)o(h)h(tree.)27 b(Selected,)18
+b(more)e(in)o(teresting)h(lines)262 2386 y(will)g(b)q(e)j(extended.)36
+b(A)o(t)19 b(the)h(leaf)f(no)q(des)h(of)f(this)g(main)e(searc)o(h)k(tree)f
+(the)g(ev)n(aluation)262 2436 y(function)c(will)e(b)q(e)j(applied.)25
+b(The)17 b(ev)n(aluation)e(function)h(ma)o(y)e(then)j(advise)g(the)f(searc)o
+(h)957 2574 y(96)p eop
+%%Page: 97 99
+97 98 bop 262 307 a Fp(to)13 b(tak)o(e)h(one)g(of)g(t)o(w)o(o)f(p)q(ossible)h
+(actions:)312 426 y(1.)20 b(The)15 b(p)q(osition)f(is)g(suitable)g(for)g(the)
+h(quiescence)i(searc)o(h)e(to)f(b)q(e)h(applied.)k(A)14 b(quies-)365
+475 y(cence)f(searc)o(h)g(will)c(then)j(b)q(e)g(used)g(to)f(explore)g(an)o(y)
+g(dynamic)e(tactical)i(p)q(ossibilities)365 525 y(whic)o(h)i(need)h
+(resolving.)j(This)c(will)e(allo)o(w)h(a)g(more)g(accurate)i(tactical)f(v)n
+(alue)f(to)h(b)q(e)365 575 y(deriv)o(ed)g(at)f(the)g(leaf)g(no)q(de)g(than)g
+(the)h(v)n(alue)e(calculated)i(purely)f(in)f(the)i(ev)n(aluation)365
+625 y(function.)32 b(The)19 b(main)d(searc)o(h)j(can)g(therefore)h(ha)o(v)o
+(e)e(higher)h(con\014dence)h(in)e(the)365 675 y(\014nal)c(leaf)f(no)q(de)h(v)
+n(alue)f(calculated.)312 758 y(2.)20 b(The)14 b(p)q(osition)f(is)g
+(considered)i(to)e(b)q(e)h(to)q(o)f(unstable)h(for)f(the)h(quiescence)h
+(searc)o(h)g(to)365 808 y(b)q(e)j(applied)f(accurately)m(.)28
+b(This)17 b(means)g(the)h(main)d(searc)o(h)j(should)f(b)q(e)h(extended)365
+857 y(in)e(order)g(to)g(resolv)o(e)h(the)f(uncertain)o(t)o(y)m(.)24
+b(This)16 b('Quiescence)i(Decision')d(ma)o(y)f(also)365 907
+y(cause)i(the)f(main)e(searc)o(h)j(to)e(b)q(e)i(re{en)o(tered)h(from)c(no)q
+(des)i(that)g(are)g(already)f(part)365 957 y(of)g(the)g(quiescence)i(searc)o
+(h.)262 1075 y(The)e(results)i(obtained)e(from)e(searc)o(hing)j(eac)o(h)g(no)
+q(de)f(is)h(then)g(passed)g(bac)o(k)f(up)g(the)h(tree)262 1125
+y(where)10 b(searc)o(h)h(heuristics)g(can)f(mak)o(e)e(use)i(of)f(the)h
+(information)d(in)i(searc)o(hing)h(other)g(no)q(des.)262 1175
+y(It)16 b(is)h(imp)q(ortan)o(t)e(to)i(realise)g(the)g(searc)o(h)h(tree)g
+(explored)f(b)o(y)g(suc)o(h)g(a)g(searc)o(h)h(will)d(b)q(e)i(of)262
+1225 y(v)n(ariable)10 b(depth,)i(the)g(deep)q(est)h(lines)e(b)q(eing)g(those)
+h(of)f(most)f(in)o(terest)i(to)g(the)f(searc)o(h.)19 b(This)262
+1275 y(sho)o(ws)13 b(some)f(similarities)f(to)h(the)i(w)o(a)o(y)e(h)o(umans)g
+(approac)o(h)h(the)h(task)f(of)f(tree)j(searc)o(hing.)324 1360
+y(The)f(follo)o(wing)d(sections)k(explain)e(this)h(searc)o(h)h(pro)q(cess)h
+(in)e(more)f(detail.)262 1533 y Fr(5.1)69 b(Main)23 b(Searc)n(h)262
+1659 y Fp(The)14 b(main)e(searc)o(h)j(will)e(use)i(the)f(alpha{b)q(eta)g(\()p
+Fh(\013\014)r Fp(\))g(tree)i(pruning)e(algorithm)d(on)j(nega-)262
+1709 y(max)i(trees.)32 b(This)18 b(algorithm)d(has)k(man)o(y)d(deriv)n(ativ)o
+(es)i(and)g(enhancemen)o(ts,)h(some)e(of)262 1759 y(whic)o(h)c(w)o(ere)i
+(explained)f(in)f(c)o(hapter)i(3.)324 1844 y(A)o(t)j(\014rst)i(sigh)o(t,)e
+(the)i(principle)e(v)n(ariation)f Fh(\013\014)j Fp(searc)o(h)g(\(PVS\))f(app)
+q(ears)h(to)e(b)q(e)h(the)262 1894 y(b)q(est)c(algorithm)c(to)i(select)j(as)e
+(it)f(t)o(ypically)g(visits)g(few)o(er)i(no)q(des)g(than)e(other)i
+Fh(\013\014)h Fp(deriv)n(a-)262 1943 y(tiv)o(es)h([40)o(].)28
+b(Ho)o(w)o(ev)o(er,)19 b(I)e(in)o(tend)g(to)h(use)g(searc)o(h)g(extensions)h
+(whic)o(h)e(actually)g(use)h(the)262 1993 y(v)n(alues)11 b(of)h(the)g(curren)
+o(t)i Fh(\013\014)g Fp(windo)o(w)d(as)h(part)h(of)e(their)h(searc)o(h)h
+(extension)g(decision.)18 b(This)262 2043 y(breaks)13 b(one)h(of)f(the)g(ma)r
+(jor)f(principles)h(of)g(the)h Fh(\013\014)h Fp(algorithm)c(:-)h(the)i(v)n
+(alue)f(of)f(a)h(mo)o(v)o(e)f(is)262 2093 y(indep)q(enden)o(t)j(of)e(the)i
+Fh(\013\014)h Fp(windo)o(w)d(used)i(to)e(searc)o(h)i(it.)324
+2178 y(The)h(PV)h(searc)o(h)g(uses)h(a)d(minimal)d(windo)o(w)k(as)g(its)g
+(basis.)25 b(When)16 b(the)h(searc)o(h)g(of)f(a)262 2228 y(subtree)c(fails)d
+(high)h(\(score)i Ff(\025)f Fh(\014)r Fp(\),)h(it)e(is)g(re-searc)o(hed)j
+(using)d(a)g(suitably)g(adjusted)h(windo)o(w.)262 2278 y(When)16
+b(the)h(v)n(alue)f(is)g(not)h(dep)q(enden)o(t)h(on)e(the)h(windo)o(w)f(used,)
+h(ev)o(erything)g(w)o(orks)g(\014ne.)262 2328 y(Ho)o(w)o(ev)o(er,)d(if)f(the)
+h(v)n(alue)g(is)g(dep)q(enden)o(t,)h(a)f(situation)f(could)h(arise)h(where)g
+(a)f(mo)o(v)o(e)e(found)262 2377 y(whic)o(h)h(fails)g(high,)g(is)g(re-searc)o
+(hed)k(with)c(an)h(enlarged)g(windo)o(w,)e(only)i(to)f(fail)g(lo)o(w.)k(This)
+262 2427 y(violates)g(the)h(PVS's)h(abilit)o(y)d(to)i(searc)o(h)h(minim)o(al)
+14 b(trees)20 b(for)d(all)g(mo)o(v)o(es)g(except)i(those)957
+2574 y(97)p eop
+%%Page: 98 100
+98 99 bop 262 307 a Fp(whic)o(h)12 b(constitute)h(a)f(new)g(principle)g(v)n
+(ariation.)k(This)c(can)g(cause)i(serious)f(problems)e(not)262
+357 y(only)i(for)g(the)i(e\016ciency)f(of)g(the)g(PVS,)g(but)g(also)f(for)h
+(its)g(correctness.)324 442 y(I)19 b(also)f(wish)i(to)f(use)h(the)g(curren)o
+(t)g(searc)o(h)h(windo)o(w)d(as)h(part)h(of)e(a)h(decision)g(as)h(to)262
+492 y(whether)15 b(to)e(apply)g(the)h(ev)n(aluation)f(function)g(at)h(a)f
+(giv)o(en)g(no)q(de)h(in)f(the)i(tree.)k(After)14 b(all,)262
+542 y(if)j(the)h(de\014cit)h(b)q(et)o(w)o(een)g(the)f(required)h(score)g(\()p
+Ff(\025)g Fh(\013)p Fp(\))f(necessary)i(to)d(e\013ect)j(the)e(searc)o(h)262
+592 y(result)e(and)f(the)h(curren)o(t)g(material)e(v)n(alue)g(is)h(so)h
+(large)f(that)g(ev)o(en)h(the)g(maxim)n(um)11 b(p)q(osi-)262
+641 y(tional)h(v)n(alue)i(cannot)g(alter)g Fh(\013)p Fp(,)f(then)i(it)e(w)o
+(ould)h(constitute)h(w)o(asted)f(e\013ort)h(to)f(apply)f(the)262
+691 y(ev)n(aluation)f(function.)18 b(This)c(approac)o(h)f(could)h(also)f(adv)
+o(ersely)i(a\013ect)g(the)f(PV)g(searc)o(h.)324 777 y(These)k(problems)e
+(lead)g(me)g(to)g(prefer)i(an)f(aspiration)f Fh(\013\014)j
+Fp(searc)o(h.)27 b(Although)17 b(this)262 826 y(searc)o(h)e(algorithm)c(ma)o
+(y)h(still)i(giv)o(e)f(rise)i(to)f(some)f(of)h(the)g(problems)g(already)f
+(explained,)262 876 y(they)i(will)e(b)q(e)j(to)f(a)f(far)h(lesser)h(exten)o
+(t.)23 b(The)15 b(imp)q(ortan)o(t)e(asp)q(ect)j(ab)q(out)f(this)g(algorithm)
+262 926 y(as)g(far)g(as)h(searc)o(h)h(extensions)f(are)g(concerned,)i(is)d
+(that)h(the)g Fh(\013\014)i Fp(v)n(alues)d(of)g(the)h(curren)o(t)262
+976 y(windo)o(w)10 b(constitute)j(the)f(true)g(b)q(est)h(score)f(attained)g
+(b)o(y)f(eac)o(h)h(side.)17 b(The)12 b(only)f(exception)262
+1026 y(b)q(eing)18 b(when)h(one)g(\(or)g(b)q(oth\))g(of)f(the)i(initial)c
+(aspiration)i Fh(\013\014)j Fp(b)q(ounds)f(are)f(still)f(b)q(eing)262
+1075 y(used.)26 b(Ev)o(en)17 b(in)f(this)h(case)g(the)g(initial)e(aspiration)
+g(windo)o(w)h(can)g(b)q(e)i(sa)o(v)o(ed)e(and)g(tak)o(en)262
+1125 y(in)o(to)d(accoun)o(t)h(b)o(y)g(the)g(searc)o(h)h(extension)g
+(heuristics.)324 1210 y(In)j(the)h(past,)g(I)g(ha)o(v)o(e)f(observ)o(ed)h
+(man)o(y)e(commercial)e(c)o(hess)20 b(programs)d(whic)o(h)i(un-)262
+1260 y(doubtedly)c(use)i(an)f(aspiration)f Fh(\013\014)j Fp(searc)o(h.)25
+b(I)16 b(ha)o(v)o(e)f(also)h(noticed)g(in)f(some)g(p)q(ositions,)262
+1310 y(a)e(particular)g(searc)o(h)h(to)f(depth)i Fh(n)e Fp(tak)o(es)h
+(considerably)f(longer)g(than)h(exp)q(ected.)19 b(This)14 b(is)262
+1360 y(b)q(ecause)i(of)f(a)g(problem)f(whic)o(h)h(I)g(b)q(eliev)o(e)h(can)f
+(b)q(e)h(solv)o(ed)f(b)o(y)g(an)g(enhancemen)o(t)h(to)f(the)262
+1410 y(aspiration)g Fh(\013\014)k Fp(algorithm.)j(The)17 b(problem)e(is)h(as)
+g(follo)o(ws:)21 b(A)c(searc)o(h)g(to)f(depth)h Fh(n)11 b Ff(\000)g
+Fp(1)262 1460 y(deriv)o(es)18 b(a)f(v)n(alue)g(for)g(the)i(b)q(est)f(mo)o(v)o
+(e)e(found.)29 b(This)18 b(v)n(alue)f(then)h(forms)e(the)i(basis)g(b)o(y)262
+1509 y(whic)o(h)e(the)h(new)g Fh(\013\014)i Fp(windo)o(w)d(is)h(set)g(for)g
+(the)g(next)g(iteration.)26 b(A)17 b(searc)o(h)g(to)g(the)g(next)262
+1559 y(iteration)12 b(is)h(then)h(p)q(erformed.)k(If)12 b(this)i(searc)o(h)g
+(disco)o(v)o(ers)g(something)e(whic)o(h)h(refutes)i(its)262
+1609 y(previous)f(analysis)f(\(b)q(ecause)j(of)d(the)h(horizon)g(e\013ect\),)
+h(eac)o(h)g(and)e(ev)o(ery)i(mo)o(v)o(e)d(ma)o(y)g(fail)262
+1659 y(lo)o(w)h(in)h(turn.)21 b(This)15 b(will)e(tak)o(e)i(some)f(time)f(to)h
+(o)q(ccur)i(at)f(the)g(greater)h(iteration)e(depths.)262 1709
+y(After)d(all)f(this)i(rather)g(w)o(asted)g(e\013ort,)g(a)f(re-searc)o(h)i
+(is)e(then)h(necessary)h(with)e(an)g(adjusted)262 1758 y Fh(\013\014)16
+b Fp(windo)o(w.)324 1844 y(I)g(ha)o(v)o(e)h(found)f(that)g(if)g(the)h
+(principle)g(mo)o(v)o(e)e(fails)g(lo)o(w)h(when)h(searc)o(hed,)h(then)g(it)e
+(is)262 1893 y(b)q(etter)j(to)e(abandon)h(the)g(curren)o(t)h
+Fh(\013\014)h Fp(windo)o(w)d(immediately)l(,)f(adjust)h(it)h(and)f(restart)
+262 1943 y(the)f(iteration.)25 b(I)17 b(b)q(eliev)o(e)f(this)h(to)f(b)q(e)h
+(a)f(b)q(etter)i(approac)o(h)e(b)q(ecause)i(if)e(the)h(b)q(est)g(mo)o(v)o(e)
+262 1993 y(is)d(refuted,)i(it)f(is)f(lik)o(ely)g(that)h(all)f(other)h(mo)o(v)
+o(es)f(will)f(b)q(e)j(similarly)11 b(refuted)16 b(when)g(using)262
+2043 y(the)f(same)f(searc)o(h)i(windo)o(w.)k(Of)15 b(course)h(this)f(ma)o(y)e
+(not)i(alw)o(a)o(ys)f(b)q(e)i(the)f(case,)h(ho)o(w)o(ev)o(er,)262
+2093 y(I)f(b)q(eliev)o(e)h(the)g(sa)o(vings)g(will)e(clearly)h(out)o(w)o
+(eigh)g(an)o(y)h(time)e(lost)h(when)h(a)o(v)o(eraged)g(o)o(v)o(er)g(a)262
+2143 y(n)o(um)o(b)q(er)10 b(of)g(games.)16 b(In)11 b(summary)m(,)d(b)q(oth)j
+(fail)e(lo)o(ws)i(and)f(fail)g(highs)g(are)i(treated)g(similarly)262
+2192 y(at)h(the)i(\014rst)f(ply)m(.)324 2278 y(T)m(o)c(summarise,)f(m)o(y)g
+(c)o(hosen)i(main)e(searc)o(h)j(will)d(consist)i(of)f(an)h(iterativ)o(e,)g
+(depth)g(\014rst,)262 2327 y(aspiration)k Fh(\013\014)k Fp(searc)o(h)e(with)f
+(the)h(enhancemen)o(ts)g(outlined)f(ab)q(o)o(v)o(e.)25 b(The)17
+b Fh(\013\014)h Fp(windo)o(w)262 2377 y(will)d(b)q(e)i(based)h(around)f(the)g
+(result)h(of)e(the)i(previous)f(iteration)g(at)f(depths)i Ff(\025)f
+Fp(2.)27 b(The)262 2427 y(initial)11 b(iteration)j(windo)o(w)f(will)f(b)q(e)j
+(based)f(on)g(a)g(preliminary)d(analysis.)957 2574 y(98)p eop
+%%Page: 99 101
+99 100 bop 262 307 a Fr(5.2)69 b(Searc)n(h)23 b(Extensions)262
+434 y Fp(The)12 b(basic)g(approac)o(h)g(when)g(using)f(an)o(y)h(of)f(the)h
+Fh(\013\014)j Fp(deriv)n(ativ)o(es)c(is)h(to)g(searc)o(h)h(to)e(a)h(depth)262
+483 y(n,)17 b(ev)n(aluate)f(the)i(leaf)e(no)q(des)i(and)f(minim)o(ax)d(the)j
+(results.)28 b(This)17 b(metho)q(d)f(exempli\014es)262 533
+y(the)e(full)f(width)g(approac)o(h.)18 b(Ho)o(w)o(ev)o(er,)c(it)g(su\013ers)h
+(from)d(a)i(n)o(um)o(b)q(er)f(of)g(w)o(eaknesses:)312 652 y(1.)20
+b(The)15 b(searc)o(h)g(is)e(terminated)h(at)g(a)f(\014xed)h(depth,)h
+(therefore,)g(the)f(ev)n(aluation)f(func-)365 701 y(tion)h(ma)o(y)e(b)q(e)j
+(applied)f(to)g(non)g(quiescen)o(t)i(p)q(ositions)e(leading)f(to)h(grossly)h
+(inaccu-)365 751 y(rate)g(results.)312 834 y(2.)20 b(This)c(approac)o(h)g
+(mak)o(es)e(ine\016cien)o(t)i(use)h(of)e(the)i Fh(\013\014)h
+Fp(algorithm)13 b(b)q(ecause)k(its)f(leaf)365 884 y(no)q(des)f(are)f
+(inaccurately)g(ev)n(aluated.)312 967 y(3.)20 b(Equal)14 b(e\013ort)g(is)g
+(applied)f(throughout)h(the)g(tree)i(with)d(resp)q(ect)j(to)e(depth.)19
+b(There-)365 1017 y(fore,)c(stupid)g(unin)o(teresting)g(v)n(ariations)e(are)i
+(explored)g(as)g(deeply)g(as)g(in)o(teresting)365 1067 y(or)f(go)q(o)q(d)g(v)
+n(ariations.)312 1150 y(4.)20 b(The)15 b(horizon)e(e\013ect)j(is)e(sev)o
+(erely)h(exasp)q(erated)g(b)o(y)f(the)g(\014xed)h(depth)f(searc)o(h.)262
+1268 y(The)e(\014rst)g(t)o(w)o(o)f(problem)g(areas)h(can)g(b)q(e)g
+(signi\014can)o(tly)f(eased)i(b)o(y)e(the)h(use)h(of)e(a)g(quiescence)262
+1318 y(searc)o(h)j(at)f(the)h(leaf)f(\(horizon\))h(no)q(des)g(of)f(a)g(main)e
+(searc)o(h.)20 b(This)13 b(quiescence)i(searc)o(h)g(will)262
+1368 y(b)q(e)i(a)f(form)f(of)h(selectiv)o(e)i(searc)o(h,)g(only)e(exploring)f
+(tactical)i(p)q(ossibilities.)25 b(See)18 b(section)262 1418
+y(5.4)12 b(for)i(more)f(details.)324 1503 y(It)f(is)g(surprising)g(ho)o(w)f
+(man)o(y)f(commercial)f(and)j(tournamen)o(t)f(c)o(hess)j(programs)c(su\013er)
+262 1553 y(from)16 b(the)i(third)g(problem)e(area.)30 b(I)18
+b(b)q(eliev)o(e)g(the)g(solution)f(to)h(this)g(problem)e(lies)i(in)f(a)262
+1603 y(program's)8 b(abilit)o(y)h(to)h(select)i(and)e(searc)o(h)i(in)o
+(teresting)f(or)f(go)q(o)q(d)g(v)n(ariations)g(more)f(deeply)m(.)324
+1688 y(Harris)j([26)o(])f(prop)q(osed)i(a)e(similar)e(idea)j(of)f(exploring)g
+(in)o(teresting)h(v)n(ariations,)e(except)262 1738 y(he)i(suggested)i(doing)e
+(so)g(without)g(the)h Fh(\013\014)i Fp(algorithm.)g(Harris)e(omitted)e(sp)q
+(eci\014c)j(details)262 1787 y(of)i(ho)o(w)i(his)f(ideas)h(migh)o(t)d(b)q(e)k
+(implem)o(en)o(ted.)27 b(Levy)18 b(et)g(al)f([38)o(])g(ha)o(v)o(e)h(implem)o
+(en)o(ted)e(a)262 1837 y(n)o(um)o(b)q(er)e(of)g(programs)g(using)g(the)i
+(idea)e(of)h(in)o(terestingness,)h(ho)o(w)o(ev)o(er,)f(their)h(approac)o(h)
+262 1887 y(to)10 b(classifying)g(in)o(teresting)i(mo)o(v)o(es)e(di\013ers)i
+(from)d(the)j(approac)o(h)f(I)g(am)e(taking.)17 b(In)11 b(partic-)262
+1937 y(ular,)h(m)o(y)g(use)i(of)f(the)h(aspiration)e Fh(\013\014)k
+Fp(searc)o(h)e(and)g(its)f(b)q(ounds)h(in)f(m)o(y)e(searc)o(h)k(extension)262
+1987 y(heuristics)g(is)e(no)o(v)o(el.)324 2072 y(I)j(de\014ne)i(an)e(in)o
+(teresting)h(v)n(ariation)e(as)i(one)f(whic)o(h)h(con)o(tains)f(tactical)g
+(mo)o(v)o(es)g(that)262 2122 y(o\013er)c(some)f(p)q(ossibilit)o(y)g(of)g
+(a\013ecting)h(the)h(searc)o(h)g(result,)g(e.g.)k(pro)q(ducing)12
+b(a)g(score)h(whic)o(h)262 2172 y(is)h(inside)h(the)h Fh(\013\014)h
+Fp(searc)o(h)f(windo)o(w.)k(I)15 b(de\014ne)h(go)q(o)q(d)e(v)n(ariations)g
+(as)h(those)h(whic)o(h)e(w)o(ould)262 2221 y(a\013ect)g(the)h(searc)o(h)g
+(result)g(if)e(the)h(searc)o(h)h(w)o(ere)g(terminated)e(immediately)l(.)324
+2307 y(Applying)j(these)j(de\014nitions)f(to)f(create)i(searc)o(h)g
+(extension)f(heuristics,)h(I)f(hop)q(e)g(to)262 2356 y(encourage)f(the)g
+(searc)o(h)h(to)e(explore)h(v)n(ariations)f(o\013ering)g(some)g(lik)o(eliho)q
+(o)q(d)f(of)h(success,)262 2406 y(and)c(ignore)h(unin)o(teresting)h(v)n
+(ariations)d(whic)o(h)i(o\013er)h(little)e(or)h(no)g(lik)o(eliho)q(o)q(d)e
+(of)i(success.)957 2574 y(99)p eop
+%%Page: 100 102
+100 101 bop 262 307 a Fp(This)12 b(approac)o(h)g(sho)o(ws)h(some)f
+(similarities)e(to)i(the)h(w)o(a)o(y)f(h)o(umans)f(pla)o(y)h(the)h(game.)j
+(Ho)o(w-)262 357 y(ev)o(er,)j(b)q(ecause)h(these)f(heuristics)h(are)e(far)g
+(less)g(sophisticated)h(than)f(a)g(strong)g(h)o(uman)262 407
+y(c)o(hess)f(pla)o(y)o(ers,)f(the)g(program)f(will)f(attempt)h(to)h(bridge)g
+(this)g(gap)g(b)o(y)f(exploring)g(man)o(y)262 457 y(more)c(v)n(ariations)h
+(than)h(its)f(h)o(uman)f(coun)o(ter)j(part.)k(These)c(searc)o(h)g(extension)f
+(heuristics)262 506 y(m)o(ust)i(therefore)i(b)q(e)g(free)g(enough)f(to)g
+(extend)h(man)o(y)d(in)o(teresting)j(v)n(ariations,)e(but)h(also)262
+556 y(b)q(e)d(selectiv)o(e)h(enough)e(to)h(a)o(v)o(oid)e(the)i(searc)o(h)h
+(blo)o(wing)d(sky)i(high.)k(A)c(searc)o(h)h(whic)o(h)e(is)h(not)262
+606 y(depth)i(limited)e(and)i(can)h(explore)f(in)o(teresting)h(v)n(ariations)
+e(deeply)m(,)h(is)g(m)o(uc)o(h)f(less)i(lik)o(ely)262 656 y(to)d(su\013er)i
+(from)e(the)h(horizon)g(e\013ect)h(\(problem)e(area)h(4\).)324
+741 y(In)j(order)h(to)f(determine)g(what)g(is)g(an)g(in)o(teresting)h(or)f
+(go)q(o)q(d)f(v)n(ariation,)g(mo)o(v)o(es)g(are)262 791 y(classi\014ed)d(and)
+f(receiv)o(e)i('p)q(oin)o(ts')d(dep)q(ending)i(on)g(ho)o(w)f(dynamic)f(eac)o
+(h)i(mo)o(v)o(e)e(is.)17 b(In)o(terest)262 841 y(p)q(oin)o(ts)d(are)i(passed)
+g(do)o(wn)e(the)i(searc)o(h)g(tree)g(from)d(no)q(de)j(to)f(no)q(de.)21
+b(Eac)o(h)16 b(ply)e(of)g(searc)o(h)262 891 y(deducts)i(16)e(p)q(oin)o(ts)g
+(w)o(orth)h(of)f(in)o(terest)i(from)c(the)k(v)n(ariation.)i(When)d(the)g(in)o
+(terest)h(falls)262 940 y(b)q(elo)o(w)f(zero,)j(the)e(no)q(de)h(will)e(b)q(e)
+h(considered)i(as)e(a)g(leaf)g(or)g(horizon)g(no)q(de)g(of)g(the)h(main)262
+990 y(searc)o(h.)33 b(A)o(t)18 b(this)h(p)q(oin)o(t)f(a)g(quiescence)j
+(decision)e(is)f(made,)g(leading)g(to)g(a)g(quiescence)262
+1040 y(searc)o(h)d(or)e(con)o(tin)o(uation)g(of)h(the)g(main)e(searc)o(h.)324
+1125 y(All)e(in)o(teresting)h(mo)o(v)o(es)f(are)h(classi\014ed)h(under)g(t)o
+(w)o(o)e(categories,)i(Threats)g(and)f(Threat)262 1175 y(Execution.)262
+1326 y Fu(5.2.1)55 b(Threats)262 1438 y Fp(F)m(or)18 b(threatening)i(mo)o(v)o
+(es)e(to)i(b)q(e)g(considered)g(in)o(teresting)g(they)g(m)o(ust)e(indicate)h
+(some)262 1488 y(lik)o(eliho)q(o)q(d)14 b(of)h(a\013ecting)h(the)h(searc)o(h)
+g(result)g(and)f(therefore)h(b)q(ecoming)e(the)i(main)d(line.)262
+1538 y(Assuming)j(a)i(negamax)e(approac)o(h,)j(the)f(no)q(de)h(resulting)f
+(from)e(a)i(threatening)g(mo)o(v)o(e)262 1588 y(m)o(ust)12
+b(meet)i(the)g(follo)o(wing)e(criteria:)344 1683 y(Est)j(+)f(Thres)h
+Fh(>)d(\013)h Fl(or)h Fh(\013)f Fp(=)h(Aspir)p Fh(\013)262
+1783 y Fl(where)312 1904 y Fp(1.)20 b Fl(Est)p Fp(:)j(This)17
+b(is)f(an)g(estimate)g(of)g(the)h(curren)o(t)h(no)q(de's)f(v)n(alue,)f
+(mostly)f(dominated)365 1954 y(b)o(y)f(material.)312 2036 y(2.)20
+b Fl(Thres)p Fp(:)c(Represen)o(ts)e(the)e(v)n(alue)f(of)g(ha)o(ving)g(the)h
+(mo)o(v)o(e)e(\(a)i(temp)q(o\))e(and)i(what)g(that)365 2086
+y(mo)o(v)o(e)h(migh)o(t)e(ac)o(hiev)o(e.)312 2168 y(3.)20 b
+Fh(\013)p Fp(:)f(This)c(is)f(the)h(curren)o(t)h(v)n(alue)e(of)g(alpha)f(at)i
+(this)f(no)q(de,)h(whic)o(h)f(therefore)i(repre-)365 2218 y(sen)o(ts)e
+(either)g(the)f(v)n(alue)f(of)g(the)h(b)q(est)h(v)n(ariation)c(found)j(for)f
+(this)h(side)g(elsewhere)h(in)365 2267 y(the)h(searc)o(h)g(tree)g(or)f(an)f
+(initial)f(aspiration)h(v)n(alue.)312 2350 y(4.)20 b Fl(Aspir)p
+Fh(\013)p Fp(:)15 b(This)d(is)f(the)i(initial)d(aspiration)g(v)n(alue)i(used)
+g(for)g(the)g(b)q(est)h(v)n(alue)e(ac)o(hiev-)365 2399 y(able)k(b)o(y)g(the)h
+(curren)o(t)h(side)f(to)f(mo)o(v)o(e.)21 b(A)o(t)15 b(ev)o(en)h(depths)g(b)q
+(elo)o(w)f(the)h(ro)q(ot,)f(this)h(is)365 2449 y(the)f(initial)d
+Fh(\013)h Fp(v)n(alue;)g(at)h(o)q(dd)g(depths,)g(it)g(is)f(the)i(initial)d
+Fh(\014)k Fp(v)n(alue.)946 2574 y(100)p eop
+%%Page: 101 103
+101 102 bop 262 307 a Fp(The)11 b(idea)f(of)g(this)g(heuristic)i(is)e(to)h
+(exclude)g(mo)o(v)o(es)e(whic)o(h)i(ma)o(y)d(otherwise)k(b)q(e)f(in)o
+(teresting)262 357 y(if)e(they)i(are)g(unlik)o(ely)f(to)g(c)o(hange)h(the)g
+(curren)o(t)i Fh(\013)d Fp(v)n(alue.)16 b(This)11 b(v)n(alue)f(after)g(all,)g
+(represen)o(ts)262 407 y(the)g(score)i(of)e(the)g(b)q(est)i(v)n(ariation)c
+(that)j(the)g(side)f(to)g(mo)o(v)o(e)f(can)h(ac)o(hiev)o(e.)17
+b(Of)11 b(course)g(if)f(this)262 457 y(score)15 b(happ)q(ens)g(to)g(b)q(e)g
+(an)f(aspiration)g(v)n(alue,)f(then)i(the)g(score)h(of)d(the)i(b)q(est)h(v)n
+(ariation)d(is)262 506 y(not)d(y)o(et)h(kno)o(wn,)f(it)g(w)o(ould)g
+(therefore)i(b)q(e)f(un)o(wise)g(to)f(assume)g(that)h(the)g(curren)o(t)h(v)n
+(ariation)262 556 y(cannot)i(a\013ect)g(the)h(searc)o(h)g(result.)324
+641 y(The)e(e\013ect)h(of)d(this)i(heuristic)g(is)f(to)g(a)o(v)o(oid)f
+(extending)i(when)g(the)g(line)f(app)q(ears)h(fruit-)262 691
+y(less)j(relativ)o(e)g(to)f(what)h(can)g(b)q(e)h(ac)o(hiev)o(ed)f(elsewhere)h
+(in)f(the)g(tree.)25 b(F)m(or)16 b(example,)e(it)i(is)262 741
+y(lik)o(ely)e(to)i(b)q(e)h(w)o(orthless)g(exploring)f(a)f(v)n(ariation)g
+(whic)o(h)h(wins)g(a)g(pa)o(wn)g(after)g(thro)o(wing)262 791
+y(a)o(w)o(a)o(y)10 b(a)h(queen,)h(when)g(another,)g(b)q(etter)h(v)n(ariation)
+c(is)j(already)f(kno)o(wn)f(to)i(b)q(e)g(ac)o(hiev)n(able.)324
+876 y(Giv)o(en)i(that)i(the)g(ab)q(o)o(v)o(e)f(criteria)g(are)h(met,)f(the)g
+(follo)o(wing)e(threatening)j(mo)o(v)o(es)e(are)262 926 y(classi\014ed)e(and)
+g(the)g(appropriate)g(in)o(terest)h(p)q(oin)o(ts)f(added)g(to)f(the)i(curren)
+o(t)g(in)o(terest)g(v)n(alue)262 976 y(at)g(this)h(no)q(de.)312
+1093 y(1.)20 b Fl(In-c)o(hec)o(k)15 b(with)g(one)g(legal)f(reply)365
+1159 y Fp(This)c(heuristic)g(pro)o(vides)f(a)h(searc)o(h)g(extension)g(along)
+f(v)n(ariations)f(whic)o(h)h(are)h(highly)365 1209 y(forced.)21
+b(Often)15 b(mating)d(sequences)17 b(in)o(v)o(olv)o(e)c(forced)i(c)o(hec)o
+(ks)h(where)f(there)h(is)e(only)365 1258 y(one)g(legal)f(resp)q(onse.)20
+b Fm(R)n(e)n(c)n(eives)15 b(24)g(p)n(oints)g(of)g(inter)n(est)p
+Fp(.)312 1341 y(2.)20 b Fl(Double)14 b(Chec)o(k)365 1407 y
+Fp(This)k(heuristic)h(pro)o(vides)f(a)f(searc)o(h)j(extension)e(when)g(a)g
+(side)g(is)g(in-c)o(hec)o(k)g(from)365 1456 y(more)12 b(than)h(one)h(piece.)k
+(By)c(de\014nition)e(this)i(m)o(ust)e(additionally)e(b)q(e)k(a)f(disco)o(v)o
+(ered)365 1506 y(c)o(hec)o(k.)24 b(Extensions)16 b(along)e(v)n(ariations)g
+(in)o(v)o(olving)f(double)i(c)o(hec)o(k)i(are)e(imp)q(ortan)o(t)365
+1556 y(as)f(it)g(is)g(implicit)d(that)j(at)f(least)h(t)o(w)o(o)g(pieces)h
+(are)f(co{op)q(erating)g(in)g(the)g(attac)o(k)g(on)365 1606
+y(the)h(king.)i Fm(R)n(e)n(c)n(eives)e(24)g(p)n(oints)g(of)g(inter)n(est.)312
+1688 y Fp(3.)20 b Fl(Disco)o(v)o(ered)13 b(Single)h(Chec)o(k)365
+1754 y Fp(This)k(heuristic)h(pro)o(vides)f(a)f(searc)o(h)j(extension)e(when)g
+(a)g(side)g(is)g(in-c)o(hec)o(k)g(from)365 1804 y(a)f(disco)o(v)o(ered)g
+(attac)o(k.)26 b(It)16 b(is)h(implicit)d(that)i(the)h(piece)h(mo)o(v)o(ed)d
+(is)h(not)h(the)g(piece)365 1854 y(giving)g(c)o(hec)o(k.)31
+b(As)18 b(this)g(e\013ectiv)o(ely)h(giv)o(es)f(the)h(mo)o(ving)c(piece)k(a)e
+(free)i(mo)o(v)o(e,)e(it)365 1904 y(is)e(v)o(ery)f(imp)q(ortan)o(t)f(to)h
+(explore)h(suc)o(h)g(mo)o(v)o(es)e(throughly)m(.)19 b Fm(R)n(e)n(c)n(eives)c
+(20)h(p)n(oints)g(of)365 1953 y(inter)n(est.)312 2036 y Fp(4.)k
+Fl(In-c)o(hec)o(k)15 b(with)g(no)g(legal)g(king)f(reply)365
+2102 y Fp(This)f(heuristic)h(pro)o(vides)f(a)g(searc)o(h)h(extension)g(when)g
+(a)e(side)i(is)f(in-c)o(hec)o(k)g(and)g(the)365 2151 y(king)e(has)g(no)g
+(legal)f(escap)q(e)j(mo)o(v)o(es.)j(The)11 b(idea)g(b)q(eing)g(to)g(iden)o
+(tify)f(p)q(ossible)i(mating)365 2201 y(nets.)19 b Fm(R)n(e)n(c)n(eives)c(20)
+h(p)n(oints)f(of)f(inter)n(est.)312 2283 y Fp(5.)20 b Fl(In-c)o(hec)o(k)15
+b(with)g(more)g(than)g(one)g(legal)f(reply)365 2350 y Fp(This)i(heuristic)h
+(is)e(common)e(to)j(a)f(n)o(um)o(b)q(er)h(of)f(top)g(programs,)g(Hitec)o(h)h
+(included)365 2399 y([7].)j(Ho)o(w)o(ev)o(er,)c(m)o(y)d(program)h(is)i(more)e
+(selectiv)o(e)j(b)q(ecause)g(this)f(heuristic)g(is)f(only)365
+2449 y(applied)k(where)i(the)f(searc)o(h)h(result)f(is)g(lik)o(ely)e(to)h(b)q
+(e)h(a\013ected.)34 b(I)18 b(feel)h(this)f(is)h(a)946 2574
+y(101)p eop
+%%Page: 102 104
+102 103 bop 365 307 a Fp(signi\014can)o(t)21 b(adv)n(an)o(tage)e(o)o(v)o(er)i
+(its)g(otherwise)h(unrestricted)h(application.)37 b(It)21 b(is)365
+357 y(imp)q(ortan)o(t)14 b(to)i(explore)g(in)f(c)o(hec)o(k)i(v)n(ariations)d
+(throughly)h(b)q(ecause)j(other)e(tactics)365 407 y(ma)o(y)c(\015o)o(w)i
+(from)e(a)h(c)o(hec)o(k.)19 b Fm(R)n(e)n(c)n(eives)c(16)h(p)n(oints)f(of)f
+(inter)n(est.)312 488 y Fp(6.)20 b Fl(P)o(a)o(wn)15 b(mo)o(v)o(es)g(to)h(the)
+e(7th)h(Rank)365 553 y Fp(This)22 b(heuristic)g(encourages)h(exploration)e
+(of)g(v)n(ariations)f(where)j(the)f(pa)o(wn)g(is)365 603 y(pushed)15
+b(near)g(to)e(promotion.)j Fm(R)n(e)n(c)n(eives)f(16)g(p)n(oints)g(of)g
+(inter)n(est.)312 684 y Fp(7.)20 b Fl(P)o(a)o(wn)15 b(mo)o(v)o(es)g(to)h(the)
+e(6th)h(Rank)365 749 y Fp(This)g(is)g(a)f(subset)j(of)d(the)h(ab)q(o)o(v)o(e)
+g(heuristic)g(and)g(serv)o(es)i(to)d(increase)i(exploration)365
+799 y(of)e(p)q(ositions)g(where)i(passed)f(pa)o(wns)g(can)g(b)q(e)g(pushed,)g
+(esp)q(ecially)g(in)f(or)g(near)h(the)365 849 y(endgame.)i
+Fm(R)n(e)n(c)n(eives)e(r)n(evPhase)g(p)n(oints)g(of)g(inter)n(est.)312
+929 y Fp(8.)20 b Fl(Piece)15 b(Threats)365 995 y Fp(The)d(follo)o(wing)d
+(searc)o(h)k(heuristics)g(are)f(concerned)i(with)d(threats)i(on)e(pieces)i
+(of)e(the)365 1045 y(side)k(curren)o(tly)f(to)g(mo)o(v)o(e:)383
+1125 y(\(a\))21 b Fl(More)15 b(than)g(one)g(piece)g(is)g(en-prise)457
+1182 y Fm(R)n(e)n(c)n(eives)g(16)g(p)n(oints)g(of)g(inter)n(est.)381
+1247 y Fp(\(b\))21 b Fl(A)16 b(pinned)d(piece)h(whic)o(h)h(is)g(en-prise)457
+1304 y Fm(R)n(e)n(c)n(eives)g(16)g(p)n(oints)g(of)g(inter)n(est.)385
+1368 y Fp(\(c\))22 b Fl(A)16 b(trapp)q(ed)e(piece)g(whic)o(h)h(is)g(en-prise)
+457 1425 y Fm(R)n(e)n(c)n(eives)g(16)g(p)n(oints)g(of)g(inter)n(est.)365
+1506 y Fp(These)22 b(heuristics)g(pro)o(vide)e(searc)o(h)h(extensions)h
+(along)d(v)n(ariations)g(of)h(complex)365 1556 y(dynamic)c(p)q(ossibilities.)
+30 b(The)18 b(quiescence)i(searc)o(h)f(will)d(resolv)o(e)i(suc)o(h)h(p)q
+(ositions)365 1605 y(when)f(the)h(threatened)g(pla)o(y)o(er)e(is)h
+Fl(not)e Fp(to)i(mo)o(v)o(e.)27 b(Hence)19 b(these)g(heuristics)g(are)365
+1655 y(only)d(applied)h(in)f(p)q(ositions)h(where)h(the)f(threatened)i(pla)o
+(y)o(er)e(has)g(the)g(mo)o(v)o(e.)26 b(In)365 1705 y(this)11
+b(w)o(a)o(y)f(the)i(pla)o(y)o(er)e(m)o(ust)g(sho)o(w)h(the)g(existence)i(of)d
+(an)g(adequate)i(defensiv)o(e)f(mo)o(v)o(e)365 1755 y(or)j(the)h(ensuing)f
+(quiescence)i(searc)o(h)f(will)d(refute)j(the)g(v)n(ariation.)312
+1836 y(9.)20 b Fl(Mate)c(threat)e(against)h(the)g(side)f(to)h(mo)o(v)o(e)365
+1901 y Fp(This)10 b(heuristic)g(pro)o(vides)g(a)g(searc)o(h)g(extension)h
+(when)f(mate)e(is)i(directly)g(threatened)365 1951 y(against)i(the)i(side)f
+(to)f(mo)o(v)o(e.)k(This)d(will)e(force)j(exploration)d(of)i(v)n(ariations)e
+(to)i(sho)o(w)365 2001 y(whether)18 b(the)e(mate)f(threat)i(can)f(b)q(e)g
+(defended)h(against.)24 b Fm(R)n(e)n(c)n(eives)17 b(24)g(p)n(oints)g(of)365
+2051 y(inter)n(est.)262 2165 y Fp(Searc)o(h)c(heuristics)h(8a,)e(8b,)h(8c)g
+(and)f(9)h(are)g(only)f(applied)g(during)h(the)g(quiescence)i(searc)o(h)262
+2214 y(after)k(a)g(full)g(p)q(ositional)f(ev)n(aluation.)33
+b(An)o(y)19 b(of)g(the)h(heuristics)h(1)e(through)g(6)g(can)h(b)q(e)262
+2264 y(applied)14 b(in)g(either)i(the)g(main)c(or)j(quiescence)i(searc)o
+(hes.)23 b(More)16 b(details)f(ab)q(out)f(this)h(can)262 2314
+y(b)q(e)f(found)f(in)h(sections)h(5.3)e(and)g(5.4.)18 b(Heuristics)d(1)e(to)h
+(5)g(are)g(m)o(utually)d(exclusiv)o(e.)324 2399 y(Eac)o(h)h(ply)f(of)g(searc)
+o(h)i(consumes)f(16)g(in)o(terest)h(p)q(oin)o(ts.)k(It)12 b(can)g(therefore)h
+(b)q(e)f(seen)i(that)262 2449 y(some)j(heuristics)j(whic)o(h)e(equal)g(or)h
+(exceed)h(an)e(in)o(terest)i(v)n(alue)e(of)g(16)g(ma)o(y)e(in)i(theory)946
+2574 y(102)p eop
+%%Page: 103 105
+103 104 bop 262 307 a Fp(cause)15 b(the)f(searc)o(h)h(to)f(b)q(e)h(un)o(b)q
+(ounded.)j(Ho)o(w)o(ev)o(er,)c(in)g(practice)h(this)f(should)g(not)f(b)q(e)i
+(the)262 357 y(case)f(as:)324 464 y Ff(\017)20 b Fp(It)14 b(is)g(rare)h(to)e
+(get)h(out)g(of)g(c)o(hec)o(k)g(with)g(a)g(c)o(hec)o(k)g(mo)o(v)o(e)f
+(itself.)324 541 y Ff(\017)20 b Fp(Heuristics)15 b(8a,)d(8b,)h(8c)g(and)g(9)g
+(are)g(only)g(applied)f(once)i(or)f(t)o(wice)h(do)o(wn)e(an)o(y)h(giv)o(en)
+365 591 y(v)n(ariation.)324 669 y Ff(\017)20 b Fp(Heuristics)15
+b(6)f(and)g(7)f(are)i(self)f(limiti)o(ng)d(as)j(a)g(pa)o(wn)f(can)h(only)f
+(mo)o(v)o(e)g(forw)o(ard.)262 776 y(F)m(or)19 b(added)i(protection)g(against)
+e(an)h(un)o(b)q(ounded)h(searc)o(h,)h(all)d(no)q(des)i(visited)f(in)g(the)262
+826 y(main)9 b(searc)o(h)14 b(whic)o(h)e(are)g(deep)q(er)i(than)e(t)o(wice)g
+(the)h(iteration)e(depth,)i(ha)o(v)o(e)f(their)g(in)o(terest)262
+875 y(v)n(alue)e(decreased)k(b)o(y)d(the)h(amoun)o(t)e(whic)o(h)h(the)h
+(curren)o(t)h(ply)e(exceeds)i(t)o(wice)f(the)g(iteration)262
+925 y(depth.)262 1074 y Fu(5.2.2)55 b(Threat)18 b(Execution)262
+1186 y Fp(The)d(execution)h(of)f(a)g(previous)h(threat)g(is)f(only)f(in)o
+(teresting)i(if)e(at)i(the)g(curren)o(t)g(no)q(de)g(it)262
+1236 y(lo)q(oks)d(lik)o(ely)f(to)i(a\013ect)h(the)f(searc)o(h)h(result.)324
+1322 y(F)m(or)20 b(an)o(y)g(mo)o(v)o(e)e(whic)o(h)i(constitutes)i(the)f
+(execution)g(of)f(a)g(threat,)i(the)f(follo)o(wing)262 1371
+y(criteria)14 b(m)o(ust)f(b)q(e)h(meet)g(for)f(the)i(mo)o(v)o(e)d(to)i(b)q(e)
+g(further)h(considered)g(as)f(in)o(teresting:)344 1457 y(Est)h
+Ff(\000)f Fp(Thres)h Fh(<)d(\014)k Fl(or)e Fh(\014)i Fp(=)e(Aspir)p
+Fh(\014)262 1557 y Fl(where)312 1656 y Fp(1.)20 b Fl(Est)p
+Fp(:)j(This)17 b(is)f(an)g(estimate)g(of)g(the)h(curren)o(t)h(no)q(de's)f(v)n
+(alue,)f(mostly)f(dominated)365 1706 y(b)o(y)f(material)e(v)n(alues.)312
+1783 y(2.)20 b Fl(Thres)p Fp(:)c(Represen)o(ts)e(the)e(v)n(alue)f(of)g(ha)o
+(ving)g(the)h(mo)o(v)o(e)e(\(a)i(temp)q(o\))e(and)i(what)g(that)365
+1833 y(mo)o(v)o(e)h(migh)o(t)e(ac)o(hiev)o(e.)312 1910 y(3.)20
+b Fh(\014)r Fp(:)d(This)10 b(is)g(the)h(curren)o(t)h(v)n(alue)d(of)h(b)q(eta)
+g(at)g(this)g(no)q(de,)h(whic)o(h)f(therefore)i(represen)o(ts)365
+1960 y(either)k(the)g(v)n(alue)e(of)h(the)g(b)q(est)h(v)n(ariation)e(found)g
+(for)h(this)g(side)g(elsewhere)i(in)e(the)365 2010 y(searc)o(h)g(tree)g(or)f
+(an)g(initial)e(aspiration)h(v)n(alue.)312 2087 y(4.)20 b Fl(Aspir)p
+Fh(\014)r Fp(:)c(This)c(is)g(the)g(initial)e(aspiration)h(v)n(alue)g(used)i
+(for)e(the)i(b)q(est)g(v)n(alue)e(ac)o(hiev-)365 2137 y(able)k(b)o(y)f(the)h
+(side)g Fl(not)f Fp(to)g(mo)o(v)o(e.)19 b(A)o(t)c(ev)o(en)g(depths)h(b)q(elo)
+o(w)e(the)h(ro)q(ot,)g(this)f(is)h(the)365 2187 y(initial)d
+Fh(\014)17 b Fp(v)n(alue;)12 b(at)i(o)q(dd)g(depths,)h(it)e(is)h(the)g
+(initial)e Fh(\013)i Fp(v)n(alue.)262 2300 y(This)20 b(heuristic)h(is)f
+(almost)f(an)h(exact)h(mirror)e(image)f(of)i(the)h(one)g(used)g(for)f
+(threats.)262 2350 y(Giv)o(en)e(that)h(the)h(ab)q(o)o(v)o(e)f(criteria)g(are)
+h(met,)f(the)h(follo)o(wing)c(threat)k(execution)g(mo)o(v)o(es)262
+2399 y(are)13 b(classi\014ed)g(and)g(their)g(appropriate)g(in)o(terest)g(p)q
+(oin)o(ts)g(added)g(to)g(the)g(curren)o(t)h(in)o(terest)262
+2449 y(v)n(alue)f(at)g(this)h(no)q(de.)946 2574 y(103)p eop
+%%Page: 104 106
+104 105 bop 312 307 a Fp(1.)20 b Fl(Capture)365 374 y Fp(This)h(heuristic)h
+(encourages)g(exploration)e(of)g(in)o(teresting)i(capture)g(sequences.)365
+423 y(P)o(articularly)c(where)h(greater)g(v)n(alued)e(pieces)j(are)e(in)o(v)o
+(olv)o(ed.)30 b Fm(R)n(e)n(c)n(eives)18 b(inter)n(est)365 473
+y(p)n(oints)d(dep)n(ending)h(on)f(the)f(typ)n(e)h(of)g(pie)n(c)n(e)f(c)n
+(aptur)n(e)n(d,)g(wher)n(e)g(p)n(awn)h(=)f(1;)h(knight)g(=)365
+523 y(2;)g(bishop)g(=)g(3;)g(r)n(o)n(ok)g(=)f(4)h(and)h(que)n(en)g(=)e(5.)312
+606 y Fp(2.)20 b Fl(P)o(a)o(wn)15 b(Promotion)365 672 y Fp(This)d(heuristic)g
+(also)f(encourages)i(exploration)d(of)h(v)n(ariations)f(whic)o(h)i(are)g(in)o
+(terest-)365 722 y(ing.)20 b(Assuming)13 b(the)i(promoted)f(pa)o(wn)g(cannot)
+h(b)q(e)g(captured,)h(the)f(mo)o(v)o(e)e(is)h(v)o(ery)365 772
+y(lik)o(ely)k(to)h(b)q(e)h(go)q(o)q(d)f(and)g(therefore)h(in)o(teresting.)35
+b(If,)19 b(ho)o(w)o(ev)o(er,)i(the)f(promoted)365 822 y(pa)o(wn)13
+b(can)h(b)q(e)g(captured,)g(the)g(opp)q(onen)o(ts)h(options)e(ha)o(v)o(e)g(a)
+g(degree)i(of)e(forcedness)365 872 y(ab)q(out)k(them)f(whic)o(h)h(therefore,)
+h(also)e(mak)o(es)g(this)h(mo)o(v)o(e)e(in)o(teresting.)28
+b Fm(R)n(e)n(c)n(eives)365 922 y(inter)n(est)13 b(p)n(oints)g(dep)n(ending)i
+(on)f(the)f(typ)n(e)h(of)f(pie)n(c)n(e)h(pr)n(omote)n(d)f(to,)g(wher)n(e)g
+(knight)h(=)365 971 y(1;)h(bishop)g(=)g(2;)g(r)n(o)n(ok)g(=)f(3)h(and)h(que)n
+(en)g(=)e(4.)312 1054 y Fp(3.)20 b Fl(Recapture)365 1121 y
+Fp(This)12 b(heuristic)g(is)f(used)i(in)e(Hitec)o(h)h([7)o(].)17
+b(I)12 b(feel)f(it)g(is)h(of)f(great)h(b)q(ene\014t)g(in)g(that)f(it)g(en-)
+365 1171 y(courages)j(not)e(only)g(exploration)g(of)g(simple)f(exc)o(hanges,)
+j(but)f(also)f(captures)i(with)365 1220 y(p)q(ositional)h(con)o(ten)o(t)i
+(e.g.)25 b(a)16 b(ro)q(ok)g(exc)o(hanged)h(for)f(knigh)o(t)f(and)h(p)q
+(ositional)f(com-)365 1270 y(p)q(ensation.)k(This)14 b(heuristic)h(is)f(only)
+f(applied)28 b(if:)17 b Ff(j)p Fh(LastS)r(ear)q(chV)11 b(al)q(ue)e
+Ff(\000)h Fh(E)r(st)p Ff(j)h(\024)365 1320 y Fp(25)18 b(and)h(the)g(last)g(2)
+f(mo)o(v)o(es)f(pla)o(y)o(ed)h(w)o(ere)i(captures.)66 b Fm(R)n(e)n(c)n(eives)
+20 b(16)f(p)n(oints)h(of)365 1370 y(inter)n(est.)312 1453 y
+Fp(4.)g Fl(Mate)c(Threat)f(against)f(the)h(side)g(not)g(to)g(mo)o(v)o(e)365
+1519 y Fp(This)20 b(heuristic)g(is)g(only)f(applied)g(during)g(the)i
+(quiescence)h(searc)o(h)e(after)g(a)g(full)365 1569 y(p)q(osition)15
+b(ev)n(aluation.)20 b(It)15 b(is)g(extremely)g(useful)g(for)g(a)o(v)o(oiding)
+e(early)i(termination)365 1619 y(of)e(the)h(searc)o(h)h(in)d(p)q(ossible)i
+(mating)d(sequences.)21 b Fm(R)n(e)n(c)n(eives)14 b(16)h(p)n(oints)f(of)h
+(inter)n(est.)262 1737 y Fp(It)g(should)h(b)q(e)g(noticed)g(that)f(some)g(of)
+g(m)o(y)f(de\014nitions)i(of)f(in)o(terestingness)i(attempt)e(to)262
+1787 y(measure)c(the)i(forcedness)g(of)f(mo)o(v)o(es)e(and)i(replies.)18
+b(In)12 b(this)g(w)o(a)o(y)f(I)g(hop)q(e)i(to)e(ac)o(hiev)o(e)h(some)262
+1837 y(of)k(the)i(b)q(ene\014ts)i(found)d(b)o(y)g(F)m(eng-hsiung)g(Hsu)h(and)
+f(his)h(team)e(in)h(their)h(recen)o(t)h(pap)q(er)262 1887 y("Singular)12
+b(Extensions:)19 b(Adding)13 b(Selectivit)o(y)h(to)g(Brute-F)m(orce)i(Searc)o
+(hing")d([3].)324 1972 y(Unlik)o(e)g(singular)g(extensions)i(m)o(y)d(approac)
+o(h)h(attempts)g(to)h(classify)f(forcedness)j(in)d(a)262 2022
+y(more)e(static)i(w)o(a)o(y)f(in)g(order)h(to)f(a)o(v)o(oid)f(exp)q(ensiv)o
+(e)j(test)f(depth)g(searc)o(hes.)20 b(Therefore,)14 b(this)262
+2072 y(approac)o(h)j(do)q(es)i(su\013er)g(the)f(dra)o(wbac)o(k)g(that)g
+(dynamic)e(non)h(static)h(forced)h(v)n(ariations)262 2122 y(are)c(not)g
+(extended.)22 b(This)15 b(is)g(essen)o(tially)g(the)g(trade)h(o\013)f(b)q(et)
+o(w)o(een)h(static)g(and)e(dynamic)262 2171 y(searc)o(h)20
+b(extensions.)35 b(Ho)o(w)o(ev)o(er,)21 b(I)e(ha)o(v)o(e)g(managed)f(to)h
+(incorp)q(orate)h(dynamic)d(searc)o(h)262 2221 y(information)7
+b(in)o(to)i(the)i(searc)o(h)g(heuristics)g(without)e(added)i(cost.)17
+b(This)10 b(allo)o(ws)f(the)h(searc)o(h)262 2271 y(heuristics)21
+b(to)g(b)q(e)g(quite)f(selectiv)o(e)i(ab)q(out)e(whic)o(h)h(v)n(ariations)e
+(are)i(w)o(orth)g(extending.)262 2321 y(Additionally)m(,)9
+b(some)j(of)f(m)o(y)g(searc)o(h)i(extension)g(heuristics)h(can)e(extend)i
+(non{forced)e(but)262 2371 y(still)g(in)o(teresting)j(v)n(ariations.)i(I)c
+(see)j(this)e(as)g(an)f(adv)n(an)o(tage)g(o)o(v)o(er)h(singular)f
+(extensions.)946 2574 y(104)p eop
+%%Page: 105 107
+105 106 bop 324 307 a Fp(T)m(o)12 b(illustrate)i(ho)o(w)f(these)i(extension)f
+(heuristics)g(are)g(able)f(to)h(iden)o(tify)e(deep)j(com)o(bi-)262
+357 y(nations,)e(I)g(will)g(apply)g(them)g(to)h(the)g(p)q(osition)f(sho)o(wn)
+h(in)g(\014gure)g(5.1.)p 641 451 673 5 v 641 1115 5 665 v 646
+534 a Fg(0ZqsrZnZ)646 617 y(Z0ZbZko0)646 700 y(0ZpApm0o)646
+783 y(ZpZ0OPZ0)646 866 y(pZ0O0Z0Z)646 949 y(ZBO0Z0Z0)646 1032
+y(PZ0ZQZPO)646 1115 y(Z0Z0SRJ0)p 1310 1115 V 641 1119 673 5
+v 594 1253 a Fp(Figure)g(5.1:)j(White)d(to)g(pla)o(y)f(and)h(mate)e(in)i(10.)
+p 295 1327 1365 2 v 294 1377 2 50 v 320 1362 a Fm(Ply)p 403
+1377 V 50 w(Inter)n(est)p 590 1377 V 49 w(Move)p 790 1377 V
+104 w(A)n(djust)g(Ply)p 1029 1377 V 50 w(Extension)i(typ)n(e)p
+1344 1377 V 50 w(Inter)n(est)e(Bonus)p 1659 1377 V 295 1378
+1365 2 v 294 1428 2 50 v 339 1413 a Fp(1)p 403 1428 V 117 w(96)p
+590 1428 V 97 w(Qh5+)p 790 1428 V 150 w Ff(\000)p Fp(16)p 1029
+1428 V 214 w(T4)p 1344 1428 V 253 w(+20)p 1659 1428 V 295 1430
+1365 2 v 294 1479 2 50 v 339 1465 a(2)p 403 1479 V 106 w(100)p
+590 1479 V 87 w(...)j(Nxh5)p 790 1479 V 108 w Ff(\000)p Fp(16)p
+1029 1479 V 200 w(TE1)p 1344 1479 V 249 w(+5)p 1659 1479 V
+295 1481 1365 2 v 294 1531 2 50 v 339 1516 a(3)p 403 1531 V
+117 w(89)p 590 1531 V 97 w(fxe6+)p 790 1531 V 152 w Ff(\000)p
+Fp(16)p 1029 1531 V 159 w(T2+TE1)p 1344 1531 V 170 w(+24+1)p
+1659 1531 V 295 1533 1365 2 v 294 1582 2 50 v 339 1567 a(4)p
+403 1582 V 117 w(98)p 590 1582 V 97 w(...)g(Kg6)p 790 1582
+V 131 w Ff(\000)p Fp(16)p 1029 1582 V 233 w(-)p 1344 1582 V
+297 w(0)p 1659 1582 V 295 1584 1365 2 v 294 1634 2 50 v 339
+1619 a(5)p 403 1634 V 117 w(82)p 590 1634 V 97 w(Bc2+)p 790
+1634 V 158 w Ff(\000)p Fp(16)p 1029 1634 V 214 w(T1)p 1344
+1634 V 253 w(+24)p 1659 1634 V 295 1636 1365 2 v 294 1685 2
+50 v 339 1670 a(6)p 403 1685 V 117 w(90)p 590 1685 V 97 w(...)g(Kg5)p
+790 1685 V 131 w Ff(\000)p Fp(16)p 1029 1685 V 233 w(-)p 1344
+1685 V 297 w(0)p 1659 1685 V 295 1687 1365 2 v 294 1737 2 50
+v 339 1722 a(7)p 403 1737 V 117 w(74)p 590 1737 V 97 w(Rf5+)p
+790 1737 V 161 w Ff(\000)p Fp(16)p 1029 1737 V 214 w(T5)p 1344
+1737 V 253 w(+16)p 1659 1737 V 295 1739 1365 2 v 294 1788 2
+50 v 339 1773 a(8)p 403 1788 V 117 w(74)p 590 1788 V 97 w(...)g(Kg6)p
+790 1788 V 131 w Ff(\000)p Fp(16)p 1029 1788 V 233 w(-)p 1344
+1788 V 297 w(0)p 1659 1788 V 295 1790 1365 2 v 294 1840 2 50
+v 339 1825 a(9)p 403 1840 V 117 w(58)p 590 1840 V 97 w(Rf6+)p
+790 1840 V 161 w Ff(\000)p Fp(16)p 1029 1840 V 214 w(T2)p 1344
+1840 V 253 w(+24)p 1659 1840 V 295 1841 1365 2 v 294 1891 2
+50 v 329 1876 a(10)p 403 1891 V 106 w(66)p 590 1891 V 97 w(...)g(Kg5)p
+790 1891 V 131 w Ff(\000)p Fp(16)p 1029 1891 V 233 w(-)p 1344
+1891 V 297 w(0)p 1659 1891 V 295 1893 1365 2 v 294 1943 2 50
+v 329 1928 a(11)p 403 1943 V 106 w(50)p 590 1943 V 97 w(Rg6+)p
+790 1943 V 153 w Ff(\000)p Fp(16)p 1029 1943 V 214 w(T5)p 1344
+1943 V 253 w(+16)p 1659 1943 V 295 1944 1365 2 v 294 1994 2
+50 v 329 1979 a(12)p 403 1994 V 106 w(50)p 590 1994 V 97 w(...)g(Kh4)p
+790 1994 V 129 w Ff(\000)p Fp(16)p 1029 1994 V 233 w(-)p 1344
+1994 V 297 w(0)p 1659 1994 V 295 1996 1365 2 v 294 2046 2 50
+v 329 2031 a(13)p 403 2046 V 106 w(34)p 590 2046 V 97 w(Re4+)p
+790 2046 V 156 w Ff(\000)p Fp(17)p 1029 2046 V 214 w(T1)p 1344
+2046 V 253 w(+24)p 1659 2046 V 295 2047 1365 2 v 294 2097 2
+50 v 329 2082 a(14)p 403 2097 V 106 w(41)p 590 2097 V 97 w(...)g(Nf4)p
+790 2097 V 140 w Ff(\000)p Fp(18)p 1029 2097 V 233 w(-)p 1344
+2097 V 297 w(0)p 1659 2097 V 295 2099 1365 2 v 294 2149 2 50
+v 329 2134 a(15)p 403 2149 V 106 w(23)p 590 2149 V 97 w(Rxf4+)p
+790 2149 V 139 w Ff(\000)p Fp(19)p 1029 2149 V 159 w(T1+TE1)p
+1344 2149 V 170 w(+24+2)p 1659 2149 V 295 2150 1365 2 v 294
+2200 2 50 v 329 2185 a(16)p 403 2200 V 106 w(30)p 590 2200
+V 97 w(...)g(Kh5)p 790 2200 V 129 w Ff(\000)p Fp(20)p 1029
+2200 V 233 w(-)p 1344 2200 V 297 w(0)p 1659 2200 V 295 2202
+1365 2 v 294 2252 2 50 v 329 2237 a(17)p 403 2252 V 106 w(10)p
+590 2252 V 97 w(g3)p 790 2252 V 216 w Ff(\000)p Fp(21)p 1029
+2252 V 214 w(T9)p 1344 2252 V 253 w(+24)p 1659 2252 V 295 2253
+1365 2 v 294 2303 2 50 v 329 2288 a(18)p 403 2303 V 106 w(13)p
+590 2303 V 97 w(...)g(an)o(y)p 790 2303 V 140 w Ff(\000)p Fp(22)p
+1029 2303 V 200 w(TE4)p 1344 2303 V 239 w(+16)p 1659 2303 V
+295 2305 1365 2 v 294 2355 2 50 v 329 2340 a(19)p 403 2355
+V 116 w(7)p 590 2355 V 108 w(Rh4++)p 790 2355 V 149 w(-)p 1029
+2355 V 263 w(-)p 1344 2355 V 301 w(-)p 1659 2355 V 295 2356
+1365 2 v 314 2449 a(Figure)d(5.2:)j(A)d(table)f(sho)o(wing)h(in)o(terest)h(v)
+n(alues)e(for)h(a)f(19)h(ply)f(mating)f(sequence.)946 2574
+y(105)p eop
+%%Page: 106 108
+106 107 bop 262 307 a Fp(Note:)24 b(Tn)16 b(represen)o(ts)k(threat)d
+(heuristic)h(n,)f(and)f(TEm)g(represen)o(ts)j(threat)f(execution)262
+357 y(heuristic)c(m.)324 442 y(In)e(the)g(p)q(osition)f(in)h(\014gure)g(5.1,)
+f(white)h(can)g(force)g(c)o(hec)o(kmate)g(in)f(10)g(mo)o(v)o(es)g(\(19)g
+(ply\).)262 492 y(The)g(table)g(sho)o(wn)g(in)f(\014gure)i(5.2)e(sho)o(ws)h
+(ho)o(w)g(on)f(a)h(6)g(ply)f(iteration,)h(these)h(heuristics)g(are)262
+542 y(able)j(to)h(iden)o(tify)f(the)i(correct)g(19)f(ply)f(mo)o(v)o(e)f
+(sequence.)27 b(Assume)16 b(for)f(simplicit)o(y)f(that)262
+592 y(aspiration)f(v)n(alues)g(of)g Fh(\013)h Fp(and)g Fh(\014)i
+Fp(are)f(presen)o(t)g(when)f(the)h(giv)o(en)e(v)n(ariation)g(is)g(explored.)
+262 764 y Fr(5.3)69 b(Quiescence)20 b(Decision)262 891 y Fp(Unlik)o(e)f(most)
+g(other)i(c)o(hess)h(programs,)e(HIAR)o(CS)g(will)f(not)h(leap)g(in)o(to)f(a)
+h(quiescence)262 941 y(searc)o(h)13 b(when)h(the)f(depth)h(of)e(the)h(full)f
+(width)h(searc)o(h)h(reac)o(hes)g(zero.)19 b(The)13 b(reason)g(b)q(ehind)262
+990 y(this)g(lies)h(in)g(understanding)g(what)g(the)g(quiescence)i(searc)o(h)
+f(is)f(capable)g(of.)324 1076 y(W)m(ere)d(it)g(truly)f(capable)h(of)g(searc)o
+(hing)g(all)f(the)i(imp)q(ortan)o(t)d(p)q(ossibilities)h(in)h(a)f(p)q
+(osition)262 1125 y(un)o(til)e(true)j(quiescence)h(is)d(ac)o(hiev)o(ed,)h
+(there)h(w)o(ould)e(b)q(e)h(no)g(p)q(oin)o(t)f(in)g(ha)o(ving)g(a)g(main)e
+(searc)o(h)262 1175 y(at)16 b(all.)25 b(The)18 b(quiescence)g(searc)o(h)g
+(could)f(b)q(e)g(directly)g(applied)f(to)h(all)e(mo)o(v)o(es)h(at)g(ply)g(1.)
+262 1225 y(Sadly)m(,)10 b(ho)o(w)o(ev)o(er,)j(w)o(e)f(do)g(not)g(y)o(et)h
+(kno)o(w)e(ho)o(w)h(to)g(build)g(suc)o(h)g(a)g(near-p)q(erfect)i(quiescence)
+262 1275 y(searc)o(h.)26 b(Therefore,)17 b(b)o(y)f(kno)o(wing)f(what)h(m)o(y)
+f(quiescence)j(searc)o(h)f(is)f(capable)h(of,)e(I)h(am)262
+1325 y(able)d(to)h(select)h(when)g(the)f(p)q(osition)f(is)h(suitable)g(for)f
+(suc)o(h)i(a)e(searc)o(h.)324 1410 y(The)g(quiescence)i(searc)o(h)f(is)f
+(capable)g(of)f(exploring)g(lines)h(in)o(v)o(olving)e(captures,)j(pa)o(wn)262
+1460 y(promotions)c(and)i(some)g(c)o(hec)o(king)h(mo)o(v)o(es.)j(The)d
+(curren)o(t)h(side)e(to)h(mo)o(v)o(e)d(is)j(alw)o(a)o(ys)e(giv)o(en)262
+1510 y(the)j(option)f(of)g(standing)g(pat)h(i.e.)j(not)d(making)d(an)o(y)i
+(mo)o(v)o(e)f(and)i(accepting)g(the)g(curren)o(t)262 1559 y(ev)n(aluation)g
+(score.)24 b(Therefore,)17 b('Threat')f(searc)o(h)g(extension)h(heuristics)g
+(1)e(to)h(6)f(and)g(8,)262 1609 y(and)9 b('Threat)i(Execution')f(searc)o(h)h
+(extension)g(heuristic)g(4)f(are)g(applied)g(in)g(the)g(quiescence)262
+1659 y(searc)o(h)18 b(p)q(ossibly)f(causing)h(a)f(rejoining)f(of)h(the)h
+(main)e(searc)o(h.)30 b(Inside)17 b(the)h(quiescence)262 1709
+y(searc)o(h,)h(if)f(an)o(y)g(of)f(these)j(extension)f(heuristics)g(are)g
+(applied)e(successfully)m(,)j(the)f(main)262 1759 y(searc)o(h)h(is)g
+(rejoined)f(regardless)i(of)e(the)h(resulting)g(in)o(terest)h(v)n(alue.)34
+b(This)19 b(a)o(v)o(oids)g(the)262 1808 y(premature)13 b(termination)g(of)g
+(the)h(searc)o(h)h(when)g(asp)q(ects)g(of)f(in)o(terest)h(still)e(exist.)324
+1894 y(This)k(approac)o(h)g(not)g(only)f(mak)o(es)g(a)h(quiescence)i
+(decision)e(at)g(the)h(horizon)f(of)f(the)262 1943 y(main)c(searc)o(h,)k(but)
+f(also)f(more)g(imp)q(ortan)o(tly)m(,)d(at)k(eac)o(h)g(and)g(ev)o(ery)g(ply)g
+(during)f(the)h(qui-)262 1993 y(escence)g(searc)o(h.)k(This)12
+b(should)g(enable)h(the)h(program)d(to)h(\014nd)h(deep)g(com)o(binations)e
+(ev)o(en)262 2043 y(after)18 b(the)g(quiescence)j(searc)o(h)e(is)f(underw)o
+(a)o(y)m(.)30 b(F)m(or)18 b(example,)f(a)h(4)f(ply)h(iteration)g(ma)o(y)262
+2093 y(progress)j(do)o(wn)f(5)g(plies)h(of)f(main)e(searc)o(h)j(\(1)g(ply)f
+(extension\),)i(join)d(the)i(quiescence)262 2143 y(searc)o(h)13
+b(for)e(1)h(more)e(ply)m(,)h(then)i(rejoin)e(the)i(main)c(searc)o(h)k(when)g
+(something)d(in)o(teresting)j(is)262 2193 y(found)e(and)h(pro)q(ceed)i(for)e
+(3)g(more)f(plies)h(in)f(the)i(restarted)h(main)c(searc)o(h)j(b)q(efore)g
+(\014nding)f(a)262 2242 y(9)h(ply)g(com)o(bination)f(whic)o(h)i(w)o(ould)f
+(otherwise)i(b)q(e)f(b)q(ey)o(ond)g(the)h(program's)d(capabilit)o(y)m(.)946
+2574 y(106)p eop
+%%Page: 107 109
+107 108 bop 262 307 a Fr(5.4)69 b(Quiescence)20 b(Searc)n(h)262
+434 y Fp(A)12 b(quiescence)i(searc)o(h)f(is)e(p)q(erformed)h(to)g(c)o(hec)o
+(k)h(out)f(purely)g(tactical)f(p)q(ossibilities)h(whic)o(h)262
+483 y(are)j(v)o(ery)g(di\016cult)g(to)g(assess)h(accurately)g(at)f(the)h
+(horizon)f(of)f(a)h(main)e(searc)o(h)j(b)o(y)f(using)262 533
+y(a)e(static)h(ev)n(aluation)f(function.)324 618 y(This)g(searc)o(h)i(can)f
+(therefore)h(b)q(e)f(seen)h(as)f(a)f(selectiv)o(e)i(tactical)e(searc)o(h)i
+(complemen)o(t-)262 668 y(ing)h(the)h(static)g(tactical)g(parts)g(of)f(the)i
+(ev)n(aluation)d(function.)26 b(Hence,)19 b(impro)o(ving)14
+b(the)262 718 y(accuracy)g(of)g(the)g(results)h(bac)o(k)o(ed)f(up)g(from)f
+(the)h(horizon)g(no)q(des.)324 803 y(The)i(searc)o(h)h(explores)g(captures,)h
+(pa)o(wn)e(promotions)e(and)i(some)f(c)o(hec)o(king)h(mo)o(v)o(es.)262
+853 y(Ideally)d(all)g(dynamic)g(mo)o(v)o(es)g(should)i(b)q(e)g(explored,)g
+(these)g(include)g(c)o(hec)o(ks,)h(c)o(hec)o(k)f(ev)n(a-)262
+903 y(sion,)10 b(threats,)j(defences,)g(blo)q(c)o(ks,)e(X-ra)o(y)g(attac)o
+(ks,)h(captures,)g(pa)o(wn)f(pushes,)i(promotion)262 953 y(etc.)23
+b(A)15 b(com)o(bination)e(of)i(a)g(full)f(n)o(ull)g(mo)o(v)o(e)g(algorithm)e
+(and)k(m)o(y)d(prop)q(osed)j(quiescence)262 1003 y(searc)o(h)11
+b(w)o(ould)f(o\013er)h(some)f(hop)q(e)h(on)g(this)f(direction.)17
+b(Ho)o(w)o(ev)o(er,)12 b(t)o(w)o(o)e(reasons)h(ha)o(v)o(e)g(made)262
+1052 y(me)h(a)o(v)o(oid)h(suc)o(h)i(a)e(com)o(bination)f(in)h(this)h(pro)r
+(ject:)312 1171 y(1.)20 b(The)e(searc)o(h)h(depth)f(is)f(v)o(ery)g
+(di\016cult)g(to)g(con)o(trol)g(and)g(without)g(strict)h(con)o(trols)365
+1221 y(the)d(searc)o(h)g(can)f(easily)f(explo)q(de.)312 1304
+y(2.)20 b(This)10 b(t)o(yp)q(e)h(of)f(searc)o(h)h(w)o(ould)f(explore)h(man)o
+(y)d(thousands)j(of)f(v)n(ariations)f(and)h(hence,)365 1353
+y(require)15 b(v)o(ery)f(fast)g(hardw)o(are)g(to)g(supp)q(ort)h(this)f
+(additional)e(load.)262 1472 y(Pseudo)18 b(co)q(de)h(illustrating)d(m)o(y)g
+(quiescence)k(searc)o(h)f(using)f(the)g(negamax)e(con)o(v)o(en)o(tion)262
+1522 y(can)e(b)q(e)g(found)g(in)f(\014gure)h(5.3.)324 1607
+y(This)c(searc)o(h)h(explores)f(mo)o(v)o(es)f(prop)q(osed)i(b)o(y)f(the)g
+(GenerateQMo)o(v)o(es)i(function.)k(Eac)o(h)262 1657 y(mo)o(v)o(e)10
+b(is)i(searc)o(hed)j(only)c(if)h(it)g(can)g(c)o(hange)h(the)g(searc)o(h)g
+(result)h(i.e.)j(ev)n(al)11 b(+)i Fh(V)c(al)q(ue)1568 1663
+y Fe(m)1612 1657 y Fh(>)i(\013)p Fp(.)262 1707 y(Eac)o(h)17
+b(side)h(to)g(mo)o(v)o(e)e(also)h(has)h(an)f(extra)h(option)f(of)g(standing)g
+(pat)h(thereb)o(y)h(in)e(e\013ect)262 1756 y(pla)o(ying)12
+b(a)h(n)o(ull)g(mo)o(v)o(e,)f(see)j(section)g(3.1.6.)324 1842
+y(A)f(n)o(um)o(b)q(er)f(of)g(additional)f(tree)j(pruning)f(tec)o(hniques)h
+(are)f(used)h(to)f(prune)h(the)f(tree:)324 1960 y Ff(\017)20
+b Fl(Note)14 b(1)p Fp(:)j(As)12 b(the)h(side)f(to)g(mo)o(v)o(e)f(alw)o(a)o
+(ys)f(has)j(the)f(option)g(of)f(pla)o(ying)f(a)i(n)o(ull)f(mo)o(v)o(e)365
+2010 y(and)j(accepting)h(the)g(curren)o(t)h(static)e(score,)h(a)f(no)q(de)h
+(with)f(a)g(static)g(score)i(already)365 2060 y(ab)q(o)o(v)o(e)g(the)g(searc)
+o(h)h(windo)o(w)e(is)h(pruned.)25 b(Implicit)13 b(in)i(this)h(is)g(the)g
+(fact)g(that)g(an)o(y)365 2110 y(subtree)g(b)q(elo)o(w)e(this)f(no)q(de)i(is)
+f(also)f(pruned)i(b)q(efore)f(it)g(is)f(searc)o(hed.)324 2193
+y Ff(\017)20 b Fl(Note)j(2)p Fp(:)30 b(The)21 b(n)o(ull)e(mo)o(v)o(e)g
+(option)g(giv)o(es)h(rise)h(to)f(the)g(p)q(ossibilit)o(y)f(of)h(further)365
+2242 y(reducing)d(the)f(width)g(of)f(the)h(searc)o(h)h(windo)o(w.)23
+b(This)16 b(is)g(b)q(ecause)h(the)g(w)o(orst)f(the)365 2292
+y(side)e(to)f(pla)o(y)f(can)i(do)f(is)g('stand)g(pat`)g(and)g(accept)h(the)g
+(curren)o(t)h(ev)n(aluation)d(score.)324 2375 y Ff(\017)20
+b Fl(Note)h(3)p Fp(:)26 b(Eac)o(h)19 b(mo)o(v)o(e)d(prop)q(osed)j(b)o(y)f
+(GenerateQMo)o(v)o(es)i(can)f(b)q(e)f(assigned)h(an)365 2425
+y(optimistic)11 b(v)n(alue)g(\()p Fh(V)f(al)q(ue)791 2431 y
+Fe(m)823 2425 y Fp(\),)i(e.g.)17 b(captures)d(receiv)o(e)g(the)f(v)n(alue)f
+(of)f(the)i(captured)946 2574 y(107)p eop
+%%Page: 108 110
+108 109 bop 365 307 a Fp(piece)15 b(plus)e(an)g(optimistic)f(p)q(ositional)g
+(score.)19 b(As)13 b(the)h(opp)q(onen)o(t)g(alw)o(a)o(ys)e(has)i(the)365
+357 y(option)g(of)h(making)d(a)j(n)o(ull)f(mo)o(v)o(e)905 342
+y Fk(1)922 357 y Fp(,)g(this)h(optimistic)e(v)n(alue)h(represen)o(ts)k(an)d
+(upp)q(er)365 407 y(b)q(ound)h(on)g(the)g(score)h(deriv)n(able)e(from)f(the)j
+(subtree)g(resulting)f(from)e(this)i(mo)o(v)o(e.)365 457 y(Therefore,)e(if)d
+(ev)o(en)i(this)g(optimistic)d(v)n(alue)i(cannot)g(a\013ect)i(the)f(searc)o
+(h)g(result,)g(the)365 506 y(p)q(oten)o(tial)h(no)q(de)g(and)g(its)f(subtree)
+j(can)e(b)q(e)h(pruned.)262 625 y(These)22 b(3)e(forw)o(ard)g(pruning)h(mec)o
+(hanisms)e(can)i(drastically)f(reduce)i(the)f(size)h(of)e(the)262
+675 y(quiescence)c(searc)o(h.)324 760 y(In)e(conclusion,)f(I)h(feel)g(this)g
+(com)o(bination)e(of)h(main)f(searc)o(h,)j(quiescence)h(searc)o(h)f(and)262
+810 y(selectiv)o(e)h(extensions)g(should)f(signi\014can)o(tly)f(impro)o(v)o
+(e)g(the)i(program's)d(tactical)i(abilit)o(y)m(.)262 860 y(Without)i(suc)o(h)
+i(enhancemen)o(ts,)g(it)f(is)g(lik)o(ely)f(to)h(compare)g(unfa)o(v)o(ourably)
+e(with)i(other)262 909 y(strong)10 b(programs)g(tactically)g(due)h(to)f(the)i
+(signi\014can)o(t)e(amoun)o(t)f(of)h(p)q(ositional)f(kno)o(wledge)262
+959 y(elsewhere)15 b(in)f(the)g(program)f(consuming)f(large)i(c)o(h)o(unks)g
+(of)f(time.)p 262 2371 573 2 v 308 2398 a Fj(1)325 2410 y Fi(this)f(ma)o(y)f
+(not)g(b)q(e)h(the)g(case)f(if)h(the)g(main)f(searc)o(h)g(if)h(rejoined,)e
+(ho)o(w)o(ev)o(er,)h(the)h(a\013ects)f(are)g(minimal)262 2449
+y(and)f(can)h(b)q(e)g(ignored.)946 2574 y Fp(108)p eop
+%%Page: 109 111
+109 110 bop 262 307 a Fl(F)l(unction)11 b Fp(Quiescence\(P)17
+b(:)c Fl(p)q(osition)p Fp(;)d Fh(\013)p Fp(,)k Fh(\014)i Fp(:)i
+Fl(in)o(teger)p Fp(\))11 b Fl(returns)j(in)o(teger)262 407
+y(v)m(ar)321 457 y Fp(m)82 b(:)18 b Fl(mo)o(v)o(e)321 506 y
+Fp(b)q(est,)321 556 y(ev)n(al,)321 606 y(score)29 b(:)18 b
+Fl(in)o(teger)262 706 y(b)q(egin)321 805 y Fp(b)q(est)d(:=)e(Ev)n(aluate\(P)m
+(,)g Ff(\000)p Fh(\014)r Fp(,)h Ff(\000)p Fh(\013)p Fp(\))321
+855 y Fl(if)e Fp(\(b)q(est)j Ff(\025)d Fh(\014)r Fp(\))380
+905 y Fl(return)f Fp(\(b)q(est\))515 b(/*)14 b Fm(Se)n(e)h(note)g(1)f
+Fp(*/)321 955 y Fl(endif)321 1005 y Fh(\013)f Fp(:=)h Fl(max)p
+Fp(\()p Fh(\013)p Fp(,)f(b)q(est\))482 b(/*)14 b Fm(Se)n(e)h(note)g(2)f
+Fp(*/)321 1104 y(GenerateQMo)o(v)o(es\(P\))458 b(/*)14 b Fm(Gener)n(ate)h
+(moves)f Fp(*/)321 1154 y(ev)n(al)f(:=)g(b)q(est)611 b(/*)14
+b Fm(Can)h(always)f('Stand)i(Pat')e Fp(*/)321 1204 y Fl(for)h(eac)o(h)g(mo)o
+(v)o(e)e Fp(m)f Fl(do)380 1254 y(if)g Fp(\(ev)n(al)i(+)g Fh(V)9
+b(al)q(ue)679 1260 y Fe(m)722 1254 y Fh(>)j(\013)p Fp(\))338
+b(/*)14 b Fm(Se)n(e)h(note)g(3)f Fp(*/)439 1303 y(/*)f Fm(Se)n(ar)n(ch)i
+(move)g(m)g(to)g(next)g(depth)h(using)f(ne)n(gamax)h(c)n(onvention)f
+Fp(*/)439 1353 y(score)g(:=)e Ff(\000)p Fp(Quiescence\()p Fh(P)871
+1359 y Fe(m)906 1353 y Fp(,)g Ff(\000)p Fh(\014)r Fp(,)h Ff(\000)p
+Fh(\013)p Fp(\))439 1403 y Fl(if)e Fp(\(score)k Fh(>)e Fp(b)q(est\))498
+1453 y(b)q(est)h(:=)e(score)414 b(/*)14 b Fm(Stor)n(e)g(b)n(est)h(sc)n(or)n
+(e)g(found)f Fp(*/)498 1503 y Fl(if)e Fp(\(b)q(est)k Ff(\025)11
+b Fh(\014)r Fp(\))557 1553 y Fl(return)g Fp(\(b)q(est\))338
+b(/*)14 b Fh(\014)j Fm(cut)e(o\013)h(:)j(r)n(eturn)14 b(b)n(est)h(sc)n(or)n
+(e)e Fp(*/)498 1602 y Fl(endif)498 1652 y Fh(\013)g Fp(:=)h
+Fl(max)p Fp(\()p Fh(\013)p Fp(,)f(b)q(est\))305 b(/*)14 b Fm(Up)n(date)h
+(fail)f(soft)f Fp(*/)439 1702 y Fl(else)498 1752 y Fp(b)q(est)i(:=)e
+Fl(max)p Fp(\(b)q(est,)i(ev)n(al)e(+)i Fh(V)9 b(al)q(ue)1091
+1758 y Fe(m)1123 1752 y Fp(\))439 1802 y Fl(endif)380 1851
+y(endif)321 1901 y(endfor)321 2001 y(return)i Fp(\(b)q(est\))574
+b(/*)14 b Fm(R)n(eturn)h(sc)n(or)n(e)f(of)h(b)n(est)g(move)g(found)g
+Fp(*/)262 2100 y Fl(end)d Fp(Quiescence)513 2277 y(Figure)i(5.3:)j(Pseudo)e
+(co)q(de)g(for)e(m)o(y)f(Quiescence)17 b(Searc)o(h.)946 2574
+y(109)p eop
+%%Page: 110 112
+110 111 bop 262 654 a Fn(Chapter)34 b(6)262 897 y Fo(HIAR)m(CS)k(5.0)262
+1148 y Fp(In)10 b(this)h(c)o(hapter,)h(I)e(will)g(sho)o(w)g(ho)o(w)h(the)g(v)
+n(arious)f(tec)o(hniques)i(I)e(ha)o(v)o(e)h(in)o(v)o(estigated)f(in)h(this)
+262 1198 y(pro)r(ject)j(can)f(b)q(e)h(brough)o(t)f(together)i(and)e(implem)o
+(en)o(ted)f(in)g(a)h(c)o(hess)i(program.)h(There)f(is)262 1248
+y(neither)g(the)g(time)f(nor)g(space)i(to)f(fully)e(explain)h(all)f(the)j
+(design)e(issues,)i(some)e(of)g(whic)o(h)262 1298 y(ha)o(v)o(e)j(ev)o(olv)o
+(ed)h(o)o(v)o(er)g(the)h(last)f(couple)g(of)g(y)o(ears.)31
+b(Ho)o(w)o(ev)o(er,)20 b(I)e(will)e(giv)o(e)i(an)g(o)o(v)o(erview)262
+1347 y(of)g(the)h(program's)e(design)j(and)e(structure.)35
+b(I)19 b(will)f(also)g(discuss)i(some)e(of)g(the)i(main)262
+1397 y(decisions)12 b(whic)o(h)f(ha)o(v)o(e)h(b)q(een)h(tak)o(en)f(relating)f
+(to)h(the)g(algorithms)e(and)h(tec)o(hniques)i(used.)324 1483
+y(This)f(program)e(con)o(tains)i(around)g(a)f(50-50)g(split)h(of)f(old)g(co)q
+(de)i(and)f(totally)e(new)j(co)q(de)262 1532 y(resulting)h(from)e(m)o(y)g(in)
+o(v)o(estigations)h(since)h(b)q(eginning)g(this)g(pro)r(ject.)262
+1705 y Fr(6.1)69 b(Program)24 b(History)f(and)g(En)n(vironmen)n(t)262
+1831 y Fp(I)16 b(b)q(egan)h(writing)f(c)o(hess)i(programs)d(as)i(long)f(ago)g
+(as)g(1979.)26 b(My)16 b(\014rst)i(c)o(hess)g(program,)262
+1881 y(UCT,)13 b(only)h(pla)o(y)o(ed)g(the)g(ending)h(of)e(king)h(and)g(ro)q
+(ok)g(v)o(ersus)h(king.)k(Ho)o(w)o(ev)o(er,)14 b(this)g(only)262
+1931 y(serv)o(ed)k(to)e(w)o(et)h(m)o(y)e(app)q(etite)j(for)e(the)h(sub)r
+(ject.)28 b(In)17 b(late)g(1980,)f(I)g(dev)o(elop)q(ed)i(m)o(y)d(\014rst)262
+1981 y(full)f(c)o(hess)j(program,)d(HIAR)o(CS.)g(Ho)o(w)o(ev)o(er,)i(it)g(w)o
+(as)f(only)g(capable)g(of)g(pla)o(ying)f(random)262 2031 y(c)o(hess.)32
+b(Later,)19 b(in)e(1981,)h(the)g(c)o(hess)i(program)c(w)o(as)i(impro)o(v)o
+(ed)f(to)h(searc)o(h)h(1)e(ply)h(with)262 2080 y(material)13
+b(and)h(mobilit)o(y)e(ev)n(aluation.)21 b(By)15 b(the)h(end)f(of)g(1983,)f
+(HIAR)o(CS)g(w)o(as)h(enhanced)262 2130 y(to)g(a)g(4)g(ply)g(selectiv)o(e)i
+(searc)o(h)g(program)d(applying)g(rudimen)o(tary)g(p)q(ositional)g(and)i(sw)o
+(ap)262 2180 y(o\013)g(ev)n(aluations)g(at)h(its)g(leaf)f(no)q(des.)28
+b(The)17 b(program)e(w)o(as)i(written)g(in)g(compiled)e(Basic)262
+2230 y(with)c(some)h(Z80)g(assem)o(bly)f(routines)i(and)f(w)o(as)g(capable)g
+(of)f(pla)o(ying)g(at)h(w)o(eak)g(club)g(lev)o(el,)262 2280
+y(ELO)i(1300,)e(on)i(a)f(Z80)h(pro)q(cessor.)324 2365 y(A)o(t)c(this)g(p)q
+(oin)o(t)f(activit)o(y)g(stopp)q(ed)i(un)o(til)e(early)h(1987,)f(when)i(I)f
+(b)q(egan)g(w)o(ork)f(dev)o(eloping)262 2415 y(a)15 b(totally)g(new)h(full)e
+(width)i(c)o(hess)h(program)e(written)h(in)f(Mo)q(dula-2)g(for)g(an)h(Amiga.)
+22 b(In)946 2574 y(110)p eop
+%%Page: 111 113
+111 112 bop 262 307 a Fp(mid)12 b(1988,)g(the)i(program)f(w)o(as)g(rewritten)
+j(in)d(the)i(C)e(language)g(for)h(t)o(w)o(o)f(main)f(reasons:)324
+426 y Ff(\017)20 b Fp(Co)q(de)15 b(e\016ciency)324 509 y Ff(\017)20
+b Fp(More)15 b(lo)o(w)e(lev)o(el)g(freedom)262 627 y(A)o(t)g(this)h(stage)h
+(the)f(program)e(w)o(as)i(pla)o(ying)f(at)g(around)h(ELO)g(1550)f(while)h
+(analysing)e(40)262 677 y(-)h(60)h(no)q(des)g(p)q(er)h(second.)324
+762 y(The)i(program)f(w)o(as)h(further)g(enhanced)i(during)d(1988/89)g(un)o
+(til)g(b)o(y)h(August)g(1989,)262 812 y(when)12 b(it)g(w)o(as)g(en)o(tered)i
+(in)d(the)i(1st)f(Computer)g(Olympiad,)d(HIAR)o(CS)j(4.1)f(as)h(it)g(w)o(as)g
+(then)262 862 y(kno)o(wn,)j(w)o(as)g(analysing)f(at)i(the)g(rate)g(of)f(80)g
+(-)g(180)g(no)q(des)h(p)q(er)h(second)f(and)g(pla)o(ying)e(at)262
+912 y(ab)q(out)f(ELO)i(1750.)324 997 y(Early)c(on)h(during)g(this)g(pro)r
+(ject)h(I)f(decided)h(to)f(up)g(load)f(m)o(y)g(program)f(on)o(to)i(our)g(V)-5
+b(AX)262 1047 y(785)13 b(mac)o(hine)f(at)i(w)o(ork.)k(Three)d(reasons)g(la)o
+(y)d(b)q(ehind)j(this)f(decision:)312 1165 y(1.)20 b Fl(Securit)o(y)l(.)g
+Fp(The)15 b(p)q(ossibilit)o(y)f(of)g(m)o(y)f(Amiga)g(malfunctioning)f(or)j
+(ev)o(en)g(ha)o(ving)f(a)365 1215 y(virus)j(p)q(osed)h(to)q(o)e(great)h(a)g
+(risk.)26 b(I)17 b(therefore)h(felt)e(it)h(w)o(as)f(safer)i(to)e(dev)o(elop)h
+(the)365 1265 y(program)12 b(on)h(a)f(mac)o(hine)g(where)i(regular)f(bac)o
+(kup)h(securit)o(y)g(is)e(already)h(pro)o(vided.)312 1348 y(2.)20
+b Fl(Sp)q(eed.)27 b Fp(Ev)o(en)17 b(though)g(a)g(V)-5 b(AX)18
+b(785)e(mac)o(hine)f(is)i(slo)o(w)g(b)o(y)f(to)q(da)o(ys)h(standards,)365
+1398 y(it)f(is)h(still)e(faster)i(than)f(an)g(Amiga.)24 b(I)16
+b(found)g(that)g(the)h(H/W)f(c)o(hange)h(pro)o(vided)365 1447
+y(around)e(a)f(2-fold)f(sp)q(eed)j(impro)o(v)o(emen)o(t,)c(pro)o(vided)i(the)
+h(mac)o(hine)e(w)o(as)i(otherwise)365 1497 y(un)o(used.)312
+1580 y(3.)20 b Fl(En)o(vironmen)o(t.)36 b Fp(I)20 b(felt)h(the)g(UNIX)989
+1565 y Fk(1)1028 1580 y Fp(op)q(erating)g(system)f(pro)o(vided)h(a)f(b)q
+(etter)365 1630 y(en)o(vironmen)o(t)13 b(in)h(whic)o(h)f(to)h(dev)o(elop)g
+(the)g(program.)262 1803 y Fr(6.2)69 b(Program)24 b(Structure)262
+1929 y Fp(HIAR)o(CS)9 b(5.0)g(is)g(a)h(large)g(and)f(complex)g(program.)15
+b(It)10 b(is)f(split)h(up)g(in)o(to)f(12)g(mo)q(dules)g(whic)o(h)262
+1979 y(eac)o(h)j(p)q(erform)e(a)h(particular)h(t)o(yp)q(e)g(of)f(job.)16
+b(In)c(\014gure)g(6.1,)f(a)g(diagram)e(is)i(pro)o(vided)h(whic)o(h)262
+2029 y(illustrates)i(ho)o(w)f(the)i(mo)q(dules)e(in)o(teract)h(with)g(eac)o
+(h)g(other.)19 b(The)14 b(diagram)e(is)i(at)g(a)f(high)262
+2079 y(lev)o(el)d(and)g(m)o(uc)o(h)g(detail)g(has)h(b)q(een)g(omitted)f(for)g
+(reasons)i(of)e(clarit)o(y)m(.)16 b(The)11 b(lines)f(represen)o(t)262
+2128 y(the)16 b(call)e(in)o(teraction)i(and)f(the)h(accompan)o(ying)d
+(description)j(giv)o(es)g(the)g(reason)g(for)f(the)262 2178
+y(mo)q(dule)d(in)o(teraction.)324 2263 y(The)i(main)e(functions)i(p)q
+(erformed)f(b)o(y)h(eac)o(h)g(mo)q(dule)f(are)h(explained)g(b)q(elo)o(w:)p
+262 2298 573 2 v 308 2325 a Fj(1)325 2337 y Fi(UNIX)f(is)e(a)h(T)m(rademark)d
+(of)i(Bell)g(Lab)q(oratories.)946 2574 y Fp(111)p eop
+%%Page: 112 114
+112 113 bop 612 2462 a Fp(Figure)14 b(6.1:)j(Mo)q(dule)d(in)o(teraction)f
+(diagram.)946 2574 y(112)p eop
+%%Page: 113 115
+113 114 bop 312 307 a Fp(1.)20 b Fl(Hiarcs)p Fp(:)g(This)15
+b(is)g(the)h(main)d(program)h(mo)q(dule.)20 b(It)15 b(con)o(trols)g
+(initialisation)e(and)365 357 y(o)o(v)o(ersees)k(the)f(in)o(teraction)g(b)q
+(et)o(w)o(een)g(the)h(user,)f(via)e(the)i(MMI)g(mo)q(dule,)e(and)h(the)365
+407 y(c)o(hess)h(decision)e(algorithms.)312 488 y(2.)20 b Fl(HouseKeeping)p
+Fp(:)c(This)e(mo)q(dule)e(deals)i(with)g(initialisation)d(for)i(a)h(new)g
+(game.)312 570 y(3.)20 b Fl(HashDriv)o(er)p Fp(:)15 b(This)e(mo)q(dule)e(con)
+o(trols)i(transp)q(osition)f(table)h(creation,)g(deletion)365
+620 y(and)f(en)o(try)g(storage)h(and)e(retriev)n(al.)18 b(It)11
+b(also)h(up)q(dates)g(hash)g(indexes)h(and)f(mo)q(di\014es)365
+670 y(the)j(transp)q(osition)f(table)g(b)q(et)o(w)o(een)h(searc)o(hes.)21
+b(An)14 b(op)q(ening)g(b)q(o)q(ok)g(transp)q(osition)365 719
+y(table)g(is)g(also)f(loaded)h(and)f(accessed)j(b)o(y)e(this)g(mo)q(dule.)312
+801 y(4.)20 b Fl(MMI)p Fp(:)d(This)f(mo)q(dule)f(deals)i(with)f(all)g(h)o
+(uman/com)o(puter)f(in)o(teraction.)26 b(It)16 b(also)365 851
+y(c)o(hec)o(ks)g(en)o(tered)f(user)g(mo)o(v)o(es)e(for)g(legalit)o(y)f(and)i
+(pro)q(cesses)j(v)n(arious)c(commands.)312 932 y(5.)20 b Fl(T)l(reeSearc)o(h)
+p Fp(:)c(This)11 b(mo)q(dule)g(p)q(erforms)g(the)i(tree)g(searc)o(hing)g
+(necessary)g(to)f(select)365 982 y(the)18 b(b)q(est)h(a)o(v)n(ailable)c(mo)o
+(v)o(e.)26 b(T)m(o)17 b(ac)o(hiev)o(e)g(this)g(it)g(co)q(ordinates)h(the)g
+(activities)f(of)365 1032 y(the)e(program)d(and)i(mak)o(es)f(extensiv)o(e)i
+(use)f(of)g(most)e(other)j(mo)q(dules.)312 1113 y(6.)20 b Fl(Generate)p
+Fp(:)28 b(This)19 b(mo)q(dule)f(con)o(tains)h(all)g(the)h(mo)o(v)o(e)d
+(generation)j(routines)g(re-)365 1163 y(quired)14 b(b)o(y)g(the)h(program.)
+312 1245 y(7.)20 b Fl(TimeCon)o(trol)p Fp(:)14 b(This)e(mo)q(dule)e(allo)q
+(cates,)i(adjusts)g(and)g(con)o(trols)g(the)g(time)f(used)365
+1295 y(b)o(y)j(the)g(program.)312 1376 y(8.)20 b Fl(P)o(osEv)m(al)p
+Fp(:)d(This)12 b(mo)q(dule)e(p)q(erforms)i(a)f(p)q(ositional)g(analysis)g(on)
+h(a)f(giv)o(en)h(p)q(osition.)365 1426 y(It)i(con)o(tains)g(most)f(horizon)g
+(no)q(de)i(ev)n(aluation)d(criteria.)312 1508 y(9.)20 b Fl(Planner)p
+Fp(:)14 b(This)d(mo)q(dule)d(considers)k(and)e(selects)j(plans)d(to)g(direct)
+h(the)g(searc)o(h)h(and)365 1557 y(up)q(dates)20 b(v)n(arious)e(w)o(eigh)o
+(tings)f(asso)q(ciated)j(with)e(Pc/Sq)h(tables)g(and)f(the)h(game)365
+1607 y(phase.)291 1689 y(10.)h Fl(SqAnalysis)p Fp(:)j(This)17
+b(mo)q(dule)f(incremen)o(tally)g(up)q(dates)i(the)g(attac)o(k)f(tables)h(and)
+365 1739 y(analyses)c(v)n(arious)g(attac)o(k)f(in)o(teractions)i(for)e(p)q
+(ositional)g(ev)n(aluation)f(purp)q(oses.)291 1820 y(11.)20
+b Fl(Mo)o(v)o(er)p Fp(:)g(This)15 b(mo)q(dule)e(mak)o(es)h(and)h(unmak)o(es)f
+(generated)i(mo)o(v)o(es.)k(It)15 b(also)g(con-)365 1870 y(trols)f(the)h
+(incremen)o(tal)e(up)q(dating)g(of)g(the)i(attac)o(k)f(tables.)291
+1951 y(12.)20 b Fl(Utils)p Fp(:)i(Pro)o(vides)17 b(v)n(arious)f(utilit)o(y)g
+(functions)g(whic)o(h)h(most)f(of)g(the)h(mo)q(dules)f(re-)365
+2001 y(quire.)262 2173 y Fr(6.3)69 b(Data)23 b(Structures)262
+2300 y Fp(The)16 b(data)g(structures)j(used)e(in)f(HIAR)o(CS)g(are)g(of)g
+(cen)o(tral)g(imp)q(ortance)g(to)g(the)h(o)o(v)o(erall)262
+2350 y(design)d(of)h(the)g(program.)k(They)c(de\014ne)h(to)f(a)f(large)g
+(exten)o(t)i(ho)o(w)f(in)o(telligen)o(t)e(the)j(in)o(ter-)262
+2399 y(nal)g(decisions)i(made)e(b)o(y)h(the)h(program)d(can)j(b)q(e.)29
+b(This)17 b(in)g(turn)g(largely)g(con)o(trols)g(the)262 2449
+y(kno)o(wledge)c(based)i(capabilities)e(of)g(the)h(program.)946
+2574 y(113)p eop
+%%Page: 114 116
+114 115 bop 324 307 a Fp(This)17 b(section)h(explains)f(the)h(main)d(data)i
+(structures)j(used,)f(the)f(reasons)g(for)f(their)262 357 y(giv)o(en)c(comp)q
+(osition)f(and)i(their)g(application)e(to)i(the)h(program.)262
+509 y Fu(6.3.1)55 b(P)n(osition)18 b(Represen)n(tation)262
+621 y Fp(The)c(p)q(osition)f(is)h(represen)o(ted)i(b)o(y)e(t)o(w)o(o)g
+(structures,)h(P)o(osition)f(and)f(Colour.)344 754 y(P)o(osition)88
+b(=)15 b(64)p Ff(f)p Fp(PieceT)o(yp)q(e)p Ff(g)p Fp(64)344
+803 y(PieceT)o(yp)q(e)49 b(=)15 b(NoPiece)f Ff(j)g Fp(P)o(a)o(wn)f
+Ff(j)h Fp(Knigh)o(t)f Ff(j)h Fp(Bishop)g Ff(j)f Fp(Ro)q(ok)g
+Ff(j)g Fp(Queen)i Ff(j)f Fp(King)344 853 y(NoPiece)90 b(=)15
+b(0)344 903 y(P)o(a)o(wn)136 b(=)15 b(1)344 953 y(Knigh)o(t)110
+b(=)15 b(2)344 1003 y(Bishop)112 b(=)15 b(3)344 1052 y(Ro)q(ok)140
+b(=)15 b(4)344 1102 y(Queen)122 b(=)15 b(5)344 1152 y(King)148
+b(=)15 b(6)344 1252 y(Colour)113 b(=)15 b(64)p Ff(f)p Fp(colour)p
+Ff(g)p Fp(64)344 1301 y(colour)125 b(=)15 b(White)e Ff(j)h
+Fp(Blac)o(k)f Ff(j)h Fp(None)344 1351 y(White)124 b(=)15 b(0)344
+1401 y(Blac)o(k)135 b(=)15 b(1)344 1451 y(None)143 b(=)15 b(2)262
+1569 y(These)f(t)o(w)o(o)e(structures)k(are)d(similar)d(to)j(the)g(ones)h
+(Shannon)f(originally)d(suggested.)19 b(The)262 1619 y(di\013erences)c
+(include)e(the)g(splitting)f(of)g(piece)i(t)o(yp)q(e)f(and)g(colour)g(to)f
+(enable)h(generic)h(mo)o(v)o(e)262 1669 y(generation)k(and)h(square)g(con)o
+(trol)g(functions.)32 b(Both)19 b(structures)j(are)d(linear)f(and)g(one)262
+1719 y(dimensional.)d(Note)e(that)g(no)f(o\013{b)q(oard)g(edge)i(is)e(used)i
+(on)e(this)h(b)q(oard,)f(as)h(an)f(alternate)262 1769 y(mo)o(v)o(e)i
+(generation)i(pro)q(cess)i(is)e(used.)25 b(This)16 b(enables)g(all)f(piece)i
+(square)g(tables)f(to)g(b)q(e)g(of)262 1818 y(a)d(signi\014can)o(tly)h
+(reduced)i(size)f(when)g(compared)e(to)h(a)g(10x12)f(b)q(oard)i(approac)o(h,)
+f(for)f(ex-)262 1868 y(ample.)j(Although)c(the)i(structures)h(are)f(one)f
+(dimensional)e(for)h(e\016ciency)m(,)h(conceptually)262 1918
+y(they)h(remain)e(t)o(w)o(o)i(dimensional.)324 2003 y(The)e(most)f(imp)q
+(ortan)o(t)f(reason)j(for)e(suc)o(h)i(a)f(64)f(elemen)o(t)h(structure)i(is)e
+(that)g(an)o(y)f(mo)o(v)o(e)262 2053 y(can)19 b(b)q(e)h(represen)o(ted)j(in)c
+(12)g(bits,)h(6)f(bits)h(for)f(the)h(from-square)f(and)g(6)g(bits)h(for)f
+(the)262 2103 y(to-square.)j(This)15 b(enables)h(sp)q(ecialised)f(searc)o(h)i
+(tables)e(to)g(b)q(e)h(used)g(whic)o(h)f(are)g(directly)262
+2153 y(accessed)h(b)o(y)e(the)g(12)g(bit)g(mo)o(v)o(e)e(v)n(alue.)18
+b(Additionally)m(,)11 b(it)j(allo)o(ws)f(a)g(complete)h(mo)o(v)o(e)e(de-)262
+2203 y(scription)d(including)g(mo)o(v)o(e)f(t)o(yp)q(e,)j(suc)o(h)g(as)f
+(castling,)f(pa)o(wn)h(promotion)d(etc,)12 b(to)d(b)q(e)i(stored)262
+2252 y(in)i(16)g(bits.)18 b(Th)o(us)d(mo)o(v)o(e)d(comparisons)h(and)g
+(copies)i(can)f(b)q(e)g(done)h(in)e(one)h(op)q(eration.)946
+2574 y(114)p eop
+%%Page: 115 117
+115 116 bop 262 307 a Fu(6.3.2)55 b(Game)17 b(T)-5 b(ree)344
+434 y Fp(T)m(ree)157 b(=)15 b(0)p Ff(f)p Fp(No)q(de)p Ff(g)p
+Fp(2000)344 483 y(No)q(de)142 b(=)15 b(Mo)o(v)o(e)e(+)h(Score)174
+b(/*)13 b(4)h(b)o(ytes)g(*/)344 533 y(Mo)o(v)o(e)139 b(=)15
+b(t)o(yp)q(e)f(+)g(mo)o(v)o(e)192 b(/*)13 b(4)h(bit)f(t)o(yp)q(e,)h(12)g(bit)
+f(mo)o(v)o(e)f(*/)344 583 y(mo)o(v)o(e)141 b(=)15 b(0..4095)297
+b(/*)13 b(12)h(bits)g(*/)344 633 y(t)o(yp)q(e)157 b(=)15 b(Capture)f
+Ff(j)f Fp(Promotion)f Ff(j)i Fp(Castle)g Ff(j)f Fp(EnP)o(assan)o(t)344
+683 y(Promotion)42 b(=)15 b(PQueen)g Ff(j)e Fp(PKnigh)o(t)h
+Ff(j)f Fp(PRo)q(ok)h Ff(j)f Fp(PBishop)344 732 y(Capture)89
+b(=)15 b(8)405 b(/*)13 b(bit)h(15)f(*/)344 782 y(PQueen)94
+b(=)15 b(4)405 b(/*)13 b(bit)h(14)f(*/)344 832 y(PKnigh)o(t)82
+b(=)15 b(5)405 b(/*)13 b(bit)h(14,12)e(*/)344 882 y(PRo)q(ok)112
+b(=)15 b(6)405 b(/*)13 b(bit)h(14,13)e(*/)344 932 y(PBishop)84
+b(=)15 b(7)405 b(/*)13 b(bit)h(14,13,12)d(*/)344 982 y(Castle)123
+b(=)15 b(2)405 b(/*)13 b(bit)h(13)f(*/)344 1031 y(EnP)o(assan)o(t)46
+b(=)15 b(1)405 b(/*)13 b(bit)h(12)f(*/)344 1081 y(Score)140
+b(=)15 b Ff(\000)p Fp(4096..4095)262 1208 y(A)o(t)f(least)g(part)h(of)e(the)i
+(game)e(tree)i(m)o(ust)f(b)q(e)g(stored)i(so)e(it)g(can)g(b)q(e)h(tra)o(v)o
+(ersed)h(e\016cien)o(tly)m(.)262 1258 y(This)j(structure)i(allo)o(ws)d(the)i
+(storage)g(of)f(no)q(des)h(generated,)i(but)d(not)h(y)o(et)f(visited)h(at)262
+1308 y(the)d(curren)o(t)h(searc)o(h)g(iteration.)25 b(Only)17
+b(the)g(no)q(des)g(generated)h(do)o(wn)f(the)g(curren)o(t)h(line)262
+1357 y(of)g(exploration)h(need)h(to)f(b)q(e)h(stored)g(as)f(these)i(are)f
+(the)f(ones)h(whic)o(h)f(ha)o(v)o(e)g(not)g(b)q(een)262 1407
+y(completely)11 b(searc)o(hed.)20 b(Eac)o(h)13 b(no)q(de)g(is)g(only)f
+(generated)j(once)e(at)g(eac)o(h)h(iteration)e(except)262 1457
+y(when)j(a)g(fail)f(high)g(or)h(lo)o(w)f(o)q(ccurs.)23 b(While)15
+b(storage)g(of)g(the)g(whole)g(tree)i(w)o(ould)d(sligh)o(tly)262
+1507 y(impro)o(v)o(e)f(p)q(erformance,)h(it)h(w)o(ould)f(b)q(e)i(extremely)e
+(costly)i(in)e(terms)h(of)f(memory)f(usage,)262 1557 y(particularly)g(in)g
+(the)i(endgame.)324 1642 y(T)m(ogether)f(with)f(the)h(mo)o(v)o(e)d(stored)k
+(at)e(eac)o(h)h(no)q(de,)f(a)g(score)i(is)e(used)h(to)g(enable)f(mo)o(v)o(e)
+262 1692 y(ordering)g(at)h(in)o(ternal)g(no)q(des)g(of)g(the)g(searc)o(h)h
+(tree.)262 1914 y Fu(6.3.3)55 b(T)-5 b(ransp)r(osition)18 b(T)-5
+b(able)262 2026 y Fp(In)17 b(c)o(hess,)i(the)f(game)e(tree)j(is)e(really)g(a)
+h(directed)g(graph)g(of)f(mo)o(v)o(es.)27 b(As)18 b(the)g(depth)g(of)262
+2076 y(searc)o(h)13 b(increases,)g(the)g(n)o(um)o(b)q(er)e(of)g(p)q(oten)o
+(tial)h(transp)q(ositions)g(increases)h(exp)q(onen)o(tially)m(.)262
+2126 y(Additionally)m(,)k(when)j(using)f(an)f(iterativ)o(e)i(deep)q(ening)g
+(searc)o(h,)h(the)f(no)q(des)g(visited)f(at)262 2176 y(iteration)13
+b Fh(n)c Ff(\000)h Fp(1)k(are)g(also)f(usually)g(visited)h(at)g(iteration)g
+Fh(n)p Fp(.)k(Therefore,)d(the)f(transp)q(osi-)262 2226 y(tion)f(table)i(pro)
+o(vides)f(a)g(useful)h(w)o(a)o(y)e(of)h(storing)g(and)h(retrieving)f
+(previously)g(calculated)262 2275 y(mo)o(v)o(es)h(and)i(scores.)28
+b(F)m(or)17 b(deep)q(er)h(searc)o(hes)h(\(depth)f Fh(>)f Fp(5\))f(a)h(transp)
+q(osition)g(table)f(can)262 2325 y(signi\014can)o(tly)10 b(impro)o(v)o(e)f
+(the)j(p)q(erformance)g(of)e(a)i(program.)j(This)c(is)h(particularly)e
+(eviden)o(t)262 2375 y(in)j(the)h(endgame)f(where)i(m)o(uc)o(h)e(deep)q(er)j
+(searc)o(hes)g(are)e(p)q(ossible.)946 2574 y(115)p eop
+%%Page: 116 118
+116 117 bop 344 357 a Fp(T)m(ransT)m(able)21 b(=)14 b(1)p Ff(f)p
+Fp(T)m(ableEn)o(try)p Ff(g)p Fp(32768)344 407 y(T)m(ableEn)o(try)20
+b(=)14 b(HashLo)q(c)o(k)g(+)g(HMo)o(v)o(e)g(+)g(TScore)344
+457 y(HashLo)q(c)o(k)47 b(=)14 b(long)f(in)o(teger)390 b(/*)14
+b(32)f(bits)h(*/)344 506 y(HMo)o(v)o(e)97 b(=)14 b(Depth)g(+)g(mo)o(v)o(e)344
+556 y(TScore)99 b(=)14 b(T)o(yp)q(e)g(+)g(Score)354 b(/*)14
+b(3)f(bit)h(t)o(yp)q(e,)g(13)f(bit)h(score)h(*/)344 606 y(Depth)113
+b(=)14 b(0..15)516 b(/*)14 b(4)f(bits)h(*/)344 656 y(T)o(yp)q(e)132
+b(=)14 b(Lo)q(c)o(k)o(ed)g(+)g(T)m(rueScore)h(+)f(Bound)56
+b(/*)14 b(MS)g(3)f(bits)h(of)f(TScore)i(*/)344 706 y(Lo)q(c)o(k)o(ed)98
+b(=)14 b(8)582 b(/*)14 b(bit)f(15)g(*/)344 756 y(T)m(rueScore)45
+b(=)14 b(4)582 b(/*)14 b(bit)f(14)g(*/)344 805 y(Bound)106
+b(=)14 b(2)582 b(/*)14 b(bit)f(13,)g(set)i(if)e(Upp)q(erBound)i(*/)1218
+855 y(/*)f(unset)g(if)g(Lo)o(w)o(erBound)g(*/)262 964 y(This)19
+b(data)f(structure)k(represen)o(ts)f(the)f(transp)q(osition)f(table)g(used)h
+(b)o(y)f(HIAR)o(CS)g(5.0.)262 1013 y(Eac)o(h)14 b(en)o(try)g(stores)h(5)f
+(distinct)g(t)o(yp)q(es)h(of)e(information:)312 1086 y(1.)20
+b(P)o(osition)13 b(lo)q(c)o(k.)312 1164 y(2.)20 b(V)m(alue)14
+b(of)f(the)h(p)q(osition.)312 1242 y(3.)20 b(Best)c(mo)o(v)o(e)c(kno)o(wn)h
+(in)h(the)g(p)q(osition.)312 1320 y(4.)20 b(Depth)15 b(of)e(the)h(subtree)i
+(from)c(whic)o(h)i(the)g(v)n(alue)g(is)f(calculated.)312 1398
+y(5.)20 b(Flags)14 b(indicating)e(the)j(score)g(t)o(yp)q(e)f(relativ)o(e)g
+(to)g(the)g Fh(\013\014)j Fp(windo)o(w.)262 1504 y Fl(T)l(able)e(Access)262
+1616 y Fp(The)c(access)h(metho)q(d)e(used)h(is)g(similar)d(to)i(the)h(one)g
+(prop)q(osed)h(b)o(y)e(Zobrist)h([63)o(].)16 b(A)11 b(set)h(S)e(of)262
+1666 y(2x2x6x64)i(randomly)h(generated)j(32)d(bit)i(in)o(tegers)g(are)g(used)
+g(to)f(represen)o(t)j(all)c(p)q(ossible)262 1716 y(piece/square)k(com)o
+(binations)d(\(2)j(in)o(tegers)g(p)q(er)g(square;)h(2)e(colours;)h(6)f(piece)
+h(t)o(yp)q(es;)h(64)262 1766 y(squares\).)324 1851 y(A)c(single)f(hash)h
+(index)g(can)g(then)h(b)q(e)f(calculated)g(for)g(an)o(y)f(p)q(osition)h(b)o
+(y)f(applying:)347 1936 y Ff(8)p Fh(col)q(;)7 b(pc;)g(sq)48
+b(H)619 1942 y Fe(i)644 1936 y Fp(=)12 b Fh(H)723 1942 y Fe(i)748
+1936 y Fm(xor)k Fh(S)847 1942 y Fe(col;pc;sq)324 1986 y Fp(where)373
+2036 y(P)o(osition[sq])c(=)j(p)q(c)f Fl(and)f Fp(Colour[sq])g(=)h(col)324
+2121 y(The)e(hash)f(indexes)h(are)g(actually)f(incremen)o(tally)f(up)q(dated)
+i(in)f(HIAR)o(CS.)f(F)m(or)h(exam-)262 2171 y(ple,)i(to)h(mo)o(v)o(e)e(from)g
+(square)j Fm(fsq)e Fp(to)h(square)h Fm(tsq)p Fp(,)e(the)h(follo)o(wing)e(op)q
+(eration)h(is)h(required:)608 2285 y Fh(H)643 2291 y Fe(i)p
+Fk(2)684 2285 y Fp(=)e(\()p Fh(H)779 2291 y Fe(i)p Fk(1)821
+2285 y Fm(xor)k Fh(S)920 2291 y Fe(col;pc;f)s(sq)1068 2285
+y Fp(\))c Fm(xor)28 b Fh(S)1207 2291 y Fe(col;pc;tsq)324 2399
+y Fp(Captures,)c(pa)o(wn)e(promotion,)f(en-passan)o(t)h(and)g(castling)f(all)
+g(use)h(a)g(similar,)e(if)262 2449 y(sligh)o(tly)12 b(more)h(complex)g
+(approac)o(h.)946 2574 y(116)p eop
+%%Page: 117 119
+117 118 bop 324 307 a Fp(Using)14 b(t)o(w)o(o)g(32)h(bit)f(hash)h(indexes,)g
+(direct)h(transp)q(osition)e(table)h(access)h(is)f(p)q(ossible.)262
+357 y(The)g(\014rst)g(index)g(is)f(used)h(to)g(access)h(the)g(table)e(and)g
+(the)i(second)f(is)g(used)g(as)g(a)f(p)q(osition)262 407 y(lo)q(c)o(k)d(to)g
+(c)o(hec)o(k)i(that)f(the)g(correct)h(en)o(try)f(has)g(b)q(een)h(accessed)h
+(and)d(reduce)j(the)e(p)q(ossibilit)o(y)262 457 y(of)h(an)g(undetected)k
+(collision.)324 542 y(Unlik)o(e)10 b(normal)e(hashing,)i(only)g(one)h(table)f
+(access)i(is)f(tried.)17 b(This)10 b(mak)o(es)g(the)h(pro)q(cess)262
+592 y(b)q(oth)k(simpler)f(and)h(more)f(e\016cien)o(t.)22 b(Additionally)m(,)
+13 b(the)j(table)f(is)g(split)g(in)o(to)f(t)o(w)o(o)h(halfs,)262
+641 y(one)c(half)e(for)i(white)g(to)g(pla)o(y)f(p)q(ositions)g(and)h(the)g
+(other)h(half)e(for)g(blac)o(k)h(to)f(pla)o(y)g(p)q(ositions.)262
+784 y Fl(En)o(try)k(Storage)262 896 y Fp(No)q(de)j(attributes)h(are)g(stored)
+g(in)f(the)h(transp)q(osition)f(table)g(as)g(the)h(no)q(de)g(is)f(ab)q(out)g
+(to)262 946 y(bac)o(k)11 b(up)g(its)h(results)g(to)f(its)h(paren)o(t)g(no)q
+(de.)17 b(The)12 b(en)o(try)g(is)f Fl(not)f Fp(stored)j(if)d(it)h(will)f(o)o
+(v)o(erwrite)262 996 y(an)k(existing)g(en)o(try)h(whose)g(information)d(is)i
+(the)h(result)h(of)e(a)g(subtree)i(searc)o(h)g(of)e(greater)262
+1046 y(depth.)38 b(Therefore,)23 b(eac)o(h)d(en)o(try)h(stored)h(is)e
+(privileged)g(dep)q(ending)h(on)f(the)h(subtree)262 1095 y(depth.)34
+b(As)20 b(v)n(alues)f(deriv)o(ed)h(from)d(a)i(deep)i(searc)o(h)f(can)f
+(constitute)i(a)e(great)g(deal)g(of)262 1145 y(e\013ort,)14
+b(this)g(is)f(a)h(signi\014can)o(t)f(impro)o(v)o(emen)o(t)f(o)o(v)o(er)h(a)h
+(simple)e(replacemen)o(t)i(algorithm.)324 1230 y(The)g(p)q(osition)e(score)j
+(stored)f(in)f(an)g(en)o(try)h(ma)o(y)d(b)q(e)j(a)f(true)h(score)h(or)e(a)g
+(score)h(outside)262 1280 y(the)g(curren)o(t)i Fh(\013\014)h
+Fp(windo)o(w,)c(i.e.)18 b(a)c(cut)h(o\013.)k(In)14 b(the)h(latter)g(case,)g
+(the)f(score)i(represen)o(ts)h(a)262 1330 y(searc)o(h)e(b)q(ound)f(whic)o(h)g
+(ma)o(y)e(b)q(e)j(used)g(to)f(narro)o(w)g(an)g Fh(\013\014)j
+Fp(windo)o(w)c(if)g(retriev)o(ed.)21 b(Hence,)262 1380 y(the)14
+b(score)h(t)o(yp)q(e)g(is)e(also)h(stored)g(in)g(the)g(en)o(try)m(.)324
+1465 y(The)f(b)q(est)i(kno)o(wn)d(mo)o(v)o(e)g(from)f(the)j(curren)o(t)h(no)q
+(de)e(is)g(also)g(stored)h(to)f(impro)o(v)o(e)e(mo)o(v)o(e)262
+1515 y(ordering)i(on)h(retriev)n(al.)262 1657 y Fl(En)o(try)g(Retriev)m(al)
+262 1769 y Fp(When)e(a)h(no)q(de)g(in)f(the)h(main)e(searc)o(h)j(is)e
+(visited,)h(the)g(transp)q(osition)g(table)f(is)h(c)o(hec)o(k)o(ed)h(to)262
+1819 y(see)g(if)e(an)h(en)o(try)g(for)g(the)g(curren)o(t)i(p)q(osition)d
+(exists.)19 b(If)12 b(an)h(en)o(try)h(exists,)f(it)g(is)f(c)o(hec)o(k)o(ed)j
+(to)262 1869 y(see)e(if)f(it)g(is)h(storing)f(information)e(with)i(a)g(searc)
+o(h)i(depth)f(equal)f(or)h(greater)g(to)g(the)g(depth)262 1919
+y(required)h(for)g(this)g(searc)o(h.)19 b(If)14 b(so,)f(the)h(en)o(try)h(can)
+f(b)q(e)h(retriev)o(ed.)324 2004 y(Once)j(retriev)o(ed,)h(the)e(en)o(try's)h
+(p)q(osition)e(score)j(can)e(b)q(e)g(used.)29 b(Dep)q(ending)17
+b(on)g(the)262 2054 y(score's)e(t)o(yp)q(e,)e(3)h(outcomes)f(are)i(p)q
+(ossible.)312 2169 y(1.)20 b Fl(T)l(rue)c(Score)p Fp(:)i(The)d(v)n(alue)f
+(stored)h(is)g(an)f(exactly)g(calculated)h(v)n(alue.)k(Therefore,)365
+2219 y(the)c(v)n(alue)e(of)g(this)h(no)q(de)g(and)g(its)f(subtree)j(is)e(kno)
+o(wn)f(\(for)h(the)g(required)h(depth)f(of)365 2268 y(searc)o(h\))h(and)f
+(can)g(b)q(e)h(returned)g(to)f(its)g(paren)o(t)g(no)q(de)h(without)e(searc)o
+(hing.)312 2350 y(2.)20 b Fl(Upp)q(er)11 b(Bound)p Fp(:)k(The)c(v)n(alue)f
+(stored)h(is)f(not)h(exact,)g(it)f(w)o(as)h(the)g(result)g(of)f(a)h(cut)g
+(o\013)365 2399 y(in)h(the)h(subtree)h(b)q(elo)o(w)e(the)g(no)q(de)h(whic)o
+(h)f(stored)h(it.)k(Therefore,)d(the)e(v)n(alue)g(of)g(this)365
+2449 y(no)q(de)k(is)f(not)h(kno)o(wn,)e(ho)o(w)o(ev)o(er,)i(the)g(v)n(alue)f
+(stored)h(can)f(b)q(e)h(used)h(to)e(narro)o(w)g(the)946 2574
+y(117)p eop
+%%Page: 118 120
+118 119 bop 365 307 a Fp(curren)o(t)15 b Fh(\013\014)g Fp(windo)o(w)d(b)o(y)h
+(p)q(ossibly)g(reducing)g(the)h Fh(\014)h Fp(v)n(alue)e(and)f(p)q(erhaps)i
+(thereb)o(y)365 357 y(causing)g(a)g(cut)g(o\013.)312 440 y(3.)20
+b Fl(Lo)o(w)o(er)f(Bound)p Fp(:)24 b(The)18 b(v)n(alue)f(stored)h(is)g(not)f
+(an)g(exact)i(v)n(alue,)e(only)g(a)g(b)q(ound.)365 490 y(The)h(v)n(alue)f
+(can,)h(ho)o(w)o(ev)o(er,)g(b)q(e)g(used)g(to)f(narro)o(w)h(the)g
+Fh(\013\014)h Fp(windo)o(w)e(b)o(y)g(p)q(ossibly)365 540 y(increasing)d(the)h
+Fh(\013)e Fp(v)n(alue)h(and)f(p)q(erhaps)i(thereb)o(y)g(causing)f(a)g(cut)g
+(o\013.)324 658 y(Assuming)g(the)i(no)q(de)g(is)f(not)g(terminated)g(b)o(y)g
+(a)g(true)h(score)g(or)g(cut)g(o\013,)f(the)h(stored)262 708
+y(mo)o(v)o(e)f(can)i(b)q(e)h(retriev)o(ed)g(and)f(searc)o(hed)h(\014rst)g
+(from)d(this)i(no)q(de.)28 b(This)17 b(should)f(signi\014-)262
+758 y(can)o(tly)10 b(impro)o(v)o(e)g(mo)o(v)o(e)f(ordering)i(as)g(this)g(is)g
+(v)o(ery)h(lik)o(ely)d(to)i(b)q(e)h(the)g(b)q(est)g(mo)o(v)o(e)d(a)o(v)n
+(ailable.)262 901 y Fl(Op)q(ening)k(Bo)q(ok)262 1013 y Fp(This)18
+b(transp)q(osition)g(table)g(is)g(initially)e(loaded)i(with)g(an)g('Op)q
+(ening)g(Bo)q(ok')g(of)g(mo)o(v)o(es)262 1063 y(b)q(efore)g(the)g(game)e(b)q
+(egins.)30 b(This)17 b(allo)o(ws)g(the)h(program)e(to)h('kno)o(w')f(ab)q(out)
+i(particular)262 1113 y(op)q(ening)f(sequences)k(commonly)15
+b(pla)o(y)o(ed)i(b)o(y)h(strong)g(c)o(hess)i(pla)o(y)o(ers.)30
+b(Instead)19 b(of)e(just)262 1163 y(mo)o(v)o(e)8 b(sequences)13
+b(b)q(eing)d(stored,)i(p)q(ositions)e(and)g(asso)q(ciated)h(mo)o(v)o(es)e
+(are)i(stored)g(enabling)262 1212 y(the)j(program)e(to)i(detect)i(an)o(y)d
+(transp)q(osition)h(of)f(mo)o(v)o(es.)k(This)d(a)o(v)o(oids)f(cases)i(where)g
+(the)262 1262 y(opp)q(onen)o(t)i(can)g(fo)q(ol)f(the)h(program)f(b)o(y)g(pla)
+o(ying)g(mo)o(v)o(es)f(in)i(an)g(un)o(usual)f(sequence.)30
+b(In)262 1312 y(fact,)12 b(sometimes)e(in)i(the)g(op)q(ening)g(the)h(program)
+e(will)f(transp)q(ose)k(in)o(to)d(another)i(op)q(ening)262
+1362 y(itself,)d(e.g.)16 b(transp)q(osing)10 b(from)f(an)g(English)h(op)q
+(ening)g(in)o(to)f(a)h(Queen's)h(Gam)o(bit)d(Declined.)262
+1513 y Fu(6.3.4)55 b(Refutation)18 b(T)-5 b(able)344 1640 y
+Fp(RefutationT)m(able)60 b(=)14 b(1)p Ff(f)p Fp(V)m(ariation)p
+Ff(g)p Fp(128)344 1690 y(V)m(ariation)185 b(=)14 b(1)p Ff(f)p
+Fp(mo)o(v)o(e)p Ff(g)p Fp(32)262 1816 y(The)f(refutation)f(table)h(is)g(used)
+h(to)e(store)i(the)g(exp)q(ected)g(con)o(tin)o(uation)e(follo)o(wing)f(eac)o
+(h)i(1)262 1866 y(ply)f(mo)o(v)o(e.)k(Some)c(of)g(the)h(v)n(ariations)f(will)
+f(represen)o(t)16 b(the)d(b)q(est)h(line)f(of)f(pla)o(y)m(,)f(others)j(will)
+262 1916 y(represen)o(t)i(the)e(v)n(ariation)e(whic)o(h)i(refuted)h(the)g(1)e
+(ply)h(mo)o(v)o(e)e(\(hence)j(the)g(name\).)324 2001 y(Ev)o(ery)21
+b(mo)o(v)o(e)d(searc)o(hed)23 b(at)d(iteration)g(n)g(has)h(its)f(exp)q(ected)
+j(con)o(tin)o(uation)c(sa)o(v)o(ed.)262 2051 y(During)10 b(iteration)h(n+1,)h
+(or)f(a)g(re-searc)o(h,)i(the)f(exp)q(ected)i(con)o(tin)o(uation)c(is)h
+(searc)o(hed)i(\014rst.)262 2101 y(This)h(helps)i(to)f(drastically)f(impro)o
+(v)o(e)f Fh(\013\014)k Fp(cut)f(o\013s)f(b)o(y)g(guiding)e(the)j(searc)o(h)g
+(do)o(wn)f(lines)262 2151 y(whic)o(h)f(are)i(lik)o(ely)d(to)i(refute)h(the)f
+(1)g(ply)f(mo)o(v)o(e)f(or)i(at)g(least)g(prime)e Fh(\013\014)18
+b Fp(with)c(reasonable)262 2201 y(v)n(alues.)946 2574 y(118)p
+eop
+%%Page: 119 121
+119 120 bop 262 307 a Fu(6.3.5)55 b(The)18 b(History)g(Heuristic)344
+434 y Fp(HistoryT)191 b(=)14 b(8192)p Ff(f)p Fp(V)m(alue)p
+Ff(g)p Fp(8192)344 483 y(V)m(alue)253 b(=)14 b(0..65535)262
+597 y(The)f(History)g(Heuristic)h([50)o(])e(main)o(tains)f(a)h(record)j(of)d
+(ev)o(ery)i(mo)o(v)o(e's)d(abilit)o(y)g(to)i(cause)h(a)262
+647 y(refutation.)22 b(The)16 b(table)f(is)h(split)f(in)o(to)g(t)o(w)o(o)g
+(halfs;)g(one)h(half)e(for)h(white)h(mo)o(v)o(es)e(and)h(one)262
+697 y(half)h(for)i(blac)o(k)f(mo)o(v)o(es.)28 b(It)18 b(is)g(indexed)g(b)o(y)
+f(the)i(12)e(bit)g(mo)o(v)o(e)f(v)n(alue)i(whic)o(h)f(uniquely)262
+747 y(iden)o(ti\014es)d(an)o(y)f(mo)o(v)o(e)609 732 y Fk(2)626
+747 y Fp(.)18 b(Therefore,)d(a)f(total)f(of)g(8192)g(table)h(en)o(tries)h
+(are)f(required.)324 832 y(A)o(t)h(ev)o(ery)g(in)o(terior)g(no)q(de)g(of)f
+(the)i(main)d(searc)o(h,)i(the)h(b)q(est)g(mo)o(v)o(e)d(found)h(is)h
+(recorded)262 882 y(in)f(the)i(history)f(table)g(b)o(y)g(mo)q(difying)e(the)j
+(appropriate)f(v)n(alue.)21 b(The)16 b(v)n(alue)e(is)i(actually)262
+932 y(mo)q(di\014ed)11 b(b)o(y)h(2)507 917 y Fe(d)526 932 y
+Fp(,)g(where)i(d)e(is)h(the)g(minim)n(um)8 b(depth)13 b(of)f(the)h(subtree)i
+(b)q(elo)o(w)d(the)h(deriv)o(ed)262 981 y(b)q(est)i(mo)o(v)o(e.)324
+1067 y(A)o(t)e(the)g(b)q(eginning)f(of)g(the)h(game)f(the)h(history)g(table)f
+(has)h(all)f(its)g(en)o(tries)i(set)g(to)e(zero.)262 1116 y(Sc)o(hae\013er)18
+b([50)o(])f(suggests)h(that)f(the)h(table)f(is)g(reset)h(in)f(this)g(w)o(a)o
+(y)f(at)h(the)h(start)g(of)e(eac)o(h)262 1166 y(new)e(searc)o(h.)21
+b(Ho)o(w)o(ev)o(er,)14 b(in)g(HIAR)o(CS,)g(the)h(table)f(is)g(not)h(reset)h
+(b)q(et)o(w)o(een)f(searc)o(hes,)h(but)262 1216 y(adjusted.)27
+b(Eac)o(h)17 b(mo)o(v)o(e's)e(v)n(alue)h(is)h(adjusted)g(b)o(y)g(dividing)e
+(it)i(b)o(y)f(4.)27 b(This)16 b(allo)o(ws)g(the)262 1266 y(table)d(to)h(ha)o
+(v)o(e)g(some)f(in\015uence)i(on)e(the)i(next)f(searc)o(h.)324
+1351 y(The)19 b(history)g(heuristic)h(is)f(applied)g(at)g(eac)o(h)h(in)o
+(terior)f(no)q(de)g(of)g(the)g(main)e(searc)o(h)262 1401 y(where)d(mo)o(v)o
+(e)e(generation)h(is)g(required.)19 b(As)13 b(mo)o(v)o(es)f(are)i(generated,)
+g(their)g(history)f(v)n(alue)262 1451 y(is)g(lo)q(ok)o(ed)g(up)g(in)g(the)h
+(history)g(table)f(and)g(encorp)q(orated)i(in)o(to)e(a)g(sp)q(ecial)h(mo)o(v)
+o(e)e(ordering)262 1501 y(score.)19 b(See)c(section)f(6.4.2)e(for)i(more)f
+(details.)262 1650 y Fu(6.3.6)55 b(Incremen)n(tal)16 b(A)n(ttac)n(k)j(T)-5
+b(ables)344 1776 y Fp(A)o(ttac)o(kT)143 b(=)15 b(64)p Ff(f)p
+Fp(A)o(ttac)o(kEn)o(try)p Ff(g)p Fp(64)344 1826 y(/*)f(16)f(b)o(yte)h(en)o
+(try)h(*/)344 1876 y(A)o(ttac)o(kEn)o(try)69 b(=)15 b(A)o(ttac)o(kCo)q(de)f
+(+)g(Coun)o(t)g(+)g(PieceList)344 1926 y(/*)g(16)f(bit)g(attac)o(k)h(co)q(de)
+h(*/)344 1976 y(A)o(ttac)o(kCo)q(de)80 b(=)15 b(P)o(ad)e(+)h(A)o(ttP)h(+)f(A)
+o(ttN)g(+)g(A)o(ttB)h(+)f(A)o(ttR)g(+)g(A)o(ttQ)g(+)g(A)o(ttK)344
+2026 y(P)o(ad)224 b(=)15 b(0)344 2075 y(A)o(ttP)205 b(=)15
+b(0..3)218 b(/*)14 b(Num)o(b)q(er)f(of)g(pa)o(wn)h(attac)o(ks,)f(2)h(bits)g
+(*/)344 2125 y(A)o(ttN)202 b(=)15 b(0..7)218 b(/*)14 b(Num)o(b)q(er)f(of)g
+(knigh)o(t)g(attac)o(ks,)h(3)g(bits)g(*/)344 2175 y(A)o(ttB)204
+b(=)15 b(0..7)218 b(/*)14 b(Num)o(b)q(er)f(of)g(bishop)h(attac)o(ks,)g(3)f
+(bits)h(*/)344 2225 y(A)o(ttR)202 b(=)15 b(0..7)218 b(/*)14
+b(Num)o(b)q(er)f(of)g(ro)q(ok)h(attac)o(ks,)g(3)f(bits)h(*/)344
+2275 y(A)o(ttQ)201 b(=)15 b(0..7)218 b(/*)14 b(Num)o(b)q(er)f(of)g(queen)i
+(attac)o(ks,)f(3)f(bits)h(*/)344 2324 y(A)o(ttK)201 b(=)15
+b(0..1)218 b(/*)14 b(Num)o(b)q(er)f(of)g(king)g(attac)o(ks,)h(1)g(bit)f(*/)
+344 2374 y(Coun)o(t)183 b(=)15 b(0..255)176 b(/*)14 b(Coun)o(t)f(of)g(attac)o
+(ks)i(*/)p 262 2411 573 2 v 308 2437 a Fj(2)325 2449 y Fi(although)9
+b(not)i(the)g(mo)o(v)o(e's)e(t)o(yp)q(e)946 2574 y Fp(119)p
+eop
+%%Page: 120 122
+120 121 bop 344 307 a Fp(PieceList)131 b(=)15 b(13)p Ff(f)p
+Fp(A)o(ttSq)p Ff(g)p Fp(13)51 b(/*)14 b(List)f(of)h(attac)o(king)f(pieces)i
+(*/)344 357 y(A)o(ttSq)188 b(=)15 b(square)168 b(/*)14 b(Square)g(of)f(piece)
+i(attac)o(king)e(this)h(sq)g(*/)344 407 y(square)179 b(=)15
+b(0..63)262 534 y(Tw)o(o)20 b(attac)o(k)h(tables)g(are)g(main)o(tained,)f
+(one)h(for)f(white)h(attac)o(ks)g(and)g(one)g(for)f(blac)o(k)262
+583 y(attac)o(ks.)j(These)17 b(tables)f(represen)o(t)i(p)q(erhaps)e(the)h
+(most)d(imp)q(ortan)o(t)g(data)h(structure)j(in)262 633 y(the)d(program.)j
+(Eac)o(h)d(table)g(records)h(all)e(the)h(attac)o(ks)g(b)o(y)f(a)h(giv)o(en)f
+(colour)g(on)h(eac)o(h)g(and)262 683 y(ev)o(ery)k(square.)31
+b(Additionally)m(,)17 b(a)h(list)f(of)h(eac)o(h)h(piece)g(attac)o(king)e(eac)
+o(h)i(square)g(is)f(also)262 733 y(main)o(tained.)324 818 y(This)f(table,)g
+(allo)o(ws)f(complex)g(in)o(ter{piece)j(calculations)d(whic)o(h)h(w)o(ould)g
+(otherwise)262 868 y(b)q(e)e(v)o(ery)g(time)e(consuming.)20
+b(F)m(or)14 b(example,)f(it)i(is)f(a)h(simple)e(matter)h(to)h(\014nd)f(the)i
+(square)262 918 y(o)q(ccupied)k(b)o(y)g(a)g(c)o(hec)o(king)g(piece;)k(in)19
+b(turn)h(it)g(is)g(simple)e(to)i(calculate)g(whether)i(this)262
+968 y(c)o(hec)o(king)14 b(piece)g(is)g(itself)g(threatened)h(with)f(capture.)
+324 1053 y(The)d(ev)n(aluation)e(function)h(mak)o(es)f(extensiv)o(e)i(use)g
+(of)f(the)h(attac)o(k/defence)h(balance)e(of)262 1103 y(eac)o(h)j(square.)18
+b(Therefore,)13 b(these)h(tables)f(are)g(of)f(cen)o(tral)h(imp)q(ortance)f
+(to)g(the)h(ev)n(aluation)262 1152 y(function)k(as)h(they)g(allo)o(w)e(it)i
+(to)f(mak)o(e)g(v)n(arious)g(p)q(ositional)f(ev)n(aluations)h(whic)o(h)g(w)o
+(ould)262 1202 y(otherwise)d(b)q(e)h(far)e(to)q(o)h(time)f(consuming.)324
+1287 y(These)18 b(tables)g(also)e(con)o(tribute)i(to)f(the)h(mo)o(v)o(e)d
+(generation)i(and)g(in)g(particular)g(the)262 1337 y(legal)11
+b(c)o(hec)o(k)i(ev)n(asion)f(and)g(capture)i(mo)o(v)o(e)c(generation)j
+(routines)g(of)e(the)i(program.)j(They)262 1387 y(are)e(also)f(imp)q(ortan)o
+(t)f(in)h(the)i(mo)o(v)o(e)d(ordering)i(pro)q(cess)i(b)q(ecause)f
+(information)c(ab)q(out)j(at-)262 1437 y(tac)o(k)o(ed)e(squares)h(is)f(used)i
+(to)e(order)g(mo)o(v)o(es)f(according)i(to)f(ho)o(w)f(reasonable)i(they)g
+(app)q(ear.)262 1487 y(F)m(or)h(example,)f(mo)o(ving)f(an)j(en-prise)g(piece)
+h(or)e(capturing)h(an)g(undefended)h(piece)f(is)g(or-)262 1537
+y(dered)k(higher)f(than)g(mo)o(ving)e(a)i(piece)h(to)f(a)g(square)g(where)i
+(it)d(will)g(b)q(e)i(en-prise.)32 b(See)262 1586 y(section)14
+b(6.4.2)e(for)i(more)f(details.)324 1672 y(All)f(this)h(attac)o(k)h(orien)o
+(ted)f(information)e(is)i(far)g(to)q(o)g(time)f(consuming)g(to)h(regenerate)
+262 1721 y(at)e(eac)o(h)g(new)h(no)q(de.)17 b(In)12 b(fact,)f(eac)o(h)h(mo)o
+(v)o(e)d(only)h(c)o(hanges)i(some)f(of)f(the)i(attac)o(k)f(prop)q(erties)262
+1771 y(of)i(a)h(p)q(osition.)k(F)m(or)13 b(example,)g(in)g(the)i(op)q(ening)f
+(p)q(osition,)f(the)i(mo)o(v)o(e)d(e4)i(w)o(ould)g(require)262
+1821 y(only)h(the)j(attac)o(ks)f(of)f(the)h(white)g(queen,)g(king's)f(bishop)
+h(and)f(king's)g(pa)o(wn)g(to)h(b)q(e)g(ad-)262 1871 y(justed.)24
+b(Therefore,)17 b(an)e(incremen)o(tal)g(approac)o(h)h(seems)f(to)h(b)q(e)g(w)
+o(arran)o(ted.)24 b(Although)262 1921 y(there)17 b(are)g(mo)o(v)o(es)e(whic)o
+(h)h(mak)o(e)f(this)h(incremen)o(tal)f(approac)o(h)h(v)o(ery)h(complex,)e
+(e.g.)25 b(an)262 1970 y(en-passan)o(t)18 b(mo)o(v)o(e;)f(and)h(the)g
+(programming)c(of)j(suc)o(h)h(an)g(approac)o(h)f(is)h(v)o(ery)g(tric)o(ky)m
+(,)g(I)262 2020 y(ha)o(v)o(e)13 b(found)h(it)f(to)h(b)q(e)g(v)o(ery)h(cost)f
+(e\013ectiv)o(e.)324 2105 y(The)19 b(added)f(information)e(a)o(v)n(ailable)g
+(at)i(all)f(no)q(des)i(is)f(extremely)g(useful)g(and)g(has)262
+2155 y(man)o(y)13 b(applications,)g(some)i(of)f(whic)o(h)h(ha)o(v)o(e)g(b)q
+(een)h(sho)o(wn.)21 b(In)16 b(fact,)e(I)h(feel)g(the)h(full)e(p)q(o-)262
+2205 y(ten)o(tial)9 b(of)h(ha)o(ving)f(suc)o(h)i(a)f(w)o(ealth)h(of)e
+(information)f(has)i(not)h(as)f(y)o(et)h(b)q(een)g(fully)e(exploited.)262
+2255 y(I)14 b(do)h(not)f(kno)o(w)h(of)f(an)o(y)g(other)h(c)o(hess)i(programs)
+c(whic)o(h)i(incremen)o(tally)e(main)o(tain)f(suc)o(h)262 2305
+y(a)h(comprehensiv)o(e)h(attac)o(k)g(table)g(throughout)g(the)g(searc)o(h.)
+946 2574 y(120)p eop
+%%Page: 121 123
+121 122 bop 262 307 a Fu(6.3.7)55 b(Game)17 b(History)344 434
+y Fp(GameHistory)53 b(=)63 b(0)p Ff(f)p Fp(Mo)o(v)o(eRecord)p
+Ff(g)p Fp(512)344 483 y(Mo)o(v)o(eRecord)71 b(=)63 b(GMo)o(v)o(e)13
+b(+)h(GScore)h(+)f(CPiece)h(+)f(CColour)f(+)h(EPsq)h(+)734
+533 y(Dra)o(wmn)d(+)i(Depth)g(+)h(UTime)d(+)i(No)q(des)h(+)f(Ev)n(al)f(+)734
+583 y(Hash1)h(+)g(Hash2)344 633 y(GMo)o(v)o(e)165 b(=)63 b(Mo)o(v)o(e)344
+683 y(GScore)166 b(=)63 b(Score)344 732 y(CPiece)171 b(=)63
+b(PieceT)o(yp)q(e)344 782 y(CColour)142 b(=)63 b(colour)344
+832 y(EPsq)201 b(=)63 b(square)344 882 y(Dra)o(wmn)138 b(=)63
+b(0..512)344 932 y(Depth)183 b(=)63 b(1..32)344 982 y(UTime)168
+b(=)63 b(long)13 b(in)o(teger)344 1031 y(No)q(des)185 b(=)63
+b(long)13 b(in)o(teger)344 1081 y(Ev)n(al)214 b(=)63 b(long)13
+b(in)o(teger)344 1131 y(Hash1)183 b(=)63 b(long)13 b(in)o(teger)344
+1181 y(Hash2)183 b(=)63 b(long)13 b(in)o(teger)262 1308 y(The)i(game)e
+(history)i(data)g(structure)i(records)f(the)g(imp)q(ortan)o(t)d(elemen)o(ts)i
+(of)f(eac)o(h)h(mo)o(v)o(e)262 1357 y(so)h(it)h(can)f(b)q(e)i(accurately)f
+(rev)o(ersed,)i(if)d(necessary)m(.)28 b(This)16 b(structure)j(is)e(used)g
+(for)f(b)q(oth)262 1407 y(actual)d(mo)o(v)o(es)g(pla)o(y)o(ed)g(in)g(the)i
+(game)d(and)i(mo)o(v)o(es)f(made)f(while)i(searc)o(hing.)324
+1492 y(Dra)o(wmn)f(represen)o(ts)18 b(the)e(mo)o(v)o(e)e(n)o(um)o(b)q(er)h
+(of)f(the)i(last)f(irrev)o(ersible)i(mo)o(v)o(e.)j(This)c(is)262
+1542 y(used)j(to)g(ease)g(detection)h(of)e(the)h(dra)o(w)g(b)o(y)f(3-fold)g
+(rep)q(etition)h(or)f(the)i(50)e(mo)o(v)o(e)f(rule.)262 1592
+y(EPsq)e(is)f(stored)h(so)g(the)g(p)q(ossible)g(en-passan)o(t)g(capture)g
+(square)g(can)g(b)q(e)g(restored)h(when)262 1642 y(the)f(mo)o(v)o(e)e(is)i
+(rev)o(ersed.)23 b(GScore)15 b(stores)i(the)e(p)q(ositional)f(v)n(alue)g(of)g
+(an)o(y)h(piece)g(captured)262 1692 y(to)d(enable)h(incremen)o(tal)f(ev)n
+(aluation)g(and)h(restoration)g(while)g(searc)o(hing)g(and)g(stores)h(the)262
+1742 y(mo)o(v)o(e)e(score)j(for)e(mo)o(v)o(es)g(actually)g(pla)o(y)o(ed.)324
+1827 y(UTime,)18 b(No)q(des,)i(Ev)n(al)e(and)h(Depth)g(are)g(all)f
+(measuremen)o(ts)g(stored)i(after)f(actual)262 1877 y(mo)o(v)o(es)10
+b(are)i(pla)o(y)o(ed.)17 b(The)12 b(other)g(\014elds,)g(GMo)o(v)o(e,)g
+(CPiece,)g(CColour,)f(Hash1)h(and)g(Hash2)262 1926 y(are)i(used)h(to)e(allo)o
+(w)g(easy)h(rev)o(ersal)h(of)e(an)o(y)g(mo)o(v)o(e.)946 2574
+y(121)p eop
+%%Page: 122 124
+122 123 bop 262 307 a Fr(6.4)69 b(The)23 b(Algorithms)262 434
+y Fp(This)18 b(section)i(explains)e(some)g(of)g(the)h(more)f(critical)g
+(algorithms)f(used)i(in)f(HIAR)o(CS.)262 483 y(Man)o(y)12 b(other)h
+(algorithms)e(are)i(used)g(and)g(I)g(w)o(ould)e(refer)j(the)g(reader)g(to)e
+(the)h(actual)g(co)q(de)262 533 y(listing)f(if)h(more)g(details)h(ab)q(out)g
+(these)h(algorithms)d(are)i(required.)262 685 y Fu(6.4.1)55
+b(Mo)n(v)n(e)19 b(Generation)262 797 y Fp(The)11 b(mo)o(v)o(e)e(generation)h
+(routine)h(used)h(dep)q(ends)g(on)e(the)i(t)o(yp)q(e)f(of)f(searc)o(h)i(b)q
+(eing)e(emplo)o(y)o(ed)262 847 y(at)19 b(a)h(giv)o(en)f(no)q(de)i(and)e(the)i
+(state)g(of)e(that)h(no)q(de.)36 b(Three)21 b(di\013eren)o(t)g(t)o(yp)q(es)g
+(of)e(mo)o(v)o(e)262 896 y(generation)14 b(can)g(b)q(e)g(p)q(erformed:)312
+1015 y(1.)20 b Fl(F)l(ull)c(Pseudo)g(Legal)g(Mo)o(v)o(e)h(Generation)p
+Fp(:)g(P)o(erformed)e(at)g(all)f(no)q(des)i(in)f(the)365 1065
+y(main)d(searc)o(h)j(tree)g(where)g(the)g(pla)o(y)o(er)e(to)h(mo)o(v)o(e)e
+(is)i(not)p 1193 1072 60 2 v 14 w(in-c)o(hec)o(k.)312 1148
+y(2.)20 b Fl(F)l(ull)11 b(Legal)h(Mo)o(v)o(e)h(Generation)p
+Fp(:)h(P)o(erformed)c(at)i(all)e(no)q(des)i(in)f(the)h(searc)o(h)g(tree)365
+1198 y(where)j(the)g(pla)o(y)o(er)e(to)h(mo)o(v)o(e)e(is)i(in-c)o(hec)o(k.)
+312 1281 y(3.)20 b Fl(Selectiv)o(e)c(T)l(actical)i(Mo)o(v)o(e)h(Generation)p
+Fp(:)h(P)o(erformed)c(at)g(all)f(no)q(des)i(in)f(the)365 1330
+y(quiescence)g(searc)o(h)f(tree)g(where)h(the)e(pla)o(y)o(er)g(to)f(mo)o(v)o
+(e)f(is)i(not)p 1291 1337 V 14 w(in-c)o(hec)o(k.)262 1474 y
+Fl(F)l(ull)g(Pseudo)g(Legal)h(Mo)o(v)o(e)g(Generation)262 1586
+y Fp(This)20 b(routine)g(generates)j(all)c(pseudo)i(legal)e(mo)o(v)o(es)g(in)
+h(the)h(curren)o(t)h(p)q(osition.)37 b(The)262 1636 y(legalit)o(y)12
+b(of)h(eac)o(h)h(mo)o(v)o(e)f(is)g(not)h(c)o(hec)o(k)o(ed)h(at)f(this)g
+(stage)g(for)g(2)g(reasons:)324 1754 y Ff(\017)20 b Fp(Most)14
+b(mo)o(v)o(es)f(ma)o(y)f(not)i(need)h(searc)o(hing)f(at)g(all)e(b)q(ecause)k
+(of)d Fh(\013\014)k Fp(cut)d(o\013s.)324 1837 y Ff(\017)20
+b Fp(Most)14 b(mo)o(v)o(es)f(are)h(legal)f(in)g(p)q(ositions)g(where)i(a)f
+(king)f(is)g(not)h(in)f(c)o(hec)o(k.)19 b(Therefore)365 1887
+y(it)14 b(w)o(ould)f(b)q(e)h(w)o(asteful)g(to)g(test)h(for)e(the)i
+(exceptional)f(case)h(at)e(this)h(stage.)324 2005 y(All)d(mo)o(v)o(es)h(are)g
+(generated)i(using)e(an)h(o\013set)g(metho)q(d)f(via)f(a)h(set)i(of)e(mo)o(v)
+o(e)e(generation)262 2055 y(tables.)35 b(F)m(or)19 b(example,)g(to)g(mo)o(v)o
+(e)f(in)h(direction)h(3)f(\()p Ff(\000)p Fp(8)h(o\013set\))g(the)g(curren)o
+(t)h(square,)262 2105 y Fm(sq1)c Fp(sa)o(y)m(,)g(is)f(used)i(as)f(an)g(index)
+g(in)o(to)g(a)f(table)h(whic)o(h)g(giv)o(es)g(the)h(resulting)f('to)f
+(square')262 2155 y(\()p Fm(sq1)p Ff(\000)p Fp(8\).)23 b(If)15
+b(the)h('to)f(square')h(is)f(o\013)h(the)g(b)q(oard,)f(the)i(n)o(um)o(b)q(er)
+d(128)h(is)g(returned)j(\(most)262 2205 y(signi\014can)o(t)10
+b(bit)h(set\).)18 b(This)11 b(metho)q(d)g(a)o(v)o(oids)f(the)i(need)g(to)f
+(ha)o(v)o(e)g(a)g(b)q(oundary)g(around)g(the)262 2254 y(b)q(oard,)16
+b(therefore)i(allo)o(wing)c(a)i(64)g(square)h(b)q(oard.)25
+b(As)17 b(explained)f(earlier,)g(this)h(allo)o(ws)262 2304
+y(con)o(v)o(enien)o(t)d(12)f(bit)h(mo)o(v)o(e)e(storage.)324
+2389 y(All)h(non)h(capture/sp)q(ecial)h(mo)o(v)o(es)d(are)j(generated)g
+(using)f(these)h(mo)o(v)o(e)e(tables.)18 b(Cap-)262 2439 y(tures)12
+b(are)g(generated)h(directly)f(from)d(the)j(appropriate)g(attac)o(k)f(table.)
+18 b(P)o(a)o(wn)11 b(promotion)946 2574 y(122)p eop
+%%Page: 123 125
+123 124 bop 262 307 a Fp(to)17 b(minor)e(pieces)k(is)e(catered)i(for,)e(eac)o
+(h)h(mo)o(v)o(e)d(ha)o(ving)i(the)g(same)g(12)g(bit)g(mo)o(v)o(e)e(co)q(de,)
+262 357 y(but)e(a)h(di\013eren)o(t)h(mo)o(v)o(e)d(t)o(yp)q(e.)18
+b(Castling)13 b(mo)o(v)o(es)f(are)j(generated)g(only)e(if)f(the)j(follo)o
+(wing)c(5)262 407 y(conditions)i(are)h(met:)312 525 y(1.)20
+b(The)15 b(king)e(has)h(nev)o(er)h(mo)o(v)o(ed.)312 608 y(2.)20
+b(The)15 b(ro)q(ok)e(in)o(v)o(olv)o(ed)g(has)h(nev)o(er)h(mo)o(v)o(ed.)312
+691 y(3.)20 b(The)15 b(squares)g(b)q(et)o(w)o(een)g(the)f(king)g(and)f(ro)q
+(ok)h(are)g(empt)o(y)m(.)312 774 y(4.)20 b(The)15 b(king)e(is)g(not)h(in)g(c)
+o(hec)o(k.)312 857 y(5.)20 b(The)c(king)f(will)f(not)i(pass)g(through)g(or)f
+(in)o(to)g(c)o(hec)o(k)i(as)e(part)h(of)f(the)h(castling)f(ma-)365
+907 y(no)q(euvre.)262 1026 y(The)f(incremen)o(tal)f(attac)o(k)h(table)f(is)h
+(v)o(ery)g(useful)g(for)g(c)o(hec)o(king)g(conditions)g(4)f(and)h(5.)324
+1111 y(En-passan)o(t)h(mo)o(v)o(es)e(are)h(tested)i(and)e(generated)i(b)o(y)e
+(c)o(hec)o(king)g(the)h(relev)n(an)o(t)g(attac)o(k)262 1161
+y(table)e(for)h(pa)o(wn)f(attac)o(ks)i(on)e(the)i(curren)o(t)g(en-passan)o(t)
+g(square)f(\(if)f(an)o(y\).)262 1304 y Fl(F)l(ull)h(Legal)g(Mo)o(v)o(e)i
+(Generation)262 1416 y Fp(When)10 b(the)h(king)e(is)h(in)g(c)o(hec)o(k,)i
+(most)d(pseudo)i(legal)e(mo)o(v)o(es)g(are)i(in)f(fact)g(illegal.)15
+b(Therefore,)262 1466 y(it)e(mak)o(es)g(sense)i(to)f(generate)h(only)e(legal)
+g(mo)o(v)o(es)g(when)h(the)h(king)e(is)h(in)f(c)o(hec)o(k.)324
+1551 y(It)h(is)f(surprising)h(ho)o(w)g(man)o(y)e(c)o(hess)j(programs)d(con)o
+(tin)o(ue)i(to)g(generate)h(pseudo)g(legal)262 1601 y(mo)o(v)o(es)c(ev)o(en)j
+(when)f(the)g(king)g(is)f(in)h(c)o(hec)o(k.)18 b(They)13 b(then)h(w)o(aste)f
+(time)f(pro)o(ving)g(that)h(most)262 1651 y(of)e(the)i(mo)o(v)o(es)e
+(generated)j(are)f(in)f(fact)g(illegal.)j(Admittedly)m(,)c(it)h(do)q(es)h
+(tak)o(e)f(some)g(sophis-)262 1701 y(ticated)g(data)f(structures)k(to)c
+(enable)h(suc)o(h)h(legal)d(mo)o(v)o(e)h(generation)h(to)f(b)q(e)i
+(accomplished)262 1750 y(e\016cien)o(tly)m(.)j(My)10 b(incremen)o(tal)g
+(attac)o(k)h(tables)g(do)f(pro)o(vide)g(enough)h(information)d(to)i(allo)o(w)
+262 1800 y(suc)o(h)k(mo)o(v)o(e)f(generation)h(to)g(b)q(e)g(done)g(v)o(ery)h
+(e\016cien)o(tly)m(.)i(In)d(fact,)g(in)f(tests,)i(I)f(ha)o(v)o(e)g(found)262
+1850 y(legal)f(mo)o(v)o(e)f(generation)j(is)f(appro)o(ximately)d(10)j(times)f
+(faster)i(than)f(pseudo)h(legal)e(mo)o(v)o(e)262 1900 y(generation)h(and)f(v)
+n(alidation,)e(assuming)i(no)g Fh(\013\014)k Fp(cut)d(o\013s)g(o)q(ccur.)324
+1985 y(Legal)f(mo)o(v)o(es)g(when)h(in)f(c)o(hec)o(k)i(fall)e(in)o(to)g(one)h
+(of)f(the)i(follo)o(wing)c(3)j(categories:)312 2104 y(1.)20
+b(King)14 b(mo)o(v)o(es)e(to)i(unattac)o(k)o(ed)g(squares.)312
+2187 y(2.)20 b(Captures)15 b(of)e(the)i(c)o(hec)o(king)f(piece)h(b)o(y)f
+(pieces)h(not)f(pinned)g(to)f(the)i(king.)312 2270 y(3.)20
+b(In)o(terp)q(osition)10 b(b)q(et)o(w)o(een)g(the)g(king)f(and)g(the)h(c)o
+(hec)o(king)g(piece,)g(b)o(y)g(pieces)g(not)f(pinned)365 2319
+y(to)14 b(the)h(king.)946 2574 y(123)p eop
+%%Page: 124 126
+124 125 bop 262 307 a Fp(In)16 b(category)h(1,)f(it)g(is)g(imp)q(ortan)o(t)f
+(to)h(tak)o(e)h(accoun)o(t)g(of)e(c)o(hec)o(ks)j(b)o(y)e(v)o(ector)h(t)o(yp)q
+(e)g(pieces)262 357 y(\(bishop,)e(ro)q(ok)h(and)f(queen\))i(as)f(these)h
+(e\013ectiv)o(ely)f(attac)o(k)g(squares)h(through)f(the)g(king.)262
+407 y(These)f(attac)o(ks)f(are)g(not)g(ob)o(vious)f(from)f(the)j(attac)o(k)f
+(tables)g(themselv)o(es.)324 492 y(Note)j(when)g(in)f(double)g(c)o(hec)o(k,)h
+(only)f(king)g(mo)o(v)o(es)f(need)i(to)f(b)q(e)h(generated)h(as)f(it)f(is)262
+542 y(imp)q(ossible)c(to)i(get)g(out)f(of)h(c)o(hec)o(k)h(b)o(y)e(pla)o(ying)
+g(mo)o(v)o(es)f(in)i(categories)g(2)g(or)g(3.)324 627 y(Generating)f(only)g
+(legal)g(mo)o(v)o(es)f(giv)o(es)h(an)g(added)h(b)q(ene\014t)h(to)f(the)g
+(program's)d(searc)o(h)262 677 y(extensions:)17 b(It)11 b(is)f(kno)o(wn)g(b)q
+(efore)h(searc)o(hing)h(an)o(y)e(mo)o(v)o(es,)f(ho)o(w)h(man)o(y)f(legal)g
+(mo)o(v)o(es)h(exist,)262 727 y(ho)o(w)f(man)o(y)g(legal)g(king)g(mo)o(v)o
+(es)g(exist)i(and)f(whether)i(the)e(c)o(hec)o(k)i(is)e(doubled)g(or)g(disco)o
+(v)o(ered.)262 870 y Fl(Selectiv)o(e)j(T)l(actical)i(Mo)o(v)o(e)g(Generation)
+262 982 y Fp(Mo)o(v)o(es)f(generated)i(in)d(the)i(quiescence)i(searc)o(h)e
+(when)g(not)f(in)g(c)o(hec)o(k)h(are)g(rather)g(limited)262
+1032 y(to)j(ob)o(vious)g(tactical)h(mo)o(v)o(es.)32 b(Only)18
+b(t)o(w)o(o)h(tactical)f(mo)o(v)o(e)g(categories)h(are)h(generated,)262
+1082 y(captures)15 b(and)f(pa)o(wn)f(promotions.)324 1167 y(Only)k(pa)o(wn)h
+(promotions)e(to)h(a)h(queen)h(are)f(considered.)31 b(All)17
+b(capture)i(mo)o(v)o(es)d(are)262 1217 y(generated)h(with)e(the)i(exception)g
+(of)e(en-passan)o(t.)25 b(These)17 b(sp)q(ecial)g(case)g(mo)o(v)o(es)d(are)j
+(not)262 1267 y(considered)h(cost)g(e\013ectiv)o(e)h(enough)f(to)f(w)o(arran)
+o(t)g(inclusion)g(in)g(this)h(mo)o(v)o(e)d(generation)262 1316
+y(pro)q(cess.)k(All)13 b(mo)o(v)o(es)g(generated)i(b)o(y)f(this)g(phase)g
+(are)h(only)e(pseudo-legal.)262 1468 y Fu(6.4.2)55 b(Mo)n(v)n(e)19
+b(Ordering)262 1580 y Fp(As)f(explained)g(in)g(c)o(hapter)h(3,)f(mo)o(v)o(e)f
+(ordering)h(is)g(vital)f(to)h(the)h(e\016ciency)g(of)f(the)g
+Fh(\013\014)262 1630 y Fp(searc)o(h)d(algorithm.)i(T)m(o)c(ac)o(hiev)o(e)i
+(the)g(optimal)d Fh(\013\014)k Fp(searc)o(h)g(tree,)f(it)f(is)g(not)p
+1398 1637 60 2 v 14 w(necessary)j(to)262 1680 y(examine)12
+b(mo)o(v)o(es)h(in)g(a)h(strictly)g(b)q(est)h(to)f(w)o(orst)g(order)g(at)g
+(eac)o(h)h(no)q(de.)324 1765 y(The)f(optimal)d Fh(\013\014)17
+b Fp(searc)o(h)e(tree)g(can)f(b)q(e)g(ac)o(hiev)o(ed)h(b)o(y:)324
+1883 y Ff(\017)20 b Fp(Along)13 b(a)g(v)n(ariation)e(whic)o(h)i(will)f(b)q
+(ecome)h(the)h(new)f(principle)g(v)n(ariation,)f(the)h(b)q(est)365
+1933 y(mo)o(v)o(e)g(m)o(ust)f(b)q(e)j(examined)e(\014rst)h(at)g(eac)o(h)g
+(ply)m(.)324 2016 y Ff(\017)20 b Fp(The)e(\014rst)g(mo)o(v)o(e)e(explored)i
+(at)f(ev)o(en)h(ply)f(depths)h(m)o(ust)f(b)q(e)h(a)f(refutation)g(mo)o(v)o
+(e,)365 2066 y(e.g.)h(one)c(that)g(causes)h(a)f Fh(\014)i Fp(cut)f(o\013.)324
+2149 y Ff(\017)20 b Fp(A)o(t)11 b(o)q(dd)f(ply)g(depths)i(whic)o(h)e(are)h
+(not)f(part)h(of)f(a)g(new)h(principle)f(v)n(ariation,)g(ordering)365
+2199 y(is)16 b(unimp)q(ortan)o(t)f(pro)o(vided)h(a)f(refutation)h(mo)o(v)o(e)
+f(is)h(examined)f(\014rst)h(at)g(the)h(next)365 2249 y(depth.)262
+2367 y(It)c(can)i(b)q(e)f(seen)h(from)d(these)k(p)q(oin)o(ts)d(that)h(it)g
+(is)f(vital)g(to)h(examine)e(refutation)i(mo)o(v)o(es)f(as)262
+2417 y(early)k(as)g(p)q(ossible.)28 b(In)17 b(HIAR)o(CS,)f(the)i(mo)o(v)o(e)e
+(ordering)h(algorithm's)d(basic)k(aim)d(is)i(to)946 2574 y(124)p
+eop
+%%Page: 125 127
+125 126 bop 262 307 a Fp(alw)o(a)o(ys)12 b(examine)g(the)i(b)q(est)h(mo)o(v)o
+(e)d(\014rst.)18 b(Ho)o(w)o(ev)o(er,)c(emphasis)f(is)g(placed)h(on)f
+(examining)262 357 y(mo)o(v)o(es)f(lik)o(ely)h(to)g(cause)i
+Fh(\014)i Fp(cut)d(o\013)s('s,)g(e.g.)k(capturing)13 b(the)i(piece)g(just)f
+(mo)o(v)o(ed.)324 442 y(The)19 b(main)e(mo)o(v)o(e)h(ordering)h(algorithm)e
+(is)i(p)q(erformed)f(while)h(generating)g(mo)o(v)o(es.)262
+492 y(Ho)o(w)o(ev)o(er,)10 b(a)f(signi\014can)o(t)g(prop)q(ortion)g(of)g(the)
+h(time,)f(HIAR)o(CS)g(do)q(es)h(not)g(need)g(to)f(generate)262
+542 y(an)o(y)i(mo)o(v)o(es.)16 b(This)c(is)g(b)q(ecause)h(at)f(eac)o(h)g(no)q
+(de)h(the)f(refutation)g(and)g(transp)q(osition)f(tables)262
+592 y(are)16 b(prob)q(ed,)h(p)q(ossibly)e(resulting)h(in)g(a)f(mo)o(v)o(e)g
+(b)q(eing)h(prop)q(osed.)25 b(An)o(y)15 b(mo)o(v)o(e)g(prop)q(osed)262
+641 y(b)o(y)h(these)j(tables)e(has)h(a)f(high)f(probabilit)o(y)g(of)g
+(causing)h(a)g(refutation.)28 b(It)17 b(is)g(therefore)262
+691 y(explored)d(\014rst)g(without)g(generating)g(an)o(y)f(mo)o(v)o(es.)k(If)
+d(a)f(cut)i(o\013)f(is)f(ac)o(hiev)o(ed,)h(the)g(costly)262
+741 y(exercise)h(of)f(mo)o(v)o(e)e(generation)i(and)g(ordering)f(is)h(a)o(v)o
+(oided)f(altogether.)324 826 y(Tw)o(o)i(mo)o(v)o(e)g(ordering)h(algorithms)e
+(are)j(used,)g(one)f(during)g(b)q(oth)g(the)h(pseudo)g(legal)262
+876 y(and)12 b(legal)f(mo)o(v)o(e)g(generation)i(routines)g(and)f(one)h
+(during)f(quiescence)j(mo)o(v)o(e)c(generation.)262 1020 y
+Fl(F)l(ull)j(Mo)o(v)o(e)h(Ordering)262 1132 y Fp(As)g(mo)o(v)o(es)f(are)i
+(generated)h(in)e(the)h(full)e(pseudo)i(or)f(legal)g(mo)o(v)o(e)e(generation)
+j(routines)g(a)262 1181 y(score)d(is)e(assigned.)18 b(This)12
+b(score)h(allo)o(ws)e(the)h(mo)o(v)o(es)f(generated)i(to)f(b)q(e)g(ordered)h
+(on)f(merit.)262 1231 y(While)f(the)i(score)g(do)q(es)g(represen)o(t)i(an)d
+(estimate)g(of)f(the)i(mo)o(v)o(e's)e(v)n(alue,)g(it)h(also)g(attempts)262
+1281 y(to)h(estimate)h(the)g(lik)o(eliho)q(o)q(d)e(of)h(the)i(mo)o(v)o(e)d
+(causing)i(a)g(cut)g(o\013.)324 1366 y(Eac)o(h)g(mo)o(v)o(e)e(is)i(scored)h
+(b)o(y)f(the)g(follo)o(wing)e(pro)q(cedure:)312 1485 y(1.)20
+b(The)13 b(mo)o(v)o(e)d(is)i(lo)q(ok)o(ed)f(up)h(in)f(the)i(history)f(table)g
+(and)f(the)i(v)n(alue)e(found)h(is)f(assigned)365 1535 y(as)j(the)h(mo)o(v)o
+(e's)d(initial)g(score.)312 1618 y(2.)20 b(When)13 b(a)e(mo)o(v)o(e)g(is)h
+(found)g(to)g(b)q(e)g(b)q(est)i(at)e(a)g(giv)o(en)f(no)q(de)i(in)e(the)i
+(tree)h(it)d(is)h(stored)i(as)365 1667 y(a)g(killer)f(mo)o(v)o(e)f(and)i(giv)
+o(en)g(an)f(appropriate)h(v)n(alue.)k(In)c(HIAR)o(CS,)f(3)h(killer)f(mo)o(v)o
+(es)365 1717 y(are)i(stored)g(at)f(eac)o(h)h(ply)m(,)e(2)g(for)h(mo)o(v)o(es)
+f(causing)h(cut)h(o\013)s('s)f(and)g(1)g(for)g(non)g(cut)h(o\013)365
+1767 y(mo)o(v)o(es.)365 1833 y(The)d(mo)o(v)o(e)e(ordering)h(algorithm)e(c)o
+(hec)o(ks)k(the)f(mo)o(v)o(e)d(against)i(the)h(follo)o(wing)d(stored)365
+1883 y(killer)k(mo)o(v)o(es:)383 1966 y(\(a\))21 b(Refutation)13
+b(killer's)g(1)g(and)h(2)f(at)h(this)g(ply)m(.)381 2033 y(\(b\))21
+b(Normal)11 b(killer)j(3)f(at)h(this)g(ply)m(.)385 2099 y(\(c\))22
+b(Refutation)13 b(killer)g(1)g(at)h(ply)p Ff(\000)p Fp(2.)365
+2182 y(If)i(the)h(mo)o(v)o(e)e(is)h(a)g(killer)f(mo)o(v)o(e)f(at)j(this)f
+(depth)h(of)e(the)i(tree,)h(the)f(score)g(is)f(incre-)365 2232
+y(men)o(ted)e(b)o(y)f(the)i(resp)q(ectiv)o(e)h(killer)d(v)n(alue.)365
+2298 y(This)j(heuristic)h(supp)q(orts)g(the)g(history)f(heuristic)h(b)o(y)e
+(suggesting)i(recen)o(t)g(strong)365 2348 y(mo)o(v)o(es)g(at)h(the)h(curren)o
+(t)h(depth.)32 b(It)18 b(is)g(often)g(the)h(case)g(that)f(the)h(last)f(mo)o
+(v)o(e)f(to)365 2398 y(cause)c(a)f(refutation)f(at)h(a)g(giv)o(en)f(depth)i
+(will)d(rep)q(eatedly)j(ac)o(hiev)o(e)f(the)h(same)e(result)365
+2448 y(in)j(other)g(p)q(ositions)g(at)g(the)g(same)f(depth.)946
+2574 y(125)p eop
+%%Page: 126 128
+126 127 bop 312 307 a Fp(3.)20 b(If)15 b(the)h(mo)o(v)o(e)d(captures)k(the)f
+(piece)g(just)f(mo)o(v)o(ed)e(b)o(y)i(the)h(opp)q(onen)o(t,)f(it)g(receiv)o
+(es)i(a)365 357 y(b)q(on)o(us)c(score)h(of)d(400)h(p)q(oin)o(ts.)17
+b(This)c(indicates)f(the)h(imp)q(ortance)f(of)g(suc)o(h)h(mo)o(v)o(es)e(in)
+365 407 y(causing)j(refutations.)312 486 y(4.)20 b(The)15 b(estimate)e(is)h
+(then)g(mo)q(di\014ed)f(b)o(y:)448 556 y Fh(C)s(P)6 b(T)14
+b Ff(\000)c Fh(S)r(W)c(P)15 b Fp(+)10 b Fh(E)r(N)5 b(P)365
+656 y Fl(where)448 706 y Fp(CPT)14 b(:)63 b(is)14 b(the)g(v)n(alue)g(of)f
+(the)h(captured)h(piece,)g(if)e(an)o(y)m(,)f(otherwise)j(0.)448
+805 y(SWP)f(:)57 b(is)14 b(the)g(estimated)g(v)n(alue)f(of)g(the)i(p)q(oten)o
+(tial)e(exc)o(hanges)i(on)f(the)g(to)625 855 y(square.)19 b(De\014ned)c(b)o
+(y:)448 955 y(SWP)f(=)37 b Fl(if)13 b Fp(\()p Fl(not)g Fp(A)o(ttac)o(k)o
+(ed\([An)o(y],Opp\(col\),to\)\))684 1005 y(0)625 1054 y Fl(else)684
+1104 y(if)g Fp(\()p Fl(not)g Fp(A)o(ttac)o(k)o(ed\([An)o(y],col,to\)\))743
+1154 y Fh(M)5 b(T)812 1160 y Fe(col;f)s(r)q(om)684 1204 y Fl(else)743
+1254 y(if)13 b Fp(\(A)o(ttac)o(k)o(ed\([An)o(y)h Fh(<)g Fp
+(On\(from\)],Opp\(col\),to\))743 1303 y Fl(or)g Fh(])p Fp(Di\013A)o(ttac)o
+(ks\(Opp\(col\),to\))g Fh(>)g Fp(0\))802 1353 y Fl(if)f Fp(\(Con)o
+(trol\(to\))g(=)i(col\))861 1403 y Fh(M)5 b(T)930 1409 y Fe(col;f)s(r)q(om)
+1066 1403 y Fh(=)p Fp(2)802 1453 y Fl(else)861 1503 y Fh(M)g(T)930
+1509 y Fe(col;f)s(r)q(om)802 1553 y Fl(endif)743 1602 y(else)802
+1652 y(if)13 b Fp(\(Con)o(trol\(to\))g(=)i(col\))861 1702 y(0)802
+1752 y Fl(else)861 1802 y Fh(M)5 b(T)930 1808 y Fe(col;f)s(r)q(om)1066
+1802 y Fh(=)p Fp(2)802 1851 y Fl(endif)743 1901 y(endif)684
+1951 y(endif)625 2001 y(endif)448 2100 y Fh(M)g(T)517 2106
+y Fe(col;sq)603 2100 y Fp(:)10 b(See)15 b(ev)n(aluation)d(function)i
+(de\014nition)f(1,)h(Material.)448 2200 y(ENP)g(:)64 b(Represen)o(ts)16
+b(an)e(estimate)f(of)g(the)i(threat)f(to)g(the)h(mo)o(ving)c(piece)k(on)e
+(its)625 2250 y(original)f(square,)i(e.g.)k(its)c(urgency)h(to)e(mo)o(v)o(e.)
+k(De\014ned)d(b)o(y:)448 2350 y(ENP)g(=)44 b Fl(if)13 b Fp(\(A)o(ttac)o(k)o
+(ed\([An)o(y)h Fh(<)g Fp(On\(from\)],Opp\(col\),from)o(\)\))684
+2399 y Fh(M)5 b(T)753 2405 y Fe(col;f)s(r)q(om)889 2399 y Fh(=)p
+Fp(16)625 2449 y Fl(endif)946 2574 y Fp(126)p eop
+%%Page: 127 129
+127 128 bop 365 357 a Fp(Note:)19 b('from')11 b(and)j('to')e(are)j(the)f
+(from)e(and)i(to)g(squares)h(of)e(the)i(generated)g(mo)o(v)o(e.)365
+448 y(SWP)9 b(and)h(ENP)f(are)h(only)f(calculated)g(if)f(the)i(History)g(and)
+f(Killer)g(v)n(alues)g(summed,)365 498 y(are)16 b(less)f(than)g(32.)21
+b(This)14 b(a)o(v)o(oids)g(go)q(o)q(d)h(refutation)g(mo)o(v)o(es)e(b)q(eing)i
+(badly)f(ordered)365 548 y(b)q(ecause)k(they)f(lo)q(ok)e(inferior)g(to)h
+(this)g(score)i(estimator,)d(when)i(in)e(fact)h(previous)365
+598 y(searc)o(hing)f(has)f(sho)o(wn)g(them)f(to)g(b)q(e)i(go)q(o)q(d)e(in)h
+(the)g(past.)262 740 y Fl(Quiescence)f(Mo)o(v)o(e)j(Ordering)262
+852 y Fp(In)h(the)g(selectiv)o(e)i(tactical)d(mo)o(v)o(e)g(generator,)i(mo)o
+(v)o(es)e(are)i(scored)g(b)o(y)f(their)h(optimistic)262 902
+y(p)q(ossibilities.)33 b(This)19 b(is)g(to)g(enable)h(the)f(forw)o(ard)g
+(pruning)g(mec)o(hanism)e(explained)i(in)262 951 y(section)14
+b(5.4,)f(note)h(3.)324 1037 y(All)g(capture)j(mo)o(v)o(es)d(are)i(scored)h(b)
+o(y)e(the)h(v)n(alue)f(of)g(the)h(piece)g(captured)h(min)o(us)d(the)262
+1086 y(capturing)i(piece's)i(represen)o(tation)h(\(1-6\),)d(e.g.)27
+b(3)17 b(for)f(a)h(bishop.)27 b(This)16 b(results)i(in)f(an)262
+1136 y(ordering)j(where)i(captures)g(of)e(higher)h(v)n(alued)f(pieces)i(are)f
+(examined)f(\014rst.)39 b(Where)262 1186 y(more)13 b(than)h(one)h(w)o(a)o(y)f
+(to)g(capture)i(a)e(piece)h(exists,)g(the)g(mo)o(v)o(es)e(are)i(further)g
+(ordered)h(b)o(y)262 1236 y(considering)e(captures)h(b)o(y)f(the)g(lo)o(w)o
+(er)g(v)n(alued)f(pieces)i(\014rst.)324 1321 y(This)g(is)f(kno)o(wn)h(as)g
+(Minor)f(to)h(Ma)r(jorC)g(ordering)g(and)g(has)g(b)q(een)h(sho)o(wn)f(to)f(b)
+q(e)i(the)262 1371 y(most)c(e\013ectiv)o(e)k(ordering)d(of)h(capture)h(mo)o
+(v)o(es)d([10)o(].)324 1456 y(P)o(a)o(wn)j(promotions)f(receiv)o(e)j(an)e
+(estimated)g(score)i(of)e(QueenV)m(alue)h Ff(\000)g Fp(P)o(a)o(wnV)m(alue.)
+262 1506 y(Where)i(the)h(promotion)d(is)h(also)h(a)f(capture,)j(the)e(score)i
+(is)d(further)i(increased)g(b)o(y)f(the)262 1556 y(capture)d(score)g
+(explained)e(ab)q(o)o(v)o(e.)324 1641 y(Although)f(all)g(the)h(ordering)g
+(algorithms)d(score)k(mo)o(v)o(es)e(as)h(they)g(are)g(generated,)h(the)262
+1691 y(mo)o(v)o(es)g(are)i(not)g(fully)e(sorted)i(in)o(to)f(order.)24
+b(Only)16 b(the)g(b)q(est)h(mo)o(v)o(e)d(not)h(y)o(et)h(searc)o(hed)i(is)262
+1741 y(required)d(to)f(b)q(e)h(sorted)g(as)f(it)g(ma)o(y)e(itself)i(cause)h
+(a)f(cut)h(o\013,)f(a)o(v)o(oiding)e(the)j(need)g(for)f(an)o(y)262
+1791 y(more)e(sorting.)262 1941 y Fu(6.4.3)55 b(T)-5 b(ree)18
+b(Searc)n(hing)262 2053 y Fp(The)g(actual)f(searc)o(h)i(tec)o(hniques)g
+(emplo)o(y)o(ed)d(in)h(HIAR)o(CS)g(w)o(ere)i(explained)e(and)h(illus-)262
+2103 y(trated)g(in)f(c)o(hapter)i(5,)f(T)m(ree)h(Searc)o(hing.)30
+b(Ho)o(w)o(ev)o(er,)18 b(some)f(of)g(the)i(w)o(ork)e('b)q(ehind)h(the)262
+2152 y(scenes')e(of)e(the)i(searc)o(h)g(pro)q(cedures)h(w)o(as)e(not)g
+(explained.)21 b(This)15 b(section)h(will)d(therefore)262 2202
+y(highligh)o(t)f(these)j(more)e(implemen)o(tatio)o(nal)d(tasks)15
+b(whic)o(h)f(the)g(searc)o(h)h(m)o(ust)e(p)q(erform.)324 2287
+y(Three)i(searc)o(h)g(routines)f(are)h(used)f(in)g(HIAR)o(CS:)312
+2399 y(1.)20 b Fl(Ro)q(ot)p Fp(:)j(This)17 b(recursiv)o(e)h(function)f(o)o(v)
+o(ersees)h(and)f(con)o(trols)g(the)g(searc)o(h)h(pro)q(cess.)365
+2449 y(It)c(p)q(erforms)g(the)g(follo)o(wing)d(k)o(ey)j(tasks:)946
+2574 y(127)p eop
+%%Page: 128 130
+128 129 bop 415 307 a Ff(\017)21 b Fp(Selects)15 b(the)f(searc)o(h)h
+(required)g(for)f(the)g(next)h(depth.)415 374 y Ff(\017)21
+b Fp(Chec)o(ks)15 b(mo)o(v)o(es)d(for)i(kno)o(wn)f(results,)i(e.g.)i(c)o(hec)
+o(kmate)d(in)g(2)f(mo)o(v)o(es.)415 440 y Ff(\017)21 b Fp(Sorts)14
+b(1)g(ply)f(mo)o(v)o(es)g(b)q(et)o(w)o(een)i(iterations.)415
+506 y Ff(\017)21 b Fp(Allo)q(cates)9 b(and)g(assigns)h(refutation)f(lines)g
+(to)g(and)h(from)d(the)j(refutation)f(table.)415 573 y Ff(\017)21
+b Fp(Adjusts)14 b(time)f(con)o(trol)g(information)e(in)j(the)g(ligh)o(t)f(of)
+g(searc)o(h)i(results.)415 639 y Ff(\017)21 b Fp(Main)o(tains)9
+b(searc)o(h)i(status)g(indicators)f(whic)o(h)g(aid)f(the)i(time)e(con)o(trol)
+g(decision)457 689 y(pro)q(cess.)415 756 y Ff(\017)21 b Fp(Up)q(dates)15
+b(the)f(history)g(table)g(with)f(the)i(b)q(est)g(mo)o(v)o(e)d(found.)312
+839 y(2.)20 b Fl(AlphaBeta)p Fp(:)15 b(This)c(recursiv)o(e)i(searc)o(h)f
+(function)f(explores)h(all)d(no)q(des)j(in)f(the)h(main)365
+888 y(searc)o(h)j(tree)g(b)q(elo)o(w)f(ply)f(1.)18 b(It)c(p)q(erforms)g(the)g
+(follo)o(wing)d(k)o(ey)j(tasks:)415 971 y Ff(\017)21 b Fp(Calls)13
+b(for)g(ev)n(aluation)g(of)g(no)q(des.)415 1038 y Ff(\017)21
+b Fp(Mak)o(es)14 b(searc)o(h)h(extension)f(decisions.)415 1104
+y Ff(\017)21 b Fp(Prob)q(es)14 b(refutation)e(and)h(transp)q(osition)g
+(tables)g(for)f(scores)j(and)d(mo)o(v)o(es.)17 b(Of-)457 1154
+y(ten)d(this)g(is)g(enough)g(to)g(cause)g(termination)f(of)g(the)h(no)q(de.)
+415 1220 y Ff(\017)21 b Fp(Calls)13 b(for)g(generation)h(of)f(mo)o(v)o(es)g
+(when)h(necessary)m(.)415 1287 y Ff(\017)21 b Fp(Calls)13 b(for)g(a)h(searc)o
+(h)h(to)f(the)g(next)g(depth.)415 1353 y Ff(\017)21 b Fp(Main)o(tains)c(the)j
+(b)q(est)f(v)n(ariation)e(of)h(mo)o(v)o(es)g(from)f(this)h(no)q(de)i(and)e
+(returns)457 1403 y(suc)o(h)c(information)d(to)j(its)g(paren)o(t)g(no)q(de.)
+415 1469 y Ff(\017)21 b Fp(Sa)o(v)o(es)14 b(information)d(ab)q(out)i(the)i
+(no)q(de)f(in)g(the)g(transp)q(osition)g(table.)415 1536 y
+Ff(\017)21 b Fp(Up)q(dates)15 b(killer)e(mo)o(v)o(es)f(and)i(scores)h(for)f
+(the)g(curren)o(t)i(depth.)415 1602 y Ff(\017)21 b Fp(Up)q(dates)15
+b(the)f(history)g(table)g(with)f(the)i(b)q(est)g(mo)o(v)o(e)d(found.)312
+1685 y(3.)20 b Fl(Quies)p Fp(:)e(This)d(recursiv)o(e)h(searc)o(h)g(function)f
+(handles)g(no)q(des)g(b)q(ey)o(ond)g(the)h(horizon)365 1735
+y(of)e(the)g(main)e(searc)o(h.)19 b(It)14 b(p)q(erforms)f(the)i(follo)o(wing)
+c(k)o(ey)j(tasks:)415 1818 y Ff(\017)21 b Fp(Calls)13 b(for)g(ev)n(aluation)g
+(of)g(no)q(des.)415 1885 y Ff(\017)21 b Fp(Mak)o(es)g(searc)o(h)g(extension,)
+i(main)c(searc)o(h)i(con)o(tin)o(uation)f(and)g(quiescence)457
+1934 y(decisions.)415 2001 y Ff(\017)h Fp(Calls)13 b(for)g(re-en)o(try)i(of)e
+(the)i(main)d(searc)o(h.)415 2067 y Ff(\017)21 b Fp(Calls)13
+b(for)g(generation)h(of)f(tactical)h(mo)o(v)o(es)f(when)h(necessary)m(.)415
+2134 y Ff(\017)21 b Fp(Calls)13 b(for)g(a)h(searc)o(h)h(to)f(the)g(next)g
+(depth.)415 2200 y Ff(\017)21 b Fp(Main)o(tains)c(the)j(b)q(est)f(v)n
+(ariation)e(of)h(mo)o(v)o(es)g(from)f(this)h(no)q(de)i(and)e(returns)457
+2250 y(suc)o(h)c(information)d(to)j(its)g(paren)o(t)g(no)q(de.)262
+2368 y(Figure)i(6.2)g(sho)o(ws)h(a)g(state)h(transition)e(diagram)e(for)j
+(the)g(searc)o(h.)28 b(It)17 b(illustrates)g(ho)o(w)262 2418
+y(eac)o(h)d(searc)o(h)h(state)g(in)o(teracts.)k(An)14 b(explanation)f(of)g
+(eac)o(h)h(state)h(is)f(giv)o(en)f(b)q(elo)o(w:)946 2574 y(128)p
+eop
+%%Page: 129 131
+129 130 bop 499 2422 a Fp(Figure)14 b(6.2:)j(State)d(T)m(ransition)f(Diagram)
+e(for)j(the)g(Searc)o(h.)946 2574 y(129)p eop
+%%Page: 130 132
+130 131 bop 262 307 a Fl(IDLE)262 419 y Fp(When)13 b(no)g(searc)o(hing)g(of)g
+(an)o(y)f(kind)h(is)g(b)q(eing)g(p)q(erformed,)f(the)i(program)d(is)i(in)f
+(the)i Fm(IDLE)262 469 y Fp(state.)k(A)o(t)c(program)f(start)h(up,)g(this)g
+(is)f(also)h(the)g(initial)e(state.)324 554 y(If)h(the)i(program)d(is)h(exp)q
+(ecting)i(a)f(mo)o(v)o(e,)d(it)j(will)e(start)i(to)g(searc)o(h)h(on)f(the)g
+(opp)q(onen)o(ts)262 604 y(time)9 b(for)i(its)g(o)o(wn)g(b)q(est)h(resp)q
+(onse)h(to)e(the)h(exp)q(ected)h(mo)o(v)o(e.)j(This)11 b(is)g(kno)o(wn)g(as)g
+("thinking)262 654 y(on)16 b(the)h(opp)q(onen)o(ts)h(time".)25
+b(T)m(o)16 b(ac)o(hiev)o(e)h(this)g(the)g Fm(SEAR)o(CHING)h(ON)f(OPP)g
+Fp(state)h(is)262 704 y(en)o(tered.)26 b(If)16 b(the)h(opp)q(onen)o(t)f
+(actually)f(mak)o(es)h(a)f(mo)o(v)o(e)g(while)h(in)f(the)i
+Fm(IDLE)g Fp(state,)g(the)262 754 y(en)o(tered)e(user)g(mo)o(v)o(e)d(is)i
+(made)f(and)g(the)i(program)d(en)o(ters)k(the)e Fm(SEAR)o(CHING)g
+Fp(state.)262 896 y Fl(SEAR)o(CHING)262 1008 y Fp(This)j(state)h(carries)g
+(out)f(the)h(tree)h(searc)o(hing)e(on)g(the)h(computer's)f(time.)27
+b(It)18 b(uses)g(the)262 1058 y(aforemen)o(tioned)d(three)k(searc)o(h)f
+(routines.)28 b(The)17 b(searc)o(h)i(ma)o(y)c(start)i(from)f(the)h(ro)q(ot)g
+(of)262 1108 y(the)d(tree)h(or)f(con)o(tin)o(ue)g(a)g(previously)f(in)o
+(terrupted)i(searc)o(h.)324 1193 y(If)j(the)i(searc)o(h)g(deriv)o(es)g(a)f
+(kno)o(wn)f(v)n(alue)h(for)g(the)g(game)f(tree,)j(lik)o(e)d(c)o(hec)o(kmate)h
+(in)262 1243 y(3)d(mo)o(v)o(es)g(for)g(example,)g(no)h(more)e(searc)o(hing)j
+(is)e(required)i(and)f(the)g Fm(SEAR)o(CH)h(COM-)262 1293 y(PLETE)g
+Fp(state)h(is)f(en)o(tered.)33 b(Ho)o(w)o(ev)o(er,)20 b(if)d(the)i(game)e
+(tree)i(v)n(alue)f(is)g(not)g(kno)o(wn,)h(the)262 1342 y(program)d(con)o(tin)
+o(ues)j('thinking')d(un)o(til)i(either,)h(a)f(user)i(in)o(terrupt)f(\()p
+Ff(")p Fp(C\))f(o)q(ccurs)i(or)e(an)262 1392 y(alarm)e(timer)h(expires,)i
+(where)h(up)q(on)e(the)h Fm(SEAR)o(CH)g(INTERR)o(UPTED)f Fp(state)h(is)f(en-)
+262 1442 y(tered.)262 1584 y Fl(SEAR)o(CHING)e(ON)g(OPP)262
+1697 y Fp(Lik)o(e)g(the)i Fm(SEAR)o(CHING)g Fp(state,)g(this)g(state)g
+(carries)g(out)f(the)h(tree)h(searc)o(hing,)f(except)262 1746
+y(in)c(this)i(case)g(on)g(the)g(opp)q(onen)o(ts)g(thinking)e(time.)22
+b(Again,)14 b(if)h(the)h(searc)o(h)g(tree)h(v)n(alue)e(is)262
+1796 y(kno)o(wn,)g(the)h(searc)o(h)h(terminates)e(and)h(the)g
+Fm(SEAR)o(CHED)h(ON)g(OPP)e Fp(state)i(is)e(en)o(tered.)262
+1846 y(Assuming)g(the)i(game)e(tree)j(v)n(alue)e(is)h(not)f(kno)o(wn,)h(the)g
+(searc)o(h)h(con)o(tin)o(ues)f(inde\014nitely)262 1896 y(un)o(til)f(the)i
+(user)h(en)o(ters)g(his/her/it's)f(mo)o(v)o(e,)e(when)i(one)g(of)f(t)o(w)o(o)
+g(p)q(ossible)h(actions)f(can)262 1946 y(o)q(ccur.)j(If)15
+b(the)g(mo)o(v)o(e)d(en)o(tered)17 b(is)d(the)h(exp)q(ected)i(mo)o(v)o(e,)12
+b(then)j(the)g(program's)e(e\013orts)j(at)262 1995 y(thinking)9
+b(on)i(opp)q(onen)o(ts)h(time)d(ha)o(v)o(e)i(not)g(b)q(een)h(w)o(asted.)17
+b(In)11 b(whic)o(h)g(case,)h(the)g Fm(SEAR)o(CH-)262 2045 y(ING)k
+Fp(state)h(is)f(en)o(tered)j(to)d(con)o(tin)o(ue)h(the)g(searc)o(h)g(on)f
+(the)h(program's)e(time.)25 b(Ho)o(w)o(ev)o(er,)262 2095 y(if)17
+b(the)j(en)o(tered)g(mo)o(v)o(e)d(is)i(unexp)q(ected,)j(this)d(searc)o(h)g
+(is)g(terminated)f(b)o(y)h(en)o(tering)g(the)262 2145 y Fm(SEAR)o(CH)c
+(INTERR)o(UPTED)f Fp(state.)262 2287 y Fl(SEAR)o(CH)i(INTERR)o(UPTED)262
+2399 y Fp(The)h(ob)r(jectiv)o(e)h(of)f(this)g(state)h(is)f(to)g(allo)o(w)f(a)
+h(clean)h(bac)o(king)e(up)i(and)f(termination)e(of)262 2449
+y(the)h(searc)o(h)h(tree.)26 b(Once)17 b(the)g(searc)o(h)g(has)f(returned)i
+(to)e(the)h(ro)q(ot)f(p)q(osition,)f(either)i(the)946 2574
+y(130)p eop
+%%Page: 131 133
+131 132 bop 262 307 a Fm(SEAR)o(CH)16 b(COMPLETE)e Fp(or)h
+Fm(SEAR)o(CHED)i(ON)f(OPP)f Fp(state)h(is)e(en)o(tered.)23
+b(The)16 b(actual)262 357 y(state)h(dep)q(ends)h(on)f(whether)h(the)f
+(program)e(w)o(as)h(previously)h(thinking)e(on)i(its)f(o)o(wn)h(or)262
+407 y(the)d(opp)q(onen)o(ts)h(time.)262 550 y Fl(SEAR)o(CH)h(COMPLETE)262
+662 y Fp(In)g(this)g(state)g(the)h(user)g(is)f(informed)e(of)i(the)g(searc)o
+(h)i(result)e(b)o(y)g(w)o(a)o(y)f(of)h(a)f(mo)o(v)o(e)g(or)h(an)262
+712 y(announcemen)o(t.)h(Some)12 b(searc)o(h)j(v)n(alues)e(are)h(then)g
+(reset)g(and)g(\014nally)e(the)i Fm(IDLE)g Fp(state)g(is)262
+762 y(en)o(tered.)262 905 y Fl(SEAR)o(CHED)i(ON)g(OPP)262 1017
+y Fp(This)d(state)i(records)g(the)g(searc)o(h)g(result)g(and)e(en)o(ters)j
+(the)e Fm(IDLE)h Fp(state.)324 1138 y(Please)i(note,)g(an)f(explanation)f(of)
+h(the)h(handling)e(of)h(user)h(commands)d(suc)o(h)j(as)g(set)262
+1188 y(up)d(p)q(osition)g(for)h(example,)e(en)o(tered)j(while)e(searc)o(hing)
+i(on)e(opp)q(onen)o(ts)i(time)d(ha)o(v)o(e)h(b)q(een)262 1238
+y(omitted)i(for)h(reasons)i(of)e(clarit)o(y)m(.)28 b(They)18
+b(are)g(only)e(minor)g(side)i(issues)h(whic)o(h)e(do)h(not)262
+1287 y(a\013ect)c(the)h(underlying)e(design.)262 1439 y Fu(6.4.4)55
+b(Ev)m(aluation)262 1551 y Fp(The)18 b(ev)n(aluation)f(criteria)i(used)h(in)e
+(HIAR)o(CS)g(w)o(ere)h(fully)e(explained)i(and)f(illustrated)262
+1601 y(in)f(c)o(hapter)i(4.)31 b(Ho)o(w)o(ev)o(er,)19 b(during)f(the)h
+(implemen)o(tatio)o(n)d(and)i(testing,)h(a)f(n)o(um)o(b)q(er)f(of)262
+1651 y(problem)10 b(areas)i(w)o(ere)g(observ)o(ed.)19 b(In)11
+b(this)h(section)g(I)g(will)e(explain)h(some)f(of)h(the)i(problems)262
+1700 y(encoun)o(tered)i(and)f(the)h(resulting)f(solutions.)324
+1786 y(The)h(\014rst)g(ma)r(jor)e(problem)g(noticed)i(w)o(as)g(asso)q(ciated)
+g(with)g(the)g(application)e(of)h(the)262 1836 y(ev)n(aluation)h(function.)27
+b(The)18 b(ev)n(aluation)d(function)i(is)g(usually)f(applied)h(at)g(the)g
+(leaf)g(or)262 1885 y(horizon)e(no)q(des)i(of)e(the)i(main)d(searc)o(h)870
+1870 y Fk(3)889 1885 y Fp(,)i(after)g(whic)o(h)g(a)g(quiescence)i(searc)o(h)f
+(is)f(applied.)262 1935 y(The)d(p)q(ositional)f(v)n(alue)h(calculated)g(at)g
+(the)h(horizon)f(no)q(des)h(is)f(carried)h(forw)o(ard)f(in)o(to)f(the)262
+1985 y(quiescence)k(searc)o(h)g(to)f(enable)g(the)g(\014nal)f(v)n(alues)g
+(calculated)h(at)g(the)g(leaf)f(no)q(des)h(of)g(this)262 2035
+y(searc)o(h)e(to)f(ha)o(v)o(e)h(reasonably)f(up)h(to)f(date)h(p)q(ositional)e
+(v)n(alues)h(to)g(go)g(with)g(the)h(calculated)262 2085 y(material)h(v)n
+(alue.)26 b(When)17 b(pieces)h(are)f(captured)h(during)e(the)i(quiescence)g
+(searc)o(h,)g(b)q(oth)262 2134 y(the)12 b(material)d(and)j(p)q(ositional)e(v)
+n(alue)h(of)g(the)h(captured)h(piece)g(should)e(b)q(e)i(lost.)k(Ho)o(w)o(ev)o
+(er,)262 2184 y(this)e(w)o(as)g(not)g(re\015ected)i(in)e(the)g(p)q(ositional)
+f(v)n(alue)h(carried)g(forw)o(ard)g(in)g(the)g(quiescence)262
+2234 y(searc)o(h.)k(In)14 b(this)g(w)o(a)o(y)f(the)h(p)q(ositional)f(v)n
+(alue)g(started)i(to)f(b)q(ecome)f('out)h(of)f(date'.)324 2319
+y(When)f(the)i(p)q(ositional)d(v)n(alues)h(of)g(pieces)i(are)f(relativ)o(ely)
+e(lo)o(w,)h(this)g(w)o(as)h(not)f(a)g(ma)r(jor)262 2369 y(problem.)31
+b(Ho)o(w)o(ev)o(er,)21 b(unlik)o(e)d(most)g(c)o(hess)i(programs,)f(m)o(y)e
+(ev)n(aluation)h(function)g(can)p 262 2404 573 2 v 308 2431
+a Fj(3)325 2442 y Fi(except)10 b(where)h Fb(\013\014)i Fi(v)n(alues)d
+(indicate)f(that)h(the)h(p)q(osition)f(cannot)f(a\013ect)h(the)h(searc)o(h)f
+(result.)946 2574 y Fp(131)p eop
+%%Page: 132 134
+132 133 bop 262 307 a Fp(pro)q(duce)13 b(v)o(ery)g(high)f(p)q(ositional)f
+(scores.)19 b(Therefore,)14 b(when)f(highly)f(p)q(ositionally)e(v)n(alued)262
+357 y(pieces)15 b(are)h(captured,)f(the)g(carried)h(forw)o(ard)e(p)q
+(ositional)f(v)n(alue)h(w)o(as)h(drastically)f(out)g(of)262
+407 y(date,)j(causing)g(serious)g(problems)f(to)h(the)g(searc)o(h,)i(b)q(oth)
+e(in)f(e\016ciency)i(and)e(accuracy)m(.)262 457 y(F)m(or)c(example,)g(if)h(a)
+g(passed)h(pa)o(wn)f(p)q(ositionally)f(v)n(alued)g(at)i(200)e(p)q(oin)o(ts)h
+(\(2)h(pa)o(wns\),)f(w)o(as)262 506 y(captured)19 b(during)f(the)g
+(quiescence)j(searc)o(h,)f(the)e(p)q(ositional)f(total)h(should)g(ha)o(v)o(e)
+f(b)q(een)262 556 y(decreased)f(b)o(y)d(around)h(200)f(p)q(oin)o(ts.)324
+641 y(The)18 b(solution)e(to)i(this)f(problem)f(la)o(y)h(in)g(incremen)o
+(tally)f(up)q(dating)h(the)h(p)q(ositional)262 691 y(v)n(alue)10
+b(during)g(the)h(quiescence)i(searc)o(h.)18 b(T)m(o)10 b(ac)o(hiev)o(e)h
+(this,)g(whenev)o(er)h(the)g(full)d(ev)n(aluation)262 741 y(function)h(is)h
+(applied,)g(all)e(piece)j(p)q(ositional)e(scores)j(are)e(sa)o(v)o(ed)g(in)g
+(a)g(general)g(Pc/Sq)g(table.)262 791 y(As)k(mo)o(v)o(es)f(are)i(made)e
+(during)h(the)h(subsequen)o(t)h(searc)o(h)f(this)g(table)f(is)g(main)o
+(tained)e(and)262 841 y(the)18 b(p)q(ositional)f(v)n(alue)h(of)g(an)o(y)f
+(captured)j(piece)f(is)f(recorded)i(in)e(the)h('Game)d(History')262
+891 y(structure)k(and)e(used)g(to)g(incremen)o(tally)f(up)q(date)h(the)h(p)q
+(ositional)e(score.)31 b(It)18 b(w)o(as)g(also)262 940 y(found)c(necessary)i
+(to)f(include)g(promotion)d(mo)o(v)o(es)i(in)o(to)g(this)g(pro)q(cess)j(b)o
+(y)d(remo)o(ving)f(the)262 990 y(promoted)d(pa)o(wns)i(p)q(ositional)e
+(score.)19 b(These)13 b(enhancemen)o(ts)f(noticeably)f(impro)o(v)o(ed)f(the)
+262 1040 y(standard)k(of)f(pla)o(y)g(b)o(y)h(the)g(program.)324
+1125 y(Another)i(area)f(whic)o(h)g(caused)h(some)e(problems)h(w)o(as)g(the)g
+(concept)i(of)d(temp)q(o.)21 b(The)262 1175 y(pla)o(y)o(er)11
+b(to)h(mo)o(v)o(e)e(should)i(receiv)o(e)h(some)e(p)q(ositional)f(b)q(on)o(us)
+j(for)e(ha)o(ving)g(the)h(mo)o(v)o(e)f(as)h(this)262 1225 y(is)h(adv)n(an)o
+(tageous)546 1210 y Fk(4)564 1225 y Fp(.)324 1310 y(I)e(tried)g(out)g(v)n
+(arious)g(temp)q(o)f(v)n(alues)h(based)h(on)f(a)f(direct)i(ratio)f(to)g(the)h
+(b)q(est)g(p)q(ositional)262 1360 y(increase)k(caused)g(b)o(y)f(an)o(y)g
+(single)g(mo)o(v)o(e)e(from)h(eac)o(h)h(pla)o(y)o(ers)h(p)q(oin)o(t)e(of)h
+(view.)22 b(Ho)o(w)o(ev)o(er,)262 1410 y(this)11 b(caused)i(problems)d(b)q
+(ecause)j(the)f(maxim)n(um)7 b(p)q(ositional)j(c)o(hange)i(o)o(v)o(er)g(ev)o
+(en)g(a)f(single)262 1460 y(mo)o(v)o(e)j(can)j(b)q(e)g(dramatic)e(o)o(v)o(er)
+i(a)f(whole)g(searc)o(h.)27 b(I)16 b(\014nally)g(used)h(a)f(constan)o(t)h(v)n
+(alue)f(of)262 1509 y(20)g(p)q(oin)o(ts)i(for)f(ha)o(ving)f(the)i(mo)o(v)o
+(e.)27 b(I)17 b(still)f(feel)i(the)g(temp)q(o)e(v)n(alue)h(should)g(b)q(e)h
+(related)262 1559 y(to)f(p)q(ositional)f(v)n(alues)i(in)f(some)g(w)o(a)o(y)m
+(,)g(ho)o(w)o(ev)o(er,)h(the)g(v)n(alue)f(c)o(hosen)i(seems)f(to)f(b)q(eha)o
+(v)o(e)262 1609 y(reasonably)c(in)h(the)g(test)h(games)e(pla)o(y)o(ed.)324
+1694 y(In)j(elemen)o(tary)f(endings,)i(where)g(a)f(c)o(hec)o(kmate)f(driv)o
+(e)h(is)g(required,)h(e.g.)25 b(king)15 b(and)262 1744 y(ro)q(ok)h(v)o(ersus)
+h(king,)f(a)g(sp)q(ecial)g(routine)h(w)o(as)f(found)g(necessary)i(to)e(force)
+h(c)o(hec)o(kmate)f(in)262 1794 y(an)c(e\016cien)o(t)h(manor.)j(The)d
+(routine)g(used)h(is)f(v)o(ery)g(similar)d(to)j(the)g(mop)e(up)i(routine)g
+(used)262 1844 y(in)g(Chess)i(4.5)e([4)o(].)324 1929 y(Cases)j(of)f
+(insu\016cien)o(t)h(mating)d(material,)g(e.g.)23 b(king)14
+b(and)i(knigh)o(t)e(v)i(king,)e(are)i(also)262 1979 y(detected)d(b)o(y)e(the)
+h(ev)n(aluation)e(function)h(and)g(the)h(dra)o(w)g(v)n(alue)e(returned.)19
+b(This)12 b(enhance-)262 2029 y(men)o(t)j(is)h(v)o(ery)g(e\013ectiv)o(e)i(in)
+d(the)i(late)f(endgame)f(b)q(ecause)j(it)e(allo)o(ws)e(early)i(termination)
+262 2078 y(of)d(man)o(y)f(v)n(ariations,)g(thereb)o(y)j(reducing)f
+(unnecessary)i(searc)o(h)f(e\013ort.)324 2164 y(In)i(order)i(to)e(ease)i(the)
+f(debugging)f(of)g(the)h(ev)n(aluation)e(function,)i(all)e(v)n(alues)i(w)o
+(ere)262 2213 y(sa)o(v)o(ed)12 b(and)g(displa)o(y)o(ed)f(on)h(request.)19
+b(This)12 b(allo)o(w)o(ed)f(n)o(umerous)g(small)f(bugs)j(to)e(b)q(e)i(iden)o
+(ti-)262 2263 y(\014ed,)f(whic)o(h)f(w)o(ould)g(ha)o(v)o(e)g(otherwise)i(b)q
+(een)g(v)o(ery)f(di\016cult)f(to)g(sp)q(ot)h(as)g(they)g(only)f(sligh)o(tly)
+262 2313 y(a\013ected)k(the)f(\014nal)g(ev)n(aluation)e(function)i(score.)p
+262 2340 573 2 v 308 2366 a Fj(4)325 2378 y Fi(except)c(in)h(zugzw)o(ang)f(p)
+q(ositions)946 2574 y Fp(132)p eop
+%%Page: 133 135
+133 134 bop 324 307 a Fp(Ev)o(en)14 b(in)g(the)h(\014nal)e(p)q(erformance)h
+(tested)i(v)o(ersion,)e(some)f(of)g(these)j(p)q(ositional)d(diag-)262
+357 y(nostics)f(ha)o(v)o(e)f(b)q(een)i(retained)g(as)f(they)g(allo)o(w)e(a)h
+(v)n(aluable)g(insigh)o(t)g(in)o(to)g(wh)o(y)g(a)h(particular)262
+407 y(mo)o(v)o(e)g(w)o(as)i(c)o(hosen.)262 558 y Fu(6.4.5)55
+b(Time)16 b(Allo)r(cation)i(and)h(Con)n(trol)262 670 y Fp(As)11
+b(I)g(explained)g(in)f(c)o(hapter)i(3,)f(I)g(b)q(eliev)o(e)g(time)f(allo)q
+(cation)f(and)i(con)o(trol)g(is)g(an)f(imp)q(ortan)o(t)262
+720 y(asp)q(ect)j(of)f(a)g(c)o(hess)i(program's)d(mak)o(e)g(up)i(and)f(one)h
+(whic)o(h)f(do)q(es)h(not)g(seem)f(to)g(ha)o(v)o(e)g(b)q(een)262
+770 y(addressed)j(prop)q(erly)f(in)g(most)f(c)o(hess)i(programs.)324
+855 y(A)o(t)h(the)g Fm(Computer)h(Olympiad)p Fp(,)f(I)f(often)h(noticed)h(ho)
+o(w)e(ev)o(en)i(the)f(strongest)h(man)o(u-)262 905 y(facturer's)d(programs)e
+(to)q(ok)h(appro)o(ximately)e(the)j(same)e(time)g(o)o(v)o(er)h(all)f(the)i
+(mo)o(v)o(es,)e(ev)o(en)262 955 y(ob)o(vious)k(ones.)28 b(The)18
+b(only)e(time)g(mo)o(v)o(es)g(w)o(ere)i(pla)o(y)o(ed)f(quic)o(kly)f(w)o(as)h
+(when)h(either)g(the)262 1005 y(mac)o(hines)11 b(w)o(ere)j(thinking)e(on)g
+(opp)q(onen)o(ts)i(time)d(and)i(an)f(exp)q(ected)j(reply)e(w)o(as)f(made,)g
+(or)262 1055 y(when)i(c)o(hec)o(kmate)g(w)o(as)f(seen)j(or)e(when)g(only)f
+(one)h(legal)f(mo)o(v)o(e)f(existed.)324 1140 y(The)f(\014rst)g(thing)e(to)h
+(do)h(is)f(to)g(analyse)g(ho)o(w)g(v)o(ery)g(strong)h(h)o(uman)e(c)o(hess)i
+(pla)o(y)o(ers)g(tac)o(kle)262 1190 y(the)i(problem)e(of)h(time)f(allo)q
+(cation.)16 b(I)c(did)g(not)h(\014nd)f(an)o(y)g(previous)h(researc)o(h)i(w)o
+(ork)d(whic)o(h)262 1239 y(pro)o(vided)h(the)h(detailed)f(mo)o(v)o(e/time)e
+(analysis)i(I)g(required,)h(so)g(I)f(decided)i(to)e(collate)g(the)262
+1289 y(information)d(m)o(yself.)324 1375 y(I)g(decided)i(to)e(use)h(the)g
+(1986)e(w)o(orld)h(c)o(hampionship)f(matc)o(h)g(b)q(et)o(w)o(een)j(Gary)e
+(Kasparo)o(v)262 1424 y(and)16 b(Anatoly)g(Karp)q(o)o(v)g([62)o(])h(as)f(m)o
+(y)f(case)j(study)m(.)26 b(This)17 b(matc)o(h)e(w)o(as)h(c)o(hosen)i(for)e
+(three)262 1474 y(main)11 b(reasons:)312 1593 y(1.)20 b(Lik)o(ely)13
+b(high)h(qualit)o(y)e(of)h(time)g(allo)q(cation)f(decisions.)312
+1676 y(2.)20 b(Same)14 b(pla)o(y)o(ers)g(w)o(ere)i(in)o(v)o(olv)o(ed)d(in)h
+(all)f(games)h(allo)o(wing)e(pla)o(y)o(er)i(st)o(yle)h(to)g(b)q(e)g(anal-)365
+1725 y(ysed.)312 1808 y(3.)20 b(Detailed)c(statistics)g(giving)f(time)f(used)
+j(for)f(eac)o(h)g(mo)o(v)o(e)e(w)o(as)i(a)o(v)n(ailable)e(in)h(c)o(hess)365
+1858 y(magazine.)324 1977 y(I)c(analysed)g(all)f(24)g(games)g(of)g(the)i
+(matc)o(h.)k(F)m(or)11 b(eac)o(h)g(game,)f(mo)o(v)o(es)g(b)o(y)h(b)q(oth)g
+(sides)h(up)262 2027 y(to)i(the)i(time)e(con)o(trol)h(at)g(mo)o(v)o(e)e(40)i
+(w)o(ere)h(collated.)21 b(This)15 b(in)o(v)o(olv)o(ed)e(analysing)h(appro)o
+(x-)262 2076 y(imately)e(2000)i(mo)o(v)o(e)g(times.)20 b(As)15
+b(a)g(result)g(I)g(w)o(as)g(able)g(to)g(pro)q(duce)h(5)e(di\013eren)o(t)i
+(graphs)262 2126 y(detailing)c(the)j(a)o(v)o(erage)f(time)e(sp)q(en)o(t)j(on)
+f(eac)o(h)g(mo)o(v)o(e)e(for:)324 2245 y Ff(\017)20 b Fp(Kasparo)o(v)14
+b(pla)o(ying)e(white.)324 2328 y Ff(\017)20 b Fp(Kasparo)o(v)14
+b(pla)o(ying)e(blac)o(k.)324 2411 y Ff(\017)20 b Fp(Karp)q(o)o(v)14
+b(pla)o(ying)e(white.)946 2574 y(133)p eop
+%%Page: 134 136
+134 135 bop 324 307 a Ff(\017)20 b Fp(Karp)q(o)o(v)14 b(pla)o(ying)e(blac)o
+(k.)324 390 y Ff(\017)20 b Fp(Com)o(bined)12 b(time)h(allo)q(cation.)262
+509 y(The)h(graphs)g(pro)q(duced)h(can)f(b)q(e)h(found)e(in)h(app)q(endix)f
+(C.)324 594 y(Analysing)g(these)j(graphs)e(it)g(can)g(b)q(e)h(seen)g(that)f
+(b)q(oth)h(pla)o(y)o(ers)f(ha)o(v)o(e)g(distinctly)g(dif-)262
+644 y(feren)o(t)e(st)o(yles)h(on)e(time)g(con)o(trol.)17 b(Kasparo)o(v)12
+b(allo)q(cates)f(a)h(signi\014can)o(t)f(amoun)o(t)f(of)h(time)g(to)262
+694 y(the)i(middle)e(game,)f(mo)o(v)o(es)i(12-28)f(in)h(particular.)18
+b(Kasparo)o(v's)12 b(time)f(allo)q(cation)g(usually)262 743
+y(has)k(one)g(v)o(ery)g(high)f(p)q(eak)h(around)g(mo)o(v)o(es)f(16)g(to)h(20)
+f(and)h(then)g(tails)g(o\013)f(dramatically)m(.)262 793 y(Karp)q(o)o(v)f(on)f
+(the)i(other)g(hand)f(has)g(a)g(more)f(uniform)f(usage)i(of)f(time,)g
+(although)g(his)h(time)262 843 y(allo)q(cation)h(also)i(usually)f(tails)h
+(o\013)g(steadily)g(after)g(mo)o(v)o(e)f(26.)24 b(Tw)o(o)16
+b(reasons)h(are)g(lik)o(ely)262 893 y(for)c(this)h(tailing)e(o\013:)324
+1011 y Ff(\017)20 b Fp(Bad)e(time)d(allo)q(cation)h(during)g(the)i(middle)d
+(game)h(leading)g(to)h(a)g(rush)g(near)h(the)365 1061 y(time)13
+b(con)o(trol.)324 1144 y Ff(\017)20 b Fp(Go)q(o)q(d)e(planning)e(during)i
+(the)h(late)e(middle)g(game)f(allo)o(wing)g(planned)i(mo)o(v)o(e)e(se-)365
+1194 y(quences)g(to)e(b)q(e)g(pla)o(y)o(ed)f(quic)o(kly)m(.)262
+1312 y(As)f(this)g(tailing)f(o\013)g(o)q(ccurs)j(in)e(nearly)g(all)e(the)j
+(games)e(and)h(the)h(v)o(ery)f(high)f(calibre)i(of)e(the)262
+1362 y(pla)o(y)o(ers)i(in)o(v)o(olv)o(ed,)g(I)g(tend)i(to)f(think)f(go)q(o)q
+(d)h(planning)e(is)i(resp)q(onsible.)324 1447 y(Another)j(in)o(teresting)h
+(observ)n(ation)e(o)q(ccurs)i(when)g(y)o(ou)e(sup)q(er-imp)q(ose)h(the)g
+(graphs)262 1497 y(Kasparo)o(v)f(as)h(white)g(o)o(v)o(er)f(Karp)q(o)o(v)h(as)
+f(blac)o(k)h(and)f(Karp)q(o)o(v)h(as)f(white)h(o)o(v)o(er)g(Kasparo)o(v)262
+1547 y(as)c(blac)o(k.)18 b(A)o(t)c(eac)o(h)g(p)q(eak)g(on)f(the)i(white)e
+(pla)o(y)o(er's)h(graph)f(there)i(is)f(usually)f(a)g(trough)h(at)262
+1597 y(the)g(corresp)q(onding)g(mo)o(v)o(e)e(on)i(the)g(opp)q(osing)f(blac)o
+(k)g(pla)o(y)o(er's)g(graph.)18 b(This)13 b(also)g(o)q(ccurs)262
+1647 y(when)k(the)h(blac)o(k)f(pla)o(y)o(er's)f(p)q(eaks)i(are)g(compared)e
+(with)h(the)h(graph)f(for)f(the)i(opp)q(osing)262 1696 y(white)c(pla)o(y)o
+(er's)f(mo)o(v)o(es)g(follo)o(wing)e(suc)o(h)j(p)q(eaks.)324
+1782 y(I)f(think)g(this)g(clearly)g(illustrates)h(that)f(eac)o(h)h(pla)o(y)o
+(er)f(mak)o(es)f(signi\014can)o(t)g(use)j(of)d(their)262 1832
+y(opp)q(onen)o(ts)i(thinking)f(time.)324 1917 y(Examining)f(the)k(com)o
+(bined)e(graph)g(for)h(b)q(oth)g(Kasparo)o(v)g(and)g(Karp)q(o)o(v,)g(a)f
+(relation-)262 1967 y(ship)f(to)h(a)g(normal)e(distribution)h(can)h(b)q(e)g
+(seen.)20 b(Ov)o(erall)13 b(p)q(eak)h(remains)f(at)h(mo)o(v)o(e)e(20.)324
+2052 y(>F)m(rom)h(these)18 b(graphs)e(the)g(follo)o(wing)d(p)q(oin)o(ts)j(ab)
+q(out)g(time)e(allo)q(cation)g(and)i(con)o(trol)262 2102 y(can)e(b)q(e)g
+(deduced:)324 2220 y Ff(\017)20 b Fp(Thinking)13 b(on)h(y)o(our)f(opp)q(onen)
+o(ts)i(time)d(is)i(imp)q(ortan)o(t.)324 2303 y Ff(\017)20 b
+Fp(During)14 b(the)g(op)q(ening,)f(prepared)i(mo)o(v)o(es)e(are)h(t)o
+(ypically)f(pla)o(y)o(ed)g(quic)o(kly)m(.)324 2386 y Ff(\017)20
+b Fp(A)c(signi\014can)o(t)f(amoun)o(t)f(of)h(time)f(should)h(b)q(e)h(allo)q
+(cated)f(to)h('unkno)o(wn')e(p)q(ositions)365 2436 y(o)q(ccurring)h(in)e(the)
+i(op)q(ening)e(after)i(a)e(prepared)i(sequence)h(of)e(mo)o(v)o(es.)946
+2574 y(134)p eop
+%%Page: 135 137
+135 136 bop 324 307 a Ff(\017)20 b Fp(Time)10 b(should)h(b)q(e)h(allo)q
+(cated)f(dep)q(ending)h(on)f(the)h(complexit)o(y)d(and)i(understanding)365
+357 y(of)j(the)g(curren)o(t)h(p)q(osition.)324 435 y Ff(\017)20
+b Fp(Time)13 b(allo)q(cation)f(should)i(b)q(e)g(dynamically)d(altered)k(as)f
+(a)f(searc)o(h)i(progresses.)324 513 y Ff(\017)20 b Fp('Ob)o(vious')13
+b(mo)o(v)o(es)g(should)g(b)q(e)i(made)e(quic)o(kly)m(.)262
+621 y(Some)i(of)i(these)h(p)q(oin)o(ts)f(are)g(ob)o(vious)f(to)h(an)o(y)g
+(exp)q(erienced)i(tournamen)o(t)d(pla)o(y)o(er,)h(oth-)262
+670 y(ers)g(are)f(less)h(so.)24 b(Nev)o(ertheless)18 b(it)e(remains)f(imp)q
+(ortan)o(t)f(to)i(ha)o(v)o(e)g(one's)g(suspicions)g(re-)262
+720 y(enforced)f(b)o(y)e(researc)o(h.)324 805 y(I)h(will)e(no)o(w)i(explain)f
+(ho)o(w)g(these)i(p)q(oin)o(ts)f(are)g(addressed)i(in)e(HIAR)o(CS)f(5.0.)262
+947 y Fl(Thinking)g(on)i(Opp)q(onen)o(ts)e(Time)262 1059 y
+Fp(HIAR)o(CS)j(thinks)g(ab)q(out)g(its)h(next)g(mo)o(v)o(e)d(durings)j(its)f
+(opp)q(onen)o(t's)h(thinking)e(time.)25 b(It)262 1108 y(do)q(es)16
+b(this)g(b)o(y)f(thinking)g(ab)q(out)h(the)g(p)q(osition)f(as)h(if)f(the)i
+(opp)q(onen)o(t)f(had)f(made)g(the)h(ex-)262 1158 y(p)q(ected)g(reply)m(.)21
+b(If)14 b(the)i(opp)q(onen)o(t)f(actually)f(mak)o(es)f(the)j(exp)q(ected)h
+(reply)m(,)d(HIAR)o(CS)g(has)262 1208 y(gained)h(time)f(and)h(can)h(con)o
+(tin)o(ue)p 651 1215 153 2 v 15 w('thinking')e(or)h(reply)h(imm)o(ediately)m
+(.)j(If)c(ho)o(w)o(ev)o(er,)h(the)262 1258 y(opp)q(onen)o(t)c(mak)o(es)f(a)h
+(di\013eren)o(t)h(reply)m(,)e(HIAR)o(CS)h(ab)q(orts)g(its)g(analysis)g(and)g
+(starts)h('think-)262 1308 y(ing')e(from)h(the)i(new)f(p)q(osition.)k(In)c
+(practice,)h(the)g(correct)h(mo)o(v)o(e)c(seems)i(to)g(b)q(e)h(predicted)262
+1357 y(around)f(50\045)g(of)h(the)g(time.)324 1443 y(The)h(time)e(sp)q(en)o
+(t)i(thinking)e(on)h(the)h(opp)q(onen)o(ts)g(time)e(is)h(tak)o(en)h(in)o(to)e
+(accoun)o(t)i(when)262 1493 y(the)f(exp)q(ected)i(reply)e(is)g(made.)262
+1634 y Fl(Initial)f(Time)i(Allo)q(cation)262 1746 y Fp(Initially)g(the)i
+(resp)q(onse)i(time)d(\(respTime\))h(allo)q(cated)g(to)g(a)g(mo)o(v)o(e)e(is)
+i(calculated)g(from)262 1795 y(the)d(a)o(v)o(erage)g(time)e(p)q(er)j(mo)o(v)o
+(e)d(remaining)g(to)i(the)g(next)h(time)d(con)o(trol:)671 1903
+y(respTime)h(=)h(timeLeft)f(/)h(mo)o(v)o(esLeft)324 2011 y(A)g(maxim)n(um)9
+b(time)k(\(maxTime\))e(is)j(also)f(initially)e(calculated)j(as)g(follo)o(ws:)
+785 2119 y(maxTim)o(e)d(=)k(timeLeft)324 2227 y(This)f(is)f(a)h(sp)q(ecial)g
+(case)h(to)f(stop)g(the)g(program)f(from)f(losing)h(on)g(time.)324
+2313 y(Using)i(only)f(this)i(approac)o(h,)f(a)f(problem)g(ma)o(y)g(o)q(ccur)i
+(where)g(the)g(program)e(ha)o(ving)262 2363 y(half)19 b(an)h(hour)h(left)f
+(for)h(its)f(last)h(mo)o(v)o(e)d(will)i(w)o(an)o(t)g(to)g(use)i(its)e(full)f
+(time)h(allo)q(cation.)262 2412 y(Ho)o(w)o(ev)o(er,)12 b(it)h(ma)o(y)d(b)q(e)
+j(b)q(etter)h(not)f(to)f(sp)q(end)i(all)d(the)j(a)o(v)n(ailable)c(time)h(and)
+i(sa)o(v)o(e)f(some)g(for)262 2462 y(use)i(during)e(the)i(next)g(time)e(con)o
+(trol)h(p)q(erio)q(d.)18 b(T)m(o)12 b(a)o(v)o(oid)g(this)i(problem;)d(during)
+i(the)h(last)262 2512 y(10)f(mo)o(v)o(es)f(b)q(efore)j(a)f(time)e(con)o
+(trol,)h(respTime)h(is)g(mo)q(di\014ed)e(as)i(follo)o(ws:)946
+2574 y(135)p eop
+%%Page: 136 138
+136 137 bop 344 357 a Fp(respTime)14 b(=)g(min\(respTime,)d(timeLeft2/mo)o(v)
+o(esLeft2\))344 457 y Fl(where)380 506 y Fp(respTime)i(:)77
+b(is)14 b(the)h(initial)c(resp)q(onse)16 b(time)d(set.)380
+606 y(timeLeft2)f(:)71 b(is)14 b(the)h(time)d(left)i(b)q(efore)g(the)h(next)f
+(but)g(one)g(time)f(con)o(trol.)380 706 y(mo)o(v)o(esLeft2)f(:)42
+b(is)14 b(the)h(n)o(um)o(b)q(er)e(of)g(mo)o(v)o(es)g(left)g(b)q(efore)i(the)f
+(next)h(but)f(one)g(time)651 756 y(con)o(trol.)324 874 y(After)g(the)h
+(program)e(lea)o(v)o(es)h(its)g(op)q(ening)g(b)q(o)q(ok)f(it)h(is)g(faced)g
+(with)g(a)g(p)q(osition)f(whose)262 924 y(concepts)22 b(m)o(ust)d(b)q(e)i
+(grasp)q(ed)h(to)e(enable)h(the)g(program)e(to)h(con)o(tin)o(ue)h(the)g
+(thread)g(of)262 974 y(the)16 b(op)q(ening.)25 b(T)m(o)16 b(help)g(the)h
+(program)e(at)h(this)g(di\016cult)g(stage,)h(the)g(resp)q(onse)h(time)d(is)
+262 1023 y(increased)g(b)o(y)e(b)q(et)o(w)o(een)i(0)e(and)h(respTime)f(dep)q
+(ending)i(on)e(the)h(n)o(um)o(b)q(er)f(of)g(mo)o(v)o(es)g(since)262
+1073 y(lea)o(ving)i(the)j(op)q(ening)f(b)q(o)q(ok,)g(e.g.)26
+b(the)18 b(\014rst)g(non)f(b)q(o)q(ok)f(mo)o(v)o(e)g(is)g(respTime,)h(and)g
+(the)262 1123 y(forth)c(is)h(0.)262 1266 y Fl(Time)h(Allo)q(cation)e
+(Adjustmen)o(t)262 1378 y Fp(The)h(actual)g(time)f(whic)o(h)i(can)f(b)q(e)h
+(sp)q(en)o(t)h(on)e(a)g(mo)o(v)o(e)f(can)h(v)n(ary)g(b)q(et)o(w)o(een)i
+(respTime/64)262 1428 y(and)10 b(maxTim)o(e.)k(Therefore,)e(for)e(a)g(time)f
+(con)o(trol)g(of)h(40)g(mo)o(v)o(es)f(in)g(2)h(hours)h(the)g(minim)n(um)262
+1478 y(and)20 b(maxim)n(um)d(times)i(could)i(range)g(from)d(3)j(seconds)h(to)
+e(2)h(hours.)39 b(Of)20 b(course,)j(if)262 1528 y(the)c(searc)o(h)h(tree)h
+(is)d(terminal)g(or)h(thinking)f(on)g(opp)q(onen)o(ts)i(time)e(has)h(b)q(een)
+h(used)g(an)262 1578 y(imm)o(ediate)11 b(resp)q(onse)16 b(ma)o(y)c(still)h(o)
+q(ccur.)324 1663 y(The)18 b(time)e(sp)q(en)o(t)j(thinking)e(on)g(opp)q(onen)o
+(ts)i(time)d(is)i(tak)o(en)g(in)o(to)f(accoun)o(t)h(b)o(y)g(this)262
+1713 y('time)f(windo)o(w'.)34 b(F)m(or)19 b(example,)g(if)g(the)h(program)e
+(had)h(sp)q(en)o(t)i(60)e(seconds)i(thinking)262 1763 y(on)d(opp)q(onen)o(ts)
+g(time)f(and)h(the)h(exp)q(ected)i(reply)d(w)o(as)g(made,)g(a)g(new)h
+(respTime)e(of)h(62)262 1812 y(seconds)f(w)o(ould)e(only)g(require)i(2)f
+(more)f(seconds)j(though)o(t)d(b)o(y)h(the)h(program,)d(all)h(other)262
+1862 y(things)e(b)q(eing)h(equal.)324 1947 y(The)20 b(actual)f(time)g(tak)o
+(en)h(within)f(this)h('time)e(windo)o(w')g(will)h(dep)q(end)i(on)e(v)n
+(arious)262 1997 y(factors)e(measuring)f(ho)o(w)g(complex)g(the)h(mo)o(v)o(e)
+f(c)o(hoice)h(is.)27 b(Dep)q(ending)17 b(on)g(the)g(searc)o(h)262
+2047 y(status,)12 b(the)h(time)e(allo)q(cation)f(is)i(adjusted)h(under)g(5)e
+(categories.)19 b(Note,)12 b(to)g(facilitate)f(the)262 2097
+y(v)n(arying)h(time)h(allo)q(cation)f(c)o(hanges,)i(the)h(concept)g(of)e
+(extra)p 1130 2104 94 2 v 14 w(time)g(is)h(in)o(tro)q(duced.)262
+2240 y Fl(1.)25 b(Best)17 b(Mo)o(v)o(e)g(leads)f(to)h(a)g(Loss:)41
+b Fp(While)15 b(no)g(mo)o(v)o(es)f(are)h(found)g(to)g(a)o(v)o(oid)f(losing)
+262 2290 y(the)e(game,)e(the)j(allo)q(cated)f(time)e(is)i(set)h(to)f(the)g
+(maxTime.)i(This)e(allo)o(ws)f(the)h(program)f(to)262 2340
+y(con)o(tin)o(ue)k(searc)o(hing)h(un)o(til)e(either)j(mate)d(is)h(found)g(or)
+h(almost)d(all)h(the)i(program's)e(time)262 2390 y(expires.)20
+b(After)14 b(all,)f(the)i(program)e(is)h(v)o(ery)g(lik)o(ely)f(to)h(lose)g
+(if)g(it)g(pla)o(ys)f(a)h(mo)o(v)o(e)f(it)h(kno)o(ws)262 2439
+y(will)e(lead)i(to)f(a)h(loss,)f(therefore)i(it)f(migh)o(t)e(as)i(w)o(ell)f
+(sp)q(end)i(most)d(of)i(its)f(time)g(attempting)946 2574 y(136)p
+eop
+%%Page: 137 139
+137 138 bop 262 307 a Fp(to)16 b(\014nd)g(an)g(impro)o(v)o(emen)o(t.)22
+b(Of)16 b(course,)i(if)d(the)i(loss)f(is)g(found)f(to)h(b)q(e)h(una)o(v)o
+(oidable)e(the)262 357 y(mo)o(v)o(e)d(whic)o(h)i(lasts)g(out)f(the)i(longest)
+f(will)e(b)q(e)j(pla)o(y)o(ed)e(immedia)o(tely)m(.)262 499
+y Fl(2.)35 b(New)21 b(Iteration)d(Begun:)41 b Fp(Before)19
+b(eac)o(h)f(new)h(iteration)e(b)q(egins)i(the)f(program)262
+549 y(calculates)10 b(ho)o(w)f(long)g(the)i(iteration)e(is)h(exp)q(ected)i
+(to)e(tak)o(e)f(based)i(on)f(the)g(time)f(tak)o(en)h(o)o(v)o(er)262
+599 y(previous)g(iterations.)17 b(F)m(or)10 b(example,)f(in)h(the)h(middle)e
+(game)g(an)h(iteration)g(t)o(ypically)f(tak)o(es)262 649 y(ab)q(out)15
+b(6)g(times)f(the)i(length)g(of)e(all)g(previous)i(iterations)1177
+634 y Fk(5)1196 649 y Fp(.)22 b(Additionally)m(,)13 b(an)i(iteration)262
+699 y(commi)o(tm)o(en)o(t)d(time)i(is)g(calculated.)21 b(If)14
+b(the)h(curren)o(t)h(resp)q(onse)h(time)c(will)h(expire)h(b)q(efore)262
+748 y(the)f(iteration)f(commi)o(tm)o(en)o(t)e(time,)h(the)i(searc)o(h)g(is)g
+(ab)q(orted.)k(Ho)o(w)o(ev)o(er,)c(if)e(the)i(program)262 798
+y(is)h(committed)f(to)i(the)g(iteration,)g(it)g(allo)o(ws)e(the)j(extra)f
+(time)f(reasonably)h(exp)q(ected)i(to)262 848 y(ac)o(hiev)o(e)e(some)f
+(results)i(from)e(the)h(new)h(iteration)f(commitm)n(en)o(t.)23
+b(Note)16 b(that)g(the)h(time)262 898 y(previously)c(tak)o(en)h(thinking)f
+(on)h(opp)q(onen)o(ts)g(time)f(is)h(also)f(tak)o(en)h(in)o(to)f(accoun)o(t.)
+504 1011 y(extraTime)g(=)h(iterationTime)e Ff(\000)i Fp(respTime)g(+)g
+(oppTime)262 1153 y Fl(3.)20 b(Searc)o(h)13 b(F)l(ailed)f(Lo)o(w:)41
+b Fp(When)12 b(the)h(searc)o(h)g(has)f(failed)g(lo)o(w,)f(the)h(true)h(v)n
+(alue)f(of)f(the)262 1203 y(b)q(est)h(mo)o(v)o(e)f(found)g(is)h(not)f(kno)o
+(wn,)h(it)f(is)h(only)f(kno)o(wn)g(that)h(it)f(is)h(w)o(orse)h(than)e(the)i
+Fh(\013)e Fp(v)n(alue)262 1253 y(of)h(the)h(initial)e(searc)o(h)j(windo)o(w.)
+i(In)d(this)g(case,)h(a)e(large)g(amoun)o(t)f(of)h(time)g(is)g(allo)q(cated)h
+(to)262 1303 y(actually)g(\014nd)i(a)f(true)i(score.)21 b(Otherwise,)16
+b(if)d(the)j(b)q(est)f(mo)o(v)o(e)e(found)h(w)o(ere)i(pla)o(y)o(ed,)e(it)g
+(is)262 1353 y(lik)o(ely)e(to)i(b)q(e)g(a)g(blunder.)739 1466
+y(extraTime)f(=)h(8)g Ff(\001)f Fp(respTime)262 1608 y Fl(4.)23
+b(Searc)o(h)16 b(F)l(ailed)f(High:)41 b Fp(Lik)o(e)14 b(a)g(fail)f(lo)o(w,)h
+(when)h(the)g(searc)o(h)h(fails)d(high)h(the)i(true)262 1658
+y(score)21 b(is)e(not)h(kno)o(wn.)35 b(Ho)o(w)o(ev)o(er,)22
+b(things)d(are)h(not)g(so)g(sev)o(ere)i(as)d(with)h(the)g(fail)f(lo)o(w)262
+1708 y(condition)13 b(as)h(it)g(is)h(kno)o(wn)e(that)i(the)g(b)q(est)g(mo)o
+(v)o(e)e(found)h(is)g(b)q(etter)i(than)e Fh(\014)r Fp(.)20
+b(Therefore,)262 1758 y(some)12 b(extra)i(time)e(is)h(allo)q(cated)g(to)h
+(allo)o(w)d(the)j(true)h(score)f(to)g(b)q(e)g(determined,)f(ho)o(w)o(ev)o
+(er,)262 1808 y(this)g(time)g(is)h(not)g(excessiv)o(e,)h(b)q(eing)f(set)g
+(at:)739 1921 y(extraTime)f(=)h(2)g Ff(\001)f Fp(respTime)262
+2063 y Fl(5.)41 b(Searc)o(h)21 b(V)l(alue)g(in)h(Aspiration)d(Windo)o(w:)40
+b Fp(The)20 b(actual)g(b)q(est)g(mo)o(v)o(e)e(v)n(alue)262
+2113 y(is)e(kno)o(wn,)h(therefore,)h(time)e(can)h(b)q(e)g(allo)q(cated)f
+(directly)h(from)e(the)j(v)n(alue)e(itself.)26 b(The)262 2163
+y(judgemen)o(t)17 b(is)h(based)i(on)e(the)h(di\013erence)h(b)q(et)o(w)o(een)g
+(the)f(b)q(est)h(mo)o(v)o(e's)d(v)n(alue)h(and)g(the)262 2213
+y(score)e(at)f(the)h(end)g(of)e(the)i(last)f(iteration.)22
+b(If)15 b(this)g(di\013erence)i(is)e(less)h(than)g(or)f(equal)g(to)262
+2263 y Ff(\000)p Fp(16,)e(extra)h(time)f(is)g(allo)q(cated)h(as)g(follo)o
+(ws:)599 2376 y(extraTime)f(=)h(\()p Ff(j)g Fp(di\013)f Ff(j)h
+Fp(/)f(16)h Ff(\001)f Fp(respTime\))h(/)f(8)p 262 2411 573
+2 v 308 2437 a Fj(5)325 2449 y Fi(the)e(fact)f(that)h(o)q(dd)f(ply)h
+(iterations)e(tak)o(e)i(longer)f(than)g(ev)o(en)g(ones)h(is)g(also)g(tak)o
+(en)f(in)o(to)h(accoun)o(t)946 2574 y Fp(137)p eop
+%%Page: 138 140
+138 139 bop 262 307 a Fp(F)m(or)11 b(example,)f(if)g(the)i(b)q(est)h(mo)o(v)o
+(e)d(at)h(this)g(iteration)g(app)q(ears)i(to)e(lose)g(a)g(pa)o(wn)h(relativ)o
+(e)f(to)262 357 y(the)16 b(previous)f(iteration)g(\(di\013)h(=)f
+Ff(\000)p Fp(100\),)g(the)h(extra)g(time)e(allo)q(cated,)h(giv)o(en)g
+(respTime)262 407 y(=)i(180)g(seconds)i(and)f(in)o(teger)g(arithmetic,)f(w)o
+(ould)g(b)q(e)h(135)f(seconds,)j(making)15 b(a)i(total)262
+457 y(time)11 b(of)i(5)g(min)o(utes)f(15)h(seconds.)19 b(F)m(or)13
+b(the)h(loss)g(of)e(a)h(bishop,)g(the)h(extra)g(time)e(w)o(ould)g(b)q(e)262
+506 y(ab)q(out)h(8)h(min)o(utes)f(\(total)g(time)g(11)g(min)o(utes\).)324
+592 y(This)h(metho)q(d)g(allo)o(ws)f(extra)h(time)g(to)g(b)q(e)h(allo)q
+(cated)f(as)g(and)g(when)h(necessary)m(.)21 b(The)262 641 y(loss)14
+b(of)f(a)h(piece)i(is)e(v)o(ery)g(lik)o(ely)f(to)i(mean)e(the)h(loss)h(of)e
+(the)i(game,)e(so)h(it)g(is)g(imp)q(ortan)o(t)f(to)262 691
+y(allo)q(cate)j(a)g(signi\014can)o(t)g(amoun)o(t)f(of)h(time)g(in)g(order)h
+(to)g(searc)o(h)h(for)e(a)h(w)o(a)o(y)f(of)g(a)o(v)o(oiding)262
+741 y(the)d(loss.)18 b(As)13 b(can)h(b)q(e)f(seen)h(the)g(actual)f(extra)g
+(time)f(allo)q(cated)g(is)h(directly)h(prop)q(ortional)262
+791 y(to)e(the)i(threatened)h(loss.)j(This)13 b(approac)o(h)g(also)f(helps)i
+(the)g(program)d(a)o(v)o(oid)h(the)i(horizon)262 841 y(e\013ect)20
+b(b)o(y)f(detecting)g(when)h(scores)g(drop)f(b)q(et)o(w)o(een)h(iterations,)g
+(and)f(then)g(allo)q(cating)262 891 y(more)12 b(time)h(to)h(see)h(o)o(v)o(er)
+f(the)g(searc)o(h)h(horizon.)324 976 y(When)e(the)g(di\013erence)i(is)e
+(greater)h(than)e Ff(\000)p Fp(16,)h(no)f(extra)i(time)d(is)i(allo)q(cated.)k
+(In)c(fact,)262 1026 y(the)j(time)e(is)h(reduced)i(for)e(n)o(umerous)g(ob)o
+(vious)g(mo)o(v)o(es.)21 b(The)16 b(follo)o(wing)d(attributes)j(are)262
+1075 y(tak)o(en)e(in)o(to)f(accoun)o(t)h(for)g(time)e(reduction:)324
+1190 y Ff(\017)20 b Fp(Whether)15 b(the)f(b)q(est)g(mo)o(v)o(e)e(has)i(main)o
+(tained)d(top)i(p)q(osition)g(throughout)g(all)g(itera-)365
+1240 y(tions.)324 1321 y Ff(\017)20 b Fp(Whether)15 b(a)f(fail)e(lo)o(w)h(or)
+h(high)f(has)h(o)q(ccurred)i(during)e(this)f(searc)o(h.)324
+1402 y Ff(\017)20 b Fp(Whether)15 b(the)g(b)q(est)g(mo)o(v)o(e)d(is)i
+(clearly)f(b)q(etter)j(than)e(all)e(its)i(siblings.)324 1484
+y Ff(\017)20 b Fp(Whether)15 b(the)g(mo)o(v)o(e)d(is)i(a)f(capture)i(or)f
+(recapture.)324 1565 y Ff(\017)20 b Fp(Whether)c(the)e(mo)o(v)o(e)f(w)o(as)h
+(part)g(of)g(the)h(main)d(line)h(predicted)j(from)c(the)j(previous)365
+1615 y(searc)o(h.)324 1696 y Ff(\017)20 b Fp(Whether)11 b(a)e(mo)o(v)o(e's)f
+(v)n(alue)h(falls)g(within)g(a)g(score)i(range)f(predicted)h(b)o(y)e(the)h
+(previous)365 1745 y(searc)o(h.)262 1860 y(Giv)o(en)19 b(this)i(information,)
+d(the)j(time)f(allo)q(cation)e(function)i(can)h(mak)o(e)e(a)h(reasonable)262
+1910 y(decision)14 b(ab)q(out)f(what)h(can)g(safely)p 717 1925
+102 2 v 14 w(b)q(e)g(considered)i(ob)o(vious.)324 1995 y(Please)11
+b(note,)g(this)g(time)e(allo)q(cation)g(adjustmen)o(t)h(pro)q(cess)i(is)f
+(con)o(tin)o(ually)e(p)q(erformed)262 2045 y(ev)o(ery)14 b(time)f(a)g(new)i
+(b)q(est)g(mo)o(v)o(e)d(is)i(found)f(or)h(an)g(iteration)f(completes.)262
+2188 y Fl(Chec)o(king)h(Time)262 2300 y Fp(Whenev)o(er)g(the)g(allo)q(cated)f
+(time)f(is)h(adjusted,)h(a)f(new)h(searc)o(h)h(expiry)e(time)f(exists.)19
+b(This)262 2350 y(expiry)10 b(time)f(is)h(calculated)h(from)d(the)j(resp)q
+(onse)i(time,)c(extra)i(time,)e(time)g(sp)q(en)o(t)j(thinking)262
+2399 y(on)i(opp)q(onen)o(ts)i(time)d(and)i(the)h(max)d(time.)20
+b(Using)15 b(this)g(expiry)g(time,)e(an)i(alarm)e(call)h(is)262
+2449 y(set)i(up)g(to)f(signal)g(the)h(program)e(when)i(its)f(searc)o(h)i
+(time)d(has)i(matured.)23 b(Additionally)m(,)946 2574 y(138)p
+eop
+%%Page: 139 141
+139 140 bop 262 307 a Fp(b)q(efore)19 b(setting)f(a)g(new)h(alarm)d(call)i
+(time,)g(the)h(old)e('alarm)f(call')h(m)o(ust)g(b)q(e)i(cancelled.)262
+357 y(This)13 b(approac)o(h)h(mak)o(es)f(use)i(of)e(the)h(UNIX)h(system)e
+(call)g Fm(alarm)p Fp(.)262 530 y Fr(6.5)69 b(E\016ciency)22
+b(Asp)r(ects)262 656 y Fp(E\016ciency)f(is)f(v)o(ery)h(imp)q(ortan)o(t)d(to)j
+(an)o(y)f(c)o(hess)i(program.)36 b(In)20 b(fact,)i(b)q(ecause)g(of)e(the)262
+706 y(un)o(usually)14 b(dominan)o(t)g(factor)i(of)f(e\016ciency)m(,)h(c)o
+(hess)h(programs)e(are)h(usually)f(quite)h(hard)262 756 y(to)h(follo)o(w.)28
+b(I)17 b(ha)o(v)o(e)h(tried)g(to)g(mak)o(e)e(HIAR)o(CS)h(as)h(clear)g(and)g
+(easy)g(to)g(understand)h(as)262 805 y(p)q(ossible,)13 b(while)h(k)o(eeping)f
+(to)h(the)h(o)o(v)o(erall)d(aims)h(of)g(e\016ciency)m(.)324
+891 y(The)e(follo)o(wing)e(sections)j(explain)e(program)g(e\016ciency)i(from)
+d(three)j(di\013eren)o(t)g(angles:)262 1042 y Fu(6.5.1)55 b(Algorithms)262
+1154 y Fp(T)m(ree)17 b(searc)o(hing)h(e\016ciency)g(is)f(of)f(primary)g(imp)q
+(ortance)g(to)h(the)h(o)o(v)o(erall)e(sp)q(eed)i(of)f(the)262
+1204 y(program.)25 b(F)m(or)17 b(example,)f(the)i(di\013erence)h(b)q(et)o(w)o
+(een)f(applying)e Fh(\013\014)j Fp(to)e(a)g(w)o(ell)f(ordered)262
+1254 y(tree)g(and)g(a)f(badly)g(ordered)i(tree)g(is)f(man)o(y)e(orders)i(of)f
+(magnitude.)22 b(In)16 b(HIAR)o(CS,)f(par-)262 1304 y(ticular)g(atten)o(tion)
+g(has)h(b)q(een)h(paid)e(to)g(impro)o(ving)e(mo)o(v)o(e)h(ordering)h(to)h
+(therefore)h(a)o(v)o(oid)262 1354 y(exploration)c(of)g(man)o(y)f(unnecessary)
+k(no)q(des.)324 1439 y(Other)11 b(areas)g(lik)o(e)e(mo)o(v)o(e)f(generation,)
+j(for)f(example,)f(ha)o(v)o(e)h(b)q(een)h(made)e(more)g(e\016cien)o(t)262
+1489 y(b)o(y)k(the)i(use)f(of)g(suitable)f(data)h(structures.)262
+1640 y Fu(6.5.2)55 b(Data)19 b(Structures)262 1752 y Fp(Data)c(structure)k
+(comp)q(osition)c(mak)o(es)g(a)h(large)h(con)o(tribution)f(to)g(o)o(v)o
+(erall)g(program)f(ef-)262 1802 y(\014ciency)j(b)o(y)f(allo)o(wing)e(fast)i
+(storage)g(and)h(retriev)n(al)f(of)f(imp)q(ortan)o(t)g(information.)25
+b(The)262 1852 y(incremen)o(tal)13 b(attac)o(k)g(tables)i(and)e(transp)q
+(osition)h(table)g(are)g(ob)o(vious)g(examples)f(of)g(this.)262
+1902 y(The)e(rather)i(complex)d(ev)n(aluation)g(function)h(w)o(ould)f(b)q(e)j
+(just)e(to)q(o)g(exp)q(ensiv)o(e)i(to)e(compute)262 1952 y(w)o(ere)j(it)g
+(not)g(for)f(the)i(attac)o(k)f(tables.)324 2037 y(Without)d(the)h(use)g(of)f
+(a)g(large)g(easily)g(accessible)i(transp)q(osition)e(table,)h(m)o(uc)o(h)e
+(w)o(asted)262 2087 y(e\013ort)18 b(w)o(ould)f(result)h(from)e(exploring)h
+(duplicate)h(subtrees.)32 b(The)18 b(impro)o(v)o(emen)o(ts)d(are)262
+2137 y(particularly)f(eviden)o(t)j(in)e(the)h(endgame,)f(where)i(a)e(5-fold)g
+(sp)q(eed)i(impro)o(v)o(emen)o(t)c(is)j(not)262 2186 y(uncommon.)946
+2574 y(139)p eop
+%%Page: 140 142
+140 141 bop 262 307 a Fu(6.5.3)55 b(Co)r(de)18 b(Pro)r(duction)262
+419 y Fp(Consideration)d(m)o(ust)g(also)g(b)q(e)h(giv)o(en)f(to)h(the)g(co)q
+(de)h(pro)q(duced)g(b)o(y)e(the)i(C)e(compiler.)23 b(It)262
+469 y(ma)o(y)17 b(ha)o(v)o(e)j(b)q(een)h(noted)g(ho)o(w)e(all)g(m)o(y)f(main)
+g(data)h(structure)j(records)g(are)e(of)f(a)h(size)262 519
+y(divisible)e(b)o(y)i(2.)35 b(This)20 b(allo)o(ws)f(the)h(compiler)f(to)g
+(use)i(a)e(less)i(time)d(consuming)h(shift)262 569 y(op)q(eration,)13
+b(instead)h(of)f(m)o(ultiplication,)d(to)k(access)i(individual)11
+b(records.)324 654 y(Unsigned)19 b(data)f(t)o(yp)q(es)h(are)g(used)h(where)g
+(p)q(ossible)e(to)h(impro)o(v)o(e)e(the)i(e\016ciency)g(of)262
+704 y(the)13 b(addressing)h(co)q(de)g(pro)q(duced.)20 b(F)m(or)12
+b(example,)g(when)i(using)f(a)g(signed)g(16)g(bit)g(in)o(teger)262
+754 y(as)k(an)f(index)h(in)o(to)f(an)h(arra)o(y)m(,)f(the)i(compiler)d(m)o
+(ust)h(pro)q(duce)i(an)f(extra)h(instruction)f(to)262 803 y(p)q(erform)d
+(sign)i(extensions)h(\(EXT.L)e(on)h(a)f(MC68000\))g(in)h(a)f(32)g(bit)h
+(addressing)g(mo)q(de.)262 853 y(With)d(unsigned)h(in)o(tegers,)g(none)g(of)g
+(this)g(is)f(necessary)m(.)324 938 y(All)g(constructs)j(and)e(expressions)i
+(whic)o(h)e(pro)q(duce)i(time)d(exp)q(ensiv)o(e)i(mac)o(hine)e(co)q(de)262
+988 y(are)h(a)o(v)o(oided)f(where)i(p)q(ossible.)j(F)m(or)c(example,)e(few)i
+(division)e(op)q(erations)i(are)h(used.)324 1073 y(Most)g(functions)g(use)h
+(register)g(v)n(ariables)e(for)g(the)i(most)d(commonly)f(used)j(data)g(ob-)
+262 1123 y(jects.)36 b(Of)19 b(course,)j(ho)o(w)d(often)h(these)h(v)n
+(ariables)d(are)i(register)h(residen)o(t)g(dep)q(ends)g(on)262
+1173 y(UNIX)14 b(and)f(the)i(C)f(Compiler.)324 1258 y(Unfolding)f(lo)q(ops)i
+(and)f(pro)q(ducing)h(linear)g(co)q(de)g(is)g(another)g(tric)o(k)g(to)g
+(extract)h(more)262 1308 y(sp)q(eed.)j(Ho)o(w)o(ev)o(er,)12
+b(I)g(ha)o(v)o(e)g(a)o(v)o(oided)g(suc)o(h)h(practice)g(on)f(the)h(whole)f
+(to)g(impro)o(v)o(e)e(readabil-)262 1358 y(it)o(y)j(and)h(ease)g(dev)o
+(elopmen)o(t)f(testing.)324 1443 y(I)k(ha)o(v)o(e)h(made)e(a)h(n)o(um)o(b)q
+(er)g(of)g(critical)g(v)n(ariables)g(global)f(to)h(a)o(v)o(oid)f(using)i(up)f
+(time,)262 1493 y(passing)h(large)g(amoun)o(ts)g(of)g(data)g(on)g(the)i(stac)
+o(k.)32 b(Ho)o(w)o(ev)o(er,)20 b(I)f(ha)o(v)o(e)f(also)g(emplo)o(y)o(ed)262
+1543 y(some)e(data)h(hiding)f(tec)o(hniques)j(where)f(suitable)g(to)f(ease)h
+(dev)o(elopmen)o(t)e(and)i(testing.)262 1593 y(The)c(HashDriv)o(er)g(mo)q
+(dule)e(is)i(an)g(ob)o(vious)f(example)g(of)g(this.)324 1678
+y(Individually)m(,)18 b(all)g(these)j(impro)o(v)o(em)o(en)o(ts)d(are)h(v)o
+(ery)h(small.)32 b(Ho)o(w)o(ev)o(er,)21 b(when)f(y)o(ou)262
+1728 y(consider)15 b(that)g(a)f(n)o(um)o(b)q(er)g(of)h(co)q(de)g(units)g(are)
+g(executed)i(man)o(y)c(milli)o(ons)f(of)i(times,)g(the)262
+1778 y(o)o(v)o(erall)e(e\013ect)k(can)e(b)q(e)g(quite)g(impressiv)o(e.)946
+2574 y(140)p eop
+%%Page: 141 143
+141 142 bop 262 654 a Fn(Chapter)34 b(7)262 897 y Fo(Program)40
+b(P)m(erformance)262 1148 y Fp(In)17 b(order)h(to)f(b)q(e)i(able)e(to)g(ev)n
+(aluate)g(the)h(tec)o(hniques)h(emplo)o(y)o(ed)d(in)h(HIAR)o(CS)g(5.0,)g(the)
+262 1198 y(program's)g(strengths)k(and)d(w)o(eaknesses)k(need)e(to)f(b)q(e)g
+(assessed.)36 b(F)m(ortunately)m(,)19 b(c)o(hess)262 1248 y(pro)o(vides)14
+b(man)o(y)e(w)o(a)o(ys)h(of)g(testing)i(a)e('pla)o(y)o(ers')g(abilit)o(y)m(.)
+324 1333 y(The)g(ELO)h(c)o(hess)g(rating)f(system)g([19)o(])f(has)h(b)q(een)h
+(used)g(w)o(orld)f(wide)g(for)g(o)o(v)o(er)g(t)o(w)o(en)o(t)o(y)262
+1383 y(y)o(ears)h(to)h(estimate)e(a)h(pla)o(y)o(er's)g(abilit)o(y)f(in)h
+(terms)g(of)f(rating)h(p)q(oin)o(ts.)20 b(Chess)15 b(ratings)f(are)262
+1433 y(ac)o(hiev)o(ed)h(b)o(y)f(pla)o(ying)f(a)i(n)o(um)o(b)q(er)f(of)g
+(games)g(against)g(already)g(rated)i(pla)o(y)o(ers.)k(Using)15
+b(a)262 1483 y(rating/probabilit)o(y)c(table,)i(a)h(rating)f(can)h(b)q(e)h
+(calculated)f(based)h(on)e(ones)i(p)q(erformance)262 1532 y(against)9
+b(the)i(rated)f(pla)o(y)o(ers.)17 b(I)10 b(will)e(use)j(a)f(similar)e(metho)q
+(d)h(to)h(pro)o(vide)g(a)f(rough)h(estimate)262 1582 y(of)j(HIAR)o(CS's)g(c)o
+(hess)j(rating.)324 1667 y(Chess)g(ratings)g(can)f(also)g(b)q(e)h(estimated)f
+(from)f(a)h(set)h(of)f(test)i(p)q(ositions.)22 b(Although)262
+1717 y(this)d(metho)q(d)g(is)h(not)f(used)i(o\016cially)d(to)h(rate)h(pla)o
+(y)o(ers,)h(it)e(can)h(b)q(e)h(used)f(to)g(giv)o(e)f(an)262
+1767 y(estimate)11 b(of)h(the)h(tested)h(pla)o(y)o(ers)e(rating.)17
+b(Also,)12 b(these)h(tests)h(allo)o(w)d(a)h(pla)o(y)o(er's)g(abilit)o(y)e(in)
+262 1817 y(v)n(arious)k(areas)i(of)f(c)o(hess,)h(e.g.)23 b(tactical)15
+b(pla)o(y)m(,)e(to)j(b)q(e)g(measured.)22 b(Therefore,)16 b(suc)o(h)h(test)
+262 1867 y(p)q(ositions)9 b(will)f(b)q(e)j(useful)f(to)g(me)f(in)g(iden)o
+(tifying)f(the)j(relativ)o(e)e(strengths)j(and)e(w)o(eaknesses)262
+1916 y(of)j(HIAR)o(CS.)324 2002 y(The)j(follo)o(wing)d(tests)k(will)d(b)q(e)i
+(p)q(erformed)g(to)f(assess)i(the)g(program's)d(o)o(v)o(erall)g(c)o(hess)262
+2052 y(rating,)e(st)o(yle,)i(strength)h(and)f(w)o(eakness)h(in)e(the)i(v)n
+(arious)e(areas)h(of)g(the)g(game:)312 2170 y(1.)20 b Fl(Bratk)o(o-Kop)q(ec)g
+(T)l(ests)p Fp(:)k(These)19 b(test)g(p)q(ositions)e(will)f(b)q(e)i(used)h(to)
+e(estimate)g(a)365 2220 y(rating)10 b(and)f(assess)j(b)q(oth)e(the)g
+(tactical)g(and)f(p)q(ositional)g(strengths)i(of)e(the)i(program.)312
+2303 y(2.)20 b Fl(Computer)15 b(Opp)q(osition)p Fp(:)h(A)e(matc)o(h)g(will)f
+(b)q(e)i(pla)o(y)o(ed)f(b)q(et)o(w)o(een)i(HIAR)o(CS)e(and)365
+2353 y(a)g(rated)h(computer)e(opp)q(onen)o(t)h(to)g(illustrate)g(its)g(pla)o
+(ying)e(st)o(yle)i(and)g(estimate)g(its)365 2402 y(rating.)946
+2574 y(141)p eop
+%%Page: 142 144
+142 143 bop 312 307 a Fp(3.)20 b Fl(Human)f(Opp)q(osition)o
+Fp(:)h(A)d(matc)o(h)e(will)g(b)q(e)i(pla)o(y)o(ed)f(b)q(et)o(w)o(een)i(HIAR)o
+(CS)f(and)f(a)365 357 y(rated)h(h)o(uman)d(opp)q(onen)o(t)j(to)f(\014nd)g
+(out)g(ho)o(w)f(it)h(cop)q(es)h(with)f(a)g(h)o(uman's)e(st)o(yle)i(of)365
+407 y(pla)o(y)d(and)h(to)g(further)g(estimate)g(its)g(rating.)312
+490 y(4.)20 b Fl(Kno)o(wledge)c(v)o(ersus)g(Searc)o(h)p Fp(:)k(A)15
+b(matc)o(h)g(will)e(b)q(e)j(pla)o(y)o(ed)f(b)q(et)o(w)o(een)i(HIAR)o(CS)365
+540 y(and)c(a)g(v)o(ersion)g(of)f(itself)g(with)h(dramatically)d(reduced)15
+b(leaf)d(no)q(de)h(kno)o(wledge)g(and)365 589 y(no)19 b(searc)o(h)g
+(extensions.)33 b(This)18 b('kno)o(wledge-less')g(v)o(ersion)h(of)f(HIAR)o
+(CS)g(will)f(b)q(e)365 639 y(allo)o(w)o(ed)h(to)g(searc)o(h)i(3)e(ply)h(deep)
+q(er)h(than)f(the)g(more)f(in)o(telligen)o(t)f(v)o(ersion.)33
+b(This)365 689 y(should)18 b(enable)g(me)f(to)h(estimate)g(what)g(the)g(kno)o
+(wledge)g(is)g(w)o(orth)g(in)f(terms)h(of)365 739 y(searc)o(h)d(depth.)324
+857 y(All)h(tests)j(are)f(p)q(erformed)f(with)g(HIAR)o(CS)g(5.0)f(running)h
+(on)g(a)g(SUN)h(3/80,)f(whic)o(h)262 907 y(pro)o(vides)d(a)f(rate)i(of)e
+(appro)o(ximately)e(300)i(to)h(1200)f(\(legal\))g(no)q(des)i(p)q(er)g
+(second.)262 1080 y Fr(7.1)69 b(Bratk)n(o-Kop)r(ec)23 b(T)-6
+b(ests)262 1206 y Fp(A)10 b(series)i(of)d(24)h(test)h(p)q(ositions)f(w)o(as)h
+(devised)g(b)o(y)f(I.)f(Bratk)o(o)i(and)f(D.)f(Kop)q(ec)j(to)e(in)o(v)o
+(estigate)262 1256 y(and)j(assess)j(c)o(hess)f(p)q(erformance)f(under)h(t)o
+(w)o(o)e(categories:)324 1374 y Ff(\017)20 b Fp(T)m(actical)13
+b(pla)o(y)324 1458 y Ff(\017)20 b Fp(P)o(ositional)13 b(pla)o(y)262
+1576 y(The)f(p)q(ositional)f(tests)i(concen)o(trate)h(in)e(particular)g(on)f
+(lev)o(er)i(mo)o(v)o(es,)e(whic)o(h)h(Bratk)o(o)g(and)262 1626
+y(Kop)q(ec)j(b)q(eliev)o(ed,)e(pla)o(y)g(an)h(imp)q(ortan)o(t)e(role)i(in)f
+(a)h(strong)g(pla)o(y)o(ers)g(abilit)o(y)m(.)324 1711 y(This)f(test)h(set)h
+(w)o(as)e(c)o(hosen)h(in)f(particular)g(b)q(ecause)i(it)e(has)h(b)q(een)h
+(applied)d(to)h(almost)262 1761 y(all)18 b(the)j(strongest)h(c)o(hess)f
+(programs)e(in)h(the)h(w)o(orld)e([41)o(],)i(therefore)h(allo)o(wing)17
+b(useful)262 1811 y(comparisons)f(to)h(b)q(e)h(made.)28 b(In)17
+b(the)h(original)e(test,)i(pla)o(y)o(ers)g(w)o(ere)g(ask)o(ed)g(to)f(giv)o(e)
+g(the)262 1860 y(b)q(est)g(four)f(mo)o(v)o(es)e(in)i(order)h(of)e(merit)g
+(for)h(eac)o(h)h(p)q(osition.)24 b(A)16 b(correct)i(mo)o(v)o(e)c(w)o(as)i
+(then)262 1910 y(scored)j(as)f(follo)o(ws:)25 b(1)17 b(p)q(oin)o(t)h(for)g(a)
+f(correct)j(1st)e(c)o(hoice,)1226 1894 y Fk(1)p 1226 1901 17
+2 v 1226 1925 a(2)1265 1910 y Fp(p)q(oin)o(t)g(for)f(a)h(correct)i(2nd)262
+1960 y(c)o(hoice,)401 1944 y Fk(1)p 401 1951 V 401 1974 a(3)437
+1960 y Fp(p)q(oin)o(t)13 b(for)h(a)f(correct)j(3rd)e(c)o(hoice)g(and)1065
+1944 y Fk(1)p 1065 1951 V 1065 1974 a(4)1100 1960 y Fp(p)q(oin)o(t)g(for)f(a)
+h(correct)h(4th)f(c)o(hoice.)324 2045 y(The)f(problem)f(with)h(computer)f
+(test)j(sub)r(jects)f(is)f(that)g(the)h Fh(\013\014)i Fp(algorithm)10
+b(do)q(es)k(not)262 2095 y(pro)o(vide)f(an)f(accurate)j(b)q(est)f(n)f(c)o
+(hoices,)h(only)f(the)g(b)q(est)i(mo)o(v)o(e)c(found)i(so)g(far.)18
+b(Therefore,)262 2145 y(Bratk)o(o)g(and)f(Kop)q(ec)i(suggested)h(the)e
+(computers)h(c)o(hoice)f(after)g(120,)g(180,)g(30)f(and)h(60)262
+2195 y(seconds)f(should)e(b)q(e)h(used)h(as)e(the)i(1st,)e(2nd,)h(3rd)g(and)f
+(4th)g(c)o(hoices)i(resp)q(ectiv)o(ely)m(.)24 b(The)262 2245
+y(computer)16 b(is)h(therefore)h(at)f(a)g(sligh)o(t)f(disadv)n(an)o(tage)g
+(as)h(its)g(4)f(c)o(hoices)i(ma)o(y)d(all)g(b)q(e)j(the)262
+2294 y(same.)324 2380 y(The)13 b(actual)f(test)i(p)q(ositions)e(can)h(b)q(e)g
+(found)g(in)f(app)q(endix)h(D.)e(The)j(results)f(pro)q(duced)262
+2429 y(b)o(y)g(HIAR)o(CS)h(5.0)f(are)h(sho)o(wn)g(in)f(\014gure)i(7.1.)946
+2574 y(142)p eop
+%%Page: 143 145
+143 144 bop 344 596 1268 2 v 343 646 2 50 v 369 631 a Fm(No.)p
+496 646 V 88 w(Best)15 b(move)p 733 646 V 88 w(1st)p 911 646
+V 119 w(2nd)p 1089 646 V 117 w(3r)n(d)p 1267 646 V 121 w(4th)p
+1445 646 V 85 w(Points)p 1611 646 V 344 648 1268 2 v 343 697
+2 50 v 369 682 a Fp(1\(T\))p 496 697 V 70 w(...)i(Qd1+)p 733
+697 V 86 w(Qd1+)p 911 697 V 195 w(forced)e(mate)p 1445 697
+V 231 w(1)p 1611 697 V 344 699 1268 2 v 343 749 2 50 v 369
+734 a(2\(L\))p 496 749 V 74 w(d5)p 733 749 V 222 w(Re3)p 911
+749 V 108 w(Re3)p 1089 749 V 108 w(Re3)p 1267 749 V 108 w(Re3)p
+1445 749 V 126 w(0)p 1611 749 V 344 750 1268 2 v 343 800 2
+50 v 369 785 a(3\(L\))p 496 800 V 74 w(...)i(f5)p 733 800 V
+197 w(f5)p 911 800 V 144 w(f5)p 1089 800 V 123 w(Qd8)p 1267
+800 V 102 w(Qd8)p 1445 800 V 123 w(1)p 1611 800 V 344 802 1268
+2 v 343 852 2 50 v 369 837 a(4\(L\))p 496 852 V 74 w(e6)p 733
+852 V 243 w(e6)p 911 852 V 138 w(e6)p 1089 852 V 139 w(e6)p
+1267 852 V 139 w(e6)p 1445 852 V 142 w(1)p 1611 852 V 344 853
+1268 2 v 343 903 2 51 v 369 888 a(5\(T\))p 496 903 V 70 w(Nd5)p
+733 903 V 195 w(Bf4)p 911 903 V 115 w(Bf4)p 1089 903 V 108
+w(Nd5)p 1267 903 V 103 w(Nd5)p 1445 903 V 1520 872 a Fk(1)p
+1520 879 17 2 v 1520 903 a(3)p 1611 903 2 51 v 344 905 1268
+2 v 343 955 2 50 v 369 940 a Fp(6\(L\))p 496 955 V 74 w(g6)p
+733 955 V 238 w(g6)p 911 955 V 136 w(g6)p 1089 955 V 137 w(c4)p
+1267 955 V 139 w(c4)p 1445 955 V 142 w(1)p 1611 955 V 344 957
+1268 2 v 343 1006 2 50 v 369 991 a(7\(T\))p 496 1006 V 70 w(Nf6)p
+733 1006 V 200 w(Bb4)p 911 1006 V 104 w(Bb4)p 1089 1006 V 106
+w(Rg3)p 1267 1006 V 105 w(Rg3)p 1445 1006 V 124 w(0)p 1611
+1006 V 344 1008 1268 2 v 343 1058 2 50 v 369 1043 a(8\(L\))p
+496 1058 V 74 w(f5)p 733 1058 V 250 w(f5)p 911 1058 V 144 w(f5)p
+1089 1058 V 144 w(f5)p 1267 1058 V 144 w(f5)p 1445 1058 V 144
+w(1)p 1611 1058 V 344 1059 1268 2 v 343 1109 2 50 v 369 1094
+a(9\(L\))p 496 1109 V 74 w(f5)p 733 1109 V 232 w(Re1)p 911
+1109 V 108 w(Re1)p 1089 1109 V 108 w(Re1)p 1267 1109 V 108
+w(Re1)p 1445 1109 V 126 w(0)p 1611 1109 V 344 1111 1268 2 v
+343 1161 2 50 v 369 1146 a(10\(T\))p 496 1161 V 49 w(...)g(Ne5)p
+733 1161 V 142 w(Qc5)p 911 1161 V 107 w(Qc5)p 1089 1161 V 107
+w(Qc5)p 1267 1161 V 107 w(Qc5)p 1445 1161 V 126 w(0)p 1611
+1161 V 344 1162 1268 2 v 343 1212 2 50 v 369 1197 a(11\(L\))p
+496 1212 V 53 w(f4)p 733 1212 V 235 w(Nf5)p 911 1212 V 113
+w(Nf5)p 1089 1212 V 113 w(Nf5)p 1267 1212 V 112 w(Nf5)p 1445
+1212 V 129 w(0)p 1611 1212 V 344 1214 1268 2 v 343 1264 2 50
+v 369 1249 a(12\(T\))p 496 1264 V 49 w(...)g(Bf5)p 733 1264
+V 154 w(Bf5)p 911 1264 V 115 w(Bf5)p 1089 1264 V 114 w(Bf5)p
+1267 1264 V 115 w(Bf5)p 1445 1264 V 130 w(1)p 1611 1264 V 344
+1265 1268 2 v 343 1315 2 50 v 369 1300 a(13\(L\))p 496 1315
+V 53 w(b4)p 733 1315 V 222 w(Rc1)p 911 1315 V 108 w(Rc1)p 1089
+1315 V 108 w(Rc1)p 1267 1315 V 108 w(Rc1)p 1445 1315 V 126
+w(0)p 1611 1315 V 344 1317 1268 2 v 343 1367 2 50 v 369 1352
+a(14\(T\))p 496 1367 V 49 w(Qd2)p 733 1367 V 187 w(Qd2)p 911
+1367 V 102 w(Qd2)p 1089 1367 V 102 w(Qd2)p 1267 1367 V 102
+w(Qd2)p 1445 1367 V 123 w(1)p 1611 1367 V 344 1368 1268 2 v
+343 1418 2 50 v 369 1403 a(15\(T\))p 496 1418 V 49 w(Qxg7+)p
+733 1418 V 109 w(Qxg7+)p 911 1418 V 50 w(Qxg7+)p 1089 1418
+V 50 w(Qxg7+)p 1267 1418 V 50 w(Qxg7+)p 1445 1418 V 97 w(1)p
+1611 1418 V 344 1420 1268 2 v 343 1470 2 50 v 369 1455 a(16\(T\))p
+496 1470 V 49 w(Ne4)p 733 1470 V 196 w(Ne4)p 911 1470 V 108
+w(Ne4)p 1089 1470 V 108 w(Ne4)p 1267 1470 V 107 w(Ne4)p 1445
+1470 V 127 w(1)p 1611 1470 V 344 1471 1268 2 v 343 1521 2 50
+v 369 1506 a(17\(L\))p 496 1521 V 53 w(...)g(h5)p 733 1521
+V 182 w(h5)p 911 1521 V 134 w(h5)p 1089 1521 V 121 w(Nc5)p
+1267 1521 V 121 w(h5)p 1445 1521 V 139 w(1)p 1611 1521 V 344
+1523 1268 2 v 343 1573 2 50 v 369 1558 a(18\(T\))p 496 1573
+V 49 w(...)g(Nb3)p 733 1573 V 156 w(f5)p 911 1573 V 144 w(f5)p
+1089 1573 V 144 w(f5)p 1267 1573 V 144 w(f5)p 1445 1573 V 144
+w(0)p 1611 1573 V 344 1574 1268 2 v 343 1624 2 50 v 369 1609
+a(19\(T\))p 496 1624 V 49 w(...)g(Rxe4)p 733 1624 V 110 w(Rxe4)p
+911 1624 V 86 w(Rxe4)p 1089 1624 V 112 w(c5)p 1267 1624 V 139
+w(c5)p 1445 1624 V 142 w(1)p 1611 1624 V 344 1626 1268 2 v
+343 1676 2 50 v 369 1661 a(20\(L\))p 496 1676 V 53 w(g4)p 733
+1676 V 221 w(Qh5)p 911 1676 V 102 w(Qh5)p 1089 1676 V 102 w(Kb1)p
+1267 1676 V 102 w(Kb1)p 1445 1676 V 123 w(0)p 1611 1676 V 344
+1677 1268 2 v 343 1727 2 50 v 369 1712 a(21\(T\))p 496 1727
+V 49 w(Nh6)p 733 1727 V 189 w(Nh6)p 911 1727 V 103 w(Nh6)p
+1089 1727 V 102 w(Nh6)p 1267 1727 V 103 w(Nh6)p 1445 1727 V
+124 w(1)p 1611 1727 V 344 1729 1268 2 v 343 1778 2 50 v 369
+1764 a(22\(T\))p 496 1778 V 49 w(...)g(Bxe4)p 733 1778 V 121
+w(Rd8)p 911 1778 V 103 w(Rd8)p 1089 1778 V 105 w(Nc5)p 1267
+1778 V 107 w(Nc5)p 1445 1778 V 127 w(0)p 1611 1778 V 344 1780
+1268 2 v 343 1830 2 50 v 369 1815 a(23\(L\))p 496 1830 V 53
+w(...)g(f6)p 733 1830 V 183 w(Bf5)p 911 1830 V 115 w(Bf5)p
+1089 1830 V 114 w(Bf5)p 1267 1830 V 115 w(Bf5)p 1445 1830 V
+130 w(0)p 1611 1830 V 344 1832 1268 2 v 343 1881 2 50 v 369
+1866 a(24\(L\))p 496 1881 V 53 w(f4)p 733 1881 V 250 w(f4)p
+911 1881 V 144 w(f4)p 1089 1881 V 144 w(f4)p 1267 1881 V 144
+w(f4)p 1445 1881 V 144 w(1)p 1611 1881 V 344 1883 1268 2 v
+343 1933 2 51 v 369 1918 a Fm(T)m(otal)d(T)m(actic)n(al)g(Sc)n(or)n(e)h
+(\(T\))p 1445 1933 V 696 w Fp(7)1531 1902 y Fk(1)p 1531 1909
+17 2 v 1531 1932 a(3)p 1611 1933 2 51 v 344 1935 1268 2 v 343
+1985 2 50 v 369 1970 a Fm(T)m(otal)f(L)n(ever)g(Sc)n(or)n(e)h(\(L\))p
+1445 1985 V 757 w Fp(6)p 1611 1985 V 344 1986 1268 2 v 343
+2036 2 51 v 369 2021 a Fm(T)m(otal)f(Sc)n(or)n(e)h(\(S\))p
+1445 2036 V 850 w Fp(13)1542 2005 y Fk(1)p 1541 2012 17 2 v
+1541 2036 a(3)p 1611 2036 2 51 v 344 2038 1268 2 v 354 2154
+a Fp(Figure)f(7.1:)j(HIAR)o(CS)c(5.0)g(results)i(on)f(the)g(Bratk)o(o-Kop)q
+(ec)h(T)m(est)f(P)o(ositions.)946 2574 y(143)p eop
+%%Page: 144 146
+144 145 bop 324 307 a Fp(T)m(o)14 b(determine)h(the)h(relativ)o(e)f(bias)g
+(of)f(the)i(tested)h(pla)o(y)o(ers,)e(Bratk)o(o)g(and)g(Kop)q(ec)h(de-)262
+361 y(vised)f(the)h(follo)o(wing)c(equation:)21 b(bias)15 b(=)945
+341 y Fk(12)p Fd(\001)p Fk(\()p Fe(T)t Fd(\000)p Fe(L)p Fk(\))p
+945 352 142 2 v 1005 376 a Fe(S)1092 361 y Fp(,)g(where)h(T)f(is)h(the)f
+(tactical)g(score,)i(L)262 411 y(is)e(the)h(lev)o(er)h(score,)f(and)g(S)g(is)
+f(the)i(total)e(score.)24 b(This)16 b(equation)f(will)g(pro)q(duce)i(a)e(p)q
+(osi-)262 461 y(tiv)o(e)e(bias)h(v)n(alue)f(for)h(tactically)f(orien)o(ted)h
+(results)h(and)f(a)g(negativ)o(e)g(bias)f(v)n(alue)h(for)f(lev)o(er)262
+511 y(orien)o(ted)h(results.)324 596 y(Using)i(the)h(results)g(pro)q(duced)g
+(b)o(y)f(HIAR)o(CS,)g(this)g(equation)g(pro)q(duces)i(a)e(v)n(alue)f(of)262
+646 y(+1.2.)h(This)c(indicates)g(that)g(the)g(program)e(has)i(a)g(sligh)o(t)e
+(tactical)i(bias.)17 b(Ho)o(w)o(ev)o(er,)12 b(when)262 696
+y(Bratk)o(o)18 b(and)g(Kop)q(ec)h(pro)q(duced)g(a)f(histogram)f(of)g(the)i
+(bias)f(v)n(alues)g(pro)q(duced)h(b)o(y)f(the)262 745 y(c)o(hess)c(programs)e
+(in)g(their)i(exp)q(erimen)o(t,)e(programs)g(w)o(ere)i(found)f(to)f(ha)o(v)o
+(e)h(results)h(in)f(the)262 795 y(+2.4)d(to)i(+8)f(range)570
+780 y Fk(1)589 795 y Fp(.)17 b(The)12 b(most)f(frequen)o(t)h(v)n(alues)f(w)o
+(ere)i(found)e(in)g(the)h(+3)g(to)f(+5)h(range.)262 845 y(Therefore,)18
+b(when)f(HIAR)o(CS's)g(bias)g(v)n(alue)f(is)h(compared)f(to)h(these)h
+(results,)g(it)f(can)g(b)q(e)262 895 y(seen)e(that)f(HIAR)o(CS)f(has)h(a)g(w)
+o(ell)f(balanced)h(tactical)g(and)f(p)q(ositional)g(abilit)o(y)m(.)324
+980 y(It)g(is)g(in)o(teresting)h(to)g(note)f(that)h(of)f(the)g(h)o(umans)g
+(tested,)h(b)o(y)f(far)g(the)h(most)e(common)262 1030 y(v)n(alues)18
+b(la)o(y)g(in)h(the)g Ff(\000)p Fp(5)g(to)g(+3)g(range.)33
+b(Th)o(us,)20 b(indicating)e(that)h(most)f(h)o(uman)f(c)o(hess)262
+1080 y(pla)o(y)o(ers)c(ha)o(v)o(e)h(a)g(balanced)g(abilit)o(y)e(with)h(a)h
+(sligh)o(t)f(emphasis)g(on)h(p)q(ositional)e(pla)o(y)m(.)324
+1165 y(Bratk)o(o)i(and)f(Kop)q(ec)i(also)e(ga)o(v)o(e)h(a)f(table)h(giving)e
+(rating)i(ranges)g(and)g(corresp)q(onding)262 1215 y(mean)f(v)n(alues.)20
+b(The)15 b(v)n(alues)g(for)f(h)o(uman)f(pla)o(y)o(ers)i(in)f(the)h(ranges)h
+(2000-2199)c(and)j(2200-)262 1265 y(2399)d(are)j(giv)o(en)e(b)q(elo)o(w:)p
+516 1355 923 2 v 515 1405 2 50 v 541 1390 a Fm(R)n(ating)i(r)n(ange)p
+797 1405 V 50 w(Me)n(an)h(T)p 990 1405 V 49 w(Me)n(an)g(L)p
+1179 1405 V 50 w(12\(T)p Ff(\000)p Fm(L\)/S)p 1438 1405 V 516
+1407 923 2 v 515 1457 2 50 v 541 1442 a Fp(2000-2199)p 797
+1457 V 134 w(6.67)p 990 1457 V 116 w(4.84)p 1179 1457 V 150
+w(1.73)p 1438 1457 V 516 1458 923 2 v 515 1508 2 50 v 541 1493
+a(2200-2399)p 797 1508 V 134 w(7.81)p 990 1508 V 116 w(8.07)p
+1179 1508 V 160 w(0.2)p 1438 1508 V 516 1510 923 2 v 324 1620
+a(Comparing)9 b(these)j(results)h(with)d(those)i(of)f(HIAR)o(CS,)f(it)h(can)g
+(b)q(e)h(seen)h(that)e(HIAR)o(CS)262 1670 y(has)16 b(a)f(sligh)o(tly)g(b)q
+(etter)i(tactical)f(score)h(\(T\))f(and)g(a)g(noticeably)f(b)q(etter)j(lev)o
+(er)e(score)h(\(L\))262 1719 y(than)11 b(pla)o(y)o(ers)g(in)f(the)i
+(2000-2199)d(rating)h(range.)17 b(P)o(erhaps)c(more)d(surprisingly)m(,)g
+(HIAR)o(CS)262 1769 y(displa)o(y)o(ed)g(a)h(b)q(etter)i(balance)e(b)q(et)o(w)
+o(een)h(tactical)f(and)g(p)q(ositional)f(abilit)o(y)f(than)i(the)h(mean)262
+1819 y(results)j(in)e(that)h(rating)f(range.)324 1904 y(F)m(or)g(the)h
+(higher)g(rating)f(range,)h(HIAR)o(CS)f(has)h(a)f(lo)o(w)o(er)h(score,)g(b)q
+(oth)g(tactically)f(and)262 1954 y(p)q(ositionally)m(.)i(It)f(is)g(in)o
+(teresting,)g(ho)o(w)o(ev)o(er,)f(that)h(at)g(this)g(higher)g(range)g(the)g
+(lev)o(er)g(score)262 2004 y(is)20 b(greater)h(than)g(the)g(corresp)q(onding)
+g(tactical)g(score,)h(re-enforcing)f(m)o(y)e(b)q(elief)i(that)262
+2054 y(p)q(ositional)14 b(abilit)o(y)g(pla)o(ys)i(a)g(m)o(uc)o(h)e(greater)j
+(role)f(in)g(high)f(lev)o(el)h(c)o(hess)h(than)f(it)g(do)q(es)h(at)262
+2104 y(the)d(lo)o(w)o(er)g(lev)o(els)f(of)h(abilit)o(y)m(.)324
+2189 y(Examining)9 b(the)k(Bratk)o(o-Kop)q(ec)g(graph)f(of)f(rating)h(vs)g
+(score)i(and)d(the)i(results)g(ab)q(o)o(v)o(e,)262 2239 y(an)j(estimated)h
+(rating)f(can)i(b)q(e)f(assigned)h(to)f(HIAR)o(CS.)f(As)h(the)h(test)g
+(sample)e(is)h(small)262 2288 y(\(24)12 b(p)q(ositions\),)h(I)g(will)f(only)h
+(sa)o(y)g(HIAR)o(CS's)g(rating)f(is)i(lik)o(ely)e(to)h(lie)f(in)h(the)h
+(range)g(2030)p 262 2325 573 2 v 308 2352 a Fj(1)325 2364 y
+Fi(ignoring)c(w)o(eak)i(programs)d(whic)o(h)j(had)f(scores)g(so)h(lo)o(w)g
+(that)f(con\014dence)e(in)j(a)g(realistic)e(bias)h(v)n(alue)262
+2403 y(is)g(imp)q(ossible)946 2574 y Fp(144)p eop
+%%Page: 145 147
+145 146 bop 262 307 a Fp(to)16 b(2170.)25 b(My)16 b(past)h(exp)q(erience)i
+(of)d(c)o(hess)i(programs)d(b)q(eing)h(o)o(v)o(er-rated,)i(leads)e(me)g(to)
+262 357 y(exp)q(ect)f(that)f(this)g(rating)f(is)h(more)f(lik)o(ely)f(to)i
+(lie)f(at)h(the)h(lo)o(w)o(er)e(end)i(of)e(this)h(range.)324
+442 y(A)o(t)e(the)g(recen)o(t)h(\(1989\))e(W)m(orld)g(Computer)g(Chess)i
+(Championship)c(all)i(the)h(strongest)262 492 y(programs)18
+b(w)o(ere)i(also)f(tested)j(on)d(these)i(Bratk)o(o-Kop)q(ec)g(test)f(p)q
+(ositions)g([41)o(].)35 b(I)19 b(will)262 542 y(examine)c(the)j(reasons)h(wh)
+o(y)e(HIAR)o(CS)f(could)i(not)f(solv)o(e)g(some)f(of)h(the)h(test)g(p)q
+(ositions)262 592 y(and)h(using)g(the)h(ab)q(o)o(v)o(e)g(pap)q(er,)h(will)d
+(compare)h(its)g(successes)k(and)d(failures)f(with)g(the)262
+641 y(results)c(pro)q(duced)g(b)o(y)e(the)i(strongest)g(c)o(hess)g(mac)o
+(hines)e(in)h(the)g(w)o(orld.)324 727 y(Lo)q(oking)i(at)h(the)g(actual)g(mo)o
+(v)o(es)f(selected)j(in)e(the)g(tests,)i(a)e(n)o(um)o(b)q(er)g(of)f(p)q(oin)o
+(ts)h(are)262 777 y(w)o(orth)c(highligh)o(ting.)j(In)d(test)i(1,)e(HIAR)o(CS)
+g(found)g(the)h(forced)h(mate)d(in)h(3)h(v)o(ery)g(quic)o(kly)262
+826 y(\(2)j(seconds\).)32 b(In)18 b(test)i(5,)e(the)g(correct)i(mo)o(v)o(e)d
+(w)o(as)h(iden)o(ti\014ed)g(quic)o(kly)m(,)f(although)g(the)262
+876 y(program)12 b(w)o(as)h(not)h(fully)e(a)o(w)o(are)h(of)g(all)g(the)h(imp)
+q(ortan)o(t)e(v)n(ariations.)k(After)f(1)e(min)o(ute)f(50)262
+926 y(seconds)17 b(its)g(c)o(hoice)g(c)o(hanged)f(to)h(Bf4)f(un)o(til)f(at)h
+(the)h(next)g(iteration,)f(it)g(rev)o(erted)j(bac)o(k)262 976
+y(to)c(Nd5)g(once)h(ha)o(ving)e(examined)g(the)i(mo)o(v)o(e)e(to)h(enough)g
+(depth)h(to)f(fully)f('understand')262 1026 y(it.)26 b(Ho)o(w)o(ev)o(er,)17
+b(this)g(to)q(ok)g(a)f(total)g(of)h(ab)q(out)f(4)h(min)o(utes)f(and)g(could)h
+(therefore)h(not)f(b)q(e)262 1075 y(included)d(as)g(a)f(correct)j(answ)o(er.)
+324 1161 y(Of)k(the)i(tests)g(not)f(solv)o(ed,)g(the)h(follo)o(wing)c
+(reasons)k(can)f(b)q(e)g(iden)o(ti\014ed.)39 b(T)m(est)21 b(2)262
+1210 y(required)f(the)g(sacri\014ce)g(of)f(a)g(pa)o(wn)g(for)g(p)q(ositional)
+f(comp)q(ensation)h(whic)o(h)g(HIAR)o(CS)262 1260 y(could)d(not)g(fully)g
+(appreciate.)26 b(Ho)o(w)o(ev)o(er,)18 b(no)e(other)h(program)e(w)o(as)h
+(able)h(to)f(solv)o(e)h(this)262 1310 y(problem)12 b(either.)324
+1395 y(In)18 b(test)h(7,)f(HIAR)o(CS)g(w)o(as)g(able)g(to)g(see)h(the)g
+(correct)g(tactical)f(mo)o(v)o(e,)f(ho)o(w)o(ev)o(er,)i(it)262
+1445 y(disdained)e(the)g(mo)o(v)o(e)f(in)h(fa)o(v)o(our)f(of)h(the)h(strong)f
+(in)o(termediary)f(mo)o(v)o(e)g(Bb4.)28 b(The)18 b(top)262
+1495 y(Mephisto)g(mac)o(hine)f(also)g(refused)i(to)f(pla)o(y)f(Nf6)h(and)f
+(instead)i(c)o(hose)g(Qc1.)30 b(I)18 b(cannot)262 1545 y(b)q(eliev)o(e)c
+(this)g(w)o(as)f(b)q(ecause)j(it)e(could)f(not)h(see)h(the)g(tactical)e(p)q
+(ossibilities.)324 1630 y(In)f(tests)i(9,)e(11)f(and)i(13,)e(HIAR)o(CS)h(pla)
+o(y)o(ed)g(strong)h(p)q(ositional)d(mo)o(v)o(es,)h(although)h(not)262
+1680 y(the)f(b)q(est)g(mo)o(v)o(e.)k(This)c(highligh)o(ts)e(one)i(of)e(the)j
+(ma)r(jor)c(de\014ciencies)13 b(of)d(the)h(Bratk)o(o-Kop)q(ec)262
+1730 y(tests:)20 b(no)14 b(merit)f(is)h(giv)o(en)g(for)g(c)o(hosen)h(mo)o(v)o
+(es)e(whic)o(h,)h(although)g(not)g(correct,)i(are)e(v)o(ery)262
+1779 y(strong)g(alternativ)o(es.)k(After)d(all,)d(p)q(ositional)h(mo)o(v)o
+(es)f(are)j(sometimes)d(a)i(matter)f(of)g(st)o(yle)262 1829
+y(and)g('p)q(ersonal')h(preference.)324 1915 y(T)m(ests)h(10)f(and)g(22)g(w)o
+(ere)h(just)g(to)q(o)f(deep,)h(tactically)f(sp)q(eaking,)g(for)g(HIAR)o(CS)g
+(to)g(see)262 1964 y(in)h(the)h(allotted)e(t)o(w)o(o)h(min)o(utes.)22
+b(T)m(ests)16 b(20)f(and)h(23)f(are)h(v)o(ery)f(di\016cult)g(p)q(ositional)f
+(tests)262 2014 y(whic)o(h)f(HIAR)o(CS,)g(lik)o(e)g(almost)f(all)h(other)i
+(strong)f(programs)e(w)o(as)i(unable)g(to)g(solv)o(e.)324 2099
+y(I)21 b(w)o(as)f(particularly)g(impressed)h(b)o(y)g(HIAR)o(CS's)f(correct)i
+(c)o(hoice)g(in)e(tests)i(3)f(and)262 2149 y(17.)27 b(None)18
+b(of)f(the)h(strongest)g(programs)e(w)o(ere)j(able)e(to)g(solv)o(e)g(test)h
+(17,)f(indicating)g(its)262 2199 y(di\016cult)o(y)m(.)i(The)c(sp)q(eed)i(at)e
+(whic)o(h)f(HIAR)o(CS)h(iden)o(ti\014ed)g(the)g(correct)i(mo)o(v)o(e)c(...)20
+b(h5)15 b(\(less)262 2249 y(than)e(a)h(min)o(ute\),)e(w)o(as)i(encouraging.)
+324 2334 y(HIAR)o(CS)g(did)g(ac)o(hiev)o(e)h(a)f(lev)o(er)h(score)h
+Fm(e)n(qual)f Fp(to)f(Deep)i(Though)o(t,)d(1)i(p)q(oin)o(t)f
+Fm(ahe)n(ad)h Fp(of)262 2384 y(Hitec)o(h)c(and)h(only)e(1)h(p)q(oin)o(t)g
+Fm(less)g Fp(than)h(the)g(highly)e(p)q(ositional)g(Mephisto)h(mac)o(hine)g(!)
+17 b(This)262 2434 y(result)d(w)o(as)g(v)o(ery)g(pleasing.)946
+2574 y(145)p eop
+%%Page: 146 148
+146 147 bop 262 307 a Fr(7.2)69 b(Computer)22 b(Opp)r(osition)262
+434 y Fp(A)10 b(matc)o(h)f(will)g(b)q(e)i(pla)o(y)o(ed)f(b)q(et)o(w)o(een)i
+(HIAR)o(CS)e(5.0)f(and)i(the)g(commercial)c(c)o(hess)12 b(mac)o(hine,)262
+483 y(Mephisto)e(Exclusiv)o(e.)17 b(This)9 b(will)g(allo)o(w)f(a)h(further)i
+(rating)e(to)h(b)q(e)g(estimated)g(for)f(HIAR)o(CS)262 533
+y(and)16 b(will)e(pro)o(vide)j(n)o(umerous)e(examples)h(of)f(its)i(actual)f
+(pla)o(ying)e(st)o(yle,)j(strengths)h(and)262 583 y(w)o(eaknesses.)324
+668 y(The)i(Mephisto)f(mac)o(hine)f(used)j(w)o(as)e(rated)h(at)f(ELO)h(1733)f
+([24)o(].)34 b(This)19 b(mac)o(hine)262 718 y(is)h(sev)o(eral)h(y)o(ears)g
+(old)f(and)h(should)f(not)h(b)q(e)g(confused)h(with)e(the)h(latest)g
+(commercial)262 768 y(Mephistos)14 b(whic)o(h)g(ha)o(v)o(e)g(signi\014can)o
+(tly)e(higher)i(ratings)g(\(ELO)h(2100+\).)324 853 y(I)e(in)o(tend)h(to)f
+(pla)o(y)g(a)g(6)g(game)f(matc)o(h)h(b)q(et)o(w)o(een)h(the)h(mac)o(hines)d
+(using)h(a)h(time)e(con)o(trol)262 903 y(of)f(60)g(mo)o(v)o(es)f(in)i(30)f
+(min)o(utes)f(follo)o(w)o(ed)h(b)o(y)g(20)g(mo)o(v)o(es)g(in)g(ev)o(ery)h
+(subsequen)o(t)i(10)d(min)o(utes.)324 988 y(Belo)o(w)k(is)f(an)h(annotated)g
+(game)e(from)g(the)j(matc)o(h.)k(It)15 b(is)f(one)h(of)g(the)g(b)q(etter)i
+(games)262 1038 y(and)c(illustrates)h(man)o(y)e(attributes)j(of)e(HIAR)o
+(CS's)h(pla)o(y)m(.)i(HIAR)o(CS's)e(scores)h(are)g(sho)o(wn)262
+1088 y(p)q(erio)q(dically)d(in)i(brac)o(k)o(ets.)510 1169 y(Game)e(1)510
+1219 y(White)159 b(:)18 b Fl(Mephisto)c(Exclusiv)o(e)510 1269
+y Fp(Blac)o(k)170 b(:)18 b Fl(HIAR)o(CS)e(5.0)510 1319 y Fp(Op)q(ening)118
+b(:)18 b(Kings)c(Gam)o(bit)d(Accepted)781 1418 y(1.)62 b(e4)102
+b(e5)781 1468 y(2.)62 b(f4)107 b(ef)781 1518 y(3.)62 b(Nf3)76
+b(d6)781 1568 y(4.)62 b(Bc4)73 b(Be6)15 b(\(+59\))p 641 1678
+673 5 v 641 2343 5 665 v 646 1761 a Fg(rm0lkans)646 1844 y(opo0Zpop)646
+1927 y(0Z0obZ0Z)646 2010 y(Z0Z0Z0Z0)646 2094 y(0ZBZPo0Z)646
+2177 y(Z0Z0ZNZ0)646 2260 y(POPO0ZPO)646 2343 y(SNAQJ0ZR)p 1310
+2343 V 641 2347 673 5 v 762 2449 a Fp(P)o(osition)e(after)h(4.)k(...)f(Be6)
+946 2574 y(146)p eop
+%%Page: 147 149
+147 148 bop 262 307 a Fp(HIAR)o(CS)15 b(w)o(as)i(out)f(of)f(its)i(op)q(ening)
+f(b)q(o)q(ok)g(after)g(4.)25 b(Bc4.)g(BCO2)17 b(recommends)e(4.)25
+b(...)262 357 y(h6,)16 b(ho)o(w)o(ev)o(er,)i(HIAR)o(CS's)e(c)o(hoice)h(of)f
+(4.)26 b(...)g(Be6)17 b(ma)o(y)e(b)q(e)i(b)q(etter.)29 b(Mephisto)17
+b(is)f(also)262 407 y(no)o(w)d(out)h(of)f(its)h(op)q(ening)g(b)q(o)q(ok.)781
+575 y(5.)62 b(Bxe6)51 b(fe)781 625 y(6.)62 b(d4)97 b(Qf6)14
+b(\(+51\))262 743 y(With)d(blac)o(k's)h(pa)o(wn)g(structure)j(in)d(a)g
+(heathly)h(state,)g(HIAR)o(CS)f(aims)f(to)h(hang)g(on)g(to)h(its)262
+793 y(adv)n(anced)h(f-pa)o(wn.)k(An)c(alternativ)o(e)g(mo)o(v)o(e)f(w)o(as)h
+(6.)k(...)g(g5,)13 b(although)h(this)g(w)o(ould)f(limit)262
+843 y(HIAR)o(CS's)g(castling)g(options.)781 1011 y(7.)62 b(o-o)85
+b(Nc6)781 1061 y(8.)62 b(Nc3)71 b(Nge7)781 1111 y(9.)62 b(Nb5)k(o-o-o)781
+1161 y(10.)41 b(a4)99 b(a6)781 1210 y(11.)41 b(Nc3)71 b(e5!)19
+b(\(+148\))p 641 1337 673 5 v 641 2001 5 665 v 646 1420 a Fg(0Zks0a0s)646
+1503 y(Zpo0m0op)646 1586 y(pZno0l0Z)646 1669 y(Z0Z0o0Z0)646
+1752 y(PZ0OPo0Z)646 1835 y(Z0M0ZNZ0)646 1918 y(0OPZ0ZPO)646
+2001 y(S0AQZRJ0)p 1310 2001 V 641 2005 673 5 v 760 2124 a Fp(P)o(osition)13
+b(after)i(11.)i(...)g(e5!)262 2242 y(The)c(stage)g(is)g(set.)18
+b(With)13 b(the)g(kings)g(castled)g(on)g(opp)q(osite)g(\015anks,)g(blac)o
+(k's)f(activit)o(y)g(will)262 2292 y(concen)o(trate)20 b(on)e(the)h(king)f
+(side)g(while)g(white)h(will)e(concen)o(trate)j(on)e(the)h(queen)h(side.)262
+2342 y(After)15 b(mo)o(v)o(e)e(9,)h(HIAR)o(CS)g(c)o(hose)h(the)g(plan)f(of)g
+(king)g(side)h(attac)o(k)f(with)h(pa)o(wns.)20 b(Ha)o(ving)262
+2392 y(gained)11 b(a)h(temp)q(o)g(b)o(y)g(whites)g(premature)g(Nb5,)g(HIAR)o
+(CS)g(sets)i(out)e(to)g(close)h(the)f(cen)o(tre.)262 2442 y(It)f(is)h(imp)q
+(ortan)o(t)e(to)h(ha)o(v)o(e)h(a)f(closed)i(cen)o(tral)f(p)q(osition)f
+Fm(b)n(efor)n(e)g Fp(starting)g(an)o(y)h(\015ank)f(attac)o(k.)946
+2574 y(147)p eop
+%%Page: 148 150
+148 149 bop 781 357 a Fp(12.)41 b(d5)97 b(Nb4)262 460 y(12.)22
+b(...)g(Nb8)16 b(follo)o(w)o(ed)e(b)o(y)h(13.)23 b(...)f(Nd7)15
+b(lo)q(oks)g(a)g(b)q(etter)j(option.)k(Ho)o(w)o(ev)o(er,)16
+b(HIAR)o(CS)262 509 y(considered)e(whites)f(b)q(est)g(plan)f(w)o(as)h(a)f
+(queen)i(side)e(pa)o(wn)h(attac)o(k,)f(hence)i(it)e(preferred)j(to)262
+559 y(obstruct)g(this)f(b)o(y)f(pla)o(ying)f(Nb4)i(stopping)g(the)g(early)g
+(adv)n(ance)g(of)f(the)i(b)f(pa)o(wn)f(to)h(b4.)781 712 y(13.)41
+b(Bd2)68 b(Qg6?!)18 b(\(+82\))262 814 y(HIAR)o(CS)13 b(w)o(as)h(in)o(tending)
+f(to)h(follo)o(w)e(this)i(up)g(with)g(h5,)f(ho)o(w)o(ev)o(er)h(an)g
+(immediate)d(g5!)18 b(is)262 864 y(m)o(uc)o(h)12 b(stronger.)781
+1016 y(14.)41 b(Nh4)66 b(Qh6)781 1066 y(15.)41 b(Qg4+)35 b(Kb8)781
+1116 y(16.)41 b(Rac1)50 b(g5)781 1166 y(17.)41 b(Nf3)76 b(Rg8)781
+1216 y(18.)41 b(Nd1)66 b(a5)781 1265 y(19.)41 b(Bxb4)46 b(ab)781
+1315 y(20.)41 b(a5)99 b(Qg6)14 b(\(+179\))p 641 1476 673 5
+v 641 2140 5 665 v 646 1559 a Fg(0j0s0arZ)646 1642 y(Zpo0m0Zp)646
+1725 y(0Z0o0ZqZ)646 1808 y(O0ZPo0o0)646 1891 y(0o0ZPoQZ)646
+1974 y(Z0Z0ZNZ0)646 2057 y(0OPZ0ZPO)646 2140 y(Z0SNZRJ0)p 1310
+2140 V 641 2144 673 5 v 749 2247 a Fp(P)o(osition)f(after)h(20.)k(...)f(Qg6)
+262 2350 y(HIAR)o(CS)f(is)i(no)o(w)f(preparing)g(a)g(full)f(scale)i(pa)o(wn)f
+(assault)g(on)g(the)h(enem)o(y)f(king.)27 b(The)262 2399 y(precarious)12
+b(p)q(osition)f(of)g(the)h(white)g(queen)h(means)d(blac)o(ks)i(adv)n(ance)g
+(is)f(lik)o(ely)g(to)g(pro)q(ceed)262 2449 y(v)o(ery)j(quic)o(kly)m(.)946
+2574 y(148)p eop
+%%Page: 149 151
+149 150 bop 781 357 a Fp(21.)41 b(Nd2)262 475 y(Giving)12 b(the)i(white)g
+(queen)h(free)g(space)g(for)e(her)i(imp)q(ending)d(retreat.)781
+644 y(21.)41 b(...)105 b(Bg7?!)262 762 y(Unnecessary)m(,)15
+b(an)e(immediate)e(21)j(...)j(h5)c(is)h(v)o(ery)g(strong.)781
+930 y(22.)41 b(c4?)82 b(h5)781 980 y(23.)41 b(Qf3?)55 b(g4)781
+1030 y(24.)41 b(Qe2?!)262 1149 y(White)15 b(seems)g(una)o(w)o(are)h(of)f(the)
+h(imp)q(ending)e(danger.)23 b(Blac)o(ks)15 b(adv)n(an)o(tage)g(has)h(quic)o
+(kly)262 1198 y(b)q(ecome)d(o)o(v)o(erwhelming.)781 1367 y(24.)41
+b(...)105 b(f3!)18 b(\(+287\))p 641 1493 673 5 v 641 2158 5
+665 v 646 1576 a Fg(0j0s0ZrZ)646 1659 y(Zpo0m0a0)646 1742 y(0Z0o0ZqZ)646
+1825 y(O0ZPo0Zp)646 1908 y(0oPZPZpZ)646 1991 y(Z0Z0ZpZ0)646
+2075 y(0O0MQZPO)646 2158 y(Z0SNZRJ0)p 1310 2158 V 641 2162
+673 5 v 763 2280 a Fp(P)o(osition)13 b(after)h(24.)k(...)f(f3!)262
+2399 y(The)d(f-pa)o(wn)f(is)h(imm)n(une)e(to)h(attac)o(k,)h(if)f(25.)k(gf)d
+(gf+)f(wins.)946 2574 y(149)p eop
+%%Page: 150 152
+150 151 bop 781 357 a Fp(25.)41 b(Qf2)75 b(Bh6)781 407 y(26.)41
+b(Ne3)71 b(fg)781 457 y(27.)41 b(Kxg2)k(Rdf8)781 506 y(28.)c(Qe2)70
+b(Rf3!)17 b(\(+423\))781 556 y(29.)41 b(Nd1)66 b(Bxd2)781 606
+y(30.)41 b(Qxd2)i(Qxe4)781 656 y(31.)e(Qc2)70 b(Qf4)781 706
+y(32.)41 b(Nf2)76 b(g3)14 b(\(+793\))781 756 y(33.)41 b(Nd3)66
+b(gh+)p 641 878 673 5 v 641 1542 5 665 v 646 961 a Fg(0j0Z0ZrZ)646
+1044 y(Zpo0m0Z0)646 1127 y(0Z0o0Z0Z)646 1210 y(O0ZPo0Zp)646
+1293 y(0oPZ0l0Z)646 1376 y(Z0ZNZrZ0)646 1459 y(0OQZ0ZKo)646
+1542 y(Z0S0ZRZ0)p 1310 1542 V 641 1546 673 5 v 748 1660 a Fp(P)o(osition)13
+b(after)h(33.)j(...)g(gh+)262 1773 y(With)10 b(this)g(mo)o(v)o(e,)g(HIAR)o
+(CS)g(announced)h(mate)f(in)g(5)g(mo)o(v)o(es)g(after)h(a)f(2)h(ply)f(searc)o
+(h)h(taking)262 1823 y(just)j(1)f(second!)781 1987 y(34.)41
+b(Kh1)65 b(Rxf1+)781 2037 y(35.)41 b(Rxf1)54 b(Qxf1+)781 2086
+y(36.)41 b(Kxh2)i(Qg1+)781 2136 y(37.)e(Kh3)65 b(Qg3+)14 b(mate)899
+2186 y(0)36 b Ff(\000)65 b Fp(1)510 2236 y(Times:)242 b(21:23)45
+b(11:25)324 2350 y(Game)20 b(2)h(w)o(as)g(an)h(in)o(teresting)g(game.)39
+b(HIAR)o(CS)21 b(had)h(some)e(trouble)i(breaking)262 2399 y(through)15
+b(Mephisto's)h(defence.)26 b(HIAR)o(CS)15 b(ac)o(hiev)o(ed)h(success)i(b)o(y)
+e('sacri\014cing')f(the)h(ex-)262 2449 y(c)o(hange)c(of)f(ro)q(ok)h(for)f
+(knigh)o(t)g(and)h(pa)o(wn)f(on)h(mo)o(v)o(e)e(36.)17 b(Another)c(pa)o(wn)e
+(follo)o(w)o(ed)g(shortly)946 2574 y(150)p eop
+%%Page: 151 153
+151 152 bop 262 307 a Fp(afterw)o(ards)15 b(and)f(HIAR)o(CS)g(w)o(as)g(left)h
+(with)f(2)g(connected)i(passed)g(pa)o(wns)e(on)h(the)g(queen)262
+357 y(side.)324 442 y(The)j(p)q(osition)e(b)q(elo)o(w)h(w)o(as)g(reac)o(hed)i
+(after)f(56)e(mo)o(v)o(es)g(of)h(game)f(2.)28 b(HIAR)o(CS)17
+b(no)o(w)262 492 y(pla)o(y)o(ed)d(Qxe6+!)22 b(simplifying)12
+b(in)o(to)i(an)h(ev)o(en)g(more)f(easily)h(w)o(on)g(endgame.)20
+b(HIAR)o(CS's)262 542 y(score)15 b(increased)g(from)d(867)h(to)h(1116)f(p)q
+(oin)o(ts)g(after)i(this)f(mo)o(v)o(e.)p 641 635 673 5 v 641
+1300 5 665 v 646 718 a Fg(0Z0Z0Z0Z)646 801 y(Z0Z0Z0op)646 884
+y(0Z0Zrj0Z)646 968 y(O0Z0Z0Z0)646 1051 y(0O0Z0Z0Z)646 1134
+y(Z0Z0O0ZP)646 1217 y(QZ0Z0ZPJ)646 1300 y(Z0Z0Z0Z0)p 1310 1300
+V 641 1304 673 5 v 665 1407 a Fp(P)o(osition)f(after)h(56)f(mo)o(v)o(es)g(of)
+g(game)f(2.)324 1510 y(Game)k(3)h(w)o(as)h(a)f(strange)i(game)d(in)h(whic)o
+(h)h(b)q(oth)g(programs)e(made)h(tactical)g(blun-)262 1560
+y(ders.)30 b(Ho)o(w)o(ev)o(er,)18 b(HIAR)o(CS)g(consolidated)f(and)h(reco)o
+(v)o(ered)h(from)d(its)i(error,)h(where)g(as)262 1610 y(the)14
+b(Mephisto)g(mac)o(hine)f(did)g(not.)324 1695 y(Game)d(4)j(pro)q(duced)g(a)f
+(nice)h(solid)f(p)q(erformance)g(from)e(HIAR)o(CS,)i(announcing)g(mate)262
+1745 y(in)h(3)h(after)g(just)g(37)f(mo)o(v)o(es.)324 1830 y(Game)d(5)i
+(illustrated)g(reasonably)g(go)q(o)q(d)f(endgame)g(pla)o(y)m(,)g
+(particularly)g(the)i(handling)262 1880 y(of)g(the)h(king)f(and)h(pa)o(wn)g
+(ending.)324 1965 y(Game)9 b(6)h(pro)o(v)o(ed)g(di\016cult)g(for)g(HIAR)o
+(CS.)g(It)g(tried)h(a)f(n)o(um)o(b)q(er)g(of)f('to)q(o)h(clev)o(er')h
+(tactical)262 2015 y(mo)o(v)o(es)k(whic)o(h)i(had)g(longer)f(term)h(adv)o
+(erse)h(e\013ects.)29 b(The)17 b(blac)o(k)g(pa)o(wn)f(on)h(b2)g(allo)o(w)o
+(ed)262 2065 y(blac)o(k)h(to)h(p)q(ose)g(a)g(n)o(um)o(b)q(er)f(of)h
+(problems.)32 b(HIAR)o(CS)19 b(managed)e(to)i(see)h(through)f(the)262
+2115 y(complexit)o(y)d(and)i(had)g(prepared)i(a)e(nice)h(tactical)f(w)o(a)o
+(y)f(of)h(sa)o(ving)g(its)g(bishop)g(on)g(d7,)262 2165 y(something)c(whic)o
+(h)h(caugh)o(t)h(Mephisto)g(b)o(y)f(surprise.)25 b(By)16 b(the)g(endgame)e
+(HIAR)o(CS)i(w)o(as)262 2214 y(a)j(pa)o(wn)g(up,)h(ho)o(w)o(ev)o(er,)h(b)q
+(ecause)g(of)e(opp)q(osite)h(coloured)g(bishops)f(w)o(as)h(only)f(able)g(to)
+262 2264 y(dra)o(w.)i(This)15 b(is)g(an)g(example)e(where)k(sp)q(eci\014c)f
+(endgame)e(kno)o(wledge)h(could)g(ha)o(v)o(e)g(made)262 2314
+y(a)e(di\013erence.)324 2399 y(All)h(the)h(game)f(records)i(for)f(this)f
+(matc)o(h)g(can)h(b)q(e)h(found)e(in)g(app)q(endix)h(E.)g(The)g(\014nal)262
+2449 y(result)f(table)g(for)f(this)h(matc)o(h)f(can)h(b)q(e)h(seen)g(b)q(elo)
+o(w:)946 2574 y(151)p eop
+%%Page: 152 154
+152 153 bop 490 267 977 2 v 489 317 2 50 v 514 302 a Fm(Players)p
+890 317 V 268 w(1)p 961 317 V 50 w(2)p 1032 317 V 50 w(3)p
+1103 317 V 50 w(4)p 1174 317 V 50 w(5)p 1245 317 V 53 w(6)p
+1322 317 V 52 w(T)m(otal)p 1465 317 V 490 319 977 2 v 489 369
+2 51 v 514 354 a Fp(HIAR)o(CS)14 b(5.0)p 890 369 V 174 w(1)p
+961 369 V 50 w(1)p 1032 369 V 50 w(1)p 1103 369 V 50 w(1)p
+1174 369 V 50 w(1)p 1245 369 V 1276 338 a Fk(1)p 1276 345 17
+2 v 1276 368 a(2)p 1322 369 2 51 v 1370 354 a Fp(5)1396 338
+y Fk(1)p 1396 345 17 2 v 1396 368 a(2)p 1465 369 2 51 v 490
+370 977 2 v 489 420 2 51 v 514 406 a Fp(Mephisto)h(Exclusiv)o(e)p
+890 420 V 50 w(0)p 961 420 V 50 w(0)p 1032 420 V 50 w(0)p 1103
+420 V 50 w(0)p 1174 420 V 50 w(0)p 1245 420 V 1276 389 a Fk(1)p
+1276 396 17 2 v 1276 420 a(2)p 1322 420 2 51 v 1386 389 a(1)p
+1386 396 17 2 v 1386 420 a(2)p 1465 420 2 51 v 490 422 977
+2 v 324 521 a Fp(Before)j(I)f(calculate)h(HIAR)o(CS's)f(p)q(erformance)g
+(rating,)g(it)g(is)g(imp)q(ortan)o(t)f(to)h(stress)262 571
+y(that)11 b(ratings)g(calculated)g(at)g(one)h(time)e(con)o(trol)h(are)g(not)h
+(easily)e(transferred)j(in)o(to)e(ratings)262 621 y(at)17 b(other)i(time)e
+(con)o(trols.)31 b(Therefore,)20 b(some)d(risk)h(is)g(asso)q(ciated)h(with)e
+(p)q(erforming)g(a)262 671 y(matc)o(h)c(at)i(a)g(faster)g(time)f(con)o(trol)g
+(in)h(order)h(to)e(extrap)q(olate)i(a)e(rating)h(for)f(HIAR)o(CS)h(at)262
+720 y(tournamen)o(t)d(times.)324 806 y(HIAR)o(CS)18 b(w)o(on)g(the)h(matc)o
+(h)e(b)o(y)i(the)g(score)g(5)1072 789 y Fk(1)p 1072 796 17
+2 v 1072 820 a(2)1112 806 y Fp(-)1149 789 y Fk(1)p 1149 796
+V 1149 820 a(2)1171 806 y Fp(.)32 b(Using)18 b(the)h(win)f(probabilit)o(y)262
+855 y(tables)13 b(suggested)h(b)o(y)e(Arpad)i(Elo)e(and)h(found)f(in)g([32)o
+(],)g(an)h(estimated)f(rating)h(di\013erence)262 905 y(b)q(et)o(w)o(een)j
+(HIAR)o(CS)e(and)h(Mephisto)g(Exclusiv)o(e)g(can)g(b)q(e)g(lo)q(ok)o(ed)g
+(up.)21 b(The)15 b(matc)o(h)e(score)262 955 y(represen)o(ts)f(a)e(win)g
+(ratio)g(of)g(92\045.)16 b(This)10 b(con)o(v)o(erts)h(in)o(to)f(a)g(rating)f
+(di\013erence)k(of)c(401)h(p)q(oin)o(ts)262 1005 y(b)q(et)o(w)o(een)i(the)h
+(pla)o(y)o(ers.)k(Therefore,)c(giv)o(en)e(Mephisto)h(Exclusiv)o(e's)f(rating)
+g(of)g(ELO)h(1733,)262 1055 y(HIAR)o(CS's)h(p)q(erformance)h(rating)f(in)h
+(the)g(test)h(matc)o(h)e(is)g(ELO)i(2134)e(\(1733+401\).)324
+1140 y(T)m(aking)d(in)o(to)i(accoun)o(t)g(the)h(small)d(sample)h(of)g(the)i
+(test)g(matc)o(h)e(and)h(the)h(time)e(con)o(trol)262 1190 y(at)16
+b(whic)o(h)h(it)f(w)o(as)g(conducted,)j(this)d(rating)h(only)e(represen)o(ts)
+20 b(a)c(v)o(ery)h(rough)g(estimate.)262 1240 y(Ho)o(w)o(ev)o(er,)e(the)g
+(impressiv)o(e)f(score)i(b)o(y)f(whic)o(h)f(HIAR)o(CS)h(w)o(on)f(the)i(matc)o
+(h,)d(clearly)i(illus-)262 1289 y(trates)f(its)g(sup)q(eriorit)o(y)h(o)o(v)o
+(er)e(the)i(Mephisto)f(mac)o(hine.)262 1460 y Fr(7.3)69 b(Human)23
+b(Opp)r(osition)262 1587 y Fp(T)m(o)9 b(determine)i(ho)o(w)f(HIAR)o(CS)g(p)q
+(erforms)g(against)g(h)o(uman)f(opp)q(osition,)g(I)i(pla)o(y)o(ed)f(a)g
+(short)262 1636 y(t)o(w)o(o)16 b(game)f(matc)o(h)g(against)h(HIAR)o(CS.)g
+(When)h(I)f(last)g(pla)o(y)o(ed)g(activ)o(e)h(c)o(hess)h(\(1981/82\))262
+1686 y(m)o(y)10 b(rating)h(w)o(as)h(1920)f(on)h(the)g(ELO)g(scale.)18
+b(Since)13 b(I)f(ha)o(v)o(e)f(not)h(pla)o(y)o(ed)g(comp)q(etitiv)o(ely)e(for)
+262 1736 y(a)15 b(long)f(time,)g(I)h(am)f(lik)o(ely)g(to)h(b)q(e)h(a)f(bit)g
+('rust)o(y'.)22 b(Ho)o(w)o(ev)o(er,)16 b(m)o(y)d(in)o(terest)k(in)e(computer)
+262 1786 y(c)o(hess)i(has)f(allo)o(w)o(ed)f(me)g(to)g(pla)o(y)g('friendly')g
+(games)g(regularly)m(,)g(so)h(I)g(w)o(ould)f(exp)q(ect)i(m)o(y)262
+1836 y(rating)h(to)h(b)q(e)h(in)f(the)h(1900-2000)d(ELO)j(range.)34
+b(The)20 b(particular)f(adv)n(an)o(tage)g(I)g(ha)o(v)o(e)262
+1885 y(against)12 b(computer)h(opp)q(onen)o(ts)h(is)f(a)h(go)q(o)q(d)e
+(understanding)i(of)f(their)h(relativ)o(e)f(strengths)262 1935
+y(and)g(w)o(eaknesses.)324 2020 y(The)f(matc)o(h)f(games)h(w)o(ere)h(pla)o(y)
+o(ed)e(at)h(a)g(full)f(tournamen)o(t)h(time)f(con)o(trol)h(of)f(40)h(mo)o(v)o
+(es)262 2070 y(in)i(2)h(hours,)g(follo)o(w)o(ed)f(b)o(y)h(20)f(mo)o(v)o(es)g
+(in)h(eac)o(h)g(subsequen)o(t)i(hour.)22 b(Both)15 b(game)f(records)262
+2120 y(can)g(b)q(e)g(found)g(in)f(app)q(endix)h(E.)g(The)g(\014nal)f(matc)o
+(h)g(score)i(can)f(b)q(e)h(seen)g(b)q(elo)o(w:)p 683 2200 589
+2 v 682 2250 2 50 v 708 2235 a Fm(Players)p 986 2250 V 170
+w(1)p 1057 2250 V 50 w(2)p 1128 2250 V 50 w(T)m(otal)p 1271
+2250 V 683 2251 589 2 v 682 2301 2 50 v 708 2286 a Fp(HIAR)o(CS)f(5.0)p
+986 2301 V 76 w(1)p 1057 2301 V 50 w(0)p 1128 2301 V 86 w(1)p
+1271 2301 V 683 2303 589 2 v 682 2353 2 50 v 708 2338 a(Mark)g(Uniac)o(k)o(e)
+p 986 2353 V 50 w(0)p 1057 2353 V 50 w(1)p 1128 2353 V 86 w(1)p
+1271 2353 V 683 2354 589 2 v 324 2449 a(The)f(follo)o(wing)d(game)h(is)i(the)
+g(\014rst)h(from)d(the)i(matc)o(h.)k(HIAR)o(CS's)12 b(scores)i(are)g(sho)o
+(wn)946 2574 y(152)p eop
+%%Page: 153 155
+153 154 bop 262 307 a Fp(p)q(erio)q(dically)12 b(in)i(brac)o(k)o(ets.)510
+471 y(Game)e(1)510 521 y(White)159 b(:)18 b Fl(Mark)e(Uniac)o(k)o(e)510
+570 y Fp(Blac)o(k)170 b(:)18 b Fl(HIAR)o(CS)e(5.0)510 620 y
+Fp(Op)q(ening)118 b(:)18 b(Queens)e(Gam)o(bit)11 b(Declined)781
+720 y(1.)62 b(d4)97 b(d5)781 770 y(2.)62 b(c4)102 b(e6)781
+819 y(3.)62 b(Nc3)71 b(Nf6)781 869 y(4.)62 b(Bg5)70 b(Be7)781
+919 y(5.)62 b(e3)102 b(o-o)781 969 y(6.)62 b(Nf3)76 b(Nb)q(d7)781
+1019 y(7.)62 b(Bd3)p 641 1141 673 5 v 641 1805 5 665 v 646
+1224 a Fg(rZbl0skZ)646 1307 y(oponapop)646 1390 y(0Z0Zpm0Z)646
+1473 y(Z0ZpZ0A0)646 1556 y(0ZPO0Z0Z)646 1639 y(Z0MBONZ0)646
+1722 y(PO0Z0OPO)646 1805 y(S0ZQJ0ZR)p 1310 1805 V 641 1809
+673 5 v 780 1923 a Fp(P)o(osition)13 b(after)h(7.)k(Bd3.)324
+2037 y(This)d(mo)o(v)o(e)e(to)q(ok)h(HIAR)o(CS)h(out)g(of)f(its)h(op)q(ening)
+f(b)q(o)q(ok.)21 b(7.)g(Rc1)14 b(w)o(ould)h(ha)o(v)o(e)f(k)o(ept)262
+2086 y(HIAR)o(CS)f(in)g(b)q(o)q(ok.)781 2250 y(7.)62 b(...)105
+b(dc)15 b(\()p Ff(\000)p Fp(69\))781 2300 y(8.)62 b(Bxc4)51
+b(b6)14 b(\(!\))781 2350 y(9.)62 b(o-o)85 b(Bb7)781 2399 y(10.)41
+b(Rc1)71 b(c5)781 2449 y(11.)41 b(Re1)71 b(Rc8)14 b(\()p Ff(\000)p
+Fp(9\))946 2574 y(153)p eop
+%%Page: 154 156
+154 155 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0Zrl0skZ)646
+482 y(obZnapop)646 565 y(0o0Zpm0Z)646 648 y(Z0o0Z0A0)646 731
+y(0ZBO0Z0Z)646 814 y(Z0M0ONZ0)646 897 y(PO0Z0OPO)646 980 y(Z0SQS0J0)p
+1310 980 V 641 984 673 5 v 745 1090 a Fp(P)o(osition)13 b(after)h(11.)k(...)f
+(Rc8.)262 1197 y(HIAR)o(CS's)e(last)h(5)f(mo)o(v)o(es)g(ha)o(v)o(e)g(b)q(een)
+i(excellen)o(t)g(p)q(ositional)d(mo)o(v)o(es.)23 b(I)16 b(w)o(as)g(deligh)o
+(ted)262 1246 y(that)h(it)g(decided)i(to)e(\014anc)o(hetto)i(blac)o(k's)e
+(normally)d(bad)k(queens)h(bishop)e(on)g(the)i(long)262 1296
+y(diagonal.)c(HIAR)o(CS)d(seems)h(to)f(b)q(e)i(follo)o(wing)9
+b(the)14 b(correct)g(concepts)g(for)e(the)h(blac)o(k)f(side)262
+1346 y(of)h(a)g(queens)j(gam)o(bit.)781 1396 y(12.)41 b(Bd3)68
+b(cd)781 1446 y(13.)41 b(Nxd4)j(Ne5)781 1496 y(14.)d(Bb1)68
+b(Nfg4)781 1545 y(15.)41 b(Bxe7)51 b(Qxe7)781 1595 y(16.)41
+b(h3)97 b(Nf6)14 b(\(+64\))p 641 1674 V 641 2339 5 665 v 646
+1757 a Fg(0ZrZ0skZ)646 1840 y(obZ0lpop)646 1924 y(0o0Zpm0Z)646
+2007 y(Z0Z0m0Z0)646 2090 y(0Z0M0Z0Z)646 2173 y(Z0M0O0ZP)646
+2256 y(PO0Z0OPZ)646 2339 y(ZBSQS0J0)p 1310 2339 V 641 2343
+673 5 v 748 2449 a Fp(P)o(osition)f(after)h(16.)j(...)g(Nf6.)946
+2574 y(154)p eop
+%%Page: 155 157
+155 156 bop 262 345 a Fp(HIAR)o(CS)12 b(has)i(ac)o(hiev)o(ed)f(at)g(least)h
+(equalit)o(y)e(from)g(the)h(op)q(ening.)18 b(Ho)o(w)o(ev)o(er,)13
+b(I)g(w)o(as)h(more)262 395 y(afraid)g(of)h(16.)22 b(...)g(Qh4!)h(to)16
+b(whic)o(h)f(I)h(w)o(ould)e(ha)o(v)o(e)i(pla)o(y)o(ed)f(17.)22
+b(Qe2;)16 b(not)g(17)f(hg)g(Nxg4)262 445 y(whic)o(h)e(lo)q(oks)h(v)o(ery)g
+(promising)e(e.g.)17 b(18.)h(Nf3)13 b(Qxf2+)h(19.)j(Kh1)d(Qg3!)781
+542 y(17.)41 b(Qe2)70 b(Rfd8)781 592 y(18.)41 b(Red1)48 b(Rc5!?)781
+642 y(19.)41 b(e4)102 b(a6)781 692 y(20.)41 b(f4)107 b(Ng6)781
+741 y(21.)41 b(Qf2)75 b(Qc7)781 791 y(22.)41 b(Nde2)48 b(Rc4!)18
+b(\(+48\))p 641 918 673 5 v 641 1582 5 665 v 646 1001 a Fg(0Z0s0ZkZ)646
+1084 y(Zbl0Zpop)646 1167 y(po0ZpmnZ)646 1250 y(Z0Z0Z0Z0)646
+1333 y(0ZrZPO0Z)646 1416 y(Z0M0Z0ZP)646 1499 y(PO0ZNLPZ)646
+1582 y(ZBSRZ0J0)p 1310 1582 V 641 1586 673 5 v 745 1705 a Fp(P)o(osition)13
+b(after)h(22.)k(...)f(Rc4!)324 1823 y(I)e(w)o(an)o(ted)g(to)h(form)d(a)i
+(strong)h(pa)o(wn)f(cen)o(ter,)i(ho)o(w)o(ev)o(er,)e(in)g(hindsigh)o(t)g(I)g
+(feel)g(I)h(o)o(v)o(er-)262 1873 y(stretc)o(hed)g(m)o(yself.)g(The)e(pa)o
+(wns)g(on)g(e4)g(and)g(f4)f(are)h(under)h(extreme)f(pressure.)781
+2050 y(23.)41 b(Rxd8+)12 b(Qxd8)781 2099 y(24.)41 b(Rd1)66
+b(Qc7)781 2149 y(25.)41 b(Rd4?)946 2574 y(155)p eop
+%%Page: 156 158
+156 157 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0Z0Z0ZkZ)646
+482 y(Zbl0Zpop)646 565 y(po0ZpmnZ)646 648 y(Z0Z0Z0Z0)646 731
+y(0ZrSPO0Z)646 814 y(Z0M0Z0ZP)646 897 y(PO0ZNLPZ)646 980 y(ZBZ0Z0J0)p
+1310 980 V 641 984 673 5 v 765 1163 a Fp(P)o(osition)13 b(after)h(25.)k(Rd4?)
+324 1257 y(I)c(though)o(t)h(Rd4)f(w)o(ould)g(reliev)o(e)h(the)g(pressure)i
+(on)d(the)i(white)e(cen)o(ter)j(pa)o(wns.)j(After)262 1307
+y(25.)k(...)g(Rxd4)15 b(26.)24 b(Qxd4,)17 b(I)f(though)o(t)g(m)o(y)e(f-pa)o
+(wn)h(w)o(as)h(secure)j(b)q(ecause)e(of)f(the)h(mate)262 1357
+y(threat)g(on)g(d8,)g(e.g.)26 b(26.)g(...)g(Nxf4)16 b(27.)27
+b(Nxf4)16 b(Qxf4??)26 b(28.)g(Qd8+)18 b(Ne8)f(29.)26 b(Qxe8+)262
+1407 y(mate.)16 b(Ho)o(w)o(ev)o(er,)e(I)g(missed)f(27.)18 b(...)f(e5)d(whic)o
+(h)g(wins)f(the)i(pa)o(wn.)781 1491 y(25.)41 b(...)105 b(Rxd4)781
+1541 y(26.)41 b(Qxd4)i(Nxf4!)781 1591 y(27.)e(Nxf4)54 b(e5)781
+1641 y(28.)41 b(Qd2)65 b(ef)781 1691 y(29.)41 b(a3)99 b(Kf8)14
+b(\(+133\))p 641 1781 V 641 2445 5 665 v 646 1864 a Fg(0Z0Z0j0Z)646
+1947 y(Zbl0Zpop)646 2030 y(po0Z0m0Z)646 2113 y(Z0Z0Z0Z0)646
+2196 y(0Z0ZPo0Z)646 2279 y(O0M0Z0ZP)646 2362 y(0O0L0ZPZ)646
+2445 y(ZBZ0Z0J0)p 1310 2445 V 641 2449 673 5 v 946 2574 a Fp(156)p
+eop
+%%Page: 157 159
+157 158 bop 747 307 a Fp(P)o(osition)13 b(after)h(29.)k(...)f(Kf8.)324
+422 y(HIAR)o(CS)10 b(is)h(preparing)g(to)f(bring)h(its)g(king)f(in)o(to)g
+(pla)o(y)m(.)15 b(I)c(pla)o(y)o(ed)f(29.)17 b(a3)10 b(to)h(allo)o(w)e(Ba2)262
+472 y(at)15 b(an)g(opp)q(ortune)h(momen)o(t.)j(In)d(fact,)f(I)g(w)o(as)g
+(hoping)g(to)g(pla)o(y)f(Nd5;)i(sw)o(ap)f(o\013)g(knigh)o(ts)262
+522 y(and)g(obtain)g(a)g(supp)q(orted)i(passed)f(d)g(pa)o(wn.)23
+b(Ho)o(w)o(ev)o(er,)16 b(I)f(missed)g(31.)22 b(Qc5+)17 b(and)e(the)262
+572 y(mate)d(threat)j(on)f(g2)f(sa)o(ving)g(blac)o(ks)h(b)g(and)f(f)h(pa)o
+(wns.)k(After)c(whic)o(h)g(the)h(game)d(is)i(lost.)781 736
+y(30.)41 b(Nd5?)46 b(Nxd5)781 786 y(31.)41 b(ed)100 b(Qc5+)781
+836 y(32.)41 b(Kh2?)k(Qxd5)14 b(\(+201\))781 886 y(33.)41 b(Qxd5)i(Bxd5)14
+b(\(+248\))262 1001 y(Blac)o(ks)g(h-pa)o(wn)g(is)g(safe)g(as)h(Bxh7)f(is)g
+(met)f(b)o(y)h(g6!)19 b(The)14 b(mo)o(v)o(e)f(33.)18 b(Qxd5)d(w)o(as)f(bad,)f
+(but)262 1050 y(I)f(did)g(not)h(feel)g(lik)o(e)f(a)g(long)g(hard)h(queen)g
+(and)g(bishop)f(ending)h(whic)o(h)g(w)o(as)f(lost)h(an)o(yw)o(a)o(y)m(.)781
+1144 y(34.)41 b(Bd3)68 b(b5)781 1194 y(35.)41 b(Kg1)67 b(h5)781
+1244 y(36.)41 b(Be2)73 b(g6)781 1294 y(37.)41 b(a4)99 b(ba)781
+1343 y(38.)41 b(Bxa6)48 b(Bc6)781 1393 y(39.)41 b(Kf2)75 b(Ke7)781
+1443 y(40.)41 b(Be2)73 b(Kf6)781 1493 y(41.)41 b(Bc4)73 b(h4)781
+1543 y(42.)41 b(Be2)73 b(Ke5)15 b(\(+292\))p 641 1666 673 5
+v 641 2330 5 665 v 646 1749 a Fg(0Z0Z0Z0Z)646 1832 y(Z0Z0ZpZ0)646
+1915 y(0ZbZ0ZpZ)646 1998 y(Z0Z0j0Z0)646 2081 y(pZ0Z0o0o)646
+2164 y(Z0Z0Z0ZP)646 2247 y(0O0ZBJPZ)646 2330 y(Z0Z0Z0Z0)p 1310
+2330 V 641 2334 673 5 v 744 2449 a Fp(P)o(osition)e(after)h(42.)k(...)f(Ke5.)
+946 2574 y(157)p eop
+%%Page: 158 160
+158 159 bop 324 307 a Fp(I)14 b(cannot)h(defend)h(the)f(b-pa)o(wn,)f(g-pa)o
+(wn)g(and)h(hold)f(bac)o(k)h(the)g(ev)o(en)o(tual)g(f5,)f(g5)g(and)262
+357 y(g4,)19 b(therefore,)i(I)e(decided)i(to)d(simplify)f(and)i(attempt)f(to)
+h(pic)o(k)g(o\013)g(blac)o(ks)g(king)f(side)262 407 y(pa)o(wns)c(while)g
+(HIAR)o(CS)g(attempts)g(to)g(promote)f(its)i(a-pa)o(wn.)k(Ho)o(w)o(ev)o(er,)
+14 b(HIAR)o(CS)g(did)262 457 y(not)f(allo)o(w)g(me)f(an)i(inkling)e(of)i
+(coun)o(ter)g(pla)o(y)m(.)781 625 y(43.)41 b(Bf3)78 b(Bxf3)14
+b(\(+315\))781 675 y(44.)41 b(Kxf3)53 b(Kf5)781 725 y(45.)41
+b(Kf2)75 b(Ke4)781 774 y(46.)41 b(Ke2)70 b(f5)14 b(\(+401\))781
+824 y(47.)41 b(Kf2)75 b(Kd3)14 b(\(+670\))781 874 y(48.)41
+b(Kf3)75 b(g5)14 b(\(+973\))876 924 y(resigns)899 974 y(0)47
+b Ff(\000)42 b Fp(1)510 1023 y(Times:)242 b(1:46:33)12 b(1:59:47)262
+1142 y(HIAR)o(CS)19 b(pla)o(y)o(ed)f(this)i(game)e(v)o(ery)h(solidly)m(,)g
+(punishing)g(m)o(y)e(mistak)o(es)i(e\016cien)o(tly)m(.)34 b(I)262
+1192 y(think)14 b(it)h(w)o(ould)f(b)q(e)i(hard)f(to)g(tell)g(whether)h(a)f
+(computer)g(of)f(h)o(uman)f(w)o(as)i(blac)o(k)g(in)g(this)262
+1241 y(game.)324 1327 y(In)h(game)f(2,)h(I)g(w)o(as)g(also)g(under)h(some)e
+(pressure,)k(ho)o(w)o(ev)o(er,)e(I)f(slo)o(wly)f(mano)q(euvred)262
+1377 y(m)o(y)e(2)h(knigh)o(ts)g(in)o(to)g(activ)o(e)h(p)q(ositions)g(on)f
+(the)i(queen)f(side.)21 b(I)15 b(w)o(as)g(then)g(able)g(to)f(break)262
+1426 y(the)i(p)q(osition)g(op)q(en)h(to)f(m)o(y)f(adv)n(an)o(tage.)24
+b(I)17 b(ev)o(en)o(tually)f(reac)o(hed)h(the)g(ending,)g(a)f(queen)262
+1476 y(for)g(ro)q(ok)g(and)g(bishop)g(up.)26 b(I)17 b(pla)o(y)o(ed)f(w)o(ell)
+f(and)i(w)o(as)f(able)g(to)g(simplify)e(in)o(to)i(an)g(easily)262
+1526 y(w)o(on)d(king)g(and)h(pa)o(wn)f(ending.)324 1611 y(Although)k(HIAR)o
+(CS)g(c)o(hose)h(a)f(king)g(side)h(attac)o(k)f(plan)g(during)g(this)h(game,)e
+(it)h(did)262 1661 y(not)h(execute)j(it)d(e\016cien)o(tly)m(.)32
+b(By)19 b(the)h(time)d(HIAR)o(CS)h(had)h(ac)o(hiev)o(ed)g(an)g(op)q(en)g
+(h-\014le)262 1711 y(for)e(its)h(ro)q(oks,)h(m)o(y)d(o)o(wn)i(plan)f(w)o(as)h
+(already)f(w)o(ell)h(dev)o(elop)q(ed.)31 b(This)17 b(illustrates)i(that)262
+1761 y(the)i(planning)e(mec)o(hanism)f(used)k(in)e(HIAR)o(CS)g(still)g
+(requires)h(a)g(lot)f(of)g(tuning)g(and)262 1810 y(enhancemen)o(t.)324
+1896 y(I)e(will)e(not)i(use)h(this)f(matc)o(h)f(to)h(calculate)g(a)g(c)o
+(hess)i(rating)d(as)h(the)h(sample)e(is)h(to)q(o)262 1946 y(small.)24
+b(Ho)o(w)o(ev)o(er,)17 b(it)g(w)o(as)f(clear)h(from)e(pla)o(ying)h(HIAR)o
+(CS,)g(that)g(it)h(has)g(a)f(distinctiv)o(e,)262 1995 y(uncomputer)9
+b(lik)o(e,)h(pla)o(ying)e(st)o(yle)i(and)g(w)o(ould)f(mak)o(e)f(a)i(w)o(orth)
+o(y)g(opp)q(onen)o(t)g(for)g(an)o(y)f(pla)o(y)o(er)262 2045
+y(rated)14 b(at)g(around)g(2000)e(ELO.)262 2218 y Fr(7.4)69
+b(Kno)n(wledge)22 b(v)n(ersus)h(Searc)n(h)262 2344 y Fp(HIAR)o(CS)15
+b(5.0)g(con)o(tains)i(a)e(signi\014can)o(t)h(amoun)o(t)e(of)i(c)o(hess)i(kno)
+o(wledge)d(compared)h(with)262 2394 y(the)c(t)o(ypical)e(Shannon)h(t)o(yp)q
+(e)h(A)g(program.)j(Muc)o(h)d(of)f(the)h(c)o(hess)h(kno)o(wledge)e(is)g
+(applied)g(at)262 2444 y(the)g(horizon)f(no)q(des)h(of)f(the)h(main)d(searc)o
+(h.)18 b(Although)10 b(this)g(approac)o(h)h(allo)o(ws)e(application)946
+2574 y(158)p eop
+%%Page: 159 161
+159 160 bop 262 307 a Fp(of)16 b(up)h(to)g(date)g(p)q(ositional)f(kno)o
+(wledge,)h(it)f(is)h(quite)g(time)f(consuming,)f(and)i(therefore)262
+357 y(results)e(in)e(sligh)o(tly)f(shallo)o(w)o(er)i(searc)o(hes)i(b)q(eing)d
+(p)q(erformed.)324 442 y(It)j(w)o(ould)g(therefore)i(b)q(e)f(in)o(teresting)g
+(to)f(classify)g(what)h(the)g(kno)o(wledge)f(is)h('w)o(orth')262
+492 y(in)f(terms)g(of)g(searc)o(h)h(depth.)27 b(This)17 b('w)o(orth')e(could)
+h(then)i(b)q(e)f(compared)f(to)g(its)h(cost)g(to)262 542 y(determine)c
+(whether)j(the)e(kno)o(wledge)g(is)f(cost)i(e\013ectiv)o(e.)324
+627 y(I)g(ha)o(v)o(e)g(compared)g(kno)o(wledge)g(and)h(searc)o(h)g(b)o(y)g(p)
+q(erforming)e(a)h(4)g(game)f(matc)o(h)g(b)q(e-)262 677 y(t)o(w)o(een)j(HIAR)o
+(CS)g(5.0)f(and)g(a)h(v)o(ersion)g(of)f(itself)h(con)o(taining)f(only)g
+(piece)i(square)f(tables)262 727 y(for)11 b(its)h(horizon)g(no)q(de)h(ev)n
+(aluations)e(and)h(no)g(searc)o(h)h(extension)g(heuristics.)18
+b(This)12 b(sp)q(ecial)262 777 y(v)o(ersion)i(of)f(HIAR)o(CS)g(will)g(b)q(e)h
+(referred)i(to)e(as)g Fm(NOKNO)o(W)p Fp(.)324 862 y(In)h(the)h(matc)o(h,)e
+(NOKNO)o(W)i(w)o(as)f(allo)o(w)o(ed)f(to)h(p)q(erform)f(a)h(full)f(width)h(6)
+g(ply)f(searc)o(h)262 912 y(and)f(HIAR)o(CS)h(5.0)f(w)o(as)h(restricted)i(to)
+d(a)h(\014xed)g(depth)h(3)f(ply)f(searc)o(h.)19 b(NOKNO)o(W)c(to)q(ok)262
+961 y(b)q(et)o(w)o(een)20 b(30)f(seconds)i(and)e(20)g(min)o(utes)f(o)o(v)o
+(er)i(eac)o(h)g(mo)o(v)o(e,)e(whereas)j(HIAR)o(CS)e(to)q(ok)262
+1011 y(around)e(1)g(to)g(10)f(seconds)j(p)q(er)f(mo)o(v)o(e.)27
+b(Thinking)16 b(on)h(opp)q(onen)o(ts)h(time)e(w)o(as)h(disabled)262
+1061 y(during)12 b(the)i(matc)o(h.)i(In)d(the)g(\014rst)h(t)o(w)o(o)e(games)g
+(b)q(oth)h(program)e(w)o(ere)j(allo)o(w)o(ed)e(to)g(consult)262
+1111 y(their)k(op)q(ening)f(b)q(o)q(ok;)i(in)e(last)h(t)o(w)o(o)f(games,)g
+(NOKNO)o(W)h(w)o(as)g(not)g(allo)o(w)o(ed)f(to)g(consult)262
+1161 y(its)e(op)q(ening)g(b)q(o)q(ok.)18 b(All)12 b(game)g(records)j(for)e
+(this)g(matc)o(h)f(can)i(b)q(e)g(found)f(in)g(app)q(endix)g(E.)262
+1210 y(The)h(\014nal)f(matc)o(h)g(score)i(can)f(b)q(e)h(seen)g(b)q(elo)o(w:)p
+565 1286 826 2 v 564 1336 2 50 v 590 1321 a Fm(Players)p 957
+1336 V 261 w(1)p 1033 1336 V 53 w(2)p 1104 1336 V 50 w(3)p
+1175 1336 V 50 w(4)p 1246 1336 V 50 w(T)m(otal)p 1389 1336
+V 565 1338 826 2 v 564 1388 2 51 v 590 1373 a Fp(HIAR)o(CS)e(5.0,)g(3)g(ply)p
+957 1388 V 988 1357 a Fk(1)p 988 1364 17 2 v 988 1387 a(2)p
+1033 1388 2 51 v 1059 1373 a Fp(0)p 1104 1388 V 50 w(0)p 1175
+1388 V 50 w(1)p 1246 1388 V 73 w(1)1321 1357 y Fk(1)p 1321
+1364 17 2 v 1321 1387 a(2)p 1389 1388 2 51 v 565 1389 826 2
+v 564 1439 2 51 v 590 1425 a Fp(NOKNO)o(W,)h(6)f(ply)p 957
+1439 V 988 1408 a Fk(1)p 988 1415 17 2 v 988 1439 a(2)p 1033
+1439 2 51 v 1059 1425 a Fp(1)p 1104 1439 V 50 w(1)p 1175 1439
+V 50 w(0)p 1246 1439 V 73 w(2)1321 1408 y Fk(1)p 1321 1415
+17 2 v 1321 1439 a(2)p 1389 1439 2 51 v 565 1441 826 2 v 324
+1544 a Fp(When)20 b(considering)h(these)g(results,)i(a)c(n)o(um)o(b)q(er)h
+(of)g(factors)g(m)o(ust)f(b)q(e)i(tak)o(en)f(in)o(to)262 1594
+y(accoun)o(t:)324 1707 y Ff(\017)g Fp(NOKNO)o(W)d(is)e(not)h(a)f(tuned)h
+(brute)h(force)f(searc)o(her,)i(hence)f(its)e(sp)q(eed)j(could)d(b)q(e)365
+1757 y(signi\014can)o(tly)e(impro)o(v)o(ed.)324 1837 y Ff(\017)20
+b Fp(NOKNO)o(W)13 b(did)g(mak)o(e)e(use)i(of)f(HIAR)o(CS's)g(extensiv)o(e)i
+(mo)o(v)o(e)d(ordering)h(algorithm)365 1887 y(and)j(incremen)o(tal)e(ev)n
+(aluation)g(table.)20 b(This,)13 b(to)i(some)e(exten)o(t,)i(comp)q(ensated)g
+(for)365 1937 y(its)f(lac)o(k)g(of)f(tuning.)324 2017 y Ff(\017)20
+b Fp(HIAR)o(CS)f(w)o(as)g(unable)g(to)f(use)i(its)f(sup)q(erior)h(time)d(con)
+o(trol)i(algorithm)d(for)j(the)365 2067 y(matc)o(h)c(since)i(it)f(w)o(as)g
+(limited)e(to)i(a)g(\014xed)g(depth)h(searc)o(h.)26 b(Hence,)18
+b(HIAR)o(CS)e(5.0)365 2116 y(w)o(as)g(unable)f(to)h(exp)q(end)g(extra)g(time)
+e(and)i(depth)g(searc)o(hing)g(mo)o(v)o(es)e(it)h(felt)h(w)o(ere)365
+2166 y(critical.)262 2279 y(The)10 b(matc)o(h)f(score)j(seems)f(to)f
+(indicate)g(that)h(HIAR)o(CS's)e(p)q(ositional)g(and)i(tactical)f(kno)o(wl-)
+262 2329 y(edge)h(is)g(almost)e(w)o(orth)j(3)e(extra)i(plies)f(of)f(searc)o
+(h.)19 b(Eac)o(h)11 b(additional)e(ply)i(w)o(ould)f(normally)262
+2379 y(require)k(a)g(6)f(fold)g(increase)i(in)f(time)840 2364
+y Fk(2)857 2379 y Fp(,)g(therefore,)h(this)e(result)i(is)f(v)o(ery)g
+(signi\014can)o(t.)p 262 2411 573 2 v 308 2437 a Fj(2)325 2449
+y Fi(o)q(dd)d(ply's)f(usually)g(require)g(more)g(searc)o(h)g(e\013ort)g(than)
+g(ev)o(en)h(ply's)946 2574 y Fp(159)p eop
+%%Page: 160 162
+160 161 bop 324 307 a Fp(The)15 b(c)o(hess)i(kno)o(wledge)e(con)o(tained)h
+(in)e(HIAR)o(CS)h(5.0)g(seems)g(to)g(cost)h(around)f(a)g(2-3)262
+357 y(fold)10 b(increase)j(in)e(time.)16 b(This)11 b(additional)f(time)g(w)o
+(ould)h(not)g(b)q(e)h(enough)g(for)f(ev)o(en)h(1)f(extra)262
+407 y(ply)16 b(of)g(full)g(width)h(searc)o(h.)29 b(Therefore,)18
+b(HIAR)o(CS's)f(kno)o(wledge)g(app)q(ears)h(to)f(b)q(e)g(v)o(ery)262
+457 y(cost)d(e\013ectiv)o(e)h(when)g(compared)e(with)h(simply)d(in)o(v)o
+(esting)j(more)f(searc)o(h)i(e\013ort.)262 628 y Fr(7.5)69
+b(In)n(ternal)23 b(Statistics)262 755 y Fp(V)m(arious)12 b(statistics)i(ab)q
+(out)e(ho)o(w)h(the)h(program)d(sp)q(ends)j(its)f(time)f(ha)o(v)o(e)h(b)q
+(een)h(calculated.)324 840 y(HIAR)o(CS)h(5.0)f(searc)o(hes)j(b)q(et)o(w)o
+(een)f(300)f(and)g(1200)f(no)q(des)i(p)q(er)g(second.)23 b(The)16
+b(higher)262 890 y(sp)q(eeds)j(are)f(ac)o(hiev)o(ed)f(in)g(the)h(endgame.)28
+b(Unlik)o(e)17 b(most)f(other)i(programs,)f(only)g(legal)262
+940 y(no)q(des)d(are)h(coun)o(ted)f(in)g(this)g(no)q(de)g(coun)o(t.)324
+1025 y(When)19 b(pla)o(ying)e(at)h(tournamen)o(t)g(rates,)i(HIAR)o(CS)f(t)o
+(ypically)e(searc)o(hes)j(to)f(5)f(or)h(6)262 1075 y(plies)12
+b(in)h(the)g(op)q(ening,)g(5)f(plies)h(in)g(the)g(middle)e(game)h(and)g(an)o
+(ything)g(b)q(et)o(w)o(een)j(6)d(and)h(13)262 1125 y(plies)g(in)h(the)g
+(endgame.)p 641 1218 673 5 v 641 1882 5 665 v 646 1301 a Fg(rZbl0skZ)646
+1384 y(opopZpop)646 1467 y(0ZnZ0m0Z)646 1550 y(Z0a0o0Z0)646
+1633 y(0ZBZPZ0Z)646 1716 y(Z0M0ZNZ0)646 1799 y(POPO0OPO)646
+1882 y(S0AQZRJ0)p 1310 1882 V 641 1886 673 5 v 673 2001 a Fp(ABF)h
+(calculation:)i(White)c(to)h(mo)o(v)o(e.)324 2115 y(The)h(Av)o(erage)h(Branc)
+o(hing)f(F)m(actor)f Fl(\(ABF\))h Fp(is)f(an)h(extremely)g(imp)q(ortan)o(t)e
+(measure)262 2165 y(as)c(it)h(de\014nes)h(ho)o(w)e(e\016cien)o(t)h(the)h
+(tree)g(searc)o(h)g(is)e(and)h(hence)h(what)f(depths)g(are)h(ac)o(hiev)n
+(able.)262 2214 y(It)17 b(can)g(b)q(e)h(estimated)f(b)o(y)g(coun)o(ting)g
+(the)h(total)f(no)q(des,)h Fm(tn)p Fp(,)g(explored)g(in)f(a)g(full)f(width)
+262 2264 y(searc)o(h)f(at)e(depths)i Ff(\024)p Fm(n)p Fp(,)f(and)g(using)g
+(ABF)g(=)g Fh(tn)1030 2249 y Fk(1)p Fe(=n)1086 2264 y Fp(.)324
+2350 y(In)d(the)g(test)h(p)q(osition)e(ab)q(o)o(v)o(e,)h(HIAR)o(CS)f(5.0)g
+(explored)h(168992)e(no)q(des)j(within)e(a)h(6)f(ply)262 2399
+y(full)g(width)h(searc)o(h.)18 b(This)12 b(equates)g(to)g(an)f(ABF)h(of)f
+(7.43.)16 b(F)m(or)11 b(a)h(selectiv)o(e)g(searc)o(h)h(to)e(visit)262
+2449 y(few)o(er)f(no)q(des,)i(it)e(w)o(ould)f(ha)o(v)o(e)i(to)f(expand)g
+(less)h(than)g(7.43)e(no)q(des)i(from)e(eac)o(h)i(p)q(osition.)16
+b(Of)946 2574 y(160)p eop
+%%Page: 161 163
+161 162 bop 262 307 a Fp(course,)12 b(suc)o(h)f(a)f(selectiv)o(e)i(searc)o(h)
+g(could)e(still)g(miss)g(man)o(y)e(critical)j(v)n(ariations)e(within)h(the)
+262 357 y(6)k(plies;)i(a)f(problem)f(HIAR)o(CS's)g(full)g(width)h(searc)o(h)i
+(cannot)e(su\013er)i(from.)j(This)15 b(is)g(the)262 407 y(ma)r(jor)e(adv)n
+(an)o(tage)g(of)h(a)h(bac)o(kw)o(ard)f(pruning)h(algorithm)d(suc)o(h)j(as)g
+Fh(\013\014)i Fp(when)e(compared)262 457 y(with)e(forw)o(ard)h(pruning.)324
+542 y(This)20 b(ABF)g(includes)h(the)f(totals)g(for)g(eac)o(h)g(iteration.)36
+b(The)20 b(ABF)h(for)f(the)g(\014nal)262 592 y(iteration,)c(whic)o(h)h
+Fm(only)g Fp(explored)g(125102)f(no)q(des,)h(is)g(7.07.)26
+b(The)17 b(minim)o(al)c Fh(\013\014)19 b Fp(searc)o(h)262 641
+y(tree)14 b(for)e(the)i(p)q(osition)e(w)o(ould)g(b)q(e)i(of)e(the)i(order)f
+(2)7 b Ff(\001)g Fp(38)1123 626 y Fk(6)p Fe(=)p Fk(2)1182 641
+y Ff(\000)h Fp(1)j(=)h(109743.)k(The)e(fact)f(that)262 691
+y(HIAR)o(CS's)f(\014nal)h(iteration)g(searc)o(h)i(w)o(as)e(within)f(14\045)h
+(of)g(this)g(minim)o(al)d(tree)k(illustrates)262 741 y(the)h(e\013ectiv)o
+(eness)j(of)c(using)h(the)h(com)o(bination)d(of)h(iterativ)o(e)h(deep)q
+(ening,)h(searc)o(h)g(tables)262 791 y(and)d(in)o(terior)h(no)q(de)g(mo)o(v)o
+(e)e(ordering.)324 876 y(Occasionally)m(,)e(searc)o(hes)j(ha)o(v)o(e)e(b)q
+(een)i(found)e(to)g(explore)h(as)f(few)g(or)h(few)o(er)g(no)q(des)g(than)262
+926 y(the)i(minim)o(al)d Fh(\013\014)16 b Fp(tree)f(w)o(ould)e(suggest.)19
+b(This)14 b(is)g(ac)o(hiev)o(ed)g(b)q(ecause)i(the)f(transp)q(osition)262
+976 y(table)k(allo)o(ws)e(n)o(umerous,)j(sometimes)d(large,)j(subtrees)h(to)e
+(b)q(e)g(pruned)h(whic)o(h)f(w)o(ould)262 1026 y(otherwise)14
+b(require)h(searc)o(hing.)324 1111 y(It)f(has)h(also)f(b)q(een)i(found)e
+(that)g(it)g(is)h(not)f(uncommon)e(for)i(HIAR)o(CS)g(5.0)g(to)g(explore)262
+1161 y(v)n(ariations)h(to)h(a)g(depth)h(of)f(15)g(to)g(20)g(ply)m(.)25
+b(V)m(ery)17 b(o)q(ccasionally)m(,)e(the)i(searc)o(h)g(ma)o(y)e(ev)o(en)262
+1210 y(reac)o(h)h(the)f(maxim)o(um)c(depth)16 b(of)e(32)h(ply)m(.)21
+b(These)c(extremely)e(deep)h(searc)o(hes)h(are)f(infre-)262
+1260 y(quen)o(t)g(and)g(therefore)i(do)e(not)g(usually)f(cause)i(a)f(large)g
+(searc)o(h)h('explosion'.)24 b(Ho)o(w)o(ev)o(er,)262 1310 y(they)19
+b(o)q(ccasionally)e(allo)o(w)g(HIAR)o(CS)h(to)h(disco)o(v)o(er)g(deep)g(com)o
+(binations)e(whic)o(h)h(w)o(ould)262 1360 y(otherwise)c(b)q(e)h(imp)q
+(ossible)d(with)i(a)f(more)g(depth)i(restricted)h(searc)o(h.)324
+1445 y(Belo)o(w)e(is)f(giv)o(en)h(a)f(breakdo)o(wn)h(of)g(ho)o(w)f(HIAR)o(CS)
+h(sp)q(ends)h(its)f(time:)p 556 1528 843 2 v 555 1578 2 50
+v 581 1563 a Fm(A)n(ctivity)p 1076 1578 V 380 w(\045)g(of)h(total)g(time)p
+1398 1578 V 556 1579 843 2 v 555 1629 2 50 v 581 1614 a Fp(P)o(ositional)d
+(Analysis)p 1076 1629 V 250 w(44.4)g(\045)p 1398 1629 V 556
+1631 843 2 v 555 1680 2 50 v 581 1666 a(Making/Unmaking)e(Mo)o(v)o(es)p
+1076 1680 V 126 w(19.4)i(\045)p 1398 1680 V 556 1682 843 2
+v 555 1732 2 50 v 581 1717 a(Up)q(dating)i(A)o(ttac)o(k)g(T)m(ables)p
+1076 1732 V 158 w(14.9)e(\045)p 1398 1732 V 556 1734 843 2
+v 555 1783 2 50 v 581 1768 a(Mo)o(v)o(e)i(Generation)p 1076
+1783 V 294 w(9.3)f(\045)p 1398 1783 V 556 1785 843 2 v 555
+1835 2 50 v 581 1820 a(T)m(ree)i(Searc)o(h)f(Con)o(trol)p 1076
+1835 V 242 w(6.5)f(\045)p 1398 1835 V 556 1837 843 2 v 555
+1886 2 50 v 581 1871 a(Ev)o(erything)h(else)p 1076 1886 V 328
+w(5.5)f(\045)p 1398 1886 V 556 1888 843 2 v 262 1990 a(As)k(can)g(b)q(e)h
+(seen)g(from)e(these)i(\014gures,)g(HIAR)o(CS)f(sp)q(ends)i(an)d
+(extraordinary)h(amoun)o(t)262 2039 y(of)c(time)g(ev)n(aluating)g(p)q
+(ositions.)20 b(Compared)13 b(to)h(more)g(con)o(v)o(en)o(tional)f(programs,)g
+(whic)o(h)262 2089 y(sp)q(end)h(most)e(of)g(their)i(time)d(generating)j(and)e
+(searc)o(hing)i(mo)o(v)o(es,)d(the)j(di\013erence)h(in)e(pro-)262
+2139 y(gram)f(philosoph)o(y)h(is)g(ob)o(vious.)946 2574 y(161)p
+eop
+%%Page: 162 164
+162 163 bop 262 307 a Fr(7.6)69 b(Summary)23 b(of)g(P)n(erformance)262
+434 y Fp(HIAR)o(CS)17 b(5.0)f(p)q(erforms)h(at)g(or)h(near)g(the)g(exp)q(ert)
+h(lev)o(el)e(of)g(2000)f(ELO.)h(It)h(displa)o(ys)f(a)262 483
+y(go)q(o)q(d)10 b(balance)h(b)q(et)o(w)o(een)h(p)q(ositional)e(and)g
+(tactical)h(pla)o(y)f(whic)o(h)h(mak)o(es)e(it)i(an)g(in)o(teresting,)262
+533 y(more)f(h)o(uman)h(lik)o(e,)g(opp)q(onen)o(t.)17 b(Ho)o(w)o(ev)o(er,)12
+b(HIAR)o(CS)g(5.0)f(has)h(a)f(n)o(um)o(b)q(er)g(of)h(w)o(eaknesses)262
+583 y(b)q(oth)i(p)q(ositionally)e(and)i(tactically)m(.)j(Some)c(of)g(these)j
+(w)o(eaknesses)g(can)e(b)q(e)h(corrected)h(b)o(y)262 633 y(extensiv)o(e)c
+(tuning)e(of)h(the)g(ev)n(aluation)f(function)h(and)f(searc)o(h)j
+(extensions,)f(others)g(require)262 683 y(complex)g(higher)i(lev)o(el)g(kno)o
+(wledge)f(to)h(b)q(e)g(included)h(in)e(the)h(program.)324 768
+y(HIAR)o(CS)h(pla)o(ys)g(a)g(comp)q(eten)o(t)h(tactical)f(game)g(and)g
+(excels)i(in)e(iden)o(tifying)f(critical)262 818 y(v)n(ariations)e(in)o(v)o
+(olving)f(c)o(hec)o(ks)j(and)g(captures.)19 b(This)13 b(is)g(not)h
+(surprising)f(considering)h(the)262 867 y(t)o(yp)q(e)g(of)f(searc)o(h)i
+(extensions)g(included.)324 953 y(Unlik)o(e)10 b(most)g(other)h(c)o(hess)i
+(programs,)d(HIAR)o(CS's)g(impro)o(v)o(emen)o(t)e(as)j(time)f(increases)262
+1003 y(is)j(more)g(pronounced)h(than)g(w)o(ould)e(normally)f(b)q(e)j(exp)q
+(ected.)20 b(I)14 b(b)q(eliev)o(e)g(this)f(is)h(b)q(ecause)262
+1052 y(its)f(searc)o(h)i(extensions)g(ha)o(v)o(e)e(more)g(scop)q(e)i(to)f
+(expand)g(lines)f(and)h(its)f(p)q(ositional)g(kno)o(wl-)262
+1102 y(edge)e(has)g(more)g(e\013ect)h(as)f(the)h(searc)o(h)g(depth)g
+(increases.)19 b(F)m(or)10 b(example,)g(a)h(1)g(ply)f(increase)262
+1152 y(in)g(full)g(width)h(depth)h(ma)o(y)d(allo)o(w)h(HIAR)o(CS)h(to)g
+(extend)h(a)f(critical)g(v)n(ariation)e(2)i(or)g(3)g(plies.)324
+1237 y(The)i(use)g(of)f(general)h(plans)f(to)h(guide)f(the)i(searc)o(h)f(b)o
+(y)g(increasing)f(the)i(desirabilit)o(y)d(of)262 1287 y(certain)j(asp)q(ects)
+h(of)d(a)h(p)q(osition)g(has)h(on)f(the)h(whole)f(impro)o(v)o(ed)f(p)q
+(erformance)h(and)g(giv)o(en)262 1337 y(some)i(direction)i(to)f(the)i(pla)o
+(y)m(.)24 b(Ho)o(w)o(ev)o(er,)17 b(there)h(is)f(m)o(uc)o(h)e(ro)q(om)g(for)h
+(impro)o(v)o(emen)o(t)e(in)262 1387 y(this)f(area.)324 1472
+y(I)i(ha)o(v)o(e)g(found)h(that)f(the)h(time)e(con)o(trol)h(algorithm)e(has)j
+(pla)o(y)o(ed)f(an)g(imp)q(ortan)o(t)f(role)262 1522 y(in)f(helping)h(HIAR)o
+(CS)g(iden)o(tify)f(di\016cult)g(mo)o(v)o(es)g(and)h(allo)o(w)o(ed)f(extra)i
+(time)e(to)h(b)q(e)h(sp)q(en)o(t)262 1572 y(where)20 b(it)e(is)h(most)f
+(needed.)35 b(On)20 b(sev)o(eral)f(o)q(ccasions)h(this)f(has)g(allo)o(w)o(ed)
+f(HIAR)o(CS)h(to)262 1621 y(impro)o(v)o(e)12 b(its)h(mo)o(v)o(e)g(selection.)
+324 1707 y(The)f(com)o(bination)c(of)j(the)h(transp)q(osition)f(table)g(and)g
+(searc)o(h)i(extensions)f(has)f(caused)262 1756 y(serious)h(problems.)k
+(Occasionally)m(,)11 b(the)h(transp)q(osition)f(table)h(causes)h(early)e
+(termination)262 1806 y(of)g(in)o(teresting)i(v)n(ariations.)j(The)d(reason)g
+(for)f(this)g(lies)h(in)e(the)i(fact)g(that)f(at)g(eac)o(h)h(lev)o(el)f(in)
+262 1856 y(the)i(tree,)g(eac)o(h)h(no)q(de)f(has)g(no)f(w)o(a)o(y)g(of)g(kno)
+o(wing)g(whether)i(v)n(ariations)d(will)h(b)q(e)h(extended)262
+1906 y(at)i(no)q(des)h(in)f(their)g(subtree.)27 b(Hence,)18
+b(when)f(the)g(transp)q(osition)f(table)h(is)f(prob)q(ed,)h(the)262
+1956 y(required)j(searc)o(h)g(depth)h(ma)o(y)c(b)q(e)j(incorrect)h(b)q
+(ecause)g(it)e(do)q(es)h(not)g(tak)o(e)f(accoun)o(t)h(of)262
+2005 y(p)q(ossible)15 b(extensions)h(n)f(ply)f(do)o(wn)h(the)h(subtree.)23
+b(Therefore,)16 b(the)g(transp)q(osition)f(table)262 2055 y(ma)o(y)f(retriev)
+o(e)j(an)f(en)o(try)h(whic)o(h)f(satis\014es)h(the)g(depth)g(requiremen)o(t)f
+(at)g(this)h(no)q(de,)f(but)262 2105 y(w)o(ould)10 b(not)h(satisfy)g(the)h
+('true')f(depth)h(requiremen)o(t)f(if)g(searc)o(h)h(extensions)g(w)o(ere)g
+(to)g(o)q(ccur)262 2155 y(in)h(the)h(subtree.)324 2240 y(In)d(tactical)h(p)q
+(ositions,)f(this)h(often)f(causes)i(HIAR)o(CS)f(to)f(require)i(1)e(or)h(2)f
+(more)f(searc)o(h)262 2290 y(iterations)20 b(than)h(w)o(ould)e(normally)f(b)q
+(e)k(exp)q(ected.)40 b(This)20 b(is)h(most)e(noticeable)i(when)262
+2340 y(HIAR)o(CS's)13 b(searc)o(h)i(fails)e(high,)g(indicating)g(it)h(has)g
+(found)f(a)h(clearly)g(b)q(etter)h(mo)o(v)o(e,)d(only)262 2390
+y(for)h(the)i(re-searc)o(h)g(to)f(terminate)f(early)h(b)q(ecause)h(of)f(a)f
+(premature)h(en)o(try)h(matc)o(h.)946 2574 y(162)p eop
+%%Page: 163 165
+163 164 bop 324 307 a Fp(The)14 b(solution)f(to)h(this)g(problem)f(lies)h(in)
+f(dramatically)e(expanding)j(eac)o(h)g(transp)q(osi-)262 357
+y(tion)f(table)g(en)o(try)h(to)g(store)h(information)10 b(ab)q(out)k
+(extensions)h(in)e(the)h(subtree)i(b)q(elo)o(w)d(the)262 407
+y(no)q(de)d(resp)q(onsible)i(for)e(storing)g(the)h(en)o(try)m(.)17
+b(On)10 b(retriev)n(al,)h(this)f(information)d(can)k(then)g(b)q(e)262
+457 y(used)j(to)g(determine)f(more)g(accurately)h(whether)h(an)e(en)o(try)i
+(should)e(cause)i(termination.)324 542 y(The)d(cost)g(e\013ectiv)o(eness)i
+(of)d(eac)o(h)h(ev)n(aluation)e(de\014nition)i(is)f(y)o(et)h(to)f(b)q(e)h
+(determined.)18 b(I)262 592 y(susp)q(ect,)13 b(most)c(criteria)i(will)f(need)
+i(mo)q(di\014cation)c(of)i(some)g(sort,)i(while)e(others)i(ma)o(y)d(ev)o(en)
+262 641 y(b)q(e)16 b(unrequired.)25 b(Certainly)15 b(new)i(criteria)f(are)g
+(required)h(for)e(signi\014can)o(t)h(p)q(erformance)262 691
+y(impro)o(v)o(em)o(en)o(t.)946 2574 y(163)p eop
+%%Page: 164 166
+164 165 bop 262 654 a Fn(Chapter)34 b(8)262 897 y Fo(Conclusion)262
+1148 y Fp(This)19 b(c)o(hapter)i(concludes)f(the)h(rep)q(ort)f(b)o(y)g
+(reviewing)f(what)h(has)g(b)q(een)g(in)o(v)o(estigated,)262
+1198 y(discussing)14 b(the)h(ma)r(jor)d(ac)o(hiev)o(emen)o(ts)i(and)f
+(exploring)h(the)g(future)h(implications)c(of)i(m)o(y)262 1248
+y(\014ndings.)36 b(Before)21 b(I)f(review)g(the)h(pro)r(ject)g(and)f(examine)
+f(its)h(ac)o(hiev)o(emen)o(ts,)h(let)f(me)262 1298 y(re-iterate)15
+b(the)f(pro)r(ject)h(aims:)312 1374 y(1.)20 b(Ov)o(erview)15
+b(the)f(tec)o(hniques)h(used)g(in)f(curren)o(t)h(c)o(hess)g(programs.)312
+1454 y(2.)20 b(Dev)o(elop)13 b(an)g(ev)n(aluation)f(function)h(whic)o(h)g
+(exhibits)g(the)h(p)q(ositional)e(abilit)o(y)f(of)i(an)365
+1504 y(exp)q(ert)j(lev)o(el)d(c)o(hess)j(pla)o(y)o(er)d(\(2000)g(ELO\).)312
+1584 y(3.)20 b(Explore)14 b(fresh)h(w)o(a)o(ys)f(of)f(impro)o(ving)e(the)j
+(tactical)g(abilit)o(y)e(of)h(a)h(c)o(hess)h(program.)312 1664
+y(4.)20 b(Implemen)o(t)12 b(the)i(\014ndings)g(in)g(a)f(c)o(hess)j(program)c
+(\(HIAR)o(CS)h(5.0\).)312 1744 y(5.)20 b(Apply)15 b(the)h(Bratk)o(o-Kop)q(ec)
+g(exp)q(erimen)o(t)f(to)g(test)h(the)g(relativ)o(e)f(tactical)g(and)g(p)q(o-)
+365 1794 y(sitional)e(abilit)o(y)f(of)h(the)i(program.)312
+1874 y(6.)20 b(Ev)n(aluate)14 b(the)g(program)e(against)i(b)q(oth)g(h)o(uman)
+e(and)i(computer)f(opp)q(osition.)262 2010 y Fr(8.1)69 b(Review)262
+2100 y Fp(Before)14 b(the)g(pro)r(ject)h(b)q(egan,)f(the)g(aims)e(of)h(the)h
+(pro)r(ject)h(w)o(ere)g(set)f(out)g(and)f(an)h(o)o(v)o(erview)262
+2150 y(of)d(the)i(required)g(tasks)f(necessary)j(to)d(meet)f(the)i(o)o(v)o
+(erall)e(aims)f(w)o(as)i(devised.)19 b(An)12 b(o)o(v)o(erall)262
+2200 y(time)18 b(scale)i(plan)f(w)o(as)g(pro)q(duced)i(whic)o(h)e(set)i(time)
+d(scales)i(for)f(eac)o(h)i(ma)r(jor)c(activit)o(y)m(.)262 2250
+y(Regularly)m(,)12 b(during)i(the)h(pro)r(ject,)h(progress)f(w)o(as)g
+(measured)f(and)g(review)o(ed)i(against)e(set)262 2300 y(ob)r(jectiv)o(es)h
+(and)g(time)f(scales.)23 b(This)15 b(allo)o(w)o(ed)e(me)h(to)h(iden)o(tify)g
+(and)f(set)i(sub-goals,)f(and)262 2350 y(k)o(ept)g(me)f(a)o(w)o(are)h(of)g
+(the)g(implications)e(an)o(y)h(problems)h(w)o(ould)f(ha)o(v)o(e)h(on)g(the)g
+(rest)i(of)d(m)o(y)262 2399 y(pro)r(ject.)38 b(This)21 b(in)f(turn)g(enabled)
+h(me)f(to)g(rep)q(ort)h(progress)h(at)e(m)o(y)f(regular)i(pro)r(ject)262
+2449 y(meetings)13 b(and)g(allo)o(w)o(ed)g(the)i(pro)r(ject)f(to)g(dev)o
+(elop)g(smo)q(othly)m(.)946 2574 y(164)p eop
+%%Page: 165 167
+165 166 bop 324 307 a Fp(In)13 b(c)o(hapters)h(1)f(and)g(2)f(I)h(in)o(tro)q
+(duced)h(the)g(sub)r(ject)g(of)f(computer)f(c)o(hess.)19 b(This)13
+b(ga)o(v)o(e)g(a)262 357 y(go)q(o)q(d)g(foundation)g(for)g(the)i(more)e
+(complex)f(issues)j(explored)g(in)e(future)h(c)o(hapters.)324
+442 y(Chapter)j(3)g(explored)g(v)n(arious)f(tec)o(hniques)i(in)e(detail.)27
+b(I)16 b(in)o(tro)q(duced)i(the)f Fh(\013\014)i Fp(tree)262
+492 y(pruning)d(algorithm)e(and)i(a)h(n)o(um)o(b)q(er)f(of)g(its)g(ma)r(jor)f
+(deriv)n(ativ)o(es.)26 b(V)m(arious)16 b(tec)o(hniques)262
+542 y(w)o(ere)i(discussed)g(for)f(impro)o(ving)d(tree)19 b(searc)o(h)f
+(e\016ciency)m(,)g(e.g.)27 b(mo)o(v)o(e)15 b(ordering,)j(itera-)262
+592 y(tiv)o(e)c(deep)q(ening)j(etc.)22 b(Tw)o(o)15 b(forw)o(ard)g(pruning)g
+(tec)o(hniques)h(w)o(ere)g(also)f(examined.)20 b(The)262 641
+y(sub)r(ject)13 b(of)e(p)q(ositional)g(ev)n(aluation)f(w)o(as)i(explored)g
+(and)g(v)n(arious)f(metho)q(ds)h(of)f(ev)n(aluation)262 691
+y(w)o(ere)j(examined)f(including)g(piece)i(square)f(tables,)g(static)g(ev)n
+(aluation)f(and)h(incremen)o(tal)262 741 y(ev)n(aluation.)h(The)e(imp)q
+(ortance)d(of)i(planning)e(and)i(the)g(game)e(phase)j(w)o(as)e(also)g
+(discussed.)262 791 y(The)18 b(sub)r(ject)i(of)e(learning)f(in)h(c)o(hess)i
+(w)o(as)e(in)o(v)o(estigated)g(and)h(some)e(conclusions)i(w)o(ere)262
+841 y(dra)o(wn.)e(The)e(neglected)g(area)f(of)f(time)g(con)o(trol)h(w)o(as)f
+(also)h(explored.)324 926 y(In)f(c)o(hapter)i(4,)d(man)o(y)g(asp)q(ects)j(of)
+e(m)o(y)f(in)o(v)o(estigation)g(w)o(ere)i(put)g(to)f(use)h(in)f(designing)262
+976 y(an)i(ev)n(aluation)e(function.)22 b(I)15 b(drew)h(extensiv)o(ely)g
+(from)e(m)o(y)f(o)o(wn)i(exp)q(erience)j(of)c(pla)o(ying)262
+1026 y(c)o(hess)h(to)f(capture)h(some)f(of)f(the)i(heuristics)g(I)f(felt)g(w)
+o(ere)h(imp)q(ortan)o(t)d(in)i(mo)o(v)o(e)e(selection.)262
+1075 y(This)19 b(w)o(as)g(v)o(ery)h(di\016cult)e(b)q(ecause)j(m)o(uc)o(h)d
+(of)h(a)g(c)o(hess)i(pla)o(y)o(er's)e(abilit)o(y)e(seems)j(to)f(b)q(e)262
+1125 y(sub)q(conscious.)g(The)13 b(writings)f(of)h(man)o(y)e(great)i(pla)o(y)
+o(ers)g(and)g(in)f(particular,)g(Aron)i(Nim-)262 1175 y(zo)o(witsc)o(h,)g
+(help)q(ed)h(enormously)e(at)h(this)h(di\016cult)e(stage.)20
+b(I)14 b(also)g(felt)g(it)g(w)o(as)g(imp)q(ortan)o(t)262 1225
+y(to)f(dev)o(elop)h(a)g(set)h(of)e(pseudo)h(co)q(de)h(functions)f(for)g(use)g
+(in)g(de\014ning)g(the)g(ev)n(aluation)f(cri-)262 1275 y(teria.)23
+b(These)17 b(functions)f(w)o(ere)g(broad)g(enough)g(to)f(allo)o(w)f(me)h(to)g
+(express)j(a)d(signi\014can)o(t)262 1324 y(amoun)o(t)d(of)h(c)o(hess)i(kno)o
+(wledge,)e(while)h(b)q(eing)g(precise)h(enough)f(to)g(b)q(e)g(implemen)o
+(ted.)324 1410 y(In)g(c)o(hapter)g(5,)g(I)f(attempted)h(to)g(de\014ne)g(a)g
+(metho)q(d)f(of)g(tree)i(searc)o(hing)g(whic)o(h)e(w)o(ould)262
+1460 y(enable)g(most)g(searc)o(h)h(e\013ort)h(to)e(b)q(e)h(exp)q(ended)i(in)d
+(pursuit)h(of)f(go)q(o)q(d)g(or)h(in)o(teresting)g(v)n(ari-)262
+1509 y(ations.)k(My)d(hop)q(e)g(w)o(as)f(to)g(sim)o(ulate)f(the)h(greatly)h
+(v)n(ariable)e(depth)i(of)f(a)g(strong)g(h)o(uman)262 1559
+y(pla)o(y)o(er's)e(searc)o(h)j(tree,)f(while)f(comp)q(ensating)f(for)h(w)o
+(eak)g(selectivit)o(y)h(b)o(y)f(the)g(exploration)262 1609
+y(of)c(man)o(y)g(more)g(v)n(ariations.)15 b(The)c(searc)o(h)h(extensions)f
+(pro)q(duced,)h(concen)o(trate)g(on)e(forced)262 1659 y(or)15
+b(highly)g(tactical)g(elemen)o(ts)g(of)h(pla)o(y)e(whic)o(h)i(ha)o(v)o(e)f
+(some)g(lik)o(eliho)q(o)q(d)f(of)h(a\013ecting)h(the)262 1709
+y(searc)o(h)d(result.)18 b(Suc)o(h)13 b(extra)g(searc)o(h)h(in)o(telligence)e
+(w)o(as)g(required)i(to)e(comp)q(ensate)h(for)f(the)262 1758
+y(inevitably)e(shallo)o(w)o(er)i(searc)o(hes)i(resulting)e(from)f(more)g
+(time)f(b)q(eing)i(sp)q(en)o(t)i(applying)c(m)o(y)262 1808
+y(ev)n(aluation)i(function.)324 1893 y(Chapter)j(6)g(explains)f(some)g(of)g
+(the)h(implemen)o(tation)c(issues)16 b(whic)o(h)f(arose.)21
+b(In)15 b(par-)262 1943 y(ticular)g(it)h(describ)q(es)i(the)e(imp)q(ortan)o
+(t)f(data)g(structures)k(and)c(algorithms)f(necessary)k(in)262
+1993 y(the)d(program.)21 b(The)16 b(imp)q(ortance)f(of)f(program)g
+(e\016ciency)i(w)o(as)f(also)g(made)f(clear.)23 b(The)262 2043
+y(results)13 b(of)f(an)g(extensiv)o(e)i(analysis)e(of)f(time)h(allo)q(cation)
+f(and)h(con)o(trol)g(are)h(also)f(explained)262 2093 y(in)h(this)h(c)o
+(hapter.)324 2178 y(Chapter)19 b(7)g(describ)q(es)i(ho)o(w)e(the)g(p)q
+(erformance)g(of)g(HIAR)o(CS)f(5.0)g(w)o(as)h(measured.)262
+2228 y(Both)14 b(tactical)g(and)h(p)q(ositional)e(abilit)o(y)f(w)o(as)j(quan)
+o(ti\014ed)f(and)g(an)g(estimate)g(of)g(its)g(c)o(hess)262
+2278 y(rating)f(w)o(as)h(made)e(after)i(the)h(application)d(of)i(man)o(y)e
+(tests.)946 2574 y(165)p eop
+%%Page: 166 168
+166 167 bop 262 307 a Fr(8.2)69 b(Ac)n(hiev)n(emen)n(ts)262
+434 y Fp(Ha)o(ving)14 b(in)o(v)o(estigated)i(b)q(oth)f(tactical)h(and)f(p)q
+(ositional)f(ev)n(aluation;)h(together)i(with)e(the)262 483
+y(dev)o(elopmen)o(t)e(and)h(implemen)o(tatio)o(n)e(of)h(ideas)i(in)f(a)f
+(program,)g(it)h(is)g(time)f(to)h(re\015ect)i(on)262 533 y(what)d(has)h(b)q
+(een)h(ac)o(hiev)o(ed.)324 618 y(The)i(ideas)g(in)o(v)o(estigated)f(ha)o(v)o
+(e)g(b)q(een)i(implemen)o(ted)c(successfully)k(in)e(a)h(c)o(hess)h(pro-)262
+668 y(gram)12 b(called)h(HIAR)o(CS)h(5.0.)324 753 y(It)f(has)h(b)q(een)g
+(clearly)f(sho)o(wn)h(that)f(tree)i(searc)o(hing)e(signi\014can)o(tly)g
+(impro)o(v)o(es)f(the)h(tac-)262 803 y(tical)d(abilit)o(y)f(of)h(a)h
+(program.)k(F)m(or)c(example,)f(a)g(2)h(ply)f(searc)o(h)i(with)f(rudimen)o
+(tary)e(capture)262 853 y(searc)o(h)14 b(is)f(able)g(to)f('see')i(tactical)f
+(concepts,)h(suc)o(h)g(as)f(a)g(knigh)o(t)f(fork,)h(whic)o(h)g(w)o(ould)f
+(oth-)262 903 y(erwise)17 b(go)f(unseen)i(b)o(y)f(a)f(mere)h(1)f(ply)g(searc)
+o(h.)28 b(There)18 b(app)q(ears)f(no)f(viable)g(substitute)262
+953 y(for)c(tree)i(searc)o(hing)f(of)f(some)g(kind.)17 b(Static)c(tactical)g
+(ev)n(aluation)e(can)i(b)q(e)g(useful)g(in)f(some)262 1003
+y(p)q(ositions,)h(but)h(cannot)g(b)q(e)g(though)o(t)g(of)f(as)h(a)g(searc)o
+(h)h(replacemen)o(t.)324 1088 y(More)d(surprisingly)m(,)e(tree)j(searc)o
+(hing)f(w)o(as)f(seen)i(to)e(signi\014can)o(tly)f(impro)o(v)o(e)g(p)q
+(ositional)262 1138 y(abilit)o(y)m(.)15 b(This)c(w)o(as)h(clearly)f
+(illustrated)g(when)i(I)e(dev)o(elop)q(ed)h(an)g(almost)d('kno)o(wledge)i
+(less')262 1187 y(v)o(ersion)20 b(of)f(HIAR)o(CS,)h(whic)o(h)g(con)o(tained)g
+(only)f(Pc/Sq)i(tables.)37 b(When)20 b(this)g(sp)q(ecial)262
+1237 y(v)o(ersion)c(w)o(as)f(searc)o(hing)i(6)f(plies)f(in)h(the)g(matc)o(h)f
+(against)g(HIAR)o(CS)h(5.0,)f(its)h(p)q(ositional)262 1287
+y(pla)o(y)h(w)o(as)h(found)g(to)g(b)q(e)g(of)g(a)g(higher)g(calibre)g(than)g
+(could)g(b)q(e)h(exp)q(ected)h(considering)262 1337 y(its)f(rudimen)o(tary)f
+(c)o(hess)j(kno)o(wledge.)33 b(The)20 b(searc)o(h)g(w)o(as)f(actually)g
+(bridging)f(some)g(of)262 1387 y(the)c(program's)d(kno)o(wledge)i
+(de\014ciency)i(gap)e(b)o(y)g(allo)o(wing)f(higher)h(lev)o(el)g(concepts,)i
+(suc)o(h)262 1436 y(as)20 b(m)o(ultim)o(o)o(v)o(e)d(piece)22
+b(path)o(w)o(a)o(ys,)f(to)f(b)q(e)h(considered.)39 b(This)20
+b(in)g(part)h(explains)f(wh)o(y)262 1486 y(Deep)d(Though)o(t)f(is)g(able)h
+(to)f(displa)o(y)f(a)i(p)q(ositional)e(kno)o(wledge)h(m)o(uc)o(h)f(higher)i
+(than)g(its)262 1536 y(ev)n(aluation)12 b(function)i(w)o(ould)f(suggest.)324
+1621 y(The)j(amoun)o(t)d(of)i(kno)o(wledge)g(whic)o(h)g(can)g(b)q(e)h
+(bridged)g(b)o(y)f(tree)h(searc)o(hing)g(dep)q(ends)262 1671
+y(on)h(the)h(depth)h(of)e(searc)o(h.)30 b(Ho)o(w)o(ev)o(er,)19
+b(some)e(c)o(hess)i(concepts)g(are)f(so)g(deep,)h(40)e(or)h(50)262
+1721 y(plies,)12 b(that)h(it)g(will)e(b)q(e)j(almost)d(imp)q(ossible)g(for)i
+(searc)o(hing)h(alone)e(to)h(bridge)g(suc)o(h)h(a)f(gap.)262
+1771 y(This)h(explains)h(wh)o(y)f(b)q(oth)i(the)f(Hitec)o(h)h(and)e(Deep)i
+(Though)o(t)e(teams)g(are)i(encoun)o(tering)262 1821 y(diminishing)8
+b(returns)13 b(from)d(eac)o(h)i(additional)e(ply)h(of)g(searc)o(h.)18
+b(In)12 b(order)g(to)g(a)o(v)o(oid)e(similar)262 1870 y(problems)k(and)h
+(reduce)i(HIAR)o(CS's)d(dep)q(endency)k(on)c(tree)j(searc)o(hing,)e(I)g(ha)o
+(v)o(e)g(instilled)262 1920 y(a)h(signi\014can)o(t)h(amoun)o(t)e(of)h(static)
+h(kno)o(wledge)g(in)f(the)i(w)o(a)o(y)e(of)g(p)q(ositional)g(criteria)h(and)
+262 1970 y(dynamic)12 b(tactical)h(kno)o(wledge)h(in)f(the)i(w)o(a)o(y)e(of)g
+(selectiv)o(e)i(searc)o(h)g(extensions.)324 2055 y(HIAR)o(CS's)9
+b(p)q(erformance)g(has)h(clearly)f(illustrated)h(that)f(extra)h(kno)o(wledge)
+g(can)g(more)262 2105 y(than)k(comp)q(ensate)h(for)g(reduced)i(searc)o(h)f
+(capacit)o(y)m(.)k(A)15 b(pa)o(wn)f(outside)i(the)f(quadrate)g(of)262
+2155 y(the)i(opp)q(osing)f(king)f(is)i(a)f(clear)h(example)e(of)h(this:)24
+b(without)16 b(direct)h(kno)o(wledge)g(ab)q(out)262 2205 y(king-pa)o(wn)12
+b(quadrates,)j(a)e(full)g(width)h(searc)o(h)h(program)e(ma)o(y)f(require)j
+(up)f(to)g(an)g(11)f(ply)262 2255 y(searc)o(h)j(to)g(realise)g(the)g(pa)o(wn)
+f(can)h(queen.)24 b(HIAR)o(CS)15 b(5.0)g(is)g(capable)h(of)f(realising)g
+(this)262 2304 y(after)f(a)f(mere)h(1)f(ply)h(searc)o(h)h(b)q(ecause)g(of)f
+(its)g(c)o(hess)h(kno)o(wledge.)324 2390 y(Ho)o(w)d(far)g(c)o(hess)h(kno)o
+(wledge)g(can)f(b)q(e)h(increased)h(at)e(the)h(exp)q(ense)h(of)d(searc)o
+(hing,)i(with-)262 2439 y(out)h(degrading)g(o)o(v)o(erall)g(p)q(erformance)g
+(is)h(still)f(op)q(en)h(to)f(question.)21 b(Ho)o(w)o(ev)o(er,)15
+b(I)f(b)q(eliev)o(e)946 2574 y(166)p eop
+%%Page: 167 169
+167 168 bop 262 307 a Fp(full)10 b(width)i(searc)o(hing)g(can)g(b)q(e)g
+(reduced)i(in)d(fa)o(v)o(our)g(of)h(sophisticated)g(searc)o(h)h(extensions.)
+262 357 y(The)i(lev)o(el)g(to)g(whic)o(h)g(the)g(full)f(width)h(p)q(ortion)g
+(of)f(the)i(searc)o(h)g(can)f(b)q(e)h(reduced)h(greatly)262
+407 y(dep)q(ends)i(on)e(ho)o(w)g(comprehensiv)o(e)h(and)f(e\013ectiv)o(e)i
+(the)f(searc)o(h)h(extensions)f(are.)30 b(T)m(ak-)262 457 y(ing)15
+b(this)g(approac)o(h)h(to)g(its)f(extreme)h(w)o(ould)f(result)i(in)e(a)h
+(totally)e(selectiv)o(e)j(searc)o(h)g(of)e(a)262 506 y(narro)o(w,)e(deep)i
+(game)d(tree.)324 592 y(When)18 b(long)g(term)f(c)o(hess)j(kno)o(wledge)e(is)
+g(con)o(tained)h(in)f(the)g(ev)n(aluation)f(function,)262 641
+y(suc)o(h)f(as)g(pa)o(wn)g(structure)i(information)13 b(for)j(example,)f(eac)
+o(h)h(additional)e(ply)i(do)q(es)h(not)262 691 y(seem)d(to)h(su\013er)g(suc)o
+(h)h(diminishing)c(returns)k(as)f(seen)h(when)f(the)g(kno)o(wledge)f(con)o
+(ten)o(t)i(is)262 741 y(lo)o(w)o(er.)22 b(This)15 b(w)o(as)g(made)g(clear)g
+(b)o(y)h(the)g(un)o(usually)e(large)h(impro)o(v)o(emen)o(t)e(in)i(HIAR)o
+(CS's)262 791 y(pla)o(y)d(b)q(et)o(w)o(een)k(30)d(seconds)i(and)f(3)g(min)o
+(utes)f(a)g(mo)o(v)o(e.)324 876 y(The)19 b(ac)o(hiev)o(emen)o(t)f(of)f(iden)o
+(tifying)g(and)i(com)o(bining)d(tactical)i(uncertain)o(t)o(y)h(in)f(the)262
+926 y(ev)n(aluation)12 b(function)h(has)h(b)q(een)h(b)q(ene\014cial.)j(Allo)o
+(wing)12 b(the)i(searc)o(h)h(heuristics)g(to)e(mak)o(e)262
+976 y(use)19 b(of)f(this)h(information)d(has)j(help)q(ed)h(reduce)g(the)g
+(programs)d(susceptibilit)o(y)i(to)g(the)262 1026 y(horizon)13
+b(e\013ect.)324 1111 y(Not)d(only)g(is)h(HIAR)o(CS's)f(p)q(ositional)f(pla)o
+(y)h(signi\014can)o(tly)g(impro)o(v)o(ed,)f(but)i(the)g(tactical)262
+1161 y(standard)h(pro)q(duced)i(from)c(ev)o(en)j(shallo)o(w)e(searc)o(h)i
+(depths)h(is)e(impressiv)o(e.)17 b(F)m(or)11 b(example,)262
+1210 y(on)j(one)g(o)q(ccasion,)g(HIAR)o(CS)g(solv)o(ed)g(a)g("mate)f(in)h(5)g
+(problem")f(while)g(only)h(at)g(the)h(\014rst)262 1260 y(ply)e(of)h(full)f
+(width)h(searc)o(h.)20 b(The)15 b(tactical)f(impro)o(v)o(em)o(en)o(t)e(is)i
+(only)g(eviden)o(t,)g(ho)o(w)o(ev)o(er,)g(in)262 1310 y(v)n(ariations)g(con)o
+(taining)g(mo)o(v)o(es)h(that)g(can)h(b)q(e)g(iden)o(ti\014ed)g(b)o(y)f(the)i
+(extension)f(heuristics.)262 1360 y(Ho)o(w)o(ev)o(er,)d(as)h(the)h(tactical)e
+(co)o(v)o(erage)i(is)e(quite)h(large,)g(the)g(o)o(v)o(erall)f(a\013ect)i(is)e
+(b)q(ene\014cial.)324 1445 y(A)d(lot)f(of)h(progress)h(has)f(b)q(een)i(made)d
+(on)g(the)i(sub)r(ject)h(of)d(time)g(allo)q(cation)f(and)i(con)o(trol.)262
+1495 y(The)16 b(resulting)g(algorithm)d(has)j(certainly)g(impro)o(v)o(ed)f
+(HIAR)o(CS's)g(o)o(v)o(erall)g(standard)h(of)262 1545 y(pla)o(y)c(b)o(y)i
+(allo)q(cating)e(and)i(adjusting)f(time)g(relativ)o(e)h(to)f(the)i(needs)g
+(of)e(the)i(p)q(osition.)324 1630 y(The)i(results)h(pro)q(duced)g(on)f(the)g
+(Bratk)o(o-Kop)q(ec)h(test)g(p)q(ositions)e(clearly)h(illustrate)262
+1680 y(that)c(HIAR)o(CS)h(do)q(es)h(displa)o(y)d(the)j(tactical)f(and)f(p)q
+(ositional)g(abilit)o(y)f(of)h(an)h(exp)q(ert)h(lev)o(el)262
+1730 y(pla)o(y)o(er,)9 b(hence)i(meeting)e(the)i(aims)d(set)i(out)g(at)g(the)
+g(b)q(eginning)f(of)g(the)i(pro)r(ject.)17 b(What)10 b(w)o(as)262
+1779 y(most)j(surprising)h(ab)q(out)g(HIAR)o(CS's)g(results)i(on)e(the)h
+(test)g(p)q(ositions)f(w)o(as)g(its)h(balanced)262 1829 y(p)q(ositional)g
+(and)h(tactical)g(abilit)o(y)m(.)24 b(These)18 b(results)g(are)e
+(particularly)g(impressiv)o(e)g(when)262 1879 y(compared)f(to)g(the)i
+(results)g(obtained)e(from)f(other)j(c)o(hess)g(programs)e(on)g(the)i(same)e
+(test)262 1929 y(p)q(ositions.)324 2014 y(The)d(results)h(ac)o(hiev)o(ed)g
+(in)e(the)i(matc)o(hes)e(pla)o(y)o(ed)h(b)o(y)f(HIAR)o(CS)h(against)f(b)q
+(oth)h(h)o(uman)262 2064 y(and)17 b(computer)g(opp)q(osition)f(re-enforce)j
+(the)f(results)h(ac)o(hiev)o(ed)f(in)f(the)h(Bratk)o(o-Kop)q(ec)262
+2114 y(exp)q(erimen)o(t.)946 2574 y(167)p eop
+%%Page: 168 170
+168 169 bop 262 307 a Fr(8.3)69 b(Implications)20 b(and)k(F)-6
+b(uture)23 b(Prosp)r(ects)262 434 y Fp(Ov)o(er)16 b(the)h(last)e(10)h(y)o
+(ears,)g(full)f(width)g(Shannon)h(t)o(yp)q(e)g(A)g(programs)f(ha)o(v)o(e)h
+(made)e(great)262 483 y(adv)n(ances,)c(partly)g(due)h(to)f(adv)n(anced)g(sp)q
+(ecial)h(purp)q(ose)g(hardw)o(are)g(and)f(partly)g(to)g(sophis-)262
+533 y(ticated)17 b(searc)o(h)i(algorithms)c(suc)o(h)j(as)f(PVS)g(with)g
+(singular)g(extensions,)h(for)f(example.)262 583 y(V)m(ery)g(little)g(or)h
+(no)f(progress)i(has)f(b)q(een)g(made)f(o)o(v)o(er)g(the)h(same)f(p)q(erio)q
+(d)h(in)f(dev)o(eloping)262 633 y(purely)i(kno)o(wledge)h(based)g(programs)e
+(capable)i(of)f(high)g(lev)o(el)g(pla)o(y)f(throughout)i(the)262
+683 y(game.)c(It)e(seems)g(that)f(the)i(problems)e(of)g(kno)o(wledge)g
+(acquisition,)f(represen)o(tation)k(and)262 732 y(\014nally)d(implemen)o
+(tation)f(are)j(at)g(presen)o(t)h(to)q(o)f(great)g(to)g(mak)o(e)f(suc)o(h)h
+(kno)o(wledge)g(based)262 782 y(programs)g(successful.)28 b(Certainly)m(,)16
+b(the)h(k)o(ey)g(to)g(these)h(t)o(yp)q(es)f(of)f(program)f(remains)h(in)262
+832 y(the)e(b)q(etter)i(understanding)e(of)f(ho)o(w)h(strong)g(pla)o(y)o(ers)
+g(think.)324 917 y(There)e(seems)g(to)f(b)q(e)h(t)o(w)o(o)e(main)g(approac)o
+(hes)i(to)f(dev)o(eloping)f(an)h(in)o(telligen)o(t)g(selectiv)o(e)262
+967 y(searc)o(h)k(program.)312 1081 y(1.)20 b(Creating)14 b(an)g(in)o
+(telligen)o(t,)e(kno)o(wledge)i(based)g(program)e(from)h(scratc)o(h.)312
+1162 y(2.)20 b(Gradual)13 b(c)o(hange)h(to)g(a)g(full)e(width)i(Shannon)g(t)o
+(yp)q(e)g(A)g(program.)262 1276 y(An)9 b(approac)o(h)h(of)f(gradual)f(c)o
+(hange)i(to)g(existing)f(programs)f(seems)i(to)g(me)e(to)i(o\013er)g(a)f(b)q
+(etter)262 1326 y(hop)q(e)k(of)g(ev)o(en)o(tual)g(success.)21
+b(I)13 b(feel)g(a)h(program)d(lik)o(e)i(HIAR)o(CS)g(5.0)f(could)h(represen)o
+(t)j(the)262 1376 y(\014rst)e(step)g(in)f(a)g(gradual)f(transition)h(from)e
+(a)i(sophisticated)h(Shannon)f(t)o(yp)q(e)h(A)f(program)262
+1426 y(to)18 b(an)g(in)o(telligen)o(t)f(Shannon)i(t)o(yp)q(e)g(B/C)f
+(program.)31 b(The)19 b(ma)r(jor)d(adv)n(an)o(tage)i(of)g(suc)o(h)262
+1476 y(an)c(approac)o(h)g(is)h(that)f(the)i(program)d(can)h(serv)o(e)i(as)f
+(a)f(v)o(ehicle)h(for)f(exp)q(erimen)o(ting)g(with)262 1525
+y(ideas.)34 b(Hop)q(efully)m(,)20 b(this)f(will)f(in)h(turn)h(enable)g(the)g
+(researc)o(her)i(to)d(acquire)h(a)f(b)q(etter)262 1575 y(understanding)14
+b(of)f(the)i(problems)e(and)g(issues)i(in)o(v)o(olv)o(ed.)324
+1660 y(The)d(3)f(ma)r(jor)g(di\016culties)g(a\013ecting)h(the)g(dev)o
+(elopmen)o(t)f(of)g(a)h(go)q(o)q(d)f(ev)n(aluation)g(func-)262
+1710 y(tion)i(remain)f(kno)o(wing:)324 1824 y Ff(\017)20 b
+Fl(whic)o(h)13 b Fp(ev)n(aluation)f(criteria)j(are)f(imp)q(ortan)o(t.)324
+1905 y Ff(\017)20 b Fl(when)14 b Fp(ev)n(aluation)e(criteria)i(are)h(imp)q
+(ortan)o(t.)324 1986 y Ff(\017)20 b Fl(what)14 b Fp(the)g(relativ)o(e)g
+(merits)f(of)h(eac)o(h)g(ev)n(aluation)e(criterion)j(should)e(b)q(e.)262
+2100 y(The)i(solution)f(to)g(these)j(problems)d(lie)g(in)g(a)h(signi\014can)o
+(t)f(con)o(tribution)h(from)e(high)h(lev)o(el)262 2150 y(pla)o(y)o(ers)h(and)
+h(the)g(con)o(tin)o(ual)f(ev)o(olution)g(of)g(ev)n(aluation)f(criteria.)24
+b(The)17 b(problems)e(asso-)262 2200 y(ciated)g(with)g(assigning)f(discrete)j
+(v)n(alues)e(to)g(c)o(hess)i(concepts)g(is)e(a)g(ma)r(jor)f(di\016cult)o(y)g
+(for)262 2250 y(the)e(exp)q(ert)h(c)o(hess)g(pla)o(y)o(er.)k(Applying)11
+b(v)n(alue)g(ranges)h(instead)g(of)f(single)g(v)n(alues)h(ma)o(y)e(b)q(e)i(a)
+262 2300 y(p)q(ossibilit)o(y)m(.)j(This)e(com)o(bined)f(with)g(a)g(range)h
+(and)g(probabilit)o(y)e(based)i(searc)o(h)h(algorithm)262 2350
+y(w)o(ould)f(b)q(e)i(an)f(in)o(teresting)h(p)q(ossibilit)o(y)m(.)j(Learning)c
+(ma)o(y)e(pla)o(y)i(an)g(imp)q(ortan)o(t)f(role)h(here,)262
+2399 y(ho)o(w)o(ev)o(er,)i(man)o(y)e(of)h(the)h(problems)f(outlined)g(in)h(c)
+o(hapter)h(3)e(m)o(ust)g(b)q(e)h(solv)o(ed)g(if)f(this)h(is)262
+2449 y(to)d(b)q(e)i(the)f(case.)946 2574 y(168)p eop
+%%Page: 169 171
+169 170 bop 324 307 a Fp(The)11 b(com)o(bination)e(of)i(the)g(transp)q
+(osition)h(table)f(and)g(searc)o(h)h(extensions)g(has)f(pro)o(v)o(ed)262
+357 y(problematical.)j(The)e(expansion)e(of)g(eac)o(h)i(table)e(en)o(try)i
+(to)e(include)h(mo)o(v)o(e)e(sequences)14 b(and)262 407 y(extension)j
+(information)d(is)i(required.)27 b(As)18 b(w)o(ell)e(as)g(easing)h(the)g
+(problems)f(outlined)g(in)262 457 y(section)i(7.6,)e(this)i(impro)o(v)o(em)o
+(en)o(t)d(could)i(allo)o(w)f(a)h(h)o(uman)f(pla)o(y)o(er)g(to)i(ask)f("what)g
+(if)f(?")262 506 y(questions.)31 b(The)18 b(transp)q(osition)g(table)g(could)
+g(b)q(e)h(prob)q(ed)g(after)f(a)g(searc)o(h)h(to)f(answ)o(er)262
+556 y(suc)o(h)c(questions)h(with)f(mo)o(v)o(e)e(sequences)17
+b(and)d(scores.)20 b(The)14 b Fh(\013\014)j Fp(algorithm)11
+b(w)o(ould)i(limit)262 606 y(suc)o(h)j(a)g(metho)q(d)f(b)q(ecause)j(of)d(p)q
+(ossible)h(cut)h(o\013s,)f(but)g(still)f(a)h(step)h(in)e(the)i(direction)f
+(of)262 656 y(understanding)i(mo)o(v)o(e)e(selection)j(w)o(ould)e(b)q(e)h
+(made.)29 b(Another)19 b(p)q(ossibilit)o(y)e(is)g(the)i(use)262
+706 y(of)c(the)h(ev)n(aluation)f(function)h(to)f(answ)o(er)i(questions)f(ab)q
+(out)g(the)h(p)q(osition)e(e.g.)24 b("whic)o(h)262 756 y(squares)13
+b(are)h(w)o(eak)e(around)h(the)g(white)g(king)f(?".)17 b(Suc)o(h)c(approac)o
+(hes)h(w)o(ould)e(help)g(strong)262 805 y(c)o(hess)h(pla)o(y)o(ers)f(to)g
+(iden)o(tify)g(program)e(w)o(eaknesses)15 b(and)d(allo)o(w)e(the)j(program)e
+(designer)i(to)262 855 y(w)o(ork)g(more)g(closely)h(with)f(c)o(hess)j(pla)o
+(y)o(ers)e(ha)o(ving)e(little)i(programmi)o(ng)d(kno)o(wledge.)324
+940 y(HIAR)o(CS)16 b(5.0)f(con)o(tains)h(man)o(y)e(searc)o(h)j(extension)g
+(heuristics)g(whic)o(h)f(mak)o(e)f(a)g(p)q(os-)262 990 y(itiv)o(e)i(con)o
+(tribution)g(to)h(its)g(tactical)f(abilit)o(y)m(.)28 b(The)18
+b(next)h(step)f(w)o(ould)f(not)h(only)f(b)q(e)i(to)262 1040
+y(enhance)c(and)f(tune)h(these)h(existing)e(heuristics,)h(but)f(to)g(in)o
+(tro)q(duce)h(new)g(heuristics.)21 b(In)262 1090 y(particular,)13
+b(there)h(seems)g(no)g(reason)g(wh)o(y)f(p)q(ositional)g(t)o(yp)q(e)h(searc)o
+(h)h(extensions)f(cannot)262 1140 y(b)q(e)i(in)o(tro)q(duced.)27
+b(Although)15 b(the)i(asso)q(ciated)g(di\016culties)f(are)h(man)o(y)m(,)d
+(the)j(rew)o(ards)g(are)262 1189 y(great.)324 1275 y(Ov)o(er)d(the)f(coming)e
+(mon)o(ths,)h(I)h(will)f(endev)o(our)i(to)e(correct)j(man)o(y)c(of)i(the)h(w)
+o(eaknesses)262 1324 y(iden)o(ti\014ed)20 b(in)h(HIAR)o(CS)f(5.0's)g(pla)o(y)
+m(.)37 b(HIAR)o(CS)20 b(5.n)g(will)g(b)q(e)h(en)o(tered)h(in)f(the)g(c)o
+(hess)262 1374 y(tournamen)o(t)10 b(of)h(the)h(2nd)f(Computer)g(Olympiad)e
+(later)j(this)f(y)o(ear.)18 b(Hop)q(efully)m(,)10 b(HIAR)o(CS)262
+1424 y(will)16 b(b)q(e)j(using)f(a)g(25Mhz)h(68030)e(for)h(this)g(ev)o(en)o
+(t.)32 b(The)19 b(result)g(this)g(summer)d(will)h(b)q(e)262
+1474 y(in)o(teresting.)324 1559 y(Man)o(y)e(of)f(the)i(tec)o(hniques)g(used)g
+(in)f(computer)g(c)o(hess)i(programs)d(ma)o(y)f(b)q(e)j(useful)f(in)262
+1609 y(other)f(problem)e(domains.)k(I)e(con)o(tacted)h(Hans)f(Berliner)g(at)g
+(CMU)g(ab)q(out)f(the)h(p)q(ossibil-)262 1659 y(ities)i(of)f(applying)g(some)
+g(of)g(the)i(latest)f(searc)o(h)h(tec)o(hniques)h(to)d(Theorem)h(Pro)o(ving)f
+([8].)262 1709 y(Although)i(no)i(one)f(has)h(built)f(sp)q(ecial)g(purp)q(ose)
+i(hardw)o(are,)f(the)g('c)o(hess)h(approac)o(h')e(is)262 1758
+y(apparen)o(tly)13 b(b)q(eing)h(lo)q(ok)o(ed)f(up)q(on)h(fa)o(v)o(ourably)m
+(.)324 1844 y(I)g(hop)q(e)g(this)g(pro)r(ject)h(has)f(sho)o(wn)g(that)f(b)q
+(oth)h(c)o(hess)i(kno)o(wledge)d(and)h(searc)o(hing)g(can)262
+1893 y(complemen)o(t)f(eac)o(h)k(other)g(and)e(that)h(a)g(go)q(o)q(d)g
+(balance)g(b)q(et)o(w)o(een)h(the)g(t)o(w)o(o)e(can)h(ac)o(hiev)o(e)262
+1943 y(results.)946 2574 y(169)p eop
+%%Page: 170 172
+170 171 bop 262 675 a Fo(Bibliog)q(raph)m(y)324 913 y Fp([1])19
+b(G.)e(M.)g(Adelson-V)m(elskiy)h(and)f(M.)g(V.)h(Donsk)o(o)o(y)e(\(1975\))h
+(:)26 b Fm(Some)19 b(Metho)n(ds)g(of)388 963 y(Contr)n(ol)r(ling)g(the)g(T)m
+(r)n(e)n(e)g(Se)n(ar)n(ch)g(in)h(Chess)f(Pr)n(o)n(gr)n(ams.)f
+Fp(Arti\014cial)g(In)o(telligence,)388 1012 y(V)m(ol)13 b(6)h(No)f(4,)h(pp)g
+(361-371.)324 1095 y([2])19 b(G.)g(M.)f(Adelson-V)m(elskiy)m(,)i(V.)f(L.)f
+(Arlazaro)o(v,)i(A.)f(R.)f(Bitman,)h(A.)f(A.)h(Zhiv)o(o-)388
+1145 y(to)o(vskiy)h(and)f(A.)h(V.)f(Usk)o(o)o(v)h(\(1970\))f(:)30
+b Fm(Pr)n(o)n(gr)n(amming)20 b(a)g(Computer)g(to)h(Play)388
+1195 y(Chess.)14 b Fp(Russian)f(Math.)h(Surv)o(eys,)g(pp)g(221-262)324
+1278 y([3])19 b(T.)14 b(Anan)o(tharaman,)f(M.)g(Campb)q(ell,)g(F.)h(Hsu)h
+(\(1988\))e(:)19 b Fm(Singular)d(Extensions)g(:)388 1328 y(A)n(dding)i(Sele)n
+(ctivity)e(to)h(Brute{F)m(or)n(c)n(e)g(Se)n(ar)n(ching.)f Fp(ICCA)h(Journal,)
+f(V)m(ol)f(11)h(No)388 1378 y(4,)d(pp)h(135-143.)324 1461 y([4])19
+b(L.)f(R.)f(A)o(tkin)h(and)g(D.)f(J.)h(Slate)g(\(1977\))f(:)26
+b Fm(CHESS)20 b(4.5)e(-)h(The)g(Northwestern)388 1510 y(University)14
+b(Chess)g(Pr)n(o)n(gr)n(am.)f Fp(Chess)h(Skill)e(in)h(Man)g(and)g(Mac)o
+(hine,)g(P)m(.)g(W.)f(F)m(rey)388 1560 y(\(ed\),)j(pp)e(82-118,)f(Springer{V)
+m(erlag,)h(New)i(Y)m(ork.)324 1643 y([5])k(D.)13 b(F.)h(Beal)g(\(1989\))f(:)
+18 b Fm(Exp)n(eriments)c(with)g(the)h(Nul)r(l)f(Move.)h Fp(Adv)n(ances)f(in)f
+(Com-)388 1693 y(puter)20 b(Chess)g(5,)f(D.)f(F.)g(Beal)g(\(ed\),)j(pp)d
+(65-79,)g(Elsevier)i(Science)g(Publishers)388 1743 y(B.V.,)13
+b(North)i(Holland.)324 1826 y([6])k(H.)f(J.)f(Berliner)i(\(1979\))e(:)26
+b Fm(The)18 b(B*)h(T)m(r)n(e)n(e)e(Se)n(ar)n(ch)i(A)o(lgorithm)e(:)26
+b(A)18 b(Best)h(First)388 1876 y(Pr)n(o)n(of)c(Pr)n(o)n(c)n(e)n(dur)n(e.)e
+Fp(Arti\014cial)g(In)o(telligence,)h(V)m(ol)f(12,)f(No)i(1,)f(pp)h(23-40.)324
+1959 y([7])19 b(H.)11 b(J.)h(Berliner)g(\(1989\))f(:)16 b Fm(Some)e
+(Innovations)f(Intr)n(o)n(duc)n(e)n(d)g(by)g(Hite)n(ch.)e Fp(Adv)n(ances)388
+2009 y(in)h(Computer)f(Chess)j(5,)d(D.)h(F.)g(Beal)g(\(ed\),)h(pp)f(283-293,)
+e(Elsevier)j(Science)g(Pub-)388 2058 y(lishers)i(B.V.,)e(North)h(Holland.)324
+2141 y([8])19 b(H.)14 b(J.)g(Berliner)g(:)k Fm(Personal)d(Communic)n(ation,)g
+(F)m(eb)g(1990.)324 2224 y Fp([9])k(A.)14 b(Bernstein)h(and)f(M.)f(de)h(V.)f
+(Rob)q(erts)i(\(1958\))e(:)k Fm(Computer)e(vs)g(Chess)f(Player.)388
+2274 y Fp(Scien)o(ti\014c)h(American,)d(198,)h(pp)h(96-105.)303
+2357 y([10])19 b(P)m(.)14 b(Bettadapur)h(\(1986\))f(:)19 b
+Fm(In\015uenc)n(e)e(of)e(Or)n(dering)f(on)i(Captur)n(e)f(Se)n(ar)n(ch.)g
+Fp(ICCA)388 2407 y(Journal,)e(V)m(ol)g(9,)g(No)h(4,)f(pp)h(180-188.)946
+2574 y(170)p eop
+%%Page: 171 173
+171 172 bop 303 307 a Fp([11])19 b(J.)12 b(A.)g(Birmingham)d(and)j(P)m(.)f
+(Ken)o(t)i(\(1977\))e(:)17 b Fm(T)m(r)n(e)n(e-se)n(ar)n(ching)12
+b(and)i(T)m(r)n(e)n(e-pruning)388 357 y(T)m(e)n(chniques.)h
+Fp(Adv)n(ances)g(in)f(Computer)f(Chess)j(1,)e(M.)f(Clark)o(e)h(\(ed\),)h(pp)g
+(89-107.)388 407 y(Edin)o(burgh)f(Univ)o(ersit)o(y)g(Press.)303
+487 y([12])19 b(I.)g(Bratk)o(o)h(and)f(D.)f(Kop)q(ec)j(\(1982\))e(:)29
+b Fm(The)20 b(Br)n(atko{Kop)n(e)n(c)g(Exp)n(eriment)g(:)29
+b(A)388 536 y(Comp)n(arison)16 b(of)f(Human)i(and)f(Computer)f(Performanc)n
+(e)h(in)f(Chess.)g Fp(Adv)n(ances)388 586 y(in)10 b(Computer)g(Chess)i(3,)e
+(Clark)o(e)h(M.)f(\(ed\),)h(pp)g(51-72.)e(P)o(ergamon)g(Press,)j(Oxford.)303
+666 y([13])19 b(M.)12 b(S.)g(Campb)q(ell)f(and)h(T.)g(A.)g(Marsland)g
+(\(1983\))g(:)17 b Fm(A)c(Comp)n(arison)h(of)f(Minimax)388
+716 y(T)m(r)n(e)n(e)h(Se)n(ar)n(ch)h(A)o(lgorithms.)e Fp(Arti\014cial)g(In)o
+(telligence,)h(V)m(ol)e(20)i(No)f(4,)h(pp)g(347-367.)303 795
+y([14])19 b(J.)g(H.)f(Condon)g(and)g(K.)g(Thompson)f(\(1982\))h(:)27
+b Fm(Bel)r(le)19 b(Chess)g(Har)n(dwar)n(e.)e Fp(Ad-)388 845
+y(v)n(ances)d(in)e(Computer)g(Chess)h(3,)g(M.)f(Clark)o(e)g(\(ed\),)h(pp)g
+(45-54,)e(P)o(ergamon)g(Press,)388 895 y(Oxford.)303 975 y([15])19
+b(S.)14 b(M.)f(Cracraft)h(\(1984\))f(:)18 b Fm(Bitmap)c(Move)i(Gener)n(ation)
+f(in)f(Chess.)g Fp(ICCA)f(Jour-)388 1024 y(nal,)g(V)m(ol)g(7,)g(No)h(3,)f(pp)
+h(146-153.)303 1104 y([16])19 b(A.)26 b(D.)f(de)h(Gro)q(ot)f(\(1978\))g(:)42
+b Fm(Thought)26 b(and)h(Choic)n(e)f(in)g(Chess.)f Fp(Mouton-)388
+1154 y(DeGruyter,)15 b(2nd)e(edition.)303 1234 y([17])19 b(A.)e(D.)g(de)h
+(Gro)q(ot)f(and)h(R.)e(W.)h(Jongman)e(\(1966\))i(:)25 b Fm(Heuristics)18
+b(in)g(p)n(er)n(c)n(eptual)388 1284 y(pr)n(o)n(c)n(esses.)c
+Fp(In)o(ternational)f(Congress)i(of)e(Psyc)o(hology)m(,)g(Mosco)o(w,)g
+(August)h(1966.)303 1363 y([18])19 b(C.)10 b(Eb)q(eling)f(\(1986\))h(:)16
+b Fm(A)o(l)r(l)10 b(the)h(R)o(ight)h(Moves)f({)h(A)f(VLSI)g(A)o(r)n(chite)n
+(ctur)n(e)f(for)h(Chess.)388 1413 y Fp(PhD)j(thesis,)h(Carnegie{Mellon)e
+(Univ)o(ersit)o(y)m(.)303 1493 y([19])19 b(A.)i(E.)f(Elo)h(\(1978\))f(:)32
+b Fm(The)21 b(R)n(atings)g(of)h(Chess)f(Players)g(Past)g(and)h(Pr)n(esent.)
+388 1543 y Fp(Batsford)15 b(Bo)q(oks,)e(London.)303 1622 y([20])19
+b(M.)d(Eu)o(w)o(e)h(\(1970\))f(:)23 b Fm(Computers)17 b(and)h(Chess.)e
+Fp(The)h(Encyclopaedia)f(of)g(Chess,)388 1672 y(A.)e(Sunn)o(uc)o(ks)g
+(\(ed\),)h(St)f(Martin's)f(Press,)i(New)g(Y)m(ork.)303 1752
+y([21])k Fm(Discussion)d(with)e(T)m(om)h(F)m(urstembur)n(g,)e(Fidelity)i(Ele)
+n(ctr)n(onics,)f(A)o(ugust)h(1989.)303 1831 y Fp([22])k(J.)c(J.)f(Gillogly)e
+(\(1972\))i(:)19 b Fm(The)d(T)m(e)n(chnolo)n(gy)g(Chess)f(Pr)n(o)n(gr)n(am.)f
+Fp(Arti\014cial)g(In)o(telli-)388 1881 y(gence,)h(V)m(ol)e(3,)g(pp)h
+(145-163.)303 1961 y([23])19 b(R.)f(D.)f(Green)o(blatt,)i(D.)f(E.)g(Eastlak)o
+(e)g(I)q(I)q(I)h(and)f(S.)g(D.)f(Cro)q(c)o(k)o(er)i(\(1967\))f(:)27
+b Fm(The)388 2011 y(Gr)n(e)n(enblatt)15 b(Chess)f(Pr)n(o)n(gr)n(am.)f
+Fp(Pro)q(c.)i(FJCC,V)m(ol)d(31,)h(pp)h(801-810)303 2090 y([24])19
+b(G.)14 b(Grottling)g(\(1986\))g(:)19 b Fm(The)d(Swe)n(dish)f(r)n(ating)h
+(list.)d Fp(ICCA)i(Journal,)f(V)m(ol)g(9,)g(No)388 2140 y(1,)f(pp)h(56.)303
+2220 y([25])19 b(J.)i(Hamlen)e(\(1989\))g(:)32 b Fm(T)m(r)n(e)n(e)19
+b(Se)n(ar)n(ching)j(A)o(lgorithms)e(and)h(Computer)g(Chess.)388
+2270 y Fp(M.Sc.)14 b(Thesis,)g(Univ)o(ersit)o(y)g(of)f(London.)303
+2350 y([26])19 b(L.)12 b(R.)f(Harris)i(\(1977\))e(:)17 b Fm(The)d(Heuristic)e
+(Se)n(ar)n(ch)h(:)18 b(A)o(n)c(alternative)f(to)g(the)g(alpha-)388
+2399 y(b)n(eta)19 b(minimax)f(pr)n(o)n(c)n(e)n(dur)n(e.)f Fp(Chess)i(Skill)d
+(in)h(Man)h(and)f(Mac)o(hine.)h(P)m(.)f(W.)f(F)m(rey)388 2449
+y(\(ed\),)f(pp)e(157-166,)f(Springer{V)m(erlag,)h(New)i(Y)m(ork.)946
+2574 y(171)p eop
+%%Page: 172 174
+172 173 bop 303 307 a Fp([27])19 b(D.)d(Hartmann)g(\(1989\))g(:)24
+b Fm(Notions)17 b(of)h(Evaluation)g(F)m(unctions)g(T)m(este)n(d)f(against)388
+357 y(Gr)n(andmaster)g(Games.)f Fp(Adv)n(ances)h(in)f(Computer)f(Chess)i(5,)f
+(D.)f(F.)h(Beal)g(\(ed\),)388 407 y(pp)e(91-141,)e(Elsevier)j(Science)g
+(Publishers)g(B.V.,)e(North)h(Holland.)303 487 y([28])19 b(E.)c(Hearst)i
+(\(1977\))d(:)21 b Fm(Man)c(and)g(Machine)g(:)k(Chess)16 b(A)n(chievements)h
+(and)g(Chess)388 536 y(Thinking.)f Fp(Chess)h(Skill)d(in)h(Man)g(and)h(Mac)o
+(hine.)f(P)m(.)g(W.)f(F)m(rey)i(\(ed\),)g(Springer{)388 586
+y(V)m(erlag,)d(New)i(Y)m(ork.)303 666 y([29])k(R.)14 b(M.)g(Hy)o(att)g
+(\(1983\))f(:)19 b Fm(Cr)n(ay)c(Blitz)g(-)g(A)g(Computer)g(Chess)g(Playing)h
+(Pr)n(o)n(gr)n(am.)388 716 y Fp(M.Sc.)e(Thesis.)303 795 y([30])19
+b(R.)12 b(M.)g(Hy)o(att)h(\(1984\))f(:)17 b Fm(Using)d(Time)f(Wisely.)f
+Fp(ICCA)h(Journal,)f(V)m(ol)g(7)g(No)g(1,)h(pp)388 845 y(4-9.)303
+925 y([31])19 b(R.)10 b(M.)f(Hy)o(att,)i(A.)e(E.)h(Go)o(w)o(er)g(and)g(H.)g
+(L.)g(Nelson)g(\(1984\))g(:)16 b Fm(Cr)n(ay)11 b(Blitz.)e Fp(Adv)n(ances)388
+975 y(in)j(Computer)f(Chess)i(4,)e(D.)g(F.)h(Beal)g(\(ed\),)g(pp)g(8-18,)f(P)
+o(ergamon)g(Press,)i(Oxford.)303 1054 y([32])19 b(B.)11 b(M.)f(Kazic)i
+(\(1980\))e(:)16 b Fm(The)c(Chess)g(Comp)n(etitor's)f(Handb)n(o)n(ok.)h
+Fp(Batsford)f(Bo)q(oks,)388 1104 y(London.)303 1184 y([33])19
+b(D.)9 b(E.)h(Kn)o(uth)g(and)f(R.)g(W.)f(Mo)q(ore)i(\(1975\))f(:)16
+b Fm(A)o(n)11 b(analysis)g(of)g(alpha-b)n(eta)g(pruning.)388
+1234 y Fp(Arti\014cial)j(In)o(telligence,)f(V)m(ol)g(6)h(No)f(4,)g(pp)h
+(293-326.)303 1313 y([34])19 b(D.)11 b(Kop)q(ec,)h(M.)e(Newb)q(orn)i(and)f
+(W.)f(Y)m(u)h(\(1986\))f(:)17 b Fm(Exp)n(eriments)12 b(in)h(Chess)f(Co)n
+(gni-)388 1363 y(tion.)d Fp(Adv)n(ances)i(in)e(Computer)f(Chess)j(4,)e(D.)g
+(F.)g(Beal)g(\(ed\),)i(pp)e(59-79.)f(P)o(ergamon)388 1413 y(Press,)15
+b(Oxford.)303 1493 y([35])k(A.)e(Kotok)h(\(1962\))e(:)25 b
+Fm(A)18 b(Chess)h(Playing)f(Pr)n(o)n(gr)n(am)f(for)h(the)g(IBM)h(7090.)f
+Fp(B.Sc.)388 1543 y(Thesis,)c(MIT.)303 1622 y([36])19 b(D.)13
+b(Levy)h(\(1976\))g(:)k Fm(Chess)c(and)i(Computers.)d Fp(Batsford)i(Bo)q
+(oks,)e(London.)303 1702 y([37])19 b(D.)c(Levy)h(\(1979\))g(:)22
+b Fm(Chess)16 b(Pr)n(o)n(gr)n(amming.)f Fp(P)o(ersonal)h(Computer)f(W)m
+(orld,)g(Ma)o(y)388 1752 y(1979,)e(pp)h(25-27.)303 1831 y([38])19
+b(D.)12 b(Levy)m(,)g(D.)f(Brough)o(ton,)h(M.)g(T)m(a)o(ylor)f(\(1989\))h(:)17
+b Fm(The)c(SEX)h(A)o(lgorithm)e(in)i(Com-)388 1881 y(puter)h(Chess.)f
+Fp(ICCA)g(Journal,)f(V)m(ol)f(12)i(No)g(1,)f(pp)h(10-21.)303
+1961 y([39])19 b(T.)f(A.)f(Marsland)h(\(1985\))f(:)26 b Fm(Evaluation)19
+b(F)m(unction)g(F)m(actors.)e Fp(ICCA)h(Journal,)388 2011 y(V)m(ol)13
+b(8)h(No)f(2,)h(pp)g(47-57.)303 2090 y([40])19 b(T.)10 b(A.)f(Marsland)h
+(\(1986\))f(:)16 b Fm(A)c(R)n(eview)f(of)g(Game-T)m(r)n(e)n(e)f(Pruning.)g
+Fp(ICCA)g(Journal,)388 2140 y(V)m(ol)j(9)h(No)f(1,)h(pp)g(3-19.)303
+2220 y([41])19 b(T.)10 b(A.)f(Marsland)g(\(1990\))g(:)16 b
+Fm(The)11 b(Br)n(atko-Kop)n(e)n(c)g(T)m(est)g(R)n(evisite)n(d.)e
+Fp(ICCA)g(Journal,)388 2270 y(V)m(ol)k(13,)g(No)h(1,)f(pp)h(15-19.)303
+2350 y([42])19 b(A.)12 b(New)o(ell,)f(J.)h(C.)f(Sha)o(w)g(and)h(H.)f(A.)h
+(Simon)d(\(1958\))i(:)17 b Fm(Chess)c(Playing)g(Pr)n(o)n(gr)n(ams)388
+2399 y(and)k(the)e(Pr)n(oblem)h(of)f(Complexity.)f Fp(IBM)h(Journal)g(of)f
+(Researc)o(h)i(and)e(Dev)o(elop-)388 2449 y(men)o(t,)f(Oct)i(1958,)d(pp)i
+(320-335.)946 2574 y(172)p eop
+%%Page: 173 175
+173 174 bop 303 307 a Fp([43])19 b(A.)13 b(Nimzo)o(witsc)o(h)f(\(1929\))g(:)
+18 b Fm(My)c(System.)f Fp(Mo)q(dern)h(Chess)g(Masterpieces,)h(Bats-)388
+357 y(ford)f(Bo)q(oks,)g(London.)303 440 y([44])19 b(A.)11
+b(Nimzo)o(witsc)o(h)f(\(1936\))g(:)17 b Fm(Chess)12 b(Pr)n(axis.)f
+Fp(Batsford)g(Chess)i(Classics,)e(Batsford)388 490 y(Bo)q(oks,)j(London.)303
+573 y([45])19 b(T.)c(Nitsc)o(he)h(\(1982\))e(:)20 b Fm(A)c(L)n(e)n(arning)f
+(Chess)h(Pr)n(o)n(gr)n(am.)e Fp(Adv)n(ances)i(in)e(Computer)388
+623 y(Chess)h(3,)f(M.)f(Clark)o(e)h(\(ed\),)g(pp)g(113-120.)d(P)o(ergamon)i
+(Press,)i(Oxford.)303 706 y([46])k(A.)f(Reinefeld)f(\(1983\))g(:)25
+b Fm(A)o(n)18 b(Impr)n(ovement)h(of)f(the)g(Sc)n(out)h(T)m(r)n(e)n(e-Se)n(ar)
+n(ch)e(A)o(lgo-)388 756 y(rithm.)c Fp(ICCA)h(Journal,)f(V)m(ol)g(6)h(No)f(4,)
+g(pp)h(4-14.)303 839 y([47])19 b(F.)14 b(Rein\014eld)f(\(1945\))h(:)j
+Fm(Win)f(A)o(t)e(Chess.)g Fp(Do)o(v)o(er)f(Bo)q(oks.)303 922
+y([48])19 b(A.)h(L.)e(Sam)o(uels)h(\(1959\))f(:)30 b Fm(Some)20
+b(Studies)h(in)f(Machine)h(L)n(e)n(arning)f(using)h(the)388
+971 y(Game)f(of)f(Che)n(ckers.)e Fp(IBM)i(Journal)f(of)g(Researc)o(h)h(and)f
+(Dev)o(elopmen)o(t,)g(3,)h(pp)388 1021 y(211-229.)303 1104
+y([49])g(A.)h(L.)e(Sam)o(uels)h(\(1967\))f(:)30 b Fm(Some)20
+b(Studies)h(in)f(Machine)h(L)n(e)n(arning)f(using)h(the)388
+1154 y(Game)d(of)f(Che)n(ckers,)g(II)g(-)g(R)n(e)n(c)n(ent)g(Pr)n(o)n(gr)n
+(ess.)e Fp(IBM)i(Journal)f(of)f(Researc)o(h)j(and)388 1204
+y(Dev)o(elopmen)o(t,)13 b(V)m(ol)f(2)i(No)g(6,)f(pp)h(601-617.)303
+1287 y([50])19 b(J.)14 b(Sc)o(hae\013er)h(\(1983\))e(:)18 b
+Fm(The)d(History)f(Heuristic.)f Fp(ICCA)h(Journal,)f(V)m(ol)g(6,)g(No)g(3,)
+388 1337 y(pp)h(16-19.)303 1420 y([51])19 b(J.)12 b(Sc)o(hae\013er)h
+(\(1984\))e(:)17 b Fm(The)c(R)n(elative)f(Imp)n(ortanc)n(e)h(of)g(Know)r(le)n
+(dge.)f Fp(ICCA)f(Jour-)388 1469 y(nal,)i(V)m(ol)g(7)g(No)h(3,)f(pp)h
+(138-145.)303 1553 y([52])19 b(G.)14 b(Sc)o(hrufer)i(\(1989\))e(:)20
+b Fm(A)15 b(Str)n(ate)n(gic)g(Quiesc)n(enc)n(e)h(Se)n(ar)n(ch.)f
+Fp(ICCA)g(Journal,)f(V)m(ol)388 1602 y(12)g(No)f(1,)h(pp)g(3-9.)303
+1685 y([53])19 b(C.)f(E.)g(Shannon)g(\(1950\))g(:)27 b Fm(Pr)n(o)n(gr)n
+(amming)18 b(a)i(Computer)e(for)h(Playing)g(Chess.)388 1735
+y Fp(Philosophical)13 b(Mag,)g(V)m(ol)g(41,)f(pp)i(256-275.)303
+1818 y([54])19 b(A.)12 b(Shapiro)f(and)g(T.)g(Niblett)h(\(1982\))f(:)17
+b Fm(A)o(utomatic)12 b(Induction)i(of)f(Classi\014c)n(ation)388
+1868 y(R)o(ules)j(for)e(a)i(Chess)f(Endgame.)g Fp(Adv)n(ances)g(in)f
+(Computer)f(Chess)j(3,)d(M.)h(Clark)o(e)388 1918 y(\(ed\),)h(pp)e(73-91.)g(P)
+o(ergamon)f(Press,)j(Oxford.)303 2001 y([55])k(H.)14 b(A.)f(Simon)f(and)i(K.)
+f(A.)h(Gilmartin)d(\(1973\))i(:)18 b Fm(A)c(Simulation)h(of)g(Memory)g(for)
+388 2051 y(Chess)g(Positions.)f Fp(Cognitiv)o(e)f(Psyc)o(hology)m(,)f(5,)h
+(pp)h(29-46.)303 2134 y([56])19 b(H.)10 b(A.)f(Simon)f(and)h(W.)g(G.)g(Chase)
+i(\(1973\))e(:)15 b Fm(Skil)r(l)c(in)g(Chess.)f Fp(American)f(Scien)o(tist,)
+388 2183 y(61,)k(pp)h(394-403.)303 2267 y([57])19 b(S.)f(S.)f(Skiena)h
+(\(1986\))g(:)26 b Fm(A)o(n)19 b(Overview)e(of)i(Machine)g(L)n(e)n(arning)g
+(in)g(Computer)388 2316 y(Chess.)14 b Fp(ICCA)g(Journal,)f(V)m(ol)g(9)g(No)h
+(1,)f(pp)h(20-27.)303 2399 y([58])19 b(D.)c(J.)g(Slate)g(\(1987\))g(:)21
+b Fm(A)16 b(Chess)g(Pr)n(o)n(gr)n(am)f(that)h(uses)h(its)e(T)m(r)n(ansp)n
+(osition)h(T)m(able)388 2449 y(to)f(L)n(e)n(arn)g(fr)n(om)f(Exp)n(erienc)n
+(e.)g Fp(ICCA)g(Journal,)f(V)m(ol)g(10)g(No)h(2,)f(pp)h(59-71.)946
+2574 y(173)p eop
+%%Page: 174 176
+174 175 bop 303 307 a Fp([59])19 b(E.)i(Slater)g(\(1950\))f(:)32
+b Fm(Statistics)20 b(for)h(the)g(Chess)h(Computer)f(and)h(the)f(F)m(actor)388
+357 y(of)e(Mobility.)d Fp(Symp)q(osium)f(on)i(Information)e(Theory)m(,)j
+(London)f(:)26 b(Ministry)17 b(of)388 407 y(Supply)m(,)c(pp)h(150-152.)303
+490 y([60])19 b(A.)11 b(M.)h(T)m(uring)e(\(1950\))h(:)17 b
+Fm(Computing)c(Machinery)g(and)g(Intel)r(ligenc)n(e.)f Fp(Mind,)f(V)m(ol)388
+540 y(59,)i(pp)h(433-460.)303 623 y([61])19 b(D.)g(E.)f(Wilkins)g(\(1980\))g
+(:)28 b Fm(Using)20 b(Patterns)f(and)h(Plans)g(in)g(Chess.)e
+Fp(Arti\014cial)388 672 y(In)o(telligence,)c(V)m(ol)f(14,)g(No)g(1,)h(pp)f
+(165-203.)303 756 y([62])19 b(B.)14 b(H.)g(W)m(o)q(o)q(d)e(\(1986\))i(:)k
+Fm(The)c(World)h(Chess)g(Championship.)f Fp(Chess)h(Magazine,)388
+805 y(B.)f(H.)g(W)m(o)q(o)q(d)f(\(ed\),)h(August)g(-)g(No)o(v)o(em)o(b)q(er)f
+(86,)g(V)m(ol)g(51,)f(Nos)j(987-994.)303 888 y([63])k(A.)f(L.)e(Zobrist)i
+(\(1970\))f(:)25 b Fm(A)19 b(Hashing)f(Metho)n(d)h(with)f(Applic)n(ations)g
+(for)f(Game)388 938 y(Playing.)d Fp(T)m(ec)o(hnical)f(rep)q(ort)i(88,)e
+(Computer)g(Sciences)i(Dept,)f(Univ)f(of)g(Wiscon-)388 988
+y(sin,)h(Madison)f(WI,)g(April)g(1970.)303 1071 y([64])19 b(A.L.)f(Zobrist)h
+(and)f(F.)h(R.)e(Carlson,)i(Jr)g(\(1973\))f(:)27 b Fm(A)o(n)19
+b(A)n(dvic)n(e{T)m(aking)h(Chess)388 1121 y(Computer.)14 b
+Fp(Scien)o(ti\014c)g(American,)f(228,)f(pp)i(92-105.)946 2574
+y(174)p eop
+%%Page: 175 177
+175 176 bop 262 654 a Fn(App)s(endix)33 b(A)262 897 y Fo(Glossary)321
+1120 y Fl(ABF)254 b(A)p Fp(v)o(erage)14 b Fl(B)p Fp(ranc)o(hing)g
+Fl(F)p Fp(actor.)321 1220 y Fl(AI)300 b Fp(Arti\014cial)13
+b(In)o(telligence.)321 1320 y Fl(ELO)258 b Fp(A)14 b(c)o(hess)h(rating)f
+(system)f(used)i(b)o(y)f(the)g(w)o(orld)f(c)o(hess)j(federation.)321
+1419 y Fl(en-prise)187 b Fp(A)14 b(piece)h(is)e Fm(en-prise)h
+Fp(if)f(it)h(can)g(b)q(e)g(pro\014tably)g(captured.)321 1519
+y Fl(HIAR)o(CS)167 b(H)p Fp(igher)14 b Fl(I)p Fp(n)o(telligence)g
+Fl(A)p Fp(uto)g Fl(R)p Fp(esp)q(onse)i Fl(C)p Fp(hess)f Fl(S)p
+Fp(ystem.)321 1619 y Fl(ply)288 b Fp(One)15 b(half)d(mo)o(v)o(e)h(e.g.)k(a)d
+(mo)o(v)o(e)e(for)i(white.)321 1718 y Fl(P)o(osition)o(al)e(Pla)o(y)39
+b Fp(The)14 b(mano)q(euv)o(ering)f(of)g(pieces)i(to)f(b)q(etter)h(squares.)
+321 1818 y Fl(Pc/Sq)g(table)104 b Fp(Piece)15 b(Square)f(T)m(able.)321
+1918 y Fl(PVS)258 b(P)p Fp(rinciple)13 b Fl(V)p Fp(ariation)g
+Fl(S)p Fp(earc)o(h.)321 2017 y Fl(T)l(actical)i(Pla)o(y)81
+b Fp(Sequence)16 b(of)d(threat)i(and)e(capture)i(t)o(yp)q(e)g(mo)o(v)o(es.)
+321 2117 y Fl(T)l(emp)q(o)211 b Fp(A)14 b(single)f(mo)o(v)o(e)g(as)h(a)f
+(unit)h(of)f(time)g(in)g(c)o(hess,)i(e.g.)j(the)c(loss)g(of)f(a)h(temp)q(o)
+675 2167 y(w)o(ould)f(b)q(e)h(caused)h(b)o(y)f(taking)f(t)o(w)o(o)h(mo)o(v)o
+(es)e(to)i(accomplish)e(something)675 2216 y(whic)o(h)i(could)f(b)q(e)i(ac)o
+(hiev)o(ed)f(in)f(one)i(mo)o(v)o(e.)321 2316 y Fl(USCF)226
+b(U)p Fp(nited)14 b Fl(S)p Fp(tates)g Fl(C)p Fp(hess)i Fl(F)p
+Fp(ederation)e(rating)f(system.)18 b(Ratings)675 2366 y(on)c(this)g(scale)g
+(are)g(t)o(ypically)f(100-150)f(p)q(oin)o(ts)i(higher)g(than)f(the)675
+2416 y(equiv)n(alen)o(t)g(ELO)h(rating,)f(e.g.)18 b(2100)13
+b(USCF)h Ff(\031)g Fp(2000)f(ELO.)946 2574 y(175)p eop
+%%Page: 176 178
+176 177 bop 262 654 a Fn(App)s(endix)33 b(B)262 897 y Fo(Pseudo)40
+b(F)-10 b(unctions)262 1148 y Fp(This)15 b(app)q(endix)g(con)o(tains)h(a)f
+(description)h(of)e(the)i(pseudo)h(functions)e(used)h(in)f(the)h(de\014-)262
+1198 y(nition)11 b(of)h(m)o(y)f(ev)n(aluation)g(function.)18
+b(The)13 b(functions)f(are)h(giv)o(en)f(in)h(alphab)q(etical)e(order.)946
+2574 y(176)p eop
+%%Page: 177 179
+177 178 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(A)n(ttac)n(k)n(ed)19 b(:)24 b(PieceList)17 b(x)h(Colour)h(x)f(Square)h
+Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262
+571 182 2 v 262 660 a Ft(A)o(ttac)o(k)o(ed\(pl,c)o(ol,sq\))262
+759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g
+(if)f(square)i Fm(sq)f Fp(is)f(attac)o(k)o(ed)h(b)o(y)g(an)o(y)g(of)f(the)h
+(pieces)h(in)f(piecelist)g Fm(pl)g Fp(of)321 910 y(colour)f
+Fm(c)n(ol)p Fp(.)321 960 y(Otherwise)i(F)-5 b(ALSE.)262 1309
+y Fu(FUNCTION)p 262 1316 309 2 v 262 1408 a(A)n(ttac)n(king)18
+b(:)25 b(Piece)17 b(x)i(Colour)g(x)f(Square)g(x)g(Square)g
+Ft(=)-8 b Fa(\))19 b Fu(Bo)r(olean)262 1508 y Fl(Example)p
+262 1523 182 2 v 262 1612 a Ft(A)o(ttac)o(king\(p)q(c,col,sq1,sq2\))262
+1711 y Fl(Descripti)o(on)p 262 1726 241 2 v 321 1812 a Fp(Returns)14
+b(TR)o(UE)g(if)f(piece)i Fm(p)n(c)f Fp(of)f(colour)h Fm(c)n(ol)f
+Fp(on)h(square)h Fm(sq1)f Fp(is)f(attac)o(king)h(square)g Fm(sq2)p
+Fp(.)321 1862 y(Otherwise)h(F)-5 b(ALSE.)946 2574 y(177)p eop
+%%Page: 178 180
+178 179 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a Fs(])p Fu(A)n(ttac)n(ks)19 b(:)24 b(PieceList)17 b(x)h(Colour)h(x)f(Square)
+g Ft(=)-8 b Fa(\))19 b Fu(In)n(teger)262 556 y Fl(Example)p
+262 571 182 2 v 262 660 a Fs(])p Ft(A)o(ttac)o(ks\(pl,col,sq\))262
+759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)14
+b(the)h(n)o(um)o(b)q(er)e(of)g(attac)o(ks)h(on)g(square)h Fm(sq)f
+Fp(b)o(y)f(an)o(y)h(of)f(the)i(pieces)g(in)e(piecelist)h Fm(pl)321
+910 y Fp(of)f(colour)g Fm(c)n(ol)p Fp(.)262 1259 y Fu(FUNCTION)p
+262 1266 309 2 v 262 1359 a(Bishop)18 b(:)24 b(Colour)19 b(x)g(Colour)f
+Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 1458 y Fl(Example)p
+262 1473 182 2 v 262 1562 a Ft(Bishop\(col1,col2\))262 1661
+y Fl(Descripti)o(on)p 262 1676 241 2 v 321 1762 a Fp(Returns)c(TR)o(UE)g(if)f
+(colour)h Fm(c)n(ol1)f Fp(still)g(has)h(a)g(bishop)g(whic)o(h)f(op)q(erates)j
+(on)d(squares)i(of)321 1812 y(colour)e Fm(c)n(ol2)p Fp(.)946
+2574 y(178)p eop
+%%Page: 179 181
+179 180 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(Castled)18 b(:)25 b(Colour)18 b Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262
+556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(Castled\(col\))262
+759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g
+(if)f(colour)h Fm(c)n(ol)f Fp(has)h(castled.)19 b(Otherwise)c(F)-5
+b(ALSE.)262 1060 y Fu(FUNCTION)p 262 1067 309 2 v 262 1159
+a(Cen)n(tralP)n(oin)n(t)19 b(:)24 b(Square)19 b Ft(=)-8 b Fa(\))18
+b Fu(Square)262 1259 y Fl(Example)p 262 1274 182 2 v 262 1363
+a Ft(Cen)o(tralP)o(oin)o(t\(sq\))262 1462 y Fl(Descripti)o(on)p
+262 1477 241 2 v 321 1563 a Fp(Returns)c(an)g(o\013set)h(square,)f
+Fm(csq)g Fp(whic)o(h)g(represen)o(ts)i(the)f(cen)o(tral)f(p)q(oin)o(t)f(of)h
+(the)g(defensiv)o(e)321 1613 y(kings)f(p)q(osition.)k(Returns)e
+Fm(csq)f Fp(where)380 1713 y(csq)g(=)g(sq)380 1762 y Fl(if)e
+Fp(\(OnRank\(sq\))i(=)h(1\))439 1812 y(csq)f(=)g(csq)h(+)f(8)380
+1862 y Fl(else)439 1912 y(if)e Fp(\(OnRank\(sq\))j(=)f(8\))498
+1962 y(csq)g(=)g(csq)h(-)f(8)439 2012 y Fl(endif)380 2061 y(endif)380
+2111 y(if)e Fp(\(OnFile\(sq\))j(=)f(1\))439 2161 y(csq)g(=)g(csq)h(+)f(1)380
+2211 y Fl(else)439 2261 y(if)e Fp(\(OnFile\(sq\))j(=)f(8\))498
+2310 y(csq)g(=)g(csq)h(-)f(1)439 2360 y Fl(endif)380 2410 y(endif)946
+2574 y Fp(179)p eop
+%%Page: 180 182
+180 181 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(Con)n(trol)19 b(:)24 b(Square)18 b Ft(=)-8 b Fa(\))18 b Fu(Con)n(troller)
+262 556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(Con)o(trol\(sq\))262
+759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h(con)o
+(troller)f(of)f(square)i Fm(sq)p Fp(.)j(The)c(con)o(troller)g(is)g(de\014ned)
+h(to)e(b)q(e)i(the)321 910 y(colour)e(who)h(attac)o(ks)g(the)h(square)f
+Fm(sq)g Fp(with)g(more)f(pieces)i(of)e(a)h(sp)q(eci\014c)h(t)o(yp)q(e)f(than)
+321 960 y(the)g(opp)q(onen)o(t)g(and)g(the)g(n)o(um)o(b)q(er)g(of)f(all)g
+(other)h(attac)o(ks)g(b)o(y)g(lo)o(w)o(er)f(v)n(alued)h(pieces)321
+1010 y(are)g(equal.)321 1060 y(A)o(ttac)o(ks)g(are)g(compared)g(in)f(the)h
+(order)h(:)j(P)m(,N,B,R,Q,K.)12 b(If)h(all)g(attac)o(ks)h(b)o(y)g(eac)o(h)321
+1110 y(piece)g(are)h(equal)e(in)h(n)o(um)o(b)q(er)f(then)h(the)h(con)o
+(troller)f(is)f('None'.)262 1408 y Fu(FUNCTION)p 262 1415 309
+2 v 262 1508 a Fs(])p Fu(Di\013A)n(ttac)n(ks)18 b(:)24 b(Colour)19
+b(x)g(Square)f Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262 1608
+y Fl(Example)p 262 1622 182 2 v 262 1711 a Fs(])p Ft(Di\013A)o(ttac)o
+(ks\(col,sq\))262 1811 y Fl(Descripti)o(on)p 262 1826 241 2
+v 321 1912 a Fp(Returns)c(:)k Fh(])p Fp(A)o(ttac)o(ks\([An)o(y],col,sq\))13
+b Ff(\000)p Fh(])p Fp(A)o(ttac)o(ks\([An)o(y],Opp\(col\),sq\))946
+2574 y(180)p eop
+%%Page: 181 183
+181 182 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(Distance)17 b(:)25 b(Square)18 b(x)g(Square)h Ft(=)-8 b Fa(\))18
+b Fu(In)n(teger)262 556 y Fl(Example)p 262 571 182 2 v 262
+660 a Ft(Distance\(sq1,sq2\))262 759 y Fl(Descripti)o(on)p
+262 774 241 2 v 321 860 a Fp(Returns)c(:)380 910 y(max\()p
+Ff(j)d Fp(OnRank\(white,)p Fm(sq1)p Fp(\))j(-)g(OnRank\(white,)p
+Fm(sq2)p Fp(\))g Ff(j)f Fp(,)g Ff(j)h Fp(OnFile\()p Fm(sq1)p
+Fp(\))g(-)g(OnFile\()p Fm(sq2)p Fp(\))g Ff(j)f Fp(\))262 1259
+y Fu(FUNCTION)p 262 1266 309 2 v 262 1359 a(Doubled)18 b(:)24
+b(Colour)19 b(x)f(File)g Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262
+1458 y Fl(Example)p 262 1473 182 2 v 262 1562 a Ft(Doubled\(col,f)s(\))262
+1661 y Fl(Descripti)o(on)p 262 1676 241 2 v 321 1762 a Fp(Returns)c(TR)o(UE)g
+(if)f(more)g(than)h(one)g(pa)o(wn)f(of)h(colour)f Fm(c)n(ol)h
+Fp(is)g(on)f(\014le)h Fm(f)p Fp(.)321 1812 y(Otherwise)h(F)-5
+b(ALSE.)946 2574 y(181)p eop
+%%Page: 182 184
+182 183 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(Escap)r(e)17 b(:)25 b(Colour)19 b(x)f(Square)g(x)g(Square)h
+Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262
+571 182 2 v 262 660 a Ft(Escap)q(e\(col,sq1,sq2\))262 759 y
+Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g(if)f
+(the)h(king)g(of)f(colour)g Fm(c)n(ol)h Fp(can)g(escap)q(e)i(a)d(c)o(hec)o(k)
+i(from)d(square)j Fm(sq2)321 910 y Fp(b)o(y)e(a)h(piece)h(mo)o(v)o(ed)d(from)
+g(square)j Fm(sq1)p Fp(.)262 1259 y Fu(FUNCTION)p 262 1266
+309 2 v 262 1359 a(Has)j(:)25 b(PieceList)17 b(x)h(Colour)h
+Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262 1458 y Fl(Example)p
+262 1473 182 2 v 262 1562 a Ft(Has\(pl,col\))262 1661 y Fl(Descripti)o(on)p
+262 1676 241 2 v 321 1762 a Fp(Returns)c(the)h(n)o(um)o(b)q(er)e(of)g(pieces)
+i(in)f(piecelist)g Fm(pl)g Fp(of)f(colour)h Fm(c)n(ol)f Fp(whic)o(h)h(are)g
+(still)321 1812 y(on)f(the)i(b)q(oard.)946 2574 y(182)p eop
+%%Page: 183 185
+183 184 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(InsideQuadrate)18 b(:)24 b(Colour)19 b(x)f(Square)g Ft(=)-8
+b Fa(\))19 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 571 182
+2 v 262 660 a Ft(InsideQuadrate\(col,sq\))262 759 y Fl(Descripti)o(on)p
+262 774 241 2 v 321 860 a Fp(Returns)14 b(TR)o(UE)g(if)f(the)h(king)g(of)f
+(colour)g Fm(c)n(ol)h Fp(is)g(inside)g(the)g("queening)g(square")g(or)321
+910 y("quadrate")f(with)h(resp)q(ect)i(to)e(square)g Fm(sq)p
+Fp(,)g(taking)f(in)o(to)g(accoun)o(t)h(who)g(has)g(the)321
+960 y(\014rst)g(mo)o(v)o(e.)262 1309 y Fu(FUNCTION)p 262 1316
+309 2 v 262 1408 a(Isolated)j(:)25 b(Colour)19 b(x)f(File)g
+Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 1508 y Fl(Example)p
+262 1523 182 2 v 262 1612 a Ft(Isolated\(col,f)s(\))262 1711
+y Fl(Descripti)o(on)p 262 1726 241 2 v 321 1812 a Fp(Returns)c(TR)o(UE)g(if)f
+(there)i(do)q(es)g(not)f(exist)g(a)f(pa)o(wn)h(of)f(colour)h
+Fm(c)n(ol)g Fp(on)f(either)i(\014le)321 1862 y(adjacen)o(t)f(to)f(\014le)h
+Fm(f)p Fp(.)321 1912 y(Otherwise)h(F)-5 b(ALSE.)946 2574 y(183)p
+eop
+%%Page: 184 186
+184 185 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(K)n(CRigh)n(ts)19 b(:)24 b(Colour)19 b Ft(=)-8 b Fa(\))18
+b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 571 182 2 v 262
+660 a Ft(K)o(CRigh)o(ts\(col\))262 759 y Fl(Descripti)o(on)p
+262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g(if)f(king)g(side)h(castling)
+g(righ)o(ts)g(for)f(colour)h Fm(c)n(ol)f Fp(are)i(in)o(tact.)321
+910 y(Otherwise)g(F)-5 b(ALSE.)262 1259 y Fu(FUNCTION)p 262
+1266 309 2 v 262 1359 a(KingDistance)17 b(:)25 b(Square)18
+b(x)g(Square)g Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262 1458
+y Fl(Example)p 262 1473 182 2 v 262 1562 a Ft(KingDistance\(sq1,sq2\))262
+1661 y Fl(Descripti)o(on)p 262 1676 241 2 v 321 1762 a Fp(Returns)c(:)380
+1812 y(min\()p Ff(j)d Fp(OnRank\(white,)p Fm(sq1)p Fp(\))j(-)g
+(OnRank\(white,)p Fm(sq2)p Fp(\))f Ff(j)h Fp(,)f Ff(j)h Fp(OnFile\()p
+Fm(sq1)p Fp(\))g(-)g(OnFile\()p Fm(sq2)p Fp(\))g Ff(j)f Fp(\))946
+2574 y(184)p eop
+%%Page: 185 187
+185 186 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(KingSq)18 b(:)24 b(Colour)19 b Ft(=)-8 b Fa(\))18 b Fu(square)262
+556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(KingSq\(col\))262
+759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h
+(square)f(the)h(king)e(of)g(colour)h Fm(c)n(ol)g Fp(is)f(curren)o(tly)i(on.)
+262 1209 y Fu(FUNCTION)p 262 1216 309 2 v 262 1309 a(Lev)n(erSq)i(:)24
+b(File)18 b(x)g(Colour)h Ft(=)-8 b Fa(\))18 b Fu(Square)262
+1408 y Fl(Example)p 262 1423 182 2 v 262 1512 a Ft(Lev)o(erSq\(f,col\))262
+1612 y Fl(Descripti)o(on)p 262 1626 241 2 v 321 1713 a Fp(Returns)c(the)h
+(\014rst)f(square)h(where)g(a)f(pa)o(wn)f(of)h(colour)f Fm(c)n(ol)h
+Fp(on)g(\014le)f Fm(f)h Fp(w)o(ould)f(lev)o(er)h(an)g(enem)o(y)321
+1762 y(pa)o(wn)f(on)h(an)f(adjacen)o(t)h(\014le.)946 2574 y(185)p
+eop
+%%Page: 186 188
+186 187 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a Fs(])p Fu(Mo)n(v)n(es)18 b(:)25 b(Piece)18 b(x)g(Colour)h(x)f(Square)g
+Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262 556 y Fl(Example)p 262
+571 182 2 v 262 660 a Fs(])p Ft(Mo)o(v)o(es\(p)q(c,col,sq\))262
+759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h(n)o
+(um)o(b)q(er)e(of)g(mo)o(v)o(es)g(p)q(ossible)h(b)o(y)g(piece)g
+Fm(p)n(c)g Fp(of)g(colour)f Fm(c)n(ol)h Fp(from)e(square)j
+Fm(sq)p Fp(.)262 1209 y Fu(FUNCTION)p 262 1216 309 2 v 262
+1309 a(Occupied)j(:)24 b(Square)18 b(x)h(Square)f Ft(=)-8 b
+Fa(\))18 b Fu(In)n(teger)262 1408 y Fl(Example)p 262 1423 182
+2 v 262 1512 a Ft(Occupied\(sq1,sq2\))262 1612 y Fl(Descripti)o(on)p
+262 1626 241 2 v 321 1713 a Fp(Returns)c(the)h(n)o(um)o(b)q(er)e(of)g
+(squares)i(whic)o(h)f(are)g(o)q(ccupied)h(b)q(et)o(w)o(een)g(square)g
+Fm(sq1)f Fp(and)321 1762 y Fm(sq2)g Fp(inclusiv)o(e)f(in)h(one)g(linear)f
+(direction.)946 2574 y(186)p eop
+%%Page: 187 189
+187 188 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(Occup)n(y)18 b(:)25 b(PieceList)17 b(x)h(Colour)h(x)f(Square)g
+Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262
+571 182 2 v 262 660 a Ft(Occup)o(y\(pl,col,sq\))262 759 y Fl(Descripti)o(on)p
+262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g(if)f(one)h(of)f(the)i
+(pieces)g(in)e(piecelist)i Fm(pl)e Fp(of)h(colour)f Fm(c)n(ol)h
+Fp(is)g(on)f(square)i Fm(sq)p Fp(.)321 910 y(Otherwise)g(F)-5
+b(ALSE.)262 1259 y Fu(FUNCTION)p 262 1266 309 2 v 262 1359
+a(On)18 b(:)25 b(Square)18 b Ft(=)-8 b Fa(\))18 b Fu(Piece)262
+1458 y Fl(Example)p 262 1473 182 2 v 262 1562 a Ft(On\(sq\))262
+1661 y Fl(Descripti)o(on)p 262 1676 241 2 v 321 1762 a Fp(Returns)c(the)h
+(piece)g(t)o(yp)q(e)f(o)q(ccup)o(ying)g(square)h Fm(sq)e Fp(regardless)j(of)d
+(colour.)946 2574 y(187)p eop
+%%Page: 188 190
+188 189 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(OnFile)17 b(:)25 b(Square)18 b Ft(=)-8 b Fa(\))18 b Fu(File)262
+556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(OnFile\(sq\))262
+759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h
+(\014le)f(of)f(square)i Fm(sq)p Fp(.)262 1209 y Fu(FUNCTION)p
+262 1216 309 2 v 262 1309 a(OnRank)j(:)25 b(Colour)18 b(x)h(Square)f
+Ft(=)-8 b Fa(\))18 b Fu(Rank)262 1408 y Fl(Example)p 262 1423
+182 2 v 262 1512 a Ft(OnRank\(col,sq\))262 1612 y Fl(Descripti)o(on)p
+262 1626 241 2 v 321 1713 a Fp(Returns)c(the)h(rank)f(of)f(square)i
+Fm(sq)e Fp(with)h(resp)q(ect)i(to)e(colour)g Fm(c)n(ol)p Fp(.)946
+2574 y(188)p eop
+%%Page: 189 191
+189 190 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(OnWing)18 b(:)24 b(Flank)19 b(x)f(Square)g Ft(=)-8 b Fa(\))19
+b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 571 182 2 v 262
+660 a Ft(OnWing\(\015k,sq\))262 759 y Fl(Descripti)o(on)p 262
+774 241 2 v 321 860 a Fp(Returns)14 b(TR)o(UE)g(if)f(square)i
+Fm(sq)f Fp(is)f(on)h(\015ank)g Fm(\015k)p Fp(.)321 910 y(Otherwise)h(F)-5
+b(ALSE.)262 1259 y Fu(FUNCTION)p 262 1266 309 2 v 262 1359
+a(Op)r(en)18 b(:)24 b(File)18 b Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262
+1458 y Fl(Example)p 262 1473 182 2 v 262 1562 a Ft(Op)q(en\(f)s(\))262
+1661 y Fl(Descripti)o(on)p 262 1676 241 2 v 321 1762 a Fp(Returns)c(TR)o(UE)g
+(if)f(\014le)h Fm(f)f Fp(has)h(no)g(pa)o(wns)g(of)f(an)o(y)h(colour)f(on)h
+(it.)321 1812 y(Otherwise)h(F)-5 b(ALSE.)946 2574 y(189)p eop
+%%Page: 190 192
+190 191 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(Opp)19 b(:)24 b(Colour)19 b Ft(=)-8 b Fa(\))18 b Fu(Colour)262
+556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(Opp\(col\))262
+759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h(opp)q
+(osite)f(colour)g(of)f(colour)h Fm(c)n(ol)p Fp(.)262 1209 y
+Fu(FUNCTION)p 262 1216 309 2 v 262 1309 a(Opp)r(ositeFlanks)j(:)24
+b Ft(=)-8 b Fa(\))19 b Fu(Bo)r(olean)262 1408 y Fl(Example)p
+262 1423 182 2 v 262 1509 a Ft(Opp)q(ositeFlanks)262 1609 y
+Fl(Descripti)o(on)p 262 1624 241 2 v 321 1710 a Fp(Returns)14
+b(:)380 1760 y(\(\(OnFile\(KingSq\(White\)\))g Ff(\024)g Fp(3)f
+Fl(and)h Fp(OnFile\(KingSq\(Blac)o(k\)\))f Ff(\025)i Fp(5\))e
+Fl(or)380 1810 y Fp(\(OnFile\(KingSq\(Blac)o(k\)\))h Ff(\024)g
+Fp(3)f Fl(and)g Fp(OnFile\(KingSq\(White\)\))h Ff(\025)g Fp(5\)\))946
+2574 y(190)p eop
+%%Page: 191 193
+191 192 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(PSq)18 b(:)25 b(Colour)18 b(x)h(Square)f Ft(=)-8 b Fa(\))18
+b Fu(Square)262 556 y Fl(Example)p 262 571 182 2 v 262 660
+a Ft(PSq\(col,sq\))262 759 y Fl(Descripti)o(on)p 262 774 241
+2 v 321 860 a Fp(Returns)c(the)h(promotion)d(square)i(for)g(a)f(pa)o(wn)h(on)
+g(square)g Fm(sq)g Fp(of)f(colour)h Fm(c)n(ol)p Fp(.)262 1209
+y Fu(FUNCTION)p 262 1216 309 2 v 262 1309 a(P)n(assed)19 b(:)25
+b(Colour)18 b(x)h(Square)f Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262
+1408 y Fl(Example)p 262 1423 182 2 v 262 1512 a Ft(P)o(assed\(col,sq\))262
+1612 y Fl(Descripti)o(on)p 262 1626 241 2 v 321 1713 a Fp(Returns)c(TR)o(UE)g
+(if)f(there)i(do)q(es)g(not)f(exist)g(an)f(enem)o(y)h(pa)o(wn)f(on)h(the)g
+(same)f(or)h(adjacen)o(t)321 1762 y(\014le,)f(whic)o(h)h(can)g(hinder)g(the)h
+(pa)o(wns)f(adv)n(ance)f(to)h(the)h(promotion)c(square.)946
+2574 y(191)p eop
+%%Page: 192 194
+192 193 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(P)n(a)n(wnHole)19 b(:)25 b(Colour)18 b(x)h(Square)f Ft(=)-8
+b Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 571 182
+2 v 262 660 a Ft(P)o(a)o(wnHole\(col,sq\))262 759 y Fl(Descripti)o(on)p
+262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g(if)f(square)i
+Fm(sq)f Fp(cannot)g(ev)o(er)g(b)q(e)h(attac)o(k)o(ed)f(b)o(y)g(pa)o(wns)g(of)
+f(colour)h Fm(c)n(ol)p Fp(.)321 910 y(Otherwise)h(F)-5 b(ALSE.)262
+1259 y Fu(FUNCTION)p 262 1266 309 2 v 262 1359 a(P)n(a)n(wnLev)n(er)19
+b(:)24 b(File)18 b(x)g(Colour)h Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262
+1458 y Fl(Example)p 262 1473 182 2 v 262 1562 a Ft(P)o(a)o(wnLev)o
+(er\(f,col\))262 1661 y Fl(Descripti)o(on)p 262 1676 241 2
+v 321 1762 a Fp(Returns)c(TR)o(UE)g(if)f(a)h(pa)o(wn)f(of)g(colour)h
+Fm(c)n(ol)g Fp(can)g(b)q(e)g(a)g(pa)o(wn)f(lev)o(er)i(on)e(\014le)h
+Fm(f)g Fp(and)321 1812 y(incur)g(no)f(enem)o(y)h(pa)o(wn)f(blo)q(c)o(k)n(ade)
+h(b)q(efore)g(the)h(pa)o(wn)e(lev)o(erage)i(square.)321 1862
+y(Otherwise)g(F)-5 b(ALSE.)946 2574 y(192)p eop
+%%Page: 193 195
+193 194 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a Fs(])p Fu(P)n(a)n(wns)20 b(:)25 b Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262
+556 y Fl(Example)p 262 571 182 2 v 262 657 a Fs(])p Ft(P)o(a)o(wns)262
+757 y Fl(Descripti)o(on)p 262 772 241 2 v 321 858 a Fp(Returns)c(the)h(n)o
+(um)o(b)q(er)e(of)g(pa)o(wns)h(curren)o(tly)h(on)f(the)g(b)q(oard.)262
+1207 y Fu(FUNCTION)p 262 1214 309 2 v 262 1306 a(Pin)k(:)25
+b(Colour)18 b(x)h(Square)f(x)g(Square)g(x)h(Square)f Ft(=)-8
+b Fa(\))18 b Fu(Bo)r(olean)262 1406 y Fl(Example)p 262 1421
+182 2 v 262 1509 a Ft(Pin\(col,sq1,sq2,sq3\))262 1609 y Fl(Descripti)o(on)p
+262 1624 241 2 v 321 1710 a Fp(Returns)c(TR)o(UE)g(if)f(a)h(piece)g(of)g
+(colour)f Fm(c)n(ol)h Fp(on)g(square)g Fm(sq1)g Fp(pins)g(a)g(piece)h(of)321
+1760 y(colour)e(OPP\(col\))i(on)f(square)g Fm(sq2)g Fp(against)g(a)f(piece)i
+(also)e(of)g(colour)h(Opp\(col\))321 1810 y(on)f(square)i Fm(sq3)p
+Fp(.)380 1860 y(where)131 b(On\(sq1\))14 b Ff(2)g Fp([Bishop,Ro)q(ok,Queen])e
+Fl(and)616 1909 y Fp(On\(sq2\))i Ff(2)g Fp([Knigh)o(t,Bishop,Ro)q(ok,Queen])e
+Fl(and)616 1959 y Fp(On\(sq3\))i Ff(2)g Fp([Knigh)o(t,Bishop,Ro)q
+(ok,Queen,King].)946 2574 y(193)p eop
+%%Page: 194 196
+194 195 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(P)n(oten)n(tialChec)n(k)18 b(:)25 b(Colour)18 b(x)h(Square)f(x)g(Square)g
+Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262
+571 182 2 v 262 660 a Ft(P)o(oten)o(tialChec)o(k\(col,sq1,sq2\))262
+759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g
+(if)f(a)h(piece)g(of)g(colour)f Fm(c)n(ol)h Fp(on)g(square)g
+Fm(sq1)g Fp(can)g(mo)o(v)o(e)f(to)g(square)i Fm(sq2)321 910
+y Fp(and)e(giv)o(e)h(c)o(hec)o(k.)262 1259 y Fu(FUNCTION)p
+262 1266 309 2 v 262 1359 a(QCRigh)n(ts)19 b(:)24 b(Colour)19
+b Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 1458 y Fl(Example)p
+262 1473 182 2 v 262 1562 a Ft(QCRigh)o(ts\(col\))262 1661
+y Fl(Descripti)o(on)p 262 1676 241 2 v 321 1762 a Fp(Returns)c(TR)o(UE)g(if)f
+(queen)i(side)f(castling)f(righ)o(ts)h(for)g(colour)f Fm(c)n(ol)h
+Fp(are)g(in)o(tact.)321 1812 y(Otherwise)h(F)-5 b(ALSE.)946
+2574 y(194)p eop
+%%Page: 195 197
+195 196 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a Fs(])p Fu(SafeBlo)r(c)n(ks)17 b(:)25 b(Colour)19 b(x)f(Square)g(x)g(Square)
+g Ft(=)-8 b Fa(\))19 b Fu(In)n(teger)262 556 y Fl(Example)p
+262 571 182 2 v 262 660 a Fs(])p Ft(SafeBlo)q(c)o(ks\(col,sq1,sq2\))262
+759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)14
+b(the)h(sum)e(of)g(:)380 910 y Fh(])p Fp(Di\013A)o(ttac)o(ks\(col,)p
+Fh(sq)719 916 y Fe(n)741 910 y Fp(\))321 960 y(if)g(and)g(only)g(if)g(\()p
+Fh(])p Fp(Di\013A)o(ttac)o(ks\(col,)p Fh(sq)923 966 y Fe(n)946
+960 y Fp(\))h Fh(>)g Fp(1\))g(and)f(where)i Fh(sq)1311 966
+y Fe(n)1348 960 y Fp(is)f(ev)o(ery)g(square)321 1010 y(on)f(a)h(piece)h(mo)o
+(v)o(emen)o(t)c(direction)j(b)q(et)o(w)o(een)h Fm(sq1)f Fp(and)g
+Fm(sq2)g Fp(inclusiv)o(e.)262 1359 y Fu(FUNCTION)p 262 1366
+309 2 v 262 1458 a(SameDiagonal)j(:)24 b(Square)18 b(x)h(Square)f
+Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 1558 y Fl(Example)p
+262 1573 182 2 v 262 1661 a Ft(SameDiagonal\(sq1,sq2\))262
+1761 y Fl(Descripti)o(on)p 262 1776 241 2 v 321 1862 a Fp(Returns)c(TR)o(UE)g
+(if)f(squares)i Fm(sq1)f Fp(and)g Fm(sq2)g Fp(are)g(on)g(the)g(same)f
+(diagonal.)321 1912 y(Otherwise)i(F)-5 b(ALSE.)946 2574 y(195)p
+eop
+%%Page: 196 198
+196 197 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(SemiOp)r(en)16 b(:)24 b(Colour)19 b(x)f(File)g Ft(=)-8 b
+Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 571 182
+2 v 262 660 a Ft(SemiOp)q(en\(col,f)s(\))262 759 y Fl(Descripti)o(on)p
+262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g(if)f(there)i(are)f(no)g(pa)o
+(wns)g(of)f(colour)h Fm(c)n(ol)g Fp(on)f(\014le)h Fm(f)p Fp(.)321
+910 y(Otherwise)h(F)-5 b(ALSE.)262 1259 y Fu(FUNCTION)p 262
+1266 309 2 v 262 1359 a(Side)18 b(:)24 b(Square)18 b Ft(=)-8
+b Fa(\))18 b Fu(Colour)262 1458 y Fl(Example)p 262 1473 182
+2 v 262 1562 a Ft(Side\(sq\))262 1661 y Fl(Descripti)o(on)p
+262 1676 241 2 v 321 1762 a Fp(Returns)c(the)h(colour)e(whose)i(territory)f
+(square)h Fm(sq)f Fp(is)g(in.)321 1812 y(Where)g(eac)o(h)h(colour's)e
+(territory)i(is)f(de\014ned)h(to)e(b)q(e)i(within)e(its)h(\014rst)g(4)g
+(ranks.)946 2574 y(196)p eop
+%%Page: 197 199
+197 198 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(SqColour)18 b(:)24 b(Square)19 b Ft(=)-8 b Fa(\))18 b Fu(Colour)262
+556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(SqColour\(sq\))262
+759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h
+(colour)e(of)h(the)g(square)h Fm(sq)p Fp(.)262 1209 y Fu(FUNCTION)p
+262 1216 309 2 v 262 1309 a(T)-5 b(axicab)18 b(:)25 b(Square)18
+b(x)g(Square)g Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262 1408
+y Fl(Example)p 262 1423 182 2 v 262 1512 a Ft(T)l(axicab\(sq1,sq2\))262
+1612 y Fl(Descripti)o(on)p 262 1626 241 2 v 321 1713 a Fp(Returns)c(:)321
+1762 y(\()p Ff(j)f Fp(OnRank\(white,)p Fm(sq1)p Fp(\))h(-)f(OnRank\(white,)p
+Fm(sq2)p Fp(\))h Ff(j)g Fp(+)g Ff(j)f Fp(OnFile\()p Fm(sq1)p
+Fp(\))h(-)g(OnFile\()p Fm(sq2)p Fp(\))g Ff(j)p Fp(\))946 2574
+y(197)p eop
+%%Page: 198 200
+198 199 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(T)-5 b(rapp)r(ed)18 b(:)25 b(Colour)18 b(x)h(Square)f Ft(=)-8
+b Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 571 182
+2 v 262 660 a Ft(T)l(rapp)q(ed\(col,sq\))262 759 y Fl(Descripti)o(on)p
+262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g(if)f(ev)o(ery)i(square,)f
+Fm(sq2)p Fp(,)f(a)h(piece)h(on)e(square)i Fm(sq)f Fp(can)g(mo)o(v)o(e)e(to,)i
+(meets)f(the)321 910 y(follo)o(wing)e(condition)i(:)380 960
+y(Con)o(trol\(sq2\))g(=)h(Opp\(col\))321 1010 y(Otherwise)h(F)-5
+b(ALSE.)262 1359 y Fu(FUNCTION)p 262 1366 309 2 v 262 1458
+a Fs(])p Fu(UnMo)n(v)n(ed)19 b(:)24 b(Colour)19 b(x)f(Piece)g
+Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262 1558 y Fl(Example)p
+262 1573 182 2 v 262 1661 a Fs(])p Ft(UnMo)o(v)o(ed\(col,p)q(c\))262
+1761 y Fl(Descripti)o(on)p 262 1776 241 2 v 321 1862 a Fp(Returns)c(the)h(n)o
+(um)o(b)q(er)e(of)g(pieces)i(of)f(colour)f Fm(c)n(ol)h Fp(and)g(t)o(yp)q(e)g
+Fm(p)n(c)g Fp(whic)o(h)g(ha)o(v)o(e)g(nev)o(er)g(mo)o(v)o(ed.)946
+2574 y(198)p eop
+%%Page: 199 201
+199 200 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(V)-5 b(alue)18 b(:)25 b(Square)18 b Ft(=)-8 b Fa(\))18 b
+Fu(In)n(teger)262 556 y Fl(Example)p 262 571 182 2 v 262 660
+a Ft(V)l(alue\(sq\))262 759 y Fl(Descripti)o(on)p 262 774 241
+2 v 321 860 a Fp(Returns)c(a)g(v)n(alue)f(for)h(the)g(piece)h(on)f(square)g
+Fm(sq)g Fp(regardless)h(of)f(colour.)321 910 y(De\014ned)g(b)o(y)g(:)380
+960 y(P)o(a)o(wn)77 b(=)14 b(1)380 1010 y(Knigh)o(t)51 b(=)14
+b(3)380 1060 y(Bishop)53 b(=)14 b(3)380 1110 y(Ro)q(ok)81 b(=)14
+b(5)380 1159 y(Queen)63 b(=)14 b(9)380 1209 y(King)89 b(=)14
+b(14)262 1508 y Fu(FUNCTION)p 262 1515 309 2 v 262 1608 a(W)-5
+b(eak)18 b(:)24 b(Colour)19 b(x)f(Square)h Ft(=)-8 b Fa(\))18
+b Fu(Bo)r(olean)262 1707 y Fl(Example)p 262 1722 182 2 v 262
+1811 a Ft(W)l(eak\(col,sq\))262 1910 y Fl(Descripti)o(on)p
+262 1925 241 2 v 321 2012 a Fp(Returns)c(:)380 2061 y Fl(not)e
+Fp(\()79 b(A)o(ttac)o(k)o(ed\([P)o(a)o(wn],col,sq\))12 b Fl(or)557
+2111 y Fp(A)o(ttac)o(k)o(ed\([P)o(a)o(wn],col,)p Fh(sq)972
+2117 y Fe(inf)s(r)q(ont)1090 2111 y Fp(\))i Fl(or)557 2161
+y Fp(A)o(ttac)o(k)o(ed\([P)o(a)o(wn],col,)p Fh(sq)972 2167
+y Fe(behind)1072 2161 y Fp(\))f(\).)946 2574 y(199)p eop
+%%Page: 200 202
+200 201 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457
+a(Wing)18 b(:)24 b(Square)19 b Ft(=)-8 b Fa(\))18 b Fu(Flank)262
+556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(Wing\(sq\))262
+759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h
+(\015ank)e(the)i(square)g Fm(sq)e Fp(is)h(on.)946 2574 y(200)p
+eop
+%%Page: 201 203
+201 202 bop 324 307 a Fp(Pre{De\014ned)15 b(t)o(yp)q(es)g(are)f(as)g(follo)o
+(ws)e(:)321 475 y(Bo)q(olean)90 b(:)18 b(TR)o(UE)13 b Ff(j)h
+Fp(F)-5 b(ALSE)321 525 y(Colour)113 b(:)18 b(White)13 b Ff(j)h
+Fp(Blac)o(k)321 575 y(Con)o(troller)52 b(:)18 b(White)13 b
+Ff(j)h Fp(Blac)o(k)g Ff(j)f Fp(None)321 625 y(File)167 b(:)18
+b(Cardinal)13 b(Range)g(1)h(to)f(8)321 675 y(Flank)131 b(:)18
+b(QueenSide)d Ff(j)e Fp(KingSide)321 725 y(In)o(teger)110 b(:)18
+b(In)o(teger)d(Range)321 774 y(Piece)142 b(:)18 b(P)o(a)o(wn)13
+b Ff(j)h Fp(Knigh)o(t)f Ff(j)h Fp(Bishop)g Ff(j)f Fp(Ro)q(ok)g
+Ff(j)g Fp(Queen)i Ff(j)f Fp(King)f Ff(j)h Fp(An)o(y)321 824
+y(PieceList)72 b(:)18 b(Set)c(of)g(Piece)321 874 y(Rank)139
+b(:)18 b(Cardinal)13 b(Range)g(1)h(to)f(8)321 924 y(Square)113
+b(:)18 b(Cardinal)13 b(Range)g(1)h(to)f(64)321 1023 y(Note:)18
+b(An)o(y)c(is)g(a)f('wild)g(card')h(piece.)946 2574 y(201)p
+eop
+%%Page: 202 204
+202 203 bop 262 654 a Fn(App)s(endix)33 b(C)262 897 y Fo(Time)40
+b(Allo)s(catio)q(n)i(Graphs)262 1148 y Fp(This)13 b(app)q(endix)g(con)o
+(tains)g(the)g(time)f(allo)q(cation)g(graphs)h(for)g(Kasparo)o(v)g(and)g
+(Karp)q(o)o(v)g(in)262 1198 y(their)h(1986)f(w)o(orld)g(c)o(hampionship)f
+(matc)o(h.)946 2574 y(202)p eop
+%%Page: 203 205
+203 204 bop 526 2156 a Fp(Figure)14 b(C.1:)j(Time)c(Allo)q(cation,)f(Kasparo)
+o(v)i(as)g(White.)946 2574 y(203)p eop
+%%Page: 204 206
+204 205 bop 532 2156 a Fp(Figure)14 b(C.2:)j(Time)12 b(Allo)q(cation,)g
+(Kasparo)o(v)i(as)g(Blac)o(k.)946 2574 y(204)p eop
+%%Page: 205 207
+205 206 bop 544 2156 a Fp(Figure)14 b(C.3:)j(Time)c(Allo)q(cation,)f(Karp)q
+(o)o(v)i(as)g(White.)946 2574 y(205)p eop
+%%Page: 206 208
+206 207 bop 550 2156 a Fp(Figure)14 b(C.4:)j(Time)12 b(Allo)q(cation,)g(Karp)
+q(o)o(v)i(as)g(Blac)o(k.)946 2574 y(206)p eop
+%%Page: 207 209
+207 208 bop 401 2156 a Fp(Figure)14 b(C.5:)j(Time)c(Allo)q(cation,)f(Kasparo)
+o(v)i(and)f(Karp)q(o)o(v)h(Com)o(bined.)946 2574 y(207)p eop
+%%Page: 208 210
+208 209 bop 262 654 a Fn(App)s(endix)33 b(D)262 897 y Fo(Bratk)m(o-Kop)s(ec)
+40 b(T)-10 b(est)262 1021 y(P)m(ositions)946 2574 y Fp(208)p
+eop
+%%Page: 209 211
+209 210 bop 641 301 673 5 v 641 965 5 665 v 646 384 a Fg(0j0s0Z0Z)646
+467 y(opZbZRZ0)646 550 y(0Z0l0Zpo)646 633 y(Z0Z0o0Z0)646 716
+y(0ZBZ0Z0Z)646 799 y(Z0Z0L0Z0)646 882 y(POPZ0A0Z)646 965 y(Z0J0Z0Z0)p
+1310 965 V 641 969 673 5 v 423 1087 a Fp(T)m(est)15 b(1)e(\(T\):)h
+Fm(A)o(ndersson)h(v)g(Knuttson)p Fp(,)f(Blac)o(k)g(to)g(Pla)o(y)m(,)e
+Fl(...)22 b(Qd1+)p Fp(.)p 641 1450 V 641 2114 5 665 v 646 1533
+a Fg(0Z0s0j0Z)646 1616 y(Z0Z0mpo0)646 1699 y(0ops0Z0o)646 1782
+y(o0Z0Z0ZP)646 1865 y(PZ0OPOPZ)646 1948 y(ZNS0Z0Z0)646 2031
+y(0Z0Z0J0Z)646 2114 y(Z0S0Z0Z0)p 1310 2114 V 641 2118 673 5
+v 467 2237 a Fp(T)m(est)14 b(2)g(\(L\):)f Fm(Bo)n(golyub)n(ow)j(v)f
+(Spielmann)p Fp(,)f(White)f(to)h(Pla)o(y)m(,)e Fl(d5)p Fp(.)946
+2574 y(209)p eop
+%%Page: 210 212
+210 211 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0ZqZrs0j)646
+482 y(Z0Zbanmp)646 565 y(pZ0o0opZ)646 648 y(Z0oPo0Z0)646 731
+y(PoPZPZPZ)646 814 y(ZPZ0ANMP)646 897 y(0ZBL0ORJ)646 980 y(Z0Z0Z0ZR)p
+1310 980 V 641 984 673 5 v 500 1102 a Fp(T)m(est)14 b(3)g(\(L\):)g
+Fm(Evans)h(v)g(R)n(ossolimo)p Fp(,)f(Blac)o(k)f(to)h(Pla)o(y)m(,)e
+Fl(...)22 b(f5)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548
+a Fg(rmblka0s)646 1631 y(o0Z0opop)646 1714 y(0o0Z0Z0Z)646 1797
+y(Z0opO0Z0)646 1880 y(0Z0M0Z0Z)646 1963 y(Z0O0Z0Z0)646 2046
+y(POPZQOPO)646 2129 y(S0A0JBZR)p 1310 2129 V 641 2133 673 5
+v 511 2252 a Fp(T)m(est)14 b(4)g(\(L\):)g Fm(Spielmann)h(v)g(Walter)p
+Fp(,)e(White)h(to)g(Pla)o(y)m(,)e Fl(e6)p Fp(.)946 2574 y(210)p
+eop
+%%Page: 211 213
+211 212 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rZbZ0skZ)646
+482 y(Z0l0a0op)646 565 y(pZ0opm0Z)646 648 y(ZpZ0Z0Z0)646 731
+y(0Z0LPZ0Z)646 814 y(ZBM0A0Z0)646 897 y(POPZ0ZPO)646 980 y(S0Z0ZRJ0)p
+1310 980 V 641 984 673 5 v 492 1102 a Fp(T)m(est)14 b(5)g(\(T\):)f
+Fm(R)n(o)n(golewicz)i(v)g(Jar)n(e)n(cz)p Fp(,)e(White)g(to)h(Pla)o(y)m(,)e
+Fl(Nd5)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(0ZrZ0ZkZ)646
+1631 y(opoRZpo0)646 1714 y(0Z0ZpZ0Z)646 1797 y(Z0Z0O0O0)646
+1880 y(0Z0Z0O0Z)646 1963 y(ZPZ0Z0J0)646 2046 y(PZPZ0Z0Z)646
+2129 y(Z0Z0Z0Z0)p 1310 2129 V 641 2133 673 5 v 552 2252 a Fp(T)m(est)i(6)g
+(\(L\):)f Fm(Pachman)j(D222)p Fp(,)f(White)e(to)h(Pla)o(y)m(,)e
+Fl(g6)p Fp(.)946 2574 y(211)p eop
+%%Page: 212 214
+212 213 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0mkZrZrZ)646
+482 y(opZ0m0op)646 565 y(0Z0ZpZ0Z)646 648 y(l0ZpOpZN)646 731
+y(bZpO0O0Z)646 814 y(A0O0ZRZ0)646 897 y(0ZPZBZPO)646 980 y(S0ZQZ0J0)p
+1310 980 V 641 984 673 5 v 524 1102 a Fp(T)m(est)14 b(7)g(\(T\):)f
+Fm(Golyak)j(v)e(Gaiduk)p Fp(,)g(White)g(to)g(Pla)o(y)m(,)e
+Fl(Nf6)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(0Z0ZbZ0Z)646
+1631 y(o0Z0jpZ0)646 1714 y(0Z0Z0ZpZ)646 1797 y(Z0ZpO0Zp)646
+1880 y(0ZpO0O0Z)646 1963 y(Z0Z0J0O0)646 2046 y(PZ0ZNZ0O)646
+2129 y(Z0Z0Z0Z0)p 1310 2129 V 641 2133 673 5 v 544 2252 a Fp(T)m(est)i(8)g
+(\(L\):)g Fm(A)o(lekhine)g(v)h(Y)m(ates)p Fp(,)e(White)h(to)g(Pla)o(y)m(,)e
+Fl(f5)p Fp(.)946 2574 y(212)p eop
+%%Page: 213 215
+213 214 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0Zks0ans)646
+482 y(oboqZ0Z0)646 565 y(0onZpo0Z)646 648 y(Z0ZpZ0Zp)646 731
+y(0Z0O0O0A)646 814 y(Z0M0ZNZQ)646 897 y(POPZ0ZPO)646 980 y(Z0JRZBZR)p
+1310 980 V 641 984 673 5 v 539 1102 a Fp(T)m(est)15 b(9)e(\(L\):)h
+Fm(Jansa)h(v)g(Ornstein)p Fp(,)e(White)h(to)g(Pla)o(y)m(,)e
+Fl(f5)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(0Z0srZkZ)646
+1631 y(opZ0Zpo0)646 1714 y(0lnZ0mpZ)646 1797 y(Z0Z0Z0Z0)646
+1880 y(0Z0o0Z0Z)646 1963 y(OPZRZPZ0)646 2046 y(0ZPZNLPO)646
+2129 y(S0A0Z0J0)p 1310 2129 V 641 2133 673 5 v 427 2252 a Fp(T)m(est)i(10)f
+(\(T\):)h Fm(Kab)n(adzjan)i(v)e(Cib)n(elasvili)p Fp(,)e(Blac)o(k)i(to)g(Pla)o
+(y)m(,)e Fl(...)22 b(Ne5)p Fp(.)946 2574 y(213)p eop
+%%Page: 214 216
+214 215 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0ZrZnskZ)646
+482 y(o0ZqZpop)646 565 y(bo0o0Z0Z)646 648 y(m0oPo0Z0)646 731
+y(PZPZPZ0Z)646 814 y(Z0OBA0M0)646 897 y(0Z0ZQOPO)646 980 y(S0Z0ZRJ0)p
+1310 980 V 641 984 673 5 v 552 1102 a Fp(T)m(est)15 b(11)e(\(L\):)h
+Fm(Byrne)h(v)g(Kotov)p Fp(,)e(White)h(to)g(Pla)o(y)m(,)e Fl(f4)p
+Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(rZ0ZrZkZ)646
+1631 y(oplbZpop)646 1714 y(0Z0Z0Z0Z)646 1797 y(Z0Z0o0MQ)646
+1880 y(0Z0Z0Z0Z)646 1963 y(Z0O0Z0Z0)646 2046 y(PO0Z0OPO)646
+2129 y(S0Z0S0J0)p 1310 2129 V 641 2133 673 5 v 523 2252 a Fp(T)m(est)i(12)g
+(\(T\):)f Fm(Pachman)j(D3)p Fp(,)e(Blac)o(k)g(to)g(Pla)o(y)m(,)e
+Fl(...)22 b(Bf5)p Fp(.)946 2574 y(214)p eop
+%%Page: 215 217
+215 216 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rZ0l0skZ)646
+482 y(Z0Z0apop)646 565 y(pZ0o0Z0Z)646 648 y(Z0oPZ0Z0)646 731
+y(0Z0oPZ0Z)646 814 y(Z0ZQZ0Z0)646 897 y(PO0A0OPO)646 980 y(S0Z0S0J0)p
+1310 980 V 641 984 673 5 v 483 1102 a Fp(T)m(est)14 b(13)g(\(L\):)f
+Fm(Pfei\013er)i(v)g(T)m(rifunovich)p Fp(,)e(White)g(to)h(Pla)o(y)m(,)e
+Fl(b4)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(rmbZ0s0j)646
+1631 y(opZ0o0Zp)646 1714 y(0Zpo0ZpZ)646 1797 y(l0ZPZpZ0)646
+1880 y(0Z0Z0Z0Z)646 1963 y(ZPa0ZNO0)646 2046 y(PA0ZPOBO)646
+2129 y(S0ZQZRJ0)p 1310 2129 V 641 2133 673 5 v 425 2252 a Fp(T)m(est)i(14)f
+(\(T\):)h Fm(R)n(ob)n(atsch)h(v)g(Jansa)p Fp(,)f(White)g(to)g(Pla)o(y)m(,)e
+Fl(Qd2)j(or)g(Qe1)p Fp(.)946 2574 y(215)p eop
+%%Page: 216 218
+216 217 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0ZrZ0ZkZ)646
+482 y(ZpZ0l0op)646 565 y(0ZbZps0Z)646 648 y(o0opZ0Z0)646 731
+y(0Z0Z0ZQZ)646 814 y(ZPZPO0S0)646 897 y(PZPM0ZPO)646 980 y(Z0Z0ZRJ0)p
+1310 980 V 641 984 673 5 v 464 1102 a Fp(T)m(est)15 b(15)e(\(T\):)g
+Fm(Fischer)i(v)g(Me)n(cking)p Fp(,)f(White)g(to)f(Pla)o(y)m(,)g
+Fl(Qxg7+)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(rZblka0s)646
+1631 y(Z0Z0mpo0)646 1714 y(pZpZ0Z0o)646 1797 y(ZpZpO0A0)646
+1880 y(0Z0Z0Z0Z)646 1963 y(ZBZ0Z0Z0)646 2046 y(POPM0OPO)646
+2129 y(S0ZQZRJ0)p 1310 2129 V 641 2133 673 5 v 448 2252 a Fp(T)m(est)h(16)f
+(\(T\):)h Fm(V)m(asilchuk)h(v)g(Bob)n(olovitch)p Fp(,)e(White)h(to)g(Pla)o(y)
+m(,)e Fl(Ne4)p Fp(.)946 2574 y(216)p eop
+%%Page: 217 219
+217 218 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rZ0l0skZ)646
+482 y(Zponapop)646 565 y(pZ0o0mbZ)646 648 y(Z0ZPo0Z0)646 731
+y(0ZPZPZPZ)646 814 y(Z0M0ZNZP)646 897 y(POBZQO0Z)646 980 y(S0A0ZRJ0)p
+1310 980 V 641 984 673 5 v 517 1102 a Fp(T)m(est)15 b(17)e(\(L\):)h
+Fm(Bisch)h(v)g(Kmo)n(ch)p Fp(,)e(Blac)o(k)h(to)g(Pla)o(y)m(,)e
+Fl(...)22 b(h5)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548
+a Fg(rZbl0skZ)646 1631 y(opZ0opap)646 1714 y(0Zno0ZpZ)646 1797
+y(Z0m0Z0Z0)646 1880 y(PZ0ZPO0Z)646 1963 y(M0O0ZNZ0)646 2046
+y(0OBZ0ZPO)646 2129 y(S0A0LRJ0)p 1310 2129 V 641 2133 673 5
+v 488 2252 a Fp(T)m(est)14 b(18)g(\(T\):)f Fm(Maric)i(v)g(Fischer)p
+Fp(,)e(Blac)o(k)h(to)g(Pla)o(y)m(,)e Fl(...)22 b(Nb3)p Fp(.)946
+2574 y(217)p eop
+%%Page: 218 220
+218 219 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0Z0srZ0Z)646
+482 y(Z0oqZ0ok)646 565 y(pZ0o0ono)646 648 y(Z0Z0Z0Z0)646 731
+y(0ZQAPO0Z)646 814 y(ZPZ0Z0Z0)646 897 y(PZ0Z0ZPO)646 980 y(Z0Z0SRJ0)p
+1310 980 V 641 984 673 5 v 500 1102 a Fp(T)m(est)14 b(19)f(\(T\):)h
+Fm(Euwe)h(v)g(Ker)n(es)p Fp(,)e(Blac)o(k)g(to)h(Pla)o(y)m(,)e
+Fl(...)22 b(Rxe4)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548
+a Fg(rZ0Z0j0Z)646 1631 y(obZ0apZr)646 1714 y(0o0lpZ0o)646 1797
+y(Z0ZpMpZ0)646 1880 y(0Z0O0O0Z)646 1963 y(Z0M0Z0O0)646 2046
+y(POPZQZ0O)646 2129 y(Z0JRS0Z0)p 1310 2129 V 641 2133 673 5
+v 559 2252 a Fp(T)m(est)14 b(20)f(\(L\):)h Fm(Euwe)h(v)g(Flohr)p
+Fp(,)e(White)g(to)h(Pla)o(y)m(,)e Fl(g4)p Fp(.)946 2574 y(218)p
+eop
+%%Page: 219 221
+219 220 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0Z0snZ0j)646
+482 y(opa0Zrop)646 565 y(0Zpoqo0Z)646 648 y(Z0Z0ZNZ0)646 731
+y(0ZPZPZ0Z)646 814 y(ZPZ0Z0ZQ)646 897 y(PA0Z0OPO)646 980 y(Z0ZRS0J0)p
+1310 980 V 641 984 673 5 v 454 1102 a Fp(T)m(est)14 b(21)g(\(T\):)f
+Fm(T)m(arr)n(asch)h(v)h(Blackburne)p Fp(,)f(White)g(to)g(Pla)o(y)m(,)e
+Fl(Nh6)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(0ZrZ0skZ)646
+1631 y(Zblnapo0)646 1714 y(0o0opm0o)646 1797 y(oPZ0Z0Z0)646
+1880 y(NZPZPZ0Z)646 1963 y(O0ZBZNZP)646 2046 y(0A0ZQOPZ)646
+2129 y(S0ZRZ0J0)p 1310 2129 V 641 2133 673 5 v 442 2252 a Fp(T)m(est)i(22)f
+(\(T\):)h Fm(Najdorf)g(v)h(R)n(eshevsky)p Fp(,)f(Blac)o(k)g(to)g(Pla)o(y)m(,)
+e Fl(...)22 b(Bxe4)p Fp(.)946 2574 y(219)p eop
+%%Page: 220 222
+220 221 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rZblkZ0s)646
+482 y(opZ0apop)646 565 y(0ZpZ0Z0Z)646 648 y(Z0ZpO0Z0)646 731
+y(PZ0L0O0Z)646 814 y(Z0M0A0Z0)646 897 y(0OPZ0ZPO)646 980 y(S0Z0ZRJ0)p
+1310 980 V 641 984 673 5 v 512 1102 a Fp(T)m(est)14 b(23)g(\(L\):)f
+Fm(Jansa)j(v)f(Kavalek)p Fp(,)e(Blac)o(k)h(to)g(Pla)o(y)m(,)e
+Fl(...)22 b(f6)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548
+a Fg(rZ0lnsnj)646 1631 y(o0ZbZ0a0)646 1714 y(0o0o0Zpo)646 1797
+y(Z0oPopZ0)646 1880 y(0OPZPZ0Z)646 1963 y(ORMBA0Z0)646 2046
+y(0Z0LNOPO)646 2129 y(Z0Z0ZRJ0)p 1310 2129 V 641 2133 673 5
+v 563 2252 a Fp(T)m(est)15 b(24)e(\(L\):)h Fm(Szab)n(o)h(v)g(Ivkov)p
+Fp(,)f(White)g(to)g(Pla)o(y)m(,)e Fl(f4)p Fp(.)946 2574 y(220)p
+eop
+%%Page: 221 223
+221 222 bop 262 654 a Fn(App)s(endix)33 b(E)262 897 y Fo(T)-10
+b(est)39 b(Games)h(Pla)m(y)m(ed)262 1148 y Fp(This)19 b(app)q(endix)h(con)o
+(tains)f(the)i(test)g(games)d(pla)o(y)o(ed)h(b)o(y)h(HIAR)o(CS)f(5.0.)35
+b(The)20 b(matc)o(h)262 1198 y(scores)15 b(w)o(ere)g(as)f(follo)o(ws:)p
+324 1416 977 2 v 323 1466 2 50 v 349 1451 a Fm(Players)p 724
+1466 V 267 w(1)p 795 1466 V 50 w(2)p 866 1466 V 50 w(3)p 937
+1466 V 50 w(4)p 1008 1466 V 50 w(5)p 1079 1466 V 53 w(6)p 1156
+1466 V 53 w(T)m(otal)p 1299 1466 V 324 1468 977 2 v 323 1518
+2 51 v 349 1503 a Fp(HIAR)o(CS)f(5.0)p 724 1518 V 174 w(1)p
+795 1518 V 50 w(1)p 866 1518 V 50 w(1)p 937 1518 V 50 w(1)p
+1008 1518 V 50 w(1)p 1079 1518 V 1110 1487 a Fk(1)p 1110 1494
+17 2 v 1110 1517 a(2)p 1156 1518 2 51 v 1205 1503 a Fp(5)1231
+1487 y Fk(1)p 1230 1494 17 2 v 1230 1517 a(2)p 1299 1518 2
+51 v 324 1520 977 2 v 323 1570 2 51 v 349 1555 a Fp(Mephisto)h(Exclusiv)o(e)p
+724 1570 V 50 w(0)p 795 1570 V 50 w(0)p 866 1570 V 50 w(0)p
+937 1570 V 50 w(0)p 1008 1570 V 50 w(0)p 1079 1570 V 1110 1538
+a Fk(1)p 1110 1545 17 2 v 1110 1569 a(2)p 1156 1570 2 51 v
+1220 1538 a(1)p 1220 1545 17 2 v 1220 1569 a(2)p 1299 1570
+2 51 v 324 1571 977 2 v 324 1790 589 2 v 323 1839 2 50 v 349
+1825 a Fm(Players)p 627 1839 V 169 w(1)p 698 1839 V 50 w(2)p
+769 1839 V 50 w(T)m(otal)p 912 1839 V 324 1841 589 2 v 323
+1891 2 50 v 349 1876 a Fp(HIAR)o(CS)f(5.0)p 627 1891 V 77 w(1)p
+698 1891 V 50 w(0)p 769 1891 V 86 w(1)p 912 1891 V 324 1893
+589 2 v 323 1942 2 50 v 349 1927 a(Mark)h(Uniac)o(k)o(e)p 627
+1942 V 50 w(0)p 698 1942 V 50 w(1)p 769 1942 V 86 w(1)p 912
+1942 V 324 1944 589 2 v 324 2163 826 2 v 323 2212 2 50 v 349
+2197 a Fm(Players)p 716 2212 V 261 w(1)p 792 2212 V 53 w(2)p
+863 2212 V 50 w(3)p 934 2212 V 50 w(4)p 1005 2212 V 50 w(T)m(otal)p
+1148 2212 V 324 2214 826 2 v 323 2264 2 51 v 349 2249 a Fp(HIAR)o(CS)f(5.0,)g
+(3)g(ply)p 716 2264 V 747 2233 a Fk(1)p 747 2240 17 2 v 747
+2263 a(2)p 792 2264 2 51 v 818 2249 a Fp(0)p 863 2264 V 50
+w(0)p 934 2264 V 50 w(1)p 1005 2264 V 73 w(1)1080 2233 y Fk(1)p
+1080 2240 17 2 v 1080 2263 a(2)p 1148 2264 2 51 v 324 2266
+826 2 v 323 2316 2 51 v 349 2301 a Fp(NOKNO)o(W,)h(6)f(ply)p
+716 2316 V 747 2284 a Fk(1)p 747 2291 17 2 v 747 2315 a(2)p
+792 2316 2 51 v 818 2301 a Fp(1)p 863 2316 V 50 w(1)p 934 2316
+V 50 w(0)p 1005 2316 V 73 w(2)1080 2284 y Fk(1)p 1080 2291
+17 2 v 1080 2315 a(2)p 1148 2316 2 51 v 324 2317 826 2 v 946
+2574 a Fp(221)p eop
+%%Page: 222 224
+222 223 bop 262 307 a Fr(E.1)69 b(HIAR)n(CS)22 b(5.0)i(v)n(ersus)f(Mephisto)g
+(Exclusiv)n(e)262 442 y Fu(E.1.1)55 b(Game)17 b(1)321 604 y
+Fp(White)77 b(:)18 b Fl(Mephisto)13 b(Exclusiv)o(e)321 654
+y Fp(Blac)o(k)88 b(:)18 b Fl(HIAR)o(CS)d(5.0)321 703 y Fp(Op)q(ening)36
+b(:)18 b(Kings)13 b(Gam)o(bit)f(Accepted)415 803 y(1.)62 b(e4)102
+b(e5)552 b(31.)40 b(Qc2)71 b(Qf4)415 853 y(2.)62 b(f4)107 b(ef)560
+b(32.)40 b(Nf2)77 b(g3)415 903 y(3.)62 b(Nf3)76 b(d6)547 b(33.)40
+b(Nd3)67 b(gh+)14 b(\(mate)f(in)g(5\))415 952 y(4.)62 b(Bc4)73
+b(Be6)523 b(34.)40 b(Kh1)66 b(Rxf1+)415 1002 y(5.)c(Bxe6)51
+b(fe)560 b(35.)40 b(Rxf1)55 b(Qxf1+)415 1052 y(6.)62 b(d4)97
+b(Qf6)525 b(36.)40 b(Kxh2)k(Qg1+)415 1102 y(7.)62 b(o-o)85
+b(Nc6)521 b(37.)40 b(Kh3)66 b(Qg3+)14 b(mate)415 1152 y(8.)62
+b(Nc3)71 b(Nge7)618 b(0)35 b Ff(\000)54 b Fp(1)415 1201 y(9.)62
+b(Nb5)k(o-o-o)415 1251 y(10.)41 b(a4)99 b(a6)415 1301 y(11.)41
+b(Nc3)71 b(e5)415 1351 y(12.)41 b(d5)97 b(Nb4)415 1401 y(13.)41
+b(Bd2)68 b(Qg6)415 1451 y(14.)41 b(Nh4)66 b(Qh6)415 1500 y(15.)41
+b(Qg4+)35 b(Kb8)415 1550 y(16.)41 b(Rac1)50 b(g5)415 1600 y(17.)41
+b(Nf3)76 b(Rg8)415 1650 y(18.)41 b(Nd1)66 b(a5)415 1700 y(19.)41
+b(Bxb4)46 b(ab)415 1749 y(20.)41 b(a5)99 b(Qg6)415 1799 y(21.)41
+b(Nd2)66 b(Bg7)415 1849 y(22.)41 b(c4)102 b(h5)415 1899 y(23.)41
+b(Qf3)75 b(g4)415 1949 y(24.)41 b(Qe2)70 b(f3)415 1998 y(25.)41
+b(Qf2)75 b(Bh6)415 2048 y(26.)41 b(Ne3)71 b(fg)415 2098 y(27.)41
+b(Kxg2)k(Rdf8)415 2148 y(28.)c(Qe2)70 b(Rf3)415 2198 y(29.)41
+b(Nd1)66 b(Bxd2)415 2248 y(30.)41 b(Qxd2)i(Qxe4)946 2574 y(222)p
+eop
+%%Page: 223 225
+223 224 bop 262 307 a Fu(E.1.2)55 b(Game)17 b(2)321 469 y Fp(White)77
+b(:)18 b Fl(HIAR)o(CS)d(5.0)321 519 y Fp(Blac)o(k)88 b(:)18
+b Fl(Mephisto)13 b(Exclusiv)o(e)321 569 y Fp(Op)q(ening)36
+b(:)18 b(Bogo{Indian)415 668 y(1.)62 b(d4)97 b(Nf6)526 b(31.)40
+b(Rc8)72 b(Rdd8)415 718 y(2.)62 b(c4)102 b(e6)552 b(32.)40
+b(Rc6)72 b(Qh6)415 768 y(3.)62 b(Nf3)76 b(Bb4)518 b(33.)40
+b(Qe2)71 b(Rf6)415 818 y(4.)62 b(Bd2)68 b(Bxd2)496 b(34.)40
+b(h3)98 b(Qg5)415 868 y(5.)62 b(Qxd2)43 b(o-o)535 b(35.)40
+b(Qb5)66 b(Qh4)415 917 y(6.)c(Nc3)71 b(d5)547 b(36.)40 b(Rxb6)45
+b(Nxb6)415 967 y(7.)62 b(e3)102 b(Ne4)521 b(37.)40 b(Qxb6)k(Rc8)415
+1017 y(8.)62 b(Nxe4)49 b(de)550 b(38.)40 b(Rxa5)47 b(Rc1+)415
+1067 y(9.)62 b(Ng1)68 b(Nc6)521 b(39.)40 b(Kh2)66 b(Rc2)415
+1117 y(10.)41 b(Ne2)71 b(Rb8)516 b(40.)40 b(Ra8)69 b(Kf7)415
+1166 y(11.)41 b(Ng3)68 b(f5)557 b(41.)40 b(Ra7)69 b(Kg6)415
+1216 y(12.)41 b(Be2)73 b(b6)547 b(42.)40 b(Re7)72 b(Rxf2)415
+1266 y(13.)41 b(o-o)85 b(Bb7)518 b(43.)40 b(Rxe6)50 b(Kf7)415
+1316 y(14.)41 b(Rac1)50 b(Ne5)521 b(44.)40 b(d5)98 b(Qh6)415
+1366 y(15.)41 b(Qc2)70 b(Nc6)521 b(45.)40 b(Kg1)68 b(Rd2)415
+1416 y(16.)41 b(c5)102 b(Nb4)516 b(46.)40 b(Nxf5)55 b(Rd1+)415
+1465 y(17.)41 b(Qb3)65 b(Nd5)516 b(47.)40 b(Kh2)66 b(Rxe6)415
+1515 y(18.)41 b(c6)102 b(Ba8)520 b(48.)40 b(Qb7+)34 b(Kf8)415
+1565 y(19.)41 b(Qa4)67 b(a5)549 b(49.)40 b(Qb4+)34 b(Kf7)415
+1615 y(20.)41 b(Qb3)65 b(Qh4)515 b(50.)40 b(Nxh6+)13 b(Rxh6)415
+1665 y(21.)41 b(Rfd1)53 b(Rb)q(d8)492 b(51.)40 b(Qxe4)49 b(Rd2)415
+1714 y(22.)41 b(a4)99 b(Rd6)516 b(52.)40 b(b4)98 b(Rg6)415
+1764 y(23.)41 b(Bb5)68 b(Nb4)516 b(53.)40 b(a5)100 b(Ra2)415
+1814 y(24.)41 b(Rd2)66 b(Bxc6)501 b(54.)40 b(d6)98 b(Rxd6)415
+1864 y(25.)41 b(Bxc6)51 b(Nxc6)499 b(55.)40 b(Qc4+)f(Re6)415
+1914 y(26.)i(Rdc2)48 b(Ne7)521 b(56.)40 b(Qxa2)46 b(Kf6)415
+1963 y(27.)41 b(Rxc7)49 b(Nd5)516 b(57.)40 b(Qxe6+)17 b(Kxe6)415
+2013 y(28.)41 b(Ra7)68 b(Qd8)515 b(58.)40 b(a6)100 b(Resigns)415
+2063 y(29.)41 b(Qb5)65 b(Qg5)635 b(1)35 b Ff(\000)54 b Fp(0)415
+2113 y(30.)41 b(Qa6)67 b(Qh4)946 2574 y(223)p eop
+%%Page: 224 226
+224 225 bop 262 307 a Fu(E.1.3)55 b(Game)17 b(3)321 469 y Fp(White)77
+b(:)18 b Fl(Mephisto)13 b(Exclusiv)o(e)321 519 y Fp(Blac)o(k)88
+b(:)18 b Fl(HIAR)o(CS)d(5.0)321 569 y Fp(Op)q(ening)36 b(:)18
+b(Ruy)13 b(Lop)q(ez,)h(exc)o(hange)h(v)n(ariation)415 668 y(1.)62
+b(e4)102 b(e5)552 b(31.)40 b(Qf3)76 b(Red8)415 718 y(2.)62
+b(Nf3)76 b(Nc6)521 b(32.)40 b(Qg4)68 b(Rd3)415 768 y(3.)62
+b(Bb5)68 b(a6)549 b(33.)40 b(Ne2)72 b(Rb3)415 818 y(4.)62 b(Bxc6)51
+b(dc)550 b(34.)40 b(g3)100 b(Rd2)415 868 y(5.)62 b(d3)97 b(Bg4)520
+b(35.)40 b(h5)98 b(Ke7)415 917 y(6.)62 b(h3)97 b(Bxf3)506 b(36.)40
+b(h6)98 b(Rbb2)415 967 y(7.)62 b(Qxf3)53 b(Nf6)526 b(37.)40
+b(Qf3)76 b(Rxe2)415 1017 y(8.)62 b(o-o)85 b(Qd4)515 b(38.)40
+b(Qa3)68 b(Ke6)415 1067 y(9.)62 b(Nc3)71 b(Qb4)515 b(39.)40
+b(Qxb2)k(Bxb2)415 1117 y(10.)d(Qf5)75 b(Bd6)518 b(40.)40 b(h7)98
+b(f5)415 1166 y(11.)41 b(Qg5)67 b(o-o)535 b(41.)40 b(Resigns)415
+1216 y(12.)h(Rb1)66 b(Rfe8)626 b(0)35 b Ff(\000)54 b Fp(1)415
+1266 y(13.)41 b(a3)99 b(Qc5)415 1316 y(14.)41 b(Be3)73 b(Qa5)415
+1366 y(15.)41 b(b4)97 b(h6)415 1416 y(16.)41 b(Qg3)67 b(Qxa3)415
+1465 y(17.)41 b(Rb3)66 b(Qxb3)415 1515 y(18.)41 b(cb)100 b(Bxb4)415
+1565 y(19.)41 b(Na2)68 b(Bf8)415 1615 y(20.)41 b(f4)107 b(ef)415
+1665 y(21.)41 b(Bxf4)56 b(Bc5+)415 1714 y(22.)41 b(Kh1)65 b(Nh5)415
+1764 y(23.)41 b(Qg4)67 b(Nxf4)415 1814 y(24.)41 b(Rxf4)54 b(Bd6)415
+1864 y(25.)41 b(Rf6)76 b(h5)415 1914 y(26.)41 b(Qxh5)i(gf)415
+1963 y(27.)e(h4)97 b(Rad8)415 2013 y(28.)41 b(Nc3)71 b(Be5)415
+2063 y(29.)41 b(Qg4)67 b(Kf8)415 2113 y(30.)41 b(d4)97 b(Rxd4)946
+2574 y(224)p eop
+%%Page: 225 227
+225 226 bop 262 307 a Fu(E.1.4)55 b(Game)17 b(4)321 469 y Fp(White)77
+b(:)18 b Fl(HIAR)o(CS)d(5.0)321 519 y Fp(Blac)o(k)88 b(:)18
+b Fl(Mephisto)13 b(Exclusiv)o(e)321 569 y Fp(Op)q(ening)36
+b(:)18 b(Catalan)415 668 y(1.)62 b(d4)97 b(Nf6)526 b(31.)40
+b(Kg2)68 b(Nb4)415 718 y(2.)62 b(c4)102 b(e6)552 b(32.)40 b(Rxa5)47
+b(Na6)415 768 y(3.)62 b(g3)99 b(d5)547 b(33.)40 b(Rad5)46 b(g6)415
+818 y(4.)62 b(Bg2)70 b(dc)550 b(34.)40 b(a4)100 b(Nb8)415 868
+y(5.)62 b(Nf3)76 b(Nb)q(d7)492 b(35.)40 b(Rf7)77 b(Na6)415
+917 y(6.)62 b(Nc3)71 b(Bb4)518 b(36.)40 b(Rd7)67 b(Re6)415
+967 y(7.)62 b(Bd2)68 b(o-o)535 b(37.)40 b(Rxh7+)13 b(Resigns)415
+1017 y(8.)62 b(o-o)85 b(Be7)617 b(\(mate)13 b(in)h(3\))415
+1067 y(9.)62 b(Bf4)78 b(c5)670 b(1)35 b Ff(\000)54 b Fp(0)415
+1117 y(10.)41 b(e3)102 b(cd)415 1166 y(11.)41 b(Qxd4)i(Qb6)415
+1216 y(12.)e(Rb1)66 b(Qxd4)415 1266 y(13.)41 b(Nxd4)j(Nc5)415
+1316 y(14.)d(Bc7)73 b(Bd7)415 1366 y(15.)41 b(Rfd1)53 b(Ng4)415
+1416 y(16.)41 b(h3)97 b(Rfc8)415 1465 y(17.)41 b(Ndb5)i(Bxb5)415
+1515 y(18.)e(Nxb5)j(Nh6)415 1565 y(19.)d(Bd6)68 b(Bxd6)415
+1615 y(20.)41 b(Nxd6)j(Rcb8)415 1665 y(21.)d(Nxc4)49 b(a5)415
+1714 y(22.)41 b(Rb)q(c1)47 b(Nf5)415 1764 y(23.)41 b(e4)102
+b(Ne7)415 1814 y(24.)41 b(Nb6)66 b(Ra6)415 1864 y(25.)41 b(Rxc5)49
+b(Rxb6)415 1914 y(26.)41 b(Rd7)66 b(Nc6)415 1963 y(27.)41 b(b3)97
+b(e5)415 2013 y(28.)41 b(Bf1)78 b(f6)415 2063 y(29.)41 b(Bb5)68
+b(Ra8)415 2113 y(30.)41 b(Bc4+)g(Kh8)946 2574 y(225)p eop
+%%Page: 226 228
+226 227 bop 262 307 a Fu(E.1.5)55 b(Game)17 b(5)321 469 y Fp(White)77
+b(:)18 b Fl(Mephisto)13 b(Exclusiv)o(e)321 519 y Fp(Blac)o(k)88
+b(:)18 b Fl(HIAR)o(CS)d(5.0)321 569 y Fp(Op)q(ening)36 b(:)18
+b(Sicilian)12 b(Dragon,)g(early)i(white)g(div)o(ergence)415
+668 y(1.)62 b(e4)102 b(c5)552 b(31.)40 b(Rb)q(c1)48 b(Rd2)415
+718 y(2.)62 b(Nf3)76 b(d6)547 b(32.)40 b(R1c2)51 b(Rxc2)415
+768 y(3.)62 b(Bc4)73 b(Nc6)521 b(33.)40 b(Rxc2)50 b(Rxa3)415
+818 y(4.)62 b(d4)97 b(Nf6)526 b(34.)40 b(Kf2)76 b(Kf7)415 868
+y(5.)62 b(d5)97 b(Na5)518 b(35.)40 b(Re2)72 b(Kf6)415 917 y(6.)62
+b(Bb5+)36 b(Bd7)518 b(36.)40 b(h3)98 b(Kf5)415 967 y(7.)62
+b(Bxd7+)14 b(Qxd7)493 b(37.)40 b(Ke1)71 b(h5)415 1017 y(8.)62
+b(Qd2)j(Nc4)521 b(38.)40 b(Kf2)76 b(Ra4)415 1067 y(9.)62 b(Qc3)70
+b(Nb6)516 b(39.)40 b(Rd2)67 b(Ke5)415 1117 y(10.)41 b(Nfd2)53
+b(e6)552 b(40.)40 b(Re2)72 b(Kd5)415 1166 y(11.)41 b(de)100
+b(fe)560 b(41.)40 b(Rd2)67 b(Rd4)415 1216 y(12.)41 b(o-o)85
+b(d5)547 b(42.)40 b(Ke3)71 b(Rxd2)415 1266 y(13.)41 b(ed)100
+b(Nb)o(xd5)472 b(43.)40 b(Kxd2)k(h4)415 1316 y(14.)d(Qh3)65
+b(Nf4)526 b(44.)40 b(Ke3)71 b(Ke5)415 1366 y(15.)41 b(Qe3)70
+b(Nf6d5)482 b(45.)40 b(Kd3)66 b(Kf4)415 1416 y(16.)41 b(Qe4)70
+b(Bd6)518 b(46.)40 b(Ke2)71 b(b5)415 1465 y(17.)41 b(Nc4)71
+b(o-o)535 b(47.)40 b(Kf2)76 b(a5)415 1515 y(18.)41 b(Nxd6)j(Qxd6)493
+b(48.)40 b(Ke2)71 b(b4)415 1565 y(19.)41 b(Na3)68 b(Qc6)520
+b(49.)40 b(Kf2)76 b(a4)415 1615 y(20.)41 b(Re1)71 b(g5)549
+b(50.)40 b(g3+)68 b(hg+)415 1665 y(21.)41 b(Bxf4)56 b(Rxf4)504
+b(51.)40 b(Ke2)71 b(a3)415 1714 y(22.)41 b(Qxe6+)16 b(Qxe6)498
+b(52.)40 b(h4)98 b(b3)415 1764 y(23.)41 b(Rxe6)49 b(Raf8)505
+b(53.)40 b(h5)98 b(ba)415 1814 y(24.)41 b(c4)102 b(Nb6)516
+b(54.)40 b(h6)98 b(a1\(Q\))415 1864 y(25.)41 b(Re5)71 b(h6)547
+b(55.)40 b(h7)98 b(a2)13 b(\(mate)g(in)h(7\))415 1914 y(26.)41
+b(f3)107 b(Nxc4)499 b(56.)40 b(h8\(Q\))34 b(Qxh8)415 1963 y(27.)41
+b(Rxc5)49 b(Nxa3)496 b(57.)40 b(Resigns)415 2013 y(28.)h(ba)97
+b(Ra4)636 b(0)35 b Ff(\000)54 b Fp(1)415 2063 y(29.)41 b(Rb1)66
+b(b6)415 2113 y(30.)41 b(Rc3)71 b(Rd8)946 2574 y(226)p eop
+%%Page: 227 229
+227 228 bop 262 307 a Fu(E.1.6)55 b(Game)17 b(6)321 469 y Fp(White)77
+b(:)18 b Fl(HIAR)o(CS)d(5.0)321 519 y Fp(Blac)o(k)88 b(:)18
+b Fl(Mephisto)13 b(Exclusiv)o(e)321 569 y Fp(Op)q(ening)36
+b(:)18 b(P)o(etro\013)c(Defence)415 668 y(1.)62 b(e4)102 b(e5)552
+b(31.)40 b(Qd4)66 b(Qxd4)415 718 y(2.)c(Nf3)76 b(Nf6)526 b(32.)40
+b(Rxd4)45 b(Kg7)415 768 y(3.)62 b(Nxe5)49 b(d6)547 b(33.)40
+b(Kf1)76 b(Bb6)415 818 y(4.)62 b(Nf3)76 b(Nxe4)499 b(34.)40
+b(Rd5)67 b(f5)415 868 y(5.)62 b(d4)97 b(d5)547 b(35.)40 b(Ke2)71
+b(h6)415 917 y(6.)62 b(Bd3)68 b(Be7)523 b(36.)40 b(h5)98 b(Kf6)415
+967 y(7.)62 b(o-o)85 b(Nc6)521 b(37.)40 b(hg)98 b(f4)415 1017
+y(8.)62 b(Re1)71 b(Bf5)528 b(38.)40 b(Kf3)76 b(Bc7)415 1067
+y(9.)62 b(Nb)q(d2)42 b(Nd6)516 b(39.)40 b(Kg4)68 b(Kxg6)415
+1117 y(10.)41 b(Nb3)66 b(o-o)535 b(40.)40 b(Bf5+)47 b(Kf6)415
+1166 y(11.)41 b(Nc5)71 b(b6)547 b(41.)40 b(Rxd8)45 b(Bxd8)415
+1216 y(12.)c(Bf4)78 b(b)q(c)549 b(42.)40 b(Kxf4)54 b(Be7)415
+1266 y(13.)41 b(Bxd6)46 b(Qxd6)493 b(43.)40 b(a4)100 b(Bc5)415
+1316 y(14.)41 b(Bxf5)56 b(Qf6)525 b(44.)40 b(f3)108 b(a5)415
+1366 y(15.)41 b(Qd3)65 b(g6)549 b(45.)40 b(Ke4)71 b(h5)415
+1416 y(16.)41 b(Bd7)68 b(Nxd4)494 b(46.)40 b(f4)108 b(h4)415
+1465 y(17.)41 b(Nxd4)j(cd)550 b(47.)40 b(Bc8)74 b(Bf2)415 1515
+y(18.)41 b(Rad1)k(Bb4)518 b(48.)40 b(Kf3)76 b(Bg3)415 1565
+y(19.)41 b(Re2)71 b(c5)552 b(49.)40 b(Kg4)68 b(Ke7)415 1615
+y(20.)41 b(c3)102 b(dc)550 b(50.)40 b(Kg5)68 b(Kd6)415 1665
+y(21.)41 b(a3)99 b(Ba5)520 b(51.)40 b(f5)108 b(Ke7)415 1714
+y(22.)41 b(Qxd5)i(cb)550 b(52.)40 b(f6+)76 b(Kf7)415 1764 y(23.)41
+b(Qxc5)48 b(Qc3)520 b(53.)40 b(Kf5)76 b(Kf8)415 1814 y(24.)41
+b(Re5)71 b(f6)557 b(54.)40 b(Be6)74 b(Ke8)415 1864 y(25.)41
+b(Qd5+)33 b(Kh8)515 b(55.)40 b(Bd5)69 b(Kf8)415 1914 y(26.)41
+b(Re3)71 b(Qc7)520 b(56.)40 b(f7)108 b(Ke7)415 1963 y(27.)41
+b(h4)97 b(Rab8)495 b(57.)40 b(Kg6)68 b(Kf8)415 2013 y(28.)41
+b(Rb3)66 b(Rxb3)494 b(58.)40 b(Dra)o(wn)415 2063 y(29.)h(Qxb3)i(Rd8)1365
+2047 y Fk(1)p 1365 2054 17 2 v 1365 2078 a(2)1422 2063 y Ff(\000)1507
+2047 y Fk(1)p 1507 2054 V 1507 2078 a(2)415 2113 y Fp(30.)e(Qxb2)i(Qf4)946
+2574 y(227)p eop
+%%Page: 228 230
+228 229 bop 262 307 a Fr(E.2)69 b(HIAR)n(CS)22 b(5.0)i(v)n(ersus)f(Mark)i
+(Uniac)n(k)n(e)262 442 y Fu(E.2.1)55 b(Game)17 b(1)321 604
+y Fp(White)77 b(:)18 b Fl(Mark)e(Uniac)o(k)o(e)321 654 y Fp(Blac)o(k)88
+b(:)18 b Fl(HIAR)o(CS)d(5.0)321 703 y Fp(Op)q(ening)36 b(:)18
+b(Queens)d(Gam)o(bit)c(Declined)415 803 y(1.)62 b(d4)97 b(d5)547
+b(31.)40 b(ed)101 b(Qc5)415 853 y(2.)62 b(c4)102 b(e6)552 b(32.)40
+b(Kh2)66 b(Qxd5)415 903 y(3.)c(Nc3)71 b(Nf6)526 b(33.)40 b(Qxd5)k(Bxd5)415
+952 y(4.)62 b(Bg5)70 b(Be7)523 b(34.)40 b(Bd3)69 b(b5)415 1002
+y(5.)62 b(e3)102 b(o-o)535 b(35.)40 b(Kg1)68 b(h5)415 1052
+y(6.)62 b(Nf3)76 b(Nb)q(d7)492 b(36.)40 b(Be2)74 b(g6)415 1102
+y(7.)62 b(Bd3)68 b(dc)550 b(37.)40 b(a4)100 b(ba)415 1152 y(8.)62
+b(Bxc4)51 b(b6)547 b(38.)40 b(Bxa6)49 b(Bc6)415 1201 y(9.)62
+b(o-o)85 b(Bb7)518 b(39.)40 b(Kf2)76 b(Ke7)415 1251 y(10.)41
+b(Rc1)71 b(c5)552 b(40.)40 b(Be2)74 b(Kf6)415 1301 y(11.)41
+b(Re1)71 b(Rc8)521 b(41.)40 b(Bc4)74 b(h4)415 1351 y(12.)41
+b(Bd3)68 b(cd)550 b(42.)40 b(Be2)74 b(Ke5)415 1401 y(13.)41
+b(Nxd4)j(Ne5)521 b(43.)40 b(Bf3)79 b(Bxf3)415 1451 y(14.)41
+b(Bb1)68 b(Nfg4)505 b(44.)40 b(Kxf3)54 b(Kf5)415 1500 y(15.)41
+b(Bxe7)51 b(Qxe7)498 b(45.)40 b(Kf2)76 b(Ke4)415 1550 y(16.)41
+b(h3)97 b(Nf6)526 b(46.)40 b(Ke2)71 b(f5)415 1600 y(17.)41
+b(Qe2)70 b(Rfd8)503 b(47.)40 b(Kf2)76 b(Kd3)415 1650 y(18.)41
+b(Red1)48 b(Rc5)521 b(48.)40 b(Kf3)76 b(g5)415 1700 y(19.)41
+b(e4)102 b(a6)549 b(49.)40 b(Resigns)415 1749 y(20.)h(f4)107
+b(Ng6)636 b(0)35 b Ff(\000)54 b Fp(1)415 1799 y(21.)41 b(Qf2)75
+b(Qc7)415 1849 y(22.)41 b(Nde2)48 b(Rc4)415 1899 y(23.)41 b(Rxd8)j(Qxd8)415
+1949 y(24.)d(Rd1)66 b(Qc7)415 1998 y(25.)41 b(Rd4)66 b(Rxd4)415
+2048 y(26.)41 b(Qxd4)i(Nxf4)415 2098 y(27.)e(Nxf4)54 b(e5)415
+2148 y(28.)41 b(Qd2)65 b(ef)415 2198 y(29.)41 b(a3)99 b(Kf8)415
+2248 y(30.)41 b(Nd5)66 b(Nxd5)946 2574 y(228)p eop
+%%Page: 229 231
+229 230 bop 262 307 a Fu(E.2.2)55 b(Game)17 b(2)321 469 y Fp(White)77
+b(:)18 b Fl(HIAR)o(CS)d(5.0)321 519 y Fp(Blac)o(k)88 b(:)18
+b Fl(Mark)e(Uniac)o(k)o(e)321 569 y Fp(Op)q(ening)36 b(:)18
+b(Pirc)c(Defence)415 668 y(1.)62 b(e4)102 b(d6)547 b(31.)40
+b(b3)98 b(Nb6)415 718 y(2.)62 b(d4)97 b(Nf6)526 b(32.)40 b(h4)98
+b(a5)415 768 y(3.)62 b(Nc3)71 b(g6)549 b(33.)40 b(h5)98 b(Na6)415
+818 y(4.)62 b(f4)107 b(Bg7)520 b(34.)40 b(hg)98 b(hg)415 868
+y(5.)62 b(Nf3)76 b(o-o)535 b(35.)40 b(Rh1+)35 b(Kg7)415 917
+y(6.)62 b(Be3)73 b(Ng4)518 b(36.)40 b(Kc1)71 b(a4)415 967 y(7.)62
+b(Bd2)68 b(c5)552 b(37.)40 b(ba)98 b(Nxa4)415 1017 y(8.)62
+b(dc)100 b(dc)550 b(38.)40 b(Qc2)71 b(Qc6)415 1067 y(9.)62
+b(e5)102 b(a6)549 b(39.)40 b(Rh3)67 b(ba)415 1117 y(10.)41
+b(h3)97 b(Nh6)516 b(40.)40 b(Nxa3)47 b(Nb4)415 1166 y(11.)41
+b(Be3)73 b(Qa5)517 b(41.)40 b(Rxd8)45 b(Nxc2)415 1216 y(12.)c(Qd5)65
+b(Nd7)516 b(42.)40 b(Rxe8)50 b(Qxe8)415 1266 y(13.)41 b(g4)99
+b(Kh8)515 b(43.)40 b(Kxc2)49 b(Qc6)415 1316 y(14.)41 b(o-o-o)50
+b(e6)552 b(44.)40 b(Bd2)69 b(Qe4+)415 1366 y(15.)41 b(Qd6)65
+b(Re8)521 b(45.)40 b(Kb3)66 b(Qe2)415 1416 y(16.)41 b(Ng5)68
+b(Bf8)528 b(46.)40 b(Kc2)71 b(Qxg4)415 1465 y(17.)41 b(Qd2)65
+b(Be7)523 b(47.)40 b(Rb3)67 b(Qf5+)415 1515 y(18.)41 b(Nge4)50
+b(b5)547 b(48.)40 b(Kc1)71 b(Qe4)415 1565 y(19.)41 b(Nd6)66
+b(Bxd6)496 b(49.)40 b(Kd1)66 b(Qd4)415 1615 y(20.)41 b(Qxd6)i(Bb7)518
+b(50.)40 b(Kc2)71 b(g5)415 1665 y(21.)41 b(Rh2)66 b(Rad8)495
+b(51.)40 b(Rg3)69 b(Kf8)415 1714 y(22.)41 b(Bg2)70 b(Bxg2)498
+b(52.)40 b(fg)108 b(Qxe5)415 1764 y(23.)41 b(Rxg2)46 b(b4)547
+b(53.)40 b(Rd3)67 b(Qe4)415 1814 y(24.)41 b(Nb1)66 b(Ng8)518
+b(54.)40 b(Be3)74 b(Nb2)415 1864 y(25.)41 b(a3)99 b(Ne7)521
+b(55.)40 b(Kxb2)k(Qxd3)415 1914 y(26.)d(c4)102 b(Nc8)521 b(56.)40
+b(Bxc5+)20 b(Kg7)415 1963 y(27.)41 b(Qc6)70 b(Ncb6)498 b(57.)40
+b(Be7)74 b(Kg6)415 2013 y(28.)41 b(Qe4)70 b(Nb8)516 b(58.)40
+b(Bf6)79 b(e5)415 2063 y(29.)41 b(Rgg1)47 b(Na4)518 b(59.)40
+b(Be7)74 b(e4)415 2113 y(30.)41 b(Kc2)70 b(Qc7)520 b(60.)40
+b(Nc2)72 b(Qxc4)946 2574 y(229)p eop
+%%Page: 230 232
+230 231 bop 415 357 a Fp(61.)41 b(Bf6)78 b(Qd3)415 407 y(62.)41
+b(Nb4)66 b(Qd2+)415 457 y(63.)41 b(Nc2)71 b(e3)415 506 y(64.)41
+b(Bc3)73 b(Qd3)415 556 y(65.)41 b(Bd4)68 b(e2)415 606 y(66.)41
+b(Bf6)78 b(Qd2)415 656 y(67.)41 b(Kb1)65 b(e1\(Q\)+)415 706
+y(68.)41 b(Nxe1)49 b(Qxe1+)415 756 y(69.)41 b(Kc2)70 b(Qf2+)415
+805 y(70.)41 b(Kd3)65 b(Qf4)415 855 y(71.)41 b(Ke2)70 b(Qxf6)415
+905 y(72.)41 b(gf)107 b(Kxf6)415 955 y(73.)41 b(Kf2)75 b(Kf5)415
+1005 y(74.)41 b(Kf3)75 b(f6)415 1054 y(75.)41 b(Kg3)67 b(Ke4)415
+1104 y(76.)41 b(Kf2)75 b(Kf4)415 1154 y(77.)41 b(Kg2)67 b(Ke3)415
+1204 y(78.)41 b(Kg3)67 b(f5)415 1254 y(79.)41 b(Kg2)67 b(f4)415
+1303 y(80.)41 b(Kf1)75 b(Kf3)415 1353 y(81.)41 b(Ke1)70 b(Kg2)415
+1403 y(82.)41 b(Resigns)533 1453 y(0)35 b Ff(\000)54 b Fp(1)946
+2574 y(230)p eop
+%%Page: 231 233
+231 232 bop 262 307 a Fr(E.3)69 b(HIAR)n(CS)22 b(5.0)i(v)n(ersus)f(NOKNO)n(W)
+262 442 y Fu(E.3.1)55 b(Game)17 b(1)321 604 y Fp(White)77 b(:)18
+b Fl(NOKNO)o(W,)f(6)e(ply)321 654 y Fp(Blac)o(k)88 b(:)18 b
+Fl(HIAR)o(CS)d(5.0,)i(3)e(ply)321 703 y Fp(Op)q(ening)36 b(:)18
+b(Queens)d(Gam)o(bit)c(Declined)415 803 y(1.)62 b(d4)97 b(d5)547
+b(31.)40 b(Qa7)68 b(Qxe5)415 853 y(2.)62 b(c4)102 b(e6)552
+b(32.)40 b(Rb1)67 b(Qe4)415 903 y(3.)62 b(Nc3)71 b(Nf6)526
+b(33.)40 b(a5)100 b(Rc2)415 952 y(4.)62 b(Bg5)70 b(Be7)523
+b(34.)40 b(a6)100 b(ba)415 1002 y(5.)62 b(e3)102 b(o-o)535
+b(35.)40 b(Qxa6)46 b(Kh7)415 1052 y(6.)62 b(Nf3)76 b(h6)547
+b(36.)40 b(Qd6)66 b(Rc6)415 1102 y(7.)c(Bxf6)56 b(Bxf6)506
+b(37.)40 b(Qd1)66 b(Rcc7)415 1152 y(8.)c(Qb3)j(c6)552 b(38.)40
+b(Rb6)67 b(Rcd7)415 1201 y(9.)62 b(Rd1)k(Nd7)516 b(39.)40 b(Rd6)67
+b(Qf5)415 1251 y(10.)41 b(Bd3)68 b(g6)549 b(40.)40 b(Rxd7)45
+b(Rxd7)415 1301 y(11.)c(cd)100 b(ed)550 b(41.)40 b(Qe2)71 b(Qc5)415
+1351 y(12.)41 b(e4)102 b(de)550 b(42.)40 b(Kg2)68 b(Qd5+)415
+1401 y(13.)41 b(Nxe4)49 b(Nb6)516 b(43.)40 b(f3)108 b(Qd4)415
+1451 y(14.)41 b(Nxf6)54 b(Qxf6)503 b(44.)40 b(f4)108 b(Qc3)415
+1500 y(15.)41 b(Be4)73 b(Bf5)528 b(45.)40 b(Kh3)66 b(Qd2)415
+1550 y(16.)41 b(Bxf5)56 b(Qxf5)503 b(46.)40 b(Qxd2)k(Rxd2)415
+1600 y(17.)d(o-o)85 b(Rde8)498 b(47.)40 b(Rh1)67 b(Kg7)415
+1650 y(18.)41 b(Ne5)71 b(Kg7)517 b(48.)40 b(Kg4)68 b(Kf6)415
+1700 y(19.)41 b(Qa3)67 b(f6)557 b(49.)40 b(Kf3)76 b(Rc2)415
+1749 y(20.)41 b(Qxa7)k(fe)560 b(50.)40 b(Ke4)71 b(Re2+)415
+1799 y(21.)41 b(Qxb6)i(Rf7)526 b(51.)40 b(Kd3)66 b(Rb2)415
+1849 y(22.)41 b(Qc5)70 b(Qf4)525 b(52.)40 b(Kc3)71 b(Rf2)415
+1899 y(23.)41 b(a4)99 b(Ree7)503 b(53.)40 b(Kd4)66 b(Rd2+)415
+1949 y(24.)41 b(b4)97 b(Ree8)503 b(54.)40 b(Kc4)71 b(Rc2+)415
+1998 y(25.)41 b(b5)97 b(Rf6)526 b(55.)40 b(Kd5)66 b(Rd2+)415
+2048 y(26.)41 b(Qa7)67 b(Re7)521 b(56.)40 b(Kc6)71 b(g5)415
+2098 y(27.)41 b(b)q(c)99 b(Rxc6)499 b(57.)40 b(fg+)76 b(Kxg5)415
+2148 y(28.)41 b(Qb8)65 b(Rc4)521 b(58.)40 b(h3)98 b(Rc2+)415
+2198 y(29.)41 b(g3)99 b(Qf5)525 b(59.)40 b(Kd5)66 b(Rg2)415
+2248 y(30.)41 b(de)100 b(Rc8)521 b(60.)40 b(g4)100 b(Kh4)946
+2574 y(231)p eop
+%%Page: 232 234
+232 233 bop 415 357 a Fp(61.)41 b(Ke4)70 b(Rg3)415 407 y(62.)41
+b(Kf4)75 b(Rxh3)415 457 y(63.)41 b(Rg1)68 b(Rd3)415 506 y(64.)41
+b(Kf5)75 b(Rd5+)415 556 y(65.)41 b(Kf6)75 b(Rd2)415 606 y(66.)41
+b(Ke5)70 b(Kg5)415 656 y(67.)41 b(Rh1)66 b(Re2+)415 706 y(68.)41
+b(Kd5)65 b(Re3)415 756 y(69.)41 b(Rh5+)34 b(Kxg4)415 805 y(70.)41
+b(Rxh6)510 855 y(Dra)o(wn)538 889 y Fk(1)p 538 896 17 2 v 538
+919 a(2)595 905 y Ff(\000)680 889 y Fk(1)p 680 896 V 680 919
+a(2)946 2574 y Fp(232)p eop
+%%Page: 233 235
+233 234 bop 262 307 a Fu(E.3.2)55 b(Game)17 b(2)321 469 y Fp(White)77
+b(:)18 b Fl(HIAR)o(CS)d(5.0,)i(3)e(ply)321 519 y Fp(Blac)o(k)88
+b(:)18 b Fl(NOKNO)o(W,)f(6)e(ply)321 569 y Fp(Op)q(ening)36
+b(:)18 b(Ruy)13 b(Lop)q(ez)415 668 y(1.)62 b(e4)102 b(e5)415
+718 y(2.)62 b(Nf3)76 b(Nc6)415 768 y(3.)62 b(Bb5)68 b(a6)415
+818 y(4.)62 b(Ba4)70 b(Nf6)415 868 y(5.)62 b(o-o)85 b(Be7)415
+917 y(6.)62 b(Re1)71 b(b5)415 967 y(7.)62 b(Bb3)68 b(d6)415
+1017 y(8.)62 b(c3)102 b(o-o)415 1067 y(9.)62 b(h3)97 b(Bb7)415
+1117 y(10.)41 b(d4)97 b(Re8)415 1166 y(11.)41 b(Ng5)68 b(Rf8)415
+1216 y(12.)41 b(f4)107 b(ed)415 1266 y(13.)41 b(cd)100 b(h6)415
+1316 y(14.)41 b(Nf3)76 b(d5)415 1366 y(15.)41 b(ed)100 b(Na5)415
+1416 y(16.)41 b(Bc2)73 b(Bxd5)415 1465 y(17.)41 b(Nc3)71 b(Bxf3)415
+1515 y(18.)41 b(gf)107 b(c5)415 1565 y(19.)41 b(Be3)73 b(Nc4)415
+1615 y(20.)41 b(dc)100 b(Nxe3)415 1665 y(21.)41 b(Rxe3)49 b(Bxc5)415
+1714 y(22.)41 b(Qe1)70 b(Qd4)415 1764 y(23.)41 b(Nd1)66 b(Nd5)415
+1814 y(24.)41 b(Resigns)533 1864 y(0)35 b Ff(\000)54 b Fp(1)946
+2574 y(233)p eop
+%%Page: 234 236
+234 235 bop 262 307 a Fu(E.3.3)55 b(Game)17 b(3)321 469 y Fp(White)77
+b(:)18 b Fl(NOKNO)o(W,)f(6)e(ply)321 519 y Fp(Blac)o(k)88 b(:)18
+b Fl(HIAR)o(CS)d(5.0,)i(3)e(ply)321 569 y Fp(Op)q(ening)36
+b(:)18 b(Reti)13 b(\(irregular\))415 668 y(1.)62 b(Nf3)76 b(d5)547
+b(31.)40 b(Ra1)69 b(Nb4)415 718 y(2.)62 b(Na3)68 b(Nc6)521
+b(32.)40 b(Rxa7)47 b(b6)415 768 y(3.)62 b(c4)102 b(e5)552 b(33.)40
+b(Rc7)72 b(c5+)415 818 y(4.)62 b(cd)100 b(Qxd5)493 b(34.)40
+b(Kc4)71 b(Nc2)415 868 y(5.)62 b(d3)97 b(Bb4+)486 b(35.)40
+b(Rb7)67 b(Nd4)415 917 y(6.)62 b(Bd2)68 b(Bg4)520 b(36.)40
+b(f4)108 b(Ne6)415 967 y(7.)62 b(Bxb4)46 b(Bxf3)506 b(37.)40
+b(Rxb6)45 b(g6)415 1017 y(8.)62 b(ef)110 b(Nxb4)494 b(38.)40
+b(f3)108 b(Ke7)415 1067 y(9.)62 b(Nc4)71 b(Nf6)526 b(39.)40
+b(Kd5)66 b(h5)415 1117 y(10.)41 b(Qe2)70 b(o-o)535 b(40.)40
+b(Ke4)71 b(Ng7)415 1166 y(11.)41 b(Nxe5)49 b(Nxd3+)462 b(41.)40
+b(Ke5)71 b(Nf5)415 1216 y(12.)41 b(Qxd3)i(Qxe5+)466 b(42.)40
+b(Rb7)67 b(Ke8)415 1266 y(13.)41 b(Qe2)70 b(Qc5)520 b(43.)40
+b(Kf6)76 b(Nxh4)415 1316 y(14.)41 b(Qd2)65 b(Rfe8+)476 b(44.)40
+b(Re7+)g(Kd8)415 1366 y(15.)h(Be2)73 b(Rad8)495 b(45.)40 b(Rxf7)55
+b(Nxf3)415 1416 y(16.)41 b(Qc1)70 b(Qb5)515 b(46.)40 b(Kxg6)46
+b(Nd4)415 1465 y(17.)41 b(Qc2)70 b(Rxe2+)467 b(47.)40 b(Rb7)67
+b(h4)415 1515 y(18.)41 b(Qxe2)48 b(Re8)521 b(48.)40 b(Kg5)68
+b(Kc8)415 1565 y(19.)41 b(Qxe8+)16 b(Qxe8+)466 b(49.)40 b(Rh7)67
+b(Nxb3)415 1615 y(20.)41 b(Kd2)65 b(Qe5)520 b(50.)40 b(Kxh4)k(c4)415
+1665 y(21.)d(b3)97 b(Qg5+)485 b(51.)40 b(Kg5)68 b(Nd4)415 1714
+y(22.)41 b(Ke2)70 b(Qxg2)495 b(52.)40 b(Kf6)76 b(c3)415 1764
+y(23.)41 b(h4)97 b(Nd5)516 b(53.)40 b(Rh5)67 b(Kb7)415 1814
+y(24.)41 b(Rag1)47 b(Nc3+)489 b(54.)40 b(Rc5)72 b(c2)415 1864
+y(25.)41 b(Ke3)70 b(Qxh1)493 b(55.)40 b(Ke5)71 b(Nc6+)415 1914
+y(26.)41 b(Rxh1)j(c6)552 b(56.)40 b(Kd6)66 b(Nb4)415 1963 y(27.)41
+b(Kd4)65 b(Nb5+)484 b(57.)40 b(f5)108 b(c1\(Q\))415 2013 y(28.)41
+b(Kc5)70 b(Nc3)521 b(58.)40 b(Rxc1)50 b(Resigns)415 2063 y(29.)41
+b(Re1)71 b(Kf8)643 b(1)35 b Ff(\000)54 b Fp(0)415 2113 y(30.)41
+b(Kd4)65 b(Nxa2)946 2574 y(234)p eop
+%%Page: 235 237
+235 236 bop 262 307 a Fu(E.3.4)55 b(Game)17 b(4)321 469 y Fp(White)77
+b(:)18 b Fl(HIAR)o(CS)d(5.0,)i(3)e(ply)321 519 y Fp(Blac)o(k)88
+b(:)18 b Fl(NOKNO)o(W,)f(6)e(ply)321 569 y Fp(Op)q(ening)36
+b(:)18 b(Alekhines)c(Defence)415 668 y(1.)62 b(e4)102 b(Nf6)526
+b(31.)40 b(Rb6)67 b(Rac8)415 718 y(2.)62 b(e5)102 b(Nd5)516
+b(32.)40 b(Rd4)67 b(Bc6)415 768 y(3.)62 b(d4)97 b(e6)552 b(33.)40
+b(Ra6)69 b(a4)415 818 y(4.)62 b(c4)102 b(Bb4+)486 b(34.)40
+b(Ra5)69 b(g6)415 868 y(5.)62 b(Bd2)68 b(Bxd2+)464 b(35.)40
+b(h5)98 b(Ke6)415 917 y(6.)62 b(Qxd2)43 b(Ne7)521 b(36.)40
+b(hg)98 b(hg)415 967 y(7.)62 b(Nc3)71 b(Nb)q(c6)497 b(37.)40
+b(Nh4)67 b(Rg7)415 1017 y(8.)62 b(Nf3)76 b(d6)547 b(38.)40
+b(f4)108 b(Ra8)415 1067 y(9.)62 b(o-o-o)50 b(o-o)535 b(39.)40
+b(Rc5)72 b(Ra6)415 1117 y(10.)41 b(Bd3)68 b(Nf5)526 b(40.)40
+b(Rd2)67 b(Be4)415 1166 y(11.)41 b(Bxf5)56 b(ef)560 b(41.)40
+b(Nf3)77 b(Rg8)415 1216 y(12.)41 b(ed)100 b(cd)550 b(42.)40
+b(Nd4+)35 b(Ke7)415 1266 y(13.)41 b(Rde1)48 b(b6)547 b(43.)40
+b(Rc7+)g(Ke8)415 1316 y(14.)h(Nd5)66 b(Be6)523 b(44.)40 b(Nb5)67
+b(Ra8)415 1366 y(15.)41 b(Ne3)71 b(Bd7)518 b(45.)40 b(Nd6+)35
+b(Kd8)415 1416 y(16.)41 b(h4)97 b(a5)549 b(46.)40 b(Rf7)77
+b(Bc6)415 1465 y(17.)41 b(Nd5)66 b(Be6)523 b(47.)40 b(Nxf5+)23
+b(Ke8)415 1515 y(18.)41 b(Nxb6)j(Qxb6)493 b(48.)40 b(Nd6+)35
+b(Kd8)415 1565 y(19.)41 b(d5)97 b(Qc5)520 b(49.)40 b(Nb5+)35
+b(Ke8)415 1615 y(20.)41 b(b3)97 b(Bd7)518 b(50.)40 b(Rxf6)55
+b(Bxb5)415 1665 y(21.)41 b(dc)100 b(Bxc6)501 b(51.)40 b(cb)101
+b(Ke7)415 1714 y(22.)41 b(Re7)71 b(d5)547 b(52.)40 b(Rfd6)54
+b(Rgf8)415 1764 y(23.)41 b(Re5)71 b(Qa3+)485 b(53.)40 b(g3)100
+b(Rf6)415 1814 y(24.)41 b(Qb2)65 b(Qxb2+)461 b(54.)40 b(Rd7+)35
+b(Ke8)415 1864 y(25.)41 b(Kxb2)i(dc)550 b(55.)40 b(Kb4)66 b(Re6)415
+1914 y(26.)41 b(b)q(c)99 b(Be4)523 b(56.)40 b(R7d6)46 b(Ke7)415
+1963 y(27.)41 b(Rd1)66 b(f6)557 b(57.)40 b(Rxe6+)18 b(Kxe6)415
+2013 y(28.)41 b(Re7)71 b(Rf7)526 b(58.)40 b(b6)98 b(Rb8)415
+2063 y(29.)41 b(Re6)71 b(Rc7)521 b(59.)40 b(Kc5)71 b(Rc8+)415
+2113 y(30.)41 b(Kc3)70 b(Kf7)525 b(60.)40 b(Kb5)66 b(a3)946
+2574 y(235)p eop
+%%Page: 236 238
+236 237 bop 415 357 a Fp(61.)41 b(Rd3)66 b(Ra8)415 407 y(62.)41
+b(b7)97 b(Rb8)415 457 y(63.)41 b(Kb6)65 b(Rg8)415 506 y(64.)41
+b(Rxa3)46 b(Rd8)415 556 y(65.)41 b(Re3+)e(Kf6)415 606 y(66.)i(Kc7)70
+b(Rf8)415 656 y(67.)41 b(b8\(Q\))33 b(Rxb8)415 706 y(68.)41
+b(Kxb8)i(g5)415 756 y(69.)e(fg+)75 b(Kxg5)415 805 y(70.)41
+b(a4)99 b(Resigns)533 855 y(1)35 b Ff(\000)54 b Fp(0)946 2574
+y(236)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/programs/xboard.html b/programs/xboard.html
new file mode 100644
index 0000000..c02b03b
--- /dev/null
+++ b/programs/xboard.html
@@ -0,0 +1,1300 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
+<html>
+<head>
+<title>Chess Engine Communication Protocol</title>
+</head>
+
+<body>
+<hr noshade size="2">
+<h1>Chess Engine Communication Protocol</h1>
+<h2><a href="http://www.tim-mann.org/chess.html">Tim Mann</a></h2>
+<p>
+Last modified on Sun Sep 17 23:37:17 PDT 2000 by mann
+<hr noshade size="2">
+
+<ul>
+<li><a href="#1">1. Introduction</a>
+<li><a href="#2">2. Connection</a>
+<li><a href="#3">3. Debugging</a>
+<li><a href="#4">4. How it got this way</a>
+<li><a href="#5">5. WinBoard requires Win32 engines</a>
+<li><a href="#6">6. Hints on input/output</a>
+<li><a href="#7">7. Interrupts</a>
+<li><a href="#8">8. Commands from xboard to the engine</a>
+<li><a href="#9">9. Commands from the engine to xboard</a>
+<li><a href="#10">10. Thinking Output</a>
+<li><a href="#11">11. Time control</a>
+<li><a href="#12">12. Analyze Mode</a>
+<li><a href="#13">13. Idioms and backward compatibility features</a>
+</ul>
+
+<hr noshade size="2">
+
+<h2><a name="1">1. Introduction</a></h2>
+
+<p>
+This document is a set of rough notes on the protocol that xboard and
+WinBoard use to communicate with gnuchessx and other chess engines.
+These notes may be useful if you want to connect a different chess
+engine to xboard. Throughout the notes, "xboard" means both xboard
+and WinBoard except where they are specifically contrasted.
+</p>
+
+<p>
+There are two reasons I can imagine someone wanting to do this:
+</p>
+<ol>
+<li>You have, or are developing, a chess engine but you don't want to
+write your own graphical interface.
+<li>You have, or are developing,a chess engine, and you want to
+interface it to the Internet Chess Server.
+</ol>
+
+<p>
+In case (2), if you are using xboard, you will need to configure the
+"Zippy" code into it, but WinBoard includes this code already. See
+the file <a
+href="http://www.tim-mann.org/xboard/zippy.README">zippy.README</a>
+in the xboard or WinBoard distribution for more information.
+
+</p>
+
+<p>
+These notes are unpolished, but I've attempted to make them complete
+in this release. If you notice any errors, omissions, or misleading
+statements, let me know.
+</p>
+
+<p>
+I'd like to hear from everyone who is trying to interface their own
+chess engine to xboard/WinBoard. Please email me, <a
+href="mailto:[email protected]">[email protected]</a>. Also, please join
+the mailing list for authors of xboard/WinBoard compatible chess
+engines. The list is now hosted by egroups.com; you can join at <a
+href="http://www.egroups.com/group/chess-engines"
+>http://www.egroups.com/group/chess-engines</a>, or you can read the
+list there without joining. The list is filtered to prevent spam.
+</p>
+
+<h2><a name="2">2. Connection</a></h2>
+
+<p>
+An xboard chess engine runs as a separate process from xboard itself,
+connected to xboard through a pair of anonymous pipes. The engine
+does not have to do anything special to set up these pipes. xboard
+sets up the pipes itself and starts the engine with one pipe as its
+standard input and the other as its standard output. The engine then
+reads commands from its standard input and writes responses to its
+standard output. This is, unfortunately, a little more complicated to
+do right than it sounds; see <a href="#6">section 6</a> below.
+</p>
+
+<p>
+And yes, contrary to some people's expectations, exactly the same
+thing is true for WinBoard. Pipes and standard input/output are
+implemented in Win32 and work fine. You don't have to use DDE, COM,
+DLLs, BSOD, or any of the other infinite complexity that
+Microsoft has created just to talk between two programs. A WinBoard
+chess engine is a Win32 console program that simply reads from its
+standard input and writes to its standard output. See sections
+<a href="#5">5</a> and <a href="#6">6</a> below for additional details.
+</p>
+
+<h2><a name="3">3. Debugging</a></h2>
+
+<p>
+To diagnose problems in your engine's interaction with xboard, use the
+-debug flag on xboard's command line to see the messages that are
+being exchanged. In WinBoard, these messages are written to the file
+WinBoard.debug instead of going to the screen.
+</p>
+
+<p>
+You can turn debug mode on or off while WinBoard is running by
+pressing Ctrl+Alt+F12. You can turn debug mode on or off while xboard
+is running by binding DebugProc to a shortcut key (and pressing the
+key!); see the instructions on shortcut keys in the xboard man page.
+</p>
+
+<p>
+While your engine is running under xboard/WinBoard, you can send a
+command directly to the engine by pressing Shift+1 (xboard) or Alt+1
+(WinBoard 4.0.3 and later). This brings up a dialog that you can type
+your command into. Press Shift+2 (Alt+2) instead to send to the
+second chess engine in Two Machines mode. On WinBoard 4.0.2 and earlier,
+Ctrl+Alt is used in place of Alt; this had to be changed due to a conflict
+with typing the @-sign on some European keyboards.
+</p>
+
+<h2><a name="4">4. How it got this way</a></h2>
+
+<p>
+Originally, xboard was just trying to talk to the existing
+command-line interface of gnuchess, designed for people to type
+commands to. So the communication protocol is very ad-hoc. (The
+reason why there is a gnuchessx that's different from gnuchessr is
+buried in the mists of time, before I started working on xboard, but I
+think it was due to someone working around a stupid bug in xboard by
+changing gnuchess instead of fixing the bug. The differences are
+tiny.) It's now tough to change the interface, because xboard and
+gnuchess are separate programs, and I don't want to force people to
+upgrade them together to versions that match.
+</p>
+
+<p>
+Things have changed a bit now that there are many more engines that
+work with xboard. I've had to make the protocol description more
+precise, and I've added some features that GNU Chess does not support.
+In the latest version, I've specified a standard semantics for many
+commands that differs in some details from what GNU Chess provides,
+but is easier to work with. In the future I may release a modified
+GNU Chess that conforms exactly to this protocol.
+</p>
+
+<h2><a name="5">5. WinBoard requires Win32 engines</a></h2>
+
+<p>
+Due to some Microsoft brain damage that I don't understand, WinBoard
+does not work with chess engines that were compiled to use a DOS
+extender for 32-bit addressing. (Probably not with 16-bit DOS or
+Windows programs either.) WinBoard works only with engines that are
+compiled for the Win32 API. You can get a free compiler that targets
+the Win32 API from <a href="http://sourceware.cygnus.com/cygwin/"
+>http://sourceware.cygnus.com/cygwin/</a>. I think DJGPP 2.x should
+also work if you use the RSXNTDJ extension, but I haven't tried it.
+Of course, Microsoft Visual C++ will work. Most likely the other
+commercial products that support Win32 will work too (Borland, etc.),
+but I have not tried them.
+</p>
+
+<h2><a name="6">6. Hints on input/output</a></h2>
+
+<p>
+Beware of using buffered I/O in your chess engine. The C stdio
+library, C++ streams, and the I/O packages in most other languages use
+buffering both on input and output. That means two things. First,
+when your engine tries to write some characters to xboard, the library
+stashes them in an internal buffer and does not actually write them to
+the pipe connected to xboard until either the buffer fills up or you
+call a special library routine asking for it to be flushed. (In C
+stdio, this routine is named <tt>fflush</tt>.) Second, when your engine tries
+to read some characters from xboard, the library does not read just
+the characters you asked for -- it reads all the characters that are
+currently available (up to some limit) and stashes any characters you
+are not yet ready for in an internal buffer. The next time you ask to
+read, you get the characters from the buffer (if any) before the
+library tries to read more data from the actual pipe.
+</p>
+
+<p>
+Why does this cause problems? First, on the output side, remember
+that your engine produces output in small quantities (say, a few
+characters for a move, or a line or two giving the current analysis),
+and that data always needs to be delivered to xboard/WinBoard for
+display immediately. If you use buffered output, the data you print
+will sit in a buffer in your own address space instead of being
+delivered.
+</p>
+
+<p>
+You can usually fix the output buffering problem by asking for the
+buffering to be turned off. In C stdio, you do this by calling
+<tt>setbuf(stdout, NULL)</tt>. A more laborious and error-prone
+method is to carefully call <tt>fflush(stdout)</tt> after every line
+you output; I don't recommend this. In C++, you can try
+<tt>cout.setf(ios::unitbuf)</tt>, which is documented in current
+editions of "The C++ Programming Language," but not older ones.
+Another C++ method that might work is
+<tt>cout.rdbuf()-&gt;setbuf(NULL, 0)</tt>. Alternatively, you can
+carefully call <tt>cout.flush()</tt> after every line you output;
+again, I don't recommend this.
+</p>
+
+<p>
+Another way to fix the problem is to use unbuffered operating system
+calls to write directly to the file descriptor for standard output.
+On Unix, this means <tt>write(1, ...)</tt> -- see the man page for write(2).
+On Win32, you can use either the Unix-like <tt>_write(1, ...)</tt> or Win32
+native routines like <tt>WriteFile</tt>.
+</p>
+
+<p>
+Second, on the input side, you are likely to want to poll during your
+search and stop it if new input has come in. If you implement
+pondering, you'll need this so that pondering stops when the user
+makes a move. You should also poll during normal thinking on your
+move, so that you can implement the "?" (move now) command, and so
+that you can respond promptly to a "result", "force", or "quit"
+command if xboard wants to end the game or terminate your engine.
+Buffered input makes polling more complicated -- when you poll, you
+must stop your search if there are <em>either</em> characters in the buffer
+<em>or</em> characters available from the underlying file descriptor.
+</p>
+
+<p>
+The most direct way to fix this problem is to use unbuffered operating
+system calls to read (and poll) the underlying file descriptor
+directly. On Unix, use <tt>read(0, ...)</tt> to read from standard input, and
+use <tt>select()</tt> to poll it. See the man pages read(2) and select(2).
+(Don't follow the example of GNU Chess and use the FIONREAD ioctl to
+poll for input. It is not very portable; that is, it does not exist
+on all versions of Unix, and is broken on some that do have it.) On
+Win32, you can use either the Unix-like <tt>_read(0, ...)</tt> or the native
+Win32 <tt>ReadFile()</tt> to read. Unfortunately, under Win32, the function to
+use for polling is different depending on whether the input device is
+a pipe, a console, or something else. (More Microsoft brain damage
+here -- did they never hear of device independence?) For pipes, you
+can use <tt>PeekNamedPipe</tt> to poll (even when the pipe is unnamed).
+For consoles,
+you can use <tt>GetNumberOfConsoleInputEvents</tt>. For sockets only, you can
+use <tt>select()</tt>. It might be possible to use
+<tt>WaitForSingleObject</tt> more
+generally, but I have not tried it. Some code to do these things can
+be found in Crafty's utility.c, but I don't guarantee that it's all
+correct or optimal.
+</p>
+
+<p>
+A second way to fix the problem might be to ask your I/O library not
+to buffer on input. It should then be safe to poll the underlying
+file descriptor as descrbed above. With C, you can try calling
+<tt>setbuf(stdin, NULL)</tt>. However, I have never tried this. Also, there
+could be problems if you use <tt>scanf()</tt>, at least with certain patterns,
+because <tt>scanf()</tt> sometimes needs to read one extra character and "push
+it back" into the buffer; hence, there is a one-character pushback
+buffer even if you asked for stdio to be unbuffered. With C++, you
+can try <tt>cin.rdbuf()-&gt;setbuf(NULL, 0)</tt>, but again, I have never tried
+this.
+</p>
+
+<p>
+A third way to fix the problem is to check whether there are
+characters in the buffer whenever you poll. C I/O libraries generally
+do not provide any portable way to do this. Under C++, you can use
+<tt>cin.rdbuf()-&gt;in_avail()</tt>. This method has been reported to
+work with
+EXchess. Remember that if there are no characters in the buffer, you
+still have to poll the underlying file descriptor too, using the
+method descrbed above.
+</p>
+
+<p>
+A fourth way to fix the problem is to use a separate thread to read
+from stdin. This way works well if you are familiar with thread
+programming. This thread can be blocked waiting for input to come in
+at all times, while the main thread of your engine does its thinking.
+When input arrives, you have the thread put the input into a buffer
+and set a flag in a global variable. Your search routine then
+periodically tests the global variable to see if there is input to
+process, and stops if there is. WinBoard and my Win32 ports of ICC
+timestamp and FICS timeseal use threads to handle multiple input
+sources.
+</p>
+
+<h2><a name="7">7. Signals</a></h2>
+
+<p>Engines that run on Unix need to be concerned with two Unix
+signals: <tt>SIGTERM</tt> and <tt>SIGINT</tt>. This applies both to
+engines that run under xboard and (the unusual case of) engines that
+WinBoard remotely runs on a Unix host using the -firstHost or
+-secondHost feature. It does not apply to engines that run on
+Windows, because Windows does not have Unix-style signals.</p>
+
+<p>First, when an engine is sent the "quit" command, it is also given a
+<tt>SIGTERM</tt> signal shortly afterward to make sure it goes away. If your
+engine reliably responds to "quit", and the signal causes problems for
+you, you should ignore it by calling <tt>signal(SIGTERM, SIG_IGN)</tt> at the
+start of your program.</p>
+
+<p>Second,
+xboard will send an interrupt signal (<tt>SIGINT</tt>) at certain times when it
+believes the engine may not be listening to user input (thinking or
+pondering). WinBoard currently does this only when the engine is
+running remotely using the -firstHost or -secondHost feature, not when
+it is running locally. You probably need to know only enough about
+this grungy feature to keep it from getting in your way.
+</p>
+
+<p>
+The <tt>SIGINT</tt>s are basically tailored to the needs of GNU Chess on
+systems where its input polling code is broken or disabled. Because
+they work in a rather peculiar way, it is recommended that you simply
+ignore <tt>SIGINT</tt> when running under Unix in xboard mode. You can do this
+by having your engine call <tt>signal(SIGINT, SIG_IGN)</tt>. Alternatively,
+you can configure your personal copy of xboard to not send <tt>SIGINT</tt> by
+running configure with the --disable-sigint option. This won't help
+you if you give your engine to other people who don't want to
+recompile their xboard and possibly break its interaction with GNU
+Chess.
+</p>
+
+<p>
+Here are details for the curious. If xboard needs to send a command
+when it is the chess engine's move (such as before the "?" command),
+it sends a <tt>SIGINT</tt> first. If xboard needs to send commands when it is
+not the chess engine's move, but the chess engine may be pondering
+(thinking on its opponent's time) or analyzing (analysis or analyze
+file mode), xboard sends a <tt>SIGINT</tt> before the first such command only.
+Another <tt>SIGINT</tt> is not sent until another move is made, even if xboard
+issues more commands. This behavior is necessary for GNU Chess. The
+first <tt>SIGINT</tt> stops it from pondering until the next move, but on some
+systems, GNU Chess will die if it receives a <tt>SIGINT</tt> when not actually
+thinking or pondering.
+</p>
+
+<p>
+There are two reasons why WinBoard does not send the Win32 equivalent
+of <tt>SIGINT</tt> (which is called <tt>CTRL_C_EVENT</tt>) to local engines. First, the
+Win32 GNU Chess port does not need it. Second, I could not find a way
+to get it to work. Win32 seems to be designed under the assumption
+that only console applications, not windowed applications, would ever
+want to send a <tt>CTRL_C_EVENT</tt>. (More Microsoft brain damage.)
+</p>
+
+<h2><a name="8">8. Commands from xboard to the engine</a></h2>
+
+<p>
+All commands from xboard to the engine end with a newline (\n), even
+where that is not explicitly stated. All your output to xboard must
+be in complete lines; any form of prompt or partial line will cause
+problems.
+</p>
+
+<p>
+At the beginning of each game, xboard sends an initialization string.
+This is currently "new\nrandom\n" unless the user changes it with the
+initString or secondInitString option.
+</p>
+
+<p>
+xboard normally reuses the same chess engine process for multiple
+games. At the end of a game, xboard will send the
+"force" command (see
+below) to make sure your engine stops thinking about the current
+position. It will later send the initString again to start a new
+game. If your engine can't play multiple games, give xboard the
+-xreuse (or -xreuse2) command line option to disable reuse. xboard
+will then ask the process to quit after each game and start a new
+process for the next game.
+</p>
+
+<dl>
+<dt><strong>xboard</strong>
+<dd>This command will be sent once immediately after your engine
+process is started. You can use it to put your engine into "xboard
+mode" if that is needed. If your engine prints a prompt to ask for
+user input, you must turn off the prompt and output a newline when the
+"xboard" command comes in.
+<p>
+
+<dt><strong>new</strong>
+<dd>Reset the board to the standard chess starting position. Set
+White on move. Leave force mode and set the engine to play Black.
+Associate the engine's clock with Black and the opponent's clock with
+White. Reset clocks and time controls to the start of a new game.
+Stop clocks. Do not ponder on this move, even if pondering is on.
+Remove any search depth limit previously set by the sd command.
+<p>
+
+<dt><strong>variant VARNAME</strong>
+<dd>If the game is not standard chess, but a variant, this command is
+sent after "new" and before the first move or "edit" command. Currently
+defined variant names are:
+
+<table>
+<tr align="left"><th>wildcastle<td>Shuffle chess where king can castle from d file
+<tr align="left"><th>nocastle<td>Shuffle chess with no castling at all
+<tr align="left"><th>fischerandom<td>FischeRandom (not supported yet)
+<tr align="left"><th>bughouse<td>Bughouse, ICC/FICS rules
+<tr align="left"><th>crazyhouse<td>Crazyhouse, ICC/FICS rules
+<tr align="left"><th>losers<td>Win by losing all pieces or getting mated (ICC)
+<tr align="left"><th>suicide<td>Win by losing all pieces including king (FICS)
+<tr align="left"><th>twokings<td>Weird ICC wild 9
+<tr align="left"><th>kriegspiel<td>Kriegspiel (not really supported)
+<tr align="left"><th>atomic<td>Atomic (not really supported)
+<tr align="left"><th>3check<td>Win by giving check 3 times (not supported)
+<tr align="left"><th>unknown<td>Unknown variant (not supported)
+</table>
+<p>
+
+<dt><strong>quit</strong>
+<dd>The chess engine should immediately exit. This command is used
+when xboard is itself exiting, and also between games if the -xreuse
+command line option is given (or -xreuse2 for the second engine).
+See also <a href="#7">Signals</a> above.
+<p>
+
+<dt><strong>random</strong>
+<dd>This command is specific to GNU Chess. You can either ignore it
+completely (that is, treat it as a no-op) or implement it as GNU Chess
+does. The command toggles "random" mode (that is, it sets random =
+!random). In random mode, the engine adds a small random value to its
+evaluation function to vary its play. The "new" command sets random
+mode off.
+<p>
+
+<dt><strong>force</strong>
+<dd>Set the engine to play neither color ("force mode"). Stop clocks.
+The engine should check that moves received in force mode are legal
+and made in the proper turn, but should not think, ponder, or make
+moves of its own.
+<p>
+
+<dt><strong>white</strong>
+<dd>Set White on move. Set the engine to play Black. Stop clocks.
+<p>
+
+<dt><strong>black</strong>
+<dd>Set Black on move. Set the engine to play White. Stop clocks.
+<p>
+
+<dt><strong>level MPS BASE INC</strong>
+<dd>Set time controls. See the <a href="#11">Time Control</a> section below.
+<p>
+
+<dt><strong>st TIME</strong>
+<dd>Set time controls. See the <a href="#11">Time Control</a> section
+below. The commands "level" and "st" are not used together.
+<p>
+
+<dt><strong>sd DEPTH</strong>
+<dd>The engine should limit its thinking to DEPTH ply.
+<p>
+
+<dt><strong>time N</strong>
+<dd>Set a clock that always belongs to the engine. N is a number in
+ centiseconds (units of 1/100 second). Even if the engine changes to
+ playing the opposite color, this clock remains with the engine.
+<p>
+
+<dt><strong>otim N</strong>
+
+<dd>Set a clock that always belongs to the opponent. N is a number in
+centiseconds (units of 1/100 second). Even if the opponent changes to
+playing the opposite color, this clock remains with the opponent.
+<p>
+If needed for purposes of board display in force mode (where the
+engine is not participating in the game) the time clock should be
+associated with the last color that the engine was set to play, the
+otim clock with the opposite color.
+</p>
+
+<p>
+If you can't handle the time and otim commands, you can ignore them
+(that is, treat them as no-ops); or better, send back "Error (unknown
+command): time" the first time you see "time", and xboard will realize
+you don't implement the command.
+</p>
+
+<dt><strong>go</strong>
+
+<dd>Leave force mode and set the engine to play the color that is on
+move. Associate the engine's clock with the color that is on move,
+the opponent's clock with the opposite color. Start the engine's
+clock. Start thinking and eventually make a move.
+<p>
+
+<dt><strong>MOVE</strong>
+<dd>See below for the syntax of moves. If the move is illegal, print
+an error message; see the section "<a href="#9">Commands from the engine to
+xboard</a>". If the move is legal and in turn, make it. If not in force
+mode, stop the opponent's clock, start the engine's clock, start
+thinking, and eventually make a move.
+<p>
+When xboard sends your engine a move, it always sends coordinate
+algebraic notation. There is no command name; the notation is just
+sent as a line by itself. Examples:
+<p>
+<table>
+<tr align="left"><td>Normal moves:<td>e2e4
+<tr align="left"><td>Pawn promotion:<td>e7e8q
+<tr align="left"><td>Castling:<td>e1g1, e1c1, e8g8, e8c8
+<tr align="left"><td>Bughouse drop:<td>P@h3
+<tr align="left"><td>ICS Wild 0/1 castling:<td>d1f1, d1b1, d8f8, d8b8
+<tr align="left"><td>FischerRandom castling:<td>o-o, o-o-o (future)
+</table>
+
+<p>
+If your engine can't handle this kind of output, change the routine
+SendMoveToProgram in backend.c to send the kind of notation you need.
+If you define SAN_TO_PROGRAM, your engine will be sent Standard
+Algebraic Notation (as defined by the PGN standard); for example, e4,
+Nf3, exd5, Bxf7+, Qxf7#, e8=Q, O-O, or P@h3. (The P@h3 notation is a
+nonstandard extension to SAN.) In the future, I may make
+SAN_TO_PROGRAM a runtime option if there is demand for it.
+</p>
+
+<p>
+xboard doesn't reliably detect illegal moves, because it does not keep
+track of castling unavailablity due to king or rook moves, or en
+passant availability. If xboard sends an illegal move, send back an
+error message so that xboard can retract it and inform the user; see
+the section "<a href="#9">Commands from the engine to xboard</a>".
+</p>
+
+<dt><strong>?</strong>
+<dd>Move now. If your engine is thinking, it should move immediately;
+ otherwise, the command should be ignored (treated as a no-op). It
+ is permissible for your engine to always ignore the ? command. The
+ only bad consequence is that xboard's Move Now menu command will do
+ nothing.
+<p>
+It is also permissible for your engine to move immediately if it gets
+any command while thinking, as long as it processes the command right
+after moving, but it's preferable if you don't do this. For example,
+xboard may send post, nopost, easy, hard, force, or quit while the
+engine is on move.
+</p>
+
+<dt><strong>draw</strong>
+<dd>The engine's opponent offers the engine a draw. To accept the
+draw, send "offer draw". To decline, ignore the offer (that is, send
+nothing). If you're playing on ICS, it's possible for the draw offer
+to have been withdrawn by the time you accept it, so don't assume the
+game is over because you accept a draw offer. Continue playing until
+xboard tells you the game is over. See also "offer draw" below.
+<p>
+
+<dt><strong>result RESULT {COMMENT}</strong>
+<dd>After the end of each game, xboard will send you a result command.
+You can use this command to trigger learning. RESULT is either 1-0,
+0-1, 1/2-1/2, or *, indicating whether white won, black won, the game
+was a draw, or the game was unfinished. The COMMENT string is purely
+a human-readable comment; its content is unspecified and subject to
+change. In ICS mode, it is passed through from ICS uninterpreted.
+Example: <pre>result 1-0 {White mates}</pre>
+<p>
+Here are some notes on interpreting the "result" command. Some apply
+only to playing on ICS ("Zippy" mode).
+</p>
+
+<p>
+If you won but did not just play a mate, your opponent must have
+resigned or forfeited. If you lost but were not just mated, you
+probably forfeited on time, or perhaps the operator resigned manually.
+If there was a draw for some nonobvious reason, perhaps your opponent
+called your flag when he had insufficient mating material (or vice
+versa), or perhaps the operator agreed to a draw manually.
+</p>
+
+<p>
+You will get a result command even if you already know the game ended
+-- for example, after you just checkmated your opponent. In fact, if
+you send the "RESULT {COMMENT}" command (discussed below), you will
+simply get the same thing fed back to you with "result" tacked in
+front. You might not always get a "result *" command, however. In
+particular, you won't get one in local chess engine mode when the user
+stops playing by selecting Reset, Edit Game, Exit or the like.
+</p>
+
+<dt><strong>edit</strong>
+<dd>The edit command puts the chess engine into a special mode, where
+it accepts the following subcommands:
+<table>
+<tr align="left"><th>c<td>change current piece color, initially white
+<tr align="left"><th>Pa4 (for example)<td>place pawn of current color on a4
+<tr align="left"><th>xa4 (for example)<td>empty the square a4 (not used by xboard)
+<tr align="left"><th>#<td>clear board
+<tr align="left"><th>.<td>leave edit mode
+</table>
+
+<p>The edit command does not change the side to move. To set up a
+black-on-move position, xboard uses the following command sequence:
+</p>
+<pre>
+ new
+ force
+ a2a3
+ edit
+ &lt;edit commands&gt;
+ .
+</pre>
+
+<p>
+This sequence is used for compatibility with engines that do not
+interpret the "black" command according to the specification above;
+see "<a href="#13">Idioms</a>" below.
+</p>
+
+<p>
+After an edit command is complete, if a king and a rook are on their
+home squares, castling is assumed to be available to them. En passant
+capture is assumed to be illegal on the current move regardless of the
+positions of the pawns. The clock for the 50 move rule starts at
+zero, and for purposes of the draw by repetition rule, no prior
+positions are deemed to have occurred.
+</p>
+
+<dt><strong>hint</strong>
+<dd>If the user asks for a hint, xboard sends your engine the command
+"hint". Your engine should respond with "Hint: xxx", where xxx is a
+suggested move. If there is no move to suggest, you can ignore the
+hint command (that is, treat it as a no-op).
+<p>
+
+<dt><strong>bk</strong>
+<dd>If the user selects "Book" from the xboard menu, xboard will send
+your engine the command "bk". You can send any text you like as the
+response, as long as each line begins with a blank space or tab (\t)
+character, and you send an empty line at the end. The text pops up in
+a modal information dialog.
+<p>
+
+<dt><strong>undo</strong>
+<dd>If the user asks to back up one move, xboard will send you the
+"undo" command. xboard will not send this command without putting you
+in "force" mode first, so you don't have to worry about what should
+happen if the user asks to undo a move your engine made. (GNU Chess
+actually switches to playing the opposite color in this case.)
+<p>
+
+<dt><strong>remove</strong>
+<dd>If the user asks to retract a move, xboard will send you the
+"remove" command. It sends this command only when the user is on
+move. Your engine should undo the last two moves (one for each
+player) and continue playing the same color.
+<p>
+
+<dt><strong>hard</strong>
+<dd>Turn on pondering (thinking on the opponent's time, also known as
+"permanent brain"). xboard will not make any assumption about what
+your default is for pondering or whether "new" affects this setting.
+<p>
+
+<dt><strong>easy</strong>
+<dd>Turn off pondering.
+<p>
+
+<dt><strong>post</strong>
+<dd>Turn on thinking/pondering output.
+See <a href="#10">Thinking Output</a> section.
+<p>
+
+<dt><strong>nopost</strong>
+<dd>Turn off thinking/pondering output.
+<p>
+
+<dt><strong>analyze</strong>
+<dd>Enter analyze mode. See <a href="#12">Analyze Mode</a> section.
+</dl>
+
+<h3>Here are some special commands for Zippy mode:</h3>
+
+<dl>
+<dt><strong>name X</strong>
+<dd>In ICS mode, xboard obtains the name of its opponent from ICS when
+a game starts and saves it for use in the PGN tags. In Zippy mode, it
+also passes the opponent's name on to the chess engine with the name
+command. Example: <pre>name mann</pre>
+
+<dt><strong>rating</strong>
+<dd>In ICS mode, xboard obtains the ICS opponent's rating from the
+"Creating:" message that appears before each game. (This message may
+not appear on servers using outdated versions of the FICS code.) In
+Zippy mode, it sends these ratings on to the chess engine using the
+"rating" command. The chess engine's own rating comes first, and if
+either opponent is not rated, his rating is given as 0. Example:
+<pre>rating 2600 1500</pre>
+
+<dt><strong>computer</strong>
+<dd>The opponent is on the ICS computer list.
+</dl>
+
+<h3>Bughouse commands:</h3>
+
+<p>
+xboard now supports bughouse engines when in Zippy mode. See
+<a href="http://www.tim-mann.org/xboard/zippy.README"
+>zippy.README</a> for information on Zippy mode and how to turn on the
+bughouse support. The bughouse move format is given above. xboard
+sends the following additional commands to the engine when in bughouse
+mode. Commands to inform your engine of the partner's game state may
+be added in the future.
+</p>
+
+<dl>
+<dt><strong>partner &lt;player&gt;</strong>
+<dd>&lt;player&gt; is now your partner for future games. Example: <pre>partner mann</pre>
+<p>
+
+<dt><strong>partner</strong>
+<dd>Meaning: You no longer have a partner.
+<p>
+
+<dt><strong>ptell &lt;text&gt;</strong>
+<dd>Your partner told you &lt;text&gt;, either with a ptell or an ordinary tell.
+<p>
+
+<dt><strong>holding [&lt;white&gt;] [&lt;black&gt;]</strong>
+<dd>White currently holds &lt;white&gt;; black currently holds &lt;black&gt;.
+ Example: <pre>holding [PPPRQ] []</pre>
+
+<dt><strong>holding [&lt;white&gt;] [&lt;black&gt;] &lt;color&gt;&lt;piece&gt;</strong>
+<dd>White currently holds &lt;white&gt;; black currently holds &lt;black&gt;, after
+ &lt;color&gt; acquired &lt;piece&gt;. Example: <pre>holding [PPPRQ] [R] BR</pre>
+</dl>
+
+<h2><a name="9">9. Commands from the engine to xboard</a></h2>
+
+<dl>
+<dt><strong>Illegal move: MOVE</strong>
+<dt><strong>Illegal move (REASON): MOVE</strong>
+<dd>If your engine receives a MOVE command that is recognizably a move
+but is not legal in the current position, your engine must print an
+error message in one of the above formats so that xboard can pass the
+error on to the user and retract the move. The (REASON) is entirely
+optional. Examples:
+
+<pre>
+ Illegal move: e2e4
+ Illegal move (in check): Nf3
+ Illegal move (moving into check): e1g1
+</pre>
+<p>
+Generally, xboard will never send an ambiguous move, so it does not
+matter whether you respond to such a move with an Illegal move message
+or an Error message.
+</p>
+
+<dt><strong>Error (ERRORTYPE): COMMAND</strong>
+<dd>If your engine receives a command it does not understand or does
+not implement, it should print an error message in the above format so
+that xboard can parse it. Examples:
+<pre>
+ Error (ambiguous move): Nf3
+ Error (unknown command): analyze
+ Error (command not legal now): undo
+ Error (too many parameters): level 1 2 3 4 5 6 7
+</pre>
+
+<p>
+Note: versions of xboard prior to 3.6.11beta do not parse the "Error"
+format. To ease the transition, it is acceptable to use the "Illegal
+move" format for all errors, even if the command given was not a
+move.
+</p>
+
+<dt><strong>move MOVE</strong>
+<dd>Your engine is making the move MOVE. Do not echo moves from
+ xboard with this command; send only new moves made by the engine.
+
+<p>
+Note: versions of xboard prior to 3.6.11beta do not parse the above
+format, so you may want to use the old "NUMBER ... MOVE" format
+temporarily. See the section "<a href="#13">Idioms and backward
+compatibility features</a>" below.
+</p>
+
+<p>
+For the actual move text from your chess engine (in place of MOVE
+above), xboard will accept any kind of unambiguous algebraic format,
+including coordinate notation, SAN, and some slight variants of SAN.
+You don't have to send the pure coordinate notation that xboard sends
+to your engine; xboard parses the output with its general-purpose
+move parser, which was built to extract human-typed game scores from
+netnews messages. For example, the following will all work:
+</p>
+<pre>
+ e2e4
+ e4
+ Nf3
+ ed
+ exd
+ exd5
+ Nxd5
+ Nfd3
+ e8q
+ e8Q
+ e8=q
+ e8(Q)
+ e7e8q
+ o-o
+ O-O
+ 0-0
+</pre>
+
+<p>
+and many more.
+</p>
+
+<dt><strong>RESULT {COMMENT}</strong>
+<dd>When your engine detects that the game has ended by rule
+(checkmate, stalemate, triple repetition, the 50 move rule, or
+insufficient material), your engine must output a line of the form
+"RESULT {comment}" (without the quotes), where RESULT is a PGN result
+code (1-0, 0-1, or 1/2-1/2), and comment is the reason. Examples:
+<pre>
+ 0-1 {Black mates}
+ 1-0 {White mates}
+ 1/2-1/2 {Draw by repetition}
+ 1/2-1/2 {Stalemate}
+</pre>
+
+<p>
+xboard relays the result to the user, the ICS, the other engine in Two
+Machines mode, and the PGN save file as required.
+</p>
+
+<dt><strong>resign</strong>
+<dd>If your engine wants to resign, it can send the command "resign".
+Alternatively, it can use the "RESULT {comment}" command if the string
+"resign" is included in the comment; for example "0-1 {White
+resigns}". xboard relays the resignation to the user, the ICS, the
+other engine in Two Machines mode, and the PGN save file as required.
+<p>
+
+<dt><strong>offer draw</strong>
+<dd>If your engine wants to offer a draw by agreement (as opposed to
+claiming a draw by rule), it can send the command "offer draw".
+xboard relays the offer to the user, the ICS, the other engine in Two
+Machines mode, and the PGN save file as required. In Machine White,
+Machine Black, or Two Machines mode, the offer is considered valid
+until your engine has made two more moves.
+<p>
+
+<dt><strong>telluser MESSAGE</strong>
+<dd>xboard pops up a modal information dialog containing the message.
+MESSAGE consists of any characters, including whitespace, to the end
+of the line.
+<p>
+
+<dt><strong>tellusererror MESSAGE</strong>
+<dd>xboard pops up a non-modal error dialog containing the message.
+MESSAGE consists of any characters, including whitespace, to the end
+of the line.
+<p>
+
+<dt><strong>askuser REPTAG MESSAGE</strong>
+<dd>Here REPTAG is a string containing no whitespace, and MESSAGE
+consists of any characters, including whitespace, to the end of the
+line. xboard pops up a modal question dialog that says MESSAGE and
+has a typein box. If the user types in "bar", xboard sends "REPTAG
+bar" to the engine. The user can cancel the dialog and send nothing.
+<p>
+
+<dt><strong>tellics MESSAGE</strong>
+<dd>In Zippy mode, xboard sends "MESSAGE\n" to ICS. MESSAGE consists
+of any characters, including whitespace, to the end of the line.
+
+</dl>
+
+<h2><a name="10">10. Thinking Output</a></h2>
+
+<p>
+If the user asks your engine to "show thinking", xboard sends your
+engine the "post" command. It sends "nopost" to turn thinking off.
+In post mode, your engine sends output lines to show the progress of
+its thinking. The engine can send as many or few of these lines as it
+wants to, whenever it wants to. Typically they would be sent when the
+PV (principal variation) changes or the depth changes. The thinking
+output should be in the following format:
+</p>
+
+<pre>ply score time nodes pv</pre>
+
+Where:
+<table>
+<tr align="left"><th>ply<td>Integer giving current search depth.
+<tr align="left"><th>score<td>Integer giving current evaluation in centipawns.
+<tr align="left"><th>time<td>Current search time in centiseconds (ex:
+1028 = 10.28 seconds).
+
+<tr align="left"><th>nodes<td>Nodes searched.
+<tr align="left"><th>pv<td>Freeform text giving current "best" line.
+You can continue the pv onto another line if you start each
+continuation line with at least four space characters.
+</table>
+
+<p>
+Example:
+</p>
+
+<pre> 9 156 1084 48000 Nf3 Nc6 Nc3 Nf6</pre>
+
+<p>
+Meaning:
+</p>
+
+9 ply, score=1.56, time = 10.84 seconds, nodes=48000,
+PV = "Nf3 Nc6 Nc3 Nf6"
+
+<p>
+Longer example from actual Crafty output:
+</p>
+<pre>
+ 4 109 14 1435 1. e4 d5 2. Qf3 dxe4 3. Qxe4 Nc6
+ 4 116 23 2252 1. Nf3 Nc6 2. e4 e6
+ 4 116 27 2589 1. Nf3 Nc6 2. e4 e6
+ 5 141 44 4539 1. Nf3 Nc6 2. O-O e5 3. e4
+ 5 141 54 5568 1. Nf3 Nc6 2. O-O e5 3. e4
+</pre>
+
+<p>
+You can use the PV to show other things; for instance, while in book,
+Crafty shows the observed frequency of different reply moves in its
+book. In situations like this where your engine is not really
+searching, start the PV with a '(' character:
+</p>
+
+<pre>
+ 0 0 0 0 (e4 64%, d4 24%)
+</pre>
+
+<p>
+GNU Chess output is very slightly different. The ply number is
+followed by an extra nonblank character, and the time is in seconds,
+not hundredths of seconds. For compatibility, xboard accepts the
+extra character and takes it as a flag indicating the different time
+units. Example:
+</p>
+
+<pre>
+ 2. 14 0 38 d1d2 e8e7
+ 3+ 78 0 65 d1d2 e8e7 d2d3
+ 3& 14 0 89 d1d2 e8e7 d2d3
+ 3& 76 0 191 d1e2 e8e7 e2e3
+ 3. 76 0 215 d1e2 e8e7 e2e3
+ 4& 15 0 366 d1e2 e8e7 e2e3 e7e6
+ 4. 15 0 515 d1e2 e8e7 e2e3 e7e6
+ 5+ 74 0 702 d1e2 f7f5 e2e3 e8e7 e3f4
+ 5& 71 0 1085 d1e2 e8e7 e2e3 e7e6 e3f4
+ 5. 71 0 1669 d1e2 e8e7 e2e3 e7e6 e3f4
+ 6& 48 0 3035 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4
+ 6. 48 0 3720 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4
+ 7& 48 0 6381 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4
+ 7. 48 0 10056 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4
+ 8& 66 1 20536 d1e2 e8e7 e2e3 e7e6 e3d4 g7g5 a2a4 f7f5
+ 8. 66 1 24387 d1e2 e8e7 e2e3 e7e6 e3d4 g7g5 a2a4 f7f5
+ 9& 62 2 38886 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 a2a4 h5h4
+ d4e4
+ 9. 62 4 72578 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 a2a4 h5h4
+ d4e4
+10& 34 7 135944 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 c2c4 h5h4
+ d4e4 f7f5 e4f4
+10. 34 9 173474 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 c2c4 h5h4
+ d4e4 f7f5 e4f4
+</pre>
+
+<p>If your engine is pondering (thinking on its opponent's time) in post
+mode, it can show its thinking then too. In this case your engine may
+omit the hint move (the move it is assuming its opponent will make)
+from the thinking lines <em>if and only if</em> it sends xboard the move in
+the usual "Hint: xxx" format before sending the first line.
+</p>
+
+<h2><a name="11">11. Time control</a></h2>
+
+<p>
+xboard supports three styles of time control: conventional chess clocks,
+the ICS-style incremental clock, and an exact number of seconds per move.
+</p>
+
+<p>In conventional clock mode, every time control period is the same.
+That is, if the time control is 40 moves in 5 minutes, then after each
+side has made 40 moves, they each get an additional 5 minutes, and so
+on, ad infinitum. At some future time it would be nice to support a
+series of distinct time controls. This is very low on my personal
+priority list, but code donations to the xboard project are accepted,
+so feel free to take a swing at it. I suggest you talk to me first,
+though.
+</p>
+
+<p>
+The command to set a conventional time control looks like this:
+</p>
+
+<pre>
+ level 40 5 0
+ level 40 0:30 0
+</pre>
+
+<p>
+The 40 means that there are 40 moves per time control. The 5 means
+there are 5 minutes in the control. In the second example, the 0:30
+means there are 30 seconds. The final 0 means that we are in
+conventional clock mode.
+</p>
+
+<p>
+The command to set an incremental time control looks like this:
+</p>
+
+<pre>
+ level 0 2 12
+</pre>
+
+<p>
+Here the 0 means "play the whole game in this time control period",
+the 2 means "base=2 minutes", and the 12 means "inc=12 seconds". As
+in conventional clock mode, the second argument to level can be in
+minutes and seconds.
+</p>
+
+<p>
+At the start of the game, each player's clock is set to base minutes.
+Immediately after a player makes a move, inc seconds are added to his
+clock. A player's clock counts down while it is his turn. Your flag
+can be called whenever your clock is zero or negative. (Your clock
+can go negative and then become positive again because of the
+increment.)
+</p>
+
+<p>
+A special ICS rule: if you ask for a game with base=0, the clocks
+really start at 10 seconds instead of 0. xboard itself does not know
+about this rule currently, so it may pass the 0 on to the engine
+instead of changing it to 0:10.
+</p>
+
+<p>
+ICS also has time odds games. With time odds, each player has his own
+(base, inc) pair, but otherwise things work the same as in normal
+games. The Zippy xboard accepts time odds games but ignores the fact
+that the opponent's parameters are different; this is perhaps not
+quite the right thing to do, but gnuchess doesn't understand time
+odds. Time odds games are always unrated.
+</p>
+
+<p>The command to set an exact number of seconds per move looks like this:
+</p>
+
+<pre>
+ st 30
+</pre>
+
+<p>
+This means that each move must be made in 30 seconds. Time not used
+on one move does not accumulate for use on later moves.
+</p>
+
+<h2><a name="12">12. Analyze Mode</a></h2>
+
+<p>xboard supports analyzing fresh games, edited positions, and games
+from files. However, all of these look the same from the chess
+engine's perspective. Basically, the engine just has to respond to the
+"analyze" command. If your engine does not support analyze mode, it
+should print the error message "Error (unknown command): analyze" in
+response to the "analyze" command.
+</p>
+
+<p>
+To enter analyze mode, xboard sends the command sequence "post",
+"white" or "black", "analyze". Analyze mode in your engine should be
+similar to force mode, except that your engine thinks about what move
+it would make next if it were on move. Your engine should accept the
+following commands while in analyze mode:
+</p>
+
+<ul>
+<li>Any legal move, as in force mode
+<li>"undo"
+<li>"new" (reset position to start of game but stay in analyze mode)
+<li>"edit" (exiting edit mode returns to analyze mode)
+<li>"exit" (leave analyze mode)
+<li>"." (optional, see below)
+</ul>
+
+<p>
+If the user selects "Periodic Updates", xboard will send the string
+".\n" to the chess engine periodically during analyze mode, unless the
+last PV received began with a '(' character.
+</p>
+
+<p>
+The chess engine should respond to ".\n" with a line like this:
+</p>
+
+<pre>
+stat01: time nodes ply mvleft mvtot
+</pre>
+
+Where:
+<table>
+<tr align="left"><th>time<td>Elapsed search time in centiseconds (ie: 567 = 5.67 seconds).
+<tr align="left"><th>nodes<td>Nodes searched so far.
+<tr align="left"><th>ply<td>Search depth so far.
+<tr align="left"><th>mvleft<td>Number of moves left to consider at this depth.
+<tr align="left"><th>mvtot<td>Total number of moves to consider.
+</table>
+
+<p>
+Example:
+</p>
+<pre>
+ stat01: 1234 30000 7 5 30
+</pre>
+
+<p>
+Meaning:
+</p>
+
+<p>After 12.34 seconds, I've searched 7 ply/30000 nodes, there are a
+ total of 30 legal moves, and I have 5 more moves to search
+ before going to depth 8.</p>
+
+<p>
+Implementation of the "." command is OPTIONAL. If the engine does not
+respond to the "." command with a "stat01..." line, xboard will stop
+sending "." commands. If the engine does not implement this command,
+the analysis window will use a shortened format to display the engine
+info.
+</p>
+
+<p>
+To give the user some extra information, the chess engine can output
+the strings "++\n" and "--\n", to indicate that the current search is
+failing high or low, respectively. You don't have to send anything
+else to say "Okay, I'm not failing high/low anymore." xboard will
+figure this out itself.
+</p>
+
+<h2><a name="13">13. Idioms and backward compatibility features</a></h2>
+
+<p>
+Some engines have variant interpretations of the force/go/white/black,
+time/otim, and hard/easy command sets. New engines should not use
+these interpretations, but in order to accommodate existing engines,
+xboard is currently very conservative about how it uses these
+commands. Only the following idioms are currently used.
+</p>
+
+<dl>
+
+<dt><strong>white</strong>
+<dt><strong>go</strong>
+<dd>Sent when the engine is in force mode or playing Black but should
+switch to playing White. This sequence is sent only when White is
+already on move.
+<p>
+
+<dt><strong>black</strong>
+<dt><strong>go</strong>
+<dd>Sent when the engine is in force mode or playing White but should
+switch to playing Black. This sequence is sent only when Black is
+already on move.
+<p>
+
+<dt><strong>time N</strong>
+<dt><strong>otim N</strong>
+<dt><strong>MOVE</strong>
+<dd>Sent when the opponent makes a move and the engine is already
+playing the opposite color.
+<p>
+
+<dt><strong>white</strong>
+<dt><strong>time N</strong>
+<dt><strong>otim N</strong>
+<dt><strong>black</strong>
+<dt><strong>go</strong>
+<dd>Sent when Black is on move, the engine is in force mode or playing
+White, and the engine's clock needs to be updated before it starts
+playing. The initial "white" is a kludge to accommodate GNU Chess
+4.0.77's variant interpretation of these commands. It may be removed
+in the future, especially if it causes problems for other engines.
+<p>
+
+<dt><strong>black</strong>
+<dt><strong>time N</strong>
+<dt><strong>otim N</strong>
+<dt><strong>white</strong>
+<dt><strong>go</strong>
+<dd>Sent when White is on move, the engine is in force mode or playing
+Black, and the engine's clock needs to be updated before it starts
+playing. See previous idiom.
+<p>
+
+<dt><strong>hard</strong>
+<dt><strong>easy</strong>
+<dd>Sent in sequence to turn off pondering if xboard is not sure
+whether it is on. When xboard is sure, it will send "hard" or "easy"
+alone. xboard does this because "easy" is a toggle in GNU Chess but
+"hard" is an absolute on.
+
+</dl>
+
+<p>
+To support older engines, certain additional commands from the engine
+to xboard are also recognized. (These are commands by themselves, not
+values to be placed in the comment field of the PGN result code.)
+These forms are not recommended for new engines; use the PGN result
+code commands or the resign command instead:
+</p>
+
+<table>
+<tr align="left"><th>Command <th>Interpreted as
+<tr align="left"><td>White resigns <td>0-1 {White resigns}
+<tr align="left"><td>Black resigns <td>1-0 {Black resigns}
+<tr align="left"><td>White <td>1-0 {White mates}
+<tr align="left"><td>Black <td>0-1 {Black mates}
+<tr align="left"><td>Draw <td>1/2-1/2 {Draw}
+<tr align="left"><td>computer mates <td>1-0 {White mates} or 0-1 {Black mates}
+<tr align="left"><td>opponent mates <td>1-0 {White mates} or 0-1 {Black mates}
+<tr align="left"><td>computer resigns <td>0-1 {White resigns} or 1-0 {Black resigns}
+<tr align="left"><td>game is a draw <td>1/2-1/2 {Draw}
+<tr align="left"><td>checkmate <td>1-0 {White mates} or 0-1 {Black mates}
+</table>
+
+<p>
+Commands in the above table are recognized if they begin a line and
+arbitrary characters follow, so (for example) "White mates" will be
+recognized as "White", and "game is a draw by the 50 move rule" will
+be recognized as "game is a draw". All the commands are
+case-sensitive.
+</p>
+
+<p>
+An alternative move syntax is also recognized:
+</p>
+
+<table>
+<tr align="left"><th>Command <th>Interpreted as
+<tr align="left"><td>NUMBER ... MOVE <td>move MOVE
+</table>
+
+<p>
+Here NUMBER means any string of decimal digits, optionally ending in a
+period. MOVE is any string containing no whitespace. In this command
+format, xboard requires the "..." even if your engine is playing
+White. A command of the form NUMBER MOVE will be ignored. This odd
+treatment of the commands is needed for compatibility with gnuchessx.
+The original reasons for it are lost in the mists of time, but I
+suspect it was originally a bug in the earliest versions of xboard,
+before I started working on it, which someone "fixed" in the wrong
+way, by creating a special version of gnuchess (gnuchessx) instead of
+changing xboard.
+</p>
+
+<p>
+Any line that contains the words "offer" and "draw" is recognized as
+"offer draw".
+</p>
+
+<p>
+The "Illegal move" message is recognized even if spelled "illegal
+move" and even if the colon (":") is omitted. This accommodates GNU
+Chess 4.0.77, which prints messages like "Illegal move (no matching
+move)e2e4", and old versions of Crafty, which print just "illegal move".
+</p>
+
+<p>
+In Zippy mode, for compatibility with existing versions of Crafty,
+xboard passes through to ICS any line that begins "kibitz", "whisper",
+"tell", or "draw". Do not use this feature in new code.
+</p>
+
+<p>
+Before the "sd DEPTH" command, xboard also sends the command
+"depth\nDEPTH", for the benefit of GNU Chess. Note the newline in the
+middle of this command. Ugh.
+</p>
+
+<p>
+For the benefit of GNU Chess, if an "st TIME"-style time control is
+being used, TIME is also given to the engine as a command-line
+argument when it is started. Ugh.
+</p>
+
+<hr noshade size="2">
+<address>converted to HTML by <a href="http://www.jakob.at/steffen/">Steffen A. Jakob</a></address>
+</body>
+</html>