diff options
Diffstat (limited to 'src/devices/cpu/mcs51/mcs51.h')
-rw-r--r-- | src/devices/cpu/mcs51/mcs51.h | 67 |
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; }; |