83 lines
2.0 KiB
C++
83 lines
2.0 KiB
C++
#include <cstdio>
|
|
#include <execute/error.hpp>
|
|
#include <execute/interrupts.hpp>
|
|
|
|
namespace Execute
|
|
{
|
|
std::vector<InterruptFn> GetInterrupts()
|
|
{
|
|
return std::vector<InterruptFn>
|
|
{
|
|
/* STDOUT INTERRUPTS */
|
|
// 0 print char
|
|
[](Execute::Registers & registers, std::vector<std::uint8_t> & memory) { std::putc(registers.A, stdout); },
|
|
// 1 print decimal integer
|
|
[](Execute::Registers & registers, std::vector<std::uint8_t> & memory) { std::printf("%i", registers.A); },
|
|
// 2 print hexadecimal integer
|
|
[](Execute::Registers & registers, std::vector<std::uint8_t> & memory) { std::printf("0x%x", registers.A); },
|
|
// 3 print string from memory
|
|
[](Execute::Registers & registers, std::vector<std::uint8_t> & 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<std::uint8_t> & memory)
|
|
{
|
|
registers.A = std::getchar();
|
|
if (registers.A == '\n')
|
|
{
|
|
return;
|
|
}
|
|
|
|
while(std::getchar() != '\n');
|
|
},
|
|
// 11 get string from STDIN
|
|
[](Execute::Registers & registers, std::vector<std::uint8_t> & memory)
|
|
{
|
|
if (registers.B <= 0)
|
|
{
|
|
registers.B = 0;
|
|
return;
|
|
}
|
|
|
|
if (registers.A < 0 || static_cast<unsigned>(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');
|
|
}
|
|
},
|
|
};
|
|
}
|
|
} |