r9751: More PDC DMA additions

This commit is contained in:
Brandon Munger 2015-12-05 19:06:50 -05:00
parent 862abdaf21
commit fbaf2f4358
3 changed files with 40 additions and 15 deletions

View File

@ -61,7 +61,7 @@ ADDRESS_MAP_END
//------------------------------------------------- //-------------------------------------------------
static ADDRESS_MAP_START( pdc_io, AS_IO, 8, pdc_device ) static ADDRESS_MAP_START( pdc_io, AS_IO, 8, pdc_device )
AM_RANGE(0x00, 0x05) AM_READWRITE(p0_5_r,p0_5_w) AM_MIRROR(0xFF00) AM_RANGE(0x00, 0x07) AM_READWRITE(p0_7_r,p0_7_w) AM_MIRROR(0xFF00)
AM_RANGE(0x21, 0x2F) AM_READWRITE(fdd_68k_r,fdd_68k_w) AM_MIRROR(0xFF00) AM_RANGE(0x21, 0x2F) AM_READWRITE(fdd_68k_r,fdd_68k_w) AM_MIRROR(0xFF00)
AM_RANGE(0x38, 0x38) AM_READ(p38_r) AM_MIRROR(0xFF00) // Possibly UPD765 interrupt AM_RANGE(0x38, 0x38) AM_READ(p38_r) AM_MIRROR(0xFF00) // Possibly UPD765 interrupt
AM_RANGE(0x39, 0x39) AM_READ(p39_r) AM_MIRROR(0xFF00) // HDD related AM_RANGE(0x39, 0x39) AM_READ(p39_r) AM_MIRROR(0xFF00) // HDD related
@ -127,7 +127,7 @@ static MACHINE_CONFIG_FRAGMENT( pdc )
MCFG_I8237_IN_IOR_0_CB(READ8(pdc_device, i8237_fdc_dma_r)) MCFG_I8237_IN_IOR_0_CB(READ8(pdc_device, i8237_fdc_dma_r))
MCFG_I8237_OUT_IOW_0_CB(WRITE8(pdc_device, i8237_fdc_dma_w)) MCFG_I8237_OUT_IOW_0_CB(WRITE8(pdc_device, i8237_fdc_dma_w))
MCFG_I8237_IN_IOR_1_CB(READ8(pdc_device, m68k_dma_r)) MCFG_I8237_IN_IOR_1_CB(READ8(pdc_device, m68k_dma_r))
MCFG_I8237_OUT_IOW_0_CB(WRITE8(pdc_device, m68k_dma_w)) MCFG_I8237_OUT_IOW_1_CB(WRITE8(pdc_device, m68k_dma_w))
// MCFG_AM9517A_OUT_DACK_0_CB(WRITELINE(pdc_device, fdc_dack_w)) // MCFG_AM9517A_OUT_DACK_0_CB(WRITELINE(pdc_device, fdc_dack_w))
/* Hard Disk Controller - HDC9224 */ /* Hard Disk Controller - HDC9224 */
@ -182,7 +182,10 @@ void pdc_device::device_reset()
{ {
/* Reset registers */ /* Reset registers */
reg_p38 = 0; reg_p38 = 0;
reg_p38 |= 4; /* ready for 68k ram DMA */
//reg_p38 |= 0x20; // no idea at all - bit 5 (32)
m_fdc->set_ready_line_connected(false);
m_fdc->ready_w(true);
/* Reset CPU */ /* Reset CPU */
m_pdccpu->reset(); m_pdccpu->reset();
@ -204,6 +207,8 @@ WRITE_LINE_MEMBER(pdc_device::i8237_hreq_w)
WRITE_LINE_MEMBER(pdc_device::i8237_eop_w) WRITE_LINE_MEMBER(pdc_device::i8237_eop_w)
{ {
m_fdc->tc_w(state); m_fdc->tc_w(state);
reg_p38 |= 4; /* ready for 68k ram DMA */
if(state) m_dma8237->dreq1_w(0);
} }
READ8_MEMBER(pdc_device::i8237_dma_mem_r) READ8_MEMBER(pdc_device::i8237_dma_mem_r)
@ -219,17 +224,18 @@ WRITE8_MEMBER(pdc_device::i8237_dma_mem_w)
READ8_MEMBER(pdc_device::i8237_fdc_dma_r) READ8_MEMBER(pdc_device::i8237_fdc_dma_r)
{ {
UINT8 ret = m_fdc->dma_r(); UINT8 ret = m_fdc->dma_r();
logerror("PDC: 8237 DMA CHANNEL 0 READ ADDRESS: %08X, DATA: %02X\n", offset, ret );
return ret; return ret;
} }
WRITE8_MEMBER(pdc_device::i8237_fdc_dma_w) WRITE8_MEMBER(pdc_device::i8237_fdc_dma_w)
{ {
logerror("PDC: 8237 DMA CHANNEL 0 WRITE ADDRESS: %08X, DATA: %02X\n", offset, data );
m_fdc->dma_w(data); m_fdc->dma_w(data);
} }
READ8_MEMBER(pdc_device::m68k_dma_r) READ8_MEMBER(pdc_device::m68k_dma_r)
{ {
//return m_m68k_r_cb(offset);
UINT32 address; UINT32 address;
UINT8 data; UINT8 data;
@ -241,8 +247,9 @@ READ8_MEMBER(pdc_device::m68k_dma_r)
WRITE8_MEMBER(pdc_device::m68k_dma_w) WRITE8_MEMBER(pdc_device::m68k_dma_w)
{ {
//m_m68k_w_cb(offset,data); UINT32 address = fdd_68k_dma_address++;
logerror("PDC: 8237 DMA CHANNEL 1 WRITE ADDRESS: %08X, DATA: %02X\n", offset, data ); logerror("PDC: 8237 DMA CHANNEL 1 WRITE ADDRESS: %08X, DATA: %02X\n", address, data );
m_m68k_w_cb(data);
} }
WRITE_LINE_MEMBER(pdc_device::hdd_irq) WRITE_LINE_MEMBER(pdc_device::hdd_irq)
@ -254,7 +261,7 @@ WRITE_LINE_MEMBER(pdc_device::fdc_irq)
{ {
b_fdc_irq = state != 0; b_fdc_irq = state != 0;
} }
READ8_MEMBER(pdc_device::p0_5_r) READ8_MEMBER(pdc_device::p0_7_r)
{ {
switch(offset) switch(offset)
{ {
@ -270,13 +277,19 @@ READ8_MEMBER(pdc_device::p0_5_r)
case 3: /* Port 3: FDD command address high byte [0x5FF0C0B0][0x5FF0C1B0] */ case 3: /* Port 3: FDD command address high byte [0x5FF0C0B0][0x5FF0C1B0] */
logerror("PDC: Port 0x03 READ: %02X\n", reg_p3); logerror("PDC: Port 0x03 READ: %02X\n", reg_p3);
return reg_p3; return reg_p3;
case 6: /* Port 6: FDD data destination address low byte [0x5FF080B0] */
logerror("PDC: Port 0x06 READ: %02X\n", reg_p6);
return reg_p6;
case 7: /* Port 7: FDD data destination address high byte [0x5FF080B0] */
logerror("PDC: Port 0x07 READ: %02X\n", reg_p7);
return reg_p7;
default: default:
logerror("(!)PDC: Port %02X READ: \n", offset); logerror("(!)PDC: Port %02X READ: \n", offset);
return 0; return 0;
} }
} }
WRITE8_MEMBER(pdc_device::p0_5_w) WRITE8_MEMBER(pdc_device::p0_7_w)
{ {
switch(offset) switch(offset)
{ {
@ -330,6 +343,8 @@ WRITE8_MEMBER(pdc_device::fdd_68k_w)
{ {
case 0x80: case 0x80:
m_dma8237->dreq1_w(1); m_dma8237->dreq1_w(1);
reg_p38 &= ~4; // Clear bit 4
logerror("PDC: Port 0x26 WRITE: 0x80, DMA REQ CH 1\n");
break; break;
} }
break; break;
@ -338,26 +353,28 @@ WRITE8_MEMBER(pdc_device::fdd_68k_w)
{ {
case 0xFF: case 0xFF:
m_dma8237->dreq1_w(0); m_dma8237->dreq1_w(0);
logerror("PDC: Port 0x2C WRITE: 0xFF, DMA REQ CH 1 OFF\n");
break; break;
} }
break; break;
default: default:
logerror("(!)PDC: Port %02X WRITE: %02X\n", address, data); logerror("(!)PDC: Port %02X WRITE: %02X, PC: %X\n", address, data, space.device().safe_pc());
break; break;
} }
} }
WRITE8_MEMBER(pdc_device::p38_w) WRITE8_MEMBER(pdc_device::p38_w)
{ {
logerror("PDC: Port 0x38 set bit: %i\n", data); logerror("PDC: Port 0x38 WRITE: %i\n", data);
//reg_p38 |= data; //reg_p38 |= data;
reg_p38 = data; reg_p38 = data;
} }
READ8_MEMBER(pdc_device::p38_r) READ8_MEMBER(pdc_device::p38_r)
{ {
reg_p38 ^= 0x20; /* Invert bit 5 (32) */
//UINT8 retn; //UINT8 retn;
// logerror("PDC: Port 0x38 READ: %02X\n", reg_p38); logerror("PDC: Port 0x38 READ: %02X, PC: %X\n", reg_p38, space.device().safe_pc());
//retn = reg_p38; //retn = reg_p38;
//reg_p38 &= ~2; // Clear bit 1 //reg_p38 &= ~2; // Clear bit 1
//return retn; //return retn;
@ -368,5 +385,6 @@ READ8_MEMBER(pdc_device::p39_r)
{ {
UINT8 data = 1; UINT8 data = 1;
if(b_fdc_irq) data |= 8; // Set bit 3 if(b_fdc_irq) data |= 8; // Set bit 3
logerror("PDC: Port 0x39 READ: %02X, PC: %X\n", data, space.device().safe_pc());
return data; return data;
} }

View File

@ -55,8 +55,8 @@ public:
DECLARE_WRITE_LINE_MEMBER(hdd_irq); DECLARE_WRITE_LINE_MEMBER(hdd_irq);
DECLARE_READ8_MEMBER(p0_5_r); DECLARE_READ8_MEMBER(p0_7_r);
DECLARE_WRITE8_MEMBER(p0_5_w); DECLARE_WRITE8_MEMBER(p0_7_w);
DECLARE_READ8_MEMBER(fdd_68k_r); DECLARE_READ8_MEMBER(fdd_68k_r);
DECLARE_WRITE8_MEMBER(fdd_68k_w); DECLARE_WRITE8_MEMBER(fdd_68k_w);
DECLARE_WRITE8_MEMBER(p38_w); DECLARE_WRITE8_MEMBER(p38_w);
@ -76,15 +76,18 @@ public:
UINT8 reg_p3; UINT8 reg_p3;
UINT8 reg_p4; UINT8 reg_p4;
UINT8 reg_p5; UINT8 reg_p5;
UINT8 reg_p6;
UINT8 reg_p7;
UINT8 reg_p21; UINT8 reg_p21;
UINT8 reg_p38; UINT8 reg_p38;
UINT32 fdd_68k_dma_address;
protected: protected:
/* Device-level overrides */ /* Device-level overrides */
virtual void device_start(); virtual void device_start();
virtual void device_reset(); virtual void device_reset();
/* Protected variables */ /* Protected variables */
UINT32 fdd_68k_dma_address; //UINT32 fdd_68k_dma_address;
bool b_fdc_irq; bool b_fdc_irq;
/* Attached devices */ /* Attached devices */

View File

@ -105,7 +105,7 @@ READ8_MEMBER(r9751_state::pdc_dma_r)
WRITE8_MEMBER(r9751_state::pdc_dma_w) WRITE8_MEMBER(r9751_state::pdc_dma_w)
{ {
m_maincpu->space(AS_PROGRAM).write_byte(offset,data); m_maincpu->space(AS_PROGRAM).write_byte(m_pdc->fdd_68k_dma_address,data);
} }
DRIVER_INIT_MEMBER(r9751_state,r9751) DRIVER_INIT_MEMBER(r9751_state,r9751)
@ -238,6 +238,10 @@ WRITE32_MEMBER( r9751_state::r9751_mmio_5ff_w )
case 0x5FF080B0: /* fdd_dest_address register */ case 0x5FF080B0: /* fdd_dest_address register */
fdd_dest_address = data << 1; fdd_dest_address = data << 1;
logerror("--- FDD destination address: %08X\n", fdd_dest_address); logerror("--- FDD destination address: %08X\n", fdd_dest_address);
data_b0 = data & 0xFF;
data_b1 = (data & 0xFF00) >> 8;
m_pdc->reg_p6 = data_b0;
m_pdc->reg_p7 = data_b1;
break; break;
case 0x5FF0C0B0: case 0x5FF0C0B0:
case 0x5FF0C1B0: /* FDD command address register */ case 0x5FF0C1B0: /* FDD command address register */