Improves assembler: Now has support for modifiers.
This commit is contained in:
parent
099e9da694
commit
fef46ee8af
3 changed files with 153 additions and 54 deletions
109
libvm/as/as.c
109
libvm/as/as.c
|
@ -57,17 +57,23 @@ int listSymbols = 0;
|
||||||
// current token
|
// current token
|
||||||
int tok;
|
int tok;
|
||||||
|
|
||||||
|
void apply_modifier(instruction_t *i, const char *mod);
|
||||||
|
|
||||||
void apply_modifiers(instruction_t *i)
|
void apply_modifiers(instruction_t *i)
|
||||||
{
|
{
|
||||||
while(tok == TOK_MOD)
|
while(tok == TOK_MOD)
|
||||||
{
|
{
|
||||||
printf("modifier, ");
|
char *s = yytext + 1;
|
||||||
|
int len = strlen(s);
|
||||||
|
s[len - 1] = 0;
|
||||||
|
apply_modifier(i, s);
|
||||||
tok = yylex();
|
tok = yylex();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// line format:
|
// line format:
|
||||||
// TOK_LABEL? TOK_MOD* TOK_MNEMONIC TOK_MOD* ()? TOK_MOD* TOK_NEWLINE
|
// TOK_LABEL? TOK_MOD* TOK_MNEMONIC TOK_MOD* (TOK_INT|TOK_HEX|TOK_CHAR|TOK_REF)? TOK_MOD* TOK_NEWLINE
|
||||||
void assemble()
|
void assemble()
|
||||||
{
|
{
|
||||||
uint32_t index = 0;
|
uint32_t index = 0;
|
||||||
|
@ -156,7 +162,6 @@ void assemble()
|
||||||
// Increase command index by one
|
// Increase command index by one
|
||||||
index += 1;
|
index += 1;
|
||||||
}
|
}
|
||||||
printf("NEXT\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(listSymbols)
|
if(listSymbols)
|
||||||
|
@ -168,7 +173,7 @@ void assemble()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Patches:\n");
|
// printf("Patches:\n");
|
||||||
for(llist_t *it = patches; it != NULL; it = it->next)
|
for(llist_t *it = patches; it != NULL; it = it->next)
|
||||||
{
|
{
|
||||||
uint32_t target = list_find(&labels, it->name);
|
uint32_t target = list_find(&labels, it->name);
|
||||||
|
@ -177,7 +182,7 @@ void assemble()
|
||||||
fseek(output, sizeof(instruction_t) * it->value + 4, SEEK_SET);
|
fseek(output, sizeof(instruction_t) * it->value + 4, SEEK_SET);
|
||||||
fwrite(&target, 1, sizeof(uint32_t), output);
|
fwrite(&target, 1, sizeof(uint32_t), output);
|
||||||
|
|
||||||
printf("%d -> %d (%s)\n", it->value, target, it->name);
|
// printf("%d -> %d (%s)\n", it->value, target, it->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -239,3 +244,97 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void apply_modifier(instruction_t *i, const char *mod)
|
||||||
|
{
|
||||||
|
// printf("[%s]\n", mod);
|
||||||
|
if(strncmp("ci:", mod, 3) == 0)
|
||||||
|
{
|
||||||
|
i->cmdinfo = atoi(mod + 3);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strncmp("cmd:", mod, 4) == 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Command specification %s not supported yet.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strcmp("f:yes", mod) == 0)
|
||||||
|
{
|
||||||
|
i->flags = 1;
|
||||||
|
}
|
||||||
|
else if(strcmp("f:no", mod) == 0)
|
||||||
|
{
|
||||||
|
i->flags = 0;
|
||||||
|
}
|
||||||
|
else if(strcmp("r:discard", mod) == 0)
|
||||||
|
{
|
||||||
|
i->output = VM_OUTPUT_DISCARD;
|
||||||
|
}
|
||||||
|
else if(strcmp("r:push", mod) == 0)
|
||||||
|
{
|
||||||
|
i->output = VM_OUTPUT_PUSH;
|
||||||
|
}
|
||||||
|
else if(strcmp("r:jump", mod) == 0)
|
||||||
|
{
|
||||||
|
i->output = VM_OUTPUT_JUMP;
|
||||||
|
}
|
||||||
|
else if(strcmp("r:jumpr", mod) == 0)
|
||||||
|
{
|
||||||
|
i->output = VM_OUTPUT_JUMPR;
|
||||||
|
}
|
||||||
|
else if(strcmp("i0:zero", mod) == 0)
|
||||||
|
{
|
||||||
|
i->input0 = VM_INPUT_ZERO;
|
||||||
|
}
|
||||||
|
else if(strcmp("i0:pop", mod) == 0)
|
||||||
|
{
|
||||||
|
i->input0 = VM_INPUT_POP;
|
||||||
|
}
|
||||||
|
else if(strcmp("i0:peek", mod) == 0)
|
||||||
|
{
|
||||||
|
i->input0 = VM_INPUT_PEEK;
|
||||||
|
}
|
||||||
|
else if(strcmp("i0:arg", mod) == 0)
|
||||||
|
{
|
||||||
|
i->input0 = VM_INPUT_ARG;
|
||||||
|
}
|
||||||
|
else if(strcmp("i1:zero", mod) == 0)
|
||||||
|
{
|
||||||
|
i->input1 = VM_INPUT_ZERO;
|
||||||
|
}
|
||||||
|
else if(strcmp("i1:pop", mod) == 0)
|
||||||
|
{
|
||||||
|
i->input1 = VM_INPUT_POP;
|
||||||
|
}
|
||||||
|
else if(strcmp("ex(z)=x", mod) == 0)
|
||||||
|
{
|
||||||
|
i->execZ = VM_EXEC_X;
|
||||||
|
}
|
||||||
|
else if(strcmp("ex(z)=0", mod) == 0)
|
||||||
|
{
|
||||||
|
i->execZ = VM_EXEC_0;
|
||||||
|
}
|
||||||
|
else if(strcmp("ex(z)=1", mod) == 0)
|
||||||
|
{
|
||||||
|
i->execZ = VM_EXEC_1;
|
||||||
|
}
|
||||||
|
else if(strcmp("ex(n)=x", mod) == 0)
|
||||||
|
{
|
||||||
|
i->execN = VM_EXEC_X;
|
||||||
|
}
|
||||||
|
else if(strcmp("ex(n)=0", mod) == 0)
|
||||||
|
{
|
||||||
|
i->execN = VM_EXEC_0;
|
||||||
|
}
|
||||||
|
else if(strcmp("ex(n)=1", mod) == 0)
|
||||||
|
{
|
||||||
|
i->execN = VM_EXEC_1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Unknown modifier: [%s]\n", mod);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
|
@ -385,11 +385,11 @@ struct yy_trans_info
|
||||||
flex_int32_t yy_verify;
|
flex_int32_t yy_verify;
|
||||||
flex_int32_t yy_nxt;
|
flex_int32_t yy_nxt;
|
||||||
};
|
};
|
||||||
static yyconst flex_int16_t yy_accept[28] =
|
static yyconst flex_int16_t yy_accept[30] =
|
||||||
{ 0,
|
{ 0,
|
||||||
0, 0, 13, 11, 4, 10, 11, 3, 3, 1,
|
0, 0, 13, 11, 4, 10, 11, 11, 3, 3,
|
||||||
11, 5, 11, 11, 0, 3, 6, 0, 0, 1,
|
1, 11, 5, 11, 11, 0, 3, 3, 6, 0,
|
||||||
9, 5, 0, 8, 2, 7, 0
|
0, 1, 9, 5, 0, 8, 2, 7, 0
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
static yyconst YY_CHAR yy_ec[256] =
|
static yyconst YY_CHAR yy_ec[256] =
|
||||||
|
@ -398,16 +398,16 @@ static yyconst YY_CHAR yy_ec[256] =
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
1, 2, 1, 1, 1, 1, 1, 1, 4, 1,
|
1, 2, 1, 1, 1, 1, 1, 1, 4, 1,
|
||||||
1, 1, 1, 1, 1, 1, 1, 5, 6, 6,
|
1, 1, 1, 1, 5, 1, 1, 6, 7, 7,
|
||||||
6, 6, 6, 6, 6, 6, 6, 7, 8, 1,
|
7, 7, 7, 7, 7, 7, 7, 8, 9, 1,
|
||||||
1, 1, 1, 9, 10, 10, 10, 10, 10, 10,
|
1, 1, 1, 10, 11, 11, 11, 11, 11, 11,
|
||||||
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
|
12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
|
||||||
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
|
12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
|
||||||
12, 1, 13, 1, 14, 1, 10, 10, 10, 10,
|
13, 1, 14, 1, 15, 1, 11, 11, 11, 11,
|
||||||
|
|
||||||
10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
|
11, 11, 12, 12, 12, 12, 12, 12, 12, 12,
|
||||||
11, 11, 11, 11, 11, 11, 11, 11, 11, 15,
|
12, 12, 12, 12, 12, 12, 12, 12, 12, 16,
|
||||||
11, 11, 1, 1, 1, 1, 1, 1, 1, 1,
|
12, 12, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
|
@ -424,50 +424,50 @@ static yyconst YY_CHAR yy_ec[256] =
|
||||||
1, 1, 1, 1, 1
|
1, 1, 1, 1, 1
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
static yyconst YY_CHAR yy_meta[16] =
|
static yyconst YY_CHAR yy_meta[17] =
|
||||||
{ 0,
|
{ 0,
|
||||||
1, 1, 2, 1, 3, 3, 1, 1, 1, 3,
|
1, 1, 2, 1, 1, 3, 3, 1, 1, 1,
|
||||||
3, 1, 4, 3, 3
|
3, 3, 1, 4, 3, 3
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
static yyconst flex_uint16_t yy_base[32] =
|
static yyconst flex_uint16_t yy_base[34] =
|
||||||
{ 0,
|
{ 0,
|
||||||
0, 0, 31, 61, 61, 61, 0, 11, 15, 0,
|
0, 0, 38, 64, 64, 64, 0, 11, 13, 21,
|
||||||
0, 22, 0, 28, 20, 8, 61, 0, 39, 0,
|
0, 0, 24, 0, 30, 30, 16, 17, 64, 0,
|
||||||
0, 0, 7, 61, 0, 61, 61, 49, 53, 16,
|
41, 0, 0, 0, 13, 64, 0, 64, 64, 52,
|
||||||
57
|
56, 23, 60
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
static yyconst flex_int16_t yy_def[32] =
|
static yyconst flex_int16_t yy_def[34] =
|
||||||
{ 0,
|
{ 0,
|
||||||
27, 1, 27, 27, 27, 27, 28, 27, 8, 29,
|
29, 1, 29, 29, 29, 29, 30, 29, 29, 9,
|
||||||
30, 27, 31, 12, 27, 8, 27, 14, 14, 29,
|
31, 32, 29, 33, 13, 29, 29, 9, 29, 15,
|
||||||
30, 12, 31, 27, 19, 27, 0, 27, 27, 27,
|
15, 31, 32, 13, 33, 29, 21, 29, 0, 29,
|
||||||
27
|
29, 29, 29
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
static yyconst flex_uint16_t yy_nxt[77] =
|
static yyconst flex_uint16_t yy_nxt[81] =
|
||||||
{ 0,
|
{ 0,
|
||||||
4, 5, 6, 7, 8, 9, 4, 10, 11, 12,
|
4, 5, 6, 7, 8, 9, 10, 4, 11, 12,
|
||||||
12, 13, 4, 14, 12, 16, 16, 17, 21, 26,
|
13, 13, 14, 4, 15, 13, 17, 17, 18, 18,
|
||||||
18, 18, 18, 24, 18, 19, 18, 18, 17, 18,
|
19, 17, 17, 20, 20, 23, 28, 20, 21, 20,
|
||||||
27, 22, 22, 27, 27, 18, 22, 18, 18, 27,
|
20, 19, 20, 26, 24, 24, 20, 29, 20, 24,
|
||||||
27, 27, 18, 25, 25, 27, 27, 27, 25, 15,
|
20, 20, 29, 29, 29, 20, 27, 27, 29, 29,
|
||||||
27, 15, 15, 20, 27, 20, 20, 23, 23, 23,
|
29, 27, 16, 29, 16, 16, 22, 29, 22, 22,
|
||||||
3, 27, 27, 27, 27, 27, 27, 27, 27, 27,
|
25, 25, 25, 3, 29, 29, 29, 29, 29, 29,
|
||||||
27, 27, 27, 27, 27, 27
|
29, 29, 29, 29, 29, 29, 29, 29, 29, 29
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
static yyconst flex_int16_t yy_chk[77] =
|
static yyconst flex_int16_t yy_chk[81] =
|
||||||
{ 0,
|
{ 0,
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
1, 1, 1, 1, 1, 8, 8, 8, 30, 23,
|
1, 1, 1, 1, 1, 1, 8, 8, 9, 9,
|
||||||
8, 8, 16, 15, 8, 8, 12, 12, 12, 9,
|
9, 17, 17, 9, 9, 32, 25, 9, 9, 13,
|
||||||
3, 12, 12, 0, 0, 12, 12, 14, 14, 0,
|
13, 13, 18, 16, 13, 13, 10, 3, 13, 13,
|
||||||
0, 0, 14, 19, 19, 0, 0, 0, 19, 28,
|
15, 15, 0, 0, 0, 15, 21, 21, 0, 0,
|
||||||
0, 28, 28, 29, 0, 29, 29, 31, 31, 31,
|
0, 21, 30, 0, 30, 30, 31, 0, 31, 31,
|
||||||
27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
|
33, 33, 33, 29, 29, 29, 29, 29, 29, 29,
|
||||||
27, 27, 27, 27, 27, 27
|
29, 29, 29, 29, 29, 29, 29, 29, 29, 29
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
static yy_state_type yy_last_accepting_state;
|
static yy_state_type yy_last_accepting_state;
|
||||||
|
@ -735,13 +735,13 @@ yy_match:
|
||||||
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
|
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
|
||||||
{
|
{
|
||||||
yy_current_state = (int) yy_def[yy_current_state];
|
yy_current_state = (int) yy_def[yy_current_state];
|
||||||
if ( yy_current_state >= 28 )
|
if ( yy_current_state >= 30 )
|
||||||
yy_c = yy_meta[(unsigned int) yy_c];
|
yy_c = yy_meta[(unsigned int) yy_c];
|
||||||
}
|
}
|
||||||
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
|
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
|
||||||
++yy_cp;
|
++yy_cp;
|
||||||
}
|
}
|
||||||
while ( yy_base[yy_current_state] != 61 );
|
while ( yy_base[yy_current_state] != 64 );
|
||||||
|
|
||||||
yy_find_action:
|
yy_find_action:
|
||||||
yy_act = yy_accept[yy_current_state];
|
yy_act = yy_accept[yy_current_state];
|
||||||
|
@ -1120,7 +1120,7 @@ static int yy_get_next_buffer (void)
|
||||||
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
|
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
|
||||||
{
|
{
|
||||||
yy_current_state = (int) yy_def[yy_current_state];
|
yy_current_state = (int) yy_def[yy_current_state];
|
||||||
if ( yy_current_state >= 28 )
|
if ( yy_current_state >= 30 )
|
||||||
yy_c = yy_meta[(unsigned int) yy_c];
|
yy_c = yy_meta[(unsigned int) yy_c];
|
||||||
}
|
}
|
||||||
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
|
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
|
||||||
|
@ -1148,11 +1148,11 @@ static int yy_get_next_buffer (void)
|
||||||
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
|
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
|
||||||
{
|
{
|
||||||
yy_current_state = (int) yy_def[yy_current_state];
|
yy_current_state = (int) yy_def[yy_current_state];
|
||||||
if ( yy_current_state >= 28 )
|
if ( yy_current_state >= 30 )
|
||||||
yy_c = yy_meta[(unsigned int) yy_c];
|
yy_c = yy_meta[(unsigned int) yy_c];
|
||||||
}
|
}
|
||||||
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
|
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
|
||||||
yy_is_jam = (yy_current_state == 27);
|
yy_is_jam = (yy_current_state == 29);
|
||||||
|
|
||||||
return yy_is_jam ? 0 : yy_current_state;
|
return yy_is_jam ? 0 : yy_current_state;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ whitespace [ \t]
|
||||||
newline [\n]
|
newline [\n]
|
||||||
digit [0-9]
|
digit [0-9]
|
||||||
hexdigit [0-9a-fA-F]
|
hexdigit [0-9a-fA-F]
|
||||||
intnum {digit}+
|
intnum -?{digit}+
|
||||||
hexnum "0x"{hexdigit}+
|
hexnum "0x"{hexdigit}+
|
||||||
mnemonic [a-zA-Z]+
|
mnemonic [a-zA-Z]+
|
||||||
labelname [a-zA-Z0-9_]+
|
labelname [a-zA-Z0-9_]+
|
||||||
|
|
Loading…
Reference in a new issue