From 6bcbeb25dde4798c1689104f922c05bc4ee70ef7 Mon Sep 17 00:00:00 2001 From: AJR Date: Tue, 10 Jul 2018 11:21:12 -0400 Subject: 3b1: Correct XTAL values; add various devices and placeholders (nw) --- src/mame/drivers/unixpc.cpp | 152 +++++++++++++++++++++++++++++--------------- 1 file changed, 99 insertions(+), 53 deletions(-) diff --git a/src/mame/drivers/unixpc.cpp b/src/mame/drivers/unixpc.cpp index 0e538f9e91c..ae4dd653092 100644 --- a/src/mame/drivers/unixpc.cpp +++ b/src/mame/drivers/unixpc.cpp @@ -17,9 +17,14 @@ #include "emu.h" #include "cpu/m68000/m68000.h" +#include "machine/6850acia.h" +#include "machine/74259.h" +#include "machine/bankdev.h" #include "machine/ram.h" +//#include "machine/tc8250.h" +//#include "machine/wd1010.h" #include "machine/wd_fdc.h" -#include "machine/bankdev.h" +#include "machine/z80sio.h" #include "emupal.h" #include "screen.h" @@ -36,6 +41,8 @@ public: unixpc_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_gcr(*this, "gcr"), + m_tcr(*this, "tcr"), m_ram(*this, RAM_TAG), m_wd2797(*this, "wd2797"), m_floppy(*this, "wd2797:0:525dd"), @@ -52,29 +59,35 @@ private: virtual void machine_start() override; virtual void machine_reset() override; - DECLARE_READ16_MEMBER( line_printer_r ); - DECLARE_WRITE16_MEMBER( misc_control_w ); - DECLARE_WRITE16_MEMBER( disk_control_w ); - DECLARE_WRITE16_MEMBER( romlmap_w ); - DECLARE_WRITE16_MEMBER( error_enable_w ); - DECLARE_WRITE16_MEMBER( parity_enable_w ); - DECLARE_WRITE16_MEMBER( bpplus_w ); - DECLARE_READ16_MEMBER( ram_mmu_r ); - DECLARE_WRITE16_MEMBER( ram_mmu_w ); - DECLARE_READ16_MEMBER( rtc_r ); - DECLARE_WRITE16_MEMBER( rtc_w ); - DECLARE_READ16_MEMBER( diskdma_size_r ); - DECLARE_WRITE16_MEMBER( diskdma_size_w ); - DECLARE_WRITE16_MEMBER( diskdma_ptr_w ); - - DECLARE_WRITE_LINE_MEMBER( wd2797_intrq_w ); - DECLARE_WRITE_LINE_MEMBER( wd2797_drq_w ); + DECLARE_READ16_MEMBER(line_printer_r); + DECLARE_WRITE16_MEMBER(misc_control_w); + DECLARE_WRITE16_MEMBER(disk_control_w); + DECLARE_WRITE16_MEMBER(gcr_w); + DECLARE_WRITE_LINE_MEMBER(romlmap_w); + DECLARE_WRITE_LINE_MEMBER(error_enable_w); + DECLARE_WRITE_LINE_MEMBER(parity_enable_w); + DECLARE_WRITE_LINE_MEMBER(bpplus_w); + DECLARE_READ16_MEMBER(ram_mmu_r); + DECLARE_WRITE16_MEMBER(ram_mmu_w); + DECLARE_READ16_MEMBER(gsr_r); + DECLARE_WRITE16_MEMBER(tcr_w); + DECLARE_READ16_MEMBER(tsr_r); + DECLARE_READ16_MEMBER(rtc_r); + DECLARE_WRITE16_MEMBER(rtc_w); + DECLARE_READ16_MEMBER(diskdma_size_r); + DECLARE_WRITE16_MEMBER(diskdma_size_w); + DECLARE_WRITE16_MEMBER(diskdma_ptr_w); + + DECLARE_WRITE_LINE_MEMBER(wd2797_intrq_w); + DECLARE_WRITE_LINE_MEMBER(wd2797_drq_w); void ramrombank_map(address_map &map); void unixpc_mem(address_map &map); private: required_device m_maincpu; + required_device m_gcr; + required_device m_tcr; required_device m_ram; required_device m_wd2797; required_device m_floppy; @@ -95,19 +108,17 @@ private: MEMORY ***************************************************************************/ -WRITE16_MEMBER( unixpc_state::romlmap_w ) +WRITE16_MEMBER(unixpc_state::gcr_w) { - if (BIT(data, 15)) - { - m_ramrombank->set_bank(1); - } - else - { - m_ramrombank->set_bank(0); - } + m_gcr->write_bit(offset >> 11, BIT(data, 15)); } -READ16_MEMBER( unixpc_state::ram_mmu_r ) +WRITE_LINE_MEMBER(unixpc_state::romlmap_w) +{ + m_ramrombank->set_bank(state ? 1 : 0); +} + +READ16_MEMBER(unixpc_state::ram_mmu_r) { // TODO: MMU translation if (offset > m_ramsize) @@ -117,7 +128,7 @@ READ16_MEMBER( unixpc_state::ram_mmu_r ) return m_ramptr[offset]; } -WRITE16_MEMBER( unixpc_state::ram_mmu_w ) +WRITE16_MEMBER(unixpc_state::ram_mmu_w) { // TODO: MMU translation if (offset < m_ramsize) @@ -141,36 +152,51 @@ void unixpc_state::machine_reset() m_maincpu->reset(); } -WRITE16_MEMBER( unixpc_state::error_enable_w ) +WRITE_LINE_MEMBER(unixpc_state::error_enable_w) { - logerror("error_enable_w: %04x\n", data & 0x8000); + logerror("error_enable_w: %d\n", state); } -WRITE16_MEMBER( unixpc_state::parity_enable_w ) +WRITE_LINE_MEMBER(unixpc_state::parity_enable_w) { - logerror("parity_enable_w: %04x\n", data & 0x8000); + logerror("parity_enable_w: %d\n", state); } -WRITE16_MEMBER( unixpc_state::bpplus_w ) +WRITE_LINE_MEMBER(unixpc_state::bpplus_w) { - logerror("bpplus_w: %04x\n", data & 0x8000); + logerror("bpplus_w: %d\n", state); } /*************************************************************************** MISC ***************************************************************************/ -READ16_MEMBER( unixpc_state::rtc_r ) +READ16_MEMBER(unixpc_state::gsr_r) { return 0; } -WRITE16_MEMBER( unixpc_state::rtc_w ) +WRITE16_MEMBER(unixpc_state::tcr_w) +{ + m_tcr->write_bit(offset >> 11, BIT(data, 14)); +} + +READ16_MEMBER(unixpc_state::tsr_r) +{ + return 0; +} + +READ16_MEMBER(unixpc_state::rtc_r) +{ + return 0; +} + +WRITE16_MEMBER(unixpc_state::rtc_w) { logerror("rtc_w: %04x\n", data); } -READ16_MEMBER( unixpc_state::line_printer_r ) +READ16_MEMBER(unixpc_state::line_printer_r) { uint16_t data = 0; @@ -184,7 +210,7 @@ READ16_MEMBER( unixpc_state::line_printer_r ) return data; } -WRITE16_MEMBER( unixpc_state::misc_control_w ) +WRITE16_MEMBER(unixpc_state::misc_control_w) { logerror("misc_control_w: %04x\n", data); @@ -203,18 +229,18 @@ WRITE16_MEMBER( unixpc_state::misc_control_w ) DMA ***************************************************************************/ -READ16_MEMBER( unixpc_state::diskdma_size_r ) +READ16_MEMBER(unixpc_state::diskdma_size_r) { return m_diskdmasize; } -WRITE16_MEMBER( unixpc_state::diskdma_size_w ) +WRITE16_MEMBER(unixpc_state::diskdma_size_w) { COMBINE_DATA( &m_diskdmasize ); logerror("%x to disk DMA size\n", data); } -WRITE16_MEMBER( unixpc_state::diskdma_ptr_w ) +WRITE16_MEMBER(unixpc_state::diskdma_ptr_w) { if (offset >= 0x2000) { @@ -235,7 +261,7 @@ WRITE16_MEMBER( unixpc_state::diskdma_ptr_w ) FLOPPY ***************************************************************************/ -WRITE16_MEMBER( unixpc_state::disk_control_w ) +WRITE16_MEMBER(unixpc_state::disk_control_w) { logerror("disk_control_w: %04x\n", data); @@ -248,13 +274,13 @@ WRITE16_MEMBER( unixpc_state::disk_control_w ) m_wd2797->set_floppy(nullptr); } -WRITE_LINE_MEMBER( unixpc_state::wd2797_intrq_w ) +WRITE_LINE_MEMBER(unixpc_state::wd2797_intrq_w) { logerror("wd2797_intrq_w: %d\n", state); m_fdc_intrq = state; } -WRITE_LINE_MEMBER( unixpc_state::wd2797_drq_w ) +WRITE_LINE_MEMBER(unixpc_state::wd2797_drq_w) { logerror("wd2797_drq_w: %d\n", state); } @@ -283,21 +309,23 @@ void unixpc_state::unixpc_mem(address_map &map) { map(0x000000, 0x3fffff).m(m_ramrombank, FUNC(address_map_bank_device::amap16)); map(0x400000, 0x4007ff).ram().share("mapram"); + map(0x410000, 0x410001).r(FUNC(unixpc_state::gsr_r)); map(0x420000, 0x427fff).ram().share("videoram"); + map(0x450000, 0x450001).r(FUNC(unixpc_state::tsr_r)); map(0x460000, 0x460001).rw(FUNC(unixpc_state::diskdma_size_r), FUNC(unixpc_state::diskdma_size_w)); map(0x470000, 0x470001).r(FUNC(unixpc_state::line_printer_r)); map(0x480000, 0x480001).w(FUNC(unixpc_state::rtc_w)); + map(0x490000, 0x490001).select(0x7000).w(FUNC(unixpc_state::tcr_w)); map(0x4a0000, 0x4a0001).w(FUNC(unixpc_state::misc_control_w)); map(0x4d0000, 0x4d7fff).w(FUNC(unixpc_state::diskdma_ptr_w)); map(0x4e0000, 0x4e0001).w(FUNC(unixpc_state::disk_control_w)); + //map(0xe00000, 0xe0000f).rw("hdc", FUNC(wd1010_device::read), FUNC(wd1010_device::write)).umask16(0x00ff); map(0xe10000, 0xe10007).rw(m_wd2797, FUNC(wd_fdc_device_base::read), FUNC(wd_fdc_device_base::write)).umask16(0x00ff); map(0xe30000, 0xe30001).r(FUNC(unixpc_state::rtc_r)); - map(0xe40000, 0xe40001).w(FUNC(unixpc_state::error_enable_w)); - map(0xe41000, 0xe41001).w(FUNC(unixpc_state::parity_enable_w)); - map(0xe42000, 0xe42001).w(FUNC(unixpc_state::bpplus_w)); - map(0xe43000, 0xe43001).w(FUNC(unixpc_state::romlmap_w)); + map(0xe40000, 0xe40001).select(0x7000).w(FUNC(unixpc_state::gcr_w)); + map(0xe50000, 0xe50007).rw("mpsc", FUNC(upd7201_new_device::cd_ba_r), FUNC(upd7201_new_device::cd_ba_w)).umask16(0x00ff); + map(0xe70000, 0xe70003).rw("kbc", FUNC(acia6850_device::read), FUNC(acia6850_device::write)).umask16(0xff00); map(0x800000, 0x803fff).mirror(0x7fc000).rom().region("bootrom", 0); - // e70000 / e70002 = keyboard 6850 status/control and Rx data / Tx data } void unixpc_state::ramrombank_map(address_map &map) @@ -325,13 +353,21 @@ static void unixpc_floppies(device_slot_interface &device) MACHINE_CONFIG_START(unixpc_state::unixpc) // basic machine hardware - MCFG_DEVICE_ADD("maincpu", M68010, XTAL(10'000'000)) + MCFG_DEVICE_ADD("maincpu", M68010, 40_MHz_XTAL / 4) MCFG_DEVICE_PROGRAM_MAP(unixpc_mem) + MCFG_DEVICE_ADD("gcr", LS259) // 7K + MCFG_ADDRESSABLE_LATCH_Q0_OUT_CB(WRITELINE(*this, unixpc_state, error_enable_w)) + MCFG_ADDRESSABLE_LATCH_Q1_OUT_CB(WRITELINE(*this, unixpc_state, parity_enable_w)) + MCFG_ADDRESSABLE_LATCH_Q2_OUT_CB(WRITELINE(*this, unixpc_state, bpplus_w)) + MCFG_ADDRESSABLE_LATCH_Q3_OUT_CB(WRITELINE(*this, unixpc_state, romlmap_w)) + + MCFG_DEVICE_ADD("tcr", LS259) // 10K + // video hardware MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_UPDATE_DRIVER(unixpc_state, screen_update) - MCFG_SCREEN_RAW_PARAMS(XTAL(20'000'000), 896, 0, 720, 367, 0, 348) + MCFG_SCREEN_RAW_PARAMS(40_MHz_XTAL / 2, 896, 0, 720, 367, 0, 348) MCFG_SCREEN_PALETTE("palette") // vsync should actually last 17264 pixels @@ -352,10 +388,20 @@ MACHINE_CONFIG_START(unixpc_state::unixpc) MCFG_ADDRESS_MAP_BANK_STRIDE(0x400000) // floppy - MCFG_DEVICE_ADD("wd2797", WD2797, 1000000) + MCFG_DEVICE_ADD("wd2797", WD2797, 40_MHz_XTAL / 40) // 1PCK (CPU clock) divided by custom DMA chip MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(*this, unixpc_state, wd2797_intrq_w)) MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(*this, unixpc_state, wd2797_drq_w)) MCFG_FLOPPY_DRIVE_ADD("wd2797:0", unixpc_floppies, "525dd", floppy_image_device::default_floppy_formats) + + MCFG_DEVICE_ADD("mpsc", UPD7201_NEW, 19.6608_MHz_XTAL / 8) + + MCFG_DEVICE_ADD("kbc", ACIA6850, 0) + + // TODO: HDC + //MCFG_DEVICE_ADD("hdc", WD1010, 40_MHz_XTAL / 8) + + // TODO: RTC + //MCFG_DEVICE_ADD("rtc", TC8250, 32.768_kHZ_XTAL) MACHINE_CONFIG_END -- cgit v1.2.3