Updated the Parser to try and give 'AddressParameter's more meaning depending on the SymbolType.
This commit is contained in:
+2
-1
@@ -19,7 +19,8 @@ typedef enum {
|
|||||||
NoParameter,
|
NoParameter,
|
||||||
ConstantParameter,
|
ConstantParameter,
|
||||||
AddressParameter,
|
AddressParameter,
|
||||||
RegisterParameter
|
RegisterParameter,
|
||||||
|
UnresolvedParameter
|
||||||
} OpcodeParameter;
|
} OpcodeParameter;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
+3
-1
@@ -1,5 +1,7 @@
|
|||||||
.db video_start 0xF37F
|
.db video_start 0xF37F
|
||||||
.db msg "Hello, world!", 0
|
.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
|
load r1, [msg] ; Because the lod* instructions can't load an address
|
||||||
; from anything but a register, this becomes laa r1, [msg]
|
; 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:
|
string_length:
|
||||||
loadb r3, [r1] ; Load the byte from the address in R1, into R3
|
loadb r3, [r1] ; Load the byte from the address in R1, into R3
|
||||||
load r2, 0 ; String length
|
load r2, 0 ; String length
|
||||||
cmp r3, 0 ; Is R3 a null byte?
|
cmp r3, null_byte ; Is R3 a null byte?
|
||||||
je end
|
je end
|
||||||
inc r2
|
inc r2
|
||||||
|
|
||||||
|
|||||||
+22
-2
@@ -109,7 +109,17 @@ int main(int argc, char* args[]) {
|
|||||||
break;
|
break;
|
||||||
case AddressParameter:
|
case AddressParameter:
|
||||||
if (ins->ParameterOne->InterpretedAs == AddressParameter) printf("[%s]", ins->ParameterOne->Value.Symbol);
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("\n");
|
printf("\n");
|
||||||
@@ -133,7 +143,17 @@ int main(int argc, char* args[]) {
|
|||||||
break;
|
break;
|
||||||
case AddressParameter:
|
case AddressParameter:
|
||||||
if (ins->ParameterTwo->InterpretedAs == AddressParameter) printf(", [%s]\n", ins->ParameterTwo->Value.Symbol);
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|||||||
+21
-4
@@ -148,11 +148,28 @@ Parameter* GetParameterType() {
|
|||||||
//case LabelClass:
|
//case LabelClass:
|
||||||
case IdentifierClass:
|
case IdentifierClass:
|
||||||
param->ParameterType = AddressParameter;
|
param->ParameterType = AddressParameter;
|
||||||
param->InterpretedAs = AddressParameter;
|
//param->InterpretedAs = AddressParameter;
|
||||||
|
|
||||||
symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable);
|
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;
|
param->Value.Symbol = symbol->Name;
|
||||||
|
|
||||||
@@ -298,9 +315,9 @@ void PrintSymbols(void) {
|
|||||||
break;
|
break;
|
||||||
case StringSymbol:
|
case StringSymbol:
|
||||||
if (symbol->Value.String->Terminated)
|
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
|
else
|
||||||
printf("[S] %s", symbol->Value.String->String);
|
printf("[S] %s {%s}", symbol->Name, symbol->Value.String->String);
|
||||||
break;
|
break;
|
||||||
case UnresolvedSymbol:
|
case UnresolvedSymbol:
|
||||||
printf("[U] %s", symbol->Name);
|
printf("[U] %s", symbol->Name);
|
||||||
|
|||||||
Reference in New Issue
Block a user