// license:GPL-2.0+ // copyright-holders:Brandon Munger /********************************************************************** ROLM 9751 9005 System Monitor Input/Ouput Card emulation **********************************************************************/ #ifndef MAME_MACHINE_SMIOC_H #define MAME_MACHINE_SMIOC_H #pragma once #include "cpu/i86/i186.h" #include "machine/am9517a.h" #include "bus/rs232/rs232.h" #include "machine/scc2698b.h" //************************************************************************** // MACROS / CONSTANTS //************************************************************************** enum smioc_dma_parameter_t { smiocdma_sendaddress=0, // Send to SMIOC - For Serial TX data smiocdma_sendlength, smiocdma_recvaddress, // Recv from SMIOC - For Serial RX data smiocdma_recvlength }; //************************************************************************** // TYPE DEFINITIONS //************************************************************************** // ======================> smioc_device class smioc_device : public device_t { public: /* Constructor and Destructor */ smioc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); auto m68k_r_callback() { return m_m68k_r_cb.bind(); } auto m68k_w_callback() { return m_m68k_w_cb.bind(); } DECLARE_READ8_MEMBER(ram2_mmio_r); DECLARE_WRITE8_MEMBER(ram2_mmio_w); DECLARE_READ8_MEMBER(dma68k_r); DECLARE_WRITE8_MEMBER(dma68k_w); DECLARE_READ8_MEMBER(dma8237_2_dmaread); DECLARE_WRITE8_MEMBER(dma8237_2_dmawrite); DECLARE_READ8_MEMBER(boardlogic_mmio_r); DECLARE_WRITE8_MEMBER(boardlogic_mmio_w); int m_activePortIndex; u16 m_status; u16 m_status2; u16 m_shadowstatus; // RAM backing for SMIOC's status writes u16 m_shadowstatus2; bool m_statusvalid; // Status field has a valid value in it bool m_statusvalid2; bool m_statusrequest; // SMIOC has requested to queue a new status value bool m_statusrequest2; u16 m_wordcount; u16 m_wordcount2; u8 m_deviceBusy; u8 m_requestFlags_11D; u16 m_commandValue; u16 m_commandValue2; void SoftReset(); void SendCommand(u16 command); void SendCommand2(u16 command); void SetCommandParameter(u16 parameter); void SetCommandParameter2(u16 parameter); u16 GetStatus(); u16 GetStatus2(); void ClearStatus(); void ClearStatus2(); void ClearParameter(); void ClearParameter2(); bool m_enable_hacky_status; int m_status_hack_counter; void AdvanceStatus(); void AdvanceStatus2(); void SetDmaParameter(smioc_dma_parameter_t param, u16 value); void WriteRamParameter(const char* function, const char* register_name, int address, int value); protected: /* Device-level overrides */ virtual void device_start() override; virtual void device_reset() override; /* Optional information overrides */ virtual void device_add_mconfig(machine_config &config) override; virtual const tiny_rom_entry *device_rom_region() const override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; u16 ReadDmaParameter(smioc_dma_parameter_t param); int DmaParameterAddress(smioc_dma_parameter_t param); private: /* Attached devices */ required_device m_smioccpu; required_device_array m_dma8237; required_device_array m_rs232_p; required_device m_scc2698b; required_shared_ptr m_smioc_ram; u8 m_logic_ram[4096]; // 4kb of ram in the 0x4xxxx window, mainly used by the board's logic to proxy command parameters and data. void smioc_mem(address_map &map); void update_and_log(u16& reg, u16 newValue, const char* register_name); emu_timer *m_dma_timer; emu_timer *m_451_timer; devcb_read8 m_m68k_r_cb; devcb_write8 m_m68k_w_cb; }; /* Device type */ DECLARE_DEVICE_TYPE(SMIOC, smioc_device) #endif // MAME_MACHINE_SMIOC_H