12
static const uint8 SquareFrom64[64] = {
13
A1, B1, C1, D1, E1, F1, G1, H1,
14
A2, B2, C2, D2, E2, F2, G2, H2,
15
A3, B3, C3, D3, E3, F3, G3, H3,
16
A4, B4, C4, D4, E4, F4, G4, H4,
17
A5, B5, C5, D5, E5, F5, G5, H5,
18
A6, B6, C6, D6, E6, F6, G6, H6,
19
A7, B7, C7, D7, E7, F7, G7, H7,
20
A8, B8, C8, D8, E8, F8, G8, H8,
25
static sint8 SquareTo64[SquareNb];
35
for (sq = 0; sq < SquareNb; sq++) SquareTo64[sq] = -1;
37
for (sq = 0; sq < 64; sq++) {
38
SquareTo64[SquareFrom64[sq]] = sq;
44
bool square_is_ok(int square) {
46
if (square < 0 || square >= SquareNb) return false;
48
if (SquareTo64[square] < 0) return false;
55
int square_make(int file, int rank) {
59
ASSERT(file>=0&&file<8);
60
ASSERT(rank>=0&&rank<8);
62
sq_64 = (rank << 3) | file;
64
return square_from_64(sq_64);
69
int square_file(int square) {
73
ASSERT(square_is_ok(square));
75
file = (square - 4) & 7;
76
ASSERT(file==(square_to_64(square)&7));
83
int square_rank(int square) {
87
ASSERT(square_is_ok(square));
89
rank = (square >> 4) - 2;
90
ASSERT(rank==square_to_64(square)>>3);
97
int square_side_rank(int square, int colour) {
101
ASSERT(square_is_ok(square));
102
ASSERT(colour_is_ok(colour));
104
rank = square_rank(square);
105
if (colour_is_black(colour)) rank = 7-rank;
112
int square_from_64(int square) {
114
ASSERT(square>=0&&square<64);
116
return SquareFrom64[square];
121
int square_to_64(int square) {
123
ASSERT(square_is_ok(square));
125
return SquareTo64[square];
128
// square_is_promote()
130
bool square_is_promote(int square) {
134
ASSERT(square_is_ok(square));
136
rank = square_rank(square);
138
return rank == Rank1 || rank == Rank8;
143
int square_ep_dual(int square) {
145
ASSERT(square_is_ok(square));
146
ASSERT(square_rank(square)>=2&&square_rank(square)<=5);
153
int square_colour(int square) {
155
ASSERT(square_is_ok(square));
157
return (square ^ (square >> 4)) & 1;
162
int file_from_char(int c) {
164
ASSERT(c>='a'&&c<='h');
171
int rank_from_char(int c) {
173
ASSERT(c>='1'&&c<='8');
180
int file_to_char(int file) {
182
ASSERT(file>=0&&file<8);
189
int rank_to_char(int rank) {
191
ASSERT(rank>=0&&rank<8);
198
bool char_is_file(int c) {
200
return c >= 'a' && c <= 'h';
205
bool char_is_rank(int c) {
207
return c >= '1' && c <= '8';
210
// square_to_string()
212
bool square_to_string(int square, char string[], int size) {
214
ASSERT(square_is_ok(square));
215
ASSERT(string!=NULL);
218
if (size < 3) return false;
220
string[0] = 'a' + square_file(square);
221
string[1] = '1' + square_rank(square);
227
// square_from_string()
229
int square_from_string(const char string[]) {
233
ASSERT(string!=NULL);
235
if (string[0] < 'a' || string[0] > 'h') return SquareNone;
236
if (string[1] < '1' || string[1] > '8') return SquareNone;
237
if (string[2] != '\0') return SquareNone;
239
file = file_from_char(string[0]);
240
rank = rank_from_char(string[1]);
242
return square_make(file,rank);