summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/rastersp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/rastersp.cpp')
-rw-r--r--src/mame/drivers/rastersp.cpp168
1 files changed, 93 insertions, 75 deletions
diff --git a/src/mame/drivers/rastersp.cpp b/src/mame/drivers/rastersp.cpp
index e331d7f4a30..718a9f48fd4 100644
--- a/src/mame/drivers/rastersp.cpp
+++ b/src/mame/drivers/rastersp.cpp
@@ -52,16 +52,16 @@ class rastersp_state : public driver_device
{
public:
rastersp_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_dsp(*this, "dsp"),
- m_dram(*this, "dram"),
- m_ldac(*this, "ldac"),
- m_rdac(*this, "rdac"),
- m_tms_timer1(*this, "tms_timer1"),
- m_tms_tx_timer(*this, "tms_tx_timer"),
- m_palette(*this, "palette"),
- m_nvram(*this, "nvram")
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_dsp(*this, "dsp")
+ , m_dram(*this, "dram")
+ , m_ldac(*this, "ldac")
+ , m_rdac(*this, "rdac")
+ , m_palette(*this, "palette")
+ , m_nvram(*this, "nvram")
+ , m_tms_timer1(nullptr)
+ , m_tms_tx_timer(nullptr)
{}
void rastersp(machine_config &config);
@@ -103,15 +103,16 @@ private:
IRQ_SCSI = 7
};
- required_device<cpu_device> m_maincpu;
- required_device<cpu_device> m_dsp;
- required_shared_ptr<uint32_t> m_dram;
- required_device<dac_word_interface> m_ldac;
- required_device<dac_word_interface> m_rdac;
- required_device<timer_device> m_tms_timer1;
- required_device<timer_device> m_tms_tx_timer;
- required_device<palette_device> m_palette;
- required_device<nvram_device> m_nvram;
+ required_device<i486_device> m_maincpu;
+ required_device<tms3203x_device> m_dsp;
+ required_shared_ptr<uint32_t> m_dram;
+ required_device<dac_16bit_r2r_twos_complement_device> m_ldac;
+ required_device<dac_16bit_r2r_twos_complement_device> m_rdac;
+ required_device<palette_device> m_palette;
+ required_device<nvram_device> m_nvram;
+
+ emu_timer *m_tms_timer1;
+ emu_timer *m_tms_tx_timer;
DECLARE_WRITE32_MEMBER(cyrix_cache_w);
DECLARE_READ8_MEMBER(nvram_r);
@@ -131,8 +132,8 @@ private:
DECLARE_WRITE32_MEMBER(ncr53c700_write);
DECLARE_WRITE_LINE_MEMBER(scsi_irq);
- TIMER_DEVICE_CALLBACK_MEMBER(tms_timer1);
- TIMER_DEVICE_CALLBACK_MEMBER(tms_tx_timer);
+ TIMER_CALLBACK_MEMBER(tms_timer1);
+ TIMER_CALLBACK_MEMBER(tms_tx_timer);
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
std::unique_ptr<uint8_t[]> m_nvram8;
@@ -143,11 +144,12 @@ private:
uint32_t m_tms_io_regs[0x80];
bitmap_ind16 m_update_bitmap;
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void update_irq(uint32_t which, uint32_t state);
- void upload_palette(uint32_t word1, uint32_t word2);
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void update_irq(uint32_t which, uint32_t state);
+ void upload_palette(uint32_t word1, uint32_t word2);
IRQ_CALLBACK_MEMBER(irq_callback);
- void ncr53c700(device_t *device);
+ nscsi_connector &add_rastersp_scsi_slot(machine_config &config, const char *tag, const char *default_slot);
+ static void ncr53c700_config(device_t *device);
void cpu_map(address_map &map);
void dsp_map(address_map &map);
void io_map(address_map &map);
@@ -176,6 +178,12 @@ void rastersp_state::machine_start()
membank("bank2")->set_base(&m_dram[0x10000/4]);
membank("bank3")->set_base(&m_dram[0x300000/4]);
+ if (!m_tms_timer1)
+ m_tms_timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(rastersp_state::tms_timer1), this));
+
+ if (!m_tms_tx_timer)
+ m_tms_tx_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(rastersp_state::tms_tx_timer), this));
+
#if USE_SPEEDUP_HACK
m_dsp->space(AS_PROGRAM).install_read_handler(0x809923, 0x809923, read32_delegate(FUNC(rastersp_state::dsp_speedup_r), this));
m_dsp->space(AS_PROGRAM).install_write_handler(0x809923, 0x809923, write32_delegate(FUNC(rastersp_state::dsp_speedup_w), this));
@@ -197,6 +205,9 @@ void rastersp_state::machine_reset()
// Reset DSP internal registers
m_tms_io_regs[SPORT_GLOBAL_CTL] = 0;
+
+ m_tms_timer1->adjust(attotime::never);
+ m_tms_tx_timer->adjust(attotime::never);
}
@@ -514,7 +525,7 @@ WRITE32_MEMBER( rastersp_state::cyrix_cache_w )
*
*************************************/
-TIMER_DEVICE_CALLBACK_MEMBER( rastersp_state::tms_tx_timer )
+TIMER_CALLBACK_MEMBER(rastersp_state::tms_tx_timer)
{
// Is the transmit shifter full?
if (m_tms_io_regs[SPORT_GLOBAL_CTL] & (1 << 3))
@@ -540,7 +551,7 @@ TIMER_DEVICE_CALLBACK_MEMBER( rastersp_state::tms_tx_timer )
}
-TIMER_DEVICE_CALLBACK_MEMBER( rastersp_state::tms_timer1 )
+TIMER_CALLBACK_MEMBER(rastersp_state::tms_timer1)
{
}
@@ -553,7 +564,7 @@ READ32_MEMBER( rastersp_state::tms32031_control_r )
{
case TIMER1_COUNTER:
{
- attotime elapsed = m_tms_timer1->time_elapsed();
+ attotime elapsed = m_tms_timer1->elapsed();
val = m_tms_io_regs[TIMER1_PERIOD] - (elapsed.as_ticks(m_dsp->clock() / 2 / 2));
break;
@@ -840,74 +851,81 @@ WRITE32_MEMBER(rastersp_state::ncr53c700_write)
m_maincpu->space(AS_PROGRAM).write_dword(offset, data, mem_mask);
}
-void rastersp_state::ncr53c700(device_t *device)
-{
- devcb_base *devcb;
- (void)devcb;
- MCFG_DEVICE_CLOCK(66000000)
- MCFG_NCR53C7XX_IRQ_HANDLER(WRITELINE(*this, rastersp_state, scsi_irq))
- MCFG_NCR53C7XX_HOST_READ(READ32(*this, rastersp_state, ncr53c700_read))
- MCFG_NCR53C7XX_HOST_WRITE(WRITE32(*this, rastersp_state, ncr53c700_write))
-}
-
-static void rastersp_scsi_devices(device_slot_interface &device)
+void rastersp_state::ncr53c700_config(device_t *device)
{
- device.option_add("harddisk", NSCSI_HARDDISK);
- device.option_add_internal("ncr53c700", NCR53C7XX);
+ auto *state = device->subdevice<rastersp_state>(":");
+ ncr53c7xx_device &scsictrl = downcast<ncr53c7xx_device &>(*device);
+ scsictrl.set_clock(66000000);
+ scsictrl.irq_handler().set(*state, FUNC(rastersp_state::scsi_irq));
+ scsictrl.host_read().set(*state, FUNC(rastersp_state::ncr53c700_read));
+ scsictrl.host_write().set(*state, FUNC(rastersp_state::ncr53c700_write));
}
-
/*************************************
*
* Machine driver
*
*************************************/
-MACHINE_CONFIG_START(rastersp_state::rastersp)
- MCFG_DEVICE_ADD("maincpu", I486, 33330000)
- MCFG_DEVICE_PROGRAM_MAP(cpu_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(rastersp_state,irq_callback)
+void rastersp_state::rastersp(machine_config &config)
+{
+ I486(config, m_maincpu, 33330000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rastersp_state::cpu_map);
+ m_maincpu->set_addrmap(AS_IO, &rastersp_state::io_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(rastersp_state::irq_callback));
- MCFG_DEVICE_ADD("dsp", TMS32031, 33330000)
- MCFG_DEVICE_PROGRAM_MAP(dsp_map)
- MCFG_TMS3203X_MCBL(true) // Boot-loader mode
+ TMS32031(config, m_dsp, 33330000);
+ m_dsp->set_addrmap(AS_PROGRAM, &rastersp_state::dsp_map);
+ m_dsp->set_mcbl_mode(true); // Boot-loader mode
- /* Devices */
- MCFG_TIMER_DRIVER_ADD("tms_timer1", rastersp_state, tms_timer1)
- MCFG_TIMER_DRIVER_ADD("tms_tx_timer", rastersp_state, tms_tx_timer)
+ MC146818(config, "rtc", 32.768_kHz_XTAL);
- MCFG_DEVICE_ADD("rtc", MC146818, 32.768_kHz_XTAL)
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_NVRAM_ADD_0FILL("nvram")
+ NSCSI_BUS(config, "scsibus", 0);
- MCFG_NSCSI_BUS_ADD("scsibus")
- MCFG_NSCSI_ADD("scsibus:0", rastersp_scsi_devices, "harddisk", true)
- MCFG_NSCSI_ADD("scsibus:7", rastersp_scsi_devices, "ncr53c700", true)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr53c700", [this] (device_t *device) { ncr53c700(device); })
+ nscsi_connector &connector0(NSCSI_CONNECTOR(config, "scsibus:0", 0));
+ connector0.option_add("harddisk", NSCSI_HARDDISK);
+ connector0.option_add_internal("ncr53c700", NCR53C7XX);
+ connector0.set_default_option("harddisk");
+ connector0.set_fixed(true);
- /* Video */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(rastersp_state, screen_update)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, rastersp_state, vblank_irq))
+ nscsi_connector &connector7(NSCSI_CONNECTOR(config, "scsibus:7", 0));
+ connector7.option_add("harddisk", NSCSI_HARDDISK);
+ connector7.option_add_internal("ncr53c700", NCR53C7XX);
+ connector7.set_default_option("ncr53c700");
+ connector7.set_fixed(true);
+ connector7.set_option_machine_config("ncr53c700", ncr53c700_config);
- MCFG_PALETTE_ADD_RRRRRGGGGGGBBBBB("palette")
+ /* Video */
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_size(320, 240);
+ screen.set_visarea(0, 320-1, 0, 240-1);
+ screen.set_screen_update(FUNC(rastersp_state::screen_update));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_palette("palette");
+ screen.screen_vblank().set(FUNC(rastersp_state::vblank_irq));
+
+ PALETTE(config, m_palette, 65536);
+ m_palette->set_init("palette", FUNC(palette_device::palette_init_RRRRRGGGGGGBBBBB));
/* Sound */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ldac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("rdac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_ldac, 0);
+ DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_rdac, 0);
+ m_ldac->add_route(ALL_OUTPUTS, "lspeaker", 0.5); // unknown DAC
+ m_rdac->add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC
+
+ voltage_regulator_device &vreg(VOLTAGE_REGULATOR(config, "vref"));
+ vreg.set_output(5.0);
+ vreg.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
+ vreg.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
+ vreg.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vreg.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
+}