mirror of
https://github.com/holub/mame
synced 2025-04-22 00:11:58 +03:00
rtpc: complete on-disk post routines
This commit is contained in:
parent
93d416d08e
commit
02adfcf367
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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 <bool SCC> void iocc_pio_map(address_map &map);
|
||||
|
||||
void common(machine_config &config);
|
||||
@ -233,6 +237,8 @@ void rtpc_state::init_common()
|
||||
|
||||
template <bool SCC> 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 <bool SCC> 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)
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -99,6 +99,9 @@ public:
|
||||
|
||||
template <unsigned Channel> 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;
|
||||
|
Loading…
Reference in New Issue
Block a user