home *** CD-ROM | disk | FTP | other *** search
- unit PCXCDU9;
-
- interface
-
- type
-
- TRedBook = record
- case Byte of
- 0: (RBL : Longint); { Red Book Longint }
- 1: (Frm : Byte; { Frame }
- Sec : Byte; { Second }
- Min : Byte; { Minute }
- Nul : Byte); { Nul }
- end;
-
- TAudioDisk = record
- LoTrack : Byte;
- HiTrack : Byte;
- LeadOut : TRedBook;
- end;
-
- TAudioTrack = record
- TrackNo : Byte;
- TrackStart : TRedBook;
- TrackInfo : Byte;
- TrackEnd : TRedBook;
- end;
-
- var
- CDR_Status : Word; { Status }
- CD_Letters : Byte; { # of CD-ROM devices }
- CD_StartLetter : Byte; { # of 1st CDR device }
- CD_Current : Word; { # of current device }
- CD_Drives : array [1..26] of Byte; { CD-ROM devices }
-
- AudioCD : TAudioDisk; { CD Disk Info }
- CDTrack : array [1..99] of TAudioTrack; { Track Info }
- CDTrLen : array [1..99] of TRedBook; { Track Length }
- DStatus : Word; { Device Status }
-
- {--------------------------------------------------------------}
-
- function CDR_GetDeviceStatus: Word;
- procedure CDR_AudioDiskInfo (var AudioDisk: TAudioDisk);
- procedure CDR_AudioTrackInfo (Tno: Byte; var AudioTrack: TAudioTrack);
- procedure CDR_PlayAudio (pStartSec, pPlayLen: Longint);
- procedure CDR_StopAudio;
-
- procedure CDR_EjectDisk;
- procedure CDR_CloseTray;
- procedure CDR_LockDoor(Lock: Boolean);
-
-
- procedure CD_ReadToc;
- function RB2HSG (RB: TRedBook) : Longint;
- function HSG2RB (HSG: Longint) : Longint;
-
- {--------------------------------------------------------------}
-
- implementation
-
- uses DOS;
-
- (**************************************************************)
- (* CDX_GetLetterNumber
- (*
- (* Get Number of CD-ROM drive letters
- (*
- (* Input:
- (* AX = $1500
- (* Output:
- (* BL = Number of CD-ROM drive letters
- (* CL = Starting drive letter of CD-ROM dirve (A=0, B=1, ...)
- (**************************************************************)
-
- procedure CDX_GetLetterNumber;
-
- var
- r : Registers;
-
- begin
- r.AX:=$1500;
- r.BX:=$0000;
- r.CX:=$0000;
- Intr($2f,r);
- CD_Letters:=r.BL;
- CD_StartLetter:=r.CL;
- CD_Current:=CD_StartLetter;
- end;
-
- (**************************************************************)
- (* CDX_GetCDROMDriveLetters
- (*
- (* Get Number of CD-ROM drive letters
- (*
- (* Input:
- (* AX = $150D
- (* ES:BX = Device list buffer
- (**************************************************************)
-
- procedure CDX_GetCDROMDriveLetters (var CDBuf);
-
- var
- r : Registers;
-
- begin
- r.AX:=$150D;
- r.ES:=Seg(CDBuf);
- r.BX:=Ofs(CDBuf);
- Intr($2f,r);
- end;
-
- (**************************************************************)
- (* CDX_SendRequest
- (*
- (* Send Device Request
- (*
- (* Input:
- (* AX = $1510
- (* ES:BX = Reqest header address
- (* CX = CD-ROM drive letter
- (**************************************************************)
-
- procedure CDX_SendRequest (var ReqHdr);
-
- var
- r : Registers;
-
- begin
- r.AX:=$1510;
- r.ES:=Seg(ReqHdr);
- r.BX:=Ofs(ReqHdr);
- r.CX:=CD_Current;
- Intr($2f,r);
- end;
-
- {==============================================================}
-
- type
-
- TReqHdr = record { Request Header Type }
- HdrLen : Byte; { Header Length in Bytes }
- SubUnit : Byte; { SubUnit for minor devices }
- CmdCode : Byte; { Command Code }
- Status : Word; { Status }
- Resrvd : array [1..8] of Byte; { Reserved }
- end;
-
- {==============================================================}
-
- (**************************************************************)
- (* CDR_IOCTL_Input
- (*
- (* Read (IOCTL Input)
- (*
- (* Input:
- (* pXferAddr = Address of request to transfer
- (* pXferLen = Length of request
- (**************************************************************)
-
- procedure CDR_IOCTL_Input (pXferAddr: Pointer; pXferLen: Word);
-
- type
- TIOCTLI = record
- ReqHdr : TReqHdr; { Request Header }
- Media : Byte; { Media descriptor }
- XferAddr : Pointer; { Transfer Address }
- XferLen : Word; { Transfer Length in Bytes }
- StartSec : Word; { Starting Sector }
- VolID : Longint; { Ptr to Requested Vol ID }
- end;
-
- var
- IOCTLI : TIOCTLI;
-
- begin
- with IOCTLI do
- begin
- ReqHdr.HdrLen:=SizeOf(TIOCTLI);
- ReqHdr.SubUnit:=0;
- ReqHdr.CmdCode:=3;
- ReqHdr.Status:=0;
- Media:=0;
- XferAddr:=pXferAddr;
- XferLen:=pXferLen;
- StartSec:=0;
- VolID:=0;
- end;
- CDX_SendRequest(IOCTLI);
- CDR_Status:=IOCTLI.ReqHdr.Status;
- end;
-
- (**************************************************************)
- (* CDR_GetDeviceStatus IOCLT Input based functions
- (*
- (* Return device status information
- (**************************************************************)
-
- function CDR_GetDeviceStatus: Word;
-
- type
- TDevStat = record
- CBC : Byte; { Control Block Code }
- LoDevPar : Word; { Low Word of Device Params }
- HiDevPar : Word; { Hi Word of Device Params }
- end;
-
- var
- DevStat : TDevStat;
-
- begin
- DevStat.CBC:=6;
- CDR_IOCTL_Input(@DevStat,SizeOf(DevStat));
- CDR_GetDeviceStatus:=DevStat.LoDevPar;
- end;
-
- (**************************************************************)
- (* CDR_AudioDiskInfo IOCTL Input based function
- (*
- (* Return first and last track # and lead-out Red Book address
- (*
- (* Input:
- (* Audiodisk: Variable to store disk info
- (* Output:
- (* Audiodisk: Disk info
- (**************************************************************)
-
- procedure CDR_AudioDiskInfo (var AudioDisk: TAudioDisk);
-
- type
- TDiskInfo = record
- CBC : Byte; { Control Block Code }
- AudioDisk : TAudioDisk; { Audio Disk Info }
- end;
-
- var
- DiskInfo : TDiskInfo;
-
- begin
- DiskInfo.CBC:=10;
- CDR_IOCTL_Input(@DiskInfo,SizeOf(DiskInfo));
- AudioDisk:=DiskInfo.AudioDisk;
- end;
-
- (**************************************************************)
- (* CDR_AudioTrackInfo IOCTL Input based function
- (*
- (* Return starting point (RB) and Track info of a given track
- (*
- (* Input:
- (* Tno = Track number
- (* AudioTrack = Variable to store track info
- (* Output:
- (* AudioTrack = Track info
- (**************************************************************)
-
- procedure CDR_AudioTrackInfo (Tno: Byte; var AudioTrack: TAudioTrack);
-
- type
- TTnoInfo = record
- CBC : Byte; { Control Block Code }
- Tno : TAudioTrack; { Track Info }
- end;
-
- var
- TnoInfo : TTnoInfo;
-
- begin
- TnoInfo.CBC:=11;
- TnoInfo.Tno.TrackNo:=Tno;
- CDR_IOCTL_Input(@TnoInfo,SizeOf(TnoInfo));
- AudioTrack:=TnoInfo.Tno;
- end;
-
- {==============================================================}
-
- (****************************************************************************)
- (* CDR_IOCTL_Output
- (*
- (* WRITE (IOCTL Output)
- (****************************************************************************)
-
- procedure CDR_IOCTL_Output (pXferAddr: Pointer; pXferLen: Word);
-
- type
- TIOCTLO = record
- ReqHdr : TReqHdr; { Request Header }
- Media : Byte; { Media descriptor }
- XferAddr : Pointer; { Transfer Address }
- XferLen : Word; { Transfer Length in Bytes }
- StartSec : Word; { Starting Sector }
- VolID : Longint; { Ptr to Requested Vol ID }
- end;
-
- var
- IOCTLO : TIOCTLO;
-
- begin
- with IOCTLO do
- begin
- ReqHdr.HdrLen:=SizeOf(TIOCTLO);
- ReqHdr.SubUnit:=0;
- ReqHdr.CmdCode:=12;
- ReqHdr.Status:=0;
- Media:=0;
- XferAddr:=pXferAddr;
- XferLen:=pXferLen;
- StartSec:=0;
- VolID:=0;
- end;
- CDX_SendRequest(IOCTLO);
- CDR_Status:=IOCTLO.ReqHdr.Status;
- end;
-
- (****************************************************************************)
- (* CDR_EjectDisk IOCTL Output based functions
- (*
- (* Eject CD-ROM from (open CD-ROM door or tray)
- (****************************************************************************)
-
- procedure CDR_EjectDisk;
-
- type
- TEjectDisk = record
- CBC : Byte;
- end;
-
- var
- EjectDisk : TEjectDisk;
-
- begin
- EjectDisk.CBC:=0;
- CDR_IOCTL_Output(@EjectDisk,SizeOf(EjectDisk));
- end;
-
- (****************************************************************************)
- (* CDR_LockDoor IOCTL Output based functions
- (*
- (* Input
- (* Lock : TRUE=Lock, FALSE=Unlock
- (*
- (* Lock/Unlock CD-ROM unit door
- (****************************************************************************)
-
- procedure CDR_LockDoor (Lock: Boolean);
-
- type
- TLockDoor = record
- CBC : Byte;
- Lock : Byte;
- end;
-
- var
- LockDoor : TLockDoor;
-
- begin
- LockDoor.CBC:=1;
- LockDoor.Lock:=Ord(Lock);
- CDR_IOCTL_Output(@LockDoor,SizeOf(LockDoor));
- end;
-
- (****************************************************************************)
- (* CDR_CloseTray IOCTL Output based functions
- (*
- (* Close CD-ROM drive door or tray
- (****************************************************************************)
-
- procedure CDR_CloseTray;
-
- type
- TCloseTray = record
- CBC : Byte; { Control Block Code }
- end;
-
- var
- CloseTray : TCloseTray;
-
- begin
- CloseTray.CBC:=5;
- CDR_IOCTL_Output(@CloseTray,SizeOf(CloseTray));
- end;
-
- {===========================================================================}
-
- (**************************************************************)
- (* CDR_PlayAudio
- (*
- (* Play a requested audio track from and to the given sector
- (*
- (* Input:
- (* pStartSec = First sector to play
- (* pPlayLen = Number of sectors to play
- (**************************************************************)
-
- procedure CDR_PlayAudio (pStartSec, pPlayLen: Longint);
-
- type
- TPlayReq = record
- ReqHdr : TReqHdr; { Request Header }
- AddrMode : Byte; { Address Mode }
- StartSec : Longint; { Start Sector to Play }
- PlayLen : Longint; { Number of Sectors to Play }
- end;
-
- var
- PlayReq : TPlayReq;
-
- begin
- with PlayReq do
- begin
- ReqHdr.HdrLen:=SizeOf(TPlayReq);
- ReqHdr.SubUnit:=0;
- ReqHdr.CmdCode:=132;
- ReqHdr.Status:=0;
- AddrMode:=1;
- StartSec:=pStartSec;
- PlayLen:=pPlayLen;
- end;
- CDX_SendRequest(PlayReq);
- CDR_Status:=PlayReq.ReqHdr.Status;
- end;
-
- (**************************************************************)
- (* CDR_StopAudio
- (*
- (* Interrupt drive unit if it's in play mode
- (**************************************************************)
-
- procedure CDR_StopAudio;
-
- type
- TStopPlayReq = record
- ReqHdr : TReqHdr; { Request Header }
- end;
-
- var
- StopPlayReq : TStopPlayReq;
-
- begin
- with StopPlayReq do
- begin
- ReqHdr.HdrLen:=SizeOf(TStopPlayReq);
- ReqHdr.SubUnit:=0;
- ReqHdr.CmdCode:=133;
- ReqHdr.Status:=0;
- end;
- CDX_SendRequest(StopPlayReq);
- CDR_Status:=StopPlayReq.ReqHdr.Status;
- end;
-
- {==============================================================}
-
- (**************************************************************)
- (* CD_ReadToc
- (*
- (* Read and store the Table of Contents of a CD-ROM
- (**************************************************************)
-
- procedure CD_ReadToc;
-
- var
- i : Byte;
-
- begin
- with AudioCD do
- begin
- for i:=LoTrack to HiTrack do
- CDR_AudioTrackInfo(i,CDTrack[i]);
- for i:=LoTrack to HiTrack-1 do
- CDTrack[i].TrackEnd:=CDTrack[i+1].TrackStart;
- CDTrack[HiTrack].TrackEnd:=AudioCD.LeadOut;
- for i:=LoTrack to HiTrack do
- begin
- with CDTrack[i] do
- CDTrLen[i].RBL:=HSG2RB(RB2HSG(TrackEnd)-RB2HSG(TrackStart));
- end;
- end;
- end;
-
- (**************************************************************)
- (* RB2HSG
- (*
- (* Convert a Red Book type value to a HSG type value
- (*
- (* Input:
- (* RB = Red Book address
- (* Output:
- (* A longint containing HSG addrees
- (**************************************************************)
-
- function RB2HSG (RB: TRedBook) : Longint;
-
- var
- HSG : Longint;
-
- begin
- HSG:=RB.Frm;
- HSG:=HSG+Longint(RB.Sec)*75;
- HSG:=HSG+Longint(RB.Min)*75*60;
- RB2HSG:=HSG;
- end;
-
- (**************************************************************)
- (* HSG2RB
- (*
- (* Convert a HSG type value to a Red Book type value
- (*
- (* Input:
- (* HSG = A HSG type address
- (* Output:
- (* A longint containing Red Book address
- (**************************************************************)
-
- function HSG2RB (HSG: Longint) : Longint;
-
- var
- RB : array [0..3] of Byte;
- b : Longint absolute RB;
-
- begin
- RB[0]:=hsg mod 75;
- hsg:=hsg div 75;
- RB[1]:=hsg mod 60;
- hsg:=hsg div 60;
- RB[2]:=hsg;
- RB[3]:=0;
- hsg2RB:=b;
- end;
-
- {--------------------------------------------------------------}
-
- begin
- CDR_Status:=0;
- CDX_GetLetterNumber;
- CDX_GetCDROMDriveLetters(CD_Drives);
- end.