From ec5dd7621646b600782f6c411cdd3eeaf955994e Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Fri, 22 Jul 2022 10:02:28 +0700 Subject: [PATCH] mg1: hook up dma controllers --- src/mame/mg1/mg1.cpp | 86 +++++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 36 deletions(-) diff --git a/src/mame/mg1/mg1.cpp b/src/mame/mg1/mg1.cpp index bf9b8279f03..c0f4ac036cf 100644 --- a/src/mame/mg1/mg1.cpp +++ b/src/mame/mg1/mg1.cpp @@ -8,7 +8,8 @@ * - http://www.cpu-ns32k.net/Whitechapel.html * * TODO: - * - skeleton only + * - hard disk controller + * - keyboard/mouse */ #include "emu.h" @@ -24,11 +25,11 @@ #include "machine/ns32082.h" #include "machine/ns32202.h" #include "machine/am79c90.h" -//#include "machine/am9516.h" +#include "machine/am9516.h" #include "machine/i8251.h" #include "machine/pit8253.h" #include "machine/wd_fdc.h" -//#include "machine/d7261.h" +//#include "machine/upd7261.h" #include "machine/mm58174.h" // buses and connectors @@ -61,12 +62,14 @@ public: , m_iop_ram(*this, "iop_ram") , m_iop_sram(*this, "iop_sram") , m_iop_ctc(*this, "iop_ctc") + , m_dma(*this, "dma%u", 0U) , m_usart(*this, "usart") , m_serial(*this, "serial") , m_rtc(*this, "rtc") , m_fdc(*this, "fdc") , m_fdd(*this, "fdc:0:35dd") , m_net(*this, "net") + //, m_hdc(*this, "hdc") , m_crtc(*this, "crtc") , m_screen(*this, "screen") , m_vmram(*this, "vmram") @@ -78,8 +81,6 @@ public: // machine config void mg1(machine_config &config); - void init_common(); - protected: // driver_device overrides virtual void machine_start() override; @@ -88,6 +89,7 @@ protected: // address maps template void cpu_map(address_map &map); void iop_map(address_map &map); + void dma_map(address_map &map); private: MC6845_UPDATE_ROW(update_row); @@ -108,6 +110,7 @@ private: required_device m_iop_ctc; + required_device_array m_dma; required_device m_usart; required_device m_serial; required_device m_rtc; @@ -115,6 +118,8 @@ private: required_device m_fdd; required_device m_net; + //required_device m_hdc; + required_device m_crtc; required_device m_screen; required_shared_ptr m_vmram; @@ -125,24 +130,16 @@ private: u8 m_sem[6] = { 0xc0, 0x80, 0xc0, 0xc0, 0xc0, 0xc0 }; }; - void mg1_state::machine_start() -{ -} - - -void mg1_state::machine_reset() -{ - m_fdc->set_floppy(m_fdd); -} - - -void mg1_state::init_common() { m_led_err.resolve(); m_led_fdd.resolve(); } +void mg1_state::machine_reset() +{ + m_fdc->set_floppy(m_fdd); +} template void mg1_state::cpu_map(address_map &map) { @@ -192,17 +189,17 @@ template void mg1_state::cpu_map(address_map &map) //map(0x308800, 0x3089ff).mirror(0xcf6000); // ctc //map(0x308a00, 0x308bff).mirror(0xcf6000); // raster-op function ctl //map(0x308c00, 0x308dff).mirror(0xcf6000); // raster-op - //map(0x308e00, 0x308fff).mirror(0xcf6000); // general/raster-op dma + + map(0x308e00, 0x308e01).mirror(0xcf6000).rw(m_dma[0], FUNC(am9516_device::data_r), FUNC(am9516_device::data_w)); + map(0x308e02, 0x308e03).mirror(0xcf6000).rw(m_dma[0], FUNC(am9516_device::addr_r), FUNC(am9516_device::addr_w)); + map(0x308e04, 0x308e05).mirror(0xcf6000).rw(m_dma[1], FUNC(am9516_device::data_r), FUNC(am9516_device::data_w)); + map(0x308e06, 0x308e07).mirror(0xcf6000).rw(m_dma[1], FUNC(am9516_device::addr_r), FUNC(am9516_device::addr_w)); map(0x309000, 0x309003).mirror(0xcf6000).umask16(0x00ff).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x309200, 0x3093ff).mirror(0xcf6000).rw(m_net, FUNC(am7990_device::regs_r), FUNC(am7990_device::regs_w)); map(0x309400, 0x3095ff).mirror(0xcf6000).umask16(0x00ff).rw(m_rtc, FUNC(mm58174_device::read), FUNC(mm58174_device::write)); - map(0x309600, 0x3097ff).mirror(0xcf6000).lr8( // hdc - [](offs_t offset) - { - return 0xff; - }, "hdc_r"); + //map(0x309600, 0x309603).mirror(0xcf6000).m(m_hdc, FUNC(upd7261_device::map)).umask16(0x00ff); map(0x309800, 0x309807).mirror(0xcf6000).umask16(0x00ff).rw(m_fdc, FUNC(wd1770_device::read), FUNC(wd1770_device::write)); @@ -220,7 +217,6 @@ template void mg1_state::cpu_map(address_map &map) map(0x309e00, 0x309e3f).mirror(0xcf6000).umask16(0x00ff).m(m_icu, FUNC(ns32202_device::map)); } - void mg1_state::iop_map(address_map &map) { map(0x0000, 0x001f).m(m_iop, FUNC(m6801_cpu_device::m6801_io)); @@ -255,11 +251,17 @@ void mg1_state::iop_map(address_map &map) map(0x8000, 0xbfff).mirror(0x4000).rom().region("iop_prom", 0); } +void mg1_state::dma_map(address_map &map) +{ + // system memory buffers swap DMA byte lanes + map(0x000000, 0xffffff).lrw16( + [this](offs_t offset, u16 mem_mask) { return swapendian_int16(m_cpu->space(0).read_word(offset << 1, swapendian_int16(mem_mask))); }, "dma_r", + [this](offs_t offset, u16 data, u16 mem_mask) { m_cpu->space(0).write_word(offset << 1, swapendian_int16(data), swapendian_int16(mem_mask)); }, "dma_w"); +} static INPUT_PORTS_START(mg1) INPUT_PORTS_END - MC6845_UPDATE_ROW(mg1_state::update_row) { // 16 columns x 50 rows of characters, each 64x16 pixels @@ -288,7 +290,6 @@ MC6845_UPDATE_ROW(mg1_state::update_row) } } - void mg1_state::mg1(machine_config &config) { NS32016(config, m_cpu, 16_MHz_XTAL / 2); @@ -331,6 +332,12 @@ void mg1_state::mg1(machine_config &config) PIT8253(config, m_iop_ctc); + AM9516(config, m_dma[0], 10_MHz_XTAL / 2); // graphics (not used) + + AM9516(config, m_dma[1], 10_MHz_XTAL / 2); // general, ch1 hard disk, ch2 -> J3 or floppy + m_dma[1]->out_int().set(m_icu, FUNC(ns32202_device::ir_w<4>)); + m_dma[1]->set_addrmap(am9516_device::SYSTEM_MEM, &mg1_state::dma_map); + I8251(config, m_usart, m_iop->clock()); m_icu->out_cout().set(m_usart, FUNC(i8251_device::rx_clock_w)); m_icu->out_cout().append(m_usart, FUNC(i8251_device::tx_clock_w)); @@ -364,6 +371,15 @@ void mg1_state::mg1(machine_config &config) m_net->dma_in().set([this](offs_t offset) { return m_cpu->space(0).read_word(offset); }); m_net->dma_out().set([this](offs_t offset, u16 data, u16 mem_mask) { m_cpu->space(0).write_word(offset, data, mem_mask); }); + // hard disk controller not emulated +#if 0 + UPD7261(config, m_hdc, 10_MHz_XTAL); + m_hdc->out_dreq().set(m_dma[1], FUNC(am9516_device::dreq_w<0>)).invert(); + m_hdc->out_int().set(m_icu, FUNC(ns32202_device::ir_w<3>)).invert(); + + HARDDISK(config, "hdc:0", 0); +#endif + WD1770(config, m_fdc, 8_MHz_XTAL); m_fdc->intrq_wr_callback().set(m_icu, FUNC(ns32202_device::ir_w<8>)); //m_fdc->drq_wr_callback().set(m_dma, FUNC(dmac_0448_device::drq<1>)); @@ -376,27 +392,25 @@ void mg1_state::mg1(machine_config &config) config.set_default_layout(layout_mg1); } - void mg1_state::floppy_formats(format_registration &fr) { fr.add_mfm_containers(); fr.add(FLOPPY_APPLIX_FORMAT); } - ROM_START(mg1) ROM_REGION16_LE(0x4000, "prom", 0) ROM_SYSTEM_BIOS(0, "260", "v2.60") - ROMX_LOAD("sys_260_even.u291", 0x0000, 0x2000, CRC(24b45b73) SHA1(04d86587b104aa122ac395aa39eb92a1f4d68def), ROM_BIOS(0) | ROM_SKIP(1) ) - ROMX_LOAD("sys_260_odd.u292", 0x0001, 0x2000, CRC(a46ebbf8) SHA1(a2ab9fa3a9576d63d8d49730bfcd58a0f508b30f), ROM_BIOS(0) | ROM_SKIP(1) ) + ROMX_LOAD("sys_260_even.u291", 0x0000, 0x2000, CRC(24b45b73) SHA1(04d86587b104aa122ac395aa39eb92a1f4d68def), ROM_BIOS(0) | ROM_SKIP(1)) + ROMX_LOAD("sys_260_odd.u292", 0x0001, 0x2000, CRC(a46ebbf8) SHA1(a2ab9fa3a9576d63d8d49730bfcd58a0f508b30f), ROM_BIOS(0) | ROM_SKIP(1)) ROM_SYSTEM_BIOS(1, "251", "v2.51") - ROMX_LOAD("sys_251.bin", 0x0000, 0x4000, CRC(aa6c7ccd) SHA1(ef52f0a014c209414f669b7a4d200e9bb9a09fea), ROM_BIOS(1)) + ROMX_LOAD("even_2.51__sys__13.1_u291.u291", 0x0000, 0x2000, CRC(677cab3c) SHA1(d0197b45ddb1ddd8cd125727312b06dcae0f984a), ROM_BIOS(1) | ROM_SKIP(1)) + ROMX_LOAD("odd_2.51__sys__13.1_u292.u292", 0x0001, 0x2000, CRC(b0134a98) SHA1(a81bd4987030b09799bad0c3bc758ea8aed8cd2f), ROM_BIOS(1) | ROM_SKIP(1)) ROM_REGION(0x4000, "iop_prom", 0) - ROM_LOAD("iop_30.u285", 0x0000, 0x2000, CRC(733cd089) SHA1(31ffdd85b4ae2ac35dcde292a0d42860baaba88d)) - ROM_RELOAD( 0x2000, 0x2000) + ROM_LOAD("3.0__iop__24.7.87.u285", 0x0000, 0x2000, CRC(733cd089) SHA1(31ffdd85b4ae2ac35dcde292a0d42860baaba88d)) + ROM_RELOAD( 0x2000, 0x2000) ROM_END - -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -COMP(1984, mg1, 0, 0, mg1, mg1, mg1_state, init_common, "Whitechapel Computer Works", "MG-1", MACHINE_IS_SKELETON) +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +COMP(1984, mg1, 0, 0, mg1, mg1, mg1_state, empty_init, "Whitechapel Computer Works", "MG-1", MACHINE_IS_SKELETON)