CDROM: Initial debug windows
This commit is contained in:
parent
a6a121f8fe
commit
0324ae2fd7
|
@ -11,20 +11,6 @@ CDImage::~CDImage()
|
|||
m_data_file->Release();
|
||||
}
|
||||
|
||||
constexpr u64 CDImage::MSFToLBA(u32 pregap_seconds, u32 minute, u32 second, u32 frame)
|
||||
{
|
||||
return ZeroExtend64(minute) * FRAMES_PER_MINUTE + ZeroExtend64(second) * FRAMES_PER_SECOND + ZeroExtend64(frame) -
|
||||
ZeroExtend64(pregap_seconds) * FRAMES_PER_SECOND;
|
||||
}
|
||||
|
||||
constexpr void CDImage::LBAToMSF(u32 pregap_seconds, u64 lba, u32* minute, u32* second, u32* frame)
|
||||
{
|
||||
const u64 offset = (lba + (pregap_seconds * FRAMES_PER_SECOND) % FRAMES_PER_MINUTE);
|
||||
*minute = Truncate32(lba / FRAMES_PER_MINUTE);
|
||||
*second = Truncate32(offset / FRAMES_PER_SECOND);
|
||||
*frame = Truncate32(offset % FRAMES_PER_SECOND);
|
||||
}
|
||||
|
||||
bool CDImage::Open(const char* path)
|
||||
{
|
||||
Assert(!m_data_file);
|
||||
|
@ -35,6 +21,7 @@ bool CDImage::Open(const char* path)
|
|||
return false;
|
||||
}
|
||||
|
||||
m_filename = path;
|
||||
m_lba_count = m_data_file->GetSize() / RAW_SECTOR_SIZE;
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
#include "bitfield.h"
|
||||
#include "types.h"
|
||||
#include <tuple>
|
||||
|
||||
class ByteStream;
|
||||
|
||||
|
@ -37,11 +38,25 @@ public:
|
|||
};
|
||||
|
||||
// Conversion helpers.
|
||||
static constexpr u64 MSFToLBA(u32 pregap_seconds, u32 minute, u32 second, u32 frame);
|
||||
static constexpr void LBAToMSF(u32 pregap_seconds, u64 lba, u32* minute, u32* second, u32* frame);
|
||||
static constexpr u64 MSFToLBA(u32 pregap_seconds, u32 minute, u32 second, u32 frame)
|
||||
{
|
||||
return ZeroExtend64(minute) * FRAMES_PER_MINUTE + ZeroExtend64(second) * FRAMES_PER_SECOND + ZeroExtend64(frame) -
|
||||
ZeroExtend64(pregap_seconds) * FRAMES_PER_SECOND;
|
||||
}
|
||||
static constexpr std::tuple<u32, u32, u32> LBAToMSF(u32 pregap_seconds, u64 lba)
|
||||
{
|
||||
const u64 offset = (lba + (pregap_seconds * FRAMES_PER_SECOND) % FRAMES_PER_MINUTE);
|
||||
const u32 minute = Truncate32(lba / FRAMES_PER_MINUTE);
|
||||
const u32 second = Truncate32(offset / FRAMES_PER_SECOND);
|
||||
const u32 frame = Truncate32(offset % FRAMES_PER_SECOND);
|
||||
return std::make_tuple(minute, second, frame);
|
||||
}
|
||||
|
||||
// Accessors.
|
||||
const std::string& GetFileName() const { return m_filename; }
|
||||
u32 GetPregapSeconds() const { return m_pregap_seconds; }
|
||||
u64 GetCurrentLBA() const { return m_current_lba; }
|
||||
std::tuple<u32, u32, u32> GetPositionMSF() const { return LBAToMSF(m_pregap_seconds, m_current_lba); }
|
||||
u64 GetLBACount() const { return m_lba_count; }
|
||||
|
||||
bool Open(const char* path);
|
||||
|
@ -60,6 +75,8 @@ public:
|
|||
u32 Read(ReadMode read_mode, u32 sector_count, void* buffer);
|
||||
|
||||
private:
|
||||
std::string m_filename;
|
||||
|
||||
// TODO: Multiple data files from cue sheet
|
||||
ByteStream* m_data_file = nullptr;
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include "common/cd_image.h"
|
||||
#include "common/state_wrapper.h"
|
||||
#include "dma.h"
|
||||
#include "imgui.h"
|
||||
#include "interrupt_controller.h"
|
||||
#include "spu.h"
|
||||
#include "system.h"
|
||||
|
@ -108,7 +109,8 @@ bool CDROM::DoState(StateWrapper& sw)
|
|||
sw.Do(&m_sector_buffer);
|
||||
|
||||
u64 media_lba = m_media ? m_media->GetCurrentLBA() : 0;
|
||||
sw.Do(&m_media_filename);
|
||||
std::string media_filename = m_media ? m_media->GetFileName() : std::string();
|
||||
sw.Do(&media_filename);
|
||||
sw.Do(&media_lba);
|
||||
|
||||
if (sw.IsReading())
|
||||
|
@ -120,12 +122,12 @@ bool CDROM::DoState(StateWrapper& sw)
|
|||
|
||||
// load up media if we had something in there before
|
||||
m_media.reset();
|
||||
if (!m_media_filename.empty())
|
||||
if (!media_filename.empty())
|
||||
{
|
||||
m_media = std::make_unique<CDImage>();
|
||||
if (!m_media->Open(m_media_filename.c_str()) || !m_media->Seek(media_lba))
|
||||
if (!m_media->Open(media_filename.c_str()) || !m_media->Seek(media_lba))
|
||||
{
|
||||
Log_ErrorPrintf("Failed to re-insert CD media from save state: '%s'. Ejecting.", m_media_filename.c_str());
|
||||
Log_ErrorPrintf("Failed to re-insert CD media from save state: '%s'. Ejecting.", media_filename.c_str());
|
||||
RemoveMedia();
|
||||
}
|
||||
}
|
||||
|
@ -147,7 +149,6 @@ bool CDROM::InsertMedia(const char* filename)
|
|||
RemoveMedia();
|
||||
|
||||
m_media = std::move(media);
|
||||
m_media_filename = filename;
|
||||
// m_secondary_status.shell_open = false;
|
||||
return true;
|
||||
}
|
||||
|
@ -160,7 +161,6 @@ void CDROM::RemoveMedia()
|
|||
// TODO: Error while reading?
|
||||
Log_InfoPrintf("Removing CD...");
|
||||
m_media.reset();
|
||||
m_media_filename.clear();
|
||||
// m_secondary_status.shell_open = true;
|
||||
}
|
||||
|
||||
|
@ -1031,3 +1031,109 @@ void CDROM::LoadDataFIFO()
|
|||
Log_DebugPrintf("Loaded %u bytes to data FIFO", m_data_fifo.GetSize());
|
||||
m_sector_buffer.clear();
|
||||
}
|
||||
|
||||
void CDROM::DrawDebugWindow()
|
||||
{
|
||||
if (!m_show_cdrom_state)
|
||||
return;
|
||||
|
||||
ImGui::SetNextWindowSize(ImVec2(800, 400), ImGuiCond_FirstUseEver);
|
||||
if (!ImGui::Begin("CDROM State", &m_show_cdrom_state))
|
||||
{
|
||||
ImGui::End();
|
||||
return;
|
||||
}
|
||||
|
||||
// draw voice states
|
||||
if (ImGui::CollapsingHeader("Media", ImGuiTreeNodeFlags_DefaultOpen))
|
||||
{
|
||||
if (m_media)
|
||||
{
|
||||
const auto [pos_minute, pos_second, pos_frame] = m_media->GetPositionMSF();
|
||||
|
||||
ImGui::Text("Filename: %s", m_media->GetFileName().c_str());
|
||||
ImGui::Text("Position (MSF): %02u:%02u:%02u", pos_minute, pos_second, pos_frame);
|
||||
ImGui::Text("Position (LBA): %llu", m_media->GetCurrentLBA());
|
||||
}
|
||||
else
|
||||
{
|
||||
ImGui::Text("No media inserted.");
|
||||
}
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Status/Mode", ImGuiTreeNodeFlags_DefaultOpen))
|
||||
{
|
||||
ImGui::Columns(3);
|
||||
|
||||
ImGui::Text("Status");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Secondary Status");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Mode Status");
|
||||
ImGui::NextColumn();
|
||||
|
||||
ImGui::Text("ADPBUSY: %s", m_status.ADPBUSY ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Error: %s", m_secondary_status.error ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("CDDA: %s", m_mode.cdda ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
|
||||
ImGui::Text("PRMEMPTY: %s", m_status.PRMEMPTY ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Motor On: %s", m_secondary_status.motor_on ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Auto Pause: %s", m_mode.auto_pause ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
|
||||
ImGui::Text("PRMWRDY: %s", m_status.PRMWRDY ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Seek Error: %s", m_secondary_status.seek_error ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Report Audio: %s", m_mode.report_audio ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
|
||||
ImGui::Text("RSLRRDY: %s", m_status.RSLRRDY ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("ID Error: %s", m_secondary_status.id_error ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("XA Filter: %s (File %u Channel %u)", m_mode.xa_filter ? "Yes" : "No", m_filter_file_number,
|
||||
m_filter_channel_number);
|
||||
ImGui::NextColumn();
|
||||
|
||||
ImGui::Text("DRQSTS: %s", m_status.DRQSTS ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Shell Open: %s", m_secondary_status.shell_open ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Ignore Bit: %s", m_mode.ignore_bit ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
|
||||
ImGui::Text("BUSYSTS: %s", m_status.BUSYSTS ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Reading: %s", m_secondary_status.reading ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Read Raw Sectors: %s", m_mode.read_raw_sector ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Seeking: %s", m_secondary_status.seeking ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("XA Enable: %s", m_mode.xa_enable ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Playing CDDA: %s", m_secondary_status.playing_cdda ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("Double Speed: %s", m_mode.double_speed ? "Yes" : "No");
|
||||
ImGui::NextColumn();
|
||||
|
||||
ImGui::Columns(1);
|
||||
}
|
||||
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
void CDROM::DrawDebugMenu()
|
||||
{
|
||||
ImGui::MenuItem("CDROM", nullptr, &m_show_cdrom_state);
|
||||
}
|
||||
|
|
|
@ -46,6 +46,12 @@ public:
|
|||
|
||||
void Execute(TickCount ticks);
|
||||
|
||||
// Render statistics debug window.
|
||||
void DrawDebugWindow();
|
||||
|
||||
// Manipulating debug options.
|
||||
void DrawDebugMenu();
|
||||
|
||||
private:
|
||||
static constexpr u32 PARAM_FIFO_SIZE = 16;
|
||||
static constexpr u32 RESPONSE_FIFO_SIZE = 16;
|
||||
|
@ -184,7 +190,6 @@ private:
|
|||
InterruptController* m_interrupt_controller = nullptr;
|
||||
SPU* m_spu = nullptr;
|
||||
std::unique_ptr<CDImage> m_media;
|
||||
std::string m_media_filename;
|
||||
|
||||
CommandState m_command_state = CommandState::Idle;
|
||||
Command m_command = Command::Sync;
|
||||
|
@ -223,4 +228,6 @@ private:
|
|||
InlineFIFOQueue<u8, RESPONSE_FIFO_SIZE> m_response_fifo;
|
||||
HeapFIFOQueue<u8, DATA_FIFO_SIZE> m_data_fifo;
|
||||
std::vector<u8> m_sector_buffer;
|
||||
|
||||
bool m_show_cdrom_state = false;
|
||||
};
|
||||
|
|
|
@ -326,6 +326,7 @@ void System::DrawDebugMenus()
|
|||
m_gpu->DrawDebugMenu();
|
||||
m_spu->DrawDebugMenu();
|
||||
m_timers->DrawDebugMenu();
|
||||
m_cdrom->DrawDebugMenu();
|
||||
m_mdec->DrawDebugMenu();
|
||||
}
|
||||
|
||||
|
@ -334,5 +335,6 @@ void System::DrawDebugWindows()
|
|||
m_gpu->DrawDebugWindows();
|
||||
m_spu->DrawDebugWindow();
|
||||
m_timers->DrawDebugWindow();
|
||||
m_cdrom->DrawDebugWindow();
|
||||
m_mdec->DrawDebugWindow();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue