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:
@@ -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;
|
||||
|
||||
|
||||
@@ -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)))
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user