|
1 | | -/* OliThink5 (c) Oliver Brausch 06.Jun.2021, ob112@web.de, http://brausch.org */ |
2 | | -#define VER "5.9.8" |
| 1 | +/* OliThink5 (c) Oliver Brausch 11.Jun.2021, ob112@web.de, http://brausch.org */ |
| 2 | +#define VER "5.9.9" |
3 | 3 | #include <stdio.h> |
4 | 4 | #include <string.h> |
5 | 5 | #ifdef _WIN64 |
@@ -44,14 +44,14 @@ const int fval[] = {0, 0, 2, 0, 0, 3, 5, 9}; |
44 | 44 | #define _CAP(x) ((x) << 19) |
45 | 45 | #define PREMOVE(f, p) ((f) | _ONMV(c) | _PIECE(p)) |
46 | 46 |
|
47 | | -#define RATT1(f) rays[((f) << 7) | key000(BOARD, f)] |
48 | | -#define RATT2(f) rays[((f) << 7) | key090(BOARD, f) | 0x2000] |
49 | | -#define BATT3(f) rays[((f) << 7) | key045(BOARD, f) | 0x4000] |
50 | | -#define BATT4(f) rays[((f) << 7) | key135(BOARD, f) | 0x6000] |
51 | | -#define RXRAY1(f) rays[((f) << 7) | key000(BOARD, f) | 0x8000] |
52 | | -#define RXRAY2(f) rays[((f) << 7) | key090(BOARD, f) | 0xA000] |
53 | | -#define BXRAY3(f) rays[((f) << 7) | key045(BOARD, f) | 0xC000] |
54 | | -#define BXRAY4(f) rays[((f) << 7) | key135(BOARD, f) | 0xE000] |
| 47 | +#define RATT1(f) rays[((f) << 6) | key000(BOARD, f)] |
| 48 | +#define RATT2(f) rays[((f) << 6) | key090(BOARD, f) | 0x1000] |
| 49 | +#define BATT3(f) rays[((f) << 6) | key045(BOARD, f) | 0x2000] |
| 50 | +#define BATT4(f) rays[((f) << 6) | key135(BOARD, f) | 0x3000] |
| 51 | +#define RXRAY1(f) rays[((f) << 6) | key000(BOARD, f) | 0x4000] |
| 52 | +#define RXRAY2(f) rays[((f) << 6) | key090(BOARD, f) | 0x5000] |
| 53 | +#define BXRAY3(f) rays[((f) << 6) | key045(BOARD, f) | 0x6000] |
| 54 | +#define BXRAY4(f) rays[((f) << 6) | key135(BOARD, f) | 0x7000] |
55 | 55 |
|
56 | 56 | #define RMOVE1(f) (RATT1(f) & ~BOARD) |
57 | 57 | #define RMOVE2(f) (RATT2(f) & ~BOARD) |
@@ -99,7 +99,7 @@ int wstack[0x400]; |
99 | 99 |
|
100 | 100 | static u64 BIT[64]; |
101 | 101 | static u64 hashxor[4096]; |
102 | | -static u64 rays[0x10000]; |
| 102 | +static u64 rays[0x8000]; |
103 | 103 | static u64 pmoves[128]; |
104 | 104 | static u64 pcaps[384]; |
105 | 105 | static u64 nmoves[64]; |
@@ -305,8 +305,8 @@ void _init_rays(u64* ray, u64 (*rayFunc) (int, u64, int), int (*key)(u64, int)) |
305 | 305 | u64 occ = (*rayFunc)(f, board, 2); |
306 | 306 | u64 xray = (*rayFunc)(f, board, 3); |
307 | 307 | int index = (*key)(board, f); |
308 | | - ray[(f << 7) + index] = occ | move; |
309 | | - ray[(f << 7) + index + 0x8000] = xray; |
| 308 | + ray[(f << 6) + index] = occ | move; |
| 309 | + ray[(f << 6) + index + 0x4000] = xray; |
310 | 310 | } |
311 | 311 | } |
312 | 312 | } |
@@ -396,18 +396,18 @@ int identPiece(int f) { |
396 | 396 | } |
397 | 397 |
|
398 | 398 | int key000(u64 b, int f) { |
399 | | - return (int) ((b >> (f & 56)) & 0x7E); |
| 399 | + return (int) ((b >> ((f & 56) + 1)) & 0x3F); |
400 | 400 | } |
401 | 401 |
|
402 | 402 | int key090(u64 b, int f) { |
403 | 403 | u64 _b = (b >> (f&7)) & 0x0101010101010101LL; |
404 | 404 | _b = _b * 0x0080402010080400LL; |
405 | | - return (int)(_b >> 57); |
| 405 | + return (int)(_b >> 58); |
406 | 406 | } |
407 | 407 |
|
408 | 408 | int keyDiag(u64 _b) { |
409 | 409 | _b = _b * 0x0202020202020202LL; |
410 | | - return (int)(_b >> 57); |
| 410 | + return (int)(_b >> 58); |
411 | 411 | } |
412 | 412 |
|
413 | 413 | u64 bmask135[64], bmask45[64]; |
@@ -854,7 +854,7 @@ int evalc(int c) { |
854 | 854 | b = pieceb[QUEEN] & cb; |
855 | 855 | while (b) { |
856 | 856 | f = pullLsb(&b); |
857 | | - a = BATT3(f) | BATT4(f) | RATT1(f) | RATT2(f); |
| 857 | + a = BATT(f) | RATT(f); |
858 | 858 | if (a & kn) katt += MOBILITY(a & kn, mb) << 3; |
859 | 859 | mn += MOBILITY(a, mb) * egf * egf / 75 / 75; |
860 | 860 | } |
@@ -926,8 +926,8 @@ int quiesce(u64 ch, int c, int ply, int alpha, int beta) { |
926 | 926 | if (cmat + 85 <= alpha) break; |
927 | 927 | best = eval(c); |
928 | 928 | if (best > alpha) { |
929 | | - alpha = best; |
930 | 929 | if (best >= beta) return beta; |
| 930 | + alpha = best; |
931 | 931 | } |
932 | 932 | } while(0); |
933 | 933 |
|
@@ -1047,7 +1047,7 @@ int search(u64 ch, int c, int d, int ply, int alpha, int beta, int null, Move se |
1047 | 1047 | hstack[COUNT] = hp; |
1048 | 1048 | //Null Move - pvnode => null == 0 |
1049 | 1049 | null = null && !ch && beta > -MAXSCORE+500 && d > 1 && wstat > alpha && (ply < 2 || (mstack[COUNT-2] >> 27)); |
1050 | | - if (null && bitcnt(colorb[c] & (~pieceb[PAWN]) & (~pinnedPieces(kingpos[c], oc))) > 1) { |
| 1050 | + if (null && (colorb[c] & (~pieceb[PAWN]) & (~pieceb[KING]))) { |
1051 | 1051 | int R = (10 + d + nullvariance(wstat - alpha))/4; |
1052 | 1052 | doMove(0, c); |
1053 | 1053 | w = -search(0LL, oc, d-R, ply+1, -beta, 1-beta, 0, 0); |
@@ -1117,8 +1117,7 @@ int search(u64 ch, int c, int d, int ply, int alpha, int beta, int null, Move se |
1117 | 1117 | if (w > alpha) { |
1118 | 1118 | alpha = w, first = GOOD_MOVE; |
1119 | 1119 | pv[ply][ply] = m; |
1120 | | - for (j = ply +1; pv[ply +1][j]; j++) pv[ply][j] = pv[ply +1][j]; |
1121 | | - pv[ply][j] = 0; |
| 1120 | + for (j = ply +1; (pv[ply][j] = pv[ply +1][j]); j++); |
1122 | 1121 |
|
1123 | 1122 | if (w >= beta) { |
1124 | 1123 | if (quiet) { |
@@ -1412,9 +1411,9 @@ int main(int argc, char **argv) { |
1412 | 1411 | crevoke[56] ^= BIT[9]; |
1413 | 1412 |
|
1414 | 1413 | _init_rays(rays, _rook0, key000); |
1415 | | - _init_rays(rays + 0x2000, _rook90, key090); |
1416 | | - _init_rays(rays + 0x4000, _bishop45, key045); |
1417 | | - _init_rays(rays + 0x6000, _bishop135, key135); |
| 1414 | + _init_rays(rays + 0x1000, _rook90, key090); |
| 1415 | + _init_rays(rays + 0x2000, _bishop45, key045); |
| 1416 | + _init_rays(rays + 0x3000, _bishop135, key135); |
1418 | 1417 | _init_shorts(nmoves, _knight); |
1419 | 1418 | _init_shorts(kmoves, _king); |
1420 | 1419 | _init_pawns(pmoves, pcaps, pawnfree, pawnfile, pawnhelp, 0); |
|
0 commit comments