diff --git a/.gitattributes b/.gitattributes index c989a7fa869..5828706b8dc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -244,6 +244,7 @@ hash/prof180.xml svneol=native#text/xml hash/prof80.xml svneol=native#text/xml hash/psion.xml svneol=native#text/xml hash/psx.xml svneol=native#text/xml +hash/pt68k2.xml svneol=native#text/plain hash/pv1000.xml svneol=native#text/xml hash/pv2000.xml svneol=native#text/xml hash/px4_cart.xml svneol=native#text/xml diff --git a/hash/pt68k2.xml b/hash/pt68k2.xml new file mode 100644 index 00000000000..b19639373a9 --- /dev/null +++ b/hash/pt68k2.xml @@ -0,0 +1,19 @@ + + + + + + + SK*DOS 3.3 for PT68K2 + 1990 + Star-K Software + + + + + + + + + + diff --git a/src/mess/drivers/pt68k4.c b/src/mess/drivers/pt68k4.c index 7ceac21c52d..3f5c0a6b6f8 100644 --- a/src/mess/drivers/pt68k4.c +++ b/src/mess/drivers/pt68k4.c @@ -2,18 +2,28 @@ // copyright-holders:Robbbert, R. Belmont /*************************************************************************** - Peripheral Technology PT68K4 + Peripheral Technology PT68K2/PT68K4 family 2011-01-03 Skeleton driver. 2013-09-30 Connected to a terminal 2014-01-03 Connect real DUARTs, FDC, and TimeKeeper. Settings now save properly, floppies can be read. 2014-01-19 ISA bus and compatible cards, PC keyboard support, speaker support - + 2014-09-20 Add PT68K2, add save states, we have a working SK*DOS disk! + This has the appearance of a PC, including pc power supply, slots, etc on a conventional pc-like motherboard and case. Some pics: http://www.wormfood.net/old_computers/ - + +Source code and manuals for the HUMBUG BIOS and SK*DOS are at: +http://www.users.cloud9.net/~stark/sources.html + +Usage: + Start up and press Enter as prompted. Type he to see a command list, or fd to boot from the + first floppy drive. + + The stock NVRAM configures PT68k2 for 2 DSDD 5.25" drives, and PT68k4 for 2 DSHD 5.25" drives. + Chips: 68230 Parallel Interface/Timer @ FE0081 68681 DUART/Timer (x2) @ FE0001 and FE0041 @@ -38,14 +48,16 @@ IRQs: 5: DUART1 6: PC FDC IRQ -TODO: 68230 device. Better hardware documentation would be nice too, and working OS disks. - +TODO: 68230 device + This system and SK*DOS don't like our ISA WDXT-GEN emulation so HDD installs are not currently possible. + ****************************************************************************/ #include "emu.h" #include "cpu/m68000/m68000.h" #include "machine/mc68681.h" #include "machine/timekpr.h" +#include "machine/wd_fdc.h" #include "machine/pc_fdc.h" #include "formats/imd_dsk.h" #include "bus/isa/isa.h" @@ -61,6 +73,7 @@ TODO: 68230 device. Better hardware documentation would be nice too, and workin #define ISABUS_TAG "isa" #define KBDC_TAG "pc_kbdc" #define SPEAKER_TAG "speaker" +#define WDFDC_TAG "wdfdc" class pt68k4_state : public driver_device { @@ -73,6 +86,7 @@ public: , m_duart2(*this, DUART2_TAG) , m_isa(*this, ISABUS_TAG) , m_speaker(*this, SPEAKER_TAG) + , m_wdfdc(*this, WDFDC_TAG) { } DECLARE_READ8_MEMBER(hiram_r); @@ -80,15 +94,23 @@ public: DECLARE_READ8_MEMBER(keyboard_r); DECLARE_WRITE8_MEMBER(keyboard_w); + DECLARE_READ8_MEMBER(pia_stub_r); DECLARE_WRITE8_MEMBER(duart1_out); + DECLARE_WRITE8_MEMBER(fdc_select_w); + DECLARE_WRITE_LINE_MEMBER(duart1_irq); DECLARE_WRITE_LINE_MEMBER(duart2_irq); + DECLARE_WRITE_LINE_MEMBER(irq5_w); + DECLARE_WRITE_LINE_MEMBER(keyboard_clock_w); DECLARE_WRITE_LINE_MEMBER(keyboard_data_w); + DECLARE_FLOPPY_FORMATS( floppy_formats ); + private: + virtual void machine_start(); virtual void machine_reset(); required_shared_ptr m_p_base; required_device m_maincpu; @@ -96,6 +118,9 @@ private: required_device m_duart2; required_device m_isa; required_device m_speaker; + optional_device m_wdfdc; + + void irq5_update(); UINT8 m_hiram[0x800]; @@ -104,8 +129,18 @@ private: UINT8 m_scancode; UINT8 m_kbdflag; int m_kbit; + int m_lastdrive; + bool m_irq5_duart1, m_irq5_isa; }; +FLOPPY_FORMATS_MEMBER( pt68k4_state::floppy_formats ) + FLOPPY_IMD_FORMAT +FLOPPY_FORMATS_END + +static SLOT_INTERFACE_START( pt68k_floppies ) + SLOT_INTERFACE( "525dd", FLOPPY_525_DD ) +SLOT_INTERFACE_END + // XT keyboard interface - done in TTL instead of an 804x WRITE_LINE_MEMBER(pt68k4_state::keyboard_clock_w) { @@ -148,6 +183,70 @@ WRITE8_MEMBER(pt68k4_state::duart1_out) m_speaker->level_w((data >> 3) & 1); } +READ8_MEMBER(pt68k4_state::pia_stub_r) +{ + return 0; +} + +WRITE8_MEMBER(pt68k4_state::fdc_select_w) +{ + floppy_connector *con = machine().device(WDFDC_TAG":0"); + floppy_connector *con2 = machine().device(WDFDC_TAG":1"); + floppy_image_device *floppy = con ? con->get_device() : 0; + floppy_image_device *floppy2 = con2 ? con2->get_device() : 0; + int drive = data & 3; + + if (drive != m_lastdrive) + { + switch (drive) + { + case 0: + m_wdfdc->set_floppy(floppy); + break; + + case 1: + m_wdfdc->set_floppy(floppy2); + break; + + default: + m_wdfdc->set_floppy(NULL); + break; + } + + m_lastdrive = drive; + } + + switch (drive) + { + case 0: + floppy->ss_w((data & 0x40) ? 1 : 0); + break; + + case 1: + floppy2->ss_w((data & 0x40) ? 1 : 0); + break; + + default: + break; + } +} + +static ADDRESS_MAP_START(pt68k2_mem, AS_PROGRAM, 16, pt68k4_state) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x000000, 0x0fffff) AM_RAM AM_SHARE("rambase") // 1MB RAM + AM_RANGE(0xf80000, 0xf8ffff) AM_ROM AM_REGION("roms", 0) + AM_RANGE(0xc00000, 0xdfffff) AM_DEVREADWRITE8(ISABUS_TAG, isa8_device, prog_r, prog_w, 0x00ff) + AM_RANGE(0xfa0000, 0xfbffff) AM_DEVREADWRITE8(ISABUS_TAG, isa8_device, io_r, io_w, 0x00ff) + AM_RANGE(0xfe0000, 0xfe001f) AM_DEVREADWRITE8(DUART1_TAG, mc68681_device, read, write, 0x00ff) + AM_RANGE(0xfe0040, 0xfe005f) AM_DEVREADWRITE8(DUART2_TAG, mc68681_device, read, write, 0x00ff) + AM_RANGE(0xfe0080, 0xfe00bf) AM_READ8(pia_stub_r, 0x00ff) + AM_RANGE(0xfe00c0, 0xfe00ff) AM_WRITE8(fdc_select_w, 0x00ff) + AM_RANGE(0xfe0100, 0xfe013f) AM_DEVREADWRITE8(WDFDC_TAG, wd1772_t, read, write, 0x00ff) + AM_RANGE(0xfe01c0, 0xfe01c3) AM_READWRITE8(keyboard_r, keyboard_w, 0x00ff) + AM_RANGE(0xff0000, 0xff0fff) AM_READWRITE8(hiram_r, hiram_w, 0xff00) + AM_RANGE(0xff0000, 0xff0fff) AM_DEVREADWRITE8(TIMEKEEPER_TAG, timekeeper_device, read, write, 0x00ff) +ADDRESS_MAP_END + static ADDRESS_MAP_START(pt68k4_mem, AS_PROGRAM, 16, pt68k4_state) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x000000, 0x0fffff) AM_RAM AM_SHARE("rambase") // 1MB RAM (OS9 needs more) @@ -197,6 +296,19 @@ WRITE8_MEMBER(pt68k4_state::hiram_w) m_hiram[offset] = data; } +void pt68k4_state::machine_start() +{ + save_item(NAME(m_hiram)); + save_item(NAME(m_kclk)); + save_item(NAME(m_kdata)); + save_item(NAME(m_scancode)); + save_item(NAME(m_kbdflag)); + save_item(NAME(m_kbit)); + save_item(NAME(m_lastdrive)); + save_item(NAME(m_irq5_duart1)); + save_item(NAME(m_irq5_isa)); +} + void pt68k4_state::machine_reset() { UINT8* user1 = memregion("roms")->base(); @@ -208,14 +320,46 @@ void pt68k4_state::machine_reset() m_kbit = 0; m_scancode = 0; m_kbdflag = 0; + m_irq5_duart1 = CLEAR_LINE; + m_irq5_isa = CLEAR_LINE; // set line to asserted (no key code ready) m_duart1->ip2_w(ASSERT_LINE); + + if (m_wdfdc) + { + floppy_connector *con = machine().device(WDFDC_TAG":0"); + floppy_image_device *floppy = con ? con->get_device() : 0; + + m_wdfdc->set_floppy(floppy); + floppy->ss_w(0); + + m_lastdrive = 0; + } +} + +void pt68k4_state::irq5_update() +{ + if ((m_irq5_duart1) || (m_irq5_isa)) + { + m_maincpu->set_input_line(M68K_IRQ_5, ASSERT_LINE); + } + else + { + m_maincpu->set_input_line(M68K_IRQ_5, CLEAR_LINE); + } } WRITE_LINE_MEMBER(pt68k4_state::duart1_irq) { - m_maincpu->set_input_line(M68K_IRQ_5, state); + m_irq5_duart1 = state; + irq5_update(); +} + +WRITE_LINE_MEMBER(pt68k4_state::irq5_w) +{ + m_irq5_isa = state; + irq5_update(); } WRITE_LINE_MEMBER(pt68k4_state::duart2_irq) @@ -235,6 +379,46 @@ SLOT_INTERFACE_START( pt68k4_isa8_cards ) SLOT_INTERFACE("xtide", ISA8_XTIDE) // Monk only SLOT_INTERFACE_END +static MACHINE_CONFIG_START( pt68k2, pt68k4_state ) + /* basic machine hardware */ + MCFG_CPU_ADD(M68K_TAG, M68000, XTAL_16MHz/2) // 68k2 came in 8, 10, and 12 MHz versions + MCFG_CPU_PROGRAM_MAP(pt68k2_mem) + + MCFG_MC68681_ADD("duart1", XTAL_3_6864MHz) + MCFG_MC68681_IRQ_CALLBACK(WRITELINE(pt68k4_state, duart1_irq)) + MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(pt68k4_state, duart1_out)) + + MCFG_MC68681_ADD("duart2", XTAL_3_6864MHz) + + MCFG_DEVICE_ADD(KBDC_TAG, PC_KBDC, 0) + MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(pt68k4_state, keyboard_clock_w)) + MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE(pt68k4_state, keyboard_data_w)) + MCFG_PC_KBDC_SLOT_ADD(KBDC_TAG, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83) + + MCFG_M48T02_ADD(TIMEKEEPER_TAG) + + MCFG_WD1772x_ADD(WDFDC_TAG, XTAL_16MHz / 2) + MCFG_FLOPPY_DRIVE_ADD(WDFDC_TAG":0", pt68k_floppies, "525dd", pt68k4_state::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(WDFDC_TAG":1", pt68k_floppies, "525dd", pt68k4_state::floppy_formats) + + MCFG_DEVICE_ADD(ISABUS_TAG, ISA8, 0) + MCFG_ISA8_CPU(":"M68K_TAG) + MCFG_ISA8_BUS_CUSTOM_SPACES() + MCFG_ISA_OUT_IRQ5_CB(WRITELINE(pt68k4_state, irq5_w)) + MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa1", pt68k4_isa8_cards, "cga", false) + MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa2", pt68k4_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa3", pt68k4_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa4", pt68k4_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa5", pt68k4_isa8_cards, NULL, false) + MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa6", pt68k4_isa8_cards, NULL, false) + + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD(SPEAKER_TAG, SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) + + MCFG_SOFTWARE_LIST_ADD("flop525_list", "pt68k2") +MACHINE_CONFIG_END + static MACHINE_CONFIG_START( pt68k4, pt68k4_state ) /* basic machine hardware */ MCFG_CPU_ADD(M68K_TAG, M68000, XTAL_16MHz) @@ -258,8 +442,8 @@ static MACHINE_CONFIG_START( pt68k4, pt68k4_state ) MCFG_ISA8_CPU(":"M68K_TAG) MCFG_ISA8_BUS_CUSTOM_SPACES() MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa1", pt68k4_isa8_cards, "fdc_at", false) - MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa2", pt68k4_isa8_cards, "mda", false) - MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa3", pt68k4_isa8_cards, "wdxt_gen", false) + MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa2", pt68k4_isa8_cards, "cga", false) + MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa3", pt68k4_isa8_cards, NULL, false) MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa4", pt68k4_isa8_cards, NULL, false) MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa5", pt68k4_isa8_cards, NULL, false) MCFG_ISA8_SLOT_ADD(ISABUS_TAG, "isa6", pt68k4_isa8_cards, NULL, false) @@ -268,9 +452,20 @@ static MACHINE_CONFIG_START( pt68k4, pt68k4_state ) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD(SPEAKER_TAG, SPEAKER_SOUND, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) + + MCFG_SOFTWARE_LIST_ADD("flop525_list", "pt68k2") MACHINE_CONFIG_END /* ROM definition */ +ROM_START( pt68k2 ) + ROM_REGION16_BE( 0x10000, "roms", 0 ) + ROM_LOAD16_BYTE( "hum_u20.bin", 0x000000, 0x008000, CRC(69db483a) SHA1(9dfea73e4d7deef7c66a27cca92eb7c9ff767215) ) + ROM_LOAD16_BYTE( "hum_u27.bin", 0x000001, 0x008000, CRC(54441b06) SHA1(0e2d63b1cd01f88f37fc4859c11c252c4fea220b) ) + + ROM_REGION(0x800, TIMEKEEPER_TAG, 0) + ROM_LOAD( "u21_ds1220.bin", 0x000000, 0x000800, CRC(7a6b75ce) SHA1(07663860aa6cc21aed04a568ff9c05bc75d62e4f) ) +ROM_END + ROM_START( pt68k4 ) ROM_REGION16_BE( 0x10000, "roms", 0 ) ROM_SYSTEM_BIOS( 0, "humbug", "Humbug" ) @@ -280,6 +475,9 @@ ROM_START( pt68k4 ) ROMX_LOAD( "monk_0.bin", 0x0000, 0x8000, CRC(420d6a4b) SHA1(fca8c53c9c3c8ebd09370499cf34f4cc75ed9463), ROM_SKIP(1) | ROM_BIOS(2)) ROMX_LOAD( "monk_1.bin", 0x0001, 0x8000, CRC(fc495e82) SHA1(f7b720d87db4d72a23e6c42d2cdd03216db04b60), ROM_SKIP(1) | ROM_BIOS(2)) + ROM_REGION(0x800, TIMEKEEPER_TAG, 0) + ROM_LOAD( "u21_ds1220_k4.bin", 0x000000, 0x000800, CRC(753472e6) SHA1(58dc8bcc86191e4a4429fe6a9b4fdd7788abb0cd) ) + ROM_REGION( 0x0900, "proms", 0 ) ROM_LOAD_OPTIONAL( "20l8.u71", 0x0000, 0x000149, CRC(77365121) SHA1(5ecf490ead119966a5c097d90740acde60462ab0) ) ROM_LOAD_OPTIONAL( "16l8.u53", 0x0200, 0x000109, CRC(cb6a9984) SHA1(45b9b14e7b45cda6f0edfcbb9895b6a14eacb852) ) @@ -289,4 +487,5 @@ ROM_END /* Driver */ /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -COMP( 1990, pt68k4, 0, 0, pt68k4, pt68k4, driver_device, 0, "Peripheral Technology", "PT68K4", GAME_NOT_WORKING ) +COMP( 1988, pt68k2, 0, 0, pt68k2, pt68k4, driver_device, 0, "Peripheral Technology", "PT68K2", GAME_SUPPORTS_SAVE ) +COMP( 1990, pt68k4, 0, 0, pt68k4, pt68k4, driver_device, 0, "Peripheral Technology", "PT68K4", GAME_SUPPORTS_SAVE ) diff --git a/src/mess/mess.lst b/src/mess/mess.lst index 117c817bb79..43525b5bb8a 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -2400,6 +2400,7 @@ okean240 okean240a okean240t vixen +pt68k2 pt68k4 jupiter2 jupiter3