From ff114f9e77822f3b283ad40ed287724e028fd56b Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Thu, 29 Nov 2012 19:02:11 +0000 Subject: [PATCH] (MESS) bullet: Floppy modernization. (nw) --- src/mess/drivers/bullet.c | 219 +++++++++++++++++++++++-------------- src/mess/includes/bullet.h | 42 +++++-- 2 files changed, 169 insertions(+), 92 deletions(-) diff --git a/src/mess/drivers/bullet.c b/src/mess/drivers/bullet.c index 2f2d2a90208..b8ff39af520 100644 --- a/src/mess/drivers/bullet.c +++ b/src/mess/drivers/bullet.c @@ -58,9 +58,6 @@ Notes: */ #include "includes/bullet.h" -#include "machine/scsibus.h" -#include "machine/scsicb.h" -#include "machine/scsihd.h" @@ -205,16 +202,32 @@ WRITE8_MEMBER( bullet_state::exdsk_w ) */ // drive select - wd17xx_set_drive(m_fdc, data & 0x03); + m_floppy = NULL; - // side select - wd17xx_set_side(m_fdc, BIT(data, 4)); + switch (data & 0x07) + { + // 5.25" + case 0: m_floppy = m_floppy0->get_device(); break; + case 1: m_floppy = m_floppy1->get_device(); break; + case 2: m_floppy = m_floppy2->get_device(); break; + case 3: m_floppy = m_floppy3->get_device(); break; + // 8" + case 4: m_floppy = m_floppy4->get_device(); break; + case 5: m_floppy = m_floppy5->get_device(); break; + case 6: m_floppy = m_floppy6->get_device(); break; + case 7: m_floppy = m_floppy7->get_device(); break; + } - // floppy motor - floppy_mon_w(m_floppy0, BIT(data, 5)); - floppy_mon_w(m_floppy1, BIT(data, 5)); - floppy_drive_set_ready_state(m_floppy0, 1, 1); - floppy_drive_set_ready_state(m_floppy1, 1, 1); + m_fdc->set_floppy(m_floppy); + + if (m_floppy) + { + // side select + m_floppy->ss_w(BIT(data, 4)); + + // floppy motor + m_floppy->mon_w(BIT(data, 5)); + } } @@ -272,7 +285,7 @@ WRITE8_MEMBER( bullet_state::hdcon_w ) m_fdc->set_unscaled_clock(BIT(data, 2) ? XTAL_16MHz/16 : XTAL_16MHz/8); // density select - wd17xx_dden_w(m_fdc, BIT(data, 3)); + m_fdc->dden_w(BIT(data, 3)); } @@ -297,16 +310,16 @@ READ8_MEMBER( bullet_state::info_r ) */ - UINT8 data = 0x10; + UINT8 data = 0; // DIP switches data |= ioport("SW1")->read() & 0x0f; - // floppy interrupt - data |= wd17xx_intrq_r(m_fdc) << 6; - - // floppy data request - data |= wd17xx_drq_r(m_fdc) << 7; + // floppy + data |= m_fdc->hld_r() << 4; + data |= m_floppy ? m_floppy->dskchg_r() : 1; + data |= m_fdc->intrq_r() << 6; + data |= m_fdc->drq_r() << 7; return data; } @@ -429,23 +442,42 @@ WRITE8_MEMBER( bulletf_state::xfdc_w ) */ - // floppy drive select - wd17xx_set_drive(m_fdc, data & 0x0f); + // drive select + m_floppy = NULL; - // floppy side select - wd17xx_set_side(m_fdc, BIT(data, 4)); + switch (data & 0x0f) + { + // 5.25" + case 0: m_floppy = m_floppy0->get_device(); break; + case 1: m_floppy = m_floppy1->get_device(); break; + case 2: m_floppy = m_floppy2->get_device(); break; + case 3: m_floppy = m_floppy3->get_device(); break; + // 8" + case 4: m_floppy = m_floppy4->get_device(); break; + case 5: m_floppy = m_floppy5->get_device(); break; + case 6: m_floppy = m_floppy6->get_device(); break; + case 7: m_floppy = m_floppy7->get_device(); break; + // 3.5" + case 8: m_floppy = m_floppy8->get_device(); break; + case 9: m_floppy = m_floppy9->get_device(); break; + } - // floppy motor - floppy_mon_w(m_floppy0, BIT(data, 5)); - floppy_mon_w(m_floppy1, BIT(data, 5)); - floppy_drive_set_ready_state(m_floppy0, BIT(data, 5), 1); - floppy_drive_set_ready_state(m_floppy1, BIT(data, 5), 1); + m_fdc->set_floppy(m_floppy); + + if (m_floppy) + { + // side select + m_floppy->ss_w(BIT(data, 4)); + + // floppy motor + m_floppy->mon_w(BIT(data, 5)); + } // FDC clock m_fdc->set_unscaled_clock(BIT(data, 6) ? XTAL_16MHz/16 : XTAL_16MHz/8); // density select - wd17xx_dden_w(m_fdc, BIT(data, 7)); + m_fdc->dden_w(BIT(data, 7)); } @@ -527,7 +559,7 @@ READ8_MEMBER( bulletf_state::hwsts_r ) */ - UINT8 data = 0x10; + UINT8 data = 0; // centronics busy data |= m_centronics->busy_r(); @@ -535,11 +567,12 @@ READ8_MEMBER( bulletf_state::hwsts_r ) // DIP switches data |= ioport("SW1")->read() & 0x06; - // floppy interrupt - data |= wd17xx_intrq_r(m_fdc) << 6; - - // floppy data request - data |= wd17xx_drq_r(m_fdc) << 7; + // floppy + data |= (m_floppy ? m_floppy->twosid_r() : 1) << 3; + data |= m_fdc->hld_r() << 4; + data |= (m_floppy ? m_floppy->dskchg_r() : 1) << 5; + data |= m_fdc->intrq_r() << 6; + data |= m_fdc->drq_r() << 7; return data; } @@ -569,7 +602,7 @@ static ADDRESS_MAP_START( bullet_io, AS_IO, 8, bullet_state ) AM_RANGE(0x04, 0x07) AM_DEVREADWRITE(Z80PIO_TAG, z80pio_device, read, write) AM_RANGE(0x08, 0x0b) AM_DEVREADWRITE(Z80CTC_TAG, z80ctc_device, read, write) AM_RANGE(0x0c, 0x0c) AM_MIRROR(0x03) AM_READWRITE(win_r, wstrobe_w) - AM_RANGE(0x10, 0x13) AM_DEVREADWRITE_LEGACY(MB8877_TAG, wd17xx_r, wd17xx_w) + AM_RANGE(0x10, 0x13) AM_DEVREADWRITE(MB8877_TAG, mb8877_t, read, write) AM_RANGE(0x14, 0x14) AM_DEVREADWRITE_LEGACY(Z80DMA_TAG, z80dma_r, z80dma_w) AM_RANGE(0x15, 0x15) AM_READWRITE(brom_r, brom_w) AM_RANGE(0x16, 0x16) AM_WRITE(exdsk_w) @@ -598,7 +631,7 @@ static ADDRESS_MAP_START( bulletf_io, AS_IO, 8, bulletf_state ) AM_RANGE(0x00, 0x03) AM_DEVREADWRITE_LEGACY(Z80DART_TAG, z80dart_ba_cd_r, z80dart_ba_cd_w) AM_RANGE(0x04, 0x07) AM_DEVREADWRITE(Z80PIO_TAG, z80pio_device, read, write) AM_RANGE(0x08, 0x0b) AM_DEVREADWRITE(Z80CTC_TAG, z80ctc_device, read, write) - AM_RANGE(0x10, 0x13) AM_DEVREADWRITE_LEGACY(MB8877_TAG, wd17xx_r, wd17xx_w) + AM_RANGE(0x10, 0x13) AM_DEVREADWRITE(MB8877_TAG, mb8877_t, read, write) AM_RANGE(0x14, 0x14) AM_WRITE(xdma0_w) AM_RANGE(0x16, 0x16) AM_WRITE(xfdc_w) AM_RANGE(0x17, 0x17) AM_WRITE(mbank_w) @@ -631,8 +664,11 @@ INPUT_PORTS_START( bullet ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:4") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x08, DEF_STR( On ) ) - PORT_DIPNAME( 0xf0, 0xf0, "Floppy Type" ) PORT_DIPLOCATION("SW1:5,6,7,8") - // TODO + PORT_DIPNAME( 0xf0, 0x50, "Floppy Type" ) PORT_DIPLOCATION("SW1:5,6,7,8") + PORT_DIPSETTING( 0xf0, "5.25\" SD" ) + PORT_DIPSETTING( 0x50, "5.25\" DD" ) + PORT_DIPSETTING( 0x60, "8\" SD" ) + PORT_DIPSETTING( 0x00, "8\" DD" ) INPUT_PORTS_END @@ -657,7 +693,7 @@ INPUT_PORTS_START( bulletf ) PORT_DIPNAME( 0xf0, 0xc0, "Floppy Type" ) PORT_DIPLOCATION("SW1:5,6,7,8") PORT_DIPSETTING( 0x10, "3\" DD" ) PORT_DIPSETTING( 0xc0, "5.25\" SD" ) - PORT_DIPSETTING( 0x40, "3\" DD" ) + PORT_DIPSETTING( 0x40, "5.25\" DD" ) PORT_DIPSETTING( 0xa0, "8\" SD" ) PORT_DIPSETTING( 0x20, "8\" DD" ) INPUT_PORTS_END @@ -686,15 +722,14 @@ TIMER_DEVICE_CALLBACK_MEMBER(bullet_state::ctc_tick) WRITE_LINE_MEMBER(bullet_state::dart_rxtxca_w) { - device_t *device = machine().device(Z80DART_TAG); - z80dart_txca_w(device, state); - z80dart_rxca_w(device, state); + z80dart_txca_w(m_dart, state); + z80dart_rxca_w(m_dart, state); } static Z80CTC_INTERFACE( ctc_intf ) { DEVCB_CPU_INPUT_LINE(Z80_TAG, INPUT_LINE_IRQ0), // interrupt handler - DEVCB_DRIVER_LINE_MEMBER(bullet_state,dart_rxtxca_w), // ZC/TO0 callback + DEVCB_DRIVER_LINE_MEMBER(bullet_state, dart_rxtxca_w), // ZC/TO0 callback DEVCB_DEVICE_LINE(Z80DART_TAG, z80dart_rxtxcb_w), // ZC/TO1 callback DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF, z80ctc_device, trg3) // ZC/TO2 callback }; @@ -980,46 +1015,36 @@ static Z80PIO_INTERFACE( bulletf_pio_intf ) // wd17xx_interface fdc_intf //------------------------------------------------- -WRITE_LINE_MEMBER( bullet_state::fdrdy_w ) +static SLOT_INTERFACE_START( bullet_525_floppies ) + SLOT_INTERFACE( "525sd", FLOPPY_525_SD ) + SLOT_INTERFACE( "525dd", FLOPPY_525_DD ) + SLOT_INTERFACE( "525qd", FLOPPY_525_QD ) +SLOT_INTERFACE_END + +static SLOT_INTERFACE_START( bullet_8_floppies ) + SLOT_INTERFACE( "8dssd", FLOPPY_8_DSSD ) + SLOT_INTERFACE( "8dsdd", FLOPPY_8_DSDD ) +SLOT_INTERFACE_END + +static SLOT_INTERFACE_START( bullet_35_floppies ) + SLOT_INTERFACE( "35dd", FLOPPY_35_DD ) +SLOT_INTERFACE_END +void bullet_state::fdc_intrq_w(bool state) +{ + z80dart_dcda_w(m_dart, state); +} + +void bulletf_state::fdc_intrq_w(bool state) +{ + z80dart_rib_w(m_dart, state); +} + +void bullet_state::fdc_drq_w(bool state) { m_fdrdy = !state; update_dma_rdy(); } -static const floppy_interface bullet_floppy_interface = -{ - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - FLOPPY_STANDARD_5_25_DSDD, - LEGACY_FLOPPY_OPTIONS_NAME(default), - "floppy_5_25", - NULL -}; - -static const wd17xx_interface fdc_intf = -{ - DEVCB_NULL, - DEVCB_DEVICE_LINE(Z80DART_TAG, z80dart_dcda_w), - DEVCB_DRIVER_LINE_MEMBER(bullet_state, fdrdy_w), - { FLOPPY_0, FLOPPY_1, NULL, NULL } -}; - - -//------------------------------------------------- -// wd17xx_interface bulletf_fdc_intf -//------------------------------------------------- - -static const wd17xx_interface bulletf_fdc_intf = -{ - DEVCB_NULL, - DEVCB_DEVICE_LINE(Z80DART_TAG, z80dart_rib_w), - DEVCB_DRIVER_LINE_MEMBER(bullet_state, fdrdy_w), - { FLOPPY_0, FLOPPY_1, NULL, NULL } -}; - WRITE_LINE_MEMBER( bulletf_state::req_w ) { if (!state) @@ -1034,6 +1059,10 @@ WRITE_LINE_MEMBER( bulletf_state::req_w ) } +//------------------------------------------------- +// serial_terminal_interface terminal_intf +//------------------------------------------------- + static serial_terminal_interface terminal_intf = { DEVCB_NULL @@ -1065,6 +1094,10 @@ static const z80_daisy_config daisy_chain[] = void bullet_state::machine_start() { + // floppy callbacks + m_fdc->setup_intrq_cb(mb8877_t::line_cb(FUNC(bullet_state::fdc_intrq_w), this)); + m_fdc->setup_drq_cb(mb8877_t::line_cb(FUNC(bullet_state::fdc_drq_w), this)); + // state saving save_item(NAME(m_segst)); save_item(NAME(m_brom)); @@ -1085,6 +1118,10 @@ void bullet_state::machine_start() void bulletf_state::machine_start() { + // floppy callbacks + m_fdc->setup_intrq_cb(mb8877_t::line_cb(FUNC(bulletf_state::fdc_intrq_w), this)); + m_fdc->setup_drq_cb(mb8877_t::line_cb(FUNC(bulletf_state::fdc_drq_w), this)); + // state saving save_item(NAME(m_fdrdy)); save_item(NAME(m_rome)); @@ -1151,8 +1188,15 @@ static MACHINE_CONFIG_START( bullet, bullet_state ) MCFG_Z80DART_ADD(Z80DART_TAG, XTAL_16MHz/4, dart_intf) MCFG_Z80DMA_ADD(Z80DMA_TAG, XTAL_16MHz/4, dma_intf) MCFG_Z80PIO_ADD(Z80PIO_TAG, XTAL_16MHz/4, pio_intf) - MCFG_MB8877_ADD(MB8877_TAG, fdc_intf) - MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bullet_floppy_interface) + MCFG_MB8877x_ADD(MB8877_TAG, XTAL_16MHz/8) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":0", bullet_525_floppies, "525qd", NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":1", bullet_525_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":2", bullet_525_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":3", bullet_525_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":4", bullet_8_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":5", bullet_8_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":6", bullet_8_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":7", bullet_8_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, standard_centronics) MCFG_SERIAL_TERMINAL_ADD(TERMINAL_TAG, terminal_intf, 4800) @@ -1182,8 +1226,17 @@ static MACHINE_CONFIG_START( bulletf, bulletf_state ) MCFG_Z80DART_ADD(Z80DART_TAG, XTAL_16MHz/4, dart_intf) MCFG_Z80DMA_ADD(Z80DMA_TAG, XTAL_16MHz/4, dma_intf) MCFG_Z80PIO_ADD(Z80PIO_TAG, XTAL_16MHz/4, bulletf_pio_intf) - MCFG_MB8877_ADD(MB8877_TAG, bulletf_fdc_intf) - MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bullet_floppy_interface) + MCFG_MB8877x_ADD(MB8877_TAG, XTAL_16MHz/8) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":0", bullet_525_floppies, "525qd", NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":1", bullet_525_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":2", bullet_525_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":3", bullet_525_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":4", bullet_8_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":5", bullet_8_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":6", bullet_8_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":7", bullet_8_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":8", bullet_35_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":9", bullet_35_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, standard_centronics) MCFG_SERIAL_TERMINAL_ADD(TERMINAL_TAG, terminal_intf, 4800) @@ -1226,5 +1279,5 @@ ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS // the setname 'bullet' is used by Sega's Bullet in MAME. -COMP( 1982, wmbullet, 0, 0, bullet, bullet, driver_device, 0, "Wave Mate", "Bullet", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) +COMP( 1982, wmbullet, 0, 0, bullet, bullet, driver_device, 0, "Wave Mate", "Bullet", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) COMP( 1984, wmbulletf, wmbullet, 0, bulletf, bulletf, driver_device, 0, "Wave Mate", "Bullet (Revision F)", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) diff --git a/src/mess/includes/bullet.h b/src/mess/includes/bullet.h index 5e4431bbd41..e5d3e77aa1b 100644 --- a/src/mess/includes/bullet.h +++ b/src/mess/includes/bullet.h @@ -6,12 +6,13 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "imagedev/flopdrv.h" #include "machine/ctronics.h" #include "machine/ram.h" +#include "machine/scsibus.h" #include "machine/scsicb.h" +#include "machine/scsihd.h" #include "machine/terminal.h" -#include "machine/wd17xx.h" +#include "machine/wd_fdc.h" #include "machine/z80ctc.h" #include "machine/z80dart.h" #include "machine/z80dma.h" @@ -37,8 +38,15 @@ public: m_dmac(*this, Z80DMA_TAG), m_fdc(*this, MB8877_TAG), m_ram(*this, RAM_TAG), - m_floppy0(*this, FLOPPY_0), - m_floppy1(*this, FLOPPY_1), + m_floppy0(*this, MB8877_TAG":0"), + m_floppy1(*this, MB8877_TAG":1"), + m_floppy2(*this, MB8877_TAG":2"), + m_floppy3(*this, MB8877_TAG":3"), + m_floppy4(*this, MB8877_TAG":4"), + m_floppy5(*this, MB8877_TAG":5"), + m_floppy6(*this, MB8877_TAG":6"), + m_floppy7(*this, MB8877_TAG":7"), + m_floppy(NULL), m_terminal(*this, TERMINAL_TAG), m_centronics(*this, CENTRONICS_TAG), m_fdrdy(0) @@ -48,10 +56,17 @@ public: required_device m_ctc; required_device m_dart; required_device m_dmac; - required_device m_fdc; + required_device m_fdc; required_device m_ram; - required_device m_floppy0; - required_device m_floppy1; + required_device m_floppy0; + required_device m_floppy1; + required_device m_floppy2; + required_device m_floppy3; + required_device m_floppy4; + required_device m_floppy5; + required_device m_floppy6; + required_device m_floppy7; + floppy_image_device *m_floppy; required_device m_terminal; required_device m_centronics; @@ -75,7 +90,9 @@ public: DECLARE_READ8_MEMBER( pio_pb_r ); DECLARE_WRITE_LINE_MEMBER( dartardy_w ); DECLARE_WRITE_LINE_MEMBER( dartbrdy_w ); - DECLARE_WRITE_LINE_MEMBER( fdrdy_w ); + + void fdc_intrq_w(bool state); + void fdc_drq_w(bool state); void bankswitch(); void update_dma_rdy(); @@ -87,12 +104,13 @@ public: // DMA state UINT8 m_exdma; int m_buf; - int m_fdrdy; + bool m_fdrdy; int m_dartardy; int m_dartbrdy; int m_winrdy; int m_exrdy1; int m_exrdy2; + TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick); DECLARE_WRITE_LINE_MEMBER(dart_rxtxca_w); }; @@ -102,9 +120,13 @@ class bulletf_state : public bullet_state public: bulletf_state(const machine_config &mconfig, device_type type, const char *tag) : bullet_state(mconfig, type, tag), + m_floppy8(*this, MB8877_TAG":8"), + m_floppy9(*this, MB8877_TAG":9"), m_scsibus(*this, SCSIBUS_TAG ":host") { } + required_device m_floppy8; + required_device m_floppy9; required_device m_scsibus; virtual void machine_start(); @@ -126,6 +148,8 @@ public: DECLARE_WRITE_LINE_MEMBER( cstrb_w ); DECLARE_WRITE_LINE_MEMBER( req_w ); + void fdc_intrq_w(bool state); + void update_dma_rdy(); int m_rome;