Files
wassembly/src/execute/interrupts.cpp

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');
}
},
};
}
}