Add string input interrupt from STDIN

This commit is contained in:
2020-05-17 14:13:15 +02:00
parent 2d820e7028
commit fc2870ca74
5 changed files with 92 additions and 16 deletions

View File

@@ -1,4 +1,5 @@
#include <cstdio>
#include <execute/error.hpp>
#include <execute/interrupts.hpp>
namespace Execute
@@ -18,6 +19,11 @@ namespace Execute
[](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);
@@ -29,7 +35,49 @@ namespace Execute
[](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');
}
},
};
}
}