Added direct memory access
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user