1
0
Fork 0

improved aspi support (thanx SaPu)

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1802
This commit is contained in:
Ulf Wohlers 2004-05-19 11:44:48 +00:00
parent eb944f7803
commit c11d895fd4
2 changed files with 217 additions and 185 deletions

View file

@ -46,6 +46,8 @@ public:
virtual bool ReadSectors (PhysPt buffer, bool raw, unsigned long sector, unsigned long num) = 0;
virtual bool LoadUnloadMedia (bool unload) = 0;
virtual void InitNewMedia (void) {};
};
class CDROM_Interface_SDL : public CDROM_Interface
@ -54,18 +56,18 @@ public:
CDROM_Interface_SDL (void);
virtual ~CDROM_Interface_SDL(void);
bool SetDevice (char* path, int forceCD);
bool GetUPC (unsigned char& attr, char* upc) { attr = 0; strcpy(upc,"UPC"); return true; };
bool GetAudioTracks (int& stTrack, int& end, TMSF& leadOut);
bool GetAudioTrackInfo (int track, TMSF& start, unsigned char& attr);
bool GetAudioSub (unsigned char& attr, unsigned char& track, unsigned char& index, TMSF& relPos, TMSF& absPos);
bool GetAudioStatus (bool& playing, bool& pause);
bool GetMediaTrayStatus (bool& mediaPresent, bool& mediaChanged, bool& trayOpen);
bool PlayAudioSector (unsigned long start,unsigned long len);
bool PauseAudio (bool resume);
bool StopAudio (void);
bool ReadSectors (PhysPt buffer, bool raw, unsigned long sector, unsigned long num) { return false; };
bool LoadUnloadMedia (bool unload);
virtual bool SetDevice (char* path, int forceCD);
virtual bool GetUPC (unsigned char& attr, char* upc) { attr = 0; strcpy(upc,"UPC"); return true; };
virtual bool GetAudioTracks (int& stTrack, int& end, TMSF& leadOut);
virtual bool GetAudioTrackInfo (int track, TMSF& start, unsigned char& attr);
virtual bool GetAudioSub (unsigned char& attr, unsigned char& track, unsigned char& index, TMSF& relPos, TMSF& absPos);
virtual bool GetAudioStatus (bool& playing, bool& pause);
virtual bool GetMediaTrayStatus (bool& mediaPresent, bool& mediaChanged, bool& trayOpen);
virtual bool PlayAudioSector (unsigned long start,unsigned long len);
virtual bool PauseAudio (bool resume);
virtual bool StopAudio (void);
virtual bool ReadSectors (PhysPt buffer, bool raw, unsigned long sector, unsigned long num) { return false; };
virtual bool LoadUnloadMedia (bool unload);
private:
bool Open (void);
@ -171,6 +173,7 @@ public:
bool LoadUnloadMedia (bool unload);
void InitNewMedia (void) { Close(); Open(); };
private:
bool Open (void);

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: cdrom_aspi_win32.cpp,v 1.10 2004-01-10 14:03:34 qbix79 Exp $ */
/* $Id: cdrom_aspi_win32.cpp,v 1.11 2004-05-19 11:44:48 finsterr Exp $ */
#if defined (WIN32)
@ -39,6 +39,19 @@
#include "scsidefs.h"
// always use a buffer of the maximum struct size (like the union of all 'SRB_*' struct types)
// Thanx SaPu
typedef union {
SRB_HAInquiry hainquiry;
SRB_GDEVBlock gdevblock;
SRB_ExecSCSICmd execscsicmd;
SRB_Abort abort;
SRB_BusDeviceReset busdevicereset;
SRB_GetDiskInfo getdiskinfo;
SRB_RescanPort rescanport;
SRB_GetSetTimeouts getsettimeouts;
} ASPI_SRB;
// *****************************************************************
// Windows ASPI functions (should work for all WIN with ASPI layer)
// *****************************************************************
@ -78,34 +91,34 @@ bool GetRegistryValue(HKEY& hKey,char* valueName, char* buffer, ULONG bufferSize
BYTE CDROM_Interface_Aspi::GetHostAdapter(char* hardwareID)
{
SRB_HAInquiry sh;
SRB_GDEVBlock sd;
ASPI_SRB sh;
ASPI_SRB sd;
DWORD d = pGetASPI32SupportInfo();
int cnt = LOBYTE(LOWORD(d));
int i,j,k,max;
for(i=0; i<cnt; i++) {
memset(&sh, 0, sizeof(sh));
sh.SRB_Cmd = SC_HA_INQUIRY;
sh.SRB_HaId = i;
sh.hainquiry.SRB_Cmd = SC_HA_INQUIRY;
sh.hainquiry.SRB_HaId = i;
pSendASPI32Command((LPSRB)&sh);
if (sh.SRB_Status!=SS_COMP) continue;
if (sh.hainquiry.SRB_Status!=SS_COMP) continue;
// Indicates the maximum number of targets the adapter supports
// If the value is not 8 or 16, then it should be assumed max target is 8
max = (int)sh.HA_Unique[3];
max = (int)sh.hainquiry.HA_Unique[3];
if ((max!=8) && (max!=16)) max = 8;
for(j=0; j<max; j++) {
for(k=0; k<8; k++) {
memset(&sd, 0, sizeof(sd));
sd.SRB_Cmd = SC_GET_DEV_TYPE;
sd.SRB_HaId = i;
sd.SRB_Target = j;
sd.SRB_Lun = k;
sd.gdevblock.SRB_Cmd = SC_GET_DEV_TYPE;
sd.gdevblock.SRB_HaId = i;
sd.gdevblock.SRB_Target = j;
sd.gdevblock.SRB_Lun = k;
pSendASPI32Command((LPSRB)&sd);
if (sd.SRB_Status == SS_COMP) {
if (sd.SRB_DeviceType == DTYPE_CDROM) {
if (sd.gdevblock.SRB_Status == SS_COMP) {
if (sd.gdevblock.SRB_DeviceType == DTYPE_CDROM) {
if ((target==j) && (lun==k)) {
LOG(LOG_MISC,LOG_NORMAL)("SCSI: Getting Hardware vendor.");
// "Hardware ID = vendor" match ?
@ -175,23 +188,24 @@ bool CDROM_Interface_Aspi::ScanRegistryFindKey(HKEY& hKeyBase)
bool CDROM_Interface_Aspi::GetVendor(BYTE HA_num, BYTE SCSI_Id, BYTE SCSI_Lun, char* szBuffer)
{
SRB_ExecSCSICmd srbExec;
ASPI_SRB srbExec;
// SRB_ExecSCSICmd srbExec;
memset ( &srbExec, 0, sizeof ( SRB_ExecSCSICmd ) );
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
srbExec.SRB_Cmd = SC_EXEC_SCSI_CMD ;
srbExec.SRB_HaId = HA_num;
srbExec.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
srbExec.SRB_Target = SCSI_Id;
srbExec.SRB_Lun = SCSI_Lun;
srbExec.SRB_BufLen = 36;
srbExec.SRB_BufPointer = (unsigned char*)szBuffer;
srbExec.SRB_SenseLen = SENSE_LEN;
srbExec.SRB_CDBLen = 6;
srbExec.SRB_PostProc = (LPVOID)hEvent;
srbExec.CDBByte [ 0 ] = SCSI_INQUIRY;
srbExec.CDBByte [ 4 ] = 36; // allocation length per szBuffer [ ]
srbExec.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD ;
srbExec.execscsicmd.SRB_HaId = HA_num;
srbExec.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
srbExec.execscsicmd.SRB_Target = SCSI_Id;
srbExec.execscsicmd.SRB_Lun = SCSI_Lun;
srbExec.execscsicmd.SRB_BufLen = 36;
srbExec.execscsicmd.SRB_BufPointer = (unsigned char*)szBuffer;
srbExec.execscsicmd.SRB_SenseLen = SENSE_LEN;
srbExec.execscsicmd.SRB_CDBLen = 6;
srbExec.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
srbExec.execscsicmd.CDBByte [ 0 ] = SCSI_INQUIRY;
srbExec.execscsicmd.CDBByte [ 4 ] = 36; // allocation length per szBuffer [ ]
ResetEvent(hEvent);
int dwStatus = pSendASPI32Command ((LPSRB)&srbExec);
@ -201,7 +215,7 @@ bool CDROM_Interface_Aspi::GetVendor(BYTE HA_num, BYTE SCSI_Id, BYTE SCSI_Lun, c
// LOG(LOG_MISC|LOG_ERROR,"SCSI: Pending done.");
CloseHandle(hEvent);
if (srbExec.SRB_Status != SS_COMP) {
if (srbExec.execscsicmd.SRB_Status != SS_COMP) {
strcpy (szBuffer, "error" );
return false;
} else {
@ -373,26 +387,28 @@ void CDROM_Interface_Aspi::GetIOCTLAdapter(HANDLE hF,int * iDA,int * iDT,int * i
DWORD CDROM_Interface_Aspi::GetTOC(LPTOC toc)
{
SRB_ExecSCSICmd s;DWORD dwStatus;
// SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.SRB_HaId = haId;
s.SRB_Target = target;
s.SRB_Lun = lun;
s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.SRB_BufLen = sizeof(*toc);
s.SRB_BufPointer = (BYTE FAR *)toc;
s.SRB_SenseLen = SENSE_LEN;
s.SRB_CDBLen = 0x0A;
s.SRB_PostProc = (LPVOID)hEvent;
s.CDBByte[0] = SCSI_READ_TOC;
s.CDBByte[1] = 0x02; // 0x02 for MSF
s.CDBByte[7] = 0x03;
s.CDBByte[8] = 0x24;
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_BufLen = sizeof(*toc);
s.execscsicmd.SRB_BufPointer = (BYTE FAR *)toc;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_CDBLen = 0x0A;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.CDBByte[0] = SCSI_READ_TOC;
s.execscsicmd.CDBByte[1] = 0x02; // 0x02 for MSF
s.execscsicmd.CDBByte[7] = 0x03;
s.execscsicmd.CDBByte[8] = 0x24;
ResetEvent(hEvent);
dwStatus=pSendASPI32Command((LPSRB)&s);
@ -401,37 +417,39 @@ DWORD CDROM_Interface_Aspi::GetTOC(LPTOC toc)
CloseHandle(hEvent);
return (s.SRB_Status==SS_COMP);
return (s.execscsicmd.SRB_Status==SS_COMP);
}
bool CDROM_Interface_Aspi::PlayAudioSector(unsigned long start,unsigned long len)
{
SRB_ExecSCSICmd s;DWORD dwStatus;
// SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.SRB_HaId = haId;
s.SRB_Target = target;
s.SRB_Lun = lun;
s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.SRB_BufLen = 0;
s.SRB_BufPointer = 0;
s.SRB_SenseLen = SENSE_LEN;
s.SRB_CDBLen = 12;
s.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_BufLen = 0;
s.execscsicmd.SRB_BufPointer = 0;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_CDBLen = 12;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.CDBByte[0] = SCSI_PLAYAUD_12;
s.CDBByte[1] = lun << 5;
s.CDBByte[2] = (unsigned char)((start >> 24) & 0xFF);
s.CDBByte[3] = (unsigned char)((start >> 16) & 0xFF);
s.CDBByte[4] = (unsigned char)((start >> 8) & 0xFF);
s.CDBByte[5] = (unsigned char)((start & 0xFF));
s.CDBByte[6] = (unsigned char)((len >> 24) & 0xFF);
s.CDBByte[7] = (unsigned char)((len >> 16) & 0xFF);
s.CDBByte[8] = (unsigned char)((len >> 8) & 0xFF);
s.CDBByte[9] = (unsigned char)(len & 0xFF);
s.execscsicmd.CDBByte[0] = SCSI_PLAYAUD_12;
s.execscsicmd.CDBByte[1] = lun << 5;
s.execscsicmd.CDBByte[2] = (unsigned char)((start >> 24) & 0xFF);
s.execscsicmd.CDBByte[3] = (unsigned char)((start >> 16) & 0xFF);
s.execscsicmd.CDBByte[4] = (unsigned char)((start >> 8) & 0xFF);
s.execscsicmd.CDBByte[5] = (unsigned char)((start & 0xFF));
s.execscsicmd.CDBByte[6] = (unsigned char)((len >> 24) & 0xFF);
s.execscsicmd.CDBByte[7] = (unsigned char)((len >> 16) & 0xFF);
s.execscsicmd.CDBByte[8] = (unsigned char)((len >> 8) & 0xFF);
s.execscsicmd.CDBByte[9] = (unsigned char)(len & 0xFF);
ResetEvent(hEvent);
@ -441,7 +459,7 @@ bool CDROM_Interface_Aspi::PlayAudioSector(unsigned long start,unsigned long len
CloseHandle(hEvent);
return s.SRB_Status==SS_COMP;
return s.execscsicmd.SRB_Status==SS_COMP;
}
bool CDROM_Interface_Aspi::StopAudio(void)
@ -451,23 +469,25 @@ bool CDROM_Interface_Aspi::StopAudio(void)
bool CDROM_Interface_Aspi::PauseAudio(bool resume)
{
SRB_ExecSCSICmd s;DWORD dwStatus;
//SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.SRB_HaId = haId;
s.SRB_Target = target;
s.SRB_Lun = lun;
s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.SRB_BufLen = 0x00;
s.SRB_SenseLen = SENSE_LEN;
s.SRB_CDBLen = 0x0A;
s.SRB_PostProc = (LPVOID)hEvent;
s.CDBByte[0] = 0x4B;
s.CDBByte[8] = (unsigned char)resume; // Pause
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_BufLen = 0x00;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_CDBLen = 0x0A;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.CDBByte[0] = 0x4B;
s.execscsicmd.CDBByte[8] = (unsigned char)resume; // Pause
ResetEvent(hEvent);
dwStatus=pSendASPI32Command((LPSRB)&s);
@ -476,37 +496,39 @@ bool CDROM_Interface_Aspi::PauseAudio(bool resume)
CloseHandle(hEvent);
return (s.SRB_Status==SS_COMP);
return (s.execscsicmd.SRB_Status==SS_COMP);
};
bool CDROM_Interface_Aspi::GetAudioSub(unsigned char& attr, unsigned char& track, unsigned char& index, TMSF& relPos, TMSF& absPos)
{
SUB_Q_CURRENT_POSITION pos;
SRB_ExecSCSICmd s;DWORD dwStatus;
// SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.SRB_HaId = haId;
s.SRB_Target = target;
s.SRB_Lun = lun;
s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.SRB_BufLen = sizeof(pos);
s.SRB_BufPointer = (BYTE FAR *)&pos;
s.SRB_CDBLen = 10;
s.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.SRB_BufLen = sizeof(pos);
s.execscsicmd.SRB_BufPointer = (BYTE FAR *)&pos;
s.execscsicmd.SRB_CDBLen = 10;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.CDBByte[0] = SCSI_SUBCHANNEL;
s.CDBByte[1] = (lun<<5)|2; // lun & msf
s.CDBByte[2] = 0x40; // subq
s.CDBByte[3] = 0x01; // curr pos info
s.CDBByte[6] = 0; // track number (only in isrc mode, ignored)
s.CDBByte[7] = 0; // alloc len
s.CDBByte[8] = sizeof(pos);
s.execscsicmd.CDBByte[0] = SCSI_SUBCHANNEL;
s.execscsicmd.CDBByte[1] = (lun<<5)|2; // lun & msf
s.execscsicmd.CDBByte[2] = 0x40; // subq
s.execscsicmd.CDBByte[3] = 0x01; // curr pos info
s.execscsicmd.CDBByte[6] = 0; // track number (only in isrc mode, ignored)
s.execscsicmd.CDBByte[7] = 0; // alloc len
s.execscsicmd.CDBByte[8] = sizeof(pos);
ResetEvent(hEvent);
@ -516,7 +538,7 @@ bool CDROM_Interface_Aspi::GetAudioSub(unsigned char& attr, unsigned char& track
CloseHandle(hEvent);
if (s.SRB_Status!=SS_COMP) return false;
if (s.execscsicmd.SRB_Status!=SS_COMP) return false;
attr = (pos.Control<<4) &0xEF;
track = pos.TrackNumber;
@ -534,31 +556,33 @@ bool CDROM_Interface_Aspi::GetAudioSub(unsigned char& attr, unsigned char& track
bool CDROM_Interface_Aspi::GetUPC(unsigned char& attr, char* upcdata)
{
SUB_Q_MEDIA_CATALOG_NUMBER upc;
SRB_ExecSCSICmd s;DWORD dwStatus;
ASPI_SRB s;
//SRB_ExecSCSICmd s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.SRB_HaId = haId;
s.SRB_Target = target;
s.SRB_Lun = lun;
s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.SRB_BufLen = sizeof(upc);
s.SRB_BufPointer = (BYTE FAR *)&upc;
s.SRB_CDBLen = 10;
s.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.SRB_BufLen = sizeof(upc);
s.execscsicmd.SRB_BufPointer = (BYTE FAR *)&upc;
s.execscsicmd.SRB_CDBLen = 10;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.CDBByte[0] = SCSI_SUBCHANNEL;
s.CDBByte[1] = (lun<<5)|2; // lun & msf
s.CDBByte[2] = 0x40; // subq
s.CDBByte[3] = 0x02; // get upc
s.CDBByte[6] = 0; // track number (only in isrc mode, ignored)
s.CDBByte[7] = 0; // alloc len
s.CDBByte[8] = sizeof(upc);
s.execscsicmd.CDBByte[0] = SCSI_SUBCHANNEL;
s.execscsicmd.CDBByte[1] = (lun<<5)|2; // lun & msf
s.execscsicmd.CDBByte[2] = 0x40; // subq
s.execscsicmd.CDBByte[3] = 0x02; // get upc
s.execscsicmd.CDBByte[6] = 0; // track number (only in isrc mode, ignored)
s.execscsicmd.CDBByte[7] = 0; // alloc len
s.execscsicmd.CDBByte[8] = sizeof(upc);
ResetEvent(hEvent);
@ -568,15 +592,14 @@ bool CDROM_Interface_Aspi::GetUPC(unsigned char& attr, char* upcdata)
CloseHandle(hEvent);
if (s.SRB_Status!=SS_COMP) return false;
if (s.execscsicmd.SRB_Status!=SS_COMP) return false;
// attr = (upc.ADR<<4) | upc.Control;
attr = 0;
int pos = 0;
// Convert to mscdex format
// for (int i=0; i<6; i++) upcdata[i] = (upc.MediaCatalog[pos++]<<4)+(upc.MediaCatalog[pos++]&0x0F);
// upcdata[6] = (upc.MediaCatalog[pos++]<<4);
for (int i=0; i<7; i++) upcdata[i] = upc.MediaCatalog[i];
for (int i=0; i<7; i++) upcdata[i] = (upc.MediaCatalog[i*2] << 4) | (upc.MediaCatalog[i*2+1] & 0x0F);
return true;
};
@ -586,31 +609,33 @@ bool CDROM_Interface_Aspi::GetAudioStatus(bool& playing, bool& pause)
playing = pause = false;
SUB_Q_HEADER sub;
SRB_ExecSCSICmd s;DWORD dwStatus;
// SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.SRB_HaId = haId;
s.SRB_Target = target;
s.SRB_Lun = lun;
s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.SRB_BufLen = sizeof(sub);
s.SRB_BufPointer = (BYTE FAR *)&sub;
s.SRB_CDBLen = 10;
s.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.SRB_BufLen = sizeof(sub);
s.execscsicmd.SRB_BufPointer = (BYTE FAR *)&sub;
s.execscsicmd.SRB_CDBLen = 10;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.CDBByte[0] = SCSI_SUBCHANNEL;
s.CDBByte[1] = (lun<<5)|2; // lun & msf
s.CDBByte[2] = 0x00; // no subq
s.CDBByte[3] = 0x00; // dont care
s.CDBByte[6] = 0; // track number (only in isrc mode, ignored)
s.CDBByte[7] = 0; // alloc len
s.CDBByte[8] = sizeof(sub);
s.execscsicmd.CDBByte[0] = SCSI_SUBCHANNEL;
s.execscsicmd.CDBByte[1] = (lun<<5)|2; // lun & msf
s.execscsicmd.CDBByte[2] = 0x00; // no subq
s.execscsicmd.CDBByte[3] = 0x00; // dont care
s.execscsicmd.CDBByte[6] = 0; // track number (only in isrc mode, ignored)
s.execscsicmd.CDBByte[7] = 0; // alloc len
s.execscsicmd.CDBByte[8] = sizeof(sub);
ResetEvent(hEvent);
@ -620,7 +645,7 @@ bool CDROM_Interface_Aspi::GetAudioStatus(bool& playing, bool& pause)
CloseHandle(hEvent);
if (s.SRB_Status!=SS_COMP) return false;
if (s.execscsicmd.SRB_Status!=SS_COMP) return false;
playing = (sub.AudioStatus==0x11);
pause = (sub.AudioStatus==0x12);
@ -630,27 +655,29 @@ bool CDROM_Interface_Aspi::GetAudioStatus(bool& playing, bool& pause)
bool CDROM_Interface_Aspi::LoadUnloadMedia(bool unload)
{
SRB_ExecSCSICmd s;DWORD dwStatus;
//SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.SRB_HaId = haId;
s.SRB_Target = target;
s.SRB_Lun = lun;
s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.SRB_BufLen = 0;
s.SRB_BufPointer = 0;
s.SRB_CDBLen = 14;
s.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.SRB_BufLen = 0;
s.execscsicmd.SRB_BufPointer = 0;
s.execscsicmd.SRB_CDBLen = 6; // 14;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.CDBByte[0] = SCSI_LOAD_UN;
s.CDBByte[1] = (lun<<5)|1; // lun & immediate
s.CDBByte[4] = (unload ? 0x02:0x03); // unload/load media
s.execscsicmd.CDBByte[0] = SCSI_LOAD_UN;
s.execscsicmd.CDBByte[1] = (lun<<5)|1; // lun & immediate
s.execscsicmd.CDBByte[4] = (unload ? 0x02:0x03); // unload/load media
ResetEvent(hEvent);
@ -660,7 +687,7 @@ bool CDROM_Interface_Aspi::LoadUnloadMedia(bool unload)
CloseHandle(hEvent);
if (s.SRB_Status!=SS_COMP) return false;
if (s.execscsicmd.SRB_Status!=SS_COMP) return false;
return true;
};
@ -684,7 +711,9 @@ bool CDROM_Interface_Aspi::GetMediaTrayStatus(bool& mediaPresent, bool& mediaCha
bool CDROM_Interface_Aspi::ReadSectors(PhysPt buffer, bool raw, unsigned long sector, unsigned long num)
{
SRB_ExecSCSICmd s;DWORD dwStatus;
//SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
@ -693,27 +722,27 @@ bool CDROM_Interface_Aspi::ReadSectors(PhysPt buffer, bool raw, unsigned long se
Bitu buflen = raw?2352*num:2048*num;
Bit8u* bufdata = new Bit8u[buflen];
s.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.SRB_HaId = haId;
s.SRB_Target = target;
s.SRB_Lun = lun;
s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.SRB_BufLen = buflen;
s.SRB_BufPointer = (BYTE FAR*)bufdata;
s.SRB_CDBLen = 12;
s.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.SRB_BufLen = buflen;
s.execscsicmd.SRB_BufPointer = (BYTE FAR*)bufdata;
s.execscsicmd.SRB_CDBLen = 12;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.CDBByte[0] = 0xBE;
s.CDBByte[2] = (unsigned char)((sector >> 24) & 0xFF);
s.CDBByte[3] = (unsigned char)((sector >> 16) & 0xFF);
s.CDBByte[4] = (unsigned char)((sector >> 8) & 0xFF);
s.CDBByte[5] = (unsigned char)((sector & 0xFF));
s.CDBByte[6] = (unsigned char)((num >> 16) & 0xFF);
s.CDBByte[7] = (unsigned char)((num >> 8) & 0xFF);
s.CDBByte[8] = (unsigned char) (num & 0xFF);
s.CDBByte[9] = (raw?0xF0:0x10);
s.execscsicmd.CDBByte[0] = 0xBE;
s.execscsicmd.CDBByte[2] = (unsigned char)((sector >> 24) & 0xFF);
s.execscsicmd.CDBByte[3] = (unsigned char)((sector >> 16) & 0xFF);
s.execscsicmd.CDBByte[4] = (unsigned char)((sector >> 8) & 0xFF);
s.execscsicmd.CDBByte[5] = (unsigned char)((sector & 0xFF));
s.execscsicmd.CDBByte[6] = (unsigned char)((num >> 16) & 0xFF);
s.execscsicmd.CDBByte[7] = (unsigned char)((num >> 8) & 0xFF);
s.execscsicmd.CDBByte[8] = (unsigned char) (num & 0xFF);
s.execscsicmd.CDBByte[9] = (raw?0xF0:0x10);
ResetEvent(hEvent);
@ -728,7 +757,7 @@ bool CDROM_Interface_Aspi::ReadSectors(PhysPt buffer, bool raw, unsigned long se
delete[] bufdata;
return (s.SRB_Status==SS_COMP);
return (s.execscsicmd.SRB_Status==SS_COMP);
};
#endif