From 6abd129bf899c9fa23e721b9e29ccffadcc3ee2e Mon Sep 17 00:00:00 2001 From: Robbbert Date: Fri, 6 Sep 2013 17:39:54 +0000 Subject: [PATCH] (MESS) kaypro : various --- src/mess/drivers/kaypro.c | 78 +++++++++++++++------------- src/mess/includes/kaypro.h | 9 ++-- src/mess/machine/kaypro.c | 103 ++++++++----------------------------- src/mess/video/kaypro.c | 1 + 4 files changed, 66 insertions(+), 125 deletions(-) diff --git a/src/mess/drivers/kaypro.c b/src/mess/drivers/kaypro.c index d59866c2666..530cab3c335 100644 --- a/src/mess/drivers/kaypro.c +++ b/src/mess/drivers/kaypro.c @@ -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 diff --git a/src/mess/includes/kaypro.h b/src/mess/includes/kaypro.h index 39831ac93b4..ec3ff312d6d 100644 --- a/src/mess/includes/kaypro.h +++ b/src/mess/includes/kaypro.h @@ -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 m_p_videoram; + UINT8 *m_p_videoram; kay_kbd_t *m_kbd; protected: diff --git a/src/mess/machine/kaypro.c b/src/mess/machine/kaypro.c index 22bd16d6c48..a11d08b40d0 100644 --- a/src/mess/machine/kaypro.c +++ b/src/mess/machine/kaypro.c @@ -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; -} diff --git a/src/mess/video/kaypro.c b/src/mess/video/kaypro.c index 7e04b974f42..dd6d275f7e3 100644 --- a/src/mess/video/kaypro.c +++ b/src/mess/video/kaypro.c @@ -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; }