Start properly implementing make and unmake
This commit is contained in:
parent
3e2fca227b
commit
9389b5e5e9
|
|
@ -17,9 +17,6 @@ void setup() {
|
||||||
value = Serial.read();
|
value = Serial.read();
|
||||||
|
|
||||||
b.field[0x32] = char_to_piece(value);
|
b.field[0x32] = char_to_piece(value);
|
||||||
|
|
||||||
Move m = {0x14, 0x34, P_EMPTY};
|
|
||||||
b.make(m);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
|
@ -27,8 +24,16 @@ void loop() {
|
||||||
Serial.println(F("hello"));
|
Serial.println(F("hello"));
|
||||||
delay(1000);
|
delay(1000);
|
||||||
Serial.println(b.get_zobrist());
|
Serial.println(b.get_zobrist());
|
||||||
b.print();
|
|
||||||
Serial.println(sizeof(b));
|
Serial.println(sizeof(b));
|
||||||
|
|
||||||
Move m = {0x14, 0x34, P_EMPTY};
|
Move m = {0x14, 0x34, P_EMPTY};
|
||||||
|
Serial.println(F("Initial board"));
|
||||||
|
b.print();
|
||||||
b.make(m);
|
b.make(m);
|
||||||
|
Serial.println(F("Board after e2e4"));
|
||||||
|
b.print();
|
||||||
|
b.unmake();
|
||||||
|
Serial.println(F("Board after unmake"));
|
||||||
|
b.print();
|
||||||
|
delay(1000);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
64
Board.h
64
Board.h
|
|
@ -8,6 +8,7 @@
|
||||||
struct Unmove {
|
struct Unmove {
|
||||||
byte sq_from;
|
byte sq_from;
|
||||||
byte sq_to;
|
byte sq_to;
|
||||||
|
byte captured;
|
||||||
byte enpassant;
|
byte enpassant;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -16,10 +17,14 @@ class Board {
|
||||||
Board();
|
Board();
|
||||||
|
|
||||||
void make(Move m);
|
void make(Move m);
|
||||||
void unmove();
|
void unmake();
|
||||||
|
|
||||||
void print();
|
void print();
|
||||||
|
|
||||||
|
bool black_moving() {
|
||||||
|
return field[PTR_SIDE_AND_CASTLERIGHT] & 0x1;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long get_zobrist() {
|
unsigned long get_zobrist() {
|
||||||
long* addr = (long*) &field[PTR_ZOBRIST];
|
long* addr = (long*) &field[PTR_ZOBRIST];
|
||||||
return *addr;
|
return *addr;
|
||||||
|
|
@ -36,7 +41,14 @@ class Board {
|
||||||
B_ROOK, B_KNGT, B_BSHP, B_QUEN, B_KING, B_BSHP, B_KNGT, B_ROOK, 0, 0, 0, 0, 0, 0, 0, 0,
|
B_ROOK, B_KNGT, B_BSHP, B_QUEN, B_KING, B_BSHP, B_KNGT, B_ROOK, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
};
|
};
|
||||||
private:
|
private:
|
||||||
|
// Private function defs
|
||||||
|
void next_unmove();
|
||||||
|
void prev_unmove();
|
||||||
|
|
||||||
|
void store_unmove(Unmove u);
|
||||||
|
Unmove read_unmove();
|
||||||
|
|
||||||
|
// 0x88-fill definitions
|
||||||
static const byte PTR_SIDE_AND_CASTLERIGHT = 0x08; //byte (1=side, 2,4=white castle, 8,16=black)
|
static const byte PTR_SIDE_AND_CASTLERIGHT = 0x08; //byte (1=side, 2,4=white castle, 8,16=black)
|
||||||
// CAN FILL 0x09
|
// CAN FILL 0x09
|
||||||
static const byte PTR_W_KING = 0x0A; // byte (points to index or maybe 64-arr index)
|
static const byte PTR_W_KING = 0x0A; // byte (points to index or maybe 64-arr index)
|
||||||
|
|
@ -51,14 +63,9 @@ class Board {
|
||||||
// free space
|
// free space
|
||||||
|
|
||||||
static const byte PTR_UNMOVE_START = 0x28;
|
static const byte PTR_UNMOVE_START = 0x28;
|
||||||
static const byte PTR_UNMOVE_LAST = 0x7E;
|
static const byte PTR_UNMOVE_LAST = 0x7F;
|
||||||
byte PTR_UNMOVE = PTR_UNMOVE_START;
|
byte PTR_UNMOVE = PTR_UNMOVE_START;
|
||||||
|
|
||||||
void next_unmove();
|
|
||||||
void prev_unmove();
|
|
||||||
|
|
||||||
void store_unmove(Unmove u);
|
|
||||||
Unmove read_unmove();
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
@ -77,11 +84,47 @@ void Board::print() {
|
||||||
Serial.println();
|
Serial.println();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Board::make(Move m) {
|
void Board::make(Move m) {
|
||||||
Unmove u = Unmove {0xAA, 0xBB, 0xCC};
|
Unmove u;
|
||||||
|
u.captured = field[m.sq_to];
|
||||||
|
u.sq_from = m.sq_from;
|
||||||
|
u.sq_to = m.sq_to;
|
||||||
|
|
||||||
|
byte new_val = m.pc_prom & 0b1111;
|
||||||
|
if(new_val != P_EMPTY) {
|
||||||
|
u.sq_to |= 0x80;
|
||||||
|
} else {
|
||||||
|
new_val = field[m.sq_from];
|
||||||
|
}
|
||||||
|
field[m.sq_to] = field[m.sq_from];
|
||||||
|
field[m.sq_from] = P_EMPTY;
|
||||||
|
|
||||||
|
// TODO handle castling
|
||||||
|
// TODO handle castling rights
|
||||||
|
// TODO handle revmov clock
|
||||||
|
// TODO handle enpassant
|
||||||
|
|
||||||
|
field[PTR_SIDE_AND_CASTLERIGHT] ^= 0x01;
|
||||||
|
|
||||||
store_unmove(u);
|
store_unmove(u);
|
||||||
Unmove u2 = read_unmove();
|
}
|
||||||
Serial.println(u2.sq_to, HEX);
|
|
||||||
|
void Board::unmake() {
|
||||||
|
field[PTR_SIDE_AND_CASTLERIGHT] ^= 0x01;
|
||||||
|
|
||||||
|
Unmove u = read_unmove();
|
||||||
|
if((u.sq_to & 0x80) == 0) {
|
||||||
|
// regular move
|
||||||
|
field[u.sq_from] = field[u.sq_to];
|
||||||
|
} else {
|
||||||
|
// piece was promoted
|
||||||
|
// so the source is a pawn
|
||||||
|
field[u.sq_from] = W_PAWN | black_moving() << 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
field[u.sq_to] = u.captured & 0b1111;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Board::next_unmove() {
|
void Board::next_unmove() {
|
||||||
|
|
@ -102,7 +145,6 @@ void Board::prev_unmove() {
|
||||||
PTR_UNMOVE -= 0x8;
|
PTR_UNMOVE -= 0x8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Board::store_unmove(Unmove u) {
|
void Board::store_unmove(Unmove u) {
|
||||||
byte *ub = (byte*) &u;
|
byte *ub = (byte*) &u;
|
||||||
for(size_t i = 0; i < sizeof(u); i++) {
|
for(size_t i = 0; i < sizeof(u); i++) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue