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

  1. --************************************************************************
  2. --
  3. --  DRIVERS.ADB               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 interrupt;
  10. with machine_code;
  11.  
  12. package body Drivers is
  13.  
  14. procedure OpenDevice (DeviceName : string8;
  15.                       Handle     : out integer) is
  16.   use memory, system;
  17.   regs   : interrupt.registers;
  18.   dos_int: constant interrupt.interrupt_range := 16#21#;
  19.   Name   : string(1..9);
  20. begin
  21.   Name(1..8) := DeviceName;
  22.   Name(9)    := ascii.nul;
  23.   regs.ax    := 16#3D00#;
  24.   split ( dos_address => Name'address,
  25.           segment     => memory_segment(regs.DS),
  26.           offset      => segment_offset(regs.DX) );
  27.   interrupt.vector ( on             => dos_int,
  28.                      register_block => regs);
  29.   if regs.carry = 0 then
  30.      handle := regs.ax;
  31.   else
  32.      raise DEV_error;
  33.   end if;
  34. end OpenDevice;
  35.  
  36. procedure CloseDevice (Handle: integer) is
  37.   use system;
  38.   regs   : interrupt.registers;
  39.   dos_int: constant interrupt.interrupt_range := 16#21#;
  40. begin
  41.   regs.ax    := 16#3E00#;
  42.   regs.bx    := Handle;
  43.   interrupt.vector ( on             => dos_int,
  44.                      register_block => regs);
  45. end CloseDevice;
  46.  
  47. procedure GetDeviceEntryAddresses (Handle          : integer;
  48.                                    DeviceStrategy  : out system.address;
  49.                                    DeviceInterrupt : out system.address;
  50.                                    SubUnits        : out byte          )is
  51.  
  52.    -- Get device header address using IOCTL INPUT sub-command 0
  53.    --   Then get strategy and interrupt addresses from header.
  54.  
  55.    use memory, system;
  56.    regs                : interrupt.registers;
  57.    dos_int             : constant interrupt.interrupt_range:= 16#21#;
  58.    DeviceHeaderAddress : system.address;
  59.  
  60.    dta          : IOCB_RetDevHdrAddrs;
  61.    bytes_to_read: constant := 5;
  62.  
  63.    begin
  64.       regs.ax := 16#4402#;
  65.       regs.bx := handle;
  66.       regs.cx := bytes_to_read;
  67.       split (dos_address => dta'address,
  68.              segment     => memory_segment(regs.DS),
  69.              offset      => segment_offset(regs.DX) );
  70.       interrupt.vector (on             => dos_int,
  71.                         register_block => regs);
  72.       DeviceHeaderAddress := DW_to_SA(dta.DeviceHeaderAddress);
  73.  
  74.       if regs.carry = 0 then
  75.          declare
  76.             CdDriver: CdDrivers;                       -- this is why a block
  77.               for CdDriver use at DeviceHeaderAddress; --   is needed
  78.             DeviceHeaderSegment: memory_segment;
  79.             DeviceHeaderOffset : segment_offset;
  80.          begin
  81.             split (dos_address => DeviceHeaderAddress,
  82.                    segment     => DeviceHeaderSegment,
  83.                    offset      => DeviceHeaderOffset);
  84.  
  85.             DeviceStrategy  := make (segment => DeviceHeaderSegment,
  86.                                      offset  => CdDriver.Strategy);
  87.             DeviceInterrupt := make (segment => DeviceHeaderSegment,
  88.                                      offset  => CdDriver.Interrupt);
  89.             SubUnits        := CdDriver.CD_Count;
  90.          end;
  91.       else
  92.          raise DEV_IOCtlError;
  93.       end if;
  94.  
  95. end GetDeviceEntryAddresses;
  96.  
  97. procedure CallDriver (rh             : system.address;
  98.                       DeviceStrategy : system.address;
  99.                       DeviceInterrupt: system.address)is
  100.  
  101.       use machine_code;
  102.    begin
  103.       -- les bx,rh
  104.       inst3'(16#C4#,16#5E#,rh'locoffset);
  105.       -- call strategy
  106.       inst3'(16#FF#,16#5E#,DeviceStrategy'locoffset);
  107.       -- call interrupt
  108.       inst3'(16#FF#,16#5E#,DeviceInterrupt'locoffset);
  109. end CallDriver;
  110.  
  111. pragma inline (CallDriver);
  112.  
  113. end Drivers;