home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / SHSUCD11.ZIP / DRIVERS.ADS < prev    next >
Text File  |  1995-06-29  |  7KB  |  184 lines

  1. --************************************************************************
  2. --
  3. --  DRIVERS.ADS               Version 3.0
  4. --
  5. --  A copyright-reserved, free use program.
  6. --  (c)John H. McCoy, 1994, 1995, Sam Houston St. Univ., TX 77341-2206
  7. --************************************************************************
  8.  
  9. with system, memory, unchecked_conversion, unchecked_deallocation;
  10. with Types; use Types;
  11.  
  12. package drivers is
  13.  
  14. type CdDrivers is                  -- character device with cd rom extensions
  15. record
  16.    NextDevice        : system.address;
  17.    Attributes        : word;                 -- 16#C800#
  18.    Strategy          : memory.segment_offset;
  19.    Interrupt         : memory.segment_offset;
  20.    Name              : string8;              -- pad with blanks
  21.    CD_Reserved       : word;     -- 0
  22.    CD_Drive          : byte;     -- 0    first drive letter assigned by mscdex
  23.    CD_Count          : byte;     -- >= 1 number of cd's controlled by driver
  24. end record;
  25.  
  26.  
  27. type DEV_CommandCodes is new byte;
  28.  
  29.    DeviceInit              : constant DEV_CommandCodes := 0;
  30.    DeviceMediaCheck        : constant DEV_CommandCodes := 1;
  31.    DeviceBuildBpb          : constant DEV_CommandCodes := 2;
  32.    DeviceIoctlInput        : constant DEV_CommandCodes := 3;
  33.    DeviceRead              : constant DEV_CommandCodes := 4;
  34.    DeviceWrite             : constant DEV_CommandCodes := 8;
  35.    DeviceIoctlOutput       : constant DEV_CommandCodes := 12;
  36.    DeviceOpen              : constant DEV_CommandCodes := 13;
  37.    DeviceClose             : constant DEV_CommandCodes := 14;
  38.    DeviceReadLong          : constant DEV_CommandCodes := 128;
  39.    DeviceReadLongPrefetch  : constant DEV_CommandCodes := 130;
  40.    DeviceSeek              : constant DEV_CommandCodes := 131;
  41.    DeviceDummy             : constant DEV_CommandCodes := 255;
  42. -- DOS DRIVER STATUS
  43.  
  44. type DEV_ReturnCodes is new W;
  45.  
  46.    DeviceError       : constant DEV_ReturnCodes := Word_to_W(16#8000#);
  47.    DeviceBusy        : constant DEV_ReturnCodes := Word_to_W(16#0200#);
  48.    DeviceDone        : constant DEV_ReturnCodes := Word_to_W(16#0100#);
  49.    DeviceUnknownUnit : constant DEV_ReturnCodes := Word_to_W(16#0001#);
  50.    DeviceNotReady    : constant DEV_ReturnCodes := Word_to_W(16#0002#);
  51.    DeviceUnknownCommand : constant DEV_ReturnCodes := Word_to_W(16#0003#);
  52.    DeviceFailure     : constant DEV_ReturnCodes := Word_to_W(16#000C#);
  53.    InvalidDiskChange : constant DEV_ReturnCodes := Word_to_W(16#000F#);
  54.  
  55.  
  56. -- DOS DRIVER Exceptions
  57.  
  58.    DEV_Error         : exception;
  59.    DEV_NameError     : exception;
  60.    DEV_IOCtlError    : exception;
  61.    DEV_NotFound      : exception;
  62.    DEV_NotReady      : exception;
  63.  
  64. type rhInits is record
  65.       Status              : DEV_ReturnCodes;
  66.       reserved            : bytes(6..13);
  67.       NumberUnits         : byte;
  68.       EndAddress          : DW;
  69.       CommandLine         : DW;
  70.       BlockDeviceNumber   : byte;
  71.    end record;
  72.  
  73. type rhIoctlIns is record
  74.       Status              : DEV_ReturnCodes;
  75.       reserved            : bytes(6..13);
  76.       MediaDesc           : byte;
  77.       CBPtr               : DW;
  78.       TransferCount       : W;
  79.       Start               : W;
  80.       VolIdPtr            : DW;
  81.    end record;
  82.  
  83. type rhIoctlOuts is record
  84.       Status              : DEV_ReturnCodes;
  85.       reserved            : bytes(6..13);
  86.       MediaDesc           : byte;
  87.       CBPtr               : DW;
  88.       TransferCount       : W;
  89.       Start               : W;
  90.       VolIdPtr            : DW;
  91.    end record;
  92.  
  93. type rhReadLongs is record
  94.       Status              : DEV_ReturnCodes;
  95.       Reserved            : bytes(6..13);
  96.       AddressMode         : byte;
  97.       DtaPtr              : DW;
  98.       SectorsToRead       : W;
  99.       StartSector         : DW;
  100.       ReadMode            : byte;
  101.       InterleaveSize      : byte;
  102.       InterleaveSkip      : byte;
  103.       filler              : W;        -- ?? MSCDEX V2.21 says length is 29
  104.    end record;
  105.  
  106. type rhSeeks is record
  107.       Status              : DEV_ReturnCodes;
  108.       Reserved            : bytes(6..13);
  109.       AddressMode         : byte;
  110.       DtaPtr              : DW;
  111.       SectorCount         : W;
  112.       StartSector         : DW;
  113.    end record;
  114.  
  115. type rhOthers is record
  116.       Status              : DEV_ReturnCodes;
  117.       filler              : bytes(6..32);
  118.    end record;
  119.  
  120. type rhXs (Command: DEV_CommandCodes:= DeviceReadLong) is
  121.    record
  122.    case Command is
  123.       when DeviceInit             =>  Init    : rhInits;
  124.       when DeviceIoctlInput       =>  IoctlIn : rhIoctlIns;
  125.       when DeviceIoctlOutput      =>  IoctlOut: rhIoctlOuts;
  126.       when DeviceReadLong |
  127.            DeviceReadLongPrefetch =>  ReadLong: rhReadLongs;
  128.       when DeviceSeek             =>  Seek    : rhSeeks;
  129.       when others                 =>  Other   : rhOthers;
  130.    end case;
  131.  
  132.    end record;
  133.  
  134. type rhs is
  135.    record
  136.       Length     : byte;
  137.       SubUnit    : byte;        -- big problem here
  138.       rhX        : rhXs;        -- byte 3 is a constraint flag inserted by ADA
  139.    end record;                  -- byte 4 command
  140.  
  141. subtype pkts is bytes(1..rhs'size/8);
  142.  
  143. CBMax       : constant := 131;      -- max command block size
  144. subtype CBs is bytes(1..CBMax);
  145. type CBAccess is access CBs;
  146.  
  147. function DW_to_CBAccess is new unchecked_conversion(DW, CBAccess);
  148. function CBAccess_to_DW is new unchecked_conversion(CBAccess, DW);
  149. procedure ZapCBs is new unchecked_deallocation(CBs,CBAccess);
  150.  
  151. function Rhs_to_Pkts is new unchecked_conversion(Rhs, Pkts);
  152. function Pkts_to_Rhs is new unchecked_conversion(Pkts, Rhs);
  153.  
  154. subtype IoctlInSubCommand is byte;
  155. type IoctlOutSubCommand is new byte;
  156.  
  157. Ioctl_RetDevHdrAddr  : constant IoctlInSubCommand := 0;
  158. Ioctl_ReadDriveBytes : constant IoctlInSubCommand := 5;
  159. Ioctl_GetCDStatus    : constant IoctlInSubCommand := 6;
  160. Ioctl_RetSectorSize  : constant IoctlInSubCommand := 7;
  161. Ioctl_RetVolSize     : constant IoctlInSubCommand := 8;
  162. Ioctl_MediaChanged   : constant IoctlInSubCommand := 9;
  163.  
  164. type IoCB_RetDevHdrAddrs is
  165.    record
  166.       RDHACode           : IoctlInSubCommand := Ioctl_RetDevHdrAddr;
  167.       DeviceHeaderAddress: DW;
  168.    end record;
  169.  
  170. procedure OpenDevice (DeviceName : string8;
  171.                       Handle     : out integer);
  172.  
  173. procedure CloseDevice (Handle: integer);
  174.  
  175. procedure GetDeviceEntryAddresses (Handle           : integer;
  176.                                    DeviceStrategy   : out system.address;
  177.                                    DeviceInterrupt  : out system.address;
  178.                                    SubUnits         : out byte          );
  179.  
  180. procedure CallDriver (rh             : system.address;
  181.                       DeviceStrategy : system.address;
  182.                       DeviceInterrupt: system.address);
  183.  
  184. end drivers;