diff options
author | 2019-03-25 23:13:40 +0100 | |
---|---|---|
committer | 2019-03-25 23:13:40 +0100 | |
commit | b380514764cf857469bae61c11143a19f79a74c5 (patch) | |
tree | 63c8012e262618f08a332da31dd714281aa2c5ed /src/devices/cpu/f8 | |
parent | c24473ddff715ecec2e258a6eb38960cf8c8e98e (diff) |
Revert "conflict resolution (nw)"
This reverts commit c24473ddff715ecec2e258a6eb38960cf8c8e98e, reversing
changes made to 009cba4fb8102102168ef32870892438327f3705.
Diffstat (limited to 'src/devices/cpu/f8')
-rw-r--r-- | src/devices/cpu/f8/f8.cpp | 692 | ||||
-rw-r--r-- | src/devices/cpu/f8/f8.h | 3 |
2 files changed, 355 insertions, 340 deletions
diff --git a/src/devices/cpu/f8/f8.cpp b/src/devices/cpu/f8/f8.cpp index ce09d9ca835..e0f86369a06 100644 --- a/src/devices/cpu/f8/f8.cpp +++ b/src/devices/cpu/f8/f8.cpp @@ -7,11 +7,6 @@ * 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: @@ -19,9 +14,7 @@ * - 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) * @@ -35,12 +28,6 @@ * 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" @@ -50,11 +37,11 @@ /* status flags */ -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) +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; /* cycle (short/long) */ static constexpr int cS = 4; @@ -64,11 +51,21 @@ 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) -{ } +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)); +} device_memory_interface::space_config_vector f8_cpu_device::memory_space_config() const { @@ -104,22 +101,6 @@ 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)); @@ -134,7 +115,6 @@ 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"); @@ -216,18 +196,55 @@ void f8_cpu_device::device_start() void f8_cpu_device::device_reset() { - // save PC0 to PC1 and reset PC0, and clear ICB - ROMC_08(); - m_w &= ~I; + 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; - // fetch the first opcode + /* save PC0 to PC1 and reset PC0 */ + 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 + + */ + 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; + } + } } void f8_cpu_device::execute_set_input( int inptnum, int state ) { - assert (inptnum == F8_INPUT_LINE_INT_REQ); m_irq_request = state; } @@ -499,7 +516,7 @@ void f8_cpu_device::ROMC_10() /* * Inhibit any modification to the interrupt priority logic. */ - // TODO + m_w |= 0x20; /* ???? */ m_icount -= cL; } @@ -985,7 +1002,7 @@ void f8_cpu_device::f8_pop() void f8_cpu_device::f8_lr_w_j() { ROMC_1C(cS); - m_w = m_r[9] & 0x1f; + m_w = m_r[9]; } /*************************************************** @@ -1314,9 +1331,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 */ } /*************************************************** @@ -1395,7 +1412,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 */ } /*************************************************** @@ -1405,9 +1422,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 */ } /*************************************************** @@ -1418,9 +1435,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 */ } /*************************************************** @@ -1652,10 +1669,7 @@ void f8_cpu_device::f8_ns_isar_d() } -/*************************************************** - * Execute cycles - ***************************************************/ - +/* Execute cycles - returns number of cycles actually run */ void f8_cpu_device::execute_run() { do @@ -1665,307 +1679,305 @@ void f8_cpu_device::execute_run() m_debug_pc = (m_pc0 - 1) & 0xffff; debugger_instruction_hook(m_debug_pc); - switch (op) + switch( op ) { - 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; + /* 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; } - switch (op) - { - case 0x0c: case 0x1b: case 0x1c: case 0x1d: + switch (op) { + case 0x0d: 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(); } - - // fetch next instruction (DS is long cycle) - if ((op >= 0x30) && (op <= 0x3f)) + if( ( op >= 0x30 ) && ( op <= 0x3f) ) /* DS is a long cycle inst */ + { ROMC_00(cL); + } else + { ROMC_00(cS); - + } break; } } while( m_icount > 0 ); diff --git a/src/devices/cpu/f8/f8.h b/src/devices/cpu/f8/f8.h index 5185b938a05..cdd8f03b862 100644 --- a/src/devices/cpu/f8/f8.h +++ b/src/devices/cpu/f8/f8.h @@ -76,6 +76,9 @@ private: u8 m_r[64]; /* scratchpad RAM */ int m_irq_request; + /* timer shifter polynomial values (will be used for timer interrupts) */ + u8 timer_shifter[256]; + u16 m_debug_pc; // only for the MAME debugger inline void CLR_OZCS(); |