Mercurial > hg-old > index.cgi
diff src/insn_gen.c @ 34:b29eec6f3819
Finished adding addressing mode handlers
author | lost |
---|---|
date | Fri, 02 Jan 2009 05:17:00 +0000 |
parents | 74a3fef7c8d0 |
children | 538e15927776 |
line wrap: on
line diff
--- a/src/insn_gen.c Fri Jan 02 05:02:47 2009 +0000 +++ b/src/insn_gen.c Fri Jan 02 05:17:00 2009 +0000 @@ -28,7 +28,8 @@ extern void insn_indexed_aux(asmstate_t *as, lwasm_line_t *l, const char **p, int *b1, int *b2, int *b3); -void insn_gen_aux(asmstate_t *as, lwasm_line_t *l, char **optr, int opnum) +// "extra" is required due to the way OIM, EIM, TIM, and AIM work +void insn_gen_aux(asmstate_t *as, lwasm_line_t *l, char **optr, int opnum, int extra) { int b1 = -1, b2 = -1, b3 = -1; @@ -85,6 +86,8 @@ } v1 = v1 & 0xff; lwasm_emitop(as, l, instab[opnum].ops[0]); + if (extra != -1) + lwasm_emit(as, l, extra); lwasm_emit(as, l, v1 & 0xff); return; } @@ -92,6 +95,8 @@ { // everything else is 16 bit.... lwasm_emitop(as, l, instab[opnum].ops[2]); + if (extra != -1) + lwasm_emit(as, l, extra); lwasm_emit(as, l, v1 >> 8); lwasm_emit(as, l, v1 & 0xff); return; @@ -99,6 +104,8 @@ } lwasm_emitop(as, l, instab[opnum].ops[1]); + if (extra != -1) + lwasm_emit(as, l, extra); insn_indexed_aux(as, l, (const char **)optr, &b1, &b2, &b3); if (b1 != -1) lwasm_emit(as, l, b1); @@ -119,7 +126,7 @@ } // handle non-immediate - insn_gen_aux(as, l, p, opnum); + insn_gen_aux(as, l, p, opnum, -1); } OPFUNC(insn_gen8) @@ -150,7 +157,7 @@ return; } - insn_gen_aux(as, l, p, opnum); + insn_gen_aux(as, l, p, opnum, -1); } OPFUNC(insn_gen16) @@ -180,7 +187,7 @@ return; } - insn_gen_aux(as, l, p, opnum); + insn_gen_aux(as, l, p, opnum, -1); } OPFUNC(insn_gen32) @@ -212,7 +219,7 @@ return; } - insn_gen_aux(as, l, p, opnum); + insn_gen_aux(as, l, p, opnum, -1); } OPFUNC(insn_imm8)