Add print string from memory interrupt
This commit is contained in:
@@ -15,7 +15,7 @@ addi $1 %A %A;
|
|||||||
# Print the current value
|
# Print the current value
|
||||||
int $1;
|
int $1;
|
||||||
seti %B %A;
|
seti %B %A;
|
||||||
seti %A $10; # new line
|
seti %A $32; # space
|
||||||
int $0;
|
int $0;
|
||||||
seti %A %B;
|
seti %A %B;
|
||||||
|
|
||||||
@@ -68,3 +68,19 @@ int $0;
|
|||||||
|
|
||||||
seti %A [$1024];
|
seti %A [$1024];
|
||||||
int $1;
|
int $1;
|
||||||
|
|
||||||
|
# Push the string "hell" into register A
|
||||||
|
seti %A $108;
|
||||||
|
shli %A $8 %A;
|
||||||
|
addi %A $108 %A;
|
||||||
|
shli %A $8 %A;
|
||||||
|
addi %A $101 %A;
|
||||||
|
shli %A $8 %A;
|
||||||
|
addi %A $104 %A;
|
||||||
|
|
||||||
|
# Store A at 900
|
||||||
|
seti [$900] %A;
|
||||||
|
# Setup to print a string from position 900
|
||||||
|
seti %A $900;
|
||||||
|
seti %B $4;
|
||||||
|
int $2;
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include <cstdint>
|
||||||
#include <execute/registers.hpp>
|
#include <execute/registers.hpp>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
using InterruptFn = void (*)(Execute::Registers & registers);
|
using InterruptFn = void (*)(Execute::Registers & registers, std::vector<std::uint8_t> & memory);
|
||||||
|
|
||||||
namespace Execute
|
namespace Execute
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,9 +8,18 @@ namespace Execute
|
|||||||
return std::vector<InterruptFn>
|
return std::vector<InterruptFn>
|
||||||
{
|
{
|
||||||
// 0 print char
|
// 0 print char
|
||||||
[](Execute::Registers & registers) { std::putc(registers.A, stdout); },
|
[](Execute::Registers & registers, std::vector<std::uint8_t> & memory) { std::putc(registers.A, stdout); },
|
||||||
// 1 print decimal integer
|
// 1 print decimal integer
|
||||||
[](Execute::Registers & registers) { std::printf("%i", registers.A); }
|
[](Execute::Registers & registers, std::vector<std::uint8_t> & memory) { std::printf("%i", registers.A); },
|
||||||
|
// 2 print string from memory
|
||||||
|
[](Execute::Registers & registers, std::vector<std::uint8_t> & memory)
|
||||||
|
{
|
||||||
|
unsigned const end = registers.A + registers.B;
|
||||||
|
for(unsigned i = registers.A; i < end; ++i)
|
||||||
|
{
|
||||||
|
std::putc(memory[i], stdout);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -48,7 +48,7 @@ namespace Interpret
|
|||||||
|
|
||||||
void InterruptStatement::Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers)
|
void InterruptStatement::Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers)
|
||||||
{
|
{
|
||||||
state.interrupts[firstArgument.GetValue(state, registers)](registers);
|
state.interrupts[firstArgument.GetValue(state, registers)](registers, state.memory);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PopStatement::Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers)
|
void PopStatement::Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers)
|
||||||
|
|||||||
Reference in New Issue
Block a user