From 25b65bab1975407c04a9830ae7d42ecc6e1f89b4 Mon Sep 17 00:00:00 2001 From: Tijmen van Nesselrooij Date: Sun, 24 Nov 2019 11:03:37 +0100 Subject: [PATCH] Add print string from memory interrupt --- bin/example.wasm | 18 +++++++++++++++++- include/execute/interrupts.hpp | 3 ++- src/execute/interrupts.cpp | 13 +++++++++++-- src/interpret/statement.cpp | 2 +- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/bin/example.wasm b/bin/example.wasm index d0bf8f3..6ca7d08 100644 --- a/bin/example.wasm +++ b/bin/example.wasm @@ -15,7 +15,7 @@ addi $1 %A %A; # Print the current value int $1; seti %B %A; -seti %A $10; # new line +seti %A $32; # space int $0; seti %A %B; @@ -68,3 +68,19 @@ int $0; seti %A [$1024]; 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; \ No newline at end of file diff --git a/include/execute/interrupts.hpp b/include/execute/interrupts.hpp index eb00aac..cc4d51c 100644 --- a/include/execute/interrupts.hpp +++ b/include/execute/interrupts.hpp @@ -1,8 +1,9 @@ #pragma once +#include #include #include -using InterruptFn = void (*)(Execute::Registers & registers); +using InterruptFn = void (*)(Execute::Registers & registers, std::vector & memory); namespace Execute { diff --git a/src/execute/interrupts.cpp b/src/execute/interrupts.cpp index d120366..fd54619 100644 --- a/src/execute/interrupts.cpp +++ b/src/execute/interrupts.cpp @@ -8,9 +8,18 @@ namespace Execute return std::vector { // 0 print char - [](Execute::Registers & registers) { std::putc(registers.A, stdout); }, + [](Execute::Registers & registers, std::vector & memory) { std::putc(registers.A, stdout); }, // 1 print decimal integer - [](Execute::Registers & registers) { std::printf("%i", registers.A); } + [](Execute::Registers & registers, std::vector & memory) { std::printf("%i", registers.A); }, + // 2 print string from memory + [](Execute::Registers & registers, std::vector & memory) + { + unsigned const end = registers.A + registers.B; + for(unsigned i = registers.A; i < end; ++i) + { + std::putc(memory[i], stdout); + } + } }; } } \ No newline at end of file diff --git a/src/interpret/statement.cpp b/src/interpret/statement.cpp index e39314b..34227ee 100644 --- a/src/interpret/statement.cpp +++ b/src/interpret/statement.cpp @@ -48,7 +48,7 @@ namespace Interpret 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)