From 569bd731382efbc065f87280178590c900ac7e0c Mon Sep 17 00:00:00 2001 From: Robbbert Date: Thu, 5 Feb 2015 22:33:07 +1100 Subject: [PATCH] (MESS) kaypro: kayproii, kaypro4, omni2 can boot from floppy, marked as working. Kaypro4p88 and kaypro10 can also boot from floppy but have other issues. --- src/mess/drivers/kaypro.c | 42 ++++++++++++++----------------------- src/mess/includes/kaypro.h | 38 +++++++++++++++------------------ src/mess/machine/kaypro.c | 43 ++++++++++++++++++++++++-------------- 3 files changed, 60 insertions(+), 63 deletions(-) diff --git a/src/mess/drivers/kaypro.c b/src/mess/drivers/kaypro.c index 07ce92875f4..b763bd583e0 100644 --- a/src/mess/drivers/kaypro.c +++ b/src/mess/drivers/kaypro.c @@ -9,14 +9,15 @@ telephone cord, complete with modular plug on each end. The keyboard carries its own Intel 87C51 processor and is an intelligent device. - Things that need doing: + ToDo: - See about getting keyboard to work as a serial device. - Need dump of 87C51 cpu in the keyboard. - - Only kayproii boots up, the remainder have floppy-disk problems. - - - The DSK format needs to be supported. It is commented out until the code gets written. + - Kaypro 2x, 4a: floppy not working "No operating system present on this disk" + - Kaypro 10: Boots from floppy, but B drive not working "Bdos Err on B: Bad Sector" + - Kaypro 4p88: works as a normal Kaypro 4, extra hardware not done + - Kaypro Robie: has twin 2.6MB 5.25 floppy drives which we don't support, no software available - Hard Disk not emulated. The controller is a WD1002 (original version, for Winchester drives). @@ -162,16 +163,9 @@ static const z80_daisy_config kaypro2x_daisy_chain[] = ************************************************************/ -//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 - static SLOT_INTERFACE_START( kaypro_floppies ) - SLOT_INTERFACE( "525dd", FLOPPY_525_DD ) + SLOT_INTERFACE( "drive0", FLOPPY_525_DD ) + SLOT_INTERFACE( "drive1", FLOPPY_525_DD ) SLOT_INTERFACE_END @@ -180,7 +174,7 @@ static MACHINE_CONFIG_START( kayproii, kaypro_state ) 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 */ + MCFG_CPU_VBLANK_INT_DRIVER("screen", kaypro_state, kay_kbd_interrupt) /* this doesn't actually exist, it is to run the keyboard */ MCFG_CPU_CONFIG(kayproii_daisy_chain) MCFG_MACHINE_START_OVERRIDE(kaypro_state, kayproii ) @@ -230,10 +224,8 @@ static MACHINE_CONFIG_START( kayproii, kaypro_state ) MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(kaypro_state, fdc_intrq_w)) MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(kaypro_state, fdc_drq_w)) MCFG_WD_FDC_FORCE_READY - //MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525dd", kaypro_state::kayproii_floppy_formats) - //MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "525dd", kaypro_state::kayproii_floppy_formats) - 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_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "drive0", floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "drive1", floppy_image_device::default_floppy_formats) MCFG_SOFTWARE_LIST_ADD("flop_list","kayproii") MACHINE_CONFIG_END @@ -250,7 +242,7 @@ static MACHINE_CONFIG_START( kaypro2x, kaypro_state ) 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) + MCFG_CPU_VBLANK_INT_DRIVER("screen", kaypro_state, kay_kbd_interrupt) MCFG_CPU_CONFIG(kaypro2x_daisy_chain) MCFG_MACHINE_RESET_OVERRIDE(kaypro_state, kaypro ) @@ -266,7 +258,7 @@ static MACHINE_CONFIG_START( kaypro2x, kaypro_state ) MCFG_GFXDECODE_ADD("gfxdecode", "palette", kaypro2x) MCFG_PALETTE_ADD("palette", 3) - MCFG_PALETTE_INIT_OWNER(kaypro_state,kaypro) + MCFG_PALETTE_INIT_OWNER(kaypro_state, kaypro) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -295,10 +287,8 @@ static MACHINE_CONFIG_START( kaypro2x, kaypro_state ) MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(kaypro_state, fdc_intrq_w)) MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(kaypro_state, fdc_drq_w)) MCFG_WD_FDC_FORCE_READY - //MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525dd", kaypro_state::kaypro2x_floppy_formats) - //MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "525dd", kaypro_state::kaypro2x_floppy_formats) - 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_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "drive0", floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "drive1", floppy_image_device::default_floppy_formats) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( omni2, kaypro4 ) @@ -431,9 +421,9 @@ ROM_END /* 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" , GAME_NOT_WORKING ) // model 81-004 +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" , GAME_NOT_WORKING ) +COMP( 198?, omni2, kayproii, 0, omni2, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Omni II Logic Analyzer" , 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 diff --git a/src/mess/includes/kaypro.h b/src/mess/includes/kaypro.h index f48df61d460..8e4d441a4e2 100644 --- a/src/mess/includes/kaypro.h +++ b/src/mess/includes/kaypro.h @@ -21,19 +21,19 @@ 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, "fdc"), - m_floppy0(*this, "fdc:0"), - m_floppy1(*this, "fdc:1"), - m_crtc(*this, "crtc"), - m_beep(*this, "beeper"), - m_palette(*this, "palette") + : driver_device(mconfig, type, tag) + , m_palette(*this, "palette") + , 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") {} DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); @@ -59,13 +59,10 @@ public: DECLARE_PALETTE_INIT(kaypro); DECLARE_MACHINE_RESET(kay_kbd); DECLARE_DRIVER_INIT(kaypro); - DECLARE_FLOPPY_FORMATS(kayproii_floppy_formats); - DECLARE_FLOPPY_FORMATS(kaypro2x_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); INTERRUPT_GEN_MEMBER(kay_kbd_interrupt); - DECLARE_WRITE_LINE_MEMBER(kaypro_interrupt); DECLARE_READ8_MEMBER(kaypro_sio_r); DECLARE_WRITE8_MEMBER(kaypro_sio_w); MC6845_UPDATE_ROW(kaypro2x_update_row); @@ -78,16 +75,17 @@ public: UINT8 *m_p_videoram; kay_kbd_t *m_kbd; int m_centronics_busy; - -protected: - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + required_device m_palette; private: + bool m_is_motor_off; + UINT8 m_fdc_rq; UINT8 m_system_port; UINT16 m_mc6845_video_address; floppy_image_device *m_floppy; void mc6845_cursor_configure(); void mc6845_screen_configure(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); required_device m_maincpu; optional_device m_pio_g; optional_device m_pio_s; @@ -99,8 +97,6 @@ private: required_device m_floppy1; optional_device m_crtc; required_device m_beep; -public: - required_device m_palette; }; diff --git a/src/mess/machine/kaypro.c b/src/mess/machine/kaypro.c index b427d37ff6a..a0d708fd3b7 100644 --- a/src/mess/machine/kaypro.c +++ b/src/mess/machine/kaypro.c @@ -13,11 +13,6 @@ ************************************************************/ -WRITE_LINE_MEMBER(kaypro_state::kaypro_interrupt) -{ - m_maincpu->set_input_line(0, state); -} - WRITE_LINE_MEMBER( kaypro_state::write_centronics_busy ) { m_centronics_busy = state; @@ -48,6 +43,7 @@ WRITE8_MEMBER( kaypro_state::kayproii_pio_system_w ) membank("bankr0")->set_entry(BIT(data, 7)); membank("bank3")->set_entry(BIT(data, 7)); + m_is_motor_off = BIT(data, 6); m_floppy = NULL; if (BIT(data, 0)) @@ -62,6 +58,7 @@ WRITE8_MEMBER( kaypro_state::kayproii_pio_system_w ) if (m_floppy) { m_floppy->mon_w(BIT(data, 6)); // motor on + m_floppy->ss_w(!BIT(data, 2)); // signal exists even though drives are single sided } output_set_value("ledA", BIT(data, 0)); /* LEDs in artwork */ @@ -107,6 +104,7 @@ WRITE8_MEMBER( kaypro_state::kaypro2x_system_port_w ) membank("bankr0")->set_entry(BIT(data, 7)); membank("bank3")->set_entry(BIT(data, 7)); + m_is_motor_off = !BIT(data, 4); m_floppy = NULL; if (!BIT(data, 0)) @@ -116,7 +114,7 @@ WRITE8_MEMBER( kaypro_state::kaypro2x_system_port_w ) m_floppy = m_floppy1->get_device(); m_fdc->set_floppy(m_floppy); - //m_fdc->dden_w(BIT(data, 5)); // not connected + m_fdc->dden_w(BIT(data, 5)); // not connected if (m_floppy) { @@ -195,11 +193,29 @@ WRITE8_MEMBER(kaypro_state::kaypro_sio_w) void kaypro_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { + bool halt; switch (id) { case TIMER_FLOPPY: - if (m_maincpu->state_int(Z80_HALT)) + halt = (bool)m_maincpu->state_int(Z80_HALT); + if (m_is_motor_off) + { + timer_set(attotime::from_hz(10), TIMER_FLOPPY); + break; + } + if ((halt) && (m_fdc_rq & 3) && (m_fdc_rq < 0x80)) + { m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); + m_fdc_rq |= 0x80; + } + else + if ((m_fdc_rq == 0x80) || ((!halt) && BIT(m_fdc_rq, 7))) + { + m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); + m_fdc_rq &= 0x7f; + } + timer_set(attotime::from_hz(1e5), TIMER_FLOPPY); + break; default: assert_always(FALSE, "Unknown id in kaypro_state::device_timer"); @@ -208,19 +224,12 @@ void kaypro_state::device_timer(emu_timer &timer, device_timer_id id, int param, WRITE_LINE_MEMBER( kaypro_state::fdc_intrq_w ) { - if (state) - timer_set(attotime::zero, TIMER_FLOPPY); - else - m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); + m_fdc_rq = (m_fdc_rq & 0x82) | state; } WRITE_LINE_MEMBER( kaypro_state::fdc_drq_w ) { - if (state) - timer_set(attotime::zero, TIMER_FLOPPY); - else - m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); - + m_fdc_rq = (m_fdc_rq & 0x81) | (state << 1); } @@ -241,7 +250,9 @@ MACHINE_RESET_MEMBER( kaypro_state,kaypro ) membank("bankw0")->set_entry(0); // always write to ram membank("bank3")->set_entry(1); // point at video ram m_system_port = 0x80; + m_fdc_rq = 0; m_maincpu->reset(); + timer_set(attotime::from_hz(1), TIMER_FLOPPY); /* timer for rtc */ }