aboutsummaryrefslogtreecommitdiff
path: root/src/mcu.c
blob: 72482009af37334323c358ef5a9ee17a0faf7675 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <avr/io.h>
#include <tak.h>
#include <ct1986.h>

#define EXIT_SUCCESS 0
#define EXIT_FAILURE -1

/*
 * static int
 * handle_turn(char *line) {
 *	// Track win state
 *	uint8_t new_win = (won == 0xFF);
 *	switch (do_ptn(line)) {
 *		// Errors
 *		case PTN_INVALID:  { return EXIT_FAILURE; break; }
 *		case ACT_ILLEGAL:  { return EXIT_FAILURE; break; }
 *		case ACT_OVERFLOW: { return EXIT_FAILURE; break; }
 *			// Game has ended
 *		case GAME_END: {
 *			// Did it end this turn?
 *			if (new_win) {
 *				switch (won) {
 *					case WIN_DRAW:       {  break; }
 *					case WIN_FLAT_BLACK: {  break; }
 *					case WIN_FLAT_WHITE: {  break; }
 *					case WIN_ROAD_BLACK: {  break; }
 *					case WIN_ROAD_WHITE: {  break; }
 *				}
 *			}
 *			if (! new_win) return EXIT_FAILURE;
 *			break;
 *		}
 *			// Valid, append to game log
 *		case PTN_VALID:
 *		case ACT_OK: { break; }
 *	}
 *	return EXIT_SUCCESS;
 * }
 */

static void
dot(const uint8_t depth) {
	PORTD ^= _BV(4);
}


static int
ct1986_turn(const uint8_t max_depth) {
	// Prepare progress bar
	// Run the minimax
	float minimax = ct1986_generate(max_depth);
	// Failed to find a move?
	if ((minimax <= -infty && (ply & 1) == 1)
			||(minimax >= infty && (ply & 1) == 0)) {
		//		puts("] Opponent concedes!");
		return EXIT_FAILURE;
	} else {
		do_ptn(ct1986_ptn);
		return EXIT_SUCCESS;
	}
}


int main(void) {
	DDRD = _BV(0) | _BV(4);
	PORTD = 0;

	reset_state(5);
	ct1986_display_progress = &dot;
	PORTD = _BV(0) | _BV(4);
	ct1986_turn(1);
	PORTD = 0;

	while (1);
	return 0;
}