summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/f8/f8.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/f8/f8.cpp')
-rw-r--r--src/devices/cpu/f8/f8.cpp692
1 files changed, 340 insertions, 352 deletions
diff --git a/src/devices/cpu/f8/f8.cpp b/src/devices/cpu/f8/f8.cpp
index e0f86369a06..ce09d9ca835 100644
--- a/src/devices/cpu/f8/f8.cpp
+++ b/src/devices/cpu/f8/f8.cpp
@@ -7,6 +7,11 @@
* This work is based on Frank Palazzolo's F8 emulation in a standalone
* Fairchild Channel F emulator and the 'Fairchild F3850 CPU' data sheets.
*
+ * TODO:
+ * - ROMC signals are supposed to be handled externally
+ *
+ *****************************************************************************
+ *
* The 3850 CPU itself does not include the address bus, pointer registers
* or an interrupt controller. Those functions are provided by at least one
* of the following devices:
@@ -14,7 +19,9 @@
* - 3851 Program Storage Unit (PSU)
* - 3852 Dynamic Memory Interface (DMI)
* - 3853 Static Memory Interface (SMI)
+ * - 3854 Direct Memory Access Controller (DMAC)
* - 3856 Program Storage Unit (PSU)
+ * - 38T56 Program Storage Unit (PSU)
* - 3861 Peripheral Input/Output (PIO)
* - 3871 Peripheral Input/Output (PIO)
*
@@ -28,6 +35,12 @@
* devices responding to the same DC0 address and attempting to place their
* bytes on the data bus simultaneously!
*
+ * Combined packages:
+ * - 3859 = 3850 + 3851
+ * - 3870 = 3850 + 38T56
+ * - 3872 = 3870 + extra 2KB ROM
+ * - 3873 = 3870 + extra 64 bytes executable RAM
+ *
*****************************************************************************/
#include "emu.h"
@@ -37,11 +50,11 @@
/* status flags */
-static constexpr u8 S = 0x01;
-static constexpr u8 C = 0x02;
-static constexpr u8 Z = 0x04;
-static constexpr u8 O = 0x08;
-static constexpr u8 I = 0x10;
+static constexpr u8 S = 0x01; // sign
+static constexpr u8 C = 0x02; // carry
+static constexpr u8 Z = 0x04; // zero
+static constexpr u8 O = 0x08; // overflow
+static constexpr u8 I = 0x10; // interrupt control bit (ICB)
/* cycle (short/long) */
static constexpr int cS = 4;
@@ -51,21 +64,11 @@ static constexpr int cL = 6;
DEFINE_DEVICE_TYPE(F8, f8_cpu_device, "f8", "Fairchild F8")
-f8_cpu_device::f8_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : cpu_device(mconfig, F8, tag, owner, clock)
- , m_program_config("program", ENDIANNESS_BIG, 8, 16, 0)
- , m_io_config("io", ENDIANNESS_BIG, 8, 8, 0)
- , m_pc0(0)
- , m_pc1(0)
- , m_dc0(0)
- , m_dc1(0)
- , m_a(0)
- , m_w(0)
- , m_is(0)
- , m_debug_pc(0)
-{
- memset(m_r, 0x00, sizeof(m_r));
-}
+f8_cpu_device::f8_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ cpu_device(mconfig, F8, tag, owner, clock),
+ m_program_config("program", ENDIANNESS_BIG, 8, 16, 0),
+ m_io_config("io", ENDIANNESS_BIG, 8, 8, 0)
+{ }
device_memory_interface::space_config_vector f8_cpu_device::memory_space_config() const
{
@@ -101,6 +104,22 @@ void f8_cpu_device::device_start()
m_cache = m_program->cache<0, 0, ENDIANNESS_BIG>();
m_iospace = &space(AS_IO);
+ // zerofill
+ m_debug_pc = 0;
+ m_pc0 = 0;
+ m_pc1 = 0;
+ m_dc0 = 0;
+ m_dc1 = 0;
+ m_a = 0;
+ m_w = 0;
+ m_is = 0;
+ m_dbus = 0;
+ m_io = 0;
+ m_irq_vector = 0;
+ memset(m_r, 0, sizeof(m_r));
+ m_irq_request = 0;
+
+ // register for savestates
save_item(NAME(m_debug_pc));
save_item(NAME(m_pc0));
save_item(NAME(m_pc1));
@@ -115,6 +134,7 @@ void f8_cpu_device::device_start()
save_item(NAME(m_irq_request));
save_item(NAME(m_r));
+ // register for debugger
state_add( F8_PC0, "PC0", m_pc0).formatstr("%04X");
state_add( F8_PC1, "PC1", m_pc1).formatstr("%04X");
state_add( F8_DC0, "DC0", m_dc0).formatstr("%04X");
@@ -196,55 +216,18 @@ void f8_cpu_device::device_start()
void f8_cpu_device::device_reset()
{
- m_debug_pc = 0;
- m_pc0 = 0;
- m_pc1 = 0;
- m_dc0 = 0;
- m_dc1 = 0;
- m_a = 0;
- m_w = 0;
- m_is = 0;
- m_dbus = 0;
- m_io = 0;
- m_irq_vector = 0;
- memset(m_r, 0, sizeof(m_r));
- m_irq_request = 0;
-
- m_w&=~I;
-
- /* save PC0 to PC1 and reset PC0 */
+ // save PC0 to PC1 and reset PC0, and clear ICB
ROMC_08();
- /* fetch the first opcode */
- ROMC_00(cS);
-
- /* initialize the timer shift register
- * this is an 8 bit polynomial counter which can be loaded parallel
- * with 0xff the outputs never change and thus the timer is disabled.
- * with 0xfe the shifter starts cycling through 255 states until it
- * reaches 0xfe again (and then issues an interrupt).
- * the counter output values are not sequential, but go like this:
- * 0xfe, 0xfd, 0xfb, 0xf7, 0xee, 0xdc ... etc. :-)
- * We have to build a lookup table to tell how many cycles a write
+ m_w &= ~I;
- */
- u8 data = 0xfe; /* initial value */
- for (int i = 0; i < 256; i++)
- {
- timer_shifter[i] = data;
- if ( (((data >> 3) ^ (data >> 4)) ^ ((data >> 5) ^ (data >> 7))) & 1 )
- {
- data <<= 1;
- }
- else
- {
- data = (data << 1) | 1;
- }
- }
+ // fetch the first opcode
+ ROMC_00(cS);
}
void f8_cpu_device::execute_set_input( int inptnum, int state )
{
+ assert (inptnum == F8_INPUT_LINE_INT_REQ);
m_irq_request = state;
}
@@ -516,7 +499,7 @@ void f8_cpu_device::ROMC_10()
/*
* Inhibit any modification to the interrupt priority logic.
*/
- m_w |= 0x20; /* ???? */
+ // TODO
m_icount -= cL;
}
@@ -1002,7 +985,7 @@ void f8_cpu_device::f8_pop()
void f8_cpu_device::f8_lr_w_j()
{
ROMC_1C(cS);
- m_w = m_r[9];
+ m_w = m_r[9] & 0x1f;
}
/***************************************************
@@ -1331,9 +1314,9 @@ void f8_cpu_device::f8_bt(int e)
{
ROMC_1C(cS);
if (m_w & e)
- ROMC_01(); /* take the relative branch */
+ ROMC_01(); // take the relative branch
else
- ROMC_03(cS); /* just read the argument on the data bus */
+ ROMC_03(cS); // just read the argument on the data bus
}
/***************************************************
@@ -1412,7 +1395,7 @@ void f8_cpu_device::f8_cm()
void f8_cpu_device::f8_adc()
{
m_dbus = m_a;
- ROMC_0A(); /* add data bus value to DC0 */
+ ROMC_0A(); // add data bus value to DC0
}
/***************************************************
@@ -1422,9 +1405,9 @@ void f8_cpu_device::f8_adc()
void f8_cpu_device::f8_br7()
{
if ((m_is & 7) == 7)
- ROMC_03(cS); /* just read the argument on the data bus */
+ ROMC_03(cS); // just read the argument on the data bus
else
- ROMC_01(); /* take the relative branch */
+ ROMC_01(); // take the relative branch
}
/***************************************************
@@ -1435,9 +1418,9 @@ void f8_cpu_device::f8_bf(int t)
{
ROMC_1C(cS);
if (m_w & t)
- ROMC_03(cS); /* just read the argument on the data bus */
+ ROMC_03(cS); // just read the argument on the data bus
else
- ROMC_01(); /* take the relative branch */
+ ROMC_01(); // take the relative branch
}
/***************************************************
@@ -1669,7 +1652,10 @@ void f8_cpu_device::f8_ns_isar_d()
}
-/* Execute cycles - returns number of cycles actually run */
+/***************************************************
+ * Execute cycles
+ ***************************************************/
+
void f8_cpu_device::execute_run()
{
do
@@ -1679,305 +1665,307 @@ void f8_cpu_device::execute_run()
m_debug_pc = (m_pc0 - 1) & 0xffff;
debugger_instruction_hook(m_debug_pc);
- switch( op )
+ switch (op)
{
- /* opcode bitmask */
- case 0x00: /* 0000 0000 */ f8_lr_a_ku(); break;
- case 0x01: /* 0000 0001 */ f8_lr_a_kl(); break;
- case 0x02: /* 0000 0010 */ f8_lr_a_qu(); break;
- case 0x03: /* 0000 0011 */ f8_lr_a_ql(); break;
- case 0x04: /* 0000 0100 */ f8_lr_ku_a(); break;
- case 0x05: /* 0000 0101 */ f8_lr_kl_a(); break;
- case 0x06: /* 0000 0110 */ f8_lr_qu_a(); break;
- case 0x07: /* 0000 0111 */ f8_lr_ql_a(); break;
- case 0x08: /* 0000 1000 */ f8_lr_k_p(); break;
- case 0x09: /* 0000 1001 */ f8_lr_p_k(); break;
- case 0x0a: /* 0000 1010 */ f8_lr_a_is(); break;
- case 0x0b: /* 0000 1011 */ f8_lr_is_a(); break;
- case 0x0c: /* 0000 1100 */ f8_pk(); break;
- case 0x0d: /* 0000 1101 */ f8_lr_p0_q(); break;
- case 0x0e: /* 0000 1110 */ f8_lr_q_dc(); break;
- case 0x0f: /* 0000 1111 */ f8_lr_dc_q(); break;
-
- case 0x10: /* 0001 0000 */ f8_lr_dc_h(); break;
- case 0x11: /* 0001 0001 */ f8_lr_h_dc(); break;
- case 0x12: /* 0001 0010 */ f8_sr_1(); break;
- case 0x13: /* 0001 0011 */ f8_sl_1(); break;
- case 0x14: /* 0001 0100 */ f8_sr_4(); break;
- case 0x15: /* 0001 0101 */ f8_sl_4(); break;
- case 0x16: /* 0001 0110 */ f8_lm(); break;
- case 0x17: /* 0001 0111 */ f8_st(); break;
- case 0x18: /* 0001 1000 */ f8_com(); break;
- case 0x19: /* 0001 1001 */ f8_lnk(); break;
- case 0x1a: /* 0001 1010 */ f8_di(); break;
- case 0x1b: /* 0001 1011 */ f8_ei(); break;
- case 0x1c: /* 0001 1100 */ f8_pop(); break;
- case 0x1d: /* 0001 1101 */ f8_lr_w_j(); break;
- case 0x1e: /* 0001 1110 */ f8_lr_j_w(); break;
- case 0x1f: /* 0001 1111 */ f8_inc(); break;
-
- case 0x20: /* 0010 0000 */ f8_li(); break;
- case 0x21: /* 0010 0001 */ f8_ni(); break;
- case 0x22: /* 0010 0010 */ f8_oi(); break;
- case 0x23: /* 0010 0011 */ f8_xi(); break;
- case 0x24: /* 0010 0100 */ f8_ai(); break;
- case 0x25: /* 0010 0101 */ f8_ci(); break;
- case 0x26: /* 0010 0110 */ f8_in(); break;
- case 0x27: /* 0010 0111 */ f8_out(); break;
- case 0x28: /* 0010 1000 */ f8_pi(); break;
- case 0x29: /* 0010 1001 */ f8_jmp(); break;
- case 0x2a: /* 0010 1010 */ f8_dci(); break;
- case 0x2b: /* 0010 1011 */ f8_nop(); break;
- case 0x2c: /* 0010 1100 */ f8_xdc(); break;
- case 0x2d: /* 0010 1101 */ illegal(); break;
- case 0x2e: /* 0010 1110 */ illegal(); break;
- case 0x2f: /* 0010 1111 */ illegal(); break;
-
- case 0x30: /* 0011 0000 */ f8_ds_r( 0); break;
- case 0x31: /* 0011 0001 */ f8_ds_r( 1); break;
- case 0x32: /* 0011 0010 */ f8_ds_r( 2); break;
- case 0x33: /* 0011 0011 */ f8_ds_r( 3); break;
- case 0x34: /* 0011 0100 */ f8_ds_r( 4); break;
- case 0x35: /* 0011 0101 */ f8_ds_r( 5); break;
- case 0x36: /* 0011 0110 */ f8_ds_r( 6); break;
- case 0x37: /* 0011 0111 */ f8_ds_r( 7); break;
- case 0x38: /* 0011 1000 */ f8_ds_r( 8); break;
- case 0x39: /* 0011 1001 */ f8_ds_r( 9); break;
- case 0x3a: /* 0011 1010 */ f8_ds_r(10); break;
- case 0x3b: /* 0011 1011 */ f8_ds_r(11); break;
- case 0x3c: /* 0011 1100 */ f8_ds_isar(); break;
- case 0x3d: /* 0011 1101 */ f8_ds_isar_i(); break;
- case 0x3e: /* 0011 1110 */ f8_ds_isar_d(); break;
- case 0x3f: /* 0011 1111 */ illegal(); break;
-
- case 0x40: /* 0100 0000 */ f8_lr_a_r( 0); break;
- case 0x41: /* 0100 0001 */ f8_lr_a_r( 1); break;
- case 0x42: /* 0100 0010 */ f8_lr_a_r( 2); break;
- case 0x43: /* 0100 0011 */ f8_lr_a_r( 3); break;
- case 0x44: /* 0100 0100 */ f8_lr_a_r( 4); break;
- case 0x45: /* 0100 0101 */ f8_lr_a_r( 5); break;
- case 0x46: /* 0100 0110 */ f8_lr_a_r( 6); break;
- case 0x47: /* 0100 0111 */ f8_lr_a_r( 7); break;
- case 0x48: /* 0100 1000 */ f8_lr_a_r( 8); break;
- case 0x49: /* 0100 1001 */ f8_lr_a_r( 9); break;
- case 0x4a: /* 0100 1010 */ f8_lr_a_r(10); break;
- case 0x4b: /* 0100 1011 */ f8_lr_a_r(11); break;
- case 0x4c: /* 0100 1100 */ f8_lr_a_isar(); break;
- case 0x4d: /* 0100 1101 */ f8_lr_a_isar_i(); break;
- case 0x4e: /* 0100 1110 */ f8_lr_a_isar_d(); break;
- case 0x4f: /* 0100 1111 */ illegal(); break;
-
- case 0x50: /* 0101 0000 */ f8_lr_r_a( 0); break;
- case 0x51: /* 0101 0001 */ f8_lr_r_a( 1); break;
- case 0x52: /* 0101 0010 */ f8_lr_r_a( 2); break;
- case 0x53: /* 0101 0011 */ f8_lr_r_a( 3); break;
- case 0x54: /* 0101 0100 */ f8_lr_r_a( 4); break;
- case 0x55: /* 0101 0101 */ f8_lr_r_a( 5); break;
- case 0x56: /* 0101 0110 */ f8_lr_r_a( 6); break;
- case 0x57: /* 0101 0111 */ f8_lr_r_a( 7); break;
- case 0x58: /* 0101 1000 */ f8_lr_r_a( 8); break;
- case 0x59: /* 0101 1001 */ f8_lr_r_a( 9); break;
- case 0x5a: /* 0101 1010 */ f8_lr_r_a(10); break;
- case 0x5b: /* 0101 1011 */ f8_lr_r_a(11); break;
- case 0x5c: /* 0101 1100 */ f8_lr_isar_a(); break;
- case 0x5d: /* 0101 1101 */ f8_lr_isar_i_a(); break;
- case 0x5e: /* 0101 1110 */ f8_lr_isar_d_a(); break;
- case 0x5f: /* 0101 1111 */ illegal(); break;
-
- case 0x60: /* 0110 0000 */ f8_lisu(0x00); break;
- case 0x61: /* 0110 0001 */ f8_lisu(0x08); break;
- case 0x62: /* 0110 0010 */ f8_lisu(0x10); break;
- case 0x63: /* 0110 0011 */ f8_lisu(0x18); break;
- case 0x64: /* 0110 0100 */ f8_lisu(0x20); break;
- case 0x65: /* 0110 0101 */ f8_lisu(0x28); break;
- case 0x66: /* 0110 0110 */ f8_lisu(0x30); break;
- case 0x67: /* 0110 0111 */ f8_lisu(0x38); break;
- case 0x68: /* 0110 1000 */ f8_lisl(0x00); break;
- case 0x69: /* 0110 1001 */ f8_lisl(0x01); break;
- case 0x6a: /* 0110 1010 */ f8_lisl(0x02); break;
- case 0x6b: /* 0110 1011 */ f8_lisl(0x03); break;
- case 0x6c: /* 0110 1100 */ f8_lisl(0x04); break;
- case 0x6d: /* 0110 1101 */ f8_lisl(0x05); break;
- case 0x6e: /* 0110 1110 */ f8_lisl(0x06); break;
- case 0x6f: /* 0110 1111 */ f8_lisl(0x07); break;
-
- case 0x70: /* 0111 0000 */ f8_lis(0x0); break;
- case 0x71: /* 0111 0001 */ f8_lis(0x1); break;
- case 0x72: /* 0111 0010 */ f8_lis(0x2); break;
- case 0x73: /* 0111 0011 */ f8_lis(0x3); break;
- case 0x74: /* 0111 0100 */ f8_lis(0x4); break;
- case 0x75: /* 0111 0101 */ f8_lis(0x5); break;
- case 0x76: /* 0111 0110 */ f8_lis(0x6); break;
- case 0x77: /* 0111 0111 */ f8_lis(0x7); break;
- case 0x78: /* 0111 1000 */ f8_lis(0x8); break;
- case 0x79: /* 0111 1001 */ f8_lis(0x9); break;
- case 0x7a: /* 0111 1010 */ f8_lis(0xa); break;
- case 0x7b: /* 0111 1011 */ f8_lis(0xb); break;
- case 0x7c: /* 0111 1100 */ f8_lis(0xc); break;
- case 0x7d: /* 0111 1101 */ f8_lis(0xd); break;
- case 0x7e: /* 0111 1110 */ f8_lis(0xe); break;
- case 0x7f: /* 0111 1111 */ f8_lis(0xf); break;
-
- case 0x80: /* 1000 0000 */ f8_bt(0); break;
- case 0x81: /* 1000 0001 */ f8_bt(1); break;
- case 0x82: /* 1000 0010 */ f8_bt(2); break;
- case 0x83: /* 1000 0011 */ f8_bt(3); break;
- case 0x84: /* 1000 0100 */ f8_bt(4); break;
- case 0x85: /* 1000 0101 */ f8_bt(5); break;
- case 0x86: /* 1000 0110 */ f8_bt(6); break;
- case 0x87: /* 1000 0111 */ f8_bt(7); break;
- case 0x88: /* 1000 1000 */ f8_am(); break;
- case 0x89: /* 1000 1001 */ f8_amd(); break;
- case 0x8a: /* 1000 1010 */ f8_nm(); break;
- case 0x8b: /* 1000 1011 */ f8_om(); break;
- case 0x8c: /* 1000 1100 */ f8_xm(); break;
- case 0x8d: /* 1000 1101 */ f8_cm(); break;
- case 0x8e: /* 1000 1110 */ f8_adc(); break;
- case 0x8f: /* 1000 1111 */ f8_br7(); break;
-
- case 0x90: /* 1001 0000 */ f8_bf(0x0); break;
- case 0x91: /* 1001 0001 */ f8_bf(0x1); break;
- case 0x92: /* 1001 0010 */ f8_bf(0x2); break;
- case 0x93: /* 1001 0011 */ f8_bf(0x3); break;
- case 0x94: /* 1001 0100 */ f8_bf(0x4); break;
- case 0x95: /* 1001 0101 */ f8_bf(0x5); break;
- case 0x96: /* 1001 0110 */ f8_bf(0x6); break;
- case 0x97: /* 1001 0111 */ f8_bf(0x7); break;
- case 0x98: /* 1001 1000 */ f8_bf(0x8); break;
- case 0x99: /* 1001 1001 */ f8_bf(0x9); break;
- case 0x9a: /* 1001 1010 */ f8_bf(0xa); break;
- case 0x9b: /* 1001 1011 */ f8_bf(0xb); break;
- case 0x9c: /* 1001 1100 */ f8_bf(0xc); break;
- case 0x9d: /* 1001 1101 */ f8_bf(0xd); break;
- case 0x9e: /* 1001 1110 */ f8_bf(0xe); break;
- case 0x9f: /* 1001 1111 */ f8_bf(0xf); break;
-
- case 0xa0: /* 1010 0000 */ f8_ins_0(0x0); break;
- case 0xa1: /* 1010 0001 */ f8_ins_0(0x1); break;
- case 0xa2: /* 1010 0010 */ illegal(); break;
- case 0xa3: /* 1010 0011 */ illegal(); break;
- case 0xa4: /* 1010 0100 */ f8_ins_1(0x4); break;
- case 0xa5: /* 1010 0101 */ f8_ins_1(0x5); break;
- case 0xa6: /* 1010 0110 */ f8_ins_1(0x6); break;
- case 0xa7: /* 1010 0111 */ f8_ins_1(0x7); break;
- case 0xa8: /* 1010 1000 */ f8_ins_1(0x8); break;
- case 0xa9: /* 1010 1001 */ f8_ins_1(0x9); break;
- case 0xaa: /* 1010 1010 */ f8_ins_1(0xa); break;
- case 0xab: /* 1010 1011 */ f8_ins_1(0xb); break;
- case 0xac: /* 1010 1100 */ f8_ins_1(0xc); break;
- case 0xad: /* 1010 1101 */ f8_ins_1(0xd); break;
- case 0xae: /* 1010 1110 */ f8_ins_1(0xe); break;
- case 0xaf: /* 1010 1111 */ f8_ins_1(0xf); break;
-
- case 0xb0: /* 1011 0000 */ f8_outs_0(0x0); break;
- case 0xb1: /* 1011 0001 */ f8_outs_0(0x1); break;
- case 0xb2: /* 1011 0010 */ illegal(); break;
- case 0xb3: /* 1011 0011 */ illegal(); break;
- case 0xb4: /* 1011 0100 */ f8_outs_1(0x4); break;
- case 0xb5: /* 1011 0101 */ f8_outs_1(0x5); break;
- case 0xb6: /* 1011 0110 */ f8_outs_1(0x6); break;
- case 0xb7: /* 1011 0111 */ f8_outs_1(0x7); break;
- case 0xb8: /* 1011 1000 */ f8_outs_1(0x8); break;
- case 0xb9: /* 1011 1001 */ f8_outs_1(0x9); break;
- case 0xba: /* 1011 1010 */ f8_outs_1(0xa); break;
- case 0xbb: /* 1011 1011 */ f8_outs_1(0xb); break;
- case 0xbc: /* 1011 1100 */ f8_outs_1(0xc); break;
- case 0xbd: /* 1011 1101 */ f8_outs_1(0xd); break;
- case 0xbe: /* 1011 1110 */ f8_outs_1(0xe); break;
- case 0xbf: /* 1011 1111 */ f8_outs_1(0xf); break;
-
- case 0xc0: /* 1100 0000 */ f8_as(0x0); break;
- case 0xc1: /* 1100 0001 */ f8_as(0x1); break;
- case 0xc2: /* 1100 0010 */ f8_as(0x2); break;
- case 0xc3: /* 1100 0011 */ f8_as(0x3); break;
- case 0xc4: /* 1100 0100 */ f8_as(0x4); break;
- case 0xc5: /* 1100 0101 */ f8_as(0x5); break;
- case 0xc6: /* 1100 0110 */ f8_as(0x6); break;
- case 0xc7: /* 1100 0111 */ f8_as(0x7); break;
- case 0xc8: /* 1100 1000 */ f8_as(0x8); break;
- case 0xc9: /* 1100 1001 */ f8_as(0x9); break;
- case 0xca: /* 1100 1010 */ f8_as(0xa); break;
- case 0xcb: /* 1100 1011 */ f8_as(0xb); break;
- case 0xcc: /* 1100 1100 */ f8_as_isar(); break;
- case 0xcd: /* 1100 1101 */ f8_as_isar_i(); break;
- case 0xce: /* 1100 1110 */ f8_as_isar_d(); break;
- case 0xcf: /* 1100 1111 */ illegal(); break;
-
- case 0xd0: /* 1101 0000 */ f8_asd(0x0); break;
- case 0xd1: /* 1101 0001 */ f8_asd(0x1); break;
- case 0xd2: /* 1101 0010 */ f8_asd(0x2); break;
- case 0xd3: /* 1101 0011 */ f8_asd(0x3); break;
- case 0xd4: /* 1101 0100 */ f8_asd(0x4); break;
- case 0xd5: /* 1101 0101 */ f8_asd(0x5); break;
- case 0xd6: /* 1101 0110 */ f8_asd(0x6); break;
- case 0xd7: /* 1101 0111 */ f8_asd(0x7); break;
- case 0xd8: /* 1101 1000 */ f8_asd(0x8); break;
- case 0xd9: /* 1101 1001 */ f8_asd(0x9); break;
- case 0xda: /* 1101 1010 */ f8_asd(0xa); break;
- case 0xdb: /* 1101 1011 */ f8_asd(0xb); break;
- case 0xdc: /* 1101 1100 */ f8_asd_isar(); break;
- case 0xdd: /* 1101 1101 */ f8_asd_isar_i(); break;
- case 0xde: /* 1101 1110 */ f8_asd_isar_d(); break;
- case 0xdf: /* 1101 1111 */ illegal(); break;
-
- case 0xe0: /* 1110 0000 */ f8_xs(0x0); break;
- case 0xe1: /* 1110 0001 */ f8_xs(0x1); break;
- case 0xe2: /* 1110 0010 */ f8_xs(0x2); break;
- case 0xe3: /* 1110 0011 */ f8_xs(0x3); break;
- case 0xe4: /* 1110 0100 */ f8_xs(0x4); break;
- case 0xe5: /* 1110 0101 */ f8_xs(0x5); break;
- case 0xe6: /* 1110 0110 */ f8_xs(0x6); break;
- case 0xe7: /* 1110 0111 */ f8_xs(0x7); break;
- case 0xe8: /* 1110 1000 */ f8_xs(0x8); break;
- case 0xe9: /* 1110 1001 */ f8_xs(0x9); break;
- case 0xea: /* 1110 1010 */ f8_xs(0xa); break;
- case 0xeb: /* 1110 1011 */ f8_xs(0xb); break;
- case 0xec: /* 1110 1100 */ f8_xs_isar(); break;
- case 0xed: /* 1110 1101 */ f8_xs_isar_i(); break;
- case 0xee: /* 1110 1110 */ f8_xs_isar_d(); break;
- case 0xef: /* 1110 1111 */ illegal(); break;
-
- case 0xf0: /* 1111 0000 */ f8_ns(0x0); break;
- case 0xf1: /* 1111 0001 */ f8_ns(0x1); break;
- case 0xf2: /* 1111 0010 */ f8_ns(0x2); break;
- case 0xf3: /* 1111 0011 */ f8_ns(0x3); break;
- case 0xf4: /* 1111 0100 */ f8_ns(0x4); break;
- case 0xf5: /* 1111 0101 */ f8_ns(0x5); break;
- case 0xf6: /* 1111 0110 */ f8_ns(0x6); break;
- case 0xf7: /* 1111 0111 */ f8_ns(0x7); break;
- case 0xf8: /* 1111 1000 */ f8_ns(0x8); break;
- case 0xf9: /* 1111 1001 */ f8_ns(0x9); break;
- case 0xfa: /* 1111 1010 */ f8_ns(0xa); break;
- case 0xfb: /* 1111 1011 */ f8_ns(0xb); break;
- case 0xfc: /* 1111 1100 */ f8_ns_isar(); break;
- case 0xfd: /* 1111 1101 */ f8_ns_isar_i(); break;
- case 0xfe: /* 1111 1110 */ f8_ns_isar_d(); break;
- case 0xff: /* 1111 1111 */ illegal(); break;
+ case 0x00: f8_lr_a_ku(); break;
+ case 0x01: f8_lr_a_kl(); break;
+ case 0x02: f8_lr_a_qu(); break;
+ case 0x03: f8_lr_a_ql(); break;
+ case 0x04: f8_lr_ku_a(); break;
+ case 0x05: f8_lr_kl_a(); break;
+ case 0x06: f8_lr_qu_a(); break;
+ case 0x07: f8_lr_ql_a(); break;
+ case 0x08: f8_lr_k_p(); break;
+ case 0x09: f8_lr_p_k(); break;
+ case 0x0a: f8_lr_a_is(); break;
+ case 0x0b: f8_lr_is_a(); break;
+ case 0x0c: f8_pk(); break;
+ case 0x0d: f8_lr_p0_q(); break;
+ case 0x0e: f8_lr_q_dc(); break;
+ case 0x0f: f8_lr_dc_q(); break;
+
+ case 0x10: f8_lr_dc_h(); break;
+ case 0x11: f8_lr_h_dc(); break;
+ case 0x12: f8_sr_1(); break;
+ case 0x13: f8_sl_1(); break;
+ case 0x14: f8_sr_4(); break;
+ case 0x15: f8_sl_4(); break;
+ case 0x16: f8_lm(); break;
+ case 0x17: f8_st(); break;
+ case 0x18: f8_com(); break;
+ case 0x19: f8_lnk(); break;
+ case 0x1a: f8_di(); break;
+ case 0x1b: f8_ei(); break;
+ case 0x1c: f8_pop(); break;
+ case 0x1d: f8_lr_w_j(); break;
+ case 0x1e: f8_lr_j_w(); break;
+ case 0x1f: f8_inc(); break;
+
+ case 0x20: f8_li(); break;
+ case 0x21: f8_ni(); break;
+ case 0x22: f8_oi(); break;
+ case 0x23: f8_xi(); break;
+ case 0x24: f8_ai(); break;
+ case 0x25: f8_ci(); break;
+ case 0x26: f8_in(); break;
+ case 0x27: f8_out(); break;
+ case 0x28: f8_pi(); break;
+ case 0x29: f8_jmp(); break;
+ case 0x2a: f8_dci(); break;
+ case 0x2b: f8_nop(); break;
+ case 0x2c: f8_xdc(); break;
+ case 0x2d: illegal(); break;
+ case 0x2e: illegal(); break;
+ case 0x2f: illegal(); break;
+
+ case 0x30: f8_ds_r(0); break;
+ case 0x31: f8_ds_r(1); break;
+ case 0x32: f8_ds_r(2); break;
+ case 0x33: f8_ds_r(3); break;
+ case 0x34: f8_ds_r(4); break;
+ case 0x35: f8_ds_r(5); break;
+ case 0x36: f8_ds_r(6); break;
+ case 0x37: f8_ds_r(7); break;
+ case 0x38: f8_ds_r(8); break;
+ case 0x39: f8_ds_r(9); break;
+ case 0x3a: f8_ds_r(10); break;
+ case 0x3b: f8_ds_r(11); break;
+ case 0x3c: f8_ds_isar(); break;
+ case 0x3d: f8_ds_isar_i(); break;
+ case 0x3e: f8_ds_isar_d(); break;
+ case 0x3f: illegal(); break;
+
+ case 0x40: f8_lr_a_r(0); break;
+ case 0x41: f8_lr_a_r(1); break;
+ case 0x42: f8_lr_a_r(2); break;
+ case 0x43: f8_lr_a_r(3); break;
+ case 0x44: f8_lr_a_r(4); break;
+ case 0x45: f8_lr_a_r(5); break;
+ case 0x46: f8_lr_a_r(6); break;
+ case 0x47: f8_lr_a_r(7); break;
+ case 0x48: f8_lr_a_r(8); break;
+ case 0x49: f8_lr_a_r(9); break;
+ case 0x4a: f8_lr_a_r(10); break;
+ case 0x4b: f8_lr_a_r(11); break;
+ case 0x4c: f8_lr_a_isar(); break;
+ case 0x4d: f8_lr_a_isar_i(); break;
+ case 0x4e: f8_lr_a_isar_d(); break;
+ case 0x4f: illegal(); break;
+
+ case 0x50: f8_lr_r_a(0); break;
+ case 0x51: f8_lr_r_a(1); break;
+ case 0x52: f8_lr_r_a(2); break;
+ case 0x53: f8_lr_r_a(3); break;
+ case 0x54: f8_lr_r_a(4); break;
+ case 0x55: f8_lr_r_a(5); break;
+ case 0x56: f8_lr_r_a(6); break;
+ case 0x57: f8_lr_r_a(7); break;
+ case 0x58: f8_lr_r_a(8); break;
+ case 0x59: f8_lr_r_a(9); break;
+ case 0x5a: f8_lr_r_a(10); break;
+ case 0x5b: f8_lr_r_a(11); break;
+ case 0x5c: f8_lr_isar_a(); break;
+ case 0x5d: f8_lr_isar_i_a(); break;
+ case 0x5e: f8_lr_isar_d_a(); break;
+ case 0x5f: illegal(); break;
+
+ case 0x60: f8_lisu(0x00); break;
+ case 0x61: f8_lisu(0x08); break;
+ case 0x62: f8_lisu(0x10); break;
+ case 0x63: f8_lisu(0x18); break;
+ case 0x64: f8_lisu(0x20); break;
+ case 0x65: f8_lisu(0x28); break;
+ case 0x66: f8_lisu(0x30); break;
+ case 0x67: f8_lisu(0x38); break;
+ case 0x68: f8_lisl(0x00); break;
+ case 0x69: f8_lisl(0x01); break;
+ case 0x6a: f8_lisl(0x02); break;
+ case 0x6b: f8_lisl(0x03); break;
+ case 0x6c: f8_lisl(0x04); break;
+ case 0x6d: f8_lisl(0x05); break;
+ case 0x6e: f8_lisl(0x06); break;
+ case 0x6f: f8_lisl(0x07); break;
+
+ case 0x70: f8_lis(0x0); break;
+ case 0x71: f8_lis(0x1); break;
+ case 0x72: f8_lis(0x2); break;
+ case 0x73: f8_lis(0x3); break;
+ case 0x74: f8_lis(0x4); break;
+ case 0x75: f8_lis(0x5); break;
+ case 0x76: f8_lis(0x6); break;
+ case 0x77: f8_lis(0x7); break;
+ case 0x78: f8_lis(0x8); break;
+ case 0x79: f8_lis(0x9); break;
+ case 0x7a: f8_lis(0xa); break;
+ case 0x7b: f8_lis(0xb); break;
+ case 0x7c: f8_lis(0xc); break;
+ case 0x7d: f8_lis(0xd); break;
+ case 0x7e: f8_lis(0xe); break;
+ case 0x7f: f8_lis(0xf); break;
+
+ case 0x80: f8_bt(0); break;
+ case 0x81: f8_bt(1); break;
+ case 0x82: f8_bt(2); break;
+ case 0x83: f8_bt(3); break;
+ case 0x84: f8_bt(4); break;
+ case 0x85: f8_bt(5); break;
+ case 0x86: f8_bt(6); break;
+ case 0x87: f8_bt(7); break;
+ case 0x88: f8_am(); break;
+ case 0x89: f8_amd(); break;
+ case 0x8a: f8_nm(); break;
+ case 0x8b: f8_om(); break;
+ case 0x8c: f8_xm(); break;
+ case 0x8d: f8_cm(); break;
+ case 0x8e: f8_adc(); break;
+ case 0x8f: f8_br7(); break;
+
+ case 0x90: f8_bf(0x0); break;
+ case 0x91: f8_bf(0x1); break;
+ case 0x92: f8_bf(0x2); break;
+ case 0x93: f8_bf(0x3); break;
+ case 0x94: f8_bf(0x4); break;
+ case 0x95: f8_bf(0x5); break;
+ case 0x96: f8_bf(0x6); break;
+ case 0x97: f8_bf(0x7); break;
+ case 0x98: f8_bf(0x8); break;
+ case 0x99: f8_bf(0x9); break;
+ case 0x9a: f8_bf(0xa); break;
+ case 0x9b: f8_bf(0xb); break;
+ case 0x9c: f8_bf(0xc); break;
+ case 0x9d: f8_bf(0xd); break;
+ case 0x9e: f8_bf(0xe); break;
+ case 0x9f: f8_bf(0xf); break;
+
+ case 0xa0: f8_ins_0(0x0); break;
+ case 0xa1: f8_ins_0(0x1); break;
+ case 0xa2: illegal(); break;
+ case 0xa3: illegal(); break;
+ case 0xa4: f8_ins_1(0x4); break;
+ case 0xa5: f8_ins_1(0x5); break;
+ case 0xa6: f8_ins_1(0x6); break;
+ case 0xa7: f8_ins_1(0x7); break;
+ case 0xa8: f8_ins_1(0x8); break;
+ case 0xa9: f8_ins_1(0x9); break;
+ case 0xaa: f8_ins_1(0xa); break;
+ case 0xab: f8_ins_1(0xb); break;
+ case 0xac: f8_ins_1(0xc); break;
+ case 0xad: f8_ins_1(0xd); break;
+ case 0xae: f8_ins_1(0xe); break;
+ case 0xaf: f8_ins_1(0xf); break;
+
+ case 0xb0: f8_outs_0(0x0); break;
+ case 0xb1: f8_outs_0(0x1); break;
+ case 0xb2: illegal(); break;
+ case 0xb3: illegal(); break;
+ case 0xb4: f8_outs_1(0x4); break;
+ case 0xb5: f8_outs_1(0x5); break;
+ case 0xb6: f8_outs_1(0x6); break;
+ case 0xb7: f8_outs_1(0x7); break;
+ case 0xb8: f8_outs_1(0x8); break;
+ case 0xb9: f8_outs_1(0x9); break;
+ case 0xba: f8_outs_1(0xa); break;
+ case 0xbb: f8_outs_1(0xb); break;
+ case 0xbc: f8_outs_1(0xc); break;
+ case 0xbd: f8_outs_1(0xd); break;
+ case 0xbe: f8_outs_1(0xe); break;
+ case 0xbf: f8_outs_1(0xf); break;
+
+ case 0xc0: f8_as(0x0); break;
+ case 0xc1: f8_as(0x1); break;
+ case 0xc2: f8_as(0x2); break;
+ case 0xc3: f8_as(0x3); break;
+ case 0xc4: f8_as(0x4); break;
+ case 0xc5: f8_as(0x5); break;
+ case 0xc6: f8_as(0x6); break;
+ case 0xc7: f8_as(0x7); break;
+ case 0xc8: f8_as(0x8); break;
+ case 0xc9: f8_as(0x9); break;
+ case 0xca: f8_as(0xa); break;
+ case 0xcb: f8_as(0xb); break;
+ case 0xcc: f8_as_isar(); break;
+ case 0xcd: f8_as_isar_i(); break;
+ case 0xce: f8_as_isar_d(); break;
+ case 0xcf: illegal(); break;
+
+ case 0xd0: f8_asd(0x0); break;
+ case 0xd1: f8_asd(0x1); break;
+ case 0xd2: f8_asd(0x2); break;
+ case 0xd3: f8_asd(0x3); break;
+ case 0xd4: f8_asd(0x4); break;
+ case 0xd5: f8_asd(0x5); break;
+ case 0xd6: f8_asd(0x6); break;
+ case 0xd7: f8_asd(0x7); break;
+ case 0xd8: f8_asd(0x8); break;
+ case 0xd9: f8_asd(0x9); break;
+ case 0xda: f8_asd(0xa); break;
+ case 0xdb: f8_asd(0xb); break;
+ case 0xdc: f8_asd_isar(); break;
+ case 0xdd: f8_asd_isar_i(); break;
+ case 0xde: f8_asd_isar_d(); break;
+ case 0xdf: illegal(); break;
+
+ case 0xe0: f8_xs(0x0); break;
+ case 0xe1: f8_xs(0x1); break;
+ case 0xe2: f8_xs(0x2); break;
+ case 0xe3: f8_xs(0x3); break;
+ case 0xe4: f8_xs(0x4); break;
+ case 0xe5: f8_xs(0x5); break;
+ case 0xe6: f8_xs(0x6); break;
+ case 0xe7: f8_xs(0x7); break;
+ case 0xe8: f8_xs(0x8); break;
+ case 0xe9: f8_xs(0x9); break;
+ case 0xea: f8_xs(0xa); break;
+ case 0xeb: f8_xs(0xb); break;
+ case 0xec: f8_xs_isar(); break;
+ case 0xed: f8_xs_isar_i(); break;
+ case 0xee: f8_xs_isar_d(); break;
+ case 0xef: illegal(); break;
+
+ case 0xf0: f8_ns(0x0); break;
+ case 0xf1: f8_ns(0x1); break;
+ case 0xf2: f8_ns(0x2); break;
+ case 0xf3: f8_ns(0x3); break;
+ case 0xf4: f8_ns(0x4); break;
+ case 0xf5: f8_ns(0x5); break;
+ case 0xf6: f8_ns(0x6); break;
+ case 0xf7: f8_ns(0x7); break;
+ case 0xf8: f8_ns(0x8); break;
+ case 0xf9: f8_ns(0x9); break;
+ case 0xfa: f8_ns(0xa); break;
+ case 0xfb: f8_ns(0xb); break;
+ case 0xfc: f8_ns_isar(); break;
+ case 0xfd: f8_ns_isar_i(); break;
+ case 0xfe: f8_ns_isar_d(); break;
+ case 0xff: illegal(); break;
}
- switch (op) {
- case 0x0d: case 0x1b: case 0x1c: case 0x1d:
+ switch (op)
+ {
+ case 0x0c: case 0x1b: case 0x1c: case 0x1d:
case 0x27: case 0x28: case 0x29:
case 0xb4: case 0xb5: case 0xb6: case 0xb7:
case 0xb8: case 0xb9: case 0xba: case 0xbb:
case 0xbc: case 0xbd: case 0xbe: case 0xbf:
+ // don't handle irq after privileged instruction
ROMC_00(cS);
break;
default:
+ // 'freeze cycle' for handling interrupts
if (m_w&I && m_irq_request)
{
+ ROMC_10();
ROMC_1C(cL);
ROMC_0F();
ROMC_13();
}
- if( ( op >= 0x30 ) && ( op <= 0x3f) ) /* DS is a long cycle inst */
- {
+
+ // fetch next instruction (DS is long cycle)
+ if ((op >= 0x30) && (op <= 0x3f))
ROMC_00(cL);
- }
else
- {
ROMC_00(cS);
- }
+
break;
}
} while( m_icount > 0 );