[Back to HARDWARE SWAG index] [Back to Main SWAG index] [Original]
{
 > I am trying to issue an SCSI START/StoP Unit via Adaptec's ASPI SCSI
 > manager and an 1542B host adaptor.  This is For an application I am
 > writing in BP.  Adaptec is of no help.  if anyone here has any
 > comments
 > or suggestions please respond in this Forum.
}
Unit Aspi;
{ I/O Error reporting:
  AspiSenseKey is the primary source of error inFormation.
    0:    I/O Complete.
          Warnings (Filemark, Short block, etc) may be posted in Sense.
    1-E:  Error occured.
          Examine SRBStat, HostStat, TargStat, Sense For details.
    F:    Severe error detected, no SCSI info available.
  -------------------------------------------------------------------- }
Interface
Const
  SrbIn = $08;
  SRBOut = $10;
  SRBNone = $18;
  AspiPtr:  Pointer = Nil;
Type
  AspiSrb = Record
    SrbCmd:      Byte;
    SrbStat:     Byte;
    SrbHost:     Byte;
    SrbReqFlags: Byte;
    SrbHdrFill:  LongInt;
    Case Integer of
     2: (Srb2TargetID: Byte;
         Srb2LUN:      Byte;
         Srb2DataLen:  LongInt;
         Srb2SenseLen: Byte;
         Srb2DataPtr:  Pointer;
         Srb2LinkPtr:  Pointer;
         Srb2CDBLen:   Byte;
         Srb2HAStat:   Byte;
         Srb2TargStat: Byte;
         Srb2PostAddr: Pointer;
         Srb2Filler:   Array [1..34] of Byte;
         { Sense data follows CDB }
         Srb2CDB:      Array [0..50] of Byte);
     1: (Srb1TargetID: Byte;
         Srb1LUN:      Byte;
         Srb1DevType:  Byte);
     0: (Srb0Cnt:      Byte;
         Srb0TargetID: Byte;
         Srb0MgrID:    Array [1..16] of Char;
         Srb0HostID:   Array [1..16] of Char;
         Srb0HostParm: Array [1..16] of Char);
    end;
Var
  AspiSRBStat:      Byte;
  AspiHostStat:     Byte;
  AspiTargStat:     Byte;
  AspiSenseKey:     Byte;
  AspiSense:        Array [0..17] of Byte;
  AspiSenseCode:    Word;
Function AspiOpen: Integer;
Procedure AspiCall (Var SRB: AspiSrb);
{ Call ASPI Handler With SRB }
Inline ($FF/$1E/>AspiPtr/
        $58/$58);
Procedure AspiWait (Var SRB: AspiSrb);
Function AspiClose: Integer;
Implementation
Uses Dos;
Procedure AspiWait (Var SRB: AspiSRB);
{ Call ASPI Handler With SRB and wait For Completion }
begin
  if AspiPtr = Nil
    then begin
      AspiSenseKey := $0F;
      Exit;
      end;
  With Srb do begin
    SrbStat := 0;
    AspiCall (Srb);
    While SrbStat = 0 do ;
    AspiSrbStat   := SrbStat;
    AspiHostStat  := Srb2HAStat;
    AspiTargStat  := Srb2TargStat;
    AspiSenseKey  := 0;
    FillChar (AspiSense, Sizeof (AspiSense), #0);
    Move (Srb2CDB [Srb2CDBLen], AspiSense, Sizeof (AspiSense));
    AspiSenseKey := AspiSense[2] and $0F;
    AspiSenseCode := (AspiSense [12] SHL 8) or AspiSense [13];
    end;
  end;
Function AspiOpen: Integer;
Const
  AspiName: Array [1..9] of Char = 'SCSIMGR$'#0;
Var
  R:       Registers;
  AspiHan: Word;
begin
  With R do begin
    { Assume failure }
    AspiOpen := -1;
    AspiPtr := Nil;
    { Open ASPI device driver }
    AX := $3D00;
    DS := Seg (AspiName[1]);
    DX := ofs (AspiName[1]);
    MSDos (R);
    if odd (Flags)
      then Exit;
    AspiHan := AX;
    { Do IOCtl Read to get Pointer to ASPI handler }
    AX := $4402;
    BX := AspiHan;
    CX := 4;
    DS := Seg (AspiPtr);
    DX := ofs (AspiPtr);
    MSDos (R);
    if Odd (flags)
      then Exit;
    { Close device driver }
    AX := $3E00;
    BX := AspiHan;
    MsDos (R);
    if Odd (Flags)
      then Exit;
    end;
  { Indicate success  and Exit }
  AspiOpen := 0;
  end { AspiOpen };
Function AspiClose: Integer;
begin
  AspiClose := 0;
end { AspiClose };
end.
[Back to HARDWARE SWAG index] [Back to Main SWAG index] [Original]