[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]