summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/spg2xx_io.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/spg2xx_io.h')
-rw-r--r--src/devices/machine/spg2xx_io.h198
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)