chess engine in assembly
Moderator: Ras
-
- Posts: 1922
- Joined: Thu Mar 09, 2006 12:51 am
- Location: Earth
Re: chess engine in assembly
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.
Where is the assembly code, i see only everything written in C.
-
- Posts: 1922
- Joined: Thu Mar 09, 2006 12:51 am
- Location: Earth
Re: chess engine in assembly
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.
-
- Posts: 12777
- Joined: Wed Mar 08, 2006 8:57 pm
- Location: Redmond, WA USA
Re: chess engine in assembly
Rebel, by Ed Schroder is written in Assembly.kaustubh wrote:Has anyone created a chess engine in assembly language.
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
-
- Posts: 1922
- Joined: Thu Mar 09, 2006 12:51 am
- Location: Earth
Re: chess engine in assembly
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...
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...
-
- Posts: 880
- Joined: Thu Mar 09, 2006 11:21 pm
- Location: Nederland
Re: chess engine in assembly
Code: Select all
badiag:
mov r0,r1
mov (r5)+,r2
mov (r5)+,r3
bit r2,_dir(r1)
bne 1f
add r3,r1
move src,dest
bne=branch not equal
etc
Best
Fonzy
-
- Posts: 4675
- Joined: Mon Mar 13, 2006 7:43 pm
Re: chess engine in assembly
The above is assembly language for Digital's pdp11 16 bit CPU family. The architecture was the forerunner of the Motorola 68000 family.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
-
- Posts: 313
- Joined: Wed Mar 08, 2006 8:18 pm
Re: chess engine in assembly
There have been lots of chess programs written in assembler.kaustubh wrote:Has anyone created a chess engine in assembly language.
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