From fd44e03b1bd5db4df579938f47b72830a84493ad Mon Sep 17 00:00:00 2001 From: Garritt McCune Date: Sat, 8 Oct 2022 18:21:11 -0500 Subject: [PATCH] Updated the Parser to try and give 'AddressParameter's more meaning depending on the SymbolType. --- includes/opcodes.h | 3 ++- misc/test.asm | 4 +++- src/main.c | 24 ++++++++++++++++++++++-- src/parser.c | 25 +++++++++++++++++++++---- 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/includes/opcodes.h b/includes/opcodes.h index b5257f8..2fe200e 100644 --- a/includes/opcodes.h +++ b/includes/opcodes.h @@ -19,7 +19,8 @@ typedef enum { NoParameter, ConstantParameter, AddressParameter, - RegisterParameter + RegisterParameter, + UnresolvedParameter } OpcodeParameter; typedef struct { diff --git a/misc/test.asm b/misc/test.asm index a49b3ec..652d5f5 100644 --- a/misc/test.asm +++ b/misc/test.asm @@ -1,5 +1,7 @@ .db video_start 0xF37F .db msg "Hello, world!", 0 +.db NOTERM "No terminating byte here" +.db null_byte 0 load r1, [msg] ; Because the lod* instructions can't load an address ; from anything but a register, this becomes laa r1, [msg] @@ -11,7 +13,7 @@ load r1, [msg] ; Because the lod* instructions can't load an address string_length: loadb r3, [r1] ; Load the byte from the address in R1, into R3 load r2, 0 ; String length -cmp r3, 0 ; Is R3 a null byte? +cmp r3, null_byte ; Is R3 a null byte? je end inc r2 diff --git a/src/main.c b/src/main.c index 4c5c576..1fb2939 100644 --- a/src/main.c +++ b/src/main.c @@ -109,7 +109,17 @@ int main(int argc, char* args[]) { break; case AddressParameter: if (ins->ParameterOne->InterpretedAs == AddressParameter) printf("[%s]", ins->ParameterOne->Value.Symbol); - else printf("%s", ins->ParameterOne->Value.Symbol); + else { + Symbol* s = TryGetSymbol(ins->ParameterOne->Value.Symbol, image->SymbolsTable); + + switch(s->Type) { + case NumericSymbol: + printf("%s {%d}", s->Name, s->Value.Number); + break; + default: + printf("%s", ins->ParameterOne->Value.Symbol); + } + } break; default: printf("\n"); @@ -133,7 +143,17 @@ int main(int argc, char* args[]) { break; case AddressParameter: if (ins->ParameterTwo->InterpretedAs == AddressParameter) printf(", [%s]\n", ins->ParameterTwo->Value.Symbol); - else printf(", %s\n", ins->ParameterTwo->Value.Symbol); + else { + Symbol* s = TryGetSymbol(ins->ParameterTwo->Value.Symbol, image->SymbolsTable); + + switch(s->Type) { + case NumericSymbol: + printf(", %s {%d}\n", s->Name, s->Value.Number); + break; + default: + printf(", %s\n", ins->ParameterTwo->Value.Symbol); + } + } break; default: printf("\n"); diff --git a/src/parser.c b/src/parser.c index 323cfe7..3538538 100644 --- a/src/parser.c +++ b/src/parser.c @@ -148,11 +148,28 @@ Parameter* GetParameterType() { //case LabelClass: case IdentifierClass: param->ParameterType = AddressParameter; - param->InterpretedAs = AddressParameter; + //param->InterpretedAs = AddressParameter; symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable); - if (!symbol) symbol = AddSymbolToTable(token->Lemexe, UnresolvedSymbol, MachineState.SymbolsTable); + if (!symbol) { + symbol = AddSymbolToTable(token->Lemexe, UnresolvedSymbol, MachineState.SymbolsTable); + param->InterpretedAs = UnresolvedParameter; + } + else { + switch(symbol->Type) { + case InstructionPointerSymbol: + case StringSymbol: + param->InterpretedAs = AddressParameter; + break; + case NumericSymbol: + param->InterpretedAs = ConstantParameter; + break; + default: + param->InterpretedAs = UnresolvedParameter; + break; + } + } param->Value.Symbol = symbol->Name; @@ -298,9 +315,9 @@ void PrintSymbols(void) { break; case StringSymbol: if (symbol->Value.String->Terminated) - printf("[S] %s, %d", symbol->Name, symbol->Value.String->TerminatingByte); + printf("[S] %s {%s}, %d", symbol->Name, symbol->Value.String->String, symbol->Value.String->TerminatingByte); else - printf("[S] %s", symbol->Value.String->String); + printf("[S] %s {%s}", symbol->Name, symbol->Value.String->String); break; case UnresolvedSymbol: printf("[U] %s", symbol->Name);