summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/cop400/cop400.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/cop400/cop400.h')
-rw-r--r--src/devices/cpu/cop400/cop400.h148
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