Website Summary Files Commits Branches @commit @diff @stats
path: root / spasm / src / asm / assembler.cpp
diff options
context:
space:
mode:
Commita7cd9d4f8d83024402bacb39786e5e1a018a0a04 (patch)
Author
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2018-11-14 23:45:56 +0200
Committer
 Martin Dobrev <martindobrev0@gmail.com>
2018-11-14 23:45:56 +0200
Files1f99c6f8d00d9b94b69c8f3525643344a32d7414 /spasm/src/asm/assembler.cpp
IPL-a7cd9d4f8d83024402bacb39786e5e1a018a0a04.tar
IPL-a7cd9d4f8d83024402bacb39786e5e1a018a0a04.tar.gz
IPL-a7cd9d4f8d83024402bacb39786e5e1a018a0a04.zip
Parent9a7a8a31e75d1b85274ef46ca29714270062809e (diff)
Spasm can assemble programs on with the new instruction set (#47)
* Use checkout as-is, commit as-is * Spasm can assemble programs based on the new instruction set
1 files changed, 54 insertions, 14 deletions
-rw-r--r--spasm/src/asm/assembler.cpp68
diff --git a/spasm/src/asm/assembler.cpp b/spasm/src/asm/assembler.cpp
index 25ed377..fbe6675 100644
--- a/spasm/src/asm/assembler.cpp
+++ b/spasm/src/asm/assembler.cpp
@@ -18,24 +18,64 @@ void Assembler::assemble()
{
Lexer::Token token = _tokenizer->next_token();
- while (token.type() != Lexer::Token::endinput)
+ while (token.type() != Lexer::Token::EndInput)
{
- switch (token.type())
+ const auto type = token.type();
+ if (type >= Lexer::Token::_NotOpCodeBegin)
{
- case Lexer::Token::ident:
- assemble_identifier(token);
- break;
- case Lexer::Token::label:
+ switch (token.type())
+ {
+ case Lexer::Token::Ident:
+ assemble_identifier(token);
+ break;
+ case Lexer::Token::Label:
+ token = _tokenizer->next_token();
+ assert(token.type() == Lexer::Token::Ident);
+ _symbols.define(token.value_str(), _bytecode->size());
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ _bytecode->push_opcode((Bytecode_Stream::Opcode_t)token.type());
+ if (type >= Lexer::Token::_OneArgBegin)
+ {
+ if (type == Lexer::Token::Call || type == Lexer::Token::Jump)
+ {
+ token = _tokenizer->next_token();
+ assert(token.type() == Lexer::Token::Ident);
+ assemble_identifier(token);
+ }
+ else
+ {
+ token = _tokenizer->next_token();
+ assert(token.type() == Lexer::Token::Integer);
+ _bytecode->push_integer(token.value_int());
+ }
+ }
+ if (type >= Lexer::Token::_TwoArgBegin)
+ {
+ if (type == Lexer::Token::JumpF || type == Lexer::Token::JumpT)
+ {
+ token = _tokenizer->next_token();
+ assert(token.type() == Lexer::Token::Ident);
+ assemble_identifier(token);
+ }
+ else
+ {
+ token = _tokenizer->next_token();
+ assert(token.type() == Lexer::Token::Integer);
+ _bytecode->push_integer(token.value_int());
+ }
+ }
+ if (type >= Lexer::Token::_ThreeArgBegin)
+ {
token = _tokenizer->next_token();
- assert(token.type() == Lexer::Token::ident);
- _symbols.define(token.value_str(), _bytecode->size());
- break;
- case Lexer::Token::integer:
- case Lexer::Token::xinteger:
+ assert(token.type() == Lexer::Token::Integer);
_bytecode->push_integer(token.value_int());
- break;
- default:
- _bytecode->push_opcode((Bytecode_Stream::Opcode_t)token.type());
+ }
}
token = _tokenizer->next_token();