diff --git a/src/core/cdrom.cpp b/src/core/cdrom.cpp
index f8c5be2ad..22c5a785e 100644
--- a/src/core/cdrom.cpp
+++ b/src/core/cdrom.cpp
@@ -83,6 +83,8 @@ void CDROM::SoftReset()
   m_async_response_fifo.Clear();
   m_data_fifo.Clear();
 
+  m_current_read_sector_buffer = 0;
+  m_current_write_sector_buffer = 0;
   for (u32 i = 0; i < NUM_SECTOR_BUFFERS; i++)
   {
     m_sector_buffers[i].data.fill(0);
@@ -129,6 +131,8 @@ bool CDROM::DoState(StateWrapper& sw)
   sw.Do(&m_async_response_fifo);
   sw.Do(&m_data_fifo);
 
+  sw.Do(&m_current_read_sector_buffer);
+  sw.Do(&m_current_write_sector_buffer);
   for (u32 i = 0; i < NUM_SECTOR_BUFFERS; i++)
   {
     sw.Do(&m_sector_buffers[i].data);
@@ -1090,6 +1094,8 @@ void CDROM::BeginReading(TickCount ticks_late)
   m_drive_state = DriveState::Reading;
   m_drive_event->SetInterval(ticks);
   m_drive_event->Schedule(ticks - ticks_late);
+  m_current_read_sector_buffer = 0;
+  m_current_write_sector_buffer = 0;
 
   m_reader.QueueReadSector(m_last_requested_sector);
 }
@@ -1130,6 +1136,8 @@ void CDROM::BeginPlaying(u8 track_bcd, TickCount ticks_late)
   m_drive_state = DriveState::Playing;
   m_drive_event->SetInterval(ticks);
   m_drive_event->Schedule(ticks - ticks_late);
+  m_current_read_sector_buffer = 0;
+  m_current_write_sector_buffer = 0;
 
   m_reader.QueueReadSector(m_last_requested_sector);
 }
@@ -1405,8 +1413,9 @@ void CDROM::ProcessDataSector(const u8* raw_sector, const CDImage::SubChannelQ&
 {
   ProcessDataSectorHeader(raw_sector, true);
 
-  Log_DevPrintf("Read sector %u: mode %u submode 0x%02X", m_last_requested_sector,
-                ZeroExtend32(m_last_sector_header.sector_mode), ZeroExtend32(m_last_sector_subheader.submode.bits));
+  Log_DevPrintf("Read sector %u: mode %u submode 0x%02X into buffer %u", m_last_requested_sector,
+                ZeroExtend32(m_last_sector_header.sector_mode), ZeroExtend32(m_last_sector_subheader.submode.bits),
+                m_current_write_sector_buffer);
 
   if (m_mode.xa_enable && m_last_sector_header.sector_mode == 2)
   {
@@ -1436,14 +1445,12 @@ void CDROM::ProcessDataSector(const u8* raw_sector, const CDImage::SubChannelQ&
   }
 
   // TODO: How does XA relate to this buffering?
-  SectorBuffer* sb = &m_sector_buffers[0];
+  SectorBuffer* sb = &m_sector_buffers[m_current_write_sector_buffer];
+  m_current_write_sector_buffer = (m_current_write_sector_buffer + 1) % NUM_SECTOR_BUFFERS;
   if (sb->size > 0)
   {
-    sb = &m_sector_buffers[1];
-    if (sb->size > 0)
-      Log_WarningPrintf("Sector buffer was not read, previous sector dropped");
-    else
-      Log_DevPrintf("Sector buffer was not read, buffering sector");
+    Log_WarningPrintf("Sector buffer %u was not read, previous sector dropped",
+                      (m_current_write_sector_buffer - 1) % NUM_SECTOR_BUFFERS);
   }
 
   Assert(!m_mode.ignore_bit);
@@ -1686,7 +1693,7 @@ void CDROM::LoadDataFIFO()
   }
 
   // any data to load?
-  SectorBuffer& sb = m_sector_buffers[0];
+  SectorBuffer& sb = m_sector_buffers[m_current_read_sector_buffer];
   if (sb.size == 0)
   {
     Log_WarningPrintf("Attempting to load empty sector buffer");
@@ -1694,18 +1701,12 @@ void CDROM::LoadDataFIFO()
   }
   else
   {
-    m_data_fifo.PushRange(sb.data.data(), m_sector_buffers[0].size);
+    m_data_fifo.PushRange(sb.data.data(), sb.size);
     sb.size = 0;
   }
 
-  SectorBuffer& next_sb = m_sector_buffers[1];
-  if (next_sb.size > 0)
-  {
-    sb.data.swap(next_sb.data);
-    std::swap(sb.size, next_sb.size);
-  }
-
-  Log_DebugPrintf("Loaded %u bytes to data FIFO", m_data_fifo.GetSize());
+  Log_DevPrintf("Loaded %u bytes to data FIFO from buffer %u", m_data_fifo.GetSize(), m_current_read_sector_buffer);
+  m_current_read_sector_buffer = m_current_write_sector_buffer;
 }
 
 void CDROM::ClearSectorBuffers()
diff --git a/src/core/cdrom.h b/src/core/cdrom.h
index 2ed0ef33d..814163da8 100644
--- a/src/core/cdrom.h
+++ b/src/core/cdrom.h
@@ -57,7 +57,7 @@ private:
     PARAM_FIFO_SIZE = 16,
     RESPONSE_FIFO_SIZE = 16,
     DATA_FIFO_SIZE = RAW_SECTOR_OUTPUT_SIZE,
-    NUM_SECTOR_BUFFERS = 2,
+    NUM_SECTOR_BUFFERS = 8,
   };
 
   static constexpr u8 INTERRUPT_REGISTER_MASK = 0x1F;
@@ -289,6 +289,8 @@ private:
     u32 size;
   };
 
+  u32 m_current_read_sector_buffer = 0;
+  u32 m_current_write_sector_buffer = 0;
   std::array<SectorBuffer, NUM_SECTOR_BUFFERS> m_sector_buffers;
 
   CDROMAsyncReader m_reader;