(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
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

View File

@ -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<palette_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<cpu_device> m_maincpu;
optional_device<z80pio_device> m_pio_g;
optional_device<z80pio_device> m_pio_s;
@ -99,8 +97,6 @@ private:
required_device<floppy_connector> m_floppy1;
optional_device<mc6845_device> m_crtc;
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 )
{
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 */
}