home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / pascal / vdl020d.zip / VSDLPLOW.DOC < prev    next >
Text File  |  1993-04-14  |  66KB  |  3,136 lines

  1.  
  2.  (*===================  S  D  L  P    L O W   U N I T  =====================
  3.   =                                                                        =
  4.   =  REVISION 2.0                 07/10/92                    J.R. TAYLOR  =
  5.   =                                                                        =
  6.   ==========================================================================
  7.   =                                                                        =
  8.   =  SDLP   Management Library for TP V:4.0, 5.0, 5.5, 6.0                 =
  9.   =                                                                        =
  10.   =  Written By Jonathan Robert Taylor                                     =
  11.   =                                                                        =
  12.   =  This code is the property of Columbia Data Products, Inc.             =
  13.   =  It may be distributed and used outside CDP so long as this header     =
  14.   =  remains intact and unmodified, and as long as it is used with a       =
  15.   =  licensed Standard Device Level Protocol Kernel.                       =
  16.   =                                                                        =
  17.   =  Copyright 1989-1992 Columbia Data Products                            =
  18.   =  ALL RIGHTS RESERVED                                                   =
  19.   =                                                                        =
  20.   ==========================================================================
  21.   =                                                                        =
  22.   =  Revision History        Procedures changed; overall purpose of change.=
  23.   =                          Procedure specific revision notes below.      =
  24.   =                          Reverse chronological order.                  =
  25.   = ---------------------------------------------------------------------- =
  26.   =   date    initials   change description                                =
  27.   = ---------------------------------------------------------------------- =
  28.   =                                                                        =
  29.   = 03-12-93    lpg     Added Source Documentation                         =
  30.   =                                                                        =
  31.   = 03-12-93    lpg     Added: MakeUNum                                    =
  32.   =                                                                        =
  33.   = 07-29-92    jrt     Modified to use either SDLP or SAL, took out       =
  34.   =                     code to use HAC Manager directly, resaved as       =
  35.   =                     VSDLPLOW.                                          =
  36.   =                                                                        =
  37.   = 07-10-92    jrt     Modified to use either SDLP BIOS or Hac Manager    =
  38.   = 07-16-90    jrt     Started                                            =
  39.   =                                                                        =
  40.   ==========================================================================
  41.   =                                                                        =
  42.   =  Caveats                                                               =
  43.   = ---------------------------------------------------------------------- =
  44.   =   date   initals     description                                       =
  45.   = ---------------------------------------------------------------------- =
  46.   =                                                                        =
  47.   = 07-10-92    jrt     Many functions are not yet implemented in HAC      =
  48.   =                     manager mode.                                      =
  49.   =                                                                        =
  50.   =                     Error checking and retries in HM mode are not      =
  51.   =                     fully completed.                                   =
  52.   =                                                                        =
  53.   ==========================================================================
  54.  
  55.  
  56. *)
  57.  
  58.  
  59. Unit VSDLPLOW;
  60.  
  61. {-------------------------------------------------------------------------}
  62. {                       UNIT SDLPLow                                      }
  63. {-------------------------------------------------------------------------}
  64. { PURPOSE: Low-Level SDLP Library.  This unit provides all the low-level  }
  65. { SDLP function calls.  No longer requiring the programmer to keep track  }
  66. { of what to load where, but now simply know the call name and it's few   }
  67. { parameters.                                                             }
  68. { SOURCE : JR Taylor                                                      }
  69. {-------------------------------------------------------------------------}
  70.  
  71. Interface {================================================================}
  72.  
  73. Uses
  74.   VTypes,
  75.   VSal,
  76.   VSalHigh,
  77.   DOS;
  78.  
  79. Const
  80.   SL_UseSDLP     = 1;
  81.   SL_UseSAL      = 16;
  82.  
  83.   { SHOULD HAVE DEVICE TYPE CONSTANTS! }
  84.   { The following are made up because I don't recall the true numbers }
  85.  
  86.   {-----------------------}
  87.   { Device Type Constants }
  88.   {-----------------------}
  89.  
  90.   cDASD       = 0;
  91.   cRemov      = 1;
  92.   cSeq        = 3;
  93.   cCDROM      = 5;
  94.   cPrint      = 8;
  95.   cProc       = 9;
  96.  
  97. (*
  98.   DEV_DASD           = $00;
  99.   DEV_Sequential     = $01;
  100.   DEV_Printer        = $02;
  101.   DEV_Processor      = $03;
  102.   DEV_WORM           = $04;
  103.   DEV_CDROM          = $05;
  104.   DEV_Scanner        = $06;
  105.   DEV_Optical        = $07;
  106.   DEV_Changer        = $08;
  107.   DEV_Comm           = $09;
  108.   DEV_Unknown        = $1F;
  109. *)
  110.  
  111.   {----------------------}
  112.   { Sequential Constants }
  113.   {----------------------}
  114.  
  115.   cBlocks     = 0;
  116.   cFileMarks  = 1;
  117.   cSetMarks   = 3;
  118.  
  119. Type
  120.   Terror      = word;
  121.  
  122. Var
  123.   SDLPMethod     : BYTE;
  124.   SDLPSalHandle  : THandle;
  125.  
  126.  
  127. Function  SDLP_Installed                                         : BOOLEAN;
  128.  
  129. Procedure SDLP_SysIdent(     Var VerNum      : BYTE;
  130.                              Var RamRes      : BOOLEAN;
  131.                              Var NumHAC      : BYTE;
  132.                              Var ErrCode     : BYTE            );
  133.  
  134. Function  SDLP_GetNumHacs                                        : BYTE;
  135.  
  136. Function  MakeUNum(              HAC         : BYTE;
  137.                                  Tgt         : BYTE;
  138.                                  LUN         : BYTE            ) : BYTE;
  139.  
  140. Procedure SDLP_Read(             UNum        : BYTE;
  141.                                  BuffAddr    : Pointer;
  142.                                  BlkCount    : BYTE;
  143.                                  StartSec    : LONGINT;
  144.                              Var ErrCode     : BYTE;
  145.                              Var Residue     : BYTE            );
  146.  
  147. Procedure SDLP_Write(            UNum        : BYTE;
  148.                                  BuffAddr    : Pointer;
  149.                                  BlkCount    : BYTE;
  150.                                  StartSec    : LONGINT;
  151.                              Var ErrCode     : BYTE;
  152.                              Var Residue     : BYTE            );
  153.  
  154. Procedure SDLP_GetDevInfo(       UNum        : BYTE;
  155.                                  GetType     : BOOLEAN;
  156.                                  GetSize     : BOOLEAN;
  157.                              Var NumBlock    : LONGINT;
  158.                              Var BlkSize     : WORD;
  159.                              Var DevType     : BYTE;
  160.                              Var ErrCode     : BYTE            );
  161.  
  162. Procedure SDLP_ReadyUnit(        Unum        : BYTE;
  163.                                  SecsToWait  : BYTE;
  164.                              Var ErrCode     : BYTE            );
  165.  
  166. Procedure SDLP_FormatUnit(       Unum        : BYTE;
  167.                                  InterLv     : BYTE;
  168.                              Var ErrCode     : BYTE            );
  169.  
  170. Procedure SDLP_Rewind(           Unum        : BYTE;
  171.                              Var ErrCode     : BYTE            );
  172.  
  173. Procedure SDLP_Erase(            Unum        : BYTE;
  174.                                  RewFirst    : BOOLEAN;
  175.                              Var ErrCode     : BYTE            );
  176.  
  177. Procedure SDLP_WrFileMark(       Unum        : BYTE;
  178.                                  NumMarks    : BYTE;
  179.                              Var ErrCode     : BYTE;
  180.                              Var Residue     : BYTE            );
  181.  
  182. Procedure SDLP_Space(            Unum        : BYTE;
  183.                                  BlksToSpc   : LONGINT;
  184.                                  SpaceType   : BYTE;
  185.                              Var ErrCode     : BYTE;
  186.                              Var Residue     : BYTE            );
  187.  
  188. Procedure SDLP_LockUnlock(       Unum        : BYTE;
  189.                                  Lock        : BOOLEAN;
  190.                              Var ErrCode     : BYTE            );
  191.  
  192. Procedure SDLP_LoadUnload(       Unum        : BYTE;
  193.                                  Load        : BOOLEAN;
  194.                              Var ErrCode     : BYTE            );
  195.  
  196. Procedure SDLP_Retension(        UNum        : BYTE;
  197.                              Var ErrCode     : BYTE            );
  198.  
  199. Procedure SDLP_SetBlockSize(     Unum        : BYTE;
  200.                                  BlockSize   : WORD;
  201.                              Var ErrCode     : BYTE            );
  202.  
  203. Procedure SDLP_WrSetMark(        Unum        : BYTE;
  204.                                  NumMarks    : BYTE;
  205.                              Var ErrCode     : BYTE;
  206.                              Var Residue     : BYTE            );
  207.  
  208.  
  209. Procedure SDLP_SetSCSIXHac(      HAC         : INTEGER);
  210.  
  211. Procedure SDLP_GetSCSIXHac(  Var Hac         : INTEGER;
  212.                              Var Err         : BYTE            );
  213.  
  214.  
  215.  
  216. Function  OutSCSI(               SUnit       : BYTE;
  217.                                  CDB         : Pointer;
  218.                                  Buff        : Pointer;
  219.                                  CDBLen      : BYTE;
  220.                                  BytesToIO   : LONGINT         ) : WORD;
  221.  
  222.  
  223. Function  InSCSI(                SUnit       : BYTE;
  224.                                  CDB         : Pointer;
  225.                                  Buff        : Pointer;
  226.                                  CDBLen      : BYTE;
  227.                                  BytesToIO   : LONGINT         ) : WORD;
  228.  
  229.  
  230.  
  231. Function  InSCSI_ReqSense(       SUnit       : BYTE;
  232.                                  Buff        : Pointer;
  233.                                  ReqSenseLen : BYTE            ) : WORD;
  234.  
  235.  
  236. Function  GetBus(                SDLPUnit    : BYTE            ) : BYTE;
  237.  
  238. Function  GetTar(                SDLPUnit    : BYTE            ) : BYTE;
  239.  
  240. Function  GetLun(                SDLPUnit    : BYTE            ) : BYTE;
  241.  
  242.  
  243. Implementation {===========================================================}
  244.  
  245.  
  246. Var
  247.   UseSAL      : BOOLEAN;
  248.   ExecSCSIHac : BYTE;
  249.  
  250.  
  251. {────────────────────────────────────────────────────────────────────────────}
  252.  
  253. (*-
  254.  
  255. [FUNCTION]
  256.  
  257. Function  GetBus(                SDLPUnit    : BYTE            ) : BYTE;
  258.  
  259. [PARAMETERS]
  260.  
  261. SDLPUnit    SDLP Unit Number (Contains HAC, TGT, & LUN)
  262.  
  263. [RETURNS]
  264.  
  265. The Host Adapter Channel Portion of the SDLP Unit Number
  266.  
  267. [DESCRIPTION]
  268.  
  269. Extracts the Host Adapter Channel Portion of the SDLP Unit Number.
  270. ("Host Adapter Channel" and "Bus" are considered synonomous here).
  271.  
  272. An SDLP Unit Number is Bitmapped as Follows:
  273.  
  274.     Bits  Name           ( hhtt tlll )
  275.     ----  ----
  276.     7-6   Host Adapter
  277.     5-3   Target ID
  278.     2-0   Logical Unit Number (Generally Zero)
  279.  
  280. [SEE-ALSO]
  281.  
  282. MakeUNum
  283. GetTar
  284. GetLun
  285.  
  286. [EXAMPLE]
  287.  
  288. Uses VGen;
  289.  
  290. VAR
  291.   UNum : BYTE;
  292.  
  293. BEGIN
  294.  
  295.   UNum := BinToByte( '01101011' );
  296.  
  297.   WriteLn( 'The HAC Number in this Unit Number is ', GetBus( UNum ) );
  298.  
  299.   { Displays the Number 1 }
  300.  
  301. END;
  302.  
  303. -*)
  304.  
  305. Function  GetBus(                SDLPUnit    : BYTE            ) : BYTE;
  306.  
  307. BEGIN
  308.  
  309.   GetBus := (SDLPUnit SHR 6) And $3;
  310.  
  311. END;  { GetBus }
  312.  
  313. {────────────────────────────────────────────────────────────────────────────}
  314.  
  315. (*-
  316.  
  317. [FUNCTION]
  318.  
  319. Function  GetTgt(                SDLPUnit    : BYTE            ) : BYTE;
  320.  
  321. [PARAMETERS]
  322.  
  323. SDLPUnit    SDLP Unit Number (Contains HAC, TGT, & LUN)
  324.  
  325. [RETURNS]
  326.  
  327. The Target ID Portion of the SDLP Unit Number
  328.  
  329. [DESCRIPTION]
  330.  
  331. Extracts the Target ID Portion of the SDLP Unit Number.  In General,
  332. this can be consider the Device Number, unless this Device is actually
  333. an adapter to another series of Devices (in which case LUN becomes
  334. valid).
  335.  
  336. An SDLP Unit Number is Bitmapped as Follows:
  337.  
  338.     Bits  Name           ( hhtt tlll )
  339.     ----  ----
  340.     7-6   Host Adapter
  341.     5-3   Target ID
  342.     2-0   Logical Unit Number (Generally Zero)
  343.  
  344. [SEE-ALSO]
  345.  
  346. MakeUNum
  347. GetBus
  348. GetLun
  349.  
  350. [EXAMPLE]
  351.  
  352. Uses VGen;
  353.  
  354. VAR
  355.   UNum : BYTE;
  356.  
  357. BEGIN
  358.  
  359.   UNum := BinToByte( '01101011' );
  360.  
  361.   WriteLn( 'The Target ID Number in this Unit Number is ', GetTgt( UNum ) );
  362.  
  363.   { Displays the Number 5 }
  364.  
  365. END;
  366.  
  367. -*)
  368.  
  369. Function GetTar(                 SDLPUnit    : BYTE            ) : BYTE;
  370.  
  371. BEGIN
  372.  
  373.   GetTar := (SDLPUnit SHR 3) and $07;
  374.  
  375. END;  { GetTgt }
  376.  
  377. {────────────────────────────────────────────────────────────────────────────}
  378.  
  379. (*-
  380.  
  381. [FUNCTION]
  382.  
  383. Function  GetLUN(                SDLPUnit    : BYTE            ) : BYTE;
  384.  
  385. [PARAMETERS]
  386.  
  387. SDLPUnit    SDLP Unit Number (Contains HAC, TGT, & LUN)
  388.  
  389. [RETURNS]
  390.  
  391. The Logical Unit Number (LUN) Portion of the SDLP Unit Number
  392.  
  393. [DESCRIPTION]
  394.  
  395. Extracts the Logical Unit Number (LUN) Portion of the SDLP Unit Number.
  396. In General, the Target ID can be considered the Device Number, unless
  397. this Device is actually an adapter to another series of Devices (which
  398. is when the LUN becomes valid).
  399.  
  400. An SDLP Unit Number is Bitmapped as Follows:
  401.  
  402.     Bits  Name           ( hhtt tlll )
  403.     ----  ----
  404.     7-6   Host Adapter
  405.     5-3   Target ID
  406.     2-0   Logical Unit Number (Generally Zero)
  407.  
  408. [SEE-ALSO]
  409.  
  410. MakeUNum
  411. GetBus
  412. GetTgt
  413.  
  414. [EXAMPLE]
  415.  
  416. Uses VGen;
  417.  
  418. VAR
  419.   UNum : BYTE;
  420.  
  421. BEGIN
  422.  
  423.   UNum := BinToByte( '01101011' );
  424.  
  425.   WriteLn( 'The LUN Number in this Unit Number is ', GetLUN( UNum ) );
  426.  
  427.   { Displays the Number 3 }
  428.  
  429. END;
  430.  
  431. -*)
  432.  
  433. Function GetLun(                 SDLPUnit    : BYTE            ) : BYTE;
  434.  
  435. BEGIN
  436.  
  437.   GetLun := SDLPUnit And $07;
  438.  
  439. END;  { GetLun }
  440.  
  441. {────────────────────────────────────────────────────────────────────────────}
  442.  
  443. Function ErrorConvert(           Err         : TError          ) : WORD;
  444.  
  445. BEGIN
  446.  
  447.   Case Err Of
  448.  
  449.     sSalxsOK : ErrorConvert := 0;
  450.  
  451.     Else       ErrorConvert := 1;
  452.  
  453.   END;  { Case Err }
  454.  
  455. END;  { ErrorConvert }
  456.  
  457.  
  458. {────────────────────────────────────────────────────────────────────────────}
  459.  
  460. (*-
  461.  
  462. [FUNCTION]
  463.  
  464. Procedure SDLP_SysIdent(     Var VerNum      : BYTE;
  465.                              Var RamRes      : BOOLEAN;
  466.                              Var NumHAC      : BYTE;
  467.                              Var ErrCode     : BYTE            );
  468.  
  469. [PARAMETERS]
  470.  
  471. VerNum      VAR Returned SDLP Version Number
  472. RamRes      VAR Returned Is SDLP RAM Resident? (NO=ROM Resident)
  473. NumHAC      VAR Returned Number of Host Adapters Detected
  474. ErrCode     VAR Returned SDLP Error Code
  475.  
  476. [RETURNS]
  477.  
  478. Function : None
  479. (VAR     : [VerNum] SDLP Version Number)
  480. (VAR     : [RamRes] Is SDLP RAM Resident?)
  481. (VAR     : [NumHAC] Number of Host Adapters Detected)
  482. (VAR     : [ErrCode] SDLP Error Code)
  483.  
  484. [DESCRIPTION]
  485.  
  486. Executes an SDLP Initialization command and returns the operation resutls.
  487. The System configuration is returned in the VARs provided by the caller.
  488.  
  489. [SEE-ALSO]
  490.  
  491. SDLP_Installed
  492. SDLP_GetNumHacs
  493.  
  494. [EXAMPLE]
  495.  
  496. Uses VGen;
  497.  
  498. VAR
  499.   RamRes  : BOOLEAN;
  500.   VerNum,
  501.   NumHac,
  502.   ErrCode : BYTE;
  503.  
  504. BEGIN
  505.  
  506.   SDLP_SysIdent( VerNum, RamRes, NumHac, ErrCode );
  507.  
  508.   WriteLn( 'SDLP Version Number      : ', ByteToHex( VerNum ) );
  509.   WriteLn( 'SDLP Ram Resident        : ', RamRes );
  510.   WriteLn( 'Number of HACs on System : ', NumHac );
  511.   WriteLn( 'Operation Error Code     : ', ByteToHex( ErrCode ) );
  512.  
  513. END;
  514.  
  515. -*)
  516.  
  517. Procedure SDLP_SysIdent(     Var VerNum      : BYTE;
  518.                              Var RamRes      : BOOLEAN;
  519.                              Var NumHAC      : BYTE;
  520.                              Var ErrCode     : BYTE            );
  521.  
  522. Var
  523.   R      : REGISTERS;
  524.  
  525. BEGIN
  526.  
  527.   If (UseSAL) Then
  528.   BEGIN
  529.  
  530.     { check if SAL installed }
  531.  
  532.     VerNum  := $20;
  533.     RamRes  := TRUE;
  534.     NumHAC  := 1;
  535.     ErrCode := 0;
  536.  
  537.   END  { If UseSAL }
  538.  
  539.   ELSE
  540.   BEGIN
  541.  
  542.     R.AH:=1;
  543.     R.AL:=0;
  544.     R.SI:=$6A6A;
  545.     Intr($11,R);
  546.  
  547.     VerNum:=R.AH;
  548.  
  549.     If R.AL=0 Then
  550.       RamRes:=TRUE
  551.     ELSE
  552.       RamRes:=FALSE;
  553.  
  554.     NumHAC:=R.CL;
  555.  
  556.     If R.DI=$6A6A Then
  557.       ErrCode:=0
  558.     Else
  559.       ErrCode:=$FF;
  560.  
  561.   END; { If UseSAL / else }
  562.  
  563. END;  { SDLP_SysIdent }
  564.  
  565.  
  566. {────────────────────────────────────────────────────────────────────────────}
  567.  
  568. (*-
  569.  
  570. [FUNCTION]
  571.  
  572. Function  SDLP_GetNumHacs                                        : BYTE;
  573.  
  574. [PARAMETERS]
  575.  
  576. (None)
  577.  
  578. [RETURNS]
  579.  
  580. Number of Host Adapters Detected
  581.  
  582. [DESCRIPTION]
  583.  
  584. Attempts to Detect the Number of Host Adapters Attached tothe System
  585. and returns the results.
  586.  
  587. [SEE-ALSO]
  588.  
  589. SDLP_Installed
  590. SDLP_SysIdent
  591.  
  592. [EXAMPLE]
  593.  
  594. BEGIN
  595.  
  596.   WriteLn( 'Number of Host Adapter Channels on This System is ',
  597.            SDLP_GetNumHacs );
  598.  
  599. END;
  600.  
  601. -*)
  602.  
  603. Function  SDLP_GetNumHacs                                        : BYTE;
  604.  
  605. Var
  606.   VerNum : BYTE;
  607.   RamRes : BOOLEAN;
  608.   NumHaC : BYTE;
  609.   ErrB   : BYTE;
  610.  
  611. BEGIN
  612.  
  613.   SDLP_SysIdent( VerNum, RamRes, NumHac, ErrB );
  614.  
  615.   If ErrB=0 Then
  616.     SDLP_GetNumHacs := NumHac
  617.   Else
  618.     SDLP_GetNumHacs := 0;
  619.  
  620. END;  { SDLP_GetNumHacs }
  621.  
  622.  
  623. {────────────────────────────────────────────────────────────────────────────}
  624.  
  625. (*-
  626.  
  627. [FUNCTION]
  628.  
  629. Function  SDLP_Installed                                         : BOOLEAN;
  630.  
  631. [PARAMETERS]
  632.  
  633. (None)
  634.  
  635. [RETURNS]
  636.  
  637. Whether SDLP is Currently Installed
  638.  
  639. [DESCRIPTION]
  640.  
  641. Checks to see if SDLP is installed or not and returns the results.
  642.  
  643. [SEE-ALSO]
  644.  
  645. SDLP_SysIdent
  646. SDLP_GetNumHacs
  647.  
  648. [EXAMPLE]
  649.  
  650. BEGIN
  651.  
  652.   If SDLP_Installed Then
  653.     WriteLn( 'SDLP is Currently Installed' )
  654.   Else
  655.     WriteLn( 'SDKP is NOT Installed' );
  656.  
  657. END;
  658.  
  659. -*)
  660.  
  661. Function  SDLP_Installed                                         : BOOLEAN;
  662.  
  663.   Function RealSDLPInstalled : BOOLEAN;
  664.  
  665.   Var
  666.     R : REGISTERS;
  667.  
  668.   BEGIN
  669.  
  670.     R.AH:=1;
  671.     R.AL:=0;
  672.     R.SI:=$6A6A;
  673.     Intr($11,R);
  674.  
  675.     IF R.DI=$6A6A Then
  676.       RealSDLPInstalled:=TRUE
  677.  
  678.     Else
  679.       RealSDLPInstalled:=FALSE;
  680.  
  681.   END;  { RealSDLPInstalled }
  682.  
  683. BEGIN  { SDLP_Installed }
  684.  
  685.   Case SDLPMethod Of
  686.  
  687.     SL_UseSDLP:
  688.     BEGIN
  689.  
  690.       If RealSDLPInstalled Then
  691.       BEGIN
  692.  
  693.         UseSAL          := FALSE;
  694.         SDLP_Installed := TRUE;
  695.  
  696.       END  { If RealSDLPInstalled }
  697.  
  698.       ELSE
  699.       BEGIN
  700.  
  701.         UseSAL          := TRUE;
  702.  
  703.         { do we verify installation somehow? }
  704.  
  705.       END;  { If RealSDLPInstalled / Else }
  706.  
  707.     END; { Case SL_UseSDLP }
  708.  
  709.     {-------------------------}
  710.  
  711.     SL_UseSAL:
  712.     BEGIN
  713.  
  714.       UseSAL         := TRUE;
  715.       SDLP_Installed := TRUE; { What to do here?  }
  716.  
  717.     END;  { Case SL_UseSAL }
  718.  
  719.   Else
  720.  
  721.     { unkown SDLP method }
  722.  
  723.     SDLP_Installed := False;
  724.  
  725.   END;  { Case SDLPMethod }
  726.  
  727. END;  { SDLP_Installed }
  728.  
  729.  
  730. {────────────────────────────────────────────────────────────────────────────}
  731.  
  732. (*-
  733.  
  734. [FUNCTION]
  735.  
  736. Function  MakeUNum(              HAC         : BYTE;
  737.                                  Tgt         : BYTE;
  738.                                  LUN         : BYTE            ) : BYTE;
  739.  
  740. [PARAMETERS]
  741.  
  742. HAC         Host Adapter Bus
  743. Tgt         Device Target ID
  744. LUN         Logical Unit Number (usually Zero)
  745.  
  746. [RETURNS]
  747.  
  748. Created New SDLP Unit Number
  749.  
  750. [DESCRIPTION]
  751.  
  752. Creates a New SDLP Unit Number from the Provided Data.
  753.  
  754. [SEE-ALSO]
  755.  
  756. GetBus
  757. GetTgt
  758. GetLun
  759.  
  760. [EXAMPLE]
  761.  
  762. VAR
  763.   Buff : ARRAY[1..2048] of BYTE;
  764.   Err,
  765.   Res  : BYTE;
  766.  
  767. BEGIN
  768.  
  769.   SDLP_Read( MakeUNum( 1, 3, 0 ),
  770.              Addr( Buff ),
  771.              4,
  772.              0,
  773.              Err,
  774.              Res );
  775.  
  776.   { Reads from Device at HAC 1, Target ID 3, LUN 0 }
  777.  
  778. END;
  779.  
  780. -*)
  781.  
  782. Function  MakeUNum(              HAC         : BYTE;
  783.                                  Tgt         : BYTE;
  784.                                  LUN         : BYTE            ) : BYTE;
  785. BEGIN
  786.  
  787.   MakeUNum := (HAC AND $03 SHL 6) OR
  788.               (Tgt AND $07 SHL 3) OR
  789.               (LUN AND $07);
  790.  
  791. END;  { MakeUNum }
  792.  
  793.  
  794. {────────────────────────────────────────────────────────────────────────────}
  795.  
  796. (*-
  797.  
  798. [FUNCTION]
  799.  
  800. Procedure SDLP_Read(             UNum        : BYTE;
  801.                                  BuffAddr    : Pointer;
  802.                                  BlkCount    : BYTE;
  803.                                  StartSec    : LONGINT;
  804.                              Var ErrCode     : BYTE;
  805.                              Var Residue     : BYTE            );
  806.  
  807. [PARAMETERS]
  808.  
  809. UNum        SDLP Unit Number
  810. BuffAddr    Pointer to Data Buffer
  811. BlkCount    Number of Blocks to Read
  812. StartSec    Block Number to Start Read from
  813. ErrCode     VAR Returned SDLP Error Code
  814. Residue     VAR Returned Number of Blocks Unread
  815.  
  816. [RETURNS]
  817.  
  818. Function : None
  819. (VAR     : [ErrCode] SDLP Error Code)
  820. (VAR     : [Residue] Number of Blocks Unread)
  821.  
  822. [DESCRIPTION]
  823.  
  824. Executes an SDLP Read block command and returns the operation results.
  825.  
  826. Supported Device Types:
  827.        DASD
  828.        Removable DASD
  829.        Sequential
  830.        CDROM
  831.  
  832. [SEE-ALSO]
  833.  
  834. SDLP_Write
  835. SDLP_GetDevInfo
  836. SDLP_ReadyUnit
  837. SDLP_FormatUnit
  838. SDLP_LockUnlock
  839.  
  840. [EXAMPLE]
  841.  
  842. VAR
  843.   Buff : ARRAY[1..2048] of BYTE
  844.   Err,
  845.   Res  : BYTE;
  846.  
  847. BEGIN
  848.  
  849.   SDLP_Read( MakeUNum( 0, 5, 0 ),
  850.              Addr( Buff ),
  851.              2,
  852.              8,
  853.              Err,
  854.              Res );
  855.  
  856.   { Reads 2 Blocks Starting at Block 8 from Target ID 5 }
  857.  
  858. END;
  859.  
  860. -*)
  861.  
  862. Procedure SDLP_Read(             UNum        : BYTE;
  863.                                  BuffAddr    : Pointer;
  864.                                  BlkCount    : BYTE;
  865.                                  StartSec    : LONGINT;
  866.                              Var ErrCode     : BYTE;
  867.                              Var Residue     : BYTE            );
  868. Var
  869.   Err : TError;
  870.   R   : REGISTERS;
  871.  
  872. BEGIN
  873.  
  874.   If UseSAL Then
  875.   BEGIN
  876.  
  877.     Err := SAL_S2DasdRead( SDLPSalHandle,
  878.                            GetBus( UNum ),
  879.                            GetTar( UNum ),
  880.                            GetLun( UNum ),
  881.                            0,
  882.                            StartSec,
  883.                            BlkCount,
  884.                            BuffAddr,
  885.                            0,
  886.                            NIL                );
  887.  
  888.     If Err <> sSalxsOK Then
  889.     BEGIN
  890.  
  891.       Err := SAL_S2DasdRead( SDLPSalHandle,
  892.                              GetBus( UNum ),
  893.                              GetTar( UNum ),
  894.                              GetLun( UNum ),
  895.                              0,
  896.                              StartSec,
  897.                              BlkCount,
  898.                              BuffAddr,
  899.                              0,
  900.                              NIL                );
  901.     END;  { If Err }
  902.  
  903.     If Err <> sSalxsOK Then
  904.     BEGIN
  905.  
  906.       Err := SAL_S2DasdRead( SDLPSalHandle,
  907.                              GetBus( UNum ),
  908.                              GetTar( UNum ),
  909.                              GetLun( UNum ),
  910.                              0,
  911.                              StartSec,
  912.                              BlkCount,
  913.                              BuffAddr,
  914.                              0,
  915.                              NIL                );
  916.     END;  { If Err }
  917.  
  918.     ErrCode := ErrorConvert( Err );
  919.  
  920.   END  { If UseSAL }
  921.  
  922.   ELSE
  923.   BEGIN
  924.  
  925.     R.AH:=2;
  926.     R.AL:=Unum;
  927.  
  928.     R.ES:=Seg(BuffAddr^);
  929.     R.BX:=Ofs(BuffAddr^);
  930.  
  931.     R.CL:=BlkCount;
  932.  
  933.     R.CH:=StartSec DIV 65536;
  934.     R.DX:=StartSec MOD 65536;
  935.  
  936.     R.SI:=$6A6A;
  937.  
  938.     Intr($11,R);
  939.  
  940.     If Odd(R.FLAGS) Then
  941.     BEGIN
  942.  
  943.       ErrCode:=R.AL;
  944.       Residue:=R.CL;
  945.  
  946.     END  { If Odd }
  947.  
  948.     ELSE
  949.     BEGIN
  950.  
  951.       ErrCode:=0;
  952.       Residue:=0;
  953.  
  954.     END;  { If Odd / Else }
  955.  
  956.   END; { If UseSAL / Else }
  957.  
  958. END;  { SDLP_Read }
  959.  
  960.  
  961. {────────────────────────────────────────────────────────────────────────────}
  962.  
  963. (*-
  964.  
  965. [FUNCTION]
  966.  
  967. Procedure SDLP_Write(            UNum        : BYTE;
  968.                                  BuffAddr    : Pointer;
  969.                                  BlkCount    : BYTE;
  970.                                  StartSec    : LONGINT;
  971.                              Var ErrCode     : BYTE;
  972.                              Var Residue     : BYTE            );
  973.  
  974. [PARAMETERS]
  975.  
  976. Unum        SDLP Unit Number
  977. BuffAddr    Pointer to Data Buffer
  978. BlkCount    Number of Blocks to Write
  979. StartSec    Starting Block Number
  980. ErrCode     VAR Returned SDLP Error Code
  981. Residue     VAR Returned Number of Blocks Unwritten
  982.  
  983. [RETURNS]
  984.  
  985. (None)
  986.  
  987. [DESCRIPTION]
  988.  
  989. Executes an SDLP Write command and returns the operation results.
  990.  
  991. Supported Device Types:
  992.        DASD
  993.        Removable DASD
  994.        Sequential
  995.  
  996. [SEE-ALSO]
  997.  
  998. SDLP_Read
  999. SDLP_GetDevInfo
  1000. SDLP_ReadyUnit
  1001. SDLP_FormatUnit
  1002. SDLP_LockUnlock
  1003.  
  1004. [EXAMPLE]
  1005.  
  1006. VAR
  1007.   Buff : ARRAY[1..2048] of BYTE;
  1008.   Err,
  1009.   Res  : BYTE;
  1010.  
  1011. BEGIN
  1012.  
  1013.   SDLP_Write( MakeUNum( 0, 4, 0 ),
  1014.               Addr( Buff ),
  1015.               2,
  1016.               4,
  1017.               Err,
  1018.               Res );
  1019.  
  1020.   { Writes 2 Blocks starting at Block 4 to Target ID 4 }
  1021.  
  1022. END;
  1023.  
  1024. -*)
  1025.  
  1026. Procedure SDLP_Write(            UNum        : BYTE;
  1027.                                  BuffAddr    : Pointer;
  1028.                                  BlkCount    : BYTE;
  1029.                                  StartSec    : LONGINT;
  1030.                              Var ErrCode     : BYTE;
  1031.                              Var Residue     : BYTE            );
  1032. Var
  1033.   Err : TError;
  1034.   R   : REGISTERS;
  1035.  
  1036. BEGIN
  1037.  
  1038.   If UseSAL Then
  1039.   BEGIN
  1040.  
  1041.     Err := SAL_S2DasdWrite( SDLPSalHandle,
  1042.                             GetBus( UNum ),
  1043.                             GetTar( UNum ),
  1044.                             GetLun( UNum ),
  1045.                             0,
  1046.                             StartSec,
  1047.                             BlkCount,
  1048.                             BuffAddr,
  1049.                             0,
  1050.                             NIL                );
  1051.  
  1052.     If Err <> sSalxsOK Then
  1053.     BEGIN
  1054.  
  1055.       Err := SAL_S2DasdWrite( SDLPSalHandle,
  1056.                               GetBus( UNum ),
  1057.                               GetTar( UNum ),
  1058.                               GetLun( UNum ),
  1059.                               0,
  1060.                               StartSec,
  1061.                               BlkCount,
  1062.                               BuffAddr,
  1063.                               0,
  1064.                               NIL                );
  1065.     END;  { If Err }
  1066.  
  1067.     If Err <> sSalxsOK Then
  1068.     BEGIN
  1069.  
  1070.       Err := SAL_S2DasdWrite( SDLPSalHandle,
  1071.                               GetBus( UNum ),
  1072.                               GetTar( UNum ),
  1073.                               GetLun( UNum ),
  1074.                               0,
  1075.                               StartSec,
  1076.                               BlkCount,
  1077.                               BuffAddr,
  1078.                               0,
  1079.                               NIL                );
  1080.     END;  { If Err }
  1081.  
  1082.     ErrCode := ErrorConvert( Err );
  1083.  
  1084.   END  { If UseSAL }
  1085.  
  1086.   ELSE
  1087.   BEGIN
  1088.  
  1089.     R.AH:=3;
  1090.     R.AL:=Unum;
  1091.  
  1092.     R.ES:=Seg(BuffAddr^);
  1093.     R.BX:=Ofs(BuffAddr^);
  1094.  
  1095.     R.CL:=BlkCount;
  1096.  
  1097.     R.CH:=StartSec DIV 65536;
  1098.     R.DX:=StartSec MOD 65536;
  1099.  
  1100.     R.SI:=$6A6A;
  1101.  
  1102.     Intr($11,R);
  1103.  
  1104.     If Odd(R.FLAGS) Then
  1105.     BEGIN
  1106.  
  1107.       ErrCode:=R.AL;
  1108.       Residue:=R.CL;
  1109.  
  1110.     END  { If Odd }
  1111.  
  1112.     ELSE
  1113.     BEGIN
  1114.  
  1115.       ErrCode:=0;
  1116.       Residue:=0;
  1117.  
  1118.     END;  { If Odd / Else }
  1119.  
  1120.   END; { If UseSAL / Else }
  1121.  
  1122. END;  { SDLP_Write }
  1123.  
  1124.  
  1125.  
  1126. {────────────────────────────────────────────────────────────────────────────}
  1127.  
  1128. (*-
  1129.  
  1130. [FUNCTION]
  1131.  
  1132. Procedure SDLP_GetDevInfo(       UNum        : BYTE;
  1133.                                  GetType     : BOOLEAN;
  1134.                                  GetSize     : BOOLEAN;
  1135.                              Var NumBlock    : LONGINT;
  1136.                              Var BlkSize     : WORD;
  1137.                              Var DevType     : BYTE;
  1138.                              Var ErrCode     : BYTE            );
  1139. [PARAMETERS]
  1140.  
  1141. UNum        SDLP Unit Number
  1142. GetType     Whether to Return the Device Type
  1143. GetSize     Whether to Return the Device Block Size & Count
  1144. NumBlock    VAR Returned Number of Blocks
  1145. BlkSize     VAR Returned Block Size
  1146. DevType     VAR Returned Device Type
  1147. ErrCode     VAR Returned SDLP Error Code
  1148.  
  1149. [RETURNS]
  1150.  
  1151. Function : None
  1152. (VAR     : [NumBlock] Number of Blocks)
  1153. (VAR     : [BlkSize] Block Size)
  1154. (VAR     : [DevType] Device Type)
  1155. (VAR     : [ErrCode] SDLP Error Code)
  1156.  
  1157. [DESCRIPTION]
  1158.  
  1159. Executes an SDLP Get Device Size/Type command returning the operation
  1160. results.  All data is returned in the VARs provided by caller.
  1161.  
  1162. Supported Device Types:
  1163.        DASD
  1164.        Removable DASD
  1165.        Sequential
  1166.        CDROM
  1167.  
  1168. [SEE-ALSO]
  1169.  
  1170. SDLP_Read
  1171. SDLP_Write
  1172. SDLP_ReadyUnit
  1173. SDLP_FormatUnit
  1174. SDLP_LockUnlock
  1175.  
  1176. [EXAMPLE]
  1177.  
  1178. VAR
  1179.   Blocks : LONGINT;
  1180.   BSize  : WORD;
  1181.   DType,
  1182.   Err    : BYTE;
  1183.  
  1184. BEGIN
  1185.  
  1186.   SDLP_GetDevInfo( MakeUNum( 0, 2, 0 ),
  1187.                    TRUE,
  1188.                    TRUE,
  1189.                    Blocks,
  1190.                    BSize,
  1191.                    DType,
  1192.                    Err     );
  1193.  
  1194.   WriteLn( 'Number of Blocks : ', Blocks );
  1195.   WriteLn( 'Block Size       : ', BSize  );
  1196.   Write  ( 'Device Type Code : ' );
  1197.   CASE DType OF
  1198.     cDASD  : WriteLn( 'DASD' );
  1199.     cRemov : WriteLn( 'Removable DASD' );
  1200.     cSeq   : WriteLn( 'Sequential (Tape)' );
  1201.     cCDROM : WriteLn( 'CD-ROM' );
  1202.     cPrint : WriteLn( 'Printer' );
  1203.     cProc  : WriteLn( 'Processor' );
  1204.     Else WriteLn( 'UnKnown Type' );
  1205.   END;  { Case DType }
  1206.  
  1207.   WriteLn( 'Error Code       : ', Err    );
  1208.  
  1209.   { Reads Device Information from the Device at Tgt ID 2 }
  1210.  
  1211. END;
  1212.  
  1213. -*)
  1214.  
  1215. Procedure SDLP_GetDevInfo(       UNum        : BYTE;
  1216.                                  GetType     : BOOLEAN;
  1217.                                  GetSize     : BOOLEAN;
  1218.                              Var NumBlock    : LONGINT;
  1219.                              Var BlkSize     : WORD;
  1220.                              Var DevType     : BYTE;
  1221.                              Var ErrCode     : BYTE            );
  1222. Var
  1223.   Err       : TError;
  1224.   Inq       : TInquiry;
  1225.   Try       : BYTE;
  1226.   LBA       : LONGINT;
  1227.   BlockSize : LONGINT;
  1228.   R         : REGISTERS;
  1229.  
  1230. BEGIN
  1231.  
  1232.   If UseSal Then
  1233.   BEGIN
  1234.  
  1235.     ErrCode := 0;
  1236.  
  1237.     If GetType Then
  1238.     BEGIN
  1239.  
  1240.       {-----------------------------}
  1241.       { Get the inquiry data, retry }
  1242.       { up to 3 times.              }
  1243.       {-----------------------------}
  1244.  
  1245.       Try := 0;
  1246.  
  1247.       Repeat
  1248.  
  1249.         Err := SAL_S2Inquiry( SDLPSalHandle,
  1250.                               GetBus( UNum ),
  1251.                               GetTar( UNum ),
  1252.                               GetLun( UNum ),
  1253.                               0,
  1254.                               0,
  1255.                               36,
  1256.                               @Inq,
  1257.                               0,
  1258.                               NIL              );
  1259.  
  1260.         Inc( Try );
  1261.  
  1262.       Until ( Err = sSalxsOK ) or ( Try=3 );
  1263.  
  1264.       ErrCode := ErrorConvert( Err );
  1265.  
  1266.       {----------------------------------}
  1267.       { If everything is ok, we pull the }
  1268.       { type out of the inquiry data.    }
  1269.       { otherwise we return an error.    }
  1270.       {----------------------------------}
  1271.  
  1272.       If Err = sSalxsOK Then
  1273.       BEGIN
  1274.  
  1275.  
  1276.         If (Inq.DevType AND $E0)=0  Then
  1277.         BEGIN
  1278.  
  1279.           Case Inq.DevType Of
  1280.  
  1281.             0  : DevType := Inq.DevType or (Inq.DevModifier AND INQ_Removable);
  1282.             7  : DevType := 0;
  1283.  
  1284.           Else
  1285.  
  1286.             DevType := Inq.DevType;
  1287.  
  1288.           END; { Case Inq.DevType }
  1289.  
  1290.         END  { If Inq.DevType }
  1291.  
  1292.         ELSE
  1293.         BEGIN
  1294.  
  1295.           {qualifier says no lun here }
  1296.  
  1297.           ErrCode := 1;
  1298.  
  1299.         END;  { If Inq.DevType }
  1300.  
  1301.       END  { If no error on inquiry }
  1302.  
  1303.       ELSE
  1304.       BEGIN  { If No Error on Inquiry / Else }
  1305.  
  1306.  
  1307.       END; { If Inq.DevType / Else }
  1308.  
  1309.     END; { If GetType }
  1310.  
  1311.     If (GetSize) and (ErrCode=0)  Then
  1312.     BEGIN
  1313.  
  1314.       {-------------------------}
  1315.       { Read the capacity data. }
  1316.       { retry up to 3 times.    }
  1317.       {-------------------------}
  1318.  
  1319.       Try := 0;
  1320.  
  1321.       Repeat
  1322.  
  1323.         Err := SAL_S2DasdReadCapacity( SDLPSalHandle,
  1324.                                        GetBus( UNum ),
  1325.                                        GetTar( UNum ),
  1326.                                        GetLun( UNum ),
  1327.                                        0,
  1328.                                        0,
  1329.                                        NIL,
  1330.                                        LBA,
  1331.                                        BlockSize           );
  1332.  
  1333.         Inc( Try );
  1334.  
  1335.       Until ( Err = sSALxsOK ) or ( Try=3 );
  1336.  
  1337.       ErrCode := ErrorConvert( Err );
  1338.  
  1339.       {--------------------------}
  1340.       { Did we read the capacity }
  1341.       { data properly?           }
  1342.       {--------------------------}
  1343.  
  1344.       If Err = sSALxsOK Then
  1345.       BEGIN
  1346.  
  1347.         NumBlock := LBA;
  1348.         BlkSize  := BlockSize;
  1349.  
  1350.         ErrCode  := 0;
  1351.  
  1352.       END  { If Err }
  1353.  
  1354.       ELSE
  1355.       BEGIN
  1356.  
  1357.         ErrCode := ErrorConvert( Err );
  1358.  
  1359.       END; { If No error on read cap / else }
  1360.  
  1361.     END; { If GetSize }
  1362.  
  1363.   END   { If UseSAL }
  1364.  
  1365.   ELSE
  1366.   BEGIN
  1367.  
  1368.     R.AH:=5;
  1369.     R.AL:=UNum;
  1370.  
  1371.     If GetType Then
  1372.     BEGIN
  1373.       If GetSize Then
  1374.  
  1375.         R.BL:=0
  1376.  
  1377.       ELSE
  1378.         R.BL:=1;
  1379.  
  1380.     END  { If GetType }
  1381.  
  1382.     ELSE
  1383.       R.BL:=2;
  1384.  
  1385.     R.SI:=$6A6A;
  1386.  
  1387.     Intr($11,R);
  1388.  
  1389.     If NOT Odd( R.FLAGS ) Then
  1390.       ErrCode := 0
  1391.  
  1392.     Else
  1393.       ErrCode := R.AL;
  1394.  
  1395.     NumBlock:=(R.CH*65536)+R.DX;
  1396.     BlkSize:=R.AX;
  1397.     DevType:=R.BL;
  1398.  
  1399.   END; { If UseSAL / else }
  1400.  
  1401. END;  { SDLP_GetDevInfo }
  1402.  
  1403. {────────────────────────────────────────────────────────────────────────────}
  1404.  
  1405. (*-
  1406.  
  1407. [FUNCTION]
  1408.  
  1409. Procedure SDLP_ReadyUnit(        Unum        : BYTE;
  1410.                                  SecsToWait  : BYTE;
  1411.                              Var ErrCode     : BYTE            );
  1412.  
  1413. [PARAMETERS]
  1414.  
  1415. UNum        SDLP Unit Number
  1416. SecToWait   Seconds to Retry for if "Not Ready"
  1417. ErrCode     VAR Returned SDLP Error Code
  1418.  
  1419. [RETURNS]
  1420.  
  1421. Function : None
  1422. (VAR     : [ErrCode] SDLP Error Code)
  1423.  
  1424. [DESCRIPTION]
  1425.  
  1426. Executes an SDLP Ready Unit command an returns the operation resutls.
  1427. It should be noted that I have not seen the "SecToWait" ever used by
  1428. the SDLP function and am not sure that it is supported any more.
  1429.  
  1430. Supported Device Types:
  1431.        DASD
  1432.        Removable DASD
  1433.        Sequential
  1434.        CDROM
  1435.  
  1436. [SEE-ALSO]
  1437.  
  1438. SDLP_Read
  1439. SDLP_Write
  1440. SDLP_GetDevInfo
  1441. SDLP_FormatUnit
  1442. SDLP_LockUnlock
  1443.  
  1444. [EXAMPLE]
  1445.  
  1446. VAR
  1447.   Err : BYTE;
  1448.  
  1449. BEGIN
  1450.  
  1451.   SDLP_ReadyUnit( MakeUNum( 0, 0, 0, ),
  1452.                   5,
  1453.                   Err );
  1454.  
  1455.   { If Not Ready, Waits at most 5 Seconds before returning Error Code }
  1456.  
  1457. END;
  1458.  
  1459. -*)
  1460.  
  1461. Procedure SDLP_ReadyUnit(        Unum        : BYTE;
  1462.                                  SecsToWait  : BYTE;
  1463.                              Var ErrCode     : BYTE            );
  1464.  
  1465.  
  1466. Var
  1467.  
  1468.   Try   : BYTE;
  1469.   Err   : TError;
  1470.   R     : REGISTERS;
  1471.  
  1472. BEGIN
  1473.  
  1474.   If UseSAL Then
  1475.   BEGIN
  1476.  
  1477.     Try := 0;
  1478.  
  1479.     Repeat
  1480.  
  1481.       Err := SAL_S2TestUnitReady( SDLPSalHandle,
  1482.                                   GetBus( UNum ),
  1483.                                   GetTar( UNum ),
  1484.                                   GetLun( UNum ),
  1485.                                   0,
  1486.                                   0,
  1487.                                   NIL                    );
  1488.  
  1489.  
  1490.       Inc( Try );
  1491.  
  1492.  
  1493.       If (Err<>sSALxsOK) and (Try<=SecsToWait) Then
  1494.         {Delay(1000)};
  1495.  
  1496.     Until ( Try>SecsToWait ) or (Err = sSALxsOK);
  1497.  
  1498.     ErrCode := ErrorConvert( Err );
  1499.  
  1500.   END   { If UseSAL }
  1501.  
  1502.   ELSE
  1503.   BEGIN
  1504.  
  1505.     R.AH:=6;
  1506.     R.AL:=Unum;
  1507.     R.BL:=SecsToWait;
  1508.  
  1509.     Intr($11,R);
  1510.  
  1511.     If Odd(R.FLAGS) Then
  1512.       ErrCode:=R.AL
  1513.  
  1514.     ELSE
  1515.       ErrCode:=0;
  1516.  
  1517.  
  1518.   END; { If UseSAL / Else }
  1519.  
  1520. END;  { SDLP_ReadyUnit }
  1521.  
  1522. {────────────────────────────────────────────────────────────────────────────}
  1523.  
  1524. (*-
  1525.  
  1526. [FUNCTION]
  1527.  
  1528. Procedure SDLP_FormatUnit(       Unum        : BYTE;
  1529.                                  InterLv     : BYTE;
  1530.                              Var ErrCode     : BYTE            );
  1531.  
  1532. [PARAMETERS]
  1533.  
  1534. UNum        SDLP Unit Number
  1535. InterLv     Desired Interleave (0=default)
  1536. ErrCode     VAR Returned SDLP Error Code
  1537.  
  1538. [RETURNS]
  1539.  
  1540. Function : None
  1541. (VAR     : [ErrCode] SDLP Error Code)
  1542.  
  1543. [DESCRIPTION]
  1544.  
  1545. Executes an SDLP Format Unit command and returns the operation results.
  1546.  
  1547. Supported Device Types:
  1548.        DASD
  1549.        Removable DASD
  1550.  
  1551. [SEE-ALSO]
  1552.  
  1553. SDLP_Read
  1554. SDLP_Write
  1555. SDLP_GetDevInfo
  1556. SDLP_ReadyUnit
  1557. SDLP_LockUnlock
  1558.  
  1559. [EXAMPLE]
  1560.  
  1561. VAR
  1562.   Err : BYTE;
  1563.  
  1564. BEGIN
  1565.  
  1566.   SDLP_Format( MakeUNum( 0, 1, 0 ),
  1567.                1,
  1568.                Err );
  1569.  
  1570.   { Formats the Device at Target ID 1 with an Interleave of 1 }
  1571.  
  1572. END;
  1573.  
  1574. -*)
  1575.  
  1576. Procedure SDLP_FormatUnit(       Unum        : BYTE;
  1577.                                  InterLv     : BYTE;
  1578.                              Var ErrCode     : BYTE            );
  1579.  
  1580. Var
  1581.   R : REGISTERS;
  1582.  
  1583. BEGIN
  1584.  
  1585.   If UseSAL Then
  1586.   BEGIN
  1587.  
  1588.   END  { If UseSAL }
  1589.  
  1590.   ELSE
  1591.   BEGIN
  1592.  
  1593.     R.AH:=7;
  1594.     R.AL:=Unum;
  1595.     R.CL:=InterLv;
  1596.     R.SI:=$6A6A;
  1597.  
  1598.     Intr($11,R);
  1599.  
  1600.     If Odd(R.FLAGS) Then
  1601.       ErrCode:=R.AL
  1602.  
  1603.     ELSE
  1604.       ErrCode:=0;
  1605.  
  1606.   END; { if UseSAL / else }
  1607.  
  1608. END;  { SDLP_FormatUnit }
  1609.  
  1610. {────────────────────────────────────────────────────────────────────────────}
  1611.  
  1612. (*-
  1613.  
  1614. [FUNCTION]
  1615.  
  1616. Procedure SDLP_Rewind(           Unum        : BYTE;
  1617.                              Var ErrCode     : BYTE            );
  1618.  
  1619. [PARAMETERS]
  1620.  
  1621. UNum        SDLP Unit Number
  1622. ErrCode     VAR Returned SDLP Error Code
  1623.  
  1624. [RETURNS]
  1625.  
  1626. Function : None
  1627. (VAR     : [ErrCode] SDLP Error Code)
  1628.  
  1629. [DESCRIPTION]
  1630.  
  1631. Executes an SDLP Rewind Media command and returns the operation results.
  1632.  
  1633. Supported Device Types:
  1634.        Sequential
  1635.  
  1636. [SEE-ALSO]
  1637.  
  1638. SDLP_Read
  1639. SDLP_Write
  1640. SDLP_GetDevInfo
  1641. SDLP_ReadyUnit
  1642. SDLP_Erase
  1643. SDLP_WrFileMark
  1644. SDLP_Space
  1645. SDLP_LoadUnload
  1646. SDLP_Retension
  1647. SDLP_SetBlockSize
  1648. SDLP_WrSetMark
  1649.  
  1650. [EXAMPLE]
  1651.  
  1652. VAR
  1653.   Err : BYTE;
  1654.  
  1655. BEGIN
  1656.  
  1657.   SDLP_Rewind( MakeUNum( 0, 2, 0 ),
  1658.                Err );
  1659.  
  1660.   { Rewinds the Device at Target ID 2 }
  1661.  
  1662. END;
  1663.  
  1664. -*)
  1665.  
  1666. Procedure SDLP_Rewind(           Unum        : BYTE;
  1667.                              Var ErrCode     : BYTE            );
  1668.  
  1669. Var
  1670.   R : REGISTERS;
  1671.  
  1672. BEGIN
  1673.  
  1674.   If UseSAL Then
  1675.   BEGIN
  1676.  
  1677.     ErrCode := 1;
  1678.  
  1679.   END  { If UseSAL }
  1680.  
  1681.   ELSE
  1682.   BEGIN
  1683.  
  1684.     R.AH:=9;
  1685.     R.AL:=Unum;
  1686.     R.SI:=$6A6A;
  1687.  
  1688.     Intr($11,R);
  1689.  
  1690.     If Odd(R.FLAGS) Then
  1691.       ErrCode:=R.AL
  1692.  
  1693.     ELSE
  1694.       ErrCode:=0;
  1695.  
  1696.   END;  { If UseSAL / Else }
  1697.  
  1698. END;  { SDLP_Rewind }
  1699.  
  1700.  
  1701. {────────────────────────────────────────────────────────────────────────────}
  1702.  
  1703. (*-
  1704.  
  1705. [FUNCTION]
  1706.  
  1707. Procedure SDLP_Erase(            Unum        : BYTE;
  1708.                                  RewFirst    : BOOLEAN;
  1709.                              Var ErrCode     : BYTE            );
  1710.  
  1711. [PARAMETERS]
  1712.  
  1713. UNum        SDLP Unit Number
  1714. RewFirst    Whether to Rewind First? (NO=Start from Current Position)
  1715. ErrCode     VAR Returned SDLP Error Code
  1716.  
  1717. [RETURNS]
  1718.  
  1719. Function : None
  1720. (VAR     : [ErrCode] SDLP Error Code);
  1721.  
  1722. [DESCRIPTION]
  1723.  
  1724. Executes an SDLP Erase Media command and returns the operation results.
  1725.  
  1726. Supported Device Types:
  1727.        Sequential
  1728.  
  1729. [SEE-ALSO]
  1730.  
  1731. SDLP_Read
  1732. SDLP_Write
  1733. SDLP_GetDevInfo
  1734. SDLP_ReadyUnit
  1735. SDLP_Rewind
  1736. SDLP_WrFileMark
  1737. SDLP_Space
  1738. SDLP_LoadUnload
  1739. SDLP_Retension
  1740. SDLP_SetBlockSize
  1741. SDLP_WrSetMark
  1742.  
  1743. [EXAMPLE]
  1744.  
  1745. VAR
  1746.   Err : BYTE;
  1747.  
  1748. BEGIN
  1749.  
  1750.   SDLP_Erase( MakeUNum( 0, 2, 0 ),
  1751.               TRUE,
  1752.               Err   );
  1753.  
  1754.   { Rewinds the Tape and Erases the Entire Media in the device }
  1755.  
  1756. END;
  1757.  
  1758. -*)
  1759.  
  1760. Procedure SDLP_Erase(            Unum        : BYTE;
  1761.                                  RewFirst    : BOOLEAN;
  1762.                              Var ErrCode     : BYTE            );
  1763.  
  1764. Var
  1765.   R : REGISTERS;
  1766.  
  1767. BEGIN
  1768.  
  1769.   If UseSAL Then
  1770.   BEGIN
  1771.  
  1772.     ErrCode := 1;
  1773.  
  1774.   END  { If UseSAL }
  1775.  
  1776.   ELSE
  1777.   BEGIN
  1778.  
  1779.     R.AH:=$A;
  1780.     R.AL:=Unum;
  1781.  
  1782.     If RewFirst Then
  1783.       R.CL:=0
  1784.  
  1785.     Else
  1786.       R.CL:=1;
  1787.  
  1788.     R.SI:=$6A6A;
  1789.  
  1790.     Intr($11,R);
  1791.  
  1792.     If Odd(R.FLAGS) Then
  1793.       ErrCode:=R.AL
  1794.  
  1795.     ELSE
  1796.       ErrCode:=0;
  1797.  
  1798.   END; { If UseSAL / ELSE }
  1799.  
  1800. END;  { SDLP_Erase }
  1801.  
  1802.  
  1803. {────────────────────────────────────────────────────────────────────────────}
  1804.  
  1805. (*-
  1806.  
  1807. [FUNCTION]
  1808.  
  1809. Procedure SDLP_WrFileMark(       Unum        : BYTE;
  1810.                                  NumMarks    : BYTE;
  1811.                              Var ErrCode     : BYTE;
  1812.                              Var Residue     : BYTE            );
  1813.  
  1814. [PARAMETERS]
  1815.  
  1816. UNum        SDLP Unit Number
  1817. NumMarks    Number of Filemarks to Write
  1818. ErrCode     VAR Returned SDLP Error Code
  1819. Residue     VAR Returned Number of Unwritten Filemarks
  1820.  
  1821. [RETURNS]
  1822.  
  1823. Function : None
  1824. (VAR     : [ErrCode] SDLP Error Code)
  1825. (VAR     : [Residue] Number of Unwritten Filemarks)
  1826.  
  1827. [DESCRIPTION]
  1828.  
  1829. Executes an SDLP Write Filemark command and returns the operation error
  1830. code.
  1831.  
  1832. Supported Device Types:
  1833.        Sequential
  1834.  
  1835. [SEE-ALSO]
  1836.  
  1837. SDLP_Read
  1838. SDLP_Write
  1839. SDLP_GetDevInfo
  1840. SDLP_ReadyUnit
  1841. SDLP_Rewind
  1842. SDLP_Erase
  1843. SDLP_Space
  1844. SDLP_LoadUnload
  1845. SDLP_Retension
  1846. SDLP_SetBlockSize
  1847. SDLP_WrSetMark
  1848.  
  1849. [EXAMPLE]
  1850.  
  1851. VAR
  1852.   Err,
  1853.   Res : BYTE;
  1854.  
  1855. BEGIN
  1856.  
  1857.   SDLP_WrFileMark( MakeUNum( 0, 2, 0 ),
  1858.                    3,
  1859.                    Err,
  1860.                    Res  );
  1861.  
  1862.   { Attempts the Write 3 Filemarks to the Tape in the Device }
  1863.  
  1864. END;
  1865.  
  1866. -*)
  1867.  
  1868. Procedure SDLP_WrFileMark(       Unum        : BYTE;
  1869.                                  NumMarks    : BYTE;
  1870.                              Var ErrCode     : BYTE;
  1871.                              Var Residue     : BYTE            );
  1872. Var
  1873.   R : REGISTERS;
  1874.  
  1875. BEGIN
  1876.  
  1877.   If UseSAL Then
  1878.   BEGIN
  1879.  
  1880.     ErrCode := 1;
  1881.  
  1882.   END  { If UseSAL }
  1883.  
  1884.   ELSE
  1885.   BEGIN
  1886.  
  1887.     R.AH:=$B;
  1888.     R.AL:=Unum;
  1889.     R.CL:=NumMarks;
  1890.     R.SI:=$6A6A;
  1891.  
  1892.     Intr($11,R);
  1893.  
  1894.     If Odd(R.FLAGS) Then
  1895.     BEGIN
  1896.  
  1897.       ErrCode:=R.AL;
  1898.       Residue:=R.CL;
  1899.  
  1900.     END  { If Odd }
  1901.  
  1902.     ELSE
  1903.     BEGIN
  1904.  
  1905.       ErrCode:=0;
  1906.       Residue:=0;
  1907.  
  1908.     END;  { If Odd / Else }
  1909.  
  1910.   END; { If UseSAL / Else }
  1911.  
  1912. END;  { SDLP_WrSetMark }
  1913.  
  1914.  
  1915. {────────────────────────────────────────────────────────────────────────────}
  1916.  
  1917. (*-
  1918.  
  1919. [FUNCTION]
  1920.  
  1921. Procedure SDLP_Space(            Unum        : BYTE;
  1922.                                  BlksToSpc   : LONGINT;
  1923.                                  SpaceType   : BYTE;
  1924.                              Var ErrCode     : BYTE;
  1925.                              Var Residue     : BYTE            );
  1926.  
  1927. [PARAMETERS]
  1928.  
  1929. UNum        SDLP Unit Number
  1930. BlksToSpc   Number of Items to Space
  1931. SpaceType   Type of Space Item (0=Blocks,1=Filemarks,3=Set Marks)
  1932. ErrCode     VAR Returned SDLP Error Code
  1933. Residue     VAR Returned Number of Spaced Items not Executed
  1934.  
  1935. [RETURNS]
  1936.  
  1937. Function : None
  1938. (VAR     : [ErrCode] SDLP Error Code)
  1939. (VAR     : [Residue] Number of Spaced Items not Executed)
  1940.  
  1941. [DESCRIPTION]
  1942.  
  1943. Executes an SDLP Space command using the given type of space, and
  1944. returns the operation error code.
  1945.  
  1946. Supported Device Types:
  1947.        Sequential
  1948.  
  1949. [SEE-ALSO]
  1950.  
  1951. SDLP_Read
  1952. SDLP_Write
  1953. SDLP_GetDevInfo
  1954. SDLP_ReadyUnit
  1955. SDLP_Rewind
  1956. SDLP_Erase
  1957. SDLP_WrFileMark
  1958. SDLP_LoadUnload
  1959. SDLP_Retension
  1960. SDLP_SetBlockSize
  1961. SDLP_WrSetMark
  1962.  
  1963. [EXAMPLE]
  1964.  
  1965. VAR
  1966.   Err,
  1967.   Res : BYTE;
  1968.  
  1969. BEGIN
  1970.  
  1971.   SDLP_Space( MakeUNum( 0, 2, 0 ), 12, 0, Err, Res );
  1972.   { Attempts to Space 12 Blocks from Current Position }
  1973.  
  1974.   SDLP_Space( MakeUNum( 0, 2, 0 ),  6, 1, Err, Res );
  1975.   { Attempts to Space 6 Filemarks from Current Position }
  1976.  
  1977.   SDLP_Space( MakeUNum( 0, 2, 0 ),  4, 3, Err, Res );
  1978.   { Attempts to Space 4 Set Marks from Current Position }
  1979.  
  1980. END;
  1981.  
  1982. -*)
  1983.  
  1984. Procedure SDLP_Space(            Unum        : BYTE;
  1985.                                  BlksToSpc   : LONGINT;
  1986.                                  SpaceType   : BYTE;
  1987.                              Var ErrCode     : BYTE;
  1988.                              Var Residue     : BYTE            );
  1989.  
  1990. Var
  1991.   R : REGISTERS;
  1992.  
  1993. BEGIN
  1994.  
  1995.   If UseSAL Then
  1996.   BEGIN
  1997.  
  1998.     ErrCode := 1;
  1999.  
  2000.   END  { If UseSAL }
  2001.  
  2002.   ELSE
  2003.   BEGIN
  2004.  
  2005.     R.AH:=$C;
  2006.     R.AL:=Unum;
  2007.     R.CH:=BlksToSpc DIV 65536;
  2008.     R.DX:=BlksToSpc MOD 65536;
  2009.     R.CL:=SpaceType;
  2010.     R.SI:=$6A6A;
  2011.  
  2012.     Intr($11,R);
  2013.  
  2014.     If Odd(R.FLAGS) Then
  2015.     BEGIN
  2016.  
  2017.       ErrCode:=R.AL;
  2018.       Residue:=R.CL;
  2019.  
  2020.     END  { If Odd }
  2021.  
  2022.     ELSE
  2023.     BEGIN
  2024.  
  2025.       ErrCode:=0;
  2026.       Residue:=0;
  2027.  
  2028.     END;  { If Odd / Else }
  2029.  
  2030.   END;  { If UseSAL / Else }
  2031.  
  2032. END;  { SDLP_Space }
  2033.  
  2034.  
  2035. {────────────────────────────────────────────────────────────────────────────}
  2036.  
  2037. (*-
  2038.  
  2039. [FUNCTION]
  2040.  
  2041. Procedure SDLP_LockUnlock(       Unum        : BYTE;
  2042.                                  Lock        : BOOLEAN;
  2043.                              Var ErrCode     : BYTE            );
  2044.  
  2045. [PARAMETERS]
  2046.  
  2047. UNum        SDLP Unit Number
  2048. Lock        Whether to Lock the Unit (NO=Unlock)
  2049. ErrCode     VAR Returned SDLP Error Code
  2050.  
  2051. [RETURNS]
  2052.  
  2053. Function : None
  2054. (VAR     : [ErrCode] SDLP Error Code)
  2055.  
  2056. [DESCRIPTION]
  2057.  
  2058. Executes an SDLP Lock/Unlock Media command and returns the operation
  2059. error code.
  2060.  
  2061. Supported Device Types:
  2062.        Removable DASD
  2063.        Sequential
  2064.  
  2065. [SEE-ALSO]
  2066.  
  2067. SDLP_Read
  2068. SDLP_Write
  2069. SDLP_GetDevInfo
  2070. SDLP_ReadyUnit
  2071. SDLP_FormatUnit
  2072.  
  2073. [EXAMPLE]
  2074.  
  2075. VAR
  2076.   Err : BYTE;
  2077.  
  2078. BEGIN
  2079.  
  2080.   SDLP_LockUnlock( MakeUNum( 0, 1, 0 ),
  2081.                    TRUE,
  2082.                    Err   );
  2083.  
  2084.   {----------------------------------------------------}
  2085.   { Device at Target ID 1 should now be Locked.        }
  2086.   { If Removable DASD or Tape, attempts to Eject Media }
  2087.   { will fail.                                         }
  2088.   {----------------------------------------------------}
  2089.  
  2090. END;
  2091.  
  2092. -*)
  2093.  
  2094. Procedure SDLP_LockUnlock(       Unum        : BYTE;
  2095.                                  Lock        : BOOLEAN;
  2096.                              Var ErrCode     : BYTE            );
  2097.  
  2098. Var
  2099.  
  2100.   R    : REGISTERS;
  2101.   Err  : TError;
  2102.   Try  : BYTE;
  2103.  
  2104.  
  2105. BEGIN
  2106.  
  2107.   If UseSAL Then
  2108.   BEGIN
  2109.  
  2110.     { issue test unit readys??? }
  2111.  
  2112.     Try := 0;
  2113.  
  2114.     Repeat
  2115.  
  2116.       If Lock Then
  2117.         Err := SAL_S2DasdLockMedia( SDLPSalHandle,
  2118.                                     GetBus( UNum ),
  2119.                                     GetTar( UNum ),
  2120.                                     GetLun( UNum ),
  2121.                                     0,
  2122.                                     0,
  2123.                                     NIL              )
  2124.       Else
  2125.         Err := SAL_S2DasdUnLockMedia( SDLPSalHandle,
  2126.                                       GetBus( UNum ),
  2127.                                       GetTar( UNum ),
  2128.                                       GetLun( UNum ),
  2129.                                       0,
  2130.                                       0,
  2131.                                       NIL              );
  2132.  
  2133.       Inc( Try );
  2134.  
  2135.     Until (Try=3) or (Err=sSALxsOK);
  2136.  
  2137.     ErrCode := ErrorConvert( Err );
  2138.  
  2139.   END  { If UseSAL }
  2140.  
  2141.   ELSE
  2142.   BEGIN
  2143.  
  2144.     R.AH:=$D;
  2145.     R.AL:=Unum;
  2146.  
  2147.     If Lock Then
  2148.       R.CL:=1
  2149.  
  2150.     Else
  2151.       R.CL:=0;
  2152.  
  2153.     R.SI:=$6A6A;
  2154.  
  2155.     Intr($11,R);
  2156.  
  2157.     If Odd(R.FLAGS) Then
  2158.       ErrCode:=R.AL
  2159.  
  2160.     ELSE
  2161.       ErrCode:=0;
  2162.  
  2163.   END;  { If UseSAL / Else }
  2164.  
  2165. END;  { SDLP_LockUnlock }
  2166.  
  2167.  
  2168. {────────────────────────────────────────────────────────────────────────────}
  2169.  
  2170. (*-
  2171.  
  2172. [FUNCTION]
  2173.  
  2174. Procedure SDLP_LoadUnload(       Unum        : BYTE;
  2175.                                  Load        : BOOLEAN;
  2176.                              Var ErrCode     : BYTE            );
  2177.  
  2178. [PARAMETERS]
  2179.  
  2180. UNum        SDLP Unit Number
  2181. Load        Whether operation is a Load (NO=Unload)
  2182. ErrCode     VAR Returned SDLP Error Code
  2183.  
  2184. [RETURNS]
  2185.  
  2186. Function : None
  2187. (VAR     : [ErrCode] SDLP Error Code)
  2188.  
  2189. [DESCRIPTION]
  2190.  
  2191. Executes an SDLP Load/Unload Media command and returns the operation
  2192. error code.
  2193.  
  2194. Supported Device Types:
  2195.        Removable DASD
  2196.        Sequential
  2197.        CDROM
  2198.  
  2199. [SEE-ALSO]
  2200.  
  2201. SDLP_Read
  2202. SDLP_Write
  2203. SDLP_GetDevInfo
  2204. SDLP_ReadyUnit
  2205. SDLP_Rewind
  2206. SDLP_Erase
  2207. SDLP_WrFileMark
  2208. SDLP_Space
  2209. SDLP_Retension
  2210. SDLP_SetBlockSize
  2211. SDLP_WrSetMark
  2212.  
  2213. [EXAMPLE]
  2214.  
  2215. VAR
  2216.   Err : BYTE;
  2217.  
  2218. BEGIN
  2219.  
  2220.   WriteLn( 'Please Insert Cartridge in Drive Tgt 1' );
  2221.   WriteLn( 'and Press <ENTER> to Load...' );
  2222.  
  2223.   While ReadKey <> #13 Do;
  2224.  
  2225.   SDLP_Load( MakeUNum( 0, 1, 0 ),
  2226.              TRUE,
  2227.              Err   );
  2228.  
  2229.   WriteLn( 'Press <ENTER> to Eject Cartridge in Drive Tgt 1' );
  2230.  
  2231.   While ReadKey <> #13 Do;
  2232.  
  2233.   SDLP_Load( MakeUNum( 0, 1, 0 ),
  2234.              FALSE,
  2235.              Err    );
  2236.  
  2237.   WriteLn( 'Done' );
  2238.  
  2239. END;
  2240.  
  2241. -*)
  2242.  
  2243. Procedure SDLP_LoadUnload(       Unum        : BYTE;
  2244.                                  Load        : BOOLEAN;
  2245.                              Var ErrCode     : BYTE            );
  2246.  
  2247. Var
  2248.   R : REGISTERS;
  2249.  
  2250. BEGIN
  2251.  
  2252.   If UseSAL Then
  2253.   BEGIN
  2254.  
  2255.     ErrCode := 1;
  2256.  
  2257.   END  { If UseSAL }
  2258.  
  2259.   ELSE
  2260.   BEGIN
  2261.  
  2262.     R.AH:=$E;
  2263.     R.AL:=Unum;
  2264.  
  2265.     If Load Then
  2266.       R.CL:=1
  2267.  
  2268.     Else
  2269.       R.CL:=0;
  2270.  
  2271.     R.SI:=$6A6A;
  2272.  
  2273.     Intr($11,R);
  2274.  
  2275.     If Odd(R.FLAGS) Then
  2276.       ErrCode:=R.AL
  2277.  
  2278.     ELSE
  2279.       ErrCode:=0;
  2280.  
  2281.   END;  { If UseSAL / Else }
  2282.  
  2283. END;  { SDLP_LoadUnload }
  2284.  
  2285.  
  2286. {────────────────────────────────────────────────────────────────────────────}
  2287.  
  2288. (*-
  2289.  
  2290. [FUNCTION]
  2291.  
  2292. Procedure SDLP_Retension(        Unum        : BYTE;
  2293.                              Var ErrCode     : BYTE            );
  2294.  
  2295. [PARAMETERS]
  2296.  
  2297. UNum        SDLP Unit Number
  2298. ErrCode     VAR Returned SDLP Error Code
  2299.  
  2300. [RETURNS]
  2301.  
  2302. Function : None
  2303. (VAR     : [ErrCode] SDLP Error Code)
  2304.  
  2305. [DESCRIPTION]
  2306.  
  2307. Executes an SDLP Retension Media command on the selected device and
  2308. return the operation error code.
  2309.  
  2310. NOTE: Re-Tension as in "to redo the tape tension" as opposed to
  2311. "to retain" - if you are having trouble with this, it may not be
  2312. advisable to fool around with this.
  2313.  
  2314. Supported Device Types:
  2315.        Sequential
  2316.  
  2317. [SEE-ALSO]
  2318.  
  2319. SDLP_Read
  2320. SDLP_Write
  2321. SDLP_GetDevInfo
  2322. SDLP_ReadyUnit
  2323. SDLP_Rewind
  2324. SDLP_Erase
  2325. SDLP_WrFileMark
  2326. SDLP_Space
  2327. SDLP_LoadUnload
  2328. SDLP_SetBlockSize
  2329. SDLP_WrSetMark
  2330.  
  2331. [EXAMPLE]
  2332.  
  2333. VAR
  2334.   Err : BYTE;
  2335.  
  2336. BEGIN
  2337.  
  2338.   SDLP_Retension( MakeUNum( 0, 2, 0 ),
  2339.                   Err );
  2340.  
  2341.   { Tape in Device at Target ID 2 has been Retensioned }
  2342.  
  2343. END;
  2344.  
  2345. -*)
  2346.  
  2347. Procedure SDLP_Retension(        Unum        : BYTE;
  2348.                              Var ErrCode     : BYTE            );
  2349. Var
  2350.   R : REGISTERS;
  2351.  
  2352. BEGIN
  2353.  
  2354.   If UseSAL Then
  2355.   BEGIN
  2356.  
  2357.     ErrCode := 1;
  2358.  
  2359.   END  { If UseSAL }
  2360.  
  2361.   ELSE
  2362.   BEGIN
  2363.  
  2364.     R.AH:=$E;
  2365.     R.AL:=Unum;
  2366.  
  2367.     R.CL:=3;
  2368.  
  2369.     R.SI:=$6A6A;
  2370.  
  2371.     Intr($11,R);
  2372.  
  2373.     If Odd(R.FLAGS) Then
  2374.       ErrCode:=R.AL
  2375.  
  2376.     ELSE
  2377.       ErrCode:=0;
  2378.  
  2379.   END;  { If UseSAL / Else }
  2380.  
  2381. END;  { SDLP_Retension }
  2382.  
  2383.  
  2384. {────────────────────────────────────────────────────────────────────────────}
  2385.  
  2386. (*-
  2387.  
  2388. [FUNCTION]
  2389.  
  2390. Procedure SDLP_SetBlockSize(     Unum        : BYTE;
  2391.                                  BlockSize   : WORD;
  2392.                              Var ErrCode     : BYTE            );
  2393.  
  2394. [PARAMETERS]
  2395.  
  2396. UNum        SDLP Unit Number
  2397. BlockSize   Desired Block Size
  2398. ErrCode     VAR Returned SDLP Error Code
  2399.  
  2400. [RETURNS]
  2401.  
  2402. Function : None
  2403. (VAR     : [ErrCode] SDLP Error Code)
  2404.  
  2405. [DESCRIPTION]
  2406.  
  2407. Executes an SDLP SetBlockSize command and returns the operation results.
  2408. BlockSizes are Generally Binary Powers of 512 (ie. 512, 1024, 2048, 4096,
  2409. 8192, 16384, and 32768).
  2410.  
  2411. Supported Device Types:
  2412.        Sequential
  2413.  
  2414. [SEE-ALSO]
  2415.  
  2416. SDLP_Read
  2417. SDLP_Write
  2418. SDLP_GetDevInfo
  2419. SDLP_ReadyUnit
  2420. SDLP_Rewind
  2421. SDLP_Erase
  2422. SDLP_WrFileMark
  2423. SDLP_Space
  2424. SDLP_LoadUnload
  2425. SDLP_Retension
  2426. SDLP_WrSetMark
  2427.  
  2428. [EXAMPLE]
  2429.  
  2430. VAR
  2431.   Err : BYTE;
  2432.   i   : INTEGER;
  2433.  
  2434. BEGIN
  2435.  
  2436.   For i := 6 DownTo 0 Do
  2437.   BEGIN
  2438.  
  2439.     SDLP_SetBlockSize( MakeUNum( 0, 2, 0 ),
  2440.                        512 SHL i,
  2441.                        Err         );
  2442.  
  2443.     WriteLn( 'Set Block Size to ',512 SHL i:5,', Error Code was ', Err );
  2444.  
  2445.   END; { For i }
  2446.  
  2447.   { Attempts Different Block Sizes and Reports the Results }
  2448.  
  2449. END;
  2450.  
  2451. -*)
  2452.  
  2453. Procedure SDLP_SetBlockSize(     Unum        : BYTE;
  2454.                                  BlockSize   : WORD;
  2455.                              Var ErrCode     : BYTE            );
  2456.  
  2457. Var
  2458.   R : REGISTERS;
  2459.  
  2460. BEGIN
  2461.  
  2462.   If UseSAL Then
  2463.   BEGIN
  2464.  
  2465.     ErrCode := 1;
  2466.  
  2467.   END  { If UseSAL }
  2468.  
  2469.   ELSE
  2470.   BEGIN
  2471.  
  2472.     R.AH:=$10;
  2473.     R.AL:=Unum;
  2474.     R.BX:=BlockSize;
  2475.     R.SI:=$6A6A;
  2476.  
  2477.     Intr($11,R);
  2478.  
  2479.     If Odd(R.FLAGS) Then
  2480.       ErrCode:=R.AL
  2481.  
  2482.     ELSE
  2483.       ErrCode:=0;
  2484.  
  2485.   END; { If UseSAL / Else }
  2486.  
  2487. END;  { SDLP_SetBlockSize }
  2488.  
  2489.  
  2490. {────────────────────────────────────────────────────────────────────────────}
  2491.  
  2492. (*-
  2493.  
  2494. [FUNCTION]
  2495.  
  2496. Procedure SDLP_WrSetMark(       Unum        : BYTE;
  2497.                                 NumMarks    : BYTE;
  2498.                             Var ErrCode     : BYTE;
  2499.                             Var Residue     : BYTE            );
  2500.  
  2501. [PARAMETERS]
  2502.  
  2503. UNum        SDLP Unit Number
  2504. NumMarks    Number of Set Marks to Write
  2505. ErrCode     VAR Returned SDLP Error Code
  2506. Residue     VAR Returned Number of Unwritten Set Marks
  2507.  
  2508. [RETURNS]
  2509.  
  2510. Function : None
  2511. (VAR     : [ErrCode] SDLP Error Code)
  2512. (VAR     : [Residue] Number of Unwritten Set Marks)
  2513.  
  2514. [DESCRIPTION]
  2515.  
  2516. Executes a Write Set Mark command on the unit selected and returns the
  2517. operation results.
  2518.  
  2519. Supported Device Types:
  2520.        Sequential
  2521.  
  2522. [SEE-ALSO]
  2523.  
  2524. SDLP_Read
  2525. SDLP_Write
  2526. SDLP_GetDevInfo
  2527. SDLP_ReadyUnit
  2528. SDLP_Rewind
  2529. SDLP_Erase
  2530. SDLP_WrFileMark
  2531. SDLP_Space
  2532. SDLP_LoadUnload
  2533. SDLP_Retension
  2534. SDLP_SetBlockSize
  2535.  
  2536. [EXAMPLE]
  2537.  
  2538. VAR
  2539.   Err,
  2540.   Res : BYTE;
  2541.  
  2542. BEGIN
  2543.  
  2544.   SDLP_WrSetMark( MakeUNum( 0, 2, 0 ),
  2545.                   4,
  2546.                   Err,
  2547.                   Res   );
  2548.  
  2549.   { Attempts to Write 4 Set Marks on Media in Device at Target ID 2 }
  2550.  
  2551. END;
  2552.  
  2553. -*)
  2554.  
  2555. Procedure SDLP_WrSetMark(       Unum        : BYTE;
  2556.                                 NumMarks    : BYTE;
  2557.                             Var ErrCode     : BYTE;
  2558.                             Var Residue     : BYTE            );
  2559. Var
  2560.   R : REGISTERS;
  2561.  
  2562. BEGIN
  2563.  
  2564.   If UseSAL Then
  2565.   BEGIN
  2566.  
  2567.     ErrCode := 1;
  2568.  
  2569.   END  { If UseSAL }
  2570.  
  2571.   ELSE
  2572.   BEGIN
  2573.  
  2574.     R.AH:=$11;
  2575.     R.AL:=Unum;
  2576.     R.CL:=NumMarks;
  2577.     R.SI:=$6A6A;
  2578.  
  2579.     Intr($11,R);
  2580.  
  2581.     If Odd(R.FLAGS) Then
  2582.     BEGIN
  2583.  
  2584.       ErrCode:=R.AL;
  2585.       Residue:=R.CL;
  2586.  
  2587.     END  { If Odd }
  2588.  
  2589.     ELSE
  2590.     BEGIN
  2591.  
  2592.       ErrCode:=0;
  2593.       Residue:=0;
  2594.  
  2595.     END;  { If Odd / Else }
  2596.  
  2597.   END; { If UseSAL / Else }
  2598.  
  2599. END;  { SDLP_WrSetMark }
  2600.  
  2601.  
  2602. {────────────────────────────────────────────────────────────────────────────}
  2603.  
  2604. (*-
  2605.  
  2606. [FUNCTION]
  2607.  
  2608. Procedure SDLP_SetSCSIXHac( HAC : INTEGER );
  2609.  
  2610. [PARAMETERS]
  2611.  
  2612. HAC         Desired Host Adapter Number
  2613.  
  2614. [RETURNS]
  2615.  
  2616. (None)
  2617.  
  2618. [DESCRIPTION]
  2619.  
  2620. Changes the active Host adapter channnel to the one selected.  All IO
  2621. now goest thru this channel.  (NOTE: for compatibility, all HACs must
  2622. be returned to Zero (0) after use)
  2623.  
  2624. [SEE-ALSO]
  2625.  
  2626. SDLP_GetSCSIXHac
  2627.  
  2628. [EXAMPLE]
  2629.  
  2630. VAR
  2631.   HAC,
  2632.   Err : BYTE;
  2633.  
  2634. BEGIN
  2635.  
  2636.   SDLP_SetSCSIXHac( 1 );
  2637.  
  2638.   SDLP_GetSCSIXHac( HAC, Err );
  2639.   WriteLn( 'The Current Active HAC is ',HAC )
  2640.  
  2641.   SDLP_SetSCSIXHac( 0 );
  2642.  
  2643.   SDLP_GetSCSIXHac( HAC, Err );
  2644.   WriteLn( 'The Current Active HAC is ',HAC )
  2645.  
  2646. END;
  2647.  
  2648. -*)
  2649.  
  2650. Procedure SDLP_SetSCSIXHac( HAC : INTEGER );
  2651.  
  2652. Var
  2653.   R : REGISTERS;
  2654.  
  2655. BEGIN
  2656.  
  2657.   If UseSAL Then
  2658.   BEGIN
  2659.  
  2660.     ExecSCSIHac := HAC;
  2661.  
  2662.   END  { If UseSAL }
  2663.  
  2664.   ELSE
  2665.   BEGIN
  2666.  
  2667.     R.AH:=$FE;
  2668.     R.AL:=HAC;
  2669.     R.CL:=1;
  2670.     R.SI:=$6A6A;
  2671.     Intr($11,R);
  2672.  
  2673.   END; { IF UseSAL / Else }
  2674.  
  2675. END;  { SDLP_SetSCSIXHac }
  2676.  
  2677.  
  2678. {────────────────────────────────────────────────────────────────────────────}
  2679.  
  2680. (*-
  2681.  
  2682. [FUNCTION]
  2683.  
  2684. Procedure SDLP_GetSCSIXHac(  Var Hac         : INTEGER;
  2685.                              Var Err         : BYTE            );
  2686.  
  2687. [PARAMETERS]
  2688.  
  2689. HAC         VAR Returned Current HAC
  2690. Err         VAR Returned Error Code
  2691.  
  2692. [RETURNS]
  2693.  
  2694. Function : None
  2695. (VAR     : [HAC] Current HAC)
  2696. (VAR     : [Err] Error Code)
  2697.  
  2698. [DESCRIPTION]
  2699.  
  2700. Returns the currently active Host adapter channnel number.
  2701.  
  2702. [SEE-ALSO]
  2703.  
  2704. SDLP_SetSCSIXHac
  2705.  
  2706. [EXAMPLE]
  2707.  
  2708. VAR
  2709.   HAC,
  2710.   Err : BYTE;
  2711.  
  2712. BEGIN
  2713.  
  2714.   SDLP_GetSCSIXHac( HAC, Err );
  2715.  
  2716.   If Err = 0 Then
  2717.     WriteLn( 'The Current Active HAC is ',HAC )
  2718.   Else
  2719.     WriteLn( 'Error Occured' );
  2720.  
  2721. END;
  2722.  
  2723. -*)
  2724.  
  2725. Procedure SDLP_GetSCSIXHac(  Var Hac         : INTEGER;
  2726.                              Var Err         : BYTE            );
  2727.  
  2728. Var
  2729.   R : REGISTERS;
  2730.  
  2731. BEGIN
  2732.  
  2733.   If UseSAL Then
  2734.   BEGIN
  2735.  
  2736.     Hac      := ExecSCSIHac;
  2737.     Err      := 0;
  2738.  
  2739.   END  { If UseSAL }
  2740.  
  2741.   ELSE
  2742.   BEGIN
  2743.  
  2744.     R.AH:=$FE;
  2745.     R.CL:=$0;
  2746.     R.SI:=$6A6A;
  2747.  
  2748.     Intr($11,R);
  2749.  
  2750.     If Odd(R.FLAGS) Then
  2751.     BEGIN
  2752.  
  2753.       Err:=R.AL;
  2754.  
  2755.     END  { If Odd }
  2756.  
  2757.     ELSE
  2758.     BEGIN
  2759.  
  2760.       Err:=0;
  2761.       Hac:=R.AL;
  2762.  
  2763.     END;  { If Odd / Else }
  2764.  
  2765.   END; { If UseSAL / else }
  2766.  
  2767. END;  { SDLP_GetSCSIXHac }
  2768.  
  2769.  
  2770. {────────────────────────────────────────────────────────────────────────────}
  2771.  
  2772. (*-
  2773.  
  2774. [FUNCTION]
  2775.  
  2776. Function OutSCSI(                SUnit       : BYTE;
  2777.                                  CDB         : Pointer;
  2778.                                  Buff        : Pointer;
  2779.                                  CDBLen      : BYTE;
  2780.                                  BytesToIO   : LONGINT         ):WORD;
  2781.  
  2782. [PARAMETERS]
  2783.  
  2784. SUnit       SCSI Unit Number
  2785. CDB         Pointer to CDB Data
  2786. Buff        Pointer to Data Buffer
  2787. CDBLen      CDB Length in Bytes
  2788. BytesToIO   Data Buffer Length in Bytes
  2789.  
  2790. [RETURNS]
  2791.  
  2792. SCSI Execution Error Code ($0000 = No Error)
  2793.                           ($xx.. = HAC Error Code)
  2794.                           ($..xx = Device Error Code)
  2795.  
  2796. [DESCRIPTION]
  2797.  
  2798. This executes a SDLP Passthru Write to the selected device using the
  2799. provided CDB and Data.
  2800.  
  2801. This SCSI Operation is an OutFlow (Write) Operation.  All Buffer data
  2802. is going out from the Caller rather than InFlowing to the Caller.
  2803.  
  2804. Supported Device Types:
  2805.        ALL!
  2806.  
  2807. [SEE-ALSO]
  2808.  
  2809. InSCSI
  2810. InSCSI_ReqSense
  2811.  
  2812. [EXAMPLE]
  2813.  
  2814. VAR
  2815.   CDB  : ARRAY[0..5] of BYTE;
  2816.   Buff : ARRAY[1..512] of BYTE;
  2817.   Err  : WORD;
  2818.  
  2819. BEGIN
  2820.  
  2821.   FillChar( CDB, SizeOf( CDB ), 0 );
  2822.   CDB[0] := $28;  { Write }
  2823.   CDB[3] :=   5;  { Block }
  2824.   CDB[4] :=   1;  { Count }
  2825.  
  2826.   Err := OutSCSI( MakeUNum( 0, 0, 0 ),
  2827.                   Addr( CDB ),
  2828.                   Addr( Buff ),
  2829.                   6,
  2830.                   512  );
  2831.  
  2832.   {-----------------------------------------------------------}
  2833.   { Command to Write 1 Block of 512 bytes starting at Block 5 }
  2834.   { on the Device at Target ID 0                              }
  2835.   {-----------------------------------------------------------}
  2836.  
  2837. END;
  2838.  
  2839. -*)
  2840.  
  2841. Function OutSCSI(                SUnit       : BYTE;
  2842.                                  CDB         : Pointer;
  2843.                                  Buff        : Pointer;
  2844.                                  CDBLen      : BYTE;
  2845.                                  BytesToIO   : LONGINT         ):WORD;
  2846. Var
  2847.   R     : REGISTERS;
  2848.   Err   : TError;
  2849.  
  2850. BEGIN
  2851.  
  2852.   If UseSAL Then
  2853.   BEGIN
  2854.  
  2855.     Err := SAL_ExecSCSI( SDLPSalHandle,
  2856.                          cSALxsWrite,
  2857.                          GetBus( SUnit ),
  2858.                          GetTar( SUnit ),
  2859.                          GetLun( SUnit ),
  2860.                          CDBLen,
  2861.                          CDB,
  2862.                          BytesToIo,
  2863.                          Buff,
  2864.                          0,
  2865.                          NIL                 );
  2866.  
  2867.    OutSCSI := ErrorConvert( Err );
  2868.  
  2869.   END  { If UseSAL }
  2870.  
  2871.   ELSE
  2872.   BEGIN
  2873.  
  2874.  
  2875.     SDLP_SetSCSIxHac(SUNIT DIV 64);
  2876.  
  2877.     R.AH:=$FF;
  2878.     R.AL:=(SUnit MOD 64) OR 128;
  2879.     R.DS:=Seg(CDB^);
  2880.     R.DI:=Ofs(CDB^);
  2881.     R.ES:=Seg(Buff^);
  2882.     R.BX:=Ofs(Buff^);
  2883.     R.DH:=BytesToIO DIV 65536;
  2884.     R.CX:=BytesToIO MOD 65536;
  2885.     R.DL:=CDBLen;
  2886.     R.SI:=$6A6A;
  2887.  
  2888.     Intr($11,R);
  2889.  
  2890.     SDLP_SetSCSIxHAC(0);
  2891.  
  2892.     If Odd(R.FLAGS)=FALSE Then
  2893.       OutSCSI:=0
  2894.     ELSE
  2895.       OutSCSI:=R.AX;
  2896.  
  2897.   END; { If UseSAL / else }
  2898.  
  2899. END;  { OutSCSI }
  2900.  
  2901.  
  2902. {────────────────────────────────────────────────────────────────────────────}
  2903.  
  2904. (*-
  2905.  
  2906. [FUNCTION]
  2907.  
  2908. Function InSCSI(                 SUnit       : BYTE;
  2909.                                  CDB         : Pointer;
  2910.                                  Buff        : Pointer;
  2911.                                  CDBLen      : BYTE;
  2912.                                  BytesToIO   : LONGINT         ):WORD;
  2913.  
  2914. [PARAMETERS]
  2915.  
  2916. SUnit       SCSI Unit Number
  2917. CDB         Pointer to CDB Data
  2918. Buff        Pointer to Data Buffer
  2919. CDBLen      CDB Length in Bytes
  2920. BytesToIO   Buffer Length in Bytes
  2921.  
  2922. [RETURNS]
  2923.  
  2924. SCSI Execution Error Code ($0000 = No Error)
  2925.                           ($xx.. = HAC Error Code)
  2926.                           ($..xx = Device Error Code)
  2927.  
  2928.  
  2929. [DESCRIPTION]
  2930.  
  2931. This executes a SDLP Passthru Read to the selected device using the
  2932. provided CDB and Data.
  2933.  
  2934. This SCSI Operation is an InFlow (Read) Operation.  All Buffer data
  2935. is coming back to the Caller rather than OutFlowing from the Caller.
  2936.  
  2937. Supported Device Types:
  2938.        ALL!
  2939.  
  2940. [SEE-ALSO]
  2941.  
  2942. OutSCSI
  2943. InSCSI_ReqSense
  2944.  
  2945. [EXAMPLE]
  2946.  
  2947. VAR
  2948.   CDB  : ARRAY[0..5] of BYTE;
  2949.   Buff : ARRAY[1..512] of BYTE;
  2950.   Err  : WORD;
  2951.  
  2952. BEGIN
  2953.  
  2954.   FillChar( CDB, SizeOf( CDB ), 0 );
  2955.   CDB[0] := $08;  { Read  }
  2956.   CDB[3] :=   5;  { Block }
  2957.   CDB[4] :=   1;  { Count }
  2958.  
  2959.   Err := InSCSI( MakeUNum( 0, 0, 0 ),
  2960.                  Addr( CDB ),
  2961.                  Addr( Buff ),
  2962.                  6,
  2963.                  512  );
  2964.  
  2965.   {----------------------------------------------------------}
  2966.   { Command to Read 1 Block of 512 bytes starting at Block 5 }
  2967.   { on the Device at Target ID 0                             }
  2968.   {----------------------------------------------------------}
  2969.  
  2970. END;
  2971.  
  2972. -*)
  2973.  
  2974. Function InSCSI(                 SUnit       : BYTE;
  2975.                                  CDB         : Pointer;
  2976.                                  Buff        : Pointer;
  2977.                                  CDBLen      : BYTE;
  2978.                                  BytesToIO   : LONGINT         ):WORD;
  2979.  
  2980. Var
  2981.   R     : REGISTERS;
  2982.   Err   : TError;
  2983.  
  2984. BEGIN
  2985.  
  2986.   If UseSAL Then
  2987.   BEGIN
  2988.  
  2989.     Err := SAL_ExecSCSI( SDLPSalHandle,
  2990.                          cSALxsRead,
  2991.                          GetBus( SUnit ),
  2992.                          GetTar( SUnit ),
  2993.                          GetLun( SUnit ),
  2994.                          CDBLen,
  2995.                          CDB,
  2996.                          BytesToIo,
  2997.                          Buff,
  2998.                          0,
  2999.                          NIL                 );
  3000.  
  3001.  
  3002.    InSCSI := ErrorConvert( Err );
  3003.  
  3004.  
  3005.   END  { If UseSAL }
  3006.  
  3007.   ELSE
  3008.   BEGIN
  3009.  
  3010.      SDLP_SetSCSIxHAC(SUnit DIV 64);
  3011.  
  3012.      R.AH:=$FF;
  3013.      R.AL:=(SUnit MOD 64);
  3014.      R.DS:=Seg(CDB^);
  3015.      R.DI:=Ofs(CDB^);
  3016.      R.ES:=Seg(Buff^);
  3017.      R.BX:=Ofs(Buff^);
  3018.      R.DH:=BytesToIO DIV 65536;
  3019.      R.CX:=BytesToIO MOD 65536;
  3020.      R.DL:=CDBLen;
  3021.      R.SI:=$6A6A;
  3022.  
  3023.      Intr($11,R);
  3024.  
  3025.      SDLP_SetSCSIxHAC(0);
  3026.  
  3027.      If Odd(R.FLAGS)=FALSE Then
  3028.        InSCSI:=0
  3029.  
  3030.      ELSE
  3031.        InSCSI:=R.AX;
  3032.  
  3033.   END; { If UseSAL / Else }
  3034.  
  3035. END;  { InSCSI }
  3036.  
  3037.  
  3038. {────────────────────────────────────────────────────────────────────────────}
  3039.  
  3040. (*-
  3041.  
  3042. [FUNCTION]
  3043.  
  3044. Function InSCSI_ReqSense (      SUnit       : BYTE;
  3045.                                 Buff        : Pointer;
  3046.                                 ReqSenseLen : BYTE             ):WORD;
  3047.  
  3048. [PARAMETERS]
  3049.  
  3050. SUnit       SCSI Unit Number
  3051. Buff        Pointer to Data Buffer
  3052. ReqSenseLen Number of Bytes to Return in Data Buffer
  3053.  
  3054. [RETURNS]
  3055.  
  3056. SCSI Error Code ($00 = Successful)
  3057.  
  3058. [DESCRIPTION]
  3059.  
  3060. This executes a Request Sense and returns the data and execution results
  3061.  
  3062. This Operation is NOT Restricted to just Request Senses on InSCSI
  3063. Operations but for all SCSI Operations.  SDLP Operations Automatically
  3064. take care of this as part of their normal functioning (vital information
  3065. being the SDLP Error Code).
  3066.  
  3067. Supported Device Types:
  3068.        ALL!
  3069.  
  3070. [SEE-ALSO]
  3071.  
  3072. OutSCSI
  3073. InSCSI
  3074.  
  3075. [EXAMPLE]
  3076.  
  3077. VAR
  3078.   Buff : ARRAY[1..64] of BYTE;
  3079.  
  3080. BEGIN
  3081.  
  3082.   InSCSI_ReqSense( MakeUNum( 0, 0, 0 ),
  3083.                    Addr( Buff ),
  3084.                    32     );
  3085.  
  3086.   For i := 1 to 64 Do
  3087.     Write( Buff[i]:3 );
  3088.   WriteLn;
  3089.  
  3090.   {-------------------------------------------------------}
  3091.   { Reads the Request Sense Data on Device in Target ID 0 }
  3092.   { and displays it.                                      }
  3093.   {-------------------------------------------------------}
  3094.  
  3095. END;
  3096.  
  3097. -*)
  3098.  
  3099. Function InSCSI_ReqSense (      SUnit       : BYTE;
  3100.                                 Buff        : Pointer;
  3101.                                 ReqSenseLen : BYTE             ):WORD;
  3102.  
  3103. Var
  3104.   R   : REGISTERS;
  3105.   CDB : Array[0..5] of BYTE;
  3106.  
  3107. BEGIN
  3108.  
  3109.   CDB[0] := $03;
  3110.   CDB[1] := (SUnit AND 7) SHL 5;
  3111.   CDB[2] := 0;
  3112.   CDB[3] := 0;
  3113.   CDB[4] := ReqSenseLen;
  3114.   CDB[5] := 0;
  3115.  
  3116.   InSCSI_ReqSense := InSCSI( Sunit, Addr(CDB), Buff, 6, ReqSenseLen );
  3117.  
  3118. END;  { InSCSI_ReqSense }
  3119.  
  3120.  
  3121. {────────────────────────────────────────────────────────────────────────────}
  3122. {────────────────────────────────────────────────────────────────────────────}
  3123. {────────────────────────────────────────────────────────────────────────────}
  3124.  
  3125. BEGIN
  3126.  
  3127.   UseSAL      := FALSE;
  3128.   ExecSCSIHac := 0;
  3129.  
  3130.   SDLPMethod  := SL_UseSDLP;
  3131.  
  3132. END.
  3133.  
  3134.  
  3135.  
  3136.