diff -r f049c3d3244d -r b997cbf9e30b c++/rgb-assembler/rgb-assembler.cpp --- a/c++/rgb-assembler/rgb-assembler.cpp Sun Dec 24 00:47:34 2017 +0100 +++ b/c++/rgb-assembler/rgb-assembler.cpp Mon Dec 25 00:24:07 2017 +0100 @@ -40,41 +40,40 @@ setlocale(LC_ALL, ""); - // TODO: wrap in a class with read(), write() and setAddress() methods - octet_t * memory = (octet_t*) malloc(MEMORY_SIZE); - + Memory memory; + // Sample program / data: // TODO: load bytes from file, stdin, serial port, network… { - address_t a = 0; - write(memory, a, CMD_SLEEP); - write(memory, a, 255); - write(memory, a, CMD_SLEEP); - write(memory, a, 10); - write(memory, a, CMD_SLEEP); - write(memory, a, 255); - write(memory, a, CMD_GOTO); - write(memory, a, a + sizeof (address_t) + 2 * sizeof (command_t)); - write(memory, a, CMD_INVALID); - write(memory, a, CMD_INVALID); - write(memory, a, CMD_SLEEP); - write(memory, a, 255); - write(memory, a, CMD_COLOR); - write(memory, a, 23); - write(memory, a, 0); - write(memory, a, 200); - write(memory, a, 255); - write(memory, a, CMD_INCREMENT); - write(memory, a, 0); - write(memory, a, CMD_DECREMENT); - write(memory, a, 0); - write(memory, a, CMD_GOTO_COMPARE); - write(memory, a, 0); - write(memory, a, 0 + sizeof (command_t) + sizeof (sleep_t)); - write(memory, a, a - 3 * sizeof (address_t) - 2 * sizeof (command_t)); - write(memory, a, 0); - write(memory, a, a + sizeof (address_t)); - write(memory, a, CMD_END); + memory.write(CMD_SLEEP); + memory.write(255); + memory.write(CMD_SLEEP); + memory.write(10); + memory.write(CMD_SLEEP); + memory.write(255); + memory.write(CMD_GOTO); + memory.write(memory.getIndex() + sizeof (address_t) + 2 * sizeof (command_t)); + memory.write(CMD_INVALID); + memory.write(CMD_INVALID); + memory.write(CMD_SLEEP); + memory.write(255); + memory.write(CMD_COLOR); + memory.write(23); + memory.write(0); + memory.write(200); + memory.write(255); + memory.write(CMD_INCREMENT); + memory.write(0); + memory.write(CMD_DECREMENT); + memory.write(0); + memory.write(CMD_GOTO_COMPARE); + memory.write(0); + memory.write(0 + sizeof (command_t) + sizeof (sleep_t)); + memory.write(memory.getIndex() - 3 * sizeof (address_t) - 2 * sizeof (command_t)); + memory.write(0); + memory.write(memory.getIndex() + sizeof (address_t)); + memory.write(CMD_END); + memory.start(); } // Supported commands @@ -91,22 +90,20 @@ // Main loop / interpreter: - for (address_t i = 0; i < MEMORY_SIZE;) { - wprintf(L"command %*d = ", 4, i); - command_t commandCode = read(memory, i); + while (memory.isInside()) { + wprintf(L"command %*d = ", 4, memory.getIndex()); + command_t commandCode = memory.read(); wprintf(L"%02X ", commandCode); shared_ptr command = commands[commandCode]; if (command) { - command->process(memory, i); + command->process(memory); } else { wprintf(L"invalid command\n"); } } - free(memory); - memory = nullptr; wprintf(L"all done\n"); return 0; }