summaryrefslogtreecommitdiff
path: root/assemble.c
diff options
context:
space:
mode:
Diffstat (limited to 'assemble.c')
-rw-r--r--assemble.c51
1 files changed, 9 insertions, 42 deletions
diff --git a/assemble.c b/assemble.c
index 990ca96..1ed4960 100644
--- a/assemble.c
+++ b/assemble.c
@@ -25,10 +25,9 @@ uint8_t get_rs(token *t, uint8_t inst, uint8_t dbg) {
uint64_t get_val(token *t, uint64_t addr, uint8_t size, uint8_t dbg) {
uint64_t value = 0;
uint64_t tmp_val = 0;
- uint16_t expr_count = 0;
uint8_t type = EXPR_NONE;
do {
- if (expr_count) {
+ if (t->id == TOK_EXPR) {
type = t->type;
t = t->next;
}
@@ -36,15 +35,9 @@ uint64_t get_val(token *t, uint64_t addr, uint8_t size, uint8_t dbg) {
case TOK_HEX:
case TOK_DEC:
case TOK_BIN:
- case TOK_CHAR:
- tmp_val = t->qword;
- t = t->next;
- break;
+ case TOK_CHAR: tmp_val = t->qword; t = t->next; break;
case TOK_SYM:
- case TOK_LABEL:
- tmp_val = (t->sym) ? t->sym->val : addr;
- t = t->next;
- break;
+ case TOK_LABEL: tmp_val = (t->sym) ? t->sym->val : addr; t = t-> next; break;
}
switch (type) {
case EXPR_PLUS : value += tmp_val; break;
@@ -67,11 +60,7 @@ uint64_t get_val(token *t, uint64_t addr, uint8_t size, uint8_t dbg) {
break;
case EXPR_NONE : value = tmp_val; break;
}
- expr_count++;
- if (!t) {
- break;
- }
- } while (t->id == TOK_EXPR && isexpr(t->type, dbg));
+ } while (t && t->id == TOK_EXPR && isexpr(t->type, dbg));
return value;
}
@@ -186,7 +175,7 @@ uint64_t handle_opcode(token *t, bytecount *bc, uint8_t isasm, uint64_t address,
break;
}
tmp = 0;
- opsize = 0;
+ opsize = 1;
opcode = 0;
if (t->next) {
rs = get_rs(t->next, inst, dbg);
@@ -231,35 +220,13 @@ uint64_t handle_opcode(token *t, bytecount *bc, uint8_t isasm, uint64_t address,
}
address++;
bc->progsize++;
- switch (rs) {
- case 3:
- if (isasm) {
- addr[address+7] = val.u8[7];
- addr[address+6] = val.u8[6];
- addr[address+5] = val.u8[5];
- addr[address+4] = val.u8[4];
- }
- tmp += 4;
- case 2:
- if (isasm) {
- addr[address+3] = val.u8[3];
- addr[address+2] = val.u8[2];
- }
- tmp += 2;
- case 1 :
- if (isasm) {
- addr[address+1] = val.u8[1];
- }
- tmp++;
- default:
- if (isasm) {
- addr[address ] = val.u8[0];
- }
- tmp++;
+ rs = (rs != 0xFF) ? rs : 0;
+ tmp = (1 << rs);
+ if (isasm) {
+ setreg(addr, +, address, val.u8, +, 0, tmp-1);
}
break;
default:
- opsize = (val.u64 <= 0x00000000000000FF) ? 1 : opsize;
opsize = (val.u64 > 0x00000000000000FF) ? 2 : opsize;
opsize = (val.u64 > 0x000000000000FFFF) ? 3 : opsize;
opsize = (val.u64 > 0x0000000000FFFFFF) ? 4 : opsize;