summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/machine/atapihle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/machine/atapihle.c')
-rw-r--r--src/emu/machine/atapihle.c99
1 files changed, 57 insertions, 42 deletions
diff --git a/src/emu/machine/atapihle.c b/src/emu/machine/atapihle.c
index ecc6d69e789..2b21252e8fe 100644
--- a/src/emu/machine/atapihle.c
+++ b/src/emu/machine/atapihle.c
@@ -34,29 +34,15 @@ void atapi_hle_device::process_buffer()
if (m_buffer_size > ATAPI_BUFFER_LENGTH || m_buffer_size == 0)
m_buffer_size = ATAPI_BUFFER_LENGTH;
- // TODO: dma flag
+ if (m_feature & ATAPI_FEATURES_FLAG_OVL)
+ {
+ printf( "ATAPI_FEATURES_FLAG_OVL not supported\n" );
+ }
+
switch (phase)
{
case SCSI_PHASE_DATAOUT:
- if (m_buffer_size > m_data_size)
- {
- m_buffer_size = m_data_size;
- }
-
- m_cylinder_low = m_buffer_size & 0xff;
- m_cylinder_high = m_buffer_size >> 8;
-
- if (m_buffer_size > 0)
- {
- m_status |= IDE_STATUS_DRQ;
- m_sector_count = 0;
- }
- else
- {
- m_sector_count = ATAPI_INTERRUPT_REASON_IO | ATAPI_INTERRUPT_REASON_CD;
- }
-
- set_irq(ASSERT_LINE);
+ wait_buffer();
break;
case SCSI_PHASE_DATAIN:
@@ -82,25 +68,7 @@ void atapi_hle_device::process_buffer()
m_scsidev_device->WriteData( m_buffer, m_buffer_size );
m_data_size -= m_buffer_size;
- if (m_buffer_size > m_data_size)
- {
- m_buffer_size = m_data_size;
- }
-
- m_cylinder_low = m_buffer_size & 0xff;
- m_cylinder_high = m_buffer_size >> 8;
-
- if (m_buffer_size > 0)
- {
- m_status |= IDE_STATUS_DRQ;
- m_sector_count = 0;
- }
- else
- {
- m_sector_count = ATAPI_INTERRUPT_REASON_IO | ATAPI_INTERRUPT_REASON_CD;
- }
-
- set_irq(ASSERT_LINE);
+ wait_buffer();
break;
}
}
@@ -111,10 +79,14 @@ void atapi_hle_device::fill_buffer()
switch (m_command)
{
case IDE_COMMAND_PACKET:
- if (m_buffer_size > m_data_size)
+ if (m_buffer_size >= m_data_size)
{
m_buffer_size = m_data_size;
}
+ else if (m_buffer_size & 1)
+ {
+ m_buffer_size--;
+ }
m_cylinder_low = m_buffer_size & 0xff;
m_cylinder_high = m_buffer_size >> 8;
@@ -126,13 +98,21 @@ void atapi_hle_device::fill_buffer()
m_status |= IDE_STATUS_DRQ;
m_sector_count = ATAPI_INTERRUPT_REASON_IO;
+
+ if (m_feature & ATAPI_FEATURES_FLAG_DMA)
+ {
+ set_dmarq(ASSERT_LINE);
+ }
+ else
+ {
+ set_irq(ASSERT_LINE);
+ }
}
else
{
m_sector_count = ATAPI_INTERRUPT_REASON_IO | ATAPI_INTERRUPT_REASON_CD;
+ set_irq(ASSERT_LINE);
}
-
- set_irq(ASSERT_LINE);
break;
case IDE_COMMAND_IDENTIFY_PACKET_DEVICE:
@@ -145,6 +125,41 @@ void atapi_hle_device::fill_buffer()
}
}
+void atapi_hle_device::wait_buffer()
+{
+ if (m_buffer_size >= m_data_size)
+ {
+ m_buffer_size = m_data_size;
+ }
+ else if (m_buffer_size & 1)
+ {
+ m_buffer_size--;
+ }
+
+ m_cylinder_low = m_buffer_size & 0xff;
+ m_cylinder_high = m_buffer_size >> 8;
+
+ if (m_buffer_size > 0)
+ {
+ m_status |= IDE_STATUS_DRQ;
+ m_sector_count = 0;
+
+ if (m_feature & ATAPI_FEATURES_FLAG_DMA)
+ {
+ set_dmarq(ASSERT_LINE);
+ }
+ else
+ {
+ set_irq(ASSERT_LINE);
+ }
+ }
+ else
+ {
+ m_sector_count = ATAPI_INTERRUPT_REASON_IO | ATAPI_INTERRUPT_REASON_CD;
+ set_irq(ASSERT_LINE);
+ }
+}
+
void atapi_hle_device::signature()
{
// TODO: IDENTIFY DEVICE & READ SECTORS writes signature too.