#include #include #include namespace Execute { std::vector GetInterrupts() { return std::vector { /* STDOUT INTERRUPTS */ // 0 print char [](Execute::Registers & registers, std::vector & memory) { std::putc(registers.A, stdout); }, // 1 print decimal integer [](Execute::Registers & registers, std::vector & memory) { std::printf("%i", registers.A); }, // 2 print hexadecimal integer [](Execute::Registers & registers, std::vector & memory) { std::printf("0x%x", registers.A); }, // 3 print string from memory [](Execute::Registers & registers, std::vector & memory) { unsigned const end = registers.A + registers.B; if (end >= memory.size()) { throw OutOfMemory(registers.A, registers.B); } for(unsigned i = registers.A; i < end; ++i) { std::putc(memory[i], stdout); } }, /* STDIN INTERRUPTS */ // 10 get char from STDIN [](Execute::Registers & registers, std::vector & memory) { registers.A = std::getchar(); if (registers.A == '\n') { return; } while(std::getchar() != '\n'); }, // 11 get string from STDIN [](Execute::Registers & registers, std::vector & memory) { if (registers.B <= 0) { registers.B = 0; return; } if (registers.A < 0 || static_cast(registers.A + registers.B) >= memory.size()) { throw OutOfMemory(registers.A, registers.B); } int charactersRead = 0; bool newlineRead = false; while(charactersRead < registers.B) { char result = std::getchar(); if (result == '\n') { newlineRead = true; break; } memory[registers.A + charactersRead] = result; ++charactersRead; } registers.B = charactersRead; if (!newlineRead) { while(std::getchar() != '\n'); } }, }; } }