kaypro.cpp: Add RTC to '84-type systems

This commit is contained in:
AJR 2023-05-06 13:15:37 -04:00
parent dff3955a3a
commit 6d8e386281
3 changed files with 85 additions and 21 deletions

View File

@ -8,6 +8,8 @@
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.
Non-Linear Systems changed its name to Kaypro Corporation in July 1983.
Kaypro 5 notes: Kaypro 5 notes:
The Kaycomp Kay Pro V / Non-Linear Systems Kaypro 5: https://retrocmp.de/kaypro/kay-p1_vers.htm#kay-5, The Kaycomp Kay Pro V / Non-Linear Systems Kaypro 5: https://retrocmp.de/kaypro/kay-p1_vers.htm#kay-5,
a version of the Kaypro II, but with a 5MB harddisk instead of one of the floppy drives, was announced a version of the Kaypro II, but with a 5MB harddisk instead of one of the floppy drives, was announced
@ -40,7 +42,7 @@
- Hard Disk not emulated. - Hard Disk not emulated.
The controller is a WD1002-HD0 (original version, for Winchester drives), HD is 10MB, e.g. Shugart 712 The controller is a WD1002-HD0 (original version, for Winchester drives), HD is 10MB, e.g. Shugart 712
- RTC type MM58167A to be added. Modem chips TMS99531, TMS99532 to be developed. - Modem chips TMS99531, TMS99532 to be developed.
- Once everything works, sort out parent and compat relationships. - Once everything works, sort out parent and compat relationships.
@ -87,7 +89,7 @@ void kaypro_state::kayproii_io(address_map &map)
map(0x1c, 0x1f).rw(m_pio_s, FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt)); map(0x1c, 0x1f).rw(m_pio_s, FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt));
} }
void kaypro_state::kaypro484_io(address_map &map) void kaypro_state::kaypro10_io(address_map &map)
{ {
map.global_mask(0xff); map.global_mask(0xff);
map.unmap_value_high(); map.unmap_value_high();
@ -103,9 +105,7 @@ void kaypro_state::kaypro484_io(address_map &map)
map(0x1f, 0x1f).rw(FUNC(kaypro_state::kaypro484_videoram_r), FUNC(kaypro_state::kaypro484_videoram_w)); map(0x1f, 0x1f).rw(FUNC(kaypro_state::kaypro484_videoram_r), FUNC(kaypro_state::kaypro484_videoram_w));
/* The below are not emulated */ /* The below are not emulated */
/* map(0x20, 0x23).rw("z80pio", FUNC(z80pio_device::kaypro484_pio_r), FUNC(z80pio_device::kaypro484_pio_w)) - for RTC and Modem /* map(0x80, 0x80) Hard drive controller card I/O port - 10MB hard drive only fitted to the Kaypro 10
map(0x24, 0x27) communicate with MM58167A RTC. Modem uses TMS99531 and TMS99532 chips.
map(0x80, 0x80) Hard drive controller card I/O port - 10MB hard drive only fitted to the Kaypro 10
map(0x81, 0x81) Hard Drive READ error register, WRITE precomp map(0x81, 0x81) Hard Drive READ error register, WRITE precomp
map(0x82, 0x82) Hard Drive Sector register count I/O map(0x82, 0x82) Hard Drive Sector register count I/O
map(0x83, 0x83) Hard Drive Sector register number I/O map(0x83, 0x83) Hard Drive Sector register number I/O
@ -117,6 +117,13 @@ void kaypro_state::kaypro484_io(address_map &map)
map(0x87, 0x87).r(FUNC(kaypro_state::kaypro484_87_r)); map(0x87, 0x87).r(FUNC(kaypro_state::kaypro484_87_r));
} }
void kaypro_state::kaypro484_io(address_map &map)
{
kaypro10_io(map);
map(0x20, 0x23).rw("z80pio", FUNC(z80pio_device::read), FUNC(z80pio_device::write));
map(0x24, 0x24).mirror(3).rw(FUNC(kaypro_state::rtc_r), FUNC(kaypro_state::rtc_w));
}
static INPUT_PORTS_START(kaypro) static INPUT_PORTS_START(kaypro)
// everything comes from the keyboard device // everything comes from the keyboard device
@ -176,8 +183,16 @@ static const z80_daisy_config kayproii_daisy_chain[] =
{ nullptr } { nullptr }
}; };
static const z80_daisy_config kaypro10_daisy_chain[] =
{
{ "sio_1" }, /* sio for RS232C and keyboard */
{ "sio_2" }, /* sio for serial printer and inbuilt modem */
{ nullptr }
};
static const z80_daisy_config kaypro484_daisy_chain[] = static const z80_daisy_config kaypro484_daisy_chain[] =
{ {
{ "z80pio" },
{ "sio_1" }, /* sio for RS232C and keyboard */ { "sio_1" }, /* sio for RS232C and keyboard */
{ "sio_2" }, /* sio for serial printer and inbuilt modem */ { "sio_2" }, /* sio for serial printer and inbuilt modem */
{ nullptr } { nullptr }
@ -247,7 +262,7 @@ void kaypro_state::kayproii(machine_config &config)
serial.cts_handler().set("sio", FUNC(z80sio_device::ctsa_w)); serial.cts_handler().set("sio", FUNC(z80sio_device::ctsa_w));
serial.dcd_handler().set("sio", FUNC(z80sio_device::dcda_w)); serial.dcd_handler().set("sio", FUNC(z80sio_device::dcda_w));
com8116_device &brg(COM8116(config, "brg", XTAL(5'068'800))); // WD1943, SMC8116 com8116_device &brg(COM8116(config, "brg", 5.0688_MHz_XTAL)); // WD1943, SMC8116
brg.ft_handler().set("sio", FUNC(z80sio_device::rxca_w)); brg.ft_handler().set("sio", FUNC(z80sio_device::rxca_w));
brg.ft_handler().append("sio", FUNC(z80sio_device::txca_w)); brg.ft_handler().append("sio", FUNC(z80sio_device::txca_w));
brg.fr_handler().set("sio", FUNC(z80sio_device::rxtxcb_w)); brg.fr_handler().set("sio", FUNC(z80sio_device::rxtxcb_w));
@ -359,7 +374,7 @@ void kaypro_state::kaypro484(machine_config &config)
sio_2.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); // FIXME: use a combiner sio_2.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); // FIXME: use a combiner
sio_2.out_txda_callback().set("serprn", FUNC(rs232_port_device::write_txd)); sio_2.out_txda_callback().set("serprn", FUNC(rs232_port_device::write_txd));
com8116_device &brg(COM8116(config, "brg", XTAL(5'068'800))); // WD1943, SMC8116 com8116_device &brg(COM8116(config, "brg", 5.0688_MHz_XTAL)); // WD1943, SMC8116
brg.fr_handler().set("sio_1", FUNC(z80sio_device::rxca_w)); brg.fr_handler().set("sio_1", FUNC(z80sio_device::rxca_w));
brg.fr_handler().append("sio_1", FUNC(z80sio_device::txca_w)); brg.fr_handler().append("sio_1", FUNC(z80sio_device::txca_w));
brg.ft_handler().set("sio_2", FUNC(z80sio_device::rxca_w)); brg.ft_handler().set("sio_2", FUNC(z80sio_device::rxca_w));
@ -372,11 +387,20 @@ void kaypro_state::kaypro484(machine_config &config)
FLOPPY_CONNECTOR(config, "fdc:0", kaypro_floppies, "525dd", kaypro_state::floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, "fdc:0", kaypro_floppies, "525dd", kaypro_state::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, "fdc:1", kaypro_floppies, "525dd", kaypro_state::floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, "fdc:1", kaypro_floppies, "525dd", kaypro_state::floppy_formats).enable_sound(true);
SOFTWARE_LIST(config, "flop_list").set_original("kaypro").set_filter("C"); SOFTWARE_LIST(config, "flop_list").set_original("kaypro").set_filter("C");
z80pio_device &pio(Z80PIO(config, "z80pio", 16_MHz_XTAL / 4));
pio.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
pio.out_pa_callback().set(FUNC(kaypro_state::rtc_address_w));
MM58167(config, m_rtc, 32.768_kHz_XTAL);
m_rtc->irq().set("z80pio", FUNC(z80pio_device::pa6_w));
} }
void kaypro_state::kaypro4x(machine_config &config) void kaypro_state::kaypro4x(machine_config &config)
{ {
kaypro484(config); kaypro484(config);
m_fdc->set_clock(16_MHz_XTAL / 8);
m_fdc->set_force_ready(false);
SOFTWARE_LIST(config.replace(), "flop_list").set_original("kaypro").set_filter("F"); SOFTWARE_LIST(config.replace(), "flop_list").set_original("kaypro").set_filter("F");
} }
@ -387,6 +411,18 @@ void kaypro_state::kaypro1(machine_config &config)
} }
void kaypro_state::kaypro10(machine_config &config) void kaypro_state::kaypro10(machine_config &config)
{
kaypro484(config);
m_maincpu->set_addrmap(AS_IO, &kaypro_state::kaypro10_io);
m_maincpu->set_daisy_config(kaypro10_daisy_chain);
config.device_remove("z80pio");
config.device_remove("rtc");
config.device_remove("fdc:1"); // only has 1 floppy drive
// need to add hard drive & controller
SOFTWARE_LIST(config.replace(), "flop_list").set_original("kaypro").set_filter("E");
}
void kaypro_state::kaypro1084(machine_config &config)
{ {
kaypro484(config); kaypro484(config);
config.device_remove("fdc:1"); // only has 1 floppy drive config.device_remove("fdc:1"); // only has 1 floppy drive
@ -671,18 +707,18 @@ 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, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Kaypro II - 2/83", MACHINE_SUPPORTS_SAVE ) COMP( 1982, kayproii, 0, 0, kayproii, kaypro, kaypro_state, init_kaypro, "Non-Linear Systems", "Kaypro II - 2/83", MACHINE_SUPPORTS_SAVE )
COMP( 1983, kayproiv, kayproii, 0, kayproiv, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Kaypro IV - 4/83", MACHINE_SUPPORTS_SAVE ) // model 81-004 COMP( 1983, kayproiv, kayproii, 0, kayproiv, kaypro, kaypro_state, init_kaypro, "Non-Linear Systems", "Kaypro IV - 4/83", MACHINE_SUPPORTS_SAVE ) // model 81-004
COMP( 1983, kaypro10, 0, 0, kaypro10, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Kaypro 10 - 1983", MACHINE_SUPPORTS_SAVE ) COMP( 1983, kaypro10, 0, 0, kaypro10, kaypro, kaypro_state, init_kaypro, "Non-Linear Systems", "Kaypro 10 - 1983", MACHINE_SUPPORTS_SAVE )
COMP( 1983, kayproiip88, kayproii, 0, kayproii, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Kaypro 4 plus88 - 4/83" , MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // model 81-004 with an added 8088 daughterboard and rom COMP( 1983, kayproiip88, kayproii, 0, kayproii, kaypro, kaypro_state, init_kaypro, "Kaypro Corporation", "Kaypro 4 plus88 - 4/83" , MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // model 81-004 with an added 8088 daughterboard and rom
COMP( 1984, kaypro484, 0, 0, kaypro484, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Kaypro 4/84", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // model 81-015 COMP( 1984, kaypro484, 0, 0, kaypro484, kaypro, kaypro_state, init_kaypro, "Kaypro Corporation", "Kaypro 4/84", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // model 81-015
COMP( 1984, kaypro284, kaypro484, 0, kaypro284, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Kaypro 2/84", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // model 81-015 COMP( 1984, kaypro284, kaypro484, 0, kaypro284, kaypro, kaypro_state, init_kaypro, "Kaypro Corporation", "Kaypro 2/84", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // model 81-015
COMP( 1984, kaypro484p88, kaypro484, 0, kaypro484, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Kaypro 4/84 plus88", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // model 81-015 with an added 8088 daughterboard and rom COMP( 1984, kaypro484p88, kaypro484, 0, kaypro484, kaypro, kaypro_state, init_kaypro, "Kaypro Corporation", "Kaypro 4/84 plus88", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // model 81-015 with an added 8088 daughterboard and rom
COMP( 1984, kaypro1084, kaypro10, 0, kaypro10, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Kaypro 10", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // model 81-005 COMP( 1984, kaypro1084, kaypro10, 0, kaypro1084, kaypro, kaypro_state, init_kaypro, "Kaypro Corporation", "Kaypro 10", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // model 81-005
COMP( 1984, robie, 0, 0, kaypro4x, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Kaypro Robie", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) COMP( 1984, robie, 0, 0, kaypro4x, kaypro, kaypro_state, init_kaypro, "Kaypro Corporation", "Kaypro Robie", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 1985, kaypro2x, kaypro484, 0, kaypro484, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Kaypro 2x", MACHINE_SUPPORTS_SAVE ) // model 81-025 COMP( 1985, kaypro2x, kaypro484, 0, kaypro484, kaypro, kaypro_state, init_kaypro, "Kaypro Corporation", "Kaypro 2x", MACHINE_SUPPORTS_SAVE ) // model 81-025
COMP( 1985, kaypronew2, 0, 0, kaypronew2, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Kaypro New 2", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) COMP( 1985, kaypronew2, 0, 0, kaypronew2, kaypro, kaypro_state, init_kaypro, "Kaypro Corporation", "Kaypro New 2", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 1985, kaypro4x, robie, 0, kaypro4x, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Kaypro 4x", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) COMP( 1985, kaypro4x, robie, 0, kaypro4x, kaypro, kaypro_state, init_kaypro, "Kaypro Corporation", "Kaypro 4x", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 1986, kaypro1, kaypro484, 0, kaypro1, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Kaypro 1", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) COMP( 1986, kaypro1, kaypro484, 0, kaypro1, kaypro, kaypro_state, init_kaypro, "Kaypro Corporation", "Kaypro 1", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 198?, omni2, kayproii, 0, omni2, kaypro, kaypro_state, init_kaypro, "Non Linear Systems", "Omni II Logic Analyzer", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) COMP( 198?, omni2, kayproii, 0, omni2, kaypro, kaypro_state, init_kaypro, "Kaypro Corporation", "Omni II Logic Analyzer", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 198?, omni4, kaypro484, 0, kaypro1, kaypro, kaypro_state, init_kaypro, "Omni Logic Inc.", "Omni 4 Logic Analyzer", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) COMP( 198?, omni4, kaypro484, 0, kaypro1, kaypro, kaypro_state, init_kaypro, "Omni Logic Inc.", "Omni 4 Logic Analyzer", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )

View File

@ -13,6 +13,7 @@
#include "imagedev/snapquik.h" #include "imagedev/snapquik.h"
#include "sound/beep.h" #include "sound/beep.h"
#include "video/mc6845.h" #include "video/mc6845.h"
#include "machine/mm58167.h"
#include "machine/wd_fdc.h" #include "machine/wd_fdc.h"
#include "machine/timer.h" #include "machine/timer.h"
#include "emupal.h" #include "emupal.h"
@ -35,6 +36,7 @@ public:
, m_floppy1(*this, "fdc:1") , m_floppy1(*this, "fdc:1")
, m_crtc(*this, "crtc") , m_crtc(*this, "crtc")
, m_beep(*this, "beeper") , m_beep(*this, "beeper")
, m_rtc(*this, "rtc")
, m_bankr(*this, "bankr") , m_bankr(*this, "bankr")
, m_bankw(*this, "bankw") , m_bankw(*this, "bankw")
, m_bank3(*this, "bank3") , m_bank3(*this, "bank3")
@ -48,6 +50,7 @@ public:
void kaypronew2(machine_config &config); void kaypronew2(machine_config &config);
void kaypro484(machine_config &config); void kaypro484(machine_config &config);
void kaypro10(machine_config &config); void kaypro10(machine_config &config);
void kaypro1084(machine_config &config);
void kaypro284(machine_config &config); void kaypro284(machine_config &config);
void kaypro4x(machine_config &config); void kaypro4x(machine_config &config);
void kaypro1(machine_config &config); void kaypro1(machine_config &config);
@ -59,6 +62,7 @@ protected:
virtual void machine_reset() override; virtual void machine_reset() override;
private: private:
void kaypro10_io(address_map &map);
void kaypro484_io(address_map &map); void kaypro484_io(address_map &map);
void kaypro_map(address_map &map); void kaypro_map(address_map &map);
void kayproii_io(address_map &map); void kayproii_io(address_map &map);
@ -78,6 +82,9 @@ private:
void kayproiv_pio_system_w(u8 data); void kayproiv_pio_system_w(u8 data);
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w); DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
void rtc_address_w(u8 data);
u8 rtc_r();
void rtc_w(u8 data);
u8 kaypro_videoram_r(offs_t offset); u8 kaypro_videoram_r(offs_t offset);
void kaypro_videoram_w(offs_t offset, u8 data); void kaypro_videoram_w(offs_t offset, u8 data);
static void floppy_formats(format_registration &fr); static void floppy_formats(format_registration &fr);
@ -103,6 +110,7 @@ private:
u8 m_system_port = 0U; u8 m_system_port = 0U;
u16 m_mc6845_video_address = 0U; u16 m_mc6845_video_address = 0U;
floppy_image_device *m_floppy = nullptr; floppy_image_device *m_floppy = nullptr;
u8 m_rtc_address = 0U;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
required_device<screen_device> m_screen; required_device<screen_device> m_screen;
@ -116,6 +124,7 @@ private:
optional_device<floppy_connector> m_floppy1; optional_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;
optional_device<mm58167_device> m_rtc;
required_memory_bank m_bankr; required_memory_bank m_bankr;
required_memory_bank m_bankw; required_memory_bank m_bankw;
required_memory_bank m_bank3; required_memory_bank m_bank3;

View File

@ -213,6 +213,22 @@ WRITE_LINE_MEMBER( kaypro_state::fdc_drq_w )
} }
void kaypro_state::rtc_address_w(u8 data)
{
m_rtc_address = data & 0x1f;
}
u8 kaypro_state::rtc_r()
{
return m_rtc->read(m_rtc_address);
}
void kaypro_state::rtc_w(u8 data)
{
m_rtc->write(m_rtc_address, data);
}
/*********************************************************** /***********************************************************
Machine Machine
@ -237,6 +253,9 @@ void kaypro_state::machine_start()
save_item(NAME(m_system_port)); save_item(NAME(m_system_port));
save_item(NAME(m_mc6845_video_address)); save_item(NAME(m_mc6845_video_address));
if (m_rtc.found())
save_item(NAME(m_rtc_address));
m_framecnt = 0; m_framecnt = 0;
} }