From 02adfcf3674fea123c73e7a9c8d2532a63ad07e1 Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Thu, 11 Nov 2021 19:20:05 +0700 Subject: rtpc: complete on-disk post routines --- src/devices/cpu/romp/romp.h | 52 ++++++++++++++++++++++++++--- src/mame/drivers/rtpc.cpp | 74 ++++++++++++++++++++++++++++++------------ src/mame/machine/rtpc_iocc.cpp | 1 + src/mame/machine/rtpc_iocc.h | 6 ++++ 4 files changed, 107 insertions(+), 26 deletions(-) diff --git a/src/devices/cpu/romp/romp.h b/src/devices/cpu/romp/romp.h index 3ff1a55be0e..27a710f1d84 100644 --- a/src/devices/cpu/romp/romp.h +++ b/src/devices/cpu/romp/romp.h @@ -174,10 +174,24 @@ private: break; case 15: - if (m_iou->load(address, data, mode)) - f(data); - else + switch (address >> 24) + { + case 0xf0: + case 0xf4: + if (m_iou->load(address, data, mode)) + f(data); + else + program_check(PCS_PCK | PCS_DAE); + break; + + case 0xfc: // mc68881 assist mode + case 0xfd: // mc68881 non-assist mode + case 0xfe: // afpa dma + case 0xff: // fpa + default: // reserved program_check(PCS_PCK | PCS_DAE); + break; + } break; } } @@ -194,8 +208,22 @@ private: break; case 15: - if (!m_iou->store(address, data, mode)) + switch (address >> 24) + { + case 0xf0: + case 0xf4: + if (!m_iou->store(address, data, mode)) + program_check(PCS_PCK | PCS_DAE); + break; + + case 0xfc: // mc68881 assist mode + case 0xfd: // mc68881 non-assist mode + case 0xfe: // afpa dma + case 0xff: // fpa + default: // reserved program_check(PCS_PCK | PCS_DAE); + break; + } break; } } @@ -212,8 +240,22 @@ private: break; case 15: - if (!m_iou->modify(address, f, mode)) + switch (address >> 24) + { + case 0xf0: + case 0xf4: + if (!m_iou->modify(address, f, mode)) + program_check(PCS_PCK | PCS_DAE); + break; + + case 0xfc: // mc68881 assist mode + case 0xfd: // mc68881 non-assist mode + case 0xfe: // afpa dma + case 0xff: // fpa + default: // reserved program_check(PCS_PCK | PCS_DAE); + break; + } break; } } diff --git a/src/mame/drivers/rtpc.cpp b/src/mame/drivers/rtpc.cpp index 62141eb4e28..17ef1ebdd66 100644 --- a/src/mame/drivers/rtpc.cpp +++ b/src/mame/drivers/rtpc.cpp @@ -65,8 +65,11 @@ * */ /* + * https://ardent-tool.com/615x/rt_loadable_post.html + * * WIP - * - diagnostic disk 1 fails with code 67 + * - diagnostic disk 1 fails with alternating code a6/13 + * exception at 0x16824: lcs r2,0x4(r9) # r9=40435c9c * - aix vrm disk 1 fails with alternating code a6/13 */ @@ -147,6 +150,7 @@ protected: virtual void machine_start() override; virtual void machine_reset() override; + void iocc_mem_map(address_map &map) { map.unmap_value_high(); } template void iocc_pio_map(address_map &map); void common(machine_config &config); @@ -233,6 +237,8 @@ void rtpc_state::init_common() template void rtpc_state::iocc_pio_map(address_map &map) { + map(0x00'01e8, 0x00'01ef).noprw(); // FIXME: silence streaming tape drive adapter probes + if (SCC) { map(0x00'8000, 0x00'8003).rw(m_scc, FUNC(z80scc_device::dc_ab_r), FUNC(z80scc_device::dc_ab_w)); @@ -266,6 +272,10 @@ template void rtpc_state::iocc_pio_map(address_map &map) map(0x00'8c80, 0x00'8c80).mirror(0x03).lr8([]() { return 0xf8; }, "mcr"); map(0x00'8ca0, 0x00'8ca0).mirror(0x03).w(FUNC(rtpc_state::dia_w)); + // 8c82 diag dma mode? + // 8c84 diag dma exit? + map(0x00'8ce0, 0x00'8ce1).nopw(); // FIXME: hex display register? + map(0x01'0000, 0x01'07ff).rw(m_iocc, FUNC(rtpc_iocc_device::tcw_r), FUNC(rtpc_iocc_device::tcw_w)); map(0x01'0800, 0x01'0801).mirror(0x7fc).rw(m_iocc, FUNC(rtpc_iocc_device::csr_r<1>), FUNC(rtpc_iocc_device::csr_w)); map(0x01'0802, 0x01'0803).mirror(0x7fc).rw(m_iocc, FUNC(rtpc_iocc_device::csr_r<0>), FUNC(rtpc_iocc_device::csr_w)); @@ -506,6 +516,7 @@ void rtpc_state::common(machine_config &config) TIMER(config, "mcu_timer").configure_periodic(FUNC(rtpc_state::mcu_timer), attotime::from_hz(32768)); RTPC_IOCC(config, m_iocc, 0); + m_iocc->set_addrmap(0, &rtpc_state::iocc_mem_map); m_iocc->out_int().set(reqi2, FUNC(input_merger_device::in_w<1>)); m_iocc->out_rst().set_inputline(m_dma[0], INPUT_LINE_RESET); m_iocc->out_rst().append_inputline(m_dma[1], INPUT_LINE_RESET); @@ -520,40 +531,61 @@ void rtpc_state::common(machine_config &config) // D8237AC-5 // 8903HV101 AM9517A(config, m_dma[0], m_isa->clock()); - // chan usage - // 0 serial port A - // 1 serial port B - // 2 diskette drive, serial port A - // 3 pc network, serial port B - m_isa->drq0_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<0>)); - m_isa->drq1_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<1>)); - m_isa->drq2_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<2>)); - m_isa->drq3_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<3>)); - m_dma[0]->out_hreq_callback().set(m_dma[0], FUNC(am9517a_device::hack_w)); + + // dma0 channel 0 == isa channel 2 (diskette drive, serial port A) + m_isa->drq2_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<0>)); + m_dma[0]->in_ior_callback<0>().set([this]() { return m_isa->dack_r(2); }); + m_dma[0]->out_iow_callback<0>().set([this](u8 data) { m_isa->dack_w(2, data); }); m_dma[0]->out_dack_callback<0>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<2>)); + + // dma0 channel 1 == isa channel 1 (serial port B) + m_isa->drq1_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<1>)); + m_dma[0]->in_ior_callback<1>().set([this]() { return m_isa->dack_r(1); }); + m_dma[0]->out_iow_callback<1>().set([this](u8 data) { m_isa->dack_w(1, data); }); m_dma[0]->out_dack_callback<1>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<1>)); + + // dma0 channel 2 == isa channel 0 (serial port A) + m_isa->drq0_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<2>)); + m_dma[0]->in_ior_callback<2>().set([this]() { return m_isa->dack_r(0); }); + m_dma[0]->out_iow_callback<2>().set([this](u8 data) { m_isa->dack_w(0, data); }); m_dma[0]->out_dack_callback<2>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<0>)); + + // dma0 channel 3 == isa channel 3 (pc network, serial port B) + m_isa->drq3_callback().set(m_dma[0], FUNC(am9517a_device::dreq_w<3>)); + m_dma[0]->in_ior_callback<3>().set([this]() { return m_isa->dack_r(3); }); + m_dma[0]->out_iow_callback<3>().set([this](u8 data) { m_isa->dack_w(3, data); }); m_dma[0]->out_dack_callback<3>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<3>)); + + m_dma[0]->out_hreq_callback().set(m_dma[0], FUNC(am9517a_device::hack_w)); m_dma[0]->in_memr_callback().set(m_iocc, FUNC(rtpc_iocc_device::dma_b_r)); m_dma[0]->out_memw_callback().set(m_iocc, FUNC(rtpc_iocc_device::dma_b_w)); + m_dma[0]->out_eop_callback().set(m_pic[0], FUNC(pic8259_device::ir0_w)); + + // FIXME: eop should be asserted on the bus and tested by the device + // when transferring data, not routed to a specific card like this + m_dma[0]->out_eop_callback().append([this](int state) { m_isa->eop_w(m_iocc->adc_r(), state); }); // NEC // D8237AC-5 // 8903HV101 AM9517A(config, m_dma[1], m_isa->clock()); - // chan usage - // 5 reserved - // 6 reserved - // 7 reserved - // 8 286 coprocessor - m_isa->drq5_callback().set(m_dma[1], FUNC(am9517a_device::dreq_w<1>)); - m_isa->drq6_callback().set(m_dma[1], FUNC(am9517a_device::dreq_w<2>)); - m_isa->drq7_callback().set(m_dma[1], FUNC(am9517a_device::dreq_w<3>)); - m_dma[1]->out_hreq_callback().set(m_dma[1], FUNC(am9517a_device::hack_w)); + + // dma1 channel 0 == coprocessor channel 8? m_dma[1]->out_dack_callback<0>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<4>)); + + // dma1 channel 1 == isa channel 5 + m_isa->drq5_callback().set(m_dma[1], FUNC(am9517a_device::dreq_w<1>)); m_dma[1]->out_dack_callback<1>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<5>)); + + // dma1 channel 2 == isa channel 6 + m_isa->drq6_callback().set(m_dma[1], FUNC(am9517a_device::dreq_w<2>)); m_dma[1]->out_dack_callback<2>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<6>)); + + // dma1 channel 3 == isa channel 7 + m_isa->drq7_callback().set(m_dma[1], FUNC(am9517a_device::dreq_w<3>)); m_dma[1]->out_dack_callback<3>().set(m_iocc, FUNC(rtpc_iocc_device::dack_w<7>)); + + m_dma[1]->out_hreq_callback().set(m_dma[1], FUNC(am9517a_device::hack_w)); m_dma[1]->in_memr_callback().set(m_iocc, FUNC(rtpc_iocc_device::dma_w_r)); m_dma[1]->out_memw_callback().set(m_iocc, FUNC(rtpc_iocc_device::dma_w_w)); @@ -716,7 +748,7 @@ void rtpc_state::ibm6151(machine_config &config) ISA16_SLOT(config, "isa3", 0, m_isa, rtpc_isa16_cards, nullptr, false); // slot 2: option ISA16_SLOT(config, "isa4", 0, m_isa, rtpc_isa16_cards, nullptr, false); // slot 4: option ISA16_SLOT(config, "isa5", 0, m_isa, rtpc_isa16_cards, nullptr, false); // slot 5: coprocessor/option - ISA16_SLOT(config, "isa6", 0, m_isa, rtpc_isa16_cards, nullptr, false); // slot 6: disk/diskette adapter + ISA16_SLOT(config, "isa6", 0, m_isa, rtpc_isa16_cards, "fdc", false); // slot 6: disk/diskette adapter } ROM_START(ibm6150) diff --git a/src/mame/machine/rtpc_iocc.cpp b/src/mame/machine/rtpc_iocc.cpp index b06cb3f5147..aa98670da98 100644 --- a/src/mame/machine/rtpc_iocc.cpp +++ b/src/mame/machine/rtpc_iocc.cpp @@ -98,6 +98,7 @@ u8 rtpc_iocc_device::dma_b_r(offs_t offset) m_csr &= ~CSR_PER; m_csr |= (CSR_DE0 >> m_adc) | CSR_DEXK; m_out_rst(1); + m_out_rst(0); set_int(true); } } diff --git a/src/mame/machine/rtpc_iocc.h b/src/mame/machine/rtpc_iocc.h index cf7a2052ec7..bf4d925a61e 100644 --- a/src/mame/machine/rtpc_iocc.h +++ b/src/mame/machine/rtpc_iocc.h @@ -99,6 +99,9 @@ public: template void dack_w(int state) { if (!state) m_adc = Channel; } + // HACK: temporary workaround for eop handling + unsigned adc_r() { return m_adc; } + protected: // device_t overrides virtual void device_start() override; @@ -133,6 +136,9 @@ protected: // FIXME: get size from isa bus return 1; } + else if (address == 0xf000'80e0U) + // exception for i/o delay register + return 4; else if (address == 0xf000'8400U) // exception for kls return 2; -- cgit v1.2.3