mirror of
https://github.com/holub/mame
synced 2025-07-05 18:08:04 +03:00
-cmi2x: Fixed FDC DMA, QDOS now boots. [Ryan Holtz]
This commit is contained in:
parent
d193130145
commit
8c64dbefd7
@ -381,8 +381,9 @@ public:
|
|||||||
, m_acia_mkbd_cmi(*this, "acia_mkbd_cmi")
|
, m_acia_mkbd_cmi(*this, "acia_mkbd_cmi")
|
||||||
, m_cmi07_ptm(*this, "cmi07_ptm")
|
, m_cmi07_ptm(*this, "cmi07_ptm")
|
||||||
, m_qfc9_region(*this, "qfc9")
|
, m_qfc9_region(*this, "qfc9")
|
||||||
, m_floppy_0(*this, "wd1791:0:8dsdd")
|
, m_floppy_0(*this, "wd1791:0")
|
||||||
, m_floppy_1(*this, "wd1791:1:8dsdd")
|
, m_floppy_1(*this, "wd1791:1")
|
||||||
|
, m_floppy(nullptr)
|
||||||
, m_wd1791(*this, "wd1791")
|
, m_wd1791(*this, "wd1791")
|
||||||
, m_cmi01a_0(*this, "cmi01a_0")
|
, m_cmi01a_0(*this, "cmi01a_0")
|
||||||
, m_cmi01a_1(*this, "cmi01a_1")
|
, m_cmi01a_1(*this, "cmi01a_1")
|
||||||
@ -551,8 +552,9 @@ protected:
|
|||||||
required_device<ptm6840_device> m_cmi07_ptm;
|
required_device<ptm6840_device> m_cmi07_ptm;
|
||||||
|
|
||||||
required_memory_region m_qfc9_region;
|
required_memory_region m_qfc9_region;
|
||||||
required_device<floppy_image_device> m_floppy_0;
|
required_device<floppy_connector> m_floppy_0;
|
||||||
required_device<floppy_image_device> m_floppy_1;
|
required_device<floppy_connector> m_floppy_1;
|
||||||
|
floppy_image_device *m_floppy;
|
||||||
required_device<fd1791_t> m_wd1791;
|
required_device<fd1791_t> m_wd1791;
|
||||||
|
|
||||||
required_device<cmi01a_device> m_cmi01a_0;
|
required_device<cmi01a_device> m_cmi01a_0;
|
||||||
@ -1482,16 +1484,20 @@ void cmi_state::write_fdc_ctrl(UINT8 data)
|
|||||||
int drive = data & 1;
|
int drive = data & 1;
|
||||||
int side = BIT(data, 5) ? 1 : 0;
|
int side = BIT(data, 5) ? 1 : 0;
|
||||||
|
|
||||||
|
m_floppy = nullptr;
|
||||||
|
|
||||||
if (drive)
|
if (drive)
|
||||||
{
|
{
|
||||||
m_floppy_1->ss_w(side);
|
m_floppy = m_floppy_1->get_device();
|
||||||
m_wd1791->set_floppy(m_floppy_1);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_floppy_0->ss_w(side);
|
m_floppy = m_floppy_0->get_device();
|
||||||
m_wd1791->set_floppy(m_floppy_0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_floppy)
|
||||||
|
m_floppy->ss_w(side);
|
||||||
|
m_wd1791->set_floppy(m_floppy);
|
||||||
m_wd1791->dden_w(BIT(data, 7) ? true : false);
|
m_wd1791->dden_w(BIT(data, 7) ? true : false);
|
||||||
|
|
||||||
m_fdc_ctrl = data;
|
m_fdc_ctrl = data;
|
||||||
@ -1543,15 +1549,9 @@ void cmi_state::fdc_dma_transfer()
|
|||||||
UINT8 map_info = m_map_sel[MAPSEL_P2_A_DMA1];
|
UINT8 map_info = m_map_sel[MAPSEL_P2_A_DMA1];
|
||||||
int map = map_info & 0x1f;
|
int map = map_info & 0x1f;
|
||||||
|
|
||||||
/* Transfer from disk to RAM */
|
|
||||||
if (!BIT(m_fdc_ctrl, 4))
|
|
||||||
{
|
|
||||||
/* Determine the initial page */
|
|
||||||
int cpu_page = (m_fdc_dma_addr.w.l & ~PAGE_MASK) / PAGE_SIZE;
|
int cpu_page = (m_fdc_dma_addr.w.l & ~PAGE_MASK) / PAGE_SIZE;
|
||||||
int phys_page = 0;
|
int phys_page = 0;
|
||||||
|
|
||||||
// printf("FDC DMA: Disk to [%x] (%x bytes)\n", m_fdc_dma_addr.w.l, m_fdc_dma_cnt.w.l ^ 0xffff);
|
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < NUM_Q256_CARDS; ++i)
|
for (i = 0; i < NUM_Q256_CARDS; ++i)
|
||||||
{
|
{
|
||||||
@ -1563,7 +1563,8 @@ void cmi_state::fdc_dma_transfer()
|
|||||||
|
|
||||||
//phys_page &= 0x7f;
|
//phys_page &= 0x7f;
|
||||||
|
|
||||||
for (; m_fdc_dma_cnt.w.l < 0xffff && m_fdc_drq; m_fdc_dma_cnt.w.l++)
|
/* Transfer from disk to RAM */
|
||||||
|
if (!BIT(m_fdc_ctrl, 4))
|
||||||
{
|
{
|
||||||
/* Read a byte at a time */
|
/* Read a byte at a time */
|
||||||
UINT8 data = m_wd1791->data_r() ^ 0xff;
|
UINT8 data = m_wd1791->data_r() ^ 0xff;
|
||||||
@ -1578,45 +1579,12 @@ void cmi_state::fdc_dma_transfer()
|
|||||||
if (phys_page & 0x80)
|
if (phys_page & 0x80)
|
||||||
m_q256_ram[i][((phys_page & 0x7f) * PAGE_SIZE) + (m_fdc_dma_addr.w.l & PAGE_MASK)] = data;
|
m_q256_ram[i][((phys_page & 0x7f) * PAGE_SIZE) + (m_fdc_dma_addr.w.l & PAGE_MASK)] = data;
|
||||||
|
|
||||||
/* TODO: Is updating these correct? */
|
|
||||||
if (!BIT(m_fdc_ctrl, 3))
|
if (!BIT(m_fdc_ctrl, 3))
|
||||||
m_fdc_dma_addr.w.l++;
|
m_fdc_dma_addr.w.l++;
|
||||||
|
|
||||||
if ((m_fdc_dma_addr.w.l % PAGE_SIZE) == 0)
|
|
||||||
{
|
|
||||||
++cpu_page;
|
|
||||||
|
|
||||||
for (int i = 0; i < NUM_Q256_CARDS; ++i)
|
|
||||||
{
|
|
||||||
phys_page = m_map_ram[i][(map << PAGE_SHIFT) | cpu_page];
|
|
||||||
|
|
||||||
if (phys_page & 0x80)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transfer from RAM to disk
|
// Transfer from RAM to disk
|
||||||
else
|
else
|
||||||
{
|
|
||||||
/* TODO: Check me and combine common code with the above */
|
|
||||||
/* Determine the initial page */
|
|
||||||
int cpu_page = (m_fdc_dma_addr.w.l & ~PAGE_MASK) / PAGE_SIZE;
|
|
||||||
int phys_page = 0;
|
|
||||||
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < NUM_Q256_CARDS; ++i)
|
|
||||||
{
|
|
||||||
phys_page = m_map_ram[i][(map << PAGE_SHIFT) | cpu_page];
|
|
||||||
|
|
||||||
if (phys_page & 0x80)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
phys_page &= 0x7f;
|
|
||||||
|
|
||||||
for (; m_fdc_dma_cnt.w.l < 0xffff && m_fdc_drq; m_fdc_dma_cnt.w.l++)
|
|
||||||
{
|
{
|
||||||
/* Write a byte at a time */
|
/* Write a byte at a time */
|
||||||
UINT8 data = 0;
|
UINT8 data = 0;
|
||||||
@ -1627,29 +1595,8 @@ void cmi_state::fdc_dma_transfer()
|
|||||||
|
|
||||||
m_wd1791->data_w(data ^ 0xff);
|
m_wd1791->data_w(data ^ 0xff);
|
||||||
|
|
||||||
/* TODO: Is updating these correct? */
|
|
||||||
if (!BIT(m_fdc_ctrl, 3))
|
if (!BIT(m_fdc_ctrl, 3))
|
||||||
m_fdc_dma_addr.w.l++;
|
m_fdc_dma_addr.w.l++;
|
||||||
|
|
||||||
if ((m_fdc_dma_addr.w.l % PAGE_SIZE) == 0)
|
|
||||||
{
|
|
||||||
++cpu_page;
|
|
||||||
|
|
||||||
for (int i = 0; i < NUM_Q256_CARDS; ++i)
|
|
||||||
{
|
|
||||||
phys_page = m_map_ram[i][(map << PAGE_SHIFT) | cpu_page];
|
|
||||||
|
|
||||||
if (phys_page & 0x80)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((phys_page & 0x80) == 0)
|
|
||||||
{
|
|
||||||
printf("Trying to DMA floppy data from a non-enabled page!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2793,7 +2740,7 @@ static MACHINE_CONFIG_START( cmi2x, cmi_state )
|
|||||||
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(cmi_state, wd1791_irq))
|
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(cmi_state, wd1791_irq))
|
||||||
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(cmi_state, wd1791_drq))
|
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(cmi_state, wd1791_drq))
|
||||||
MCFG_FLOPPY_DRIVE_ADD("wd1791:0", cmi2x_floppies, "8dsdd", floppy_image_device::default_floppy_formats)
|
MCFG_FLOPPY_DRIVE_ADD("wd1791:0", cmi2x_floppies, "8dsdd", floppy_image_device::default_floppy_formats)
|
||||||
MCFG_FLOPPY_DRIVE_ADD("wd1791:1", cmi2x_floppies, "8dsdd", floppy_image_device::default_floppy_formats)
|
MCFG_FLOPPY_DRIVE_ADD("wd1791:1", cmi2x_floppies, nullptr, floppy_image_device::default_floppy_formats)
|
||||||
|
|
||||||
// Channel cards
|
// Channel cards
|
||||||
MCFG_CMI01A_ADD("cmi01a_0", 0)
|
MCFG_CMI01A_ADD("cmi01a_0", 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user