home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / pascal / visionix / vmscdexu.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-12-28  |  47.9 KB  |  2,292 lines

  1. {
  2.  ════════════════════════════════════════════════════════════════════════════
  3.  
  4.  Visionix Microsoft CD-ROM Extensions Unit (VMSCDEX)
  5.    Version 0.6
  6.  Copyright 1991,92,93 Visionix
  7.  ALL RIGHTS RESERVED
  8.  
  9.  ────────────────────────────────────────────────────────────────────────────
  10.  
  11.  Revision history in reverse chronological order:
  12.  
  13.  Initials  Date      Comment
  14.  ────────  ────────  ────────────────────────────────────────────────────────
  15.  
  16.  jrt       09/20/93  Changed TMSF to TFSM.  Added TFSMBackwards to fix
  17.                      ReadQChanInfo.  Got rid of BCD conversion call in
  18.                      GetAudioTrackInfo.
  19.  
  20.  lpg       03/16/93  Added Source Documentation
  21.  
  22.  mep       02/11/93  Cleaned up code (yuck!) for beta release
  23.  
  24.  jrt       02/08/93  Sync with beta 0.12 release
  25.  
  26.  jrt       12/07/92  Sync with beta 0.11 release
  27.  
  28.  jrt       11/21/92  Sync with beta 0.08
  29.  
  30.  jrt       11/18/92  First logged revision.
  31.  
  32.  ────────────────────────────────────────────────────────────────────────────
  33. }
  34.  
  35. (*-
  36.  
  37. [TEXT]
  38.  
  39. <Overview>
  40.  
  41. This unit implements MSCDEX dependent functions to control and play
  42. CD-ROM and CD-Audio discs.
  43.  
  44. For more information, see the MSCDEX documentation.
  45.  
  46. This overview will be enhanced for the next BETA release.
  47.  
  48. <Interface>
  49.  
  50. -*)
  51.  
  52. Unit VMSCDEXu;
  53.  
  54. Interface
  55.  
  56. Uses
  57.  
  58.   VTypesu,
  59.   VGenu,
  60.   DOS;
  61.  
  62. {────────────────────────────────────────────────────────────────────────────}
  63.  
  64.  
  65. Type
  66.  
  67.   TError = WORD;
  68.  
  69.  
  70. Type
  71.  
  72.   TFSM = RECORD
  73.  
  74.     F : BYTE;
  75.     S : BYTE;
  76.     M : BYTE;
  77.  
  78.     P : BYTE;
  79.  
  80.   END;
  81.  
  82.   PFSM = ^TFSM;
  83.  
  84.   TFSMBackwards = RECORD
  85.  
  86.     M : BYTE;
  87.     S : BYTE;
  88.     F : BYTE;
  89.  
  90.     P : BYTE;
  91.  
  92.   END;
  93.  
  94.   PFSMBackwards = ^TFSMBackwards;
  95.  
  96.  
  97. Type
  98.  
  99.   TUPCCode = Array[1..7] of BYTE;
  100.  
  101.   PUPCCode = ^TUPCCode;
  102.  
  103.  
  104.  
  105. Type
  106.  
  107.   TmscdexReqHeader = RECORD
  108.  
  109.     HeaderSize     : BYTE;
  110.     Subunit        : BYTE;
  111.     CommandCode    : BYTE;
  112.     Status         : WORD;
  113.     Reserved       : Array[1..8] of BYTE;
  114.  
  115.   END;
  116.  
  117.   PmscdexReqHeader = ^TmscdexReqHeader;
  118.  
  119.  
  120. {------------------------}
  121. { MSCDEX IOCTL Requests  }
  122. {------------------------}
  123.  
  124.  
  125. Type
  126.  
  127.   TmscdexIOCTLReq = RECORD
  128.  
  129.     Header           : TmscdexReqHeader;
  130.     MediaDescript    : BYTE;
  131.     ControlBlock     : POINTER;
  132.     ControlBlockSize : WORD;
  133.     StartingSector   : WORD;
  134.     RequestedVol     : POINTER;
  135.  
  136.   END;
  137.  
  138.   PmscdexIOCTLReq = ^TmscdexIOCTLReq;
  139.  
  140.  
  141.   {--------------------------------}
  142.   { IOCTL Read Control Block Types }
  143.   {--------------------------------}
  144.  
  145.   Const
  146.  
  147.     cmscdexIOCTLread = 3;
  148.  
  149.  
  150.   Type
  151.  
  152.     TmscdexGetDevAddr = RECORD
  153.  
  154.       ConBCode         : BYTE;
  155.       DevAddr          : POINTER;
  156.  
  157.     END;
  158.  
  159.     PmscdexGetDevAddr = ^TmscdexGetDevAddr;
  160.  
  161.  
  162.  
  163.   Type
  164.  
  165.     TmscdexGetHeadPos = RECORD
  166.  
  167.       ConBCode        : BYTE;
  168.       AddrMode        : BYTE;
  169.       HeadPos         : LONGINT
  170.  
  171.     END;
  172.  
  173.     Const
  174.  
  175.       cmscdexGetHeadPos      = 1;
  176.       cmscdexGetHeadPosCBS   = 5;
  177.  
  178.  
  179.   Type
  180.  
  181.     TmscdexAudioChanInfo = RECORD
  182.  
  183.       ConBCode        : BYTE;
  184.       InChan0         : BYTE;
  185.       Volume0         : BYTE;
  186.       InChan1         : BYTE;
  187.       Volume1         : BYTE;
  188.       InChan2         : BYTE;
  189.       Volume2         : BYTE;
  190.       InChan3         : BYTE;
  191.       Volume3         : BYTE;
  192.  
  193.     END;
  194.  
  195.     PmscdexAudioChanInfo = ^TmscdexAudioChanInfo;
  196.  
  197.     Const
  198.  
  199.       cmscdexGetAudioChanInfo    = 4;
  200.       cmscdexGetAudioChanInfoCBS = 9;
  201.  
  202.  
  203.   Type
  204.  
  205.     TmscdexDevStatus = RECORD
  206.  
  207.       ConBCode        : BYTE;
  208.       DevParams       : LONGINT;
  209.  
  210.     END;
  211.  
  212.     PmscdexDevStatus = ^TmscdexDevStatus;
  213.  
  214.     Const
  215.  
  216.       cmscdexGetDevStatus    = 6;
  217.       cmscdexGetDevStatusCBS = 5;
  218.  
  219.     Const
  220.  
  221.       cmscdexDoorOpen      = 1;
  222.       cmscdexDoorLocked    = 2;
  223.       cmscdexCanRawRead    = 4;
  224.       cmscdexReadWrite     = 8;
  225.       cmscdexCanPlayAudio  = 16;
  226.       cmscdexCanInterleave = 32;
  227.       cmscdexCanPrefetch   = 64;
  228.       cmscdexCanSetVolume  = 128;
  229.       cmscdexCanRedbook    = 256;
  230.       cmscdexNoDisc        = 1024;
  231.  
  232.  
  233.  
  234.   Type
  235.  
  236.     TmscdexGetSecSize = RECORD
  237.  
  238.       ConBCode        : BYTE;
  239.       ReadMode        : BYTE;
  240.       SectorSize      : WORD;
  241.  
  242.     END;
  243.  
  244.     PmscdexGetSecSize = ^TmscdexGetSecSize;
  245.  
  246.     Const
  247.  
  248.       cmscdexGetSecSize    = 7;
  249.       cmscdexGetSecSizeCBS = 4;
  250.  
  251.  
  252.  
  253.   Type
  254.  
  255.     TmscdexGetVolumeSize = RECORD
  256.  
  257.       ConBCode        : BYTE;
  258.       VolumeSize      : LONGINT;
  259.  
  260.     END;
  261.  
  262.     PmscdexGetVolumSize = ^TmscdexGetVolumeSize;
  263.  
  264.     Const
  265.  
  266.       cmscdexGetVolumeSize    = 8;
  267.       cmscdexGetVolumeSizeCBS = 5;
  268.  
  269.  
  270.  
  271.   Type
  272.  
  273.     TmscdexCheckMediaChange = RECORD
  274.  
  275.       ConBCode        : BYTE;
  276.       MediaStatus     : BYTE;
  277.  
  278.     END;
  279.  
  280.     PmscdexCheckmediaChange = ^TmscdexCheckMediaChange;
  281.  
  282.     Const
  283.  
  284.       cmscdexCheckMediaChange    = 9;
  285.       cmscdexCheckMediaChangeCBS = 2;
  286.  
  287.  
  288.     Const
  289.  
  290.       cmscdexMediaNotChanged   = $01;
  291.       cmscdexMediaMaybeChanged = $00;
  292.       cmscdexMeidaChanged      = $FF;
  293.  
  294.  
  295.  
  296.   Type
  297.  
  298.     TmscdexGetAudioDiskInfo = RECORD
  299.  
  300.       ConBCode        : BYTE;
  301.       LowestTrack     : BYTE;
  302.       HighestTrack    : BYTE;
  303.       StartOfLeadout  : LONGINT;
  304.  
  305.     END;
  306.  
  307.     PmscdexGetAudioDiskInfo = ^TmscdexGetAudioDiskInfo;
  308.  
  309.     Const
  310.  
  311.       cmscdexGetAudioDiskInfo    = 10;
  312.       cmscdexGetAudioDiskInfoCBS = 7;
  313.  
  314.  
  315.  
  316.   Type
  317.  
  318.     TmscdexGetAudioTrackInfo = RECORD
  319.  
  320.       ConBCode        : BYTE;
  321.       TrackNum        : BYTE;
  322.       StartPoint      : LONGINT;
  323.       TrackConInfo    : BYTE;
  324.  
  325.     END;
  326.  
  327.     PmscdexGetAudioTrackInfo = ^TmscdexGetAudioTrackInfo;
  328.  
  329.     Const
  330.  
  331.       cmscdexGetAudioTrackInfo    = 11;
  332.       cmscdexGetAudioTrackInfoCBS = 7;
  333.  
  334.  
  335.  
  336.   Type
  337.  
  338.     TmscdexGetAudioQChanInfo = RECORD
  339.  
  340.       ConBCode        : BYTE;
  341.       ControlAndAddr  : BYTE;
  342.       TrackNum        : BYTE;
  343.       IndexNum        : BYTE;
  344.  
  345.       TrackTime       : TFSMBackwards;
  346.  
  347.       DiskTime        : TFSMBackwards;
  348.  
  349.     END;
  350.  
  351.     PmscdexGetAudioQChanInfo = ^TmscdexGetAudioQChanInfo;
  352.  
  353.     Const
  354.  
  355.       cmscdexGetAudioQChanInfo    = 12;
  356.       cmscdexGetAudioQChanInfoCBS = 11;
  357.  
  358.  
  359.  
  360.   Type
  361.  
  362.     TmscdexGetAudioSubChanInfo = RECORD
  363.  
  364.       ConBCode        : BYTE;
  365.       StartFrame      : LONGINT;
  366.       TransferAddr    : POINTER;
  367.       SecsToRead      : LONGINT;
  368.  
  369.     END;
  370.  
  371.     PmscdexGetAudioSubChanInfo = ^TmscdexGetAudioSubChanInfo;
  372.  
  373.     Const
  374.  
  375.       cmscdexGetAudioSubChanInfo    = 13;
  376.       cmscdexGetAudioSubChanInfoCBS = 13;
  377.  
  378.  
  379.  
  380.  
  381.   Type
  382.  
  383.     TmscdexGetUPCCode = RECORD
  384.  
  385.       ConBCode        : BYTE;
  386.       ControlAndAdr   : BYTE;
  387.       UPCCode         : TUPCCode;
  388.       Zero            : BYTE;
  389.       AFrame          : BYTE;
  390.  
  391.     END;
  392.  
  393.     PmscdexGetUPCCode = ^TmscdexGetUPCCode;
  394.  
  395.     Const
  396.  
  397.       cmscdexGetUPCCode    = 14;
  398.       cmscdexGetUPCCodeCBS = 11;
  399.  
  400.  
  401.  
  402.  
  403.   Type
  404.  
  405.     TmscdexGetAudioStatusInfo = RECORD
  406.  
  407.       ConBCode        : BYTE;
  408.       AudioStatus     : WORD;
  409.       PlayStart       : LONGINT;
  410.       PlayEnd         : LONGINT;
  411.  
  412.     END;
  413.  
  414.     PmscdexGetAudioStatusInfo = ^TmscdexGetAudioStatusInfo;
  415.  
  416.     Const
  417.  
  418.       cmscdexGetAudioStatusInfo    = 15;
  419.       cmscdexGetAudioStatusInfoCBS = 11;
  420.  
  421.  
  422.   {---------------------------------}
  423.   { IOCTL Write Control Block Types }
  424.   {---------------------------------}
  425.  
  426.   Const
  427.  
  428.     cmscdexIOCTLWrite = 12;
  429.  
  430.  
  431.  
  432.   Type
  433.  
  434.     TmscdexEjectDisk = RECORD
  435.  
  436.       ConBCode        : BYTE;
  437.  
  438.     END;
  439.  
  440.     PmscdexEjectDisk = ^TmscdexEjectDisk;
  441.  
  442.     Const
  443.  
  444.       cmscdexEjectDisk    = 0;
  445.       cmscdexEjectDiskCBS = 1;
  446.  
  447.  
  448.  
  449.   Type
  450.  
  451.     TmscdexLockUnlockDoor = RECORD
  452.  
  453.       ConBCode        : BYTE;
  454.       LockCode        : BYTE;
  455.  
  456.     END;
  457.  
  458.     PmscdexLockUnlockDoor = ^TmscdexLockUnlockDoor;
  459.  
  460.     Const
  461.  
  462.       cmscdexLockUnlockDoor    = 1;
  463.       cmscdexLockUnlockDoorCBS = 2;
  464.  
  465.     Const
  466.  
  467.       cmscdexLockDoor   = 1;
  468.       cmscdexUnlockDoor = 0;
  469.  
  470.  
  471.  
  472.   Type
  473.  
  474.     TmscdexResetDrive = RECORD
  475.  
  476.       ConBCode        : BYTE;
  477.  
  478.     END;
  479.  
  480.     PmscdexResetDrive = ^TmscdexResetDrive;
  481.  
  482.     Const
  483.  
  484.       cmscdexResetDrive    = 2;
  485.       cmscdexResetDriveCBS = 1;
  486.  
  487.  
  488.  
  489.  
  490.   Type
  491.  
  492.     TmscdexAudioChanControl = RECORD
  493.  
  494.       ConBCode        : BYTE;
  495.       InChan0         : BYTE;
  496.       Volume0         : BYTE;
  497.       InChan1         : BYTE;
  498.       Volume1         : BYTE;
  499.       InChan2         : BYTE;
  500.       Volume2         : BYTE;
  501.       InChan3         : BYTE;
  502.       Volume3         : BYTE;
  503.  
  504.     END;
  505.  
  506.     PmscdexAudioChanControl = ^TmscdexAudioChanControl;
  507.  
  508.     Const
  509.  
  510.       cmscdexAudioChanControl    = 3;
  511.       cmscdexAudioChanControlCBS = 9;
  512.  
  513.  
  514.  
  515.  
  516.  
  517.   Type
  518.  
  519.     TmscdexCloseTray = RECORD
  520.  
  521.       ConBCode        : BYTE;
  522.  
  523.     END;
  524.  
  525.     PmscdexCloseTray = ^TmscdexCloseTray;
  526.  
  527.     Const
  528.  
  529.       cmscdexCloseTray    = 5;
  530.       cmscdexCloseTrayCBS = 1;
  531.  
  532.  
  533.  
  534.  
  535.  
  536. {--------------------------}
  537. { MSCDEX Read Long Request }
  538. {--------------------------}
  539.  
  540.  
  541. Type
  542.  
  543.   TmscdexReadLongReq = RECORD
  544.  
  545.     Header           : TmscdexReqHeader;
  546.     AddrMode         : BYTE;
  547.     TransferAddr     : POINTER;
  548.     SecsToRead       : WORD;
  549.     StartSec         : LONGINT;
  550.     ReadMode         : BYTE;
  551.     InterleaveSize   : BYTE;
  552.     InterleaveSkip   : BYTE;
  553.  
  554.   END;
  555.  
  556.   PmscdexReadLongReq = ^TmscdexReadLongReq;
  557.  
  558.   Const
  559.  
  560.     cmscdexBlockMode     = 0;
  561.     cmscdexHSGMode       = 0;
  562.  
  563.     cmscdexMSFMode       = 1;
  564.     cmscdexRedBookMode   = 1;
  565.  
  566.     cmscdexCookedRead    = 0;
  567.     cmscdexRawRead       = 1;
  568.  
  569.  
  570.  
  571. Type
  572.  
  573.   TmscdexPlayAudioReq = RECORD
  574.  
  575.     Header           : TmscdexReqHeader;
  576.     AddrMode         : BYTE;
  577.     Start            : LONGINT;
  578.     PlayFor          : LONGINT;
  579.  
  580.   END;
  581.  
  582.   PmscdexPlayAudioReq = ^TmscdexPlayAudioReq;
  583.  
  584.  
  585. Type
  586.  
  587.   TmscdexStopAudioReq = RECORD
  588.  
  589.     Header           : TmscdexReqHeader;
  590.     
  591.   END;
  592.  
  593.   PmscdexStopAudioReq = ^TmscdexStopAudioReq;
  594.  
  595.  
  596.  
  597. Type
  598.  
  599.   TmscdexResumeAudioReq = RECORD
  600.  
  601.     Header           : TmscdexReqHeader;
  602.     
  603.   END;
  604.  
  605.   PmscdexResumeAudioReq = ^TmscdexResumeAudioReq;
  606.  
  607.  
  608.  
  609.  
  610. {────────────────────────────────────────────────────────────────────────────}
  611. {────────────────────────────────────────────────────────────────────────────}
  612.  
  613. Procedure BCDFSMtoFSM( Var N : TFSM );
  614.  
  615.  
  616. Function  MSCDEX_GetNumDrives : WORD;
  617.  
  618. Function  MSCDEX_GetFirstDrive : WORD;
  619.  
  620.  
  621.  
  622. Procedure MSCDEX_ExecRequest(          Drive          : BYTE;
  623.                                        Request        : POINTER   );
  624.  
  625. {----------------------}
  626. { Read IOCTL Functions }
  627. {----------------------}
  628.  
  629. Function  MSCDEX_GetHeadPos(           Drive          : BYTE;
  630.                                        AddrMode       : BYTE;
  631.                                    Var HeadPos        : LONGINT ) : TError;
  632.  
  633. Function  MSCDEX_GetAudioChanInfo(     Drive          : BYTE;
  634.                                        Channel        : BYTE;
  635.                                    Var InputChan      : BYTE;
  636.                                    Var Volume         : BYTE    ) : TError;
  637.  
  638. Function  MSCDEX_GetDevStatus(         Drive          : BYTE;
  639.                                    Var DevStatus      : LONGINT ) : TError;
  640.  
  641. {-}Function  MSCDEX_GetSectorSize(        Drive          : BYTE;
  642.                                        ReadMode       : BYTE;
  643.                                    Var SecSize        : WORD    ) : TError;
  644.  
  645. {-}Function  MSCDEX_GetVolumeSize(        Drive          : BYTE;
  646.                                    Var VolumeSize     : LONGINT ) : TError;
  647.  
  648. {-}Function  MSCDEX_IsMediaChanged      ( Drive : BYTE )             : BYTE;
  649.  
  650. Function  MSCDEX_GetAudioDiskInfo(     Drive          : BYTE;
  651.                                    Var StartTrack     : BYTE;
  652.                                    Var EndTrack       : BYTE;
  653.                                    Var LeadOutStart   : LONGINT ) : TError;
  654.  
  655. Function  MSCDEX_GetAudioTrackInfo(    Drive          : BYTE;
  656.                                        TrackNum       : BYTE;
  657.                                    Var StartPoint     : LONGINT;
  658.                                    Var TrackConInfo   : BYTE    ) : TError;
  659.  
  660. Function  MSCDEX_GetAudioQChanInfo(    Drive          : BYTE;
  661.                                    Var ConAddr        : BYTE;
  662.                                    Var TrackNum       : BYTE;
  663.                                    Var IndexNum       : BYTE;
  664.                                    Var TrackTime      : TFSM;
  665.                                    Var DiskTime       : TFSM    ) : TError;
  666.  
  667. {-}Function  MSCDEX_GetAudioSubChanInfo(  Drive          : BYTE;
  668.                                        StartFrame     : LONGINT;
  669.                                        SecsToRead     : LONGINT;
  670.                                        TransferAddr   : POINTER ) : TError;
  671.  
  672. {-}Function  MSCDEX_GetUPCCode(           Drive          : BYTE;
  673.                                    Var ConAddr        : BYTE;
  674.                                    Var UPCCode        : TUPCCode;
  675.                                    Var AFrame         : BYTE    ) : Terror;
  676.  
  677. Function  MSCDEX_GetAudioStatusInfo(   Drive          : BYTE;
  678.                                    Var AudioStatus    : WORD;
  679.                                    Var PlayStart      : LONGINT;
  680.                                    Var PlayEnd        : LONGINT ) : TError;
  681.  
  682. {-----------------------}
  683. { IOCTL Write Functions }
  684. {-----------------------}
  685.  
  686. {-}Function  MSCDEX_EjectDisk(            Drive          : BYTE    ) : TError;
  687.  
  688. {-}Function  MSCDEX_LockUnlockDoor(       Drive          : BYTE;
  689.                                        Lock           : BOOLEAN ) : TError;
  690.  
  691. {-}Function  MSCDEX_ResetDrive(           Drive          : BYTE    ) : TError;
  692.  
  693. {-----------------------}
  694. { Audio Channel Control }
  695. {-----------------------}
  696.  
  697. {-}Function  MSCDEX_CloseTray(            Drive          : BYTE    ) : TError;
  698.  
  699. {-}Function  MSCDEX_ReadLong(             Drive          : BYTE;
  700.                                        AddrMode       : BYTE;
  701.                                        TransferAddr   : POINTER;
  702.                                        SecsToRead     : WORD;
  703.                                        StartSec       : LONGINT;
  704.                                        ReadMode       : BYTE;
  705.                                        InterleaveSize : BYTE;
  706.                                        InterleaveSkip : BYTE    ) : TError;
  707.  
  708. {----------------}
  709. { prefetch, seek }
  710. {----------------}
  711.  
  712. Function  MSCDEX_PlayAudio(            Drive          : BYTE;
  713.                                        AddrMode       : BYTE;
  714.                                        Start          : LONGINT;
  715.                                        Playfor        : LONGINT ) : TError;
  716.  
  717. Function  MSCDEX_StopAudio(            Drive          : BYTE    ) : TError;
  718.  
  719. Function  MSCDEX_ResumeAudio(          Drive          : BYTE    ) : TError;
  720.  
  721. {────────────────────────────────────────────────────────────────────────────}
  722.  
  723. Implementation
  724.  
  725. {────────────────────────────────────────────────────────────────────────────}
  726.  
  727. Procedure BCDFSMtoFSM( Var N : TFSM );
  728.  
  729. BEGIN
  730.  
  731.   N.M := BCDToDec( N.M );
  732.   N.S := BCDToDec( N.S );
  733.   N.F := BCDToDec( N.F );
  734.  
  735. END;  { BCDFSMtoFSM }
  736.  
  737. {────────────────────────────────────────────────────────────────────────────}
  738.  
  739. (*-
  740.  
  741. [FUNCTION]
  742.  
  743. Function  MSCDEX_GetNumDrives                                  : WORD;
  744.  
  745. [PARAMETERS]
  746.  
  747. (None)
  748.  
  749. [RETURNS]
  750.  
  751. Number of MSCDEX controlled CD-ROM drives in the system.
  752.  
  753. [DESCRIPTION]
  754.  
  755. This function obtains and returns a count of the number of MSCDEX
  756. controlled CD-ROM drives in the system.
  757.  
  758. [SEE-ALSO]
  759.  
  760. [EXAMPLE]
  761.  
  762. -*)
  763.  
  764. Function  MSCDEX_GetNumDrives                                  : WORD;
  765.  
  766. Var
  767.  
  768.   R : REGISTERS;
  769.  
  770. BEGIN
  771.  
  772.   R.AH:=$15;
  773.   R.AL:=$0;
  774.   R.BX:=$0;
  775.  
  776.   Intr( $2F, R );
  777.  
  778.  
  779.   MSCDEX_GetNumDrives := R.BX;
  780.  
  781. END;  { MSCDEX_GetNumDrives }
  782.  
  783. {────────────────────────────────────────────────────────────────────────────}
  784.  
  785. (*-
  786.  
  787. [FUNCTION]
  788.  
  789. Function  MSCDEX_GetFirstDrive                                 : WORD;
  790.  
  791. [PARAMETERS]
  792.  
  793. (None)
  794.  
  795. [RETURNS]
  796.  
  797. Value of the first MSCDEX drive (IE: 4 for d, 5 for e, etc)
  798.  
  799. [DESCRIPTION]
  800.  
  801. [SEE-ALSO]
  802.  
  803. [EXAMPLE]
  804.  
  805. -*)
  806.  
  807. Function  MSCDEX_GetFirstDrive                                 : WORD;
  808.  
  809. Var
  810.  
  811.   R : REGISTERS;
  812.  
  813. BEGIN
  814.  
  815.   R.AH:=$15;
  816.   R.AL:=$0;
  817.   R.BX:=$0;
  818.  
  819.   Intr( $2F, R );
  820.  
  821.  
  822.   MSCDEX_GetFirstDrive := R.CX;
  823.  
  824. END;  { MSCDEX_GetFirstDrive }
  825.  
  826. {────────────────────────────────────────────────────────────────────────────}
  827.  
  828.  
  829. (*-
  830.  
  831. [FUNCTION]
  832.  
  833. Procedure MSCDEX_ExecRequest(          Drive          : BYTE;
  834.                                        Request        : POINTER   );
  835.  
  836. [PARAMETERS]
  837.  
  838. Drive       CD-ROM Drive Number
  839. Request     Pointer to MSCDEX Request Packet
  840.  
  841. [RETURNS]
  842.  
  843. (None)
  844.  
  845. [DESCRIPTION]
  846.  
  847. This function executes an MSCDEX request packet.
  848.  
  849. [SEE-ALSO]
  850.  
  851. [EXAMPLE]
  852.  
  853. -*)
  854.  
  855. Procedure MSCDEX_ExecRequest(          Drive          : BYTE;
  856.                                        Request        : POINTER   );
  857.  
  858. Var
  859.  
  860.   R : REGISTERS;
  861.  
  862. BEGIN
  863.  
  864.   R.AH := $15;
  865.   R.AL := $10;
  866.   R.CX := Drive;
  867.   R.ES := Seg( Request^ );
  868.   R.BX := Ofs( Request^ );
  869.  
  870.   Intr( $2F, R );
  871.  
  872. END;  { MSCDEX_ExecRequest }
  873.  
  874. {────────────────────────────────────────────────────────────────────────────}
  875.  
  876. (*-
  877.  
  878. [FUNCTION]
  879.  
  880. Procedure MSCDEX_LoadIOR(              IOR            : PmscdexIOCTLReq;
  881.                                        ReqHeadLength  : BYTE;
  882.                                        CommandCode    : BYTE;
  883.                                        MediaDescript  : BYTE;
  884.                                        ControlBlock   : POINTER;
  885.                                        CBS            : WORD             );
  886.  
  887. [PARAMETERS]
  888.  
  889. IOR           Pointer to MSCDEX IOCtl Request Packet
  890. ReqHeadLength Request Header Length
  891. CommandCode   Command code of the IOCTL request
  892. MediaDescript Media description byte
  893. ControlBlock  pointer to the command control block
  894. CBS           size of the control block in bytes.
  895.  
  896. [RETURNS]
  897.  
  898. (None)
  899.  
  900. [DESCRIPTION]
  901.  
  902. This function is used to build a MSCDEX IOCTL request and the
  903. associated structures.
  904.  
  905. [SEE-ALSO]
  906.  
  907. [EXAMPLE]
  908.  
  909. -*)
  910.  
  911. Procedure MSCDEX_LoadIOR(              IOR            : PmscdexIOCTLReq;
  912.                                        ReqHeadLength  : BYTE;
  913.                                        CommandCode    : BYTE;
  914.                                        MediaDescript  : BYTE;
  915.                                        ControlBlock   : POINTER;
  916.                                        CBS            : WORD             );
  917.  
  918. BEGIN
  919.  
  920.   IOR^.Header.HeaderSize  := ReqHeadLength;
  921.   IOR^.Header.CommandCode := CommandCode;
  922.   IOR^.Header.Status      := 0;
  923.  
  924.   { zero reserved bytes }
  925.  
  926.   IOR^.MediaDescript      := MediaDescript;
  927.   IOR^.ControlBlock       := ControlBlock;
  928.   IOR^.ControlBlockSize   := CBS;
  929.   IOR^.StartingSector     := 0;
  930.   IOR^.RequestedVol       := NIL;
  931.  
  932. END;  { MSCDEX_LoadIOR }
  933.  
  934. {────────────────────────────────────────────────────────────────────────────}
  935.  
  936. (*-
  937.  
  938. [FUNCTION]
  939.  
  940. Function MSCDEX_GetHeadPos(            Drive          : BYTE;
  941.                                        AddrMode       : BYTE;
  942.                                    Var HeadPos        : LONGINT ) : TError;
  943.  
  944. [PARAMETERS]
  945.  
  946. Drive       CD-ROM Drive Number
  947. AddrMode    logical block/msf addressing flag
  948. HeadPos     VAR returned current head position in the specified addressing
  949.             mode.
  950.  
  951. [RETURNS]
  952.  
  953. Function : 0 if successfull, otherwise a DOS error code.
  954. (VAR     : [HeadPos]
  955.  
  956. [DESCRIPTION]
  957.  
  958. This function obtains and returns the current head position of the
  959. specified "drive".  The position value is in the addressing mode
  960. specified by "AddrMode".
  961.  
  962. [SEE-ALSO]
  963.  
  964. [EXAMPLE]
  965.  
  966. -*)
  967.  
  968. Function MSCDEX_GetHeadPos(            Drive          : BYTE;
  969.                                        AddrMode       : BYTE;
  970.                                    Var HeadPos        : LONGINT ) : TError;
  971.  
  972. Var
  973.  
  974.   IOR : TmscdexIOCTLReq;
  975.   CB  : TmscdexGetHeadPos;
  976.  
  977. BEGIN
  978.  
  979.   {---------------------------}
  980.   { Load IOCTL request header }
  981.   {---------------------------}
  982.  
  983.   MSCDEX_LoadIOR( @IOR,
  984.                   22,
  985.                   cmscdexIOCTLRead,
  986.                   0,
  987.                   @CB,
  988.                   cmscdexGetHeadPosCBS );
  989.  
  990.   {---------------------------}
  991.   { Fill in the Control Block }
  992.   {---------------------------}
  993.  
  994.   CB.ConBCode := cmscdexGetHeadPos;
  995.   CB.AddrMode := AddrMode;
  996.  
  997.   {-----------------}
  998.   { Execute Request }
  999.   {-----------------}
  1000.  
  1001.   MSCDEX_ExecRequest( Drive, @IOR );
  1002.  
  1003.   {------------------------------}
  1004.   { Extract Results from Request }
  1005.   {------------------------------}
  1006.  
  1007.   HeadPos               := CB.HeadPos;
  1008.   MSCDEX_GetHeadPos     := IOR.Header.Status;
  1009.  
  1010. END;  { MSCDEX_GetHeadPos }
  1011.  
  1012. {────────────────────────────────────────────────────────────────────────────}
  1013.  
  1014. (*-
  1015.  
  1016. [FUNCTION]
  1017.  
  1018. Function  MSCDEX_GetAudioChanInfo(     Drive          : BYTE;
  1019.                                        Channel        : BYTE;
  1020.                                    Var InputChan      : BYTE;
  1021.                                    Var Volume         : BYTE    ) : TError;
  1022.  
  1023. [PARAMETERS]
  1024.  
  1025. Drive       CD-ROM Drive Number
  1026. Channel     ?
  1027. InputChan   VAR Returned ?
  1028. Volume      VAR Returned ?
  1029.  
  1030. [RETURNS]
  1031.  
  1032. Function : ?
  1033. (VAR     : [InputChan] ?)
  1034. (VAR     : [Volume] ?)
  1035.  
  1036. [DESCRIPTION]
  1037.  
  1038. [SEE-ALSO]
  1039.  
  1040. [EXAMPLE]
  1041.  
  1042. -*)
  1043.  
  1044. Function  MSCDEX_GetAudioChanInfo(     Drive          : BYTE;
  1045.                                        Channel        : BYTE;
  1046.                                    Var InputChan      : BYTE;
  1047.                                    Var Volume         : BYTE    ) : TError;
  1048.  
  1049. Var
  1050.  
  1051.   IOR  : TmscdexIOCTLReq;
  1052.   CB   : TmscdexAudioChanInfo;
  1053.  
  1054. BEGIN
  1055.  
  1056.   {---------------------------}
  1057.   { Load IOCTL request header }
  1058.   {---------------------------}
  1059.  
  1060.   MSCDEX_LoadIOR( @IOR,
  1061.                   22,
  1062.                   cmscdexIOCTLRead,
  1063.                   0,
  1064.                   @CB,
  1065.                   cmscdexGetAudioChanInfoCBS );
  1066.  
  1067.   {---------------------------}
  1068.   { Fill in the Control Block }
  1069.   {---------------------------}
  1070.  
  1071.   CB.ConBCode := cmscdexGetAudioChanInfo;
  1072.  
  1073.   {-----------------}
  1074.   { Execute Request }
  1075.   {-----------------}
  1076.  
  1077.   MSCDEX_ExecRequest( Drive, @IOR );
  1078.  
  1079.   {------------------------------}
  1080.   { Extract Results from Request }
  1081.   {------------------------------}
  1082.  
  1083.   { pull out the junk }
  1084.  
  1085.   MSCDEX_GetAudioChanInfo := IOR.Header.Status;
  1086.  
  1087. END;  { MSCDEX_GetAudioChanInfo }
  1088.  
  1089. {────────────────────────────────────────────────────────────────────────────}
  1090.  
  1091. (*-
  1092.  
  1093. [FUNCTION]
  1094.  
  1095. Function  MSCDEX_GetDevStatus(         Drive          : BYTE;
  1096.                                    Var DevStatus      : LONGINT ) : TError;
  1097.  
  1098. [PARAMETERS]
  1099.  
  1100. Drive       CD-ROM Drive Number
  1101. DevStatus   VAR Returned
  1102.  
  1103. [RETURNS]
  1104.  
  1105. 0 if successfull, otherwise a DOS error code.
  1106.  
  1107. Devstatus         device status word (see MSCDEX documentation)
  1108.  
  1109. [DESCRIPTION]
  1110.  
  1111. This function obtains and returns the MSCDEX cd-rom status word
  1112. for the specified "drive".
  1113.  
  1114. [SEE-ALSO]
  1115.  
  1116. [EXAMPLE]
  1117.  
  1118. -*)
  1119.  
  1120. Function  MSCDEX_GetDevStatus(         Drive          : BYTE;
  1121.                                    Var DevStatus      : LONGINT ) : TError;
  1122.  
  1123. Var
  1124.  
  1125.   IOR  : TmscdexIOCTLReq;
  1126.   CB   : TmscdexDevStatus;
  1127.  
  1128. BEGIN
  1129.  
  1130.   {---------------------------}
  1131.   { Load IOCTL request header }
  1132.   {---------------------------}
  1133.  
  1134.   MSCDEX_LoadIOR( @IOR,
  1135.                   22,
  1136.                   cmscdexIOCTLRead,
  1137.                   0,
  1138.                   @CB,
  1139.                   cmscdexGetDevStatusCBS );
  1140.  
  1141.   {---------------------------}
  1142.   { Fill in the Control Block }
  1143.   {---------------------------}
  1144.  
  1145.   CB.ConBCode := cmscdexGetDevStatus;
  1146.  
  1147.   {-----------------}
  1148.   { Execute Request }
  1149.   {-----------------}
  1150.  
  1151.   MSCDEX_ExecRequest( Drive, @IOR );
  1152.  
  1153.   {------------------------------}
  1154.   { Extract Results from Request }
  1155.   {------------------------------}
  1156.  
  1157.   DevStatus := CB.DevParams;
  1158.  
  1159.   MSCDEX_GetDevStatus := IOR.Header.Status;
  1160.  
  1161. END;  { MSCDEX_GetDevStatus }
  1162.  
  1163. {────────────────────────────────────────────────────────────────────────────}
  1164.  
  1165. (*-
  1166.  
  1167. [FUNCTION]
  1168.  
  1169. Function  MSCDEX_GetSectorSize(        Drive          : BYTE;
  1170.                                        ReadMode       : BYTE;
  1171.                                    Var SecSize        : WORD    ) : TError;
  1172.  
  1173. [PARAMETERS]
  1174.  
  1175. Drive       CD-ROM Drive Number
  1176. ReadMode    ?
  1177. SecSize     VAR Returned Sector Size
  1178.  
  1179. [RETURNS]
  1180.  
  1181. Function : ?
  1182. (VAR     : [SecSize] Sector Size)
  1183.  
  1184. [DESCRIPTION]
  1185.  
  1186. [SEE-ALSO]
  1187.  
  1188. [EXAMPLE]
  1189.  
  1190. -*)
  1191.  
  1192. Function  MSCDEX_GetSectorSize(        Drive          : BYTE;
  1193.                                        ReadMode       : BYTE;
  1194.                                    Var SecSize        : WORD    ) : TError;
  1195.  
  1196. Var
  1197.  
  1198.   IOR  : TmscdexIOCTLReq;
  1199.   CB   : TmscdexGetSecSize;
  1200.  
  1201. BEGIN
  1202.  
  1203.   {---------------------------}
  1204.   { Load IOCTL request header }
  1205.   {---------------------------}
  1206.  
  1207.   MSCDEX_LoadIOR( @IOR,
  1208.                   22,
  1209.                   cmscdexIOCTLRead,
  1210.                   0,
  1211.                   @CB,
  1212.                   cmscdexGetSecSizeCBS );
  1213.  
  1214.   {---------------------------}
  1215.   { Fill in the Control Block }
  1216.   {---------------------------}
  1217.  
  1218.   CB.ConBCode := cmscdexGetSecSize;
  1219.   CB.ReadMode := ReadMode;
  1220.  
  1221.   {-----------------}
  1222.   { Execute Request }
  1223.   {-----------------}
  1224.  
  1225.   MSCDEX_ExecRequest( Drive, @IOR );
  1226.  
  1227.   {------------------------------}
  1228.   { Extract Results from Request }
  1229.   {------------------------------}
  1230.  
  1231.   SecSize := CB.SectorSize;
  1232.  
  1233.   MSCDEX_GetSectorSize := IOR.Header.Status;
  1234.  
  1235. END;  { MSCDEX_GetSectorSize }
  1236.  
  1237. {────────────────────────────────────────────────────────────────────────────}
  1238.  
  1239. (*-
  1240.  
  1241. [FUNCTION]
  1242.  
  1243. Function  MSCDEX_GetVolumeSize(        Drive          : BYTE;
  1244.                                    Var VolumeSize     : LONGINT ) : TError;
  1245.  
  1246. [PARAMETERS]
  1247.  
  1248. Drive       CD-ROM Drive Number
  1249. VolumeSize  VAR Returned ?
  1250.  
  1251. [RETURNS]
  1252.  
  1253. Function : ?
  1254. (VAR     : [VolumeSize] ?)
  1255.  
  1256. [DESCRIPTION]
  1257.  
  1258. [SEE-ALSO]
  1259.  
  1260. [EXAMPLE]
  1261.  
  1262. -*)
  1263.  
  1264. Function  MSCDEX_GetVolumeSize(        Drive          : BYTE;
  1265.                                    Var VolumeSize     : LONGINT ) : TError;
  1266.  
  1267. Var
  1268.  
  1269.   IOR  : TmscdexIOCTLReq;
  1270.   CB   : TmscdexGetVolumeSize;
  1271.  
  1272. BEGIN
  1273.  
  1274.   {---------------------------}
  1275.   { Load IOCTL request header }
  1276.   {---------------------------}
  1277.  
  1278.   MSCDEX_LoadIOR( @IOR,
  1279.                   22,
  1280.                   cmscdexIOCTLRead,
  1281.                   0,
  1282.                   @CB,
  1283.                   cmscdexGetVolumeSizeCBS );
  1284.  
  1285.   {---------------------------}
  1286.   { Fill in the Control Block }
  1287.   {---------------------------}
  1288.  
  1289.   CB.ConBCode := cmscdexGetVolumeSize;
  1290.  
  1291.   {-----------------}
  1292.   { Execute Request }
  1293.   {-----------------}
  1294.  
  1295.   MSCDEX_ExecRequest( Drive, @IOR );
  1296.  
  1297.   {------------------------------}
  1298.   { Extract Results from Request }
  1299.   {------------------------------}
  1300.  
  1301.   VolumeSize := CB.VolumeSize;
  1302.  
  1303.   MSCDEX_GetVolumeSize := IOR.Header.Status;
  1304.  
  1305. END; { MSCDEX_GetVolumeSize }
  1306.  
  1307. {────────────────────────────────────────────────────────────────────────────}
  1308.  
  1309. (*-
  1310.  
  1311. [FUNCTION]
  1312.  
  1313. Function  MSCDEX_IsMediaChanged(  Drive          : BYTE         ) : BYTE;
  1314.  
  1315. [PARAMETERS]
  1316.  
  1317. Drive       CD-ROM Drive Number
  1318.  
  1319. [RETURNS]
  1320.  
  1321. Whether the CD-ROM Media has been Changed (TRUE=Changed)
  1322.  
  1323. [DESCRIPTION]
  1324.  
  1325. [SEE-ALSO]
  1326.  
  1327. [EXAMPLE]
  1328.  
  1329. -*)
  1330.  
  1331. Function  MSCDEX_IsMediaChanged(  Drive          : BYTE         ) : BYTE;
  1332.  
  1333. Var
  1334.  
  1335.   IOR  : TmscdexIOCTLReq;
  1336.   CB   : TmscdexCheckMediaChange;
  1337.  
  1338. BEGIN
  1339.  
  1340.   {---------------------------}
  1341.   { Load IOCTL request header }
  1342.   {---------------------------}
  1343.  
  1344.   MSCDEX_LoadIOR( @IOR,
  1345.                   22,
  1346.                   cmscdexIOCTLRead,
  1347.                   0,
  1348.                   @CB,
  1349.                   cmscdexCheckMediaChangeCBS );
  1350.  
  1351.   {---------------------------}
  1352.   { Fill in the Control Block }
  1353.   {---------------------------}
  1354.  
  1355.   CB.ConBCode := cmscdexCheckMediaChange;
  1356.  
  1357.   {-----------------}
  1358.   { Execute Request }
  1359.   {-----------------}
  1360.  
  1361.   MSCDEX_ExecRequest( Drive, @IOR );
  1362.  
  1363.   {------------------------------}
  1364.   { Extract Results from Request }
  1365.   {------------------------------}
  1366.  
  1367.   MSCDEX_IsMediaChanged := CB.MediaStatus;
  1368.  
  1369. END;  { MSCDEX_IsMediaChanged }
  1370.  
  1371. {────────────────────────────────────────────────────────────────────────────}
  1372.  
  1373. (*-
  1374.  
  1375. [FUNCTION]
  1376.  
  1377. Function  MSCDEX_GetAudioDiskInfo(     Drive          : BYTE;
  1378.                                    Var StartTrack     : BYTE;
  1379.                                    Var EndTrack       : BYTE;
  1380.                                    Var LeadOutStart   : LONGINT ) : TError;
  1381.  
  1382. [PARAMETERS]
  1383.  
  1384. Drive        CD-ROM Drive Number
  1385. StartTrack   VAR Returned ?
  1386. EndTrack     VAR Returned ?
  1387. LeadOutStart VAR Returned ?
  1388.  
  1389. [RETURNS]
  1390.  
  1391. Function : ?
  1392. (VAR     : [StartTrack] ?)
  1393. (VAR     : [EndTrack] ?)
  1394. (VAR     : [LeadOutStart] ?)
  1395.  
  1396. [DESCRIPTION]
  1397.  
  1398. [SEE-ALSO]
  1399.  
  1400. [EXAMPLE]
  1401.  
  1402. -*)
  1403.  
  1404. Function  MSCDEX_GetAudioDiskInfo(     Drive          : BYTE;
  1405.                                    Var StartTrack     : BYTE;
  1406.                                    Var EndTrack       : BYTE;
  1407.                                    Var LeadOutStart   : LONGINT ) : TError;
  1408.  
  1409. Var
  1410.  
  1411.   IOR  : TmscdexIOCTLReq;
  1412.   CB   : TmscdexGetAudioDiskInfo;
  1413.  
  1414. BEGIN
  1415.  
  1416.   {---------------------------}
  1417.   { Load IOCTL request header }
  1418.   {---------------------------}
  1419.  
  1420.   MSCDEX_LoadIOR( @IOR,
  1421.                   22,
  1422.                   cmscdexIOCTLRead,
  1423.                   0,
  1424.                   @CB,
  1425.                   cmscdexGetAudioDiskInfoCBS );
  1426.  
  1427.   {---------------------------}
  1428.   { Fill in the Control Block }
  1429.   {---------------------------}
  1430.  
  1431.   CB.ConBCode := cmscdexGetAudioDiskInfo;
  1432.  
  1433.   {-----------------}
  1434.   { Execute Request }
  1435.   {-----------------}
  1436.  
  1437.   MSCDEX_ExecRequest( Drive, @IOR );
  1438.  
  1439.   {------------------------------}
  1440.   { Extract Results from Request }
  1441.   {------------------------------}
  1442.  
  1443.   StartTrack   := CB.LowestTrack;
  1444.   EndTrack     := CB.HighestTrack;
  1445.   LeadOutStart := CB.StartOfLeadout;
  1446.  
  1447.   MSCDEX_GetAudioDiskInfo := IOR.Header.Status;
  1448.  
  1449. END;  { MSCDEX_GetAudioDiskInfo }
  1450.  
  1451. {────────────────────────────────────────────────────────────────────────────}
  1452.  
  1453. (*-
  1454.  
  1455. [FUNCTION]
  1456.  
  1457. Function  MSCDEX_GetAudioTrackInfo(    Drive          : BYTE;
  1458.                                        TrackNum       : BYTE;
  1459.                                    Var StartPoint     : LONGINT;
  1460.                                    Var TrackConInfo   : BYTE    ) : TError;
  1461.  
  1462. [PARAMETERS]
  1463.  
  1464. Drive        CD-ROM Drive Number
  1465. TrackNum     ?
  1466. StartPoint   VAR Returned ?
  1467. TrackConinfo VAR Returned ?
  1468.  
  1469. [RETURNS]
  1470.  
  1471. Function : ?
  1472. (VAR     : [StartPoint] ?)
  1473. (VAR     : [TrackConInfo] ?)
  1474.  
  1475. [DESCRIPTION]
  1476.  
  1477. [SEE-ALSO]
  1478.  
  1479. [EXAMPLE]
  1480.  
  1481. -*)
  1482.  
  1483. Function  MSCDEX_GetAudioTrackInfo(    Drive          : BYTE;
  1484.                                        TrackNum       : BYTE;
  1485.                                    Var StartPoint     : LONGINT;
  1486.                                    Var TrackConInfo   : BYTE    ) : TError;
  1487.  
  1488. Var
  1489.  
  1490.   IOR  : TmscdexIOCTLReq;
  1491.   CB   : TmscdexGetAudioTrackInfo;
  1492.  
  1493. BEGIN
  1494.  
  1495.   {---------------------------}
  1496.   { Load IOCTL request header }
  1497.   {---------------------------}
  1498.  
  1499.   MSCDEX_LoadIOR( @IOR,
  1500.                   22,
  1501.                   cmscdexIOCTLRead,
  1502.                   0,
  1503.                   @CB,
  1504.                   cmscdexGetAudioTrackInfoCBS );
  1505.  
  1506.   {---------------------------}
  1507.   { Fill in the Control Block }
  1508.   {---------------------------}
  1509.  
  1510.   CB.ConBCode := cmscdexGetAudioTrackInfo;
  1511.   CB.TrackNum := TrackNum;
  1512.  
  1513.   {-----------------}
  1514.   { Execute Request }
  1515.   {-----------------}
  1516.  
  1517.   MSCDEX_ExecRequest( Drive, @IOR );
  1518.  
  1519.   {------------------------------}
  1520.   { Extract Results from Request }
  1521.   {------------------------------}
  1522.  
  1523.   StartPoint   := CB.StartPoint;
  1524.  
  1525. {  BCDFSMtoFSM( TFSM( StartPoint ) );  }
  1526.  
  1527.   TrackConInfo := CB.TrackConInfo;
  1528.  
  1529.   MSCDEX_GetAudioTrackInfo := IOR.Header.Status;
  1530.  
  1531. END;  { MSCDEX_GetAudioTrackInfo }
  1532.  
  1533. {────────────────────────────────────────────────────────────────────────────}
  1534.  
  1535. (*-
  1536.  
  1537. [FUNCTION]
  1538.  
  1539. Function  MSCDEX_GetAudioQChanInfo(    Drive          : BYTE;
  1540.                                    Var ConAddr        : BYTE;
  1541.                                    Var TrackNum       : BYTE;
  1542.                                    Var IndexNum       : BYTE;
  1543.                                    Var TrackTime      : TFSM;
  1544.                                    Var DiskTime       : TFSM    ) : TError;
  1545.  
  1546. [PARAMETERS]
  1547.  
  1548. Drive       CD-ROM Drive Number
  1549. ConAddr     VAR Returned ?
  1550. TrackNum    VAR Returned ?
  1551. IndexNum    VAR Returned ?
  1552. TrackTime   VAR Returned ?
  1553. DiskTime    VAR Returned ?
  1554.  
  1555. [RETURNS]
  1556.  
  1557. Function : ?
  1558. (VAR     : [ConAddr] ?)
  1559. (VAR     : [TrackNum] ?)
  1560. (VAR     : [IndexNum] ?)
  1561. (VAR     : [TrackTime] ?)
  1562. (VAR     : [DiskTime] ?)
  1563.  
  1564. [DESCRIPTION]
  1565.  
  1566. [SEE-ALSO]
  1567.  
  1568. [EXAMPLE]
  1569.  
  1570. -*)
  1571.  
  1572. Function  MSCDEX_GetAudioQChanInfo(    Drive          : BYTE;
  1573.                                    Var ConAddr        : BYTE;
  1574.                                    Var TrackNum       : BYTE;
  1575.                                    Var IndexNum       : BYTE;
  1576.                                    Var TrackTime      : TFSM;
  1577.                                    Var DiskTime       : TFSM    ) : TError;
  1578.  
  1579. Var
  1580.  
  1581.   IOR  : TmscdexIOCTLReq;
  1582.   CB   : TmscdexGetAudioQChanInfo;
  1583.  
  1584. BEGIN
  1585.  
  1586.   {---------------------------}
  1587.   { Load IOCTL request header }
  1588.   {---------------------------}
  1589.  
  1590.   MSCDEX_LoadIOR( @IOR,
  1591.                   22,
  1592.                   cmscdexIOCTLRead,
  1593.                   0,
  1594.                   @CB,
  1595.                   cmscdexGetAudioQChanInfoCBS );
  1596.  
  1597.   {---------------------------}
  1598.   { Fill in the Control Block }
  1599.   {---------------------------}
  1600.  
  1601.   CB.ConBCode := cmscdexGetAudioQChanInfo;
  1602.  
  1603.   {-----------------}
  1604.   { Execute Request }
  1605.   {-----------------}
  1606.  
  1607.   MSCDEX_ExecRequest( Drive, @IOR );
  1608.  
  1609.   {------------------------------}
  1610.   { Extract Results from Request }
  1611.   {------------------------------}
  1612.  
  1613.   ConAddr     := CB.ControlAndAddr;
  1614.  
  1615.   TrackNum    := CB.TrackNum;
  1616.   IndexNum    := CB.IndexNum;
  1617.  
  1618.  
  1619.   {----------------------------------------}
  1620.   { Ahem.  Here we load the times from the }
  1621.   { readQChanInfo structure into the TFSM  }
  1622.   { variables that are returned.  We do    }
  1623.   { this one field at a time because       }
  1624.   { the readQChanInfo function is the one  }
  1625.   { MSCDEX function that returns           }
  1626.   { TFSMBackwards records instead of TFSMs.}
  1627.   {----------------------------------------}
  1628.  
  1629.  
  1630.   TrackTime.M := CB.TrackTime.M;
  1631.   TrackTime.S := CB.TrackTime.S;
  1632.   TrackTime.F := CB.TrackTime.F;
  1633.   TrackTime.P := 0;
  1634.  
  1635.   DiskTime.M := CB.DiskTime.M;
  1636.   DiskTime.S := CB.DiskTime.S;
  1637.   DiskTime.F := CB.DiskTime.F;
  1638.   DiskTime.P := 0;
  1639.  
  1640.   MSCDEX_GetAudioQChanInfo := IOR.Header.Status;
  1641.  
  1642. END;  { MSCDEX_GetAudioQChanInfo }
  1643.  
  1644. {────────────────────────────────────────────────────────────────────────────}
  1645.  
  1646. (*-
  1647.  
  1648. [FUNCTION]
  1649.  
  1650. Function  MSCDEX_GetAudioSubChanInfo(  Drive          : BYTE;
  1651.                                        StartFrame     : LONGINT;
  1652.                                        SecsToRead     : LONGINT;
  1653.                                        TransferAddr   : POINTER ) : TError;
  1654.  
  1655. [PARAMETERS]
  1656.  
  1657. Drive        CD-ROM Drive Number
  1658. StartFrame   ?
  1659. SecsToRead   ?
  1660. TransferAddr ?
  1661.  
  1662. [RETURNS]
  1663.  
  1664. [DESCRIPTION]
  1665.  
  1666. [SEE-ALSO]
  1667.  
  1668. [EXAMPLE]
  1669.  
  1670. -*)
  1671.  
  1672. Function  MSCDEX_GetAudioSubChanInfo(  Drive          : BYTE;
  1673.                                        StartFrame     : LONGINT;
  1674.                                        SecsToRead     : LONGINT;
  1675.                                        TransferAddr   : POINTER ) : TError;
  1676.  
  1677. BEGIN
  1678.  
  1679. END;  { MSCDEX_GetAudioSubChanInfo }
  1680.  
  1681. {────────────────────────────────────────────────────────────────────────────}
  1682.  
  1683. (*-
  1684.  
  1685. [FUNCTION]
  1686.  
  1687. Function  MSCDEX_GetUPCCode(           Drive          : BYTE;
  1688.                                    Var ConAddr        : BYTE;
  1689.                                    Var UPCCode        : TUPCCode;
  1690.                                    Var AFrame         : BYTE    ) : Terror;
  1691.  
  1692. [PARAMETERS]
  1693.  
  1694. Drive       CD-ROM Drive Number
  1695. ConAddr     VAR Returned ?
  1696. UPCCode     VAR Returned ?
  1697. AFrame      VAR Returned ?
  1698.  
  1699. [RETURNS]
  1700.  
  1701. Function : ?
  1702. (VAR     : [ConAddr] ?)
  1703. (VAR     : [UPCCode] ?)
  1704. (VAR     : [AFrame] ?)
  1705.  
  1706. [DESCRIPTION]
  1707.  
  1708. [SEE-ALSO]
  1709.  
  1710. [EXAMPLE]
  1711.  
  1712. -*)
  1713.  
  1714. Function  MSCDEX_GetUPCCode(           Drive          : BYTE;
  1715.                                    Var ConAddr        : BYTE;
  1716.                                    Var UPCCode        : TUPCCode;
  1717.                                    Var AFrame         : BYTE    ) : Terror;
  1718.  
  1719. Var
  1720.  
  1721.   IOR  : TmscdexIOCTLReq;
  1722.   CB   : TmscdexGetUPCCode;
  1723.  
  1724. BEGIN
  1725.  
  1726.   {---------------------------}
  1727.   { Load IOCTL request header }
  1728.   {---------------------------}
  1729.  
  1730.   MSCDEX_LoadIOR( @IOR,
  1731.                   22,
  1732.                   cmscdexIOCTLRead,
  1733.                   0,
  1734.                   @CB,
  1735.                   cmscdexGetUPCCodeCBS );
  1736.  
  1737.   {---------------------------}
  1738.   { Fill in the Control Block }
  1739.   {---------------------------}
  1740.  
  1741.   CB.ConBCode := cmscdexGetUPCCode;
  1742.  
  1743.   {-----------------}
  1744.   { Execute Request }
  1745.   {-----------------}
  1746.  
  1747.   MSCDEX_ExecRequest( Drive, @IOR );
  1748.  
  1749.   {------------------------------}
  1750.   { Extract Results from Request }
  1751.   {------------------------------}
  1752.  
  1753.   UPCCode := CB.UPCCode;
  1754.   AFrame  := CB.AFrame;
  1755.  
  1756.   MSCDEX_GetUPCCode := IOR.Header.Status;
  1757.  
  1758. END;  { MSCDEX_GetUPCCode }
  1759.  
  1760. {────────────────────────────────────────────────────────────────────────────}
  1761.  
  1762. (*-
  1763.  
  1764. [FUNCTION]
  1765.  
  1766. Function  MSCDEX_GetAudioStatusInfo(   Drive          : BYTE;
  1767.                                    Var AudioStatus    : WORD;
  1768.                                    Var PlayStart      : LONGINT;
  1769.                                    Var PlayEnd        : LONGINT ) : TError;
  1770.  
  1771. [PARAMETERS]
  1772.  
  1773. Drive       CD-ROM Drive Number
  1774. AudioStatus VAR Returned ?
  1775. PlayStart   VAR Returned ?
  1776. PlayEnd     VAR Returned ?
  1777.  
  1778. [RETURNS]
  1779.  
  1780. Function : ?
  1781. (VAR     : [AudioStatus] ?)
  1782. (VAR     : [PlayStart] ?)
  1783. (VAR     : [PlayEnd] ?)
  1784.  
  1785. [DESCRIPTION]
  1786.  
  1787. [SEE-ALSO]
  1788.  
  1789. [EXAMPLE]
  1790.  
  1791. -*)
  1792.  
  1793. Function  MSCDEX_GetAudioStatusInfo(   Drive          : BYTE;
  1794.                                    Var AudioStatus    : WORD;
  1795.                                    Var PlayStart      : LONGINT;
  1796.                                    Var PlayEnd        : LONGINT ) : TError;
  1797.  
  1798. Var
  1799.  
  1800.   IOR  : TmscdexIOCTLReq;
  1801.   CB   : TmscdexGetAudioStatusInfo;
  1802.  
  1803. BEGIN
  1804.  
  1805.   {---------------------------}
  1806.   { Load IOCTL request header }
  1807.   {---------------------------}
  1808.  
  1809.   MSCDEX_LoadIOR( @IOR,
  1810.                   22,
  1811.                   cmscdexIOCTLRead,
  1812.                   0,
  1813.                   @CB,
  1814.                   cmscdexGetAudioStatusInfoCBS );
  1815.  
  1816.   {---------------------------}
  1817.   { Fill in the Control Block }
  1818.   {---------------------------}
  1819.  
  1820.   CB.ConBCode := cmscdexGetAudioStatusInfo;
  1821.  
  1822.   {-----------------}
  1823.   { Execute Request }
  1824.   {-----------------}
  1825.  
  1826.   MSCDEX_ExecRequest( Drive, @IOR );
  1827.  
  1828.   {------------------------------}
  1829.   { Extract Results from Request }
  1830.   {------------------------------}
  1831.  
  1832.   AudioStatus := CB.AudioStatus;
  1833.   PlayStart   := CB.PlayStart;
  1834.   PlayEnd     := CB.PlayEnd;
  1835.  
  1836.   MSCDEX_GetAudioStatusInfo := IOR.Header.Status;
  1837.  
  1838. END;  { MSCDEX_GetAudioStatusInfo }
  1839.  
  1840. {────────────────────────────────────────────────────────────────────────────}
  1841.  
  1842. (*-
  1843.  
  1844. [FUNCTION]
  1845.  
  1846. Function  MSCDEX_EjectDisk(            Drive          : BYTE    ) : TError;
  1847.  
  1848. [PARAMETERS]
  1849.  
  1850. Drive       CD-ROM Drive Number
  1851.  
  1852. [RETURNS]
  1853.  
  1854. [DESCRIPTION]
  1855.  
  1856. [SEE-ALSO]
  1857.  
  1858. [EXAMPLE]
  1859.  
  1860. -*)
  1861.  
  1862. Function  MSCDEX_EjectDisk(            Drive          : BYTE    ) : TError;
  1863.  
  1864. Var
  1865.  
  1866.   IOR  : TmscdexIOCTLReq;
  1867.   CB   : TmscdexEjectDisk;
  1868.  
  1869. BEGIN
  1870.  
  1871.   {---------------------------}
  1872.   { Load IOCTL request header }
  1873.   {---------------------------}
  1874.  
  1875.   MSCDEX_LoadIOR( @IOR,
  1876.                   22,
  1877.                   cmscdexIOCTLRead,
  1878.                   0,
  1879.                   @CB,
  1880.                   cmscdexEjectDiskCBS );
  1881.  
  1882.   {---------------------------}
  1883.   { Fill in the Control Block }
  1884.   {---------------------------}
  1885.  
  1886.   CB.ConBCode := cmscdexEjectDisk;
  1887.  
  1888.   {-----------------}
  1889.   { Execute Request }
  1890.   {-----------------}
  1891.  
  1892.   MSCDEX_ExecRequest( Drive, @IOR );
  1893.  
  1894.   {------------------------------}
  1895.   { Extract Results from Request }
  1896.   {------------------------------}
  1897.  
  1898.   MSCDEX_EjectDisk := IOR.Header.Status;
  1899.  
  1900. END;  { MSCDEX_EjectDisk }
  1901.  
  1902. {────────────────────────────────────────────────────────────────────────────}
  1903.  
  1904. (*-
  1905.  
  1906. [FUNCTION]
  1907.  
  1908. Function  MSCDEX_LockUnlockDoor(       Drive          : BYTE;
  1909.                                        Lock           : BOOLEAN ) : TError;
  1910.  
  1911. [PARAMETERS]
  1912.  
  1913. Drive       CD-ROM Drive Number
  1914. Lock        Is Action Lock Door? (TRUE=Yes)
  1915.  
  1916. [RETURNS]
  1917.  
  1918. [DESCRIPTION]
  1919.  
  1920. [SEE-ALSO]
  1921.  
  1922. [EXAMPLE]
  1923.  
  1924. -*)
  1925.  
  1926. Function  MSCDEX_LockUnlockDoor(       Drive          : BYTE;
  1927.                                        Lock           : BOOLEAN ) : TError;
  1928.  
  1929. Var
  1930.  
  1931.   IOR  : TmscdexIOCTLReq;
  1932.   CB   : TmscdexLockUnlockDoor;
  1933.  
  1934. BEGIN
  1935.  
  1936.   {---------------------------}
  1937.   { Load IOCTL request header }
  1938.   {---------------------------}
  1939.  
  1940.   MSCDEX_LoadIOR( @IOR,
  1941.                   22,
  1942.                   cmscdexIOCTLRead,
  1943.                   0,
  1944.                   @CB,
  1945.                   cmscdexLockUnlockDoorCBS );
  1946.  
  1947.   {---------------------------}
  1948.   { Fill in the Control Block }
  1949.   {---------------------------}
  1950.  
  1951.   CB.ConBCode := cmscdexLockUnlockDoor;
  1952.  
  1953.   If Lock Then
  1954.     CB.LockCode := cmscdexLockDoor
  1955.   Else
  1956.     CB.LockCode := 0;
  1957.  
  1958.   {-----------------}
  1959.   { Execute Request }
  1960.   {-----------------}
  1961.  
  1962.   MSCDEX_ExecRequest( Drive, @IOR );
  1963.  
  1964.   {------------------------------}
  1965.   { Extract Results from Request }
  1966.   {------------------------------}
  1967.  
  1968.   MSCDEX_LockUnlockDoor := IOR.Header.Status;
  1969.  
  1970. END; { MSCDEX_LockUnlockDoor }
  1971.  
  1972. {────────────────────────────────────────────────────────────────────────────}
  1973.  
  1974. (*-
  1975.  
  1976. [FUNCTION]
  1977.  
  1978. Function  MSCDEX_ResetDrive(           Drive          : BYTE    ) : TError;
  1979.  
  1980. [PARAMETERS]
  1981.  
  1982. Drive       CD-ROM Drive Number
  1983.  
  1984. [RETURNS]
  1985.  
  1986. [DESCRIPTION]
  1987.  
  1988. [SEE-ALSO]
  1989.  
  1990. [EXAMPLE]
  1991.  
  1992. -*)
  1993.  
  1994. Function  MSCDEX_ResetDrive(           Drive          : BYTE    ) : TError;
  1995.  
  1996. Var
  1997.  
  1998.   IOR  : TmscdexIOCTLReq;
  1999.   CB   : TmscdexResetDrive;
  2000.  
  2001. BEGIN
  2002.  
  2003.   {---------------------------}
  2004.   { Load IOCTL request header }
  2005.   {---------------------------}
  2006.  
  2007.   MSCDEX_LoadIOR( @IOR,
  2008.                   22,
  2009.                   cmscdexIOCTLRead,
  2010.                   0,
  2011.                   @CB,
  2012.                   cmscdexResetDriveCBS );
  2013.  
  2014.   {---------------------------}
  2015.   { Fill in the Control Block }
  2016.   {---------------------------}
  2017.  
  2018.   CB.ConBCode := cmscdexResetDrive;
  2019.  
  2020.   {-----------------}
  2021.   { Execute Request }
  2022.   {-----------------}
  2023.  
  2024.   MSCDEX_ExecRequest( Drive, @IOR );
  2025.  
  2026.   {------------------------------}
  2027.   { Extract Results from Request }
  2028.   {------------------------------}
  2029.  
  2030.   MSCDEX_ResetDrive := IOR.Header.Status;
  2031.  
  2032. END;  { MSCDEX_ResetDrive }
  2033.  
  2034. {────────────────────────────────────────────────────────────────────────────}
  2035.  
  2036. (*-
  2037.  
  2038. [FUNCTION]
  2039.  
  2040. Function  MSCDEX_CloseTray(            Drive          : BYTE    ) : TError;
  2041.  
  2042. [PARAMETERS]
  2043.  
  2044. Drive       CD-ROM Drive Number
  2045.  
  2046. [RETURNS]
  2047.  
  2048. [DESCRIPTION]
  2049.  
  2050. [SEE-ALSO]
  2051.  
  2052. [EXAMPLE]
  2053.  
  2054. -*)
  2055.  
  2056. Function  MSCDEX_CloseTray(            Drive          : BYTE    ) : TError;
  2057.  
  2058. Var
  2059.  
  2060.   IOR  : TmscdexIOCTLReq;
  2061.   CB   : TmscdexCloseTray;
  2062.  
  2063. BEGIN
  2064.  
  2065.   {---------------------------}
  2066.   { Load IOCTL request header }
  2067.   {---------------------------}
  2068.  
  2069.   MSCDEX_LoadIOR( @IOR,
  2070.                   22,
  2071.                   cmscdexIOCTLRead,
  2072.                   0,
  2073.                   @CB,
  2074.                   cmscdexCloseTrayCBS );
  2075.  
  2076.   {---------------------------}
  2077.   { Fill in the Control Block }
  2078.   {---------------------------}
  2079.  
  2080.   CB.ConBCode := cmscdexCloseTray;
  2081.  
  2082.   {-----------------}
  2083.   { Execute Request }
  2084.   {-----------------}
  2085.  
  2086.   MSCDEX_ExecRequest( Drive, @IOR );
  2087.  
  2088.   {------------------------------}
  2089.   { Extract Results from Request }
  2090.   {------------------------------}
  2091.  
  2092.   MSCDEX_CloseTray := IOR.Header.Status;
  2093.  
  2094. END;  { MSCDEX_CloseTray }
  2095.  
  2096. {────────────────────────────────────────────────────────────────────────────}
  2097.  
  2098. (*-
  2099.  
  2100. [FUNCTION]
  2101.  
  2102. Function  MSCDEX_ReadLong(             Drive          : BYTE;
  2103.                                        AddrMode       : BYTE;
  2104.                                        TransferAddr   : POINTER;
  2105.                                        SecsToRead     : WORD;
  2106.                                        StartSec       : LONGINT;
  2107.                                        ReadMode       : BYTE;
  2108.                                        InterleaveSize : BYTE;
  2109.                                        InterleaveSkip : BYTE    ) : TError;
  2110.  
  2111. [PARAMETERS]
  2112.  
  2113. Drive          CD-ROM Drive Number
  2114. AddrMode       ?
  2115. TransferAddr   ?
  2116. SecsToRead     ?
  2117. StartSec       ?
  2118. ReadMode       ?
  2119. InterleaveSize ?
  2120. InterleaveSkip ?
  2121.  
  2122. [RETURNS]
  2123.  
  2124. [DESCRIPTION]
  2125.  
  2126. [SEE-ALSO]
  2127.  
  2128. [EXAMPLE]
  2129.  
  2130. -*)
  2131.  
  2132. Function  MSCDEX_ReadLong(             Drive          : BYTE;
  2133.                                        AddrMode       : BYTE;
  2134.                                        TransferAddr   : POINTER;
  2135.                                        SecsToRead     : WORD;
  2136.                                        StartSec       : LONGINT;
  2137.                                        ReadMode       : BYTE;
  2138.                                        InterleaveSize : BYTE;
  2139.                                        InterleaveSkip : BYTE    ) : TError;
  2140.  
  2141. BEGIN
  2142.  
  2143. END;  { MSCDEX_ReadLong }
  2144.  
  2145. {────────────────────────────────────────────────────────────────────────────}
  2146.  
  2147. (*-
  2148.  
  2149. [FUNCTION]
  2150.  
  2151. Function  MSCDEX_PlayAudio(            Drive          : BYTE;
  2152.                                        AddrMode       : BYTE;
  2153.                                        Start          : LONGINT;
  2154.                                        PlayFor        : LONGINT ) : TError;
  2155.  
  2156. [PARAMETERS]
  2157.  
  2158. Drive       CD-ROM Drive Number
  2159. AddrMode    ?
  2160. Start       ?
  2161. PlayFor     ?
  2162.  
  2163. [RETURNS]
  2164.  
  2165. [DESCRIPTION]
  2166.  
  2167. [SEE-ALSO]
  2168.  
  2169. [EXAMPLE]
  2170.  
  2171. -*)
  2172.  
  2173. Function  MSCDEX_PlayAudio(            Drive          : BYTE;
  2174.                                        AddrMode       : BYTE;
  2175.                                        Start          : LONGINT;
  2176.                                        PlayFor        : LONGINT ) : TError;
  2177.  
  2178. Var
  2179.  
  2180.   PlayR : TmscdexPlayAudioReq;
  2181.   Z     : INTEGER;
  2182.  
  2183. BEGIN
  2184.  
  2185.   PlayR.Header.HeaderSize  := 22;
  2186.   PlayR.Header.SubUnit     := 0;
  2187.   PlayR.Header.CommandCode := 132;
  2188.  
  2189.   PlayR.AddrMode := AddrMode;
  2190.   PlayR.Start    := Start;
  2191.  
  2192.   PlayR.PlayFor  := PlayFor;
  2193.  
  2194.   PlayR.Header.Status := 0;
  2195.  
  2196.   For Z:=1 to 8 DO
  2197.     PlayR.Header.Reserved[Z]:=0;
  2198.  
  2199.   MSCDEX_ExecRequest( Drive, @PlayR );
  2200.  
  2201.   MSCDEX_PlayAudio := PlayR.Header.Status;
  2202.  
  2203. END;  { MSCDEX_PlayAudio }
  2204.  
  2205. {────────────────────────────────────────────────────────────────────────────}
  2206.  
  2207. (*-
  2208.  
  2209. [FUNCTION]
  2210.  
  2211. Function  MSCDEX_StopAudio(            Drive          : BYTE    ) : TError;
  2212.  
  2213. [PARAMETERS]
  2214.  
  2215. Drive       CD-ROM Drive Number
  2216.  
  2217. [RETURNS]
  2218.  
  2219. [DESCRIPTION]
  2220.  
  2221. [SEE-ALSO]
  2222.  
  2223. [EXAMPLE]
  2224.  
  2225. -*)
  2226.  
  2227. Function  MSCDEX_StopAudio(            Drive          : BYTE    ) : TError;
  2228.  
  2229. Var
  2230.  
  2231.   StopR : TmscdexStopAudioReq;
  2232.  
  2233. BEGIN
  2234.  
  2235.   StopR.Header.HeaderSize   := 22;
  2236.   StopR.Header.Subunit      := 0;
  2237.   StopR.Header.CommandCode  := 133;
  2238.  
  2239.   MSCDEX_ExecRequest( Drive, @StopR );
  2240.  
  2241.   MSCDEX_StopAudio := StopR.Header.Status;
  2242.  
  2243. END;  { MSCDEX_StopAudio }
  2244.  
  2245. {────────────────────────────────────────────────────────────────────────────}
  2246.  
  2247. (*-
  2248.  
  2249. [FUNCTION]
  2250.  
  2251. Function  MSCDEX_ResumeAudio(          Drive          : BYTE    ) : TError;
  2252.  
  2253. [PARAMETERS]
  2254.  
  2255. Drive       CD-ROM Drive Number
  2256.  
  2257. [RETURNS]
  2258.  
  2259. [DESCRIPTION]
  2260.  
  2261. [SEE-ALSO]
  2262.  
  2263. [EXAMPLE]
  2264.  
  2265. -*)
  2266.  
  2267. Function  MSCDEX_ResumeAudio(          Drive          : BYTE    ) : TError;
  2268.  
  2269. Var
  2270.  
  2271.   ResR : TmscdexResumeAudioReq;
  2272.  
  2273. BEGIN
  2274.  
  2275.   ResR.Header.HeaderSize   := 22;
  2276.   ResR.Header.Subunit      := 0;
  2277.   ResR.Header.CommandCode  := 136;
  2278.  
  2279.   MSCDEX_ExecRequest( Drive, @ResR );
  2280.  
  2281.   MSCDEX_ResumeAudio := ResR.Header.Status;
  2282.  
  2283. END;  { MSCDEX_ResumeAudio }
  2284.  
  2285. {────────────────────────────────────────────────────────────────────────────}
  2286. {────────────────────────────────────────────────────────────────────────────}
  2287. {────────────────────────────────────────────────────────────────────────────}
  2288.  
  2289. BEGIN
  2290.  
  2291. END.
  2292.