mirror of
https://github.com/liuk7071/ChonkyStation.git
synced 2024-05-20 12:57:52 -04:00
[CDROM] GetStat
This commit is contained in:
parent
1ff9d8ca6c
commit
83ad4fb1bc
|
@ -2,12 +2,20 @@
|
|||
|
||||
|
||||
CDROM::CDROM(Scheduler* scheduler) : scheduler(scheduler) {
|
||||
status.prmempt = 1; // Parameter fifo empty
|
||||
status.prmwrdy = 1; // Parameter fifo not full
|
||||
statusReg.prmempt = 1; // Parameter fifo empty
|
||||
statusReg.prmwrdy = 1; // Parameter fifo not full
|
||||
|
||||
statusCode.motor = 1; // Motor on
|
||||
}
|
||||
|
||||
void CDROM::executeCommand(u8 data) {
|
||||
switch (data) {
|
||||
|
||||
case CDROMCommands::GetStat: {
|
||||
response.push(statusCode.raw);
|
||||
scheduler->push(&int3, scheduler->time + int3Delay, this);
|
||||
break;
|
||||
}
|
||||
|
||||
case CDROMCommands::Test: {
|
||||
u8 subFunc = getParamByte();
|
||||
|
@ -33,9 +41,9 @@ void CDROM::executeCommand(u8 data) {
|
|||
|
||||
Helpers::debugAssert(params.size() == 0, "[FATAL] CDROM command did not use all parameters");
|
||||
|
||||
status.rslrrdy = 1; // Response fifo not empty
|
||||
status.prmempt = 1; // Parameter fifo empty
|
||||
status.prmwrdy = 1; // Parameter fifo not full
|
||||
statusReg.rslrrdy = 1; // Response fifo not empty
|
||||
statusReg.prmempt = 1; // Parameter fifo empty
|
||||
statusReg.prmwrdy = 1; // Parameter fifo not full
|
||||
}
|
||||
|
||||
bool CDROM::shouldFireIRQ() {
|
||||
|
@ -44,7 +52,7 @@ bool CDROM::shouldFireIRQ() {
|
|||
|
||||
void CDROM::int3(void* classptr) {
|
||||
CDROM* cdrom = (CDROM*)classptr;
|
||||
Helpers::debugAssert((cdrom->intFlag & 7) == 0, "[FATAL] CDROM INT3 was fired before previous INT was acknowledged in interrupt flag (INT%d)\n", cdrom->intFlag & 3);
|
||||
Helpers::debugAssert((cdrom->intFlag & 7) == 0, "[FATAL] CDROM INT3 was fired before previous INT%d was acknowledged in interrupt flag\n", cdrom->intFlag & 3);
|
||||
cdrom->intFlag |= 3;
|
||||
}
|
||||
|
||||
|
@ -52,16 +60,16 @@ void CDROM::pushParam(u8 data) {
|
|||
Helpers::debugAssert(params.size() <= 16, "[FATAL] Wrote more than 16 bytes to CDROM parameter fifo");
|
||||
params.push(data);
|
||||
if (params.size() == 16) {
|
||||
status.prmwrdy = 0; // Parameter fifo full
|
||||
statusReg.prmwrdy = 0; // Parameter fifo full
|
||||
}
|
||||
}
|
||||
|
||||
u8 CDROM::readStatus() {
|
||||
return status.raw;
|
||||
return statusReg.raw;
|
||||
}
|
||||
|
||||
void CDROM::writeStatus(u8 data) {
|
||||
status.index = data & 3;
|
||||
statusReg.index = data & 3;
|
||||
}
|
||||
|
||||
void CDROM::writeIE(u8 data) {
|
||||
|
@ -73,18 +81,18 @@ u8 CDROM::readIF() {
|
|||
}
|
||||
|
||||
void CDROM::writeIF(u8 data) {
|
||||
intEnable &= ~(data & 0x1f);
|
||||
intFlag &= ~(data & 0x1f);
|
||||
if (data & (1 << 6)) { // "CLRPRM" clear parameter fifo
|
||||
while (params.size()) params.pop();
|
||||
status.prmempt = 1; // Parameter fifo empty
|
||||
status.prmwrdy = 1; // Parameter fifo not full
|
||||
statusReg.prmempt = 1; // Parameter fifo empty
|
||||
statusReg.prmwrdy = 1; // Parameter fifo not full
|
||||
}
|
||||
// Upon acknowledge, the response fifo is cleared
|
||||
while (response.size()) response.pop();
|
||||
}
|
||||
|
||||
u8 CDROM::getIndex() {
|
||||
return status.index;
|
||||
return statusReg.index;
|
||||
}
|
||||
|
||||
u8 CDROM::getParamByte() {
|
||||
|
@ -102,7 +110,7 @@ u8 CDROM::getResponseByte() {
|
|||
response.pop();
|
||||
|
||||
if (!response.size()) {
|
||||
status.rslrrdy = 0; // Response fifo empty
|
||||
statusReg.rslrrdy = 0; // Response fifo empty
|
||||
}
|
||||
|
||||
return byte;
|
||||
|
|
|
@ -53,11 +53,24 @@ private:
|
|||
BitField<5, 1, u8> rslrrdy;
|
||||
BitField<6, 1, u8> drqsts;
|
||||
BitField<7, 1, u8> busysts;
|
||||
} status;
|
||||
} statusReg;
|
||||
|
||||
union {
|
||||
u8 raw = 0;
|
||||
BitField<0, 1, u8> error;
|
||||
BitField<1, 1, u8> motor;
|
||||
BitField<2, 1, u8> seekError;
|
||||
BitField<3, 1, u8> idError;
|
||||
BitField<4, 1, u8> shellOpen;
|
||||
BitField<5, 1, u8> reading;
|
||||
BitField<6, 1, u8> seeking;
|
||||
BitField<7, 1, u8> playing;
|
||||
} statusCode;
|
||||
};
|
||||
|
||||
namespace CDROMCommands {
|
||||
enum {
|
||||
Test = 0x19
|
||||
GetStat = 0x01,
|
||||
Test = 0x19
|
||||
};
|
||||
} // End namespace CDROMCommands
|
Loading…
Reference in a new issue