#include "stdio.h"
void Wait (unsigned int count);
unsigned int ReadIDEReg (unsigned int regnum);
void WriteIDEReg (unsigned int regnum,unsigned int data);
int WriteIDECommand (unsigned int
int ReadIDEData (unsigned int
int WriteATAPICommand(unsigned char
int ReadATAPIData (unsigned char
int WriteATAPIData (unsigned char
struct structATAPIError ATAPIError (unsigned char devnum);
int PlayAudio (unsigned long startsect,unsigned long endsect,unsigned int devnum);
int StopAudio (unsigned int devnum);
int PauseAudio (unsigned int OnOff,unsigned int devnum);
int SetCDSpeed (unsigned int speed,unsigned int devnum);
unsigned long LBA2MSF (unsigned long LBA);
unsigned long MSF2LBA (unsigned long MSF);
void PrintMSF (unsigned long MSF,int flag);
int ReadCDSector (unsigned long sectnum,unsigned char
void PrintText (unsigned int
void PrintFileName (unsigned char
int ReadTOC (unsigned char
int ReadISOHdr (unsigned long sector,struct structISOHdr
void ResetInquiry (unsigned long
unsigned int SearchDir (unsigned long
int Inquiry (unsigned long
int ChangeDirectory (unsigned long
int ChangeDirectoryUp(unsigned long
int OpenFile (unsigned long
int ReadFileBytes (unsigned char
int NameMatch (unsigned char
void CopyBytes (unsigned char
unsigned long Char2Long (unsigned char
unsigned int Char2Int (unsigned char
void Int2Char (unsigned int value,unsigned char
void Long2Char (unsigned long value,unsigned char
unsigned long Char2LongMSBLSB (unsigned char
unsigned int Char2IntMSBLSB (unsigned char
void Int2CharMSBLSB (unsigned int value,unsigned char
void Long2CharMSBLSB (unsigned long value,unsigned char
struct structFileTime
{
unsigned char Year;
unsigned char Month;
unsigned char Day;
unsigned char Hour;
unsigned char Minute;
unsigned char Second;
signed char Greenwich;
};
struct structHdrTime
{
unsigned char Year;
unsigned char Month;
unsigned char Day;
unsigned char Hour;
unsigned char Minute;
unsigned char Second;
unsigned char Hundredth;
char Greenwich;
};
struct structDirRecord
{
unsigned char RecordLen;
unsigned char ExtAttributeLen;
unsigned long LocationExtent;
unsigned long DataLen;
struct structFileTime DateTime;
unsigned char FileFlags;
unsigned char FileUnitSize;
unsigned char InterleaveGapSize;
unsigned int VolumeSequenceNumber;
unsigned char FileIdentifierLen;
unsigned char FileIdentifier;
};
struct structISOHdr
{
unsigned char StructureVersion;
unsigned long VolumeSpaceSize;
unsigned int VolumeSetSize;
unsigned int VolumeSequenceNumber;
unsigned int LogicalBlockSize;
unsigned long PathTableSize;
unsigned long LocationLPathTable;
unsigned long LocationOptionLPathTable;
unsigned long LocationMPathTable;
unsigned long LocationOptionMPathTable;
struct structDirRecord RootDir;
unsigned char BootSystemIdentifier;
unsigned char BootIdentifier;
unsigned char SystemIdentifier;
unsigned char VolumeIdentifier;
unsigned char VolumeSetIdentifier;
unsigned char PublisherIdentifier;
unsigned char PreparerIdentifier;
unsigned char ApplicationIdentifier;
unsigned char CopyrightIdentifier;
unsigned char AbstractIdentifier;
unsigned char BibliographicIdentifier;
struct structHdrTime CreationDateTime;
struct structHdrTime ModificationDateTime;
struct structHdrTime ExpirationDateTime;
struct structHdrTime EffectiveDateTime;
unsigned char DOSJolietRomeo;
};
struct structCache
{
unsigned char DeviceNumber;
unsigned long SectorNumber;
unsigned char SectorCount;
unsigned char
};
struct structATAPIErrorText
{
unsigned char ErrorNumber;
unsigned char ErrorSubNumber;
unsigned char SolutionNumber;
unsigned char SolutionSubNumber;
unsigned char Text;
};
struct structATAPIError
{
unsigned char Flag;
unsigned char SenseKey;
unsigned char AdditionalSenseKey;
unsigned char AdditionalSenseKeyQualifier;
unsigned char SolutionNumber;
unsigned char SolutionSubNumber;
struct structATAPIErrorText
};
struct structCDPosition
{
unsigned long Absolute;
unsigned long Relative;
unsigned char Track;
unsigned char Index;
};
struct structCDNumber
{
int Flag;
unsigned char Number;
};
const
unsigned int IDEport=0X170,
IDERegData=0,
IDERegError=1,
IDERegFeature=1,
IDERegSectCount=2,
IDERegSectNum=3,
IDERegCylLow=4,
IDERegCylHigh=5,
IDERegDevHead=6,
IDERegStatus=7,
IDERegCommand=7,
IDERegAltStatus=14,
IDERegAdres=15;
const
struct structATAPIErrorText ATAPIErrorText=
{
{0x00,0x00,0,0,"No additional info "},
{0x00,0x11,1,0,"Audio play in progress "},
{0x00,0x12,1,0,"Audio play paused "},
{0x00,0x13,1,0,"Audio play completed "},
{0x00,0x14,9,0,"Audio play error "},
{0x00,0x15,1,0,"No audio play status "},
{0x01,0x00,9,0,"Mechanical error "},
{0x02,0x00,0,0,"No seek complete "},
{0x04,0x00,8,0,"Not ready "},
{0x04,0x01,1,0,"Not ready, in progress.."},
{0x04,0x02,4,0,"Not ready, reinitialize "},
{0x04,0x03,6,0,"Not ready, manual interv"},
{0x04,0x04,1,0,"Not ready, formatting "},
{0x05,0x00,0,0,"No response to selection"},
{0x05,0x01,9,0,"Load/eject failure "},
{0x06,0x00,9,0,"No reference position "},
{0x08,0x00,9,0,"Communication failure "},
{0x08,0x01,9,0,"Communication timed out "},
{0x08,0x02,9,0,"Communication bad parity"},
{0x09,0x00,3,0,"Tracking error "},
{0x09,0x01,8,0,"Tracking servo failure "},
{0x09,0x02,8,0,"Focus servo failure "},
{0x09,0x03,8,0,"Spindle servo failure "},
{0x11,0x00,3,0,"Unrecovered read error "},
{0x11,0x06,3,0,"CIRC unrecovered error "},
{0x15,0x00,3,0,"Random position error "},
{0x15,0x01,8,0,"Mechanical error "},
{0x15,0x02,3,0,"Random position error "},
{0x17,0x00,1,0,"Recovered, no correction"},
{0x17,0x01,1,0,"Recovered, retries "},
{0x17,0x02,1,0,"Recovered, + head offset"},
{0x17,0x03,1,0,"Recovered, - head offset"},
{0x17,0x04,1,0,"Recovered, retries/CIRC "},
{0x17,0x05,1,0,"Recovered, previous ID "},
{0x18,0x00,1,0,"Recovered, correction "},
{0x18,0x01,1,0,"Recovered, reties/correc"},
{0x18,0x02,1,0,"Recovered, auto realloc "},
{0x18,0x03,1,0,"Recovered, CIRC "},
{0x18,0x04,1,0,"Recovered, L-EC "},
{0x1A,0x00,0xFF,1,"Bad parameterlist length"},
{0x20,0x00,0xFF,1,"Invalid command "},
{0x21,0x00,0xFF,1,"Bad logical block number"},
{0x24,0x00,0xFF,1,"Invalid field in packet "},
{0x25,0x00,0,0,"No logical unit support "},
{0x26,0x00,0xFF,1,"Invalid field in paramet"},
{0x26,0x01,0xFF,1,"Parameter not supported "},
{0x26,0x02,0xFF,1,"Bad parameter value "},
{0x28,0x00,0,0,"Medium may have changed "},
{0x29,0x00,1,0,"Reset occured "},
{0x2A,0x00,1,0,"Parameters changed "},
{0x2A,0x01,1,0,"Mode parameters changed "},
{0x30,0x00,8,0,"Incompatible medium "},
{0x30,0x01,8,0,"Unknown format medium "},
{0x30,0x02,8,0,"Incompatible format "},
{0x39,0x00,9,0,"No saving support "},
{0x3A,0x00,1,0,"No medium "},
{0x3A,0x01,1,0,"No medium, tray closed "},
{0x3A,0x02,1,0,"No medium, tray opened "},
{0x3E,0x00,1,0,"Not self-configured yet "},
{0x3F,0x00,1,0,"Operate condition change"},
{0x3F,0x01,1,0,"Microcode changed "},
{0x3F,0x03,1,0,"Inquiry data changed "},
{0x40,0xFF,0xFF,0,"Self test failed "},
{0x44,0x00,0xFF,0,"Internal error "},
{0x4C,0x00,0xFF,0,"Failed self-config "},
{0x4E,0x00,0xFF,1,"Overlap command attempt "},
{0x53,0x00,9,0,"Load/eject failure "},
{0x53,0x02,0,0,"Medium removal prevented"},
{0x57,0x00,8,0,"TOC load error "},
{0x5A,0x00,0,0,"Operator request "},
{0x5A,0x01,0,0,"Medium removal request "},
{0x63,0x00,0xFF,1,"End of user area error "},
{0x64,0x00,0xFF,1,"Illegal track mode "},
{0xB9,0x00,0,0,"Audio play aborted "},
{0xBF,0x00,3,0,"Loss of streaming "},
{0xFF,0xFF,0,0," "}
};
unsigned int IDENop ={0,0,0,0,0xA0,0X00},
IDEATAPIReset ={0,0,0,0,0XA0,0X08},
IDEDiagnostic ={0,0,0,0,0XA0,0X90},
IDEATAPIPacket ={0,0,0,0,0XA0,0XA0},
IDEATAPIIdent ={0,0,0,0,0XA0,0XA1},
IDEStandbyImm ={0,0,0,0,0XA0,0XE0},
IDEIdleImm ={0,0,0,0,0XA0,0XE1},
IDECheckpower ={0,0,0,0,0XA0,0XE5},
IDESleep ={0,0,0,0,0XA0,0XE6},
IDESetFeatures ={0,0,0,0,0XA0,0XEF};
unsigned char
ATAPIRequestSense={0X03,0,0,0,18,0,0,0,0,0,0,0},
ATAPIStartStopUnit={0X1B,1,0,0,0,0,0,0,0,0,0,0},
ATAPIRead10 ={0X28,0,0,0,0,0,0,0,0,0,0,0},
ATAPIReadSubChan1={0X42,0,0x40,1,0,0,0,0,16,0,0,0},
ATAPIReadSubChan2={0x42,0,0x40,2,0,0,0,0,24,0,0,0},
ATAPIReadSubChan3={0x42,0,0x40,3,0,0,0,0,24,0,0,0},
ATAPIReadTOC ={0X43,0,0,0,0,0,0,0X03,0X24,0,0,0},
ATAPIPlayAudioMSF={0X47,0,0,0,0,0,0,0,0,0,0,0},
ATAPIPauseAudio ={0X4B,0,0,0,0,0,0,0,0,0,0,0},
ATAPIStopAudio ={0X4E,0,0,0,0,0,0,0,0,0,0,0},
ATAPISetSpeed ={0XBB,0,0,0,0,0,0,0,0,0,0,0};
struct structCache SectorCache;
unsigned int Device0Data,
Device1Data;
unsigned char
Device0TOC,
Device1TOC,
SectorBuf;
struct structISOHdr Device0ISOHdr;
struct structISOHdr Device1ISOHdr;
unsigned long
Device0DirTable,
Device1DirTable;
unsigned int NumDevice;
void Test (unsigned char
for (i=0;i<12;i++)
{
printf("%X-",
}
}
void PrintLong (unsigned long var)
{
printf("%X",var>>16);
printf("%X",var&0xFFFF);
}
void Wait (unsigned int counter)
{
unsigned int i;
while (counter>0)
{counter--;
i=0Xffff;
while (i!=0)
{i--;}
}
}
unsigned char WaitKey ()
{
unsigned int i;
printf("\nPress any key to continu...");
while ((i=getch())==EOF)
{}
return(i);
}
unsigned int ReadIDEReg (unsigned int regnum)
{
unsigned int i,j;
if (regnum>=8) {i=IDEport+regnum+0X1F8;}
else {i=IDEport+regnum;}
asm {
MOV DX,(i)
IN AX,DX
MOV (j),AX
}
return(j);
}
void WriteIDEReg (unsigned int regnum, unsigned int data)
{
unsigned int i,j;
if (regnum>=8) {i=IDEport+regnum+0X1F8;}
else {i=IDEport+regnum;}
j=data;
asm {
MOV DX,(i)
MOV AX,(j)
OUT DX,AX
}
}
int WriteIDECommand (unsigned int
i=0;
do
{
if (i==0XFFFF)
{
return(-1);
}
i++;
}
while ((ReadIDEReg(IDERegStatus)&0X80)!=0);
WriteIDEReg(IDERegDevHead,(
i=0;
do
{
if (i==0XFFFF)
{
return(-1);
}
i++;
}
while ((ReadIDEReg(IDERegStatus)&0XC0)!=0X40);
for (i=0;i<4;i++)
{
WriteIDEReg(i+2,
}
WriteIDEReg(IDERegCommand,
return(0);
}
int ReadIDEData (unsigned int
i=0;
do
{
if (i==0XFFFF)
{
return(-1);
}
if ((ReadIDEReg(7)&0x01)!=0)
{
return(-1);};
}
while ((ReadIDEReg(7)&0x80)!=0);
if ((ReadIDEReg(7)&0x08)!=0x08)
{
return(-1);
}
while (len!=0)
{
len--;
data++;
}
return(0);
}
int WriteATAPICommand(unsigned char
i=0;
do
{
if (i==0XFFFF)
{
return(-1);
}
i++;
}
while ((ReadIDEReg(IDERegStatus)&0X80)!=0);
WriteIDEReg(IDERegDevHead,(0XA0+(devnum<<4)));
i=0;
do
{
if (i==0XFFFF)
{
return(-1);
}
i++;
}
while ((ReadIDEReg(IDERegStatus)&0X80)!=0);
WriteIDEReg(IDERegCylLow,maxlen&0XFF);
WriteIDEReg(IDERegCylHigh,maxlen>>8);
WriteIDEReg(IDERegCommand,0XA0);
i=0;
do
{
if (i==0XFFFF)
{
return(-1);
}
if ((ReadIDEReg(IDERegStatus)&0x01)!=0)
{
return(-1);
}
}
while ((ReadIDEReg(IDERegStatus)&0x08)==0);
for (i=1;i<=6;i++)
{
WriteIDEReg(IDERegData,
data=data+2;
}
return(0);
}
int ReadATAPIData (unsigned char
i=0;
do
{
if (i==0XFFFF)
{
return(len);
}
if ((ReadIDEReg(IDERegStatus)&0x01)!=0)
{
return(-1);
}
i++;
}
while ((ReadIDEReg(IDERegStatus)&0x08)==0);
do
{
k=(ReadIDEReg(4)&0XFF)+((ReadIDEReg(5)&0XFF)<<8);
do
{
if (len==0)
{
return(0);
}
i=ReadIDEReg(IDERegData);
data++;
len--;
k--;
data++;
}
while (k!=0);
}
while ((ReadIDEReg(IDERegStatus)&0X08)!=0);
return(0);
}
int WriteATAPIData (unsigned char
i=0;
do
{
if (i==0)
{
return(len);
}
if ((ReadIDEReg(IDERegStatus)&0x01)!=0)
{
return(-1);
}
i++;
}
while ((ReadIDEReg(IDERegStatus)&0x08)==0);
do
{
k=(ReadIDEReg(4)&0XFF)+((ReadIDEReg(5)&0XFF)<<8);
do
{
if (len==0)
{
return(0);
}
WriteIDEReg(IDERegData,
len--;
k--;
data=data+2;
}
while (k!=0);
}
while ((ReadIDEReg(IDERegStatus)&0X08)!=0);
return(0);
}
struct structATAPIError ATAPIError (unsigned char devnum)
{
unsigned int i;
unsigned char temp,
struct structATAPIError ReturnValue;
ReturnValue.Flag=0x07;
i=0;
do
{
if (i==0XFFFF)
{
return(ReturnValue);
}
i++;
}
while ((ReadIDEReg(IDERegStatus)&0X80)!=0);
WriteIDEReg(IDERegDevHead,(0XA0+(devnum<<4)));
i=0;
do
{
if (i==0XFFFF)
{
return(ReturnValue);
}
i++;
}
while ((ReadIDEReg(IDERegStatus)&0X80)!=0);
ReturnValue.Flag=ReturnValue.Flag&(ReadIDEReg(IDERegStatus)&0x01);
WriteATAPICommand(ATAPIRequestSense,devnum,128);
if (ReadATAPIData(temp,128)==0)
{
ReturnValue.Flag=ReturnValue.Flag&0xfb;
ReturnValue.Flag=ReturnValue.Flag|(
ReturnValue.SenseKey=
ReturnValue.AdditionalSenseKey=
ReturnValue.AdditionalSenseKeyQualifier=
for (j=ATAPIErrorText;((j=j+29)
{
if ((
ReturnValue.SolutionNumber=
ReturnValue.SolutionSubNumber=
ReturnValue.Text=j+4;
return(ReturnValue);
}
}
}
return(ReturnValue);
}
int PlayAudio (unsigned long startsect,unsigned long endsect,unsigned int devnum)
{
unsigned long i;
i=LBA2MSF(startsect);
ATAPIPlayAudioMSF = (i&0x00ff0000)>>16;
ATAPIPlayAudioMSF = (i&0x0000ff00)>>8;
ATAPIPlayAudioMSF = (i&0x000000ff);
i=LBA2MSF(endsect);
ATAPIPlayAudioMSF = (i&0x00ff0000)>>16;
ATAPIPlayAudioMSF = (i&0x0000ff00)>>8;
ATAPIPlayAudioMSF = (i&0x000000ff);
return(WriteATAPICommand(ATAPIPlayAudioMSF,devnum,0XFFFF));
}
int StopAudio (unsigned int devnum)
{
return(WriteATAPICommand(ATAPIStopAudio,devnum,0XFFFF));
}
int PauseAudio (unsigned int OnOff,unsigned int devnum)
{
ATAPIPauseAudio=OnOff&0x01;
return(WriteATAPICommand(ATAPIPauseAudio,devnum,0XFFFF));
}
int SetCDSpeed (unsigned int speed,unsigned int devnum)
{
Int2CharMSBLSB(speed,ATAPISetSpeed+2);
return(WriteATAPICommand(ATAPISetSpeed,devnum,0XFFFF));
}
int StartStopUnit (unsigned int action,unsigned int devnum)
{
ATAPIStartStopUnit=action&0x03;
return(WriteATAPICommand(ATAPIStartStopUnit,devnum,0XFFFF));
}
struct structCDPosition ReadCDPosition (unsigned int devnum)
{
unsigned char temp;
struct structCDPosition CDPos;
CDPos.Absolute=0xffffffff;
if (WriteATAPICommand(ATAPIReadSubChan1,devnum,16)!=0)
{
return(CDPos);
}
if (ReadATAPIData(temp,8)!=0)
{
return(CDPos);
}
CDPos.Absolute =Char2LongMSBLSB(temp+8);
CDPos.Relative =Char2LongMSBLSB(temp+12);
CDPos.Track =
CDPos.Index =
return(CDPos);
}
struct structCDNumber ReadUPC (unsigned int devnum)
{
unsigned int i;
unsigned char temp;
struct structCDNumber CDNum;
CDNum.Flag=-1;
if (WriteATAPICommand(ATAPIReadSubChan2,devnum,24)!=0)
{
return(CDNum);
}
if (ReadATAPIData(temp,12)!=0)
{
return(CDNum);
}
CDNum.Flag=(
for (i=0;i<=13;i++)
{
CDNum.Number=
}
return(CDNum);
}
struct structCDNumber ReadISRC (unsigned int track,unsigned int devnum)
{
unsigned int i;
unsigned char temp;
struct structCDNumber CDNum;
CDNum.Flag=-1;
ATAPIReadSubChan3=track;
if (WriteATAPICommand(ATAPIReadSubChan3,devnum,24)!=0)
{
return(CDNum);
}
if (ReadATAPIData(temp,12)!=0)
{
return(CDNum);
}
CDNum.Flag=(
for (i=0;i<=13;i++)
{
CDNum.Number=
}
return(CDNum);
}
unsigned long LBA2MSF (unsigned long LBA)
{
unsigned long i,j;
LBA=LBA+150;
i=(LBA/4500);
LBA=LBA-(i
i=i
j=(LBA/75);
LBA=LBA-(j
i=i+(j
return(i);
}
unsigned long MSF2LBA (unsigned long MSF)
{
unsigned long i;
i=((MSF&0xff0000)>>16)
i=i-150;
return(i);
}
void PrintMSF (unsigned long MSF,int flag)
{
printf("%.2d", (MSF&0xff0000)>>16);
printf(":%.2d",(MSF&0x00ff00)>>8);
if (flag==0)
{
printf(":%.2d",(MSF&0x0000ff));
}
}
int ReadCDSector (unsigned long sectnum,unsigned char
if ( (SectorCache.DeviceNumber==devnum) &&
(SectorCache.SectorNumber==sectnum) &&
(SectorCache.MemoryLocation==data) &&
(sectcount==1) &&
(SectorCache.SectorCount==1) )
{
return(0);
}
Long2CharMSBLSB(sectnum,ATAPIRead10+2);
Int2CharMSBLSB(sectcount,ATAPIRead10+7);
if (WriteATAPICommand(ATAPIRead10,devnum,0XFFFF)!=0)
{
return(-1);
}
i=0;
do
{
if (i==0x0FFFFFF)
{
printf("Duurt te lang");
return(-1);
}
i++;
}
while ((ReadIDEReg(IDERegStatus)&0X80)!=0);
if (ReadATAPIData(data,sectcount<<10)!=0)
{
return(-1);
}
SectorCache.DeviceNumber=devnum;
SectorCache.SectorNumber=sectnum;
SectorCache.MemoryLocation=data;
SectorCache.SectorCount=sectcount;
return(0);
}
void PrintText (unsigned int
for (i=0;i<len;i++)
{printf("%c%c",(};
}
void PrintFileName (unsigned char
for (i=1;i<=)
{
if (DOSJolietRomeo==0)
{
if (
}
printf("%c",
i++;
}
else if ( (DOSJolietRomeo==0x40) ||
(DOSJolietRomeo==0x43) ||
(DOSJolietRomeo==0x45) )
{
if ( (
}
printf("%c",
i++;
i++;
}
}
}
int ReadTOC (unsigned char
unsigned long adres;
unsigned char
if (WriteATAPICommand(ATAPIReadTOC,devnum,0XFFFF)!=0)
{
return(-1);
}
if (ReadATAPIData(data,804)!=0)
{
return(-1);
}
for (i=i<=(data+3);i++)
{
if ((
adres=(
ReadISOHdr(adres,ISOHdr,DirTable,devnum);
}
datatrack=i;
}
}
return(datatrack);
}
int ReadISOHdr (unsigned long sector,struct structISOHdr
unsigned int i;
cursect=sector+16;
do
{
ReadCDSector(cursect,SectorBuf,1,devnum);
if (}
switch (
CopyBytes(SectorBuf+39,ISOHdr->BootIdentifier,32);
break;
}
case 1 :
{
CopyBytes(SectorBuf+8,&ISOHdr->SystemIdentifier,32);
CopyBytes(SectorBuf+40,&ISOHdr->VolumeIdentifier,32);
ISOHdr->VolumeSpaceSize =Char2Long(SectorBuf+80);
ISOHdr->VolumeSetSize =Char2Int(SectorBuf+120);
ISOHdr->VolumeSequenceNumber =Char2Int(SectorBuf+124);
ISOHdr->LogicalBlockSize =Char2Int(SectorBuf+128);
ISOHdr->PathTableSize =Char2Long(SectorBuf+132);
ISOHdr->LocationLPathTable =Char2Long(SectorBuf+140);
ISOHdr->LocationOptionLPathTable=Char2Long(SectorBuf+144);
ISOHdr->LocationMPathTable =Char2Long(SectorBuf+148);
ISOHdr->LocationOptionMPathTable=Char2Long(SectorBuf+152);
ISOHdr->RootDir.RecordLen =
ISOHdr->RootDir.ExtAttributeLen=
ISOHdr->RootDir.LocationExtent=Char2Long(SectorBuf+158);
ISOHdr->RootDir.DataLen =Char2Long(SectorBuf+166);
CopyBytes(SectorBuf+174,&ISOHdr->RootDir.DateTime,7);
ISOHdr->RootDir.FileFlags =
ISOHdr->RootDir.FileUnitSize =
ISOHdr->RootDir.InterleaveGapSize=
ISOHdr->RootDir.VolumeSequenceNumber=
ISOHdr->RootDir.FileIdentifierLen=
CopyBytes(SectorBuf+189,&ISOHdr->RootDir.FileIdentifier,1);
CopyBytes(SectorBuf+190,&ISOHdr->VolumeSetIdentifier,128);
CopyBytes(SectorBuf+318,&ISOHdr->PublisherIdentifier,128);
CopyBytes(SectorBuf+446,&ISOHdr->PreparerIdentifier,128);
CopyBytes(SectorBuf+574,&ISOHdr->ApplicationIdentifier,128);
CopyBytes(SectorBuf+702,&ISOHdr->CopyrightIdentifier,37);
CopyBytes(SectorBuf+739,&ISOHdr->AbstractIdentifier,37);
CopyBytes(SectorBuf+776,&ISOHdr->BibliographicIdentifier,37);
CopyBytes(SectorBuf+813,&ISOHdr->CreationDateTime,17);
CopyBytes(SectorBuf+830,&ISOHdr->ModificationDateTime,17);
CopyBytes(SectorBuf+847,&ISOHdr->ExpirationDateTime,17);
CopyBytes(SectorBuf+864,&ISOHdr->EffectiveDateTime,17);
ISOHdr->StructureVersion=
ISOHdr->DOSJolietRomeo=0;
break;
}
case 2 :
{
if ((
CopyBytes(SectorBuf+40,&ISOHdr->VolumeIdentifier,32);
ISOHdr->VolumeSpaceSize =Char2Long(SectorBuf+80);
ISOHdr->VolumeSetSize =Char2Int(SectorBuf+120);
ISOHdr->VolumeSequenceNumber =Char2Int(SectorBuf+124);
ISOHdr->LogicalBlockSize =Char2Int(SectorBuf+128);
ISOHdr->PathTableSize =Char2Long(SectorBuf+132);
ISOHdr->LocationLPathTable =Char2Long(SectorBuf+140);
ISOHdr->LocationOptionLPathTable=Char2Long(SectorBuf+144);
ISOHdr->LocationMPathTable =Char2Long(SectorBuf+148);
ISOHdr->LocationOptionMPathTable=Char2Long(SectorBuf+152);
ISOHdr->RootDir.RecordLen =
ISOHdr->RootDir.ExtAttributeLen=
ISOHdr->RootDir.LocationExtent=Char2Long(SectorBuf+158);
ISOHdr->RootDir.DataLen =Char2Long(SectorBuf+166);
CopyBytes(SectorBuf+174,&ISOHdr->RootDir.DateTime,7);
ISOHdr->RootDir.FileFlags =
ISOHdr->RootDir.FileUnitSize =
ISOHdr->RootDir.InterleaveGapSize=
ISOHdr->RootDir.VolumeSequenceNumber=
ISOHdr->RootDir.FileIdentifierLen=
CopyBytes(SectorBuf+189,&ISOHdr->RootDir.FileIdentifier,1);
CopyBytes(SectorBuf+190,&ISOHdr->VolumeSetIdentifier,128);
CopyBytes(SectorBuf+318,&ISOHdr->PublisherIdentifier,128);
CopyBytes(SectorBuf+446,&ISOHdr->PreparerIdentifier,128);
CopyBytes(SectorBuf+574,&ISOHdr->ApplicationIdentifier,128);
CopyBytes(SectorBuf+702,&ISOHdr->CopyrightIdentifier,37);
CopyBytes(SectorBuf+739,&ISOHdr->AbstractIdentifier,37);
CopyBytes(SectorBuf+776,&ISOHdr->BibliographicIdentifier,37);
CopyBytes(SectorBuf+813,&ISOHdr->CreationDateTime,17);
CopyBytes(SectorBuf+830,&ISOHdr->ModificationDateTime,17);
CopyBytes(SectorBuf+847,&ISOHdr->ExpirationDateTime,17);
CopyBytes(SectorBuf+864,&ISOHdr->EffectiveDateTime,17);
ISOHdr->StructureVersion=
ISOHdr->DOSJolietRomeo=
}
}
}
break;
}
case 3 :
{
break;
}
case 255 :
{
break;
}
default :
{
return(-1);
}
}
cursect++;
}
while (
for (i=0;i<34;i++)
{
}
return(0);
}
unsigned int SearchDir (unsigned long
i=15;
while (
}
return(i);
}
void ResetInquiry (unsigned long
i=SearchDir(DirTable);
}
int Inquiry (unsigned long
cursect=
curlen =
curbyte=
while (curlen!=0)
{
if (curbyte==512)
{
curbyte=0;
cursect++;
}
if (ReadCDSector(cursect,SectorBuf,1,devnum)!=0)
{
return(-1);
}
if (
return(1);
}
curlen=curlen-(2048-curbyte);
curbyte=0;
cursect++;
ReadCDSector(cursect,SectorBuf,1,devnum);
}
if (NameMatch(SectorBuf+curbyte+32,SourceName,
return(0);
}
curlen=curlen-
curbyte=curbyte+
}
return(1);
}
int NameMatch (unsigned char
do
{
if (
}
if ( ((
}
else
{
return(-1);
}
}
return(0);
}
if (
}
if (
if (DOSJolietRomeo==0)
{
SourceCounter++;
}
else if ( (DOSJolietRomeo==0x40) ||
(DOSJolietRomeo==0x43) ||
(DOSJolietRomeo==0x45) )
{
SourceCounter++;
SourceCounter++;
}
}
else if (
if ((
}
}
CheckCounter++;
}
else if ( (DOSJolietRomeo==0x40) ||
(DOSJolietRomeo==0x43) ||
(DOSJolietRomeo==0x45) )
{
while (
SourceCounter++;
if ((
}
}
CheckCounter++;
}
}
else
{
if (DOSJolietRomeo==0)
{
if (
}
else
{
SourceCounter++;
CheckCounter++;
}
}
else if ( (DOSJolietRomeo==0x40) ||
(DOSJolietRomeo==0x43) ||
(DOSJolietRomeo==0x45) )
{
if (
}
else
{
SourceCounter++;
SourceCounter++;
CheckCounter++;
}
}
}
}
while (1);
}
int ChangeDirectory (unsigned long
unsigned int i;
ResetInquiry(DirTable,devnum);
while (1)
{
i=Inquiry(DirTable,SourceName,temp,devnum);
if (i!=0)
{
return(i);
}
if ((
if (i==15)
{
return(2);
}
i++;
ResetInquiry(DirTable,devnum);
return(0);
}
}
}
int ChangeDirectoryUp(unsigned long
i=SearchDir(DirTable);
if (i==0)
{
return(1);
}
ResetInquiry(DirTable,devnum);
return(0);
}
int OpenFile (unsigned long
ResetInquiry(DirTable,devnum);
while (1)
{
i=Inquiry(DirTable,SourceName,FilePointer,devnum);
if (i!=0)
{
return(i);
}
if ((
CopyBytes(FilePointer+10,FilePointer+260,4);
Long2Char(0,FilePointer+264);
Long2Char(
return(0);
}
}
}
int ReadFileBytes (unsigned char
unsigned int i=0,
j;
unsigned char devnum;
curLB=Char2Long(FilePointer+256);
curlen=Char2Long(FilePointer+260);
curbyte=Char2Long(FilePointer+264);
devnum=
LBL=Char2Long(FilePointer+269);
while (length!=0)
{
if (curlen==0)
{
return(-1);
}
if (ReadCDSector(curLB/(2048/LBL),SectorBuf,1,devnum)!=0)
{
return(-1);
}
j=(curLB%(2048/LBL))<<9;
if (curlen<(LBL-curbyte))
{
if (curlen<=length)
{
CopyBytes(SectorBuf+curbyte+j,data,curlen);
i=i+curlen;
return(i);
}
}
if (length<(LBL-curbyte))
{
CopyBytes(SectorBuf+curbyte+j,data,length);
Long2Char(curLB,FilePointer+256);
Long2Char(curlen-length,FilePointer+260);
Long2Char(curbyte+length,FilePointer+264);
return(0);
}
CopyBytes(SectorBuf+curbyte+j,data,(LBL-curbyte));
if (
}
else
{
if (
curLB=curLB +
}
else
{
curLB++;
}
}
curlen=curlen-(LBL-curbyte);
length=length-(LBL-curbyte);
i=i+(LBL-curbyte);
data=data+(LBL-curbyte);
curbyte=0;
}
Long2Char(curLB,FilePointer+256);
Long2Char(curlen,FilePointer+260);
Long2Char(curbyte,FilePointer+264);
return(0);
}
void CopyBytes (unsigned char
len--;
dest++;
source++;
}
}
unsigned long Char2Long (unsigned char
j =
j = (j<<8) +
j = (j<<8) +
j = (j<<8) +
return(j);
}
unsigned long Char2LongMSBLSB (unsigned char
j =
j = (j<<8) +
j = (j<<8) +
j = (j<<8) +
return(j);
}
unsigned int Char2Int (unsigned char
}
unsigned int Char2IntMSBLSB (unsigned char
}
void Int2Char (unsigned int value,unsigned char
}
void Int2CharMSBLSB (unsigned int value,unsigned char
}
void Long2Char (unsigned long value,unsigned char
}
void Long2CharMSBLSB (unsigned long value,unsigned char
}
void main ()
{
unsigned int i,j,k;
unsigned char temp,
temp1,
struct structCDPosition CDPos;
struct structCDNumber CDNum;
struct structATAPIError error;
SectorCache.DeviceNumber=0xff;
printf("\nATA v0.10a");
printf("\nATAPI-CDROM v0.10a");
printf("\nATAPI audio-extension v0.00a");
printf("\nISO 9660:1988, level 2 v0.00a");
printf("\nISO 9660:Joliet-extension v0.00a");
printf("\n\nProgrammed by V.M.G. van Acht");
printf("\n(c) 1998 by VVA\n");
if (WriteIDECommand(IDEATAPIIdent,0)==0)
{
if (ReadIDEData(Device0Data,256)==0)
{
printf("Device 0: ");
PrintText(Device0Data+27,20);
printf(" - ");
PrintText(Device0Data+23,4);
printf("\n");
NumDevice=0;
}
else
{
NumDevice=0XFFFF;
}
}
else
{
NumDevice=0XFFFF;
}
if (NumDevice==0XFFFF)
{
printf("ATAPI Device 0 error\n");
return(-1);
}
if (WriteIDECommand(IDEATAPIIdent,1)==0)
{
if (ReadIDEData(Device1Data,256)==0)
{
printf("Device 1: ");
PrintText(Device1Data+27,20);
printf(" - ");
PrintText(Device1Data+23,4);
printf("\n");
NumDevice=1;
}
}
ReadTOC(Device0TOC,&Device0ISOHdr,Device0DirTable,0);
PlayAudio(40000,100000,0);
Wait(3000);
printf("\n");
for (i=0;i<0x1000;i++)
{
CDPos=ReadCDPosition(0);
PrintMSF(LBA2MSF(CDPos.Relative),0);
printf("\r");
}
PauseAudio(0,0);
Wait(1000);
PauseAudio(1,0);
Wait(10000);
StopAudio(0);
StartStopUnit(2,0);
Wait(3000);
StartStopUnit(3,0);
}