$CONTROL MAP,CODE,USLINIT                                               00010000
  <<         HIOTAPE0, MODULE 35 - TAPE DRIVER   SERIES 30/33/44 >>     00012000
<< HP32002C MPE SOURCE C.00.00 >>                                       00014000
<< COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980.           >>  00016000
<<     THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A       >>  00018000
<<     TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR     >>  00020000
<<     STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION >>  00022000
<<     OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED   >>  00024000
<<     WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>  00026000
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00028000
$TITLE "HP 7970E MAG TAPE DRIVER - (HP-IB)"                             00030000
$CONTROL PRIVILEGED,UNCALLABLE                                          00032000
$TP                                                                     00034000
                                                                        00036000
<<                                                                      00038000
                                                                        00040000
            3000 Series 30/33/44 Magnetic Tape Driver - HIOTAPE0        00042000
            ---------------------------------------------               00044000
                                                                        00046000
                                                                        00048000
Structure of IOTAPE0:                                                   00050000
                                                                        00052000
IOTAPE0, together with the SIO Device Monitor (SIODM) constitute a      00054000
standard MPE Type 1 I/O Driver/Monitor.  This means that it does not    00056000
run in its own process, but executes on any stack and therefore must    00058000
run to completion.  During initialization it executes on PROGEN's       00060000
stack, during request initiation it executes on ATTACHIO's stack, and   00062000
during interrupt processing it executes on the Interrupt Control        00064000
Stack (ICS).                                                            00066000
                                                                        00068000
IOTAPE0 consists of a global area, two procedures, and an "outer        00070000
block" which is really a linkage area for INITIAL.  The global area     00072000
contains an array called INITIAL which is comprised of three parts.     00074000
The first part specifies the size of the other two, the unit extract    00076000
instruction, and various parameters which are used by INITIAL.  This    00078000
section is deleted after INITIAL is through with it.  The other two     00080000
parts are the Device Information Table (DIT) and the Channel Program    00082000
area, which is part of the Interrupt Linkage Table (ILT).  INITIAL      00084000
will put each of these items in the area of memory where it belongs.    00086000
The linkage area specifies the procedure labels (P-labels) of the       00088000
associated monitor (SIODM), the request initiator (MTDRVR), the         00090000
request completor (MTDRVR), the initialization procedure (MTINIT,       00092000
called by PROGEN at system startup), and the interrupt handler (GIP).   00094000
                                                                        00096000
                                                                        00098000
Operation of IOTAPE0:                                                   00100000
                                                                        00102000
The primary working code of IOTAPE0 is a procedure MTDRVR.  MTDRVR is   00104000
called with five parameters.  Two of these parameters, BANK and         00106000
BUFFADDR, are the absolute buffer address of the data to be processed.  00108000
The other three, DITP, IOQP, and SIOP are pointers to three arrays.     00110000
DITP is a pointer to the Device Information Table which contains        00112000
information about its associated mag tape unit.  There is one DIT for   00114000
unit on the controller and they contain information which must be       00116000
saved between I/O requests to the driver.  IOQP is a pointer to the     00118000
Input/Output Queue element.  IOQ elements contain information relevent  00120000
to the current request.  SIOP is a pointer to the first element of the  00122000
Channel Program which is actually part of the Interrupt Linkage Table.  00124000
These three elements are described in more detail elsewhere in this     00126000
listing.                                                                00128000
                                                                        00130000
MTDRVR is always called by the SIO device monitor (SIODM) and it        00132000
determines the reason for the call by examining the IOQ and the DIT.    00134000
When a new request is initiated, MTDRVR examines the function code      00136000
and parameter fields contained in the IOQ element to determine the      00138000
task that is desired.  The proper command codes and program branches    00140000
are then placed in the Channel Program and its execution is begun.      00142000
                                                                        00144000
Upon completion of the request, an interrupt is generated and MTDRVR    00146000
is again called.  The code checks for current activity in progress,     00148000
and this being the case, branches to the completion section of the      00150000
driver.  Here several status words are examined for errors or special   00152000
conditions which might have occurred during the execution of the        00154000
Channel Program, during the data transfer, or during the operation of   00156000
the mag tape unit.  These conditions can cause error retries and/or     00158000
special notation back to the caller.  A list of the conditions and      00160000
the return codes is provided in this listing.                           00162000
                                                                        00164000
                                                                        00166000
                                                                        00168000
>>                                                             <<02681>>00170000
$PAGE "DEVELOPMENT AND FIX HISTORY"                            <<02681>>00172000
comment                                                        <<02681>>00174000
                                                                        00176000
                                                                        00178000
        Development and Fix History                                     00180000
        ---------------------------                                     00182000
                                                                        00184000
Development Engineer:  Rich Pearson                                     00186000
                                                                        00188000
Change History: 7/01/81 Changed channel program to perform record       00190000
                        mode transfers instead of burst mode.  This     00192000
                        was done to prevent tape-runaway problems due   00194000
                        to CPP going away for periods of time longer    00196000
                        than the tape could stand.  Housekeeping on     00198000
                        the AB'ACK bit, and additional comments were    00200000
                        added (AJK).                                    00202000
                7/07/81 Error detection and retry processing we<<02681>>00204000
                        added to detect and retry up to 15 time<<02681>>00206000
                        when writing an EOF to tape (AJK).     <<02681>>00208000
                7/10/81 Writing an EOF past EOT will now work a<<02681>>00210000
                        does the 7976 driver for FSTORE compat-<<02681>>00212000
                        ibility.  When multiple ATTACHIO's are <<02681>>00214000
                        pending and EOT is encountered, no EOF'<<02681>>00216000
                        will be written unless the appropriate <<02681>>00218000
                        is set in P2 of the IOQ.  Also, if the <<02681>>00220000
                        tape is not-ready and a device close is<<02681>>00222000
                        issued, the DCLOSE will now complete wi<<02681>>00224000
                        out a not-ready console message (AJK). <<02681>>00226000
                7/28/81 Error recovery ERRORMASK contained an  <<02710>>00228000
                        extra trailing "0" which made the mask <<02710>>00230000
                        word bits off by 3 locations.  Also,   <<02710>>00232000
                        the machine code generated by SPL was  <<02710>>00234000
                        incorrect for the ERRORMASK expression <<02710>>00236000
                        evaluation.  Parenthesis were added to <<02710>>00238000
                        force SPL to gen code as expected.     <<02710>>00240000
                                                                        00242000
$PAGE                                                                   00244000
                Device Information Table (DIT)                          00246000
                ------------------------------                          00248000
                                                                        00250000
                                                                        00252000
There is one DIT per physical device.  If a physical device represents  00254000
more than one logical device, the logical device number is obtained     00256000
from the IOQ element.  The following diagram shows the DIT used for     00258000
the mag tape driver.                                                    00260000
                                                                        00262000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00264000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00266000
  0| 0| 0|AC|RQ| 0|MU| 0|IO|IA| 0| 0| 0|   STATE   |   DFLAG            00268000
   +--+--+--+--+--+--+--+--+--+--+--+--+-----------+                    00270000
  1| SYSDB relative pointer to the DIT for the next|   DLINK            00272000
   | device requesting this resource or service    |                    00274000
   +-----------------------------------------------+                    00276000
  2| SYSDB relative pointer to the first IOQ in    |   DIOQP            00278000
   | request list for this device                  |                    00280000
   +--------+--------------+-----------------------+                    00282000
  3|IOT  |    Phys. unit # | Logical device number |   DLDEV            00284000
   +--------+--------------+-----------------------+                    00286000
  4| SYSDB relative pointer to Device Linkage Table|   DDLTP            00288000
   +-----------------------------------------------+                    00290000
  5| SYSDB relative pntr to Interrupt Linkage Table|   DILTP            00292000
   +-----------------------------------------------+                    00294000
  6|RW|RU|SH|CE|BO|                             |AA|   DSAVE            00296000
   +-----------------------------------------------+                    00298000
  7| Hardware error pointer. Set when the driver   |   DSERR            00300000
   | detects an error.  Whenever <>0, the driver   |                    00302000
   | monitor logs an I/O error and clears this word|                    00304000
   +--+--+--+--+--+--------------------------------+                    00306000
%10| Bit 0 is set at completion of timer           |   DTIME            00308000
   +--+--+--+--+--+--------------------------------+                    00310000
%11| Interrupt status for this unit.  Set by the   |   DSTAT            00312000
   | driver each time it processes an interrupt.   |                    00314000
   +-----------------------------------------------+                    00316000
%12| Holds the time out request entry index while  |   DRQST            00318000
   | a timer is active.                            |                    00320000
   +-----------------------------------------------+                    00322000
%13|          Hardware logged error status         | DLOGERROR          00324000
   +-----------------------------------------------+                    00326000
                                                                        00328000
                                                                        00330000
DFLAG - Flags and request state                                         00332000
  AC  ACTIVE  - A monitor is currently servicing this device.           00334000
  RQ  REQUEST - A service request is pending while the monitor is       00336000
                active.                                                 00338000
  MU  MUNIT   - This device is on a multi-unit controller.              00340000
  IO  IOPROG  - An I/O Channel Program is running for this device.      00342000
  IA  IAK     - An interrupt or response has occurred for this device.  00344000
  NO  NOTRDY  - Go to state %10 after Idle Channel Program is started.  00346000
  ST  STWAIT  - The device monitor is starting an Idle Channel Program  00348000
                for this device.  There is no IOQ associated with this  00350000
                type of request.                                        00352000
  STATE       - State of the device monitor.  Specifies the next action 00354000
                to be taken in SIODM in servicing the request:          00356000
                  0 - start new request                                 00358000
                  1 - not used                                          00360000
                  2 - call driver initiator procedure                   00362000
                  3 - call driver completor procedure                   00364000
                  4 - not used                                          00366000
                  5 - process request completed                         00368000
                  6 - initiate device recognition sequence              00370000
                  7 - start operator intervention wait                  00372000
                %10 - wait for interrupt (operator intervention)        00374000
                      restart at state 0                                00376000
                %11 - wait for data segment freeze, then state 2        00378000
                %12 - wait for driver initiator to be frozen, then      00380000
                      allocate controller (state 2)                     00382000
                %13 - wait for I/O completion interrupt, then state 3   00384000
                %14 - wait for controller, then call driver initiator   00386000
                %15 - not used                                          00388000
                %16 - wait for initiator make present, then state 2     00390000
                %17 - wait for completor make present, then state 3     00392000
                                                                        00394000
DLDEV - I/O system type, unit and logical device number                 00396000
  IOT I/O TYPE- Type of I/O system                                      00398000
                0 - HP3000 Series II/III                                00400000
                1 - HP3000 Series 33 (HP-IB)                            00402000
                2 - unused                                              00404000
                3 - unsused                                             00406000
                                                                        00408000
DSAVE - Device processing flags                                         00410000
  RW  RWBIT  - Indicates tape has been rewound.                         00412000
  RU  RWUNLD - Indicates that a rewind/unload was performed to allow a  00414000
               write-ring mount.                                        00416000
  SH  SHORT  - A short read is in progress.  After completion of read,  00418000
               EOF is checked for and if not present, the requested     00420000
               bytes are transfered from the short-read buffer to the   00422000
               user's buffer.                                           00424000
  CE  CESTAT - Channel parity error processing is in progress.          00426000
  BO  BODEOF - Backspace record due to a data EOF processing is in      00428000
               progress.                                                00430000
  AA  AB'ACK - Abort Channel Program is executing.                      00432000
$PAGE                                                                   00434000
DSTAT - Mag tape controller status                                      00436000
                                                                        00438000
  BITS         USE                                                      00440000
                                                                        00442000
    0     END OF FILE                                                   00444000
                                                                        00446000
    1     BEGINNING OF TAPE                                             00448000
    2     END OF TAPE                                                   00450000
    3     SINGLE TRACK ERROR (NOT LOGGED FOR READS)                     00452000
                                                                        00454000
    4     COMMAND REJECT                                                00456000
    5     FILE PROTECT                                                  00458000
    6     MULTIPLE TRACK ERROR                                          00460000
                                                                        00462000
    7     UNIT ONLINE                                                   00464000
    8     (NOT USED)                                                    00466000
    9     UNIT NUMBER (MSB)                                             00468000
                                                                        00470000
   10     UNIT NUMBER (LSB)                                             00472000
   11     TIMING ERROR                                                  00474000
   12     TAPE RUNAWAY                                                  00476000
                                                                        00478000
   13     REWINDING       *                                             00480000
   14     UNIT BUSY       **  (REPORTED AS UNIT NOT READY)              00482000
   15     INTERFACE BUSY  *                                             00484000
                                                                        00486000
FOR STATUS READ (3RD BYTE STATUS) DENOTES:                              00488000
                                                                        00490000
BITS       USE                                                          00492000
----       ---                                                          00494000
                                                                        00496000
  0        0 (NOT USED)                                                 00498000
  1        0 (NOT USED)                                                 00500000
  2        POWER ON                                                     00502000
  3        COMMAND PARITY ERROR                                         00504000
  4        *UNIT 3 PLACED ON LINE                                       00506000
  5        *UNIT 2 PLACED ON LINE                                       00508000
  6        *UNIT 1 PLACED ON LINE                                       00510000
  7        *UNIT 0 PLACED ON LINE                                       00512000
                                                                        00514000
*NOTE:  BITS 4,5,6,7 NOT USED BY DRIVER.                                00516000
$PAGE                                                                   00518000
                Interrupt Linkage Table (ILT)                           00520000
                -----------------------------                           00522000
                                                                        00524000
                                                                        00526000
There is one ILT for each device controller configured on the system.   00528000
A controller may support more than one unit as is the case with the     00530000
mag tape which supports four units per controller.                      00532000
                                                                        00534000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00536000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00538000
  0|         Channel                               |   ICPVA0           00540000
  1|              Program                          |   ICPVA1           00542000
  2|                  Variable                     |   ICPVA2           00544000
  3|                       Area (ICPVA)            |   ICPVA3           00546000
   +-----------------------------------------------+                    00548000
  4|         DMA Abort                             |   ICPVA4           00550000
  5|              Address                          |   ICPVA5           00552000
   +-----------------------------------------------+                    00554000
  6|                      0                        |   ISRQL            00556000
   +--+-----------------+-----+-----------+--------+                    00558000
  7|LI|     CHANQUE     |     |   CHAN    |  DEV   |   ICNTRL           00560000
   +--+-----------------+-----+-----------+--------+                    00562000
%10| SYSDB relative pointer to Channel Program area|   ISIOP            00564000
   +-----------------------------------------------+                    00566000
%11| SYSDB relative pointer to Status Return area. |   ISTAP            00568000
   +-----------------------------------------------+                    00570000
%12| single instruction that is executed to extract|   IUNIT            00572000
   | the device unit number from the status pointed|                    00574000
   | to by ISTAP.                                  |                    00576000
   +-----------------------------------------------+                    00578000
%13| SYSDB relative DIT pointer of the device      |   ICDP             00580000
   | currently using the channel to perform a      |                    00582000
   | data operation.                               |                    00584000
   +-----------------------+-----------------------+                    00586000
%14|       SIOPSIZE        |        CQUEN          |   IQUEUE           00588000
   +--+--+--+--------------+-----------+-----------+                    00590000
%15|RW|WP|IG|                          |  HCUNIT   |   IFLAG            00592000
   +--+--+--+--------------------------+-----------+                    00594000
%16| SYSDB relative DIT pointer for unit 0         |   IDITP0           00596000
   +-----------------------------------------------+                    00598000
%17| SYSDB relative DIT pointer for unit 1         |   IDITP1           00600000
   +-----------------------------------------------+                    00602000
%20| SYSDB relative DIT pointer for unit 2         |   IDITP2           00604000
   +-----------------------------------------------+                    00606000
%21| SYSDB relative DIT pointer for unit 3         |   IDITP3           00608000
   +-----------------------------------------------+                    00610000
%22|        Idle Channel Program                   |                    00612000
%23|            Status Return Area                 |                    00614000
   +-----------------------------------------------+                    00616000
%24|             Mag Tape                          |                    00618000
   .               Channel                         .                    00620000
   |                 Program                       |                    00622000
   +-----------------------------------------------+                    00624000
                                                                        00626000
$PAGE                                                                   00628000
ICPVA0 - Channel Program Variable Area                                  00630000
                                                                        00632000
  The first word is used by the channel program processor to store      00634000
  status information after I/O channel aborts.  The next word is used   00636000
  by the driver to indicate if status should be examined for special    00638000
  conditions or errors.  The other two words are not used.              00640000
                                                                        00642000
                                                                        00644000
ICPVA4 - DMA abort address                                              00646000
                                                                        00648000
  If a DMA abort occurs, the absolute address where the abort occurred  00650000
  is stored in this area.                                               00652000
                                                                        00654000
                                                                        00656000
ICNTRL - Contains controller information                                00658000
                                                                        00660000
  LIM     - If this bit is set, the controller is sharing a software    00662000
            channel resource in order to limit bandwidth.               00664000
  CHANQUE - The software channel resource number.                       00666000
  CHAN    - Channel number (four most significant bits of DRTN).        00668000
  DEV     - Device number (three least significant bits of DRTN).       00670000
                                                                        00672000
                                                                        00674000
IQUEUE -                                                                00676000
                                                                        00678000
  SIOPSIZE - (number of words + 1)/2 in the channel program area.       00680000
  CQUEN    - For a multi-unit controller this field contains the        00682000
             software controller resource number.                       00684000
                                                                        00686000
                                                                        00688000
IFLAG - Controller and Channel Program state flags                      00690000
                                                                        00692000
  RUNWAIT  - An Idle Channel Program should be started when there       00694000
             are no active requests to process.                         00696000
  WAITPROG - An Idle Channel Program has been started for this          00698000
             controller.  This bit is reset by an interrupt.            00700000
  IGNOREHI - An HIOP instruction has been issued against this	          00702000
             controller but the channel program was not in a wait       00704000
             statement.  Therefore ignore the interrupt generated by    00706000
             the channel code when this program halts.                  00708000
  HCUNIT   - Highest configured unit number for this controller.        00710000
$PAGE                                                                   00712000
            I/O QUEUE ELEMENT (IOQ)                                     00714000
            -----------------------                                     00716000
                                                                        00718000
                                                                        00720000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00722000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00724000
  0|      Request dependent flags (see below)      |   QFLAG            00726000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00728000
  1| SYSDB relative pointer to next IOQ element.   |   QLINK            00730000
   | Points to first word of element.              |                    00732000
   +-----------------------+-----------------------+                    00734000
  2|                       | Logical device number |   QLDEV            00736000
   +--+--+--+--+-----------+-----------+-----------+                    00738000
  3| R| B| F| G|   FSCNTR  |   BSCNTR  |   RTCNTR  |   QMISC            00740000
   +--+--+--+--+-----------+-----------+-----------+                    00742000
  4| S| If QFLAG.(3:1) is clear then this is the   |   QDSTN            00744000
   |  | DST number of the target data segment.  If |                    00746000
   |  | S is set, QADDR is DB relative.            |                    00748000
   +--+--------------------------------------------+                    00750000
  5| Offset in the data segment or system buffer   |   QADDR            00752000
   | table to the target data buffer.              |                    00754000
   +-----------------------+-----------------------+                    00756000
  6|                       | Function code for     |   QFUNC            00758000
   |                       | this request.  (See   |                    00760000
   |                       | next section.)        |                    00762000
   +-----------------------+-----------------------+                    00764000
  7| On initiation, specifies the word count (>0)  |   QWBCT            00766000
   | or byte count (<0).  At completion of the     |                    00768000
   | request this location contains the actual     |                    00770000
   | transmission count in the same units (bytes   |                    00772000
   | or words) as in the request.                  |                    00774000
   +-----------------------------------------------+                    00776000
%10| Parameter 1.  Used only for reads.  Contains  |   QPAR1            00778000
   | the EOF specification in bits (13:3).         |                    00780000
   +-----------------------------------------------+                    00782000
%11| Parameter 2.  Used only for writes.  If bit   |   QPAR2            00784000
   | (13:1) is set, writing past EOT is allowed.   |                    00786000
   +-----------------------+--------------+--------+                    00788000
%12|         PCBN          |  QUALIFIER   | STATUS |   QSTAT            00790000
   +-----------------------+--------------+--------+                    00792000
                                                                        00794000
                                                                        00796000
QFLAG - Request dependent flags                                         00798000
                                                                        00800000
  Bit 0  ABORT     - Abort this request and return an error indication  00802000
                     to the caller.                                     00804000
  Bit 1  SPECIAL   - Apply special handling to this request.  (Not used)00806000
  Bit 2  DIAG      - This is a request from the diagnostic subsystem.   00808000
                     (Not used)                                         00810000
  Bit 3  SYSBUFF   - Target is an index relative to the SBUF Table of   00812000
                     the data buffer.                                   00814000
  Bit 4  IOWAKE    - Wake caller on completion of request.              00816000
  Bit 5  BLOCKED   - Blocked I/O.  The caller is waited in ATTACHIO     00818000
                     until the request is completed.  Implies IOWAKE.   00820000
  Bit 6  COMPLETED - The request has been completed and the caller      00822000
                     awakened if he had requested (with IOWAKE).        00824000
  Bit 7  DATAFRZN  - Set by the memory management routines (MAM) when a 00826000
                     MAKEPRESENT request is successfully completed and  00828000
                     indicates the data segment is frozen in memory.    00830000
  Bit 8  MAMERRORD - An error has occurred while MAM was trying to      00832000
                     make the target data segment present and freeze    00834000
                     it in memory.                                      00836000
  Bit 9  PREQ      - (Not used)                                         00838000
  Bit 10 SFAIL     - Delayed failure of SIO instruction.  If a call to  00840000
                     STARTIO resulted in the request being added to     00842000
                     the channel queue, this bit indicates that the SIO 00844000
                     instruction failed when the request was selected   00846000
                     for execution.                                     00848000
  Bit 11 PFAIL     - The request was aborted because of a system power  00850000
                     failure.                                           00852000
                                                                        00854000
                                                                        00856000
QMISC - Driver request dependent flags and counters.  Used mostly for   00858000
        error retries.                                                  00860000
                                                                        00862000
  RETRY    - Indicates an error retry is in progress.                   00864000
  BACK     - Backspace record processing for an error retry is in       00866000
             progress.                                                  00868000
  FORWARD  - Forward space record processing for an error retry is      00870000
             in progress.                                               00872000
  GAP      - Gap processing for an error retry is in progress.          00874000
  FSCNTR   - Forward space record counter.                              00876000
  BSCNTR   - Backspace record counter.                                  00878000
  RTCNTR   - Error retry counter.                                       00880000
                                                                        00882000
                                                                        00884000
QSTAT - PCB number and request completion status.                       00886000
                                                                        00888000
  PCBN    - The Process Control Block (PCB) number of the process       00890000
            which made this request.  If zero, the request is not       00892000
            associated with any process and the IOQ element is to       00894000
            be returned by the system when the request has completed.   00896000
  STATUS  - General status indicating the final state of the request.   00898000
            The following codes are used:                               00900000
              0 - Not started or awaiting completion.                   00902000
              1 - Successful completion.                                00904000
              2 - End-of-file detected.                                 00906000
              3 - Unusual, but recoverable, condition detected.         00908000
              4 - Irrecoverable error has occurred.                     00910000
  QUALIFIER - A code which further defines or qualifies the general     00912000
              status.  (See the section Driver Return Status Codes.)    00914000
                                                                        00916000
$PAGE                                                                   00918000
           MAG TAPE REQUEST CODES                                       00920000
           ----------------------                                       00922000
                                                                        00924000
                                                                        00926000
   0 - READ                                                             00928000
         P1(13:3) - END OF FILE SPECIFICATION                           00930000
   1 - WRITE                                                            00932000
         P2(13:1) - IF SET THEN WRITE PAST END OF TAPE MARK             00934000
                    IF CLEAR THEN RETURN ERROR IF EOT HAS BEEN DETECTED 00936000
   2 - OPEN FILE (NO OPERATION)                                         00938000
   3 - CLOSE FILE (RESET EOF FLAGS IN LPDT)                             00940000
   4 - CLOSE DEVICE (RESET EOF FLAGS AND REWIND TAPE)                   00942000
   5 - REWIND                                                           00944000
   6 - WRITE FILE MARK                                                  00946000
   7 - FORWARD SPACE FILE                                               00948000
   8 - BACKSPACE FILE                                                   00950000
   9 - REWIND AND UNLOAD                                                00952000
  10 - GAP TAPE                                                         00954000
  11 - FORWARD SPACE RECORD                                             00956000
  12 - BACKSPACE RECORD                                                 00958000
  13 - READ RECORD BACKWARDS                                            00960000
  14 - SUPPLY TOTAL RECORD BYTE COUNT                                   00962000
  15 - READ STATUS                                                      00964000
                                                                        00966000
COUNT - +WORD OR -BYTE COUNT.  NOTE - IF BYTE COUNT IS SPECIFIED, THE   00968000
        TRANSMISSION LOG WILL REFLECT THE ACTUAL TRANSFER LENGTH, BUT   00970000
        IF WORD COUNT IS SPECIFIED FOR A READ OR BACK-READ OPERATION,   00972000
        ODD BYTE TRANSFERS WILL BE ROUNDED UP IN THE TRANSMISSION LOG   00974000
        RETURNED.                                                       00976000
                                                                        00978000
                                                                        00980000
$PAGE                                                                   00982000
                       DRIVER RETURN STATUS CODES                       00984000
                       --------------------------                       00986000
                                                                        00988000
                                                                        00990000
 GENERAL STATUS (13:3)       QUALIFYING STATUS (8:5)      OVERALL (8:8) 00992000
  0 - PENDING               1 - WAITING FOR COMPLETION         %10      00994000
                            2 - ERROR RECOVERY WAIT            %20      00996000
                            3 - NOT READY WAIT                 %30      00998000
                            4 - NO WRITE RING WAIT             %40      01000000
                                                                        01002000
  1 - SUCCESSFUL            0 - NO ERRORS                        1      01004000
                            2 - RETRY WAS NECESSARY            %21      01006000
                            3 - EOT AFTER WRITE                %31      01008000
                                                                        01010000
  2 - END OF FILE           1 - A TAPE MARK WAS READ                    01012000
                                OR P1 WAS NONZERO AND                   01014000
                                THE LAST RECORD READ                    01016000
                                WAS A TAPE MARK                %12      01018000
                          2-7 - A DATA DEPENDENT EOF                    01020000
                                CONDITION AS SPECIFIED                  01022000
                                BY EOFCHECK                             01024000
                                                                        01026000
 3 - UNUSUAL CONDITION      3 - REQUEST ABORTED                %33      01028000
                            6 - POWERFAIL ABORT                %63      01030000
                            7 - BOT AND BACKSPACE REQUESTED    %73      01032000
                          %10 - TAPE RUNAWAY                  %103      01034000
                          %11 - EOT AND WRITE REQUESTED       %113      01036000
                          %21 - DEVICE POWERED UP             %213      01038000
                          %22 - BOT AND BACK-READ REQUESTED   %223      01040000
                                                                        01042000
 4 - IRRECOVERABLE ERROR    0 - INVALID REQUEST                  4      01044000
                            1 - TRANSMISSION ERROR             %14      01046000
                            3 - TIMING ERROR                   %34      01048000
                            4 - SIO FAILURE                    %44      01050000
                            5 - UNIT FAILURE                   %54      01052000
                          %12 - SYSTEM ERROR                  %124      01054000
                          %14 - CHANNEL FAILURE               %144      01056000
                                                                        01058000
                                                                        01060000
;          <<* * End of comments * *>>                         <<02681>>01062000
$PAGE "VARIABLE AND EXTERNAL PROCEDURE DECLARATIONS"                    01064000
BEGIN                                                                   01066000
  EQUATE                                                                01068000
                                                                        01070000
            << FUNCTION CODES >>                                        01072000
                                                                        01074000
    BACKREADFC   = 13,  << BACKWARDS READ >>                            01076000
    BSRECORDFC   = 12,  << BACKSPACE RECORD >>                          01078000
    DCLOSEFC     =  4,  << DEVICE CLOSE >>                              01080000
    FSRECORDFC   = 11,  << FORWARD SPACE RECORD >>                      01082000
    READFC       =  0,  << READ RECORD >>                               01084000
    REWINDFC     =  5,  << REWIND >>                                    01086000
    REWUNLDFC    =  9,  << REWIND/UNLOAD >>                             01088000
    TAPEGAPFC    = 10,  << TAPE GAP >>                                  01090000
    TTCOUNTFC    = 14,  << TOTAL TRANSFER COUNT >>                      01092000
    WRITEFC      =  1,  << WRITE RECORD >>                              01094000
    WRTFMARKFC   =  6,  << WRITE FILE MARK >>                           01096000
                                                                        01098000
                                                                        01100000
       << MAG TAPE COMMANDS >>                                          01102000
                                                                        01104000
    BACKREADCMD  = %17,                                                 01106000
    BSFILECMD    = %14,                                                 01108000
    BSRECORDCMD  = %12,                                                 01110000
    FSFILECMD    = %13,                                                 01112000
    FSRECORDCMD  = %11,                                                 01114000
    READCMD      = %10,                                                 01116000
    REWINDCMD    = %15,                                                 01118000
    REWUNLDCMD   = %16,                                                 01120000
    TAPEGAPCMD   =   7,                                                 01122000
    WRITECMD     =   5,                                                 01124000
    WRTFMARKCMD  =   6,                                                 01126000
                                                                        01128000
                                                                        01130000
            << QSTAT STATUS RETURNS >>                                  01132000
                                                                        01134000
    ABORTED      =  %33,  << REQUEST ABORTED >>                         01136000
    BREADATBOT   = %223,  << BOT AND BACK-READ REQUESTED >>             01138000
    BSPCATBOT    =  %73,  << BOT AND BACKSPACE REQUESTED >>             01140000
    CHANFAIL     = %144,  << I/O CHANNAL ERROR >>                       01142000
    CMPLTIONWAIT =  %10,  << WAITING FOR COMPLETION >>                  01144000
    EOTWRITE     = %113,  << EOT AND WRITE REQUESTED >>                 01146000
    GOODEOT      =  %31,  << EOT AFTER SUCCESSFUL WRITE >>              01148000
    GOODIO       =    1,  << NO ERRORS >>                               01150000
    GOODRETRY    =  %21,  << RETRY WAS NECESSARY >>                     01152000
    INVALIDRQST  =    4,  << INVALID REQUEST >>                         01154000
    NOTREADYWAIT =  %30,  << NOT READY WAIT >>                          01156000
    PFABORT      =  %63,  << POWERFAIL ABORT >>                         01158000
    POWERUP      = %213,  << DEVICE POWERED UP >>                       01160000
    RETRYWAIT    =  %20,  << DOING ERROR RECOVERY >>                    01162000
    RUNAWAY      = %103,  << TAPE RUNAWAY OCCURRED >>                   01164000
    RINGWAIT     =  %40,  << NO WRITE RING WAIT >>                      01166000
    SIOFAIL      =  %44,  << SIO FAILURE >>                             01168000
    SYSERROR     = %124,  << SYSTEM ERROR >>                            01170000
    TIMINGERR    =  %34,  << TIMING ERROR >>                            01172000
    TRANSFERERR  =  %14,  << TRANSFER ERROR >>                          01174000
    UNITFAIL     =  %54,  << UNIT FAILURE >>                            01176000
                                                                        01178000
            << CHANNEL PROGRAM ARRAY POINTERS >>                        01180000
                                                                        01182000
    ABTCP        = 85,  <<ABORT CHAN PGM>>                              01184000
    ABEND        =105,  <<ABORT END CMD PTR>>                           01186000
    BADDR'RC     = 65,  << BUFFER ADDRESS FOR TRANSFER COUNT READ >>    01188000
    BADDR        = 26,  << BUFFER ADDRESS FOR DATA TRANSFER >>          01190000
    BYTECNT      = 23,  << BYTE COUNT FOR DATA TRANSFER >>              01192000
    CMDWORD      = 96,  << MOTION COMMAND WORD >>                       01194000
    CPSTAT       = 43,  << BEGINNING OF CHAN PROG STATUS ROUTINE >>     01196000
    DSJ'CMDJMP   =  9,  << MOTION COMMAND/READ XFER COUNT SWITCH >>     01198000
    DSJ'RWJMP    = 20,  << READ/WRITE DATA BYPASS SWITCH >>             01200000
    DUMMYBUFF    =104,  << DUMMY BUFFER FOR READ DELAY >>               01202000
    ENDCMD       = 98,  << END COMMAND >>                               01204000
    EOI'JMP      = 28,  << EOI JMP INSTRUCTION >>                       01206000
    IDLE         = 68,  << BEGINNING OF IDLE CHANNEL PROGRAM >>         01208000
    MEMX'RC      = 64,  << BANK ADDRESS FOR TRANSFER COUNT READ >>      01210000
    MEMX         = 25,  << BANK ADDRESS FOR DATA TRANSFER >>            01212000
    RWDATA       = 22,  << READ/WRITE DATA COMMAND >>                   01214000
    SLCTUNIT     = 95,  << UNIT NUMBER BUFFER FOR SELECT COMMAND >>     01216000
    SPFDCMD      = 97,  << STOP POLLING FOR DATA COMMAND >>             01218000
    SRBUFF       =101,  << SHORT READ BUFFER >>                         01220000
    STATUS       = 99,  << I/O STATUS BUFFER >>                         01222000
    TDBL         = 24,  << TERM DISPLACEMENT/BURST LENGTH >>            01224000
                                                                        01226000
                                                                        01228000
         << TABLE ARRAY POINTERS AND PROGRAM CONSTANTS >>               01230000
                                                                        01232000
    CONSOLE      =     0,  << OUTPUT MESSAGE TO OPERATOR >>             01234000
    DILTP        =     5,  << DIT, INTERRUPT LINKAGE TABLE POINTER >>   01236000
    DLDEV        =     3,  << DIT, LOGICAL DEVICE AND UNIT NUMBERS >>   01238000
    DLOGERROR    =    11, << DIT, HARDWARE ERROR STATUS>>               01240000
    DRQST        =    10,  << DIT, DRIVER TIMER >>                      01242000
    DSAVE        =     6,  << DIT, DRIVER FLAGS WORD >>                 01244000
    DSERR        =     7,  << DIT, HARDWARE COUNT & INDEX >>            01246000
    DSTAT        =     9,  << DIT, LAST INTERRUPT STATUS >>             01248000
    DTIME        =     8,  <<DIT, BIT 0 INDICATES TIMER POPPED >>       01250000
    ERRORMASK    = %04037, << RETRY ERROR DECTION MASK >>      <<02710>>01252000
    IFLAG        =    13,  << ILT, FLAG WORD >>                         01254000
    INTRPTWAIT   =   %13,  << INTERRUPT WAIT DRIVER RETURN STATE >>     01256000
    ISIOP        =     8,  << CHANNEL PROGRAM AREA POINTER >>           01258000
    ISTAP        =     9,  << CHAN PROG STATUS RETURN AREA POINTER >>   01260000
    MAXBSIZE     = 16384,  << MAXIMUM BUFFER BYTE SIZE >>               01262000
    MASK'STE'MTE = %11000, << MTE or STE bits in STATUS >>     <<02710>>01264000
    NOTRDYMSG    =    11,  << NOT READY MESSAGE CATALOG INDEX >>        01266000
    NOWRING      =   220,  << NO WRITE RING MESSAGE CATALOG INDEX >>    01268000
    OPINTRVNTNWAIT =   7,  << OPERATOR INTERVENTION WAIT RETURN STATE >>01270000
    PARITYERROR  =    -1,  << PARITY ERROR LOGGING VALUE >>             01272000
    QFUNC        =     6,  << IOQ, FUNCTION CODE >>                     01274000
    QMISC        =     3,  << IOQ, REQUEST FLAGS AND COUNTERS WORD >>   01276000
    QPAR2        =     9,  << IOQ, REQUEST PARAMETER WORD >>            01278000
    QSTAT        =    10,  << IOQ, REQUEST STATUS RETURN >>             01280000
    QWBCT        =     7,  << IOQ, WORD/BYTE COUNT >>                   01282000
    REQUESTDONE  =     5,  << REQUEST DONE DRIVER RETURN STATE >>       01284000
    SYSDB        = %1000,  << SET START OF SYSDB AREA >>                01286000
    SYSLPDT      =   %10,  << LPDT POINTER INDEX >>                     01288000
    SYSSBUFF     =     6,  << SYS BUFF TABLE POINTER INDEX >>           01290000
  ENDEQ          =     0;                                               01292000
                                                                        01294000
           << DSTAT BIT DEFINITIONS >>                                  01296000
                                                                        01298000
  DEFINE                                                                01300000
    BUSY         = (13:3)#,  << INTERFACE BUSY/UNIT BUSY/REWINDING >>   01302000
    EOF          = ( 0:1)#,  << END OF FILE >>                          01304000
    EOT          = ( 2:1)#,  << END OF TAPE >>                          01306000
    FILEPROTECT  = ( 5:1)#,  << FILE PROTECT  >>                        01308000
    LOADP        = ( 1:1)#,  << LOAD POINT (BOT) >>                     01310000
    ONLINE       = ( 7:1)#,  << UNIT ONLINE >>                          01312000
    REJECT       = ( 4:1)#,  << COMMAND REJECTED >>                     01314000
    STERR        = ( 3:1)#,  << SINGLE TRACK ERROR >>                   01316000
    TAPERUN      = (12:1)#,  << TAPE RUNAWAY >>                         01318000
    TIMING       = (11:1)#,  << TIMING ERROR >>                         01320000
    TRANSFER     = ( 6:1)#,  << TRANSFER ERROR (MTE) >>                 01322000
                                                                        01324000
                                                                        01326000
           << DSAVE BIT DEFINITIONS >>                                  01328000
                                                                        01330000
    RWBIT        = ( 0:1)#,  << TAPE REWOUND FLAG >>                    01332000
    RWUNLD       = ( 1:1)#,  << REWIND/UNLOAD FOR WRITE RING MOUNTING >>01334000
    SHORT        = ( 2:1)#,  << SHORT READ IN PROGRESS >>               01336000
    CESTAT       = ( 3:1)#,  << CHANNEL PARITY ERROR PROCESSING FLAG >> 01338000
    BODEOF       = ( 4:1)#,  << BACKSPACE ON DATA EOF >>                01340000
    AB'ACK       = (15:1)#,  << ABORT CP RUNNING >>                     01342000
                                                                        01344000
                                                                        01346000
           << QMISC BIT DEFINITIONS >>                                  01348000
                                                                        01350000
    RETRY        = ( 0:1)#,  << ERROR RETRY IN PROGRESS >>              01352000
    BACK         = ( 1:1)#,  << BACKSPACE RECORD FLAG >>                01354000
    FORWRD       = ( 2:1)#,  << FORWARD SPACE RECORD FLAG >>            01356000
    GAP          = ( 3:1)#,  << TAPE GAP FLAG >>                        01358000
    FSCNTR       = ( 4:4)#,  << FORWARD SPACE COUNTER >>                01360000
    BSCNTR       = ( 8:4)#,  << BACKSPACE COUNTER >>                    01362000
    RTCNTR       = (12:4)#,  << ERROR RETRY COUNTER >>                  01364000
                                                                        01366000
                                                                        01368000
         << MISCELLANEOUS BIT DEFINITIONS >>                            01370000
                                                                        01372000
    ABS          = ABSOLUTE#,                                           01374000
    ASMB         = ASSEMBLE#,                                           01376000
    BANKAD       = ( 8:8)#,  << BANK ADDRESS FIELD >>                   01378000
    BLOCKCNT     = ( 8:4)#,  << SIOP, DATA CHAIN BLOCK COUNT FIELD >>   01380000
    EOFBIT       = ( 7:3)#,  << LPDT, EOF FIELD >>                      01382000
    EOTFLAG      = (13:1)#,  << QPAR2, READ PAST EOT MARKER FLAG >>     01384000
    ERRORCODE    = ( 0:3)#,  << CPVA, ERROR CODE FIELD >>               01386000
    IOSTAT       = ( 8:8)#,  << QSTAT, REQUEST STATUS RETURN FIELD >>   01388000
    LDEV         = ( 8:8)#,  << DLDEV, LOGICAL DEVICE FIELD >>          01390000
    PARITYERR    = ( 3:1)#,  << STATUS, PARITY ERROR OCCURRED >>        01392000
    PFAIL        = (11:1)#,  << QFLAG, ABORT DUE TO POWER FAILURE >>    01394000
    POWUP        = ( 2:1)#,  << STATUS, UNIT HAS POWERED UP >>          01396000
    FUNC         = ( 8:8)#,  << QFUNC, FUNCTION CODE >>                 01398000
    SFAIL        = (10:1)#,  << QFLAG, FAILURE ON DELAYED START SIO >>  01400000
    TIMEDOUT     = (13:1)#,  << CPVA, TIMED OUT TRANSFER ABORT >>       01402000
  ENDDEF         = 0#;                                                  01404000
$PAGE                                                                   01406000
                                                                        01408000
                                                                        01410000
<<       ***********************************                            01412000
         *                                 *                            01414000
         *    DRIVER DB AREA DEFINITION    *                            01416000
         *                                 *                            01418000
         ***********************************        >>                  01420000
                                                                        01422000
                                                                        01424000
ARRAY INITIAL (0:122)= DB :=                                            01426000
    [8/12,8/21],   <<DIT SIZE,NOT CORE RES/RUN IDLE CP/DVR TYPE>>       01428000
              0,   << NOT USED >>                                       01430000
         %26622,   << UNIT EXTRACT INSTRUCTION - EXF, J=9, K=2 >>       01432000
     [8/53,8/2],   <<CHAN PGM SIZE/2, STATUS RETURN AREA SIZE >>        01434000
                                                                        01436000
     << MT DIT >>                                                       01438000
              0,   << DFLAG >>                                          01440000
              0,   << DLINK >>                                          01442000
              0,   << DIOQP >>                                          01444000
        %040000,   << DLDEV - HPIB DEVICE >>                            01446000
              0,   << DLTDP >>                                          01448000
              0,   << DILTP >>                                          01450000
              0,   << DSAVE >>                                          01452000
              0,   << DSERR >>                                          01454000
              0,   << DTIME >>                                          01456000
              0,   << DSTAT >>                                          01458000
              0,   << DRQST >>                                          01460000
              0,   << DLOGERROR >>                                      01462000
                                                                        01464000
                                                                        01466000
                                                                        01468000
                                                                        01470000
     << CHANNEL PROGRAM >>                                              01472000
                                                                        01474000
<< 0>> << WRITE COMMAND >>   %2001,  << SELECT UNIT COMMAND >>          01476000
<< 1>>                           1,                                     01478000
<< 2>>                           0,                                     01480000
<< 3>>                      %42000,                                     01482000
<< 4>>                           0,                                     01484000
                                                                        01486000
<< 5>> << WAIT >>            %1000,  << WAIT FOR COMMAND COMPLETION >>  01488000
<< 6>>                           0,                                     01490000
                                                                        01492000
<< 7>> << DSJ >>             %2401,  << CHECK MAG TAPE'S CONDITION >>   01494000
<< 8>>                           0,                                     01496000
<< 9>>   <<DSJ'CMDJMP>>          0,  <<JMP*+0/50, MTN CMD/RD XFER CNT>> 01498000
<<10>>                          43,  << JMP*+43, READ STATUS >>         01500000
                                                                        01502000
<<11>> << WRITE COMMAND >>   %2001,  << ISSUE MOTION COMMAND >>         01504000
<<12>>                           1,                                     01506000
<<13>>                           0,                                     01508000
<<14>>                      %42000,                                     01510000
<<15>>                           0,                                     01512000
                                                                        01514000
<<16>> << WAIT >>            %1000,  << WAIT FOR COMMAND COMPLETION >>  01516000
<<17>>                           0,                                     01518000
                                                                        01520000
<<18>> << DSJ >>             %2401,  << CHECK MAG TAPE'S CONDITION >>   01522000
<<19>>                           0,                                     01524000
<<20>>   <<DSJ'RWJMP>>           0,  <<JMP*+0/25, RD/WRT DATA BYPASS >> 01526000
<<21>>                          32,  << JMP*+32, READ STATUS >>         01528000
                                                                        01530000
<<22>> <<R/W DATA (RWDATA)>>   %20,  << READ/WRITE RECORD COMMAND >>    01532000
<<23>>   <<BYTECNT>>             0,                                     01534000
<<24>>   <<TDBL>>            %2000,  << TERMINATION DISP. *+4 >>        01536000
<<25>>   <<MEMX>>          %000000,  <<Record mode>>                    01538000
<<26>>   <<BADDR>>               0,                                     01540000
                                                                        01542000
<<27>> << JUMP >>                0,  << EOI RECEIVED - XFER COMPLETED >>01544000
<<28>>   <<EOI'JMP>>             2,  <<JMP*+2/12, READ/WRITE CMPLETION>>01546000
                                                                        01548000
<<29>> << JUMP >>                0,  << BURST TRANSFER COMPLETED >>     01550000
<<30>>                         -15,     << JMP *-15 TO WAIT INSTRUCTN >>01552000
                                                                        01554000
<<31>> << WRITE END >>       %2007,  << ISSUE STOP POLLING FOR DATA >>  01556000
<<32>>                           1,                                     01558000
<<33>>                           0,                                     01560000
<<34>>                      %42000,                                     01562000
<<35>>                           0,                                     01564000
                                                                        01566000
<<36>> << READ COUNT >>      %1402,  << READ TRANSFER COUNT TO >>       01568000
<<37>>                           2,  << PROVIDE DELAY NEEDED   >>       01570000
<<38>>                           0,  << FOR READS - KLUDGE     >>       01572000
<<39>>                       %2000,                                     01574000
<<40>>                           0,                                     01576000
                                                                        01578000
<<41>> << WAIT >>            %1000,  << WAIT FOR OPERATION COMPLETION >>01580000
<<42>>                           0,                                     01582000
                                                                        01584000
<<43>> << DSJ >>             %2401,  << CHECK MAGE TAPE'S CONDITION >>  01586000
<<44>>                           0,                                     01588000
<<45>>                           0,  << JMP *+0, UNIT OK >>             01590000
<<46>>                           7,  << JMP *+7, READ STATUS >>         01592000
                                                                        01594000
<<47>> << READ STATUS >>     %1401,  << READ STATUS BYTES >>            01596000
<<48>>                           3,                                     01598000
<<49>>                           0,                                     01600000
<<50>>                       %2000,                                     01602000
<<51>>                           0,                                     01604000
                                                                        01606000
<<52>> << INT/HLT >>          %601,  << INTERRUPT/HALT, HALT CODE = 0 >>01608000
<<53>>                           0,  << STATUS CHECK NOT REQUIRED >>    01610000
                                                                        01612000
<<54>> << READ STATUS >>     %1401,  << READ STATUS BYTES >>            01614000
<<55>>                           3,                                     01616000
<<56>>                           0,                                     01618000
<<57>>                       %2000,                                     01620000
<<58>>                           0,                                     01622000
                                                                        01624000
<<59>> << INT/HLT >>          %601,  << INTERRUPT/HALT, HALT CODE = 1 >>01626000
<<60>>                           1,  << STATUS CHECK REQUIRED >>        01628000
$PAGE                                                                   01630000
           << TRANSFER COUNT READ CHAN PROG >>                          01632000
                                                                        01634000
<<61>> << READ COUNT >>      %1402,  << READ TRANSFER COUNT >>          01636000
<<62>>                           2,                                     01638000
<<63>>                           0,                                     01640000
<<64>>   <<MEMX'RC>>         %2000,                                     01642000
<<65>>                           0,                                     01644000
                                                                        01646000
<<66>> << JUMP >>                0,  << JMP BACK TO DSJ INSTRUCTION >>  01648000
<<67>>                         -25,                                     01650000
                                                                        01652000
                                                                        01654000
                                                                        01656000
           << IDLE CHANNEL PROGRAM >>                                   01658000
                                                                        01660000
<<68>> << WRITE END >>       %2007,  << ISSUE END COMMAND >>            01662000
<<69>>                           1,  << IDLE CHANNEL PROG >>            01664000
<<70>>                           0,                                     01666000
<<71>>                      %42000,                                     01668000
<<72>>                           0,                                     01670000
                                                                        01672000
<<73>> << WAIT >>            %1000,  << WAIT FOR MT TO POLL >>          01674000
<<74>>                           0,                                     01676000
                                                                        01678000
<<75>> << DSJ >>             %2400,  << CLEAR ANY PENDING DSJ'S >>      01680000
<<76>>                           0,                                     01682000
<<77>>                           0,                                     01684000
                                                                        01686000
<<78>> << READ STATUS >>     %1401,  << READ STATUS TO ILT >>           01688000
<<79>>                           3,                                     01690000
<<80>>                           0,                                     01692000
<<81>>                       %2000,                                     01694000
<<82>>                           0,                                     01696000
                                                                        01698000
<<83>> << INT/HLT >>          %601,  << INTERRUPT/HALT, HALT CODE = 0 >>01700000
<<84>>                           0,                                     01702000
                                                                        01704000
                                                                        01706000
           << ABORT I/O CHAN PROG >>                                    01708000
                                                                        01710000
<<85>> << WRITE END >>       %2007,  << ISSUE END COMMAND >>            01712000
<<86>>                           1,                                     01714000
<<87>>                           0,                                     01716000
<<88>>                      %42000,                                     01718000
<<89>>                           0,                                     01720000
                                                                        01722000
<<90>> << DSJ >>             %2400,  << CLEAR ANY PENDING DSJ'S >>      01724000
<<91>>                           0,                                     01726000
<<92>>                           0,                                     01728000
                                                                        01730000
<<93>> << INT/HLT >>          %601,                                     01732000
<<94>>                           0,                                     01734000
$PAGE                                                                   01736000
         << BUFFERS AND PARAMETERS >>                                   01738000
                                                                        01740000
<<95>> << STORAGE (SLCTUNIT)>>   0,  << SELECT COMMAND UNIT NUMBER >>   01742000
<<96>>   <<CMDWORD>>             0,  << MOTION COMMAND WORD >>          01744000
<<97>>                         %23,  << STOP POLLING FOR DATA COMMAND >>01746000
<<98>>                         %25,  << END COMMAND >>                  01748000
<<99>>                           0,  << STATUS BUFFER AREA >>           01750000
<<100>>                          0,                                     01752000
<<101>>                          0,  << 6 BYTE SHORT READ BUFFER >>     01754000
<<102>>                          0,                                     01756000
<<103>>                          0,                                     01758000
<<104>>                          0,  <<DUMMY BUFF>>                     01760000
<<105>>                        %63;  << ABORT END COMMAND >>            01762000
$PAGE                                                                   01764000
<<    ***************************************                           01766000
      *                                     *                           01768000
      *   EXTERNAL PROCEDURE DECLARATIONS   *                           01770000
      *                                     *                           01772000
      ***************************************              >>           01774000
                                                                        01776000
                                                                        01778000
                                                                        01780000
PROCEDURE ABORTTIMEREQ(TRLX);                                           01782000
  VALUE TRLX;   INTEGER TRLX;                                           01784000
  OPTION EXTERNAL;                                                      01786000
                                                                        01788000
PROCEDURE CHECKINDEX(INDEX,TABLE);                                      01790000
  VALUE INDEX,TABLE;                                                    01792000
  INTEGER INDEX;                                                        01794000
  INTEGER POINTER TABLE;                                                01796000
  OPTION EXTERNAL;                                                      01798000
                                                                        01800000
PROCEDURE EOFCHECK(IOQP,BUF,CNT,HCHK);                                  01802000
  VALUE IOQP,BUF,CNT,HCHK;                                              01804000
  POINTER IOQP;                                                         01806000
  DOUBLE BUF;                                                           01808000
  INTEGER CNT,HCHK;                                                     01810000
  OPTION EXTERNAL;                                                      01812000
                                                                        01814000
PROCEDURE GIP'HPIB;                                                     01816000
  OPTION EXTERNAL;                                                      01818000
                                                                        01820000
PROCEDURE HELP;                                                         01822000
  OPTION EXTERNAL;                                                      01824000
                                                                        01826000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,       01828000
                            REPLY,OFFSET,DITP,IOTYPE);                  01830000
  VALUE  SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,DITP,IOTYPE; 01832000
  INTEGER  SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,IOTYPE;    01834000
  INTEGER POINTER  DITP;                                                01836000
  OPTION VARIABLE,EXTERNAL;                                             01838000
                                                                        01840000
PROCEDURE MASTERCLEARHPIB(DITP);                                        01842000
  ARRAY DITP;                                                           01844000
  OPTION EXTERNAL;                                                      01846000
                                                                        01848000
PROCEDURE SIODM(DITP,FLAGS);                                            01850000
  VALUE DITP,FLAGS;   LOGICAL FLAGS;                                    01852000
  POINTER DITP;   OPTION EXTERNAL;                                      01854000
                                                                        01856000
PROCEDURE START'HPIB(DITP,SIOP,QFLAG);                                  01858000
  VALUE DITP,SIOP,QFLAG;   LOGICAL QFLAG;                               01860000
  POINTER DITP,SIOP;   OPTION EXTERNAL;                                 01862000
                                                                        01864000
INTEGER PROCEDURE TIMEREQ(CODE,REQ,TIME);                               01866000
  VALUE CODE,REQ,TIME;                                                  01868000
  INTEGER CODE,REQ;   DOUBLE TIME;                                      01870000
  OPTION EXTERNAL;                                                      01872000
$PAGE "7970 DRIVER INITIALIZATION PROCEDURE"                            01874000
<<     ******************************************                       01876000
       *                                        *                       01878000
       *   MT DRIVER INITIALIZATION PROCEDURE   *                       01880000
       *                                        *                       01882000
       ******************************************       >>              01884000
                                                                        01886000
                                                                        01888000
   PROCEDURE MTINIT(DITP);                                              01890000
     INTEGER ARRAY  DITP;                                               01892000
                                                                        01894000
<<                                                                      01896000
       THIS PROCEDURE INITIALIZES THE BUFFER ADDRESSES FOR              01898000
       MOST READ, WRITE, AND END COMMANDS IN THE CHANNEL                01900000
       PROGRAM.                                                         01902000
>>                                                                      01904000
                                                                        01906000
     BEGIN                                                              01908000
       INTEGER POINTER   ILTP = Q+1;                                    01910000
       INTEGER POINTER   SIOP = Q+2;                                    01912000
       INTEGER        SIOBASE = Q+3;                                    01914000
       INTEGER POINTER   STAP = Q+4;                                    01916000
       INTEGER        STABASE = Q+5;                                    01918000
       INTEGER POINTER IDLECP = Q+6;                                    01920000
                                                                        01922000
                                                                        01924000
       TOS := DITP(DILTP);       << ILTP    >>                          01926000
       TOS := ILTP(ISIOP);       << SIOP    >>                          01928000
       TOS := @SIOP + SYSDB;     << SIOBASE >>                          01930000
       TOS := ILTP(ISTAP);       << STAP    >>                          01932000
       TOS := @STAP + SYSDB;     << STABASE >>                          01934000
       TOS := @SIOP + IDLE;      << IDLECP >>                           01936000
                                                                        01938000
                                                                        01940000
       IF ILTP(IFLAG).(1:1) <> 0 THEN RETURN; <<IDLECP ALREADY STARTED>>01942000
                                                                        01944000
                                                                        01946000
       SIOP( 4) := SIOBASE + SLCTUNIT;                                  01948000
       SIOP(15) := SIOBASE + CMDWORD;                                   01950000
       SIOP(35) := SIOBASE + SPFDCMD;                                   01952000
       SIOP(40) := SIOBASE + DUMMYBUFF;                                 01954000
       SIOP(51) := SIOBASE + STATUS;                                    01956000
       SIOP(58) := SIOBASE + STATUS;                                    01958000
       SIOP(72) := SIOBASE + ENDCMD;                                    01960000
       SIOP(82) := STABASE;                                             01962000
       SIOP(89) := SIOBASE + ABEND;                                     01964000
                                                                        01966000
       START'HPIB(DITP,IDLECP,FALSE);                                   01968000
     END;                                                               01970000
$PAGE "7970 DRIVER PROCEDURE"                                           01972000
<<    ********************************************                      01974000
      *                                          *                      01976000
      *   MAG TAPE DRIVER PROCEDURE  -  MTDRVR   *                      01978000
      *                                          *                      01980000
      ********************************************         >>           01982000
                                                                        01984000
                                                                        01986000
                                                                        01988000
  INTEGER PROCEDURE MTDRVR(IOQP,DITP,BANK,BUFFADDR,SIOP,DRTN); <<02668>>01990000
                                                                        01992000
<<    THIS PROCEDURE INITIATES AND COMPLETES I/O REQUESTS               01994000
      FOR THE HP 7970E MAGNETIC TAPE CONNECTED TO THE HP-IB             01996000
      AND CONTROLLED BY THE GIC.                                        01998000
                                                                        02000000
      STATE RETURNS FOR MTDRVR -                                        02002000
          5 - REQUEST COMPLETED                                         02004000
          7 - OPERATOR INTERVENTION REQUIRED                            02006000
        %13 - WAIT FOR OPERATION COMPLETION                             02008000
>>                                                                      02010000
                                                                        02012000
  VALUE DITP,IOQP,BANK,BUFFADDR,SIOP,DRTN;                              02014000
  INTEGER  BANK,BUFFADDR,DRTN;                                          02016000
  INTEGER POINTER  DITP,IOQP,SIOP;                                      02018000
  OPTION  PRIVILEGED,UNCALLABLE;                                        02020000
                                                                        02022000
                                                                        02024000
  BEGIN                                                                 02026000
    LOGICAL ARRAY                                                       02028000
      DITPL(*) = DITP,  IOQPL(*) = IOQP,   SIOPL(*) = SIOP;             02030000
                                                                        02032000
    LOGICAL                                                             02034000
      LS0 = S-0;                                                        02036000
                                                                        02038000
    DOUBLE                                                              02040000
      BUFFADDRD = Q-7;    << BANK AND BUFFER ADDRESS >>                 02042000
                                                                        02044000
    INTEGER POINTER                                                     02046000
      CPVAP     = Q+1,    << HOLDS CHANNEL I/O STATUS >>                02048000
      IDLESIO   = Q+2,    << POINTS TO START OF IDLE CHAN PROG >>       02050000
      ABCPGM    = Q+6,    << POINTS TO ABORT CHAN PROG >>               02052000
      STATSIO   = Q+3;    << POINTS TO START OF STATUS CHAN PROG >>     02054000
                                                                        02056000
    INTEGER                                                             02058000
      XFERCNT   = Q+4,    << BUFFER BYTE COUNT >>                       02060000
      FCODE     = Q+5,    << FUNCTION CODE >>                           02062000
      MTSTATE   = MTDRVR, << MAG TAPE STATE >>                          02064000
      S0        = S-0,                                                  02066000
      S3        = S-3,                                                  02068000
      X         = X;                                                    02070000
                                                                        02072000
    DOUBLE POINTER                                                      02074000
      LPDTD     = DB + SYSLPDT;                                         02076000
<<This subroutine returns a TRUE condition if the conditions>> <<02681>>02078000
<<are such that a write after encountering EOT is NOT allowed>><<02681>>02080000
logical subroutine CHECK'WRITE'AFTER'EOT;                      <<02681>>02082000
begin                                                          <<02681>>02084000
                                                               <<02681>>02086000
if DITPL(DSTAT).EOT             <<EOT has been passed on tape>><<02681>>02088000
   and not IOQPL(QPAR2).EOTFLAG <<wrt after EOT flag not set >><<02681>>02090000
   and IOQP(QMISC) >= 0 then    <<not in RETRY mode>>          <<02681>>02092000
  CHECK'WRITE'AFTER'EOT := true;                               <<02681>>02094000
                                                               <<02681>>02096000
end;                                                           <<02681>>02098000
$PAGE "7970 DRIVER PROCEDURE - ENTRY POINT"                             02100000
   << INITIALIZE LOCAL POINTERS AND VARIABLES >>                        02102000
                                                                        02104000
    TOS := DITP(DILTP);          << CPVAP >>                            02106000
    TOS := @SIOP + IDLE;         << IDLESIO >>                          02108000
    TOS := @SIOP + CPSTAT;       << STATSIO >>                          02110000
    TOS := IOQP(QWBCT);          << XFERCNT >>                          02112000
    IF < THEN                       << BYTE COUNT >>                    02114000
      TOS := -TOS                      << MAKE POSITIVE >>              02116000
    ELSE                            << WORD COUNT >>                    02118000
      TOS := TOS&ASL(1);               << MAKE BYTE COUNT >>            02120000
    TOS := IOQP(QFUNC).FUNC;     << FCODE >>                            02122000
    TOS := @SIOP+ABTCP;          << ABCPGM >>                           02124000
                                                                        02126000
                                                                        02128000
         << CHECK FOR IDLE CHAN PROG REQUEST >>                         02130000
                                                                        02132000
  IF @IOQP = 0 THEN    << START IDLE CHANNEL PROGRAM >>                 02134000
    BEGIN                                                               02136000
      START'HPIB(DITP,IDLESIO,FALSE);                                   02138000
      IF < THEN   << SIO FAILURE >>                                     02140000
        BEGIN                                                           02142000
          TOS := SIOFAIL;                                               02144000
          GOTO BADIO;                                                   02146000
        END;                                                            02148000
      CPVAP := 0;                                                       02150000
      MTSTATE := REQUESTDONE;                                           02152000
      RETURN;                                                           02154000
    END;                                                                02156000
                                                                        02158000
                                                                        02160000
         << CHECK FOR ABORT REQUEST >>                                  02162000
                                                                        02164000
  IF IOQP.(0:1)=1 THEN      << ABORT PROCESS >>                         02166000
    BEGIN                                                               02168000
      TOS := IF IOQPL.PFAIL THEN PFABORT ELSE ABORTED;                  02170000
      DITP(DSAVE).AB'ACK := 0;  << RESET ABORT ACKNOWLEDGE BIT >>       02172000
      IF <> THEN GOTO UNUSUALEND;  << IF RESET, EXIT >>                 02174000
      START'HPIB(DITP,ABCPGM,FALSE); <<ABORT>>                          02176000
      MTSTATE := INTRPTWAIT;                                            02178000
      IOQP(QSTAT).IOSTAT := CMPLTIONWAIT;                               02180000
      DITP(DSAVE).AB'ACK := 1;   << SET ABORT ACKNOWLEDGE BIT >>        02182000
      RETURN;                                                           02184000
    END;                                                                02186000
                                                                        02188000
    <<reset abort-flush bit in DIT>>                                    02190000
    DITP(DSAVE).AB'ACK := 0;                                            02192000
                                                                        02194000
                                                                        02196000
         << CHECK FOR POWER UP CONDITION >>                             02198000
                                                                        02200000
  SIOP(-1).POWUP := 0;   << RESET PON BIT IN ILT STATUS >>              02202000
  IF <> AND NOT SIOPL(-2).ONLINE THEN   << RETURN PON CONDITION >>      02204000
    BEGIN                                                               02206000
      TOS := POWERUP;                                                   02208000
      GOTO BADIO;                                                       02210000
    END;                                                                02212000
                                                                        02214000
                                                                        02216000
         << CHECK TIMER >>                                              02218000
                                                                        02220000
  IF DITP(DTIME).(0:1)=1 THEN   << TIMER HAS POPPED >>                  02222000
    BEGIN                                                               02224000
      ABORTTIMEREQ(DITP(DRQST));                                        02226000
      DITP(DTIME) := 0;                                                 02228000
      DITP(DSAVE).RWUNLD := 1;                                          02230000
      TOS := REWUNLDCMD;                                                02232000
      GOTO CONTROLCONT;                                                 02234000
    END;                                                                02236000
                                                                        02238000
                                                                        02240000
$PAGE "7970 DRIVER PROCEDURE - INITIATOR SECTION"                       02242000
                                                                        02244000
                                                                        02246000
         <<  **  INITIATOR SECTION  **  >>                              02248000
                                                                        02250000
                                                                        02252000
  IF MTSTATE=2 THEN                                                     02254000
    BEGIN    << INITIATOR SECTION >>                                    02256000
      IF FCODE > 15 OR XFERCNT > MAXBSIZE THEN  << INVALID REQUEST >>   02258000
        BEGIN                                                           02260000
          TOS := INVALIDRQST;                                           02262000
          GOTO BADIO;                                                   02264000
        END;                                                            02266000
                                                                        02268000
      X := FCODE;  << SWITCH ON REQUEST CODE >>                         02270000
      ASMB( LOAD STABLE,X; ADAX; BR STABLE,X;                           02272000
        STABLE:                                                         02274000
          CON READ;     CON WRITE;    CON FOPEN;    CON FCLOSE;         02276000
          CON DCLOSE;   CON REWIND;   CON WRTFMARK; CON FSFILE;         02278000
          CON BSFILE;   CON REWUNLD;  CON TAPEGAP;  CON FSRECORD;       02280000
          CON BSRECORD; CON BACKREAD; CON TTCOUNT;  CON STATREAD);      02282000
                                                                        02284000
                                                                        02286000
READ:                                                                   02288000
      EOFCHECK(IOQP,0D,0,0);  << PREREAD EOF CHECK >>                   02290000
      IF <> THEN   << EOF FOUND >>                                      02292000
        BEGIN                                                           02294000
          MTSTATE := REQUESTDONE;                                       02296000
          RETURN;                                                       02298000
        END;                                                            02300000
                                                                        02302000
      IF XFERCNT = 0 THEN GOTO FSRPEOF;  << READ OF 0 SO FSRECORD >>    02304000
                                                                        02306000
      IF XFERCNT < 6 THEN                                               02308000
        BEGIN  << SHORT READ FOR THE EOF CHECK >>                       02310000
          SIOP(SRBUFF) := SIOP(SRBUFF+1) := SIOP(SRBUFF+2) := 0;        02312000
          BANK := 0;   << READ 6 BYTES INTO CHAN PROG AREA >>           02314000
          BUFFADDR := @SIOP(SRBUFF) + SYSDB;                            02316000
          XFERCNT := 6;                                                 02318000
          DITP(DSAVE).SHORT := 1;                                       02320000
        END;                                                            02322000
                                                                        02324000
                                                                        02326000
      SIOP(RWDATA) := %1400;  << SETUP READ/WRITE DATA COMMAND >>       02328000
      SIOP(EOI'JMP) := 2;     << SET EOI JUMP TO SPFD >>                02330000
      SIOP(MEMX) := BANK <<+ %100000>>;  <<add %100000 for burst mode>> 02332000
      SIOP(CMDWORD) := READCMD;   << SETUP FOR READ COMMAND >>          02334000
                                                                        02336000
WRITECONT:                                                              02338000
      SIOP(BADDR) := BUFFADDR;                                          02340000
      SIOP(BYTECNT) := XFERCNT;    << SETUP BYTE COUNT >>               02342000
      SIOP(TDBL) := 0; <<[8/4,8/64] TERM DISP/BYTE COUNT for burst>>;   02344000
      SIOP(DSJ'RWJMP) := 0;  << SET SWITCH TO READ/WRITE BRANCH >>      02346000
                                                                        02348000
INITIO:                                                                 02350000
      SIOP(DSJ'CMDJMP) := 0;  << SET SWITCH TO MOTION COMMAND BRANCH >> 02352000
                                                                        02354000
TTCOUNTCONT:                                                            02356000
      TOS := DITPL(DLDEV) LAND %1400;  << PUT UNIT # IN SELECT CMD >>   02358000
      SIOP(SLCTUNIT) := (TOS + %400)&ASR(8);                            02360000
                                                                        02362000
IOCONT:                                                                 02364000
      START'HPIB(DITP,SIOP,TRUE);  << START CHANNEL PROGRAM >>          02366000
      IF < THEN  << SIO FAILURE >>                                      02368000
        BEGIN                                                           02370000
          TOS := SIOFAIL;                                               02372000
          GOTO BADIO;                                                   02374000
        END;                                                            02376000
      CPVAP := 0;                                                       02378000
      DITP(DSAVE).RWBIT := 0;  << RESET REWIND BIT >>                   02380000
      MTSTATE := INTRPTWAIT;                                            02382000
      IF DITPL(DSAVE).BODEOF THEN RETURN;                               02384000
      TOS := IF IOQPL(QMISC).RETRY THEN RETRYWAIT ELSE CMPLTIONWAIT;    02386000
      IOQP(QSTAT).IOSTAT := TOS;                                        02388000
      RETURN;                                                           02390000
                                                                        02392000
                                                                        02394000
WRITE:                                                                  02396000
      IF XFERCNT = 0 THEN GOTO TESTWRITE;  << TO CHECK FOR WRTRING >>   02398000
      <<see if write after EOT is allowed>>                    <<02681>>02400000
      if CHECK'WRITE'AFTER'EOT then                            <<02681>>02402000
        BEGIN   << ATTEMPTED WRITE AFTER EOT DETECTED >>                02404000
          TOS := EOTWRITE;                                              02406000
          GOTO BADIO;                                                   02408000
        END;                                                            02410000
      SIOP(RWDATA) := %2000;   << SETUP READ/WRITE DATA COMMAND >>      02412000
      SIOP(EOI'JMP) := 12;  << SET EOI JUMP TO SKIP SPFD CMD >>         02414000
      SIOP(MEMX) := BANK + %20000; <<add %120000 for burst mode>>       02416000
      SIOP(CMDWORD) := WRITECMD;  << SETUP FOR WRITE COMMAND >>         02418000
      GOTO WRITECONT;                                                   02420000
                                                                        02422000
                                                                        02424000
REWIND:                                                                 02426000
      IF DITPL(DSAVE).RWBIT AND DITPL(DSTAT).LOADP THEN                 02428000
        GOTO GOODEND;                                                   02430000
      TOS := REWINDCMD;                                                 02432000
                                                                        02434000
CONTROLCONT:                                                            02436000
      SIOP(CMDWORD) := TOS;                                             02438000
      SIOP(DSJ'RWJMP) := 25;  << BRANCH AROUND READ/WRITE DATA LOGIC >> 02440000
      GOTO INITIO;                                                      02442000
                                                                        02444000
                                                                        02446000
WRTFMARK:                                                               02448000
                                                               <<02681>>02450000
      <<see if write after EOT is allowed>>                    <<02681>>02452000
      if CHECK'WRITE'AFTER'EOT then                            <<02681>>02454000
        begin                                                  <<02681>>02456000
        tos := EOTWRITE;                                       <<02681>>02458000
        go to BADIO;                                           <<02681>>02460000
        end;                                                   <<02681>>02462000
                                                               <<02681>>02464000
      TOS := WRTFMARKCMD;                                               02466000
      GOTO CONTROLCONT;                                                 02468000
                                                                        02470000
                                                                        02472000
FSFILE:                                                                 02474000
      TOS := FSFILECMD;                                                 02476000
      GOTO CONTROLCONT;                                                 02478000
                                                                        02480000
                                                                        02482000
BSFILE:                                                                 02484000
      TOS := BSFILECMD;                                                 02486000
CHECKLOADP:                                                             02488000
      IF DITPL(DSTAT).LOADP THEN  << TRIED TO BACKSPACE AT BOT >>       02490000
        BEGIN                                                           02492000
          TOS := BSPCATBOT;                                             02494000
          GOTO BADIO;                                                   02496000
        END;                                                            02498000
      GOTO CONTROLCONT;                                                 02500000
                                                                        02502000
                                                                        02504000
TAPEGAP:                                                                02506000
      TOS := TAPEGAPCMD;                                                02508000
      GOTO CONTROLCONT;                                                 02510000
                                                                        02512000
                                                                        02514000
DCLOSE:                                                                 02516000
      TOS := LPDTD(DITP(DLDEV).LDEV);                                   02518000
      TOS.EOFBIT := 0;                                                  02520000
      LPDTD(X) := TOS;  << RESET EOF FIELD IN LPDT >>                   02522000
                                                                        02524000
REWUNLD:                                                                02526000
      TOS := REWUNLDCMD;                                                02528000
      IF DITPL(DSAVE).RWBIT AND NOT DITPL(DSTAT).ONLINE THEN            02530000
        GOTO GOODEND;                                                   02532000
      GOTO CONTROLCONT;                                                 02534000
                                                                        02536000
FSRECORD:                                                               02538000
      EOFCHECK(IOQP,0D,0,0);                                            02540000
      IF <> THEN GOTO EOFOUT;                                           02542000
FSRPEOF:                                                                02544000
      TOS := FSRECORDCMD;                                               02546000
      GOTO CONTROLCONT;                                                 02548000
                                                                        02550000
                                                                        02552000
BSRECORD:                                                               02554000
      EOFCHECK(IOQP,0D,0,0);                                            02556000
      IF <> THEN GOTO EOFOUT;                                           02558000
BSRPEOF:                                                                02560000
      TOS := BSRECORDCMD;                                               02562000
      GOTO CHECKLOADP;                                                  02564000
                                                                        02566000
                                                                        02568000
BACKREAD:                                                               02570000
      EOFCHECK(IOQP,0D,0,0);                                            02572000
      IF <> THEN GOTO EOFOUT;                                           02574000
      IF XFERCNT=0 THEN GOTO BSRPEOF;                                   02576000
      IF DITPL(DSTAT).LOADP THEN  << TRIED TO BACKREAD AT BOT >>        02578000
        BEGIN                                                           02580000
          TOS := BREADATBOT;                                            02582000
          GOTO BADIO;                                                   02584000
        END;                                                            02586000
      SIOP(RWDATA) := %1400;   << SETUP READ/WRITE DATA COMMAND >>      02588000
      SIOP(EOI'JMP) := 2;     << SET EOI JUMP TO SPFD COMMAND >>        02590000
      SIOP(MEMX) := BANK; << + %100000 for burst mode>>                 02592000
      SIOP(CMDWORD) := BACKREADCMD;  << SETUP FOR BACKREAD CMD >>       02594000
      GOTO WRITECONT;                                                   02596000
                                                                        02598000
                                                                        02600000
TTCOUNT:                                                                02602000
      SIOP(MEMX'RC).(8:8) := BANK;                                      02604000
      SIOP(BADDR'RC) := BUFFADDR;                                       02606000
      SIOP(DSJ'CMDJMP) := 50;   << SET SWITCH TO TTCOUNT READ BRANCH >> 02608000
      GOTO TTCOUNTCONT;                                                 02610000
                                                                        02612000
                                                                        02614000
STATREAD:                                                               02616000
      IF XFERCNT=0 THEN  << INVALID REQUEST >>                          02618000
        BEGIN                                                           02620000
          TOS := INVALIDRQST;                                           02622000
          GOTO BADIO;                                                   02624000
          HELP;  << LINK >>                                             02626000
        END;                                                            02628000
      IF XFERCNT > 3 THEN  << EXCEED MAX STATUS >>                      02630000
        XFERCNT := 3;  << SET MAX STATUS AVAIL >>                       02632000
                                                                        02634000
      TOS := BANK;  << SET BANK >>                                      02636000
      TOS := BUFFADDR;  << SET ADDRESS >>                               02638000
                                                                        02640000
      IF XFERCNT < 3 THEN  << SINGLE STATUS REQ. >>                     02642000
        BEGIN                                                           02644000
          TOS := XFERCNT;  << TRANSFER COUNT >>                         02646000
          IF TOS THEN  << 1 BYTE STATUS REQ. >>                         02648000
            TOS := DITPL(DSTAT) LAND %177400                            02650000
          ELSE  << 1 WORD STATUS REQ. >>                                02652000
            TOS := DITP(DSTAT);                                         02654000
          ASMB(SSEA);  << STORE SINGLE WORD >>                          02656000
        END                                                             02658000
      ELSE                                                              02660000
        BEGIN  << DOUBLE STATUS REQ. >>                                 02662000
          TOS := DITP(DSTAT);  << 1ST WRD STATUS >>                     02664000
          TOS := SIOP(STATUS+1);  << 2ND WRD STATUS >>                  02666000
          ASMB(SDEA);  << STORE DOUBLE WORD >>                          02668000
        END;                                                            02670000
                                                                        02672000
      GO TO GOODEND;                                                    02674000
                                                                        02676000
    END   << INITIATOR SECTION >>                                       02678000
$PAGE "7970 DRIVER PROCEDURE - COMPLETOR SECTION"                       02680000
          << *** CONTINUATOR SECTION *** >>                             02682000
                                                                        02684000
                                                                        02686000
  ELSE                                                                  02688000
    BEGIN                                                               02690000
      IF IOQPL.SFAIL THEN  << FAILURE ON DELAYED START I/O >>           02692000
        BEGIN                                                           02694000
          TOS := SIOFAIL;                                               02696000
          GOTO BADIO;                                                   02698000
        END;                                                            02700000
                                                                        02702000
                                                                        02704000
            << CHECK FOR CHANNEL ERRORS >>                              02706000
                                                                        02708000
      IF CPVAP.ERRORCODE=6 THEN   << CHANNEL DMA ABORT >>               02710000
        GOTO CHANERROR;                                                 02712000
      IF CPVAP.ERRORCODE=7 THEN   << CHANNEL ERROR >>                   02714000
        BEGIN                                                           02716000
          IF CPVAP.TIMEDOUT=0 THEN  << CHANNEL FAILURE >>               02718000
            GOTO CHANERROR;                                             02720000
          START'HPIB(DITP,STATSIO,TRUE);                                02722000
          IF < THEN  << SIO FAILURE >>                                  02724000
            BEGIN                                                       02726000
              TOS := SIOFAIL;                                           02728000
              GOTO BADIO;                                               02730000
            END;                                                        02732000
          CPVAP := 0;                                                   02734000
          DITP(DSAVE).CESTAT := 1;                                      02736000
          MTSTATE := INTRPTWAIT;                                        02738000
          RETURN;                                                       02740000
        END;                                                            02742000
                                                                        02744000
      IF SIOPL(STATUS+1).POWUP AND NOT SIOPL(STATUS).ONLINE THEN        02746000
        BEGIN      << POWER RESTART OCCURRED >>                         02748000
          TOS := POWERUP;                                               02750000
          GOTO BADIO;                                                   02752000
        END;                                                            02754000
                                                                        02756000
      DITP(DSAVE).CESTAT := 0;                                          02758000
      IF <> THEN  << COMPLETE CHANNEL TIMEOUT PROCESSING >>             02760000
        BEGIN                                                           02762000
          IF NOT SIOPL(STATUS+1).PARITYERR THEN GOTO CHANERROR;         02764000
          DITP(DSERR) := [8/1,8/DLOGERROR];                             02766000
          DITP(DLOGERROR):= PARITYERROR;  <<LOG ERROR>>                 02768000
          GOTO IOCONT;  << RESTART I/O >>                               02770000
        END;                                                            02772000
                                                                        02774000
                                                                        02776000
                                                                        02778000
               << ERROR RETRY PROCESSING >>                             02780000
                                                                        02782000
      DITP(DSTAT) := SIOP(STATUS);  << UPDATE DIT STATUS >>             02784000
      TOS := IOQP(QMISC);   << CHECK FOR RETRY CONDITION >>             02786000
      IF < THEN  << ERROR RECOVERY IN PROGRESS >>                       02788000
        BEGIN                                                           02790000
          IF (DITPL(DSTAT) LAND ERRORMASK) <> 0 THEN           <<02710>>02792000
            BEGIN                                                       02794000
UNIT'FAIL:                                                     <<02710>>02796000
              TOS := UNITFAIL;                                          02798000
              GOTO FAIL;                                                02800000
            END;                                                        02802000
          IF LS0.BACK THEN  << BACKSPACE COMPLETED >>                   02804000
            BEGIN                                                       02806000
             if FCODE=WRITEFC or FCODE=WRTFMARKFC then <<gap>> <<02671>>02808000
                BEGIN                                                   02810000
                  TOS.BACK := 0;                                        02812000
                  TOS.GAP := 1;                                         02814000
                  IOQP(QMISC) := TOS;                                   02816000
                  GOTO TAPEGAP;                                         02818000
                END;                                                    02820000
              IF DITPL(DSTAT).LOADP THEN GOTO ENDBACK;                  02822000
              TOS := TOS + %20;  << BUMP BSCNTR >>                      02824000
              IF S0.BSCNTR <> S0.RTCNTR THEN                            02826000
                BEGIN   << BACKSPACE ANOTHER RECORD >>                  02828000
                  IOQP(QMISC) := TOS;                                   02830000
                  GOTO BSRPEOF;                                         02832000
                END;                                                    02834000
ENDBACK:                                                                02836000
              TOS.BACK := 0;  << FINISHED BACKSPACING >>                02838000
              TOS.FORWRD := 1;  << NOW FORWARD SPACE >>                 02840000
            END;                                                        02842000
                                                                        02844000
          IF LS0.FORWRD THEN  << PROCESS FORWARD SPACING >>             02846000
            BEGIN                                                       02848000
              TOS := TOS + %400;  << BUMP FSCNTR >>                     02850000
              IF S0.FSCNTR < S0.BSCNTR THEN                             02852000
                BEGIN                                                   02854000
                  IOQP(QMISC) := TOS;                                   02856000
                  GOTO FSRPEOF;                                         02858000
                END;                                                    02860000
              TOS.FORWRD := 0;  << FINISHED FORWARD SPACING >>          02862000
              IOQP(QMISC) := TOS;                                       02864000
              IF FCODE = READFC THEN GOTO READ ELSE GOTO BACKREAD;      02866000
            END;                                                        02868000
                                                                        02870000
          TOS.GAP := 0;                                                 02872000
          IF <> THEN  << GAP COMPLETED, RETRY WRITING >>                02874000
            BEGIN                                                       02876000
              <<if MTE or STE occurred during GAP, then >>     <<02710>>02878000
              <<tape was mis-positioned or drive problem>>     <<02710>>02880000
              if (DITPL(DSTAT) land MASK'STE'MTE) <> 0 then    <<02710>>02882000
                go to UNIT'FAIL;                               <<02710>>02884000
              IOQP(QMISC) := TOS;                                       02886000
              if FCODE=WRITEFC then                            <<02671>>02888000
                go to WRITE    <<we gapped to re-write>>       <<02671>>02890000
              else                                             <<02671>>02892000
                go to WRTFMARK;<<we gapped to re-write FM>>    <<02671>>02894000
            END;                                                        02896000
        END;                                                            02898000
                                                                        02900000
      IF DITP(DSAVE).BODEOF=1 THEN                                      02902000
        GOTO EOFOUT;   << BACKSPACE DUE TO DATA EOF >>                  02904000
$PAGE                                                                   02906000
                                                                        02908000
          << CHECK FOR I/O ERRORS >>                                    02910000
                                                                        02912000
      IF CPVAP(1).(14:2) <> 0 THEN  << CHECK UNIT'S STATUS >>           02914000
        BEGIN                                                           02916000
          IF NOT DITPL(DSTAT).ONLINE THEN  << UNIT NOT READY >>         02918000
            BEGIN                                                       02920000
                                                               <<02681>>02922000
              <<if this is a device close, we do NOT want>>    <<02681>>02924000
              <<to hang with a NOT READY message at the  >>    <<02681>>02926000
              <<console if the tape is powered off.      >>    <<02681>>02928000
              if FCODE = DCLOSEFC then                         <<02681>>02930000
                go to GOODEND;                                 <<02681>>02932000
                                                               <<02681>>02934000
              IF IOMESSAGE(1,NOTRDYMSG,%10000,DITP(DLDEV).LDEV,         02936000
                           ,,,,CONSOLE) THEN                            02938000
                BEGIN                                                   02940000
                  TOS := NOTREADYWAIT;                                  02942000
                  MTSTATE := OPINTRVNTNWAIT;                            02944000
                  GOTO EXIT;                                            02946000
                END;                                                    02948000
              TOS := SYSERROR;                                          02950000
              GOTO BADIO;                                               02952000
            END;                                                        02954000
                                                                        02956000
TESTWRITE:                                                              02958000
          IF FCODE=WRITEFC OR FCODE=WRTFMARKFC OR FCODE=TAPEGAPFC THEN  02960000
            BEGIN                                                       02962000
              IF DITP(DSTAT).FILEPROTECT <> 0 THEN                      02964000
                BEGIN                                                   02966000
                  IF IOMESSAGE(1,NOWRING,%10000,DITP(DLDEV).LDEV,       02968000
                               ,,,,CONSOLE) THEN                        02970000
                    BEGIN                                               02972000
                      DITP(DTIME) := 0;                                 02974000
                      DITP(DRQST) := TIMEREQ(%20,@DITP,1000D);          02976000
                      MTSTATE := INTRPTWAIT;                            02978000
                      RETURN;                                           02980000
                    END;                                                02982000
                  TOS := SYSERROR;                                      02984000
                  GOTO BADIO;                                           02986000
                END;                                                    02988000
              IF MTSTATE=2 THEN GOTO GOODEND;                           02990000
            END;                                                        02992000
                                                                        02994000
          IF DITP(DSTAT).REJECT <> 0 THEN                               02996000
            BEGIN                                                       02998000
              TOS := UNITFAIL;                                          03000000
              GOTO FAIL;                                                03002000
            END;                                                        03004000
                                                                        03006000
          IF DITP(DSTAT).BUSY <> 0 THEN  << CHECK FOR REWIND COMMAND >> 03008000
            BEGIN                                                       03010000
              IF FCODE = REWINDFC OR FCODE = REWUNLDFC THEN             03012000
                GOTO NOERROR;                                           03014000
              TOS := UNITFAIL;                                          03016000
              GOTO FAIL;                                                03018000
            END;                                                        03020000
                                                                        03022000
          IF DITP(DSTAT).TAPERUN <> 0 THEN                              03024000
            BEGIN                                                       03026000
              TOS := RUNAWAY;                                           03028000
              GOTO FAIL;                                                03030000
            END;                                                        03032000
                                                                        03034000
          IF DITP(DSTAT).TIMING <> 0 THEN                               03036000
            BEGIN                                                       03038000
              TOS := TIMINGERR;                                         03040000
              GOTO RETRYPROCESS;                                        03042000
            END;                                                        03044000
                                                                        03046000
          IF DITP(DSTAT).STERR<>0 AND FCODE=WRITEFC THEN                03048000
            BEGIN                                                       03050000
              TOS := TRANSFERERR;                                       03052000
              GOTO RETRYPROCESS;                                        03054000
            END;                                                        03056000
                                                                        03058000
          IF DITP(DSTAT).TRANSFER <> 0 THEN                             03060000
            BEGIN                                                       03062000
              TOS := TRANSFERERR;                                       03064000
RETRYPROCESS:                                                           03066000
              DITP(DSERR) := [8/1,8/DLOGERROR];                         03068000
              DITP(DLOGERROR):= DITP(DSTAT); <<LOG ERROR>>              03070000
              IF IOQP(QMISC).RTCNTR=15 THEN GOTO BADIO;                 03072000
              TOS := IOQP(QMISC) + 1;  << BUMP RETRY COUNTER >>         03074000
              TOS.RETRY := 1;                                           03076000
              TOS := TOS LAND %170017;  << ZERO SPACING COUNTERS >>     03078000
              IF FCODE = BACKREADFC THEN                                03080000
                BEGIN                                                   03082000
                  TOS.FORWRD := 1;  << FORWARD SPACE FIRST >>           03084000
                  IOQP(QMISC) := TOS;                                   03086000
                  GOTO FSRPEOF;                                         03088000
                END;                                                    03090000
              TOS.BACK := 1;                                            03092000
              IOQP(QMISC) := TOS;                                       03094000
              if FCODE > WRITEFC and FCODE <> WRTFMARKFC then  <<02671>>03096000
                go to BADIO                                    <<02671>>03098000
              else                                             <<02671>>03100000
                go to BSRPEOF;                                 <<02671>>03102000
            END;                                                        03104000
                                                                        03106000
                                                               <<02671>>03108000
          <<if this is a write of a file mark, Boise's drive>> <<02671>>03110000
          <<will respond with a DSJ 1 but not indicate a    >> <<02671>>03112000
          <<single or multiple track error on status.  The  >> <<02671>>03114000
          <<FM bit will NOT be set if the file mark was not >> <<02671>>03116000
          <<successfully written.                           >> <<02671>>03118000
          if FCODE = WRTFMARKFC then                           <<02671>>03120000
            if DITP(DSTAT).EOF <> 1 then                       <<02671>>03122000
              begin  <<we failed to write the file mark>>      <<02671>>03124000
              tos := TRANSFERERR;                              <<02671>>03126000
              go to RETRYPROCESS;                              <<02671>>03128000
              end;                                             <<02671>>03130000
                                                               <<02671>>03132000
        END;                                                            03134000
                                                                        03136000
                                                                        03138000
         << NO I/O ERRORS - COMPLETE PROCESSING >>                      03140000
                                                                        03142000
                                                                        03144000
                                                                        03146000
NOERROR:                                                                03148000
      DITP(DSAVE).RWUNLD := 0;  << RESET UNLOAD FLAG >>                 03150000
      IF <> THEN                                                        03152000
        BEGIN                                                           03154000
          TOS := RINGWAIT;  << WAIT FOR RING MOUNT >>                   03156000
          MTSTATE := OPINTRVNTNWAIT;                                    03158000
          GOTO EXIT;                                                    03160000
        END;                                                            03162000
                                                                        03164000
      IF DITP(DSTAT).EOF=1 THEN  << SET EOF IN LPDT >>                  03166000
        BEGIN                                                           03168000
          TOS := LPDTD(DITP(DLDEV).LDEV);                               03170000
          TOS.EOFBIT := 1;                                              03172000
          LPDTD(X) := TOS;                                              03174000
        END;                                                            03176000
                                                                        03178000
      IF FCODE=FSRECORDFC OR FCODE=BSRECORDFC OR FCODE=BACKREADFC THEN  03180000
        BEGIN                                                           03182000
          EOFCHECK(IOQP,BUFFADDRD,0,0);                                 03184000
          IF <> THEN GOTO EOFOUT;                                       03186000
        END                                                             03188000
      ELSE IF FCODE=REWINDFC OR FCODE=REWUNLDFC OR FCODE=DCLOSEFC THEN  03190000
        BEGIN                                                           03192000
          IOQP(QWBCT) := 0;    << SET XLOG TO 0 >>                      03194000
          DITP(DSAVE).RWBIT := 1;                                       03196000
          IF FCODE <> REWINDFC OR DITP(DSTAT).LOADP=1 THEN              03198000
            GOTO GOODEND;                                               03200000
          DITP(DSTAT).LOADP := 1;                                       03202000
          MTSTATE := OPINTRVNTNWAIT;                                    03204000
          RETURN;                                                       03206000
        END;                                                            03208000
                                                                        03210000
                                                                        03212000
      IF FCODE=READFC AND XFERCNT <> 0 THEN                             03214000
        BEGIN                                                           03216000
          DITP(DSAVE).SHORT := 0;    << CHECK FOR SHORT READ >>         03218000
          IF <> THEN                                                    03220000
            BEGIN                                                       03222000
              TOS := 6 - SIOP(BYTECNT);                                 03224000
              TOS := @IOQP;                                             03226000
              TOS := 0;                                                 03228000
              TOS := @SIOP(SRBUFF) + SYSDB;                             03230000
              TOS := S3;                                                03232000
              EOFCHECK(*,*,*,0);                                        03234000
              IF > THEN GOTO EOFOUT;                                    03236000
              IF < THEN                                                 03238000
                BEGIN                                                   03240000
                  DITP(DSAVE).BODEOF := 1;                              03242000
                  GOTO BSRPEOF;                                         03244000
                END;                                                    03246000
              IF S0 < XFERCNT THEN XFERCNT := TOS;                      03248000
              TOS := BUFFADDRD;            << DESTINATION ADDRESS >>    03250000
              TOS := 0;                    << SOURCE ADDRESS >>         03252000
              TOS := @SIOP(SRBUFF) + SYSDB;                             03254000
              TOS := (XFERCNT+1)&ASR(1);   << WORD COUNT >>             03256000
              ASMB( MABS );     << MOVE DATA INTO USER'S BUFFER >>      03258000
            END                                                         03260000
          ELSE                                                          03262000
            BEGIN  << NORMAL READ PROCESSING >>                         03264000
              XFERCNT := XFERCNT - SIOP(BYTECNT);                       03266000
              EOFCHECK(IOQP,BUFFADDRD,XFERCNT,0);                       03268000
              IF <> THEN  << EOF FOUND >>                               03270000
                BEGIN                                                   03272000
                  IF < THEN IOQP(QMISC).BODEOF :=1;                     03274000
                  X := IF XFERCNT<127 THEN (XFERCNT+3)&ASR(1) ELSE 128; 03276000
                  TOS := BUFFADDRD;                                     03278000
                  WHILE (X:=X-1)<>0 DO                                  03280000
                    BEGIN  << BLANK OUT USER'S BUFFER >>                03282000
                      TOS := 0;                                         03284000
                      ASMB( SSEA );                                     03286000
                      TOS := TOS + 1;                                   03288000
                    END;                                                03290000
                  IF DITPL(DSAVE).BODEOF THEN GOTO BSRPEOF              03292000
                    ELSE GOTO EOFOUT;                                   03294000
                END;                                                    03296000
            END;                                                        03298000
          IF IOQP(QWBCT) < 0 THEN                                       03300000
            IOQP(QWBCT) := -XFERCNT                                     03302000
          ELSE                                                          03304000
            IOQP(QWBCT) := (XFERCNT+1)&ASR(1);                          03306000
        END                                                             03308000
                                                                        03310000
      ELSE  IF FCODE=WRITEFC OR FCODE=WRTFMARKFC THEN                   03312000
        BEGIN                                                           03314000
          IF DITPL(DSTAT).EOT THEN                                      03316000
            BEGIN                                                       03318000
              TOS := GOODEOT;                                           03320000
              GOTO UNUSUALEND;                                          03322000
            END;                                                        03324000
        END                                                             03326000
                                                                        03328000
      ELSE  IF FCODE = BACKREADFC THEN                                  03330000
        BEGIN                                                           03332000
          XFERCNT := XFERCNT - SIOP(BYTECNT);                           03334000
          IF IOQP(QWBCT) < 0 THEN                                       03336000
            IOQP(QWBCT) := -XFERCNT                                     03338000
          ELSE                                                          03340000
            IOQP(QWBCT) := (XFERCNT+1)&ASR(1);                          03342000
          IF DITPL(DSTAT).LOADP THEN                                    03344000
            BEGIN                                                       03346000
              TOS := BREADATBOT;                                        03348000
              GOTO BADIO;                                               03350000
            END;                                                        03352000
        END                                                             03354000
                                                                        03356000
      ELSE                                                              03358000
        IF FCODE = TTCOUNTFC THEN                                       03360000
          IOQP(QWBCT) := -2                                             03362000
        ELSE                                                            03364000
          IOQP(QWBCT) := 0;                                             03366000
$PAGE                                                                   03368000
GOODEND:                                                                03370000
FOPEN:                                                                  03372000
FCLOSE:                                                                 03374000
      IF FCODE=DCLOSEFC THEN DITP(DSAVE) := 0;  << CLEAR FLAGS >>       03376000
      TOS := IOQP(QMISC);                                               03378000
      IF < THEN                                                         03380000
        TOS := GOODRETRY                                                03382000
      ELSE                                                              03384000
        TOS := GOODIO;                                                  03386000
                                                                        03388000
UNUSUALEND:                                                             03390000
      MTSTATE := REQUESTDONE;                                           03392000
                                                                        03394000
EXIT:                                                                   03396000
      IOQP(QSTAT).IOSTAT := TOS;                                        03398000
      RETURN;                                                           03400000
                                                                        03402000
                                                                        03404000
                                                                        03406000
  <<  ERROR HANDLING SECTION  >>                                        03408000
                                                                        03410000
CHANERROR:                                                              03412000
      TOS := CHANFAIL;                                                  03414000
      DITP(DSERR):= [8/1,8/DLOGERROR];                                  03416000
      DITP(DLOGERROR):= CPVAP;  <<LOG CHANNEL STATUS>>                  03418000
                                                                        03420000
BADIO:                                                                  03422000
      MASTERCLEARHPIB(DITP);                                            03424000
      DITP(DSAVE) := 0;    << RESET DRIVER BIT FLAGS >>                 03426000
      GOTO UNUSUALEND;                                                  03428000
                                                                        03430000
FAIL:                                                                   03432000
      DITP(DSERR):= [8/1,8/DLOGERROR];                                  03434000
      DITP(DLOGERROR):= DITP(DSTAT); <<LOG UNIT'S STATUS>>              03436000
      GOTO BADIO;                                                       03438000
                                                                        03440000
EOFOUT:                                                                 03442000
      MTSTATE := REQUESTDONE;                                           03444000
      RETURN;                                                           03446000
    END;                                                                03448000
  END;                                                                  03450000
$PAGE "7970 DRIVER OUTER BLOCK FOR INITIAL"                             03452000
  ASMB(                                                                 03454000
    PCAL SIODM;      << MONITOR >>                                      03456000
    PCAL MTDRVR;     << INITIATOR >>                                    03458000
    PCAL MTDRVR;     << COMPLETOR >>                                    03460000
    CON  0;          << NO IO PROCESS >>                                03462000
    PCAL MTINIT;     << INITIALIZATION >>                               03464000
    CON  1;          << ONE INTERRUPT HANDLER >>                        03466000
    PCAL GIP'HPIB);  << INTERRUPT HANDLER >>                            03468000
  END.                                                                  03470000
