Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 51 additions & 32 deletions DevCPU/src/devcpu/emulation/DCPU.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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)
Expand All @@ -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();
Expand Down Expand Up @@ -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);
Expand Down