xref: /original-bsd/games/chess/nondsp.c (revision 3b6250d9)
1 /*
2   UNIX & MSDOS NON-DISPLAY, AND CHESSTOOL interface for Chess
3 
4   Revision: 4-25-88
5 
6   Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc.
7   Copyright (c) 1988  John Stanback
8 
9   This file is part of CHESS.
10 
11   CHESS is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY.  No author or distributor
13   accepts responsibility to anyone for the consequences of using it
14   or for whether it serves any particular purpose or works at all,
15   unless he says so in writing.  Refer to the CHESS General Public
16   License for full details.
17 
18   Everyone is granted permission to copy, modify and redistribute
19   CHESS, but only under the conditions described in the
20   CHESS General Public License.   A copy of this license is
21   supposed to have been given to you along with CHESS so you
22   can know your rights and responsibilities.  It should be in a
23   file named COPYING.  Among other things, the copyright notice
24   and this notice must be preserved on all copies.
25 */
26 
27 
28 #include <stdio.h>
29 #include <ctype.h>
30 #ifdef MSDOS
31 #include <dos.h>
32 #include <stdlib.h>
33 #include <time.h>
34 #else
35 #include <sys/param.h>
36 #include <sys/times.h>
37 #include <sys/file.h>
38 struct tms tmbuf1,tmbuf2;
39 int TerminateSearch(),Die();
40 #endif MSDOS
41 
42 #include "gnuchess.h"
43 #ifdef NEWMOVE
44 #include "move.h"
45 #endif
46 
47 #define printz printf
48 #define scanz scanf
49 int mycnt1,mycnt2;
50 
51 
52 Initialize()
53 {
54   mycnt1 = mycnt2 = 0;
55 #ifndef MSDOS
56 #endif
57 #ifdef CHESSTOOL
58   setlinebuf(stdout);
59 /*
60   setvbuf(stdout,NULL,_IOLBF,BUFSIZ);
61 */
62   printf("Chess\n");
63   if (Level == 0 && !TCflag) Level = 15;
64 #endif CHESSTOOL
65 }
66 
67 ExitChess()
68 {
69   ListGame();
70   exit(0);
71 }
72 
73 #ifndef MSDOS
74 Die()
75 {
76 char s[80];
77   printz("Abort? ");
78   scanz("%s",s);
79   if (strcmp(s,"yes") == 0) ExitChess();
80 }
81 
82 TerminateSearch()
83 {
84   timeout = true;
85   bothsides = false;
86 }
87 #endif MSDOS
88 
89 
90 InputCommand()
91 
92 /*
93    Process the users command. If easy mode is OFF (the computer is
94    thinking on opponents time) and the program is out of book, then make
95    the 'hint' move on the board and call SelectMove() to find a response.
96    The user terminates the search by entering ^C (quit siqnal) before
97    entering a command. If the opponent does not make the hint move, then
98    set Sdepth to zero.
99 */
100 
101 {
102 int i;
103 short ok,tmp;
104 long cnt,rate,t1,t2;
105 unsigned short mv;
106 char s[80];
107 
108   ok = quit = false;
109   player = opponent;
110   ft = 0;
111   if (hint > 0 && !easy && Book == NULL)
112     {
113       fflush(stdout);
114       time0 = time((long *)0);
115       algbr(hint>>8,hint & 0xFF,false);
116       strcpy(s,mvstr1);
117       tmp = epsquare;
118       if (VerifyMove(s,1,&mv))
119         {
120           SelectMove(computer,2);
121           VerifyMove(mvstr1,2,&mv);
122           if (Sdepth > 0) Sdepth--;
123         }
124       ft = time((long *)0) - time0;
125       epsquare = tmp;
126     }
127 
128 #ifndef MSDOS
129 #endif
130   while (!(ok || quit))
131     {
132       PromptForMove();
133       i = scanz("%s",s);
134       if (i == EOF || s[0] == 0) ExitChess();
135       player = opponent;
136       ok = VerifyMove(s,0,&mv);
137       if (ok && mv != hint)
138         {
139           Sdepth = 0;
140           ft = 0;
141         }
142 
143       if (strcmp(s,"bd") == 0)
144         {
145           ClrScreen();
146           UpdateDisplay(0,0,1,0);
147         }
148       if (strcmp(s,"quit") == 0) quit = true;
149       if (strcmp(s,"post") == 0) post = !post;
150       if (strcmp(s,"set") == 0) EditBoard();
151       if (strcmp(s,"go") == 0) ok = true;
152       if (strcmp(s,"help") == 0) help();
153       if (strcmp(s,"force") == 0) force = !force;
154       if (strcmp(s,"book") == 0) Book = NULL;
155       if (strcmp(s,"new") == 0) NewGame();
156       if (strcmp(s,"list") == 0) ListGame();
157       if (strcmp(s,"level") == 0) SelectLevel();
158       if (strcmp(s,"hash") == 0) hashflag = !hashflag;
159       if (strcmp(s,"beep") == 0) beep = !beep;
160       if (strcmp(s,"Awindow") == 0) ChangeAlphaWindow();
161       if (strcmp(s,"Bwindow") == 0) ChangeBetaWindow();
162       if (strcmp(s,"rcptr") == 0) rcptr = !rcptr;
163       if (strcmp(s,"hint") == 0) GiveHint();
164       if (strcmp(s,"zero") == 0) ZeroTTable();
165       if (strcmp(s,"both") == 0)
166         {
167           bothsides = !bothsides;
168           Sdepth = 0;
169           SelectMove(opponent,1);
170           ok = true;
171         }
172       if (strcmp(s,"reverse") == 0)
173         {
174           reverse = !reverse;
175           ClrScreen();
176           UpdateDisplay(0,0,1,0);
177         }
178       if (strcmp(s,"switch") == 0)
179         {
180           computer = otherside[computer];
181           opponent = otherside[opponent];
182           force = false;
183           Sdepth = 0;
184           ok = true;
185         }
186       if (strcmp(s,"white") == 0)
187         {
188           computer = white; opponent = black;
189           ok = true; force = false;
190           Sdepth = 0;
191         }
192       if (strcmp(s,"black") == 0)
193         {
194           computer = black; opponent = white;
195           ok = true; force = false;
196           Sdepth = 0;
197         }
198       if (strcmp(s,"undo") == 0 && GameCnt >= 0) Undo();
199       if (strcmp(s,"remove") == 0 && GameCnt >= 1)
200         {
201           Undo(); Undo();
202         }
203       if (strcmp(s,"get") == 0) GetGame();
204       if (strcmp(s,"save") == 0) SaveGame();
205       if (strcmp(s,"depth") == 0) ChangeSearchDepth();
206       if (strcmp(s,"random") == 0) dither = 6;
207       if (strcmp(s,"easy") == 0) easy = !easy;
208       if (strcmp(s,"contempt") == 0) SetContempt();
209       if (strcmp(s,"xwndw") == 0) ChangeXwindow();
210       if (strcmp(s,"test") == 0)
211         {
212           t1 = time(0);
213           cnt = 0;
214           for (i = 0; i < 10000; i++)
215             {
216               MoveList(opponent,2);
217               cnt += TrPnt[3] - TrPnt[2];
218             }
219           t2 = time(0);
220           rate = cnt / (t2-t1);
221           printz("cnt= %ld  rate= %ld\n",cnt,rate);
222         }
223     }
224 
225   ElapsedTime(1);
226   if (force)
227     {
228       computer = opponent; opponent = otherside[computer];
229     }
230 #ifndef MSDOS
231   (void) times(&tmbuf1);
232 #ifdef CHESSTOOL
233   printf("%d. %s\n",++mycnt2,s);
234 #endif CHESSTOOL
235 #endif MSDOS
236 }
237 
238 
239 help()
240 {
241   ClrScreen();
242   printz("CHESS command summary\n");
243   printz("g1f3      move from g1 to f3\n");
244   printz("nf3       move knight to f3\n");
245   printz("o-o       castle king side\n");
246   printz("o-o-o     castle queen side\n");
247   printz("set       edit board\n");
248   printz("switch    sides with computer\n");
249   printz("white     computer plays white\n");
250   printz("black     computer plays black\n");
251   printz("reverse   board display\n");
252   printz("both      computer match\n");
253   printz("random    randomize play\n");
254   printz("undo      undo last move\n");
255   printz("time      change level\n");
256   printz("depth     set search depth\n");
257   printz("post      principle variation\n");
258   printz("hint      suggest a move\n");
259   printz("bd        redraw board\n");
260   printz("clock     set time control\n");
261   printz("force     enter game moves\n");
262   printz("list      game to chess.lst\n");
263   printz("save      game to file\n");
264   printz("get       game from file\n");
265   printz("new       start new game\n");
266   printz("quit      exit CHESS\n");
267   printz("Computer: ");
268   if (computer == white) printz("WHITE\n"); else printz("BLACK\n");
269   printz("Opponent: ");
270   if (opponent == white) printz("WHITE\n"); else printz("BLACK\n");
271   printz("Response time: %ld",Level," sec.\n");
272   printz("Easy mode: ");
273   if (easy) printz("ON\n"); else printz("OFF\n");
274   printz("Depth: %d\n",MaxSearchDepth);
275   printz("Random: ");
276   if (dither) printz("ON\n"); else printz("OFF\n");
277   printz("Transposition table: ");
278   if (hashflag) printz("ON\n"); else printz("OFF\n");
279   UpdateDisplay(0,0,1,0);
280 }
281 
282 
283 EditBoard()
284 
285 /*
286    Set up a board position. Pieces are entered by typing the piece
287    followed by the location. For example, Nf3 will place a knight on
288    square f3.
289 */
290 
291 {
292 short a,r,c,sq;
293 char s[80];
294 
295   ClrScreen();
296   UpdateDisplay(0,0,1,0);
297   printz(".   exit to main\n");
298   printz("#   clear board\n");
299   printz("enter piece & location: \n");
300 
301   a = white;
302   do
303   {
304     scanz("%s",s);
305     if (s[0] == '#')
306       {
307         for (sq = 0; sq < 64; sq++)
308           {
309             board[sq] = no_piece; color[sq] = neutral;
310           }
311         UpdateDisplay(0,0,1,0);
312       }
313     if (s[0] == 'c' || s[0] == 'C') a = otherside[a];
314     c = s[1]-'a'; r = s[2]-'1';
315     if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
316       {
317         sq = locn[r][c];
318         color[sq] = a;
319         if (s[0] == 'p') board[sq] = pawn;
320         else if (s[0] == 'n') board[sq] = knight;
321         else if (s[0] == 'b') board[sq] = bishop;
322         else if (s[0] == 'r') board[sq] = rook;
323         else if (s[0] == 'q') board[sq] = queen;
324         else if (s[0] == 'k') board[sq] = king;
325         else { board[sq] = no_piece; color[sq] = neutral; }
326       }
327   }
328   while (s[0] != '.');
329   if (board[4] != king) kingmoved[white] = 10;
330   if (board[60] != king) kingmoved[black] = 10;
331   GameCnt = -1; Game50 = 0; Sdepth = 0;
332   InitializeStats();
333   ClrScreen();
334   UpdateDisplay(0,0,1,0);
335 }
336 
337 
338 ShowDepth(ch)
339 char ch;
340 {
341 }
342 
343 ShowResults(score,bstline,ch)
344 short score;
345 unsigned short bstline[];
346 char ch;
347 {
348 #ifndef CHESSTOOL
349 register int i;
350   printz("%2d%c  %5d %4ld %7ld   ",Sdepth,ch,score,et,NodeCnt);
351   for (i = 1; bstline[i] > 0; i++)
352     {
353       algbr((short)(bstline[i] >> 8),(short)(bstline[i] & 0xFF),false);
354       if (i == 9 || i == 17) printz("\n                          ");
355       printz("%5s ",mvstr1);
356     }
357   printz("\n");
358 #endif
359 }
360 
361 
362 SearchStartStuff(side)
363 short side;
364 {
365 #ifndef MSDOS
366 #endif
367 #ifndef CHESSTOOL
368   printz("\nMove# %d    Target= %ld    Clock: %ld\n",
369           TCmoves-TimeControl.moves[side]+1,
370           ResponseTime,TimeControl.clock[side]);
371 #endif
372 }
373 
374 
375 OutputMove()
376 {
377 #ifdef CHESSTOOL
378   printz("%d. ... %s\n",++mycnt1,mvstr1);
379   if (root->flags & draw)
380     {
381       printz("Draw\n");
382       ListGame();
383       exit(0);
384     }
385   if (root->score == -9999)
386     {
387       if (opponent == white) printz("White\n"); else printz("Black\n");
388       ListGame();
389       exit(0);
390     }
391   if (root->score == 9998)
392     {
393       if (computer == white) printz("White\n"); else printz("Black\n");
394       ListGame();
395       exit(0);
396     }
397 #else
398   printz("Nodes= %ld  Eval= %ld  Hash= %ld  Rate= %ld  ",
399           NodeCnt,EvalNodes,HashCnt,evrate);
400   printz("CPU= %.2ld:%.2ld.%.2ld\n\n",
401           cputimer/6000,(cputimer % 6000)/100,cputimer % 100);
402 
403   if (root->flags & epmask) UpdateDisplay(0,0,1,0);
404   else UpdateDisplay(root->f,root->t,0,root->flags & cstlmask);
405   printz("My move is: %s\n\n",mvstr1);
406   if (beep) printz("%c",7);
407 
408   if (root->flags & draw) printz("Draw game!\n");
409   else if (root->score == -9999) printz("opponent mates!\n");
410   else if (root->score == 9998) printz("computer mates!\n");
411   else if (root->score < -9000) printz("opponent will soon mate!\n");
412   else if (root->score > 9000)  printz("computer will soon mate!\n");
413 #endif CHESSTOOL
414 }
415 
416 
417 ElapsedTime(iop)
418 short iop;
419 
420 /*
421    Determine the time that has passed since the search was started. If
422    the elapsed time exceeds the target (ResponseTime+ExtraTime) then set
423    timeout to true which will terminate the search.
424 */
425 
426 {
427   et = time((long *)0) - time0;
428   if (et < 0) et = 0;
429   ETnodes += 50;
430   if (et > et0 || iop == 1)
431     {
432       if (et > ResponseTime+ExtraTime && Sdepth > 1) timeout = true;
433       et0 = et;
434       if (iop == 1)
435         {
436           time0 = time((long *)0); et0 = 0;
437         }
438 #ifdef MSDOS
439       cputimer = 100*et;
440       if (et > 0) evrate = NodeCnt/(et+ft); else evrate = 0;
441       if (kbhit() && Sdepth > 1)
442         {
443           timeout = true;
444           bothsides = false;
445         }
446 #else
447       (void) times(&tmbuf2);
448       cputimer = 100*(tmbuf2.tms_utime - tmbuf1.tms_utime) / HZ;
449       if (cputimer > 0) evrate = (100*NodeCnt)/(cputimer+100*ft);
450       else evrate = 0;
451 #endif MSDOS
452       ETnodes = NodeCnt + 50;
453     }
454 }
455 
456 
457 SetTimeControl()
458 {
459   if (TCflag)
460     {
461       TimeControl.moves[white] = TimeControl.moves[black] = TCmoves;
462       TimeControl.clock[white] = TimeControl.clock[black] = 60*(long)TCminutes;
463     }
464   else
465     {
466       TimeControl.moves[white] = TimeControl.moves[black] = 0;
467       TimeControl.clock[white] = TimeControl.clock[black] = 0;
468       Level = 60*(long)TCminutes;
469     }
470   et = 0;
471   ElapsedTime(1);
472 }
473 
474 
475 ClrScreen()
476 {
477 #ifndef CHESSTOOL
478   printz("\n");
479 #endif
480 }
481 
482 
483 UpdateDisplay(f,t,flag,iscastle)
484 short f,t,flag,iscastle;
485 {
486 #ifndef CHESSTOOL
487 short r,c,l;
488   if (flag)
489     {
490       printz("\n");
491       for (r = 7; r >= 0; r--)
492         {
493           for (c = 0; c <= 7; c++)
494             {
495               if (reverse) l = locn[7-r][7-c]; else l = locn[r][c];
496               if (color[l] == neutral) printz(" -");
497               else if (color[l] == white) printz(" %c",qxx[board[l]]);
498               else printz(" %c",pxx[board[l]]);
499             }
500           printz("\n");
501         }
502       printz("\n");
503     }
504 #endif CHESSTOOL
505 }
506 
507 
508 GetOpenings()
509 
510 /*
511    Read in the Opening Book file and parse the algebraic notation for a
512    move into an unsigned integer format indicating the from and to
513    square. Create a linked list of opening lines of play, with
514    entry->next pointing to the next line and entry->move pointing to a
515    chunk of memory containing the moves. More Opening lines of up to 256
516    half moves may be added to gnuchess.book.
517 */
518 
519 {
520 FILE *fd;
521 int c,i,j,side;
522 char buffr[2048];
523 struct BookEntry *entry;
524 unsigned short mv,*mp,tmp[100];
525 
526   if ((fd = fopen("gnuchess.book","r")) != NULL)
527     {
528 /*
529       setvbuf(fd,buffr,_IOFBF,2048);
530 */
531       Book = NULL;
532       i = 0; side = white;
533       while ((c = parse(fd,&mv,side)) >= 0)
534         if (c == 1)
535           {
536             tmp[++i] = mv;
537             side = otherside[side];
538           }
539         else if (c == 0 && i > 0)
540           {
541             entry = (struct BookEntry *)malloc(sizeof(struct BookEntry));
542             mp = (unsigned short *)malloc((i+1)*sizeof(unsigned short));
543             entry->mv = mp;
544             entry->next = Book;
545             Book = entry;
546             for (j = 1; j <= i; j++) *(mp++) = tmp[j];
547             *mp = 0;
548             i = 0; side = white;
549           }
550       fclose(fd);
551     }
552 }
553 
554 
555 int parse(fd,mv,side)
556 FILE *fd;
557 unsigned short *mv;
558 short side;
559 {
560 int c,i,r1,r2,c1,c2;
561 char s[100];
562   while ((c = getc(fd)) == ' ');
563   i = 0; s[0] = c;
564   while (c != ' ' && c != '\n' && c != EOF) s[++i] = c = getc(fd);
565   s[++i] = '\0';
566   if (c == EOF) return(-1);
567   if (s[0] == '!' || i < 3)
568     {
569       while (c != '\n' && c != EOF) c = getc(fd);
570       return(0);
571     }
572   if (s[4] == 'o')
573     if (side == black) *mv = 0x3C3A; else *mv = 0x0402;
574   else if (s[0] == 'o')
575     if (side == black) *mv = 0x3C3E; else *mv = 0x0406;
576   else
577     {
578       c1 = s[0] - 'a'; r1 = s[1] - '1';
579       c2 = s[2] - 'a'; r2 = s[3] - '1';
580       *mv = (locn[r1][c1]<<8) + locn[r2][c2];
581     }
582   return(1);
583 }
584 
585 
586 GetGame()
587 {
588 FILE *fd;
589 char fname[40];
590 int c;
591 short sq;
592 unsigned short m;
593 
594   printz("Enter file name: ");
595   scanz("%s",fname);
596   if (fname[0] == '\0') strcpy(fname,"chess.000");
597   if ((fd = fopen(fname,"r")) != NULL)
598     {
599       fscanf(fd,"%hd%hd%hd",&computer,&opponent,&Game50);
600       fscanf(fd,"%hd%hd%hd%hd",
601              &castld[white],&castld[black],
602              &kingmoved[white],&kingmoved[black]);
603       fscanf(fd,"%hd%hd",&TCflag,&OperatorTime);
604       fscanf(fd,"%ld%ld%hd%hd",
605              &TimeControl.clock[white],&TimeControl.clock[black],
606              &TimeControl.moves[white],&TimeControl.moves[black]);
607       for (sq = 0; sq < 64; sq++)
608         {
609           fscanf(fd,"%hd",&m);
610           board[sq] = (m >> 8); color[sq] = (m & 0xFF);
611           if (color[sq] == 0) color[sq] = neutral; else --color[sq];
612         }
613       GameCnt = -1; c = '?';
614       while (c != EOF)
615         {
616           ++GameCnt;
617           c = fscanf(fd,"%hd%hd%hd%ld%hd%hd%hd",&GameList[GameCnt].gmove,
618                      &GameList[GameCnt].score,&GameList[GameCnt].depth,
619                      &GameList[GameCnt].nodes,&GameList[GameCnt].time,
620                      &GameList[GameCnt].piece,&GameList[GameCnt].color);
621           if (GameList[GameCnt].color == 0) GameList[GameCnt].color = neutral;
622           else --GameList[GameCnt].color;
623         }
624       GameCnt--;
625       if (TimeControl.clock[white] > 0) TCflag = true;
626       computer--; opponent--;
627     }
628   fclose(fd);
629   InitializeStats();
630   UpdateDisplay(0,0,1,0);
631   Sdepth = 0;
632 }
633 
634 
635 SaveGame()
636 {
637 FILE *fd;
638 char fname[40];
639 short sq,i,c;
640 
641   printz("Enter file name: ");
642   scanz("%s",fname);
643 
644   if (fname[0] == '\0' || access(fname,W_OK) == -1) strcpy(fname,"chess.000");
645   fd = fopen(fname,"w");
646   fprintf(fd,"%d %d %d\n",computer+1,opponent+1,Game50);
647   fprintf(fd,"%d %d %d %d\n",
648           castld[white],castld[black],kingmoved[white],kingmoved[black]);
649   fprintf(fd,"%d %d\n",TCflag,OperatorTime);
650   fprintf(fd,"%ld %ld %d %d\n",
651           TimeControl.clock[white],TimeControl.clock[black],
652           TimeControl.moves[white],TimeControl.moves[black]);
653   for (sq = 0; sq < 64; sq++)
654     {
655       if (color[sq] == neutral) c = 0; else c = color[sq]+1;
656       fprintf(fd,"%d\n",256*board[sq] + c);
657     }
658   for (i = 0; i <= GameCnt; i++)
659     {
660       if (GameList[i].color == neutral) c = 0;
661       else c = GameList[i].color + 1;
662       fprintf(fd,"%d %d %d %ld %d %d %d\n",
663               GameList[i].gmove,GameList[i].score,GameList[i].depth,
664               GameList[i].nodes,GameList[i].time,
665               GameList[i].piece,c);
666     }
667   fclose(fd);
668 }
669 
670 
671 ListGame()
672 {
673 FILE *fd;
674 short i,f,t;
675   fd = fopen("chess.lst","w");
676   fprintf(fd,"\n");
677   fprintf(fd,"       score  depth  nodes  time         ");
678   fprintf(fd,"       score  depth  nodes  time\n");
679   for (i = 0; i <= GameCnt; i++)
680     {
681       f = GameList[i].gmove>>8; t = (GameList[i].gmove & 0xFF);
682       algbr(f,t,false);
683       if ((i % 2) == 0) fprintf(fd,"\n"); else fprintf(fd,"         ");
684       fprintf(fd,"%5s  %5d     %2d %6ld %5d",mvstr1,
685               GameList[i].score,GameList[i].depth,
686               GameList[i].nodes,GameList[i].time);
687     }
688   fprintf(fd,"\n\n");
689   fclose(fd);
690 }
691 
692 
693 Undo()
694 
695 /*
696    Undo the most recent half-move.
697 */
698 
699 {
700 short f,t;
701   f = GameList[GameCnt].gmove>>8;
702   t = GameList[GameCnt].gmove & 0xFF;
703   if (board[t] == king && distance(t,f) > 1)
704     castle(GameList[GameCnt].color,f,t,2);
705   else
706     {
707       board[f] = board[t]; color[f] = color[t];
708       board[t] = GameList[GameCnt].piece;
709       color[t] = GameList[GameCnt].color;
710       if (board[f] == king) --kingmoved[color[f]];
711     }
712   if (TCflag) ++TimeControl.moves[color[f]];
713   GameCnt--; mate = false; Sdepth = 0;
714   UpdateDisplay(0,0,1,0);
715   InitializeStats();
716 }
717 
718 
719 ShowMessage(s)
720 char *s;
721 {
722 #ifndef CHESSTOOL
723   printz("%s\n");
724 #endif CHESSTOOL
725 }
726 
727 ShowSidetomove()
728 {
729 }
730 
731 PromptForMove()
732 {
733 #ifndef CHESSTOOL
734   printz("\nYour move is? ");
735 #endif CHESSTOOL
736 }
737 
738 
739 ShowCurrentMove(pnt,f,t)
740 short pnt,f,t;
741 {
742 }
743 
744 ChangeAlphaWindow()
745 {
746   printz("window: ");
747   scanz("%hd",&Awindow);
748 }
749 
750 ChangeBetaWindow()
751 {
752   printz("window: ");
753   scanz("%hd",&Bwindow);
754 }
755 
756 GiveHint()
757 {
758   algbr((short)(hint>>8),(short)(hint & 0xFF),false);
759   printz("try %s\n",mvstr1);
760 }
761 
762 
763 SelectLevel()
764 {
765   OperatorTime = 30000;
766   printz("Enter #moves #minutes: ");
767   scanz("%hd %hd",&TCmoves,&TCminutes);
768   printz("Operator time= ");
769   scanz("%hd",&OperatorTime);
770   TCflag = (TCmoves > 1);
771   SetTimeControl();
772 }
773 
774 
775 ChangeSearchDepth()
776 {
777   printz("depth= ");
778   scanz("%hd",&MaxSearchDepth);
779 }
780 
781 SetContempt()
782 {
783   printz("contempt= ");
784   scanz("%hd",&contempt);
785 }
786 
787 ChangeXwindow()
788 {
789   printz("xwndw= ");
790   scanz("%hd",&xwndw);
791 }
792