diff options
Diffstat (limited to 'src/devices/cpu/cop400/cop400.h')
-rw-r--r-- | src/devices/cpu/cop400/cop400.h | 148 |
1 files changed, 78 insertions, 70 deletions
diff --git a/src/devices/cpu/cop400/cop400.h b/src/devices/cpu/cop400/cop400.h index e97f8a135a7..c6ad46cb6f3 100644 --- a/src/devices/cpu/cop400/cop400.h +++ b/src/devices/cpu/cop400/cop400.h @@ -4,12 +4,12 @@ cop400.h - National Semiconductor COPS Emulator. + National Semiconductor COPS(COP400 series) emulator. ***************************************************************************/ -#ifndef MAME_DEVICES_CPU_COP400_H -#define MAME_DEVICES_CPU_COP400_H +#ifndef MAME_CPU_COP400_COP400_H +#define MAME_CPU_COP400_COP400_H #pragma once @@ -17,7 +17,7 @@ CONSTANTS ***************************************************************************/ -/* register access indexes */ +// register access indexes enum { COP400_PC, @@ -37,23 +37,23 @@ enum COP400_SKIP }; -/* input lines */ +// input lines enum { - /* COP420 */ + // COP420 COP400_IN0 = 0, COP400_IN1, COP400_IN2, COP400_IN3, - /* COP404L */ + // COP404L COP400_MB, COP400_DUAL, COP400_SEL10, COP400_SEL20 }; -/* CKI bonding options */ +// CKI bonding options enum cop400_cki_bond { COP400_CKI_DIVISOR_4 = 4, COP400_CKI_DIVISOR_8 = 8, @@ -61,7 +61,7 @@ enum cop400_cki_bond { COP400_CKI_DIVISOR_32 = 32 }; -/* CKO bonding options */ +// CKO bonding options enum cop400_cko_bond { COP400_CKO_OSCILLATOR_OUTPUT = 0, COP400_CKO_RAM_POWER_SUPPLY, @@ -73,8 +73,6 @@ enum cop400_cko_bond { class cop400_cpu_device : public cpu_device { public: - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - // L pins: 8-bit bi-directional auto read_l() { return m_read_l.bind(); } auto write_l() { return m_write_l.bind(); } @@ -113,29 +111,35 @@ public: void set_cko(cop400_cko_bond cko) { m_cko = cko; } void set_microbus(bool has_microbus) { m_has_microbus = has_microbus; } - DECLARE_READ8_MEMBER( microbus_rd ); - DECLARE_WRITE8_MEMBER( microbus_wr ); + // output pin state accessors + int so_r() { return m_so_output; } + int sk_r() { return m_sk_output; } + uint8_t l_r() { return m_l_output; } + + // microbus + uint8_t microbus_r(); + void microbus_w(uint8_t data); + + void data_128b(address_map &map) ATTR_COLD; + void data_32b(address_map &map) ATTR_COLD; + void data_64b(address_map &map) ATTR_COLD; + void program_1kb(address_map &map) ATTR_COLD; + void program_2kb(address_map &map) ATTR_COLD; + void program_512b(address_map &map) ATTR_COLD; - void data_128b(address_map &map); - void data_32b(address_map &map); - void data_64b(address_map &map); - void program_1kb(address_map &map); - void program_2kb(address_map &map); - void program_512b(address_map &map); protected: // construction/destruction cop400_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t program_addr_bits, uint8_t data_addr_bits, uint8_t featuremask, uint8_t g_mask, uint8_t d_mask, uint8_t in_mask, bool has_counter, bool has_inil, address_map_constructor internal_map_program, address_map_constructor internal_map_data); // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; // device_execute_interface overrides - virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const override { return (clocks + m_cki - 1) / m_cki; } - virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const override { return (cycles * m_cki); } - virtual uint32_t execute_min_cycles() const override { return 1; } - virtual uint32_t execute_max_cycles() const override { return 2; } - virtual uint32_t execute_input_lines() const override { return 0; } + virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const noexcept override { return (clocks + m_cki - 1) / m_cki; } + virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const noexcept override { return (cycles * m_cki); } + virtual uint32_t execute_min_cycles() const noexcept override { return 1; } + virtual uint32_t execute_max_cycles() const noexcept override { return 2; } virtual void execute_run() override; // device_memory_interface overrides @@ -147,6 +151,8 @@ protected: // device_disasm_interface overrides virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; + TIMER_CALLBACK_MEMBER(advance_counter); + address_space_config m_program_config; address_space_config m_data_config; @@ -184,51 +190,53 @@ protected: bool m_has_counter; bool m_has_inil; - address_space *m_program; - memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache; - address_space *m_data; + memory_access<11, 0, 0, ENDIANNESS_LITTLE>::cache m_program; + memory_access< 7, 0, 0, ENDIANNESS_LITTLE>::specific m_data; uint8_t m_featuremask; - /* registers */ - uint16_t m_pc; /* 9/10/11-bit ROM address program counter */ - uint16_t m_prevpc; /* previous value of program counter */ - uint8_t m_a; /* 4-bit accumulator */ - uint8_t m_b; /* 5/6/7-bit RAM address register */ - int m_c; /* 1-bit carry register */ - uint8_t m_en; /* 4-bit enable register */ - uint8_t m_g; /* 4-bit general purpose I/O port */ - uint8_t m_q; /* 8-bit latch for L port */ - uint16_t m_sa, m_sb, m_sc; /* subroutine save registers */ - uint8_t m_sio; /* 4-bit shift register and counter */ - int m_skl; /* 1-bit latch for SK output */ - - /* counter */ - uint8_t m_t; /* 8-bit timer */ - int m_skt_latch; /* timer overflow latch */ - - /* input/output ports */ - uint8_t m_g_mask; /* G port mask */ - uint8_t m_d_mask; /* D port mask */ - uint8_t m_in_mask; /* IN port mask */ - uint8_t m_il; /* IN latch */ - uint8_t m_in[4]; /* IN port shift register */ - uint8_t m_si; /* serial input */ - - /* skipping logic */ - bool m_skip; /* skip next instruction */ - int m_skip_lbi; /* skip until next non-LBI instruction */ - bool m_last_skip; /* last value of skip */ - bool m_halt; /* halt mode */ - bool m_idle; /* idle mode */ - - /* execution logic */ - int m_InstLen[256]; /* instruction length in bytes */ - int m_icount; /* instruction counter */ - uint8_t m_opcode; /* opcode being executed */ - bool m_second_byte; /* second byte of opcode */ - - /* timers */ + // registers + uint16_t m_pc; // 9/10/11-bit ROM address program counter + uint16_t m_prevpc; // previous value of program counter + uint8_t m_a; // 4-bit accumulator + uint8_t m_b; // 5/6/7-bit RAM address register + int m_c; // 1-bit carry register + uint8_t m_en; // 4-bit enable register + uint8_t m_g; // 4-bit general purpose I/O port + uint8_t m_q; // 8-bit latch for L port + uint16_t m_sa, m_sb, m_sc; // subroutine save registers + uint8_t m_sio; // 4-bit shift register and counter + int m_skl; // 1-bit latch for SK output + + // counter + uint8_t m_t; // 8-bit timer + int m_skt_latch; // timer overflow latch + + // input/output ports + uint8_t m_g_mask; // G port mask + uint8_t m_d_mask; // D port mask + uint8_t m_in_mask; // IN port mask + uint8_t m_il; // IN latch + uint8_t m_in[4]; // IN port shift register + uint8_t m_si; // serial input + int m_so_output; // SO pin output state + int m_sk_output; // SK pin output state + uint8_t m_l_output; // L pins output state + + // skipping logic + bool m_skip; // skip next instruction + int m_skip_lbi; // skip until next non-LBI instruction + bool m_last_skip; // last value of skip + bool m_halt; // halt mode + bool m_idle; // idle mode + + // execution logic + int m_instlen[256]; // instruction length in bytes + int m_icount; // instruction counter + uint8_t m_opcode; // opcode being executed + bool m_second_byte; // second byte of opcode + + // timers emu_timer *m_counter_timer; typedef void (cop400_cpu_device::*cop400_opcode_func)(uint8_t operand); @@ -265,7 +273,7 @@ protected: uint8_t get_flags() const; void set_flags(uint8_t flags); - uint8_t get_m() const; + uint8_t get_m(); void set_m(uint8_t m); void illegal(uint8_t operand); @@ -520,4 +528,4 @@ DECLARE_DEVICE_TYPE(COP444C, cop444c_cpu_device) DECLARE_DEVICE_TYPE(COP445C, cop445c_cpu_device) DECLARE_DEVICE_TYPE(COP446C, cop446c_cpu_device) -#endif // MAME_DEVICES_CPU_COP400_H +#endif // MAME_CPU_COP400_COP400_H |