From 7b80bf1ee38acd2b75fa47cda164300df03ae5ff Mon Sep 17 00:00:00 2001 From: Sergey Dvodnenko Date: Sun, 27 Sep 2020 13:54:03 +0300 Subject: [PATCH] pcecd: send status immediately for commands with instant execution (Bomberman: Panic Bomber), some cleanup * pcecd: read 256 sectors when length is 0 (Kabuki Itouryodan). * pcecd: send status immediately for commands with instant execution (Bomberman: Panic Bomber), some cleanup --- support/pcecd/pcecd.cpp | 14 ++----- support/pcecd/pcecd.h | 12 +++--- support/pcecd/pcecdd.cpp | 91 +++++++++++++++++++++------------------- 3 files changed, 59 insertions(+), 58 deletions(-) diff --git a/support/pcecd/pcecd.cpp b/support/pcecd/pcecd.cpp index d51c021..65d9b91 100644 --- a/support/pcecd/pcecd.cpp +++ b/support/pcecd/pcecd.cpp @@ -12,7 +12,7 @@ #include "pcecd.h" -static int /*loaded = 0, unloaded = 0,*/ need_reset=0; +static int need_reset=0; static uint8_t has_command = 0; void pcecd_poll() @@ -36,19 +36,13 @@ void pcecd_poll() if (pcecdd.has_status && !pcecdd.latency) { - uint16_t s; - pcecdd.GetStatus((uint8_t*)&s); - pcecdd.SendStatus(s, 0); + pcecdd.SendStatus(pcecdd.GetStatus()); pcecdd.has_status = 0; - - printf("\x1b[32mPCECD: Send status = %02X, message = %02X\n\x1b[0m", s&0xFF, s >> 8); } else if (pcecdd.data_req) { - pcecdd.SendStatus(0, 1); + pcecdd.SendDataRequest(); pcecdd.data_req = false; - - printf("\x1b[32mPCECD: Data request for MODESELECT6\n\x1b[0m"); } pcecdd.Update(); @@ -81,7 +75,7 @@ void pcecd_poll() case 1: //TODO: process data - pcecdd.PendStatus(0, 0); + pcecdd.SendStatus(0); printf("\x1b[32mPCECD: Command MODESELECT6, received data\n\x1b[0m"); break; diff --git a/support/pcecd/pcecd.h b/support/pcecd/pcecd.h index 8af7114..46565c8 100644 --- a/support/pcecd/pcecd.h +++ b/support/pcecd/pcecd.h @@ -79,10 +79,11 @@ public: void Reset(); void Update(); void CommandExec(); - int GetStatus(uint8_t* buf); + uint16_t GetStatus(); int SetCommand(uint8_t* buf); - void PendStatus(uint8_t status, uint8_t message); - void SendStatus(uint16_t status, uint8_t flag); + void PendStatus(uint16_t status); + void SendStatus(uint16_t status); + void SendDataRequest(); void SetRegion(uint8_t rgn); private: @@ -93,7 +94,6 @@ private: int scanOffset; int audioLength; int audioOffset; - //uint8_t state; int CDDAStart; int CDDAEnd; int CDDAFirst; @@ -101,7 +101,7 @@ private: sense_t sense; uint8_t region; - uint8_t stat[2]; + uint16_t stat; uint8_t comm[14]; uint8_t sec_buf[2352 + 2]; @@ -118,6 +118,8 @@ private: void CommandError(uint8_t key, uint8_t asc, uint8_t ascq, uint8_t fru); }; +#define MAKE_STATUS(s,m) ((uint16_t)((((m)&0xFF) << 8) | ((s)&0xFF))) + #define BCD(v) ((uint8_t)((((v)/10) << 4) | ((v)%10))) #define U8(v) ((uint8_t)(((((v)&0xF0) >> 4) * 10) + ((v)&0x0F))) diff --git a/support/pcecd/pcecdd.cpp b/support/pcecd/pcecdd.cpp index d777787..13eb098 100644 --- a/support/pcecd/pcecdd.cpp +++ b/support/pcecd/pcecdd.cpp @@ -34,8 +34,8 @@ pcecdd_t::pcecdd_t() { CDDAMode = PCECD_CDDAMODE_SILENT; region = 0; - stat[0] = 0x0; - stat[1] = 0x0; + stat = 0x0000; + } static int sgets(char *out, int sz, char **in) @@ -300,8 +300,8 @@ void pcecdd_t::Reset() { CDDAEnd = 0; CDDAMode = PCECD_CDDAMODE_SILENT; - stat[0] = 0x0; - stat[1] = 0x0; + stat = 0x0000; + } void pcecdd_t::Update() { @@ -350,7 +350,7 @@ void pcecdd_t::Update() { this->cnt--; if (!this->cnt) { - PendStatus(PCECD_STATUS_GOOD, 0); + PendStatus(MAKE_STATUS(PCECD_STATUS_GOOD, 0)); this->state = PCECD_STATE_IDLE; } @@ -413,7 +413,7 @@ void pcecdd_t::Update() { } if (this->CDDAMode == PCECD_CDDAMODE_INTERRUPT) { - PendStatus(PCECD_STATUS_GOOD, 0); + PendStatus(MAKE_STATUS(PCECD_STATUS_GOOD, 0)); } printf("\x1b[32mPCECD: playback reached the end %d\n\x1b[0m", this->lba); @@ -440,10 +440,10 @@ void pcecdd_t::CommandExec() { case PCECD_COMM_TESTUNIT: if (state == PCECD_STATE_NODISC) { CommandError(SENSEKEY_NOT_READY, NSE_NO_DISC, 0, 0); - PendStatus(PCECD_STATUS_CHECK_COND, 0); + SendStatus(MAKE_STATUS(PCECD_STATUS_CHECK_COND, 0)); } else { - PendStatus(PCECD_STATUS_GOOD, 0); + SendStatus(MAKE_STATUS(PCECD_STATUS_GOOD, 0)); } printf("\x1b[32mPCECD: Command TESTUNIT, state = %u\n\x1b[0m", state); @@ -462,12 +462,12 @@ void pcecdd_t::CommandExec() { sense.key = sense.asc = sense.ascq = sense.fru = 0; - PendStatus(PCECD_STATUS_GOOD, 0); + if (SendData) + SendData(buf, 18 + 2, PCECD_DATA_IO_INDEX); printf("\x1b[32mPCECD: Command REQUESTSENSE, key = %02X, asc = %02X, ascq = %02X, fru = %02X\n\x1b[0m", sense.key, sense.asc, sense.ascq, sense.fru); - if (SendData) - SendData(buf, 18+2, PCECD_DATA_IO_INDEX); + SendStatus(MAKE_STATUS(PCECD_STATUS_GOOD, 0)); break; @@ -511,14 +511,14 @@ void pcecdd_t::CommandExec() { break; } - PendStatus(PCECD_STATUS_GOOD, 0); - - printf("\x1b[32mPCECD: Command GETDIRINFO, [1] = %02X, [2] = %02X(%d)\n\x1b[0m", comm[1], comm[2], comm[2]); - if (SendData && len) SendData(buf, len, PCECD_DATA_IO_INDEX); + printf("\x1b[32mPCECD: Command GETDIRINFO, [1] = %02X, [2] = %02X(%d)\n\x1b[0m", comm[1], comm[2], comm[2]); + printf("\x1b[32mPCECD: Send data, len = %u, [2] = %02X, [3] = %02X, [4] = %02X, [5] = %02X\n\x1b[0m", len, buf[2], buf[3], buf[4], buf[5]); + + SendStatus(MAKE_STATUS(PCECD_STATUS_GOOD, 0)); } break; @@ -529,10 +529,6 @@ void pcecdd_t::CommandExec() { int index = GetTrackByLBA(new_lba, &this->toc); this->index = index; - /*if (new_lba < this->toc.tracks[index].start) - { - new_lba = this->toc.tracks[index].start; - }*/ /* HuVideo streams by fetching 120 sectors at a time, taking advantage of the geometry * of the disc to reduce/eliminate seek time */ @@ -569,15 +565,15 @@ void pcecdd_t::CommandExec() { break; case PCECD_COMM_MODESELECT6: + printf("\x1b[32mPCECD: Command MODESELECT6, cnt = %u\n\x1b[0m", comm[4]); + if (comm[4]) { data_req = true; } else { - PendStatus(PCECD_STATUS_GOOD, 0); + SendStatus(MAKE_STATUS(PCECD_STATUS_GOOD, 0)); } - printf("\x1b[32mPCECD: Command MODESELECT6, cnt = %u\n\x1b[0m", comm[4]); - break; case PCECD_COMM_SAPSP: { @@ -620,10 +616,6 @@ void pcecdd_t::CommandExec() { int index = GetTrackByLBA(new_lba, &this->toc); this->index = index; - /*if (lba_ < this->toc.tracks[index].start) - { - lba_ = this->toc.tracks[index].start; - }*/ this->CDDAStart = new_lba; this->CDDAEnd = this->toc.end; @@ -637,7 +629,7 @@ void pcecdd_t::CommandExec() { this->state = PCECD_STATE_PLAY; } - PendStatus(PCECD_STATUS_GOOD, 0); + PendStatus(MAKE_STATUS(PCECD_STATUS_GOOD, 0)); } printf("\x1b[32mPCECD: Command SAPSP, start = %d, end = %d, [1] = %02X, [2] = %02X, [9] = %02X\n\x1b[0m", this->CDDAStart, this->CDDAEnd, comm[1], comm[2], comm[9]); break; @@ -674,17 +666,18 @@ void pcecdd_t::CommandExec() { this->state = PCECD_STATE_PLAY; } + printf("\x1b[32mPCECD: Command SAPEP, end = %i, [1] = %02X, [2] = %02X, [9] = %02X\n\x1b[0m", this->CDDAEnd, comm[1], comm[2], comm[9]); + if (this->CDDAMode != PCECD_CDDAMODE_INTERRUPT) { - PendStatus(PCECD_STATUS_GOOD, 0); + SendStatus(MAKE_STATUS(PCECD_STATUS_GOOD, 0)); } } - printf("\x1b[32mPCECD: Command SAPEP, end = %i, [1] = %02X, [2] = %02X, [9] = %02X\n\x1b[0m", this->CDDAEnd, comm[1], comm[2], comm[9]); break; case PCECD_COMM_PAUSE: { this->state = PCECD_STATE_PAUSE; - PendStatus(PCECD_STATUS_GOOD, 0); + SendStatus(MAKE_STATUS(PCECD_STATUS_GOOD, 0)); } printf("\x1b[32mPCECD: Command PAUSE, current lba = %i\n\x1b[0m", this->lba); break; @@ -709,27 +702,28 @@ void pcecdd_t::CommandExec() { buf[10] = BCD(msf.s); buf[11] = BCD(msf.f); - PendStatus(PCECD_STATUS_GOOD, 0); + if (SendData) + SendData(buf, 10 + 2, PCECD_DATA_IO_INDEX); printf("\x1b[32mPCECD: Command READSUBQ, [1] = %02X, track = %i, index = %i, lba_rel = %i, lba_abs = %i\n\x1b[0m", comm[1], this->index + 1, this->index, lba_rel, this->lba); - if (SendData) - SendData(buf, 10 + 2, PCECD_DATA_IO_INDEX); + SendStatus(MAKE_STATUS(PCECD_STATUS_GOOD, 0)); } break; default: CommandError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_COMMAND, 0, 0); - SendStatus(PCECD_STATUS_CHECK_COND, 0); - + printf("\x1b[32mPCECD: Command undefined, [0] = %02X, [1] = %02X, [2] = %02X, [3] = %02X, [4] = %02X, [5] = %02X\n\x1b[0m", comm[0], comm[1], comm[2], comm[3], comm[4], comm[5]); + + SendStatus(MAKE_STATUS(PCECD_STATUS_CHECK_COND, 0)); + break; } } -int pcecdd_t::GetStatus(uint8_t* buf) { - memcpy(buf, stat, 2); - return 0; +uint16_t pcecdd_t::GetStatus() { + return stat; } int pcecdd_t::SetCommand(uint8_t* buf) { @@ -737,18 +731,29 @@ int pcecdd_t::SetCommand(uint8_t* buf) { return 0; } -void pcecdd_t::PendStatus(uint8_t status, uint8_t message) { - stat[0] = status; - stat[1] = message; +void pcecdd_t::PendStatus(uint16_t status) { + stat = status; has_status = 1; } -void pcecdd_t::SendStatus(uint16_t status, uint8_t flag) { +void pcecdd_t::SendStatus(uint16_t status) { spi_uio_cmd_cont(UIO_CD_SET); spi_w(status); - spi_w((flag & 1) | (region ? 2 : 0)); + spi_w(region ? 2 : 0); DisableIO(); + + printf("\x1b[32mPCECD: Send status = %02X, message = %02X\n\x1b[0m", status & 0xFF, status >> 8); +} + +void pcecdd_t::SendDataRequest() { + + spi_uio_cmd_cont(UIO_CD_SET); + spi_w(0); + spi_w((region ? 2 : 0) | 1); + DisableIO(); + + printf("\x1b[32mPCECD: Data request for MODESELECT6\n\x1b[0m"); } void pcecdd_t::SetRegion(uint8_t rgn) {