(MESS) kaypro : various

This commit is contained in:
Robbbert 2013-09-06 17:39:54 +00:00
parent 4043a83974
commit 6abd129bf8
4 changed files with 66 additions and 125 deletions

View File

@ -9,24 +9,16 @@
Things that need doing:
- MAME's z80sio implementation is unusable at this time. Needs proper callback
mechanism for both channels, and interface to modern standards.
- See about getting keyboard to work as a serial device.
- Need dump of 87C51 cpu in the keyboard.
- When z80sio gets updated, then see about getting keyboard to work as a serial device.
- Kaypro2x/4a are not booting.
- Only kayproii boots up, the remainder have floppy-disk problems.
- Hard Disk not emulated.
The controller is a WD1002 (original version, for Winchester drives).
- Kaypro 4 plus 88 does work as a normal Kaypro, but the extra processor needs
to be worked out.
- RTC type MM58167A to be added. Modem chips TMS99531, TMS99532 to be developed.
- Regression all models: Cannot read the floppy disk any more since someone modified the
WD controller.
**************************************************************************************************/
#include "includes/kaypro.h"
@ -42,8 +34,8 @@ READ8_MEMBER( kaypro_state::kaypro2x_87_r ) { return 0x7f; } /* to bypass une
************************************************************/
static ADDRESS_MAP_START( kaypro_map, AS_PROGRAM, 8, kaypro_state )
AM_RANGE(0x0000, 0x0fff) AM_ROM AM_REGION("maincpu", 0x0000)
AM_RANGE(0x3000, 0x3fff) AM_RAM AM_REGION("maincpu", 0x3000) AM_SHARE("p_videoram")
AM_RANGE(0x0000, 0x2fff) AM_READ_BANK("bankr0") AM_WRITE_BANK("bankw0")
AM_RANGE(0x3000, 0x3fff) AM_RAMBANK("bank3")
AM_RANGE(0x4000, 0xffff) AM_RAM AM_REGION("rambank", 0x4000)
ADDRESS_MAP_END
@ -200,7 +192,7 @@ static MACHINE_CONFIG_START( kayproii, kaypro_state )
MCFG_CPU_CONFIG(kayproii_daisy_chain)
MCFG_MACHINE_START_OVERRIDE(kaypro_state, kayproii )
MCFG_MACHINE_RESET_OVERRIDE(kaypro_state, kayproii )
MCFG_MACHINE_RESET_OVERRIDE(kaypro_state, kaypro )
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -220,7 +212,7 @@ static MACHINE_CONFIG_START( kayproii, kaypro_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
/* devices */
MCFG_QUICKLOAD_ADD("quickload", kaypro_state, kayproii, "com,cpm", 3)
MCFG_QUICKLOAD_ADD("quickload", kaypro_state, kaypro, "com,cpm", 3)
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 )
@ -247,7 +239,7 @@ static MACHINE_CONFIG_START( kaypro2x, kaypro_state )
MCFG_CPU_VBLANK_INT_DRIVER("screen", kaypro_state, kay_kbd_interrupt)
MCFG_CPU_CONFIG(kaypro2x_daisy_chain)
MCFG_MACHINE_RESET_OVERRIDE(kaypro_state, kaypro2x )
MCFG_MACHINE_RESET_OVERRIDE(kaypro_state, kaypro )
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -268,7 +260,7 @@ 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_QUICKLOAD_ADD("quickload", kaypro_state, kaypro, "com,cpm", 3)
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 )
@ -288,6 +280,15 @@ 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));
UINT8 *main = memregion("maincpu")->base();
UINT8 *ram = memregion("rambank")->base();
membank("bankr0")->configure_entry(1, &main[0x0000]);
membank("bankr0")->configure_entry(0, &ram[0x0000]);
membank("bank3")->configure_entry(1, &main[0x3000]);
membank("bank3")->configure_entry(0, &ram[0x3000]);
membank("bankw0")->configure_entry(0, &ram[0x0000]);
}
@ -304,8 +305,7 @@ ROM_START(kayproii)
ROM_REGION(0x4000, "maincpu",0)
ROM_LOAD("81-149.u47", 0x0000, 0x0800, CRC(28264bc1) SHA1(a12afb11a538fc0217e569bc29633d5270dfa51b) )
ROM_REGION(0x10000, "rambank",0)
ROM_FILL( 0, 0x10000, 0xff)
ROM_REGION(0x10000, "rambank", ROMREGION_ERASEFF)
ROM_REGION(0x0800, "chargen", ROMREGION_INVERT)
ROM_LOAD("81-146.u43", 0x0000, 0x0800, CRC(4cc7d206) SHA1(5cb880083b94bd8220aac1f87d537db7cfeb9013) )
@ -315,8 +315,7 @@ ROM_START(kaypro4)
ROM_REGION(0x4000, "maincpu",0)
ROM_LOAD("81-232.u47", 0x0000, 0x1000, CRC(4918fb91) SHA1(cd9f45cc3546bcaad7254b92c5d501c40e2ef0b2) )
ROM_REGION(0x10000, "rambank",0)
ROM_FILL( 0, 0x10000, 0xff)
ROM_REGION(0x10000, "rambank", ROMREGION_ERASEFF)
ROM_REGION(0x0800, "chargen", ROMREGION_INVERT)
ROM_LOAD("81-146.u43", 0x0000, 0x0800, CRC(4cc7d206) SHA1(5cb880083b94bd8220aac1f87d537db7cfeb9013) )
@ -326,8 +325,7 @@ ROM_START(kaypro4p88) // "KAYPRO-88" board has 128k or 256k of its own ram on it
ROM_REGION(0x4000, "maincpu",0)
ROM_LOAD("81-232.u47", 0x0000, 0x1000, CRC(4918fb91) SHA1(cd9f45cc3546bcaad7254b92c5d501c40e2ef0b2) )
ROM_REGION(0x10000, "rambank",0)
ROM_FILL( 0, 0x10000, 0xff)
ROM_REGION(0x10000, "rambank", ROMREGION_ERASEFF)
ROM_REGION(0x0800, "chargen", ROMREGION_INVERT)
ROM_LOAD("81-146.u43", 0x0000, 0x0800, CRC(4cc7d206) SHA1(5cb880083b94bd8220aac1f87d537db7cfeb9013) )
@ -340,8 +338,7 @@ ROM_START(omni2)
ROM_REGION(0x4000, "maincpu",0)
ROM_LOAD("omni2.u47", 0x0000, 0x1000, CRC(2883f9e0) SHA1(d98c784e62853582d298bf7ca84c75872847ac9b) )
ROM_REGION(0x10000, "rambank",0)
ROM_FILL( 0, 0x10000, 0xff)
ROM_REGION(0x10000, "rambank", ROMREGION_ERASEFF)
ROM_REGION(0x0800, "chargen", ROMREGION_INVERT)
ROM_LOAD("omni2.u43", 0x0000, 0x0800, CRC(049b3381) SHA1(46f1d4f038747ba9048b075dc617361be088f82a) )
@ -351,40 +348,47 @@ ROM_START(kaypro2x)
ROM_REGION(0x4000, "maincpu",0)
ROM_LOAD("81-292.u34", 0x0000, 0x2000, CRC(5eb69aec) SHA1(525f955ca002976e2e30ac7ee37e4a54f279fe96) )
ROM_REGION(0x10000, "rambank",0)
ROM_FILL( 0, 0x10000, 0xff)
ROM_REGION(0x10000, "rambank", ROMREGION_ERASEFF)
ROM_REGION(0x1000, "chargen",0)
ROM_LOAD("81-817.u9", 0x0000, 0x1000, CRC(5f72da5b) SHA1(8a597000cce1a7e184abfb7bebcb564c6bf24fb7) )
ROM_LOAD("81-235.u9", 0x0000, 0x1000, CRC(5f72da5b) SHA1(8a597000cce1a7e184abfb7bebcb564c6bf24fb7) )
ROM_END
ROM_START(kaypro4a) // same as kaypro2x ??
ROM_REGION(0x4000, "maincpu",0)
ROM_LOAD("81-292.u34", 0x0000, 0x2000, CRC(5eb69aec) SHA1(525f955ca002976e2e30ac7ee37e4a54f279fe96) )
ROM_REGION(0x10000, "rambank",0)
ROM_FILL( 0, 0x10000, 0xff)
ROM_REGION(0x10000, "rambank", ROMREGION_ERASEFF)
ROM_REGION(0x1000, "chargen",0)
ROM_LOAD("81-817.u9", 0x0000, 0x1000, CRC(5f72da5b) SHA1(8a597000cce1a7e184abfb7bebcb564c6bf24fb7) )
ROM_LOAD("81-235.u9", 0x0000, 0x1000, CRC(5f72da5b) SHA1(8a597000cce1a7e184abfb7bebcb564c6bf24fb7) )
ROM_END
ROM_START(kaypro10)
ROM_REGION(0x4000, "maincpu",0)
ROM_LOAD("81-302.u42", 0x0000, 0x1000, CRC(3f9bee20) SHA1(b29114a199e70afe46511119b77a662e97b093a0) )
//Note: the older rom 81-187 is also allowed here for kaypro 10, but we don't have a dump of it yet.
ROM_REGION(0x10000, "rambank",0)
ROM_FILL( 0, 0x10000, 0xff)
ROM_REGION(0x10000, "rambank", ROMREGION_ERASEFF)
ROM_REGION(0x1000, "chargen",0)
ROM_LOAD("81-817.u31", 0x0000, 0x1000, CRC(5f72da5b) SHA1(8a597000cce1a7e184abfb7bebcb564c6bf24fb7) )
ROM_LOAD("81-187.u31", 0x0000, 0x1000, CRC(5f72da5b) SHA1(8a597000cce1a7e184abfb7bebcb564c6bf24fb7) )
ROM_END
//ROM_START(robie)
// ROM_REGION(0x4000, "maincpu",0)
// ROM_LOAD("81-326.u34", 0x0000, 0x2000, NO_DUMP )
//
// ROM_REGION(0x10000, "rambank", ROMREGION_ERASEFF)
//
// ROM_REGION(0x1000, "chargen",0)
// ROM_LOAD("81-235.u9", 0x0000, 0x1000, NO_DUMP )
//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" , 0 ) // model 81-004
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, 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( 198?, omni2, kayproii, 0, omni2, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Omni II" , GAME_NOT_WORKING )
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

@ -22,7 +22,6 @@ public:
kaypro_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_p_videoram(*this, "p_videoram"),
m_maincpu(*this, "maincpu"),
m_pio_g(*this, "z80pio_g"),
m_pio_s(*this, "z80pio_s"),
@ -53,9 +52,8 @@ public:
DECLARE_READ8_MEMBER(kaypro_videoram_r);
DECLARE_WRITE8_MEMBER(kaypro_videoram_w);
DECLARE_MACHINE_START(kayproii);
DECLARE_MACHINE_RESET(kayproii);
DECLARE_MACHINE_RESET(kaypro);
DECLARE_VIDEO_START(kaypro);
DECLARE_MACHINE_RESET(kaypro2x);
DECLARE_PALETTE_INIT(kaypro);
DECLARE_MACHINE_RESET(kay_kbd);
DECLARE_DRIVER_INIT(kaypro);
@ -68,8 +66,7 @@ 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(kaypro);
const UINT8 *m_p_chargen;
UINT8 m_mc6845_cursor[16];
UINT8 m_mc6845_reg[32];
@ -78,7 +75,7 @@ public:
UINT8 m_flash;
UINT8 m_framecnt;
UINT16 m_cursor;
required_shared_ptr<UINT8> m_p_videoram;
UINT8 *m_p_videoram;
kay_kbd_t *m_kbd;
protected:

View File

@ -31,7 +31,7 @@ READ8_MEMBER( kaypro_state::pio_system_r )
return data;
}
WRITE8_MEMBER( kaypro_state::common_pio_system_w )
WRITE8_MEMBER( kaypro_state::kayproii_pio_system_w )
{
/* d7 bank select
d6 disk drive motors - (0=on)
@ -41,24 +41,8 @@ WRITE8_MEMBER( kaypro_state::common_pio_system_w )
d1 drive B
d0 drive A */
/* get address space */
address_space &mem = m_maincpu->space(AS_PROGRAM);
if (data & 0x80)
{
mem.unmap_readwrite (0x0000, 0x3fff);
mem.install_read_bank (0x0000, 0x0fff, "bank1");
membank("bank1")->set_base(memregion("maincpu")->base());
mem.install_readwrite_handler (0x3000, 0x3fff, read8_delegate(FUNC(kaypro_state::kaypro_videoram_r), this), write8_delegate(FUNC(kaypro_state::kaypro_videoram_w), this));
}
else
{
mem.unmap_readwrite(0x0000, 0x3fff);
mem.install_read_bank (0x0000, 0x3fff, "bank2");
mem.install_write_bank (0x0000, 0x3fff, "bank3");
membank("bank2")->set_base(memregion("rambank")->base());
membank("bank3")->set_base(memregion("rambank")->base());
}
membank("bankr0")->set_entry(BIT(data, 7));
membank("bank3")->set_entry(BIT(data, 7));
m_floppy = NULL;
if (BIT(data, 0))
@ -83,17 +67,9 @@ WRITE8_MEMBER( kaypro_state::common_pio_system_w )
m_system_port = data;
}
WRITE8_MEMBER( kaypro_state::kayproii_pio_system_w )
{
common_pio_system_w(space, offset, data);
/* side select */
m_floppy->ss_w(!BIT(data, 2));
}
WRITE8_MEMBER( kaypro_state::kaypro4_pio_system_w )
{
common_pio_system_w(space, offset, data);
kayproii_pio_system_w(space, offset, data);
/* side select */
m_floppy->ss_w(BIT(data, 2));
@ -157,38 +133,23 @@ WRITE8_MEMBER( kaypro_state::kaypro2x_system_port_w )
d1 drive B
d0 drive A */
/* get address space */
address_space &mem = m_maincpu->space(AS_PROGRAM);
if (BIT(data, 7))
{
mem.unmap_readwrite (0x0000, 0x3fff);
mem.install_read_bank (0x0000, 0x1fff, "bank1");
membank("bank1")->set_base(memregion("maincpu")->base());
}
else
{
mem.unmap_readwrite (0x0000, 0x3fff);
mem.install_read_bank (0x0000, 0x3fff, "bank2");
mem.install_write_bank (0x0000, 0x3fff, "bank3");
membank("bank2")->set_base(memregion("rambank")->base());
membank("bank3")->set_base(memregion("rambank")->base());
}
membank("bankr0")->set_entry(BIT(data, 7));
membank("bank3")->set_entry(BIT(data, 7));
m_floppy = NULL;
if (BIT(data, 0))
if (!BIT(data, 0))
m_floppy = m_floppy0->get_device();
else
if (BIT(data, 1))
if (!BIT(data, 1))
m_floppy = m_floppy1->get_device();
m_fdc->set_floppy(m_floppy);
m_fdc->dden_w(BIT(data, 5));
//m_fdc->dden_w(BIT(data, 5)); // not connected
if (m_floppy)
{
m_floppy->mon_w(BIT(data, 6) ? 0 : 1); // motor on
m_floppy->ss_w(BIT(data, 2));
m_floppy->mon_w(!BIT(data, 4)); // motor on
m_floppy->ss_w(!BIT(data, 2));
}
output_set_value("ledA", BIT(data, 0)); /* LEDs in artwork */
@ -321,22 +282,21 @@ void kaypro_state::fdc_drq_w (bool state)
Machine
************************************************************/
MACHINE_START_MEMBER(kaypro_state,kayproii)
MACHINE_START_MEMBER( kaypro_state,kayproii )
{
m_pio_s->strobe_a(0);
}
MACHINE_RESET_MEMBER(kaypro_state,kayproii)
MACHINE_RESET_MEMBER( kaypro_state,kaypro )
{
MACHINE_RESET_CALL_MEMBER(kay_kbd);
membank("bankr0")->set_entry(1); // point at rom
membank("bankw0")->set_entry(0); // always write to ram
membank("bank3")->set_entry(1); // point at video ram
m_system_port = 0x80;
m_maincpu->reset();
}
MACHINE_RESET_MEMBER(kaypro_state,kaypro2x)
{
address_space &space = m_maincpu->space(AS_PROGRAM);
kaypro2x_system_port_w(space, 0, 0x80);
MACHINE_RESET_CALL_MEMBER(kay_kbd);
}
/***********************************************************
@ -349,9 +309,8 @@ MACHINE_RESET_MEMBER(kaypro_state,kaypro2x)
************************************************************/
QUICKLOAD_LOAD_MEMBER( kaypro_state, kayproii )
QUICKLOAD_LOAD_MEMBER( kaypro_state, kaypro )
{
address_space &space = m_maincpu->space(AS_PROGRAM);
UINT8 *RAM = memregion("rambank")->base();
UINT16 i;
UINT8 data;
@ -364,30 +323,10 @@ QUICKLOAD_LOAD_MEMBER( kaypro_state, kayproii )
RAM[i+0x100] = data;
}
common_pio_system_w(space, 0, m_system_port & 0x7f); // switch TPA in
membank("bankr0")->set_entry(0);
membank("bank3")->set_entry(0);
RAM[0x80]=0; // clear out command tail
RAM[0x81]=0;
m_maincpu->set_pc(0x100); // start program
return IMAGE_INIT_PASS;
}
QUICKLOAD_LOAD_MEMBER( kaypro_state, kaypro2x )
{
address_space &space = m_maincpu->space(AS_PROGRAM);
UINT8 *RAM = memregion("rambank")->base();
UINT16 i;
UINT8 data;
for (i = 0; i < quickload_size; i++)
{
if (image.fread( &data, 1) != 1) return IMAGE_INIT_FAIL;
RAM[i+0x100] = data;
}
kaypro2x_system_port_w(space, 0, m_system_port & 0x7f);
RAM[0x80]=0;
RAM[0x81]=0;
m_maincpu->set_pc(0x100);
return IMAGE_INIT_PASS;
}

View File

@ -313,4 +313,5 @@ WRITE8_MEMBER( kaypro_state::kaypro2x_videoram_w )
VIDEO_START_MEMBER(kaypro_state,kaypro)
{
m_p_chargen = memregion("chargen")->base();
m_p_videoram = memregion("maincpu")->base()+0x3000;
}