summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/unsp/unsp_jumps.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/unsp/unsp_jumps.cpp')
-rw-r--r--src/devices/cpu/unsp/unsp_jumps.cpp160
1 files changed, 160 insertions, 0 deletions
diff --git a/src/devices/cpu/unsp/unsp_jumps.cpp b/src/devices/cpu/unsp/unsp_jumps.cpp
new file mode 100644
index 00000000000..aa32f934ca5
--- /dev/null
+++ b/src/devices/cpu/unsp/unsp_jumps.cpp
@@ -0,0 +1,160 @@
+// license:GPL-2.0+
+// copyright-holders:Segher Boessenkool, Ryan Holtz, David Haywood
+
+#include "emu.h"
+#include "unsp.h"
+#include "unspfe.h"
+
+#include "debugger.h"
+
+#include "unspdasm.h"
+
+void unsp_device::execute_jumps(const uint16_t op)
+{
+ const uint16_t op0 = (op >> 12) & 15;
+ const uint16_t op1 = (op >> 6) & 7;
+ const uint32_t opimm = op & 0x3f;
+
+ switch (op0)
+ {
+ case 0: // JB
+ if (!(m_core->m_r[REG_SR] & UNSP_C))
+ {
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ }
+ else
+ {
+ m_core->m_icount -= 2;
+ }
+ return;
+ case 1: // JAE
+ if (m_core->m_r[REG_SR] & UNSP_C)
+ {
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ }
+ else
+ {
+ m_core->m_icount -= 2;
+ }
+ return;
+ case 2: // JGE
+ if (!(m_core->m_r[REG_SR] & UNSP_S))
+ {
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ }
+ else
+ {
+ m_core->m_icount -= 2;
+ }
+ return;
+ case 3: // JL
+ if (m_core->m_r[REG_SR] & UNSP_S)
+ {
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ }
+ else
+ {
+ m_core->m_icount -= 2;
+ }
+ return;
+ case 4: // JNE
+ if (!(m_core->m_r[REG_SR] & UNSP_Z))
+ {
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ }
+ else
+ {
+ m_core->m_icount -= 2;
+ }
+ return;
+ case 5: // JE
+ if (m_core->m_r[REG_SR] & UNSP_Z)
+ {
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ }
+ else
+ {
+ m_core->m_icount -= 2;
+ }
+ return;
+ case 6: // JPL
+ if (!(m_core->m_r[REG_SR] & UNSP_N))
+ {
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ }
+ else
+ {
+ m_core->m_icount -= 2;
+ }
+ return;
+ case 7: // JMI
+ if (m_core->m_r[REG_SR] & UNSP_N)
+ {
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ }
+ else
+ {
+ m_core->m_icount -= 2;
+ }
+ return;
+ case 8: // JBE
+ if ((m_core->m_r[REG_SR] & (UNSP_Z | UNSP_C)) != UNSP_C) // branch if (!UNSP_Z && !UNSP_C) || UNSP_Z
+ {
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ }
+ else
+ {
+ m_core->m_icount -= 2;
+ }
+ return;
+ case 9: // JA
+ if ((m_core->m_r[REG_SR] & (UNSP_Z | UNSP_C)) == UNSP_C) // branch if !UNSP_Z && UNSP_C
+ {
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ }
+ else
+ {
+ m_core->m_icount -= 2;
+ }
+ return;
+ case 10: // JLE
+ if (m_core->m_r[REG_SR] & (UNSP_Z | UNSP_S))
+ {
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ }
+ else
+ {
+ m_core->m_icount -= 2;
+ }
+ return;
+ case 11: // JG
+ if (!(m_core->m_r[REG_SR] & (UNSP_Z | UNSP_S)))
+ {
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ }
+ else
+ {
+ m_core->m_icount -= 2;
+ }
+ return;
+ case 14: // JMP
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ m_core->m_icount -= 4;
+ return;
+ default:
+ unimplemented_opcode(op);
+ return;
+ }
+}