From 64bd4e092b1dc01d07630652e935f17daf331d64 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Wed, 5 Feb 2025 21:43:22 +0200 Subject: [PATCH] When caching next CD sectors, don't seek backwards and release semaphore during read. --- akiko.cpp | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/akiko.cpp b/akiko.cpp index fa566cfa..07d95d26 100644 --- a/akiko.cpp +++ b/akiko.cpp @@ -486,7 +486,7 @@ static int cdrom_tx_dma_delay, cdrom_rx_dma_delay; static uae_u8 *sector_buffer_1, *sector_buffer_2; static int sector_buffer_sector_1, sector_buffer_sector_2; -#define SECTOR_BUFFER_SIZE 64 +#define SECTOR_BUFFER_SIZE 128 static uae_u8 *sector_buffer_info_1, *sector_buffer_info_2; static int unitnum = -1; @@ -1589,35 +1589,49 @@ static void akiko_thread (void *null) (sector_buffer_sector_1 < 0 || sector < sector_buffer_sector_1 || sector >= sector_buffer_sector_1 + SECTOR_BUFFER_SIZE * 2 / 3 || secnum != SECTOR_BUFFER_SIZE)) { int blocks; memset (sector_buffer_info_2, 0, SECTOR_BUFFER_SIZE); -#if AKIKO_DEBUG_IO_CMD - if (log_cd32 > 0) - write_log (_T("CD32: filling buffer sector=%d\n"), sector); -#endif sector_buffer_sector_2 = sector; - if (!is_valid_data_sector(sector + SECTOR_BUFFER_SIZE)) { - for (blocks = SECTOR_BUFFER_SIZE; blocks > 0; blocks--) { + secnum = 0; + if (sector_buffer_sector_1 >= 0 && sector >= sector_buffer_sector_1 && sector < sector_buffer_sector_1 + SECTOR_BUFFER_SIZE) { + int secoff = sector - sector_buffer_sector_1; + while (secoff < SECTOR_BUFFER_SIZE) { + memcpy(sector_buffer_2 + secnum * 2352, sector_buffer_1 + secoff * 2352, 2352); + sector_buffer_info_2[secnum] = 3; + secnum++; + secoff++; + } + } + if (!is_valid_data_sector(sector + SECTOR_BUFFER_SIZE - 1)) { + for (blocks = SECTOR_BUFFER_SIZE - 1; blocks > secnum; blocks--) { if (is_valid_data_sector(sector + blocks)) break; } } else { - blocks = SECTOR_BUFFER_SIZE; + blocks = SECTOR_BUFFER_SIZE - secnum; } +#if AKIKO_DEBUG_IO_CMD + if (1) + write_log(_T("CD32: filling buffer sector=%d-%d, blocks=%d\n"), sector, sector + blocks - 1, blocks); +#endif if (blocks) { + uae_sem_post(&akiko_sem); int ok = sys_command_cd_rawread (unitnum, sector_buffer_2, sector, blocks, 2352); if (!ok) { - int offset = 0; + int offset = secnum; while (offset < SECTOR_BUFFER_SIZE) { int readok = 0; - if (is_valid_data_sector(sector)) + if (is_valid_data_sector(sector)) { readok = sys_command_cd_rawread (unitnum, sector_buffer_2 + offset * 2352, sector, 1, 2352); + } sector_buffer_info_2[offset] = readok ? 3 : 0; offset++; sector++; } } else { - for (int i = 0; i < SECTOR_BUFFER_SIZE; i++) + for (int i = 0; i < SECTOR_BUFFER_SIZE; i++) { sector_buffer_info_2[i] = i < blocks ? 3 : 0; + } } + uae_sem_wait(&akiko_sem); tmp1 = sector_buffer_info_1; sector_buffer_info_1 = sector_buffer_info_2; sector_buffer_info_2 = tmp1; -- 2.47.3