$CONTROL MAP,CODE,USLINIT                                               00010000
<<HIOCTAP0 - MODULE 42>>                                                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 EXECPT 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
$CONTROL PRIVILEGED,UNCALLABLE                                          00030000
$TITLE "CS'80 LINUS DRIVER - HPIB"                                      00032000
$TP                                                                     00034000
<<                                                                      00036000
                                                                        00038000
                                                                        00040000
        CS'80 Linus Driver 3000 Series - HIOCTAP0                       00042000
        ----------------------------------------                        00044000
                                                                        00046000
                                                                        00048000
Structure of HIOCTAP0:                                                  00050000
                                                                        00052000
HIOCTAP0, 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
HIOCTAP0 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 (CSDRVR), the         00090000
request completor (CSDRVR), the initialization procedure (CSINIT,       00092000
called by PROGEN at system startup), and the interrupt handler (GIP).   00094000
                                                                        00096000
                                                                        00098000
Operation of HIOMDSC2:                                                  00100000
                                                                        00102000
The primary working code of HIOCTAP0 is a procedure CSDRVR.  CSDRVR     00104000
is called with six 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 disc drive.  There is one DIT for      00114000
each unit on the controller and they contain information which must     00116000
be saved between I/O requests to the driver.  IOQP is a pointer to the  00118000
Input/Output Table which contains information relevent to the current   00120000
request.  SIOP is a pointer to the first element of the channel pro-    00122000
gram which is actually part of the Interrupt Linkage Table.  The last   00124000
parameter DRTN is the Device Reference Table (DRT) number of the        00126000
device.  These three elements are described in more detail elsewhere    00128000
in this listing.                                                        00130000
                                                                        00132000
CSDRVR is always called by the SIO device monitor (SIODM) and it        00134000
determines the reason for the call by examining the IOQ and the DIT.    00136000
When a new request is initiated, CSDRVR examines the function code      00138000
and parameter fields contained in the IOQ element to determine the      00140000
task that is desired.  The proper command data bytes are then placed    00142000
in the command data buffer and the proper command codes and program     00144000
branches are set up in the channel program and execution is begun.      00146000
                                                                        00148000
Upon completion of the request, an interrupt is generated and CSDRVR    00150000
is again called.  The code checks for current activity in progress,     00152000
and this being the case, branches to the completion section of the      00154000
driver.  Here if necessary, the status words are examined for errors    00156000
and special conditions which might have occurred during the execu-      00158000
tion of the channel program, during the data transfer, or during the    00160000
operation of the disc drive.  These conditions can report special       00162000
notation back to the caller.  A list of the conditions and return       00164000
codes is provided in this listing.                                      00166000
                                                                        00168000
Fix history for HIOCTAP0.                                               00170000
                                                                        00172000
                                                                        00174000
Fix for 7 retries to be done on No Data status returned                 00176000
from the controller; rather than looping forever. (JRK).                00178000
Date fixed 05/12/82                                                     00180000
                                                                        00182000
Fix submitted to take care of count of length 0 for                     00184000
function 14. (JRK) 06/26/82                                             00186000
                                                                        00188000
Fix submitted to log addational status bits.                            00190000
(JRK) 07/08/82                                                          00192000
                                                                        00194000
Fix submitted to do logical add in place of integer add                 00196000
(JRK) 07/25/82                                                          00198000
                                                                        00200000
Fix submitted to no longer consider a return of marginal data           00202000
as a "hard error". (JRK) 08/16/82                                       00204000
                                                                        00206000
Fix submitted to take out code that is specific to discs                00208000
 and to log additional errors. 08/17/82 (JRK)                           00210000
                                                                        00212000
$PAGE                                                                   00214000
                Device Information Table (DIT)                          00216000
                ------------------------------                          00218000
                                                                        00220000
                                                                        00222000
There is one DIT per physical device. If a physical device represents   00224000
more than one logical device, the logical device number is obtained     00226000
from the IOQ element.  For the CS'80 linus controller, there will only  00228000
be one device.  The following diagram shows the DIT used by the CS'80   00230000
linus driver.                                                           00232000
                                                                        00234000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15  MNEMONIC           00236000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00238000
  0|TM|DS|AC|RQ| 0| 0| 0|IO|IA|NO|ST| 0|   STATE   | DFLAG              00240000
   +--+--+--+--+--+--+--+--+--+--+--+--+-----------+                    00242000
  1| SYSDB relative pointer to the DIT for the next| DLINK              00244000
   | device requesting this resource or service    |                    00246000
   +-----------------------------------------------+                    00248000
  2| Current request sysbase index                 | DCURREQP           00250000
   +-----+-----------------+-----------------------+                    00252000
  3|IOT  |    Phys. unit # | Logical device number | DLDEV              00254000
   +-----+-----------------+-----------------------+                    00256000
  4| SYSDB relative pointer to Device Linkage Table| DDLTP              00258000
   +-----------------------------------------------+                    00260000
  5| SYSDB relative pointer to Intrp Linkage Table | DILTP              00262000
   +-----------------------------------------------+                    00264000
  6| DSTAT is -1 when a system powerfail occurred  | DSTAT              00266000
   +-----------------------------------------------+                    00268000
  7| Hardware error status.  Set when the driver   | DSERR              00270000
   | detects an error.  Whenever <>0, the driver   |                    00272000
   | monitor logs an I/O error and clears this word|                    00274000
   +-----------------------------------------------+                    00276000
%10| Sysbase index of first request in queue       | DQHEAD *           00278000
   +-----------------------------------------------+                    00280000
%11| Sysbase index of last request in queue        | DQTAIL *           00282000
   +--+--+-----------------------------+-----------+                    00284000
%12|LK|IF|                             | SUBSTATE  | DMISC              00286000
   +--+--+-----------------------------+-----------+                    00288000
%13| SYSDB relative ptr to system buffer element   | DSBUFADDR          00290000
   +-----------------------------------------------+                    00292000
%14| High order logical sector address of bad blk  | DBADBLK1           00294000
   +-----------------------------------------------+                    00296000
%15| Low order logical sector address of bad blk   | DBADBLK2           00298000
   +-----------------------------------------------+                    00300000
%16| Byte transfer left when bad block occurred    | DBADXFER           00302000
   +-----------------------------------------------+                    00304000
%17| Hardware logged error status - CPVA (0)       | DLOGERROR          00306000
   +-----------------------------------------------+                    00308000
%20| Channel program aborted relative offset       | DSIOPSTOP          00310000
   +-----------------------------------------------+                    00312000
%21| Disc status (20 bytes)-Logged on status error | DSTATUS            00314000
   +-----------------------------------------------+                    00316000
 . |                     .                         |                    00318000
   +-----------------------------------------------+                    00320000
 . |                     .                         |                    00322000
   +-----------------------------------------------+                    00324000
%32|                                               |                    00326000
   +-----------------------------------------------+                    00328000
                                                                        00330000
DFLAG - Flags and request state                                         00332000
                                                                        00334000
  TM  TERM    - Set if device is a terminal.                            00336000
  DS  DISC    - If TM = 0 and this bit is set then the device is        00338000
                a disc, otherwise device dependent.                     00340000
  AC  ACTIVE  - A monitor is currently servicing this device.           00342000
  RQ  REQUEST - A service request is pending while the monitor is       00344000
                active.                                                 00346000
  IO  IOPROG  - An I/O Channel Program is running for this device.      00348000
  IA  IAK     - An interrupt or response has occurred for this device.  00350000
  NO  NOTRDY  - Go to state %10 after Idle Channel Program is started.  00352000
  ST  STWAIT  - The device monitor is starting an Idle Channel Program  00354000
                for this device.  There is no IOQ associated with this  00356000
                type of request.                                        00358000
  STATE       - State of the device monitor.  Specifies the next action 00360000
                to be taken in SIODM in servicing the request:          00362000
                                                                        00364000
                  0 - start new request                                 00366000
                  1 - not used                                          00368000
                  2 - call driver initiator procedure                   00370000
                  3 - call driver completor procedure                   00372000
                  4 - not used                                          00374000
                  5 - process request completed                         00376000
                  6 - initiate device recognition sequence              00378000
                  7 - start operator intervention wait                  00380000
                %10 - wait for interrupt (operator intervention)        00382000
                      restart at state 0                                00384000
                %11 - wait for data segment freeze, then state 2        00386000
                %12 - wait for driver initiator to be frozen, then      00388000
                      allocate controller (state 2)                     00390000
                %13 - wait for I/O completion interrupt, then state 3   00392000
                %14 - wait for controller, then call driver initiator   00394000
                %15 - not used                                          00396000
                %16 - wait for initiator make present, then state 2     00398000
                %17 - wait for completor make present, then state 3     00400000
                                                                        00402000
DLINK - A SYSDB relative pointer to the next DIT requesting this        00404000
        resource or service.                                            00406000
                                                                        00408000
DCURREQP - A current request sysbase index.                             00410000
                                                                        00412000
DLDEV.(0:2) - I/O system type                                           00414000
                                                                        00416000
          0 - HP3000 Series 2/3                                         00418000
          1 - HP3000 Series 33 (HPIB)                                   00420000
          2 - Unused                                                    00422000
          3 - Unused                                                    00424000
                                                                        00426000
DLDEV.(2:6) - Unit number of this device. Zero if a single unit.        00428000
                                                                        00430000
DLDEV.(8:8) - Logical device number of this device.                     00432000
                                                                        00434000
DSTAT - Set to a -1 when a system powerfail has occurred.               00436000
                                                                        00438000
DSERR - Pointer to status to be logged.                                 00440000
                                                                        00442000
        Bits(0:7)  - Number of words to be logged.                      00444000
        Bits(8:15) - Offset relative to DITP(0).                        00446000
                                                                        00448000
DMISC - Device dependent processing flags                               00450000
                                                                        00452000
  LOCK'FLG - Lock flag denoting unload status of the disc volume.       00454000
                                                                        00456000
         0 - Allow operator unload to the volume.                       00458000
         1 - Deny operator unload to the volume.                        00460000
                                                                        00462000
  IGNORE'INT'FLG - Ignore unexpected interrupt flag.                    00464000
                                                                        00466000
  SUBSTATE - Indicates state of the idle channel program:               00468000
                                                                        00470000
         0 - Normal idle channel program wait                           00472000
         1 - Idle request being serviced wait                           00474000
                                                                        00476000
DSBUFADDR - SYSDB relative pointer to the system buffer element         00478000
            used to read the DSCT. Zero, if no element gotten.          00480000
                                                                        00482000
DBADBLK1 - High order logical sector address of the bad block           00484000
           for the Defective Sector Table (DSCT) entry.                 00486000
                                                                        00488000
DBADBLK2 - Low order logical sector address of the bad block for        00490000
           the DSCT entry.                                              00492000
                                                                        00494000
DBADXFER - Byte transfer left when bad block occurred.                  00496000
                                                                        00498000
DLOGERROR - CPVA(0) logged on hardware error status.                    00500000
                                                                        00502000
DSIOPSTOP - Stopped channel program relative offset location due        00504000
            to an error in CPVA(0).                                     00506000
                                                                        00508000
DSTATUS - 20 bytes disc status logged on status error.                  00510000
          (See CS'80 Disc Drive Status).                                00512000
                                                                        00514000
                                                                        00516000
                                                                        00518000
Caution:  * Since the "C" MIT, word %10 and %11 of the DIT for          00520000
            disc devices have been used for DQHEAD and DQTAIL           00522000
            pointers for disc request queues. Word %10 is also          00524000
            used by the timer procedure to hold a timer request         00526000
            index (DTRLX). Unless word %10 of the DIT is freed          00528000
            up in a future MIT, timers cannot be implemented on         00530000
            any disc drivers.                                           00532000
                                                                        00534000
$PAGE                                                                   00536000
            DISC REQUEST QUEUE ELEMENT (IOQ)                            00538000
            --------------------------------                            00540000
                                                                        00542000
                                                                        00544000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00546000
   +-----------------------------------------------+                    00548000
  0|      Request dependent flags (see below)      |   QFLAG            00550000
   +-----------------------------------------------+                    00552000
  1|      Request urgency class                    | QURGCLASS          00554000
   +-----------------------+-----------------------+                    00556000
  2|      Unit#            | Logical device number |   QLDEV            00558000
   +-----+--+--+--+--------+--+--+-----+-----------+                    00560000
  3|CHANF|RS|OP|IM| RETRY  |LF|SP|WP:  | WAITCODE  |   QMISC            00562000
   +-----+--+--+--+--------+--+--+-----+-----------+                    00564000
  4| S|   DST   (If process disc I/O)              |   QDSCTN           00566000
   |- - - - - - - - - - - - - - - - - - - - - - - -|                    00568000
   |      DST   (If segment transfer) [S=Stack]    |                    00570000
   +--+--------------------------------------------+                    00572000
  5| Offset in the data seg (If process disc I/O)  |   QADDR            00574000
   |- - - - - - - - - - - - - - - - - - - - - - - -|                    00576000
   | Address in Bank (If segment transfer)         |                    00578000
   +-----------------------+-----------------------+                    00580000
  6|                       | Function code for     |   QFUNC            00582000
   |                       | this request.         |                    00584000
   +-----------------------+-----------------------+                    00586000
  7| On initiation, specifies the word count (>0)  |   QWBCT            00588000
   | or byte count (<0).  At completion of the     |                    00590000
   | request this location contains the actual     |                    00592000
   | transmission count in the same units (bytes   |                    00594000
   | or words) as in the request.                  |                    00596000
   +-----------------------------------------------+                    00598000
%10| P1 - Parameter 1 (Usually High Order of       |   QPAR1            00600000
   | Current Logical Disc Address [CLDA1])         |                    00602000
   +-----------------------------------------------+                    00604000
%11| P2 - Parameter 2 (Usually Low Order of        |   QPAR2            00606000
   | Current Logical Disc Address [CLDA2])         |                    00608000
   +-----------------------+--------------+--------+                    00610000
%12|         PCBN          |  QUALIFIER   | STATUS |   QSTAT            00612000
   +-----------------------+--------------+--------+                    00614000
%13| Sysbase relative indx of previous req in queue| QPREVREQP          00616000
   +-----------------------------------------------+                    00618000
%14| Sysbase relative indx of next req in queue    | QNEXTREQP          00620000
   +-----------------------------------------------+                    00622000
%15|        Segidentifier (If segment transfer     | QSEGIDENT          00624000
   +-----------------------------------------------+                    00626000
%16| Displacement of read or wrt from seg base (MM)| QSEGDISP           00628000
   +-----------------------------------------------+                    00630000
%17|S |////////////////////////////////////////////|                    00632000
   |W |////////////////////////////////////////////|                    00634000
   |A |////////////////////////////////////////////|                    00636000
   |P |////////////////////////////////////////////|                    00638000
   +-----------------------------------------------+                    00640000
                                                                        00642000
QFLAG - Request dependent flags                                         00644000
                                                                        00646000
  Bit 0  ABORT     - Request has been aborted externally.               00648000
  Bit 1  MMREQ     - Request is for a segment transfer.                 00650000
  Bit 2  DIAG      - This is a request from the diagnostic subsystem.   00652000
  Bit 3  SBUF      - Target is an index relative to the SBUF Table of   00654000
                     the data buffer.                                   00656000
  Bit 4  IOWAKE    - Wake caller on completion of request.              00658000
  Bit 5  BLOCKED   - Blocked I/O.  The caller is waited in ATTACHIO     00660000
                     until the request is completed.  Implies IOWAKE.   00662000
  Bit 6  COMPLETED - The request has been completed and the caller      00664000
                     awakened if he had requested (with IOWAKE).        00666000
  Bit 7  DATAFRZN  - Data segment has been present and is frozen.       00668000
  Bit 8  MAMERRORD - An error has occurred while MAM was trying to      00670000
                     make the target data segment present and freeze    00672000
                     it in memory.                                      00674000
  Bit 9  PREQUEUED - Request is queued into disc's request queue        00676000
  Bit 10 SFAIL     - Delayed failure of SIO instruction.  If a call     00678000
                     to STARTIO resulted in the request being added     00680000
                     to the channel queue, this bit indicates that      00682000
                     the SIO instruction failed when the request was    00684000
                     selected for execution.                            00686000
  Bit 11 PFAIL     - The request was aborted because of a system        00688000
                     power failure.                                     00690000
  Bit 12 CURREQ    - Request is device's current request.               00692000
  Bit 13 DISABLED  - Request is disabled.                               00694000
  Bit 14 DISATMPT  - Attempt to disable this request.                   00696000
  Bit 15 MSGDONE   - A message request reply has completed.             00698000
                                                                        00700000
QLDEV.QLDEVN - Logical Device Number                                    00702000
                                                                        00704000
QMISC - Driver request dependent flags and counters.                    00706000
                                                                        00708000
  CHAN'ERR'FLG   - Channel error retry flag.                            00710000
  RSTAT'FAIL'FLG - Request status failed flag.                          00712000
  OPER'REQ'FLG   - Operator requested release flag.                     00714000
  IM'FAULT'FLG   - Internal maintenance fault flag.                     00716000
                                                                        00718000
  RETRY'COUNT      Retry count area.                                    00720000
  LOAD'FLG       - Media load flag.                                     00722000
  SYS'PFAIL'FLG  - System powerfail flag.                               00724000
  VER'ERR'FLG    - Verify error flag.                                   00726000
  UNLOAD'RIN'FLG - unload due to no write ring                          00728000
                                                                        00730000
  WAITCODE       - Indicates type of wait:                              00732000
                                                                        00734000
                   0 - new request                                      00736000
                   1 - completion wait                                  00738000
                   2 - not ready wait                                   00740000
                   3 - release/release deny wait                        00742000
                   4 - IOQ defer wait                                   00744000
                   5 - DSCT read wait                                   00746000
                   6 - DSCT write wait                                  00748000
                   7 - synchronization wait                             00750000
                                                                        00752000
                   8 - write ring wait                                  00754000
QDSTN - If system buffer is clear then this is the DST                  00756000
        number of the target data segment. If bit 0 is                  00758000
        set then buffer address is a DB offset value                    00760000
        instead of segment relative offset (implemented                 00762000
        for NOWAIT I/O and NOBUFF).                                     00764000
                                                                        00766000
QADDR - Offset in data segment or system buffer table to                00768000
        target data buffer.                                             00770000
                                                                        00772000
QFUNC - Function code and qualifiers as specified by                    00774000
        driver.                                                         00776000
                                                                        00778000
QSTAT - PCB number and request completion status.                       00780000
                                                                        00782000
  PCBN    - The Process Control Block (PCB) number of the process       00784000
            which made this request.  If zero, the request is not       00786000
            associated with any process and the IOQ element is to       00788000
            be returned by the system when the request has completed.   00790000
                                                                        00792000
  STATUS  - General status indicating the final state of the request.   00794000
                                                                        00796000
            0 - Not started or awaiting completion.                     00798000
            1 - Successful completion.                                  00800000
            2 - End-of-file detected.                                   00802000
            3 - Unusual, but recoverable, condition detected.           00804000
            4 - Irrecoverable error has occurred.                       00806000
                                                                        00808000
  QUALIFIER - A code which further defines or qualifies the general     00810000
              status.  (See the section Driver Return Status Codes.)    00812000
$PAGE                                                                   00814000
                Interrupt Linkage Table (ILT)                           00816000
                -----------------------------                           00818000
                                                                        00820000
                                                                        00822000
There is one ILT for each device controller configured on the system.   00824000
A controller may support more than one unit, however the CS'80 linus    00826000
driver will only concern itself with the single unit controller.        00828000
                                                                        00830000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00832000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00834000
  0|         Channel                               |   ICPVA0           00836000
  1|              Program                          |   ICPVA1           00838000
  2|                  Variable                     |   ICPVA2           00840000
  3|                       Area (ICPVA)            |   ICPVA3           00842000
   +-----------------------------------------------+                    00844000
  4|         DMA Abort                             |   ICPVA4           00846000
  5|              Address                          |   ICPVA5           00848000
   +-----------------------------------------------+                    00850000
  6|                      0                        |   ISRQL            00852000
   +--+-----------------+-----+-----------+--------+                    00854000
  7|LI|     CHANQUE     |     |   CHAN    |  DEV   |   ICNTRL           00856000
   +--+-----------------+-----+-----------+--------+                    00858000
%10| SYSDB relative pointer to channel program area|   ISIOP            00860000
   +-----------------------------------------------+                    00862000
%11| SYSDB relative pointer to idle status area    |   ISTAP            00864000
   +-----------------------------------------------+                    00866000
%12| single instruction that is executed to extract|   IUNIT            00868000
   | the device unit number from the status pointed|                    00870000
   | to by ISTAP. [Since only Unit 0 exists on the |                    00872000
   | CS'80 discs, ANDI 0 is used to return Unit 0] |                    00874000
   +-----------------------------------------------+                    00876000
%13| SYSDB relative DIT pointer of the device      |   ICDP             00878000
   | currently using the channel to perform a      |                    00880000
   | data operation.                               |                    00882000
   +-----------------------+-----------------------+                    00884000
%14|       SIOPSIZE        |        CQUEN          |   IQUEUE           00886000
   +--+--+--+--------------+-----------+-----------+                    00888000
%15|RW|WP|IG|                          |  HCUNIT   |   IFLAG            00890000
   +--+--+--+--------------------------+-----------+                    00892000
%16| SYSDB relative DIT pointer for unit 0         |   IDITP0           00894000
   +-----------------------------------------------+                    00896000
%17| 20 bytes status area for idle channel program |   ISTAT            00898000
   +-----------------------------------------------+                    00900000
 . |                    .                          |                    00902000
   +-----------------------------------------------+                    00904000
 . |                    .                          |                    00906000
   +-----------------------------------------------+                    00908000
%31|             CS'80 Linus                       |                    00910000
   .               Channel                         .                    00912000
   |               Program                         |                    00914000
   +-----------------------------------------------+                    00916000
                                                                        00918000
                                                                        00920000
ICPVA0 - Channel Program Variable Area                                  00922000
                                                                        00924000
  The first word is used by the channel program processor to store      00926000
  status information after I/O channel aborts.  The next word is used   00928000
  by the driver to indicate if status should be examined for special    00930000
  conditions or errors.  The other two words are not used.              00932000
                                                                        00934000
                                                                        00936000
ICPVA4 - DMA abort address                                              00938000
                                                                        00940000
  If a DMA abort occurs, the absolute address where the abort occurred  00942000
  is stored in this area.                                               00944000
                                                                        00946000
                                                                        00948000
ICNTRL - Contains controller information                                00950000
                                                                        00952000
  LIM     - If this bit is set, the controller is sharing a software    00954000
            channel resource in order to limit bandwidth.               00956000
  CHANQUE - The software channel resource number.                       00958000
  CHAN    - Channel number (four most significant bits of DRTN).        00960000
  DEV     - Device number (three least significant bits of DRTN).       00962000
                                                                        00964000
                                                                        00966000
IQUEUE -                                                                00968000
                                                                        00970000
  SIOPSIZE - (number of words + 1)/2 in the channel program area.       00972000
  CQUEN    - For a multi-unit controller this field contains the        00974000
             software controller resource number.                       00976000
                                                                        00978000
                                                                        00980000
IFLAG - Controller and Channel Program state flags                      00982000
                                                                        00984000
  RUNWAIT  - An Idle Channel Program should be started when there       00986000
             are no active requests to process.                         00988000
  WAITPROG - An Idle Channel Program has been started for this          00990000
             controller.  This bit is reset by an interrupt.            00992000
  IGNOREHI - An HIOP instruction has been issued against this con-      00994000
             troller but the channel program was not in a wait          00996000
             statement.  Therefore ignore the interrupt generated by    00998000
             the channel code when this program halts.                  01000000
  HCUNIT   - Highest configured unit number for this controller.        01002000
                                                                        01004000
ISTAT - 20 bytes of status from the idle channel program.               01006000
                                                                        01008000
                                                                        01010000
            Device Reference Table DRT                                  01012000
            --------------------------                                  01014000
                                                                        01016000
There is one DRT per device controller.  The contents of this           01018000
table are used for processing interrupts.                               01020000
                                                                        01022000
     Word 0  SIOP   - Absolute address of the current I/O               01024000
                      instruction in execution.                         01026000
     Word 1  DBI    - Absolute address of the base of the ILT           01028000
                      for this controller.                              01030000
     Word 2  PLABEL - The external program label of the interrupt       01032000
                      service routine for this controller.              01034000
     Word 3  CHAN   - Contains channel program status information       01036000
                      which is used by the channel program interpreter. 01038000
$PAGE                                                                   01040000
         CS'80 Linus Driver Request Codes                               01042000
         -------------------------------                                01044000
                                                                        01046000
OPERATION            FUNCTION    PARAMETERS                             01048000
---------            --------    ----------                             01050000
                                                                        01052000
 Read                     0      Read Data Record                       01054000
                                                                        01056000
                                 Count - Transfer count                 01058000
                                                                        01060000
                                 Bank & Buffaddr contains               01062000
                                 data read.                             01064000
                                                                        01066000
                                 P1,P2 - Dbl wrd logical                01068000
                                         sector address                 01070000
                                                                        01072000
 Write                    1      Write Data Record                      01074000
                                                                        01076000
                                 Count - Transfer count                 01078000
                                                                        01080000
                                 Bank & Buffaddr contains               01082000
                                 data for write.                        01084000
                                                                        01086000
                                 P1,P2 - Dbl wrd logical                01088000
                                         sector address                 01090000
                                                                        01092000
 File Open                2      No Action Taken                        01094000
                                                                        01096000
 File Close               3      No Action Taken                        01098000
                                                                        01100000
 Device Close             4      No Action Taken                        01102000
                                                                        01104000
 Fill With Zeros          5      Fill specified Logical                 01106000
                                 sector address with zeros.             01108000
                                                                        01110000
                                 Count - Transfer count                 01112000
                                                                        01114000
                                 P1,P2 - Dbl wrd logical                01116000
                                         sector address                 01118000
                                                                        01120000
 Fill With Blanks         6      Fill specified Logical                 01122000
                                 sector address with blanks.            01124000
                                                                        01126000
                                 Count - Transfer count                 01128000
                                                                        01130000
                                 P1,P2 - Dbl wrd logical                01132000
                                         sector address                 01134000
                                                                        01136000
 Request Status           7      Request Disc Status                    01138000
                                                                        01140000
                                 Count - Transfer count                 01142000
                                         (max 20 bytes)                 01144000
                                                                        01146000
                                 Bank & Buffaddr returns                01148000
                                 the status.                            01150000
                                                                        01152000
 Initialize Media         8      Initialize Disc Media                  01154000
                                                                        01156000
                                 P1 - Initialize Options                01158000
                                      [0=Retain factory,                01160000
                                         field spares]                  01162000
                                      [1=Retain factory                 01164000
                                         spares only]                   01166000
                                 P2 - Block Interleave                  01168000
                                      byte (binary number)              01170000
                                                                        01172000
 Unload Cartridge         9      Unloads Tape Cartridge                 01174000
                                                                        01176000
                                                                        01178000
 Write Disc Label        11      Write Label to Sector 0.               01180000
                                                                        01182000
                                 Count - Label count                    01184000
                                                                        01186000
                                 Bank & Buffaddr contains               01188000
                                 label info. to be written.             01190000
                                                                        01192000
                                 P1,P2 - Dbl wrd logical                01194000
                                         sector address.                01196000
                                                                        01198000
 Request Volume Limit    13      Return max volume address.             01200000
                                                                        01202000
                                 Bank & Buffaddr returns                01204000
                                 dbl wrd of logical sector              01206000
                                 address or cylinder,head/              01208000
                                 sector address of the                  01210000
                                 maximum volume limit.                  01212000
                                                                        01214000
                                 P1 - 0 Return the single               01216000
                                        vector address                  01218000
                                                                        01220000
                                    - 1 Return the three                01222000
                                        vector address                  01224000
                                                                        01226000
 Verify                  14      Verify Disc Media                      01228000
                                                                        01230000
                                 Count - Verify length                  01232000
                                 Count - 0 Verify entire                01234000
                                           disc                         01236000
                                                                        01238000
                                 Bank & Buffaddr returns                01240000
                                 dbl wrd logical sector                 01242000
                                 address of 1st bad sector              01244000
                                 encountered (on error).                01246000
                                                                        01248000
                                 P1,P2 - Dbl wrd logical                01250000
                                         sector address                 01252000
                                         to begin doing                 01254000
                                         verification.                  01256000
                                                                        01258000
Request Status           15      Request Disc Status                    01260000
                                 (See Function Code 7)                  01262000
                                                                        01264000
Lock                     16      Lock private volume,                   01266000
                                 serial & foreign disc                  01268000
                                 disabling the unload                   01270000
                                 capability.                            01272000
                                                                        01274000
Unlock                   17      Unlock private volume,                 01276000
                                 serial & foreign disc                  01278000
                                 enabling the unload                    01280000
                                 capability.                            01282000
                                                                        01284000
 Read lock bit           18      Reads The Lock Bit                     01286000
                                                                        01288000
                                 Bank & Buffaddr returns                01290000
                                 The State Of The Dits                  01292000
                                 Lock Flag.                             01294000
                                                                        01296000
                                                                        01298000
                                                                        01300000
[                                   ]                                   01302000
[ Note:  Count = (+) denotes #words ]                                   01304000
[              = (-) denotes #bytes ]                                   01306000
[                                   ]                                   01308000
$PAGE                                                                   01310000
         CS'80 Disc Driver Diagnostics Request Codes*                   01312000
         --------------------------------------------                   01314000
                                                                        01316000
OPERATION            FUNCTION    PARAMETERS                             01318000
---------            --------    ----------                             01320000
                                                                        01322000
Identify                 72      Bank & Buffaddr contains               01324000
                                 Device ID returned.                    01326000
                                                                        01328000
Initiate Diagnostic      73      Init Internal Diagnostic               01330000
(Selftest Initiate)                                                     01332000
                                 P1 - 2 bytes loop count                01334000
                                      (#times to do diag)               01336000
                                 P2 - Diagnostic section#               01338000
                                                                        01340000
Diagnostic Result        74      [A Request Status will                 01342000
(Selftest Result)                return the diagnostic                  01344000
                                 result should the diag-                01346000
                                 nostic fail].                          01348000
                                                                        01350000
Loopback Write           75      Count - Transfer count                 01352000
                                                                        01354000
                                 Bank & Bankaddr contains               01356000
                                 loopback data for write.               01358000
                                 Data sequence must begin               01360000
                                 with a Hex FF and each                 01362000
                                 byte which follows must                01364000
                                 equals its predecessor+1               01366000
                                                                        01368000
Loopback Read            76      Count - Transfer count                 01370000
                                                                        01372000
                                 Bank & Buffaddr contains               01374000
                                 loopback data read.                    01376000
                                                                        01378000
GENERAL PURPOSE CMD      77      Count - #Command bytes                 01380000
                                                                        01382000
                                 Bank & Buffaddr contains               01384000
                                 the command data bytes to              01386000
                                 be sent thru the command               01388000
                                 and reporting msg phase.               01390000
                                                                        01392000
Describe                 78      Count - Describe length                01394000
                                                                        01396000
                                 Bank & Buffaddr returns                01398000
                                 with the describe data.                01400000
                                                                        01402000
Release                  79      Release Disc                           01404000
                                                                        01406000
Release Denied           80      Prohibits Disc Release                 01408000
                                                                        01410000
Set Release              81      Set Disc Release                       01412000
                                                                        01414000
                                 P1 - 1 Suppress release                01416000
                                        timeout [T bit=1]               01418000
                                 P2 - 1 Release automatically           01420000
                                        during idle time                01422000
                                        [Z bit=1]                       01424000
                                                                        01426000
Set Address              82      Bank & Buffaddr contains               01428000
                                 dbl wrd of logical sector              01430000
                                 address or cylinder,head/              01432000
                                 sector address.                        01434000
                                                                        01436000
                                 P1 - 0 Address is a single             01438000
                                        vector address                  01440000
                                                                        01442000
                                 P1 - 1 Address is a three              01444000
                                        vector address                  01446000
                                                                        01448000
Set Block Displacement   83      Block offset added to the              01450000
                                 the current address.                   01452000
                                                                        01454000
                                 P1,P2 - Dbl wrd logical                01456000
                                         sector address.                01458000
                                                                        01460000
Set Mask Status          84      Bank & Buffaddr contains               01462000
                                 8 bytes of bit positions               01464000
                                 corresponding to status                01466000
                                 error bits.                            01468000
                                                                        01470000
Set Ret Addressing Mode  85      P1 - 0 Single vector mode              01472000
                                    - 1 Three vector mode               01474000
                                                                        01476000
Set Retry Time           86      Set Disc Retry Time                    01478000
                                                                        01480000
                                 P1 - Time in 10's of msecs.            01482000
                                      [0 denotes no retries]            01484000
                                                                        01486000
Set RPS                  87      Set Rotational Position                01488000
                                 Sensing                                01490000
                                                                        01492000
                                 P1 - Time to target in 100's           01494000
                                      of microseconds                   01496000
                                 P2 - Window size in 100's              01498000
                                      of microseconds                   01500000
                                                                        01502000
Spare Block              88      Spare a Block                          01504000
                                                                        01506000
                                 Bank & Buffaddr contains               01508000
                                 dbl wrd of logical sector              01510000
                                 address or cylinder,head/              01512000
                                 sector address of the                  01514000
                                 block to be spared.                    01516000
                                                                        01518000
                                 P1 - 0 Address is single               01520000
                                        vector                          01522000
                                    - 1 Address is three                01524000
                                        vector                          01526000
                                                                        01528000
                                 P2 - 0 Spare retaining                 01530000
                                        data without                    01532000
                                        target sector                   01534000
                                    - 1 Spare without                   01536000
                                        retaining data                  01538000
                                    - 4 Spare retaining                 01540000
                                        data with target                01542000
                                        sector                          01544000
                                                                        01546000
Read with 3-vector Addr  89      Read record at the three               01548000
                                 vector disc address.                   01550000
                                                                        01552000
                                 Count - Transfer count                 01554000
                                                                        01556000
                                 Bank & Buffaddr contains               01558000
                                 the data read.                         01560000
                                                                        01562000
                                 P1 - Cylinder address                  01564000
                                 P2 - Head/Sector address               01566000
                                                                        01568000
Write with 3-vector Addr 90      Write record at the three              01570000
                                 vector disc address.                   01572000
                                                                        01574000
                                 Count - Transfer count                 01576000
                                                                        01578000
                                 Bank & Buffaddr contains the           01580000
                                 data to be written.                    01582000
                                                                        01584000
                                 P1 - Cylinder address                  01586000
                                 P2 - Head/Sector address               01588000
                                                                        01590000
Initiate Utility         91     ----------------------------            01592000
                                |Case 1: No Exec Message   |            01594000
                                |                          |            01596000
                                |Count - Not Applicable    |            01598000
                                |Bank & Buffaddr contains: |            01600000
                                |                          |            01602000
                                |Word   0: Util byte cnt[N]|            01604000
                                |Word 1-N: Util parm bytes |            01606000
                                |          if byte cnt <> 0|            01608000
                                |                          |            01610000
                                |P1 - 0 No exec message    |            01612000
                                ----------------------------            01614000
                                                                        01616000
                                ----------------------------            01618000
                                |Case 2: Send Exec Message |            01620000
                                |                          |            01622000
                                |Count - Exec msg length   |            01624000
                                |Bank & Buffaddr contains: |            01626000
                                |                          |            01628000
                                |Word 0-Count: Utility data|            01630000
                                |       bytes to be sent to|            01632000
                                |       the device.        |            01634000
                                |                          |            01636000
                                |P1 - 1 Send exec message  |            01638000
                                ----------------------------            01640000
                                                                        01642000
                                ----------------------------            01644000
                                |Case 3: Rcv Exec Message  |            01646000
                                |                          |            01648000
                                |Count - Exec msg length   |            01650000
                                |Bank & Buffaddr contains: |            01652000
                                |                          |            01654000
                                |Word   0: Util byte cnt[N]|            01656000
                                |Word 1-N: Util parm bytes |            01658000
                                |          if byte cnt <> 0|            01660000
                                |                          |            01662000
                                |Bank & Buffaddr+10 return:|            01664000
                                |                          |            01666000
                                |Word 0-N: Util data infor.|            01668000
                                |          (optional)      |            01670000
                                |                          |            01672000
                                |P1 - 2 Rcv exec message   |            01674000
                                ----------------------------            01676000
                                                                        01678000
                                ----------------------------            01680000
                                |For All Cases]            |            01682000
                                |                          |            01684000
                                |P1 - Exec msg qualifier   |            01686000
                                |P2 - Utility number       |            01688000
                                ----------------------------            01690000
                                                                        01692000
Device Clear             92      Clear Device/Enable Parity             01694000
                                                                        01696000
Cancel                   93      Terminate Transaction                  01698000
                                                                        01700000
Parity Checking          94      HPIB Parity Checking                   01702000
                                                                        01704000
                                 P1 - 0 Disables checking               01706000
                                    - 1 Enables checking                01708000
                                                                        01710000
                                                                        01712000
                                                                        01714000
[                                   ]                                   01716000
[ Note:  Count = (+) denotes #words ]                                   01718000
[              = (-) denotes #bytes ]                                   01720000
[                                   ]                                   01722000
                                                                        01724000
                                                                        01726000
                                                                        01728000
*DIAGNOSTIC FUNCTION:  These functions will be primarily used           01730000
                       by the MPE online diagnostic package.            01732000
                       The diagnostic request bit in the first          01734000
                       word (QFLAG) of the disc request queue           01736000
                       should be set to allow the diagnostic            01738000
                       caller to handle its own status. Other-          01740000
                       wise the driver will assume that it had          01742000
                       been called by an MPE OS module and will         01744000
                       provide for status handling and error            01746000
                       logging to take place.                           01748000
$PAGE                                                                   01750000
                                                                        01752000
CS'80 Disc Drive Status                                                 01754000
-----------------------                                                 01756000
                                                                        01758000
BYTE      STRUCTURE       FIELD                                         01760000
----      ---------       -----                                         01762000
                                                                        01764000
0         VVVVUUUU        ID (VVVV=Volume, UUUU=Unit  )                 01766000
1         SSSSSSSS        ID (S=Unit Requiring Service)                 01768000
                             (         0 - Unit 0     )                 01770000
                             (17 (octal) - Ctrl unit  )                 01772000
                             (   All 1's - No unit    )                 01774000
2-3       RRRRRRRR        Reject Error                                  01776000
4-5       FFFFFFFF        Fault Error                                   01778000
6-7       AAAAAAAA        Access Error                                  01780000
8-9       IIIIIIII        Information Error                             01782000
                                                                        01784000
P1-P10    PPPPPPPP        Ten Parameter Associated Bytes                01786000
                                                                        01788000
Reject Errors Field       Bits  0-15   00A00BCD EFG0H000                01790000
Fault Errors Field        Bits 16-31   0A0B00C0 D0EFG0HI                01792000
Access Errors Field       Bits 32-47   ABCDEF00 GH0IJ000                01794000
Information Errors Field  Bits 48-63   ABCDE00F 0GHI0J00                01796000
                                                                        01798000
                                                                        01800000
Bit Pos.  Bit No.  Usage   [Reject Errors Field]                        01802000
--------  -------  -----                                                01804000
                                                                        01806000
   A           2   Channel Parity Error                                 01808000
   B           5   Illegal Opcode                                       01810000
   C           6   Module Addressing Error                              01812000
   D           7   Address Bounds Error                                 01814000
   E           8   Parameter Bounds Error                               01816000
   F           9   Illegal Parameter                                    01818000
   G          10   Message Sequence Violation                           01820000
   H          12   Message Length Difference                            01822000
                                                                        01824000
                                                                        01826000
Bit Pos.  Bit No.  Usage   [Fault Errors Field]                         01828000
--------  -------  -----                                                01830000
                                                                        01832000
   A          17   Cross-Unit (Linus)                                   01834000
   B          19   Controller Fault                                     01836000
   C          22   Unit Fault                                           01838000
   D          24   Diagnostic Result Failed                             01840000
                   (P1-P6 = 6 bytes result)                             01842000
   E          26   Release Required for Operator Request                01844000
                   (Load/Unload)                                        01846000
                   [Not Set for CS'80 Discs]                            01848000
   F          27   Release Required for Diagnostic Request              01850000
                   (HIO, Selftest)                                      01852000
                   [Not Set for CS'80 Discs]                            01854000
   G          28   Release Required for Internal Maintenance            01856000
                   (Head Alignment, Error Log)                          01858000
   H          30   Power Fail                                           01860000
   I          31   Retransmit/Release Completed                         01862000
                                                                        01864000
                                                                        01866000
Bit Pos.  Bit No.  Usage   [Access Errors Field]                        01868000
--------  -------  -----                                                01870000
                                                                        01872000
   A          32   Illegal Parallel Operation (Not Implemented)         01874000
   B          33   Uninitialized Media                                  01876000
   C          34   No Spares Available                                  01878000
   D          35   Not Ready                                            01880000
   E          36   Write Protect (Linus)                                01882000
   F          37   No Data Found (Linus)                                01884000
   G          40   Unrecoverable Data Overflow                          01886000
   H          41   Unrecoverable Data                                   01888000
                   (P1-P6  = 6 bytes of bad block address)              01890000
   I          43   End of File (Linus)                                  01892000
   J          44   End of Volume                                        01894000
                                                                        01896000
                                                                        01898000
Bit Pos.  Bit No.  Usage   [Information Errors Field]                   01900000
--------  -------  -----                                                01902000
                                                                        01904000
   A          48   Release Request for Operator Request                 01906000
                   (Load/Unload)                                        01908000
   B          49   Release Request for Diagnostic Request               01910000
                   (HIO, Selftest)                                      01912000
   C          50   Release Request for Internal Maintenance             01914000
                   (Head Alignment, Error Log)                          01916000
   D          51   Media Wearing                                        01918000
   E          52   Data Overrun                                         01920000
   F          55   Auto-sparing Invoked (Linus)                         01922000
   G          57   Recoverable Data Overflow                            01924000
   H          58   Marginal Data                                        01926000
                   (P1-P6  = 6 bytes of marginal block address)         01928000
   I          59   Recoverable Data                                     01930000
                   (P1-P6  = 6 bytes of recoverable block address)      01932000
   J          61   Maintenance Track Overflow                           01934000
                                                                        01936000
                                                                        01938000
Parameter Usage:                                                        01940000
----------------                                                        01942000
                                                                        01944000
Byte -->              |  1  2  3  4  5  6       7   8   9   10     |    01946000
                                                                        01948000
No Error              | New Target Address |                       |    01950000
Diagnostic Result (24)| Diagnostic Results |  Device fault log --  |    01952000
Unrecoverable Data(41)| Address of Block   |  except after a Spare |    01954000
Marginal Data     (58)| Address of Block   |  indicate length of   |    01956000
Recoverable Data  (59)| Address of Block   |  unrecoverable field  |    01958000
                                                                        01960000
* SPECIAL NOTE:  Drive status are not pertinent unless a QSTAT 1        01962000
                 occurred prior to taking status.  Driver will          01964000
                 often do a LOC & WRT with zero length to force         01966000
                 the "Not Ready" condition to appear in status.         01968000
$PAGE                                                                   01970000
                 LINUS RELEASE CONSIDERATIONS                           01972000
                  ---------------------------                           01974000
                                                                        01976000
                                                                        01978000
 A.  System Disc:                                                       01980000
                                                                        01982000
     - Release will always be granted for Internal Maintenance          01984000
       requests (Head Alignment, Error Log).                            01986000
                                                                        01988000
     - Release will always be denied for Operator (Load/Unload)         01990000
       and Diagnostic (HIO, Selftest) requests. Formal shutdown         01992000
       procedures are required prior to servicing these requests.       01994000
                                                                        01996000
 B.  Private Volumes, Serial & Foreign Discs:                           01998000
                                                                        02000000
     - Release will always be granted for Internal Maintenance          02002000
       requests (Head Alignment, Error Log).                            02004000
                                                                        02006000
     - Release will always be denied for Diagnostic requests            02008000
       (HIO, Selftest). Release will be denied for Operator             02010000
       (Load/Unload) request when the disc is in a locked               02012000
       state and granted when the disc is in an unlocked state.         02014000
                                                                        02016000
                                                                        02018000
 Note 1:  The HP7911/12 will be supported only as a system              02020000
          disc. It will not be supported as a private volume,           02022000
          serial or foreign disc. The HP7911/12 will not have           02024000
          the operator request (load/unload) and HIO capabilities.      02026000
                                                                        02028000
 Note 2:  On a status return, under the fault error field, the          02030000
          internal maintenance status should be the only status         02032000
          generating a release required. Operator and diagnostic        02034000
          nostic requests generating a release required should          02036000
          never occur and such occurrences will be flagged as           02038000
          errors.                                                       02040000
                                                                        02042000
 Note 3:  Prior to the ABI chip release, an unsolicit reporting         02044000
          message can cause the next transaction to fail due            02046000
          to a parallel poll being generated by the unsolicit           02048000
          reporting message and the next transaction being pro-         02050000
          cessed with the wrong poll. The firmware will handle          02052000
          this by setting the Retransmit/Release Completed bit          02054000
          in the status field, thus resulting in a request retry        02056000
          in the driver. Since the driver does not ever use the         02058000
          auto-release option for release requests, the Release         02060000
          Completed status definition is not applicable to the          02062000
          driver.                                                       02064000
$PAGE                                                                   02066000
                 LINUS LOCK & UNLOCK CONSIDERATIONS                     02068000
                  ---------------------------------                     02070000
                                                                        02072000
                                                                        02074000
     The driver maintains a Lock/Unlock bit in the DIT which            02076000
     is set or cleared when various MPE modules call the driver         02078000
     Lock and Unlock function code. Operator request to unload          02080000
     the volume mounted will be denied when the Lock bit is set         02082000
     and allowed only when the Lock bit is cleared.                     02084000
                                                                        02086000
 A.  System Disc:                                                       02088000
                                                                        02090000
   - Driver Initialization section will lock a system disc.             02092000
     A system disc can only be unloaded after a formal                  02094000
     shutdown.                                                          02096000
                                                                        02098000
 B.  Private Volumes:                                                   02100000
                                                                        02102000
   - These are locked by the PVSYS module at the first logical          02104000
     mount and are unlocked at the last logical dismount.               02106000
                                                                        02108000
 C.  Serial & Foreign Discs:                                            02110000
                                                                        02112000
   - These are locked for each FOPEN to the file and unlocked           02114000
     after each DCLOSE to the file.                                     02116000
                                                                        02118000
                                                                        02120000
 Note:  PVPROC will lock all non-system discs while processing          02122000
        any unexpected interrupts passed to it by DEVREC.               02124000
$PAGE                                                                   02126000
$PAGE                                                                   02128000
                  LOGGING CONSIDERATIONS                                02130000
                  ----------------------                                02132000
                                                                        02134000
                                                                        02136000
 A.  CPVA(0) along with the channel program aborted relative            02138000
     offset is logged for the following reasons:                        02140000
                                                                        02142000
     1)  DMA Abort - DMA transfer aborted by memory errors.             02144000
     2)  Channel Program Execution Error - An error is                  02146000
         detected by the CPP while servicing the channel                02148000
         program.                                                       02150000
                                                                        02152000
 B.  20 bytes of disc status are logged for any errors occur-           02154000
     ring in the status fields. (See CS'80 Disc Drive Status)           02156000
                                                                        02158000
 C.  Logging will not occur for the status Data Overrun since           02160000
     this can occur even under normal operating conditions when         02162000
     there are several high speed devices on more than one GIC.         02164000
                                                                        02166000
 D.  Logging is exempted when the driver is in diagnostics mode.        02168000
                                                                        02170000
                                                                        02172000
                                                                        02174000
                  UNEXPECTED INTERRUPTS HANDLING                        02176000
                  ------------------------------                        02178000
                                                                        02180000
                                                                        02182000
 To avoid processing unexpected interrupts from the CS'80 discs         02184000
 due to Internal Maintenance (ie. error logging and head align-         02186000
 ments), DEVREC will always issue a request status to the driver        02188000
 with DRQ word QPAR1=8 and QPAR2=9 once an unexpected interrupt         02190000
 has occurred. The driver will then return to DEVREC the pattern        02192000
 %101010 for interrupts it wishes DEVREC to ignore or return the        02194000
 first word of status for interrupts it wishes DEVREC to process.       02196000
                                                                        02198000
 Note:  The driver will set the Ignore Interrupt flag in the            02200000
        DIT for all unexpected interrupts except Operator               02202000
        Request Release and Power On condition. The Ignore              02204000
        Interrupt flag will be cleared after returning the              02206000
        ignore pattern to DEVREC's status request.                      02208000
                                                                        02210000
                                                                        02212000
         STATUS CONSIDERATIONS                                          02214000
         ---------------------                                          02216000
                                                                        02218000
While the idle channel program is running, status will be               02220000
read into the ILT table pointed to by ILT(ISTAP). While an              02222000
IOQ is being processed by the driver, status will be read               02224000
into the DIT table. The driver will always reset the read               02226000
status pointer back to the ILT after processing an IOQ                  02228000
request. This is neccesary since SIODM will not call the                02230000
driver to reschedule the idle when the idle has not been                02232000
aborted. This will occur for the driver functions which do not          02234000
execute a START'HPIB (ie. Lock, Unlock, Fopen, etc.)                    02236000
$PAGE                                                                   02238000
                       DRIVER RETURN STATUS CODES                       02240000
                       --------------------------                       02242000
                                                                        02244000
                                                                        02246000
 General Status (13:3)       Qualifying Status (8:5)      Overall (8:8) 02248000
                                                                        02250000
 0 - Pending                1 - Waiting For Completion         %10      02252000
                            3 - Not Ready Wait                 %30      02254000
                                                                        02256000
 1 - Successful             0 - No Errors                       %1      02258000
                                                                        02260000
 3 - Unusual Condition      1 - Status Interrogation Required  %13*     02262000
                          %21 - Device Powered Up             %213*     02264000
                                                                        02266000
 4 - Irrecoverable Error    0 - Invalid Request                 %4      02268000
                            1 - Track/Sector Error             %14      02270000
                            2 - I/O Timed Out Before Complete  %24      02272000
                            4 - SIO Failure                    %44      02274000
                            5 - Unit Failure                   %54      02276000
                            6 - Invalid Disc Address           %64      02278000
                          %12 - System Error                  %124      02280000
                          %14 - Channel Failure               %144      02282000
                          %15 - Uninitialized Media           %154      02284000
                          %16 - No Spares Available           %164      02286000
                                                                        02288000
                                                                        02290000
                                                                        02292000
                                                                        02294000
                                                                        02296000
                                                                        02298000
                                                                        02300000
                                                                        02302000
                                                                        02304000
*Note:  These status are used for diagnostic reporting only.            02306000
                                                                        02308000
                                                                        02310000
                                                                        02312000
                                                                        02314000
                                                                        02316000
                                                                        02318000
                                                                        02320000
                                                                        02322000
                                                                        02324000
>>                                                                      02326000
$PAGE                                                                   02328000
BEGIN                                                                   02330000
  EQUATE                                                                02332000
                                                                        02334000
       << CS'80 DISC SUBTYPES >>                                        02336000
                                                                        02338000
    HP7935    =  8,                                                     02340000
    HP7911    =  1,                                                     02342000
    HP7912    =  2,                                                     02344000
    LINUS     =  0,                                                     02346000
                                                                        02348000
       << DITP PARAMETERS >>                                            02350000
                                                                        02352000
    DIT'SIZE  = 27,  << DIT SIZE >>                            <<03722>>02354000
    DLDEV     =  3,  << LOGICAL DEVICE AND UNIT NUMBERS >>              02356000
    DILTP     =  5,  << INTERRUPT LINKAGE TABLE POINTER >>              02358000
    DSTAT     =  6,  << DEVICE POWERFAIL STATUS >>                      02360000
    DSERR     =  7,  << DIT ERROR LOG LENGTH/OFFSET >>                  02362000
    DMISC     = 10,  << DEVICE DEPENDENT WORD >>                        02364000
    DSBUFADDR = 11,  << SBUF ELEMENT USED TO READ DSCT >>               02366000
    DBADBLK1  = 12,  << HIGH ORDER ADDR OF BAD SECTOR >>                02368000
    DBADBLK2  = 13,  << LOW ORDER ADDR OF BAD SECTOR >>                 02370000
    DBADXFER  = 14,  << BYTE XFER LEFT AFTER BAD BLK >>                 02372000
    DLOGERROR = 15,  << DIT HARDWARE ERROR LOGGED STATUS >>             02374000
    DSIOPSTOP = 16,  << DIT CP STOPPED RELATIVE OFFSET >>               02376000
    DSTATUS   = 17,  << DISC STATUS-LOGGED ON STATUS ERROR >>           02378000
                                                                        02380000
    DDBADBLK  =  6,  << DBLWRD OFFSET OF SUSPECT SECTOR >>              02382000
                                                                        02384000
       << IOQP PARAMETERS >>                                            02386000
                                                                        02388000
    QMISC     =  3,  << FLAGS PERTAINING TO THIS REQUEST >>             02390000
    QFUNC     =  6,  << REQUEST FUNCTION CODE >>                        02392000
    QWBCT     =  7,  << +WORD/-BYTE COUNT >>                            02394000
    QPAR1     =  8,  << PARAMETER 1 >>                                  02396000
    QPAR2     =  9,  << PARAMETER 2 >>                                  02398000
    QSTAT     = 10,  << REQUEST STATUS AND PCB NUMBER >>                02400000
                                                                        02402000
       << ILTP PARAMETERS >>                                            02404000
                                                                        02406000
    ISIOP     =  8,  << CHANNEL PROGRAM AREA POINTER >>                 02408000
    ISTAP     =  9,  << STATUS AREA POINTER >>                          02410000
                                                                        02412000
       << CS'80 SECONDARIES >>                                          02414000
                                                                        02416000
    WRT'CMD'SEC      =   %2005,  << WRT W/CMD MSG SEC >>                02418000
    READ'TRANS'SEC   =   %3402,  << READ W/TRANS MSG SEC >>             02420000
    WRT'TRANS'SEC    =   %4002,  << WRT W/TRANS MSG SEC >>              02422000
    READ'EXEC'SEC    =   %1416,  << READ W/EXEC MSG SEC >>              02424000
    WRT'EXEC'SEC     =   %2016,  << WRT W/EXEC MSG SEC >>               02426000
                                                                        02428000
       << CS'80 DISC DRIVER COMMAND DATA BYTES >>                       02430000
                                                                        02432000
    CDB'BLK'DISPL      =  %22,  << SET BLOCK DISP COMMAND >>            02434000
    CDB'CANCEL         =  %11,  << CANCEL COMMAND >>                    02436000
    CDB'CLEAR          =  %10,  << CLEAR COMMAND >>                     02438000
    CDB'DESCRIBE       =  %65,  << DESCRIBE COMMAND >>                  02440000
    CDB'INIT'DIAG      =  %63,  << INIT DIAGNOSTIC COMMAND >>           02442000
    CDB'INIT'MEDIA     =  %67,  << INITIALIZE MEDIA COMMAND >>          02444000
    CDB'INIT'UTIL      =  %60,  << NO EXECUTING MSG >>                  02446000
    CDB'JUMP'SPARE     =    4,  << JUMP SPARE PARAMETER >>              02448000
    CDB'NOP            =  %64,  << NO OPERATION COMMAND >>              02450000
    CDB'PARITY'OP      =    1,  << PARITY OPCODE COMMAND >>             02452000
    CDB'READ           =    0,  << LOCATE & READ COMMAND >>             02454000
    CDB'READ'LOOPBK    =   %2,  << READ LOOPBACK COMMAND >>             02456000
    CDB'RELEASE        =  %16,  << RELEASE COMMAND >>                   02458000
    CDB'RELEASE'DENY   =  %17,  << RELEASE DENIED COMMAND >>            02460000
    CDB'REQ'STATUS     =  %15,  << REQUEST STATUS COMMAND >>            02462000
    CDB'SET'BURST      =  %74,  << BURST MODE COMMAND >>                02464000
    CDB'SET'LENGTH     =  %30,  << SET LENGTH COMMAND >>                02466000
    CDB'SET'OPTIONS    =  %70,  << SET OPTIONS COMMAND >>               02468000
    CDB'SET'MASK       =  %76,  << SET STATUS MASK CMD >>               02470000
    CDB'SET'RELEASE    =  %73,  << SET RELEASE COMMAND >>               02472000
    CDB'SET'RETADR     = %110,  << SET RET ADDR MODE CMD >>             02474000
    CDB'SET'RETRY      =  %72,  << SET RETRY TIME COMMAND >>            02476000
    CDB'SET'RPS        =  %71,  << SET RPS COMMAND >>                   02478000
    CDB'SET'SNGL'VEC   =  %20,  << SET SNGL VEC ADDR CMD >>             02480000
    CDB'SET'3'VEC      =  %21,  << SET 3 VECTOR ADDR CMD >>             02482000
    CDB'SET'UNIT       =  %40,  << SET UNIT# COMMAND >>                 02484000
    CDB'SET'VOL        = %100,  << SET VOL# COMMAND >>                  02486000
    CDB'SKIP'SPARE     =    6,  << SKIP SPARE PARAMETER >>              02488000
    CDB'SPARE'BLK      =   %6,  << SPARE BLOCK COMMAND >>               02490000
    CDB'UNLOAD         = %112,  << UNLOAD COMMAND >>                    02492000
    CDB'VERIFY         =   %4,  << VERIFY COMMAND >>                    02494000
    CDB'WRITE          =   %2,  << LOCATE & WRITE COMMAND >>            02496000
    CDB'WRT'LOOPBK     =   %3,  << WRITE LOOPBACK COMMAND >>            02498000
                                                                        02500000
       << CHANNEL PROGRAM OFFSETS RELATIVE TO SIOP >>                   02502000
                                                                        02504000
    FIRSTBRANCH   = 7,            << MAIN BRANCH TO SECTIONS >><<03722>>02506000
    BRANCHPT      = FIRSTBRANCH+1, << BRANCH OFFSET >>         <<03722>>02508000
    IDLE          = BRANCHPT+1,    << IDLE CP OFFSET >>        <<03722>>02510000
    IDLE'WAIT     = IDLE+5,        << IDLE WHEN DEV NOT RDY >> <<03722>>02512000
    SYNCDSJ       = IDLE'WAIT+14,  << GET INSYNC W. CS80 CMDS>><<03722>>02514000
    DXFER         = SYNCDSJ+9,      << DATA XFER SEC. OFFSET >><<03722>>02516000
    RSTAT         = DXFER+25,      << READ STATUS OFFSET >>    <<03722>>02518000
    DIAG          = RSTAT+23,     << READ STATUS OFFSET >>     <<03722>>02520000
    PON           = DIAG+14,     << POWER ON OFFSET >>         <<03722>>02522000
    IDENT         = PON+11,     << IDENTIFY SECTION OFFSET >>  <<03722>>02524000
    STAT'CDB      = IDENT+4,   << IDENTIFY SECTION OFFSET >>   <<03722>>02526000
    LOC'WRT'CDB   = STAT'CDB+1, << LOC & WRITE CDB OFFSET >>   <<03722>>02528000
    INITFLG       = LOC'WRT'CDB+4, << INIT FLAG OFFSET >>      <<03722>>02530000
    FILL'WRD      = INITFLG+1,     << FILL WORD OFFSET >>      <<03722>>02532000
    DESC'AREA     = FILL'WRD+1,    << DESCRIBE AREA OFFSET >>  <<03722>>02534000
    CDB'AREA'WRD  = DESC'AREA+10, << CDB STORAGE AREA OFFSET >><<03722>>02536000
    CPGM'SIZE     = CDB'AREA'WRD+10,<< LENGTH OF CHAN PGM >>   <<03722>>02538000
    CPGM'SIZED2   = (CPGM'SIZE+2)/2,<< LEN OF CHAN PGM/2>>     <<03722>>02540000
    INIT'ARY'SIZE = 4+DIT'SIZE+CPGM'SIZE,<< LEN OF INIT ARRAY>><<03722>>02542000
                                                                        02544000
       << CHANNEL PROGRAM ENTRIES & AREA BYTE OFFSET >>                 02546000
                                                                        02548000
    CPBASE        = FIRSTBRANCH+2,   << CP BASE >>             <<03722>>02550000
    IDLECP        = IDLE-CPBASE,     << IDLE CP ENTRY >>                02552000
    IDLE'WAIT'CP  = IDLE'WAIT-CPBASE,<< IDLE WAIT CP ENTRY >>  <<03722>>02554000
    SYNCDSJCP     = SYNCDSJ-CPBASE, << OFFSET FROM FIRST JUMP>><<03722>>02556000
    DXFERCP       = DXFER-CPBASE,    << DATA XFER ENTRY >>              02558000
    RSTATCP       = RSTAT-CPBASE,    << REQUEST STAT ENTRY >>           02560000
    DIAGCP        = DIAG-CPBASE,     << DIAG FUNCTION ENTRY >>          02562000
    PONCP         = PON-CPBASE,      << POWER ON ENTRY >>               02564000
    IDENTCP       = IDENT-CPBASE,    << IDENTIFY ENTRY >>               02566000
                                                                        02568000
    DESC'AREA'BYTE = DESC'AREA*2,    << DESC AREA BYTE OFFST >>         02570000
    CDB'AREA'BYTE  = CDB'AREA'WRD*2, << CDB AREA BYTE OFFST >>          02572000
                                                                        02574000
    SNGL'VEC'LIMIT  = DESC'AREA'BYTE+30,   << SNGL VEC ADDR >>          02576000
    THREE'VEC'LIMIT = DESC'AREA'BYTE+24,   << 3-VEC ADDR >>             02578000
    WRD'SNGL'VEC'LIMIT = SNGL'VEC'LIMIT/2, <<WARNING!!>>       <<03722>>02580000
    WRD'THREE'VEC'LIMIT = THREE'VEC'LIMIT/2,<<WARNING!!>>      <<03722>>02582000
                                                                        02584000
       << CHANNEL PROGRAM SECTIONS OFFSETS >>                           02586000
                                                                        02588000
    IDLE16        = IDLE+16,    << CMD BUFFER ABS ADDR >>      <<03722>>02590000
    DXFER1        = DXFER+1,    << CMD BUFFER LENGTH >>                 02592000
    DXFER4        = DXFER+4,    << CMD BUFFER ABS ADDR >>               02594000
    DXFER5        = DXFER+5,    << WAIT COMMAND >>                      02596000
    DXFER6        = DXFER+6,    << WAIT COMMAND >>                      02598000
    DXFER7        = DXFER+7,    << EXEC MSG SECONDARY >>                02600000
    DXFER8        = DXFER+8,    << #BYTES TO READ/WRT >>                02602000
    DXFER9        = DXFER+9,    << BURST MODE BYTE CONUT >>             02604000
    DXFER10       = DXFER+10,   << DATA BANK >>                         02606000
    DXFER11       = DXFER+11,   << DATA BUFFER ABS ADDR >>              02608000
    DXFER16       = DXFER+16,   << WAIT COMMAND >>                      02610000
    DXFER17       = DXFER+17,   << WAIT COMMAND >>                      02612000
    RSTAT4        = RSTAT+4,    << CMD BUFFER ABS ADDR >>               02614000
    RSTAT11       = RSTAT+11,   << DATA BUFFER ABS ADDR >>              02616000
    DIAG1         = DIAG+1,     << CMD BUFFER LENGTH >>                 02618000
    DIAG3         = DIAG+3,     << CMD BUFFER BANK >>                   02620000
    DIAG4         = DIAG+4,     << CMD BUFFER ABS ADDR >>               02622000
    DIAG5         = DIAG+5,     << WAIT COMMAND >>                      02624000
    DIAG6         = DIAG+6,     << WAIT COMMAND >>                      02626000
    IDENT1        = IDENT+1,    << ID RETURN BYTE ADDR >>               02628000
    IDENT2        = IDENT+2,    << IDENT INT/HLT OR JMP >>              02630000
    IDENT3        = IDENT+3,    << IDENT INT/HLT OR JMP >>              02632000
                                                                        02634000
       << DIT STATUS OFFSET >>                                          02636000
                                                                        02638000
    ID'FIELD      = DSTATUS,    << IDENTIFICATION FIELD >>              02640000
    REJECT'FIELD  = DSTATUS+1,  << REJECT ERRORS FIELD >>               02642000
    FAULT'FIELD   = DSTATUS+2,  << FAULT ERRORS FIELD >>                02644000
    ACCESS'FIELD  = DSTATUS+3,  << ACCESS ERRORS FIELD >>               02646000
    INFOR'FIELD   = DSTATUS+4,  << INFORMATION FIELD >>                 02648000
    PARM'FIELD    = DSTATUS+5,  << PARAMETER FIELD >>                   02650000
                                                                        02652000
       << IDLE CP STATUS OFFSET >>                                      02654000
                                                                        02656000
    I'FAULT'FIELD  = 2,  << IDLE FAULT ERRORS FIELD >>                  02658000
    I'ACCESS'FIELD = 3,  << IDLE ACCESS ERRORS FIELD >>                 02660000
    I'INFOR'FIELD  = 4,  << IDLE INFORMATION FIELD >>                   02662000
                                                                        02664000
       << COMPLETION STATUS >>                                          02666000
                                                                        02668000
    GOODIO         =    1,  << SUCCESSFUL I/O COMPLETION >>             02670000
    INVALIDOP      =    4,  << INVALID OPERATION REQUESTED >>           02672000
    STAT'REQRD     =  %13,  << STATUS INTERROG REQUIRED >>              02674000
    TRKSCTERR      =  %14,  << UNRECOV TRK/SECTOR ERROR >>              02676000
    TIMOUTERR      =  %24,  << TIMED OUT ERROR >>                       02678000
    RING'WAIT      =  %40,  << NO RING WAIT >>                          02680000
    SIOFAIL        =  %44,  << SIO FAILURE >>                           02682000
    UNITERR        =  %54,  << UNIT FAILURE >>                          02684000
    INVALIDSKADR   =  %64,  << INVALID DISC ADDRESS >>                  02686000
    SYSERR         = %124,  << SYSTEM ERROR >>                          02688000
    CHANFAIL       = %144,  << I/O CHANNEL ERROR >>                     02690000
    UNINIT'MEDIA'ERR=%154,  << UNINITIALIZED MEDIA >>                   02692000
    NO'SPARE'ERR   = %164,  << NO SPARE AVAILABLE >>                    02694000
    DEVICE'PON     = %213,  << DEVICE POWERED ON >>                     02696000
                                                                        02698000
       << DRIVER STATES >>                                              02700000
                                                                        02702000
    CMPLTION'WAIT  = 1,  << WAITING FOR I/O COMPLETION INTRPT >>        02704000
    NOT'RDY'WAIT   = 2,  << NOT READY WAIT IN PROGRESS >>               02706000
    REL'WAIT       = 3,  << REL/REL DENY COMPLETION WAIT >>             02708000
    IOQ'DEFER'WAIT = 4,  << IOQ BEING DEFERRED WAIT >>                  02710000
    DSCT'READ'WAIT = 5,  << DEFECTIVE SECTOR TABLE READ WAIT >>         02712000
    DSCT'WRT'WAIT  = 6,  << DEFECTIVE SECTOR TABLE WRT WAIT >>          02714000
    SYNC'WAIT      = 7,  << DRIVER/FIRMWARE SYNC WAIT >>                02716000
    OPINTRVNWAIT   = 8,  << UNIT NOT READY WAIT FOR OPERATOR >>         02718000
                                                                        02720000
    IDLE'REQ'WAIT  = 1,  << IDLE REQUEST COMPLETION WAIT >>             02722000
                                                                        02724000
       << SIODM STATES >>                                               02726000
                                                                        02728000
    INTRPTWAIT  = %13,  << WAIT FOR I/O COMPLETION >>                   02730000
    NOTREADY    =   7,  << UNIT NOT READY >>                            02732000
    REQUESTDONE =   5,  << REQUEST DONE >>                              02734000
                                                                        02736000
       << IOMESSAGE PARAMETERS >>                                       02738000
                                                                        02740000
    OPCONSOLE      =  0,  << OUTPUT MSG TO SYS CONSOLE >>               02742000
    SYS'DENY'MSG   = 25,  << SYSDISC UNLOAD DENIED MSG >>               02744000
    NSYS'DENY'MSG  = 26,  << NON-SYSDISC UNLOAD DENY MSG >>             02746000
    SYS'DSCT'MSG   = 27,  << SYSDISC DSCT FULL MSG >>                   02748000
    PV'DSCT'MSG    = 28,  << PV DSCT FULL MSG >>                        02750000
    NO'RING        =220,  << NO WRITE RING MESSAGE >>                   02752000
                                                                        02754000
       << MISCELLANEOUS EQUATES >>                                      02756000
                                                                        02758000
    CPVA'TIMEOUT  = %160004,<<CPVA RETURNED IF GIC TIMEOUT>>   <<03722>>02760000
    CTRL'UNIT     = %17,    << CONTROLLER UNIT >>                       02762000
    DESCRIBE      = 22,     << DESCRIBE FUNCTION CODE >>                02764000
    DIAG'RESULT   = 16,     << DIAG RESULT FUNCTION CODE >>             02766000
    DSCT'DADR     = 1,      << DSCT DISC ADDRESS >>                     02768000
    DSCT'SIZE     = 256,    << #BYTES IN DSCT >>                        02770000
    INIT'MEDIA     = 8,       << FORMAT FUNCTION CODE >>       <<03667>>02772000
    IDENTIFY      = 16,     << IDENTIFY FUNCTION CODE >>                02774000
    MAX'DESC'BYTE = 37,     << MAX# DESCRIBE BYTES >>                   02776000
    REQ'STAT      = 7,      << REQUEST STATUS FUNCTION CODE >>          02778000
    REQ'VOL'LIMIT = 11,     << REQ VOL LIMIT FUNCTION CODE >>           02780000
    SYSLPDT       = %10,    << DB RELATIVE BASE OF LPDT >>              02782000
    SYSDB         = %1000,  << ADDRESS OF SYSDB AREA >>                 02784000
    TYPE          = 3,      << CS'80 DISCS TYPE >>                      02786000
    VERIFY        = 11,     << VERIFY FUNCTION CODE >>                  02788000
  ENDEQ           =  0;                                                 02790000
                                                                        02792000
       << MISCELLANEOUS DECLARATIONS >>                                 02794000
                                                                        02796000
    DOUBLE ARRAY LPDTD(@) = DB + SYSLPDT;                               02798000
$PAGE                                                                   02800000
                                                                        02802000
       << I/O STATUS BIT DEFINITIONS >>                                 02804000
                                                                        02806000
                                                                        02808000
  DEFINE                                                                02810000
                                                                        02812000
       << DMISC BIT DEFINITIONS >>                                      02814000
                                                                        02816000
    LOCK'FLG       = ( 0:1)#, << LOCK FLG FOR VOL MOUNTED >>            02818000
    IGNORE'INT'FLG = ( 1:1)#, << IGNORE UNEXPECTED INTRP FLAG >>        02820000
                                                                        02822000
    SUBSTATE   = (12:4)#, <<  INDICATES STATE OF IDLE CP  >>            02824000
                          <<                              >>            02826000
                          <<  0 - NORMAL IDLE CP WAIT     >>            02828000
                          <<  1 - IDLE REQUEST BEING      >>            02830000
                          <<      SERVICED WAIT           >>            02832000
                          <<                              >>            02834000
                                                                        02836000
       << QMISC BIT DEFINITIONS >>                                      02838000
                                                                        02840000
    CHAN'ERR'FLG   = ( 0:2)#, << CHANNEL ERROR RETRY FLAG >>            02842000
    RSTAT'FAIL'FLG = ( 2:1)#, << REQUEST STATUS FAILED FLAG >>          02844000
    UNLOAD'RING'FLG= (11:1)#, << UNLOAD TAPE FLAG >>           <<03667>>02846000
    OPER'REQ'FLG   = ( 3:1)#, << OPERATOR REQUEST RELEASE FLAG >>       02848000
    IM'FAULT'FLG   = ( 4:1)#, << INT MAINTENANCE FAULT FLAG >>          02850000
    RETRY'COUNT    = ( 5:3)#, << RETRY COUNT IN QMISC >>       <<03722>>02852000
    STAT'RTRY'FLG  = ( 5:1)#, << STAT ERROR SINGLE RETRY FLAG >>        02854000
    RTRANS'FLG     = ( 6:2)#, << RETRANSMIT REQUIRED FLAG >>            02856000
    LOAD'FLG       = ( 8:1)#, << MEDIA LOAD FLAG >>                     02858000
    SYS'PFAIL'FLG  = ( 9:1)#, << SYSTEM POWERFAIL FLAG >>               02860000
    VER'ERR'FLG    = (10:1)#, << VERIFY ERROR FLAG >>          <<03667>>02862000
                                                                        02864000
    WAITCODE   = (12:4)#, <<  INDICATES TYPE OF WAIT  >>                02866000
                          <<                          >>                02868000
                          <<  0 - NEW REQUEST         >>                02870000
                          <<  1 - COMPLETION WAIT     >>                02872000
                          <<  2 - NOT READY WAIT      >>                02874000
                          <<  3 - REL/REL DENY WAIT   >>                02876000
                          <<  4 - IOQ DEFER WAIT      >>                02878000
                          <<  5 - DSCT READ WAIT      >>                02880000
                          <<  6 - DSCT WRITE WAIT     >>                02882000
                          <<  7 - SYNC WAIT           >>                02884000
                          <<                          >>                02886000
                                                                        02888000
       << STATUS ERROR REPORTING FIELDS >>                              02890000
                                                                        02892000
    NOT'RDY         = ( 3:1)#,   << DEVICE NOT READY BIT >>             02894000
    UNIT'ATTN       = ( 8:8)#,   << UNIT ATTENTION BIT >>               02896000
                                                                        02898000
    CHAN'PARITY     = ( 2:1)=1#, << CHANNEL PARITY BIT >>               02900000
    ILLEG'OPCODE    = ( 5:1)=1#, << ILLEGAL OPCODE BIT >>               02902000
    MOD'ADDR'ERR    = ( 6:1)=1#, << MODULE ADDR ERROR BIT >>            02904000
    ADDR'BOUND      = ( 7:1)=1#, << ADDRESS BOUNDS BIT >>               02906000
    PARM'BOUND      = ( 8:1)=1#, << PARAMETER BOUNDS BIT >>             02908000
    ILLEG'PARM      = ( 9:1)=1#, << ILLEGAL PARAMETER BIT >>            02910000
    MSG'SEQ'VIOL    = (10:1)=1#, << MSG SEQ VIOLATION BIT >>            02912000
    MSG'LEN'DIFF    = (12:1)=1#, << MSG LENGTH DIFFER BIT >>            02914000
                                                                        02916000
    CROSS'UNIT      = ( 1:1)=1#, << ERROR DURING COPY OPER >>           02918000
    CTRL'FAULT      = ( 3:1)=1#, << CONTROLLER FAULT BIT >>             02920000
    UNIT'FAULT      = ( 6:1)=1#, << UNIT FAULT BIT >>                   02922000
    DIAG'FAILED     = ( 8:1)=1#, << DIAG FAILED BIT >>                  02924000
    OPER'REL'REQRD  = (10:1)=1#, << OPER REL REQUIRED BIT >>            02926000
    DIAG'REL'REQRD  = (11:1)=1#, << DIAG REL REQUIRED BIT >>            02928000
    INT'MAINT'REQRD = (12:1)=1#, << INT MAINT REQUIRED BIT >>           02930000
    POWER'FAIL      = (14:1)=1#, << POWER FAIL BIT >>                   02932000
    RETRANSMIT      = (15:1)=1#, << RETRANSMIT/REL CMPLT BIT >>         02934000
                                                                        02936000
    ILLEG'PAR'OPER  = ( 0:1)=1#, << ILLEGAL // OPERATION BIT >>         02938000
    UNINIT'MEDIA    = ( 1:1)=1#, << UNINITIALIZED MEDIA BIT >>          02940000
    NO'SPARE'AVAIL  = ( 2:1)=1#, << NO SPARE AVAILABLE BIT >>           02942000
    DEV'NOT'RDY     = ( 3:1)=1#, << DEVICE NOT READY BIT >>             02944000
    WRT'PROTECT     = ( 4:1)=1#, << WRITE PROTECT BIT >>                02946000
    NO'DATA'FOUND   = ( 5:1)=1#, << NO DATA FOUND BIT >>                02948000
    UNRECOV'DATA'OV = ( 8:1)=1#, << UNRECOV DATA OVERFLOW BIT >>        02950000
    UNRECOV'DATA    = ( 9:1)=1#, << UNRECOV DATA BIT >>                 02952000
    END'OF'FILE     = (11:1)=1#, << END OF FILE BIT >>                  02954000
    END'OF'VOLUME   = (12:1)=1#, << END OF VOLUME BIT >>                02956000
                                                                        02958000
    OPER'REL'REQST  = ( 0:1)=1#, << OPERATOR REL REQUEST BIT >>         02960000
    DIAG'REL'REQST  = ( 1:1)=1#, << DIAG REL REQUEST BIT >>             02962000
    INT'MAINT'REQST = ( 2:1)=1#, << INT MAINT REQUEST BIT >>            02964000
    MEDIA'WEARING   = ( 3:1)=1#, << MEDIA WEARING OUT BIT >>            02966000
    DATA'OVERRUN    = ( 4:1)=1#, << DATA OVERRUN BIT >>                 02968000
    DEF'BLK'SPARE   = ( 7:1)=1#, << DEFECTIVE BLK AUTO SPARED >>        02970000
    RECOV'DATA'OV   = ( 9:1)=1#, << RECOV DATA OVERFLOW BIT >>          02972000
    MARGINAL'DATA   = (10:1)=1#, << MARGINAL DATA BIT >>                02974000
    RECOV'DATA      = (11:1)=1#, << RECOV DATA BIT >>                   02976000
    MAINT'TRK'OV    = (13:1)=1#, << MAINT TRK OVERFLOW BIT >>           02978000
                                                                        02980000
       << MISCELLANEOUS BIT DEFINITIONS >>                              02982000
                                                                        02984000
    DIAGBIT    = ( 2:1)#, << QFLAG, DIAGNOSTIC BIT >>                   02986000
    DLDEVN     = ( 8:8)#, << LOGICAL DEVICE NUMBER OF DIT >>            02988000
    ERRORCODE  = ( 0:3)#, << CPVAP, ERROR CODE >>                       02990000
    FUNC       = ( 8:8)#, << QFUNC, FUNCTION CODE >>                    02992000
    IOSTAT     = ( 8:8)#, << QSTAT, REQUEST STATUS RETURNED >>          02994000
    PVBIT      = ( 4:1)#, << PRIVATE VOLUME BIT IN LPDT >>              02996000
    SABIT      = ( 4:1)#, << WRT INSTRUCTION SINGLE ADDRESS BIT >>      02998000
    SFBIT      = (10:2)#, << SERIAL/FOREIGN BIT IN LPDT >>              03000000
    SFAIL      = (10:1)#, << QFLAG, FAILURE ON DELAYED START SIO >>     03002000
    STYPE      = (12:4)#, << DISC SUBTYPE IN LPDT >>                    03004000
    TIMEDOUT   = (13:1)#, << CPVAP, TRANSFER ABORTED-TIMED OUT >>       03006000
                                                                        03008000
       << STATEMENT DEFINES >>                                          03010000
                                                                        03012000
    ABS        = ABSOLUTE#,                                    <<03722>>03014000
    DISABLE    = ASSEMBLE (SED 0)#,                                     03016000
    LOG'STATUS = DITP(DSERR) := [8/10,8/DSTATUS]#,                      03018000
  ENDDEF       = 0#;                                                    03020000
                                                                        03022000
  LOGICAL                                                               03024000
    POWERFAIL     = DB + %72,  << SYSDB REL POWERFAIL WORD >>           03026000
    SYSUP         = DB + %73;  << SYSDB REL SYSTEM UP WORD >>           03028000
                                                                        03030000
                                                                        03032000
$PAGE                                                                   03034000
<<                                                                      03036000
        *********************************                               03038000
        *                               *                               03040000
        *   DRIVER DB AREA DEFINITION   *                               03042000
        *                               *                               03044000
        *********************************                               03046000
>>                                                                      03048000
                                                                        03050000
        ARRAY INITIAL(0:INIT'ARY'SIZE) = DB :=                 <<03722>>03052000
        [8/27,8/%61], << DISC DIT SIZE, CORE RESIDENT >>                03054000
                      << IDLE CHANNEL PROGRAM, DRIVER TYPE 1 >>         03056000
                 0,   << NOT USED >>                                    03058000
           %037400,   << UNIT EXTRACT INSTRUCTION - ANDI 0 >>           03060000
         [8/CPGM'SIZED2,8/10],<<CP SIZE/2,10 WRDS:STATUS>>     <<03722>>03062000
                                                                        03064000
        << DISC DIT >>                                                  03066000
            %40000,   << DFLAG >>                                       03068000
                 0,   << DLINK >>                                       03070000
                 0,   << DIOQP >>                                       03072000
           %040000,   << DLDEV - HPIB DEVICE >>                         03074000
                 0,   << DDLTP >>                                       03076000
                 0,   << DILTP >>                                       03078000
                 0,   << DSTAT >>                                       03080000
                 0,   << DSERR >>                                       03082000
                 0,   << DQHEAD >>                                      03084000
                 0,   << DQTAIL >>                                      03086000
                 0,   << DMISC  >>                                      03088000
                 0,   << DSBUFADDR >>                                   03090000
                 0,   << DBADBLK1  >>                                   03092000
                 0,   << DBADBLK2  >>                                   03094000
                 0,   << DBADXFER  >>                                   03096000
                 0,   << DLOGERROR >>                                   03098000
                 0,   << DSIOPSTOP >>                                   03100000
         0,0,0,0,0,   << DSTATUS   >>                                   03102000
         0,0,0,0,0,                                                     03104000
                                                                        03106000
                                                                        03108000
        <<----------------->>                                           03110000
        << CHANNEL PROGRAM >>                                           03112000
        <<----------------->>                                           03114000
                                                                        03116000
                                                               <<03722>>03118000
                                                               <<03722>>03120000
<< 0>>  << DSJ  >>          %2402,  << DSJ TO CHK PWR ON >>    <<03722>>03122000
<< 1>>                          0,  << RETURN BYTE >>          <<03722>>03124000
<< 2>>                          2,  << NORMAL RETURN >>        <<03722>>03126000
<< 3>>                         16,  << HARD-ERR REQUEST STAT >><<03722>>03128000
<< 4>>                         30,  << IDLE PWR ON OCCURED >>  <<03722>>03130000
                                                               <<03722>>03132000
<< 0>>  << FILL >>            0,0,  << UNUSED NEVER XEQED >>   <<03722>>03134000
                                                               <<03722>>03136000
                                                                        03138000
<< 0>>  << JUMP >>              0,  << BRANCH POINT TO CP SECTION >>    03140000
<< 1>>                          0,                                      03142000
                                                                        03144000
                                                                        03146000
        <<------------------------------------------------->>           03148000
        << IDLE CP - ON HARD ERROR, REQUESTS STATUS AND ON >>           03150000
        <<           POWER ON RETURNS AN IDLE PON STATUS   >>           03152000
        <<------------------------------------------------->>           03154000
                                                                        03156000
                                                                        03158000
<< 0>   << DSJ  >>          %2402,  << DSJ TO CHK PWR ON >>    <<03722>>03160000
<< 1>>                          0,  << RETURN BYTE >>          <<03722>>03162000
<< 2>>                          0,  << NORMAL RETURN >>        <<03722>>03164000
<< 3>>                          7,  << HARD-ERR REQ STAT >>    <<03722>>03166000
<< 4>>                         21,  << IDLE PWR ON OCCURED >>  <<03722>>03168000
                                                               <<03722>>03170000
<< 0>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     03172000
<< 1>>                          0,                                      03174000
                                                                        03176000
<< 2>>  << QSTAT >>         %2402,  << REPORTING MSG SECONDARY >>       03178000
<< 3>>                          0,  << RETURN BYTE >>                   03180000
<< 4>>                         12,  << NORMAL COMPLETION >>             03182000
<< 5>>                          0,  << HARD ERROR - REQ STATUS >>       03184000
<< 6>>                         14,  << IDLE POWER ON OCCURRED >>        03186000
                                                                        03188000
<< 7>>  << LOC & WRT >>     %2005,  << COMMAND MSG SECONDARY >>         03190000
<< 8>>                          7,  << CMD BUFFER LENGTH (BYTE) >>      03192000
<< 9>>                          0,  << BURST >>                         03194000
<<10>>                     %42000,  << CMD BUFFER BANK >>               03196000
<<11>>                          0,  << CMD BUFFER ABS ADDR >>           03198000
                                                                        03200000
<<12>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     03202000
<<13>>                          0,                                      03204000
                                                                        03206000
<<14>>  << QSTAT >>         %2402,  << REPORTING MSG SECONDARY >>       03208000
<<15>>                          0,  << RETURN BYTE >>                   03210000
<<16>>                          0,  << NORMAL COMPLETION >>             03212000
<<17>>                         29,  << HARD ERROR - REQ STATUS >>       03214000
<<18>>                          2,  << POWER ON OCCURRED >>             03216000
                                                                        03218000
<<19>>  << INT/HLT0 >>       %601,  << INTERRUPT/HALT >>                03220000
<<20>>                          0,  << CODE OF 0 IN CPVA(1) >>          03222000
                                                                        03224000
<<21>>  << INT/HLT4 >>       %601,  << INTERRUPT/HALT >>                03226000
<<22>>                          4,  << CODE OF 4 IN CPVA(1) >>          03228000
                                                                        03230000
                                                                        03232000
        <<------------------------------------------------->>           03234000
        << [DXFER] REAL-TIME & SOME GENERAL PURPOSE CMDS   >>           03236000
        << COMMAND - EXECUTION - REPORTING MESSAGE SECTION >>           03238000
        <<------------------------------------------------->>           03240000
                                                                        03242000
                                                                        03244000
<< 0>>  << WRITE CTRL >>    %2005,  << COMMAND MSG SECONDARY >>         03246000
<< 1>>                          0,  << CMD BUFFER LENGTH (BYTE) >>      03248000
<< 2>>                          0,  << BURST >>                         03250000
<< 3>>                      %2000,  << CMD BUFFER BANK >>               03252000
<< 4>>                          0,  << CMD BUFFER ABS ADDR >>           03254000
                                                                        03256000
<< 5>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     03258000
<< 6>>                          0,                                      03260000
                                                                        03262000
<< 7>>  << RD/WRT CTRL >>   %1416,  << EXECUTION MSG SECONDARY >>       03264000
<< 8>>                          0,  << #BYTES TO READ/WRITE >>          03266000
<< 9>>                          0,  << BURST >>                         03268000
<<10>>                          0,  << DATA BANK >>                     03270000
<<11>>                          0,  << DATA BUFFER ABS ADDR >>          03272000
<<12>>  << JUMP >>              0,  << XFER COMPLETE JUMP TO WAIT >>    03274000
<<13>>                          2,                                      03276000
                                                                        03278000
<<14>>  << JUMP >>              0,  << MORE BURSTS TO GO >>             03280000
<<15>>                        -11,                                      03282000
                                                                        03284000
<<16>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     03286000
<<17>>                          0,                                      03288000
                                                                        03290000
<<18>>  << QSTAT >>         %2402,  << REPORTING MSG SECONDARY >>       03292000
<<19>>                          0,  << RETURN BYTE >>                   03294000
<<20>>                          0,  << NORMAL COMPLETION >>             03296000
<<21>>                          2,  << HARD ERROR - REQ STATUS >>       03298000
<<22>>                         39,  << POWER ON OCCURRED >>             03300000
                                                                        03302000
<<23>>  << INT/HLT0 >>       %601,  << INTERRUPT/HALT >>                03304000
<<24>>                          0,  << CODE OF 0 IN CPVA(1) >>          03306000
                                                                        03308000
                                                                        03310000
        <<------------------------------------------------->>           03312000
        << [RSTAT] STATUS INTERROGATION SECTION            >>           03314000
        << COMMAND - EXECUTION - REPORTING MESSAGE SECTION >>           03316000
        <<------------------------------------------------->>           03318000
                                                                        03320000
                                                                        03322000
<< 0>>  << WRITE CTRL >>    %2005,  << COMMAND MSG SECONDARY >>         03324000
<< 1>>                          1,  << CMD BUFFER LENGTH (BYTE) >>      03326000
<< 2>>                          0,  << BURST >>                         03328000
<< 3>>                     %42000,  << CMD BUFFER BANK >>               03330000
<< 4>>  << STAT CDB >>          0,  << CMD BUFFER ABS ADDR >>           03332000
                                                                        03334000
<< 5>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     03336000
<< 6>>                          0,                                      03338000
                                                                        03340000
<< 7>>  << READ CTRL >>     %1416,  << EXECUTION MSG SECONDARY >>       03342000
<< 8>>                         20,  << #STATUS BYTES TO READ >>         03344000
<< 9>>                          0,  << BURST >>                         03346000
<<10>>                      %2000,  << DATA BANK >>                     03348000
<<11>>  << STAT AREA >>         0,  << DATA BUFFER ABS ADDR >>          03350000
                                                                        03352000
<<12>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     03354000
<<13>>                          0,                                      03356000
                                                                        03358000
<<14>>  << QSTAT >>         %2402,  << REPORTING MSG SECONDARY >>       03360000
<<15>>                          0,  << RETURN BYTE >>                   03362000
<<16>>                          0,  << NORMAL COMPLETION >>             03364000
<<17>>                          2,  << HARD ERROR - REQ STATUS >>       03366000
<<18>>                         18,  << POWER ON OCCURRED >>             03368000
                                                                        03370000
<<19>>  << INT/HLT1 >>       %601,  << INTERRUPT/HALT >>                03372000
<<20>>                          1,  << CODE OF 1 IN CPVA(1) >>          03374000
                                                                        03376000
<<21>>  << INT/HLT3 >>       %601,  << INTERRUPT/HALT >>                03378000
<<22>>                          3,  << CODE OF 3 IN CPVA(1) >>          03380000
                                                                        03382000
                                                                        03384000
        <<------------------------------------------------->>           03386000
        << [DIAG] COMPLEMENTARY, GP, DIAG, TRANS COMMANDS  >>           03388000
        << COMMAND/TRANS - REPORTING MESSAGE SECTION       >>           03390000
        <<------------------------------------------------->>           03392000
                                                                        03394000
                                                                        03396000
<< 0>>  << WRITE CTRL >>    %2005,  << CMD/TRANS MSG SECONDARY >>       03398000
<< 1>>                          0,  << CMD BUFFER LENGTH (BYTE) >>      03400000
<< 2>>                          0,  << BURST >>                         03402000
<< 3>>  << SEL DEV CLR >>   %2000,  << CMD BUFFER BANK >>               03404000
<< 4>>                          0,  << CMD BUFFER ABS ADDR >>           03406000
                                                                        03408000
<< 5>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     03410000
<< 6>>                          0,                                      03412000
                                                                        03414000
<< 7>>  << QSTAT >>         %2402,  << REPORTING MSG SECONDARY >>       03416000
<< 8>>                          0,  << RETURN BYTE >>                   03418000
<< 9>>                          0,  << NORMAL COMPLETION >>             03420000
<<10>>                        -35,  << HARD ERROR - REQ STATUS >>       03422000
<<11>>                          2,  << POWER ON OCCURRED >>             03424000
                                                                        03426000
<<12>>  << INT/HLT0 >>       %601,  << INTERRUPT/HALT >>                03428000
<<13>>                          0,  << CODE OF 0 IN CPVA(1) >>          03430000
                                                                        03432000
                                                                        03434000
        <<------------------------------------------------->>           03436000
        << [PON] SEL DEV CLEAR/PARITY ENABLED ON POWER ON  >>           03438000
        <<------------------------------------------------->>           03440000
                                                                        03442000
                                                                        03444000
<< 0>>                      %4401,  << SEL DEV CLR/PARITY ON >>         03446000
<< 1>>                          0,                                      03448000
                                                                        03450000
<< 2>>                      %1000,  << WAIT FOR // POLL RESPONSE >>     03452000
<< 3>>                          0,                                      03454000
                                                                        03456000
<< 4>>                      %2402,  << REPORTING MSG SECONDARY >>       03458000
<< 5>>                          0,  << RETURN BYTE >>                   03460000
<< 6>>                          0,  << NORMAL COMPLETION >>             03462000
<< 7>>                        -46,  << HARD ERROR - REQ STATUS >>       03464000
<< 8>>                         -9,  << POWER ON OCCURRED >>             03466000
                                                                        03468000
<< 9>>  << INT/HLT2 >>       %601,  << INTERRUPT/HALT >>                03470000
<<10>>                          2,  << CODE OF 2 IN CPVA(1) >>          03472000
                                                                        03474000
                                                                        03476000
        <<------------------------------------------------->>           03478000
        << [IDENT] CHANNEL INSTRUCTION IDENTIFY            >>           03480000
        <<------------------------------------------------->>           03482000
                                                                        03484000
                                                                        03486000
<< 0>>  << IDENTIFY >>      %3000,                                      03488000
<< 1>>                          0,  << ID RETURN BYTE >>                03490000
                                                                        03492000
<< 2>>                       %601,  << INTERRUPT/HALT >>                03494000
<< 3>>                          0,  << CODE OF 0 IN CPVA(1) >>          03496000
                                                                        03498000
                                                                        03500000
        <<------------------------------------------------->>           03502000
        << MISCELLANEOUS STORAGE AND CONSTANTS AREA        >>           03504000
        <<------------------------------------------------->>           03506000
                                                                        03508000
                                                                        03510000
<<  0>> << STATUS'CDB >>      %15,  << CDB FOR REQ STATUS >>            03512000
                                                                        03514000
<<  0>> << LOC & WRT CDB >>   %40,  << SET UNIT >>                      03516000
<<  1>>                    %14000,  << SET LENGTH ZERO >>               03518000
<<  2>>                         0,                                      03520000
<<  3>>                         2,  << LOC & WRT >>                     03522000
                                                                        03524000
<<  0>> << INITFLG >>           0,  << INITIALIZATION FLAG >>           03526000
<<  0>> << FILL WORD >>         0,  << FOR FILL W/ZEROS, BLANKS >>      03528000
                                                                        03530000
<<  0>> << DESC AREA >> 0,0,0,0,0,  << DESCRIBE AREA >>                 03532000
<<  5>>                 0,0,0,0,0,                                      03534000
                                                                        03536000
<<  0>> << CDB AREA >>  0,0,0,0,0,  << CDB AREA/DESC AREA >>            03538000
<<  5>>                 0,0,0,0,0;                                      03540000
                                                                        03542000
$PAGE                                                                   03544000
<<                                                                      03546000
         ***************************************                        03548000
         *                                     *                        03550000
         *   EXTERNAL PROCEDURE DECLARATIONS   *                        03552000
         *                                     *                        03554000
         ***************************************                        03556000
>>                                                                      03558000
                                                                        03560000
   INTEGER PROCEDURE GETDRT(DRTN,OFFSET);                               03562000
     VALUE DRTN,OFFSET;                                                 03564000
     INTEGER DRTN,OFFSET;                                               03566000
     OPTION EXTERNAL;                                                   03568000
                                                                        03570000
   INTEGER PROCEDURE GETSBUF(TYPE);                                     03572000
     VALUE TYPE;                                                        03574000
     INTEGER TYPE;                                                      03576000
     OPTION EXTERNAL;                                                   03578000
                                                                        03580000
   PROCEDURE GIP'HPIB;                                                  03582000
     OPTION EXTERNAL;                                                   03584000
                                                                        03586000
   PROCEDURE HELP;                                                      03588000
     OPTION EXTERNAL;                                                   03590000
                                                                        03592000
   LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,         03594000
                               DEST,REPLY,OFFSET,DITP,IOTYPE);          03596000
     VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,           03598000
           DITP,IOTYPE;                                                 03600000
     INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET;         03602000
     INTEGER IOTYPE;                                                    03604000
     INTEGER POINTER DITP;                                              03606000
     OPTION VARIABLE, EXTERNAL;                                         03608000
                                                                        03610000
   PROCEDURE LDEVNOTRDY(DITP);                                          03612000
     VALUE DITP;                                                        03614000
     POINTER DITP;                                                      03616000
     OPTION EXTERNAL;                                                   03618000
                                                                        03620000
   PROCEDURE MAINT'REQUEST(LDEV,TYPE,SUBTYPE);                          03622000
     VALUE LDEV,TYPE,SUBTYPE;                                           03624000
     INTEGER LDEV,TYPE,SUBTYPE;                                         03626000
     OPTION EXTERNAL;                                                   03628000
                                                                        03630000
   PROCEDURE SIODM(DITP,FLAGS);                                         03632000
     VALUE DITP,FLAGS;   LOGICAL FLAGS;                                 03634000
     POINTER DITP;   OPTION EXTERNAL;                                   03636000
                                                                        03638000
   PROCEDURE START'HPIB(DITP,SIOP,QFLAG);                               03640000
     VALUE DITP,SIOP,QFLAG;   LOGICAL QFLAG;                            03642000
     POINTER DITP,SIOP;   OPTION EXTERNAL;                              03644000
                                                                        03646000
   PROCEDURE RETURNSBUF(SBUFP);                                         03648000
     VALUE SBUFP;                                                       03650000
     INTEGER SBUFP;                                                     03652000
     OPTION EXTERNAL;                                                   03654000
$PAGE                                                                   03656000
<<       *********************************************                  03658000
         *                                           *                  03660000
         *   CS'80 DRIVER INITIALIZATION PROCEDURE   *                  03662000
         *                                           *                  03664000
         *********************************************                  03666000
>>                                                                      03668000
                                                                        03670000
   PROCEDURE CSINIT(DITP);                                              03672000
     INTEGER ARRAY DITP;                                                03674000
                                                                        03676000
<<---------------------------------------------------->>                03678000
<<                                                    >>                03680000
<<   THIS PROCEDURE INITIALIZES THE CS'80 CHANNEL     >>                03682000
<<   PROGRAM AREA AND SENDS OUT A DEVICE CLEAR TO     >>                03684000
<<   RESET THE DRIVE TO A KNOWN STATE.                >>                03686000
<<                                                    >>                03688000
<<---------------------------------------------------->>                03690000
                                                                        03692000
     BEGIN                                                              03694000
                                                                        03696000
       INTEGER POINTER                                                  03698000
         ILTP,      << ILT POINTER >>                                   03700000
         SIOP,      << CHANNEL PROGRAM POINTER >>                       03702000
         ISTAT;     << IDLE CP STATUS POINTER >>                        03704000
                                                                        03706000
       INTEGER                                                          03708000
         LPDT2;     << LPDT - WORD 2 >>                                 03710000
                                                                        03712000
       DISABLE;   << ON ENTRY - WANT CSINIT TO COMPLETE >>              03714000
                                                                        03716000
       @ILTP := DITP(DILTP);        << ILTP    >>                       03718000
       @SIOP := ILTP(ISIOP);        << SIOP    >>                       03720000
       @ISTAT := ILTP(ISTAP);       << ISTAT   >>                       03722000
                                                                        03724000
       IF POWERFAIL <> 0 THEN   << BYPASS INIT ON POWERFAIL >>          03726000
         RETURN;                                                        03728000
                                                                        03730000
       IF NOT LOGICAL(SIOP(INITFLG)) THEN                               03732000
         BEGIN                                                          03734000
           TOS := LPDTD(DITP(DLDEV).DLDEVN);                            03736000
           LPDT2 := TOS; DEL;                                           03738000
           DITP(DMISC).LOCK'FLG := IF LPDT2.PVBIT=0 AND                 03740000
             LPDT2.SFBIT=0 THEN 1 ELSE 0;                               03742000
                                                                        03744000
           SIOP(IDLE16) := @SIOP + SYSDB + LOC'WRT'CDB;        <<03722>>03746000
           SIOP(DXFER4) := @SIOP + SYSDB + CDB'AREA'WRD;                03748000
           SIOP(RSTAT4) := @SIOP + SYSDB + STAT'CDB;                    03750000
           SIOP(RSTAT11) := @ISTAT + SYSDB;                             03752000
                                                                        03754000
           SIOP(BRANCHPT) := PONCP;                                     03756000
           START'HPIB(DITP,SIOP,FALSE);                                 03758000
           DITP(DMISC).SUBSTATE := IDLE'REQ'WAIT;                       03760000
                                                                        03762000
           SIOP(INITFLG) := TRUE;                                       03764000
         END;                                                           03766000
                                                                        03768000
     END;                                                               03770000
$PAGE                                                                   03772000
<<       **********************************************                 03774000
         *                                            *                 03776000
         *   CS'80 DISC DRIVER PROCEDURE  -  CSDRVR   *                 03778000
         *                                            *                 03780000
         **********************************************                 03782000
>>                                                                      03784000
                                                                        03786000
   INTEGER PROCEDURE CSDRVR(IOQP,DITP,BANK,BUFFADDR,SIOP,DRTN);         03788000
                                                                        03790000
<<--------------------------------------------------------->>           03792000
<<                                                         >>           03794000
<<   THIS PROCEDURE INITIATES AND COMPLETES I/O REQUESTS   >>           03796000
<<   FOR THE CS'80 DISCS CONNECTED TO THE HP-IB AND CON-   >>           03798000
<<   TROLLED BY THE GENERAL I/O CHANNEL (GIC).             >>           03800000
<<                                                         >>           03802000
<<   MODE RETURNS IN CSDRVR -                              >>           03804000
<<     5 - REQUEST COMPLETED                               >>           03806000
<<     7 - NOT READY WAIT                                  >>           03808000
<<   %13 - WAIT FOR COMPLETION                             >>           03810000
<<                                                         >>           03812000
<<--------------------------------------------------------->>           03814000
                                                                        03816000
   VALUE DITP,IOQP,BANK,BUFFADDR,DRTN;                                  03818000
   INTEGER BANK,BUFFADDR,DRTN;                                          03820000
   INTEGER POINTER DITP,IOQP;                                           03822000
   INTEGER ARRAY SIOP;                                                  03824000
   OPTION PRIVILEGED,UNCALLABLE;                                        03826000
                                                                        03828000
   BEGIN                                                                03830000
                                                                        03832000
     LOGICAL ARRAY                                                      03834000
       DITPL(*) = DITP, IOQPL(*) = IOQP;                                03836000
                                                                        03838000
                                                               <<03722>>03840000
                                                               <<03722>>03842000
                                                                        03844000
     INTEGER POINTER                                                    03846000
       ILTP,              << ILT POINTER >>                             03848000
       CPVAP = ILTP,      << CP VARIABLE AREA PTR >>                    03850000
       ISTAT,             << IDLE CP STATUS PTR >>                      03852000
       IDLE'SIOP,         << IDLE CP START ADDRESS >>                   03854000
       DSCT;              << DEFECTIVE SECTOR TABLE PTR >>              03856000
                                                                        03858000
     DOUBLE                                                             03860000
       SIOP'ABS'BYT'ADR,                                       <<03722>>03862000
       BUFFADDRD = Q- 7;  << BANK AND BUFFER ADDRESS >>                 03864000
     DOUBLE                                                    <<04834>>03866000
       VER'LEN;               << BYTE LENGTH OF A VERIFY >>    <<04834>>03868000
                                                               <<04834>>03870000
     LOGICAL                                                   <<04834>>03872000
       L1'VER'LEN=VER'LEN,    << FIRST WORD OF VER. LEN. >>    <<04834>>03874000
       L2'VER'LEN=VER'LEN+1;  << 2'ND  WORD OF VER. LEN. >>    <<04834>>03876000
                                                               <<04834>>03878000
                                                                        03880000
     DOUBLE POINTER                                                     03882000
       DDSCT = DSCT,                                                    03884000
       DDITP = DITP,                                                    03886000
       DSIOP = SIOP;                                                    03888000
                                                                        03890000
     LOGICAL                                                            03892000
       COUNT,             << BUFFER TRANSFER COUNT >>                   03894000
       CLDA1,             << CURRENT LOGICAL DISC ADDR1 >>              03896000
       CLDA2;             << CURRENT LOGICAL DISC ADDR2 >>              03898000
                                                                        03900000
     INTEGER                                                            03902000
       MSTATE = CSDRVR,   << MONITOR STATE RETURN >>                    03904000
       FCODE,             << FUNCTION CODE >>                           03906000
       INDEX,             << INDEX >>                                   03908000
       PARM,              << PARAMETER >>                               03910000
       SYSDISC,           << SYSTEM DISC FLAG >>                        03912000
       SDISC,             << SERIAL DISC FLAG >>                        03914000
       FOREIGN,           << FOREIGN DISC FLAG >>                       03916000
       SUBTYPE,           << DISC SUBTYPE >>                            03918000
       NO'ENTRIES,        << #ENTRIES IN DSCT >>                        03920000
       FIRST'ENTRY,       << FIRST ENTRY IN DSCT >>                     03922000
       MAX'ENTRIES;       << MAX #ENTRIES IN DSCT >>                    03924000
                                                                        03926000
                                                                        03928000
$PAGE                                                                   03930000
<<****************************************************>>                03932000
<<                                                    >>                03934000
<<   CS'80 DISC DRIVER SUBROUTINES                    >>                03936000
<<                                                    >>                03938000
<<****************************************************>>                03940000
                                                                        03942000
<<---------------------------------------------------->>       <<03722>>03944000
<<                                                    >>       <<03722>>03946000
<<   STORE'BYTE'ABS -- SUBROUTINE TO STORE THE        >>       <<03722>>03948000
<<                     CS80 COMMAND BYTES INTO        >>       <<03722>>03950000
<<                     THE CORRECT CHANNEL PROGRAM    >>       <<03722>>03952000
<<                     AREA.  USED TO CIRCUMVENT      >>       <<03722>>03954000
<<                     PROBLEMS WITH STORING BYTES    >>       <<03722>>03956000
<<                     ABOVE THE STACK MARKER.        >>       <<03722>>03958000
<<                                                    >>       <<03722>>03960000
<<---------------------------------------------------->>       <<03722>>03962000
                                                               <<03722>>03964000
   SUBROUTINE STORE'BYTE'ABS(D'BYTE'ADDR,ABYTE);               <<03722>>03966000
      VALUE D'BYTE'ADDR,ABYTE;                                 <<03722>>03968000
      DOUBLE D'BYTE'ADDR;                                      <<03722>>03970000
      LOGICAL ABYTE;                                           <<03722>>03972000
   BEGIN                                                       <<03722>>03974000
      IF NOT LOGICAL(D'BYTE'ADDR) THEN ABYTE:=ABYTE&LSL(8);    <<03722>>03976000
      IF NOT LOGICAL(D'BYTE'ADDR)                              <<03722>>03978000
       THEN ABS(LOGICAL(D'BYTE'ADDR/2D)):=                     <<03722>>03980000
          ABS(LOGICAL(D'BYTE'ADDR/2D)) LAND %377 LOR ABYTE     <<03722>>03982000
       ELSE ABS(LOGICAL(D'BYTE'ADDR/2D)):=                     <<03722>>03984000
          ABS(LOGICAL(D'BYTE'ADDR/2D)) LAND %177400 LOR ABYTE; <<03722>>03986000
   END;                                                        <<03722>>03988000
                                                               <<03722>>03990000
                                                               <<03722>>03992000
   SUBROUTINE SIOPB(BYTE'OFFSET,ABYTE);                        <<03722>>03994000
     VALUE BYTE'OFFSET,ABYTE;                                  <<03722>>03996000
     LOGICAL BYTE'OFFSET,ABYTE;                                <<03722>>03998000
     BEGIN                                                     <<03722>>04000000
    STORE'BYTE'ABS(SIOP'ABS'BYT'ADR+DOUBLE(BYTE'OFFSET),ABYTE);<<03722>>04002000
     END;                                                      <<03722>>04004000
                                                               <<03722>>04006000
                                                               <<03722>>04008000
<<---------------------------------------------------->>                04010000
<<                                                    >>                04012000
<<   SET'BYTE'COUNT -- SUBROUTINE TO DETERMINE THE    >>                04014000
<<                     TRANSFER COUNT IN BYTES.       >>                04016000
<<                                                    >>                04018000
<<---------------------------------------------------->>                04020000
                                                                        04022000
     SUBROUTINE SET'BYTE'COUNT;                                         04024000
                                                                        04026000
       BEGIN                                                            04028000
         TOS := IOQP(QWBCT);                                            04030000
         IF < THEN   << BYTE COUNT >>                                   04032000
           COUNT := -TOS                                                04034000
         ELSE   << WORD COUNT >>                                        04036000
           COUNT := TOS & LSL(1);  << MAKE BYTE >>                      04038000
       END;                                                             04040000
                                                                        04042000
<<---------------------------------------------------->>                04044000
<<                                                    >>                04046000
<<   SET'CMD'BYTES -- SUBROUTINE TO SET UP THE        >>                04048000
<<                    COMMAND DATA BYTES FOR READ     >>                04050000
<<                    AND WRITE OPERATIONS.           >>                04052000
<<                                                    >>                04054000
<<---------------------------------------------------->>                04056000
                                                                        04058000
     SUBROUTINE SET'CMD'BYTES;                                          04060000
                                                                        04062000
       BEGIN                                                            04064000
         SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                  <<03722>>04066000
                                                                        04068000
         SIOPB(CDB'AREA'BYTE+1 , CDB'SET'SNGL'VEC);            <<03722>>04070000
         SIOPB(CDB'AREA'BYTE+2 , 0);                           <<03722>>04072000
         SIOPB(CDB'AREA'BYTE+3 , 0);                           <<03722>>04074000
         SIOPB(CDB'AREA'BYTE+4 , CLDA1.(0:8));                 <<03722>>04076000
         SIOPB(CDB'AREA'BYTE+5 , CLDA1.(8:8));                 <<03722>>04078000
         SIOPB(CDB'AREA'BYTE+6 , CLDA2.(0:8));                 <<03722>>04080000
         SIOPB(CDB'AREA'BYTE+7 , CLDA2.(8:8));                 <<03722>>04082000
                                                                        04084000
         SIOPB(CDB'AREA'BYTE+8 , CDB'SET'LENGTH);              <<03722>>04086000
         SIOPB(CDB'AREA'BYTE+9 , 0);                           <<03722>>04088000
         SIOPB(CDB'AREA'BYTE+10 , 0);                          <<03722>>04090000
         SIOPB(CDB'AREA'BYTE+11 , COUNT.(0:8));                <<03722>>04092000
         SIOPB(CDB'AREA'BYTE+12 , COUNT.(8:8));                <<03722>>04094000
         SIOPB(CDB'AREA'BYTE+13 , CDB'SET'BURST);              <<03722>>04096000
         SIOPB(CDB'AREA'BYTE+14 , 1);                          <<03722>>04098000
       END;                                                             04100000
                                                                        04102000
<<---------------------------------------------------->>                04104000
<<                                                    >>                04106000
<<   LOG'CPVAP -- LOG CHANNEL ERROR WORD (CPVA 0)     >>                04108000
<<             -- LOG CP RELATIVE OFFSET LOCATION     >>                04110000
<<                                                    >>                04112000
<<---------------------------------------------------->>                04114000
                                                                        04116000
       SUBROUTINE LOG'CPVAP;                                            04118000
                                                                        04120000
       BEGIN                                                            04122000
         DITP(DSERR) := [8/2,8/DLOGERROR];                              04124000
         DITP(DLOGERROR) := CPVAP;                                      04126000
         DITP(DSIOPSTOP) := GETDRT(DRTN,0) - (@SIOP + SYSDB);           04128000
       END;                                                             04130000
                                                                        04132000
<<---------------------------------------------------->>                04134000
<<                                                    >>                04136000
<<   CLEAR'STATUS -- CLEAR 20 BYTES OF STATUS IN DIT  >>                04138000
<<                                                    >>                04140000
<<---------------------------------------------------->>                04142000
                                                                        04144000
       SUBROUTINE CLEAR'STATUS;                                         04146000
                                                                        04148000
       BEGIN                                                            04150000
         INDEX := DSTATUS;                                              04152000
         DO DITP(INDEX) := 0 UNTIL                                      04154000
           (INDEX := INDEX + 1) > DSTATUS + 9;                          04156000
       END;                                                             04158000
                                                                        04160000
<<---------------------------------------------------->>                04162000
<<                                                    >>                04164000
<<   UPDATE'XFER'CNT -- UPDATE TRANSFER COUNT         >>                04166000
<<                                                    >>                04168000
<<---------------------------------------------------->>                04170000
                                                                        04172000
       SUBROUTINE UPDATE'XFER'CNT;                                      04174000
                                                                        04176000
       BEGIN                                                            04178000
         IF SIOP(DXFER8) <> 0 THEN                                      04180000
           BEGIN                                                        04182000
             TOS := IOQP(QWBCT);                                        04184000
             IF < THEN                                                  04186000
               IOQP(QWBCT) := TOS + SIOP(DXFER8)                        04188000
             ELSE                                                       04190000
               IOQP(QWBCT) := (TOS & LSL(1) -                           04192000
                              SIOP(DXFER8)) / 2;                        04194000
           END;                                                         04196000
       END;                                                             04198000
                                                                        04200000
<<---------------------------------------------------->>                04202000
<<                                                    >>                04204000
<<   RETURN'SYSBUF -- RETURN SYSTEM BUFFER ELEMENT    >>                04206000
<<                                                    >>                04208000
<<---------------------------------------------------->>                04210000
                                                                        04212000
       SUBROUTINE RETURN'SYSBUF;                                        04214000
                                                                        04216000
       BEGIN                                                            04218000
         TOS := DITP(DSBUFADDR);                                        04220000
         IF <> THEN                                                     04222000
           BEGIN                                                        04224000
             RETURNSBUF(*);                                             04226000
             DITP(DSBUFADDR) := 0;                                      04228000
           END ELSE DEL;                                                04230000
       END;                                                             04232000
                                                                        04234000
$PAGE                                                                   04236000
<<****************************************************>>                04238000
<<                                                    >>                04240000
<<   CS'80 DISC DRIVER INITIATOR SECTION              >>                04242000
<<                                                    >>                04244000
<<****************************************************>>                04246000
                                                                        04248000
     SIOP'ABS'BYT'ADR := 2D*(DOUBLE(LOGICAL(@SIOP))            <<04834>>04250000
                               +DOUBLE(LOGICAL(SYSDB)));       <<04834>>04252000
     @ILTP := DITP(DILTP);         << ILTP        >>                    04254000
     FCODE := IOQP(QFUNC).FUNC;    << FCODE       >>                    04256000
     @ISTAT := ILTP(ISTAP);        << ISTAT       >>                    04258000
     @IDLE'SIOP := @SIOP + IDLE;   << IDLE'SIOP   >>                    04260000
     @DSCT := 0;                   << DSCT        >>                    04262000
                                                                        04264000
     COUNT := 0;                   << COUNT       >>                    04266000
     CLDA1 := 0;                   << CLDA1       >>                    04268000
     CLDA2 := 0;                   << CLDA2       >>                    04270000
                                                                        04272000
     INDEX := 0;                   << INDEX       >>                    04274000
     PARM := 0;                    << PARM        >>                    04276000
     SYSDISC := 0;                 << SYSDISC     >>                    04278000
     SDISC := 0;                   << SDISC       >>                    04280000
     FOREIGN := 0;                 << FOREIGN     >>                    04282000
     SUBTYPE := 0;                 << SUBTYPE     >>                    04284000
     NO'ENTRIES := 0;              << NO'ENTRIES  >>                    04286000
     FIRST'ENTRY := 0;             << FIRST'ENTRY >>                    04288000
     MAX'ENTRIES := 0;             << MAX'ENTRIES >>                    04290000
                                                                        04292000
<<---------------------------------------------------->>                04294000
<<   ASSURE THAT INITIALIZATION SECTION CALLED        >>                04296000
<<---------------------------------------------------->>                04298000
                                                                        04300000
     IF NOT LOGICAL(SIOP(INITFLG)) THEN                                 04302000
       BEGIN                                                            04304000
         CSINIT(DITP);                                                  04306000
         IF MSTATE=2 THEN IF @IOQP <> 0 THEN                            04308000
           BEGIN                                                        04310000
             IOQP(QMISC).WAITCODE := IOQ'DEFER'WAIT;                    04312000
             MSTATE := INTRPTWAIT;                                      04314000
             RETURN;                                                    04316000
           END;                                                         04318000
       END;                                                             04320000
                                                                        04322000
<<---------------------------------------------------->>                04324000
<<   SYSTEM DISC OR NON-SYSTEM DISC AND SUBTYPE       >>                04326000
<<---------------------------------------------------->>                04328000
                                                                        04330000
     TOS := LPDTD(DITP(DLDEV).DLDEVN);                                  04332000
     PARM := TOS; DEL;                                                  04334000
                                                                        04336000
     SYSDISC := IF PARM.PVBIT=0 AND PARM.SFBIT=0 THEN                   04338000
       1 ELSE 0;   << SYSTEM DISC >>                                    04340000
     SDISC := IF PARM.SFBIT=2 THEN                                      04342000
       1 ELSE 0;   << SERIAL DISC >>                                    04344000
     FOREIGN := IF PARM.SFBIT=3 THEN                                    04346000
       1 ELSE 0;   << FOREIGN DISC >>                                   04348000
                                                                        04350000
     SUBTYPE := PARM.STYPE;   << DISC SUBTYPE >>                        04352000
                                                                        04354000
<<---------------------------------------------------->>                04356000
<<   NO IOQ - SERVICE SPECIAL CONDITIONS OR           >>                04358000
<<          - SCHEDULE AN IDLE CHANNEL PROGRAM        >>                04360000
<<---------------------------------------------------->>                04362000
                                                                        04364000
     IF MSTATE=2 THEN IF @IOQP=0 THEN                                   04366000
                                                                        04368000
       BEGIN                                                            04370000
                                                               <<03722>>04372000
        IF CPVAP.ERRORCODE=6 OR    << DMA ABORT >>             <<03722>>04374000
          CPVAP.ERRORCODE=7 THEN   << CHANNEL ABORT >>         <<03722>>04376000
           GOTO IDLE'NOT'READY;                                <<03722>>04378000
                                                                        04380000
         IF CPVAP(1).(12:4) = 1 THEN   << STATUS DIAGNOSIS >>           04382000
                                                                        04384000
           BEGIN                                                        04386000
             CPVAP(1).(12:4) := 0;                                      04388000
                                                                        04390000
             IF ISTAT(I'FAULT'FIELD).POWER'FAIL THEN                    04392000
               GOTO IDLE'PON;                                           04394000
                                                                        04396000
             IF ISTAT(I'FAULT'FIELD).INT'MAINT'REQRD OR                 04398000
                ISTAT(I'INFOR'FIELD).OPER'REL'REQST OR                  04400000
                ISTAT(I'INFOR'FIELD).DIAG'REL'REQST OR                  04402000
                ISTAT(I'INFOR'FIELD).INT'MAINT'REQST THEN               04404000
                                                                        04406000
               BEGIN   << RELEASE/RELEASE DENY REQUEST >>               04408000
                 SIOP(DIAG) := WRT'CMD'SEC;                             04410000
                 SIOP(DIAG1) := 2;                                      04412000
                 SIOP(DIAG3) := %2000;                                  04414000
                 SIOP(DIAG4) := @SIOP + SYSDB + CDB'AREA'WRD;           04416000
                 SIOP(DIAG5) := %1000;                                  04418000
                 SIOP(DIAG6) := 0;                                      04420000
                                                                        04422000
                 SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT            <<03722>>04424000
                   +CTRL'UNIT);                                <<03722>>04426000
                 SIOPB(CDB'AREA'BYTE+1 ,                       <<03722>>04428000
                   IF ISTAT(I'FAULT'FIELD).INT'MAINT'REQRD OR           04430000
                      ISTAT(I'INFOR'FIELD).INT'MAINT'REQST OR           04432000
                      ISTAT(I'INFOR'FIELD).OPER'REL'REQST AND           04434000
                      ISTAT(I'ACCESS'FIELD).DEV'NOT'RDY OR              04436000
                      ISTAT(I'INFOR'FIELD).OPER'REL'REQST AND           04438000
                      DITP(DMISC).LOCK'FLG <> 1 THEN                    04440000
                        CDB'RELEASE                                     04442000
                      ELSE                                              04444000
                        CDB'RELEASE'DENY);                     <<03722>>04446000
                                                                        04448000
                 IF ISTAT(I'INFOR'FIELD).OPER'REL'REQST AND             04450000
                   DITP(DMISC).LOCK'FLG = 1 AND                         04452000
                   ISTAT(I'ACCESS'FIELD).NOT'RDY = 0 THEN               04454000
                                                                        04456000
                   BEGIN                                                04458000
                     IF SYSDISC=1 THEN INDEX := SYS'DENY'MSG            04460000
                       ELSE INDEX := NSYS'DENY'MSG;                     04462000
                     IOMESSAGE(1,INDEX,%10000,DITP(DLDEV).DLDEVN,       04464000
                               ,,,,OPCONSOLE);                          04466000
                   END;                                                 04468000
                                                                        04470000
                 IF ISTAT(I'INFOR'FIELD).OPER'REL'REQST OR     <<03667>>04472000
                   ISTAT(I'ACCESS'FIELD).DEV'NOT'RDY THEN      <<03667>>04474000
                   DITP(DMISC).IGNORE'INT'FLG := 0                      04476000
                 ELSE                                                   04478000
                   DITP(DMISC).IGNORE'INT'FLG := 1;                     04480000
                                                                        04482000
                 SIOP(BRANCHPT) := DIAGCP;                              04484000
                 START'HPIB(DITP,SIOP,TRUE);                            04486000
                 DITP(DMISC).SUBSTATE := IDLE'REQ'WAIT;                 04488000
                 MSTATE := REQUESTDONE;                                 04490000
                 RETURN;                                                04492000
               END;                                                     04494000
                                                                        04496000
             IF ISTAT(I'INFOR'FIELD).MAINT'TRK'OV THEN                  04498000
               BEGIN                                                    04500000
                 MAINT'REQUEST(DITP(DLDEV).DLDEVN,TYPE,SUBTYPE);        04502000
                 GOTO IDLE'CP;                                          04504000
               END;                                                     04506000
                                                                        04508000
           END;                                                         04510000
                                                                        04512000
         IF CPVAP(1).(12:4) = 4 THEN   << IDLE PON OCCURRED >>          04514000
  IDLE'PON:                                                             04516000
           BEGIN                                                        04518000
             CPVAP(1).(12:4) := 0;                                      04520000
             SIOP(BRANCHPT) := PONCP;   << DEVICE CLEAR >>              04522000
             START'HPIB(DITP,SIOP,TRUE);                                04524000
             DITP(DMISC).IGNORE'INT'FLG := 0;                           04526000
             DITP(DMISC).SUBSTATE := IDLE'REQ'WAIT;                     04528000
             MSTATE := REQUESTDONE;                                     04530000
             RETURN;                                                    04532000
           END;                                                         04534000
                                                                        04536000
  IDLE'CP:                                                              04538000
         IF DITP(DMISC).SUBSTATE = IDLE'REQ'WAIT THEN          <<03667>>04540000
           DITP(DMISC).SUBSTATE := 0  << IDLE WAIT DONE >>     <<03667>>04542000
         ELSE                                                  <<03667>>04544000
            DITP(DMISC).IGNORE'INT'FLG := 1;                   <<03667>>04546000
         SIOP(RSTAT11) := @ISTAT + SYSDB;                               04548000
                                                                        04550000
         CPVAP(1).(12:4) := 0;                                          04552000
         START'HPIB(DITP,SIOP(IDLE),FALSE);                    <<03722>>04554000
         MSTATE := REQUESTDONE;                                         04556000
         RETURN;                                                        04558000
                                                                        04560000
       END;                                                             04562000
                                                                        04564000
<<---------------------------------------------------->>                04566000
<<   IDLE REQUEST CURRENTLY BEING SERVICED, DEFER     >>                04568000
<<   CURRENT REQUEST UNTIL IDLE REQUEST COMPLETED     >>                04570000
<<---------------------------------------------------->>                04572000
                                                                        04574000
     IF MSTATE=2 AND DITP(DMISC).SUBSTATE=IDLE'REQ'WAIT THEN            04576000
       BEGIN                                                            04578000
         IOQP(QMISC).WAITCODE := IOQ'DEFER'WAIT;                        04580000
         MSTATE := INTRPTWAIT;                                          04582000
         RETURN;                                                        04584000
       END;                                                             04586000
                                                                        04588000
<<---------------------------------------------------->>                04590000
<<   MAP FROM EXTERNAL TO INTERNAL FUNCTION CODE      >>                04592000
<<                                                    >>                04594000
<<   FUNCTION CODE 15 --> INTERNAL CODE 7             >>                04596000
<<   FUNCTION CODE 11 --> INTERNAL CODE 10            >>                04598000
<<                                                    >>                04600000
<<   FUNCTION CODE 13-14 --> INTERNAL CODE 11-12      >>                04602000
<<   FUNCTION CODE 16-18 --> INTERNAL CODE 13-15      >>                04604000
<<   FUNCTION CODE 72-94 --> INTERNAL CODE 16-38      >>                04606000
<<---------------------------------------------------->>                04608000
                                                                        04610000
     IF  FCODE = 10 THEN GOTO INVALIDFUNC;                              04612000
     IF FCODE=12 THEN GOTO INVALIDFUNC;                                 04614000
                                                                        04616000
     IF FCODE=11 THEN FCODE := 10 ELSE                                  04618000
     IF (13 <= FCODE <= 14) THEN FCODE := FCODE - 2 ELSE                04620000
     IF FCODE=15 THEN FCODE := 7 ELSE                                   04622000
     IF (16 <= FCODE <= 18) THEN FCODE := FCODE - 3 ELSE                04624000
     IF (72 <= FCODE <= 94) THEN FCODE := FCODE - 56;                   04626000
     IF NOT (0 <= FCODE <= 38) THEN GOTO INVALIDFUNC;                   04628000
                                                                        04630000
<<---------------------------------------------------->>                04632000
<<   IOQ DEFERRED REQUEST COMPLETION - REDO REQUEST   >>                04634000
<<---------------------------------------------------->>                04636000
                                                                        04638000
     IF IOQP(QMISC).WAITCODE = IOQ'DEFER'WAIT THEN                      04640000
       BEGIN                                                            04642000
         DITP(DMISC).SUBSTATE := 0;   << RESET SUBSTATE >>              04644000
         IF ISTAT(I'INFOR'FIELD).MAINT'TRK'OV THEN                      04646000
           MAINT'REQUEST(DITP(DLDEV).DLDEVN,TYPE,SUBTYPE);              04648000
         GOTO RETRY'REQUEST;                                            04650000
       END;                                                             04652000
                                                                        04654000
<<---------------------------------------------------->>                04656000
<<   NOT READY COMPLETION - GO TO COMPLETOR SECTION   >>                04658000
<<---------------------------------------------------->>                04660000
                                                                        04662000
     IF IOQP(QMISC).WAITCODE = NOT'RDY'WAIT THEN                        04664000
       GOTO CONTINUATOR;                                                04666000
                                                                        04668000
$PAGE                                                                   04670000
<<---------------------------------------------------->>                04672000
<<   INITIATOR CALL - INITIALIZE OR RESET VARIABLES   >>                04674000
<<                    POSSIBLY CHANGED IN LAST REQ.   >>                04676000
<<                  - CASE TO A DRIVER FUNCTION CODE  >>                04678000
<<---------------------------------------------------->>                04680000
                                                                        04682000
IF MSTATE=2 THEN                                                        04684000
                                                                        04686000
  BEGIN                                                                 04688000
                                                                        04690000
    IF FCODE <> REQ'STAT OR                                             04692000
       FCODE <> DIAG'RESULT THEN CLEAR'STATUS;                          04694000
                                                                        04696000
  RETRY'REQUEST:                                                        04698000
                                                                        04700000
    SIOP(RSTAT11) := @DITP + SYSDB + DSTATUS;                           04702000
    SIOP(DXFER) := WRT'CMD'SEC;                                         04704000
    SIOP(DXFER5) := SIOP(DXFER16) := %1000;                             04706000
    SIOP(DXFER6) := SIOP(DXFER17) := 0;                                 04708000
    SIOP(DXFER10) := 0;                                                 04710000
    SIOP(DIAG) := WRT'CMD'SEC;                                          04712000
    SIOP(DIAG3) := %2000;                                               04714000
    SIOP(DIAG4) := @SIOP + SYSDB + CDB'AREA'WRD;                        04716000
    SIOP(DIAG5) := %1000;                                               04718000
    SIOP(DIAG6) := 0;                                                   04720000
    SIOP(IDENT2) := %601;                                               04722000
    SIOP(IDENT3) := 0;                                                  04724000
                                                                        04726000
    INDEX := CDB'AREA'WRD;                                              04728000
    DO SIOP(INDEX) := 0 UNTIL   << ZERO CDB AREA >>                     04730000
      (INDEX := INDEX + 1) > CDB'AREA'WRD+9;                            04732000
                                                                        04734000
$PAGE                                                                   04736000
    CASE FCODE OF                                                       04738000
     BEGIN                                                              04740000
                                                                        04742000
<<--------------------------------------------------------->>           04744000
<<                                                         >>           04746000
<<   FCODE   FUNCTION                    INTERNAL FCODE    >>           04748000
<<   -----   --------                    --------------    >>           04750000
<<                                                         >>           04752000
<<      0    READ                              0           >>           04754000
<<      1    WRITE                             1           >>           04756000
<<      2    FILE OPEN                         2           >>           04758000
<<      3    FILE CLOSE                        3           >>           04760000
<<      4    DEVICE CLOSE                      4           >>           04762000
<<      5    FILL WITH ZERO                    5           >>           04764000
<<      6    FILE WITH BLANKS                  6           >>           04766000
<<   7,15    REQUEST STATUS                    7           >>           04768000
<<      8    INITIALIZE MEDIA                  8           >>           04770000
<<     11    WRITE DISC LABEL                  9           >>           04772000
<<     13    REQUEST VOLUME LIMIT             10           >>           04774000
<<     14    VERIFY                           11           >>           04776000
<<     16    LOCK                             12           >>           04778000
<<     17    UNLOCK                           13           >>           04780000
<<                                                         >>           04782000
<<     72    IDENTIFY                         14           >>           04784000
<<     73    INITIATE DIAGNOSTIC              15           >>           04786000
<<     74    DIAGNOSTIC RESULT                16           >>           04788000
<<     75    LOOPBACK WRITE                   17           >>           04790000
<<     76    LOOPBACK READ                    18           >>           04792000
<<     77    GENERAL PURPOSE COMMAND          19           >>           04794000
<<     78    DESCRIBE                         20           >>           04796000
<<     79    RELEASE                          21           >>           04798000
<<     80    RELEASE DENIED                   22           >>           04800000
<<     81    SET RELEASE                      23           >>           04802000
<<     82    SET ADDRESS                      24           >>           04804000
<<     83    SET BLOCK DISPLACEMENT           25           >>           04806000
<<     84    SET MASK STATUS                  26           >>           04808000
<<     85    SET RETURN ADDRESSING MODE       27           >>           04810000
<<     86    SET RETRY TIME                   28           >>           04812000
<<     87    SET RPS                          29           >>           04814000
<<     88    SPARE BLOCK                      30           >>           04816000
<<     89    READ AT PHYSICAL ADDRESS         31           >>           04818000
<<     90    WRITE AT PHYSICAL ADDRESS        32           >>           04820000
<<     91    INITIATE UTILITY                 33           >>           04822000
<<     92    DEVICE CLEAR                     34           >>           04824000
<<     93    CANCEL TRANSACTION               35           >>           04826000
<<     94    PARITY CHECKING                  36           >>           04828000
<<                                                         >>           04830000
<<--------------------------------------------------------->>           04832000
                                                                        04834000
$PAGE                                                                   04836000
<<---------------------------------------------------->>                04838000
<<                                                    >>                04840000
<<   READ [FUNCTION CODE = 0]                         >>                04842000
<<                                                    >>                04844000
<<   COUNT - TRANSFER COUNT                           >>                04846000
<<   BANK & BUFFADDR - CONTAINS DATA READ             >>                04848000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                04850000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                04852000
<<                                                    >>                04854000
<<---------------------------------------------------->>                04856000
                                                                        04858000
     BEGIN                                                              04860000
                                                                        04862000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   04864000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   04866000
                                                                        04868000
       CLDA1 := IOQP(QPAR1);   << LOGICAL SECTOR ADDR1 >>               04870000
       CLDA2 := IOQP(QPAR2);   << LOGICAL SECTOR ADDR2 >>               04872000
                                                                        04874000
       SET'BYTE'COUNT;                                                  04876000
       SET'CMD'BYTES;                                                   04878000
                                                                        04880000
       SIOP(DXFER1) := 16;   << CDB BYTE COUNT >>                       04882000
                                                                        04884000
       IF COUNT=0 THEN   << NO TRANSFER COUNT >>                        04886000
                                                                        04888000
         BEGIN                                                          04890000
           SIOP(DXFER5) := 0;   << BYPASS EXEC MSG >>                   04892000
           SIOP(DXFER6) := 5;   << JUMP *+5 >>                          04894000
         END                                                            04896000
                                                                        04898000
       ELSE   << SET UP EXECUTING MESSAGE >>                            04900000
                                                                        04902000
         BEGIN                                                          04904000
           SIOP(DXFER7) := READ'EXEC'SEC;                               04906000
           SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>               04908000
           SIOP(DXFER9) := 0;       << 256 BYTE BURST  >>               04910000
           SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>               04912000
           SIOP(DXFER10).(0:1) := 1;    << BURST MODE BIT >>            04914000
           SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>       04916000
         END;                                                           04918000
                                                                        04920000
       SIOPB(CDB'AREA'BYTE+15 , CDB'READ);                     <<03722>>04922000
                                                                        04924000
       SIOP(BRANCHPT) := DXFERCP;                                       04926000
                                                                        04928000
     END;                                                               04930000
$PAGE                                                                   04932000
<<---------------------------------------------------->>                04934000
<<                                                    >>                04936000
<<   WRITE [FUNCTION CODE = 1]                        >>                04938000
<<                                                    >>                04940000
<<   COUNT - TRANSFER COUNT                           >>                04942000
<<   BANK & BUFFADDR - CONTAINS DATA FOR WRITE        >>                04944000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                04946000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                04948000
<<                                                    >>                04950000
<<---------------------------------------------------->>                04952000
                                                                        04954000
     BEGIN                                                              04956000
                                                                        04958000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   04960000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   04962000
                                                                        04964000
       CLDA1 := IOQP(QPAR1).(1:15);   << LOGICAL SECTOR ADDR1 >>        04966000
       CLDA2 := IOQP(QPAR2);   << LOGICAL SECTOR ADDR2 >>               04968000
                                                                        04970000
       << WRITE TO DISC LABEL (SECTOR 0) INVALID >>                     04972000
                                                                        04974000
       IF FOREIGN=0 AND CLDA1=0 AND CLDA2=0 THEN                        04976000
         GOTO INVALIDFUNC;                                              04978000
                                                                        04980000
       SET'BYTE'COUNT;                                                  04982000
       SET'CMD'BYTES;                                                   04984000
                                                                        04986000
       SIOPB(CDB'AREA'BYTE+15 , CDB'SET'OPTIONS);              <<03722>>04988000
         IF IOQP(QPAR1).(0:1) = 1 THEN                                  04990000
           SIOPB(CDB'AREA'BYTE+16 , CDB'SKIP'SPARE)            <<03722>>04992000
         ELSE                                                           04994000
           SIOPB(CDB'AREA'BYTE+16 , CDB'JUMP'SPARE);           <<03722>>04996000
                                                                        04998000
       SIOP(DXFER1) := 18;   << CDB BYTE COUNT >>                       05000000
                                                                        05002000
       IF COUNT=0 THEN   << NO TRANSFER COUNT >>                        05004000
                                                                        05006000
         BEGIN                                                          05008000
           SIOP(DXFER5) := 0;   << BYPASS EXEC MSG >>                   05010000
           SIOP(DXFER6) := 5;   << JUMP *+5 >>                          05012000
         END                                                            05014000
                                                                        05016000
       ELSE   << SET UP EXECUTING MESSAGE >>                            05018000
                                                                        05020000
         BEGIN                                                          05022000
           SIOP(DXFER7) := WRT'EXEC'SEC;                                05024000
           SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>               05026000
           SIOP(DXFER9) := 0;       << 256 BYTE BURST >>                05028000
           SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>               05030000
           SIOP(DXFER10).(0:3) := 5;  << BM AND NE BITS >>              05032000
           SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>       05034000
         END;                                                           05036000
                                                                        05038000
       SIOPB(CDB'AREA'BYTE+17 , CDB'WRITE);                    <<03722>>05040000
                                                                        05042000
       SIOP(BRANCHPT) := DXFERCP;                                       05044000
                                                                        05046000
     END;                                                               05048000
$PAGE                                                                   05050000
<<---------------------------------------------------->>                05052000
<<                                                    >>                05054000
<<   FILE OPEN [FUNCTION CODE = 2]                    >>                05056000
<<                                                    >>                05058000
<<---------------------------------------------------->>                05060000
                                                                        05062000
     BEGIN                                                              05064000
       GOTO GOODXFER;                                                   05066000
     END;                                                               05068000
                                                                        05070000
                                                                        05072000
<<---------------------------------------------------->>                05074000
<<                                                    >>                05076000
<<   FILE CLOSE [FUNCTION CODE = 3]                   >>                05078000
<<                                                    >>                05080000
<<---------------------------------------------------->>                05082000
                                                                        05084000
     BEGIN                                                              05086000
       GOTO GOODXFER;                                                   05088000
     END;                                                               05090000
                                                                        05092000
                                                                        05094000
<<---------------------------------------------------->>                05096000
<<                                                    >>                05098000
<<   DEVICE CLOSE [FUNCTION CODE = 4]                 >>                05100000
<<                                                    >>                05102000
<<---------------------------------------------------->>                05104000
                                                                        05106000
     BEGIN                                                              05108000
       GOTO GOODXFER;                                                   05110000
     END;                                                               05112000
                                                                        05114000
$PAGE                                                                   05116000
<<---------------------------------------------------->>                05118000
<<                                                    >>                05120000
<<   FILL WITH ZEROS [FUNCTION CODE = 5]              >>                05122000
<<                                                    >>                05124000
<<   COUNT - TRANSFER COUNT                           >>                05126000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                05128000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                05130000
<<                                                    >>                05132000
<<---------------------------------------------------->>                05134000
                                                                        05136000
     BEGIN                                                              05138000
                                                                        05140000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   05142000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   05144000
                                                                        05146000
       CLDA1 := IOQP(QPAR1).(1:15);   << LOGICAL SECTOR ADDR1 >>        05148000
       CLDA2 := IOQP(QPAR2);   << LOGICAL SECTOR ADDR2 >>               05150000
                                                                        05152000
       << WRITE TO DISC LABEL (SECTOR 0) INVALID >>                     05154000
                                                                        05156000
       IF FOREIGN=0 AND CLDA1=0 AND CLDA2=0 THEN                        05158000
         GOTO INVALIDFUNC;                                              05160000
                                                                        05162000
       SET'BYTE'COUNT;                                                  05164000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                05166000
       SET'CMD'BYTES;                                                   05168000
                                                                        05170000
       SIOPB(CDB'AREA'BYTE+15 , CDB'SET'OPTIONS);              <<03722>>05172000
         IF IOQP(QPAR1).(0:1) = 1 THEN                                  05174000
           SIOPB(CDB'AREA'BYTE+16 , CDB'SKIP'SPARE)            <<03722>>05176000
         ELSE                                                           05178000
           SIOPB(CDB'AREA'BYTE+16 , CDB'JUMP'SPARE);           <<03722>>05180000
                                                                        05182000
       SIOP(DXFER1) := 18;   << CDB BYTE COUNT >>                       05184000
       SIOP(DXFER7) := WRT'EXEC'SEC;                                    05186000
       SIOP(DXFER8) := COUNT;   << FILL BYTE COUNT >>                   05188000
       SIOP(DXFER9) := 0;       << 256 BYTE BURST >>                    05190000
       SIOP(DXFER10).SABIT := 1;   << WRT FROM SINGLE ADDR >>           05192000
       SIOP(DXFER10).(8:8) := 0;                                        05194000
       SIOP(DXFER10).(0:3) := 5;     << BM AND NE BITS >>               05196000
       SIOP(DXFER11) := @SIOP + SYSDB + FILL'WRD;                       05198000
                                                                        05200000
       SIOP(FILL'WRD) := 0;   << FILL WORD OF 0 >>                      05202000
       SIOPB(CDB'AREA'BYTE+17 , CDB'WRITE);                    <<03722>>05204000
                                                                        05206000
       SIOP(BRANCHPT) := DXFERCP;                                       05208000
                                                                        05210000
     END;                                                               05212000
                                                                        05214000
$PAGE                                                                   05216000
<<---------------------------------------------------->>                05218000
<<                                                    >>                05220000
<<   FILL WITH BLANKS [FUNCTION CODE = 6]             >>                05222000
<<                                                    >>                05224000
<<   COUNT - TRANSFER COUNT                           >>                05226000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                05228000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                05230000
<<                                                    >>                05232000
<<---------------------------------------------------->>                05234000
                                                                        05236000
     BEGIN                                                              05238000
                                                                        05240000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   05242000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   05244000
                                                                        05246000
       CLDA1 := IOQP(QPAR1).(1:15);   << LOGICAL SECTOR ADDR1 >>        05248000
       CLDA2 := IOQP(QPAR2);   << LOGICAL SECTOR ADDR2 >>               05250000
                                                                        05252000
       << WRITE TO DISC LABEL (SECTOR 0) INVALID >>                     05254000
                                                                        05256000
       IF FOREIGN=0 AND CLDA1=0 AND CLDA2=0 THEN                        05258000
         GOTO INVALIDFUNC;                                              05260000
                                                                        05262000
       SET'BYTE'COUNT;                                                  05264000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                05266000
       SET'CMD'BYTES;                                                   05268000
                                                                        05270000
       SIOPB(CDB'AREA'BYTE+15 , CDB'SET'OPTIONS);              <<03722>>05272000
         IF IOQP(QPAR1).(0:1) = 1 THEN                                  05274000
           SIOPB(CDB'AREA'BYTE+16 , CDB'SKIP'SPARE)            <<03722>>05276000
         ELSE                                                           05278000
           SIOPB(CDB'AREA'BYTE+16 , CDB'JUMP'SPARE);           <<03722>>05280000
                                                                        05282000
       SIOP(DXFER1) := 18;   << CDB BYTE COUNT >>                       05284000
       SIOP(DXFER7) := WRT'EXEC'SEC;                                    05286000
       SIOP(DXFER8) := COUNT;   << FILL BYTE COUNT >>                   05288000
       SIOP(DXFER9) := 0;       << 256 BYTE BURST >>                    05290000
       SIOP(DXFER10).SABIT := 1;   << WRT FROM SINGLE ADDR >>           05292000
       SIOP(DXFER10).(8:8) := 0;                                        05294000
       SIOP(DXFER10).(0:3) := 5;    << BM AND NE BITS >>                05296000
       SIOP(DXFER11) := @SIOP + SYSDB + FILL'WRD;                       05298000
                                                                        05300000
       SIOP(FILL'WRD) := %20040;   << FILL WORD OF BLANKS >>            05302000
       SIOPB(CDB'AREA'BYTE+17 , CDB'WRITE);                    <<03722>>05304000
                                                                        05306000
       SIOP(BRANCHPT) := DXFERCP;                                       05308000
                                                                        05310000
     END;                                                               05312000
                                                                        05314000
$PAGE                                                                   05316000
<<---------------------------------------------------->>                05318000
<<                                                    >>                05320000
<<   REQUEST STATUS [FUNCTION CODE = 7 & 15]          >>                05322000
<<                                                    >>                05324000
<<   COUNT - STATUS LENGTH (MAX 20 BYTES)             >>                05326000
<<   BANK & BUFFADDR - RETURNS THE STATUS OR %101010  >>                05328000
<<   P1 - 8 (DENOTES A CALL FROM DEVREC)              >>                05330000
<<   P2 - 9 (DENOTES A CALL FROM DEVREC)              >>                05332000
<<                                                    >>                05334000
<<---------------------------------------------------->>                05336000
                                                                        05338000
     BEGIN                                                              05340000
                                                                        05342000
     << P1 = IOQP(QPAR1) >>                                             05344000
     << P2 = IOQP(QPAR2) >>                                             05346000
                                                                        05348000
  REQ'STATUS:                                                           05350000
                                                                        05352000
       SET'BYTE'COUNT;                                                  05354000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                05356000
                                                                        05358000
       IF DITP(DMISC).IGNORE'INT'FLG=1 AND                              05360000
         IOQP(QPAR1)=8 AND IOQP(QPAR2)=9 THEN                           05362000
                                                                        05364000
           BEGIN                                                        05366000
             DITP(DMISC).IGNORE'INT'FLG := 0;                           05368000
             TOS := BUFFADDRD;                                          05370000
             TOS := %101010;                                            05372000
             ASSEMBLE (SSEA);                                           05374000
             GOTO GOODXFER;                                             05376000
           END;                                                         05378000
                                                                        05380000
       TOS := 0;                                                        05382000
       TOS := @SIOP + SYSDB + DESC'AREA;                                05384000
       TOS := 0;                                                        05386000
       TOS := @DITP + SYSDB + DSTATUS;                                  05388000
       TOS := 10;                                                       05390000
       ASSEMBLE (MABS);   << SAVE LAST STATUS IN DESC AREA >>           05392000
       CLEAR'STATUS;                                                    05394000
                                                                        05396000
       SIOP(DIAG1) := 7;   << DO SEEK TO FORCE STATUS >>                05398000
                                                                        05400000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>05402000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'LENGTH);                <<03722>>05404000
       SIOPB(CDB'AREA'BYTE+2 , 0);                             <<03722>>05406000
       SIOPB(CDB'AREA'BYTE+3 , 0);                             <<03722>>05408000
       SIOPB(CDB'AREA'BYTE+4 , 0);                             <<03722>>05410000
       SIOPB(CDB'AREA'BYTE+5 , 0);                             <<03722>>05412000
       SIOPB(CDB'AREA'BYTE+6 , CDB'WRITE);                     <<03722>>05414000
                                                                        05416000
       SIOP(IDENT2) := 0;     << IDENTIFY 1ST TO  >>                    05418000
       SIOP(IDENT3) := -29;   << DET CTRL HOOK UP >>                    05420000
       SIOP(BRANCHPT) := IDENTCP;                                       05422000
                                                                        05424000
     END;                                                               05426000
$PAGE                                                                   05428000
<<---------------------------------------------------->>                05430000
<<                                                    >>                05432000
<<   INITIALIZE MEDIA [FUNCTION CODE = 8]             >>                05434000
<<                                                    >>                05436000
<<   P1 - 0 RETAIN FACTORY, FIELD SPARES              >>                05438000
<<      - 1 RETAIN FACTORY SPARES ONLY                >>                05440000
<<   P2 - BLOCK INTERLEAVE BYTE (BINARY NUMBER)       >>                05442000
<<                                                    >>                05444000
<<---------------------------------------------------->>                05446000
                                                                        05448000
     BEGIN                                                              05450000
                                                                        05452000
       << P1 = IOQP(QPAR1) >>                                           05454000
       << P2 = IOQP(QPAR2) >>                                           05456000
                                                                        05458000
       SIOP(DIAG1) := 4;                                                05460000
       IF NOT (0 <= IOQP(QPAR1) <= 4) THEN                              05462000
         GOTO INVALIDFUNC;                                              05464000
                                                                        05466000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>05468000
       SIOPB(CDB'AREA'BYTE+1 , CDB'INIT'MEDIA);                <<03722>>05470000
       SIOPB(CDB'AREA'BYTE+2 , IOQP(QPAR1).(8:8));             <<03722>>05472000
       SIOPB(CDB'AREA'BYTE+3 , IOQP(QPAR2).(8:8));             <<03722>>05474000
                                                                        05476000
       SIOP(BRANCHPT) := DIAGCP;                                        05478000
                                                                        05480000
     END;                                                               05482000
$PAGE                                                                   05484000
<<---------------------------------------------------->>                05486000
<<                                                    >>                05488000
<<       UNLOAD (FUNCTION CODE =9)                    >>                05490000
<<                                                    >>                05492000
<<---------------------------------------------------->>                05494000
                                                                        05496000
     BEGIN                                                              05498000
                                                                        05500000
       SIOP(DIAG1) := 2;                                                05502000
                                                                        05504000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>05506000
       SIOPB(CDB'AREA'BYTE+1 , CDB'UNLOAD);                    <<03722>>05508000
                                                                        05510000
       SIOP(BRANCHPT) := DIAGCP;                                        05512000
                                                                        05514000
     END;                                                               05516000
                                                                        05518000
$PAGE                                                                   05520000
<<---------------------------------------------------->>                05522000
<<                                                    >>                05524000
<<   WRITE DISC LABEL [FUNCTION CODE = 11]            >>                05526000
<<                                                    >>                05528000
<<   COUNT - TRANSFER COUNT                           >>                05530000
<<   BANK & BUFFADDR - CONTAINS DISC LABEL INFO       >>                05532000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                05534000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                05536000
<<                                                    >>                05538000
<<---------------------------------------------------->>                05540000
                                                                        05542000
     BEGIN                                                              05544000
                                                                        05546000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   05548000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   05550000
                                                                        05552000
       CLDA1 := IOQP(QPAR1).(1:15);   << LOGICAL SECTOR ADDR1 >>        05554000
       CLDA2 := IOQP(QPAR2);   << LOGICAL SECTOR ADDR2 >>               05556000
                                                                        05558000
       SET'BYTE'COUNT;                                                  05560000
       SET'CMD'BYTES;                                                   05562000
                                                                        05564000
       SIOPB(CDB'AREA'BYTE+15 , CDB'SET'OPTIONS);              <<03722>>05566000
         IF IOQP(QPAR1).(0:1) = 1 THEN                                  05568000
           SIOPB(CDB'AREA'BYTE+16 , CDB'SKIP'SPARE)            <<03722>>05570000
         ELSE                                                           05572000
           SIOPB(CDB'AREA'BYTE+16 , CDB'JUMP'SPARE);           <<03722>>05574000
                                                                        05576000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                05578000
                                                                        05580000
       SIOP(DXFER1) := 18;   << CDB BYTE COUNT >>                       05582000
       SIOP(DXFER7) := WRT'EXEC'SEC;                                    05584000
       SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>                   05586000
       SIOP(DXFER9) := 0;       << 256 BYTE BURST >>                    05588000
       SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>                   05590000
       SIOP(DXFER10).(0:3) := 5;   << BM AND NE BITS >>                 05592000
       SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>           05594000
                                                                        05596000
       SIOPB(CDB'AREA'BYTE+17 , CDB'WRITE);                    <<03722>>05598000
                                                                        05600000
       SIOP(BRANCHPT) := DXFERCP;                                       05602000
                                                                        05604000
     END;                                                               05606000
$PAGE                                                                   05608000
<<---------------------------------------------------->>                05610000
<<                                                    >>                05612000
<<   REQUEST VOLUME LIMIT [FUNCTION CODE = 13]        >>                05614000
<<                                                    >>                05616000
<<   BANK & BUFFADDR - RETURNS A DBL WRD ADDRESS OF   >>                05618000
<<                     THE MAXIMUM VOLUME LIMIT       >>                05620000
<<   P1 - 0 RETURN A SINGLE VECTOR ADDRESS            >>                05622000
<<      - 1 RETURN A THREE VECTOR ADDRESS             >>                05624000
<<                                                    >>                05626000
<<---------------------------------------------------->>                05628000
                                                                        05630000
     BEGIN                                                              05632000
                                                                        05634000
       << P1 = IOQP(QPAR1) >>                                           05636000
                                                                        05638000
       IF NOT (0 <= IOQP(QPAR1) <= 1) THEN                              05640000
         GOTO INVALIDFUNC;                                              05642000
                                                                        05644000
       SIOP(DXFER1) := 2;   << CDB BYTE COUNT >>                        05646000
       SIOP(DXFER7) := READ'EXEC'SEC;                                   05648000
       SIOP(DXFER8) := MAX'DESC'BYTE;   << MAX# DESC BYTES >>           05650000
       SIOP(DXFER10).(8:8) := 0;   << DESCRIBE AREA >>                  05652000
       SIOP(DXFER11) := @SIOP + SYSDB + DESC'AREA;                      05654000
                                                                        05656000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>05658000
       SIOPB(CDB'AREA'BYTE+1 , CDB'DESCRIBE);                  <<03722>>05660000
                                                                        05662000
       SIOP(BRANCHPT) := DXFERCP;                                       05664000
                                                                        05666000
     END;                                                               05668000
$PAGE                                                                   05670000
<<---------------------------------------------------->>                05672000
<<                                                    >>                05674000
<<   VERIFY [FUNCTION CODE = 14]                      >>                05676000
<<                                                    >>                05678000
<<   BANK & BUFFADDR - ENTRY   A DBL WRD ADDRESS OF   >>       <<04834>>05680000
<<                     VERIFY LENGTH                  >>       <<04834>>05682000
<<   BANK & BUFFADDR - RETURNS A DBL WRD ADDRESS OF   >>                05684000
<<                     1ST BAD SECTOR ENCOUNTERED     >>                05686000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                05688000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                05690000
<<                                                    >>                05692000
<<---------------------------------------------------->>                05694000
                                                                        05696000
     BEGIN                                                              05698000
                                                                        05700000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   05702000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   05704000
                                                                        05706000
       CLDA1 := IOQP(QPAR1);   << LOGICAL SECTOR ADDR1 >>               05708000
       CLDA2 := IOQP(QPAR2);   << LOGICAL SECTOR ADDR2 >>               05710000
                                                                        05712000
       SET'CMD'BYTES;                                          <<04834>>05714000
       TOS := BUFFADDRD;      << GET BANK & OFFSET OF BUFFER >><<04834>>05716000
       ASSEMBLE(LDEA;DXCH,DDEL);<<GET FRST 2 WORDS OF BUFFER >><<04834>>05718000
       VER'LEN := TOS;   << STORE VERIFY BYTE LENGTH >>        <<04834>>05720000
       INDEX := CDB'AREA'BYTE + 9 ;  << OFFSET OF LENGTH >>    <<04834>>05722000
       SIOPB(INDEX,L1'VER'LEN.(0:8)); <<PUT LEN IN CMND SEQ.>> <<04834>>05724000
       SIOPB(INDEX+1,L1'VER'LEN.(8:8));                        <<04834>>05726000
       SIOPB(INDEX+2,L2'VER'LEN.(0:8));                        <<04834>>05728000
       SIOPB(INDEX+3,L2'VER'LEN.(8:8));                        <<04834>>05730000
                                                               <<04834>>05732000
       SIOP(DIAG1) := 14;   << CDB BYTE COUNT >>                        05734000
       SIOPB(CDB'AREA'BYTE+13 , CDB'VERIFY);                   <<03722>>05736000
                                                                        05738000
       SIOP(BRANCHPT) := DIAGCP;                                        05740000
                                                                        05742000
     END;                                                               05744000
$PAGE                                                                   05746000
<<---------------------------------------------------->>                05748000
<<                                                    >>                05750000
<<   LOCK [FUNCTION CODE = 16]                        >>                05752000
<<                                                    >>                05754000
<<---------------------------------------------------->>                05756000
                                                                        05758000
     BEGIN                                                              05760000
       DITP(DMISC).LOCK'FLG := 1;                                       05762000
       GOTO GOODXFER;                                                   05764000
     END;                                                               05766000
$PAGE                                                                   05768000
<<---------------------------------------------------->>                05770000
<<                                                    >>                05772000
<<   UNLOCK [FUNCTION CODE = 17]                      >>                05774000
<<                                                    >>                05776000
<<---------------------------------------------------->>                05778000
                                                                        05780000
     BEGIN                                                              05782000
      DITP(DMISC).LOCK'FLG := 0;                                        05784000
      GOTO GOODXFER;                                                    05786000
     END;                                                               05788000
$PAGE                                                                   05790000
<<---------------------------------------------------->>                05792000
<<                                                    >>                05794000
<<       READ LOCK BIT (FUNCTION 18)                  >>                05796000
<<                                                    >>                05798000
<<       BANK & BUFFADDR - CONTAIN LOCK BIT STATE     >>                05800000
<<                                                    >>                05802000
<<---------------------------------------------------->>                05804000
                                                                        05806000
     BEGIN                                                              05808000
                                                                        05810000
       TOS := BANK;                                                     05812000
       TOS := BUFFADDR;                                                 05814000
       TOS := DITP(DMISC).LOCK'FLG;                                     05816000
       ASSEMBLE(SSEA);                                                  05818000
                                                                        05820000
       GOTO GOODXFER;                                                   05822000
                                                                        05824000
     END;                                                               05826000
                                                                        05828000
$PAGE                                                                   05830000
<<---------------------------------------------------->>                05832000
<<                                                    >>                05834000
<<   IDENTIFY [FUNCTION CODE = 72]                    >>                05836000
<<                                                    >>                05838000
<<---------------------------------------------------->>                05840000
                                                                        05842000
     BEGIN                                                              05844000
                                                                        05846000
       SIOP(IDENT1) := 0;   << ZERO RETURN BYTE >>                      05848000
       SIOP(BRANCHPT) := IDENTCP;                                       05850000
                                                                        05852000
     END;                                                               05854000
$PAGE                                                                   05856000
<<---------------------------------------------------->>                05858000
<<                                                    >>                05860000
<<   INITIATE DIAGNOSTIC [FUNCTION CODE = 73]         >>                05862000
<<   (SELFTEST INITIATE)                              >>                05864000
<<                                                    >>                05866000
<<   P1 - 2 BYTES LOOP COUNT (EXECUTION COUNT)        >>                05868000
<<   P2 - DIAGNOSTIC SECTION#                         >>                05870000
<<                                                    >>                05872000
<<---------------------------------------------------->>                05874000
                                                                        05876000
     BEGIN                                                              05878000
                                                                        05880000
       << P1 = IOQP(QPAR1) >>                                           05882000
       << P2 = IOQP(QPAR2) >>                                           05884000
                                                                        05886000
       IF IOQP(QPAR1) = 0 THEN   << LOOP 0 INVALID >>                   05888000
         GOTO INVALIDFUNC;                                              05890000
                                                                        05892000
       SIOP(DIAG1) := 5;                                                05894000
                                                                        05896000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT + CTRL'UNIT);        <<03722>>05898000
       SIOPB(CDB'AREA'BYTE+1 , CDB'INIT'DIAG);                 <<03722>>05900000
       SIOPB(CDB'AREA'BYTE+2 , IOQP(QPAR1).(0:8));             <<03722>>05902000
       SIOPB(CDB'AREA'BYTE+3 , IOQP(QPAR1).(8:8));             <<03722>>05904000
       SIOPB(CDB'AREA'BYTE+4 , IOQP(QPAR2).(8:8));             <<03722>>05906000
                                                                        05908000
       SIOP(BRANCHPT) := DIAGCP;                                        05910000
                                                                        05912000
     END;                                                               05914000
$PAGE                                                                   05916000
<<---------------------------------------------------->>                05918000
<<                                                    >>                05920000
<<   DIAGNOSTIC RESULT [FUNCTION CODE = 74 = 7]       >>                05922000
<<   (SELFTEST RESULT)                                >>                05924000
<<                                                    >>                05926000
<<---------------------------------------------------->>                05928000
                                                                        05930000
     BEGIN                                                              05932000
                                                                        05934000
       GOTO REQ'STATUS;   << RESULTS PART OF STATUS >>                  05936000
                                                                        05938000
     END;                                                               05940000
$PAGE                                                                   05942000
<<---------------------------------------------------->>                05944000
<<                                                    >>                05946000
<<   LOOPBACK WRITE [FUNCTION CODE = 75]              >>                05948000
<<                                                    >>                05950000
<<   COUNT - TRANSFER COUNT                           >>                05952000
<<   BANK & BUFFADDR - CONTAINS LOOPBK DATA FOR WRT.  >>                05954000
<<                     MUST BEGIN W/HEX FF FOLLOWED   >>                05956000
<<                     BY BYTES EQUAL TO ITS PREDE-   >>                05958000
<<                     CESSOR PLUS ONE                >>                05960000
<<                                                    >>                05962000
<<---------------------------------------------------->>                05964000
                                                                        05966000
     BEGIN                                                              05968000
                                                                        05970000
       SET'BYTE'COUNT;                                                  05972000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                05974000
                                                                        05976000
       SIOP(DXFER) := WRT'TRANS'SEC;                                    05978000
       SIOP(DXFER1) := 5;   << CDB BYTE COUNT >>                        05980000
       SIOP(DXFER7) := WRT'TRANS'SEC;                                   05982000
       SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>                   05984000
       SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>                   05986000
       SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>           05988000
       SIOP(DXFER5) := SIOP(DXFER16) := 0;   << NO WAIT >>              05990000
                                                                        05992000
       SIOPB(CDB'AREA'BYTE , CDB'WRT'LOOPBK);                  <<03722>>05994000
       SIOPB(CDB'AREA'BYTE+1 , 0);                             <<03722>>05996000
       SIOPB(CDB'AREA'BYTE+2 , 0);                             <<03722>>05998000
       SIOPB(CDB'AREA'BYTE+3 , COUNT.(0:8));                   <<03722>>06000000
       SIOPB(CDB'AREA'BYTE+4 , COUNT.(8:8));                   <<03722>>06002000
                                                                        06004000
       SIOP(BRANCHPT) := DXFERCP;                                       06006000
                                                                        06008000
     END;                                                               06010000
$PAGE                                                                   06012000
<<---------------------------------------------------->>                06014000
<<                                                    >>                06016000
<<   LOOPBACK READ [FUNCTION CODE = 76]               >>                06018000
<<                                                    >>                06020000
<<   COUNT - TRANSFER COUNT                           >>                06022000
<<   BANK & BUFFADDR - CONTAINS LOOPBK DATA READ      >>                06024000
<<                                                    >>                06026000
<<---------------------------------------------------->>                06028000
                                                                        06030000
     BEGIN                                                              06032000
                                                                        06034000
       SET'BYTE'COUNT;                                                  06036000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                06038000
                                                                        06040000
       SIOP(DXFER) := WRT'TRANS'SEC;                                    06042000
       SIOP(DXFER1) := 5;   << CDB BYTE COUNT >>                        06044000
       SIOP(DXFER7) := READ'TRANS'SEC;                                  06046000
       SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>                   06048000
       SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>                   06050000
       SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>           06052000
       SIOP(DXFER5) := SIOP(DXFER16) := 0;   << NO WAIT >>              06054000
                                                                        06056000
       SIOPB(CDB'AREA'BYTE , CDB'READ'LOOPBK);                 <<03722>>06058000
       SIOPB(CDB'AREA'BYTE+1 , 0);                             <<03722>>06060000
       SIOPB(CDB'AREA'BYTE+2 , 0);                             <<03722>>06062000
       SIOPB(CDB'AREA'BYTE+3 , COUNT.(0:8));                   <<03722>>06064000
       SIOPB(CDB'AREA'BYTE+4 , COUNT.(8:8));                   <<03722>>06066000
                                                                        06068000
       SIOP(BRANCHPT) := DXFERCP;                                       06070000
                                                                        06072000
     END;                                                               06074000
$PAGE                                                                   06076000
<<---------------------------------------------------->>                06078000
<<                                                    >>                06080000
<<   GENERAL PURPOSE COMMAND [FUNCTION CODE = 77]     >>                06082000
<<                                                    >>                06084000
<<   COUNT - NUMBER OF COMMAND BYTES                  >>                06086000
<<   BANK & BUFFADDR - CONTAINS COMMAND DATA BYTES    >>                06088000
<<                     TO BE SENT THRU THE COMMAND    >>                06090000
<<                     & REPORTING MESSAGE PHASE      >>                06092000
<<                                                    >>                06094000
<<---------------------------------------------------->>                06096000
                                                                        06098000
     BEGIN                                                              06100000
                                                                        06102000
       SET'BYTE'COUNT;                                                  06104000
                                                                        06106000
       SIOP(DIAG1) := COUNT;                                            06108000
       SIOP(DIAG3).(8:8) := BANK;                                       06110000
       SIOP(DIAG4) := BUFFADDR;                                         06112000
                                                                        06114000
       SIOP(BRANCHPT) := DIAGCP;                                        06116000
                                                                        06118000
     END;                                                               06120000
$PAGE                                                                   06122000
<<---------------------------------------------------->>                06124000
<<                                                    >>                06126000
<<   DESCRIBE [FUNCTION CODE = 78]                    >>                06128000
<<                                                    >>                06130000
<<   COUNT - DESCRIBE LENGTH (MAX 37 BYTES)           >>                06132000
<<   BANK & BUFFADDR - RETURNS DATA FROM DESCRIBE     >>                06134000
<<                                                    >>                06136000
<<---------------------------------------------------->>                06138000
                                                                        06140000
     BEGIN                                                              06142000
                                                                        06144000
       SET'BYTE'COUNT;                                                  06146000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                06148000
                                                                        06150000
       SIOP(DXFER1) := 2;   << CDB BYTE COUNT >>                        06152000
       SIOP(DXFER7) := READ'EXEC'SEC;                                   06154000
       SIOP(DXFER8) := MAX'DESC'BYTE;   << MAX# DESC BYTES >>           06156000
       SIOP(DXFER10).(8:8) := 0;   << DESCRIBE AREA >>                  06158000
       SIOP(DXFER11) := @SIOP + SYSDB + DESC'AREA;                      06160000
                                                                        06162000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>06164000
       SIOPB(CDB'AREA'BYTE+1 , CDB'DESCRIBE);                  <<03722>>06166000
                                                                        06168000
       SIOP(BRANCHPT) := DXFERCP;                                       06170000
                                                                        06172000
     END;                                                               06174000
$PAGE                                                                   06176000
<<---------------------------------------------------->>                06178000
<<                                                    >>                06180000
<<   RELEASE [FUNCTION CODE = 79]                     >>                06182000
<<                                                    >>                06184000
<<---------------------------------------------------->>                06186000
                                                                        06188000
     BEGIN                                                              06190000
                                                                        06192000
       SIOP(DIAG1) := 2;                                                06194000
                                                                        06196000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT + CTRL'UNIT);        <<03722>>06198000
       SIOPB(CDB'AREA'BYTE+1 , CDB'RELEASE);                   <<03722>>06200000
                                                                        06202000
       SIOP(BRANCHPT) := DIAGCP;                                        06204000
                                                                        06206000
     END;                                                               06208000
$PAGE                                                                   06210000
<<---------------------------------------------------->>                06212000
<<                                                    >>                06214000
<<   RELEASE DENIED [FUNCTION CODE = 80]              >>                06216000
<<                                                    >>                06218000
<<---------------------------------------------------->>                06220000
                                                                        06222000
     BEGIN                                                              06224000
                                                                        06226000
       SIOP(DIAG1) := 2;                                                06228000
                                                                        06230000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT + CTRL'UNIT);        <<03722>>06232000
       SIOPB(CDB'AREA'BYTE+1 , CDB'RELEASE'DENY);              <<03722>>06234000
                                                                        06236000
       SIOP(BRANCHPT) := DIAGCP;                                        06238000
                                                                        06240000
     END;                                                               06242000
$PAGE                                                                   06244000
<<---------------------------------------------------->>                06246000
<<                                                    >>                06248000
<<   SET RELEASE [FUNCTION CODE = 81]                 >>                06250000
<<                                                    >>                06252000
<<   P1 - 0 ENABLE RELEASE TIMEOUT [T=0]              >>                06254000
<<        1 SUPPRESS RELEASE TIMEOUT [T=1]            >>                06256000
<<   P2 - 0 AUTO RELEASE DURING IDLE TIME [Z=0]       >>                06258000
<<        1 NO AUTO RELEASE DURING IDLE TIME [Z=1]    >>                06260000
<<                                                    >>                06262000
<<---------------------------------------------------->>                06264000
                                                                        06266000
     BEGIN                                                              06268000
                                                                        06270000
       << P1 = IOQP(QPAR1) >>                                           06272000
       << P2 = IOQP(QPAR2) >>                                           06274000
                                                                        06276000
       SIOP(DIAG1) := 3;                                                06278000
                                                                        06280000
       PARM := 0;                                                       06282000
       IF IOQP(QPAR1) = 1 THEN                                          06284000
         PARM.(0:1) := 1;   << SUPPRESS RELEASE TIMEOUT >>              06286000
       IF IOQP(QPAR2) = 1 THEN                                          06288000
         PARM.(1:1) := 1;   << RELEASE DURING IDLE TIME >>              06290000
                                                                        06292000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT + CTRL'UNIT);        <<03722>>06294000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'RELEASE);               <<03722>>06296000
       SIOPB(CDB'AREA'BYTE+2 , PARM.(0:8));  << TZ000000 >>    <<03722>>06298000
                                                                        06300000
       SIOP(BRANCHPT) := DIAGCP;                                        06302000
                                                                        06304000
     END;                                                               06306000
$PAGE                                                                   06308000
<<---------------------------------------------------->>                06310000
<<                                                    >>                06312000
<<   SET ADDRESS [FUNCTION CODE = 82]                 >>                06314000
<<                                                    >>                06316000
<<   BANK & BUFFADDR - CONTAINS A DBL WRD ADDRESS     >>                06318000
<<   P1 - 0 SINGLE VECTOR ADDRESS                     >>                06320000
<<      - 1 THREE VECTOR ADDRESS                      >>                06322000
<<                                                    >>                06324000
<<---------------------------------------------------->>                06326000
                                                                        06328000
     BEGIN                                                              06330000
                                                                        06332000
       << P1 = IOQP(QPAR1) >>                                           06334000
                                                                        06336000
       IF NOT (0 <= IOQP(QPAR1) <= 1) THEN                              06338000
         GOTO INVALIDFUNC;                                              06340000
                                                                        06342000
       TOS := BUFFADDRD;                                                06344000
       ASSEMBLE (LDEA);   << FETCH DBL WRD ADDR >>                      06346000
       CLDA2 := TOS;                                                    06348000
       CLDA1 := TOS;                                                    06350000
                                                                        06352000
       SIOP(DIAG1) := 8;                                                06354000
                                                                        06356000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>06358000
                                                                        06360000
       IF IOQP(QPAR1)=0 THEN   << SINGLE VECTOR ADDR >>                 06362000
                                                                        06364000
         BEGIN                                                          06366000
           SIOPB(CDB'AREA'BYTE+1 , CDB'SET'SNGL'VEC);          <<03722>>06368000
           SIOPB(CDB'AREA'BYTE+2 , 0);                         <<03722>>06370000
           SIOPB(CDB'AREA'BYTE+3 , 0);                         <<03722>>06372000
           SIOPB(CDB'AREA'BYTE+4 , CLDA1.(0:8));               <<03722>>06374000
           SIOPB(CDB'AREA'BYTE+5 , CLDA1.(8:8));               <<03722>>06376000
           SIOPB(CDB'AREA'BYTE+6 , CLDA2.(0:8));               <<03722>>06378000
           SIOPB(CDB'AREA'BYTE+7 , CLDA2.(8:8));               <<03722>>06380000
         END                                                            06382000
                                                                        06384000
       ELSE   << THREE VECTOR ADDR >>                                   06386000
                                                                        06388000
         BEGIN                                                          06390000
           SIOPB(CDB'AREA'BYTE+1 , CDB'SET'3'VEC);             <<03722>>06392000
           SIOPB(CDB'AREA'BYTE+2 , 0);                         <<03722>>06394000
           SIOPB(CDB'AREA'BYTE+3 , CLDA1.(0:8));               <<03722>>06396000
           SIOPB(CDB'AREA'BYTE+4 , CLDA1.(8:8));               <<03722>>06398000
           SIOPB(CDB'AREA'BYTE+5 , CLDA2.(0:8));               <<03722>>06400000
           SIOPB(CDB'AREA'BYTE+6 , 0);                         <<03722>>06402000
           SIOPB(CDB'AREA'BYTE+7 , CLDA2.(8:8));               <<03722>>06404000
         END;                                                           06406000
                                                                        06408000
       SIOP(BRANCHPT) := DIAGCP;                                        06410000
                                                                        06412000
     END;                                                               06414000
$PAGE                                                                   06416000
<<---------------------------------------------------->>                06418000
<<                                                    >>                06420000
<<   SET BLOCK DISPLACEMENT [FUNCTION CODE = 83]      >>                06422000
<<                                                    >>                06424000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                06426000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                06428000
<<                                                    >>                06430000
<<---------------------------------------------------->>                06432000
                                                                        06434000
     BEGIN                                                              06436000
                                                                        06438000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   06440000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   06442000
                                                                        06444000
       CLDA1 := IOQP(QPAR1);   << LOGICAL SECTOR ADDR1 >>               06446000
       CLDA2 := IOQP(QPAR2);   << LOGICAL SECTOR ADDR2 >>               06448000
                                                                        06450000
       SIOP(DIAG1) := 8;                                                06452000
                                                                        06454000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>06456000
       SIOPB(CDB'AREA'BYTE+1 , CDB'BLK'DISPL);                 <<03722>>06458000
       SIOPB(CDB'AREA'BYTE+2 , 0);                             <<03722>>06460000
       SIOPB(CDB'AREA'BYTE+3 , 0);                             <<03722>>06462000
       SIOPB(CDB'AREA'BYTE+4 , CLDA1.(0:8));                   <<03722>>06464000
       SIOPB(CDB'AREA'BYTE+5 , CLDA1.(8:8));                   <<03722>>06466000
       SIOPB(CDB'AREA'BYTE+6 , CLDA2.(0:8));                   <<03722>>06468000
       SIOPB(CDB'AREA'BYTE+7 , CLDA2.(8:8));                   <<03722>>06470000
                                                                        06472000
       SIOP(BRANCHPT) := DIAGCP;                                        06474000
                                                                        06476000
     END;                                                               06478000
$PAGE                                                                   06480000
<<---------------------------------------------------->>                06482000
<<                                                    >>                06484000
<<   SET MASK STATUS [FUNCTION CODE = 84]             >>                06486000
<<                                                    >>                06488000
<<   BANK & BUFFADDR - CONTAINS 8 BYTES OF BIT        >>                06490000
<<                     POSITIONS CORRESPONDING TO     >>                06492000
<<                     THE STATUS ERROR BITS          >>                06494000
<<                                                    >>                06496000
<<---------------------------------------------------->>                06498000
                                                                        06500000
     BEGIN                                                              06502000
                                                                        06504000
       SIOP(DIAG1) := 10;                                               06506000
                                                                        06508000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>06510000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'MASK);                  <<03722>>06512000
                                                                        06514000
       TOS := 0;   << DESTINATION - CDB AREA >>                         06516000
       TOS := @SIOP + SYSDB + CDB'AREA'WRD+1;                           06518000
       TOS := BANK;   << SOURCE >>                                      06520000
       TOS := BUFFADDR;                                                 06522000
       TOS := 4;   << 8 BYTES STATUS MASK >>                            06524000
       ASSEMBLE (MABS);   << MOVE USING ABS ADDR >>                     06526000
                                                                        06528000
       SIOP(BRANCHPT) := DIAGCP;                                        06530000
                                                                        06532000
     END;                                                               06534000
$PAGE                                                                   06536000
<<---------------------------------------------------->>                06538000
<<                                                    >>                06540000
<<   SET RETURN ADDRESSING MODE [FUNCTION CODE = 85]  >>                06542000
<<                                                    >>                06544000
<<   P1 - 0 SINGLE VECTOR MODE                        >>                06546000
<<      - 1 THREE VECTOR MODE                         >>                06548000
<<                                                    >>                06550000
<<---------------------------------------------------->>                06552000
                                                                        06554000
     BEGIN                                                              06556000
                                                                        06558000
       << P1 = IOQP(QPAR1) >>                                           06560000
                                                                        06562000
       IF NOT (0 <= IOQP(QPAR1) <= 1) THEN                              06564000
         GOTO INVALIDFUNC;                                              06566000
                                                                        06568000
       SIOP(DIAG1) := 3;                                                06570000
                                                                        06572000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>06574000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'RETADR);                <<03722>>06576000
       SIOPB(CDB'AREA'BYTE+2 , IF IOQP(QPAR1)=0 THEN           <<03722>>06578000
         0 ELSE 1);  << SINGLE OR THREE VECTOR MODE >>         <<03722>>06580000
                                                                        06582000
       SIOP(BRANCHPT) := DIAGCP;                                        06584000
                                                                        06586000
     END;                                                               06588000
$PAGE                                                                   06590000
<<---------------------------------------------------->>                06592000
<<                                                    >>                06594000
<<   SET RETRY TIME [FUNCTION CODE = 86]              >>                06596000
<<                                                    >>                06598000
<<   P1 - TIME IN 10'S OF MILLISECONDS                >>                06600000
<<                                                    >>                06602000
<<---------------------------------------------------->>                06604000
                                                                        06606000
     BEGIN                                                              06608000
                                                                        06610000
       << P1 = IOQP(QPAR1) >>                                           06612000
                                                                        06614000
       SIOP(DIAG1) := 4;                                                06616000
                                                                        06618000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>06620000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'RETRY);                 <<03722>>06622000
       SIOPB(CDB'AREA'BYTE+2 , IOQP(QPAR1).(0:8));             <<03722>>06624000
       SIOPB(CDB'AREA'BYTE+3 , IOQP(QPAR1).(8:8));             <<03722>>06626000
                                                                        06628000
       SIOP(BRANCHPT) := DIAGCP;                                        06630000
                                                                        06632000
     END;                                                               06634000
$PAGE                                                                   06636000
<<---------------------------------------------------->>                06638000
<<                                                    >>                06640000
<<   SET RPS [FUNCTION CODE = 87]                     >>                06642000
<<                                                    >>                06644000
<<   P1 - TIME TO TARGET IN 100'S MICROSECONDS        >>                06646000
<<   P2 - WINDOW SIZE IN 100'S OF MICROSECONDS        >>                06648000
<<                                                    >>                06650000
<<---------------------------------------------------->>                06652000
                                                                        06654000
     BEGIN                                                              06656000
                                                                        06658000
       << P1 = IOQP(QPAR1) >>                                           06660000
       << P2 = IOQP(QPAR2) >>                                           06662000
                                                                        06664000
       SIOP(DIAG1) := 4;                                                06666000
                                                                        06668000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>06670000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'RPS);                   <<03722>>06672000
       SIOPB(CDB'AREA'BYTE+2 , IOQP(QPAR1).(8:8));             <<03722>>06674000
       SIOPB(CDB'AREA'BYTE+3 , IOQP(QPAR2).(8:8));             <<03722>>06676000
                                                                        06678000
       SIOP(BRANCHPT) := DIAGCP;                                        06680000
                                                                        06682000
     END;                                                               06684000
$PAGE                                                                   06686000
<<---------------------------------------------------->>                06688000
<<                                                    >>                06690000
<<   SPARE BLOCK [FUNCTION CODE = 88]                 >>                06692000
<<                                                    >>                06694000
<<   BANK & BUFFADDR - CONTAINS DBL WRD ADDRESS OF    >>                06696000
<<                     SECTOR TO BE SPARED            >>                06698000
<<   P1 - 0 SINGLE VECTOR ADDRESS                     >>                06700000
<<      - 1 THREE VECTOR ADDRESS                      >>                06702000
<<   P2 - 0 SPARE RETAINING DATA (NO TARGET SECTOR)   >>                06704000
<<        1 SPARE WITHOUT RETAINING DATA              >>                06706000
<<        4 SPARE RETAINING DATA (TARGET INCLUDED)    >>                06708000
<<                                                    >>                06710000
<<---------------------------------------------------->>                06712000
                                                                        06714000
     BEGIN                                                              06716000
                                                                        06718000
       << P1 = IOQP(QPAR1) >>                                           06720000
       << P2 = IOQP(QPAR2) >>                                           06722000
                                                                        06724000
       IF NOT (0 <= IOQP(QPAR1) <= 1) THEN                              06726000
         GOTO INVALIDFUNC;                                              06728000
                                                                        06730000
       IF NOT (0 <= IOQP(QPAR2) <= 4) THEN                              06732000
         GOTO INVALIDFUNC;                                              06734000
                                                                        06736000
       TOS := BUFFADDRD;                                                06738000
       ASSEMBLE (LDEA);   << FETCH DBL WRD ADDRESS >>                   06740000
       CLDA2 := TOS;                                                    06742000
       CLDA1 := TOS;                                                    06744000
                                                                        06746000
       SIOP(DIAG1) := 10;                                               06748000
                                                                        06750000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>06752000
                                                                        06754000
       IF IOQP(QPAR1)=0 THEN   << SPARE W/SNGL VEC ADDR >>              06756000
                                                                        06758000
         BEGIN                                                          06760000
           SIOPB(CDB'AREA'BYTE+1 , CDB'SET'SNGL'VEC);          <<03722>>06762000
           SIOPB(CDB'AREA'BYTE+2 , 0);                         <<03722>>06764000
           SIOPB(CDB'AREA'BYTE+3 , 0);                         <<03722>>06766000
           SIOPB(CDB'AREA'BYTE+4 , CLDA1.(0:8));               <<03722>>06768000
           SIOPB(CDB'AREA'BYTE+5 , CLDA1.(8:8));               <<03722>>06770000
           SIOPB(CDB'AREA'BYTE+6 , CLDA2.(0:8));               <<03722>>06772000
           SIOPB(CDB'AREA'BYTE+7 , CLDA2.(8:8));               <<03722>>06774000
         END                                                            06776000
                                                                        06778000
       ELSE   << SPARE W/THREE VEC ADDR >>                              06780000
                                                                        06782000
         BEGIN                                                          06784000
           SIOPB(CDB'AREA'BYTE+1 , CDB'SET'3'VEC);             <<03722>>06786000
           SIOPB(CDB'AREA'BYTE+2 , 0);                         <<03722>>06788000
           SIOPB(CDB'AREA'BYTE+3 , CLDA1.(0:8));               <<03722>>06790000
           SIOPB(CDB'AREA'BYTE+4 , CLDA1.(8:8));               <<03722>>06792000
           SIOPB(CDB'AREA'BYTE+5 , CLDA2.(0:8));               <<03722>>06794000
           SIOPB(CDB'AREA'BYTE+6 , 0);                         <<03722>>06796000
           SIOPB(CDB'AREA'BYTE+7 , CLDA2.(8:8));               <<03722>>06798000
         END;                                                           06800000
                                                                        06802000
       SIOPB(CDB'AREA'BYTE+8 , CDB'SPARE'BLK);                 <<03722>>06804000
       SIOPB(CDB'AREA'BYTE+9 , IOQP(QPAR2).(8:8));             <<03722>>06806000
                                                                        06808000
       SIOP(BRANCHPT) := DIAGCP;                                        06810000
                                                                        06812000
     END;                                                               06814000
$PAGE                                                                   06816000
<<---------------------------------------------------->>                06818000
<<                                                    >>                06820000
<<   READ WITH 3-VECTOR ADDRESS [FUNCTION CODE = 89]  >>                06822000
<<                                                    >>                06824000
<<   COUNT - TRANSFER COUNT                           >>                06826000
<<   BANK & BUFFADDR - CONTAINS DATA READ             >>                06828000
<<   P1 - CYLINDER ADDRESS                            >>                06830000
<<   P2 - HEAD/SECTOR ADDRESS                         >>                06832000
<<                                                    >>                06834000
<<---------------------------------------------------->>                06836000
                                                                        06838000
     BEGIN                                                              06840000
                                                                        06842000
       << P1 = IOQP(QPAR1) >>                                           06844000
       << P2 = IOQP(QPAR2) >>                                           06846000
                                                                        06848000
       SET'BYTE'COUNT;                                                  06850000
                                                                        06852000
       SIOP(DXFER1) := 14;   << CDB BYTE COUNT >>                       06854000
                                                                        06856000
       IF COUNT=0 THEN   << NO TRANSFER COUNT >>                        06858000
                                                                        06860000
         BEGIN                                                          06862000
           SIOP(DXFER5) := 0;   << BYPASS EXEC MSG >>                   06864000
           SIOP(DXFER6) := 5;   << JUMP *+5 >>                          06866000
         END                                                            06868000
                                                                        06870000
       ELSE   << SET UP EXECUTING MESSAGE >>                            06872000
                                                                        06874000
         BEGIN                                                          06876000
           SIOP(DXFER7) := READ'EXEC'SEC;                               06878000
           SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>               06880000
           SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>               06882000
           SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>       06884000
         END;                                                           06886000
                                                                        06888000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>06890000
                                                                        06892000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'3'VEC);                 <<03722>>06894000
       SIOPB(CDB'AREA'BYTE+2 , 0);                             <<03722>>06896000
       SIOPB(CDB'AREA'BYTE+3 , IOQP(QPAR1).(0:8));             <<03722>>06898000
       SIOPB(CDB'AREA'BYTE+4 , IOQP(QPAR1).(8:8));             <<03722>>06900000
       SIOPB(CDB'AREA'BYTE+5 , IOQP(QPAR2).(0:8));             <<03722>>06902000
       SIOPB(CDB'AREA'BYTE+6 , 0);                             <<03722>>06904000
       SIOPB(CDB'AREA'BYTE+7 , IOQP(QPAR2).(8:8));             <<03722>>06906000
                                                                        06908000
       SIOPB(CDB'AREA'BYTE+8 , CDB'SET'LENGTH);                <<03722>>06910000
       SIOPB(CDB'AREA'BYTE+9 , 0);                             <<03722>>06912000
       SIOPB(CDB'AREA'BYTE+10 , 0);                            <<03722>>06914000
       SIOPB(CDB'AREA'BYTE+11 , COUNT.(0:8));                  <<03722>>06916000
       SIOPB(CDB'AREA'BYTE+12 , COUNT.(8:8));                  <<03722>>06918000
       SIOPB(CDB'AREA'BYTE+13 , CDB'READ);                     <<03722>>06920000
                                                                        06922000
       SIOP(BRANCHPT) := DXFERCP;                                       06924000
                                                                        06926000
     END;                                                               06928000
$PAGE                                                                   06930000
<<---------------------------------------------------->>                06932000
<<                                                    >>                06934000
<<   WRITE WITH 3-VECTOR ADDRESS [FUNCTION CODE = 90] >>                06936000
<<                                                    >>                06938000
<<   COUNT - TRANSFER COUNT                           >>                06940000
<<   BANK & BUFFADDR - CONTAINS DATA FOR WRITE        >>                06942000
<<   P1 - CYLINDER ADDRESS                            >>                06944000
<<   P2 - HEAD/SECTOR ADDRESS                         >>                06946000
<<                                                    >>                06948000
<<---------------------------------------------------->>                06950000
                                                                        06952000
     BEGIN                                                              06954000
                                                                        06956000
       << P1 = IOQP(QPAR1) >>                                           06958000
       << P2 = IOQP(QPAR2) >>                                           06960000
                                                                        06962000
       SET'BYTE'COUNT;                                                  06964000
                                                                        06966000
       SIOP(DXFER1) := 14;   << CDB BYTE COUNT >>                       06968000
                                                                        06970000
       IF COUNT=0 THEN   << NO TRANSFER COUNT >>                        06972000
                                                                        06974000
         BEGIN                                                          06976000
           SIOP(DXFER5) := 0;   << BYPASS EXEC MSG >>                   06978000
           SIOP(DXFER6) := 5;   << JUMP *+5 >>                          06980000
         END                                                            06982000
                                                                        06984000
       ELSE   << SET UP EXECUTING MESSAGE >>                            06986000
                                                                        06988000
         BEGIN                                                          06990000
           SIOP(DXFER7) := WRT'EXEC'SEC;                                06992000
           SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>               06994000
           SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>               06996000
           SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>       06998000
         END;                                                           07000000
                                                                        07002000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>07004000
                                                                        07006000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'3'VEC);                 <<03722>>07008000
       SIOPB(CDB'AREA'BYTE+2 , 0);                             <<03722>>07010000
       SIOPB(CDB'AREA'BYTE+3 , IOQP(QPAR1).(0:8));             <<03722>>07012000
       SIOPB(CDB'AREA'BYTE+4 , IOQP(QPAR1).(8:8));             <<03722>>07014000
       SIOPB(CDB'AREA'BYTE+5 , IOQP(QPAR2).(0:8));             <<03722>>07016000
       SIOPB(CDB'AREA'BYTE+6 , 0);                             <<03722>>07018000
       SIOPB(CDB'AREA'BYTE+7 , IOQP(QPAR2).(8:8));             <<03722>>07020000
                                                                        07022000
       SIOPB(CDB'AREA'BYTE+8 , CDB'SET'LENGTH);                <<03722>>07024000
       SIOPB(CDB'AREA'BYTE+9 , 0);                             <<03722>>07026000
       SIOPB(CDB'AREA'BYTE+10 , 0);                            <<03722>>07028000
       SIOPB(CDB'AREA'BYTE+11 , COUNT.(0:8));                  <<03722>>07030000
       SIOPB(CDB'AREA'BYTE+12 , COUNT.(8:8));                  <<03722>>07032000
       SIOPB(CDB'AREA'BYTE+13 , CDB'WRITE);                    <<03722>>07034000
                                                                        07036000
       SIOP(BRANCHPT) := DXFERCP;                                       07038000
                                                                        07040000
     END;                                                               07042000
$PAGE                                                                   07044000
<<---------------------------------------------------->>                07046000
<<                                                    >>                07048000
<<   INITIATE UTILITY [FUNCTION CODE = 91]            >>                07050000
<<                                                    >>                07052000
<<   COUNT - EXECUTING MESSAGE LENGTH                 >>                07054000
<<   BANK & BUFFADDR - CONTAINS UTILITY BYTE COUNT    >>                07056000
<<                     WITH UTILITY PARAMETER BYTES   >>                07058000
<<                     TO FOLLOW (OPTIONAL).          >>                07060000
<<   BANK & BUFFADDR+10 - RETURNS UTILITY DATA        >>                07062000
<<                        INFORMATION (OPTIONAL).     >>                07064000
<<   P1 - 0 NO EXECUTING MESSAGE                      >>                07066000
<<      - 1 SEND EXECUTING MESSAGE TO THE DEVICE      >>                07068000
<<      - 2 RECEIVE EXECUTING MESSAGE FROM DEVICE     >>                07070000
<<   P2 - UTILITY NUMBER                              >>                07072000
<<                                                    >>                07074000
<<  *NOTE:  SEE CS'80 DRIVER REQ CODE DOCUMENTATION   >>                07076000
<<          FOR A MORE THOROUGH DESCRIPTION           >>                07078000
<<                                                    >>                07080000
<<---------------------------------------------------->>                07082000
                                                                        07084000
     BEGIN                                                              07086000
                                                                        07088000
       << P1 = IOQP(QPAR1) >>                                           07090000
       << P2 = IOQP(QPAR2) >>                                           07092000
                                                                        07094000
       IF NOT (0 <= IOQP(QPAR1) <= 2) THEN   << WRONG EXECUTION >>      07096000
         GOTO INVALIDFUNC;                   <<  MSG QUALIFIER  >>      07098000
                                                                        07100000
       SET'BYTE'COUNT;                                                  07102000
                                                                        07104000
       IF (1 <= IOQP(QPAR1) <= 2) AND COUNT=0 THEN << NO COUNT >>       07106000
         GOTO INVALIDFUNC;                                              07108000
                                                                        07110000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>07112000
       SIOPB(CDB'AREA'BYTE+1 , CDB'NOP);                       <<03722>>07114000
       SIOPB(CDB'AREA'BYTE+2 ,CDB'INIT'UTIL+IOQP(QPAR1).(8:8));<<03722>>07116000
       SIOPB(CDB'AREA'BYTE+3 , IOQP(QPAR2).(8:8));             <<03722>>07118000
                                                                        07120000
       IF IOQP(QPAR1) <> 1 THEN   << FETCH UTIL PARM BYTES >>           07122000
         BEGIN                                                          07124000
           TOS := BUFFADDRD;                                            07126000
           ASSEMBLE (LSEA);                                             07128000
           INDEX := TOS;   << #UTIL PARM BYTES >>                       07130000
           IF <> THEN                                                   07132000
             BEGIN                                                      07134000
               IF INDEX > 18 THEN   << EXCEED MAX BYTES ALLOW >>        07136000
                 GOTO INVALIDFUNC;                                      07138000
               PARM := INDEX/2;   << #UTIL PARM WRDS >>                 07140000
               IF (INDEX MOD 2) = 1 THEN   << HAVE ODD BYTE? >>         07142000
                 PARM := PARM + 1;   << #WORDS TO MOVE >>               07144000
               TOS := 0;   << DESTINATION - CDB AREA >>                 07146000
               TOS := @SIOP + SYSDB + CDB'AREA'WRD+2;                   07148000
               TOS := BANK;   << SOURCE >>                              07150000
               TOS := BUFFADDR+1;                                       07152000
               TOS := PARM;  << #WORDS TO MOVE >>                       07154000
               ASSEMBLE (MABS);   << MOVE USING ABS ADDR >>             07156000
            END;                                                        07158000
         END;                                                           07160000
                                                                        07162000
       CASE IOQP(QPAR1) OF                                              07164000
                                                                        07166000
         BEGIN                                                          07168000
                                                                        07170000
           BEGIN   << NO EXEC MSG >>                                    07172000
                                                                        07174000
             SIOP(DIAG1) := 4 + INDEX;                                  07176000
             SIOP(BRANCHPT) := DIAGCP;                                  07178000
                                                                        07180000
           END;                                                         07182000
                                                                        07184000
           BEGIN   << SEND EXEC MSG TO DEVICE >>                        07186000
                                                                        07188000
             SIOP(DXFER1) := 4;                                         07190000
             SIOP(DXFER7) := WRT'EXEC'SEC;                              07192000
             SIOP(DXFER8) := COUNT;   << EXEC MSG COUNT >>              07194000
             SIOP(DXFER10).(8:8) := BANK;                               07196000
             SIOP(DXFER11) := BUFFADDR;                                 07198000
             SIOP(BRANCHPT) := DXFERCP;                                 07200000
                                                                        07202000
           END;                                                         07204000
                                                                        07206000
           BEGIN   << RECEIVE EXEC MSG FROM DEVICE >>                   07208000
                                                                        07210000
             SIOP(DXFER1) := 4 + INDEX;                                 07212000
             SIOP(DXFER7) := READ'EXEC'SEC;                             07214000
             SIOP(DXFER8) := COUNT;   << EXEC MSG COUNT >>              07216000
             SIOP(DXFER10).(8:8) := BANK;                               07218000
             SIOP(DXFER11) := BUFFADDR+10;                              07220000
             SIOP(BRANCHPT) := DXFERCP;                                 07222000
                                                                        07224000
           END;                                                         07226000
                                                                        07228000
         END;                                                           07230000
                                                                        07232000
     END;                                                               07234000
$PAGE                                                                   07236000
<<---------------------------------------------------->>                07238000
<<                                                    >>                07240000
<<   CLEAR DEVICE [FUNCTION CODE = 92]                >>                07242000
<<                                                    >>                07244000
<<---------------------------------------------------->>                07246000
                                                                        07248000
     BEGIN                                                              07250000
                                                                        07252000
       SIOP(DIAG3) := %4401;   << SEL DEV CLR W/PARITY ENABLED >>       07254000
       SIOP(DIAG4) := 0;                                                07256000
                                                                        07258000
       SIOP(BRANCHPT) := DIAGCP + 3;                                    07260000
                                                                        07262000
     END;                                                               07264000
$PAGE                                                                   07266000
<<---------------------------------------------------->>                07268000
<<                                                    >>                07270000
<<   CANCEL TRANSACTION [FUNCTION CODE = 93]          >>                07272000
<<                                                    >>                07274000
<<---------------------------------------------------->>                07276000
                                                                        07278000
     BEGIN                                                              07280000
                                                                        07282000
       SIOP(DIAG) := WRT'TRANS'SEC;                                     07284000
       SIOP(DIAG1) := 1;                                                07286000
                                                                        07288000
       SIOPB(CDB'AREA'BYTE , CDB'CANCEL);                      <<03722>>07290000
                                                                        07292000
       SIOP(BRANCHPT) := DIAGCP;                                        07294000
                                                                        07296000
     END;                                                               07298000
$PAGE                                                                   07300000
<<---------------------------------------------------->>                07302000
<<                                                    >>                07304000
<<   PARITY CHECKING [FUNCTION CODE = 94]             >>                07306000
<<   P1 - 0 (DISABLE PARITY CHECKING)                 >>                07308000
<<      - 1 (ENABLE PARITY CHECKING)                  >>                07310000
<<                                                    >>                07312000
<<---------------------------------------------------->>                07314000
                                                                        07316000
     BEGIN                                                              07318000
                                                                        07320000
       << P1 = IOQP(QPAR1) >>                                           07322000
                                                                        07324000
       IF NOT (0 <= IOQP(QPAR1) <= 1) THEN                              07326000
         GOTO INVALIDFUNC;                                              07328000
                                                                        07330000
       SIOP(DIAG) := WRT'TRANS'SEC;                                     07332000
       SIOP(DIAG1) := 2;                                                07334000
       SIOP(DIAG5) := 0;   << BYPASS WAIT & DSJ >>                      07336000
       SIOP(DIAG6) := 5;                                                07338000
                                                                        07340000
       SIOPB(CDB'AREA'BYTE , CDB'PARITY'OP);                   <<03722>>07342000
       SIOPB(CDB'AREA'BYTE+1 , IF IOQP(QPAR1)=0 THEN           <<03722>>07344000
         0 ELSE 1);    << ENABLE OR DISABLE PARITY CHECK >>    <<03722>>07346000
                                                                        07348000
       SIOP(BRANCHPT) := DIAGCP;                                        07350000
                                                                        07352000
     END;                                                               07354000
                                                                        07356000
     END;   << OF CASE STATEMENT >>                                     07358000
                                                                        07360000
$PAGE                                                                   07362000
<<---------------------------------------------------->>                07364000
<<                                                    >>                07366000
<<   START CHANNEL PROGRAM SECTION                    >>                07368000
<<                                                    >>                07370000
<<---------------------------------------------------->>                07372000
                                                                        07374000
  START'CHANP:                                                          07376000
                                                                        07378000
     CPVAP := 0;   << CLEAR CHANNEL STATUS WORD >>                      07380000
     START'HPIB(DITP,SIOP,TRUE);                                        07382000
                                                                        07384000
     IF > THEN   << SIO FAILURE >>                             <<03722>>07386000
       GOTO SIOERROR;                                                   07388000
     IOQP(QMISC).WAITCODE := CMPLTION'WAIT;                             07390000
     MSTATE := INTRPTWAIT;                                              07392000
     RETURN;                                                            07394000
     HELP;   << LINK TO HELP - NEVER GETS EXECUTED >>                   07396000
                                                                        07398000
  END;   << END OF INITIATION SECTION >>                                07400000
                                                                        07402000
$PAGE                                                                   07404000
<<****************************************************>>                07406000
<<                                                    >>                07408000
<<   CS'80 DRIVER CONTINUATOR SECTION                 >>                07410000
<<                                                    >>                07412000
<<****************************************************>>                07414000
                                                                        07416000
  CONTINUATOR:                                                          07418000
                                                                        07420000
     IF DITP(DSTAT) = -1 THEN   << SYSTEM POWERFAIL >>                  07422000
       BEGIN                                                            07424000
         DITP(DSTAT) := 0;                                              07426000
         IOQP(QMISC).SYS'PFAIL'FLG := 1;                                07428000
         GOTO RETRY'REQUEST;                                            07430000
       END;                                                             07432000
                                                                        07434000
     IF CPVAP.ERRORCODE=6 OR    <<  DMA ABORT    >>                     07436000
       CPVAP.ERRORCODE=7 THEN   << CHANNEL ABORT >>                     07438000
                                                                        07440000
       BEGIN                                                            07442000
         IF IOQP(QMISC).CHAN'ERR'FLG=3 THEN                             07444000
           IF CPVAP.ERRORCODE=7 AND CPVAP.TIMEDOUT=1 THEN               07446000
             GOTO DRIVE'NOT'READY                              <<03722>>07448000
           ELSE GOTO CHANERROR;                                         07450000
         IOQP(QMISC).CHAN'ERR'FLG :=        << RETRY 3 >>               07452000
           IOQP(QMISC).CHAN'ERR'FLG + 1;    <<  TIMES  >>               07454000
         LOG'CPVAP;                                                     07456000
         CPVAP := 0;                                                    07458000
         SIOP(BRANCHPT) := SYNCDSJCP;                          <<03722>>07460000
         START'HPIB(DITP,SIOP(FIRSTBRANCH),TRUE);              <<03722>>07462000
         IF > THEN                                             <<03722>>07464000
           GOTO SIOERROR;                                               07466000
         IOQP(QMISC).WAITCODE := SYNC'WAIT;                             07468000
         MSTATE := INTRPTWAIT;                                          07470000
         RETURN;                                                        07472000
       END;                                                             07474000
                                                                        07476000
     IF IOQPL.SFAIL THEN   << FAILURE ON DELAYED START I/O >>           07478000
       GOTO SIOERROR;                                                   07480000
                                                                        07482000
<<====================================================>>                07484000
<<                                                    >>                07486000
<<   I/O STATUS INTERROGATION COMPLETION              >>                07488000
<<                                                    >>                07490000
<<====================================================>>                07492000
                                                                        07494000
     IF CPVAP(1).(12:4) = 1 THEN   << STATUS DIAGNOSIS >>               07496000
                                                                        07498000
       BEGIN                                                            07500000
                                                                        07502000
         CPVAP(1).(12:4) := 0;                                          07504000
                                                                        07506000
         IF DITP(FAULT'FIELD).POWER'FAIL THEN                           07508000
           BEGIN                                                        07510000
START'PONCP:                                                   <<03722>>07512000
             SIOP(BRANCHPT) := PONCP;                                   07514000
             << DO THE CLEAR. UNQUEUED STARTSIO >>             <<03722>>07516000
             START'HPIB(DITP,SIOP(FIRSTBRANCH),FALSE);         <<03722>>07518000
             IF > THEN  << SIO FAILURE >>                      <<03722>>07520000
               GOTO SIOERROR;                                  <<03722>>07522000
             IOQP(QMISC).WAITCODE := CMPLTION'WAIT;            <<03722>>07524000
             MSTATE := INTRPTWAIT;                             <<03722>>07526000
             RETURN;                                           <<03722>>07528000
           END;                                                         07530000
                                                                        07532000
         IF FCODE = REQ'STAT OR   << UPDATE LAST STATUS >>              07534000
           FCODE = DIAG'RESULT THEN                                     07536000
                                                                        07538000
           BEGIN                                                        07540000
             SIOP(DESC'AREA+3).NOT'RDY                         <<03722>>07542000
             := DITP(ACCESS'FIELD).NOT'RDY;                    <<03722>>07544000
             GOTO REQ'STAT'CMPLT;                                       07546000
           END;                                                         07548000
                                                                        07550000
         IF IOQPL.DIAGBIT THEN   << DIAGNOSTIC COMPLETION >>            07552000
           GOTO DIAG'STAT'CMPLT;                                        07554000
                                                                        07556000
         IF DITP(ACCESS'FIELD).UNINIT'MEDIA THEN                        07558000
         BEGIN                                                 <<04834>>07560000
                                                               <<04884>>07562000
           GOTO UNINIT'MEDIAERROR;                                      07564000
         END;                                                  <<04834>>07566000
                                                                        07568000
         IF DITP(ID'FIELD).UNIT'ATTN <> %377 AND                        07570000
            DITP(ID'FIELD).UNIT'ATTN <> %17 AND                         07572000
            DITP(ID'FIELD).UNIT'ATTN <> 0 THEN                          07574000
            GOTO UNITERROR;                                             07576000
                                                                        07578000
         IF DITP(REJECT'FIELD).CHAN'PARITY OR                           07580000
            DITP(REJECT'FIELD).ILLEG'OPCODE OR                          07582000
            DITP(REJECT'FIELD).MOD'ADDR'ERR OR                          07584000
            DITP(REJECT'FIELD).PARM'BOUND OR                            07586000
            DITP(REJECT'FIELD).ILLEG'PARM OR                            07588000
            DITP(REJECT'FIELD).MSG'SEQ'VIOL OR                          07590000
            DITP(REJECT'FIELD).MSG'LEN'DIFF OR                          07592000
                                                                        07594000
            DITP(FAULT'FIELD).CROSS'UNIT OR                             07596000
            DITP(FAULT'FIELD).OPER'REL'REQRD OR                         07598000
            DITP(FAULT'FIELD).DIAG'REL'REQRD OR                         07600000
            DITP(FAULT'FIELD).CTRL'FAULT OR                    <<03722>>07602000
            DITP(FAULT'FIELD).UNIT'FAULT OR                    <<03722>>07604000
            DITP(FAULT'FIELD).DIAG'FAILED OR                   <<03722>>07606000
                                                                        07608000
            DITP(ACCESS'FIELD).ILLEG'PAR'OPER OR                        07610000
            DITP(ACCESS'FIELD).NO'DATA'FOUND OR                         07612000
            DITP(ACCESS'FIELD).END'OF'FILE THEN                <<04884>>07614000
            BEGIN                                                       07618000
              IF IOQP(QMISC).RETRY'COUNT=7 THEN                <<04834>>07620000
                GOTO UNITERROR;                                         07622000
              IOQP(QMISC).RETRY'COUNT :=                       <<04834>>07624000
                IOQP(QMISC).RETRY'COUNT + 1;                   <<03722>>07626000
              IF DITP(REJECT'FIELD).MSG'SEQ'VIOL AND                    07628000
                IOQP(QMISC).SYS'PFAIL'FLG=1 THEN                        07630000
                GOTO RETRY'REQUEST;                                     07632000
              LOG'STATUS;                                               07634000
              GOTO RETRY'REQUEST;   << RETRY STATUS >>                  07636000
            END;                    << ERROR ONCE   >>                  07638000
                                                                        07640000
<<------------------------------------------------>>                    07642000
<<     DRIVE WAS WRITE PROTECTED                  >>                    07644000
<<------------------------------------------------>>                    07646000
                                                                        07648000
         IF DITP(ACCESS'FIELD).WRT'PROTECT THEN                         07650000
           BEGIN                                                        07652000
             IOQP(QMISC).UNLOAD'RING'FLG := 1;                          07654000
             SIOP(DIAG1) := 2;         << BYTE COUNT >>                 07656000
             SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);              <<03722>>07658000
             SIOPB(CDB'AREA'BYTE+1 , CDB'UNLOAD);              <<03722>>07660000
             SIOP(BRANCHPT) := DIAGCP;                                  07662000
                                                                        07664000
             IF NOT IOMESSAGE(1,NO'RING,%10000,DITP(DLDEV).DLDEVN,      07666000
                              ,,,,OPCONSOLE) THEN                       07668000
               GOTO SYSERROR ;                                          07670000
                                                                        07672000
             GOTO START'CHANP;                                          07674000
           END;                                                         07676000
                                                                        07678000
                                                                        07682000
         IF DITP(FAULT'FIELD).RETRANSMIT THEN                           07684000
           BEGIN                                                        07686000
             IF IOQP(QMISC).RETRY'COUNT=7 THEN                 <<04834>>07688000
               GOTO UNITERROR;                                          07690000
             IOQP(QMISC).RETRY'COUNT :=                        <<04834>>07692000
               IOQP(QMISC).RETRY'COUNT +1;                     <<04834>>07694000
             GOTO RETRY'REQUEST;                                        07696000
           END;                                                         07698000
                                                                        07700000
         IF DITP(ACCESS'FIELD).NO'SPARE'AVAIL THEN                      07702000
          BEGIN                                                <<04834>>07704000
                                                               <<04884>>07706000
            GOTO NO'SPARE'ERROR;                                        07708000
          END;                                                 <<04834>>07710000
                                                                        07712000
         IF DITP(REJECT'FIELD).ADDR'BOUND OR                            07714000
            DITP(ACCESS'FIELD).END'OF'VOLUME THEN                       07716000
          BEGIN                                                <<04834>>07718000
                                                               <<04884>>07720000
            GOTO INVALIDADR;                                            07722000
          END;                                                 <<04834>>07724000
                                                                        07726000
<<---------------------------------------------------->>                07728000
<<   RELEASE REQUEST/REQUIRED HANDLING:               >>                07730000
<<---------------------------------------------------->>                07732000
                                                                        07734000
         IF DITP(FAULT'FIELD).INT'MAINT'REQRD OR                        07736000
            DITP(INFOR'FIELD).OPER'REL'REQST OR                         07738000
            DITP(INFOR'FIELD).DIAG'REL'REQST OR                         07740000
            DITP(INFOR'FIELD).INT'MAINT'REQST THEN                      07742000
                                                                        07744000
            BEGIN                                                       07746000
                                                               <<03667>>07748000
              IF FCODE=VERIFY AND                              <<03667>>07750000
                DITP(ACCESS'FIELD).UNRECOV'DATA THEN           <<03667>>07752000
                                                               <<03667>>07754000
                BEGIN                                          <<03667>>07756000
                  TOS := BUFFADDRD;                            <<03667>>07758000
                  TOS := DITP(PARM'FIELD+1);    <<BAD BLK>>    <<03667>>07760000
                  TOS := DITP(PARM'FIELD+2);  <<ADDRESS>>      <<03667>>07762000
                  ASSEMBLE (SDEA);                             <<03667>>07764000
                  DITP(DBADXFER) := 0;                         <<03667>>07766000
                  IOQP(QMISC).VER'ERR'FLG := 1;                <<03667>>07768000
                END;                                           <<03667>>07770000
                                                               <<03667>>07772000
              SIOP(DIAG) := WRT'CMD'SEC;                                07774000
              SIOP(DIAG1) := 2;   << CDB BYTE COUNT >>                  07776000
              SIOP(DIAG3) := %2000;                                     07778000
              SIOP(DIAG4) := @SIOP + SYSDB + CDB'AREA'WRD;              07780000
              SIOP(DIAG5) := %1000;                                     07782000
              SIOP(DIAG6) := 0;                                         07784000
              SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT + CTRL'UNIT); <<03722>>07786000
                                                                        07788000
              SIOPB(CDB'AREA'BYTE+1 ,                          <<03722>>07790000
                IF DITP(FAULT'FIELD).INT'MAINT'REQRD OR                 07792000
                   DITP(INFOR'FIELD).INT'MAINT'REQST OR                 07794000
                   DITP(INFOR'FIELD).OPER'REL'REQST AND                 07796000
                   DITP(ACCESS'FIELD).DEV'NOT'RDY OR                    07798000
                   DITP(INFOR'FIELD).OPER'REL'REQST AND                 07800000
                   DITP(DMISC).LOCK'FLG <> 1 THEN                       07802000
                     CDB'RELEASE                                        07804000
                   ELSE                                                 07806000
                     CDB'RELEASE'DENY);                        <<03722>>07808000
                                                                        07810000
              IF DITP(INFOR'FIELD).OPER'REL'REQST THEN                  07812000
                IOQP(QMISC).OPER'REQ'FLG := 1;                          07814000
              IF DITP(FAULT'FIELD).INT'MAINT'REQRD THEN                 07816000
                IOQP(QMISC).IM'FAULT'FLG := 1;                          07818000
              IF DITP(ACCESS'FIELD).DEV'NOT'RDY THEN                    07820000
                IOQP(QMISC).LOAD'FLG := 1;                              07822000
                                                                        07824000
              SIOP(BRANCHPT) := DIAGCP;   << SCHEDULE RELEASE >>        07826000
              START'HPIB(DITP,SIOP,TRUE); << OR RELEASE DENY  >>        07828000
              IF > THEN                                        <<03722>>07830000
                GOTO SIOERROR;                                          07832000
              IOQP(QMISC).WAITCODE := REL'WAIT;                         07834000
              MSTATE := INTRPTWAIT;                                     07836000
              RETURN;                                                   07838000
            END;                                                        07840000
                                                                        07842000
<<---------------------------------------------------->>                07844000
<<   DRIVE NOT READY - SCHEDULE IDLE CP UNTIL READY   >>                07846000
<<---------------------------------------------------->>                07848000
DRIVE'NOT'READY:                                               <<03722>>07850000
                                                                        07852000
         IF DITP(ACCESS'FIELD).DEV'NOT'RDY                     <<03722>>07854000
            OR (CPVAP = CPVA'TIMEOUT) THEN                     <<03722>>07856000
           BEGIN                                                        07858000
             IF FCODE = REQ'STAT THEN GOTO                     <<03722>>07860000
                        REQ'STAT'CMPLT; <<INFORM USER-NOTRDY>> <<03722>>07862000
             IOQP(QMISC).WAITCODE := NOT'RDY'WAIT;                      07864000
IDLE'NOT'READY:    << MUST NOT REFERENCE IOQ BEFORE RETURN >>  <<03722>>07866000
             SIOP(BRANCHPT) := IDLECP;   << SCHEDULE IDLE CP >>         07868000
             IF SYSUP THEN                                              07870000
                                                                        07872000
               BEGIN                                                    07874000
                 LDEVNOTRDY(DITP);   << NOT RDY MSG TO CONSOLE >>       07876000
                 START'HPIB(DITP,SIOP(IDLE'WAIT),FALSE);       <<03722>>07878000
                 IF > THEN                                     <<03722>>07880000
                   GOTO SIOERROR;                                       07882000
                 MSTATE := IF @IOQP=0 THEN REQUESTDONE         <<03722>>07884000
                                      ELSE NOTREADY;           <<03722>>07886000
               END                                                      07888000
                                                                        07890000
             ELSE   << SYSTEM NOT UP - SIODM REJECTS MSTATE 7 >>        07892000
                                                                        07894000
               BEGIN                                                    07896000
                 START'HPIB(DITP,SIOP(IDLE'WAIT),TRUE);        <<03722>>07898000
                 IF > THEN                                     <<03722>>07900000
                   GOTO SIOERROR;                                       07902000
                 MSTATE := IF @IOQP=0 THEN REQUESTDONE         <<03722>>07904000
                                      ELSE INTRPTWAIT;         <<03722>>07906000
               END;                                                     07908000
                                                                        07910000
             RETURN;                                                    07912000
           END;                                                         07914000
                                                                        07916000
<<---------------------------------------------------->>                07918000
<<   DATA NOT RECOVERABLE  >>                                  <<04884>>07920000
<<---------------------------------------------------->>                07922000
                                                                        07924000
         IF DITP(ACCESS'FIELD).UNRECOV'DATA'OV OR                       07926000
            DITP(ACCESS'FIELD).UNRECOV'DATA THEN               <<04834>>07928000
                                                               <<04834>>07930000
                                                                        07932000
           BEGIN                                                        07934000
             DITP(DBADBLK1) := DITP(PARM'FIELD+1);   << BAD BLK >>      07936000
             DITP(DBADBLK2) := DITP(PARM'FIELD+2);   << ADDRESS >>      07938000
             DITP(DBADXFER) := SIOP(DXFER8);       << XFER LEFT >>      07940000
                                                                        07942000
             IF FCODE = VERIFY THEN   << VERIFY FUNCTION >>             07944000
               BEGIN                                                    07946000
                 TOS := BUFFADDRD;                                      07948000
                 TOS := DDITP(DDBADBLK);                                07950000
                 ASSEMBLE (SDEA);   << RETURN BAD SECTOR ADDR >>        07952000
                 GOTO TRKSCTERROR;                                      07954000
               END;                                                     07956000
           END;                                                <<04884>>07958000
                                                                        07960000
<<---------------------------------------------------->>                07964000
<<   LOG INFORMATIONAL STATUS                         >>                07966000
<<---------------------------------------------------->>                07968000
                                                                        07970000
         IF DITP(INFOR'FIELD).MEDIA'WEARING OR                          07972000
            DITP(INFOR'FIELD).DEF'BLK'SPARE OR                          07974000
            DITP(INFOR'FIELD).MARGINAL'DATA OR                          07976000
            DITP(INFOR'FIELD).RECOV'DATA'OV OR                          07978000
            DITP(INFOR'FIELD).RECOV'DATA OR                             07980000
            DITP(INFOR'FIELD).MAINT'TRK'OV THEN                         07982000
            LOG'STATUS;                                                 07984000
                                                                        07986000
<<---------------------------------------------------->>                07988000
<<   MAINTENANCE TRK OV - SCHEDULE LOGGING PROCESS    >>                07990000
<<---------------------------------------------------->>                07992000
                                                                        07994000
         IF DITP(INFOR'FIELD).MAINT'TRK'OV THEN                         07996000
           MAINT'REQUEST(DITP(DLDEV).DLDEVN,TYPE,SUBTYPE);              07998000
                                                                        08000000
       END;                                                             08002000
                                                                        08004000
<<====================================================>>                08006000
<<                                                    >>                08008000
<<   POWER ON COMPLETION                              >>                08010000
<<                                                    >>                08012000
<<====================================================>>                08014000
                                                                        08016000
     IF CPVAP(1).(12:4) = 2 THEN   << PON - REDO IOQ >>                 08018000
       BEGIN                                                            08020000
         CPVAP(1).(12:4) := 0;                                          08022000
         IF IOQPL.DIAGBIT THEN   << DIAG REQUEST >>                     08024000
           GOTO DIAG'PON'CMPLT                                          08026000
         ELSE                                                           08028000
           GOTO RETRY'REQUEST;                                          08030000
       END;                                                             08032000
                                                                        08034000
<<====================================================>>                08036000
<<                                                    >>                08038000
<<   PROBLEM INTERROGATING STATUS                     >>                08040000
<<                                                    >>                08042000
<<====================================================>>                08044000
                                                                        08046000
     IF CPVAP(1).(12:4) = 3 THEN   << RETRY ONCE >>                     08048000
       BEGIN                                                            08050000
         CPVAP(1).(12:4) := 0;                                          08052000
         IF IOQP(QMISC).RSTAT'FAIL'FLG=1 THEN                           08054000
           GOTO UNITERROR;   << RETRY FAILED >>                         08056000
         IOQP(QMISC).RSTAT'FAIL'FLG := 1;                               08058000
         SIOP(BRANCHPT) := RSTATCP;   << RETRY READ STATUS >>           08060000
         START'HPIB(DITP,SIOP,TRUE);                                    08062000
         IF > THEN                                             <<03722>>08064000
           GOTO SIOERROR;                                               08066000
         MSTATE := INTRPTWAIT;                                          08068000
         RETURN;                                                        08070000
       END;                                                             08072000
                                                                        08074000
<<====================================================>>                08076000
<<                                                    >>                08078000
<<   POWER ON REQUIRING DEVICE CLEAR COMPLETION       >>                08080000
<<                                                    >>                08082000
<<====================================================>>                08084000
                                                                        08086000
     IF CPVAP(1).(12:4) = 4 THEN   << ISSUE DEV CLR >>                  08088000
       BEGIN                                                            08090000
         CPVAP(1).(12:4) := 0;                                          08092000
         SIOP(BRANCHPT) := PONCP;                                       08094000
         GOTO START'PONCP;                                     <<03722>>08096000
       END;                                                             08098000
                                                                        08100000
<<====================================================>>                08102000
<<                                                    >>                08104000
<<   NOT READY COMPLETION                             >>                08106000
<<                                                    >>                08108000
<<====================================================>>                08110000
                                                                        08112000
     IF IOQP(QMISC).WAITCODE = NOT'RDY'WAIT THEN                        08114000
       GOTO RETRY'REQUEST;                                              08116000
                                                                        08118000
<<====================================================>>                08120000
<<                                                    >>                08122000
<<   RELEASE/RELEASE DENIED COMPLETION                >>                08124000
<<                                                    >>                08126000
<<====================================================>>                08128000
                                                                        08130000
     IF IOQP(QMISC).WAITCODE = REL'WAIT THEN                            08132000
       BEGIN                                                            08134000
         IF IOQP(QMISC).OPER'REQ'FLG = 1 AND                            08136000
           IOQP(QMISC).LOAD'FLG <> 1 AND                                08138000
           DITP(DMISC).LOCK'FLG = 1 THEN                                08140000
                                                                        08142000
           BEGIN                                                        08144000
             IF SYSDISC=1 THEN INDEX := SYS'DENY'MSG                    08146000
               ELSE INDEX := NSYS'DENY'MSG;                             08148000
             IF NOT IOMESSAGE(1,INDEX,%10000,                           08150000
               DITP(DLDEV).DLDEVN,,,,,OPCONSOLE) THEN                   08152000
               GOTO SYSERROR;                                           08154000
           END;                                                         08156000
                                                                        08158000
         IF (FCODE=INIT'MEDIA OR FCODE=VERIFY) AND             <<03667>>08160000
           IOQP(QMISC).IM'FAULT'FLG <> 1 THEN                  <<03667>>08162000
                                                               <<03667>>08164000
           BEGIN                                               <<03667>>08166000
             IF FCODE=VERIFY AND                               <<03667>>08168000
               IOQP(QMISC).VER'ERR'FLG=1 THEN                  <<03667>>08170000
               GOTO TRKSCTERROR                                <<03667>>08172000
             ELSE GOTO GOODXFER;                               <<03667>>08174000
           END;                                                <<03667>>08176000
                                                                        08178000
         GOTO RETRY'REQUEST;                                            08180000
       END;                                                             08182000
<<====================================================>>                08184000
<<                                                    >>                08186000
<<           NO WRITE RING COMPLETION                 >>                08188000
<<                                                    >>                08190000
<<====================================================>>                08192000
                                                                        08194000
       IOQP(QMISC).UNLOAD'RING'FLG := 0;                                08196000
       IF <> THEN                                                       08198000
         BEGIN                                                          08200000
           IOQP(QSTAT).IOSTAT := RING'WAIT;                             08202000
           MSTATE := OPINTRVNWAIT;                                      08204000
           RETURN                                                       08206000
         END;                                                           08208000
                                                                        08210000
<<====================================================>>                08214000
<<                                                    >>                08216000
<<   DRIVER/FIRMWARE SYNCHRONIZATION COMPLETION       >>                08218000
<<                                                    >>                08220000
<<====================================================>>                08222000
                                                                        08224000
     IF IOQP(QMISC).WAITCODE = SYNC'WAIT THEN                           08226000
       GOTO RETRY'REQUEST;                                              08228000
                                                                        08230000
<<====================================================>>                08232000
<<                                                    >>                08234000
<<   FUNCTION DEPENDENCIES COMPLETION                 >>                08236000
<<                                                    >>                08238000
<<====================================================>>                08240000
                                                                        08242000
<<---------------------------------------------------->>                08244000
<<   STATUS RETURN & DESCRIBE COMPLETION              >>                08246000
<<---------------------------------------------------->>                08248000
                                                                        08250000
  REQ'STAT'CMPLT:                                                       08252000
                                                                        08254000
     IF FCODE = REQ'STAT OR                                             08256000
       FCODE = DIAG'RESULT OR                                           08258000
       FCODE = DESCRIBE THEN                                            08260000
                                                                        08262000
       BEGIN                                                            08264000
         COUNT := IOQP(QWBCT);                                          08266000
         IF < THEN   << MAKE WORD COUNT >>                              08268000
           COUNT := (1-COUNT)/2;                                        08270000
                                                                        08272000
         IF CPVAP=CPVA'TIMEOUT THEN                            <<03722>>08274000
            SIOP(DESC'AREA+3).NOT'RDY := 1;   << SET NOT RDY >><<03722>>08276000
         IF (FCODE = REQ'STAT OR FCODE = DIAG'RESULT) AND               08278000
           COUNT > 10 THEN COUNT := 10;   << MAX 10 WRDS >>             08280000
                                                                        08282000
         IF FCODE = DESCRIBE AND COUNT > 18 THEN                        08284000
           COUNT := 18;   << MAX 18 WORDS OF DESCRIBE >>                08286000
                                                                        08288000
         TOS := BANK;   << USER'S AREA >>                               08290000
         TOS := BUFFADDR;                                               08292000
         TOS := 0;      << DESCRIBE AREA >>                             08294000
         TOS := @SIOP + SYSDB + DESC'AREA;                              08296000
         TOS := COUNT;  << #WORDS TO MOVE >>                            08298000
         ASSEMBLE (MABS);                                               08300000
       END;                                                             08302000
                                                                        08304000
<<---------------------------------------------------->>                08306000
<<   REQUEST VOLUME LIMIT COMPLETION                  >>                08308000
<<---------------------------------------------------->>                08310000
                                                                        08312000
     IF FCODE=REQ'VOL'LIMIT THEN                                        08314000
       BEGIN                                                            08316000
         IF IOQP(QPAR1)=0 THEN   << SNGL VECTOR ADDR >>                 08318000
                                                                        08320000
           BEGIN                                                        08322000
             CLDA1 := SIOP(WRD'SNGL'VEC'LIMIT+1);              <<03722>>08324000
                                                               <<03722>>08326000
             CLDA2 := SIOP(WRD'SNGL'VEC'LIMIT+2);              <<03722>>08328000
                                                               <<03722>>08330000
           END                                                          08332000
                                                                        08334000
         ELSE   << THREE VECTOR ADDR >>                                 08336000
                                                                        08338000
           BEGIN                                                        08340000
             CLDA1 := SIOP(WRD'THREE'VEC'LIMIT);               <<03722>>08342000
                                                               <<03722>>08344000
             CLDA2 := SIOP(WRD'THREE'VEC'LIMIT+2);             <<03722>>08346000
                                                               <<03722>>08348000
           END;                                                         08350000
                                                                        08352000
         TOS := BUFFADDRD;                                              08354000
         TOS := CLDA1;   << VOLUME LIMIT >>                             08356000
         TOS := CLDA2;                                                  08358000
         ASSEMBLE (SDEA);   << STORE DBL WORD >>                        08360000
       END;                                                             08362000
                                                                        08364000
<<---------------------------------------------------->>                08366000
<<   IDENTIFY COMPLETION                              >>                08368000
<<---------------------------------------------------->>                08370000
                                                                        08372000
     IF FCODE=IDENTIFY THEN                                             08374000
       BEGIN                                                            08376000
         TOS := BUFFADDRD;                                              08378000
         TOS := SIOP(IDENT1);  << DEVICE ID >>                          08380000
         ASSEMBLE (SSEA);                                               08382000
       END;                                                             08384000
                                                                        08386000
                                                                        08388000
$PAGE                                                                   08390000
                                                                        08392000
  GOODXFER:                                                             08394000
     IOQP(QSTAT).IOSTAT := GOODIO;                                      08396000
     GOTO EXIT;                                                         08398000
                                                                        08400000
  CHANERROR:                                                            08402000
     IOQP(QSTAT).IOSTAT := CHANFAIL;                                    08404000
     IF NOT IOQPL.DIAGBIT THEN LOG'CPVAP;                               08406000
     CPVAP := 0;                                                        08408000
     GOTO EXIT;                                                         08410000
                                                                        08412000
  DIAG'STAT'CMPLT:                                                      08414000
     IOQP(QSTAT).IOSTAT := STAT'REQRD;                                  08416000
     GOTO EXIT;                                                         08418000
                                                                        08420000
  DIAG'PON'CMPLT:                                                       08422000
     IOQP(QSTAT).IOSTAT := DEVICE'PON;                                  08424000
     GOTO EXIT;                                                         08426000
                                                                        08428000
  INVALIDFUNC:                                                          08430000
     IOQP(QSTAT).IOSTAT := INVALIDOP;                                   08432000
     GOTO EXIT;                                                         08434000
                                                                        08436000
  INVALIDADR:                                                           08438000
     IOQP(QSTAT).IOSTAT := INVALIDSKADR;                                08440000
     LOG'STATUS;                                               <<04884>>08442000
     GOTO EXIT;                                                         08444000
                                                                        08446000
  NO'SPARE'ERROR:                                                       08448000
     IOQP(QSTAT).IOSTAT := NO'SPARE'ERR;                                08450000
     LOG'STATUS;                                               <<04884>>08452000
     GOTO EXIT;                                                         08454000
                                                                        08456000
  TRKSCTERROR:                                                          08458000
     IOQP(QSTAT).IOSTAT := TRKSCTERR;                                   08460000
     LOG'STATUS;                                               <<04884>>08462000
     GOTO EXIT;                                                         08464000
                                                                        08466000
  SIOERROR:                                                             08468000
     IOQP(QSTAT).IOSTAT := SIOFAIL;                                     08470000
     LOG'STATUS;                                               <<04884>>08472000
     GOTO EXIT;                                                         08474000
                                                                        08476000
  SYSERROR:                                                             08478000
     IOQP(QSTAT).IOSTAT := SYSERR;                                      08480000
     LOG'STATUS;                                               <<04884>>08482000
     GOTO EXIT;                                                         08484000
                                                                        08486000
  TIMEOUT:                                                              08488000
     IOQP(QSTAT).IOSTAT := TIMOUTERR;                                   08490000
     IF NOT IOQPL.DIAGBIT THEN LOG'CPVAP;                               08492000
     CPVAP := 0;                                                        08494000
     GOTO EXIT;                                                         08496000
                                                                        08498000
  UNITERROR:                                                            08500000
     IOQP(QSTAT).IOSTAT := UNITERR;                                     08502000
     LOG'STATUS;                                               <<04884>>08504000
     GOTO EXIT;                                                         08506000
                                                                        08508000
  UNINIT'MEDIAERROR:                                                    08510000
     IOQP(QSTAT).IOSTAT := UNINIT'MEDIA'ERR;                            08512000
     LOG'STATUS;                                               <<04884>>08514000
     GOTO EXIT;                                                         08516000
                                                                        08518000
  EXIT:                                                                 08520000
     SIOP(RSTAT11) := @ISTAT + SYSDB;                          <<03667>>08522000
     UPDATE'XFER'CNT;                                                   08524000
     RETURN'SYSBUF;                                                     08526000
     MSTATE := REQUESTDONE;                                             08528000
                                                                        08530000
  END;   << OF THE CS'80 DISC DRIVER >>                                 08532000
                                                                        08534000
$PAGE                                                                   08536000
   ASSEMBLE(                                                            08538000
     PCAL SIODM;     << MONITOR >>                                      08540000
     PCAL CSDRVR;    << INITIATOR >>                                    08542000
     PCAL CSDRVR;    << COMPLETOR >>                                    08544000
     CON  0;         << NO IO PROCESS >>                                08546000
     PCAL CSINIT;    << INITIALIZATION >>                               08548000
     CON  1;         << ONE INTERRUPT HANDLER >>                        08550000
     PCAL GIP'HPIB); << INTERRUPT HANDLER >>                            08552000
   END.                                                                 08554000
