ArduChess/Types.h

69 lines
1.2 KiB
C

#ifndef __TYPES_H_INC
#define __TYPES_H_INC
#include "Config.h"
#ifdef _ACF_DEBUG_PRINT
#define DEBUG(x) Serial.println(F(x)); Serial.flush()
#else
#define DEBUG(x)
#endif
enum Piece: byte {
P_EMPTY = 0b0000,
P_ANY = 0b1000,
W_PAWN = 0b0001,
W_KNGT = 0b0010,
W_KING = 0b0011,
W_BSHP = 0b0101,
W_ROOK = 0b0110,
W_QUEN = 0b0111,
B_PAWN = 0b1001,
B_KNGT = 0b1010,
B_KING = 0b1011,
B_BSHP = 0b1101,
B_ROOK = 0b1110,
B_QUEN = 0b1111,
};
const char CHAR_STRS[] PROGMEM = " pnkbrq PNKBRQ";
Piece char_to_piece(char c) {
for(byte i = 0; i < 0b1111; i++) {
if(pgm_read_byte_near(CHAR_STRS + i) == c)
return (Piece)i;
}
return P_EMPTY;
}
char piece_to_char(Piece p) {
return CHAR_STRS[p];
}
struct Move {
byte sq_from; // 0x88
byte sq_to; // 0x88
Piece pc_prom; // 0b(4unused)(1color)(3type)
};
//Move move_from_str(char* s) {
//}
void print_sq(byte sq) {
Serial.print((char)((sq & 0x07) + 'a'));
Serial.print((char)(((sq & 0x70) >> 4) + '1'));
}
void print_move(Move m) {
if(m.sq_from == 0xFF) {
Serial.print(F("INVALID_MOVE"));
return;
}
print_sq(m.sq_from);
print_sq(m.sq_to);
Piece pc = (Piece)(m.pc_prom & 0x7);
if(pc != 0) Serial.print(piece_to_char(pc));
}
#endif