static unsigned char *pTransfer;
/* CD-ROM magic numbers */
-#define CdlSync 0
+#define CdlSync 0 /* nocash documentation : "Uh, actually, returns error code 40h = Invalid Command...?" */
#define CdlNop 1
#define CdlSetloc 2
#define CdlPlay 3
cdr.Irq = 0;
switch (Irq) {
- case CdlSync:
- // TOOD: sometimes/always return error?
- break;
-
case CdlNop:
if (cdr.DriveState != DRIVESTATE_LID_OPEN)
cdr.StatP &= ~STATUS_SHELLOPEN;
break;
case CdlGetQ:
- // TODO?
- CDR_LOG_I("got CdlGetQ\n");
+ no_busy_error = 1;
break;
case CdlReadToc:
cdr.Result[0] = cdr.StatP;
start_rotating = 1;
break;
-
+ case CdlSync:
default:
CDR_LOG_I("Invalid command: %02x\n", Irq);
error = ERROR_INVALIDCMD;
cdr.Channel = cdr.Transfer[4 + 1];
}
+ /* Gameblabla
+ * Skips playing on channel 255.
+ * Fixes missing audio in Blue's Clues : Blue's Big Musical. (Should also fix Taxi 2)
+ * TODO : Check if this is the proper behaviour.
+ * */
if((cdr.Transfer[4 + 2] & 0x4) &&
(cdr.Transfer[4 + 1] == cdr.Channel) &&
- (cdr.Transfer[4 + 0] == cdr.File)) {
+ (cdr.Transfer[4 + 0] == cdr.File) && cdr.Channel != 255) {
int ret = xa_decode_sector(&cdr.Xa, cdr.Transfer+4, cdr.FirstSector);
if (!ret) {
cdrAttenuate(cdr.Xa.pcm, cdr.Xa.nsamples, cdr.Xa.stereo);
switch (cdr.Cmd) {
case CdlSetloc:
- for (i = 0; i < 3; i++)
- set_loc[i] = btoi(cdr.Param[i]);
+ CDR_LOG("CDROM setloc command (%02X, %02X, %02X)\n", cdr.Param[0], cdr.Param[1], cdr.Param[2]);
- i = msf2sec(cdr.SetSectorPlay);
- i = abs(i - msf2sec(set_loc));
- if (i > 16)
- cdr.Seeked = SEEK_PENDING;
+ // MM must be BCD, SS must be BCD and <0x60, FF must be BCD and <0x75
+ if (((cdr.Param[0] & 0x0F) > 0x09) || (cdr.Param[0] > 0x99) || ((cdr.Param[1] & 0x0F) > 0x09) || (cdr.Param[1] >= 0x60) || ((cdr.Param[2] & 0x0F) > 0x09) || (cdr.Param[2] >= 0x75))
+ {
+ CDR_LOG("Invalid/out of range seek to %02X:%02X:%02X\n", cdr.Param[0], cdr.Param[1], cdr.Param[2]);
+ }
+ else
+ {
+ for (i = 0; i < 3; i++)
+ {
+ set_loc[i] = btoi(cdr.Param[i]);
+ }
+
+ i = msf2sec(cdr.SetSectorPlay);
+ i = abs(i - msf2sec(set_loc));
+ if (i > 16)
+ cdr.Seeked = SEEK_PENDING;
- memcpy(cdr.SetSector, set_loc, 3);
- cdr.SetSector[3] = 0;
- cdr.SetlocPending = 1;
+ memcpy(cdr.SetSector, set_loc, 3);
+ cdr.SetSector[3] = 0;
+ cdr.SetlocPending = 1;
+ }
break;
case CdlReadN: