// license:BSD-3-Clause // copyright-holders:Angelo Salese, ElSemi /*************************************************************************** MagicEyes VRender0 SoC ***************************************************************************/ #ifndef MAME_MACHINE_VRENDER0_H #define MAME_MACHINE_VRENDER0_H #pragma once #include "cpu/se3208/se3208.h" #include "screen.h" #include "video/vrender0.h" #include "sound/vrender0.h" #include "emupal.h" #include "speaker.h" #include "diserial.h" //************************************************************************** // TYPE DEFINITIONS //************************************************************************** // ======================> vr0uart_device class vrender0soc_device; class vr0uart_device : public device_t, public device_serial_interface { public: // construction/destruction vr0uart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); void regs_map(address_map &map); void set_channel_num(int ch) { m_channel_num = ch; } void set_parent(vrender0soc_device *parent) { m_parent = parent; } protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; private: uint32_t control_r(); void control_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); uint32_t baud_rate_div_r(); void baud_rate_div_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); uint32_t status_r(); void transmit_buffer_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); uint32_t receive_buffer_r(offs_t offset, uint32_t mem_mask = ~0); TIMER_CALLBACK_MEMBER( break_timer_cb ); uint32_t m_ucon = 0; // control uint32_t m_ubdr = 0; // baud rate uint32_t m_ustat = 0; // status util::fifo m_urxb_fifo; // receive FIFO void update_serial_config(); inline uint32_t calculate_baud_rate(); virtual void tra_callback() override; virtual void tra_complete() override; virtual void rcv_complete() override; inline void tx_send_byte(uint8_t val); int m_channel_num; vrender0soc_device *m_parent; }; // device type definition DECLARE_DEVICE_TYPE(VRENDER0_UART, vr0uart_device) class vrender0soc_device : public device_t { public: // construction/destruction vrender0soc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); void regs_map(address_map &map); void audiovideo_map(address_map &map); void texture_map(address_map &map); void frame_map(address_map &map); template void set_host_cpu_tag(T &&tag) { m_host_cpu.set_tag(std::forward(tag)); } void set_external_vclk(const uint32_t vclk) { m_ext_vclk = vclk; } void set_external_vclk(const XTAL vclk) { m_ext_vclk = vclk.value(); } bool crt_is_blanked() { return ((m_crtcregs[0] & 0x0200) == 0x0200); } bool crt_active_vblank_irq(); void IntReq( int num ); uint8_t irq_callback(); bool irq_pending() { return m_intst; } void write_line_tx(int port, uint8_t value); template auto tx_callback() { return write_tx[Port].bind(); } template void rx_w(int state) { m_uart[Port]->rx_w((uint8_t)state); } protected: // device-level overrides //virtual void device_validity_check(validity_checker &valid) const override; virtual void device_add_mconfig(machine_config &config) override; virtual void device_start() override; virtual void device_reset() override; private: required_device m_host_cpu; required_device m_screen; required_device m_palette; required_device m_vr0vid; required_device m_vr0snd; required_device m_lspeaker; required_device m_rspeaker; required_device_array m_uart; required_shared_ptr m_crtcregs; std::unique_ptr m_textureram; std::unique_ptr m_frameram; address_space *m_host_space = nullptr; uint32_t m_ext_vclk = 0; devcb_write_line::array<2> write_tx; // INTC uint32_t m_inten = 0; uint32_t inten_r(); void inten_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); uint32_t intvec_r(); void intvec_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); uint8_t m_IntHigh = 0; uint32_t m_intst = 0; uint32_t intst_r(); void intst_w(uint32_t data); void soundirq_cb(int state); // Timer template void tmcon_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); template uint32_t tmcon_r(); template void tmcnt_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); template uint16_t tmcnt_r(); template TIMER_CALLBACK_MEMBER(Timercb); uint32_t m_timer_control[4] = { 0, 0, 0, 0 }; uint16_t m_timer_count[4] = { 0, 0, 0, 0 }; emu_timer *m_Timer[4] = { nullptr, nullptr, nullptr, nullptr }; void TimerStart(int which); // DMAC template uint32_t dmac_r(); template void dmac_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); template uint32_t dmatc_r(); template void dmatc_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); template uint32_t dmasa_r(); template void dmasa_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); template uint32_t dmada_r(); template void dmada_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); inline int dma_setup_hold(uint8_t setting, uint8_t bitmask); struct { uint32_t src = 0; uint32_t dst = 0; uint32_t size = 0; uint32_t ctrl = 0; }m_dma[2]; // CRTC uint32_t crtc_r(offs_t offset); void crtc_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); void crtc_update(); inline bool crt_is_interlaced(); // Misc uint32_t sysid_r(); uint32_t cfgr_r(); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void screen_vblank(int state); uint16_t textureram_r(offs_t offset); void textureram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); uint16_t frameram_r(offs_t offset); void frameram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); }; // device type definition DECLARE_DEVICE_TYPE(VRENDER0_SOC, vrender0soc_device) #endif // MAME_MACHINE_VRENDER0_H