diff options
author | 2013-10-19 23:47:38 +0000 | |
---|---|---|
committer | 2013-10-19 23:47:38 +0000 | |
commit | 28805e5c880f362ebc4f7881408882158eae2807 (patch) | |
tree | 75c3916fb0daf76c79b455ab9109f6e8341030cc /src/emu/cpu/tms9900 | |
parent | 729030b28c11964aa081e7d0bed02b4fe0a69dc5 (diff) |
Fixed broken IDLE in 9995; various cleanups.
Diffstat (limited to 'src/emu/cpu/tms9900')
-rw-r--r-- | src/emu/cpu/tms9900/tms9900.c | 39 | ||||
-rw-r--r-- | src/emu/cpu/tms9900/tms9900.h | 157 | ||||
-rw-r--r-- | src/emu/cpu/tms9900/tms9980a.c | 73 | ||||
-rw-r--r-- | src/emu/cpu/tms9900/tms9980a.h | 32 | ||||
-rw-r--r-- | src/emu/cpu/tms9900/tms9995.c | 30 | ||||
-rw-r--r-- | src/emu/cpu/tms9900/tms9995.h | 49 |
6 files changed, 159 insertions, 221 deletions
diff --git a/src/emu/cpu/tms9900/tms9900.c b/src/emu/cpu/tms9900/tms9900.c index c0c612bf566..4b87888e6db 100644 --- a/src/emu/cpu/tms9900/tms9900.c +++ b/src/emu/cpu/tms9900/tms9900.c @@ -163,24 +163,11 @@ enum void tms99xx_device::device_start() { - const tms99xx_config *conf = reinterpret_cast<const tms99xx_config *>(static_config()); - - assert (conf != NULL); - // TODO: Restore state save feature - - m_prgspace = &space(AS_PROGRAM); // dimemory.h + resolve_lines(); + m_prgspace = &space(AS_PROGRAM); m_cru = &space(AS_IO); - // Resolve our external connections - m_external_operation.resolve(conf->external_callback, *this); - m_get_intlevel.resolve(conf->irq_level, *this); - m_iaq_line.resolve(conf->instruction_acquisition, *this); - m_clock_out_line.resolve(conf->clock_out, *this); - m_wait_line.resolve(conf->wait_line, *this); - m_holda_line.resolve(conf->holda_line, *this); - m_dbin_line.resolve(conf->dbin_line, *this); // we need this for the set_address operation - // set our instruction counter m_icountptr = &m_icount; @@ -210,6 +197,24 @@ void tms99xx_device::device_stop() } /* + External connections +*/ +void tms99xx_device::resolve_lines() +{ + const tms99xx_config *conf = reinterpret_cast<const tms99xx_config *>(static_config()); + assert (conf != NULL); + + // Resolve our external connections + m_external_operation.resolve(conf->external_callback, *this); + m_get_intlevel.resolve(conf->irq_level, *this); + m_iaq_line.resolve(conf->instruction_acquisition, *this); + m_clock_out_line.resolve(conf->clock_out, *this); + m_wait_line.resolve(conf->wait_line, *this); + m_holda_line.resolve(conf->holda_line, *this); + m_dbin_line.resolve(conf->dbin_line, *this); // we need this for the set_address operation +} + +/* TMS9900 hard reset The device reset is just the emulator's trigger for the reset procedure which is invoked via the main loop. @@ -1181,13 +1186,13 @@ void tms99xx_device::execute_run() */ void tms99xx_device::execute_set_input(int irqline, int state) { - if (irqline==INPUT_LINE_99XX_RESET && state==ASSERT_LINE) + if (irqline==INT_9900_RESET && state==ASSERT_LINE) { m_reset = true; } else { - if (irqline == INPUT_LINE_NMI) + if (irqline == INT_9900_LOAD) { m_load_state = (state==ASSERT_LINE); m_irq_level = -1; diff --git a/src/emu/cpu/tms9900/tms9900.h b/src/emu/cpu/tms9900/tms9900.h index 0e21c0ccf71..07a5f72d4b2 100644 --- a/src/emu/cpu/tms9900/tms9900.h +++ b/src/emu/cpu/tms9900/tms9900.h @@ -6,41 +6,6 @@ behaviour. See tms9900.c for documentation - - Types of TMS99xx processors: - TI990/9 Early implementation, used in a few real-world applications, 1974 - very similar to mapper-less 990/10 and tms9900, but the Load - process is different - - TI990/10 Original multi-chip implementation for minicomputer systems, 1975 - - TI990/12 Multi-chip implementation, faster than 990/10. Huge instruction set - - TMS9900 Mono-chip implementation, 1976. Used in the TI-99/4(A) computer. - - TMS9940 Microcontroller with 2kb ROM, 128b RAM, decrementer, CRU bus, 1979 - - TMS9980 8-bit variant of tms9900. Two distinct chips actually : tms9980a - and tms9981 with an extra clock and simplified power supply - - TMS9985 9940 with 8kb ROM, 256b RAM, and a 8-bit external bus, c. 1978 (never released) - - TMS9989 Improved 9980, used in military hardware. - - SBP68689 Improved 9989, built as an ASIC as 9989 was running scarce - - TMS9995 TMS9985-like, with many improvements (but no ROM). Used in the - TI-99/8 prototype and the Geneve computer. - - TMS99000 Improved mono-chip implementation, meant to replace 990/10, 1981 - TMS99105 This chip is available in several variants which are similar - TMS99110 but emulate additional instructions, thanks to the so-called - macrostore feature. - - In this implementation we only consider TMS9900, 9980, and 9995. The - remaining types are implemented on an own code base as they introduce - significant changes (e.g. privileged mode, address mapper). For now we - leave the implementation of the rest up to 99xxcore.h. */ #ifndef __TMS9900_H__ @@ -48,21 +13,13 @@ #include "emu.h" #include "debugger.h" +#include "tms99com.h" -/* - Define symbols for interrupt lines. - - We use a separate RESET signal which is not captured by the core. - - Caution: Check irqline in set_input_line of each driver using this CPU. - Values have changed. Use these symbols instead. -*/ enum { - INPUT_LINE_99XX_RESET = 0, - INPUT_LINE_99XX_INTREQ = 1, - INPUT_LINE_99XX_INT1 = 2, - INPUT_LINE_99XX_INT4 = 3 + INT_9900_RESET = 0, + INT_9900_LOAD = 1, + INT_9900_INTREQ = 2 }; enum @@ -71,35 +28,6 @@ enum RESET_INT = -2 }; -enum -{ - TI990_10_ID = 1, - TMS9900_ID = 3, - TMS9940_ID = 4, - TMS9980_ID = 5, - TMS9985_ID = 6, - TMS9989_ID = 7, - TMS9995_ID = 9, - TMS99000_ID = 10, - TMS99105A_ID = 11, - TMS99110A_ID = 12 -}; - -#define MCFG_TMS99xx_ADD(_tag, _device, _clock, _prgmap, _iomap, _config) \ - MCFG_DEVICE_ADD(_tag, _device, _clock) \ - MCFG_DEVICE_PROGRAM_MAP(_prgmap) \ - MCFG_DEVICE_IO_MAP(_iomap) \ - MCFG_DEVICE_CONFIG(_config) - -enum -{ - IDLE_OP = 2, - RSET_OP = 3, - CKOF_OP = 5, - CKON_OP = 6, - LREX_OP = 7 -}; - static const char opname[][5] = { "ILL ", "A ", "AB ", "ABS ", "AI ", "ANDI", "B ", "BL ", "BLWP", "C ", "CI ", "CB ", "CKOF", "CKON", "CLR ", "COC ", "CZC ", "DEC ", "DECT", "DIV ", @@ -148,6 +76,8 @@ protected: virtual void device_stop(); virtual void device_reset(); + virtual void resolve_lines(); + // device_execute_interface overrides virtual UINT32 execute_min_cycles() const; virtual UINT32 execute_max_cycles() const; @@ -225,8 +155,8 @@ protected: bool m_irq_state; bool m_reset; - // Determine the interrupt level using the IC0-IC2/3 lines - virtual int get_intlevel(int state); + // Determine the interrupt level using the IC0-IC3 lines + int get_intlevel(int state); // Interrupt level as acquired from input lines (TMS9900: IC0-IC3, TMS9980: IC0-IC2) // We assume all values right-justified, i.e. TMS9980 also counts up by one @@ -235,6 +165,19 @@ protected: // Used to display the number of consumed cycles in the log. int m_first_cycle; + /************************************************************************/ + + // Clock output. This is not a pin of the TMS9900 because the TMS9900 + // needs an external clock, and usually one of those external lines is + // used for this purpose. + devcb_resolved_write_line m_clock_out_line; + + // Wait output. When asserted (high), the CPU is in a wait state. + devcb_resolved_write_line m_wait_line; + + // HOLD Acknowledge line. When asserted (high), the CPU is in HOLD state. + devcb_resolved_write_line m_holda_line; + // Signal to the outside world that we are now getting an instruction devcb_resolved_write_line m_iaq_line; @@ -244,6 +187,29 @@ protected: // DBIN line. When asserted (high), the CPU has disabled the data bus output buffers. devcb_resolved_write_line m_dbin_line; + // Trigger external operation. This is achieved by putting a special value in + // the most significant three bits of the address bus (TMS9995: data bus) and + // pulsing the CRUCLK line. + // Accordingly, we have + // + // A0 A1 A2 A3 A4 A5 ... A12 A13 A14 A15 + // 0 0 0 x x x x x x - normal CRU access + // 0 1 0 x x x x x x - IDLE + // 0 1 1 x x x x x x - RSET + // 1 0 1 x x x x x x - CKON + // 1 1 0 x x x x x x - CKOF + // 1 1 1 x x x x x x - LREX + // + // so the TMS9900 can only use CRU addresses 0 - 1ffe for CRU operations. + // By moving these three bits to the data bus, the TMS9995 can allow for the + // full range 0000-fffe for its CRU operations. + // + // We could realize this via the CRU access as well, but the data bus access + // is not that simple to emulate. For the sake of homogenity between the + // chip emulations we use a dedicated callback. + devcb_resolved_write8 m_external_operation; + + private: // Indicates if this is a byte-oriented command inline bool byte_operation(); @@ -425,41 +391,6 @@ private: inline void set_status_bit(int bit, bool state); inline void compare_and_set_lae(UINT16 value1, UINT16 value2); void set_status_parity(UINT8 value); - - /************************************************************************/ - - // Trigger external operation. This is achieved by putting a special value in - // the most significant three bits of the address bus (TMS9995: data bus) and - // pulsing the CRUCLK line. - // Accordingly, we have - // - // A0 A1 A2 A3 A4 A5 ... A12 A13 A14 A15 - // 0 0 0 x x x x x x - normal CRU access - // 0 1 0 x x x x x x - IDLE - // 0 1 1 x x x x x x - RSET - // 1 0 1 x x x x x x - CKON - // 1 1 0 x x x x x x - CKOF - // 1 1 1 x x x x x x - LREX - // - // so the TMS9900 can only use CRU addresses 0 - 1ffe for CRU operations. - // By moving these three bits to the data bus, the TMS9995 can allow for the - // full range 0000-fffe for its CRU operations. - // - // We could realize this via the CRU access as well, but the data bus access - // is not that simple to emulate. For the sake of homogenity between the - // chip emulations we use a dedicated callback. - devcb_resolved_write8 m_external_operation; - - // Clock output. This is not a pin of the TMS9900 because the TMS9900 - // needs an external clock, and usually one of those external lines is - // used for this purpose. - devcb_resolved_write_line m_clock_out_line; - - // Wait output. When asserted (high), the CPU is in a wait state. - devcb_resolved_write_line m_wait_line; - - // HOLD Acknowledge line. When asserted (high), the CPU is in HOLD state. - devcb_resolved_write_line m_holda_line; }; /*****************************************************************************/ diff --git a/src/emu/cpu/tms9900/tms9980a.c b/src/emu/cpu/tms9900/tms9980a.c index 7e8e5255968..126a68cac91 100644 --- a/src/emu/cpu/tms9900/tms9980a.c +++ b/src/emu/cpu/tms9900/tms9980a.c @@ -65,6 +65,22 @@ tms9980a_device::tms9980a_device(const machine_config &mconfig, const char *tag, { } +/* + External connections +*/ +void tms9980a_device::resolve_lines() +{ + const tms9980a_config *conf = reinterpret_cast<const tms9980a_config *>(static_config()); + assert (conf != NULL); + + // Resolve our external connections + m_external_operation.resolve(conf->external_callback, *this); + m_iaq_line.resolve(conf->instruction_acquisition, *this); + m_clock_out_line.resolve(conf->clock_out, *this); + m_holda_line.resolve(conf->holda_line, *this); + m_dbin_line.resolve(conf->dbin_line, *this); +} + UINT16 tms9980a_device::read_workspace_register_debug(int reg) { int temp = m_icount; @@ -91,53 +107,54 @@ void tms9980a_device::write_workspace_register_debug(int reg, UINT16 data) */ void tms9980a_device::execute_set_input(int irqline, int state) { - m_irq_level = get_intlevel(state); + // We model the three lines IC0-IC2 as 8 separate input lines, although we + // cannot assert more than one at a time. The state value is not needed, + // as level 7 means to clean all interrupts, but we consider it for the + // sake of consistency. - if (m_irq_level != 7) - { - if (m_irq_level == LOAD_INT) - { - // Clearing m_reset is a hack to prevent an initial RESET. - // Should fix that in tms99xx - m_reset = false; - m_load_state = true; - } - else m_irq_state = true; - if (VERBOSE>6) LOG("tms9980a: interrupt level=%d, ST=%04x\n", m_irq_level, ST); - } -} - -int tms9980a_device::get_intlevel(int state) -{ - int level = m_get_intlevel(0) & 0x0007; + int level = irqline; // Just to stay consistent. - if (state==CLEAR_LINE) level = 7; + if (state==CLEAR_LINE) level = INT_9980A_CLEAR; switch (level) { - case 0: + case INT_9980A_RESET: case 1: level = RESET_INT; m_reset = true; break; - case 2: + case INT_9980A_LOAD: level = LOAD_INT; break; - case 3: - case 4: - case 5: - case 6: + case INT_9980A_LEVEL1: + case INT_9980A_LEVEL2: + case INT_9980A_LEVEL3: + case INT_9980A_LEVEL4: level = level - 2; break; - case 7: + case INT_9980A_CLEAR: // Clear all interrupts m_load_state = false; m_irq_state = false; if (VERBOSE>6) LOG("tms9980a: clear interrupts\n"); break; } - return level; + + m_irq_level = level; + + if (m_irq_level != INT_9980A_CLEAR) + { + if (m_irq_level == LOAD_INT) + { + // Clearing m_reset is a hack to prevent an initial RESET. + // Should fix that in tms99xx + m_reset = false; + m_load_state = true; + } + else m_irq_state = true; + if (VERBOSE>6) LOG("tms9980a: interrupt level=%d, ST=%04x\n", m_irq_level, ST); + } } /*****************************************************************************/ @@ -246,7 +263,7 @@ UINT32 tms9980a_device::execute_max_cycles() const UINT32 tms9980a_device::execute_input_lines() const { - return 1; + return 8; } // clocks to cycles, cycles to clocks = id diff --git a/src/emu/cpu/tms9900/tms9980a.h b/src/emu/cpu/tms9900/tms9980a.h index 7047f0ac4c8..c5bb7820827 100644 --- a/src/emu/cpu/tms9900/tms9980a.h +++ b/src/emu/cpu/tms9900/tms9980a.h @@ -2,7 +2,6 @@ // copyright-holders:Michael Zapf /* TMS9980A. - See tms9980a.c and tms9900.c for documentation */ @@ -13,15 +12,28 @@ #include "debugger.h" #include "tms9900.h" -#define MCFG_TMS9980A_ADD(_tag, _device, _clock, _prgmap, _iomap, _config) \ - MCFG_DEVICE_ADD(_tag, _device, _clock ) \ - MCFG_DEVICE_PROGRAM_MAP(_prgmap) \ - MCFG_DEVICE_IO_MAP(_iomap) \ - MCFG_DEVICE_CONFIG(_config) +enum +{ + INT_9980A_RESET = 0, + INT_9980A_LOAD = 2, + INT_9980A_LEVEL1 = 3, + INT_9980A_LEVEL2 = 4, + INT_9980A_LEVEL3 = 5, + INT_9980A_LEVEL4 = 6, + INT_9980A_CLEAR= 7 +}; -#define TMS9980A_CONFIG(name) \ - const tms9900_config(name) = +struct tms9980a_config +{ + devcb_write8 external_callback; + devcb_write_line instruction_acquisition; + devcb_write_line clock_out; + devcb_write_line holda_line; + devcb_write_line dbin_line; +}; +#define TMS9980A_CONFIG(name) \ + const tms9980a_config(name) = class tms9980a_device : public tms99xx_device { @@ -33,6 +45,8 @@ protected: void mem_write(void); void acquire_instruction(void); + void resolve_lines(); + UINT16 read_workspace_register_debug(int reg); void write_workspace_register_debug(int reg, UINT16 data); @@ -46,8 +60,6 @@ protected: offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options); address_space_config m_program_config80; address_space_config m_io_config80; - - int get_intlevel(int state); }; // device type definition diff --git a/src/emu/cpu/tms9900/tms9995.c b/src/emu/cpu/tms9900/tms9995.c index a51566e9f8b..3df4b8d35dc 100644 --- a/src/emu/cpu/tms9900/tms9995.c +++ b/src/emu/cpu/tms9900/tms9995.c @@ -118,7 +118,7 @@ enum }; #define LOG logerror -#define VERBOSE 1 +#define VERBOSE 5 /**************************************************************************** Constructor @@ -1172,7 +1172,7 @@ void tms9995_device::execute_run() */ void tms9995_device::execute_set_input(int irqline, int state) { - if (irqline==INPUT_LINE_99XX_RESET && state==ASSERT_LINE) + if (irqline==INT_9995_RESET && state==ASSERT_LINE) { m_reset = true; } @@ -1185,14 +1185,14 @@ void tms9995_device::execute_set_input(int irqline, int state) } else { - if (irqline == INPUT_LINE_99XX_INT1) + if (irqline == INT_9995_INT1) { m_int1_active = m_flag[2] = (state==ASSERT_LINE); if (VERBOSE>3) LOG("tms9995: Line INT1 state=%d\n", state); } else { - if (irqline == INPUT_LINE_99XX_INT4) + if (irqline == INT_9995_INT4) { if (VERBOSE>3) LOG("tms9995: Line INT4/EC state=%d\n", state); if (m_flag[0]==false) @@ -1218,7 +1218,7 @@ void tms9995_device::execute_set_input(int irqline, int state) /* Issue a pulse on the clock line. */ -inline void tms9995_device::pulse_clock(int count) +void tms9995_device::pulse_clock(int count) { for (int i=0; i < count; i++) { @@ -1335,7 +1335,6 @@ void tms9995_device::decode(UINT16 inst) */ void tms9995_device::int_prefetch_and_decode() { - bool check_idle = false; bool check_int = (m_instruction->command != XOP && m_instruction->command != BLWP); int intmask = ST & 0x000f; @@ -1364,7 +1363,7 @@ void tms9995_device::int_prefetch_and_decode() if (m_idle_state) { m_idle_state = false; - if (VERBOSE>7) LOG("tms9995: Interrupt occured, terminate IDLE state\n"); + if (VERBOSE>3) LOG("tms9995: Interrupt occured, terminate IDLE state\n"); } PC = PC + 2; // PC must be advanced (see flow chart), but no prefetch if (VERBOSE>7) LOG("tms9995: Interrupts pending; no prefetch; advance PC to %04x\n", PC); @@ -1374,7 +1373,7 @@ void tms9995_device::int_prefetch_and_decode() { if (VERBOSE>7) LOG("tms9995: Checking interrupts ... none pending\n"); // No pending interrupts - if (check_idle && m_idle_state) + if (m_idle_state) { if (VERBOSE>7) LOG("tms9995: IDLE state\n"); // We are IDLE, stay in the loop and do not advance the PC @@ -1409,7 +1408,7 @@ void tms9995_device::prefetch_and_decode() if (VERBOSE>5) LOG("tms9995: **** Prefetching new instruction at %04x ****\n", PC); } - word_read(); + word_read(); // changes m_mem_phase if (m_mem_phase==1) { @@ -1501,6 +1500,7 @@ void tms9995_device::service_interrupt() m_mem_phase = 1; m_check_hold = false; m_word_access = false; + m_int1_active = false; m_int4_active = false; m_pass = 0; @@ -1679,18 +1679,20 @@ void tms9995_device::mem_read() if (VERBOSE>7) LOG("tms9995: set address bus %04x\n", m_address & ~1); m_prgspace->set_address(address); m_request_auto_wait_state = m_auto_wait; + pulse_clock(1); break; case 2: // Sample the value on the data bus (high byte) if (m_word_access || !m_instruction->byteop) address &= 0xfffe; value = m_prgspace->read_byte(address); - if (VERBOSE>7) LOG("tms9995: memory read byte %04x -> %02x\n", m_address & ~1, value); + if (VERBOSE>3) LOG("tms9995: memory read byte %04x -> %02x\n", m_address & ~1, value); m_current_value = (value << 8) & 0xff00; break; case 3: // Set address + 1 (unless byte command) if (VERBOSE>7) LOG("tms9995: set address bus %04x\n", m_address | 1); m_prgspace->set_address(m_address | 1); + pulse_clock(1); break; case 4: // Read low byte @@ -1706,7 +1708,6 @@ void tms9995_device::mem_read() // Reset to 1 when we are done if (m_pass==1) m_mem_phase = 1; } - pulse_clock(1); } /* @@ -1802,6 +1803,7 @@ void tms9995_device::mem_write() m_prgspace->set_address(address); if (VERBOSE>7) LOG("tms9995: memory write byte %04x <- %02x\n", address, (m_current_value >> 8)&0xff); m_prgspace->write_byte(address, (m_current_value >> 8)&0xff); + pulse_clock(1); break; case 2: @@ -1813,6 +1815,7 @@ void tms9995_device::mem_write() m_prgspace->set_address(m_address | 1); if (VERBOSE>7) LOG("tms9995: memory write byte %04x <- %02x\n", m_address | 1, m_current_value & 0xff); m_prgspace->write_byte(m_address | 1, m_current_value & 0xff); + pulse_clock(1); break; case 4: // no action here, just wait for READY @@ -1825,7 +1828,6 @@ void tms9995_device::mem_write() // Reset to 1 when we are done if (m_pass==1) m_mem_phase = 1; } - pulse_clock(1); } /* @@ -2545,7 +2547,10 @@ void tms9995_device::alu_external() // a reset from outside. if (m_instruction->command == IDLE) + { + if (VERBOSE>4) LOG("tms9995: Entering IDLE state\n"); m_idle_state = true; + } if (m_instruction->command == RSET) { @@ -2880,6 +2885,7 @@ void tms9995_device::alu_rtwp() case 3: WP = m_current_value & 0xfffe; n = 1; + if (VERBOSE>4) LOG("tms9995: RTWP restored old context (WP=%04x, PC=%04x, ST=%04x)\n", WP, PC, ST); break; } m_instruction->state++; diff --git a/src/emu/cpu/tms9900/tms9995.h b/src/emu/cpu/tms9900/tms9995.h index 67ef0f631bf..3b443bbf122 100644 --- a/src/emu/cpu/tms9900/tms9995.h +++ b/src/emu/cpu/tms9900/tms9995.h @@ -12,50 +12,14 @@ #include "emu.h" #include "debugger.h" - -/* - Define symbols for interrupt lines. - - We use a separate RESET signal which is not captured by the core. - - Caution: Check irqline in set_input_line of each driver using this CPU. - Values have changed. Use these symbols instead. -*/ -enum -{ - INPUT_LINE_99XX_RESET = 0, - INPUT_LINE_99XX_INTREQ = 1, - INPUT_LINE_99XX_INT1 = 2, - INPUT_LINE_99XX_INT4 = 3 -}; +#include "tms99com.h" enum { - TI990_10_ID = 1, - TMS9900_ID = 3, - TMS9940_ID = 4, - TMS9980_ID = 5, - TMS9985_ID = 6, - TMS9989_ID = 7, - TMS9995_ID = 9, - TMS99000_ID = 10, - TMS99105A_ID = 11, - TMS99110A_ID = 12 -}; - -#define MCFG_TMS9995_ADD(_tag, _device, _clock, _prgmap, _iomap, _config) \ - MCFG_DEVICE_ADD(_tag, _device, _clock / 4.0) \ - MCFG_DEVICE_PROGRAM_MAP(_prgmap) \ - MCFG_DEVICE_IO_MAP(_iomap) \ - MCFG_DEVICE_CONFIG(_config) - -enum -{ - IDLE_OP = 2, - RSET_OP = 3, - CKOF_OP = 5, - CKON_OP = 6, - LREX_OP = 7 + INT_9995_RESET = 0, + INT_9995_INTREQ = 1, + INT_9995_INT1 = 2, + INT_9995_INT4 = 3 }; /* @@ -119,6 +83,9 @@ protected: const address_space_config* memory_space_config(address_spacenum spacenum) const; + UINT64 execute_clocks_to_cycles(UINT64 clocks) const { return clocks / 4.0; } + UINT64 execute_cycles_to_clocks(UINT64 cycles) const { return cycles * 4.0; } + private: // State / debug management UINT16 m_state_any; |