From b72734c4700d63e228b81c77e521798ca06db274 Mon Sep 17 00:00:00 2001 From: Teppo Koskinen Date: Sat, 12 Mar 2016 11:05:42 +0200 Subject: [PATCH 1/4] fixed instruction length for sp+n --- DevCPU/src/devcpu/emulation/DCPU.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DevCPU/src/devcpu/emulation/DCPU.java b/DevCPU/src/devcpu/emulation/DCPU.java index f081db1..7b4d327 100644 --- a/DevCPU/src/devcpu/emulation/DCPU.java +++ b/DevCPU/src/devcpu/emulation/DCPU.java @@ -225,14 +225,14 @@ public static int getInstructionLength(char opcode) { cmd = opcode >> 5 & 0x1F; if (cmd > 0) { int atype = opcode >> 10 & 0x3F; - if (((atype & 0xF8) == 16) || (atype == 31) || (atype == 30)) len++; + if (((atype & 0xF8) == 16) || (atype == 26) || (atype == 31) || (atype == 30)) len++; } } else { int atype = opcode >> 5 & 0x1F; int btype = opcode >> 10 & 0x3F; - if (((atype & 0xF8) == 16) || (atype == 31) || (atype == 30)) len++; - if (((btype & 0xF8) == 16) || (btype == 31) || (btype == 30)) len++; + if (((atype & 0xF8) == 16) || (atype == 26) || (atype == 31) || (atype == 30)) len++; + if (((btype & 0xF8) == 16) || (atype == 26) || (btype == 31) || (btype == 30)) len++; } return len; } From d37b723dc01f74b43b4cf2ff468ea76cab2db4bb Mon Sep 17 00:00:00 2001 From: Orlof Date: Tue, 15 Mar 2016 09:50:22 +0200 Subject: [PATCH 2/4] Changed the evaluation order if b is ex. e.g. SET ex, 3; SHR ex, 1 -> ex=0x8000 --- DevCPU/src/devcpu/emulation/DCPU.java | 50 ++++++++++++++------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/DevCPU/src/devcpu/emulation/DCPU.java b/DevCPU/src/devcpu/emulation/DCPU.java index 7b4d327..9a7e8ca 100644 --- a/DevCPU/src/devcpu/emulation/DCPU.java +++ b/DevCPU/src/devcpu/emulation/DCPU.java @@ -384,45 +384,47 @@ public void tick() { case 2:{ //ADD cycles++; int val = b + a; - b = (char)val; + set(baddr, (char)val); ex = (char)(val >> 16); - break; + return; }case 3:{ //SUB cycles++; int val = b - a; - b = (char)val; + set(baddr, (char)val); ex = (char)(val >> 16); - break; + return; }case 4:{ //MUL cycles++; int val = b * a; - b = (char)val; + set(baddr, (char)val); ex = (char)(val >> 16); - break; + return; }case 5:{ //MLI cycles++; int val = (short)b * (short)a; - b = (char)val; + set(baddr, (char)val); ex = (char)(val >> 16); - break; + return; }case 6:{ //DIV cycles += 2; if (a == 0) { - b = ex = 0; + set(baddr, (char) 0); + ex = 0; } else { - b /= a; + set(baddr, b / a); ex = (char)((b << 16) / a); } - break; + return; }case 7:{ //DVI cycles += 2; if (a == 0) { - b = ex = 0; + set(baddr, (char) 0); + ex = 0; } else { - b = (char)((short)b / (short)a); + set(baddr, (char)((short)b / (short)a)); ex = (char)(((short)b << 16) / (short)a); } - break; + return; }case 8: //MOD cycles += 2; if (a == 0) @@ -449,17 +451,17 @@ public void tick() { b = (char)(b ^ a); break; case 13: //SHR + set(baddr, (char)(b >>> a)); ex = (char)(b << 16 >> a); - b = (char)(b >>> a); - break; + return; case 14: //ASR + set(baddr, (char)((short)b >> a)); ex = (char)((short)b << 16 >>> a); - b = (char)((short)b >> a); - break; + return; case 15: //SHL + set(baddr, (char)(b << a)); ex = (char)(b << a >> 16); - b = (char)(b << a); - break; + return; case 16: //IFB cycles++; if ((b & a) == 0) skip(); @@ -495,15 +497,15 @@ public void tick() { case 26:{ //ADX cycles++; int val = b + a + ex; - b = (char)val; + set(baddr, (char)val); ex = (char)(val >> 16); - break; + return; }case 27:{ //SBX cycles++; int val = b - a + ex; - b = (char)val; + set(baddr, (char)val); ex = (char)(val >> 16); - break; + return; }case 30: //STI b = a; set(baddr, b); From e214df4e8429b7f9f1dc01012083e13e7b849f26 Mon Sep 17 00:00:00 2001 From: Orlof Date: Tue, 15 Mar 2016 13:39:51 +0200 Subject: [PATCH 3/4] Removed rotate behavior from shift instructions --- DevCPU/src/devcpu/emulation/DCPU.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/DevCPU/src/devcpu/emulation/DCPU.java b/DevCPU/src/devcpu/emulation/DCPU.java index 9a7e8ca..7a74155 100644 --- a/DevCPU/src/devcpu/emulation/DCPU.java +++ b/DevCPU/src/devcpu/emulation/DCPU.java @@ -451,14 +451,25 @@ public void tick() { b = (char)(b ^ a); break; case 13: //SHR + if(a > 31) { + set(baddr, (char) 0); + ex = (char) 0; + return; + } set(baddr, (char)(b >>> a)); - ex = (char)(b << 16 >> a); + ex = (char)(b << 16 >>> a); return; case 14: //ASR + if(a > 31) a = 31; set(baddr, (char)((short)b >> a)); - ex = (char)((short)b << 16 >>> a); + ex = (char)(b << 16 >> a); return; case 15: //SHL + if(a > 31) { + set(baddr, (char) 0); + ex = (char) 0; + return; + } set(baddr, (char)(b << a)); ex = (char)(b << a >> 16); return; From 27c2161fc3eb566d90d99aa6a2dabcc2ae28069e Mon Sep 17 00:00:00 2001 From: Teppo Koskinen Date: Thu, 17 Mar 2016 21:22:10 +0200 Subject: [PATCH 4/4] made shift instruction configurable. you can limit shift distance to 5 bit values as in java, or do whatever length as dcpu spec implies --- DevCPU/src/devcpu/emulation/DCPU.java | 36 ++++++++++++++++----------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/DevCPU/src/devcpu/emulation/DCPU.java b/DevCPU/src/devcpu/emulation/DCPU.java index 7a74155..45fe77d 100644 --- a/DevCPU/src/devcpu/emulation/DCPU.java +++ b/DevCPU/src/devcpu/emulation/DCPU.java @@ -12,6 +12,8 @@ */ public class DCPU { + private static final boolean SHIFT_DISTANCE_5_BITS = true; + private static final boolean DISASSEMBLE = false; public char[] ram = new char[65536]; public char pc; @@ -410,21 +412,23 @@ public void tick() { if (a == 0) { set(baddr, (char) 0); ex = 0; + return; } else { - set(baddr, b / a); - ex = (char)((b << 16) / a); + set(baddr, (char) (b / a)); + ex = (char) (((long) b << 16) / a); + return; } - return; }case 7:{ //DVI cycles += 2; if (a == 0) { set(baddr, (char) 0); ex = 0; + return; } else { - set(baddr, (char)((short)b / (short)a)); - ex = (char)(((short)b << 16) / (short)a); + set(baddr, (char) ((short) b / (short) a)); + ex = (char) ((b << 16) / ((short) a)); + return; } - return; }case 8: //MOD cycles += 2; if (a == 0) @@ -451,27 +455,29 @@ public void tick() { b = (char)(b ^ a); break; case 13: //SHR - if(a > 31) { + if(!SHIFT_DISTANCE_5_BITS && a > 31) { set(baddr, (char) 0); ex = (char) 0; - return; + } else { + set(baddr, (char) (b >>> a)); + ex = (char) (b << 16 >>> a); } - set(baddr, (char)(b >>> a)); - ex = (char)(b << 16 >>> a); return; case 14: //ASR - if(a > 31) a = 31; + if(!SHIFT_DISTANCE_5_BITS && a > 31) { + a = 31; + } set(baddr, (char)((short)b >> a)); ex = (char)(b << 16 >> a); return; case 15: //SHL - if(a > 31) { + if(!SHIFT_DISTANCE_5_BITS && a > 31) { set(baddr, (char) 0); ex = (char) 0; - return; + } else { + set(baddr, (char) (b << a)); + ex = (char) (b << a >> 16); } - set(baddr, (char)(b << a)); - ex = (char)(b << a >> 16); return; case 16: //IFB cycles++;