diff options
Diffstat (limited to 'src/devices/cpu/f8/f8.cpp')
-rw-r--r-- | src/devices/cpu/f8/f8.cpp | 648 |
1 files changed, 328 insertions, 320 deletions
diff --git a/src/devices/cpu/f8/f8.cpp b/src/devices/cpu/f8/f8.cpp index 36dd5f00f09..8e550d48d27 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: @@ -28,6 +33,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 + 3856 + * - 3872 = 3870 + extra 2KB ROM + * - 3873 = 3870 + extra 64 bytes executable RAM + * *****************************************************************************/ #include "emu.h" @@ -51,21 +62,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 +102,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 +132,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,31 +214,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 */ + m_w &= ~I; + + // 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; } @@ -1307,9 +1312,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 } /*************************************************** @@ -1388,7 +1393,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 } /*************************************************** @@ -1398,9 +1403,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 } /*************************************************** @@ -1411,9 +1416,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 } /*************************************************** @@ -1645,7 +1650,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 @@ -1655,282 +1663,282 @@ 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) { + switch (op) + { case 0x0c: case 0x1b: case 0x1c: case 0x1d: case 0x27: case 0x28: case 0x29: case 0xb4: case 0xb5: case 0xb6: case 0xb7: @@ -1941,6 +1949,7 @@ void f8_cpu_device::execute_run() break; default: + // 'freeze cycle' for handling interrupts if (m_w&I && m_irq_request) { ROMC_10(); @@ -1948,14 +1957,13 @@ void f8_cpu_device::execute_run() 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 ); |