$$CONTROL USLINIT,MAP,CODE                                              00010000
<<          HIOTAPE1, MODULE 41 - TAPE DRIVER   SERIES 30/33/44  >>     00012000
<<COPYRIGHT    "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980. ",              00014000
     "THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A ",         00016000
     "TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR ",       00018000
     "STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION ",   00020000
     "OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED ",     00022000
     "WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.">>  00024000
$CONTROL PRIVILEGED,UNCALLABLE                                          00026000
$TITLE "HP 7976A MAG TAPE DRIVER"                                       00028000
$TP                                                                     00030000
                                                                        00032000
<<                                                                      00034000
                                                                        00036000
            3000 Series 30/33/44 Magnetic Tape Driver - HIOTAPE1        00038000
            ---------------------------------------------               00040000
                                                                        00042000
                                                                        00044000
Structure of HIOTAPE1:                                                  00046000
                                                                        00048000
HIOTAPE1, together with the SIO Device Monitor (SIODM) constitute a     00050000
standard MPE Type 1 I/O Driver/Monitor.  This means that it does not    00052000
run in its own process, but executes on any stack and therefore must    00054000
run to completion.  During initialization it executes on PROGEN's       00056000
stack, during request initiation it executes on ATTACHIO's stack, and   00058000
during interrupt processing it executes on the Interrupt Control        00060000
Stack (ICS).                                                            00062000
                                                                        00064000
HIOTAPE1 consists of a global area, two procedures, and an "outer       00066000
block" which is really a linkage area for INITIAL.  The global area     00068000
contains an array called INITIAL which is comprised of three parts.     00070000
The first part specifies the size of the other two, the unit extract    00072000
instruction, and various parameters which are used by INITIAL.  This    00074000
section is deleted after INITIAL is through with it.  The other two     00076000
parts are the Device Information Table (DIT) and the Channel Program    00078000
area, which is part of the Interrupt Linkage Table (ILT).  INITIAL      00080000
will put each of these items in the area of memory where it belongs.    00082000
The linkage area specifies the procedure labels (P-labels) of the       00084000
associated monitor (SIODM), the request initiator (MTDRVR), the         00086000
request completor (MTDRVR), the initialization procedure (MTINIT,       00088000
called by PROGEN at system startup), and the interrupt handler (GIP).   00090000
                                                                        00092000
                                                                        00094000
Operation of HIOTAPE1:                                                  00096000
                                                                        00098000
The primary working code of HIOTAPE1 is a procedure MTDRVR.  MTDRVR is  00100000
called with five parameters.  Two of these parameters, BANK and         00102000
BUFFADDR, are the absolute buffer address of the data to be processed.  00104000
The other three, DITP, IOQP, and SIOP are pointers to three arrays.     00106000
DITP is a pointer to the Device Information Table which contains        00108000
information about its associated mag tape unit.  There is one DIT for   00110000
unit on the controller and they contain information which must be       00112000
saved between I/O requests to the driver.  IOQP is a pointer to the     00114000
Input/Output Queue element.  IOQ elements contain information relevent  00116000
to the current request.  SIOP is a pointer to the first element of the  00118000
Channel Program which is actually part of the Interrupt Linkage Table.  00120000
These three elements are described in more detail elsewhere in this     00122000
listing.                                                                00124000
                                                                        00126000
MTDRVR is always called by the SIO device monitor (SIODM) and it        00128000
determines the reason for the call by examining the IOQ and the DIT.    00130000
When a new request is initiated, MTDRVR examines the function code      00132000
and parameter fields contained in the IOQ element to determine the      00134000
task that is desired.  The proper command codes and program branches    00136000
are then placed in the Channel Program and its execution is begun.      00138000
                                                                        00140000
Upon completion of the request, an interrupt is generated and MTDRVR    00142000
is again called.  The code checks for current activity in progress,     00144000
and this being the case, branches to the completion section of the      00146000
driver.  Here several status words are exaimed for errors or special    00148000
conditions which might have occurred during the execution of the        00150000
Channel Program, during the data transfer, or during the operation of   00152000
the mag tape unit.  These conditions can cause error retries and/or     00154000
special notation back to the caller.  All error retries are done by     00156000
the 26076A controller. A list of the conditions and the return codes    00158000
is provided in this listings.                                           00160000
                                                                        00162000
                                                                        00164000
          Development and Fix History                                   00166000
          ---------------------------                                   00168000
                                                                        00170000
Development Engineer: James R. Kochanowicz                              00172000
                                                                        00174000
Change History:                                                         00176000
                                                                        00178000
07/12/81 Changed code to status before doing write file mark            00180000
         beyond EOT. (JRK)                                              00182000
                                                                        00184000
07/27/81 Fix the following.                                             00186000
                                                                        00188000
         (1) Stack problems on length zero operations.                  00190000
         (2) Give correct status for write beyond EOT                   00192000
             in queuing mode.                                           00194000
         (3) Output correct error message for read at                   00196000
             BOT.                                                       00198000
                                                                        00200000
08/12/81 The following fixes were submitted. (JRK)                      00202000
                                                                        00204000
                                                                        00206000
         (1) Go to UNUSUALEND rather than BADIO                         00208000
             for invalid requests.                                      00210000
         (2) Reissue rewind request when tape is                        00212000
             not at BOT.                                                00214000
         (3) Check for invalid byte count when                          00216000
             requesting transfer count.                                 00218000
         (4) Return a transfer error if single track                    00220000
             error and DSJ of 1 occurs.                                 00222000
                                                                        00224000
02/17/82 The following fixes were submitted. (JRK)                      00226000
                                                                        00228000
                                                                        00230000
         (1) To issue a CLEAR command when I/O                          00232000
             is aborted.                                                00234000
                                                                        00236000
                                                                        00238000
04/30/82 The following fix was submitted. (JRK)                         00240000
                                                                        00242000
                                                                        00244000
         (1) To issue the correct message when a write of               00246000
             length 0 is issued without a write ring present.           00248000
                                                                        00250000
$PAGE                                                                   00252000
                                                                        00254000
                                                                        00256000
                                                                        00258000
                 Command Queuing                                        00260000
                                                                        00262000
                                                                        00264000
In the case of unblocked write, backread or read,                       00266000
the driver will attempt to keep the tape moving at speed                00268000
by looking ahead at IOQs to see if another operation of the             00270000
same type can be started up before the current operation has            00272000
completed. This is possible because of the two 16k byte buffers         00274000
in the 26076A controller.  This technique is referred to as             00276000
command queuing.  Command queuing is only done on similar               00278000
operations. i.e. Write followed by a write by another write,            00280000
read followed by read, or read backward followed by read backward.      00282000
Examples of illegal operations are a read followed by a write           00284000
or a write followed by a read.                                          00286000
                                                                        00288000
Command queuing is controlled by the following driver substate          00290000
flags.                                                                  00292000
                                                                        00294000
            ( DRIVER SUBSTATES  )                                       00296000
                                                                        00298000
    NEWREQ   = 0, (Brand new request )                                  00300000
                                                                        00302000
    FIRSTBRK = 1, (Request started, first channel program and           00304000
                   wait for first break in channel program)             00306000
                                                                        00308000
    SECNDREQ = 2, (First program done in channel program and wait       00310000
                   for completion of first channel program for          00312000
                   next request)                                        00314000
                                                                        00316000
    FINLCOMP = 3, (Started second program in channel program            00318000
                   and wait for final completion of second)             00320000
                                                                        00322000
                                                                        00324000
$PAGE                                                                   00326000
                                                                        00328000
                                                                        00330000
            SUBSTATE CHANGES FOR QUEUING                                00332000
                                                                        00334000
READ                                                                    00336000
                                                                        00338000
(1) Send motion command for R1                                          00340000
(2) Send 2nd motion command for R2.                                     00342000
(3) Set up channel program for data transfer for R1.                    00344000
(4) Process completion status for R1.                                   00346000
    Now R's get bumped by 1                                             00348000
                                                                        00350000
                                                                        00352000
                                                                        00354000
    READ        |     R1         |     R2        |     R3               00356000
-----------------------------------------------------------------       00358000
  CALL SIODM    | (1) NEWREQ     | -----         | -----                00360000
    EXIT        | FIRSTBRK       | -----         | -----                00362000
-----------------------------------------------------------------       00364000
  INTERRUPT (R1)| (2) FIRSTBRK   | NEWREQ        | -----                00366000
    EXIT        | SECNDREQ       | FIRSTBRK      | -----                00368000
-----------------------------------------------------------------       00370000
  INTERRUPT (R2)| (3) SECDNREQ   | FIRSTBRK      | -----                00372000
    EXIT        | FINLCOMP       | FIRSTBRK      | -----                00374000
-----------------------------------------------------------------       00376000
  INTERRUPT (R1)| (4) FINLCOMP   | FIRSTBRK      | -----                00378000
    EXIT        | EXIT           | FIRSTBRK      | -----                00380000
-----------------------------------------------------------------       00382000
  CALL SIODM    | -----          | (2) FIRSTBRK  | NEWREQ               00384000
    EXIT        | -----          | SECNDREQ      | FIRSTBRK             00386000
-----------------------------------------------------------------       00388000
  INTERRUPT (R3)| -----          | (3) SECDNREQ  | FIRSTBRK             00390000
    EXIT        | -----          | FINLCOMP      | FIRSTBRK             00392000
-----------------------------------------------------------------       00394000
  INTERRUPT (R2)| -----          | (4) FINLCOMP  | FIRSTBRK             00396000
    EXIT        | -----          | EXIT          | FIRSTBRK             00398000
-----------------------------------------------------------------       00400000
                                                                        00402000
                                                                        00404000
$PAGE                                                                   00406000
WRITE                                                                   00408000
                                                                        00410000
(1) Send motion and data command for W1                                 00412000
(2) Send motion and data command for W2                                 00414000
(3) Set up channel program to check write status for W1.                00416000
(4) Process completion status for W1.                                   00418000
    Now W's get bumped by 1                                             00420000
                                                                        00422000
                                                                        00424000
                                                                        00426000
    WRITE       |     W1         |     W2        |     W3               00428000
-----------------------------------------------------------------       00430000
  CALL SIODM    | (1) NEWREQ     | -----         | -----                00432000
    EXIT        | FIRSTBRK       | -----         | -----                00434000
-----------------------------------------------------------------       00436000
  INTERRUPT (R1)| (2) FIRSTBRK   | NEWREQ        | -----                00438000
    EXIT        | SECNDREQ       | FIRSTBRK      | -----                00440000
-----------------------------------------------------------------       00442000
  INTERRUPT (R2)| (3) SECDNREQ   | FIRSTBRK      | -----                00444000
    EXIT        | FINLCOMP       | FIRSTBRK      | -----                00446000
-----------------------------------------------------------------       00448000
  INTERRUPT (R1)| (4) FINLCOMP   | FIRSTBRK      | -----                00450000
    EXIT        | EXIT           | FIRSTBRK      | -----                00452000
-----------------------------------------------------------------       00454000
  CALL SIODM    | -----          | (2) FIRSTBRK  | NEWREQ               00456000
    EXIT        | -----          | SECNDREQ      | FIRSTBRK             00458000
-----------------------------------------------------------------       00460000
  INTERRUPT (R3)| -----          | (3) SECDNREQ  | FIRSTBRK             00462000
    EXIT        | -----          | FINLCOMP      | FIRSTBRK             00464000
-----------------------------------------------------------------       00466000
  INTERRUPT (R2)| -----          | (4) FINLCOMP  | FIRSTBRK             00468000
    EXIT        | -----          | EXIT          | FIRSTBRK             00470000
-----------------------------------------------------------------       00472000
                                                                        00474000
                                                                        00476000
$PAGE                                                                   00478000
                                                                        00480000
                     Device Reference Table (DRT)                       00482000
                     ----------------------------                       00484000
                                                                        00486000
                                                                        00488000
There is one DRT for each device controller configured on the system.   00490000
                                                                        00492000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00494000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00496000
  0|      Channel Program Pointer  (SIOP)          |   DRT0             00498000
   +-----------------------------------------------+                    00500000
  1|  Channel Program Variable Area pointer (CPVA) |   DRT1             00502000
   +-----------------------------------------------+                    00504000
  2|      Interrupt Handler Program Label          |   DRT2             00506000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00508000
  3|ST|SH|PF|      ( status )          |WS|GF|DT|WT|   DRT3             00510000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00512000
                                                                        00514000
 Channel Program Status:                                                00516000
                                                                        00518000
   Bit 0  - ST, Channel Program Status; 0 - halted, 1 - running         00520000
       1  - SH, SIOP or HIOP instruction pending                        00522000
       2  - PF, Power Fail recovery in progress                         00524000
      12  - WS, Waiting for device status request                       00526000
      13  - GF, GIC FIFO buffer not empty                               00528000
      14  - DT, DMA transfer active                                     00530000
      15  - WT, Channel Program in Wait state                           00532000
                                                                        00534000
$PAGE                                                                   00536000
                Device Information Table (DIT)                          00538000
                ------------------------------                          00540000
                                                                        00542000
                                                                        00544000
There is one DIT per physical device.  If a physical device represents  00546000
more than one logical device, the logical device number is obtained     00548000
from the IOQ element.  The following diagram shows the DIT used for     00550000
the mag tape driver.                                                    00552000
                                                                        00554000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00556000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00558000
  0| 0| 0|AC|RQ| 0|MU| 0|IO|IA|NO|ST| 0|   STATE   |   DFLAG            00560000
   +--+--+--+--+--+--+--+--+--+--+--+--+-----------+                    00562000
  1| SYSDB relative pointer to the DIT for the next|   DLINK            00564000
   | device requesting this resource or service    |                    00566000
   +-----------------------------------------------+                    00568000
  2| SYSDB relative pointer to the first IOQ in    |   DIOQP            00570000
   | request list for this device                  |                    00572000
   +--------+--------------+-----------------------+                    00574000
  3|        | Phys. unit # | Logical device number |   DLDEV            00576000
   +--------+--------------+-----------------------+                    00578000
  4| SYSDB relative pointer to Device Linkage Table|   DDLTP            00580000
   +-----------------------------------------------+                    00582000
  5| SYSDB relative pntr to Interrupt Linkage Table|   DILTP            00584000
   +--+--+--+-----+--+-----------------------------+                    00586000
  6|RW|RU|SH|     |PF|                             |   DSAVE            00588000
   +--+--+--+-----+--+-----------------------------+                    00590000
  7| Hardware error status.  Set when the driver   |   DSERR            00592000
   | detects an error.  Whenever <>0, the driver   |                    00594000
   | monitor logs an I/O error and clears this word|                    00596000
   +-----------------------------------------------+                    00598000
%10| Bit 0 is set at completion of timer           |   DTIME            00600000
   +-----------------------------------------------+                    00602000
%11| Interrupt status for this unit.  Set by the   |   DSTAT            00604000
   | driver each time it processes an interrupt.   |                    00606000
   +-----------------------------------------------+                    00608000
%12| Holds the time out request entry index while  |   DRQST            00610000
   | a timer is active.                            |                    00612000
   +-----------------------------------------------+                    00614000
%13| Error log. Contains 5 valid bytes of status   |   DLOGERROR        00616000
   +-----------------------------------------------+                    00618000
                                                                        00620000
                                                                        00622000
DFLAG - Flags and request state                                         00624000
  AC  ACTIVE  - A monitor is currently servicing this device.           00626000
  RQ  REQUEST - A service request is pending while the monitor is       00628000
                active.                                                 00630000
  MU  MUNIT   - This device is on a multi-unit controller.              00632000
  IO  IOPROG  - An I/O Channel Program is running for this device.      00634000
  IA  IAK     - An interrupt or response has occurred for this device.  00636000
  NO  NOTRDY  - Go to state %10 after Idle Channel Program is started.  00638000
  ST  STWAIT  - The device monitor is starting an Idle Channel Program  00640000
                for this device.  There is no IOQ associated with this  00642000
                type of request.                                        00644000
  STATE       - State of the device monitor.  Specifies the next action 00646000
                to be taken in SIODM in servicing the request:          00648000
                  0 - start new request                                 00650000
                  1 - not used                                          00652000
                  2 - call driver initiator procedure                   00654000
                  3 - call driver completor procedure                   00656000
                  4 - not used                                          00658000
                  5 - process request completed                         00660000
                  6 - initiate device recognition sequence              00662000
                  7 - start operator intervention wait                  00664000
                %10 - wait for interrupt (operator intervention)        00666000
                      restart at state 0                                00668000
                %11 - wait for data segment freeze, then state 2        00670000
                %12 - wait for driver initiator to be frozen, then      00672000
                      allocate controller (state 2)                     00674000
                %13 - wait for I/O completion interrupt, then state 3   00676000
                %14 - wait for controller, then call driver initiator   00678000
                %15 - not used                                          00680000
                %16 - wait for initiator make present, then state 2     00682000
                %17 - wait for completor make present, then state 3     00684000
                                                                        00686000
DSAVE - Device processing flags                                         00688000
                                                                        00690000
  RW  RWBIT  - Indicates tape has been rewound.                         00692000
  RU  RWUNLD - Indicates that a rewind/unload was performed to allow a  00694000
               write-ring mount.                                        00696000
  SH  SHORT  - A short read is in progress.  After completion of read,  00698000
               EOF is checked for and if not present, the requested     00700000
               bytes are transfered from the short-read buffer to the   00702000
               user's buffer.                                           00704000
  PF  POWER  - Device power up indication.                              00706000
                                                                        00708000
DSTAT - Mag tape controller status                                      00710000
                                                                        00712000
  BITS         USE                                                      00714000
                                                                        00716000
    0     END OF FILE (EOF)                                             00718000
                                                                        00720000
    1     BEGINNING OF TAPE (BOT) / LOAD POINT (LP)                     00722000
    2     END OF TAPE (EOT)                                             00724000
    3     SINGLE TRACK ERROR (NOT LOGGED FOR READS)                     00726000
                                                                        00728000
    4     COMMAND REJECT (REJECT)                                       00730000
    5     FILE PROTECT (NOT WRITE ENABLED; NO WRITE RING)               00732000
    6     MULTIPLE TRACK ERROR (MTE)                                    00734000
                                                                        00736000
    7     UNIT ONLINE                                                   00738000
    8     GCR (6250 BPI DENSITY)                                        00740000
    9     UNIT NUMBER (MSB)                                             00742000
                                                                        00744000
   10     UNIT NUMBER (LSB)                                             00746000
   11     TIMING ERROR                                                  00748000
   12     TAPE RUNAWAY                                                  00750000
                                                                        00752000
   13     REWINDING       *                                             00754000
   14     UNIT BUSY       **  (REPORTED AS UNIT NOT READY)              00756000
   15     INTERFACE BUSY  *                                             00758000
$PAGE                                                                   00760000
                Interrupt Linkage Table (ILT)                           00762000
                -----------------------------                           00764000
                                                                        00766000
                                                                        00768000
There is one ILT for each device controller configured on the system.   00770000
                                                                        00772000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00774000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00776000
  0|         Channel                               |   ICPVA0           00778000
  1|              Program                          |   ICPVA1           00780000
  2|                  Variable                     |   ICPVA2           00782000
  3|                       Area (ICPVA)            |   ICPVA3           00784000
   +-----------------------------------------------+                    00786000
  4|         DMA Abort                             |   ICPVA4           00788000
  5|              Address                          |   ICPVA5           00790000
   +-----------------------------------------------+                    00792000
  6|                      0                        |   ISRQL            00794000
   +--+-----------------+-----+-----------+--------+                    00796000
  7|LI|     CHANQUE     |     |   CHAN    |  DEV   |   ICNTRL           00798000
   +--+-----------------+-----+-----------+--------+                    00800000
%10| SYSDB relative pointer to Channel Program area|   ISIOP            00802000
   +-----------------------------------------------+                    00804000
%11| SYSDB relative pointer to Status Return area. |   ISTAP            00806000
   +-----------------------------------------------+                    00808000
%12| Single instruction that is executed to extract|   IUNIT            00810000
   | the device unit number from the status pointed|                    00812000
   | to by ISTAP.                                  |                    00814000
   +-----------------------------------------------+                    00816000
%13| SYSDB relative DIT pointer of the device      |   ICDP             00818000
   | currently using the channel to perform a      |                    00820000
   | data operation.                               |                    00822000
   +-----------------------+-----------------------+                    00824000
%14|       SIOPSIZE        |        CQUEN          |   IQUEUE           00826000
   +--+--+--+--------------+-----------+-----------+                    00828000
%15|RW|WP|IG|                          |  HCUNIT   |   IFLAG            00830000
   +--+--+--+--------------------------+-----------+                    00832000
%16| SYSDB relative DIT pointer for unit 0     *   |   IDITP0           00834000
   +-----------------------------------------------+                    00836000
%17|        Idle Channel Program                   |                    00838000
%20|            Status Return Area                 |                    00840000
%21|                                               |                    00842000
   +-----------------------------------------------+                    00844000
%22|             Mag Tape                          |                    00846000
   .               Channel                         .                    00848000
   |                 Program                       |                    00850000
   +-----------------------------------------------+                    00852000
                                                                        00854000
* This driver does not support more than one unit.                      00856000
                                                                        00858000
                                                                        00860000
ICPVA0 - Channel Program Variable Area                                  00862000
                                                                        00864000
  The first word is used by the channel program processor to store      00866000
  status information after I/O channel aborts.  The next word is used   00868000
  by the driver to indicate if status should be examined for special    00870000
  conditions or errors.  The other two words are not used.              00872000
                                                                        00874000
                                                                        00876000
ICPVA4 - DMA abort address                                              00878000
                                                                        00880000
  If a DMA abort occurs, the absolute address where the abort occurred  00882000
  is stored in this area.                                               00884000
                                                                        00886000
                                                                        00888000
ICNTRL - Contains controller information                                00890000
                                                                        00892000
  LIM     - If this bit is set, the controller is sharing a software    00894000
            channel resource in order to limit bandwidth.               00896000
  CHANQUE - The software channel resource number.                       00898000
  CHAN    - Channel number (four most significant bits of DRTN).        00900000
  DEV     - Device number (three least significant bits of DRTN).       00902000
                                                                        00904000
                                                                        00906000
IQUEUE -                                                                00908000
                                                                        00910000
  SIOPSIZE - (number of words + 1)/2 in the channel program area.       00912000
  CQUEN    - For a multi-unit controller this field contains the        00914000
             software controller resource number.                       00916000
                                                                        00918000
                                                                        00920000
IFLAG - Controller and Channel Program state flags                      00922000
                                                                        00924000
  RUNWAIT  - An Idle Channel Program should be started when there       00926000
             are no active requests to process.                         00928000
  WAITPROG - An Idle Channel Program has been started for this          00930000
             controller.  This bit is reset by an interrupt.            00932000
  IGNOREHI - An HIOP instruction has been issued against this	          00934000
             controller but the channel program was not in a wait       00936000
             statement.  Therefore ignore the interrupt generated by    00938000
             the channel code when this program halts.                  00940000
  HCUNIT   - Highest configured unit number for this controller.        00942000
                                                                        00944000
                                                                        00946000
IDLE CHANNEL PROGRAM STATUS WORDS                                       00948000
                                                                        00950000
The idle channel program status consists of five bytes                  00952000
                                                                        00954000
                                                                        00956000
                                                                        00958000
  The first two bytes are the same as the                               00960000
  DSTAT in the DIT.                                                     00962000
                                                                        00964000
  BITS         USE                                                      00966000
                                                                        00968000
    0     End of file (eof)                                             00970000
                                                                        00972000
    1     Beginning of tape (BOT) / load point (LP)                     00974000
    2     End of tape (EOT)                                             00976000
    3     Single track error (not logged for reads)                     00978000
                                                                        00980000
    4     Command reject (reject)                                       00982000
    5     File protect (not write enabled; no write ring)               00984000
    6     Multiple track error (MTE)                                    00986000
                                                                        00988000
    7     Unit online                                                   00990000
    8     GCR (6250 BPI DENSITY)                                        00992000
    9     Unit number (MSB)                                             00994000
                                                                        00996000
   10     Unit number (LSB)                                             00998000
   11     Timing error                                                  01000000
   12     Tape runaway                                                  01002000
                                                                        01004000
   13     Rewinding       *                                             01006000
   14     Unit busy       **  (reported as unit not ready)              01008000
   15     Interface busy  *                                             01010000
                                                                        01012000
  The next two bytes of the status are:                                 01014000
                                                                        01016000
  Bit:    Meaning                                                       01018000
  0       Reserved.                                                     01020000
  1       MTU/FCU Down  Unit waiting for power.                         01022000
  2       Power restored                                                01024000
  3       Parity Error                                                  01026000
  4       Position Unrecovered                                          01028000
  5       Formatter/Controller and Tape Unit                            01030000
  6       Interface Controller(IFC) (FCU s.m.)                          01032000
  7       Interface Controller(IFC) (incl. PHI s.m.)                    01034000
  10-8    Error Details (binary)                                        01036000
          000=Null Code                                                 01038000
          001=Data Parity Error                                         01040000
          010=FCU/MTU Reject                                            01042000
          011=Protocol Reject                                           01044000
          100=Timeout Reject                                            01046000
          101=Prior Error Reject                                        01048000
          110=Rom Parity Error                                          01050000
          111=Self Test Failure Error                                   01052000
                                                                        01054000
 11-15    Retry Count                                                   01056000
                                                                        01058000
The contents of the last word depends on the bits                       01060000
from the first status word.                                             01062000
                                                                        01064000
  If Format Failure is asserted the register will be                    01066000
  encoded with the return code from the FCU.                            01068000
                                                                        01070000
  If MTE is asserted the register will be encoded with                  01072000
  the error mux. lines.                                                 01074000
                                                                        01076000
  If internal failure is asserted this register will be                 01078000
  encoded with the actual error condition flagged.                      01080000
  If self test failure is asserted this register will be                01082000
  encoded with the type of self test failure condition.                 01084000
$PAGE                                                                   01086000
            I/O QUEUE ELEMENT (IOQ)                                     01088000
            -----------------------                                     01090000
                                                                        01092000
                                                                        01094000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          01096000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    01098000
  0|      Request dependent flags (see below)      |   QFLAG            01100000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    01102000
  1| SYSDB relative pointer to next IOQ element.   |   QLINK            01104000
   | Points to first word of element.              |                    01106000
   +-----------------------+-----------------------+                    01108000
  2|                       | Logical device number |   QLDEV            01110000
   +-----------+--+--+-----+-----------+-----------+                    01112000
  3|           |BO|C |SUBS |           | RTCNTR    |   QMISC            01114000
   +--+--------+--+--+-----+-----------+-----------+                    01116000
  4| S| If QFLAG.(3:1) is clear then this is the   |   QDSTN            01118000
   |  | DST number of the target data segment.  If |                    01120000
   |  | S is set, QADDR is DB relative.            |                    01122000
   +--+--------------------------------------------+                    01124000
  5| Offset in the data segment or system buffer   |   QADDR            01126000
   | table to the target data buffer.              |                    01128000
   +-----------------------+-----------------------+                    01130000
  6|                       | Function code for     |   QFUNC            01132000
   |                       | this request.  (See   |                    01134000
   |                       | next section.)        |                    01136000
   +-----------------------+-----------------------+                    01138000
  7| On initiation, specifies the word count (>0)  |   QWBCT            01140000
   | or byte count (<0).  At completion of the     |                    01142000
   | request this location contains the actual     |                    01144000
   | transmission count in the same units (bytes   |                    01146000
   | or words) as in the request.                  |                    01148000
   +-----------------------------------------------+                    01150000
%10| Parameter 1.  Used only for reads.  Contains  |   QPAR1            01152000
   | the EOF specification in bits (13:3).         |                    01154000
   +-----------------------------------------------+                    01156000
%11| Parameter 2.  Used only for writes.  If bit   |   QPAR2            01158000
   | (13:1) is set, writing past EOT is allowed.   |                    01160000
   +-----------------------+--------------+--------+                    01162000
%12|         PCBN          |  QUALIFIER   | STATUS |   QSTAT            01164000
   +-----------------------+--------------+--------+                    01166000
                                                                        01168000
                                                                        01170000
QFLAG - Request dependent flags                                         01172000
                                                                        01174000
  Bit 0  ABORT     - Abort this request and return an error indication  01176000
                     to the caller.                                     01178000
  Bit 1  SPECIAL   - Apply special handling to this request.  (Not used)01180000
  Bit 2  DIAG      - This is a request from the diagnostic subsystem.   01182000
                     (Not used)                                         01184000
  Bit 3  SYSBUFF   - Target is an index relative to the SBUF Table of   01186000
                     the data buffer.                                   01188000
  Bit 4  IOWAKE    - Wake caller on completion of request.              01190000
  Bit 5  BLOCKED   - Blocked I/O.  The caller is waited in ATTACHIO     01192000
                     until the request is completed.  Implies IOWAKE.   01194000
  Bit 6  COMPLETED - The request has been completed and the caller      01196000
                     awakened if he had requested (with IOWAKE).        01198000
  Bit 7  DATAFRZN  - Set by the memory management routines (MAM) when a 01200000
                     MAKEPRESENT request is successfully completed and  01202000
                     indicates the data segment is frozen in memory.    01204000
  Bit 8  MAMERRORD - An error has occurred while MAM was trying to      01206000
                     make the target data segment present and freeze    01208000
                     it in memory.                                      01210000
  Bit 9  PREQ      - (Not used)                                         01212000
  Bit 10 SFAIL     - Delayed failure of SIO instruction.  If a call to  01214000
                     START'HPIB resulted in the request being added to  01216000
                     the channel queue, this bit indicates that the SIO 01218000
                     instruction failed when the request was selected   01220000
                     for execution.                                     01222000
  Bit 11 PFAIL     - The request was aborted because of a system power  01224000
                     failure.                                           01226000
                                                                        01228000
                                                                        01230000
QMISC - Driver request dependent flags.                                 01232000
                                                                        01234000
  RTCNTR   - Retry count for a read or a write.                         01236000
  C        - Driver is in command queueing mode.                        01238000
  SUBS     - Driver substate for command queueing                       01240000
  BODEOF   - Backspace record due to a data EOF processing              01242000
             in progress.                                               01244000
                                                                        01246000
                                                                        01248000
QSTAT - PCB number and request completion status.                       01250000
                                                                        01252000
  PCBN    - The Process Control Block (PCB) number of the process       01254000
            which made this request.  If zero, the request is not       01256000
            associated with any process and the IOQ element is to       01258000
            be returned by the system when the request has completed.   01260000
  STATUS  - General status indicating the final state of the request.   01262000
            The following codes are used:                               01264000
              0 - Not started or awaiting completion.                   01266000
              1 - Successful completion.                                01268000
              2 - End-of-file detected.                                 01270000
              3 - Unusual, but recoverable, condition detected.         01272000
              4 - Irrecoverable error has occurred.                     01274000
  QUALIFIER - A code which further defines or qualifies the general     01276000
              status.  (See the section Driver Return Status Codes.)    01278000
                                                                        01280000
$PAGE                                                                   01282000
                                                                        01284000
THE FOLLOWING INFORMATION IS PERTINENT TO CONFIGURING THE               01286000
DEVICE INTO AN HP3000 COMPUTER SYSTEM.                                  01288000
                                                                        01290000
DEVICE TYPE    =24                                                      01292000
DEVICE SUBTYPE =1                                                       01294000
RECORD WIDTH   =128 WORDS                                               01296000
                                                                        01298000
                                                                        01300000
                                                                        01302000
                                                                        01304000
           MAG TAPE REQUEST CODES                                       01306000
           ----------------------                                       01308000
                                                                        01310000
                                                                        01312000
   0 - READ                                                             01314000
         P1(13:3) - END OF FILE SPECIFICATION                           01316000
   1 - WRITE                                                            01318000
         P2(13:1) - IF SET THEN WRITE PAST END OF TAPE MARK             01320000
                    IF CLEAR THEN RETURN ERROR IF EOT HAS BEEN DETECTED 01322000
   2 - OPEN FILE (NO OPERATION)                                         01324000
   3 - CLOSE FILE (RESET EOF FLAGS IN LPDT)                             01326000
   4 - CLOSE DEVICE (RESET EOF FLAGS AND REWIND TAPE)                   01328000
   5 - REWIND                                                           01330000
   6 - WRITE FILE MARK                                                  01332000
   7 - FORWARD SPACE FILE                                               01334000
   8 - BACKSPACE FILE                                                   01336000
   9 - REWIND AND UNLOAD                                                01338000
  10 - GAP TAPE                                                         01340000
  11 - FORWARD SPACE RECORD                                             01342000
  12 - BACKSPACE RECORD                                                 01344000
  13 - READ RECORD BACKWARDS                                            01346000
  14 - SUPPLY TOTAL RECORD BYTE COUNT                                   01348000
  15 - READ STATUS                                                      01350000
  16 - SET DENSITY                                                      01352000
  17 - DOWNLOAD DIAGNOSTIC MONITOR ROUTINE                              01354000
  18 - DOWNLOAD AND RUN DIAGNOSTIC                                      01356000
  19 - READ DIAGNOSTIC STATUS                                           01358000
  20 - PERFORM HPIB LOOPBACK                                            01360000
  21 - PERFORM SELF TEST                                                01362000
  22 - END DIAGNOSTIC MODE                                              01364000
                                                                        01366000
                                                                        01368000
$PAGE                                                                   01370000
The following is a description of each of the mag tape                  01372000
request codes.                                                          01374000
                                                                        01376000
Read- This command transfers data from the tape to the                  01378000
      user until a record mark or an EOF is found                       01380000
                                                                        01382000
Write- This command transfers data and automatically writes             01384000
       a record mark following the transfer of data.                    01386000
                                                                        01388000
Open File -No operation. Returns good status.                           01390000
                                                                        01392000
Close file- Reset EOF flags in LPDT. Returns good status.               01394000
                                                                        01396000
Rewind- This command causes the transport to rewind the tape            01398000
        at 250 ips until load point.                                    01400000
                                                                        01402000
Write File Mark- This command causes a file mark to be                  01404000
                 written on the tape.                                   01406000
                                                                        01408000
Foward Space File- This command causes the final position of            01410000
                   the tape to be immediately following the             01412000
                   EOF just read and just preceeding the next           01414000
                   record or file mark.                                 01416000
                                                                        01418000
Backspace File- Similar to Forward Space File, motion stops             01420000
                after the first file mark or load point is              01422000
                detected in a reverse direction.                        01424000
                                                                        01426000
Rewind and Unload- The tape is rewound and unloaded.                    01428000
                                                                        01430000
Gap Tape- This command allows the user to forward space                 01432000
          erase approximately 3.6 inches of tape in PE                  01434000
          mode and 3.4 in GCR mode                                      01436000
                                                                        01438000
Foward Space Record- The tape is moved in a forward direction           01440000
                     until an Inter-Record gap or EOF or EOT            01442000
                     is detected. The drive motion stops when           01444000
                     a record mark or EOF is detected but               01446000
                     continues running when an EOT is found.            01448000
                     If no EOF or record is encountered, tape           01450000
                     runaway status is returned and motion stops.       01452000
                                                                        01454000
Backspace Record- Similar to Foward Space File/Record. Motion stops     01456000
                  after the first file mark or load point is detected   01458000
                  in a reverse direction.                               01460000
                                                                        01462000
Record Backwards- This command is similar to the Read record            01464000
                  in the forward direction. But the order of            01466000
                  the data will be reversed.                            01468000
                                                                        01470000
Supply Total Record Byte Count- Gives the number of bytes of            01472000
                                data read or written to tape.           01474000
                                                                        01476000
Read Status- This command returns 5 bytes of status informa-            01478000
             tion.                                                      01480000
                                                                        01482000
$PAGE                                                                   01484000
Set Density- Sets the unit to either GCR (6250) mode or to              01486000
             PE (1600) mode.                                            01488000
                                                                        01490000
Download diagnostic monitor- This needs to be done before requests      01492000
                             requests 17 and 18.                        01494000
                                                                        01496000
Download and run diagnostic routine- This runs various                  01498000
                            diagnostic routines.                        01500000
                                                                        01502000
Read Diagostic Status- The results of a diagnostic routine              01504000
                       are returned.                                    01506000
                                                                        01508000
Perform HPIB Loopback- Assures correct operation of the                 01510000
                       HPIB communication link(PHI and                  01512000
                       Z80A processor).                                 01514000
                                                                        01516000
Peform Self Test- The unit performs internal tests.                     01518000
                                                                        01520000
End Diagnostic Mode- Must be used to get out of diagnostic              01522000
                     functions 17 and 18.                               01524000
                                                                        01526000
$PAGE                                                                   01528000
                       DRIVER RETURN STATUS CODES                       01530000
                       --------------------------                       01532000
                                                                        01534000
                                                                        01536000
 GENERAL STATUS (13:3)       QUALIFYING STATUS (8:5)      OVERALL (8:8) 01538000
  0 - PENDING               1 - WAITING FOR COMPLETION         %10      01540000
                            2 - ERROR RECOVERY WAIT            %20      01542000
                            3 - NOT READY WAIT                 %30      01544000
                            4 - NO WRITE RING WAIT             %40      01546000
                                                                        01548000
  1 - SUCCESSFUL            0 - NO ERRORS                        1      01550000
                            2 - RETRY WAS NECESSARY            %21      01552000
                            3 - EOT AFTER WRITE                %31      01554000
                            4 - BOT AFTER BACK-READ            %41      01556000
                                                                        01558000
  2 - END OF FILE           1 - A TAPE MARK WAS READ                    01560000
                                OR P1 WAS NONZERO AND                   01562000
                                THE LAST RECORD READ                    01564000
                                WAS A TAPE MARK                %12      01566000
                          2-7 - A DATA DEPENDENT EOF                    01568000
                                CONDITION AS SPECIFIED                  01570000
                                BY EOFCHECK                             01572000
                                                                        01574000
 3 - UNUSUAL CONDITION      3 - REQUEST ABORTED                %33      01576000
                            6 - POWERFAIL ABORT                %63      01578000
                            7 - BOT AND BACKSPACE REQUESTED    %73      01580000
                          %10 - TAPE RUNAWAY                  %103      01582000
                          %11 - EOT AND WRITE REQUESTED       %113      01584000
                          %21 - DEVICE POWERED UP             %213      01586000
                          %22 - BOT AND BACK-READ REQUESTED   %223      01588000
                                                                        01590000
 4 - IRRECOVERABLE ERROR    0 - INVALID REQUEST                  4      01592000
                            1 - TRANSMISSION ERROR             %14      01594000
                            3 - TIMING ERROR                   %34      01596000
                            4 - SIO FAILURE                    %44      01598000
                            5 - UNIT FAILURE                   %54      01600000
                          %12 - SYSTEM ERROR                  %124      01602000
                          %14 - CHANNEL FAILURE               %144      01604000
                                                                        01606000
                                                                        01608000
>>                                                                      01610000
$PAGE                                                                   01612000
BEGIN                                                                   01614000
  EQUATE                                                                01616000
                                                                        01618000
            << FUNCTION CODES >>                                        01620000
                                                                        01622000
    BACKREADFC   = 13,  << BACKWARDS READ >>                            01624000
    BSRECORDFC   = 12,  << BACKSPACE RECORD >>                          01626000
    DCLOSEFC     =  4,  << DEVICE CLOSE >>                              01628000
    FSRECORDFC   = 11,  << FORWARD SPACE RECORD >>                      01630000
    READFC       =  0,  << READ RECORD >>                               01632000
    REWINDFC     =  5,  << REWIND >>                                    01634000
    REWUNLDFC    =  9,  << REWIND/UNLOAD >>                             01636000
    TAPEGAPFC    = 10,  << TAPE GAP >>                                  01638000
    TTCOUNTFC    = 14,  << TOTAL TRANSFER COUNT >>                      01640000
    WRITEFC      =  1,  << WRITE RECORD >>                              01642000
    WRTFMARKFC   =  6,  << WRITE FILE MARK >>                           01644000
    SETDENSC     = 16,  << SET DENSITY>>                                01646000
    DIAGSTFC     = 19,  << READ DIAGNOSTIC STATUS>>                     01648000
    LOOPREQUEST  = 20,  << LOOP BACK REQUEST >>                         01650000
                                                                        01652000
                                                                        01654000
       << MAG TAPE COMMANDS >>                                          01656000
                                                                        01658000
    BACKREADCMD  = %17,                                                 01660000
    BSFILECMD    = %14,                                                 01662000
    BSRECORDCMD  = %12,                                                 01664000
    FSFILECMD    = %13,                                                 01666000
    FSRECORDCMD  = %11,                                                 01668000
    READCMD      = %10,                                                 01670000
    REWINDCMD    = %15,                                                 01672000
    REWUNLDCMD   = %16,                                                 01674000
    TAPEGAPCMD   =   7,                                                 01676000
    WRITECMD     =   5,                                                 01678000
    WRTFMARKCMD  =   6,                                                 01680000
    SETDENSHIC   = %20,                                                 01682000
    SETDENSLOC   = %21,                                                 01684000
                                                                        01686000
                                                                        01688000
            << QSTAT STATUS RETURNS >>                                  01690000
                                                                        01692000
    ABORTED      =  %33,  << REQUEST ABORTED >>                         01694000
    BREADATBOT   = %223,  << BOT AND BACK-READ REQUESTED >>             01696000
    BSPCATBOT    =  %73,  << BOT AND BACKSPACE REQUESTED >>             01698000
    CHANFAIL     = %144,  << I/O CHANNAL ERROR >>                       01700000
    CMPLTIONWAIT =  %10,  << WAITING FOR COMPLETION >>                  01702000
    EOTWRITE     = %113,  << EOT AND WRITE REQUESTED >>                 01704000
    GOODBOT      =  %41,  << BOT AFTER SUCCESSFUL BACK-READ >>          01706000
    GOODEOT      =  %31,  << EOT AFTER SUCCESSFUL WRITE >>              01708000
    GOODIO       =    1,  << NO ERRORS >>                               01710000
    INVALIDRQST  =    4,  << INVALID REQUEST >>                         01712000
    NOTREADYWAIT =  %30,  << NOT READY WAIT >>                          01714000
    PFABORT      =  %63,  << POWERFAIL ABORT >>                         01716000
    POWERUP      = %213,  << DEVICE POWERED UP >>                       01718000
    RUNAWAY      = %103,  << TAPE RUNAWAY OCCURRED >>                   01720000
    RINGWAIT     =  %40,  << NO WRITE RING WAIT >>                      01722000
    SIOFAIL      =  %44,  << SIO FAILURE >>                             01724000
    SYSERROR     = %124,  << SYSTEM ERROR >>                            01726000
    GOODRETRY    =  %21,  << RETRY WAS NECESSARY >>                     01728000
    STDENERR     = %233,  << SET DENSITY ERROR>>                        01730000
    TIMINGERR    =  %34,  << TIMING ERROR >>                            01732000
    TRANSFERERR  =  %14,  << TRANSFER ERROR >>                          01734000
    UNITFAIL     =  %54,  << UNIT FAILURE >>                            01736000
    PRIORERR     =  %43,  << PRIOR ERROR ABORT >>                       01738000
                                                                        01740000
            << CHANNEL PROGRAM ARRAY POINTERS >>                        01742000
                                                                        01744000
    BADDR1       = 28,  << BUFFER ADDRESS FOR READ DATA>>               01746000
    BADDR2       = 85,  << BUFFER ADDRESS FOR WRITE DATA>>              01748000
    RDBYCNT      = 25,  << BYTE COUNT FOR READ DATA >>                  01750000
    WRBYCNT      = 82,  << BYTE COUNT FOR WRITE DATA >>                 01752000
    CMDWORD      = 117, << MOTION COMMAND WORD >>                       01754000
    CPSTAT       = 43,  << BEGINNING OF CHAN PROG STATUS ROUTINE >>     01756000
    DSJ'RWJMP    = 13,  << READ/WRITE DATA BYPASS SWITCH >>             01758000
    BYTECOUNT    = 126, << NUMBER OF BYTES READ BY 7976 >>              01760000
    ENDCMD       = 119, << END COMMAND >>                               01762000
    IDLEND       = 127, << END COMMAND FOR IDLE CHANNEL PGM>>           01764000
    IDLE         =  94, << BEGINNING OF IDLE CHANNEL PROGRAM >>         01766000
    MEMX'RC      = 37,  << BANK ADDRESS FOR TRANSFER COUNT READ >>      01768000
    MEMX1        = 27,  << BANK ADDRESS FOR READ DATA>>                 01770000
    MEMX2        = 84,  << BANK ADDRESS FOR WRITE DATA>>                01772000
    SLCTUNIT     = 116, << UNIT NUMBER BUFFER FOR SELECT COMMAND >>     01774000
    SPFDCMD      = 118, << STOP POLLING FOR DATA COMMAND >>             01776000
    SRBUFF       = 123, << SHORT READ BUFFER >>                         01778000
    STATUS       = 120, << I/O STATUS BUFFER >>                         01780000
                                                                        01782000
                                                                        01784000
        << DRIVER SUBSTATES FOR COMMAND QUEUING >>                      01786000
                                                                        01788000
    NEWREQ       = 0,  <<BRAND NEW REQUEST >>                           01790000
    FIRSTBRK     = 1,  <<REQUEST STARTED 1ST PGM&WAIT 1ST BRK>>         01792000
    SECNDREQ     = 2,  <<1ST PGM DONE WAIT FOR ALT REQ COMPL>>          01794000
    FINLCOMP     = 3,  <<STARTED 2ND PGM & WAIT FINL CMPLTN>>           01796000
                                                                        01798000
                                                                        01800000
         << TABLE ARRAY POINTERS AND PROGRAM CONSTANTS >>               01802000
                                                                        01804000
    CONSOLE      =     0,  << OUTPUT MESSAGE TO OPERATOR >>             01806000
    DILTP        =     5,  << DIT, INTERRUPT LINKAGE TABLE POINTER >>   01808000
    DLDEV        =     3,  << DIT, LOGICAL DEVICE AND UNIT NUMBERS >>   01810000
    DLOGERROR    =    11,  << DIT, ERROR LOG>>                          01812000
    DRQST        =    10,  << DIT, DRIVER TIMER >>                      01814000
    DSAVE        =     6,  << DIT, DRIVER FLAGS WORD >>                 01816000
    DSERR        =     7,  << DIT, HARDWARE I/O STATUS TO BE LOGGED >>  01818000
    DSTAT        =     9,  << DIT, LAST INTERRUPT STATUS >>             01820000
    DTIME        =     8,  << DIT, BIT 0 INDICATES TIMER POPPED >>      01822000
    IFLAG        =    13,  << ILT, FLAG WORD >>                         01824000
    INTRPTWAIT   =   %13,  << INTERRUPT WAIT DRIVER RETURN STATE >>     01826000
    ISIOP        =     8,  << CHANNEL PROGRAM AREA POINTER >>           01828000
    ISTAP        =     9,  << CHAN PROG STATUS RETURN AREA POINTER >>   01830000
    MAXBSIZE     = 16384,  << MAXIMUM BUFFER BYTE SIZE >>               01832000
    NOTRDYMSG    =    11,  << NOT READY MESSAGE CATALOG INDEX >>        01834000
    NOWRING      =   220,  << NO WRITE RING MESSAGE CATALOG INDEX >>    01836000
    OPINTRVNTNWAIT =   7,  << OPERATOR INTERVENTION WAIT RETURN STATE >>01838000
    QFUNC        =     6,  << IOQ, FUNCTION CODE >>                     01840000
    QMISC        =     3,  << IOQ, REQUEST FLAGS AND COUNTERS WORD >>   01842000
    QDSTN        =     4,  << IOQ, DST NUMBER OF TARGET DATA SEGMENT >> 01844000
    QPAR2        =     9,  << IOQ, REQUEST PARAMETER WORD >>            01846000
    QSTAT        =    10,  << IOQ, REQUEST STATUS RETURN >>             01848000
    QWBCT        =     7,  << IOQ, WORD/BYTE COUNT >>                   01850000
    QLINK        =     1,  << IOQ, POINTER TO NEXT IOQ >>               01852000
    REQUESTDONE  =     5,  << REQUEST DONE DRIVER RETURN STATE >>       01854000
    SYSDB        = %1000,  << SET START OF SYSDB AREA >>                01856000
    SYSLPDT      =   %10,  << LPDT POINTER INDEX >>                     01858000
    SYSSBUFF     =     6,  << SYS BUFF TABLE POINTER INDEX >>           01860000
    PE16         =     1,  << PE 1600 MODE >>                           01862000
    QUEUING      =     1,  << DRIVER IN COMMAND QUEUING STATE>>         01864000
    NOTQUEUING   =     0,  << DR NOT IN COMMAND QUEUING STATE>>         01866000
    REJCOD11     =   %11,  << BLANK OR 800 BPI TAPE ON DRIVE >>         01868000
    FCUREJ       =     2,  << FCU/MTU REJECT >>                         01870000
    PROCREJ      =     3,  << PROTOCOL REJECT >>                        01872000
    TIMEOUT      =     4,  << TIMEOUT REJECT >>                         01874000
    PRIORERROR   =     5,  << PRIOR ERROR REJECT >>                     01876000
    ROMPARERR    =     6,  << ROM PARITY ERROR >>                       01878000
    DATAPARERR   =     1,  << DATA PARITY ERROR >>             <<02655>>01880000
    SELFTESTERR  =     7,  << SELF TEST ERROR >>               <<02655>>01882000
  ENDEQ          =     0;                                               01884000
                                                                        01886000
           << STATUS BIT DEFINITIONS >>                                 01888000
                                                                        01890000
  DEFINE                                                                01892000
    BUSY         = (13:3)#,  << INTERFACE BUSY/UNIT BUSY/REWINDING >>   01894000
    EOF          = ( 0:1)#,  << END OF FILE >>                          01896000
    EOT          = ( 2:1)#,  << END OF TAPE >>                          01898000
    FILEPROTECT  = ( 5:1)#,  << FILE PROTECT  >>                        01900000
    LOADP        = ( 1:1)#,  << LOAD POINT (BOT) >>                     01902000
    ONLINE       = ( 7:1)#,  << UNIT ONLINE >>                          01904000
    IOACTV       = ( 7:1)#,  << CHANNEL PROGRAM ACTIVE >>      <<02672>>01906000
    EXTINT       = ( 1:1)#,  << EXT INTERRUPTS ENABLED >>      <<02672>>01908000
    DISABLE      =     ASSEMBLE(SED 0)#,                       <<02672>>01910000
    ENABLE       =     ASSEMBLE(SED 1)#,                       <<02672>>01912000
    REJECT       = ( 4:1)#,  << COMMAND REJECTED >>                     01914000
    STERR        = ( 3:1)#,  << SINGLE TRACK ERROR >>                   01916000
    TAPERUN      = (12:1)#,  << TAPE RUNAWAY >>                         01918000
    TIMING       = (11:1)#,  << TIMING ERROR >>                         01920000
    TRANSFER     = ( 6:1)#,  << TRANSFER ERROR (MTE) >>                 01922000
    PRERR        = ( 8:3)#,  << PRIOR ERROR ABORT CODE AREA >>          01924000
    MTUDOWN      = ( 1:1)#,  << UNIT WAITING FOR POWER UP >>            01926000
    ERRDETAIL    = ( 8:3)#,  << ERROR DETAIL FIELD ON COMMAND REJECT >> 01928000
    NUMRETRY     = (11:5)#,  << NUMBER OF RETRIES ON A READ OR WRITE >> 01930000
                                                                        01932000
                                                                        01934000
           << DSAVE BIT DEFINITIONS >>                                  01936000
                                                                        01938000
    RWBIT        = ( 0:1)#,  << TAPE REWOUND FLAG >>                    01940000
    RWUNLD       = ( 1:1)#,  << REWIND/UNLOAD FOR WRITE RING MOUNTING >>01942000
    SHORT        = ( 2:1)#,  << SHORT READ IN PROGRESS >>               01944000
    CESTAT       = ( 3:1)#,  << CHANNEL PARITY ERROR PROCESSING FLAG >> 01946000
    DCFLAG       = ( 4:1)#,  << TRANSFER USED DATA CHAINING >>          01948000
    PFBIT        = ( 5:1)#,  << DEVICE POWERED UP BIT >>                01950000
    CLEAR'ACTIVE = (15:1)#,  << DEVICE CLEAR IN PROGRESS >>    <<03759>>01952000
                                                                        01954000
                                                                        01956000
           << QMISC BIT DEFINITIONS >>                                  01958000
                                                                        01960000
    BODEOF       = ( 4:1)#,  << BACKSPACE ON DATA EOF >>                01962000
    SUBSTATE     = ( 6:2)#,  << DRIVER SUBSTATE >>                      01964000
    COMQUEUE     = ( 5:1)#,  << COMMAND QUEUEING FLAG >>                01966000
    RTCNTR       = (12:4)#,  << ERROR RETRY COUNTER >>                  01968000
                                                                        01970000
                                                                        01972000
         << MISCELLANEOUS BIT DEFINITIONS >>                            01974000
                                                                        01976000
    ABS          = ABSOLUTE#,                                           01978000
    ASMB         = ASSEMBLE#,                                           01980000
    BANKAD       = ( 8:8)#,  << BANK ADDRESS FIELD >>                   01982000
    EOFBIT       = ( 7:3)#,  << LPDT, EOF FIELD >>                      01984000
    EOTFLAG      = (13:1)#,  << QPAR2, READ PAST EOT MARKER FLAG >>     01986000
    ERRORCODE    = ( 0:3)#,  << CPVA, ERROR CODE FIELD >>               01988000
    IOSTAT       = ( 8:8)#,  << QSTAT, REQUEST STATUS RETURN FIELD >>   01990000
    ABORT        = ( 0:1)#,  << QFLAG, ABORT INDICATION FLAG >><<03759>>01992000
    LDEV         = ( 8:8)#,  << DLDEV, LOGICAL DEVICE FIELD >>          01994000
    PARITYERR    = ( 3:1)#,  << STATUS, PARITY ERROR OCCURRED >>        01996000
    PFAIL        = (11:1)#,  << QFLAG, ABORT DUE TO POWER FAILURE >>    01998000
    POWUP        = ( 2:1)#,  << STATUS, UNIT HAS POWERED UP >>          02000000
    FUNC         = ( 8:8)#,  << QFUNC, FUNCTION CODE >>                 02002000
    SFAIL        = (10:1)#,  << QFLAG, FAILURE ON DELAYED START SIO >>  02004000
    DENSITY      = IOQPL(QPAR2).(13:3)#, <<DENSITY>>                    02006000
  ENDDEF         = 0#;                                                  02008000
                                                                        02010000
$PAGE                                                                   02012000
                                                                        02014000
                                                                        02016000
<<       ***********************************                            02018000
         *                                 *                            02020000
         *    DRIVER DB AREA DEFINITION    *                            02022000
         *                                 *                            02024000
         ***********************************        >>                  02026000
                                                                        02028000
                                                                        02030000
   ARRAY INITIAL(0:155) = DB :=                                         02032000
     [8/14,8/%21],  << MT DIT SZ, NOT C.R./RUN IDLE CP/DR TYP>>         02034000
              0,   << NOT USED >>                                       02036000
         %26622,   << UNIT EXTRACT INSTRUCTION - EXF, J=9, K=2 >>       02038000
     [8/64,8/3],   << CHANNEL PROG SIZE/2, STATUS RETURN AREA SIZE >>   02040000
                                                                        02042000
     << MT DIT >>                                                       02044000
              0,   << DFLAG >>                                          02046000
              0,   << DLINK >>                                          02048000
              0,   << DIOQP >>                                          02050000
         %40000,   << DLDEV >>                                          02052000
              0,   << DLTDP >>                                          02054000
              0,   << DILTP >>                                          02056000
              0,   << DSAVE >>                                          02058000
              0,   << DSERR >>                                          02060000
              0,   << DTIME >>                                          02062000
              0,   << DSTAT >>                                          02064000
              0,   << DRQST >>                                          02066000
              0,   << DLOGERROR >>                                      02068000
              0,                                                        02070000
              0,                                                        02072000
                                                                        02074000
                                                                        02076000
 <<  CHANNEL PROGRAM  >>                                                02078000
                                                                        02080000
                                                                        02082000
                                                                        02084000
                                                                        02086000
<<   READ/MOTION REQUESTS   >>                                          02088000
                                                                        02090000
<<  0>> <<JUMP>>             0, <<JUMP TO START>>                       02092000
<<  1>>                      0,                                         02094000
                                                                        02096000
                                                                        02098000
<<  2>> <<UNIT SELECT>>  %2001, <<SELECT UNIT COMMAND>>                 02100000
<<  3>>                      1, <<BYTE COUNT>>                          02102000
<<  4>>                      0,                                         02104000
<<  5>>                 %42000, <<LB,UD>>                               02106000
<<  6>>                      0, <<PLUG IN LDEV HERE>>                   02108000
                                                                        02110000
<<  7>> <<WRCMD MOT>>    %2001, <<READ/MOTION COMMAND>>                 02112000
<<  8>>                      1, <<BYTE COUNT>>                          02114000
<<  9>>                      0,                                         02116000
<< 10>>                 %42000, <<LB,UD>>                               02118000
<< 11>>                      0, <<PLUG @RD CMD>>                        02120000
                                                                        02122000
<< 12>> <<JUMP>>             0, <<JUMP>>                                02124000
<< 13>>                      0, <<0 FOR READ/2 FOR MOTION>>             02126000
                                                                        02128000
<< 14>> <<INT/HALT>>      %601, <<INTERRUPT/HALT>>                      02130000
<< 15>>                      0, <<CODE=0  SUCCESSFUL>>                  02132000
                                                                        02134000
                                                                        02136000
<<BREAK HERE ON READ CMD. CAN NOW START UP AN ADDITIONAL>>              02138000
<<READ REQUEST OR ALLOW A PREVIOUS ONE TO FINISH.       >>              02140000
                                                                        02142000
<<   MOTION COMPLETION   >>                                             02144000
                                                                        02146000
                                                                        02148000
<< 16>> <<WAIT>>         %1000, <<WAIT FOR CMD COMPLETION>>             02150000
<< 17>>                      0,                                         02152000
                                                                        02154000
<< 18>> <<DSJ>>          %2401, <<CHECK MT CONDITION>>                  02156000
<< 19>>                      0,                                         02158000
<< 20>>                      0, <<STATUS VECTOR=0>>                     02160000
<< 21>>                     33, <<STATUS VECTOR=1>>                     02162000
                                                                        02164000
<< 22>> <<JUMP>>             0, <<JUMP>>                                02166000
<< 23>>                      0, <<0 FOR READ/19 FOR MOTION>>            02168000
                                                                        02170000
<< 24>> <<READ DATA>>    %1400, <<READ RECORD CMD>>                     02172000
<< 25>>                      0, <<RD BYTE COUNT>>                       02174000
<< 26>>                      0,                                         02176000
<< 27>>                      0, <<BANK>>                                02178000
<< 28>>                      0, <<@BUFFER>>                             02180000
                                                                        02182000
<< 29>> <<WR END>>       %2007, <<STOP POLL FOR DATA>>                  02184000
<< 30>>                      1,                                         02186000
<< 31>>                      0,                                         02188000
<< 32>>                 %42000,                                         02190000
<< 33>>                      0,                                         02192000
                                                                        02194000
<< 34>> <<READ COUNT>>   %1402, <<READ TRANSFER COUNT>>                 02196000
<< 35>>                      2,                                         02198000
<< 36>>                      0,                                         02200000
<< 37>>                      0, <<%2000+BANK>>                          02202000
<< 38>>                      0, <<@COUNT BUFFER>>                       02204000
                                                                        02206000
<< 39>> <<DSJ>>          %2401, <<CHECK MT CONDITION>>                  02208000
<< 40>>                      0,                                         02210000
<< 41>>                      0,                                         02212000
<< 42>>                     12,                                         02214000
                                                                        02216000
<< 43>> <<READ STATUS>>  %1401, <<READ STATUS BYTES>>                   02218000
<< 44>>                      5,                                         02220000
<< 45>>                      0,                                         02222000
<< 46>>                  %2000,                                         02224000
<< 47>>                      0, <<@STAT BUFFER>>                        02226000
                                                                        02228000
<< 48>> <<WR END>>       %2007, <<ISU STOP POLL DATA>>                  02230000
<< 49>>                      1,                                         02232000
<< 50>>                      0,                                         02234000
<< 51>>                 %42000,                                         02236000
<< 52>>                      0,                                         02238000
                                                                        02240000
<< 53>> <<INT/HLT>>       %601, <<INTERRUPT/HALT>>                      02242000
<< 54>>                      0, <<HALT CODE=0  SUCCESSFUL>>             02244000
                                                                        02246000
<< 55>> <<READ STATUS>>  %1401, <<READ STATUS BYTES>>                   02248000
<< 56>>                      5,                                         02250000
<< 57>>                      0,                                         02252000
<< 58>>                  %2000,                                         02254000
<< 59>>                      0, <<@STAT BUFFER>>                        02256000
                                                                        02258000
<< 60>> <<WR END>>       %2007, <<ISU STOP POLL DATA>>                  02260000
<< 61>>                      1,                                         02262000
<< 62>>                      0,                                         02264000
<< 63>>                 %42000,                                         02266000
<< 64>>                      0,                                         02268000
                                                                        02270000
<< 65>> <<INT/HLT>>       %601, <<INTERRUPT/HALT>>                      02272000
<< 66>>                      1, <<HALT CODE=1  PROBLEM>>                02274000
                                                                        02276000
                                                                        02278000
<<   HERE ENDS A COMPLETE READ DATA SEQUENCE     >>                     02280000
                                                                        02282000
                                                                        02284000
                                                                        02286000
                                                                        02288000
<<   WRITE REQUESTS   >>                                                02290000
                                                                        02292000
<< 67>> <<UNIT SELECT>>  %2001, <<WR CMD UNIT SEL>>                     02294000
<< 68>>                      1,                                         02296000
<< 69>>                      0,                                         02298000
<< 70>>                 %42000, <<LB,UD>>                               02300000
<< 71>>                      0, <<PLUG @LDEV HERE>>                     02302000
                                                                        02304000
<< 72>> <<WR CMD MOTN>>  %2001, <<WR MOTION CMD>>                       02306000
<< 73>>                      1,                                         02308000
<< 74>>                      0,                                         02310000
<< 75>>                 %42000, <<LB,UD>>                               02312000
<< 76>>                      0, << @WR CMD, PLUG @WRCMD HERE>>          02314000
                                                                        02316000
<< 77>> <<DSJ>>          %2401, <<CHECK MT CONDITION>>                  02318000
<< 78>>                      0,                                         02320000
<< 79>>                      0,                                         02322000
<< 80>>                    -26,                                         02324000
                                                                        02326000
<< 81>> <<WR DATA>>      %2000, <<WR RECORD CMD>>                       02328000
<< 82>>                      0, <<BYTE COUNT>>                          02330000
<< 83>>                      0,                                         02332000
<< 84>>                      0, <<BANK+>>                               02334000
<< 85>>                      0, <<@WR BUFFER>>                          02336000
                                                                        02338000
<< 86>> <<INT/HALT>>      %601, <<INTERRUPT/HALT>>                      02340000
<< 87>>                      0, <<CODE=0  SUCCESSFUL>>                  02342000
                                                                        02344000
<<CAN NOW START ANOTHER WRITE OPERATION OR LET A    >>                  02346000
<<PREVIOUS WRITE COMPLETE.                          >>                  02348000
                                                                        02350000
<< GET HERE TO FINISH OFF WRITE COMMAND             >>                  02352000
                                                                        02354000
<< 88>> <<WAIT>>         %1000, <<WAIT FOR CMD COMPLETION>>             02356000
<< 89>>                      0,                                         02358000
                                                                        02360000
<< 90>> <<DSJ>>          %2401, <<CHECK MT CONDITION>>                  02362000
<< 91>>                      0,                                         02364000
<< 92>>                    -51,                                         02366000
<< 93>>                    -39,                                         02368000
                                                                        02370000
                                                                        02372000
<<    HERE ENDS A COMPLETE WRITE SEQUENCE     >>                        02374000
                                                                        02376000
                                                                        02378000
                                                                        02380000
                                                                        02382000
                                                                        02384000
<<   HERE STARTS THE IDLE CHANNEL PROGRAM   >>                          02386000
                                                                        02388000
<< 94>> <<WR END>>       %2007, <<ISUE END COMMAND>>                    02390000
<< 95>>                      1, <<IDLE CHANNEL PGM>>                    02392000
<< 96>>                      0,                                         02394000
<< 97>>                 %42000,                                         02396000
<< 98>>                      0,                                         02398000
                                                                        02400000
<< 99>> <<WAIT>>         %1000, <<WAIT FOR MT POLL>>                    02402000
<<100>>                      0,                                         02404000
                                                                        02406000
<<101>> <<DSJ>>          %2400, <<CLEAR ANY PENDING DSJS>>              02408000
<<102>>                      0,                                         02410000
<<103>>                      0,                                         02412000
                                                                        02414000
<<104>> <<READ STATUS>>  %1401, <<READ STATUS TO ILT>>                  02416000
<<105>>                      5,                                         02418000
<<106>>                      0,                                         02420000
<<107>>                  %2000,                                         02422000
<<108>>                      0, <<@STAP>>                               02424000
                                                                        02426000
<<109>> <<WR END>>       %2007, <<ISSUE END CMD>>                       02428000
<<110>>                      1,                                         02430000
<<111>>                      0,                                         02432000
<<112>>                 %42000,                                         02434000
<<113>>                      0,                                         02436000
                                                                        02438000
<<114>> <<INT/HLT>>       %601, <<INTERRUPT/HALT>>                      02440000
<<115>>                      0, <<CODE=0  SUCCESSFUL>>                  02442000
                                                                        02444000
<<116>> <<LDEV ETC>>         0, <<SEL CMD UNIT NUMBER>>                 02446000
<<117>> <<CMD WORD>>         0, <<MOTION CMD WORD>>                     02448000
<<118>>                      2, <<STOP POLL FOR DATA CMD>>              02450000
<<119>>                    %10, <<END COMMAND>>                         02452000
<<120>>                      0, <<6 BYTE STATUS BUFFER>>                02454000
<<121>>                      0,                                         02456000
<<122>>                      0,                                         02458000
<<123>>                      0, <<6 BYTE SHORT RD BUFFER>>              02460000
<<124>>                      0,                                         02462000
<<125>>                      0,                                         02464000
<<126>>                      0, << TRANSFER COUNT >>                    02466000
<<127>>                      4;                                         02468000
$PAGE                                                                   02470000
<<    ***************************************                           02472000
      *                                     *                           02474000
      *   EXTERNAL PROCEDURE DECLARATIONS   *                           02476000
      *                                     *                           02478000
      ***************************************              >>           02480000
                                                                        02482000
                                                                        02484000
                                                                        02486000
PROCEDURE ABORTTIMEREQ(TRLX);                                           02488000
  VALUE TRLX;   INTEGER TRLX;                                           02490000
  OPTION EXTERNAL;                                                      02492000
                                                                        02494000
PROCEDURE CHECKINDEX(INDEX,TABLE);                                      02496000
  VALUE INDEX,TABLE;                                                    02498000
  INTEGER INDEX;                                                        02500000
  INTEGER POINTER TABLE;                                                02502000
  OPTION EXTERNAL;                                                      02504000
                                                                        02506000
PROCEDURE EOFCHECK(IOQP,BUF,CNT,HCHK);                                  02508000
  VALUE IOQP,BUF,CNT,HCHK;                                              02510000
  POINTER IOQP;                                                         02512000
  DOUBLE BUF;                                                           02514000
  INTEGER CNT,HCHK;                                                     02516000
  OPTION EXTERNAL;                                                      02518000
                                                                        02520000
PROCEDURE GIP'HPIB;                                                     02522000
  OPTION EXTERNAL;                                                      02524000
                                                                        02526000
PROCEDURE HELP;                                                         02528000
  OPTION EXTERNAL;                                                      02530000
                                                                        02532000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,       02534000
                            REPLY,OFFSET,DITP,IOTYPE);                  02536000
  VALUE  SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,DITP,IOTYPE; 02538000
  INTEGER  SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,IOTYPE;    02540000
  INTEGER POINTER  DITP;                                                02542000
  OPTION VARIABLE,EXTERNAL;                                             02544000
                                                                        02546000
PROCEDURE MASTERCLEARHPIB(DITP);                                        02548000
  ARRAY DITP;                                                           02550000
  OPTION EXTERNAL;                                                      02552000
                                                                        02554000
PROCEDURE SIODM(DITP,FLAGS);                                            02556000
  VALUE DITP,FLAGS;   LOGICAL FLAGS;                                    02558000
  POINTER DITP;   OPTION EXTERNAL;                                      02560000
                                                                        02562000
PROCEDURE START'HPIB(DITP,SIOP,QFLAG);                                  02564000
  VALUE DITP,SIOP,QFLAG;   LOGICAL QFLAG;                               02566000
  POINTER DITP,SIOP;   OPTION EXTERNAL;                                 02568000
                                                                        02570000
INTEGER PROCEDURE TIMEREQ(CODE,REQ,TIME);                               02572000
  VALUE CODE,REQ,TIME;                                                  02574000
  INTEGER CODE,REQ;   DOUBLE TIME;                                      02576000
  OPTION EXTERNAL;                                                      02578000
$PAGE                                                                   02580000
<<     ******************************************                       02582000
       *                                        *                       02584000
       *   MT DRIVER INITIALIZATION PROCEDURE   *                       02586000
       *                                        *                       02588000
       ******************************************       >>              02590000
                                                                        02592000
                                                                        02594000
   PROCEDURE MTINIT(DITP);                                              02596000
     INTEGER ARRAY  DITP;                                               02598000
                                                                        02600000
<<                                                                      02602000
       THIS PROCEDURE INITIALIZES THE BUFFER ADDRESSES FOR              02604000
       MOST READ, WRITE, AND END COMMANDS IN THE CHANNEL                02606000
       PROGRAM.                                                         02608000
>>                                                                      02610000
                                                                        02612000
     BEGIN                                                              02614000
       INTEGER POINTER   ILTP = Q+1;                                    02616000
       INTEGER POINTER   SIOP = Q+2;                                    02618000
       INTEGER        SIOBASE = Q+3;                                    02620000
       INTEGER POINTER   STAP = Q+4;                                    02622000
       INTEGER        STABASE = Q+5;                                    02624000
       INTEGER POINTER IDLECP = Q+6;                                    02626000
                                                                        02628000
                                                                        02630000
       TOS := DITP(DILTP);       << ILTP    >>                          02632000
       TOS := ILTP(ISIOP);       << SIOP    >>                          02634000
       TOS := @SIOP + SYSDB;     << SIOBASE >>                          02636000
       TOS := ILTP(ISTAP);       << STAP    >>                          02638000
       TOS := @STAP + SYSDB;     << STABASE >>                          02640000
       TOS := @SIOP + IDLE;      << IDLECP >>                           02642000
                                                                        02644000
                                                                        02646000
       IF ILTP(IFLAG).(1:1) <> 0 THEN RETURN; <<IDLECP ALREADY STARTED>>02648000
                                                                        02650000
                                                                        02652000
       SIOP( 6) := SIOBASE + SLCTUNIT;                                  02654000
       SIOP(11) := SIOBASE + CMDWORD;                                   02656000
       SIOP(71) := SIOBASE + SLCTUNIT;                                  02658000
       SIOP(76) := SIOBASE + CMDWORD;                                   02660000
       SIOP(33) := SIOBASE + SPFDCMD;                                   02662000
       SIOP(38) := SIOBASE + BYTECOUNT;                                 02664000
       SIOP(47) := SIOBASE + STATUS;                                    02666000
       SIOP(59) := SIOBASE + STATUS;                                    02668000
       SIOP( 98):= SIOBASE + IDLEND;                                    02670000
       SIOP( 52):= SIOBASE + ENDCMD;                                    02672000
       SIOP( 64):= SIOBASE + ENDCMD;                                    02674000
       SIOP(113):= SIOBASE + ENDCMD;                                    02676000
       SIOP(108):=STABASE;                                              02678000
                                                                        02680000
       START'HPIB(DITP,IDLECP,FALSE);                                   02682000
     END;                                                               02684000
$PAGE                                                                   02686000
<<    ********************************************                      02688000
      *                                          *                      02690000
      *   MAG TAPE DRIVER PROCEDURE  -  MTDRVR   *                      02692000
      *                                          *                      02694000
      ********************************************         >>           02696000
                                                                        02698000
                                                                        02700000
                                                                        02702000
  INTEGER PROCEDURE MTDRVR(IOQP,DITP,BANK,BUFFADDR,SIOP,DRTN);          02704000
                                                                        02706000
<<    THIS PROCEDURE INITIATES AND COMPLETES I/O REQUESTS               02708000
      FOR THE HP 7976 MAGNETIC TAPE CONNECTED TO THE HP-IB              02710000
      AND CONTROLLED BY THE GIC.                                        02712000
                                                                        02714000
      STATE RETURNS FOR MTDRVR -                                        02716000
          5 - REQUEST COMPLETED                                         02718000
          7 - OPERATOR INTERVENTION REQUIRED                            02720000
        %13 - WAIT FOR OPERATION COMPLETION                             02722000
>>                                                                      02724000
                                                                        02726000
  VALUE DITP,IOQP,BANK,BUFFADDR,SIOP,DRTN;                              02728000
  INTEGER  BANK,BUFFADDR,DRTN;                                          02730000
  INTEGER POINTER  DITP,IOQP,SIOP;                                      02732000
  OPTION  PRIVILEGED,UNCALLABLE;                                        02734000
                                                                        02736000
                                                                        02738000
  BEGIN                                                                 02740000
                                                                        02742000
    LOGICAL                                                             02744000
      LS0 = S-0;                                                        02746000
                                                                        02748000
    DOUBLE                                                              02750000
      BUFFADDRD = Q-7;    << BANK AND BUFFER ADDRESS >>                 02752000
                                                                        02754000
    INTEGER POINTER                                                     02756000
      CPVAP     = Q+1,    << HOLDS CHANNEL I/O STATUS >>                02758000
      IDLESIO   = Q+2,    << POINTS TO START OF IDLE CHAN PROG >>       02760000
      STATSIO   = Q+3,    << POINTS TO START OF STATUS CHAN PROG >>     02762000
      AIOQP     = Q+4,    << POINTS TO IOQ IN USE >>                    02764000
      SBUFF     = DB + SYSSBUFF;   << POINTS TO SYSTEM BUFF AREA >>     02766000
                                                                        02768000
    INTEGER                                                             02770000
      XFERCNT   = Q+5,    << BUFFER BYTE COUNT >>                       02772000
      FCODE     = Q+6,    << FUNCTION CODE >>                           02774000
      MTSTATE   = MTDRVR, << MAG TAPE STATE >>                          02776000
      S0        = S-0,                                                  02778000
      S1        = S-1,                                                  02780000
      S3        = S-3,                                                  02782000
      X         = X;                                                    02784000
                                                                        02786000
    DEFINE  FCDE = IOQP(QFUNC).FUNC#;                                   02788000
    DEFINE  DSTN = AIOQP(4).(1:15)#;                                    02790000
                                                                        02792000
    LOGICAL ARRAY                                                       02794000
      DITPL(*) = DITP,  IOQPL(*) = AIOQP,   SIOPL(*) = SIOP;            02796000
    DOUBLE POINTER                                                      02798000
      LPDTD     = DB + SYSLPDT;                                         02800000
$PAGE                                                                   02802000
   << INITIALIZE LOCAL POINTERS AND VARIABLES >>                        02804000
                                                                        02806000
                                                                        02808000
    TOS := DITP(DILTP);          << CPVAP >>                            02810000
    TOS := @SIOP + IDLE;         << IDLESIO >>                          02812000
    TOS := @SIOP + CPSTAT;       << STATSIO >>                          02814000
    TOS := @IOQP;                 <<CURRENT IOQP>>                      02816000
                                                                        02818000
         <<   RESET POWER ON INDICATION  >>                             02820000
                                                                        02822000
                                                                        02824000
    SIOP(-2).(2:1) := 0; <<RESET POWER ON BIT IN ILT>>                  02826000
    IF <> THEN   <<  PF STATUS SO   >>                                  02828000
    DITP(DSAVE).PFBIT:=1;  <<SET POWER FAIL/UP IN DIT>>                 02830000
                                                                        02832000
                                                                        02834000
<<   CHECK FOR IDLE CHANNEL PROGRAM REQUEST   >>                        02836000
                                                                        02838000
  IF @IOQP = 0 THEN    << START IDLE CHANNEL PROGRAM >>                 02840000
    BEGIN                                                               02842000
      START'HPIB(DITP,IDLESIO,FALSE);                                   02844000
      IF < THEN   << SIO FAILURE >>                                     02846000
        BEGIN                                                           02848000
          TOS := SIOFAIL;                                               02850000
          GOTO BADIO;                                                   02852000
        END;                                                            02854000
      CPVAP := 0;                                                       02856000
NOIDL:                                                                  02858000
      MTSTATE := REQUESTDONE;                                           02860000
      RETURN;                                                           02862000
    END;                                                                02864000
                                                                        02866000
    <<   CHECK FOR ABORT REQUEST    >>                                  02868000
                                                                        02870000
                                                                        02872000
  IF AIOQP.ABORT=1 THEN      << ABORT PROCESS >>               <<03759>>02874000
    BEGIN                                                      <<03759>>02876000
      << ABORT CURRENT IOQ  >>                                 <<03759>>02878000
      DITP(DSAVE).CLEAR'ACTIVE :=0;                            <<03759>>02880000
      IF < > THEN                                              <<03759>>02882000
        BEGIN                                                  <<03759>>02884000
          SIOP(92) := -51; << RESET IDLE CHANNEL PROGRAM >>    <<03759>>02886000
          SIOP(93) := -39;                                     <<03759>>02888000
          SIOP(94) := %2007;                                   <<03759>>02890000
          SIOP(95) : =1;                                       <<03759>>02892000
          SIOP(96) : =0;                                       <<03759>>02894000
          SIOP(97) : =%42000;                                  <<03759>>02896000
          TOS := IF IOQPL.PFAIL THEN PFABORT ELSE ABORTED;     <<03759>>02898000
          GO TO UNUSUALEND;                                    <<03759>>02900000
        END                                                    <<03759>>02902000
        ELSE                                                   <<03759>>02904000
        IF AIOQP(QLINK) <> 0 THEN << CHECK FOR QUEUED IO>>     <<03759>>02906000
          BEGIN                                                <<03759>>02908000
            @AIOQP := IOQP(QLINK); << POINT TO NEXT IOQ>>      <<03759>>02910000
            IF AIOQP(QMISC).SUBSTATE <> NEWREQ THEN            <<03759>>02912000
              BEGIN                                            <<03759>>02914000
                AIOQP.ABORT := 1; << ABORT NEXT REQUEST >>     <<03759>>02916000
              END;                                             <<03759>>02918000
            @AIOQP := @IOQP; << RESET POINTER >>               <<03759>>02920000
          END;                                                 <<03759>>02922000
                                                               <<03759>>02924000
            SIOP(92) := 0; << BUILD CLEAR CHANNEL PROGRAM  >>  <<03759>>02926000
            SIOP(93) := 0;                                     <<03759>>02928000
            SIOP(94) := %4400;                                 <<03759>>02930000
                                                               <<03759>>02932000
            SIOP(95) := 0;                                     <<03759>>02934000
            SIOP(96) := 0;                                     <<03759>>02936000
            SIOP(97) := 1;                                     <<03759>>02938000
            SIOP(01) := 88; << START OF CLEAR PROGRAM >>       <<03759>>02940000
            START'HPIB(DITP,SIOP,FALSE); << CLEAR CONT >>      <<03759>>02942000
            IOQP(QSTAT).IOSTAT := CMPLTIONWAIT;                <<03759>>02944000
            DITP(DSAVE).CLEAR'ACTIVE := 1;                     <<03759>>02946000
            RETURN;                                            <<03759>>02948000
        END;                                                   <<03759>>02950000
                                                               <<03759>>02952000
                                                                        02954000
                                                                        02956000
                                                                        02958000
     <<   CHECK FOR POWER UP CONDITION   >>                             02960000
                                                                        02962000
    IF DITP(DSAVE).PFBIT=1 THEN                                         02964000
    BEGIN  <<POWER FAILED/UP>>                                          02966000
      DITP(DSAVE).PFBIT := 0;  << RESET PF BIT >>                       02968000
      TOS:=POWERUP;                                                     02970000
      GO TO BADIO;                                                      02972000
    END;  <<POWER FAILED/UP>>                                           02974000
                                                                        02976000
                                                                        02978000
    <<   CHECK TIMER   >>                                               02980000
                                                                        02982000
  IF DITP(DTIME).(0:1)=1 THEN   << TIMER HAS POPPED >>                  02984000
    BEGIN                                                               02986000
      ABORTTIMEREQ(DITP(DRQST));                                        02988000
      DITP(DTIME) := 0;                                                 02990000
      DITP(DSAVE).RWUNLD := 1;                                          02992000
      TOS := REWUNLDCMD;                                                02994000
      GOTO CONTROLCONT;                                                 02996000
    END;                                                                02998000
                                                                        03000000
$PAGE                                                                   03002000
                                                                        03004000
<<This section of code controls the states                              03006000
  used for command queuing.>>                                           03008000
                                                                        03010000
   IF FCDE=WRITEFC OR FCDE=READFC OR FCDE=BACKREADFC                    03012000
   THEN                                                                 03014000
   BEGIN                                                       <<02713>>03016000
                                                               <<02655>>03018000
        << CHECK FOR 0 WORDS IN I/O >>                         <<02655>>03020000
                                                               <<02655>>03022000
     IF FCDE=READFC AND AIOQP(QWBCT)=0 THEN                    <<02655>>03024000
       BEGIN                                                   <<02655>>03026000
         AIOQP(QFUNC).FUNC:=FSRECORDFC;                        <<02655>>03028000
         TOS := AIOQP(QWBCT);                                  <<02713>>03030000
         TOS := AIOQP(QFUNC).FUNC;                             <<02713>>03032000
         GO TO FSRPEOF;                                        <<02655>>03034000
       END;                                                    <<02655>>03036000
     IF FCDE=BACKREADFC AND AIOQP(QWBCT)=0 THEN                <<02655>>03038000
       BEGIN                                                   <<02655>>03040000
         AIOQP(QFUNC).FUNC:=BSRECORDFC;                        <<02655>>03042000
         TOS := AIOQP(QWBCT);                                  <<02713>>03044000
         TOS := AIOQP(QFUNC).FUNC;                             <<02713>>03046000
         GO TO BSRPEOF;                                        <<02655>>03048000
        END;                                                   <<02655>>03050000
     IF FCDE=WRITEFC AND AIOQP(QWBCT)=0 THEN                   <<02655>>03052000
       BEGIN                                                   <<02713>>03054000
         TOS := AIOQP(QWBCT);                                  <<02713>>03056000
         TOS := AIOQP(QFUNC).FUNC;                             <<02713>>03058000
         IF MTSTATE < > 2 THEN                                 <<04304>>03060000
           BEGIN << WRITE RING PATCH >>                        <<04304>>03062000
             SIOP(STATUS).FILEPROTECT := 0;                    <<04304>>03064000
             GOTO CMPLTR;                                      <<04304>>03066000
           END;                                                <<04304>>03068000
         GOTO TESTWRITE;                                       <<04304>>03070000
        END;                                                   <<02713>>03072000
                                                               <<02655>>03074000
                                                               <<02655>>03076000
     IF(AIOQP(QLINK)=0) THEN    <<IS THERE ANOTHER I/O OPERATION>>      03078000
     BEGIN                                                              03080000
       AIOQP(QMISC).COMQUEUE:=NOTQUEUING;<<NO QUEUING>>                 03082000
       IF AIOQP(QMISC).SUBSTATE=FIRSTBRK THEN                           03084000
          AIOQP(QMISC).SUBSTATE:=SECNDREQ;                              03086000
     END                                                                03088000
     ELSE                                                               03090000
     BEGIN <<LOOK AHEAD AT IOQS>>                                       03092000
       IF AIOQP(QMISC).SUBSTATE=SECNDREQ THEN                           03094000
          BEGIN  <<AT FIRSTBREAK WITH ALTERNATE RUNING>>                03096000
           IF CPVAP.ERRORCODE > 5 THEN  << CHANNEL DMA ABORT >>         03098000
             GOTO CHANERROR                                             03100000
           ELSE                                                         03102000
            GOTO NOQ;                                                   03104000
          END;  <<AT FIRSTBREAK WITH ALTERNATE RUNING>>                 03106000
       IF AIOQP(QMISC).SUBSTATE <> FIRSTBRK THEN GO NOQ;                03108000
          AIOQP(QMISC).SUBSTATE:=SECNDREQ;                              03110000
          @AIOQP:=IOQP(QLINK);  <<POINT TO NEXT IOQ>>                   03112000
          AIOQP(QMISC).COMQUEUE:=QUEUING;<<SET COMMAND QUEUING FLAG>>   03114000
    END;  <<LOOK AHEAD AT IOQS>>                                        03116000
   END;                                                        <<02713>>03118000
                                                                        03120000
<<End of code to control command queuing states>>                       03122000
                                                               <<02655>>03124000
       << WE NEED TO CHECK HERE FOR COMMMAND >>                <<02655>>03126000
       << QUEUEING. THE TWO CHECKS DO NO NEED >>               <<02655>>03128000
       << TO BE MADE, IF WE ARE NOT QUEUING. >>                <<02655>>03130000
                                                               <<02655>>03132000
                                                               <<02655>>03134000
     IF AIOQP(QMISC).COMQUEUE = QUEUING THEN                   <<02655>>03136000
       BEGIN                                                   <<02655>>03138000
                                                               <<02655>>03140000
        << CHECK FOR 0 WORDS IN I/O >>                         <<02655>>03142000
         IF( FCDE=READFC OR FCDE=BACKREADFC OR FCDE=WRITEFC)   <<02655>>03144000
         AND AIOQP(QWBCT)=0 THEN                               <<02655>>03146000
           BEGIN                                               <<02655>>03148000
                                                               <<02655>>03150000
        << POINT TO PREVIOUS QUEUE >>                          <<02655>>03152000
                                                               <<02655>>03154000
             AIOQP(QMISC).COMQUEUE:=NOTQUEUING;                <<02655>>03156000
             @AIOQP:=@IOQP;                                    <<02655>>03158000
             IOQP(QMISC).COMQUEUE := NOTQUEUING;               <<02655>>03160000
             GO TO NOQ;                                        <<02655>>03162000
           END;                                                <<02655>>03164000
                                                               <<02655>>03166000
                                                                        03168000
                                                               <<02655>>03170000
        << WE WILL DO COMMAND QUEUING FOR ONLY READS, >>       <<02655>>03172000
        << BACKREADS, AND WRITES. THIS COMMAND SCHEME >>       <<02655>>03174000
        << CHANGE WAS AGREED TO ON 06/18/81. >>                <<02655>>03176000
                                                               <<02655>>03178000
        << POINT TO PREVIOUS QUEUE, IF NOT THE PROPER >>       <<02655>>03180000
        << COMMAND SEQUENCE >>                                 <<02655>>03182000
                                                               <<02655>>03184000
         IF  IOQP(QFUNC).FUNC <> AIOQP(QFUNC).FUNC             <<02655>>03186000
         THEN                                                  <<02655>>03188000
           BEGIN                                               <<02655>>03190000
             AIOQP(QMISC).COMQUEUE:=NOTQUEUING;                <<02655>>03192000
             @AIOQP:=@IOQP;                                    <<02655>>03194000
             IOQP(QMISC).COMQUEUE := NOTQUEUING;               <<02655>>03196000
           END;                                                <<02655>>03198000
       END;                                                    <<02655>>03200000
                                                               <<02655>>03202000
                                                                        03204000
    <<   CHECK BYTE TRANSFER COUNT   >>                                 03206000
                                                                        03208000
                                                                        03210000
NOQ:                                                                    03212000
    TOS := AIOQP(QWBCT);         << XFERCNT >>                          03214000
    IF < THEN                       << BYTE COUNT >>                    03216000
      TOS := -TOS                      << MAKE POSITIVE >>              03218000
    ELSE                            << WORD COUNT >>                    03220000
      TOS := TOS&ASL(1);               << MAKE BYTE COUNT >>            03222000
    TOS := AIOQP(QFUNC).FUNC;     << FCODE >>                           03224000
$PAGE                                                                   03226000
                                                                        03228000
      << MOTION COMMANDS HAVE A ONE PASS CHANNEL                        03230000
         PROGRAM >>                                                     03232000
                                                                        03234000
                                                                        03236000
  IF AIOQP(QMISC).SUBSTATE=FINLCOMP                                     03238000
    THEN GO TO CMPLTR;                                                  03240000
                                                                        03242000
  IF MTSTATE=2 OR AIOQP(QMISC).SUBSTATE<>FINLCOMP THEN                  03244000
      <<******ELSE GO TO CONTINUATOR SECTION******>>                    03246000
                                                                        03248000
    <<***  INITIATOR SECTION  ***>>                                     03250000
                                                                        03252000
                                                                        03254000
      <<  CHECK FUNCTION CODE AND TRANSFER COUNT  >>                    03256000
                                                                        03258000
    BEGIN                                                               03260000
    IF AIOQP(QMISC).SUBSTATE=NEWREQ THEN                                03262000
      BEGIN                                                             03264000
      IF FCODE > 22 OR XFERCNT > MAXBSIZE THEN                          03266000
        BEGIN                                                           03268000
          TOS := INVALIDRQST;                                  <<02683>>03272000
          GOTO UNUSUALEND;                                     <<02814>>03274000
        END;                                                            03276000
      END;                                                              03278000
                                                                        03280000
   <<  CHECK FOR FIRST CHANNEL PROGRAM FINISH  >>                       03282000
                                                                        03284000
      IF AIOQP(QMISC).SUBSTATE=SECNDREQ THEN                            03286000
        AIOQP(QMISC).SUBSTATE:=FINLCOMP;                                03288000
$PAGE                                                                   03290000
      X := FCODE;  << SWITCH ON REQUEST CODE >>                         03292000
      ASMB( LOAD STABLE,X; ADAX; BR STABLE,X;                           03294000
        STABLE:                                                         03296000
          CON READ;     CON WRITE;    CON FOPEN;    CON FCLOSE;         03298000
          CON DCLOSE;   CON REWIND;   CON WRTFMARK; CON FSFILE;         03300000
          CON BSFILE;   CON REWUNLD;  CON TAPEGAP;  CON FSRECORD;       03302000
          CON BSRECORD; CON BACKREAD; CON TTCOUNT;  CON STATREAD;       03304000
          CON SETDENS;   CON DLDIAG;   CON DLDIAG;   CON RDDGSTAT;      03306000
          CON LOOPBACK;  CON SELFTEST; CON ENDDIAG);                    03308000
                                                                        03310000
                                                                        03312000
$PAGE                                                                   03314000
                                                                        03316000
READ:                                                                   03318000
      IF AIOQP(QMISC).SUBSTATE=FINLCOMP THEN <<ACCEPT DATA>>            03320000
        BEGIN                                                           03322000
                                                                        03324000
        IF XFERCNT < 6 THEN                                             03326000
          BEGIN  << SHORT READ FOR THE EOF CHECK FOR JOB CARDS >>       03328000
            SIOP(SRBUFF) := SIOP(SRBUFF+1) := SIOP(SRBUFF+2) := 0;      03330000
            SIOP(RDBYCNT) := 6; << RD 6 BYTES INTO CHAN PROG AREA >>    03332000
            SIOP(BADDR1) := @SIOP(SRBUFF) + SYSDB;                      03334000
            SIOP(MEMX1) := 0;                                           03336000
            DITP(DSAVE).SHORT := 1;                                     03338000
          END                                                           03340000
          ELSE                                                          03342000
          BEGIN                                                         03344000
            SIOP(RDBYCNT):= XFERCNT;                                    03346000
            SIOP(BADDR1):= BUFFADDR; <<BUFFER ADDRESS>>                 03348000
            SIOP(MEMX1):= BANK; <<BANK NUMBER>>                         03350000
          END;                                                          03352000
                                                                        03354000
          SIOP(1)     := 14; <<JUMP TO START OF SECOND PRGM>>           03356000
          SIOP(37)    := %2000; <<BANK 0 TRANSFER COUNT>>               03358000
          GO TO IOCONT;                                                 03360000
        END;                                                            03362000
                                                                        03364000
                                                                        03366000
        IF AIOQP(QMISC).SUBSTATE=NEWREQ THEN                            03368000
          BEGIN                                                         03370000
            EOFCHECK(AIOQP,0D,0,0);  << PREREAD EOF CHECK >>            03372000
            IF <> THEN   << EOF FOUND >>                                03374000
              BEGIN                                                     03376000
                IF AIOQP(QMISC).COMQUEUE=QUEUING THEN                   03378000
                                                                        03380000
                   << FINISH OFF REQUEST >>                             03382000
                                                                        03384000
                  BEGIN                                                 03386000
                    AIOQP(QMISC).COMQUEUE := NOTQUEUING;                03388000
                    AIOQP(QMISC).SUBSTATE := FINLCOMP;                  03390000
                                                                        03392000
                    << RESET PREVIOUS QUEUE >>                          03394000
                                                                        03396000
                    IOQP(QMISC).COMQUEUE := NOTQUEUING;                 03398000
                    IOQP(QMISC).SUBSTATE := FINLCOMP;                   03400000
                    GO TO IOCONT;                                       03402000
                  END;                                                  03404000
                                                                        03406000
                AIOQP(QMISC).SUBSTATE:=0;                               03408000
                MTSTATE := REQUESTDONE;                                 03410000
                RETURN;                                                 03412000
              END;                                                      03414000
          END;                                                 <<02683>>03416000
                                                                        03418000
      SIOP(1):=0; <<JUMP TO START>>                                     03422000
      SIOP(7):=%2001;  <<RESET MOTION CMD>>                             03424000
      SIOP(8):=1;  <<RESET BYTE COUNT>>                                 03426000
      SIOP(DSJ'RWJMP):=0; <<JUMP AROUND SPARE>>                         03428000
      SIOP(20):=0;  <<RESET FOR READ>>                                  03430000
      SIOP(23):=0;                                                      03432000
      SIOP(24):=%1400;  <<RESET>>                                       03434000
      SIOP(29):=%2007;  <<RESET END>>                                   03436000
      SIOP(30):=1;      <<RESET END>>                                   03438000
      SIOP(21):=33; <<RESET STATUS JUMP>>                               03440000
      AIOQP(QMISC).SUBSTATE:=FIRSTBRK;                                  03442000
      SIOP(CMDWORD):=READCMD;                                           03444000
$PAGE                                                                   03446000
                                                                        03448000
                                                                        03450000
INITIO:                                                                 03452000
      TOS := DITPL(DLDEV) LAND %1400;  << PUT UNIT # IN SELECT CMD >>   03454000
      SIOP(SLCTUNIT) := (TOS + %400)&ASR(8);                            03456000
      SIOP(SLCTUNIT):=0;                                                03458000
                                                                        03460000
IOCONT:                                                                 03462000
      START'HPIB(DITP,SIOP,TRUE);                                       03464000
      IF < THEN  << SIO FAILURE >>                                      03466000
        BEGIN                                                           03468000
          TOS := SIOFAIL;                                               03470000
          GOTO BADIO;                                                   03472000
        END;                                                            03474000
      CPVAP:=0;                                                         03476000
      DITP(DSAVE).RWBIT := 0;  << RESET REWIND BIT >>                   03478000
      MTSTATE := INTRPTWAIT;                                            03480000
      IF IOQPL(QMISC).BODEOF THEN RETURN;                               03482000
      TOS := CMPLTIONWAIT;                                              03484000
      AIOQP(QSTAT).IOSTAT := TOS;                                       03486000
      RETURN;                                                           03488000
                                                                        03490000
                                                                        03492000
$PAGE                                                                   03494000
                                                                        03496000
                                                                        03498000
                                                                        03500000
WRITE:                                                                  03502000
      IF AIOQP(QMISC).SUBSTATE=FINLCOMP THEN <<GET STATUS>>             03504000
        BEGIN                                                           03506000
                                                               <<02655>>03508000
         << UNIT'S STATUS FOR FAILURE CONDITION'S >>           <<02655>>03510000
                                                               <<02655>>03512000
                                                               <<02700>>03514000
       << CHECK FOR ERRORS >>                                  <<02700>>03516000
                                                               <<02700>>03518000
          IF CPVAP(1).(14:2) <> 0 THEN                         <<02700>>03520000
                                                               <<02655>>03522000
            BEGIN                                              <<02700>>03524000
              IF NOT SIOPL(STATUS).ONLINE THEN GOTO CMPLTR;    <<02700>>03528000
              IF(SIOPL(STATUS) LAND %7037)<>0 THEN GOTO CMPLTR;<<02700>>03530000
            END;                                               <<02700>>03532000
                                                               <<02700>>03534000
          SIOP(1):=86; <<JUMP TO SECOND CHANNEL PRGM>>                  03536000
          GO TO IOCONT;                                                 03538000
        END;                                                            03540000
                                                                        03542000
                                                               <<02683>>03544000
      IF DITPL(DSTAT).EOT AND NOT IOQPL(QPAR2).EOTFLAG THEN             03548000
        BEGIN   << ATTEMPTED WRITE AFTER EOT DETECTED >>                03550000
          IF AIOQP(QMISC).COMQUEUE=QUEUING THEN                         03552000
            BEGIN                                                       03554000
                                                                        03556000
                 << FINISH OFF REQUEST >>                               03558000
                                                                        03560000
              AIOQP(QMISC).COMQUEUE := NOTQUEUING;                      03562000
              AIOQP(QMISC).SUBSTATE := NEWREQ;                 <<02713>>03564000
                                                                        03566000
               << RESET PREVIOUS IOQ >>                                 03568000
                                                                        03570000
              IOQP(QMISC).COMQUEUE := NOTQUEUING;                       03572000
              IOQP(QMISC).SUBSTATE := FINLCOMP;                         03574000
                                                               <<02683>>03576000
        << WE CANNOT WRITE PAST EOT >>                         <<02683>>03578000
        << SO JUST FINISH OFF BOTH REQUESTS >>                 <<02683>>03580000
                                                               <<02683>>03582000
              @AIOQP := @IOQP; <<POINT TO PREVIOUS>>           <<02683>>03584000
              GO TO IOCONT;                                             03586000
            END;                                                        03588000
          TOS := EOTWRITE;                                              03590000
          GOTO UNUSUALEND;                                     <<02814>>03592000
        END;                                                            03594000
      SIOP(1):=65; <<JUMP TO START>>                                    03596000
      SIOP(WRBYCNT):=XFERCNT;                                           03598000
      <<SINCE IOQP IS NOT NECCESSARILY THE ONE CALLED >>                03600000
      <<THEN BANK AND BUFFER MAY BE INCORRECT. THEREFORE>>              03602000
      << IT IS NECCESSARY TO RECALCULATE THEM HERE>>                    03604000
      TOS:=ABS(2);  <<DST POINTER>>                                     03606000
      TOS:=TOS+(4*DSTN+2);  <<POINTS TO BANK NUMBER>>                   03608000
      TOS:=ABS(S0).(8:8);   <<BANK NUMBER>>                             03610000
      TOS:=ABS(S1+1);  <<DST ADDRESS>>                                  03612000
      TOS:=TOS+1;     <<POINTS TO STACK DB REGISTER>>                   03614000
      ASSEMBLE(LSEA);  <<TOS NOW CONTAINS CONTENTE DB REG>>             03616000
        << S= STACK DB REG CONTENTS>>                                   03618000
        << S-1=DST ADDRESS>>                                            03620000
        <<S-2=BANK NUMBER>>                                             03622000
        <<S-3=POINTER IN DST TABLE TO BANK>>                            03624000
      IF AIOQP(QDSTN).(0:1)=0 THEN S0:=0;                               03626000
      SIOP(BADDR2):=TOS+AIOQP(5)+(S1-1); <<BUFFER ADDRESS>>             03628000
      ASSEMBLE(DEL);                                                    03630000
      SIOP(MEMX2):=TOS;  <<BANK NUMBER>>                                03632000
      ASSEMBLE(DEL);                                                    03634000
      SIOP(81):=%2000;  <<RESET>>                                       03636000
      SIOP(83):=0;      <<RESET>>                                       03638000
      SIOP(73):=1;  <<RESET BYTE COUNT>>                                03640000
      SIOP(72):=%2001;  <<RESET MOTION CMD>>                            03642000
      SIOP(92):=-51;   <<RESET STATUS JUMP>>                            03644000
      SIOP(93):=-39;   <<RESET STATUS JUMP>>                            03646000
      SIOP(86):=%601;  <<RESET INT/HALT>>                               03648000
      SIOP(87):=0;                                                      03650000
      AIOQP(QMISC).SUBSTATE:=FIRSTBRK;                                  03652000
      SIOP(CMDWORD):=WRITECMD; << WRITE MOTION COMMAND >>               03654000
      GOTO INITIO;                                                      03656000
                                                                        03658000
$PAGE                                                                   03660000
                                                                        03662000
REWIND:                                                                 03664000
      IF DITPL(DSAVE).RWBIT AND DITPL(DSTAT).LOADP THEN                 03666000
        GOTO GOODEND;                                                   03668000
      TOS := REWINDCMD;                                                 03670000
                                                                        03672000
CONTROLCONT:                                                            03674000
      SIOP(CMDWORD) := TOS;                                             03676000
      SIOP(DSJ'RWJMP) := 2;  << BRANCH AROUND READ/WRITE DATA LOGIC >>  03678000
      SIOP(20):=21;  <<BRANCH AROUND RD LOGIC>>                         03680000
      SIOP(21):=33;                                                     03682000
      SIOP(1):=0;                                                       03684000
      SIOP(7):=%2001; <<RESET>>                                         03686000
      SIOP(8):=1;  <<RESET>>                                            03688000
DLWR:                                                                   03690000
      IF AIOQP(QMISC).SUBSTATE=FINLCOMP THEN GO CHKERR;                 03692000
      AIOQP(QMISC).SUBSTATE:=FINLCOMP;                                  03694000
      GOTO INITIO;                                                      03696000
                                                                        03698000
                                                                        03700000
WRTFMARK:                                                               03702000
                                                               <<02683>>03704000
      IF DITPL(DSTAT).EOT AND NOT IOQPL(QPAR2).EOTFLAG THEN    <<02683>>03706000
        BEGIN   << ATTEMPTED WRITE AFTER EOT DETECTED >>       <<02683>>03708000
          TOS := EOTWRITE;                                     <<02683>>03710000
          GOTO UNUSUALEND;                                     <<02814>>03712000
        END;                                                   <<02683>>03714000
      TOS:=WRTFMARKCMD;                                                 03716000
      AIOQP(QMISC).SUBSTATE:=FIRSTBRK;                                  03718000
      GO TO CONTROLCONT;                                                03720000
                                                                        03722000
FSFILE:                                                                 03724000
      TOS := FSFILECMD;                                                 03726000
      GOTO CONTROLCONT;                                                 03728000
                                                                        03730000
                                                                        03732000
BSFILE:                                                                 03734000
      TOS := BSFILECMD;                                                 03736000
CHECKLOADP:                                                             03738000
      IF DITPL(DSTAT).LOADP THEN  << TRIED TO BACKSPACE AT BOT >>       03740000
        BEGIN                                                           03742000
          TOS := BSPCATBOT;                                             03744000
          GOTO UNUSUALEND;                                     <<02814>>03746000
        END;                                                            03748000
      GOTO CONTROLCONT;                                                 03750000
                                                                        03752000
                                                                        03754000
TAPEGAP:                                                                03756000
      TOS := TAPEGAPCMD;                                                03758000
      GOTO CONTROLCONT;                                                 03760000
                                                                        03762000
                                                                        03764000
DCLOSE:                                                                 03766000
      TOS := LPDTD(DITP(DLDEV).LDEV);                                   03768000
      TOS.EOFBIT := 0;                                                  03770000
      LPDTD(X) := TOS;  << RESET EOF FIELD IN LPDT >>                   03772000
                                                                        03774000
REWUNLD:                                                                03776000
      TOS := REWUNLDCMD;                                                03778000
      IF DITPL(DSAVE).RWBIT AND NOT DITPL(DSTAT).ONLINE THEN            03780000
        GOTO GOODEND;                                                   03782000
      GOTO CONTROLCONT;                                                 03784000
                                                                        03786000
SETDENS:                                                                03788000
      IF DENSITY = PE16 THEN                                            03790000
      TOS := SETDENSLOC                                                 03792000
      ELSE                                                              03794000
      TOS := SETDENSHIC;                                                03796000
      GO TO CONTROLCONT;                                                03798000
DLDIAG:                                                                 03800000
      SIOP(92):=-51; <<RESET STATUS JUMP>>                              03802000
      SIOP(93):=-93;  <<RESET STATUS JUMP>>                             03804000
      SIOP(86):=%601;  <<RESET INTERRUPT HALT>>                         03806000
      SIOP(1):=70;  <<JUMP TO START>>                                   03808000
      SIOP(WRBYCNT):=XFERCNT;                                           03810000
      SIOP(BADDR2):=BUFFADDR;                                           03812000
      SIOP(MEMX2):=BANK;                                                03814000
      SIOP(72):=0;  <<JUMP AROUND>>                                     03816000
      SIOP(73):=7;                                                      03818000
      IF FCODE=17 THEN                                                  03820000
        SIOP(81):=%2003                                                 03822000
      ELSE                                                              03824000
      BEGIN                                                             03826000
        SIOP(81):=%2004;  <<DL DIAG>>                                   03828000
        SIOP(86):=0    ;<<JUMP 0>>                                      03830000
        SIOP(92):=-41  ;<<GOTO INTERUPT HALT CODE=0>>                   03832000
        SIOP(93):=-41  ;<<GOTO INTERUPT HALT >>                         03834000
      END;                                                              03836000
      SIOP(CMDWORD):=WRITECMD;                                          03838000
      GO TO DLWR;                                                       03840000
                                                                        03842000
RDDGSTAT:                                                               03844000
      SIOP(RDBYCNT):=XFERCNT;                                           03846000
      SIOP(BADDR1):=BUFFADDR;                                           03848000
      SIOP(MEMX1):=BANK;                                                03850000
      SIOP(29):=0;  <<JUMP TO INT HALT 0>>                              03852000
      SIOP(30):=22;                                                     03854000
      SIOP(1):=5;  <<JUMP TO START>>                                    03856000
      SIOP(7):=0;                                                       03858000
      SIOP(8):=15;                                                      03860000
      SIOP(24):=%1403;  <<READ DIAG STATUS CHANGED BY RFF>>             03862000
      SIOP(CMDWORD):=READCMD;                                           03864000
      GO TO DLWR;                                                       03866000
                                                                        03868000
ENDDIAG:                                                                03870000
      SIOP(1):=(46);                                                    03872000
      GOTO DLWR;                                                        03874000
LOOPBACK:                                                               03876000
      SIOP(1):=79;  <<JUMP TO START>>                                   03878000
      SIOP(81):=%4016; <<WRITE LOOPBACK COMMAND>>                       03880000
      SIOP(82):=XFERCNT;                                                03882000
      SIOP(83):=0;                                                      03884000
      SIOP(84):=BANK;                                                   03886000
      SIOP(85):=BUFFADDR;                                               03888000
      SIOP(86):=0;                                                      03890000
      SIOP(87):=0;       <<BYPASS INT HALT>>                            03892000
      SIOP(92):=-70;     <<JUMP TO READ LOOPBACK ON DSJ=0>>             03894000
      SIOP(93):=-39;     <<GO READ STATUS DSJ=1>>                       03896000
      SIOP(24):=%3416;   <<START READ LOOPBACK DSJ=0>>                  03898000
      SIOP(25):=XFERCNT;                                                03900000
      SIOP(26):=0;                                                      03902000
      SIOP(27):=BANK;                                                   03904000
      SIOP(28):=BUFFADDR;                                               03906000
      SIOP(29):=0;  <<JUMP TO DSJ>>                                     03908000
      SIOP(30):=8;                                                      03910000
      GO TO DLWR;                                                       03912000
                                                                        03914000
SELFTEST:                                                               03916000
      SIOP(1):=22;      <<JUMP TO START>>                               03918000
      SIOP(20):=59;     << FIX JUMP VECTOR >>                           03920000
      SIOP(21):=59;     << FIX JUMP VECTOR >>                           03922000
      SIOP(24):=%4017;  <<SELF TEST>>                                   03924000
      SIOP(25):=1;      <<SET BYTECNT=1>>                               03926000
      SIOP(29):=0;      <<BYTECOUNT>>                                   03928000
      SIOP(30):=-15;    <<BYPASS SPFD>>                                 03930000
      SIOP(26):=0;                                                      03932000
      SIOP(27):=BANK;                                                   03934000
      SIOP(28):=BUFFADDR;                                               03936000
      SIOP(81):=%3417;   <<READ SELFTEST RESULTS>>                      03938000
      SIOP(82):=1;       <<ONLY ONE BYTE RETURNED>>                     03940000
      SIOP(83):=0;                                                      03942000
      SIOP(84):=BANK;                                                   03944000
      SIOP(85):=BUFFADDR;                                               03946000
      SIOP(86):=%601;    <<RESET INT HALT>>                             03948000
      SIOP(87):=0;                                                      03950000
      GO TO DLWR;                                                       03952000
                                                                        03954000
FSRECORD:                                                               03956000
      EOFCHECK(AIOQP,0D,0,0);                                           03958000
      IF <> THEN GOTO EOFOUT;                                           03960000
FSRPEOF:                                                                03962000
      TOS := FSRECORDCMD;                                               03964000
      GOTO CONTROLCONT;                                                 03966000
                                                                        03968000
                                                                        03970000
BSRECORD:                                                               03972000
      EOFCHECK(AIOQP,0D,0,0);                                           03974000
      IF <> THEN GOTO EOFOUT;                                           03976000
BSRPEOF:                                                                03978000
      TOS := BSRECORDCMD;                                               03980000
      GOTO CHECKLOADP;                                                  03982000
                                                                        03984000
                                                                        03986000
BACKREAD:                                                               03988000
      IF AIOQP(QMISC).SUBSTATE=FINLCOMP THEN <<ACCEPT DATA>>            03990000
        BEGIN                                                           03992000
          SIOP(1)     :=14; <<JUMP TO START OF SECOND PRGM>>            03994000
          SIOP(RDBYCNT):=XFERCNT;                                       03996000
          SIOP(BADDR1):=BUFFADDR; <<BUFFER ADDRESS>>                    03998000
          SIOP(MEMX1) :=BANK; <<BANK NUMBER>>                           04000000
          SIOP(37)    :=%2000; <<BANK 0 TRANSFER COUNT>>                04002000
          GO TO IOCONT;                                                 04004000
        END;                                                            04006000
                                                                        04008000
      IF AIOQP(QMISC).SUBSTATE=NEWREQ THEN                              04010000
      BEGIN                                                             04012000
      EOFCHECK(AIOQP,0D,0,0);                                           04014000
      IF <> THEN                                                        04016000
        IF AIOQP(QMISC).COMQUEUE=QUEUING THEN                           04018000
          BEGIN                                                         04020000
                                                                        04022000
                  << FINISH OFF REQUEST >>                              04024000
                                                                        04026000
               AIOQP(QMISC).COMQUEUE := NOTQUEUING;                     04028000
               AIOQP(QMISC).SUBSTATE := FINLCOMP;                       04030000
                                                                        04032000
                   << RESET PREVIOUS IOQ >>                             04034000
                                                                        04036000
              IOQP(QMISC).COMQUEUE := NOTQUEUING;                       04038000
              IOQP(QMISC).SUBSTATE := FINLCOMP;                         04040000
            GO TO IOCONT;                                               04042000
          END                                                           04044000
        ELSE                                                            04046000
          GO TO EOFOUT;                                                 04048000
    END;                                                                04050000
      IF DITPL(DSTAT).LOADP THEN  << TRIED TO BACKREAD AT BOT >>        04054000
        BEGIN                                                           04056000
          IF AIOQP(QMISC).COMQUEUE=QUEUING THEN                         04058000
            BEGIN                                                       04060000
                                                                        04062000
                  << FINISH OFF REQUEST >>                              04064000
                                                                        04066000
              AIOQP(QMISC).COMQUEUE := NOTQUEUING;                      04068000
              AIOQP(QMISC).SUBSTATE := FINLCOMP;                        04070000
                                                                        04072000
                   << RESET PREVIOUS IOQ >>                             04074000
                                                                        04076000
              IOQP(QMISC).COMQUEUE := NOTQUEUING;                       04078000
              IOQP(QMISC).SUBSTATE := FINLCOMP;                         04080000
              GO TO IOCONT;                                             04082000
            END;                                                        04084000
                                                                        04086000
          TOS := GOODBOT;                                      <<02713>>04088000
          GOTO UNUSUALEND;                                     <<02713>>04090000
        END;                                                            04092000
      SIOP(7):=%2001;  <<RESET MOTION>>                                 04094000
      SIOP(8):=1;   <<RESET BYTE COUNT>>                                04096000
      SIOP(24):=%1400;  <<RESET>>                                       04098000
      SIOP(1):=0; <<JUMP TO START>>                                     04100000
      SIOP(DSJ'RWJMP):=0; <<JUMP AROUND SPARE>>                         04102000
      SIOP(20):=0; <<RESET FOR RD>>                                     04104000
      SIOP(23):=0;                                                      04106000
      AIOQP(QMISC).SUBSTATE:=FIRSTBRK;                                  04108000
      SIOP(CMDWORD):=BACKREADCMD;                                       04110000
      GOTO INITIO;                                                      04112000
                                                                        04114000
                                                                        04116000
TTCOUNT:                                                                04118000
                                                                        04122000
                                                               <<02655>>04124000
         << GET LAST TRANSFER COUNT >>                         <<02655>>04126000
                                                               <<02655>>04128000
      IF XFERCNT<2 THEN  << INVALID REQUEST >>                 <<02814>>04130000
        BEGIN                                                  <<02814>>04132000
          TOS := INVALIDRQST;                                  <<02814>>04134000
          GOTO UNUSUALEND;                                     <<02814>>04136000
        END;                                                   <<02814>>04138000
      TOS := BUFFADDRD;                                        <<02655>>04140000
      TOS := SIOP(BYTECOUNT);                                  <<02655>>04142000
      ASMB(SSEA );                                             <<02655>>04144000
      GOTO NOERROR;                                            <<02655>>04146000
                                                               <<02655>>04148000
                                                                        04150000
STATREAD:                                                               04152000
      IF XFERCNT<5 THEN  << INVALID REQUEST >>                          04154000
        BEGIN                                                           04156000
          TOS := INVALIDRQST;                                           04158000
          GOTO UNUSUALEND;                                     <<02814>>04160000
          HELP;   <<CAN NOT GET HERE>>                                  04162000
        END;                                                            04164000
      TOS := BANK;                                                      04166000
      TOS := BUFFADDR;                                                  04168000
      TOS := SIOP(STATUS);                                              04170000
      TOS := SIOP(STATUS+1);                                            04172000
      ASMB(SDEA);   << PUT 2 WORDS OF STATUS IN USER'S BUFFER >>        04174000
      TOS:=TOS+2;   <<GET 3RD WORD>>                                    04176000
      TOS:=SIOP(STATUS+2);                                              04178000
      ASMB(SSEA);                                                       04180000
      GOTO GOODEND;                                                     04182000
                                                                        04184000
    END   << INITIATOR SECTION >>                                       04186000
$PAGE                                                                   04188000
          << *** CONTINUATOR SECTION *** >>                             04190000
                                                                        04192000
                                                                        04194000
  ELSE                                                                  04196000
CMPLTR:                                                                 04198000
    BEGIN                                                               04200000
      IF IOQPL.SFAIL THEN  << FAILURE ON DELAYED START I/O >>           04202000
        BEGIN                                                           04204000
          TOS := SIOFAIL;                                               04206000
          GOTO BADIO;                                                   04208000
        END;                                                            04210000
                                                                        04212000
                                                                        04214000
            << CHECK FOR CHANNEL ERRORS >>                              04216000
                                                                        04218000
CHKERR:                                                                 04220000
      IF CPVAP.ERRORCODE > 5 THEN  << CHANNEL DMA ABORT >>              04222000
        GOTO CHANERROR;                                                 04224000
                                                                        04226000
      IF SIOPL(STATUS+1).POWUP AND NOT SIOPL(STATUS).ONLINE THEN        04228000
        BEGIN      << POWER RESTART OCCURRED >>                         04230000
          TOS := POWERUP;                                               04232000
          GOTO BADIO;                                                   04234000
        END;                                                            04236000
                                                                        04238000
                                                                        04240000
                                                                        04242000
    <<   GET STATUS BYTES   >>                                          04244000
                                                                        04246000
                                                                        04248000
      DITP(DSTAT) := SIOP(STATUS);  << UPDATE DIT STATUS >>             04250000
      DITP(DLOGERROR):= SIOP(STATUS); <<UPDATE ERROR LOG>>              04252000
      DITP(DLOGERROR+1):=SIOP(STATUS+1);                                04254000
      DITP(DLOGERROR+2):=SIOP(STATUS+2);                                04256000
                                                                        04258000
$PAGE                                                                   04260000
                                                                        04262000
          << CHECK FOR I/O ERRORS >>                                    04264000
                                                               <<02655>>04266000
                                                               <<02655>>04268000
                                                                        04270000
      IF CPVAP(1).(14:2) <> 0 THEN  << CHECK UNIT'S STATUS >>           04272000
        BEGIN                                                           04274000
          CPVAP(1) := 0;                                       <<04304>>04276000
          IF NOT DITPL(DSTAT).ONLINE THEN  << UNIT NOT READY >>         04278000
            BEGIN                                                       04280000
              IF FCODE=DCLOSEFC THEN GOTO GOODEND;                      04282000
              IF IOMESSAGE(1,NOTRDYMSG,%10000,DITP(DLDEV).LDEV,         04284000
                           ,,,,CONSOLE) THEN                            04286000
                BEGIN                                                   04288000
                  TOS := NOTREADYWAIT;                                  04290000
                  MTSTATE := OPINTRVNTNWAIT;                            04292000
                  AIOQP(QMISC).SUBSTATE:=0; <<RESET SUBSTATE>>          04294000
                  GOTO EXIT;                                            04296000
                END;                                                    04298000
              TOS := SYSERROR;                                          04300000
              GOTO BADIO;                                               04302000
            END;                                                        04304000
                                                                        04306000
TESTWRITE:                                                              04308000
          IF FCODE=WRITEFC OR FCODE=WRTFMARKFC                          04310000
           OR FCODE=TAPEGAPFC OR                                        04312000
            (FCODE=SETDENSC LAND DITP(DSTAT).LOADP=1) THEN              04314000
            BEGIN                                                       04316000
              IF DITP(DSTAT).FILEPROTECT <> 0 THEN                      04318000
                BEGIN                                                   04320000
                  IF IOMESSAGE(1,NOWRING,%10000,DITP(DLDEV).LDEV,       04322000
                               ,,,,CONSOLE) THEN                        04324000
                    BEGIN                                               04326000
                      DITP(DTIME) := 0;                                 04328000
                      DITP(DRQST) := TIMEREQ(%20,@DITP,1000D);          04330000
                      AIOQP(QMISC).SUBSTATE:=NEWREQ;                    04332000
                      MTSTATE := INTRPTWAIT;                            04334000
                      RETURN;                                           04336000
                    END;                                                04338000
                  TOS := SYSERROR;                                      04340000
                  GOTO BADIO;                                           04342000
                END;                                                    04344000
              IF MTSTATE=2 THEN GOTO GOODEND;                           04346000
            END;                                                        04348000
                                                                        04350000
          IF SIOP(STATUS+1).MTUDOWN <> 0 THEN                           04352000
            BEGIN                                                       04354000
              TOS := UNITFAIL;                                          04356000
              GO TO FAIL;                                               04358000
            END;                                                        04360000
                                                                        04362000
                                                               <<02655>>04364000
          << CHECK FOR SELF TEST FAILURE >>                    <<02655>>04366000
                                                               <<02655>>04368000
                                                               <<02655>>04370000
          IF DITP(DSTAT).REJECT <> 0 AND                       <<02655>>04372000
          SIOP(STATUS+1).ERRDETAIL = SELFTESTERR               <<02655>>04374000
          THEN                                                 <<02655>>04376000
            BEGIN                                              <<02655>>04378000
              TOS := UNITFAIL;                                 <<02655>>04380000
              GO TO FAIL;                                      <<02655>>04382000
            END;                                               <<02655>>04384000
                                                               <<02655>>04386000
        << CHECK FOR BLANK OR 800 BPI TAPE >>                  <<02655>>04388000
                                                               <<02655>>04390000
          IF DITP(DSTAT).REJECT <> 0 AND                                04392000
          SIOP(STATUS+1).ERRDETAIL = FCUREJ AND                         04394000
          SIOP(STATUS+2).(0:8) = REJCOD11 THEN                          04396000
            BEGIN                                                       04398000
              TOS := TRANSFERERR;                                       04400000
              GO TO FAIL;                                               04402000
            END;                                                        04404000
                                                                        04406000
          IF FCODE=SETDENSC AND DITP(DSTAT).REJECT <> 0 THEN            04408000
             BEGIN                                                      04410000
              TOS:=STDENERR;                                            04412000
              GO TO FAIL;                                               04414000
             END;                                                       04416000
                                                                        04418000
          IF DITP(DSTAT).TAPERUN <> 0 THEN                              04420000
            BEGIN                                                       04422000
              TOS := RUNAWAY;                                           04424000
              GOTO FAIL;                                                04426000
            END;                                                        04428000
                                                                        04430000
          IF DITP(DSTAT).REJECT <> 0 THEN                               04432000
            BEGIN                                                       04434000
           TOS := IF SIOP(STATUS+1).PRERR=5 THEN PRIORERR               04436000
                   ELSE UNITFAIL;                                       04438000
              GOTO FAIL;                                                04440000
            END;                                                        04442000
                                                                        04444000
          IF DITP(DSTAT).BUSY <> 0 THEN  << CHECK FOR REWIND COMMAND >> 04446000
            BEGIN                                                       04448000
              IF FCODE = REWINDFC OR FCODE = REWUNLDFC THEN             04450000
                GOTO NOERROR;                                           04452000
              TOS := UNITFAIL;                                          04454000
              GOTO FAIL;                                                04456000
            END;                                                        04458000
                                                                        04460000
                                                                        04462000
          IF DITP(DSTAT).TIMING <> 0 THEN                               04464000
            BEGIN                                                       04466000
              TOS := TIMINGERR;                                         04468000
              GOTO FAIL;                                                04470000
            END;                                                        04472000
                                                                        04474000
                                                                        04478000
          IF DITP(DSTAT).STERR <> 0 THEN                       <<02814>>04480000
            BEGIN                                              <<02814>>04482000
              TOS := TRANSFERERR;                              <<02814>>04484000
              GOTO FAIL;                                       <<02814>>04486000
            END;                                               <<02814>>04488000
                                                               <<02814>>04490000
          IF DITP(DSTAT).TRANSFER <> 0 THEN                             04492000
            BEGIN                                                       04494000
              TOS := TRANSFERERR;                                       04496000
              GOTO FAIL;                                                04498000
            END;                                                        04500000
                                                                        04502000
        END;                                                            04504000
                                                                        04506000
                                                                        04508000
         << NO I/O ERRORS - COMPLETE PROCESSING >>                      04510000
                                                                        04512000
$PAGE                                                                   04514000
                                                                        04516000
                                                                        04518000
                                                                        04520000
NOERROR:                                                                04522000
      DITP(DSAVE).RWUNLD := 0;  << RESET UNLOAD FLAG >>                 04524000
      IF <> THEN                                                        04526000
        BEGIN                                                           04528000
          TOS := RINGWAIT;  << WAIT FOR RING MOUNT >>                   04530000
          MTSTATE := OPINTRVNTNWAIT;                                    04532000
          AIOQP(QMISC).SUBSTATE:=0; <<RESET SUBSTATE>>                  04534000
          GOTO EXIT;                                                    04536000
        END;                                                            04538000
                                                                        04540000
      IF DITP(DSTAT).EOF=1 THEN  << SET EOF IN LPDT >>                  04542000
        BEGIN                                                           04544000
          TOS := LPDTD(DITP(DLDEV).LDEV);                               04546000
          TOS.EOFBIT := 1;                                              04548000
          LPDTD(X) := TOS;                                              04550000
        END;                                                            04552000
                                                                        04554000
      IF FCODE=FSRECORDFC OR FCODE=BSRECORDFC OR FCODE=BACKREADFC THEN  04556000
        BEGIN                                                           04558000
          EOFCHECK(AIOQP,BUFFADDRD,0,0);                                04560000
          IF <> THEN GOTO EOFOUT;                                       04562000
        END                                                             04564000
      ELSE IF FCODE=REWINDFC OR FCODE=REWUNLDFC OR FCODE=DCLOSEFC THEN  04566000
        BEGIN                                                           04568000
          AIOQP(QWBCT) := 0;    << SET XLOG TO 0 >>                     04570000
          DITP(DSAVE).RWBIT := 1;                                       04572000
          IF FCODE <> REWINDFC OR DITP(DSTAT).LOADP=1 THEN              04574000
            GOTO GOODEND;                                               04576000
                                                               <<02814>>04578000
        << REISSUE REWIND >>                                   <<02814>>04580000
                                                               <<02814>>04582000
          AIOQP(QMISC).SUBSTATE := NEWREQ;                     <<02814>>04584000
          DITP(DSTAT).LOADP := 1;                                       04586000
          MTSTATE := OPINTRVNTNWAIT;                                    04588000
          RETURN;                                                       04590000
        END;                                                            04592000
                                                                        04594000
                                                                        04596000
      IF FCODE=READFC AND XFERCNT <> 0 THEN                             04598000
        BEGIN                                                           04600000
          DITP(DSAVE).SHORT := 0;    << CHECK FOR SHORT READ >>         04602000
          IF <> THEN                                                    04604000
            BEGIN                                                       04606000
              TOS := 6 - SIOP(RDBYCNT) ;                                04608000
              TOS := @AIOQP;                                            04610000
              TOS := 0;                                                 04612000
              TOS := @SIOP(SRBUFF) + SYSDB;                             04614000
              TOS := S3;                                                04616000
              EOFCHECK(*,*,*,0);                                        04618000
              IF > THEN GOTO EOFOUT;                                    04620000
              IF < THEN                                                 04622000
                BEGIN                                                   04624000
                  IOQP(QMISC).BODEOF := 1;                              04626000
                  GOTO BSRPEOF;                                         04628000
                END;                                                    04630000
              IF S0 < XFERCNT THEN XFERCNT := TOS;                      04632000
              TOS := BUFFADDRD;            << DESTINATION ADDRESS >>    04634000
              TOS := 0;                    << SOURCE ADDRESS >>         04636000
              TOS := @SIOP(SRBUFF) + SYSDB;                             04638000
              TOS := (XFERCNT+1)&ASR(1);   << WORD COUNT >>             04640000
              ASMB( MABS );     << MOVE DATA INTO USER'S BUFFER >>      04642000
            END                                                         04644000
          ELSE                                                          04646000
            BEGIN  << NORMAL READ PROCESSING >>                         04648000
                XFERCNT := XFERCNT - SIOP(RDBYCNT) ;                    04650000
              EOFCHECK(AIOQP,BUFFADDRD,XFERCNT,0);                      04652000
              IF <> THEN  << EOF FOUND >>                               04654000
                BEGIN                                                   04656000
                  IF < THEN AIOQP(QMISC).BODEOF :=1;                    04658000
                  X := IF XFERCNT<127 THEN (XFERCNT+3)&ASR(1) ELSE 128; 04660000
                  TOS := BUFFADDRD;                                     04662000
                  WHILE (X:=X-1)<>0 DO                                  04664000
                    BEGIN  << BLANK OUT USER'S BUFFER >>                04666000
                      TOS := 0;                                         04668000
                      ASMB( SSEA );                                     04670000
                      TOS := TOS + 1;                                   04672000
                    END;                                                04674000
                  IF IOQPL(QMISC).BODEOF THEN GOTO BSRPEOF              04676000
                    ELSE GOTO EOFOUT;                                   04678000
                END;                                                    04680000
            END;                                                        04682000
          IF AIOQP(QWBCT) < 0 THEN                                      04684000
            AIOQP(QWBCT) := -XFERCNT                                    04686000
          ELSE                                                          04688000
            AIOQP(QWBCT) := (XFERCNT+1)&ASR(1);                         04690000
        END                                                             04692000
                                                                        04694000
      ELSE  IF FCODE=WRITEFC OR FCODE=WRTFMARKFC THEN                   04696000
        BEGIN                                                           04698000
          IF DITPL(DSTAT).EOT THEN                                      04700000
            BEGIN                                                       04702000
              TOS := GOODEOT;                                           04704000
              GOTO UNUSUALEND;                                          04706000
            END;                                                        04708000
        END                                                             04710000
                                                                        04712000
      ELSE  IF FCODE = BACKREADFC THEN                                  04714000
        BEGIN                                                           04716000
            XFERCNT := XFERCNT - SIOP(RDBYCNT) ;                        04718000
          IF AIOQP(QWBCT) < 0 THEN                                      04720000
            AIOQP(QWBCT) := -XFERCNT                                    04722000
          ELSE                                                          04724000
            AIOQP(QWBCT) := (XFERCNT+1)&ASR(1);                         04726000
          IF DITPL(DSTAT).LOADP THEN                                    04728000
            BEGIN                                                       04730000
              TOS := GOODBOT;                                           04732000
              GOTO UNUSUALEND;                                          04734000
            END;                                                        04736000
        END                                                             04738000
                                                                        04740000
      ELSE                                                              04742000
        IF FCODE = TTCOUNTFC THEN                                       04744000
          AIOQP(QWBCT) := -2                                            04746000
       ELSE                                                             04748000
        IF FCODE=DIAGSTFC  OR FCODE=LOOPREQUEST  THEN                   04750000
        BEGIN                                                           04752000
          XFERCNT:=XFERCNT-SIOP(RDBYCNT);                               04754000
        IF AIOQP(QWBCT)<0 THEN                                          04756000
        AIOQP(QWBCT):=-XFERCNT                                          04758000
   ELSE                                                                 04760000
       AIOQP(QWBCT):=(XFERCNT+1)&ASR(1);                                04762000
     END ELSE                                                           04764000
          AIOQP(QWBCT) := 0;                                            04766000
$PAGE                                                                   04768000
GOODEND:                                                                04770000
FOPEN:                                                         <<02655>>04772000
FCLOSE:                                                        <<02655>>04774000
      IF FCODE=DCLOSEFC THEN DITP(DSAVE) := 0;  << CLEAR FLAGS <<02655>>04776000
        TOS := GOODIO;  << ASSUME NO RETRIES >>                <<02655>>04778000
                                                               <<02655>>04780000
                                                                        04782000
            << CHECK FOR RETRIES >>                                     04784000
                                                                        04786000
      IF SIOP(STATUS+1).NUMRETRY <> 0 THEN                     <<02655>>04790000
        BEGIN                                                  <<02655>>04792000
                                                                        04794000
           << LOG STATUS ERRORS >>                                      04796000
                                                                        04798000
          DITP(DSERR) := SIOP(STATUS);                                  04800000
          DITP(DSERR) := [8/3,8/DLOGERROR];<<LOG STATUS>>      <<02672>>04802000
          DITP(DLOGERROR+1) := SIOP(STATUS+1);                          04804000
          DITP(DLOGERROR+2) := SIOP(STATUS+2);                          04806000
                                                                        04808000
           << GET RETRY COUNT >>                                        04810000
                                                                        04812000
          AIOQP(QMISC).RTCNTR := SIOP(STATUS+1).NUMRETRY;               04814000
          TOS := GOODRETRY;                                             04816000
        END;                                                            04818000
UNUSUALEND:                                                             04822000
      AIOQP(QMISC).SUBSTATE:=0;                                         04824000
      MTSTATE := REQUESTDONE;                                           04826000
                                                                        04828000
EXIT:                                                                   04830000
      AIOQP(QSTAT).IOSTAT := TOS;                                       04832000
      RETURN;                                                           04834000
                                                                        04836000
                                                                        04838000
                                                                        04840000
  <<  ERROR HANDLING SECTION  >>                                        04842000
                                                                        04844000
CHANERROR:                                                              04846000
      TOS := CHANFAIL;                                                  04848000
      DITP(DSERR) := [8/3,8/DLOGERROR]; <<LOG CHANNEL STATUS>>          04850000
      DITP(DLOGERROR):=CPVAP;                                           04852000
                                                                        04854000
BADIO:                                                                  04856000
      IF AIOQP(QMISC).COMQUEUE=NOTQUEUING THEN                 <<02700>>04860000
        BEGIN                                                  <<02700>>04862000
          MASTERCLEARHPIB(DITP);                               <<02700>>04864000
        END;                                                   <<02700>>04866000
      DITP(DSAVE) := 0;    << RESET DRIVER BIT FLAGS >>                 04868000
      GOTO UNUSUALEND;                                                  04870000
                                                                        04872000
FAIL:                                                                   04874000
      DITP(DSERR) :=[8/3,8/DLOGERROR]; <<LOG UNITS STATUS>>             04876000
      GOTO BADIO;                                                       04878000
                                                                        04880000
EOFOUT:                                                                 04882000
      AIOQP(QMISC).SUBSTATE:=0;                                         04884000
      MTSTATE := REQUESTDONE;                                           04886000
      RETURN;                                                           04888000
    END;                                                                04890000
  END;                                                                  04892000
$PAGE                                                                   04894000
  ASMB(                                                                 04896000
    PCAL SIODM;      << MONITOR >>                                      04898000
    PCAL MTDRVR;     << INITIATOR >>                                    04900000
    PCAL MTDRVR;     << COMPLETOR >>                                    04902000
    CON  0;          << NO IO PROCESS >>                                04904000
    PCAL MTINIT;     << INITIALIZATION >>                               04906000
    CON  1;          << ONE INTERRUPT HANDLER >>                        04908000
    PCAL GIP'HPIB);       << INTERRUPT HANDLER >>                       04910000
  END.                                                                  04912000
