diff --git a/DevCPU/src/devcpu/emulation/DCPU.java b/DevCPU/src/devcpu/emulation/DCPU.java index f081db1..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; @@ -225,14 +227,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; } @@ -384,45 +386,49 @@ 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; + return; } else { - b /= a; - ex = (char)((b << 16) / a); + set(baddr, (char) (b / a)); + ex = (char) (((long) b << 16) / a); + return; } - break; }case 7:{ //DVI cycles += 2; if (a == 0) { - b = ex = 0; + set(baddr, (char) 0); + ex = 0; + return; } else { - b = (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; } - break; }case 8: //MOD cycles += 2; if (a == 0) @@ -449,17 +455,30 @@ public void tick() { b = (char)(b ^ a); break; case 13: //SHR - ex = (char)(b << 16 >> a); - b = (char)(b >>> a); - break; + if(!SHIFT_DISTANCE_5_BITS && a > 31) { + set(baddr, (char) 0); + ex = (char) 0; + } else { + set(baddr, (char) (b >>> a)); + ex = (char) (b << 16 >>> a); + } + return; case 14: //ASR - ex = (char)((short)b << 16 >>> a); - b = (char)((short)b >> a); - break; + if(!SHIFT_DISTANCE_5_BITS && a > 31) { + a = 31; + } + set(baddr, (char)((short)b >> a)); + ex = (char)(b << 16 >> a); + return; case 15: //SHL - ex = (char)(b << a >> 16); - b = (char)(b << a); - break; + if(!SHIFT_DISTANCE_5_BITS && a > 31) { + set(baddr, (char) 0); + ex = (char) 0; + } else { + set(baddr, (char) (b << a)); + ex = (char) (b << a >> 16); + } + return; case 16: //IFB cycles++; if ((b & a) == 0) skip(); @@ -495,15 +514,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);