Added direct memory access

This commit is contained in:
2019-11-23 16:47:16 +01:00
parent 22bb974a05
commit 1148682324
14 changed files with 329 additions and 92 deletions

View File

@@ -31,10 +31,24 @@ namespace Interpret
throw ExpectedRegister(token);
}
Value GetImmediateOrRegisterArgument(unsigned const index, std::vector<Token::Token> const & tokens)
Value GetRegisterOrMemoryArgument(unsigned const index, std::vector<Token::Token> const & tokens)
{
auto const & token = tokens[index];
if (token.type == Token::TokenType::ImmediateInteger || token.type == Token::TokenType::Register)
if (token.type == Token::TokenType::Register || token.type == Token::TokenType::Memory)
{
Value v;
v.CreateFromToken(token);
return v;
}
throw ExpectedRegisterOrMemory(token);
}
Value GetValueArgument(unsigned const index, std::vector<Token::Token> const & tokens)
{
auto const & token = tokens[index];
if (token.type == Token::TokenType::ImmediateInteger || token.type == Token::TokenType::Register || token.type == Token::TokenType::Memory)
{
Value v;
v.CreateFromToken(token);
@@ -47,15 +61,15 @@ namespace Interpret
void AddArithmeticArguments(ArithmeticStatement & statement, unsigned const operandIndex, std::vector<Token::Token> const & tokens)
{
statement.firstArgument = GetImmediateOrRegisterArgument(operandIndex + 1u, tokens);
statement.secondArgument = GetImmediateOrRegisterArgument(operandIndex + 2u, tokens);
statement.thirdArgument = GetRegisterArgument(operandIndex + 3u, tokens);
statement.firstArgument = GetValueArgument(operandIndex + 1u, tokens);
statement.secondArgument = GetValueArgument(operandIndex + 2u, tokens);
statement.thirdArgument = GetRegisterOrMemoryArgument(operandIndex + 3u, tokens);
}
void AddLogicArguments(ControlFlowStatement & statement, unsigned const operandIndex, std::vector<Token::Token> const & tokens)
{
statement.firstArgument = GetImmediateOrRegisterArgument(operandIndex + 1u, tokens);
statement.secondArgument = GetImmediateOrRegisterArgument(operandIndex + 2u, tokens);
statement.firstArgument = GetValueArgument(operandIndex + 1u, tokens);
statement.secondArgument = GetValueArgument(operandIndex + 2u, tokens);
}
std::unique_ptr<Statement> ExtractStatement(unsigned const operandIndex, std::vector<Token::Token> const & tokens)
@@ -196,8 +210,8 @@ namespace Interpret
case Token::OperandType::SetInteger:
{
auto statement = std::make_unique<SetStatement>();
statement->firstArgument = GetRegisterArgument(operandIndex + 1u, tokens);
statement->secondArgument = GetImmediateOrRegisterArgument(operandIndex + 2u, tokens);
statement->firstArgument = GetRegisterOrMemoryArgument(operandIndex + 1u, tokens);
statement->secondArgument = GetValueArgument(operandIndex + 2u, tokens);
return statement;
}
@@ -205,7 +219,7 @@ namespace Interpret
case Token::OperandType::Interrupt:
{
auto statement = std::make_unique<InterruptStatement>();
statement->firstArgument = GetImmediateOrRegisterArgument(operandIndex + 1u, tokens);
statement->firstArgument = GetValueArgument(operandIndex + 1u, tokens);
return statement;
}
@@ -221,7 +235,7 @@ namespace Interpret
case Token::OperandType::PushInteger:
{
auto statement = std::make_unique<PushStatement>();
statement->firstArgument = GetImmediateOrRegisterArgument(operandIndex + 1u, tokens);
statement->firstArgument = GetValueArgument(operandIndex + 1u, tokens);
return statement;
}