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)