summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/mcs51/mcs51.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/mcs51/mcs51.h')
-rw-r--r--src/devices/cpu/mcs51/mcs51.h67
1 files changed, 51 insertions, 16 deletions
diff --git a/src/devices/cpu/mcs51/mcs51.h b/src/devices/cpu/mcs51/mcs51.h
index c3470d075e4..8ac6effd4d3 100644
--- a/src/devices/cpu/mcs51/mcs51.h
+++ b/src/devices/cpu/mcs51/mcs51.h
@@ -44,8 +44,7 @@ enum
{
MCS51_INT0_LINE = 0, /* P3.2: External Interrupt 0 */
MCS51_INT1_LINE, /* P3.3: External Interrupt 1 */
- MCS51_RX_LINE, /* P3.0: Serial Port Receive Line */
- MCS51_T0_LINE, /* P3,4: Timer 0 External Input */
+ MCS51_T0_LINE, /* P3.4: Timer 0 External Input */
MCS51_T1_LINE, /* P3.5: Timer 1 External Input */
MCS51_T2_LINE, /* P1.0: Timer 2 External Input */
MCS51_T2EX_LINE, /* P1.1: Timer 2 Capture Reload Trigger */
@@ -64,14 +63,13 @@ public:
template <unsigned N> auto port_in_cb() { return m_port_in_cb[N].bind(); }
template <unsigned N> auto port_out_cb() { return m_port_out_cb[N].bind(); }
- auto serial_rx_cb() { return m_serial_rx_cb.bind(); }
- auto serial_tx_cb() { return m_serial_tx_cb.bind(); }
void program_internal(address_map &map);
void data_internal(address_map &map);
protected:
// construction/destruction
mcs51_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int program_width, int data_width, uint8_t features = 0);
+ mcs51_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor program_map, address_map_constructor data_map, int program_width, int data_width, uint8_t features = 0);
// device-level overrides
virtual void device_start() override;
@@ -131,12 +129,14 @@ protected:
struct mcs51_uart
{
uint8_t data_out; //Data to send out
- uint8_t bits_to_send; //How many bits left to send when transmitting out the serial port
+ uint8_t data_in;
+ uint8_t txbit;
+ uint8_t rxbit;
+ uint8_t rxb8;
int smod_div; /* signal divided by 2^SMOD */
int rx_clk; /* rx clock */
int tx_clk; /* tx clock */
- uint8_t delay_cycles; //Gross Hack;
} m_uart; /* internal uart */
/* Internal Ram */
@@ -147,6 +147,8 @@ protected:
virtual void sfr_write(size_t offset, uint8_t data);
virtual uint8_t sfr_read(size_t offset);
+ void transmit(int state);
+
/* Memory spaces */
memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_program;
memory_access< 9, 0, 0, ENDIANNESS_LITTLE>::specific m_data;
@@ -155,10 +157,6 @@ protected:
devcb_read8::array<4> m_port_in_cb;
devcb_write8::array<4> m_port_out_cb;
- /* Serial Port TX/RX Callbacks */
- devcb_write8 m_serial_tx_cb; //Call back function when sending data out of serial port
- devcb_read8 m_serial_rx_cb; //Call back function to retrieve data when receiving serial port data
-
/* DS5002FP */
struct {
uint8_t previous_ta; /* Previous Timed Access value */
@@ -168,6 +166,7 @@ protected:
uint8_t mcon; /* bootstrap loader MCON register */
uint8_t rpctl; /* bootstrap loader RPCTL register */
uint8_t crc; /* bootstrap loader CRC register */
+ int32_t rnr_delay; /* delay before new random number available */
} m_ds5002fp;
// for the debugger
@@ -180,7 +179,7 @@ protected:
void clear_current_irq();
uint8_t r_acc();
uint8_t r_psw();
- offs_t external_ram_iaddr(offs_t offset, offs_t mem_mask);
+ virtual offs_t external_ram_iaddr(offs_t offset, offs_t mem_mask);
uint8_t iram_read(size_t offset);
void iram_write(size_t offset, uint8_t data);
void push_pc();
@@ -195,9 +194,7 @@ protected:
void update_timer_t1(int cycles);
void update_timer_t2(int cycles);
void update_timers(int cycles);
- void serial_transmit(uint8_t data);
- void serial_receive();
- void update_serial(int cycles);
+ void update_serial(int source);
void update_irq_prio(uint8_t ipl, uint8_t iph);
void execute_op(uint8_t op);
void check_irqs();
@@ -343,6 +340,9 @@ DECLARE_DEVICE_TYPE(AT89C52, at89c52_device)
DECLARE_DEVICE_TYPE(AT89S52, at89s52_device)
DECLARE_DEVICE_TYPE(DS80C320, ds80c320_device)
DECLARE_DEVICE_TYPE(SAB80C535, sab80c535_device)
+DECLARE_DEVICE_TYPE(P80C552, p80c552_device)
+DECLARE_DEVICE_TYPE(P87C552, p87c552_device)
+DECLARE_DEVICE_TYPE(P80C562, p80c562_device)
/* 4k internal perom and 128 internal ram and 2 analog comparators */
DECLARE_DEVICE_TYPE(AT89C4051, at89c4051_device)
@@ -555,6 +555,38 @@ protected:
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
};
+class p80c562_device : public i80c51_device
+{
+public:
+ // construction/destruction
+ p80c562_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ p80c562_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int program_width, int data_width, uint8_t features = 0);
+
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+};
+
+class p80c552_device : public p80c562_device
+{
+public:
+ // construction/destruction
+ p80c552_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+};
+
+class p87c552_device : public p80c562_device
+{
+public:
+ // construction/destruction
+ p87c552_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+};
+
/*
* The DS5002FP has 2 16 bits data address buses (the byte-wide bus and the expanded bus). The exact memory position accessed depends on the
* partition mode, the memory range and the expanded bus select. The partition mode and the expanded bus select can be changed at any time.
@@ -594,8 +626,8 @@ public:
// device_nvram_interface overrides
virtual void nvram_default() override;
- virtual void nvram_read( emu_file &file ) override;
- virtual void nvram_write( emu_file &file ) override;
+ virtual bool nvram_read( util::read_stream &file ) override;
+ virtual bool nvram_write( util::write_stream &file ) override;
protected:
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
@@ -604,6 +636,9 @@ protected:
virtual void sfr_write(size_t offset, uint8_t data) override;
virtual uint8_t sfr_read(size_t offset) override;
+ uint8_t handle_rnr();
+ bool is_rnr_ready();
+
private:
optional_memory_region m_region;
};