(MESS) kaypro: kayproii, kaypro4, omni2 can boot from floppy, marked as working.

Kaypro4p88 and kaypro10 can also boot from floppy but have other issues.
This commit is contained in:
Robbbert 2015-02-05 22:33:07 +11:00
parent f9ab852d6d
commit 569bd73138
3 changed files with 60 additions and 63 deletions

View File

@ -9,14 +9,15 @@
telephone cord, complete with modular plug on each end. The keyboard carries telephone cord, complete with modular plug on each end. The keyboard carries
its own Intel 87C51 processor and is an intelligent device. 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. - See about getting keyboard to work as a serial device.
- Need dump of 87C51 cpu in the keyboard. - Need dump of 87C51 cpu in the keyboard.
- Only kayproii boots up, the remainder have floppy-disk problems. - 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"
- The DSK format needs to be supported. It is commented out until the code gets written. - 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. - Hard Disk not emulated.
The controller is a WD1002 (original version, for Winchester drives). 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 ) 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 SLOT_INTERFACE_END
@ -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_INTRQ_CALLBACK(WRITELINE(kaypro_state, fdc_intrq_w))
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(kaypro_state, fdc_drq_w)) MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(kaypro_state, fdc_drq_w))
MCFG_WD_FDC_FORCE_READY MCFG_WD_FDC_FORCE_READY
//MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525dd", kaypro_state::kayproii_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, "525dd", kaypro_state::kayproii_floppy_formats) MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "drive1", floppy_image_device::default_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_SOFTWARE_LIST_ADD("flop_list","kayproii") MCFG_SOFTWARE_LIST_ADD("flop_list","kayproii")
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -266,7 +258,7 @@ static MACHINE_CONFIG_START( kaypro2x, kaypro_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", kaypro2x) MCFG_GFXDECODE_ADD("gfxdecode", "palette", kaypro2x)
MCFG_PALETTE_ADD("palette", 3) MCFG_PALETTE_ADD("palette", 3)
MCFG_PALETTE_INIT_OWNER(kaypro_state,kaypro) MCFG_PALETTE_INIT_OWNER(kaypro_state, kaypro)
/* sound hardware */ /* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono") 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_INTRQ_CALLBACK(WRITELINE(kaypro_state, fdc_intrq_w))
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(kaypro_state, fdc_drq_w)) MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(kaypro_state, fdc_drq_w))
MCFG_WD_FDC_FORCE_READY MCFG_WD_FDC_FORCE_READY
//MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525dd", kaypro_state::kaypro2x_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, "525dd", kaypro_state::kaypro2x_floppy_formats) MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "drive1", floppy_image_device::default_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)
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( omni2, kaypro4 ) static MACHINE_CONFIG_DERIVED( omni2, kaypro4 )
@ -431,9 +421,9 @@ ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */ /* 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( 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( 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, 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 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 // Kaypro 4/84 plus 88 goes here, model 81-015 with an added 8088 daughterboard and rom

View File

@ -21,19 +21,19 @@ public:
}; };
kaypro_state(const machine_config &mconfig, device_type type, const char *tag) kaypro_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag)
m_maincpu(*this, "maincpu"), , m_palette(*this, "palette")
m_pio_g(*this, "z80pio_g"), , m_maincpu(*this, "maincpu")
m_pio_s(*this, "z80pio_s"), , m_pio_g(*this, "z80pio_g")
m_sio(*this, "z80sio"), , m_pio_s(*this, "z80pio_s")
m_sio2x(*this, "z80sio_2x"), , m_sio(*this, "z80sio")
m_centronics(*this, "centronics"), , m_sio2x(*this, "z80sio_2x")
m_fdc(*this, "fdc"), , m_centronics(*this, "centronics")
m_floppy0(*this, "fdc:0"), , m_fdc(*this, "fdc")
m_floppy1(*this, "fdc:1"), , m_floppy0(*this, "fdc:0")
m_crtc(*this, "crtc"), , m_floppy1(*this, "fdc:1")
m_beep(*this, "beeper"), , m_crtc(*this, "crtc")
m_palette(*this, "palette") , m_beep(*this, "beeper")
{} {}
DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
@ -59,13 +59,10 @@ public:
DECLARE_PALETTE_INIT(kaypro); DECLARE_PALETTE_INIT(kaypro);
DECLARE_MACHINE_RESET(kay_kbd); DECLARE_MACHINE_RESET(kay_kbd);
DECLARE_DRIVER_INIT(kaypro); 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_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_kaypro2x(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
UINT32 screen_update_omni2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_omni2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(kay_kbd_interrupt); INTERRUPT_GEN_MEMBER(kay_kbd_interrupt);
DECLARE_WRITE_LINE_MEMBER(kaypro_interrupt);
DECLARE_READ8_MEMBER(kaypro_sio_r); DECLARE_READ8_MEMBER(kaypro_sio_r);
DECLARE_WRITE8_MEMBER(kaypro_sio_w); DECLARE_WRITE8_MEMBER(kaypro_sio_w);
MC6845_UPDATE_ROW(kaypro2x_update_row); MC6845_UPDATE_ROW(kaypro2x_update_row);
@ -78,16 +75,17 @@ public:
UINT8 *m_p_videoram; UINT8 *m_p_videoram;
kay_kbd_t *m_kbd; kay_kbd_t *m_kbd;
int m_centronics_busy; int m_centronics_busy;
required_device<palette_device> m_palette;
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private: private:
bool m_is_motor_off;
UINT8 m_fdc_rq;
UINT8 m_system_port; UINT8 m_system_port;
UINT16 m_mc6845_video_address; UINT16 m_mc6845_video_address;
floppy_image_device *m_floppy; floppy_image_device *m_floppy;
void mc6845_cursor_configure(); void mc6845_cursor_configure();
void mc6845_screen_configure(); void mc6845_screen_configure();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
optional_device<z80pio_device> m_pio_g; optional_device<z80pio_device> m_pio_g;
optional_device<z80pio_device> m_pio_s; optional_device<z80pio_device> m_pio_s;
@ -99,8 +97,6 @@ private:
required_device<floppy_connector> m_floppy1; required_device<floppy_connector> m_floppy1;
optional_device<mc6845_device> m_crtc; optional_device<mc6845_device> m_crtc;
required_device<beep_device> m_beep; required_device<beep_device> m_beep;
public:
required_device<palette_device> m_palette;
}; };

View File

@ -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 ) WRITE_LINE_MEMBER( kaypro_state::write_centronics_busy )
{ {
m_centronics_busy = state; m_centronics_busy = state;
@ -48,6 +43,7 @@ WRITE8_MEMBER( kaypro_state::kayproii_pio_system_w )
membank("bankr0")->set_entry(BIT(data, 7)); membank("bankr0")->set_entry(BIT(data, 7));
membank("bank3")->set_entry(BIT(data, 7)); membank("bank3")->set_entry(BIT(data, 7));
m_is_motor_off = BIT(data, 6);
m_floppy = NULL; m_floppy = NULL;
if (BIT(data, 0)) if (BIT(data, 0))
@ -62,6 +58,7 @@ WRITE8_MEMBER( kaypro_state::kayproii_pio_system_w )
if (m_floppy) if (m_floppy)
{ {
m_floppy->mon_w(BIT(data, 6)); // motor on 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 */ 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("bankr0")->set_entry(BIT(data, 7));
membank("bank3")->set_entry(BIT(data, 7)); membank("bank3")->set_entry(BIT(data, 7));
m_is_motor_off = !BIT(data, 4);
m_floppy = NULL; m_floppy = NULL;
if (!BIT(data, 0)) if (!BIT(data, 0))
@ -116,7 +114,7 @@ WRITE8_MEMBER( kaypro_state::kaypro2x_system_port_w )
m_floppy = m_floppy1->get_device(); m_floppy = m_floppy1->get_device();
m_fdc->set_floppy(m_floppy); 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) 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) void kaypro_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{ {
bool halt;
switch (id) switch (id)
{ {
case TIMER_FLOPPY: 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_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; break;
default: default:
assert_always(FALSE, "Unknown id in kaypro_state::device_timer"); 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 ) WRITE_LINE_MEMBER( kaypro_state::fdc_intrq_w )
{ {
if (state) m_fdc_rq = (m_fdc_rq & 0x82) | state;
timer_set(attotime::zero, TIMER_FLOPPY);
else
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
} }
WRITE_LINE_MEMBER( kaypro_state::fdc_drq_w ) WRITE_LINE_MEMBER( kaypro_state::fdc_drq_w )
{ {
if (state) m_fdc_rq = (m_fdc_rq & 0x81) | (state << 1);
timer_set(attotime::zero, TIMER_FLOPPY);
else
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
} }
@ -241,7 +250,9 @@ MACHINE_RESET_MEMBER( kaypro_state,kaypro )
membank("bankw0")->set_entry(0); // always write to ram membank("bankw0")->set_entry(0); // always write to ram
membank("bank3")->set_entry(1); // point at video ram membank("bank3")->set_entry(1); // point at video ram
m_system_port = 0x80; m_system_port = 0x80;
m_fdc_rq = 0;
m_maincpu->reset(); m_maincpu->reset();
timer_set(attotime::from_hz(1), TIMER_FLOPPY); /* timer for rtc */
} }