home *** CD-ROM | disk | FTP | other *** search
/ CD-X 1 / cdx_01.iso / melyviz / cdrombol / pcxcdu4.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-12-27  |  8.0 KB  |  310 lines

  1. unit PCXCDU4;
  2.  
  3. { CDX_GetLetterNumber bugfixed, Dec 28, 1994 }
  4.  
  5. interface
  6.  
  7. type
  8.  
  9.    TRedBook = record
  10.       case Byte of
  11.          0: (RBL : Longint);                    { Red Book Longint }
  12.          1: (Frm : Byte;                        { Frame }
  13.              Sec : Byte;                        { Second }
  14.              Min : Byte;                        { Minute }
  15.              Nul : Byte);                       { Nul }
  16.    end;
  17.  
  18.    TAudioDisk = record
  19.       LoTrack : Byte;
  20.       HiTrack : Byte;
  21.       LeadOut : TRedBook;
  22.    end;
  23.  
  24.    TAudioTrack = record
  25.       TrackNo    : Byte;
  26.       TrackStart : TRedBook;
  27.       TrackInfo  : Byte;
  28.       TrackEnd   : TRedBook;
  29.    end;
  30.  
  31. var
  32.    CDR_Status     : Word;                             { Status }
  33.    CD_Letters     : Byte;                { # of CD-ROM devices }
  34.    CD_StartLetter : Byte;                { # of 1st CDR device }
  35.    CD_Current     : Word;                { # of current device }
  36.    CD_Drives      : array [1..26] of Byte;    { CD-ROM devices }
  37.  
  38. {--------------------------------------------------------------}
  39.  
  40. procedure CDR_AudioDiskInfo (var AudioDisk: TAudioDisk);
  41. procedure CDR_AudioTrackInfo (Tno: Byte; var AudioTrack: TAudioTrack);
  42. procedure CDR_PlayAudio (pStartSec, pPlayLen: Longint);
  43. function  RB2HSG (RB: TRedBook) : Longint;
  44.  
  45. {--------------------------------------------------------------}
  46.  
  47. implementation
  48.  
  49. uses DOS;
  50.  
  51. (**************************************************************)
  52. (* CDX_GetLetterNumber
  53. (*
  54. (* Get Number of CD-ROM drive letters
  55. (*
  56. (* Input:
  57. (*    AX = $1500
  58. (* Output:
  59. (*    BL = Number of CD-ROM drive letters
  60. (*    CL = Starting drive letter of CD-ROM dirve (A=0, B=1, ...)
  61. (**************************************************************)
  62.  
  63. procedure CDX_GetLetterNumber;
  64.  
  65. var
  66.    r : Registers;
  67.  
  68. begin
  69.    r.AX:=$1500;
  70.    r.BX:=$0000;                                 { Bugfixed }
  71.    r.CX:=$0000;                                 { Bugfixed }
  72.    Intr($2f,r);
  73.    CD_Letters:=r.BL;
  74.    CD_StartLetter:=r.CL;
  75.    CD_Current:=CD_StartLetter;
  76. end;
  77.  
  78. (**************************************************************)
  79. (* CDX_GetCDROMDriveLetters
  80. (*
  81. (* Get Number of CD-ROM drive letters
  82. (*
  83. (* Input:
  84. (*    AX    = $150D
  85. (*    ES:BX = Device list buffer
  86. (**************************************************************)
  87.  
  88. procedure CDX_GetCDROMDriveLetters (var CDBuf);
  89.  
  90. var
  91.    r : Registers;
  92.  
  93. begin
  94.    r.AX:=$150D;
  95.    r.ES:=Seg(CDBuf);
  96.    r.BX:=Ofs(CDBuf);
  97.    Intr($2f,r);
  98. end;
  99.  
  100. (**************************************************************)
  101. (* CDX_SendRequest
  102. (*
  103. (* Send Device Request
  104. (*
  105. (* Input:
  106. (*    AX    = $1510
  107. (*    ES:BX = Reqest header address
  108. (*    CX    = CD-ROM drive letter
  109. (**************************************************************)
  110.  
  111. procedure CDX_SendRequest (var ReqHdr);
  112.  
  113. var
  114.    r : Registers;
  115.  
  116. begin
  117.    r.AX:=$1510;
  118.    r.ES:=Seg(ReqHdr);
  119.    r.BX:=Ofs(ReqHdr);
  120.    r.CX:=CD_Current;
  121.    Intr($2f,r);
  122. end;
  123.  
  124. {==============================================================}
  125.  
  126. type
  127.  
  128.    TReqHdr = record                      { Request Header Type }
  129.       HdrLen  : Byte;                 { Header Length in Bytes }
  130.       SubUnit : Byte;              { SubUnit for minor devices }
  131.       CmdCode : Byte;                           { Command Code }
  132.       Status  : Word;                                 { Status }
  133.       Resrvd  : array [1..8] of Byte;               { Reserved }
  134.    end;
  135.  
  136. {==============================================================}
  137.  
  138. (**************************************************************)
  139. (* CDR_IOCTL_Input
  140. (*
  141. (* Read (IOCTL Input)
  142. (*
  143. (* Input:
  144. (*    pXferAddr = Address of request to transfer
  145. (*    pXferLen  = Length of request
  146. (**************************************************************)
  147.  
  148. procedure CDR_IOCTL_Input (pXferAddr: Pointer; pXferLen: Word);
  149.  
  150. type
  151.    TIOCTLI = record
  152.       ReqHdr   : TReqHdr;                     { Request Header }
  153.       Media    : Byte;                      { Media descriptor }
  154.       XferAddr : Pointer;                   { Transfer Address }
  155.       XferLen  : Word;              { Transfer Length in Bytes }
  156.       StartSec : Word;                       { Starting Sector }
  157.       VolID    : Longint;            { Ptr to Requested Vol ID }
  158.    end;
  159.  
  160. var
  161.    IOCTLI : TIOCTLI;
  162.  
  163. begin
  164.    with IOCTLI do
  165.    begin
  166.       ReqHdr.HdrLen:=SizeOf(TIOCTLI);
  167.       ReqHdr.SubUnit:=0;
  168.       ReqHdr.CmdCode:=3;
  169.       ReqHdr.Status:=0;
  170.       Media:=0;
  171.       XferAddr:=pXferAddr;
  172.       XferLen:=pXferLen;
  173.       StartSec:=0;
  174.       VolID:=0;
  175.    end;
  176.    CDX_SendRequest(IOCTLI);
  177.    CDR_Status:=IOCTLI.ReqHdr.Status;
  178. end;
  179.  
  180. (**************************************************************)
  181. (* CDR_AudioDiskInfo                 IOCTL Input based function
  182. (*
  183. (* Return first and last track # and lead-out Red Book address
  184. (*
  185. (* Input:
  186. (*    Audiodisk: Variable to store disk info
  187. (* Output:
  188. (*    Audiodisk: Disk info
  189. (**************************************************************)
  190.  
  191. procedure CDR_AudioDiskInfo (var AudioDisk: TAudioDisk);
  192.  
  193. type
  194.    TDiskInfo = record
  195.       CBC       : Byte;                   { Control Block Code }
  196.       AudioDisk : TAudioDisk;                { Audio Disk Info }
  197.    end;
  198.  
  199. var
  200.    DiskInfo : TDiskInfo;
  201.  
  202. begin
  203.    DiskInfo.CBC:=10;
  204.    CDR_IOCTL_Input(@DiskInfo,SizeOf(DiskInfo));
  205.    AudioDisk:=DiskInfo.AudioDisk;
  206. end;
  207.  
  208. (**************************************************************)
  209. (* CDR_AudioTrackInfo                IOCTL Input based function
  210. (*
  211. (* Return starting point (RB) and Track info of a given track
  212. (*
  213. (* Input:
  214. (*    Tno        = Track number
  215. (*    AudioTrack = Variable to store track info
  216. (* Output:
  217. (*    AudioTrack = Track info
  218. (**************************************************************)
  219.  
  220. procedure CDR_AudioTrackInfo (Tno: Byte; var AudioTrack: TAudioTrack);
  221.  
  222. type
  223.    TTnoInfo = record
  224.       CBC : Byte;                               { Control Block Code }
  225.       Tno : TAudioTrack;                        { Track Info }
  226.    end;
  227.  
  228. var
  229.    TnoInfo : TTnoInfo;
  230.  
  231. begin
  232.     TnoInfo.CBC:=11;
  233.     TnoInfo.Tno.TrackNo:=Tno;
  234.     CDR_IOCTL_Input(@TnoInfo,SizeOf(TnoInfo));
  235.     AudioTrack:=TnoInfo.Tno;
  236. end;
  237.  
  238. {==============================================================}
  239.  
  240. (**************************************************************)
  241. (* CDR_PlayAudio
  242. (*
  243. (* Play a requested audio track from and to the given sector
  244. (*
  245. (* Input:
  246. (*    pStartSec = First sector to play
  247. (*    pPlayLen  = Number of sectors to play
  248. (**************************************************************)
  249.  
  250. procedure CDR_PlayAudio (pStartSec, pPlayLen: Longint);
  251.  
  252. type
  253.    TPlayReq = record
  254.       ReqHdr   : TReqHdr;                     { Request Header }
  255.       AddrMode : Byte;                          { Address Mode }
  256.       StartSec : Longint;               { Start Sector to Play }
  257.       PlayLen  : Longint;          { Number of Sectors to Play }
  258.    end;
  259.  
  260. var
  261.    PlayReq : TPlayReq;
  262.  
  263. begin
  264.    with PlayReq do
  265.    begin
  266.       ReqHdr.HdrLen:=SizeOf(TPlayReq);
  267.       ReqHdr.SubUnit:=0;
  268.       ReqHdr.CmdCode:=132;
  269.       ReqHdr.Status:=0;
  270.       AddrMode:=1;
  271.       StartSec:=pStartSec;
  272.       PlayLen:=pPlayLen;
  273.     end;
  274.     CDX_SendRequest(PlayReq);
  275.     CDR_Status:=PlayReq.ReqHdr.Status;
  276. end;
  277.  
  278. {===========================================================================}
  279.  
  280. (****************************************************************************)
  281. (* RB2HSG
  282. (*
  283. (* Convert a Red Book type value to a HSG type value
  284. (*
  285. (* Input:
  286. (*    RB = Red Book address
  287. (* Output:
  288. (*    A longint containing HSG addrees
  289. (*
  290. (****************************************************************************)
  291.  
  292. function RB2HSG (RB: TRedBook) : Longint;
  293.  
  294. var
  295.    HSG : Longint;
  296.  
  297. begin
  298.    HSG:=RB.Frm;
  299.    HSG:=HSG+Longint(RB.Sec)*75;
  300.    HSG:=HSG+Longint(RB.Min)*75*60;
  301.    RB2HSG:=HSG;
  302. end;
  303.  
  304. {--------------------------------------------------------------}
  305.  
  306. begin
  307.    CDR_Status:=0;
  308.    CDX_GetLetterNumber;
  309.    CDX_GetCDROMDriveLetters(CD_Drives);
  310. end.