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
This commit is contained in:
Sergey Dvodnenko
2020-09-27 13:54:03 +03:00
committed by GitHub
parent 65c077c134
commit 7b80bf1ee3
3 changed files with 59 additions and 58 deletions

View File

@@ -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;

View File

@@ -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)))

View File

@@ -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) {