Call an engine from BASIC?!

Discussion of chess software programming and technical issues.

Moderators: hgm, Rebel, chrisw

tmokonen
Posts: 1296
Joined: Sun Mar 12, 2006 6:46 pm
Location: Kelowna
Full name: Tony Mokonen

Re: Call an engine from BASIC?!

Post by tmokonen »

Many years ago, Thomas McBurney, author of the chess engines Kanguruh and Minimax (both written in BASIC), sent me a chunk of BASIC code using pipes to communicate with an external program. Keep in mind that this code is for 32 bit Windows, and written in FreeBASIC, and would have to be adapted to 64 bit windows and QB64, but the general idea of using API calls to communicate remains the same.

Code: Select all

'===========================================================================
' Pseudo Winboard chess program written by Thomas McBurney August 2005
'
'The following code is only an example of how to communicate with
'Winboard using a pipe.  
'===========================================================================

' Declare my functions and subs.  FreeBASIC gets upset if I don't do it.
declare function GetCommand() as string
declare function SendCommand(byval WBCmd as string) as integer
declare sub Main

' Declare the API functions we will be using for communicating to Winboard
dim KernelLib as integer
dim shared WriteFile as function (BYVAL hFile AS integer, lpBuffer AS ANY, BYVAL nNumberOfBytesToWrite AS integer, lpNumberOfBytesWritten AS integer, lpOverlapped AS ANY) AS integer
dim shared GetStdHandle as function (BYVAL nStdHandle AS integer) AS integer
dim shared ReadFile as function (BYVAL hFile AS integer, lpBuffer AS ANY, BYVAL nNumberOfBytesToRead AS integer, lpNumberOfBytesRead AS integer, lpOverlapped AS ANY) AS integer
dim shared PeekNamedPipe as function (BYVAL hNamedPipe AS integer, lpBuffer AS ANY, BYVAL nBufferSize AS integer, lpBytesRead AS integer, lpTotalBytesAvail AS integer, lpBytesLeftThisMessage AS integer) AS integer

' Link KernelLib to kernel32.dll
KernelLib = dylibload( "KERNEL32" )

' Link the functions to the appropriate Kernel32 library.
WriteFile = dylibsymbol( KernelLib, "WriteFile" )
GetStdHandle = dylibsymbol( KernelLib, "GetStdHandle" )
ReadFile = dylibsymbol( KernelLib, "ReadFile" )
PeekNamedPipe = dylibsymbol( KernelLib, "PeekNamedPipe" )


 DIM STD_OUTPUT_HANDLE AS integer
 DIM STD_INPUT_HANDLE AS integer
 DIM shared OutputHandle AS integer
 DIM shared InputHandle AS integer
 
 STD_OUTPUT_HANDLE = -11&
 STD_INPUT_HANDLE = -10&

 OutputHandle = GetStdHandle(STD_OUTPUT_HANDLE)
 InputHandle = GetStdHandle(STD_INPUT_HANDLE)
 
 call Main



sub Main

dim sWinboardCmd as string
dim sTemp as string

DO
    sWinboardCmd=GetCommand ' Get command from Winboard
    
    if sWinboardCmd<>"" then
        IF sWinboardCmd="protover 2" THEN
            sTemp="feature myname="+CHR$(34)+"Pseudo chess program written in FreeBASIC"+CHR$(34)
            SendCommand(sTemp)
            SendCommand("feature done=1")
        END IF

        IF sWinboardCmd="quit" THEN EXIT DO ' this will exit the program
        IF sWinboardCmd="e2e4" THEN SendCommand("move e7e5")
        IF sWinboardCmd="g1f3" THEN SendCommand("move b8c6")
    END IF
    sleep 10
LOOP  

END SUB 

function GetCommand() as string

    'This function will retrieve one command at a time from winboard.

    DIM sBuff AS STRING
    DIM iBytesRead AS integer
    DIM iTotalBytes AS integer
    DIM iAvailBytes AS integer
    DIM iReturnCode AS integer
    DIM sTemp as string

    GetCommand=""
    
    ' Null character will make sBuff a C style empty string
    sBuff = CHR$(0) 
    
    ' PeekNamedPipe tells us if there is any data waiting to be retrieved.
     iReturnCode = PeekNamedPipe(InputHandle, BYVAL STRPTR(sBuff), 1, iBytesRead, iTotalBytes, iAvailBytes)

    ' return empty string when there is no data to be retrieved.
    IF iTotalBytes=0 THEN EXIT function
    

    ' Retrieve data
    DO
        iReturnCode = ReadFile(InputHandle, BYVAL STRPTR(sBuff), 1, iBytesRead, BYVAL 0&) 
        IF ASC(sBuff)=10 THEN EXIT DO  ' exit on line feed
        sTemp=sTemp+sBuff
    LOOP
    
    GetCommand=sTemp
    
END function

Function SendCommand(Byval sWBCmd As String) As integer

    Dim iBytesWritten As integer
    Dim iBytes As integer
    Dim iReturnCode As integer
    
    sWBCmd = sWBCmd + chr$(10) ' add line feed to end of string
    
    iBytes = Len(sWBCmd)
    iReturnCode = WriteFile(OutputHandle, ByVal sWBCmd, iBytes, lBytesWritten, ByVal 0&)

    SendCommand = 0

End Function
JBNielsen
Posts: 267
Joined: Thu Jul 07, 2011 10:31 pm
Location: Denmark

Re: Call an engine from BASIC?!

Post by JBNielsen »

tmokonen wrote: Wed May 27, 2020 6:28 am Many years ago, Thomas McBurney, author of the chess engines Kanguruh and Minimax (both written in BASIC), sent me a chunk of BASIC code using pipes to communicate with an external program. Keep in mind that this code is for 32 bit Windows, and written in FreeBASIC, and would have to be adapted to 64 bit windows and QB64, but the general idea of using API calls to communicate remains the same.
Thank you very much! :D
JBNielsen
Posts: 267
Joined: Thu Jul 07, 2011 10:31 pm
Location: Denmark

Re: Call an engine from BASIC?!

Post by JBNielsen »

Dann Corbit wrote: Tue May 26, 2020 12:58 am Use redirection from files. You are trying to put multiple commands on a single command line
Thanks; that helped a lot!

Code: Select all

position startpos moves f2f4 >tempfile.txt 
go movetime 3000
position fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
go movetime 3000
position startpos moves 1.e4 f5
go movetime 3000
But only the output from the first position is as I expected?! :shock: :roll:

Code: Select all

Stockfish 301216 by T. Romstad, M. Costalba, J. Kiiski, G. Linscott
info depth 1 seldepth 1 multipv 1 score cp 70 nodes 20 nps 20000 tbhits 0 time 1 pv d7d5
info depth 2 seldepth 2 multipv 1 score cp 69 nodes 51 nps 51000 tbhits 0 time 1 pv d7d5 b2b3
info depth 3 seldepth 3 multipv 1 score cp 70 nodes 138 nps 69000 tbhits 0 time 2 pv e7e6 d2d3 d7d5
info depth 4 seldepth 4 multipv 1 score cp 9 nodes 612 nps 204000 tbhits 0 time 3 pv d7d5 e2e3 d5d4 d2d3
info depth 5 seldepth 5 multipv 1 score cp 20 nodes 1254 nps 250800 tbhits 0 time 5 pv c7c5 e2e3 d7d5 b1c3 e7e6
info depth 6 seldepth 6 multipv 1 score cp 31 nodes 2308 nps 329714 tbhits 0 time 7 pv g8f6 e2e3 d7d5 g1f3 c7c5 f1e2
info depth 7 seldepth 7 multipv 1 score cp 31 nodes 4739 nps 315933 tbhits 0 time 15 pv e7e6 b1c3 d7d5 g1f3 g8f6 e2e3 b8c6
info depth 8 seldepth 8 multipv 1 score cp 20 nodes 7323 nps 348714 tbhits 0 time 21 pv d7d5 e2e3 e7e6 g1f3 b8c6 f1e2 g8f6 b1c3
info depth 9 seldepth 10 multipv 1 score cp 6 nodes 16411 nps 431868 tbhits 0 time 38 pv d7d5 e2e3 c7c5 b1c3 e7e6 g1f3 g8f6 f1e2 b8c6 e1g1
info depth 10 seldepth 14 multipv 1 score cp 27 nodes 28635 nps 493706 tbhits 0 time 58 pv e7e6 e2e3 g8f6 g2g4 h7h6 b1c3 d7d5 g4g5 h6g5 f4g5
info depth 11 seldepth 14 multipv 1 score cp 28 nodes 46324 nps 520494 tbhits 0 time 89 pv e7e6 e2e3 g8f6 f1e2 d7d5 g1f3 f8e7 d2d3 e8g8 c1d2 c7c5 e1g1
info depth 12 seldepth 16 multipv 1 score cp 25 nodes 55639 nps 540184 tbhits 0 time 103 pv e7e6 e2e3 g8f6 f1e2 d7d5 g1f3 f8d6 c2c4 e8g8 e1g1 d5c4 e2c4 b8c6 d2d4 h7h6
info depth 13 seldepth 19 multipv 1 score cp 25 nodes 65153 nps 547504 tbhits 0 time 119 pv e7e6 e2e3 g8f6 f1e2 f8e7 g1f3 e8g8 d2d3 d7d5 e1g1 c8d7 c2c4 b8c6
info depth 14 seldepth 19 multipv 1 score cp 18 nodes 118655 nps 570456 tbhits 0 time 208 pv d7d5 g1f3 e7e6 e2e3 g8f6 f1e2 f8e7 c2c4 e8g8 e1g1 c7c5 d2d3 c8d7 c1d2
info depth 15 seldepth 19 multipv 1 score cp 24 nodes 170675 nps 590570 tbhits 0 time 289 pv d7d5 g1f3 g8f6 e2e3 e7e6 f1e2 f8e7 c2c4 e8g8 e1g1 c7c5 d2d4 b8c6 b1c3 d5c4 d4c5
info depth 16 seldepth 20 multipv 1 score cp 21 nodes 307476 nps 585668 tbhits 0 time 525 pv d7d5 g1f3 g8f6 e2e3 e7e6 f1e2 c7c5 e1g1 b8c6 d2d4 f8d6 c2c4 c5d4 f3d4 e8g8 b1c3 c6d4 e3d4 d5c4
info depth 17 seldepth 20 multipv 1 score cp 23 nodes 435208 nps 596993 tbhits 0 time 729 pv d7d5 g1f3 g8f6 e2e3 e7e6 f1e2 c7c5 e1g1 b8c6 d2d4 f8e7 c2c4 d5c4 b1c3 c8d7 e3e4 c5d4 f3d4 e8g8
info depth 18 seldepth 25 multipv 1 score cp 36 nodes 772635 nps 597090 hashfull 335 tbhits 0 time 1294 pv d7d5 g1f3 g8f6 e2e3 e7e6 f1e2 c7c5 e1g1 f8e7 c2c4 e8g8 d2d3 b8c6 b1c3 h7h6 c1d2 d5d4 e3d4 c6d4 c3e4
info depth 19 seldepth 25 multipv 1 score cp 39 nodes 1290989 nps 609820 hashfull 527 tbhits 0 time 2117 pv d7d5 g1f3 g8f6 e2e3 e7e6 b1c3 c7c5 f1d3 c8d7 e1g1 f8e7 b2b3 b8c6 c1b2 e8g8 h2h3 c6b4 d3e2 b4c6
info depth 20 seldepth 28 multipv 1 score cp 24 nodes 1854431 nps 616294 hashfull 701 tbhits 0 time 3009 pv d7d5 g1f3
bestmove d7d5 ponder g1f3
info depth 1 currmove a2a3 currmovenumber 1
info depth 1 currmove e2e3 currmovenumber 2
info depth 1 currmove e2e4 currmovenumber 3
info depth 1 currmove g1f3 currmovenumber 4
info depth 1 currmove b2b3 currmovenumber 5
info depth 1 currmove g2g4 currmovenumber 6
info depth 1 currmove f2f4 currmovenumber 7
info depth 1 currmove b2b4 currmovenumber 8
info depth 1 currmove h2h3 currmovenumber 9
info depth 1 currmove a2a4 currmovenumber 10
info depth 1 currmove g2g3 currmovenumber 11
info depth 1 currmove c2c4 currmovenumber 12
info depth 1 currmove d2d4 currmovenumber 13
info depth 1 currmove f2f3 currmovenumber 14
info depth 1 currmove d2d3 currmovenumber 15
info depth 1 currmove c2c3 currmovenumber 16
info depth 1 currmove h2h4 currmovenumber 17
info depth 1 currmove b1a3 currmovenumber 18
info depth 1 currmove b1c3 currmovenumber 19
info depth 1 currmove g1h3 currmovenumber 20
info depth 1 seldepth 1 multipv 1 score cp 90 nodes 20 nps 6 hashfull 0 tbhits 0 time 3009 pv e2e4
info depth 2 currmove e2e4 currmovenumber 1
info depth 2 currmove e2e3 currmovenumber 2
info depth 2 currmove g1f3 currmovenumber 3
info depth 2 currmove b2b3 currmovenumber 4
info depth 2 currmove g2g4 currmovenumber 5
info depth 2 currmove f2f4 currmovenumber 6
info depth 2 currmove b2b4 currmovenumber 7
info depth 2 currmove h2h3 currmovenumber 8
info depth 2 currmove a2a4 currmovenumber 9
info depth 2 currmove g2g3 currmovenumber 10
info depth 2 currmove c2c4 currmovenumber 11
info depth 2 currmove d2d4 currmovenumber 12
info depth 2 currmove f2f3 currmovenumber 13
info depth 2 currmove d2d3 currmovenumber 14
info depth 2 currmove c2c3 currmovenumber 15
info depth 2 currmove h2h4 currmovenumber 16
info depth 2 currmove b1a3 currmovenumber 17
info depth 2 currmove b1c3 currmovenumber 18
info depth 2 currmove a2a3 currmovenumber 19
info depth 2 currmove g1h3 currmovenumber 20
info depth 2 seldepth 2 multipv 1 score cp 75 nodes 52 nps 17 hashfull 0 tbhits 0 time 3010 pv e2e4 c7c5
info depth 3 currmove e2e4 currmovenumber 1
info depth 3 currmove e2e3 currmovenumber 2
info depth 3 currmove g1f3 currmovenumber 3
info depth 3 currmove b2b3 currmovenumber 4
info depth 3 currmove g2g4 currmovenumber 5
info depth 3 currmove f2f4 currmovenumber 6
info depth 3 currmove b2b4 currmovenumber 7
info depth 3 currmove f2f3 currmovenumber 8
info depth 3 currmove d2d3 currmovenumber 9
info depth 3 currmove b1c3 currmovenumber 10
info depth 3 currmove d2d4 currmovenumber 11
info depth 3 currmove g2g3 currmovenumber 12
info depth 3 currmove c2c4 currmovenumber 13
info depth 3 currmove a2a3 currmovenumber 14
info depth 3 currmove c2c3 currmovenumber 15
info depth 3 currmove g1h3 currmovenumber 16
info depth 3 currmove h2h3 currmovenumber 17
info depth 3 currmove a2a4 currmovenumber 18
info depth 3 currmove b1a3 currmovenumber 19
info depth 3 currmove h2h4 currmovenumber 20
info depth 3 seldepth 3 multipv 1 score cp 170 nodes 88 nps 29 hashfull 0 tbhits 0 time 3010 pv e2e4 c7c5 d2d4 c5d4 d1d4
info depth 4 currmove e2e4 currmovenumber 1
info depth 4 currmove e2e3 currmovenumber 2
info depth 4 currmove g1f3 currmovenumber 3
info depth 4 currmove b2b3 currmovenumber 4
info depth 4 currmove g2g4 currmovenumber 5
info depth 4 currmove f2f4 currmovenumber 6
info depth 4 currmove b2b4 currmovenumber 7
info depth 4 currmove f2f3 currmovenumber 8
info depth 4 currmove d2d4 currmovenumber 9
info depth 4 currmove d2d3 currmovenumber 10
info depth 4 currmove b1c3 currmovenumber 11
info depth 4 currmove g2g3 currmovenumber 12
info depth 4 currmove c2c4 currmovenumber 13
info depth 4 currmove a2a3 currmovenumber 14
info depth 4 currmove c2c3 currmovenumber 15
info depth 4 currmove g1h3 currmovenumber 16
info depth 4 currmove h2h3 currmovenumber 17
info depth 4 currmove a2a4 currmovenumber 18
info depth 4 currmove b1a3 currmovenumber 19
info depth 4 currmove h2h4 currmovenumber 20
info depth 4 seldepth 4 multipv 1 score cp 170 nodes 123 nps 40 hashfull 0 tbhits 0 time 3010 pv e2e4 c7c5 d2d4 c5d4
info depth 5 currmove e2e4 currmovenumber 1
info depth 5 currmove e2e3 currmovenumber 2
info depth 5 currmove g1f3 currmovenumber 3
info depth 5 currmove b2b3 currmovenumber 4
info depth 5 currmove g2g4 currmovenumber 5
info depth 5 currmove f2f4 currmovenumber 6
info depth 5 currmove b2b4 currmovenumber 7
info depth 5 currmove f2f3 currmovenumber 8
info depth 5 currmove d2d4 currmovenumber 9
info depth 5 currmove d2d3 currmovenumber 10
info depth 5 currmove b1c3 currmovenumber 11
info depth 5 currmove g2g3 currmovenumber 12
info depth 5 currmove c2c4 currmovenumber 13
info depth 5 currmove a2a3 currmovenumber 14
info depth 5 currmove c2c3 currmovenumber 15
info depth 5 currmove g1h3 currmovenumber 16
info depth 5 currmove h2h3 currmovenumber 17
info depth 5 currmove a2a4 currmovenumber 18
info depth 5 currmove b1a3 currmovenumber 19
info depth 5 currmove h2h4 currmovenumber 20
info depth 5 seldepth 5 multipv 1 score cp 154 upperbound nodes 191 nps 63 hashfull 0 tbhits 0 time 3010 pv e2e4 c7c5
info depth 5 currmove e2e4 currmovenumber 1
info depth 5 currmove e2e3 currmovenumber 2
info depth 5 currmove g1f3 currmovenumber 3
info depth 5 currmove b2b3 currmovenumber 4
info depth 5 currmove g2g4 currmovenumber 5
info depth 5 currmove f2f4 currmovenumber 6
info depth 5 currmove b2b4 currmovenumber 7
info depth 5 currmove f2f3 currmovenumber 8
info depth 5 currmove d2d4 currmovenumber 9
info depth 5 currmove d2d3 currmovenumber 10
info depth 5 currmove b1c3 currmovenumber 11
info depth 5 currmove g2g3 currmovenumber 12
info depth 5 currmove c2c4 currmovenumber 13
info depth 5 currmove a2a3 currmovenumber 14
info depth 5 currmove c2c3 currmovenumber 15
info depth 5 currmove g1h3 currmovenumber 16
info depth 5 currmove h2h3 currmovenumber 17
info depth 5 currmove a2a4 currmovenumber 18
info depth 5 currmove b1a3 currmovenumber 19
info depth 5 currmove h2h4 currmovenumber 20
info depth 5 seldepth 5 multipv 1 score cp 143 upperbound nodes 232 nps 77 hashfull 0 tbhits 0 time 3010 pv e2e4 c7c5
info depth 5 currmove e2e4 currmovenumber 1
info depth 5 currmove e2e3 currmovenumber 2
info depth 5 currmove g1f3 currmovenumber 3
info depth 5 currmove b2b3 currmovenumber 4
info depth 5 currmove g2g4 currmovenumber 5
info depth 5 currmove f2f4 currmovenumber 6
info depth 5 currmove b2b4 currmovenumber 7
info depth 5 currmove f2f3 currmovenumber 8
info depth 5 currmove d2d4 currmovenumber 9
info depth 5 currmove d2d3 currmovenumber 10
info depth 5 currmove b1c3 currmovenumber 11
info depth 5 currmove g2g3 currmovenumber 12
info depth 5 currmove c2c4 currmovenumber 13
info depth 5 currmove a2a3 currmovenumber 14
info depth 5 currmove c2c3 currmovenumber 15
info depth 5 currmove g1h3 currmovenumber 16
info depth 5 currmove h2h3 currmovenumber 17
info depth 5 currmove a2a4 currmovenumber 18
info depth 5 currmove b1a3 currmovenumber 19
info depth 5 currmove h2h4 currmovenumber 20
info depth 5 seldepth 5 multipv 1 score cp 122 upperbound nodes 292 nps 96 hashfull 0 tbhits 0 time 3011 pv e2e4 c7c5
info depth 5 currmove e2e4 currmovenumber 1
info depth 5 currmove e2e3 currmovenumber 2
info depth 5 currmove g1f3 currmovenumber 3
info depth 5 currmove b2b3 currmovenumber 4
info depth 5 currmove g2g4 currmovenumber 5
info depth 5 currmove f2f4 currmovenumber 6
info depth 5 currmove b2b4 currmovenumber 7
info depth 5 currmove f2f3 currmovenumber 8
info depth 5 currmove d2d4 currmovenumber 9
info depth 5 currmove d2d3 currmovenumber 10
info depth 5 currmove b1c3 currmovenumber 11
info depth 5 currmove g2g3 currmovenumber 12
info depth 5 currmove c2c4 currmovenumber 13
info depth 5 currmove a2a3 currmovenumber 14
info depth 5 currmove c2c3 currmovenumber 15
info depth 5 currmove g1h3 currmovenumber 16
info depth 5 currmove h2h3 currmovenumber 17
info depth 5 currmove a2a4 currmovenumber 18
info depth 5 currmove b1a3 currmovenumber 19
info depth 5 currmove h2h4 currmovenumber 20
info depth 5 seldepth 5 multipv 1 score cp 104 upperbound nodes 492 nps 163 hashfull 0 tbhits 0 time 3011 pv e2e4 c7c5
info depth 5 currmove e2e4 currmovenumber 1
info depth 5 currmove e2e3 currmovenumber 2
info depth 5 currmove g1f3 currmovenumber 3
info depth 5 currmove b2b3 currmovenumber 4
info depth 5 currmove g2g4 currmovenumber 5
info depth 5 currmove b2b4 currmovenumber 6
info depth 5 currmove b1c3 currmovenumber 7
info depth 5 currmove f2f4 currmovenumber 8
info depth 5 currmove d2d4 currmovenumber 9
info depth 5 currmove f2f3 currmovenumber 10
info depth 5 currmove d2d3 currmovenumber 11
info depth 5 currmove g2g3 currmovenumber 12
info depth 5 currmove c2c4 currmovenumber 13
info depth 5 currmove a2a3 currmovenumber 14
info depth 5 currmove c2c3 currmovenumber 15
info depth 5 currmove g1h3 currmovenumber 16
info depth 5 currmove h2h3 currmovenumber 17
info depth 5 currmove a2a4 currmovenumber 18
info depth 5 currmove b1a3 currmovenumber 19
info depth 5 currmove h2h4 currmovenumber 20
info depth 5 seldepth 5 multipv 1 score cp 81 upperbound nodes 936 nps 310 hashfull 0 tbhits 0 time 3012 pv e2e4 b8c6
info depth 5 currmove e2e4 currmovenumber 1
info depth 5 currmove e2e3 currmovenumber 2
info depth 5 currmove d2d4 currmovenumber 3
info depth 5 currmove g1f3 currmovenumber 4
info depth 5 currmove b2b3 currmovenumber 5
info depth 5 currmove g2g4 currmovenumber 6
info depth 5 currmove b2b4 currmovenumber 7
info depth 5 currmove b1c3 currmovenumber 8
info depth 5 currmove f2f4 currmovenumber 9
info depth 5 currmove f2f3 currmovenumber 10
info depth 5 currmove d2d3 currmovenumber 11
info depth 5 currmove g2g3 currmovenumber 12
info depth 5 currmove c2c4 currmovenumber 13
info depth 5 currmove a2a3 currmovenumber 14
info depth 5 currmove g1h3 currmovenumber 15
info depth 5 currmove h2h3 currmovenumber 16
info depth 5 currmove c2c3 currmovenumber 17
info depth 5 currmove a2a4 currmovenumber 18
info depth 5 currmove b1a3 currmovenumber 19
info depth 5 currmove h2h4 currmovenumber 20
info depth 5 seldepth 5 multipv 1 score cp 54 nodes 1594 nps 529 hashfull 0 tbhits 0 time 3013 pv e2e4 c7c6 d2d4 d7d5 d1e2 d5e4
info depth 6 currmove e2e4 currmovenumber 1
info depth 6 currmove e2e3 currmovenumber 2
info depth 6 currmove d2d4 currmovenumber 3
info depth 6 currmove b1c3 currmovenumber 4
info depth 6 currmove b2b3 currmovenumber 5
info depth 6 currmove g2g4 currmovenumber 6
info depth 6 currmove g1f3 currmovenumber 7
info depth 6 currmove b2b4 currmovenumber 8
info depth 6 currmove f2f4 currmovenumber 9
info depth 6 currmove f2f3 currmovenumber 10
info depth 6 currmove d2d3 currmovenumber 11
info depth 6 currmove g2g3 currmovenumber 12
info depth 6 currmove c2c4 currmovenumber 13
info depth 6 currmove a2a3 currmovenumber 14
info depth 6 currmove g1h3 currmovenumber 15
info depth 6 currmove c2c3 currmovenumber 16
info depth 6 currmove h2h3 currmovenumber 17
info depth 6 currmove a2a4 currmovenumber 18
info depth 6 currmove b1a3 currmovenumber 19
info depth 6 currmove h2h4 currmovenumber 20
info depth 6 seldepth 6 multipv 1 score cp 47 nodes 2746 nps 910 hashfull 0 tbhits 0 time 3015 pv g1f3 d7d6 d2d4 g8f6 b1c3 c7c6
info depth 7 currmove g1f3 currmovenumber 1
info depth 7 currmove e2e4 currmovenumber 2
info depth 7 currmove d2d4 currmovenumber 3
info depth 7 currmove e2e3 currmovenumber 4
info depth 7 currmove b1c3 currmovenumber 5
info depth 7 currmove b2b4 currmovenumber 6
info depth 7 currmove g2g4 currmovenumber 7
info depth 7 currmove f2f4 currmovenumber 8
info depth 7 currmove b2b3 currmovenumber 9
info depth 7 currmove f2f3 currmovenumber 10
info depth 7 currmove g1h3 currmovenumber 11
info depth 7 currmove g2g3 currmovenumber 12
info depth 7 currmove c2c3 currmovenumber 13
info depth 7 currmove d2d3 currmovenumber 14
info depth 7 currmove a2a3 currmovenumber 15
info depth 7 currmove c2c4 currmovenumber 16
info depth 7 currmove h2h3 currmovenumber 17
info depth 7 currmove a2a4 currmovenumber 18
info depth 7 currmove b1a3 currmovenumber 19
info depth 7 currmove h2h4 currmovenumber 20
info depth 7 seldepth 7 multipv 1 score cp 48 nodes 3837 nps 1272 hashfull 0 tbhits 0 time 3016 pv g1f3 d7d5 e2e3 b8c6 d2d4 e7e6 b1c3
info depth 8 currmove g1f3 currmovenumber 1
info depth 8 currmove e2e4 currmovenumber 2
info depth 8 currmove d2d4 currmovenumber 3
info depth 8 currmove b1c3 currmovenumber 4
info depth 8 currmove e2e3 currmovenumber 5
info depth 8 currmove b2b4 currmovenumber 6
info depth 8 currmove g2g4 currmovenumber 7
info depth 8 currmove b2b3 currmovenumber 8
info depth 8 currmove f2f4 currmovenumber 9
info depth 8 currmove a2a3 currmovenumber 10
info depth 8 currmove f2f3 currmovenumber 11
info depth 8 currmove g1h3 currmovenumber 12
info depth 8 currmove c2c3 currmovenumber 13
info depth 8 currmove h2h3 currmovenumber 14
info depth 8 currmove d2d3 currmovenumber 15
info depth 8 currmove g2g3 currmovenumber 16
info depth 8 currmove a2a4 currmovenumber 17
info depth 8 currmove c2c4 currmovenumber 18
info depth 8 currmove b1a3 currmovenumber 19
info depth 8 currmove h2h4 currmovenumber 20
info depth 8 seldepth 8 multipv 1 score cp 46 nodes 6593 nps 2183 hashfull 4 tbhits 0 time 3020 pv e2e4 d7d5 e4e5 e7e6 d2d4 c7c5 g1f3 b8c6
info depth 9 currmove e2e4 currmovenumber 1
info depth 9 seldepth 13 multipv 1 score cp 46 nodes 7896 nps 2612 hashfull 4 tbhits 0 time 3022 pv e2e4 d7d5 e4e5 e7e6 d2d4 c7c5 g1f3 b8c6
bestmove e2e4 ponder d7d5
bestmove a2a3 ponder d7d5
Dann Corbit
Posts: 12542
Joined: Wed Mar 08, 2006 8:57 pm
Location: Redmond, WA USA

Re: Call an engine from BASIC?!

Post by Dann Corbit »

Make a file of Epd records.
In this case, let's call the file epd.epd
Suppose that this is what the file looks like:

Code: Select all

r2q1rk1/pp2bppp/2n1bn2/3pN1B1/2pP1P2/2N3P1/PP2P1BP/R2Q1RK1 b - -
rn1qk2r/p1p1bppp/1pb1pn2/3p2B1/Q1PP4/P1N2N2/1P2PPPP/R3KB1R w KQkq -
r1bq1rk1/pppn1pbp/3p1np1/4p3/3PP3/2PB1N2/PP1N1PPP/R1BQR1K1 b - -
rnbqk1nr/pp3ppp/2p5/3p4/1b1P4/2NB4/PPP2PPP/R1BQK1NR w KQkq -
r1bqk1nr/ppppbppp/8/n3p3/3PP3/2P2N2/P3BPPP/RNBQK2R b KQkq -
Now, make a second file callled run.par that looks like this:

Code: Select all

setoption name SyzygyPath value c:\chess\syzygy;
benchmark 8192 8 300003 c:\chess\analysis\epd.epd movetime
quit
You can run stockfish with the command:
c:\chess\analysis\stockfish < c:\chess\analysis\run.par

I have a special version of stockfish that logs the analysis directly to disk as SAN output for reprocessing.
Taking ideas is not a vice, it is a virtue. We have another word for this. It is called learning.
But sharing ideas is an even greater virtue. We have another word for this. It is called teaching.
JBNielsen
Posts: 267
Joined: Thu Jul 07, 2011 10:31 pm
Location: Denmark

Re: Call an engine from BASIC?!

Post by JBNielsen »

Dann Corbit wrote: Wed May 27, 2020 7:11 pm Make a file of Epd records.
Thanks; that might be a good path to follow.

Then I need to transform my pgn-games into epd-positions.
Such a function surely already exists....
I have a special version of stockfish that logs the analysis directly to disk as SAN output for reprocessing.
Not quite sure you mention this version...
Would it be easier for me to use that version?
(but maybe harder to change engine some day; but that's not really a problem for me...)

When I have finished my project I would like to include an engine - all the project for free.

I have been away from programming for 6 years.
So I am also not sure what SAN output is...
Dann Corbit
Posts: 12542
Joined: Wed Mar 08, 2006 8:57 pm
Location: Redmond, WA USA

Re: Call an engine from BASIC?!

Post by Dann Corbit »

JBNielsen wrote: Wed May 27, 2020 7:41 pm
Dann Corbit wrote: Wed May 27, 2020 7:11 pm Make a file of Epd records.
Thanks; that might be a good path to follow.

Then I need to transform my pgn-games into epd-positions.
Such a function surely already exists....
I have a special version of stockfish that logs the analysis directly to disk as SAN output for reprocessing.
Not quite sure you mention this version...
Would it be easier for me to use that version?
I don't know if it would be easier because I do not know exactly what you are trying to do.
(but maybe harder to change engine some day; but that's not really a problem for me...)

When I have finished my project I would like to include an engine - all the project for free.

I have been away from programming for 6 years.
So I am also not sure what SAN output is...
https://en.wikipedia.org/wiki/Algebraic ... on_(chess)
Taking ideas is not a vice, it is a virtue. We have another word for this. It is called learning.
But sharing ideas is an even greater virtue. We have another word for this. It is called teaching.
JBNielsen
Posts: 267
Joined: Thu Jul 07, 2011 10:31 pm
Location: Denmark

Re: Call an engine from BASIC?!

Post by JBNielsen »

Oh, SAN is just short alg. notation :) .
Yes that would be nice; much easier for the user to read.
(I thought SAN was some technical file-format or something like that...)

I would like to do this that I did 7 years ago:
http://talkchess.com/forum3/viewtopic.p ... 21#p483721

But it does not work any more.
Some of the improvements made for this in Winboard never ended up in the official version.
And fx Arena could not analyse several games in a pgn-file as a batch.

But I think I can make it now even in a single run seen from the users view:

A compiled BASIC-program:
First transform all pgn-games into epd-positions and analyse them:
SHELL "Stockfish <SFinput.bat >tempfile.txt"
Then convert the output to winboard-analyse-format and then format it with:
SHELL "StartDabbaba.bat >tempfile.txt" (this still works)
SHELL "edit DabbabaListPgnAnalyze.txt" (does not work)
Dann Corbit
Posts: 12542
Joined: Wed Mar 08, 2006 8:57 pm
Location: Redmond, WA USA

Re: Call an engine from BASIC?!

Post by Dann Corbit »

Try giving the full path to edit.
Taking ideas is not a vice, it is a virtue. We have another word for this. It is called learning.
But sharing ideas is an even greater virtue. We have another word for this. It is called teaching.
JBNielsen
Posts: 267
Joined: Thu Jul 07, 2011 10:31 pm
Location: Denmark

Re: Call an engine from BASIC?!

Post by JBNielsen »

I can not make Stockfish accept multiple commands.
It's like the program exits after each command.
So I cannot give it a position and then analyze it.

It works with a single command:
BASIC:
SHELL "SFinput.bat >tempfile.txt"

SFinput.bat:
Stockfish go movetime 9999


But this fails:
BASIC: SHELL "SFinput.bat >tempfile.txt"

SFinput.bat:
Stockfish position startpos moves e2e4
go movetime 5555

And this fails:
BASIC: SHELL "SFinput.bat >tempfile.txt"

SFinput.bat:
Stockfish position startpos moves e2e4
Stockfish go movetime 5555

And this fails:
BASIC: SHELL "Stockfish <SFinput.bat >tempfile.txt"

SFinput.bat:
position startpos moves e2e4
go movetime 5555
Dann Corbit
Posts: 12542
Joined: Wed Mar 08, 2006 8:57 pm
Location: Redmond, WA USA

Re: Call an engine from BASIC?!

Post by Dann Corbit »

Try redirecting the input from a file
stockfish < myfileofcommands.txt
Taking ideas is not a vice, it is a virtue. We have another word for this. It is called learning.
But sharing ideas is an even greater virtue. We have another word for this. It is called teaching.