From 0ef85ce1f42d03826024165735ab1fc27ab0f59c Mon Sep 17 00:00:00 2001 From: Robbbert Date: Sun, 28 Jul 2013 10:46:38 +0000 Subject: [PATCH] (MESS) Kaypro : modernised floppy disk system (still doesn't work). This enables removal of yesterday's patch. --- src/mess/drivers/kaypro.c | 57 +++++++++++++++++-------- src/mess/includes/kaypro.h | 86 +++++++++++++++++++++----------------- src/mess/machine/kaypro.c | 64 ++++++++++++++-------------- 3 files changed, 118 insertions(+), 89 deletions(-) diff --git a/src/mess/drivers/kaypro.c b/src/mess/drivers/kaypro.c index 37f9ec3d354..43e40380e61 100644 --- a/src/mess/drivers/kaypro.c +++ b/src/mess/drivers/kaypro.c @@ -53,7 +53,7 @@ static ADDRESS_MAP_START( kayproii_io, AS_IO, 8, kaypro_state ) AM_RANGE(0x04, 0x07) AM_READWRITE(kaypro_sio_r, kaypro_sio_w) AM_RANGE(0x08, 0x0b) AM_DEVREADWRITE("z80pio_g", z80pio_device, read_alt, write_alt) AM_RANGE(0x0c, 0x0f) AM_DEVWRITE("brg", com8116_device, str_w) - AM_RANGE(0x10, 0x13) AM_DEVREADWRITE_LEGACY("wd1793", wd17xx_r, wd17xx_w) + AM_RANGE(0x10, 0x13) AM_DEVREADWRITE("fdc", fd1793_t, read, write) AM_RANGE(0x1c, 0x1f) AM_DEVREADWRITE("z80pio_s", z80pio_device, read_alt, write_alt) ADDRESS_MAP_END @@ -64,7 +64,7 @@ static ADDRESS_MAP_START( kaypro2x_io, AS_IO, 8, kaypro_state ) AM_RANGE(0x04, 0x07) AM_READWRITE(kaypro_sio_r, kaypro_sio_w) AM_RANGE(0x08, 0x0b) AM_DEVWRITE("brg", com8116_device, stt_w) AM_RANGE(0x0c, 0x0f) AM_DEVREADWRITE("z80sio_2x", z80sio_device, read, write) - AM_RANGE(0x10, 0x13) AM_DEVREADWRITE_LEGACY("wd1793", wd17xx_r, wd17xx_w) + AM_RANGE(0x10, 0x13) AM_DEVREADWRITE("fdc", fd1793_t, read, write) AM_RANGE(0x14, 0x17) AM_READWRITE(kaypro2x_system_port_r,kaypro2x_system_port_w) AM_RANGE(0x18, 0x1b) AM_DEVWRITE("centronics", centronics_device, write) AM_RANGE(0x1c, 0x1c) AM_READWRITE(kaypro2x_status_r,kaypro2x_index_w) @@ -176,6 +176,7 @@ static MC6845_INTERFACE( kaypro2x_crtc ) Machine Driver ************************************************************/ +#if 0 static LEGACY_FLOPPY_OPTIONS_START(kayproii) LEGACY_FLOPPY_OPTION(kayproii, "dsk", "Kaypro II disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, HEADS([1]) @@ -220,9 +221,23 @@ static const floppy_interface kaypro2x_floppy_interface = NULL }; +FLOPPY_FORMATS_MEMBER( kaypro_state::kayproii_floppy_formats ) + FLOPPY_KAYPROII_FORMAT +FLOPPY_FORMATS_END + +FLOPPY_FORMATS_MEMBER( kaypro_state::kaypro2x_floppy_formats ) + FLOPPY_KAYPRO2X_FORMAT +FLOPPY_FORMATS_END +#endif + +static SLOT_INTERFACE_START( kaypro_floppies ) + SLOT_INTERFACE( "525dd", FLOPPY_525_DD ) +SLOT_INTERFACE_END + + static MACHINE_CONFIG_START( kayproii, kaypro_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80, XTAL_2_5MHz) + MCFG_CPU_ADD("maincpu", Z80, XTAL_20MHz / 8) MCFG_CPU_PROGRAM_MAP(kaypro_map) MCFG_CPU_IO_MAP(kayproii_io) MCFG_CPU_VBLANK_INT_DRIVER("screen", kaypro_state, kay_kbd_interrupt) /* this doesn't actually exist, it is to run the keyboard */ @@ -250,14 +265,15 @@ static MACHINE_CONFIG_START( kayproii, kaypro_state ) /* devices */ MCFG_QUICKLOAD_ADD("quickload", kaypro_state, kayproii, "com,cpm", 3) - MCFG_FD1793_ADD("wd1793", kaypro_wd1793_interface ) MCFG_CENTRONICS_PRINTER_ADD("centronics", standard_centronics) MCFG_COM8116_ADD("brg", XTAL_5_0688MHz, NULL, NULL, NULL) // WD1943, SMC8116 MCFG_Z80PIO_ADD( "z80pio_g", 2500000, kayproii_pio_g_intf ) MCFG_Z80PIO_ADD( "z80pio_s", 2500000, kayproii_pio_s_intf ) MCFG_Z80SIO_ADD( "z80sio", 4800, kaypro_sio_intf ) /* start at 300 baud */ - MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(kayproii_floppy_interface) + MCFG_FD1793x_ADD("fdc", XTAL_20MHz / 20) + MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats) MCFG_SOFTWARE_LIST_ADD("flop_list","kayproii") MACHINE_CONFIG_END @@ -268,7 +284,7 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_START( kaypro2x, kaypro_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80, XTAL_4MHz) + MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz / 4) MCFG_CPU_PROGRAM_MAP(kaypro_map) MCFG_CPU_IO_MAP(kaypro2x_io) MCFG_CPU_VBLANK_INT_DRIVER("screen", kaypro_state, kay_kbd_interrupt) @@ -296,13 +312,13 @@ static MACHINE_CONFIG_START( kaypro2x, kaypro_state ) /* devices */ MCFG_MC6845_ADD("crtc", MC6845, "screen", 2000000, kaypro2x_crtc) /* comes out of ULA - needs to be measured */ MCFG_QUICKLOAD_ADD("quickload", kaypro_state, kaypro2x, "com,cpm", 3) - MCFG_FD1793_ADD("wd1793", kaypro_wd1793_interface ) MCFG_CENTRONICS_PRINTER_ADD("centronics", standard_centronics) MCFG_COM8116_ADD("brg", XTAL_5_0688MHz, NULL, NULL, NULL) // WD1943, SMC8116 MCFG_Z80SIO_ADD( "z80sio", 4800, kaypro_sio_intf ) MCFG_Z80SIO_ADD( "z80sio_2x", 4800, kaypro_sio_intf ) /* extra sio for modem and printer */ - - MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(kaypro2x_floppy_interface) + MCFG_FD1793x_ADD("fdc", XTAL_16MHz / 16) + MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( omni2, kaypro4 ) @@ -310,6 +326,13 @@ static MACHINE_CONFIG_DERIVED( omni2, kaypro4 ) MCFG_SCREEN_UPDATE_DRIVER(kaypro_state, screen_update_omni2) MACHINE_CONFIG_END +DRIVER_INIT_MEMBER( kaypro_state, kaypro ) +{ + m_fdc->setup_intrq_cb(fd1793_t::line_cb(FUNC(kaypro_state::fdc_intrq_w), this)); + m_fdc->setup_drq_cb(fd1793_t::line_cb(FUNC(kaypro_state::fdc_drq_w), this)); +} + + /*********************************************************** Game driver @@ -399,12 +422,12 @@ ROM_START(kaypro10) ROM_LOAD("81-817.u31", 0x0000, 0x1000, CRC(5f72da5b) SHA1(8a597000cce1a7e184abfb7bebcb564c6bf24fb7) ) ROM_END -/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ -COMP( 1982, kayproii, 0, 0, kayproii, kay_kbd, driver_device, 0, "Non Linear Systems", "Kaypro II - 2/83" , 0 ) -COMP( 1983, kaypro4, kayproii, 0, kaypro4, kay_kbd, driver_device, 0, "Non Linear Systems", "Kaypro 4 - 4/83" , 0 ) // model 81-004 -COMP( 1983, kaypro4p88, kayproii, 0, kaypro4, kay_kbd, driver_device, 0, "Non Linear Systems", "Kaypro 4 plus88 - 4/83" , GAME_NOT_WORKING ) // model 81-004 with an added 8088 daughterboard and rom -COMP( 198?, omni2, kayproii, 0, omni2, kay_kbd, driver_device, 0, "Non Linear Systems", "Omni II" , 0 ) -COMP( 1984, kaypro2x, 0, 0, kaypro2x, kay_kbd, driver_device, 0, "Non Linear Systems", "Kaypro 2x" , GAME_NOT_WORKING ) // model 81-025 -COMP( 1984, kaypro4a, kaypro2x, 0, kaypro2x, kay_kbd, driver_device, 0, "Non Linear Systems", "Kaypro 4 - 4/84" , GAME_NOT_WORKING ) // model 81-015 +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */ +COMP( 1982, kayproii, 0, 0, kayproii, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Kaypro II - 2/83" , 0 ) +COMP( 1983, kaypro4, kayproii, 0, kaypro4, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Kaypro 4 - 4/83" , 0 ) // model 81-004 +COMP( 1983, kaypro4p88, kayproii, 0, kaypro4, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Kaypro 4 plus88 - 4/83" , GAME_NOT_WORKING ) // model 81-004 with an added 8088 daughterboard and rom +COMP( 198?, omni2, kayproii, 0, omni2, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Omni II" , 0 ) +COMP( 1984, kaypro2x, 0, 0, kaypro2x, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Kaypro 2x" , GAME_NOT_WORKING ) // model 81-025 +COMP( 1984, kaypro4a, kaypro2x, 0, kaypro2x, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Kaypro 4 - 4/84" , GAME_NOT_WORKING ) // model 81-015 // Kaypro 4/84 plus 88 goes here, model 81-015 with an added 8088 daughterboard and rom -COMP( 1983, kaypro10, 0, 0, kaypro2x, kay_kbd, driver_device, 0, "Non Linear Systems", "Kaypro 10" , GAME_NOT_WORKING ) // model 81-005 +COMP( 1983, kaypro10, 0, 0, kaypro2x, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Kaypro 10" , GAME_NOT_WORKING ) // model 81-005 diff --git a/src/mess/includes/kaypro.h b/src/mess/includes/kaypro.h index 81ee4cf4183..13983fb16d5 100644 --- a/src/mess/includes/kaypro.h +++ b/src/mess/includes/kaypro.h @@ -5,12 +5,10 @@ #include "machine/z80sio.h" #include "machine/com8116.h" #include "machine/ctronics.h" -#include "machine/wd17xx.h" -#include "formats/basicdsk.h" #include "imagedev/snapquik.h" -#include "imagedev/flopdrv.h" #include "sound/beep.h" #include "video/mc6845.h" +#include "machine/wd_fdc.h" struct kay_kbd_t; @@ -24,26 +22,20 @@ public: kaypro_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_pio_g(*this, "z80pio_g"), - m_pio_s(*this, "z80pio_s"), - m_sio(*this, "z80sio"), - m_sio2x(*this, "z80sio_2x"), - m_centronics(*this, "centronics"), - m_fdc(*this, "wd1793"), - m_crtc(*this, "crtc"), - m_beep(*this, "beeper"), - m_p_videoram(*this, "p_videoram"){ } + m_p_videoram(*this, "p_videoram"), + m_maincpu(*this, "maincpu"), + m_pio_g(*this, "z80pio_g"), + m_pio_s(*this, "z80pio_s"), + m_sio(*this, "z80sio"), + m_sio2x(*this, "z80sio_2x"), + m_centronics(*this, "centronics"), + m_fdc(*this, "fdc"), + m_floppy0(*this, "fdc:0"), + m_floppy1(*this, "fdc:1"), + m_crtc(*this, "crtc"), + m_beep(*this, "beeper") + {} - required_device m_maincpu; - optional_device m_pio_g; - optional_device m_pio_s; - required_device m_sio; - optional_device m_sio2x; - required_device m_centronics; - required_device m_fdc; - optional_device m_crtc; - required_device m_beep; DECLARE_READ8_MEMBER(kaypro2x_87_r); DECLARE_READ8_MEMBER(kaypro2x_system_port_r); DECLARE_READ8_MEMBER(kaypro2x_status_r); @@ -60,26 +52,14 @@ public: DECLARE_WRITE_LINE_MEMBER(kaypro_fdc_drq_w); DECLARE_READ8_MEMBER(kaypro_videoram_r); DECLARE_WRITE8_MEMBER(kaypro_videoram_w); - const UINT8 *m_p_chargen; - required_shared_ptr m_p_videoram; - UINT8 m_system_port; - UINT8 m_mc6845_cursor[16]; - UINT8 m_mc6845_reg[32]; - UINT8 m_mc6845_ind; - UINT8 m_speed; - UINT8 m_flash; - UINT8 m_framecnt; - UINT16 m_cursor; - UINT16 m_mc6845_video_address; - kay_kbd_t *m_kbd; - void mc6845_cursor_configure(); - void mc6845_screen_configure(); DECLARE_MACHINE_START(kayproii); DECLARE_MACHINE_RESET(kayproii); DECLARE_VIDEO_START(kaypro); DECLARE_MACHINE_RESET(kaypro2x); DECLARE_PALETTE_INIT(kaypro); DECLARE_MACHINE_RESET(kay_kbd); + DECLARE_DRIVER_INIT(kaypro); + DECLARE_FLOPPY_FORMATS(floppy_formats); UINT32 screen_update_kayproii(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_kaypro2x(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); UINT32 screen_update_omni2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -87,11 +67,40 @@ public: DECLARE_WRITE_LINE_MEMBER(kaypro_interrupt); DECLARE_READ8_MEMBER(kaypro_sio_r); DECLARE_WRITE8_MEMBER(kaypro_sio_w); - DECLARE_QUICKLOAD_LOAD_MEMBER(kayproii ); - DECLARE_QUICKLOAD_LOAD_MEMBER(kaypro2x ); + DECLARE_QUICKLOAD_LOAD_MEMBER(kayproii); + DECLARE_QUICKLOAD_LOAD_MEMBER(kaypro2x); + const UINT8 *m_p_chargen; + UINT8 m_mc6845_cursor[16]; + UINT8 m_mc6845_reg[32]; + UINT8 m_mc6845_ind; + UINT8 m_speed; + UINT8 m_flash; + UINT8 m_framecnt; + UINT16 m_cursor; + required_shared_ptr m_p_videoram; protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); +private: + UINT8 m_system_port; + UINT16 m_mc6845_video_address; + kay_kbd_t *m_kbd; + floppy_image_device *m_floppy; + void mc6845_cursor_configure(); + void mc6845_screen_configure(); + void fdc_intrq_w(bool state); + void fdc_drq_w(bool state); + required_device m_maincpu; + optional_device m_pio_g; + optional_device m_pio_s; + required_device m_sio; + optional_device m_sio2x; + required_device m_centronics; + required_device m_fdc; + required_device m_floppy0; + required_device m_floppy1; + optional_device m_crtc; + required_device m_beep; }; @@ -110,7 +119,6 @@ extern const z80pio_interface kayproii_pio_g_intf; extern const z80pio_interface kayproii_pio_s_intf; extern const z80pio_interface kaypro4_pio_s_intf; extern const z80sio_interface kaypro_sio_intf; -extern const wd17xx_interface kaypro_wd1793_interface; /*----------- defined in video/kaypro.c -----------*/ diff --git a/src/mess/machine/kaypro.c b/src/mess/machine/kaypro.c index 5895e4daa9e..79a747a0738 100644 --- a/src/mess/machine/kaypro.c +++ b/src/mess/machine/kaypro.c @@ -60,22 +60,25 @@ WRITE8_MEMBER( kaypro_state::common_pio_system_w ) membank("bank3")->set_base(memregion("rambank")->base()); } - wd17xx_dden_w(m_fdc, BIT(data, 5)); - - m_centronics->strobe_w(BIT(data, 4)); - + m_floppy = NULL; if (BIT(data, 0)) - wd17xx_set_drive(m_fdc, 0); - + m_floppy = m_floppy0->get_device(); + else if (BIT(data, 1)) - wd17xx_set_drive(m_fdc, 1); + m_floppy = m_floppy1->get_device(); + + m_fdc->set_floppy(m_floppy); + m_fdc->dden_w(BIT(data, 5)); + + if (m_floppy) + { + m_floppy->mon_w(BIT(data, 6) ? 0 : 1); // motor on + } output_set_value("ledA", BIT(data, 0)); /* LEDs in artwork */ output_set_value("ledB", BIT(data, 1)); - /* CLEAR_LINE means to turn motors on */ - floppy_mon_w(floppy_get_device(machine(), 0), BIT(data, 6) ? ASSERT_LINE : CLEAR_LINE); - floppy_mon_w(floppy_get_device(machine(), 1), BIT(data, 6) ? ASSERT_LINE : CLEAR_LINE); + m_centronics->strobe_w(BIT(data, 4)); m_system_port = data; } @@ -85,7 +88,7 @@ WRITE8_MEMBER( kaypro_state::kayproii_pio_system_w ) common_pio_system_w(space, offset, data); /* side select */ - wd17xx_set_side(m_fdc, !BIT(data, 2)); + m_floppy->ss_w(!BIT(data, 2)); } WRITE8_MEMBER( kaypro_state::kaypro4_pio_system_w ) @@ -93,7 +96,7 @@ WRITE8_MEMBER( kaypro_state::kaypro4_pio_system_w ) common_pio_system_w(space, offset, data); /* side select */ - wd17xx_set_side(m_fdc, BIT(data, 2)); + m_floppy->ss_w(BIT(data, 2)); } const z80pio_interface kayproii_pio_g_intf = @@ -172,25 +175,26 @@ WRITE8_MEMBER( kaypro_state::kaypro2x_system_port_w ) membank("bank3")->set_base(memregion("rambank")->base()); } - wd17xx_dden_w(m_fdc, BIT(data, 5)); - - m_centronics->strobe_w(BIT(data, 3)); - + m_floppy = NULL; if (BIT(data, 0)) - wd17xx_set_drive(m_fdc, 0); + m_floppy = m_floppy0->get_device(); else if (BIT(data, 1)) - wd17xx_set_drive(m_fdc, 1); + m_floppy = m_floppy1->get_device(); - wd17xx_set_side(m_fdc, BIT(data, 2) ? 0 : 1); + m_fdc->set_floppy(m_floppy); + m_fdc->dden_w(BIT(data, 5)); + + if (m_floppy) + { + m_floppy->mon_w(BIT(data, 6) ? 0 : 1); // motor on + m_floppy->ss_w(BIT(data, 2)); + } output_set_value("ledA", BIT(data, 0)); /* LEDs in artwork */ output_set_value("ledB", BIT(data, 1)); - /* CLEAR_LINE means to turn motors on */ - // commented out because turning the motors on causes an assert... turning them off is ok though?? - //floppy_mon_w(floppy_get_device(machine(), 0), BIT(data, 4) ? CLEAR_LINE : ASSERT_LINE); - //floppy_mon_w(floppy_get_device(machine(), 1), BIT(data, 4) ? CLEAR_LINE : ASSERT_LINE); + m_centronics->strobe_w(BIT(data, 3)); m_system_port = data; } @@ -292,7 +296,8 @@ void kaypro_state::device_timer(emu_timer &timer, device_timer_id id, int param, } } -WRITE_LINE_MEMBER( kaypro_state::kaypro_fdc_intrq_w ) +void kaypro_state::fdc_intrq_w (bool state) +//WRITE_LINE_MEMBER( kaypro_state::kaypro_fdc_intrq_w ) { if (state) timer_set(attotime::from_usec(25), TIMER_FLOPPY); @@ -300,7 +305,8 @@ WRITE_LINE_MEMBER( kaypro_state::kaypro_fdc_intrq_w ) m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); } -WRITE_LINE_MEMBER( kaypro_state::kaypro_fdc_drq_w ) +void kaypro_state::fdc_drq_w (bool state) +//WRITE_LINE_MEMBER( kaypro_state::kaypro_fdc_drq_w ) { if (state) timer_set(attotime::from_usec(25), TIMER_FLOPPY); @@ -309,14 +315,6 @@ WRITE_LINE_MEMBER( kaypro_state::kaypro_fdc_drq_w ) } -const wd17xx_interface kaypro_wd1793_interface = -{ - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(kaypro_state, kaypro_fdc_intrq_w), - DEVCB_DRIVER_LINE_MEMBER(kaypro_state, kaypro_fdc_drq_w), - {FLOPPY_0, FLOPPY_1, NULL, NULL} -}; - /***********************************************************