Skip to content

Commit 698b634

Browse files
authored
konami/konamigv.cpp, konami/konamigq.cpp, konami/twinkle.cpp: Process SCSI DMA transfers instantaneously. (#12375)
* Avoids issues described in MT08860. * Also added TODO notes about implementing correct DMA timings.
1 parent d238f4b commit 698b634

File tree

3 files changed

+15
-21
lines changed

3 files changed

+15
-21
lines changed

src/mame/konami/konamigq.cpp

+5-7
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ void konamigq_state::scsi_dma_read( uint32_t *p_n_psxram, uint32_t n_address, in
287287
m_dma_offset = n_address;
288288
m_dma_size = n_size * 4;
289289
m_dma_is_write = false;
290-
m_dma_timer->adjust(attotime::from_usec(10));
290+
m_dma_timer->adjust(attotime::zero);
291291
}
292292

293293
void konamigq_state::scsi_dma_write( uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size )
@@ -296,12 +296,13 @@ void konamigq_state::scsi_dma_write( uint32_t *p_n_psxram, uint32_t n_address, i
296296
m_dma_offset = n_address;
297297
m_dma_size = n_size * 4;
298298
m_dma_is_write = true;
299-
m_dma_timer->adjust(attotime::from_usec(10));
299+
m_dma_timer->adjust(attotime::zero);
300300
}
301301

302302
TIMER_CALLBACK_MEMBER(konamigq_state::scsi_dma_transfer)
303303
{
304-
if (m_dma_requested && m_dma_data_ptr != nullptr && m_dma_size > 0)
304+
// TODO: Figure out proper DMA timings
305+
while (m_dma_requested && m_dma_data_ptr != nullptr && m_dma_size > 0)
305306
{
306307
if (m_dma_is_write)
307308
m_ncr53cf96->dma_w(util::little_endian_cast<const uint8_t>(m_dma_data_ptr)[m_dma_offset]);
@@ -311,15 +312,12 @@ TIMER_CALLBACK_MEMBER(konamigq_state::scsi_dma_transfer)
311312
m_dma_offset++;
312313
m_dma_size--;
313314
}
314-
315-
if (m_dma_requested && m_dma_size > 0)
316-
m_dma_timer->adjust(attotime::from_usec(10));
317315
}
318316

319317
void konamigq_state::scsi_drq(int state)
320318
{
321319
if (!m_dma_requested && state)
322-
m_dma_timer->adjust(attotime::from_usec(10));
320+
m_dma_timer->adjust(attotime::zero);
323321

324322
m_dma_requested = state;
325323
}

src/mame/konami/konamigv.cpp

+5-7
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ void konamigv_state::scsi_dma_read(uint32_t *p_n_psxram, uint32_t n_address, int
455455
m_dma_offset = n_address;
456456
m_dma_size = n_size * 4;
457457
m_dma_is_write = false;
458-
m_dma_timer->adjust(attotime::from_usec(10));
458+
m_dma_timer->adjust(attotime::zero);
459459
}
460460

461461
void konamigv_state::scsi_dma_write(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size)
@@ -464,12 +464,13 @@ void konamigv_state::scsi_dma_write(uint32_t *p_n_psxram, uint32_t n_address, in
464464
m_dma_offset = n_address;
465465
m_dma_size = n_size * 4;
466466
m_dma_is_write = true;
467-
m_dma_timer->adjust(attotime::from_usec(10));
467+
m_dma_timer->adjust(attotime::zero);
468468
}
469469

470470
TIMER_CALLBACK_MEMBER(konamigv_state::scsi_dma_transfer)
471471
{
472-
if (m_dma_requested && m_dma_data_ptr != nullptr && m_dma_size > 0)
472+
// TODO: Figure out proper DMA timings
473+
while (m_dma_requested && m_dma_data_ptr != nullptr && m_dma_size > 0)
473474
{
474475
if (m_dma_is_write)
475476
m_ncr53cf96->dma_w(util::little_endian_cast<const uint8_t>(m_dma_data_ptr)[m_dma_offset]);
@@ -479,15 +480,12 @@ TIMER_CALLBACK_MEMBER(konamigv_state::scsi_dma_transfer)
479480
m_dma_offset++;
480481
m_dma_size--;
481482
}
482-
483-
if (m_dma_requested && m_dma_size > 0)
484-
m_dma_timer->adjust(attotime::from_usec(10));
485483
}
486484

487485
void konamigv_state::scsi_drq(int state)
488486
{
489487
if (!m_dma_requested && state)
490-
m_dma_timer->adjust(attotime::from_usec(10));
488+
m_dma_timer->adjust(attotime::zero);
491489

492490
m_dma_requested = state;
493491
}

src/mame/konami/twinkle.cpp

+5-7
Original file line numberDiff line numberDiff line change
@@ -1088,7 +1088,7 @@ void twinkle_state::scsi_dma_read(uint32_t *p_n_psxram, uint32_t n_address, int3
10881088
m_dma_offset = n_address;
10891089
m_dma_size = n_size * 4;
10901090
m_dma_is_write = false;
1091-
m_dma_timer->adjust(attotime::from_usec(10));
1091+
m_dma_timer->adjust(attotime::zero);
10921092
}
10931093

10941094
void twinkle_state::scsi_dma_write(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size)
@@ -1097,12 +1097,13 @@ void twinkle_state::scsi_dma_write(uint32_t *p_n_psxram, uint32_t n_address, int
10971097
m_dma_offset = n_address;
10981098
m_dma_size = n_size * 4;
10991099
m_dma_is_write = true;
1100-
m_dma_timer->adjust(attotime::from_usec(10));
1100+
m_dma_timer->adjust(attotime::zero);
11011101
}
11021102

11031103
TIMER_CALLBACK_MEMBER(twinkle_state::scsi_dma_transfer)
11041104
{
1105-
if (m_dma_requested && m_dma_data_ptr != nullptr && m_dma_size > 0)
1105+
// TODO: Figure out proper DMA timings
1106+
while (m_dma_requested && m_dma_data_ptr != nullptr && m_dma_size > 0)
11061107
{
11071108
if (m_dma_is_write)
11081109
m_ncr53cf96->dma_w(util::little_endian_cast<const uint8_t>(m_dma_data_ptr)[m_dma_offset]);
@@ -1112,15 +1113,12 @@ TIMER_CALLBACK_MEMBER(twinkle_state::scsi_dma_transfer)
11121113
m_dma_offset++;
11131114
m_dma_size--;
11141115
}
1115-
1116-
if (m_dma_requested && m_dma_size > 0)
1117-
m_dma_timer->adjust(attotime::from_usec(10));
11181116
}
11191117

11201118
void twinkle_state::scsi_drq(int state)
11211119
{
11221120
if (!m_dma_requested && state)
1123-
m_dma_timer->adjust(attotime::from_usec(10));
1121+
m_dma_timer->adjust(attotime::zero);
11241122

11251123
m_dma_requested = state;
11261124
}

0 commit comments

Comments
 (0)