chess engine in assembly

Discussion of chess software programming and technical issues.

Moderator: Ras

kaustubh

chess engine in assembly

Post by kaustubh »

Has anyone created a chess engine in assembly language.
User avatar
Zach Wegner
Posts: 1922
Joined: Thu Mar 09, 2006 12:51 am
Location: Earth

Re: chess engine in assembly

Post by Zach Wegner »

Yes.
kaustubh

Re: chess engine in assembly

Post by kaustubh »

hi Zach , great engine written by you, it is very much readable and efficient.
Where is the assembly code, i see only everything written in C.
User avatar
Zach Wegner
Posts: 1922
Joined: Thu Mar 09, 2006 12:51 am
Location: Earth

Re: chess engine in assembly

Post by Zach Wegner »

Thanks. I haven't actually made an assembly engine, but many people have. I don't know of any open source ones that will run on modern computers. Maybe Dann or somebody knows of one.
Dann Corbit
Posts: 12777
Joined: Wed Mar 08, 2006 8:57 pm
Location: Redmond, WA USA

Re: chess engine in assembly

Post by Dann Corbit »

kaustubh wrote:Has anyone created a chess engine in assembly language.
Rebel, by Ed Schroder is written in Assembly.
Sargon, by Kathe and Dan Spracklen was written in Assembly. There used to be a listing of the Sargon code on the internet, but now I cannot find it.

Here is a listing for an assembly chess program. I have some others too:

Code: Select all

; Program CHESS.ASM
; This is a computer chess program... 
; Revision 1.0.0   January 17, 1997
; (C) 1997 Jeffrey Pow

INCLUDE BIOS.INC
INCLUDE DOS.INC
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG,DS:CODE_SEG

ORG     0100H

NEXT_LINE       EQU     0Ah

MAIN PROC
        JMP     BEGIN

ALPHA   DB      ' A  B  C  D  E  F  G  H$'
CASTLE  DB      00
CUR_ADD DW      0000h
COL     DB      00
KEY1    DB      00
KEY2    DB      00
KEY3    DB      00
KEY4    DB      00
GETSK   DB      "Enter skill level (1-5): $"
WHIBL   DB      0Dh,0Ah,0Ah,"You have (1) White or (2) Black Pieces: $"
CHECK_MATED DB  "CHECK MATE!!!",7,7,7,"$"
ILLEGAL DB      "ILLEGAL MOVE!!!",7,7,7,"$"

KNMOVE  DB      015h,00Ch,0F8h,0EDh,0EBh,0F4h,008h,013h
KIMOVE  DB      00Ah,00Bh,001h,0F7h,0F6h,0F5h,0FFh,009h
BIMOVE  DB      00Bh,0F7h,0F5h,009h
RKMOVE  DB      00Ah,001h,0F6h,0FFh
DATAR4  DB      02Eh,009h,005h,003h,003h,001h,000h,001h
        DB      003h,003h,005h,009h,02Eh,078h
SKILL   DB      01
OPP     DB      00
REG3    DB      00
TMP_KILLED_PC DB      8 DUP (00h)
ARR5    DB      8 DUP (00h)
ARR4    DB      8 DUP (00h)
ARR3    DB      8 DUP (00h)
FRMARR  DB      8 DUP (00h)
TOARR   DB      8 DUP (00h)
MV_FRM  DB      00
MV_TO   DB      00
LVLCNT  DB      00
REG1    DB      00
RESULT  DB      8 DUP (0C0h)
BOARD   DB      120 DUP (07h)
BRDDATA DB      4,2,3,5,6,3,2,4,7,7,1,1,1,1,1,1,1,1,7
        DB      7,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,7
        DB      7,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,7
        DB      7,255,255,255,255,255,255,255,255,7
        DB      7,252,254,253,251,250,253,254,252



BEGIN:
        CALL    RANDOMIZE
        CALL    SET_UP_BOARD
        CALL    INITIALIZE
SKIP_NEXT_LINE:
        CALL    SHOW_BOARD
        MOV     AL,[COL]
        CMP     AL,1
        JNE     GET_CPU_MOVE
GET_USER_MOVE:
        CALL    GET_MOVE
        CALL    SHOW_BOARD
        MOV     AL,[COL]
        CMP     AL,1
        JNE     BLCK_MOVE
        MOV     AL,0
        MOV     [OPP],AL
        JMP     GET_CPU_MOVE
BLCK_MOVE:
        MOV     AL,16
        MOV     [OPP],AL
GET_CPU_MOVE:
        CALL    CPU_MOVE
        CALL    MOVE_PIECES
        CALL    SHOW_BOARD
        MOV     DX,0
        MOV     AL,[RESULT]
        CMP     AL,229
        JAE     NOT_MATE
        CMP     AL,150
        JA      MATE
NOT_MATE:
        CMP     AL,99
        JA      GET_USER_MOVE
        CMP     AL,28
        JB      GET_USER_MOVE
MATE:
        @SETCURPOS 20,20
        @DISPSTR CHECK_MATED
        INT     20H
MAIN ENDP

RANDOMIZE PROC
        PUSH    DS
        MOV     BX,40h
        MOV     DS,BX
        MOV     AH,0
        MOV     AL,DS:[06Ch]
        POP     DS
        ADD     AX,100h
        MOV     DS:[CUR_ADD],AX
        RET
RANDOMIZE ENDP

PROMOTE PROC
        MOV     SI,0
PROMOTE_BLACK:
        MOV     AL,[BOARD+21+SI]
        CMP     AL,0FFh
        JNE     PROMOTE_WHITE
        MOV     AL,0FBh
        MOV     [BOARD+21+SI],AL
PROMOTE_WHITE:
        MOV     AL,[BOARD+91+SI]
        CMP     AL,01h
        JNE     SKIP_PROMOTE
        MOV     AL,05
        MOV     [BOARD+91+SI],AL
SKIP_PROMOTE:
        INC     SI
        CMP     SI,8
        JNE     PROMOTE_BLACK
        RET

PROMOTE ENDP

GET_MOVE PROC

        @SETCURPOS 20,20
FIRST_KEY:
        @GETKEY 0
        CMP     AL,1Bh
        JE      GET_MOVE
        CMP     AL,'a'
        JL      OVER_FIRST
        CMP     AL,'h'
        JA      FIRST_KEY
        SUB     AL,20h
OVER_FIRST:
        CMP     AL,'A'
        JB      FIRST_KEY
        CMP     AL,'H'
        JA      FIRST_KEY
        @DISPCH AL
        AND     AL,0Fh
        DEC     AL
        MOV     [KEY1],AL
SECOND_KEY:
        @GETKEY 0
        CMP     AL,1Bh
MID_POINT:
        JE      GET_MOVE
        CMP     AL,'1'
        JL      SECOND_KEY
        CMP     AL,'8'
        JA      SECOND_KEY
        @DISPCH AL
        AND     AL,0Fh
        DEC     AL
        MOV     [KEY2],AL
THIRD_KEY:
        @DISPCH '-'
        @GETKEY 0
        CMP     AL,1Bh
        JE      MID_POINT
        CMP     AL,'a'
        JL      OVER_THIRD
        CMP     AL,'h'
        JA      THIRD_KEY
        SUB     AL,20h
OVER_THIRD:
        CMP     AL,'A'
        JB      THIRD_KEY
        CMP     AL,'H'
        JA      THIRD_KEY
        @DISPCH AL
        AND     AL,0Fh
        DEC     AL
        MOV     [KEY3],AL
FOURTH_KEY:
        @GETKEY 0
        CMP     AL,1Bh
        JE      MID_POINT
        CMP     AL,'1'
        JL      FOURTH_KEY
        CMP     AL,'8'
        JA      FOURTH_KEY
        @DISPCH AL
        AND     AL,0Fh
        DEC     AL
        MOV     [KEY4],AL
        MOV     AL,10
        MOV     AH,[KEY2]
        MUL     AH
        MOV     BX,0
        MOV     BL,[KEY1]
        ADD     BX,AX
        MOV     SI,BX
        MOV     AL,10
        MOV     AH,[KEY4]
        MUL     AH
        MOV     BX,0
        MOV     BL,[KEY3]
        ADD     BX,AX
        MOV     DI,BX
        MOV     CL,[SI+BOARD+21]
        CMP     CL,0
        JE      IL_MOVE1
        MOV     AL,[COL]
        CMP     AL,1
        JE      CHK_WHITE_SOURCE
        CMP     CL,0FAh
        JB      IL_MOVE1
        JMP     CHK_DEST
CHK_WHITE_SOURCE:
        CMP     CL,6
        JA      IL_MOVE1
        JMP     CHK_DEST
IL_MOVE1:
        @SETCURPOS 20,21
        @DISPSTR ILLEGAL
        JMP     GET_MOVE
CHK_DEST:
        MOV     CL,[DI+BOARD+21]
        CMP     CL,0
        JE      CHK_PCS
        MOV     AL,[COL]
        CMP     AL,1
        JE      CHK_WHITE_DEST
        CMP     CL,6
        JBE     CHK_PCS
        JMP     IL_MOVE1
CHK_WHITE_DEST:
        CMP     CL,0FAh
        JAE     CHK_PCS
        JMP     IL_MOVE1
CHK_PCS:
        MOV     CL,[SI+BOARD+21]
        CMP     CL,1
        JE      CHK_PAWN
        CMP     CL,0FFh
        JE      CHK_PAWN
        JMP     NOT_PAWN
CHK_PAWN:
        MOV     CX,10
        MOV     AL,[COL]
        CMP     AL,1
        JE      SKIP_BLK_PAWN
        NEG     CX
SKIP_BLK_PAWN:
        MOV     BX,SI
        ADD     BX,CX
        CMP     DI,BX
        JE      ONE_STEP_DOWN
        ADD     BX,CX
        CMP     DI,BX
        JE      TWO_STEPS_DOWN
        SUB     BX,CX
        DEC     BX
        CMP     DI,BX
        JE      PAWN_KILL
        INC     BX
        INC     BX
        CMP     DI,BX
        JE      PAWN_KILL
        JMP     IL_MOVE2
PAWN_KILL:
        MOV     AL,[DI+BOARD+21]
        CMP     AL,0
        JE      IL_MOVE2
        JMP     MOVE_PCS
TWO_STEPS_DOWN:
        MOV     AL,[COL]
        CMP     AL,1
        JE      CHK_WHITE_STEPS
        CMP     SI,59
        JB      IL_MOVE2
        JMP     RIGHT_SOURCE
CHK_WHITE_STEPS:
        CMP     SI,19
        JA      IL_MOVE2
RIGHT_SOURCE:
        MOV     AL,[DI+BOARD+21]
        CMP     AL,0
        JNE     IL_MOVE2
        SUB     BX,CX
        MOV     AL,[BX+BOARD+21]
        CMP     AL,0
        JNE     IL_MOVE2
        JMP     MOVE_PCS
ONE_STEP_DOWN:
        MOV     AL,[DI+BOARD+21]
        CMP     AL,0
        JNE     IL_MOVE2
        JMP     MOVE_PCS
IL_MOVE2:
        @SETCURPOS 20,21
        @DISPSTR ILLEGAL
        JMP     GET_MOVE
NOT_PAWN:
        CMP     CL,2
        JE      CHK_KNIGHT
        CMP     CL,0FEh
        JE      CHK_KNIGHT
        JMP     NOT_KNIGHT
CHK_KNIGHT:
        MOV     BX,0
NXT_KNIGHT:
        MOV     AL,[BX+KNMOVE]
        MOV     AH,0
        CMP     AL,0
        JNS     ADD_KNIGHT
        MOV     AH,0FFh
ADD_KNIGHT:
        MOV     BP,SI
        ADD     AX,BP
        CMP     DI,AX
        JE      KNIGHT_RIGHT
        INC     BX
        CMP     BX,8
        JNE     NXT_KNIGHT
        JMP     IL_MOVE2
KNIGHT_RIGHT:
        @DISPCH '1','2','3'
        JMP     MOVE_PCS
NOT_KNIGHT:
        CMP     CL,3
        JE      CHK_BISHOP
        CMP     CL,0FDh
        JE      CHK_BISHOP
        JMP     NOT_BISHOP
CHK_BISHOP:
        CALL    CHK_DIAG
        CMP     DH,1
        JNE     IL_MOVE2
        JMP     MOVE_PCS
CHK_DIAG:
        MOV     BX,0
NEXT_DIAG_MOVE:
        MOV     BP,SI
        MOV     AL,[BX+BIMOVE]
        MOV     AH,0
        CMP     AL,0
        JNS     NXT_DIAG
        MOV     AH,0FFh
NXT_DIAG:
        ADD     BP,AX
        CMP     BP,DI
        JE      FOUND_DIAG_MOVE
        CMP     BP,0
        JS      OUT_OF_BOARD_DIAG
        CMP     BP,62h
        JA      OUT_OF_BOARD_DIAG
        MOV     CL,[BP+BOARD+21]
        CMP     CL,0
        JNE     OUT_OF_BOARD_DIAG
        JMP     NXT_DIAG
OUT_OF_BOARD_DIAG:
        INC     BX
        CMP     BX,4
        JNE     NEXT_DIAG_MOVE
        MOV     DH,0
        RET
FOUND_DIAG_MOVE:
        MOV     DH,1
        RET
CHK_LINE:
        MOV     BX,0
NEXT_LINE_MOVE:
        MOV     BP,SI
        MOV     AL,[BX+RKMOVE]
        MOV     AH,0
        CMP     AL,0
        JNS     NXT_LINE
        MOV     AH,0FFh
NXT_LINE:
        ADD     BP,AX
        CMP     BP,DI
        JE      FOUND_LINE_MOVE
        CMP     BP,0
        JS      OUT_OF_BOARD_LINE
        CMP     BP,62h
        JA      OUT_OF_BOARD_LINE
        MOV     CL,[BP+BOARD+21]
        CMP     CL,0
        JNE     OUT_OF_BOARD_LINE
        JMP     NXT_LINE
OUT_OF_BOARD_LINE:
        INC     BX
        CMP     BX,4
        JNE     NEXT_LINE_MOVE
        MOV     DH,0
        RET
FOUND_LINE_MOVE:
        MOV     DH,1
        RET
NOT_BISHOP:
        CMP     CL,4
        JE      CHK_ROOK
        CMP     CL,0FCh
        JE      CHK_ROOK
        JMP     NOT_ROOK
CHK_ROOK:
        CALL    CHK_LINE
        CMP     DH,1
        JNE     IL_MOVE3
        MOV     DL,1
        MOV     [CASTLE],AL
        JMP     MOVE_PCS
IL_MOVE3:
        @SETCURPOS 20,21
        @DISPSTR ILLEGAL
        JMP     GET_MOVE
NOT_ROOK:
        CMP     CL,5
        JE      CHK_QUEEN
        CMP     CL,0FBh
        JE      CHK_QUEEN
        JMP     NOT_QUEEN
CHK_QUEEN:
        CALL    CHK_DIAG
        CMP     DH,1
        JNE     QUEEN_LINE
        JMP     MOVE_PCS
QUEEN_LINE:
        CALL    CHK_LINE
        CMP     DH,1
        JNE     IL_MOVE3
        JMP     MOVE_PCS
NOT_QUEEN:
        MOV     BX,SI
        ADD     BX,2
        CMP     BX,DI
        JE      CASTLE_RIGHT
        MOV     BX,SI
        SUB     BX,3
        CMP     BX,DI
        JE      CASTLE_LEFT
        JMP     NO_CASTLE
CASTLE_RIGHT:
        MOV     DL,[CASTLE]
        CMP     DL,0
        JNE     IL_MOVE4
        MOV     BX,SI
        INC     BX
        MOV     AL,[BX+BOARD+21]
        CMP     AL,0
        JNE     IL_MOVE4
        INC     BX
        MOV     AL,[BX+BOARD+21]
        CMP     AL,0
        JNE     IL_MOVE4
        MOV     DL,1
        MOV     [CASTLE],DL
        MOV     AL,[DI+BOARD+22]
        MOV     [DI+BOARD+20],AL
        MOV     AL,0
        MOV     [DI+BOARD+22],AL
        JMP     MOVE_PCS
CASTLE_LEFT:
        MOV     DL,[CASTLE]
        CMP     DL,0
        JNE     IL_MOVE4
        MOV     BX,SI
        DEC     BX
        MOV     AL,[BX+BOARD+21]
        CMP     AL,0
        JNE     IL_MOVE4
        DEC     BX
        MOV     AL,[BX+BOARD+21]
        CMP     AL,0
        JNE     IL_MOVE4
        DEC     BX
        MOV     AL,[BX+BOARD+21]
        CMP     AL,0
        JNE     IL_MOVE4
        MOV     AL,[DI+BOARD+20]
        MOV     [DI+BOARD+22],AL
        MOV     AL,0
        MOV     [DI+BOARD+20],AL
        JMP     MOVE_PCS
IL_MOVE4:
        @SETCURPOS 20,21
        @DISPSTR ILLEGAL
        JMP     GET_MOVE
NO_CASTLE:
        MOV     BX,0
NXT_KING:
        MOV     AL,[BX+KIMOVE]
        MOV     AH,0
        CMP     AL,0
        JNS     ADD_KING
        MOV     AH,0FFh
ADD_KING:
        ADD     AX,SI
        CMP     AX,DI
        JE      KING_MOVE
        INC     BX
        CMP     BX,8
        JE      IL_MOVE4
        JMP     NXT_KING
KING_MOVE:
        MOV     DL,1
        MOV     [CASTLE],DL
MOVE_PCS:
        MOV     CL,[SI+BOARD+21]
        MOV     CH,0
        MOV     [SI+BOARD+21],CH
        MOV     [DI+BOARD+21],CL
        RET
GET_MOVE ENDP


INITIALIZE PROC

        MOV     AL,0
        MOV     [CASTLE],AL
        @CLS
        @DISPSTR GETSK
GETSKILL:
        @GETKEY 0
        CMP     AL,'1'
        JB      GETSKILL
        CMP     AL,'5'
        JA      GETSKILL
        @DISPCH  AL
        AND     AL,0Fh
        MOV     [SKILL],AL
        AND     AL,0Fh
        MOV     AH,16
        MOV     [OPP],AH
        @DISPSTR WHIBL
COLTYPE:
        @GETKEY 0
        CMP     AL,'1'
        JB      COLTYPE
        CMP     AL,'2'
        JA      COLTYPE
        @DISPCH AL
        AND     AL,0Fh
        MOV     [COL],AL
        RET
INITIALIZE ENDP

MOVE_PIECES PROC
        MOV     BX,0
        MOV     BL,[MV_FRM]
        MOV     AL,[BX+BOARD]
        MOV     CL,0
        MOV     [BX+BOARD],CL
        MOV     BL,[MV_TO]
        MOV     [BX+BOARD],AL
        RET

MOVE_PIECES ENDP

SET_UP_BOARD PROC
        MOV     AL,0C0h
        MOV     DI,0000h
SUB_POS:
        MOV     [DI+RESULT],AL
        INC     DI
        CMP     DI,8h
        JNE     SUB_POS
        MOV     AL,07h
        MOV     DI,0000h
RESET_BOARD:
        MOV     [DI+BOARD],AL
        INC     DI
        CMP     DI,120
        JNE     RESET_BOARD
        MOV     DI,21
        MOV     SI,0
NEXT_BOARD:
        MOV     AL,[SI+BRDDATA]
        MOV     [DI+BOARD],AL
        INC     DI
        INC     SI
        CMP     SI,78
        JNE     NEXT_BOARD
        RET
SET_UP_BOARD ENDP

SHOW_BOARD PROC
        CALL    PROMOTE
        @CLS
        MOV     SI,21
        MOV     CX,8
BACK_ROW:
        PUSH    CX
        @SETCURPOS 00h,CL
        MOV     CX,8
BACK_COL:
        MOV     AL,[SI+BOARD]
        CMP     AL,00h
        JNE     NO_BLANK
        @DISPCH '.','.'
        JMP     NEXT_COL
NO_BLANK:
        CMP     AL,01h
        JNE     NOT_WP
        @DISPCH 'W','P'
        JMP     NEXT_COL
NOT_WP:
        CMP     AL,02h
        JNE     NOT_WN
        @DISPCH 'W','N'
        JMP     NEXT_COL
NOT_WN:
        CMP     AL,03h
        JNE     NOT_WB
        @DISPCH 'W','B'
        JMP     NEXT_COL
NOT_WB:
        CMP     AL,04h
        JNE     NOT_WR
        @DISPCH 'W','R'
        JMP     NEXT_COL
NOT_WR:
        CMP     AL,05h
        JNE     NOT_WQ
        @DISPCH 'W','Q'
        JMP     NEXT_COL
NOT_WQ:
        CMP     AL,06h
        JNE     NOT_WK
        @DISPCH 'W','K'
        JMP     NEXT_COL
NOT_WK:
        CMP     AL,0FFh
        JNE     NOT_BP
        @DISPCH 'B','P'
        JMP     NEXT_COL
NOT_BP:
        CMP     AL,0FEh
        JNE     NOT_BN
        @DISPCH 'B','N'
        JMP     NEXT_COL
NOT_BN:
        CMP     AL,0FDh
        JNE     NOT_BB
        @DISPCH 'B','B'
        JMP     NEXT_COL
NOT_BB:
        CMP     AL,0FCh
        JNE     NOT_BR
        @DISPCH 'B','R'
        JMP     NEXT_COL
NOT_BR:
        CMP     AL,0FBh
        JNE     NOT_BQ
        @DISPCH 'B','Q'
        JMP     NEXT_COL
NOT_BQ:
        CMP     AL,0FAh
        JNE     NOT_BK
        @DISPCH 'B','K'
        JMP     NEXT_COL
NOT_BK:
NEXT_COL:
        @DISPCH ' '
        INC     SI
        LOOP    BACK_CL
        ADD     SI,2
        POP     CX
        MOV     DH,CL
        MOV     DL,9
        SUB     DL,DH
        ADD     DL,30h
        @DISPCH DL
        @DISPCH 0Dh,0Ah
        LOOP    BACK_RW
        @SETCURPOS 0,9
        @DISPSTR ALPHA
        RET
BACK_CL:
        JMP     BACK_COL
BACK_RW:
        JMP     BACK_ROW
SHOW_BOARD ENDP

CPU_MOVE PROC
        XOR     AX,AX
        XOR     BX,BX
        XOR     CX,CX
        XOR     DX,DX
        XOR     BP,BP
        MOV     AL,0C0h
        MOV     [RESULT],AL
        MOV     BL,00h
        MOV     [REG1],BL
        DEC     BL
        MOV     [LVLCNT],BL
        JMP     CHKMV
EXIT_RECURSION:
        MOV     AL,[FRMARR+BX]
        ADD     AL,[TOARR+BX]
        PUSH    AX
        MOV     CL,AL
        MOV     BP,CX
        MOV     AL,[BOARD+BP]           
        MOV     CL,[FRMARR+BX]          
        MOV     BP,CX
        MOV     [BOARD+BP],AL           
        POP     AX                      
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,[TMP_KILLED_PC+BX]   
        MOV     [BOARD+BP],AL           
        ADD     AL,06h
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     BL,[SKILL]              
        MOV     AL,00h                  
        MOV     [RESULT+1+BX],AL        
        MOV     BL,[LVLCNT]
        MOV     AL,[DATAR4+BP]
        SUB     AL,[RESULT+1+BX]
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,0C0h                 
        MOV     [RESULT+1+BX],AL        
        MOV     AL,CL                   
        CMP     BL,00h                  
        JNE     SKIP_OVER               
        CMP     AL,[RESULT+BX]          
        JS      RETURN                  
        JNE     FOUND_MOVE
        PUSH    BX
        MOV     BX,DS:[CUR_ADD]
        MOV     AL,[BX]
        INC     BX
        CMP     BX,1000h
        JLE     NOT_OVER
        MOV     BX,100h
NOT_OVER:
        MOV     DS:[CUR_ADD],BX
        POP     BX
        CMP     AL,[REG1]                
        JC      RETURN
        MOV     [REG1],AL               
FOUND_MOVE:
        MOV     [RESULT],CL
        MOV     AL,[FRMARR]             
        MOV     [MV_FRM],AL              
        MOV     AL,[TOARR]               
        MOV     [MV_TO],AL
RETURN:
        RET                             
SKIP_OVER:
        CMP     AL,[RESULT+BX]          
        JS      RETURN                  
        JE      RETURN                  
        MOV     AL,CL                   
        MOV     [RESULT+BX],AL          
        MOV     AL,[REG3+BX]
        ADD     AL,06h                  
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,[DATAR4+BP]
        SUB     AL,[RESULT+BX]
        CMP     AL,[REG1+BX]            
        JS      POS2                    
        CMP     BL,01h                  
        JE      RETURN                  
        CMP     AL,[REG1+BX]            
        JE      POS2                    
        RET                             
CLCPNT:
        MOV     AL,[FRMARR+BX]          
        ADD     AL,[TOARR+BX]
        MOV     [REG3],AL
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,[BOARD+BP]           
        MOV     CL,[OPP]                
        MOV     BP,CX
        CMP     CL,0
        JNE     POS3                    
        CMP     AL,01h                  
        JNS     RETURN                  
        JS      POS4
POS3:
        CMP     AL,00h                  
        JS      RETURN                  
        CMP     AL,07h                  
        JE      RETURN                  
POS4:
        MOV     [TMP_KILLED_PC+BX],AL   
        CMP     AL,06h                  
        JE      POS5
        CMP     AL,0FAh                 
        JNE     POS6
POS5:
        MOV     AL,02Eh                 
        MOV     [RESULT+BX],AL          
POS2:
        POP     AX                         
        POP     AX                         
        JMP     POS7                    
POS6:
        MOV     CL,[FRMARR+BX]          
        MOV     BP,CX
        MOV     AL,[BOARD+BP]           
        MOV     CL,[REG3]
        MOV     BP,CX
        MOV     [BOARD+BP],AL           
        MOV     CL,[FRMARR+BX]          
        MOV     BP,CX
        MOV     AL,00h                  
        MOV     [BOARD+BP],AL           
CHKMV:
        CMP     BL,[SKILL]              
        JNE     POS8                    
        JMP     EXIT_RECURSION          
POS8:
        INC     BL                      
        MOV     [LVLCNT],BL             
        MOV     AL,14h                  
        MOV     [FRMARR+BX],AL          
        MOV     AL,10h                  
        SUB     AL,[OPP]                
        MOV     [OPP],AL                
POS10:
        INC     [FRMARR+BX]             
        MOV     CL,[FRMARR+BX]          
        MOV     BP,CX
        MOV     AL,[BOARD+BP]           
        CMP     AL,07h                  
        JE      DONECHK                 
        MOV     CL,[OPP]
        MOV     BP,CX
        CMP     CL,0
        JE      POS11                   
        CMP     AL,00h                  
        JNS     DONECHK                 
POS11:
        CMP     CL,00h                  
        JNE     CHKPCS                  
        CMP     AL,01h                  
        JS      DONECHK                 
CHKPCS:
        CMP     AL,00h                  
        JNS     CHKPWN                  
        MOV     CL,[FRMARR+BX]          
        MOV     BP,CX
        MOV     AL,00h                  
        SUB     AL,[BOARD+BP]           
CHKPWN:
        CMP     AL,01h                  
        JNE     CHKKN                   
        CALL    PAWN                    
        JMP     DONECHK                 
CHKKN:
        CMP     AL,02h                  
        JNE     CHKBIS                  
        CALL    KNIGHT                  
        JMP     DONECHK                 
CHKBIS:
        CMP     AL,03h                  
        JNE     CHKRK                   
        CALL    BISHOP                  
        JMP     DONECHK                 
CHKRK:
        CMP     AL,04h                  
        JNE     CHKQN                   
        CALL    ROOK                    
        JMP     DONECHK                 
CHKQN:
        CMP     AL,05h                  
        JNE     CHKKING                 
        CALL    QUEEN                   
        JMP     DONECHK                 
CHKKING:
        CALL    KING                    
        JMP     DONECHK                 
DONECHK:
        MOV     AL,[FRMARR+BX]          
        CMP     AL,62h                  
        JS      POS10                   
POS7:
        CMP     BL,00h                  
        JE      POS12                   
        MOV     AL,10h                  
        SUB     AL,[OPP]                
        MOV     [OPP],AL                
        DEC     BL                      
        MOV     [LVLCNT],BL             
        JMP     EXIT_RECURSION          
POS12:
        MOV     AL,[MV_FRM]              
        ADD     AL,[MV_TO]              
        MOV     [MV_TO],AL              
        RET                             
PAWN:
        MOV     AL,[OPP]                
        CMP     AL,0
        JNE     BLKPWN                  
        MOV     AL,[FRMARR+BX]          
        ADD     AL,NEXT_LINE
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,[BOARD+BP]           
        CMP     AL,0
        JNE     ILPWNMV                 
        MOV     AL,0Ah                  
        MOV     [TOARR+BX],AL           
        CALL    CLCPNT                  
        MOV     AL,[FRMARR+BX]          
        CMP     AL,1Fh                  
        JS      ILPWNMV                 
        CMP     AL,27h                  
        JNS     ILPWNMV                 
        ADD     AL,14h                  
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,[BOARD+BP]           
        CMP     AL,0
        JNE     ILPWNMV                 
        MOV     AL,14h                  
        MOV     [TOARR+BX],AL           
        CALL    CLCPNT                  
ILPWNMV:
        MOV     AL,[FRMARR+BX]          
        ADD     AL,09h
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,[BOARD+BP]           
        CMP     AL,0
        JNS     SKPPWN                  
        MOV     AL,09h                  
        MOV     [TOARR+BX],AL           
        CALL    CLCPNT                  
SKPPWN:
        MOV     AL,[FRMARR+BX]          
        ADD     AL,0Bh
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,[BOARD+BP]           
        CMP     AL,0
        JNS     PWNKILL                 
        MOV     AL,0Bh                  
        MOV     [TOARR+BX],AL           
        CALL    CLCPNT                  
PWNKILL:
        RET                             
BLKPWN:
        MOV     AL,[FRMARR+BX]          
        SUB     AL,NEXT_LINE
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,[BOARD+BP]           
        CMP     AL,0
        JNE     ILBLKPWNMV              
        MOV     AL,0F6h                 
        MOV     [TOARR+BX],AL           
        CALL    CLCPNT                  
        MOV     AL,[FRMARR+BX]          
        CMP     AL,51h                  
        JS      ILBLKPWNMV              
        CMP     AL,59h                  
        JNS     ILBLKPWNMV              
        SUB     AL,14h
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,[BOARD+BP]           
        CMP     AL,0
        JNE     ILBLKPWNMV              
        MOV     AL,0ECh                 
        MOV     [TOARR+BX],AL           
        CALL    CLCPNT                  
ILBLKPWNMV:
        MOV     AL,[FRMARR+BX]          
        SUB     AL,09h                  
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,00h                  
        CMP     AL,[BOARD+BP]           
        JNS     BLKPWNKILL              
        MOV     AL,0F7h                 
        MOV     [TOARR+BX],AL           
        CALL    CLCPNT                  
BLKPWNKILL:
        MOV     AL,[FRMARR+BX]          
        SUB     AL,0Bh
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,00h                  
        CMP     AL,[BOARD+BP]           
        JNS     BLKPWNSKIP              
        MOV     AL,0F5h                 
        MOV     [TOARR+BX],AL           
        CALL    CLCPNT                  
BLKPWNSKIP:
        RET                             
KNIGHT:
        MOV     AL,00h                  
        MOV     [ARR5+BX],AL            
        MOV     CL,AL                   
        MOV     BP,CX
BKKNIGHT:
        MOV     AL,[KNMOVE+BP]          
        MOV     [TOARR+BX],AL           
        CALL    CLCPNT                  
        INC     [ARR5+BX]               
        MOV     CL,[ARR5+BX]            
        MOV     BP,CX
        CMP     CL,08h                  
        JS      BKKNIGHT                
        RET                             
BISHOP:
        MOV     AL,04h                  
        MOV     [ARR3+BX],AL            
        MOV     AL,00h                  
        MOV     [ARR5+BX],AL            
        JMP     DO_CHK                  
ROOK:
        MOV     AL,08h                  
        MOV     [ARR3+BX],AL            
        MOV     AL,04h                  
        MOV     [ARR5+BX],AL            
        JMP     DO_CHK                  
QUEEN:
        MOV     AL,08h                  
        MOV     [ARR3+BX],AL            
        MOV     AL,00h                  
        MOV     [ARR5+BX],AL            
DO_CHK:
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,[BIMOVE+BP]
        MOV     [TOARR+BX],AL           
        MOV     [ARR4+BX],AL            
BACKCHK:
        CALL    CLCPNT                  
        MOV     AL,[FRMARR+BX]          
        ADD     AL,[TOARR+BX]           
        MOV     CL,AL                   
        MOV     BP,CX
        MOV     AL,[BOARD+BP]           
        CMP     AL,0
        JNE     FRONTCHK                
        MOV     AL,[TOARR+BX]           
        ADD     AL,[ARR4+BX]            
        MOV     [TOARR+BX],AL           
        JMP     BACKCHK                 
FRONTCHK:
        INC     [ARR5+BX]               
        MOV     AL,[ARR5+BX]            
        CMP     AL,[ARR3+BX]            
        JS      DO_CHK                  
        RET                             
KING:
        MOV     AL,00h                  
        MOV     [ARR5+BX],AL            
        MOV     CL,AL                   
        MOV     BP,CX
BACKKING:
        MOV     AL,[KIMOVE+BP]          
        MOV     [TOARR+BX],AL           
        CALL    CLCPNT                  
        INC     [ARR5+BX]               
        MOV     CL,[ARR5+BX]            
        MOV     BP,CX
        CMP     CL,08h
        JS      BACKKING                
        RET                             
CPU_MOVE ENDP

CODE_SEG ENDS
END MAIN
User avatar
Zach Wegner
Posts: 1922
Joined: Thu Mar 09, 2006 12:51 am
Location: Earth

Re: chess engine in assembly

Post by Zach Wegner »

I should add one more that has a bunch of assembly in it, maybe for VAX.

It's the standard Unix chess game, written by Ken Thompson in 1979.

http://minnie.tuhs.org/UnixTree/V7/usr/src/games/chess/

I've wanted to do a port of it to pure C, but I just can't read the assembler...
F. Bluemers
Posts: 880
Joined: Thu Mar 09, 2006 11:21 pm
Location: Nederland

Re: chess engine in assembly

Post by F. Bluemers »

Code: Select all

badiag:
	mov	r0,r1
	mov	(r5)+,r2
	mov	(r5)+,r3
	bit	r2,_dir(r1)
	bne	1f
	add	r3,r1
looks a bit "motorola_ish"
move src,dest
bne=branch not equal
etc
Best
Fonzy
kaustubh

Re: chess engine in assembly

Post by kaustubh »

thanks dann corbit
User avatar
sje
Posts: 4675
Joined: Mon Mar 13, 2006 7:43 pm

Re: chess engine in assembly

Post by sje »

F. Bluemers wrote:

Code: Select all

badiag:
	mov	r0,r1
	mov	(r5)+,r2
	mov	(r5)+,r3
	bit	r2,_dir(r1)
	bne	1f
	add	r3,r1
The above is assembly language for Digital's pdp11 16 bit CPU family. The architecture was the forerunner of the Motorola 68000 family.
Carey
Posts: 313
Joined: Wed Mar 08, 2006 8:18 pm

Re: chess engine in assembly

Post by Carey »

kaustubh wrote:Has anyone created a chess engine in assembly language.
There have been lots of chess programs written in assembler.

Until compilers became efficient, assembler was very common.

Some famous programs that were written in Assembler (or a low level language similar to assembler):

Sargon
Chess 4.x (2.x & 3.x were Fortran & Assembler)
Ostrich (early parallel program, using up to 8 processors)
Tech
MyChess
MacHack 6

There are certainly many others. That's just a few famous ones off the top of my head.

Most micro programs through the mid-80s were done in assembler because compilers just couldn't handle it well enough. It was too easy to double the performance by rewriting key routines in assembler.

Another famous one was the chess cartridge for the Atari-2600. It was originally written & debugged in FORTRAN on a time-share system and then converted to assembler.


If you'd like to see a few in assembler, my website http://classicchess.googlepages.com/Chess.htm has a few, including a link to Sargon and the source for Chess 4.6