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

@@ -3,47 +3,53 @@
namespace Token
{
Token::Token(int const _lineNumber, int const _lineColumn)
Token::Token(TokenType _type, bool validness, int const _lineNumber, int const _lineColumn)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(TokenType::Unknown),
isValid(false)
{
}
Token::Token(int const _lineNumber, int const _lineColumn, OperandType _operatorType, bool validness)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(TokenType::Operand),
type(_type),
valueType(TokenValueType::None),
isValid(validness),
data(_operatorType)
data(0)
{
}
Token::Token(int const _lineNumber, int const _lineColumn, RegisterType _registerType, bool validness)
Token::Token(TokenType _type, std::string const & string, bool validness, int const _lineNumber, int const _lineColumn)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(TokenType::Register),
type(_type),
valueType(TokenValueType::String),
isValid(validness),
data(_registerType)
data(string)
{
}
Token::Token(int const _lineNumber, int const _lineColumn, int value, bool validness)
Token::Token(TokenType _type, int value, bool validness, int const _lineNumber, int const _lineColumn)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(TokenType::ImmediateInteger),
type(_type),
valueType(TokenValueType::Integer),
isValid(validness),
data(value)
{
}
Token::Token(int const _lineNumber, int const _lineColumn, std::string const & value, bool validness)
Token::Token(TokenType _type, RegisterType const registerType, bool validness, int const _lineNumber, int const _lineColumn)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(TokenType::Label),
type(_type),
valueType(TokenValueType::Register),
isValid(validness),
data(value)
data(registerType)
{
}
Token::Token(TokenType _type, OperandType const operandType, bool validness, int const _lineNumber, int const _lineColumn)
: lineNumber(_lineNumber),
lineColumn(_lineColumn),
type(_type),
valueType(TokenValueType::Operand),
isValid(validness),
data(operandType)
{
}
@@ -52,10 +58,51 @@ namespace Token
lineColumn(other.lineColumn),
type(other.type),
isValid(other.isValid),
valueType(other.valueType),
data(other.data)
{
}
Token Token::CreateUnknownToken(int const lineNumber, int const lineColumn)
{
return Token(TokenType::Unknown, false, lineNumber, lineColumn);
}
Token Token::CreateStatementEndToken(int const lineNumber, int const lineColumn)
{
return Token(TokenType::StatementEnd, true, lineNumber, lineColumn);
}
Token Token::CreateLabelToken(std::string const & string, bool isValid, int const lineNumber, int const lineColumn)
{
return Token(TokenType::Label, string, isValid, lineNumber, lineColumn);
}
Token Token::CreateImmediateValueToken(int const value, bool isValid, int const lineNumber, int const lineColumn)
{
return Token(TokenType::ImmediateInteger, value, isValid, lineNumber, lineColumn);
}
Token Token::CreateRegisterToken(RegisterType const registerType, int const lineNumber, int const lineColumn)
{
return Token(TokenType::Register, registerType, registerType != RegisterType::Unknown, lineNumber, lineColumn);
}
Token Token::CreateOperandToken(OperandType const operandType, int const lineNumber, int const lineColumn)
{
return Token(TokenType::Operand, operandType, operandType != OperandType::Unknown, lineNumber, lineColumn);
}
Token Token::CreateMemoryToken(RegisterType const registerType, int const lineNumber, int const lineColumn)
{
return Token(TokenType::Memory, registerType, registerType != RegisterType::Unknown, lineNumber, lineColumn);
}
Token Token::CreateMemoryToken(int const value, bool isValid, int const lineNumber, int const lineColumn)
{
return Token(TokenType::Memory, value, isValid, lineNumber, lineColumn);
}
void Token::DebugPrint() const
{
std::putc(' ', stdout);
@@ -122,6 +169,25 @@ namespace Token
std::printf("LABEL=%s", std::get<std::string>(data).c_str());
break;
case TokenType::Memory:
{
switch(valueType)
{
case TokenValueType::Integer:
std::printf("[$%i]", std::get<int>(data));
break;
case TokenValueType::Register:
std::printf("[%%%i]", static_cast<int>(std::get<RegisterType>(data)));
break;
default:
std::printf("[UNKNOWN_TYPE]");
break;
}
}
break;
case TokenType::Unknown:
default:
std::printf("UNKNOWN_TOKEN");