diff options
Diffstat (limited to 'src/devices/machine/spg2xx_io.h')
-rw-r--r-- | src/devices/machine/spg2xx_io.h | 198 |
1 files changed, 161 insertions, 37 deletions
diff --git a/src/devices/machine/spg2xx_io.h b/src/devices/machine/spg2xx_io.h index a077d8554be..208f224b1e6 100644 --- a/src/devices/machine/spg2xx_io.h +++ b/src/devices/machine/spg2xx_io.h @@ -23,31 +23,35 @@ public: template <size_t Line> auto adc_in() { return m_adc_in[Line].bind(); } - auto eeprom_w() { return m_eeprom_w.bind(); } - auto eeprom_r() { return m_eeprom_r.bind(); } + auto i2c_w() { return m_i2c_w.bind(); } + auto i2c_r() { return m_i2c_r.bind(); } auto uart_tx() { return m_uart_tx.bind(); } - + auto spi_tx() { return m_spi_tx.bind(); } auto chip_select() { return m_chip_sel.bind(); } void uart_rx(uint8_t data); + void spi_rx(int state); void extint_w(int channel, bool state); - DECLARE_READ16_MEMBER(io_r); - DECLARE_WRITE16_MEMBER(io_w); + uint16_t io_r(offs_t offset); + void io_w(offs_t offset, uint16_t data); + + virtual uint16_t io_extended_r(offs_t offset); + virtual void io_extended_w(offs_t offset, uint16_t data); - virtual DECLARE_READ16_MEMBER(io_extended_r); - virtual DECLARE_WRITE16_MEMBER(io_extended_w); + auto pal_read_callback() { return m_pal_read_cb.bind(); } + auto write_timer_irq_callback() { return m_timer_irq_cb.bind(); } + auto write_uart_adc_irq_callback() { return m_uart_adc_irq_cb.bind(); } + auto write_external_irq_callback() { return m_external_irq_cb.bind(); } + auto write_ffrq_tmr1_irq_callback() { return m_ffreq_tmr1_irq_cb.bind(); } + auto write_ffrq_tmr2_irq_callback() { return m_ffreq_tmr2_irq_cb.bind(); } - auto pal_read_callback() { return m_pal_read_cb.bind(); }; + auto write_fiq_vector_callback() { return m_fiq_vector_w.bind(); } - auto write_timer_irq_callback() { return m_timer_irq_cb.bind(); }; - auto write_uart_adc_irq_callback() { return m_uart_adc_irq_cb.bind(); }; - auto write_external_irq_callback() { return m_external_irq_cb.bind(); }; - auto write_ffrq_tmr1_irq_callback() { return m_ffreq_tmr1_irq_cb.bind(); }; - auto write_ffrq_tmr2_irq_callback() { return m_ffreq_tmr2_irq_cb.bind(); }; + template <size_t Line> uint16_t adc_r() { return m_adc_in[Line](); } protected: spg2xx_io_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const uint32_t sprite_limit) @@ -55,21 +59,118 @@ protected: { } + enum + { + REG_IO_MODE, + REG_IOA_DATA, + REG_IOA_BUFFER, + REG_IOA_DIR, + REG_IOA_ATTRIB, + REG_IOA_MASK, + REG_IOB_DATA, + REG_IOB_BUFFER, + REG_IOB_DIR, + REG_IOB_ATTRIB, + REG_IOB_MASK, + REG_IOC_DATA, + REG_IOC_BUFFER, + REG_IOC_DIR, + REG_IOC_ATTRIB, + REG_IOC_MASK, + + REG_TIMEBASE_SETUP, + REG_TIMEBASE_CLEAR, + REG_TIMERA_DATA, + REG_TIMERA_CTRL, + REG_TIMERA_ON, + REG_TIMERA_IRQCLR, + REG_TIMERB_DATA, + REG_TIMERB_CTRL, + REG_TIMERB_ON, + REG_TIMERB_IRQCLR, + + REG_VERT_LINE = 0x1c, + + REG_SYSTEM_CTRL = 0x20, + REG_INT_CTRL, + REG_INT_CLEAR, + REG_EXT_MEMORY_CTRL, + REG_WATCHDOG_CLEAR, + REG_ADC_CTRL, + REG_ADC_PAD, + REG_ADC_DATA, + + REG_SLEEP_MODE, + REG_WAKEUP_SOURCE, + REG_WAKEUP_TIME, + + REG_NTSC_PAL, + + REG_PRNG1 = 0x2c, + REG_PRNG2, + + REG_FIQ_SEL, + REG_DATA_SEGMENT, + + REG_UART_CTRL, + REG_UART_STATUS, + REG_UART_RESET, + REG_UART_BAUD1, + REG_UART_BAUD2, + REG_UART_TXBUF, + REG_UART_RXBUF, + REG_UART_RXFIFO, + + REG_SPI_CTRL = 0x40, + REG_SPI_TXSTATUS, + REG_SPI_TXDATA, + REG_SPI_RXSTATUS, + REG_SPI_RXDATA, + REG_SPI_MISC, + + REG_SIO_SETUP = 0x50, + REG_SIO_STATUS, + REG_SIO_ADDRL, + REG_SIO_ADDRH, + REG_SIO_DATA, + REG_SIO_AUTO_TX_NUM, + + REG_I2C_CMD = 0x58, + REG_I2C_STATUS, + REG_I2C_ACCESS, + REG_I2C_ADDR, + REG_I2C_SUBADDR, + REG_I2C_DATA_OUT, + REG_I2C_DATA_IN, + REG_I2C_MODE, + + REG_REGULATOR_CTRL = 0x60, + REG_CLOCK_CTRL, + REG_IO_DRIVE_CTRL + }; void check_extint_irq(int channel); - void check_irqs(const uint16_t changed); - - static const device_timer_id TIMER_TMB1 = 0; - static const device_timer_id TIMER_TMB2 = 1; - - static const device_timer_id TIMER_UART_TX = 4; - static const device_timer_id TIMER_UART_RX = 5; - static const device_timer_id TIMER_4KHZ = 6; - static const device_timer_id TIMER_SRC_AB = 7; - static const device_timer_id TIMER_SRC_C = 8; - - virtual void device_start() override; - virtual void device_reset() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + void check_timers_irq(); + void check_data_irq(); + void check_external_irq(); + void check_hifreq_periodic_irq(); + void check_tmb_lofreq_key_irq(); + void check_all_irqs(const uint16_t changed); + + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + + TIMER_CALLBACK_MEMBER(timer_ab_tick); + TIMER_CALLBACK_MEMBER(timer_c_tick); + template <int Which> TIMER_CALLBACK_MEMBER(tmb_timer_tick); + TIMER_CALLBACK_MEMBER(uart_transmit_tick); + TIMER_CALLBACK_MEMBER(uart_receive_tick); + TIMER_CALLBACK_MEMBER(system_timer_tick); + TIMER_CALLBACK_MEMBER(rng_clock_tick); + TIMER_CALLBACK_MEMBER(watchdog_tick); + TIMER_CALLBACK_MEMBER(spi_tx_tick); + template <int Which> TIMER_CALLBACK_MEMBER(adc_convert_tick); + + uint16_t clock_rng(int which); void update_porta_special_modes(); void update_portb_special_modes(); @@ -77,14 +178,10 @@ protected: uint16_t do_special_gpio(uint32_t index, uint16_t mask); void update_timer_b_rate(); - void update_timer_ab_src(); - void update_timer_c_src(); void increment_timer_a(); - void uart_transmit_tick(); - void uart_receive_tick(); - - void system_timer_tick(); + void set_spi_irq(bool set); + void update_spi_irqs(); void do_i2c(); @@ -98,6 +195,20 @@ protected: bool m_uart_rx_irq; bool m_uart_tx_irq; + uint8_t m_spi_tx_fifo[16]; + uint8_t m_spi_tx_fifo_start; + uint8_t m_spi_tx_fifo_end; + uint8_t m_spi_tx_fifo_count; + uint8_t m_spi_tx_buf; + uint8_t m_spi_tx_bit; + + uint8_t m_spi_rx_fifo[16]; + uint8_t m_spi_rx_fifo_start; + uint8_t m_spi_rx_fifo_end; + uint8_t m_spi_rx_fifo_count; + uint8_t m_spi_rx_buf; + uint8_t m_spi_rx_bit; + bool m_extint[2]; devcb_write16 m_porta_out; @@ -107,12 +218,14 @@ protected: devcb_read16 m_portb_in; devcb_read16 m_portc_in; - devcb_read16 m_adc_in[2]; + devcb_read16::array<4> m_adc_in; + emu_timer *m_adc_timer[4]; - devcb_write8 m_eeprom_w; - devcb_read8 m_eeprom_r; + devcb_write8 m_i2c_w; + devcb_read8 m_i2c_r; devcb_write8 m_uart_tx; + devcb_write_line m_spi_tx; devcb_write8 m_chip_sel; @@ -135,6 +248,15 @@ protected: emu_timer *m_uart_tx_timer; emu_timer *m_uart_rx_timer; + emu_timer *m_rng_timer; + emu_timer *m_watchdog_timer; + + uint32_t m_spi_rate; + emu_timer* m_spi_tx_timer; + + uint8_t m_sio_bits_remaining; + bool m_sio_writing; + required_device<unsp_device> m_cpu; required_device<screen_device> m_screen; @@ -145,6 +267,8 @@ protected: devcb_write_line m_external_irq_cb; devcb_write_line m_ffreq_tmr1_irq_cb; devcb_write_line m_ffreq_tmr2_irq_cb; + + devcb_write8 m_fiq_vector_w; }; class spg24x_io_device : public spg2xx_io_device @@ -174,7 +298,7 @@ public: spg28x_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual DECLARE_WRITE16_MEMBER(io_extended_w) override; + virtual void io_extended_w(offs_t offset, uint16_t data) override; }; DECLARE_DEVICE_TYPE(SPG24X_IO, spg24x_io_device) |