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