Added some debug code for Issue #2. This will print out a warning when we get an unhandled mode page code, instead of crashing

This commit is contained in:
akuker
2020-07-09 17:56:04 -05:00
parent 4954d20f98
commit c0e607eb9d

View File

@@ -2660,7 +2660,7 @@ int FASTCALL SCSIHD::Inquiry(
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
BOOL FASTCALL SCSIHD::ModeSelect(const DWORD *cdb, const BYTE *buf, int length) BOOL FASTCALL SCSIHD::ModeSelect(const DWORD *cdb, const BYTE *buf, int length)
{ {
int page; BYTE page;
int size; int size;
ASSERT(this); ASSERT(this);
@@ -2702,8 +2702,23 @@ BOOL FASTCALL SCSIHD::ModeSelect(const DWORD *cdb, const BYTE *buf, int length)
} }
break; break;
// CD-ROM Parameters
// According to the SONY CDU-541 manual, Page code 8 is supposed
// to set the Logical Block Adress Format, as well as the
// inactivity timer multiplier
case 0x08:
// Debug code for Issue #2:
// https://github.com/akuker/RASCSI/issues/2
printf("\[Unhandled page code\] Received mode page code 8 with total length %d\n ", length);
for (int i = 0; i<length; i++)
{
printf("%02X ", buf[i]);
}
printf("\n");
break;
// Other page // Other page
default: default:
printf("Unknown Mode Select page code received: %02X\n",page);
break; break;
} }
@@ -2822,7 +2837,7 @@ BOOL FASTCALL SCSIHD_NEC::Open(const Filepath& path, BOOL /*attn*/)
cylinders = (int)(size >> 9); cylinders = (int)(size >> 9);
cylinders >>= 3; cylinders >>= 3;
cylinders /= 25; cylinders /= 25;
} else if (xstrcasecmp(ext, _T(".HDI")) == 0) { // Anex86 HD image? } else if (xstrcasecmp(ext, _T(".HDI")) == 0) { // Anex86 HD image?
imgoffset = getDwordLE(&hdr[4 + 4]); imgoffset = getDwordLE(&hdr[4 + 4]);
imgsize = getDwordLE(&hdr[4 + 4 + 4]); imgsize = getDwordLE(&hdr[4 + 4 + 4]);
sectorsize = getDwordLE(&hdr[4 + 4 + 4 + 4]); sectorsize = getDwordLE(&hdr[4 + 4 + 4 + 4]);
@@ -2946,7 +2961,7 @@ int FASTCALL SCSIHD_NEC::AddFormat(BOOL change, BYTE *buf)
// 1ゾーンのトラック数を設定(PC-9801-55はこの値を見ているようだ) // 1ゾーンのトラック数を設定(PC-9801-55はこの値を見ているようだ)
buf[0x2] = (BYTE)(heads >> 8); buf[0x2] = (BYTE)(heads >> 8);
buf[0x3] = (BYTE)heads; buf[0x3] = (BYTE)heads;
// 1トラックのセクタ数を設定 // 1トラックのセクタ数を設定
buf[0xa] = (BYTE)(sectors >> 8); buf[0xa] = (BYTE)(sectors >> 8);
buf[0xb] = (BYTE)sectors; buf[0xb] = (BYTE)sectors;
@@ -2989,7 +3004,7 @@ int FASTCALL SCSIHD_NEC::AddDrive(BOOL change, BYTE *buf)
buf[0x2] = (BYTE)(cylinders >> 16); buf[0x2] = (BYTE)(cylinders >> 16);
buf[0x3] = (BYTE)(cylinders >> 8); buf[0x3] = (BYTE)(cylinders >> 8);
buf[0x4] = (BYTE)cylinders; buf[0x4] = (BYTE)cylinders;
// ヘッド数を設定 // ヘッド数を設定
buf[0x5] = (BYTE)heads; buf[0x5] = (BYTE)heads;
} }
@@ -3403,29 +3418,29 @@ int FASTCALL SCSIMO::AddVendor(int page, BOOL change, BYTE *buf)
mode page code 20h - Vendor Unique Format Page mode page code 20h - Vendor Unique Format Page
format mode XXh type 0 format mode XXh type 0
information: http://h20628.www2.hp.com/km-ext/kmcsdirect/emr_na-lpg28560-1.pdf information: http://h20628.www2.hp.com/km-ext/kmcsdirect/emr_na-lpg28560-1.pdf
offset description offset description
02h format mode 02h format mode
03h type of format (0) 03h type of format (0)
04~07h size of user band (total sectors?) 04~07h size of user band (total sectors?)
08~09h size of spare band (spare sectors?) 08~09h size of spare band (spare sectors?)
0A~0Bh number of bands 0A~0Bh number of bands
actual value of each 3.5inches optical medium (grabbed by Fujitsu M2513EL) actual value of each 3.5inches optical medium (grabbed by Fujitsu M2513EL)
128M 230M 540M 640M 128M 230M 540M 640M
--------------------------------------------------- ---------------------------------------------------
size of user band 3CBFAh 6CF75h FE45Ch 4BC50h size of user band 3CBFAh 6CF75h FE45Ch 4BC50h
size of spare band 0400h 0401h 08CAh 08C4h size of spare band 0400h 0401h 08CAh 08C4h
number of bands 0001h 000Ah 0012h 000Bh number of bands 0001h 000Ah 0012h 000Bh
further information: http://r2089.blog36.fc2.com/blog-entry-177.html further information: http://r2089.blog36.fc2.com/blog-entry-177.html
*/ */
if (disk.ready) { if (disk.ready) {
unsigned spare = 0; unsigned spare = 0;
unsigned bands = 0; unsigned bands = 0;
if (disk.size == 9) switch (disk.blocks) { if (disk.size == 9) switch (disk.blocks) {
// 128MB // 128MB
case 248826: case 248826:
@@ -5013,7 +5028,7 @@ void FASTCALL SCSIBR::FS_CheckDir(BYTE *buf)
pNamests = (Human68k::namests_t*)&buf[i]; pNamests = (Human68k::namests_t*)&buf[i];
i += sizeof(Human68k::namests_t); i += sizeof(Human68k::namests_t);
fsresult = fs->CheckDir(nUnit, pNamests); fsresult = fs->CheckDir(nUnit, pNamests);
} }
@@ -5037,10 +5052,10 @@ void FASTCALL SCSIBR::FS_MakeDir(BYTE *buf)
dp = (DWORD*)buf; dp = (DWORD*)buf;
nUnit = ntohl(*dp); nUnit = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
pNamests = (Human68k::namests_t*)&buf[i]; pNamests = (Human68k::namests_t*)&buf[i];
i += sizeof(Human68k::namests_t); i += sizeof(Human68k::namests_t);
fsresult = fs->MakeDir(nUnit, pNamests); fsresult = fs->MakeDir(nUnit, pNamests);
} }
@@ -5064,10 +5079,10 @@ void FASTCALL SCSIBR::FS_RemoveDir(BYTE *buf)
dp = (DWORD*)buf; dp = (DWORD*)buf;
nUnit = ntohl(*dp); nUnit = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
pNamests = (Human68k::namests_t*)&buf[i]; pNamests = (Human68k::namests_t*)&buf[i];
i += sizeof(Human68k::namests_t); i += sizeof(Human68k::namests_t);
fsresult = fs->RemoveDir(nUnit, pNamests); fsresult = fs->RemoveDir(nUnit, pNamests);
} }
@@ -5092,13 +5107,13 @@ void FASTCALL SCSIBR::FS_Rename(BYTE *buf)
dp = (DWORD*)buf; dp = (DWORD*)buf;
nUnit = ntohl(*dp); nUnit = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
pNamests = (Human68k::namests_t*)&buf[i]; pNamests = (Human68k::namests_t*)&buf[i];
i += sizeof(Human68k::namests_t); i += sizeof(Human68k::namests_t);
pNamestsNew = (Human68k::namests_t*)&buf[i]; pNamestsNew = (Human68k::namests_t*)&buf[i];
i += sizeof(Human68k::namests_t); i += sizeof(Human68k::namests_t);
fsresult = fs->Rename(nUnit, pNamests, pNamestsNew); fsresult = fs->Rename(nUnit, pNamests, pNamestsNew);
} }
@@ -5122,10 +5137,10 @@ void FASTCALL SCSIBR::FS_Delete(BYTE *buf)
dp = (DWORD*)buf; dp = (DWORD*)buf;
nUnit = ntohl(*dp); nUnit = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
pNamests = (Human68k::namests_t*)&buf[i]; pNamests = (Human68k::namests_t*)&buf[i];
i += sizeof(Human68k::namests_t); i += sizeof(Human68k::namests_t);
fsresult = fs->Delete(nUnit, pNamests); fsresult = fs->Delete(nUnit, pNamests);
} }
@@ -5150,14 +5165,14 @@ void FASTCALL SCSIBR::FS_Attribute(BYTE *buf)
dp = (DWORD*)buf; dp = (DWORD*)buf;
nUnit = ntohl(*dp); nUnit = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
pNamests = (Human68k::namests_t*)&buf[i]; pNamests = (Human68k::namests_t*)&buf[i];
i += sizeof(Human68k::namests_t); i += sizeof(Human68k::namests_t);
dp = (DWORD*)&buf[i]; dp = (DWORD*)&buf[i];
nHumanAttribute = ntohl(*dp); nHumanAttribute = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
fsresult = fs->Attribute(nUnit, pNamests, nHumanAttribute); fsresult = fs->Attribute(nUnit, pNamests, nHumanAttribute);
} }
@@ -5187,7 +5202,7 @@ void FASTCALL SCSIBR::FS_Files(BYTE *buf)
dp = (DWORD*)&buf[i]; dp = (DWORD*)&buf[i];
nKey = ntohl(*dp); nKey = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
pNamests = (Human68k::namests_t*)&buf[i]; pNamests = (Human68k::namests_t*)&buf[i];
i += sizeof(Human68k::namests_t); i += sizeof(Human68k::namests_t);
@@ -5294,7 +5309,7 @@ void FASTCALL SCSIBR::FS_Create(BYTE *buf)
dp = (DWORD*)&buf[i]; dp = (DWORD*)&buf[i];
nKey = ntohl(*dp); nKey = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
pNamests = (Human68k::namests_t*)&buf[i]; pNamests = (Human68k::namests_t*)&buf[i];
i += sizeof(Human68k::namests_t); i += sizeof(Human68k::namests_t);
@@ -5356,7 +5371,7 @@ void FASTCALL SCSIBR::FS_Open(BYTE *buf)
dp = (DWORD*)&buf[i]; dp = (DWORD*)&buf[i];
nKey = ntohl(*dp); nKey = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
pNamests = (Human68k::namests_t*)&buf[i]; pNamests = (Human68k::namests_t*)&buf[i];
i += sizeof(Human68k::namests_t); i += sizeof(Human68k::namests_t);
@@ -5409,7 +5424,7 @@ void FASTCALL SCSIBR::FS_Close(BYTE *buf)
dp = (DWORD*)&buf[i]; dp = (DWORD*)&buf[i];
nKey = ntohl(*dp); nKey = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
pFcb = (Human68k::fcb_t*)&buf[i]; pFcb = (Human68k::fcb_t*)&buf[i];
i += sizeof(Human68k::fcb_t); i += sizeof(Human68k::fcb_t);
@@ -5458,7 +5473,7 @@ void FASTCALL SCSIBR::FS_Read(BYTE *buf)
pFcb = (Human68k::fcb_t*)&buf[i]; pFcb = (Human68k::fcb_t*)&buf[i];
i += sizeof(Human68k::fcb_t); i += sizeof(Human68k::fcb_t);
dp = (DWORD*)&buf[i]; dp = (DWORD*)&buf[i];
nSize = ntohl(*dp); nSize = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
@@ -5507,7 +5522,7 @@ void FASTCALL SCSIBR::FS_Write(BYTE *buf)
dp = (DWORD*)buf; dp = (DWORD*)buf;
nKey = ntohl(*dp); nKey = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
pFcb = (Human68k::fcb_t*)&buf[i]; pFcb = (Human68k::fcb_t*)&buf[i];
i += sizeof(Human68k::fcb_t); i += sizeof(Human68k::fcb_t);
@@ -5559,7 +5574,7 @@ void FASTCALL SCSIBR::FS_Seek(BYTE *buf)
dp = (DWORD*)buf; dp = (DWORD*)buf;
nKey = ntohl(*dp); nKey = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
pFcb = (Human68k::fcb_t*)&buf[i]; pFcb = (Human68k::fcb_t*)&buf[i];
i += sizeof(Human68k::fcb_t); i += sizeof(Human68k::fcb_t);
@@ -5618,7 +5633,7 @@ void FASTCALL SCSIBR::FS_TimeStamp(BYTE *buf)
dp = (DWORD*)&buf[i]; dp = (DWORD*)&buf[i];
nKey = ntohl(*dp); nKey = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
pFcb = (Human68k::fcb_t*)&buf[i]; pFcb = (Human68k::fcb_t*)&buf[i];
i += sizeof(Human68k::fcb_t); i += sizeof(Human68k::fcb_t);
@@ -5699,10 +5714,10 @@ void FASTCALL SCSIBR::FS_CtrlDrive(BYTE *buf)
dp = (DWORD*)buf; dp = (DWORD*)buf;
nUnit = ntohl(*dp); nUnit = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
pCtrlDrive = (Human68k::ctrldrive_t*)&buf[i]; pCtrlDrive = (Human68k::ctrldrive_t*)&buf[i];
i += sizeof(Human68k::ctrldrive_t); i += sizeof(Human68k::ctrldrive_t);
fsresult = fs->CtrlDrive(nUnit, pCtrlDrive); fsresult = fs->CtrlDrive(nUnit, pCtrlDrive);
memcpy(fsout, pCtrlDrive, sizeof(Human68k::ctrldrive_t)); memcpy(fsout, pCtrlDrive, sizeof(Human68k::ctrldrive_t));
@@ -5729,7 +5744,7 @@ void FASTCALL SCSIBR::FS_GetDPB(BYTE *buf)
dp = (DWORD*)buf; dp = (DWORD*)buf;
nUnit = ntohl(*dp); nUnit = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
fsresult = fs->GetDPB(nUnit, &dpb); fsresult = fs->GetDPB(nUnit, &dpb);
dpb.sector_size = htons(dpb.sector_size); dpb.sector_size = htons(dpb.sector_size);
@@ -5772,7 +5787,7 @@ void FASTCALL SCSIBR::FS_DiskRead(BYTE *buf)
dp = (DWORD*)&buf[i]; dp = (DWORD*)&buf[i];
nSize = ntohl(*dp); nSize = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
fsresult = fs->DiskRead(nUnit, fsout, nSector, nSize); fsresult = fs->DiskRead(nUnit, fsout, nSector, nSize);
fsoutlen = 0x200; fsoutlen = 0x200;
} }
@@ -5796,7 +5811,7 @@ void FASTCALL SCSIBR::FS_DiskWrite(BYTE *buf)
dp = (DWORD*)buf; dp = (DWORD*)buf;
nUnit = ntohl(*dp); nUnit = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
fsresult = fs->DiskWrite(nUnit); fsresult = fs->DiskWrite(nUnit);
} }
@@ -5873,7 +5888,7 @@ void FASTCALL SCSIBR::FS_Flush(BYTE *buf)
dp = (DWORD*)buf; dp = (DWORD*)buf;
nUnit = ntohl(*dp); nUnit = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
fsresult = fs->Flush(nUnit); fsresult = fs->Flush(nUnit);
} }
@@ -5896,7 +5911,7 @@ void FASTCALL SCSIBR::FS_CheckMedia(BYTE *buf)
dp = (DWORD*)buf; dp = (DWORD*)buf;
nUnit = ntohl(*dp); nUnit = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
fsresult = fs->CheckMedia(nUnit); fsresult = fs->CheckMedia(nUnit);
} }
@@ -5919,7 +5934,7 @@ void FASTCALL SCSIBR::FS_Lock(BYTE *buf)
dp = (DWORD*)buf; dp = (DWORD*)buf;
nUnit = ntohl(*dp); nUnit = ntohl(*dp);
i += sizeof(DWORD); i += sizeof(DWORD);
fsresult = fs->Lock(nUnit); fsresult = fs->Lock(nUnit);
} }
@@ -6484,7 +6499,7 @@ void FASTCALL SASIDEV::Command()
#ifdef RASCSI #ifdef RASCSI
// Command reception handshake (10 bytes are automatically received at the first command) // Command reception handshake (10 bytes are automatically received at the first command)
count = ctrl.bus->CommandHandShake(ctrl.buffer); count = ctrl.bus->CommandHandShake(ctrl.buffer);
// If no byte can be received move to the status phase // If no byte can be received move to the status phase
if (count == 0) { if (count == 0) {
Error(); Error();
@@ -7716,7 +7731,7 @@ BOOL FASTCALL SASIDEV::XferIn(BYTE *buf)
// Read from disk // Read from disk
ctrl.length = ctrl.unit[lun]->Read(buf, ctrl.next); ctrl.length = ctrl.unit[lun]->Read(buf, ctrl.next);
ctrl.next++; ctrl.next++;
// If there is an error, go to the status phase // If there is an error, go to the status phase
if (ctrl.length <= 0) { if (ctrl.length <= 0) {
// Cancel data-in // Cancel data-in
@@ -7856,6 +7871,30 @@ void FASTCALL SASIDEV::FlushUnit()
ctrl.unit[lun]->Flush(); ctrl.unit[lun]->Flush();
} }
break; break;
// Mode Select (6)
case 0x15:
// MODE SELECT(10)
case 0x55:
// Debug code related to Issue #2 on github, where we get an unhandled Model select when
// the mac is rebooted
// https://github.com/akuker/RASCSI/issues/2
Log(Log::Warning, "Received \'Mode Select\' \[%02X\]\n");
Log(Log::Warning, " Operation Code: \[%02X\]\n", ctrl.cmd[0]);
Log(Log::Warning, " Logical Unit %01X, PF %01X, SP %01X \[%02X\]\n", ctrl.cmd[1] >> 5, 1 & (ctrl.cmd[1] >> 4), ctrl.cmd[1] & 1, ctrl.cmd[1]);
Log(Log::Warning, " Reserved: %02X\n", ctrl.cmd[2]);
Log(Log::Warning, " Reserved: %02X\n", ctrl.cmd[3]);
Log(Log::Warning, " Parameter List Len %02X\n", ctrl.cmd[4]);
Log(Log::Warning, " Reserved: %02X\n", ctrl.cmd[5]);
Log(Log::Warning, " Ctrl Len: %08X\n",ctrl.length);
if (!ctrl.unit[lun]->ModeSelect(
ctrl.cmd, ctrl.buffer, ctrl.offset)) {
// MODE SELECT failed
Log(Log::Warning, "Error occured while processing Mode Select command %02X\n", ctrl.cmd[0]);
return;
}
break;
default: default:
printf("Received an invalid flush command %08X!!!!!\n",ctrl.cmd[0]); printf("Received an invalid flush command %08X!!!!!\n",ctrl.cmd[0]);
ASSERT(FALSE); ASSERT(FALSE);