changeset 2:6204c81e2933

Revert changes to handling of immediate versions of bitwise instructions. Replace asri with cmpi.
author Michael Pavone <pavone@retrodev.com>
date Wed, 23 Mar 2016 19:19:29 -0700
parents a44e078d792b
children 08b69e3f9f17
files helloworld.bin helloworld.s16 simple_console.txt src/cpu.c src/cpu.h
diffstat 5 files changed, 11 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
Binary file helloworld.bin has changed
--- a/helloworld.s16	Tue Mar 22 23:14:36 2016 -0700
+++ b/helloworld.s16	Wed Mar 23 19:19:29 2016 -0700
@@ -2,7 +2,7 @@
 	ldim 0, r1
 loop
 	ld8 r0, r1, r2
-	ori 0, r2
+	cmpi 0, r2
 	beq done
 	outi 11, r2
 	addi 1, r1
--- a/simple_console.txt	Tue Mar 22 23:14:36 2016 -0700
+++ b/simple_console.txt	Wed Mar 23 19:19:29 2016 -0700
@@ -53,7 +53,7 @@
 D: ls[lr]i
 	MSB of AAAA determines direction
 	LS 3 bits determines magnitude
-E: asri
+E: cmpi
 F: single reg
 
 
--- a/src/cpu.c	Tue Mar 22 23:14:36 2016 -0700
+++ b/src/cpu.c	Wed Mar 23 19:19:29 2016 -0700
@@ -216,17 +216,11 @@
 	}
 }
 
-uint16_t format_immediate_bitwise(uint16_t val)
+uint16_t format_immediate(uint16_t val)
 {
 	if (val & 8) {
 		val |= 0xFFF0;
 	}
-	return val;
-}
-
-uint16_t format_immediate(uint16_t val)
-{
-	val = format_immediate_bitwise(val);
 	if (!val) {
 		val = 8;
 	}
@@ -339,11 +333,11 @@
 		update_flags_arith(context, tmp);
 		break;
 	case ANDI:
-		context->regs[dst] = context->regs[dst] & format_immediate_bitwise(a);
+		context->regs[dst] = context->regs[dst] & format_immediate(a);
 		update_flags_bitwise(context, context->regs[dst]);
 		break;
 	case ORI:
-		context->regs[dst] = context->regs[dst] | format_immediate_bitwise(a);
+		context->regs[dst] = context->regs[dst] | format_immediate(a);
 		update_flags_bitwise(context, context->regs[dst]);
 		break;
 	case LSI:
@@ -360,18 +354,12 @@
 		context->regs[dst] = tmp;
 		update_flags_arith(context, tmp);
 		break;
-	case ASRI:
-		shift = a;
-		if (!shift) {
-			shift = 16;
+	case CMPI:
+		tmp = a;
+		if (a & 8) {
+			a |= 0xFFF0;
 		}
-		tmp = context->regs[dst];
-		if (tmp & 0x8000) {
-			tmp |= 0xFFFF0000;
-		}
-		tmp = tmp >> shift & 0xFFFF;
-		tmp |= (context->regs[dst] >> (context->regs[shift] - 1)) << 16 & 0x10000;
-		context->regs[dst] = tmp;
+		tmp = context->regs[dst] - a;
 		update_flags_arith(context, tmp);
 		break;
 	case SINGLE_REG:
--- a/src/cpu.h	Tue Mar 22 23:14:36 2016 -0700
+++ b/src/cpu.h	Wed Mar 23 19:19:29 2016 -0700
@@ -80,7 +80,7 @@
 	ANDI,
 	ORI,
 	LSI,
-	ASRI,
+	CMPI,
 	SINGLE_REG
 };