C * THIS PROGRAM MODIFIED TO RUN ON HP3000 AND CONTRIBUTED * C * BY MEL BAILEY, HP-RICHARDSON,TEXAS.... THIS VERSION USES * C * ALL DOUBLE INTEGERS AND IS EXTREMELY INEFFICIENT.... * C * * C * * C *************************************************************** C * C * ***** * *** ***** ***** *** * * C * * * * * * * * * * C * * * * * * * * * * C * ***** * * * * * * * C * * * * * * * * * * C * * * * * * * * * * C * ***** ***** *** * ***** *** * C * C *************************************************************** C * C * BLITZ IV IS THE FOURTH MAJOR VERSION OF A CHESS C * PLAYING PROGRAM WRITTEN AT THE UNIVERSITY OF SOUTHERN C * MISSISSIPPI BY ROBERT HYATT. IT USES SHANNON'S TYPE C * 'A' ALPHA-BETA TREE SEARCHING STRATEGY WITH FORWARD C * PRUNING. ALL PARAMETERS CAN BE SET BY THE PLAYER (SEE C * COMMENTS IN EACH MODULE WITH A NAME ENDING IN 'CMND') C * TO CONTROL THE SPEED (AND QUALITY) OF PLAY. C * C * MAIN IS THE DRIVER OF THE PROGRAM. IT IS CONCERNED C * WITH READING INPUT, CALLING APPROPRIATE ROUTINES, AND C * OUTPUTTING THE COMPUTERS CHOSEN MOVE. IT ALSO KEEPS C * WITH MOVE TIMING TO MAINTAIN THE CHESS CLOCK TIMES FOR C * BOTH SIDES. C * C *************************************************************** C SUBROUTINE ACMND C C ************************************************************ C * * C * ACMND IS USED TO ANNOTATE THE GAME HISTORY FILE. * C * THIS IS DONE TO COMMENT PARTICULAR MOVES FOR LATER * C * REFERENCE WHEN EVALUATING THE GAME. IF THE MACHINE * C * MAKES SOME STRANGE LOOKING MOVE, A COMMENT CAN BE EN- * C * TERED WITH THAT MOVE AS A REMINDER TO LATER CHECK OUT * C * THAT MOVE TO SEE WHY IT WAS MADE. * C * * C ************************************************************ C SUBROUTINE ADJUST C C ************************************************************ C * * C * ADJUST IS USED TO ADJUST THE CONSTRAINTS WHICH CON- * C * TROL THE TIME USED TO CALCULATE MOVES. THERE ARE THREE * C * BASIC CONTROL FUNCTIONS SET BY THIS SUBROUTINE: * C * * C * 1) A VARIABLE 'TIMLIM' IS SET TO 2.5 TIMES THE * C * AVERAGE TIME THE MACHINE MUST USE TO STAY WITHIN * C * THE LIMITS SET. THIS IS USED IN SUBROUTINE * C * 'LOOK'; WHEN THIS LIMIT IS REACHED, NO FURTHER * C * MOVES WILL BE EXAMINED. * C * * C * 2) IF THE AVERAGE TIME/MOVE IS FASTER THAN RE- * C * QUIRED, THE FORWARD PRUNING WIDTHS WILL BE IN- * C * CREASED TO SLOW MOVE CALCUALTION DOWN. IF THE * C * AVERAGE IS TOO SLOW, THE WIDTHS WILL BE REDUCED * C * TO SPEED MOVE CALCULATION UP. * C * * C * 3) IF THE WIDTHS ARE INCREASED UP TO THE THRESHOLD, * C * THEY ARE RESET TO THEIR ORIGINAL VALUE AND THE * C * SEARCH DEPTH IS INCREASED BY ONE. * C * * C ************************************************************ C BLOCK DATA SUBROUTINE BISHOP C C ************************************************************ C * * C * BISHOP GENERATES ALL BISHOP MOVES AND DIAGONAL * C * MOVES FOR THE QUEEN. SUBROUTINE SCORE IS CALLED TO * C * COMPUTE THE PLAUSIBILITY SCORE FOR THE MOVE, AFTER * C * WHICH THE MOVE IS ENTERED IN THE MOVE LIST. * C * * C ************************************************************ C INTEGER FUNCTION BLOCK(SQUARE,SIDE) C C ************************************************************ C * * C * BLOCK IS USED TO DETERMINE IF A PIECE IS BLOCKADING * C * A PASSED PAWN, AND IF SO HOW EFFECTIVE IT IS. THE * C * SQUARE IN FRONT OF THE PIECE IS EXAMINED TO SEE IF IT * C * CONTAINS A PASSED PAWN. IF SO, THE PIECE IS GIVEN * C * CREDIT FOR BLOCKING IT WHERE KNIGHTS, BISHOPS AND THE * C * KING ARE THE BEST BLOCKADERS, THE QUEEN IS NEXT, AND * C * ROOK IS LAST. THE SCORE RETURNED IS A MEASURE OF HOW * C * EFFECTIVE THE BLOCKADER IS...THE BIGGER THE SCORE, THE *^] C * MORE EFFECTIVE. * C * * C ************************************************************ C SUBROUTINE BOOK C C ************************************************************ C * * C * BOOK SEARCHES THE BOOK MOVE DATABASE FOR A RESPONSE * C * TO THE HUMAN'S LAST MOVE. IN MOST CASES THERE WILL BE * C * SEVERAL POSSIBLE REPLIES, THE COMPUTER ALWAYS TAKES THE * C * FIRST ONE. THIS COULD BE CHANGED TO A RANDOM NUMBER * C * CHOICE IF CARE IS TAKEN TO INSURE THAT ONLY 'GOOD' * C * LINES ARE PUT INTO THE DATABASE. IF NO RESPONSE IS * C * FOUND, 'IN BOOK' IS SET TO FALSE SO THAT THE MOVE WILL * C * BE CALCULATED. IF THE MOVE IS FOUND, OUR RESPONSE IS * C * CHOSEN AND THE POINTER TO THE HUMAN'S POSSIBLE REPLIES * C * IS SAVED FOR THE NEXT CALL. NO MORE THAN TWO (2) I/O * C * OPERATIONS ARE REQUIRED FOR THIS (ONLY ONE IF THE * C * HUMAN'S RESPONSE IS NOT IN THE DATABASE), SO THE MORE * C * COMPREHENSIVE THE BOOK DATABASE IS, THE MORE TIME WILL * C * BE SAVED FOR LATER COMPUTED SEARCHING. * C * A SEPARATE PROGRAM IS USED TO BUILD THE DATABASE * C * TO KEEP UNNEEDED CODE OUT OF THE MAIN CHESS PLAYING * C * PROGRAM. * C * * C ************************************************************ C SUBROUTINE BREAK C C ************************************************************ C * * C * BREAK CONTROLS USE OF THE 'BREAK' BUTTON OR 'ATTN' * C * KEY ON TERMINALS. THERE ARE TWO (2) ENTRY POINTS AND * C * TWO (2) ACTIONS TAKEN AS A RESULT OF A 'BREAK' OR 'ATTN'* C * SIGNAL. THE ENTRY POINTS ARE 'BRK ON' TO SET BREAK * C * CONTROL AND 'BRK OFF' TO RESET BREAK CONTROL. 'BRK ON' * C * REQUIRES 1 ARGUMENT IF THINK-AHEAD IS TO BE USED. THIS * C * IS THE STATEMENT NUMBER TO RETURN TO IF THE PROGRAM IS * C * THINKING ON THE OPPONENT'S TIME AND THE BREAK KEY IS * C * HIT INDICATING THAT IT IS TIME TO ACCEPT INPUT FROM THE * C * PERSON PLAYING THE GAME. * C * THE TWO ACTIONS TAKEN ARE (1) IF THE MACHINE IS * C * IN THE PROCESS OF CALCULATING A MOVE ON IT'S OWN TIME, * C * THE BEST MOVE FOUND SO FAR, THE CURRENT MOVE, AND THE * C * NUMBER OF MOVES REMAINING TO BE CHECKED ARE PRINTED. * C * (2) IF THE PROGRAM IS IN THINK-AHEAD MODE, THAT IS, IT * C * IS THINKING WHILE THE OPPONENT IS THINKING, THEN A * C * RETURN IS MADE TO THE INPUT ROUTINE TO ACCEPT THE MOVE * C * THE OPPONENT WISHES TO TYPE IN. * C * * C ************************************************************ C INTEGER FUNCTION BSCORE(SQUARE,SIDE) C C ************************************************************ C * * C * BSCORE IS USED TO COMPUTE THE PLAUSIBILITY SCORE * C * FOR BISHOP MOVES. THE SCORE IS OBTAINED DIRECTLY FROM * C * THE BISHOP CONTROL BOARD FOR THE SIDE TO MOVE. (CBSCOR, * C * HBSCOR IN COMMON BLOCK 'B BD SM'). * C * * C ************************************************************ C SUBROUTINE CASTLE C C ************************************************************ C * * C * CASTLE GENERATES ALL CASTLING MOVES. CASTLING TO * C * EITHER SIDE IS CONSIDERED EQUALLY PLAUSIBLE (BOTH GET * C * A FAIRLY HIGH SCORE TO ENSURE CHECKING THE MOVE). * C * * C ************************************************************ C SUBROUTINE CCMND(DEVICE) C C ************************************************************ C * * C * CCMND HANDLES ALL 'CHESS CLOCK' COMMANDS. THERE * C * ARE FIVE BASIC OPERATIONS THAT CAN BE PERFORMED BY THIS * C * ROUTINE: * C * 1) THE CHESS CLOCK CAN BE TURNED ON OR OFF. IF IT * C * IS ON, THE PROGRAM WILL PRINT OUT THE TIME BOTH * C * IT AND THE HUMAN TAKES IN CHOOSING A MOVE AFTER * C * EACH MAKES A MOVE. * C * 2) THE CHESS CLOCK CAN BE SET TO SOME SPECIFIC * C * VALUE ALONG WITH A MOVE COUNTER TO FORCE THE * C * PROGRAM AND HUMAN TO MAKE A CERTAIN NUMBER OF * C * MOVES IN A SPECIFIED TIME PERIOD, FOR EXAMPLE * C * 40 MOVES IN 10 MINUTES FOR HIGH-SPEED CHESS. * C * 3) THE CHESS CLOCK CAN BE DISPLAYED, TELLING HOW * C * MUCH TIME EACH SIDE HAS ON IT'S CLOCK TO SEE * C * HOW EACH SIDE IS DOING WITH RESPECT TO TIME. * C * 4) THE COMPUTER'S TIME PER MOVE IS USUALLY IN * C * COMPUTER TIME WHICH MAY BE MUCH SLOWER THAN * C * REAL OR WALL CLOCK TIME. THE COMPUTER MAY BE * C * FORCED TO USE ELAPSED TIME JUST AS THE HUMAN * C * ALWAYS DOES IF DESIRED. THIS MAY GET THE PROG- * C * RAM INTO TIME TROUBLE, BUT MAY BE REQUIRED FOR * C * TOURNAMENT PLAY WHERE COMPUTER TIME IS NOT * C * UNDERSTOOD BY EVERYONE. * C * 5) THE PROGRAM CAN BE INSTRUCTED TO PERIODICALLY * C * ASK THE TERMINAL OPERATOR WHO MUCH TIME IS * C * LEFT ON IT'S CLOCK SINCE COMPUTER TIMING MAY * C * NOT EXACTLY AGREE WITH THE CHESS CLOCK. SEE * C * MODULE 'QUERY' FOR FURTHER DETAILS. * C * * C ************************************************************ C LOGICAL FUNCTION CHECK(SIDE) C C ************************************************************ C * * C * CHECK DETERMINES IF THE SIDE TO MOVE IS IN CHECK * C * OR IF THE MOVE IS A CHECKING MOVE FOR THE OPPONENT. * C * THE ARGUMENT, 'SIDE' INDICATES WHICH SIDE TO CHECK FOR * C * AS FOLLOWS: * C * A) IF SIDE IS TRUE, DETERMINE IF THE HUMAN IS IN * C * CHECK. * C * B) IF SIDE IS FALSE, DETERMINE IF THE COMPUTER IS * C * IN CHECK. * C * CHECK IS A LOGICAL FUNCTION WHICH RETURNS TRUE IF * C * THE SIDE REQUESTED IS IN CHECK AND FALSE IF NOT. * C * CHECK PRETENDS IT IS VARIOUS PIECES SITTING ON * C * THE SAME SQUARE AS THE KING. IT THEN GENERATES MOVES * C * FOR THESE FAKE PIECES AND FOLLOWS THE MOVES. IF, FOR * C * EXAMPLE, IT GENERATES BISHOP MOVES AND LOOKS DOWN THE * C * DIAGONAL AND SEES AN OPPONENT BISHOP OR QUEEN WITH NO * C * INTERPOSING PIECES OR PAWNS, THEN CHECK IS SET TO TRUE * C * AND A RETURN IS TAKEN. THIS IS DONE FOR ALL PIECES AND * C * PAWNS BEFORE CHECK IS SET TO FALSE. * C * * C ************************************************************ C SUBROUTINE COMPRS C C ************************************************************ C * * C * COMPRS IS USED TO COMPRESS THE 64 SIGNIFICANT WORDS * C * OF THE CHESS BOARD INTO 8 WORDS BY USING 4 BITS PER * C * SQUARE. THIS COMPRESSED POSITION IS SAVED TO DETECT * C * DRAW BY REPITITION OF MOVES. * C * * C ************************************************************ C SUBROUTINE OVTRAP(ITG) SUBROUTINE DISPLY(DEVICE) C C ************************************************************ C * * C * DISPLAY IS USED TO DISPLAY THE GAME BOARD (CALLED * C * BY THE 'D' COMMAND). IN ADDITION TO THE BOARD, THE * C * PIECES CAPTURED BY BOTH SIDES ARE DISPLAYED TO THE * C * RIGHT FOR INFORMATION. COLONS (: :) SURROUND THE HUMAN * C * PIECES AND BRACKETS ( ) SURROUND THE COMPUTER PIECES. * C * WHITE EMPTY SQUARES ARE INDICATED BY AN ASTERISK (*), * C * BLACK EMPTY SQUARES ARE INDICATED BY A DASH (-). * C * * C ************************************************************ C LOGICAL FUNCTION DRAW(SCORE) C C ************************************************************ C * * C * DRAW IS USED TO DETERMINE IF THE COMPUTER SHOULD * C * ACCEPT A DRAW/STALEMATE IF ONE IS OFFERED/FOUND. THE * C * MATERIAL BALANCE IS EXAMINED AS WELL AS THE VALUE * C * OF SQUARES PIECES/PAWNS ARE POSTED ON. A VALUE OF * C * 'TRUE' IS RETURNED IF THE PROGRAM IS BEHIND. * C * * C ************************************************************ C INTEGER FUNCTION ENPRIS(SQUARE,SIDE) C C ************************************************************ C * * C * ENPRIS IS USED IN MOVE ORDERING TO DETERMINE THE * C * CONDITION OF PIECES ON THE BOARD. IT RETURNS A VALUE * C * CORRESPONDING TO THE EXPECTED LOSS OF MATERIAL ON A * C * SQUARE. IT MAKES THE FOLLOWING CHECKS: * C * * C * 1) IF THE PIECE IS NOT UNDER ATTACK, LOSS=0 * C * * C * 2) IF THE PIECE IS UNDER ATTACK AND NOT DEFENDED, * C * LOSS=VALUE OF PIECE * C * * C * 3) IF THE PIECE IS ATTACKED BY A MORE VALUABLE * C * PIECE AND IS DEFENDED, LOSS=0 * C * * C * 4) IF THE PIECE IS ATTACKED BY A LESS VALUABLE * C * PIECE AND IS DEFENDED, LOSS=VALUE OF ATTACKED * C * PIECE LESS THE VALUE OF THE ATTACKING PIECE * C * (ASSUME THE PIECES WILL BE EXCHANGED) * C * * C ************************************************************ C SUBROUTINE ENTER C C ************************************************************ C * * C * ENTER/ENTERD IS USED TO COMPRESS THE MOVE INFOR- * C * MATION INTO 1 WORD TO CONSERVE MEMORY. ENTER ENTERS * C * THE MOVE INTO THE NEXT EMPTY SLOT IN THE MOVE LIST * C * WHILE ENTERD ENTERS THE MOVE INTO THE PARAMETER PASSED * C * IN THE ARGUMENT LIST. * C * * C * COMPRESSED DATA FORMAT : * C * * C * SMMM VVVV VVVV VVVV VVTT TTTT TFFF FFFF * C * * C * M => MOVE TYPE (DESCRIBED IN MVMKER) * C * V => PLAUSIBILITY SCORE OF MOVE * C * T => 'TO' OR DESTINATION SQUARE * C * F => 'FROM' OR SOURCE SQUARE * C * * C ************************************************************ C INTEGER FUNCTION EXCHNG(SQUARE,SIDE) C C ************************************************************ C * * C * EXCHNG IS AN UNLIMITED LOOK-AHEAD ROUTINE TO CHECK * C * ALL CAPTURES ON A PARTICULAR SQUARE. IT DETERMINES ALL * C * PIECES BEARING ON THE SQUARE FOR BOTH SIDES AND THEN * C * PLAYS THE EXCHANGE SEQUENCES OUT. THE SCORE IS AD- * C * JUSTED BASED ON THE LOSS OR GAIN OF MATERIAL FOUND. * C * THIS ROUTINE IS USED BY THE TERMINAL SCORING SUB- * C * ROUTINE TO EXAMINE THE LAST MOVE OF A SEQUENCE. * C * THIS IS DONE TO PREVENT A PIECE FROM BEING LEFT DANG- * C * LING BECAUSE THE SEARCH WAS CUT OFF AT SOME FIXED PLY. * C * IT IS ALSO USED BY THE PLAUSIBILITY RE-ORDERING SUB- * C * ROUTINE AT EARLY LEVELS IN THE TREE TO MAKE SURE THAT * C * AFTER EACH MOVE GENERATED, NO PIECES ARE LEFT DANGLING * C * SUBJECT TO CAPTURE. * C * IN CARRYING OUT EXCHANGE SEQUENCES, THIS ROUTINE * C * DOES NOT ALWAYS MAKE EVERY CAPTURE POSSIBLE BECAUSE * C * THIS COULD RESULT IN BLUNDERS ALSO. FOR EXAMPLE, THE * C * SEQUENCE NXB, BXN, RXB, QXN, RXQ WOULD BE EXAMINED, * C * BUT THE EXCHANGE SCORE WOULD BE BASED ON THE FIRST * C * THREE (3) MOVES ONLY AS NO ONE WOULD GIVE UP A QUEEN * C * FOR A KNIGHT UNLESS IN A CHECKMATE SEQUENCE. * C * * C ************************************************************ C SUBROUTINE EXECPC C C ************************************************************ C * * C * EXECPC IS USED TO EXECUTE PROGRAMMED COMMANDS THAT * C * HAVE BEEN ENTERED PREVIOUSLY. THIS ROUTINE IS CALLED * C * AFTER EVERY MOVE MADE BY THE COMPUTER. FOR A DESCRIP- * C * TION OF PROGRAMMED COMMAND MODE, LOOK AT THE PCCMND * C * ROUTINE COMMENTS. TO OPERATE, THIS ROUTINE MOVES THE * C * COMMANDS FROM THE PROGRAMMED COMMAND BUFFER INTO THE * C * REGULAR BUFFER (TEXT) AND CALLS OPTION JUST AS THOUGH * C * THE COMMANDS ARE BEING TYPED IN RATHER THAT GOTTEN * C * FROM AN ARRAY. * C * * C ************************************************************ C INTEGER FUNCTION EXPOSE(SIDE) C C ************************************************************ C * * C * THIS SUBROUTINE IS USED TO DETERMINE IF THE KING'S * C * SECTOR HAS BEEN COMPROMISED BY MOVING OR CAPTURING * C * PAWNS IN FRONT OF THE KING. THERE ARE THREE DEGREES OF * C * SAFETY DISCOVERED: * C * 1) A MISSING BISHOP, KNIGHT, OR ROOK PAWN IS THE * C * MOST IMPORTANT. * C * 2) AN ADVANCED BISHOP PAWN IS NEXT. * C * 3) FINALLY, AN ADVANCED KNIGHT PAWN IS LAST. * C * IF ANY OF THESE ARE FOUND, THE SCORE RETURNED IS PENA- * C * LIZED TO REFLECT THE LACK OF SAFETY. * C * * C ************************************************************ C SUBROUTINE EXTRCT C C ************************************************************ C * * C * EXTRCT TAKES THE COMPRESSED WORD (BUILT BY ENTER) * C * IN 'FROM8' AND BREAKS IT BACK DOWN INTO SEPARATE MOVE * C * PARAMETERS. * C * * C * COMPRESSED DATA FORMAT : * C * * C * SMMM VVVV VVVV VVVV VVTT TTTT TFFF FFFF * C * * C * M => MOVE TYPE (DESCRIBED IN MVMKER) * C * V => PLAUSIBILITY SCORE OF MOVE * C * T => 'TO' OR DESTINATION SQUARE * C * F => 'FROM' OR SOURCE SQUARE * C * * C ************************************************************ C SUBROUTINE FCMND C C ************************************************************ C * * C * FCMND PROCESSES THE 'F' COMMAND. THIS IS USED TO * C * FORCE THE COMPUTER TO MAKE THE MOVE ENTERED ON THE NEXT * C * LINE. IF A MOVE HAS ALREADY BEEN MADE BY THE COMPUTER, * C * THAT MOVE WILL BE UNMADE AND THE NEW ONE MADE. * C * * C ************************************************************ C INTEGER FUNCTION FORK(SQUARE,SIDE) C C ************************************************************ C * * C * FORK IS USED TO DETERMINE IF A MOVE IS A FORKING * C * TYPE OF MOVE (INCLUDES X-RAYS, PINS, ETC.). THIS SUB- * C * ROUTINE LISTS ALL THE OPPONENT'S PIECES A PIECE ON * C * 'SQUARE' ATTACKS. THIS LIST IS SORTED AND THEN * C * SCANNED TO DETERMINE WHAT MIGHT BE LOST OR WON AS A * C * RESULT OF THIS FORKING?? MOVE. THE LIST OF ATTACKED * C * PIECES IS EXAMINED FOR THE FIRST PIECE MORE VALUABLE * C * THAN THE ATTACKING PIECE OR THE FIRST PIECE THAT IS * C * UNDEFENDED IF IT IS LESS VALUABLE. THIS PIECE WILL * C * BE ASSUMED TO BE SAVED. THE REST OF THE LIST IS THEN * C * EXAMINED TO FIND THE NEXT PIECE MORE VALUABLE OR * C * UNDEFENDED. THE SCORE RETURNED IS A) 0 IF NO PIECES * C * FIT THESE RULES; B) THE VALUE OF THE NEXT MOST VALUABLE * C * ATTACKED PIECE IF IT UNDEFENDED; OR C) THE VALUE OF THE * C * NEXT MOST VALUABLE PIECE LESS THE VALUE OF THE * C * ATTACKING PIECE IF IT IS DEFENDED. * C * * C ************************************************************ C SUBROUTINE HCMND(DEVICE) C C ************************************************************ C * * C * HCMND PROCESSES THE 'H' COMMAND. THIS LISTS THE * C * GAME HISTORY OF ALL MOVES MADE BY BOTH SIDES. OUTPUT * C * MAY BE SENT TO THE LINE PRINTER OR USER TERMINAL. * C * * C ************************************************************ C SUBROUTINE INMOVE(PLAY8,*) C C ************************************************************ C * * C * INMOVE IS USED TO TRANSLATE ALL CHESS MOVES FROM * C * TEXT STRINGS TO THE INTERNAL FORM USED BY THE PROGRAM. * C * THIS IS DONE BY GENERATING ALL LEGAL MOVES FOR THE SIDE * C * INPUTTING THE MOVE AND THEN USING THAT DATA INPUT TO * C * ELIMINATE ALL INCORRECT MOVES. ENOUGH DATA MUST BE IN- * C * PUT TO FULLY REMOVE ALL AMBIGUITIES. USUALLY A SIMPLE * C * PXP WILL DO FOR 'PAWN TAKES PAWN', SOMETIMES P/KR5XP * C * WILL BE REQUIRED. XB WILL BE ACCEPTED TO 'TAKE THE * C * BISHOP' IF ONLY ONE METHOD OF CAPTURE IS POSSIBLE. AM- * C * BIGUOUS, ILLEGAL, AND SYNTACTICAL MOVE ERRORS ARE DE- * C * TECTED AND IGNORED AFTER APPROPRIATE DIAGNOSTICS ARE * C * PRINTED. * C * * C ************************************************************ C SUBROUTINE INPUT(VALUE) C C ************************************************************ C * * C * INPUT IS A FUNCTION USED TO INPUT INTEGER*4 VALUES * C * FROM THE USER TERMINAL. THE DATA IS INPUT ON AN A FOR- * C * MAT AND TRANSLATED SO THAT 'I2' AND 'I3' TYPE FORMATS * C * ARE NOT USED. THIS ALLOWS THE NUMBERS TO BE INPUT ON A * C * FREE FORMAT WITH LEADING BLANKS AND ZEROES IF DESIRED * C * WITHOUT HAVING TO REMEMBER HOW MANY DIGITS TO TYPE IN * C * FOR THIS PARTICULAR OPTION. * C * * C ************************************************************ C LOGICAL FUNCTION ISOLAT(SQUARE,SIDE) C C ************************************************************ C * * C * ISOLAT IS USED TO DETERMINE IF A PAWN IS ISOLATED. * C * IT CHECKS TO SEE IF THERE ARE ANY FRIENDLY PAWNS ON * C * ADJACENT FILES TO SUPPORT THE ONE ON 'SQUARE'. IF NOT, * C * ISOLAT IS SET TO TRUE. * C * * C ************************************************************ C SUBROUTINE KING C C ************************************************************ C * * C * KING GENERATES ALL KING MOVES. SUBROUTINE SCORE IS * C * CALLED TO COMPUTE THE PLAUSIBILITY SCORE FOR THE MOVE, * C * AFTER WHICH THE MOVE IS ENTERED IN THE MOVE LIST. * C * * C ************************************************************ C SUBROUTINE KNIGHT C C ************************************************************ C * * C * KNIGHT GENERATES ALL KNIGHT MOVES. SUBROUTINE * C * SCORE IS CALLED TO COMPUTE THE PLAUSIBILITY SCORE FOR * C * THE MOVE, AFTER WHICH THE MOVE IS ENTERED IN THE MOVE * C * LIST. * C * * C ************************************************************ C INTEGER FUNCTION KSCORE(SQUARE,SIDE) C C ************************************************************ C * * C * KSCORE IS USED TO COMPUTE THE PLAUSIBILITY SCORE * C * FOR KING MOVES. THE SCORE IS OBTAINED DIRECTLY FROM * C * THE KING CONTROL BOARD FOR THE SIDE TO MOVE. (CKSCOR, * C * HKSCOR IN COMMON BLOCK 'K BD SM'). * C * * C ************************************************************ C SUBROUTINE LMCMND(DEVICE) C C ************************************************************ C * * C * LMCMND IS USED TO PROCESS THE 'LM' COMMAND WHICH * C * IS USED TO DUMP OUT ALL LEGAL MOVES FOR EITHER SIDE. * C * IF THE COMPUTER MOVES ARE DESIRED, THE LAST MOVE IS * C * TEMPORARILY 'UN-MADE' AND ALL LEGAL MOVES ARE THEN * C * LISTED. IF THE OUTPUT IS DIRECTED TO THE LINE PRINTER, * C * THE MOVES ARE ALWAYS FOR THE COMPUTER AND NO CHOICE IS * C * GIVEN. * C * * C ************************************************************ C SUBROUTINE LOCATE C C ************************************************************ C * * C * LOCATE IS USED TO LOCATE ANY PIECES NECESSARY BE- * C * FORE STARTING THE SEARCH. THE KINGS ARE FOUND SO THAT * C * CHECK WILL NOT HAVE TO LOCATE THEM EACH TIME IT IS * C * CALLED; QUEENS, BISHOPS, ETC. ARE LOCATED AND ACCOUNTED * C * FOR FOR LATER REFERENCE. THIS IS DONE BECAUSE IT IS * C * CHEAPER IN TERMS OF TIME TO LOCATE EVERYTHING ONCE AND * C * KEEP UP WITH WHEN IT IS MOVED, THAN TO LOCATE SOMETHING * C * WHEN IT'S PRESENCE OR ABSENCE IS IMPORTANT. * C * * C ************************************************************ C SUBROUTINE LOOK C C ************************************************************ C * * C * LOOK IS THE MAIN DRIVER FOR THE CHESS TREE SEARCH. * C * IT USES THE MINIMAX SEARCH WITH ALPHA/BETA PRUNING AS * C * DESCRIBED BY CLAUDE SHANNON'S TYPE A SEARCH STRATEGY. * C * BASICALLY, IN DOING A DEPTH FIRST SEARCH, LOOK GEN- * C * ERATES ALL LEGAL MOVES AND MAKES THEM ONE AT A TIME AS * C * IT ADVANCES TO THE NEXT DEEPER LEVEL. IF A CHECK- * C * MATE IS FOUND, THAT MOVE IS IMMEDIATELY SELECTED FOR * C * THAT LEVEL AND BACKED UP. * C * THE COMPUTER WILL AVOID DRAWS AT ANY LEVEL IN THE * C * TREE. IT WILL REMEMBER AN IMMEDIATE DRAWING MOVE AND * C * AFTER COMPLETING THE SEARCH WILL DETERMINE IF IT'S * C * POSITION IS BAD ENOUGH TO WARRANT DRAWING THE GAME. * C * * C ************************************************************ C SUBROUTINE MATCH(*) C C ************************************************************ C * * C * MATCH IS USED TO DETERMINE IF THE HUMAN'S RESPONSE * C * MATCHED THE PREDICTED MOVE (IN THE PRINCIPLE VARIATION * C * CALCULATED FOR THE LAST MACHINE MOVE). IF SO, THE * C * COUNT OF PREDICTED MOVES IS INCREMENTED. IF IN * C * 'THINK AHEAD' MODE, MATCH WILL RETURN CAUSING THE * C * RESPONSE CALCULATED ON THE OPPONENT'S TIME TO BE * C * USED RATHER THAN CALLING . * C * * C ************************************************************ C INTEGER FUNCTION MINATK(SQUARE,SIDE,NUMATK) C C ************************************************************ C * * C * MINATK IS USED TO DETERMINE THE VALUE OF THE LEAST * C * IMPORTANT PIECE ATTACKING A SQUARE. THIS IS USED IN * C * SUBROUTINE 'ENPRIS' TO DETERMINE IF A PIECE IS SUBJECT * C * TO CAPTURE. IT PERFORMS TWO (2) FUNCTIONS: A) IT * C * RETURNS THE VALUE OF THE LEAST PIECE ATTACKING THE * C * SQUARE IN QUESTION, AND B) IT RETURNS THE NUMBER OF *^] C * PIECES ATTACKING THE SQUARE. * C * * C ************************************************************ C SUBROUTINE MOVGEN C C ************************************************************ C * * C * MOVGEN IS THE DRIVER FOR ALL OF THE DIFFERENT MOVE * C * GENERATORS. THE ENTIRE BOARD IS SCANNED AND AS A PIECE * C * FOR THE SIDE TO MOVE IS DETECTED, THE APPROPRIATE MOVE * C * GENERATOR IS CALLED. AFTER ALL LEGAL MOVES ARE IN THE * C * LIST, SUBROUTINE ORDER IS CALLED TO ORDER THE MOVES * C * FOR THE SEARCH. * C * * C ************************************************************ C SUBROUTINE MVMKER C C ************************************************************ C * * C * MVMKER IS USED TO MAKE/UNMAKE ALL MOVES ON THE GAME * C * BOARD. IT SAVES THE VALUE OF THE 'TO' SQUARE BEFORE * C * MAKING A MOVE SO THAT THE MOVE CAN BE UNMADE LATER. * C * ENTRY 'MOVER' IS USED TO MAKE A MOVE AND ENTRY 'UMOVER' * C * IS USED TO UNMAKE A MOVE. BOTH ROUTINES USE DATA IN * C * COMMON BLOCK 'INFO' TO MAKE/UNMAKE MOVES. NO VALIDITY * C * CHECK IS MADE SO THE PARAMETERS MUST BE CORRECT BEFORE * C * THE CALL IS MADE. * C * * C ************************************************************ C C C TYPE8: 1 => NORMAL MOVE C 2 => CASTLE TO RIGHT SIDE OF BOARD C 3 => CASTLE TO LEFT SIDE OF BOARD C 4 => EN PASSANT PAWN CAPTURE C 5 => PAWN PROMOTION MOVES C INTEGER FUNCTION NSCORE(SQUARE,SIDE) C C ************************************************************ C * * C * NSCORE IS USED TO COMPUTE THE PLAUSIBILITY SCORE * C * FOR KNIGHT MOVES. THE SCORE IS OBTAINED DIRECTLY FROM * C * THE KNIGHT CONTROL BOARD FOR THE SIDE TO MOVE. (CNSCOR, * C * HNSCOR IN COMMON BLOCK 'N BD SM'). * C * THE SCORE IS ADJUSTED AS INDICATED FOR EACH OF THE * C * FOLLOWING FACTORS PRESENT: * C * 1) BONUS FOR MOVING TO THE 5TH THRU 8TH RANK WHEN * C * OPPONENT'S KING IS STILL ON THE BACK RANK. THIS * C * PUTS THE KNIGHT (OUTPOST KNIGHT) IN A POSITION * C * LEADING TO FORKS AND OTHER THREATS. THIS DOES * C * NOT APPLY IF THE KNIGHT CAN BE DRIVEN AWAY BY * C * A SIMPLE PAWN PUSH. * C * * C ************************************************************ C SUBROUTINE OCMND(DEVICE,*) C C ************************************************************ C * * C * OCMND PROCESSES THE 'O' COMMAND. THIS DISPLAYS * C * VARIOUS PIECE CONTROL BOARDS WHEN CHANGING OR DEBUGGING * C * THE PRE-ANALYSIS SUBROUTINE. * C * THE COMMAND HAS THE FOLLOWING SYNTAX: * C * OSB * C * WHERE S IDENTIFIES THE SIDE ('C' FOR THE COMPUTER AND * C * 'H' FOR THE HUMAN) AND B IDENTIFIES THE BOARD DESIRED * C * USING THE USUAL PIECE CODES (P FOR PAWN, N FOR KNIGHT, * C * ETC. 'OP' WILL DISPLAY THE PIECE VALUES. * C * * C ************************************************************ C SUBROUTINE OPTION(*) C C ************************************************************ C * * C * OPTION IS THE DRIVER FOR ALL OF THE SEPARATE COM- * C * COMMAND MODULES. IT DECODES THE FIRST CHARACTER OF THE * C * INPUT AND CALLS THE CORRECT MODULE. THE ONLY DIRECT * C * INPUT TO OPTION IS '?' WHICH REQUESTS A LISTING OF ALL * C * LEGAL COMMANDS. * C * SEVERAL COMMANDS CAN HAVE A 'P' APPENDED TO THEM * C * TO DIRECT THEIR OUTPUT TO THE LINE PRINTER RATHER THAN * C * THE USER TERMINAL. THE FORTRAN UNIT NUMBER IS PASSED * C * AS AN ARGUMENT RATHER THAN BEING USED DIRECTLY. UNIT * C * '6' GOES TO THE LINE PRINTER AND UNIT '108' GOES TO THE * C * USER TERMINAL. * C * * C ************************************************************ C SUBROUTINE ORDER C C ************************************************************ C * * C * THIS SUBROUTINE RE-ORDERS THE MOVE LIST GENERATED * C * BY THE MOVE GENERATORS. THIS PLACES MOVES WITH HIGH * C * PLAUSIBILITY SCORES AT THE TOP OF THE LIST, HOPEFULLY * C * MAXIMIZING THE NUMBER OF ALPHA/BETA CUTOFFS THAT OCCUR * C * DURING THE COURSE OF THE SEARCH. IF THE CURRENT PLY IS * C * ONE, EXCHNG IS USED WITH EACH MOVE IN THE LIST TO * C * DETERMINE IF THE MOVE LEAVES ANY PIECES SUBJECT TO * C * CAPTURE. IF SO, THE SCORE IS ADJUSTED TO REFLECT THE * C * LOSS OF THE PIECE. * C * FOR EACH MOVE GENERATED, 'EN PRIS' IS USED TO DE- * C * TERMINE IF ANY FRIENDLY PIECES ARE LEFT EXPOSED TO A * C * CAPTURE. IF SO, THESE MOVES ARE MOVED DOWN IN THE LIST * C * TO SAVE TIME. * C * IF THE PLY IS NOT GREATER THAN 'ORDER1', THEN ALL * C * MOVES FORWARD PRUNED ARE CHECKED TO SEE IF THE PUT THE * C * OPPONENT KING IN CHECK. IF SO, THE MOVES ARE MOVED UP * C * BELOW THE LAST MOVE LEFT AFTER PRUNING AND THE WIDTH * C * IS INCREASED TO COVER THEM. * C * IF THE PLY IS NOT GREATER THAN 'ORDER2', THEN ALL * C * CAPTURING MOVES ARE DONE AS THE CHECKING MOVES ABOVE * C * TO MAKE SURE THE PROGRAM WILL EXAMINE ALL EXCHANGES OPEN* C * TO IT. * C * * C ************************************************************ C SUBROUTINE OUTMOV(FROM8,TO8,TYPE8,MTYPE,PLAY8,BOARD) C C ************************************************************ C * * C * OUTMOVE IS USED BY ANY ROUTINE WISHING TO OUTPUT A * C * MOVE IN STANDARD CHESS NOTATION. C * TO OUTPUT MACHINE MOVES AND EVEN TO OUTPUT HUMAN MOVES. * C * * C ************************************************************ C SUBROUTINE OUTPUT(DEVICE,BOARD) C C ************************************************************ C * * C * THIS SUBROUTINE WILL OUTPUT THE SIGNIFICANT PART OF * C * ANY BOARD TO THE TERMINAL OR LINE PRINTER. NUMERICS * C * ONLY ARE USED, EVEN FOR THE GAME BOARD. * C * * C ************************************************************ C INTEGER FUNCTION PASSED(SQUARE,SIDE) C C ************************************************************ C * * C * PASSED IS USED TO COMPUTE THE VALUE OF A PASSED PAWN * C * ON 'SQUARE'. IT CHECKS TO SEE IF A PAWN ON 'SQUARE' IS * C * PASSED AND COMPUTES IT'S NET WORTH IF IT IS. IF NOT, * C * A SCORE OF ZERO (0) IS RETURNED. * C * IF A PAWN IS PASSED, IT IS NOT GIVEN CREDIT FOR *^] C * ADVANCING IF IT IS ISOLATED AND UNDEFENDED. IF IT IS * C * NOT ISOLATED, PAWNS ARE KEPT CONNECTED BY ANOTHER * C * ROUTINE SO A FRIENDLY DEFENDER IS ALWAYS NEARBY. * C * * C ************************************************************ C INTEGER FUNCTION PATACK(SQUARE,SIDE) C C ************************************************************ C * * C * PATACK IS USED TO DETERMINE IF A PAWN ON 'SQUARE' * C * IS ATTACKING A PIECE. IF SO A BONUS IS RETURNED AS THE * C * VALUE. ADDITIONALLY, IF A PAWN IS ATTACKING A PIECE * C * WHICH MUST FLEE (KNIGHT OR ROOK), A FURTHER BONUS IS * C * ADDED. * C * * C ************************************************************ C SUBROUTINE PAWN C C ************************************************************ C * * C * PAWN GENERATES ALL PAWN MOVES. SUBROUTINE SCORE IS * C * CALLED TO COMPUTE THE PLAUSIBILITY SCORE FOR THE MOVE, * C * AFTER WHICH THE MOVE IS ENTERED IN THE MOVE LIST. THE * C * 'EN PASSANT' AS WELL AS PROMOTION MOVES ARE CONSIDERED * C * HERE, ALTHOUGH PROMOTION IS STRICTLY TO A QUEEN. * C * * C ************************************************************ C SUBROUTINE PCMND C C ************************************************************ C * * C * PCMND IS USED TO PROCESS THE 'P' COMMAND. IT * C * OUTPUTS THE PREDICTED HUMAN RESPONSE TO THE COMPUTER'S * C * LAST MOVE. * C * * C ************************************************************ C SUBROUTINE PCCMND C C ************************************************************ C * * C * PCCMND IS USED TO PROCESS THE 'PC' COMMAND WHICH * C * CONTROLS THE PROGRAMMED COMMAND MODE. PROGRAMMED COM- * C * MANDS ARE SIMPLY COMMANDS THAT ARE TYPED IN ONCE AND * C * EXECUTED ONCE AFTER EACH MACHINE MOVE IS TYPED OUT. * C * PROGRAMMED COMMAND MODE IS TERMINATED BY TYPING THE * C * 'PC' COMMAND AGAIN. THE NEXT TIME 'PC' IS ENTERED, THE * C * COMMAND BUFFER IS INITIALIZED AND NEW COMMANDS WILL BE * C * ACCEPTED. THE MOST COMMON COMMAND TO USE IN THIS MODE * C * IS THE 'D' COMMAND TO DISPLAY THE BOARD AFTER EACH MA- * C * CHINE MOVE. AS MANY COMMANDS AS DESIRED (UP TO 10) MAY * C * BE USED, WHEN NO MORE COMMANDS ARE TO BE ENTERED, TYPE * C * A BLANK LINE (CARRIAGE RETURN WILL DO). * C * THERE ARE NO RESTRICTIONS AS TO WHAT COMMANDS CAN * C * BE USED, BUT SOME CAUTION SHOULD BE USED. IT WOULD NOT * C * BE WISE TO USE THE 'F' COMMAND AS THE COMMAND PROCESSOR * C * WILL EXPECT YOU TO TYPE IN A MOVE TO FORCE THE COMPUTER * C * TO TAKE. THIS AND OTHERS, WHILE NOT ILLEGAL, ARE IM- * C * PRACTICAL. * C * THE ONLY ABSOLUTE NO-NO IS TO ENTER THE 'PC' COM- * C * MAND AS A PROGRAMMED COMMAND. THIS WILL CAUSE RE- * C * CURSION WITH ATTENDANT PROBLEMS IN FORTRAN. * C * * C ************************************************************ C SUBROUTINE PMVMKR C C ************************************************************ C * * C * PMVMKR IS USED TO PERMANANTLY MAKE MOVES ON THE * C * GAME BOARD. IT USES THE USUAL 'MOVER'/'UMOVER' ROU- * C * TINES TO MOVE PIECES AROUND AND THEN CHECKS ON THE STA- * C * TUS OF MOVES AND SQUARES WHICH COULD AFFECT CASTLING * C * STATUS. IT IS ONLY USED TO MAKE HUMAN MOVES AND COM- * C * PUTER MOVES WHEN THEY ARE TO BE MADE AFTER MOVE CAL- * C * CULATION. * C * * C ************************************************************ C LOGICAL FUNCTION PPUSH(SQUARE,SIDE) C C ************************************************************ C * * C * PPUSH IS USED TO DETERMINE IF A PIECE ON 'SQUARE' * C * BE ATTACKED BY PUSHING A PAWN. IF A PAWN CAN BE USED * C * TO ATTACK 'SQUARE' PPUSH IS SET TO TRUE UNLESS THE * C * PAWN CAN BE CAPTURED BY A PAWN ON THE SAME RANK AS * C * 'SQUARE'. DOUBLE RANK ADVANCES ARE ALSO CHECKED FOR * C * PAWNS STILL ON THEIR ORIGINAL SQUARE. * C * * C ************************************************************ C SUBROUTINE PREANL C C ************************************************************ C * * C * PREANL IS USED TO SET THE PIECE CONTROL BOARDS TO * C * CONTROL PROGRAM STRATEGY. THERE IS A CONTROL BOARD * C * FOR EACH TYPE OF PIECE TO CONTROL HOW TO BEST USE IT * C * IN FORMING STRATEGY. INITIALLY, ALL BOARDS ARE SET TO * C * ATTRACT PIECES TOWARD THE CENTER OF THE BOARD, AND AF- * C * TER DEVELOPMENT IS COMPLETE, THE BOARDS ATTRACT PIECES * C * TOWARD THE VICINITY OF THE OPPONENT'S KING OR GOOD * C * SQUARES TO CONTROL. * C * THEN A SPECIFIC SUBROUTINE IS CALLED FOR EACH PIECE * C * TYPE TO SET SPECIFIC TACTICAL VALUES BEFORE THE ACTUAL * C * SEARCH IS STARTED. FOR EXAMPLE, KNIGHTS ARE DRIVEN * C * AWAY FROM THE EDGE OF THE BOARD, BISHOPS ARE ATTRACTED * C * TO STRONG DIAGONALS, ETC. * C * * C ************************************************************ C INTEGER FUNCTION PSCORE(SQUARE,SIDE) C C ************************************************************ C * * C * PSCORE IS USED TO COMPUTE THE PLAUSIBILITY SCORE * C * FOR PAWN MOVES. THE SCORE IS OBTAINED DIRECTLY FROM * C * THE PAWN CONTROL BOARD FOR THE SIDE TO MOVE. (CPSCOR, * C * HPSCOR IN COMMON BLOCK 'P BD SM'). * C * THE SCORE IS ADJUSTED AS INDICATED FOR EACH OF THE * C * FOLLOWING FACTORS PRESENT: C * 1) BONUS FOR ADVANCING A PASSED PAWN * C * 2) BONUS FOR PUSHING A PAWN TO A SQUARE WHERE IT * C * BECOMES PASSED, IE. PUSHING IT PAST A PAWN * C * WHICH COULD CAPTURE IT (EXCHANGING, POSSIBLY). * C * 3) PENALTY FOR DOUBLING/TRIPLING PAWNS. * C * 4) BONUS FOR KEEPING PAWNS CONNECTED. * C * 5) BONUS FOR KEEPING PAWNS ABREAST (FLUID). * C * 6) PENALTY FOR MOVING A PAWN TO A SQUARE WHERE IT * C * IS ISOLATED. * C * * C ************************************************************ C INTEGER FUNCTION QSCORE(SQUARE,SIDE) C C ************************************************************ C * * C * QSCORE IS USED TO COMPUTE THE PLAUSIBILITY SCORE * C * FOR QUEEN MOVES. THE SCORE IS OBTAINED DIRECTLY FROM * C * THE QUEEN CONTROL BOARD FOR THE SIDE TO MOVE. (CQSCOR, * C * HQSCOR IN COMMON BLOCK 'Q BD SM'). * C * * C ************************************************************ C SUBROUTINE QUERY C C ************************************************************ C * * C * QUERY IS USED TO QUERY THE OPERATOR ABOUT THE * C * AMOUNT OF TIME REMAINING ON THE PROGRAM'S CHESS CLOCK. * C * FOR THE FIRST THIRTY MOVES, THE QUERY IS MADE EACH 10 * C * MOVES; AFTER THAT THE QUERY IS MADE EACH 3 MOVES. FOR * C * EXAMPLE, THE OPERATOR WOULD BE ASKED ON MOVE 10,20,30, * C * 33,36,39,43,46,49,53,56,59. NOTICE THAT AFTER 30 MOVES,* C * EVERY 3RD IS USED, SKIPPING THE 10TH SINCE THE CLOCK * C * IS RESET EACH 10TH MOVE IN TOURNAMENT PLAY. * C * * C ************************************************************ C SUBROUTINE RCMND(RESTRT) C C ************************************************************ C * * C * RCMND IS USED TO PROCESS THE 'R' COMMAND WHICH CAN * C * RESET THE BOARD TO THE POSITION AFTER ANY PRIOR MOVE. * C * THE BOARD IS ALWAYS RESET TO THE POSITION FOR THE MOVE * C * INDICATED, SO THAT IT IS THE HUMAN'S TURN TO MOVE. FOR * C * EXAMPLE, IF THE COMPUTER IS WHITE, AND YOU WISH TO BACK * C * UP TO MOVE 15, THE MOVE FOR BLACK LISTED UNDER MOVE 15 * C * WOULD NOT BE MADE. * C * 'RK' IS AN ALTERNATIVE WAY TO SET THE BOARD TO *^] C * SET UP A BOARD POSITION. IN THIS MODE, YOU CAN KEY * C * MOVES IN FOR BOTH SIDES, STARTING WITH WHITE. THE * C * MOVES WILLBE MADE AS YOU ENTER THEM, TERMINATING * C * WHEN THE CORRECT NUMBER HAVE BEEN TYPED IN OR BY * C * END-OF-FILE. * C * * C ************************************************************ C SUBROUTINE ROOK C C ************************************************************ C * * C * ROOK GENERATES ALL ROOK MOVES AND VERTICAL/HORI- * C * ZONTAL MOVES FOR THE QUEEN. SUBROUTINE SCORE IS CALLED * C * TO COMPUTE THE PLAUSIBILITY SCORE FOR THE MOVE, AFTER * C * WHICH THE MOVE IS ENTERED IN THE MOVE LIST. * C * * C ************************************************************ C INTEGER FUNCTION RSCORE(SQUARE,SIDE) C C ************************************************************ C * * C * RSCORE IS USED TO COMPUTE THE PLAUSIBILITY SCORE * C * FOR ROOK MOVES. THE SCORE IS OBTAINED DIRECTLY FROM * C * THE ROOK CONTROL BOARD FOR THE SIDE TO MOVE. (CRSCOR, * C * HRSCOR IN COMMON BLOCK 'R BD SM'). * C * THE SCORE IS ADJUSTED AS INDICATED FOR EACH OF THE * C * FOLLOWING FACTORS PRESENT: * C * 1) BONUS FOR MOVING TO THE 7TH OR 8TH RANK WHILE * C * THE OPPONENT'S KING IS STILL ON THE 8TH RANK. * C * 2) BONUS FOR MOVING TO AN OPEN OR HALF OPEN FILE. * C * 3) BONUS FOR DOUBLING ROOKS ON AN OPEN FILE. * C * * C ************************************************************ C SUBROUTINE SAVER C C ************************************************************ C * * C * SAVER WITH IT'S TWO ENTRY POINTS 'SAVE GB' AND * C * 'REST GB' IS USED TO SAVE/RESTORE THE GAME BOARD AND * C * CASTLING STATUS. THIS IS USED BY ROUTINES WHICH * C * MUST MODIFY THE GAME BOARD TO PROCESS VARIOUS COMMANDS * C * AND THEN NEED TO RESTORE IT TO 'AS IT WAS' AFTER FIN- * C * ISHING PROCESSING. * C * * C ************************************************************ C SUBROUTINE SCMND(*) C C ************************************************************ C * * C * SCMND IS USED TO CONTROL THE PRUNING OF THE TREE * C * DURING MOVE CALCULATION. THERE ARE FOUR BASIC PRUNING * C * FUNCTIONS TO CONTROL: * C * 1) 'SD' : LOOK-AHEAD DEPTH CONTROL. THIS CONTROLS * C * HOW FAR THE PROGRAM LOOKS AHEAD IN TERMS OF * C * HALF MOVES OR 'PLIES'. * C * 2) 'SW' : FORWARD PRUNING WIDTHS. THIS CONTROLS * C * 'FANOUT' OR NUMBER OF MOVES AT EACH LEVEL THE * C * PROGRAM WILL CONSIDER. FOR EXAMPLE, IF ON THE * C * FIRST PLY, THE MACHINE HAS 40 LEGAL MOVES AND * C * PRUNING WIDTH FOR PLY 1 IS SET AT 20, ONLY THE * C * BEST (HOPEFULLY) 20 MOVES WILL BE CONSIDERED, * C * IGNORING THE BOTTOM 20. THIS CAN RESULT IN A * C * TREMENDOUS SPEED-UP IN MOVE CALCULATION TIME, * C * BUT CAN ALSO RESULT IN PATHETIC BLUNDERS SINCE * C * THE PROGRAM CAN'T KNOW WHICH ARE THE BEST 20 * C * MOVES UNTIL IT HAS ACTUALLY LOOKED AT THEM. THIS* C * SOMEWHAT PROBABLISTIC PRUNING STILL IS QUITE AD- * C * VANTAGEOUS JUST TO IGNORE THE LAST 5 MOVES. * C * 'SW1' SETS THE MINIMUM FORWARD PRUNING WIDTHS * C * (ALSO THE DEFAULTS IF TIMING IS NOT IN EFFECT) * C * FOR THE PROGRAM TO USE. 'SW2' SETS THE MAXIMUM * C * VALUES THE WIDTHS MAY BE ADJUSTED TO WHEN USING * C * THE CLOCK TO CONTROL SEARCH TIME. * C * 3) 'S1' CHECK RE-ORDERING LEVEL. THIS IS THE LIMIT * C * BELOW WHICH ALL CHECKING MOVES ARE EXAMINED. * C * AFTER MOVE GENERATION, THE MOVE LIST IS RE- * C * ORDERED ACCORDING TO NORMAL RULES AND FORWARD * C * PRUNING IS DONE. IF BELOW THE CHECK RE-ORDERING * C * LEVEL, ALL CHECKING MOVES THAT WERE FORWARD * C * PRUNED ARE MOVED UP AND THE WIDTH IS INCREASED * C * TO INCLUDE THEM AS WELL. THIS WILL HELP THE * C * PROGRAM FIND MATES AND AVOID THEM AS WELL. * C * 4) 'S2' CAPTURE RE-ORDERING LEVEL. THIS IS THE * C * LIMIT BELOW WHICH ALL CAPTURES WILL BE EXAMINED, * C * EVEN IF THE CAPTURE IS A SACRIFICE OR LOSS. * C * * C ************************************************************ C SUBROUTINE SCORE C C ************************************************************ C * * C * THIS SUBROUTINE PERFORMS ALL PLAUSIBLITY SCORING * C * FOR MOVES AS THEY ARE GENERATED. AFTER CALLING THE * C * APPROPRIATE SCORING MODULE, OTHER PLAUSIBILITY ANALYSIS * C * IS CARRIED OUT IF THIS IS A PIECE MOVE. INDIVIDUAL * C * SCORING ALGORITHMS AND CALLS ARE EXPLAINED BELOW. * C * * C ************************************************************ C SUBROUTINE SETBBD C C ************************************************************ C * * C * SETBBD IS USED TO SET THE BISHOP CONTROL BOARDS IN * C * COMMON BLOCK 'B BD SM'. THE BOARD IS SET UP EITHER * C * AROUND THE CENTER OR AROUND THE OPPONENT'S KING BASED * C * ON WHETHER OR NOT THE OPENING IS COMPLETE. THE * C * FOLLOWING SCORING CONSIDERATIONS ARE INCLUDED IN THE * C * CONTROL BOARD: * C * 1) THE SQUARES IN FRONT OF UNMOVED CENTER PAWNS ARE * C * GIVEN PENALTIES TO PREVENT BLOCKING THEM IN. * C * 2) A BONUS IS GIVEN TO EJECT THE BISHOPS FROM THE * C * BACK ROW IN THE OPENING OF THE GAME. * C * * C ************************************************************ C SUBROUTINE SETBRD C C ************************************************************ C * * C * SETBRD IS USED TO SET UP THE BOARD IN ANY POSITION * C * DESIRED. IT USES A FORSYTHE LIKE STRING OF CHARACTERS * C * TO DESCRIBE THE BOARD POSITION. THE BOARD SQUARES * C * ARE NUMBERED AS FOLLOWS: * C * * C * 1 2 3 4 5 6 7 8 * C * 9 10 11 12 13 14 15 16 * C * 17 18 19 20 21 22 23 24 * C * 25 26 27 28 29 30 31 32 * C * 33 34 35 36 37 38 39 40 * C * 41 42 43 44 45 46 47 48 * C * 49 50 51 52 53 54 55 56 * C * 57 58 59 60 61 62 63 64 * C * * C * USING STANDARD PIECE CODES, SIMPLY TYPE IN THE * C * CODE FOR THE PIECE YOU WISH TO PLACE THERE STARTING * C * WITH COMPUTER PIECES. USE A NUMBER BETWEEN 1 AND 8 TO * C * INDICATE EMPTY SQUARES. WHEN ALL COMPUTER PIECES ARE * C * DEFINED, TYPE A '.' OR PERIOD IN THE STRING. CONTINUING,* C * START BACK AT SQUARE 1 AND START DEFINING HUMAN PIECES. * C * FOR EXAMPLE, 'K2R4PPP.88888Q75PPP7K ' WOULD DEFINE THE * C * FOLLOWING BOARD POSITION: * C * * C * CK * * CR * * * * * C * CP CP CP * * * * * * C * * * * * * * * * * C * * * * * * * * * * C * * * * * * * * * * C * HQ * * * * * * * * C * * * * * * HP HP HP * C * * * * * * * * HK * C * * C ************************************************************ C SUBROUTINE SETCLK C C ************************************************************ C * * C * THIS SUBROUTINE IS USED TO RESET THE CHESS CLOCK * C * AFTER THE INITIAL NUMBER OF MOVES HAVE BEEN MADE. FOR * C * EXAMPLE, FOR 40 MOVES IN 2 HOURS AND 10 MOVES EACH 1/2 * C * HOUR AFTER THAT, THE CLOCK IS SET TO 30 MINUTES EACH * C * AFTER THE FIRST 40 MOVES HAVE BEEN MADE AND IS RESET TO * C * 30 AFTER EACH SUCCEEDING 10 MOVES ARE MADE. * C * * C ************************************************************ C SUBROUTINE SETGB C C ************************************************************ C * * C * SETGB IS USED TO SET THE GAME BOARD TO IT'S INITIAL * C * POSITION. CASTLING STATUS IS SET FOR THE START OF THE * C * GAME ALSO. * C * * C ************************************************************ C SUBROUTINE SETIO(AUTO,*) C C ************************************************************ C * * C * SETIO IS USED TO OPEN DCB'S F:1 AND F:2 FOR FORTRAN * C * I/O UNITS 1 AND 2 TO SPECIFIC FILES. THE FILE NAMES * C * ARE BASED ON THE PLAYER'S NAME. THE FILES ARE OPENED * C * OUT FIRST TO CREATE THEM FOLLOWED BY INOUT TO BE ABLE * C * TO UPDATE THEM. IF RESTARTING A GAME, INOUT IS USED * C * SO AS NOT TO DELETE THE STATUS OF THE GAME THAT IS * C * BEING RESTARTED. * C * 'SAVEGM' IS AN ENTRY POINT USED TO SAVE THE GAME * C * STATUS AFTER EACH MOVE SO THAT THE GAME MAY BE RE- * C * STARTED IF COMMUNICATION IS LOST OF THE SYSTEM HAS * C * SOME TYPE OF MALFUNCTION. * C * * C ************************************************************ C SUBROUTINE SETKBD C C ************************************************************ C * * C * SETKBD IS USED TO SET THE KING CONTROL BOARDS IN * C * COMMON BLOCK 'K BD SM'. THE BOARD IS SET UP EITHER * C * AROUND THE CENTER OR AROUND THE OPPONENT'S KING BASED * C * ON WHETHER OR NOT THE OPENING IS COMPLETE. THE * C * FOLLOWING SCORING CONSIDERATIONS ARE INCLUDED IN THE * C * CONTROL BOARD: * C * 1) IF THE OPPONENT'S QUEEN IS STILL ON THE BOARD, * C * THE CONTROL BOARD IS SET UP TO KEEP THE KING BE * C * HIND THE PAWNS HE IS CLOSE TO. THIS KEEPS THE * C * KING FROM BEING EXPOSED TO ATTACK. * C * 2) IF THE ONE SIDE DOESN'T HAVE A QUEEN, OR THE * C * GAME IS IN THE ENDGAME PHASE, THEN THE KINGS * C * ARE GIVEN MORE SPECIFIC GOALS. THAT IS, IF * C * PAWNS ARE ONLY ON 1 WING, THEN THE KINGS * C * GO IN THAT DIRECTION (TRY TO HEAD THEM OFF/ * C * ADVANCE THEM). IF PAWNS ARE PRESENT ON BOTH * C * SIDES OF THE BOARD, THEN THE KINGS WILL CEN- * C * TRALIZE. * C * * C ************************************************************ C SUBROUTINE SETNBD C C ************************************************************ C * * C * SETNBD IS USED TO SET THE KNIGHT CONTROL BOARDS IN * C * COMMON BLOCK 'N BD SM'. THE BOARD IS SET UP EITHER * C * AROUND THE CENTER OR AROUND THE OPPONENT'S KING BASED * C * ON WHETHER OR NOT THE OPENING IS COMPLETE. THE * C * FOLLOWING SCORING CONSIDERATIONS ARE INCLUDED IN THE * C * CONTROL BOARD: * C * 1) THE BORDER SQUARES ARE GIVEN LOWER VALUES TO * C * PREVENT THE KNIGHT FROM GETTING ON THE EDGE OF * C * THE BOARD WHERE MUCH OF IT'S EFFECTIVENESS IS * C * LOST DUE TO RESTRICTED MOBILITY. * C * * C ************************************************************ C SUBROUTINE SETOPN C C ************************************************************ C * * C * SETOPN IS USED TO GIVE THE USER SOME DEGREE OF * C * CONTROL OVER WHICH OPENING THE PROGRAM WILL PLAY AND * C * ALSO WHICH LINE THE PROGRAM WILL USE OUT OF THE LINES * C * INCLUDED IN THE BOOKMOVE FILE. THIS SUBROUTINE SETS * C * VARIABLE 'MVNUMB' SO THAT BOOK WILL CHOSE 'MVNUMB' * C * MOVE OUT OF IT'S LIST OF ALTERNATIVE MOVES. FOR EX- * C * AMPLE, '3' WOULD CAUSE IT TO CHOSE THE 3RD POSSIBILITY * C * FOR IT'S NEXT MOVE. EACH TIME BOOK USES 'MVNUMB' IT IS * C * RESET TO 1 SINCE USUALLY THE GOOD VARIATIONS WILL BE * C * FIRST. 'SO' CAN BE USED AS MANY TIMES AS DESIRED TO * C * MAKE THE PROGRAM FOLLOW ANY LINE IN IT'S 'BOOK'. * C * * C ************************************************************ C SUBROUTINE SETPBD C C ************************************************************ C * * C * SETPBD IS USED TO SET THE PAWN CONTROL BOARDS * C * USED IN CONTROLLING PAWN ADVANCES. THE CENTER TWO * C * PAWNS ARE ALWAYS ENCOURAGED TO ADVANCE, THE PAWNS ON * C * THE OPPOSITE SIDE OF THE BOARD FROM THE CASTLED KING * C * ARE ENCOURAGED ALSO. THE PAWNS IN FRONT OF THE CASTLED * C * KING ARE ENCOURAGED TO STAY PUT UNTIL THE OPPONENT'S * C * QUEEN IS OFF OF THE BOARD OR UNTIL THE KING HAS MOVED * C * OUT FROM BEHIND THEIR PROTECTIVE SCREEN. * C * * C ************************************************************ C SUBROUTINE SETPCV C C ************************************************************ C * * C * SETPCV IS USED TO SET THE MATERIAL VALUE FOR EACH * C * SIDE SO THAT THE SIDE WHICH IS MATERIAL AHEAD WILL * C * TEND TO EXCHANGE WHILE THE SIDE THAT IS MATERIAL BE- * C * HIND WILL TEND TO AVOID EXCHANGES. * C * * C ************************************************************ C SUBROUTINE SETQBD C C ************************************************************ C * * C * SETQBD IS USED TO SET THE QUEEN CONTROL BOARDS IN * C * COMMON BLOCK 'Q BD SM'. THE BOARD IS SET UP EITHER * C * AROUND THE CENTER OR AROUND THE OPPONENT'S KING BASED * C * ON WHETHER OR NOT THE OPENING IS COMPLETE. THE * C * FOLLOWING SCORING CONSIDERATIONS ARE INCLUDED IN THE * C * CONTROL BOARD: * C * 1) THE SQUARE WHERE THE QUEEN IS SITTING IS GIVEN * C * A HIGHER VALUE DURING THE OPENING OF THE GAME TO * C * TEND TO MAKE THE QUEEN STAY IN ONE PLACE UNTIL * C * DEVELOPMENT IS COMPLETE. EARLY QUEEN MOVES * C * USUALLY RESULT IN LOST TEMPI DUE TO MOVING THE * C * QUEEN AROUND TO AVOID ATTACKS. * C * * C ************************************************************ C SUBROUTINE SETRBD C C ************************************************************ C * * C * SETRBD IS USED TO SET THE ROOK CONTROL BOARDS IN * C * COMMON BLOCK 'R BD SM'. THE BOARD IS SET UP EITHER * C * AROUND THE CENTER OR AROUND THE OPPONENT'S KING BASED * C * ON WHETHER OR NOT THE OPENING IS COMPLETE. THE * C * FOLLOWING SCORING CONSIDERATIONS ARE INCLUDED IN THE * C * CONTROL BOARD: * C * 1) THE SQUARES WHERE ROOKS ARE SITTING ARE GIVEN * C * HIGH VALUES DURING THE OPENING OF THE GAME TO * C * TEND TO MAKE THE ROOK STAY IN ONE PLACE UNTIL * C * DEVELOPMENT IS COMPLETE. * C * * C ************************************************************ C SUBROUTINE SETSQ(VALUE,SQ,SCORE) C C ************************************************************ C * * C * SETSQ IS USED BY THE PRE-ANALYZER TO SET UP THE * C * CONTROL BOARDS. IT SETS UP THE BOARD PASSED TO IT AS * C * AN ARGUMENT TO HAVE A VALUE OF 66 IN SQUARE 'SQ' AND * C * 8 LESS IN EACH RING AWAY FROM SQ USING THE DISTANCE * C * FORMULA. NORMALLY, SQ IS THE SQUARE THAT THE KING IS * C * LOCATED ON TO MAKE MOVES TOWARD THE KING GET A HIGHER * C * SCORE AND MOVES AWAY FROM THE KING GET A LOWER SCORE. * C * * C ************************************************************ C SUBROUTINE SETTG C C ************************************************************ C * * C * SETTG IS USED TO SET THE PROGRAM UP FOR TOURNAMENT * C * PLAY WITH AS LITTLE HASSLE AS POSSIBLE. THE FOLLOWING * C * THINGS ARE SET UP AUTOMATICALLY: * C * * C * A) THE SEARCH DEPTH IS SET TO 5, THE DEFAULT * C * FORWARD PRUNING WIDTHS ARE SET TO 6,6,6,6,??, * C * THE MAXIMUM WIDTHS ARE SET TO 13,13,13,13,??. * C * * C * B) THE CLOCK IS TURNED ON AND SET FOR 40 MOVES * C * IN THE FIRST 2 HOURS AND 10 MOVES EACH 1/2 * C * HOUR AFTER THAT. * C * * C * C) THE QUERY CLOCK FLAG IS SET SO THE PROGRAM WILL * C * ASK ABOUT THE CHESS CLOCK. * C * * C * D) THE CLOCK IS SET TO USE ELAPSED TIME RATHER * C * THAN CPU TIME. * C * * C * E) THINK-AHEAD MODE IS TURNED ON * C * * C * F) PROGRAMMED COMMAND MODE IS SET AND A 'P' * C * COMMAND IS ENTERED TO AID THE OPERATOR IN * C * USING THINK-AHEAD. * C * * C ************************************************************ C SUBROUTINE SRCMND C C ************************************************************ C * * C * THIS SUBROUTINE IS USED TO SET THE PERFORMANCE * C * RATING FOR THE OPPONENT. THIS IS USED IN DETERMINING * C * WHEN TO ACCEPT/REJECT A DRAW OR STALEMATE. IF THE * C * OPPONENT IS MUCH BETTER (2 CLASSES OR MORE), THE PRO- * C * WILL ALWAYS ACCEPT. IF ONLY 1 CLASS BETTER, IT WILL * C * ACCEPT UNLESS IT IS 1 1/2 PAWNS OR MORE AHEAD. IF * C * THE PROGRAM IS AS GOOD OR BETTER THAN IT'S OPPONENT, * C * IT WILL ONLY DRAW WHEN BEHIND. * C * * C ************************************************************ C SUBROUTINE STATS(DEVICE) C C ************************************************************ C * * C * STATS IS USED TO PROCESS THE 'S' COMMAND WHICH WILL * C * OUTPUT STATISTICS ABOUT THE GAME AND LAST MOVE SE- * C * LECTION. THE STATISTICS PRINTED ARE: * C * 1) NUMBER OF MOVES GENERATED BY THE MOVE GEN- * C * ERATORS FOR THE LAST MOVE. * C * 2) NUMBER OF NON-TERMINAL NODES IN THE MOVE TREE * C * FOR THE LAST MOVE. THIS IS THE NUMBER OF TIMES * C * THE MOVE GENERATOR WAS CALLED TO GENERATE ALL * C * LEGAL MOVES FOR A POSITION. * C * 3) NUMBER OF TERMINAL NODES IN THE TREE FOR THE * C * LAST MOVE. THIS IS THE NUMBER OF BOARD * C * POSITIONS OR VARIATIONS THAT WERE EXAMINED * C * DURING THE LAST MOVE SELECTION. * C * 4) NUMBER OF NODES EXAMINED AT EACH LEVEL IN THE * C * SEARCH. * C * 5) MINIMAXED SCORE FOR THE MOVE SELECTED. * C * 6) MAXIMUM LOOK-AHEAD INCLUDING MOVES LOOKED EX- * C * AMINED BY SUBROUTINE 'EXCHNG'. * C * 7) AVERAGE TIME/MOVE FOR THE HUMAN AND PROGRAM, * C * AND TIME FOR THE LAST MOVE FOR BOTH SIDES ALSO. * C * 8) NUMBER OF TIMES THE COMPUTER HAS CORRECTLY PRE- * C * DICTED THE OPPONENT'S MOVE WHEN IN 'THINK-AHEAD'* C * MODE. * C * * C ************************************************************ C SUBROUTINE THINK(*,*) C C ************************************************************ C * * C * THINK IS THE DRIVER FOR THE 'THINK ON OPPONENT'S * C * TIME' ALGORITHM. BRIEFLY, THINK TAKES THE PREDICTED * C * MOVE, MAKES IT AND CALLS TO DETERMINE THE PRO- * C * RAMS RESPONSE TO IT. THIS MOVE IS SAVED AND IF THE * C * OPPONENT ACTUALLY MAKES THIS MOVE, THE PROGRAM HAS A * C * RESPONSE READY IMMEDIATELY. THE BREAK KEY MAY BE HIT * C * TO ENTER A MOVE OR COMMAND BEFORE THE PROGRAM HAS * C * FINISHED CALCULATION. IN THIS CASE ONE OF TWO ACTIONS * C * WILL BE TAKEN: * C * 1) IF A COMMAND IS ENTERED (OR A MOVE NOT IN THE * C * FORM DESCRIBED IN 2) BELOW) THE THINK-AHEAD * C * SEARCH IS ABORTED TO CARRY OUT THE COMMAND. * C * THE SEARCH WILL BE RE-STARTED FROM SCRATCH IF * C * A COMMAND IS ENTERED. * C * 2) IF A MOVE IS ENTERED IN IT'S FULLY QUALIFIED * C * FORM (IE P/K2-K4 RATHER THAN P-K4) THEN THE * C * PROGRAM WILL ABORT THE THINK-AHEAD ONLY IF * C * THE MOVE IS NOT IT'S PREDICTED MOVE. THIS * C * MEANS THAT WHATEVER TIME THE PROGRAM HAS USED * C * WHILE CALCULATING WILL NOT BE LOST. IF THE * C * FREE FORM OF INPUT (IE P-K4, ETC.) IS USED * C * THE SEARCH MUST BE RE-STARTED FROM SCRATCH * C * TO FIND THE RESPONSE, EVEN IF IT MATCHED THE * C * PREDICTED MOVE. (NOTE THAT THIS ONLY OCCURS * C * WHEN THE BUTTON IS HIT TO GET THE * C * PROGRAM'S ATTENTION. IF CALCULATION HAS BEEN * C * COMPLETED, THEN THE FREE FORM OF INPUT MAY BE * C * USED WITHOUT HINDERING THE PROGRAM. * C * * C ************************************************************ C SUBROUTINE TIMEX C C ************************************************************ C * * C * TIMER IS USED TO OBTAIN ELAPSED/CPU TIME FOR THE * C * PROGRAM. 'ETIME' IS THE ELAPSED TIME ENTRY POINT AND * C * 'CTIME' IS THE CPU TIME ENTRY POINT. IF THE CLOCK * C * TYPE HAS BEEN FORCED TO ELAPSED BY THE 'CT' COMMAND, * C * THE CPU TIME ROUTINE RETURNS ELAPSED TIME ALSO. * C * ALL TIMES ARE IN SECONDS. * C * * C ************************************************************ C SUBROUTINE TSCORE C C ************************************************************ C * * C * TSCORE IS USED TO COMPUTE THE SCORE OF THE CURRENT * C * VARIATION OF MOVES. WHEN A TERMINAL NODE IS REACHED, * C * TSCORE IS CALLED TO MINIMAX THE PLAUSIBILITY SCORES OF * C * EACH MOVE IN THE CURRENT VARIATION. THIS SIMPLY MEANS * C * ADD UP THE SCORES FOR THE COMPUTER MOVES AND SUBTRACT * C * THE SCORES FOR THE HUMAN MOVES. IF THE LAST MOVE IN * C * THE VARIATION IS NOT A CASTLE, EXCHNG IS CALLED TO * C * ANALYZE THE EXCHANGE POTENTIAL OF THE LAST MOVE. THIS * C * PREVENTS THE PROGRAM FROM GIVING A GOOD SCORE TO A LINE * C * THAT LEAVE A PIECE OPEN TO CAPTURE. * C * * C ************************************************************ C SUBROUTINE VCMND(DEVICE) C C ************************************************************ C * * C * VCMND IS USED TO PROCESS THE 'V' COMMAND WHICH OUT- * C * PUTS THE PRINCIPLE VARIATION FOR THE MACHINE'S CHOSEN * C * MOVE. THE MOVES ARE LISTED AS MACHINES CHOSEN MOVE, * C * HUMAN'S BEST RESPONSE, COMPUTER'S BEST RESPONSE, ETC. * C * FOR AS DEEP AS THE VARIATION GOES. OUTPUT MAY GO TO * C * THE USER TERMINAL OR THE LINE PRINTER. * C * * C ************************************************************ C INTEGER FUNCTION WORTH(SQUARE,SIDE) C C ************************************************************ C * * C * WORTH COMPUTES THE VALUE OR WORTH OF A PIECE ON A * C * GIVEN SQUARE FOR EITHER SIDE. THE VALUE IS THE VALUE * C * OF THE PIECE PLUS THE VALUE RETURNED BY THE SCORING * C * FUNCTION FOR THAT PIECE. * C * * C ************************************************************ C GO TO 999 GO TO 999 GO TO 999 GO TO 999