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 const address_t MEMORY_SIZE = 1024;
19 const command_t CMD_GOTO = 0x70;
20 const command_t CMD_SLEEP = 0xFF;
21 const command_t CMD_COLOR = 0xAA;
22 const command_t CMD_END = 0xED;
23 const command_t CMD_INVALID = 0x1; // placeholder for unsupported command
26 * Reads data on given position in memory and increments the index (position).
28 template<typename T> T read(command_t * memory, address_t &index) {
29 // TODO: for addresses: map higher memory to static hardcoded areas or peripherals
30 // TODO: sizeof (command_t) != 1 ?
31 T * value = reinterpret_cast<T*> (memory + index);
32 index += sizeof (*value) / sizeof (command_t);
37 * Writes data to given position in memory and increments the index (position).
39 template<typename T> void write(command_t * memory, address_t &index, const T value) {
40 // TODO: sizeof (command_t) != 1 ?
41 // T * m = (T*) (memory + index);
42 T * m = reinterpret_cast<T*> (memory + index);
44 index += sizeof (value) / sizeof (command_t);
47 int main(int argc, char* argv[]) {
49 setlocale(LC_ALL, "");
51 command_t * memory = (command_t*) malloc(MEMORY_SIZE);
55 write<command_t>(memory, a, CMD_SLEEP);
56 write<sleep_t>(memory, a, 255);
57 write<command_t>(memory, a, CMD_SLEEP);
58 write<sleep_t>(memory, a, 10);
59 write<command_t>(memory, a, CMD_SLEEP);
60 write<sleep_t>(memory, a, 255);
61 write<command_t>(memory, a, CMD_GOTO);
62 write<address_t>(memory, a, a + 4);
63 write<command_t>(memory, a, CMD_INVALID);
64 write<command_t>(memory, a, CMD_INVALID);
65 write<command_t>(memory, a, CMD_SLEEP);
66 write<sleep_t>(memory, a, 255);
67 write<command_t>(memory, a, CMD_COLOR);
68 write<color_t>(memory, a, 0);
69 write<color_t>(memory, a, 200);
70 write<color_t>(memory, a, 255);
71 write<command_t>(memory, a, CMD_END);
74 for (address_t i = 0; i < MEMORY_SIZE;) {
75 wprintf(L"command %*d = ", 4, i);
76 command_t ch = read<command_t>(memory, i);
77 wprintf(L"%02X ", ch);
87 i = read<address_t>(memory, i);
88 wprintf(L"GOTO %*d\n", 5, i);
91 delay = read<sleep_t>(memory, i);
92 wprintf(L"SLEEP %*d ms\n", 4, delay);
93 this_thread::sleep_for(chrono::milliseconds(delay));
96 r = read<color_t>(memory, i);
97 g = read<color_t>(memory, i);
98 b = read<color_t>(memory, i);
99 wprintf(L"COLOR %02X %02X %02X\n", r, g, b);
106 wprintf(L"invalid command\n");
113 wprintf(L"all done\n");