12 typedef uint16_t address_t;
13 typedef uint8_t command_t;
14 typedef uint8_t sleep_t;
15 typedef uint8_t color_t;
17 // TODO: strong typedefs http://www.boost.org/doc/libs/1_61_0/libs/serialization/doc/strong_typedef.html ?
19 const address_t MEMORY_SIZE = 1024;
21 const command_t CMD_GOTO = 0x70;
22 const command_t CMD_SLEEP = 0xFF;
23 const command_t CMD_COLOR = 0xAA;
24 const command_t CMD_END = 0xED;
25 const command_t CMD_INVALID = 0x1; // placeholder for unsupported command
28 * Reads data on given position in memory and increments the index (position).
30 template<typename T> T read(command_t * memory, address_t &index) {
31 // TODO: for addresses: map higher memory to static hardcoded areas or peripherals
32 // TODO: sizeof (command_t) != 1 ?
33 T * value = reinterpret_cast<T*> (memory + index);
34 index += sizeof (*value) / sizeof (command_t);
39 * Writes data to given position in memory and increments the index (position).
41 template<typename T> void write(command_t * memory, address_t &index, const T value) {
42 // TODO: sizeof (command_t) != 1 ?
43 // T * m = (T*) (memory + index);
44 T * m = reinterpret_cast<T*> (memory + index);
46 index += sizeof (value) / sizeof (command_t);
49 int main(int argc, char* argv[]) {
51 setlocale(LC_ALL, "");
53 command_t * memory = (command_t*) malloc(MEMORY_SIZE);
57 write<command_t>(memory, a, CMD_SLEEP);
58 write<sleep_t>(memory, a, 255);
59 write<command_t>(memory, a, CMD_SLEEP);
60 write<sleep_t>(memory, a, 10);
61 write<command_t>(memory, a, CMD_SLEEP);
62 write<sleep_t>(memory, a, 255);
63 write<command_t>(memory, a, CMD_GOTO);
64 write<address_t>(memory, a, a + 4);
65 write<command_t>(memory, a, CMD_INVALID);
66 write<command_t>(memory, a, CMD_INVALID);
67 write<command_t>(memory, a, CMD_SLEEP);
68 write<sleep_t>(memory, a, 255);
69 write<command_t>(memory, a, CMD_COLOR);
70 write<color_t>(memory, a, 0);
71 write<color_t>(memory, a, 200);
72 write<color_t>(memory, a, 255);
73 write<command_t>(memory, a, CMD_END);
76 for (address_t i = 0; i < MEMORY_SIZE;) {
77 wprintf(L"command %*d = ", 4, i);
78 command_t ch = read<command_t>(memory, i);
79 wprintf(L"%02X ", ch);
84 i = read<address_t>(memory, i);
85 wprintf(L"GOTO %*d\n", 5, i);
90 sleep_t delay = read<sleep_t>(memory, i);
91 wprintf(L"SLEEP %*d ms\n", 4, delay);
92 this_thread::sleep_for(chrono::milliseconds(delay));
97 color_t r = read<color_t>(memory, i);
98 color_t g = read<color_t>(memory, i);
99 color_t b = read<color_t>(memory, i);
100 wprintf(L"COLOR %02X %02X %02X\n", r, g, b);
111 wprintf(L"invalid command\n");
119 wprintf(L"all done\n");