Added a high level prototype for absolute address storage, to simplify creation of larger binaries

This commit is contained in:
Jeremiah Orians 2016-08-29 21:01:38 -04:00
parent 9e721f9606
commit b83681adb3
No known key found for this signature in database
GPG Key ID: 7457821534D2ACCD
1 changed files with 31 additions and 7 deletions

View File

@ -25,7 +25,8 @@ enum type
EOL = 1, EOL = 1,
comment = (1 << 1), comment = (1 << 1),
label = (1 << 2), label = (1 << 2),
string = (1 << 3) string = (1 << 3),
absolute_address = (1 << 4)
}; };
struct Token* newToken() struct Token* newToken()
@ -124,6 +125,11 @@ Restart:
p->type = p->type | label; p->type = p->type | label;
store[i] = (char)c; store[i] = (char)c;
} }
else if((!(p->type & comment ) && !(p->type & string)) && (38 == c))
{ /* Deal with & */
p->type = p->type | absolute_address;
store[i] = (char)c;
}
else if((p->type & string) && ((34 == c) ||(39 == c))) else if((p->type & string) && ((34 == c) ||(39 == c)))
{ {
goto Token_complete; goto Token_complete;
@ -422,8 +428,8 @@ void update_jumps(struct Token* head, struct Token* p)
{ {
uint32_t dest = -1; uint32_t dest = -1;
/* Find matching label */
if(('@' == p->Text[0]) || ('$' == p->Text[0])) if(('@' == p->Text[0]) || ('$' == p->Text[0]) || ('&' == p->Text[0]))
{ {
char temp[256] = {0}; char temp[256] = {0};
strncpy(temp, p->Text, max_string); strncpy(temp, p->Text, max_string);
@ -431,20 +437,30 @@ void update_jumps(struct Token* head, struct Token* p)
dest = get_address(head, temp); dest = get_address(head, temp);
} }
/* If match is found */
if(-1 != (int32_t)dest) if(-1 != (int32_t)dest)
{ {
int16_t dist = 0; /* Deal with Relative 16bit jumps */
if('@' == p->Text[0]) if('@' == p->Text[0])
{ {
int16_t dist = 0;
dist = dest - p->address + 4; dist = dest - p->address + 4;
sprintf(p->Expression, "%04x", (uint16_t)dist);
} }
/* Deal with Absolute 16bit jumps */
if('$' == p->Text[0]) if('$' == p->Text[0])
{ {
int16_t dist = 0;
dist = dest; dist = dest;
sprintf(p->Expression, "%04x", (uint16_t)dist);
} }
sprintf(p->Expression, "%04x", (uint16_t)dist); /* Deal with storing Pointers to absolute addresses */
if('&' == p->Text[0])
{
sprintf(p->Expression, "%08x", dest);
}
} }
if(NULL != p->next) if(NULL != p->next)
@ -481,20 +497,28 @@ void hexify_string(char* s, char* d, int max)
void process_string(struct Token* p) void process_string(struct Token* p)
{ {
/* Adjust hex and ascii strings */
if(p->type & string) if(p->type & string)
{ {
if('\'' == p->Text[0]) if('\'' == p->Text[0])
{ { /* Handle Hex strings */
strncpy(p->Expression, p->Text + 1, max_string); strncpy(p->Expression, p->Text + 1, max_string);
p->size = strnlen(p->Expression, max_string)/2; p->size = strnlen(p->Expression, max_string)/2;
} }
else if('"' == p->Text[0]) else if('"' == p->Text[0])
{ { /* Handle ASCII strings */
hexify_string(p->Text + 1, p->Expression, max_string/2); hexify_string(p->Text + 1, p->Expression, max_string/2);
p->size = strnlen(p->Expression, max_string)/2; p->size = strnlen(p->Expression, max_string)/2;
} }
} }
/* Deal with special case of absolute addresses */
if(p->type & absolute_address)
{ /* Absolute addresses are always the Register size */
p->size = 4;
/* Values are set when jumps are calculated */
}
if(NULL != p->next) if(NULL != p->next)
{ {
process_string(p->next); process_string(p->next);