From 848d98d5f24044dafa7b1f49b1e9ddd841f31097 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Fri, 27 Apr 2012 01:46:06 +0000 Subject: cleanup opcode implementations --- emu.c | 74 ++++++++++++++++++++++++------------------------------------------- 1 file changed, 26 insertions(+), 48 deletions(-) diff --git a/emu.c b/emu.c index bbb250c..aa5d9e7 100644 --- a/emu.c +++ b/emu.c @@ -15,6 +15,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include #include #include #include "dcpu16.h" @@ -150,11 +151,9 @@ set(unsigned short *b, unsigned short *a) void add(unsigned short *b, unsigned short *a) { - int tmp = *b; - - tmp += *a; - reg[EX] = (tmp > 0xFFFF) ? 0x0001 : 0; + int tmp = *b + *a; + reg[EX] = !!(tmp >> 16); *b = tmp; cycle += 2; } @@ -162,11 +161,9 @@ add(unsigned short *b, unsigned short *a) void sub(unsigned short *b, unsigned short *a) { - int tmp = *b; - - tmp -= *a; - reg[EX] = (tmp < 0) ? 0xFFFF : 0; + int tmp = *b - *a; + reg[EX] = -1 * !!(tmp >> 16); *b = tmp; cycle += 2; } @@ -174,11 +171,9 @@ sub(unsigned short *b, unsigned short *a) void mul(unsigned short *b, unsigned short *a) { - unsigned int tmp = *b; + int tmp = *b * *a; - tmp *= *a; reg[EX] = tmp >> 16; - *b = tmp; cycle += 2; } @@ -186,11 +181,8 @@ mul(unsigned short *b, unsigned short *a) void mli(unsigned short *b, unsigned short *a) { - int tmp = *b; - - tmp *= *a; + int tmp = (signed short)*b * (signed short)*b; reg[EX] = tmp >> 16; - *b = tmp; cycle += 2; } @@ -198,14 +190,15 @@ mli(unsigned short *b, unsigned short *a) void div(unsigned short *b, unsigned short *a) { - unsigned int tmp = *b; + int tmp; if (*a == 0) { reg[EX] = 0; *b = 0; } else { - reg[EX] = ((tmp << 16) / *a); - *b /= *a; + tmp = (unsigned int)*b << 16 / *a; + reg[EX] = tmp; + *b = tmp >> 16; } cycle += 3; } @@ -213,14 +206,15 @@ div(unsigned short *b, unsigned short *a) void dvi(unsigned short *b, unsigned short *a) { - int tmp = *b; + int tmp; if (*a == 0) { reg[EX] = 0; *b = 0; } else { - reg[EX] = ((tmp << 16) / *a); - *b /= *a; + tmp = (signed int)*b << 16 / (signed short)*a; + reg[EX] = tmp; + *b = tmp >> 16; } cycle += 3; } @@ -242,7 +236,7 @@ mdi(unsigned short *b, unsigned short *a) if (*a == 0) *b = 0; else - *b %= *a; + *b = (signed short)*b % *a; cycle += 3; } @@ -270,11 +264,7 @@ xor(unsigned short *b, unsigned short *a) void shr(unsigned short *b, unsigned short *a) { - int tmp = *b; - - /* TODO */ - - reg[EX] = ((tmp << 16) >> *a); + reg[EX] = (((unsigned int)*b << 16) >> *a); *b >>= *a; cycle += 2; } @@ -282,25 +272,15 @@ shr(unsigned short *b, unsigned short *a) void asr(unsigned short *b, unsigned short *a) { - int tmp = *b; - int top = *b | 0x8000; - - /* TODO */ - - reg[EX] = ((tmp << 16) >> *a); - *b >>= *a; - *b |= top; + reg[EX] = (((unsigned int)*b << 16) >> *a); + *b = (signed short)*b >> *a; cycle += 2; } void shl(unsigned short *b, unsigned short *a) { - int tmp = *b; - - /* TODO */ - - reg[EX] = ((tmp << *a) >> 16); + reg[EX] = (((unsigned int)*b << *a) >> 16); *b <<= *a; cycle += 2; } @@ -364,22 +344,20 @@ ifu(unsigned short *b, unsigned short *a) void adx(unsigned short *b, unsigned short *a) { - int tmp = *b; + int tmp = *b + *a + reg[EX]; - /* TODO */ - tmp += *a + reg[EX]; - reg[EX] = tmp > 0xFFFF ? 0x0001 : 0; + reg[EX] = !!(tmp > 16); + *b = tmp; cycle += 3; } void sbx(unsigned short *b, unsigned short *a) { - int tmp = *b; + int tmp = *b - *a + reg[EX]; - /* TODO */ - tmp -= *a + reg[EX]; - reg[EX] = tmp < 0 ? 0x0001 : 0; + reg[EX] = -1 * !!(tmp >> 16); + *b = tmp; cycle += 3; } -- cgit v1.2.3