diff --git a/support/pcecd/pcecd.cpp b/support/pcecd/pcecd.cpp index 3d8cdf7..be73dce 100644 --- a/support/pcecd/pcecd.cpp +++ b/support/pcecd/pcecd.cpp @@ -14,7 +14,6 @@ static int /*loaded = 0, unloaded = 0,*/ need_reset=0; static uint8_t has_command = 0; -static uint8_t us_cart = 0; void pcecd_poll() { @@ -36,24 +35,17 @@ void pcecd_poll() } if (pcecdd.has_status && !pcecdd.latency) { + uint16_t s; pcecdd.GetStatus((uint8_t*)&s); - - spi_uio_cmd_cont(UIO_CD_SET); - spi_w(s); - spi_w(0 | (us_cart << 1)); - DisableIO(); - + pcecdd.SendStatus(s, 0); pcecdd.has_status = 0; printf("\x1b[32mPCECD: Send status = %02X, message = %02X\n\x1b[0m", s&0xFF, s >> 8); } else if (pcecdd.data_req) { - spi_uio_cmd_cont(UIO_CD_SET); - spi_w(0); - spi_w(1 | (us_cart << 1)); - DisableIO(); + pcecdd.SendStatus(0, 1); pcecdd.data_req = false; printf("\x1b[32mPCECD: Data request for MODESELECT6\n\x1b[0m"); @@ -154,7 +146,7 @@ static int load_bios(char *biosname, const char *cuename) fileTYPE f; if (!FileOpen(&f, biosname)) return 0; - us_cart = 0; + uint8_t us_cart = 0; uint32_t start = size & 0x3FF; if (size >= 262144) @@ -192,7 +184,7 @@ static int load_bios(char *biosname, const char *cuename) user_io_file_mount(buf, 0, 1); user_io_set_download(0); - + pcecdd.SetRegion(us_cart); return 1; } diff --git a/support/pcecd/pcecd.h b/support/pcecd/pcecd.h index e7c40de..8af7114 100644 --- a/support/pcecd/pcecd.h +++ b/support/pcecd/pcecd.h @@ -82,7 +82,8 @@ public: int GetStatus(uint8_t* buf); int SetCommand(uint8_t* buf); void PendStatus(uint8_t status, uint8_t message); - void SendStatus(uint8_t status, uint8_t message); + void SendStatus(uint16_t status, uint8_t flag); + void SetRegion(uint8_t rgn); private: toc_t toc; @@ -98,6 +99,7 @@ private: int CDDAFirst; uint8_t CDDAMode; sense_t sense; + uint8_t region; uint8_t stat[2]; uint8_t comm[14]; diff --git a/support/pcecd/pcecdd.cpp b/support/pcecd/pcecdd.cpp index 05628a2..fda2961 100644 --- a/support/pcecd/pcecdd.cpp +++ b/support/pcecd/pcecdd.cpp @@ -32,6 +32,7 @@ pcecdd_t::pcecdd_t() { CDDAStart = 0; CDDAEnd = 0; CDDAMode = PCECD_CDDAMODE_SILENT; + region = 0; stat[0] = 0x0; stat[1] = 0x0; @@ -744,15 +745,17 @@ void pcecdd_t::PendStatus(uint8_t status, uint8_t message) { has_status = 1; } -void pcecdd_t::SendStatus(uint8_t status, uint8_t message) { - uint16_t s = ((uint16_t)message << 8) | status; +void pcecdd_t::SendStatus(uint16_t status, uint8_t flag) { spi_uio_cmd_cont(UIO_CD_SET); - spi_w(s); - spi_w(0); + spi_w(status); + spi_w((flag & 1) | (region ? 2 : 0)); DisableIO(); } +void pcecdd_t::SetRegion(uint8_t rgn) { + region = rgn; +} void pcecdd_t::LBAToMSF(int lba, msf_t* msf) { msf->m = (lba / 75) / 60;