$CONTROL MAP,CODE,USLINIT                                               00010000
<<HIOCTAP0 - MODULE 42>>                                                00015000
<<HP32002C MPE SOURCE C.00.00 >>                                        00020000
<< COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980.           >>  00025000
<<     THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A       >>  00030000
<<     TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR     >>  00035000
<<     STORED IN A RETRIEVAL SYSTEM. COPYING OR OTHER REPRODUCTION  >>  00040000
       OF THIS PROGRAM EXECPT FOR ARCHIVAL PURPOSES IS PROHIBITED   >>  00045000
<<     WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>  00050000
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00055000
$CONTROL PRIVILEGED,UNCALLABLE                                          00060000
$TITLE "CS'80 LINUS DRIVER - HPIB"                                      00065000
$TP                                                                     00070000
<<                                                                      00075000
                                                                        00080000
                                                                        00085000
        CS'80 Linus Driver 3000 Series - HIOCTAP0                       00090000
        ----------------------------------------                        00095000
                                                                        00100000
                                                                        00105000
Structure of HIOCTAP0:                                                  00110000
                                                                        00115000
HIOCTAP0, together with the SIO Device Monitor (SIODM) constitute a     00120000
standard MPE Type 1 I/O Driver/Monitor.  This means that it does not    00125000
run in its own process, but executes on any stack and therefore must    00130000
run to completion.  During initialization it executes on PROGEN's       00135000
stack, during request initiation it executes on ATTACHIO's stack, and   00140000
during interrupt processing it executes on the Interrupt Control        00145000
Stack (ICS).                                                            00150000
                                                                        00155000
HIOCTAP0 consists of a global area, two procedures, and an "outer       00160000
block" which is really a linkage area for INITIAL.  The global area     00165000
contains an array called INITIAL which is comprised of three parts.     00170000
The first part specifies the size of the other two, the unit extract    00175000
instruction, and various parameters which are used by INITIAL.  This    00180000
section is deleted after INITIAL is through with it.  The other two     00185000
parts are the Device Information Table (DIT) and the Channel Program    00190000
area, which is part of the Interrupt Linkage Table (ILT).  INITIAL      00195000
will put each of these items in the area of memory where it belongs.    00200000
The linkage area specifies the procedure labels (P-labels) of the       00205000
associated monitor (SIODM), the request initiator (CSDRVR), the         00210000
request completor (CSDRVR), the initialization procedure (CSINIT,       00215000
called by PROGEN at system startup), and the interrupt handler (GIP).   00220000
                                                                        00225000
                                                                        00230000
Operation of HIOMDSC2:                                                  00235000
                                                                        00240000
The primary working code of HIOCTAP0 is a procedure CSDRVR.  CSDRVR     00245000
is called with six parameters.   Two of these parameters, BANK and      00250000
BUFFADDR, are the absolute buffer address of the data to be processed.  00255000
The other three, DITP, IOQP, and SIOP are pointers to three arrays.     00260000
DITP is a pointer to the Device Information Table which contains        00265000
information about its associated disc drive.  There is one DIT for      00270000
each unit on the controller and they contain information which must     00275000
be saved between I/O requests to the driver.  IOQP is a pointer to the  00280000
Input/Output Table which contains information relevent to the current   00285000
request.  SIOP is a pointer to the first element of the channel pro-    00290000
gram which is actually part of the Interrupt Linkage Table.  The last   00295000
parameter DRTN is the Device Reference Table (DRT) number of the        00300000
device.  These three elements are described in more detail elsewhere    00305000
in this listing.                                                        00310000
                                                                        00315000
CSDRVR is always called by the SIO device monitor (SIODM) and it        00320000
determines the reason for the call by examining the IOQ and the DIT.    00325000
When a new request is initiated, CSDRVR examines the function code      00330000
and parameter fields contained in the IOQ element to determine the      00335000
task that is desired.  The proper command data bytes are then placed    00340000
in the command data buffer and the proper command codes and program     00345000
branches are set up in the channel program and execution is begun.      00350000
                                                                        00355000
Upon completion of the request, an interrupt is generated and CSDRVR    00360000
is again called.  The code checks for current activity in progress,     00365000
and this being the case, branches to the completion section of the      00370000
driver.  Here if necessary, the status words are examined for errors    00375000
and special conditions which might have occurred during the execu-      00380000
tion of the channel program, during the data transfer, or during the    00385000
operation of the disc drive.  These conditions can report special       00390000
notation back to the caller.  A list of the conditions and return       00395000
codes is provided in this listing.                                      00400000
                                                                        00405000
Fix history for HIOCTAP0.                                               00410000
                                                                        00415000
                                                                        00420000
Fix for 7 retries to be done on No Data status returned                 00425000
from the controller; rather than looping forever. (JRK).                00430000
Date fixed 05/12/82                                                     00435000
                                                                        00440000
Fix submitted to take care of count of length 0 for                     00445000
function 14. (JRK) 06/26/82                                             00450000
                                                                        00455000
Fix submitted to log addational status bits.                            00460000
(JRK) 07/08/82                                                          00465000
                                                                        00470000
Fix submitted to do logical add in place of integer add                 00475000
(JRK) 07/25/82                                                          00480000
                                                                        00485000
Fix submitted to no longer consider a return of marginal data           00490000
as a "hard error". (JRK) 08/16/82                                       00495000
                                                                        00500000
Fix submitted to take out code that is specific to discs                00505000
 and to log additional errors. 08/17/82 (JRK)                           00510000
                                                                        00515000
Fix submitted to deal with a status code of unrecoverable               00520000
 data. 11/10/82. (JRK)                                                  00525000
                                                                        00530000
$PAGE                                                                   00535000
                Device Information Table (DIT)                          00540000
                ------------------------------                          00545000
                                                                        00550000
                                                                        00555000
There is one DIT per physical device. If a physical device represents   00560000
more than one logical device, the logical device number is obtained     00565000
from the IOQ element.  For the CS'80 linus controller, there will only  00570000
be one device.  The following diagram shows the DIT used by the CS'80   00575000
linus driver.                                                           00580000
                                                                        00585000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15  MNEMONIC           00590000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00595000
  0|TM|DS|AC|RQ| 0| 0| 0|IO|IA|NO|ST| 0|   STATE   | DFLAG              00600000
   +--+--+--+--+--+--+--+--+--+--+--+--+-----------+                    00605000
  1| SYSDB relative pointer to the DIT for the next| DLINK              00610000
   | device requesting this resource or service    |                    00615000
   +-----------------------------------------------+                    00620000
  2| Current request sysbase index                 | DCURREQP           00625000
   +-----+-----------------+-----------------------+                    00630000
  3| Logical device number                         | DLDEV              00635000
   +-----+-----------------+-----------------------+                    00640000
  4| SYSDB relative pointer to Device Linkage Table| DDLTP              00645000
   +-----------------------------------------------+                    00650000
  5| SYSDB relative pointer to Intrp Linkage Table | DILTP              00655000
   +-----------------------------------------------+                    00660000
  6| DSTAT is -1 when a system powerfail occurred  | DSTAT              00665000
   +-----------------------------------------------+                    00670000
  7| Hardware error status.  Set when the driver   | DSERR              00675000
   | detects an error.  Whenever <>0, the driver   |                    00680000
   | monitor logs an I/O error and clears this word|                    00685000
   +-----------------------------------------------+                    00690000
%10| Sysbase index of first request in queue       | DQHEAD *           00695000
   +-----------------------------------------------+                    00700000
%11| Sysbase index of last request in queue        | DQTAIL *           00705000
   +--+--+-----------------------------+-----------+                    00710000
%12|IOT  |    Physical unit number                 | DUNIT              00715000
   +--+--+-----------------------------+-----------+                    00720000
%13| SYSDB relative ptr to system buffer element   | DSBUFADDR          00725000
   +-----------------------------------------------+                    00730000
%14| High order logical sector address of bad blk  | DBADBLK1           00735000
   +-----------------------------------------------+                    00740000
%15| Low order logical sector address of bad blk   | DBADBLK2           00745000
   +-----------------------------------------------+                    00750000
%16| Byte transfer left when bad block occurred    | DBADXFER           00755000
   +-----------------------------------------------+                    00760000
%17| Hardware logged error status - CPVA (0)       | DLOGERROR          00765000
   +-----------------------------------------------+                    00770000
%20| Channel program aborted relative offset       | DSIOPSTOP          00775000
   +-----------------------------------------------+                    00780000
%21| Disc status (20 bytes)-Logged on status error | DSTATUS            00785000
   +-----------------------------------------------+                    00790000
 . |                     .                         |                    00795000
   +-----------------------------------------------+                    00800000
 . |                     .                         |                    00805000
   +-----------------------------------------------+                    00810000
%32|                                               |                    00815000
   +-----------------------------------------------+                    00820000
%33|LK|IF|                            | SUBSTATE   | DMISC              00825000
   +-----------------------------------------------+                    00830000
                                                                        00835000
DFLAG - Flags and request state                                         00840000
                                                                        00845000
  TM  TERM    - Set if device is a terminal.                            00850000
  DS  DISC    - If TM = 0 and this bit is set then the device is        00855000
                a disc, otherwise device dependent.                     00860000
  AC  ACTIVE  - A monitor is currently servicing this device.           00865000
  RQ  REQUEST - A service request is pending while the monitor is       00870000
                active.                                                 00875000
  IO  IOPROG  - An I/O Channel Program is running for this device.      00880000
  IA  IAK     - An interrupt or response has occurred for this device.  00885000
  NO  NOTRDY  - Go to state %10 after Idle Channel Program is started.  00890000
  ST  STWAIT  - The device monitor is starting an Idle Channel Program  00895000
                for this device.  There is no IOQ associated with this  00900000
                type of request.                                        00905000
  STATE       - State of the device monitor.  Specifies the next action 00910000
                to be taken in SIODM in servicing the request:          00915000
                                                                        00920000
                  0 - start new request                                 00925000
                  1 - not used                                          00930000
                  2 - call driver initiator procedure                   00935000
                  3 - call driver completor procedure                   00940000
                  4 - not used                                          00945000
                  5 - process request completed                         00950000
                  6 - initiate device recognition sequence              00955000
                  7 - start operator intervention wait                  00960000
                %10 - wait for interrupt (operator intervention)        00965000
                      restart at state 0                                00970000
                %11 - wait for data segment freeze, then state 2        00975000
                %12 - wait for driver initiator to be frozen, then      00980000
                      allocate controller (state 2)                     00985000
                %13 - wait for I/O completion interrupt, then state 3   00990000
                %14 - wait for controller, then call driver initiator   00995000
                %15 - not used                                          01000000
                %16 - wait for initiator make present, then state 2     01005000
                %17 - wait for completor make present, then state 3     01010000
                                                                        01015000
DLINK - A SYSDB relative pointer to the next DIT requesting this        01020000
        resource or service.                                            01025000
                                                                        01030000
DCURREQP - A current request sysbase index.                             01035000
                                                                        01040000
DLDEV - Logical device number of this device.                           01045000
                                                                        01050000
DUNIT.(0:2) - I/O system type                                           01055000
                                                                        01060000
          0 - HP3000 Series 2/3                                         01065000
          1 - HP3000 Series 33 (HPIB)                                   01070000
          2 - Unused                                                    01075000
          3 - Unused                                                    01080000
                                                                        01085000
DUNIT.(7:9) - Unit number of this device. Zero if a single unit         01090000
                                                                        01095000
                                                                        01100000
                                                                        01105000
DSTAT - Set to a -1 when a system powerfail has occurred.               01110000
                                                                        01115000
DSERR - Pointer to status to be logged.                                 01120000
                                                                        01125000
        Bits(0:7)  - Number of words to be logged.                      01130000
        Bits(8:15) - Offset relative to DITP(0).                        01135000
                                                                        01140000
DMISC - Device dependent processing flags                               01145000
                                                                        01150000
  LOCK'FLG - Lock flag denoting unload status of the disc volume.       01155000
                                                                        01160000
         0 - Allow operator unload to the volume.                       01165000
         1 - Deny operator unload to the volume.                        01170000
                                                                        01175000
  IGNORE'INT'FLG - Ignore unexpected interrupt flag.                    01180000
                                                                        01185000
  SUBSTATE - Indicates state of the idle channel program:               01190000
                                                                        01195000
         0 - Normal idle channel program wait                           01200000
         1 - Idle request being serviced wait                           01205000
                                                                        01210000
DSBUFADDR - SYSDB relative pointer to the system buffer element         01215000
            used to read the DSCT. Zero, if no element gotten.          01220000
                                                                        01225000
DBADBLK1 - High order logical sector address of the bad block           01230000
           for the Defective Sector Table (DSCT) entry.                 01235000
                                                                        01240000
DBADBLK2 - Low order logical sector address of the bad block for        01245000
           the DSCT entry.                                              01250000
                                                                        01255000
DBADXFER - Byte transfer left when bad block occurred.                  01260000
                                                                        01265000
DLOGERROR - CPVA(0) logged on hardware error status.                    01270000
                                                                        01275000
DSIOPSTOP - Stopped channel program relative offset location due        01280000
            to an error in CPVA(0).                                     01285000
                                                                        01290000
DSTATUS - 20 bytes disc status logged on status error.                  01295000
          (See CS'80 Disc Drive Status).                                01300000
                                                                        01305000
                                                                        01310000
                                                                        01315000
Caution:  * Since the "C" MIT, word %10 and %11 of the DIT for          01320000
            disc devices have been used for DQHEAD and DQTAIL           01325000
            pointers for disc request queues. Word %10 is also          01330000
            used by the timer procedure to hold a timer request         01335000
            index (DTRLX). Unless word %10 of the DIT is freed          01340000
            up in a future MIT, timers cannot be implemented on         01345000
            any disc drivers.                                           01350000
                                                                        01355000
$PAGE                                                                   01360000
                   QUEUE ELEMENT (IOQ)                                  01365000
            --------------------------------                            01370000
                                                                        01375000
                                                                        01380000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          01385000
   +-----------------------------------------------+                    01390000
  0|      Request dependent flags (see below)      |   QFLAG            01395000
   +-----------------------------------------------+                    01400000
  1|      Request urgency class                    | QURGCLASS          01405000
   +-----------------------+-----------------------+                    01410000
  2|     Logical device number                     | QLDEV              01415000
   +-----+--+--+--+--------+--+--+-----+-----------+                    01420000
  3|CHANF|RS|OP|IM| RETRY  |LF|SP|WP:  | WAITCODE  |   QMISC            01425000
   +-----+--+--+--+--------+--+--+-----+-----------+                    01430000
  4| S|   DST   (If process disc I/O)              |   QDSCTN           01435000
   |- - - - - - - - - - - - - - - - - - - - - - - -|                    01440000
   |      DST   (If segment transfer) [S=Stack]    |                    01445000
   +--+--------------------------------------------+                    01450000
  5| Offset in the data seg (If process disc I/O)  |   QADDR            01455000
   |- - - - - - - - - - - - - - - - - - - - - - - -|                    01460000
   | Address in Bank (If segment transfer)         |                    01465000
   +-----------------------+-----------------------+                    01470000
  6| Unit number           | Function code for     | QFUNC              01475000
   |                       | this request.         |                    01480000
   +-----------------------+-----------------------+                    01485000
  7| On initiation, specifies the word count (>0)  |   QWBCT            01490000
   | or byte count (<0).  At completion of the     |                    01495000
   | request this location contains the actual     |                    01500000
   | transmission count in the same units (bytes   |                    01505000
   | or words) as in the request.                  |                    01510000
   +-----------------------------------------------+                    01515000
%10| P1 - Parameter 1 (Usually High Order of       |   QPAR1            01520000
   | Current Logical Disc Address [CLDA1])         |                    01525000
   +-----------------------------------------------+                    01530000
%11| P2 - Parameter 2 (Usually Low Order of        |   QPAR2            01535000
   | Current Logical Disc Address [CLDA2])         |                    01540000
   +-----------------------+--------------+--------+                    01545000
%12|                       |  QUALIFIER   | STATUS | QSTAT              01550000
   +-----------------------+--------------+--------+                    01555000
%13| PCB number                                    | QPCB               01560000
   +-----------------------------------------------+                    01565000
%14| Sysbase relative indx of previous req in queue| QPREVREQP          01570000
   +-----------------------------------------------+                    01575000
%15| Sysbase relative indx of next req in queue    | QNEXTREQP          01580000
   +-----------------------------------------------+                    01585000
%16|        Segidentifier (if segment transfer     | QSEGIDENT          01590000
   +-----------------------------------------------+                    01595000
%17| Displacement of read or wrt from seg base (MM)| QSEGDISP           01600000
   +-----------------------------------------------+                    01605000
%20|S |////////////////////////////////////////////|                    01610000
   |W |////////////////////////////////////////////|                    01615000
   |A |////////////////////////////////////////////|                    01620000
   |P |////////////////////////////////////////////|                    01625000
   +-----------------------------------------------+                    01630000
                                                                        01635000
QFLAG - Request dependent flags                                         01640000
                                                                        01645000
  Bit 0  ABORT     - Request has been aborted externally.               01650000
  Bit 1  MMREQ     - Request is for a segment transfer.                 01655000
  Bit 2  DIAG      - This is a request from the diagnostic subsystem.   01660000
  Bit 3  SBUF      - Target is an index relative to the SBUF Table of   01665000
                     the data buffer.                                   01670000
  Bit 4  IOWAKE    - Wake caller on completion of request.              01675000
  Bit 5  BLOCKED   - Blocked I/O.  The caller is waited in ATTACHIO     01680000
                     until the request is completed.  Implies IOWAKE.   01685000
  Bit 6  COMPLETED - The request has been completed and the caller      01690000
                     awakened if he had requested (with IOWAKE).        01695000
  Bit 7  DATAFRZN  - Data segment has been present and is frozen.       01700000
  Bit 8  MAMERRORD - An error has occurred while MAM was trying to      01705000
                     make the target data segment present and freeze    01710000
                     it in memory.                                      01715000
  Bit 9  PREQUEUED - Request is queued into disc's request queue        01720000
  Bit 10 SFAIL     - Delayed failure of SIO instruction.  If a call     01725000
                     to STARTIO resulted in the request being added     01730000
                     to the channel queue, this bit indicates that      01735000
                     the SIO instruction failed when the request was    01740000
                     selected for execution.                            01745000
  Bit 11 PFAIL     - The request was aborted because of a system        01750000
                     power failure.                                     01755000
  Bit 12 CURREQ    - Request is device's current request.               01760000
  Bit 13 DISABLED  - Request is disabled.                               01765000
  Bit 14 DISATMPT  - Attempt to disable this request.                   01770000
  Bit 15 MSGDONE   - A message request reply has completed.             01775000
                                                                        01780000
QLDEV.QLDEVN - Logical Device Number                                    01785000
                                                                        01790000
QMISC - Driver request dependent flags and counters.                    01795000
                                                                        01800000
  CHAN'ERR'FLG   - Channel error retry flag.                            01805000
  RSTAT'FAIL'FLG - Request status failed flag.                          01810000
  OPER'REQ'FLG   - Operator requested release flag.                     01815000
  IM'FAULT'FLG   - Internal maintenance fault flag.                     01820000
                                                                        01825000
  RETRY'COUNT      Retry count area.                                    01830000
  LOAD'FLG       - Media load flag.                                     01835000
  SYS'PFAIL'FLG  - System powerfail flag.                               01840000
  VER'ERR'FLG    - Verify error flag.                                   01845000
  UNLOAD'RIN'FLG - unload due to no write ring                          01850000
                                                                        01855000
  WAITCODE       - Indicates type of wait:                              01860000
                                                                        01865000
                   0 - new request                                      01870000
                   1 - completion wait                                  01875000
                   2 - not ready wait                                   01880000
                   3 - release/release deny wait                        01885000
                   4 - IOQ defer wait                                   01890000
                   5 - DSCT read wait                                   01895000
                   6 - DSCT write wait                                  01900000
                   7 - synchronization wait                             01905000
                                                                        01910000
                   9 - clear wait dut to IOQ abort                      01915000
QDSTN - If system buffer is clear then this is the DST                  01920000
        number of the target data segment. If bit 0 is                  01925000
        set then buffer address is a DB offset value                    01930000
        instead of segment relative offset (implemented                 01935000
        for NOWAIT I/O and NOBUFF).                                     01940000
                                                                        01945000
QADDR - Offset in data segment or system buffer table to                01950000
        target data buffer.                                             01955000
                                                                        01960000
QFUNC - Function code and qualifiers as specified by                    01965000
        driver.                                                         01970000
                                                                        01975000
QSTAT - PCB number and request completion status.                       01980000
                                                                        01985000
  PCBN    - The Process Control Block (PCB) number of the process       01990000
            which made this request.  If zero, the request is not       01995000
            associated with any process and the IOQ element is to       02000000
            be returned by the system when the request has completed.   02005000
                                                                        02010000
  STATUS  - General status indicating the final state of the request.   02015000
                                                                        02020000
            0 - Not started or awaiting completion.                     02025000
            1 - Successful completion.                                  02030000
            2 - End-of-file detected.                                   02035000
            3 - Unusual, but recoverable, condition detected.           02040000
            4 - Irrecoverable error has occurred.                       02045000
                                                                        02050000
  QUALIFIER - A code which further defines or qualifies the general     02055000
              status.  (See the section Driver Return Status Codes.)    02060000
$PAGE                                                                   02065000
                Interrupt Linkage Table (ILT)                           02070000
                -----------------------------                           02075000
                                                                        02080000
                                                                        02085000
There is one ILT for each device controller configured on the system.   02090000
A controller may support more than one unit, however the CS'80 linus    02095000
driver will only concern itself with the single unit controller.        02100000
                                                                        02105000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          02110000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    02115000
  0|         Channel                               |   ICPVA0           02120000
  1|              Program                          |   ICPVA1           02125000
  2|                  Variable                     |   ICPVA2           02130000
  3|                       Area (ICPVA)            |   ICPVA3           02135000
   +-----------------------------------------------+                    02140000
  4|         DMA Abort                             |   ICPVA4           02145000
  5|              Address                          |   ICPVA5           02150000
   +-----------------------------------------------+                    02155000
  6|                      0                        |   ISRQL            02160000
   +--+-----------------+-----+-----------+--------+                    02165000
  7|LI|     CHANQUE     |     |   CHAN    |  DEV   |   ICNTRL           02170000
   +--+-----------------+-----+-----------+--------+                    02175000
%10| SYSDB relative pointer to channel program area|   ISIOP            02180000
   +-----------------------------------------------+                    02185000
%11| SYSDB relative pointer to idle status area    |   ISTAP            02190000
   +-----------------------------------------------+                    02195000
%12| single instruction that is executed to extract|   IUNIT            02200000
   | the device unit number from the status pointed|                    02205000
   | to by ISTAP. [Since only Unit 0 exists on the |                    02210000
   | CS'80 discs, ANDI 0 is used to return Unit 0] |                    02215000
   +-----------------------------------------------+                    02220000
%13| SYSDB relative DIT pointer of the device      |   ICDP             02225000
   | currently using the channel to perform a      |                    02230000
   | data operation.                               |                    02235000
   +-----------------------+-----------------------+                    02240000
%14|       SIOPSIZE        |        CQUEN          |   IQUEUE           02245000
   +--+--+--+--------------+-----------+-----------+                    02250000
%15|RW|WP|IG|                          |  HCUNIT   |   IFLAG            02255000
   +--+--+--+--------------------------+-----------+                    02260000
%16| SYSDB relative DIT pointer for unit 0         |   IDITP0           02265000
   +-----------------------------------------------+                    02270000
%17| 20 bytes status area for idle channel program |   ISTAT            02275000
   +-----------------------------------------------+                    02280000
 . |                    .                          |                    02285000
   +-----------------------------------------------+                    02290000
 . |                    .                          |                    02295000
   +-----------------------------------------------+                    02300000
%31|             CS'80 Linus                       |                    02305000
   .               Channel                         .                    02310000
   |               Program                         |                    02315000
   +-----------------------------------------------+                    02320000
                                                                        02325000
                                                                        02330000
ICPVA0 - Channel Program Variable Area                                  02335000
                                                                        02340000
  The first word is used by the channel program processor to store      02345000
  status information after I/O channel aborts.  The next word is used   02350000
  by the driver to indicate if status should be examined for special    02355000
  conditions or errors.  The other two words are not used.              02360000
                                                                        02365000
                                                                        02370000
ICPVA4 - DMA abort address                                              02375000
                                                                        02380000
  If a DMA abort occurs, the absolute address where the abort occurred  02385000
  is stored in this area.                                               02390000
                                                                        02395000
                                                                        02400000
ICNTRL - Contains controller information                                02405000
                                                                        02410000
  LIM     - If this bit is set, the controller is sharing a software    02415000
            channel resource in order to limit bandwidth.               02420000
  CHANQUE - The software channel resource number.                       02425000
  CHAN    - Channel number (four most significant bits of DRTN).        02430000
  DEV     - Device number (three least significant bits of DRTN).       02435000
                                                                        02440000
                                                                        02445000
IQUEUE -                                                                02450000
                                                                        02455000
  SIOPSIZE - (number of words + 1)/2 in the channel program area.       02460000
  CQUEN    - For a multi-unit controller this field contains the        02465000
             software controller resource number.                       02470000
                                                                        02475000
                                                                        02480000
IFLAG - Controller and Channel Program state flags                      02485000
                                                                        02490000
  RUNWAIT  - An Idle Channel Program should be started when there       02495000
             are no active requests to process.                         02500000
  WAITPROG - An Idle Channel Program has been started for this          02505000
             controller.  This bit is reset by an interrupt.            02510000
  IGNOREHI - An HIOP instruction has been issued against this con-      02515000
             troller but the channel program was not in a wait          02520000
             statement.  Therefore ignore the interrupt generated by    02525000
             the channel code when this program halts.                  02530000
  HCUNIT   - Highest configured unit number for this controller.        02535000
                                                                        02540000
ISTAT - 20 bytes of status from the idle channel program.               02545000
                                                                        02550000
                                                                        02555000
            Device Reference Table DRT                                  02560000
            --------------------------                                  02565000
                                                                        02570000
There is one DRT per device controller.  The contents of this           02575000
table are used for processing interrupts.                               02580000
                                                                        02585000
     Word 0  SIOP   - Absolute address of the current I/O               02590000
                      instruction in execution.                         02595000
     Word 1  DBI    - Absolute address of the base of the ILT           02600000
                      for this controller.                              02605000
     Word 2  PLABEL - The external program label of the interrupt       02610000
                      service routine for this controller.              02615000
     Word 3  CHAN   - Contains channel program status information       02620000
                      which is used by the channel program interpreter. 02625000
$PAGE                                                                   02630000
         CS'80 Linus Driver Request Codes                               02635000
         -------------------------------                                02640000
                                                                        02645000
OPERATION            FUNCTION    PARAMETERS                             02650000
---------            --------    ----------                             02655000
                                                                        02660000
 Read                     0      Read Data Record                       02665000
                                                                        02670000
                                 Count - Transfer count                 02675000
                                                                        02680000
                                 Bank & Buffaddr contains               02685000
                                 data read.                             02690000
                                                                        02695000
                                 P1,P2 - Dbl wrd logical                02700000
                                         sector address                 02705000
                                                                        02710000
 Write                    1      Write Data Record                      02715000
                                                                        02720000
                                 Count - Transfer count                 02725000
                                                                        02730000
                                 Bank & Buffaddr contains               02735000
                                 data for write.                        02740000
                                                                        02745000
                                 P1,P2 - Dbl wrd logical                02750000
                                         sector address                 02755000
                                                                        02760000
 File Open                2      No Action Taken                        02765000
                                                                        02770000
 File Close               3      No Action Taken                        02775000
                                                                        02780000
 Device Close             4      No Action Taken                        02785000
                                                                        02790000
 Fill With Zeros          5      Fill specified Logical                 02795000
                                 sector address with zeros.             02800000
                                                                        02805000
                                 Count - Transfer count                 02810000
                                                                        02815000
                                 P1,P2 - Dbl wrd logical                02820000
                                         sector address                 02825000
                                                                        02830000
 Fill With Blanks         6      Fill specified Logical                 02835000
                                 sector address with blanks.            02840000
                                                                        02845000
                                 Count - Transfer count                 02850000
                                                                        02855000
                                 P1,P2 - Dbl wrd logical                02860000
                                         sector address                 02865000
                                                                        02870000
 Request Status           7      Request Disc Status                    02875000
                                                                        02880000
                                 Count - Transfer count                 02885000
                                         (max 20 bytes)                 02890000
                                                                        02895000
                                 Bank & Buffaddr returns                02900000
                                 the status.                            02905000
                                                                        02910000
 Initialize Media         8      Initialize Disc Media                  02915000
                                                                        02920000
                                 P1 - Initialize Options                02925000
                                      [0=Retain factory,                02930000
                                         field spares]                  02935000
                                      [1=Retain factory                 02940000
                                         spares only]                   02945000
                                 P2 - Block Interleave                  02950000
                                      byte (binary number)              02955000
                                                                        02960000
 Unload Cartridge         9      Unloads Tape Cartridge                 02965000
                                                                        02970000
                                                                        02975000
 Write Disc Label        11      Write Label to Sector 0.               02980000
                                                                        02985000
                                 Count - Label count                    02990000
                                                                        02995000
                                 Bank & Buffaddr contains               03000000
                                 label info. to be written.             03005000
                                                                        03010000
                                 P1,P2 - Dbl wrd logical                03015000
                                         sector address.                03020000
                                                                        03025000
 Request Volume Limit    13      Return max volume address.             03030000
                                                                        03035000
                                 Bank & Buffaddr returns                03040000
                                 dbl wrd of logical sector              03045000
                                 address or cylinder,head/              03050000
                                 sector address of the                  03055000
                                 maximum volume limit.                  03060000
                                                                        03065000
                                 P1 - 0 Return the single               03070000
                                        vector address                  03075000
                                                                        03080000
                                    - 1 Return the three                03085000
                                        vector address                  03090000
                                                                        03095000
 Verify                  14      Verify Disc Media                      03100000
                                                                        03105000
                                 Count - Verify length                  03110000
                                 Count - 0 Verify entire                03115000
                                           disc                         03120000
                                                                        03125000
                                 Bank & Buffaddr returns                03130000
                                 dbl wrd logical sector                 03135000
                                 address of 1st bad sector              03140000
                                 encountered (on error).                03145000
                                                                        03150000
                                 P1,P2 - Dbl wrd logical                03155000
                                         sector address                 03160000
                                         to begin doing                 03165000
                                         verification.                  03170000
                                                                        03175000
Request Status           15      Request Disc Status                    03180000
                                 (See Function Code 7)                  03185000
                                                                        03190000
Lock                     16      Lock private volume,                   03195000
                                 serial & foreign disc                  03200000
                                 disabling the unload                   03205000
                                 capability.                            03210000
                                                                        03215000
Unlock                   17      Unlock private volume,                 03220000
                                 serial & foreign disc                  03225000
                                 enabling the unload                    03230000
                                 capability.                            03235000
                                                                        03240000
 Read lock bit           18      Reads The Lock Bit                     03245000
                                                                        03250000
                                 Bank & Buffaddr returns                03255000
                                 The State Of The Dits                  03260000
                                 Lock Flag.                             03265000
                                                                        03270000
                                                                        03275000
                                                                        03280000
[                                   ]                                   03285000
[ Note:  Count = (+) denotes #words ]                                   03290000
[              = (-) denotes #bytes ]                                   03295000
[                                   ]                                   03300000
$PAGE                                                                   03305000
         CS'80 Disc Driver Diagnostics Request Codes*                   03310000
         --------------------------------------------                   03315000
                                                                        03320000
OPERATION            FUNCTION    PARAMETERS                             03325000
---------            --------    ----------                             03330000
                                                                        03335000
Identify                 72      Bank & Buffaddr contains               03340000
                                 Device ID returned.                    03345000
                                                                        03350000
Initiate Diagnostic      73      Init Internal Diagnostic               03355000
(Selftest Initiate)                                                     03360000
                                 P1 - 2 bytes loop count                03365000
                                      (#times to do diag)               03370000
                                 P2 - Diagnostic section#               03375000
                                                                        03380000
Diagnostic Result        74      [A Request Status will                 03385000
(Selftest Result)                return the diagnostic                  03390000
                                 result should the diag-                03395000
                                 nostic fail].                          03400000
                                                                        03405000
Loopback Write           75      Count - Transfer count                 03410000
                                                                        03415000
                                 Bank & Bankaddr contains               03420000
                                 loopback data for write.               03425000
                                 Data sequence must begin               03430000
                                 with a Hex FF and each                 03435000
                                 byte which follows must                03440000
                                 equals its predecessor+1               03445000
                                                                        03450000
Loopback Read            76      Count - Transfer count                 03455000
                                                                        03460000
                                 Bank & Buffaddr contains               03465000
                                 loopback data read.                    03470000
                                                                        03475000
GENERAL PURPOSE CMD      77      Count - #Command bytes                 03480000
                                                                        03485000
                                 Bank & Buffaddr contains               03490000
                                 the command data bytes to              03495000
                                 be sent thru the command               03500000
                                 and reporting msg phase.               03505000
                                                                        03510000
Describe                 78      Count - Describe length                03515000
                                                                        03520000
                                 Bank & Buffaddr returns                03525000
                                 with the describe data.                03530000
                                                                        03535000
Release                  79      Release Disc                           03540000
                                                                        03545000
Release Denied           80      Prohibits Disc Release                 03550000
                                                                        03555000
Set Release              81      Set Disc Release                       03560000
                                                                        03565000
                                 P1 - 1 Suppress release                03570000
                                        timeout [T bit=1]               03575000
                                 P2 - 1 Release automatically           03580000
                                        during idle time                03585000
                                        [Z bit=1]                       03590000
                                                                        03595000
Set Address              82      Bank & Buffaddr contains               03600000
                                 dbl wrd of logical sector              03605000
                                 address or cylinder,head/              03610000
                                 sector address.                        03615000
                                                                        03620000
                                 P1 - 0 Address is a single             03625000
                                        vector address                  03630000
                                                                        03635000
                                 P1 - 1 Address is a three              03640000
                                        vector address                  03645000
                                                                        03650000
Set Block Displacement   83      Block offset added to the              03655000
                                 the current address.                   03660000
                                                                        03665000
                                 P1,P2 - Dbl wrd logical                03670000
                                         sector address.                03675000
                                                                        03680000
Set Mask Status          84      Bank & Buffaddr contains               03685000
                                 8 bytes of bit positions               03690000
                                 corresponding to status                03695000
                                 error bits.                            03700000
                                                                        03705000
Set Ret Addressing Mode  85      P1 - 0 Single vector mode              03710000
                                    - 1 Three vector mode               03715000
                                                                        03720000
Set Retry Time           86      Set Disc Retry Time                    03725000
                                                                        03730000
                                 P1 - Time in 10's of msecs.            03735000
                                      [0 denotes no retries]            03740000
                                                                        03745000
Set RPS                  87      Set Rotational Position                03750000
                                 Sensing                                03755000
                                                                        03760000
                                 P1 - Time to target in 100's           03765000
                                      of microseconds                   03770000
                                 P2 - Window size in 100's              03775000
                                      of microseconds                   03780000
                                                                        03785000
Spare Block              88      Spare a Block                          03790000
                                                                        03795000
                                 Bank & Buffaddr contains               03800000
                                 dbl wrd of logical sector              03805000
                                 address or cylinder,head/              03810000
                                 sector address of the                  03815000
                                 block to be spared.                    03820000
                                                                        03825000
                                 P1 - 0 Address is single               03830000
                                        vector                          03835000
                                    - 1 Address is three                03840000
                                        vector                          03845000
                                                                        03850000
                                 P2 - 0 Spare retaining                 03855000
                                        data without                    03860000
                                        target sector                   03865000
                                    - 1 Spare without                   03870000
                                        retaining data                  03875000
                                    - 4 Spare retaining                 03880000
                                        data with target                03885000
                                        sector                          03890000
                                                                        03895000
Read with 3-vector Addr  89      Read record at the three               03900000
                                 vector disc address.                   03905000
                                                                        03910000
                                 Count - Transfer count                 03915000
                                                                        03920000
                                 Bank & Buffaddr contains               03925000
                                 the data read.                         03930000
                                                                        03935000
                                 P1 - Cylinder address                  03940000
                                 P2 - Head/Sector address               03945000
                                                                        03950000
Write with 3-vector Addr 90      Write record at the three              03955000
                                 vector disc address.                   03960000
                                                                        03965000
                                 Count - Transfer count                 03970000
                                                                        03975000
                                 Bank & Buffaddr contains the           03980000
                                 data to be written.                    03985000
                                                                        03990000
                                 P1 - Cylinder address                  03995000
                                 P2 - Head/Sector address               04000000
                                                                        04005000
Initiate Utility         91     ----------------------------            04010000
                                |Case 1: No Exec Message   |            04015000
                                |                          |            04020000
                                |Count - Not Applicable    |            04025000
                                |Bank & Buffaddr contains: |            04030000
                                |                          |            04035000
                                |Word   0: Util byte cnt[N]|            04040000
                                |Word 1-N: Util parm bytes |            04045000
                                |          if byte cnt <> 0|            04050000
                                |                          |            04055000
                                |P1 - 0 No exec message    |            04060000
                                ----------------------------            04065000
                                                                        04070000
                                ----------------------------            04075000
                                |Case 2: Send Exec Message |            04080000
                                |                          |            04085000
                                |Count - Exec msg length   |            04090000
                                |Bank & Buffaddr contains: |            04095000
                                |                          |            04100000
                                |Word 0-Count: Utility data|            04105000
                                |       bytes to be sent to|            04110000
                                |       the device.        |            04115000
                                |                          |            04120000
                                |P1 - 1 Send exec message  |            04125000
                                ----------------------------            04130000
                                                                        04135000
                                ----------------------------            04140000
                                |Case 3: Rcv Exec Message  |            04145000
                                |                          |            04150000
                                |Count - Exec msg length   |            04155000
                                |Bank & Buffaddr contains: |            04160000
                                |                          |            04165000
                                |Word   0: Util byte cnt[N]|            04170000
                                |Word 1-N: Util parm bytes |            04175000
                                |          if byte cnt <> 0|            04180000
                                |                          |            04185000
                                |Bank & Buffaddr+10 return:|            04190000
                                |                          |            04195000
                                |Word 0-N: Util data infor.|            04200000
                                |          (optional)      |            04205000
                                |                          |            04210000
                                |P1 - 2 Rcv exec message   |            04215000
                                ----------------------------            04220000
                                                                        04225000
                                ----------------------------            04230000
                                |For All Cases]            |            04235000
                                |                          |            04240000
                                |P1 - Exec msg qualifier   |            04245000
                                |P2 - Utility number       |            04250000
                                ----------------------------            04255000
                                                                        04260000
Device Clear             92      Clear Device/Enable Parity             04265000
                                                                        04270000
Cancel                   93      Terminate Transaction                  04275000
                                                                        04280000
Parity Checking          94      HPIB Parity Checking                   04285000
                                                                        04290000
                                 P1 - 0 Disables checking               04295000
                                    - 1 Enables checking                04300000
                                                                        04305000
                                                                        04310000
                                                                        04315000
[                                   ]                                   04320000
[ Note:  Count = (+) denotes #words ]                                   04325000
[              = (-) denotes #bytes ]                                   04330000
[                                   ]                                   04335000
                                                                        04340000
                                                                        04345000
                                                                        04350000
*DIAGNOSTIC FUNCTION:  These functions will be primarily used           04355000
                       by the MPE online diagnostic package.            04360000
                       The diagnostic request bit in the first          04365000
                       word (QFLAG) of the disc request queue           04370000
                       should be set to allow the diagnostic            04375000
                       caller to handle its own status. Other-          04380000
                       wise the driver will assume that it had          04385000
                       been called by an MPE OS module and will         04390000
                       provide for status handling and error            04395000
                       logging to take place.                           04400000
$PAGE                                                                   04405000
                                                                        04410000
CS'80 Disc Drive Status                                                 04415000
-----------------------                                                 04420000
                                                                        04425000
BYTE      STRUCTURE       FIELD                                         04430000
----      ---------       -----                                         04435000
                                                                        04440000
0         VVVVUUUU        ID (VVVV=Volume, UUUU=Unit  )                 04445000
1         SSSSSSSS        ID (S=Unit Requiring Service)                 04450000
                             (         0 - Unit 0     )                 04455000
                             (17 (octal) - Ctrl unit  )                 04460000
                             (   All 1's - No unit    )                 04465000
2-3       RRRRRRRR        Reject Error                                  04470000
4-5       FFFFFFFF        Fault Error                                   04475000
6-7       AAAAAAAA        Access Error                                  04480000
8-9       IIIIIIII        Information Error                             04485000
                                                                        04490000
P1-P10    PPPPPPPP        Ten Parameter Associated Bytes                04495000
                                                                        04500000
Reject Errors Field       Bits  0-15   00A00BCD EFG0H000                04505000
Fault Errors Field        Bits 16-31   0A0B00C0 D0EFG0HI                04510000
Access Errors Field       Bits 32-47   ABCDEF00 GH0IJ000                04515000
Information Errors Field  Bits 48-63   ABCDE00F 0GHI0J00                04520000
                                                                        04525000
                                                                        04530000
Bit Pos.  Bit No.  Usage   [Reject Errors Field]                        04535000
--------  -------  -----                                                04540000
                                                                        04545000
   A           2   Channel Parity Error                                 04550000
   B           5   Illegal Opcode                                       04555000
   C           6   Module Addressing Error                              04560000
   D           7   Address Bounds Error                                 04565000
   E           8   Parameter Bounds Error                               04570000
   F           9   Illegal Parameter                                    04575000
   G          10   Message Sequence Violation                           04580000
   H          12   Message Length Difference                            04585000
                                                                        04590000
                                                                        04595000
Bit Pos.  Bit No.  Usage   [Fault Errors Field]                         04600000
--------  -------  -----                                                04605000
                                                                        04610000
   A          17   Cross-Unit (Linus)                                   04615000
   B          19   Controller Fault                                     04620000
   C          22   Unit Fault                                           04625000
   D          24   Diagnostic Result Failed                             04630000
                   (P1-P6 = 6 bytes result)                             04635000
   E          26   Release Required for Operator Request                04640000
                   (Load/Unload)                                        04645000
                   [Not Set for CS'80 Discs]                            04650000
   F          27   Release Required for Diagnostic Request              04655000
                   (HIO, Selftest)                                      04660000
                   [Not Set for CS'80 Discs]                            04665000
   G          28   Release Required for Internal Maintenance            04670000
                   (Head Alignment, Error Log)                          04675000
   H          30   Power Fail                                           04680000
   I          31   Retransmit/Release Completed                         04685000
                                                                        04690000
                                                                        04695000
Bit Pos.  Bit No.  Usage   [Access Errors Field]                        04700000
--------  -------  -----                                                04705000
                                                                        04710000
   A          32   Illegal Parallel Operation (Not Implemented)         04715000
   B          33   Uninitialized Media                                  04720000
   C          34   No Spares Available                                  04725000
   D          35   Not Ready                                            04730000
   E          36   Write Protect (Linus)                                04735000
   F          37   No Data Found (Linus)                                04740000
   G          40   Unrecoverable Data Overflow                          04745000
   H          41   Unrecoverable Data                                   04750000
                   (P1-P6  = 6 bytes of bad block address)              04755000
   I          43   End of File (Linus)                                  04760000
   J          44   End of Volume                                        04765000
                                                                        04770000
                                                                        04775000
Bit Pos.  Bit No.  Usage   [Information Errors Field]                   04780000
--------  -------  -----                                                04785000
                                                                        04790000
   A          48   Release Request for Operator Request                 04795000
                   (Load/Unload)                                        04800000
   B          49   Release Request for Diagnostic Request               04805000
                   (HIO, Selftest)                                      04810000
   C          50   Release Request for Internal Maintenance             04815000
                   (Head Alignment, Error Log)                          04820000
   D          51   Media Wearing                                        04825000
   E          52   Data Overrun                                         04830000
   F          55   Auto-sparing Invoked (Linus)                         04835000
   G          57   Recoverable Data Overflow                            04840000
   H          58   Marginal Data                                        04845000
                   (P1-P6  = 6 bytes of marginal block address)         04850000
   I          59   Recoverable Data                                     04855000
                   (P1-P6  = 6 bytes of recoverable block address)      04860000
   J          61   Maintenance Track Overflow                           04865000
                                                                        04870000
                                                                        04875000
Parameter Usage:                                                        04880000
----------------                                                        04885000
                                                                        04890000
Byte -->              |  1  2  3  4  5  6       7   8   9   10     |    04895000
                                                                        04900000
No Error              | New Target Address |                       |    04905000
Diagnostic Result (24)| Diagnostic Results |  Device fault log --  |    04910000
Unrecoverable Data(41)| Address of Block   |  except after a Spare |    04915000
Marginal Data     (58)| Address of Block   |  indicate length of   |    04920000
Recoverable Data  (59)| Address of Block   |  unrecoverable field  |    04925000
                                                                        04930000
* SPECIAL NOTE:  Drive status are not pertinent unless a QSTAT 1        04935000
                 occurred prior to taking status.  Driver will          04940000
                 often do a LOC & WRT with zero length to force         04945000
                 the "Not Ready" condition to appear in status.         04950000
$PAGE                                                                   04955000
                 LINUS RELEASE CONSIDERATIONS                           04960000
                  ---------------------------                           04965000
                                                                        04970000
                                                                        04975000
 A.  System Disc:                                                       04980000
                                                                        04985000
     - Release will always be granted for Internal Maintenance          04990000
       requests (Head Alignment, Error Log).                            04995000
                                                                        05000000
     - Release will always be denied for Operator (Load/Unload)         05005000
       and Diagnostic (HIO, Selftest) requests. Formal shutdown         05010000
       procedures are required prior to servicing these requests.       05015000
                                                                        05020000
 B.  Private Volumes, Serial & Foreign Discs:                           05025000
                                                                        05030000
     - Release will always be granted for Internal Maintenance          05035000
       requests (Head Alignment, Error Log).                            05040000
                                                                        05045000
     - Release will always be denied for Diagnostic requests            05050000
       (HIO, Selftest). Release will be denied for Operator             05055000
       (Load/Unload) request when the disc is in a locked               05060000
       state and granted when the disc is in an unlocked state.         05065000
                                                                        05070000
                                                                        05075000
 Note 1:  The HP7911/12 will be supported only as a system              05080000
          disc. It will not be supported as a private volume,           05085000
          serial or foreign disc. The HP7911/12 will not have           05090000
          the operator request (load/unload) and HIO capabilities.      05095000
                                                                        05100000
 Note 2:  On a status return, under the fault error field, the          05105000
          internal maintenance status should be the only status         05110000
          generating a release required. Operator and diagnostic        05115000
          nostic requests generating a release required should          05120000
          never occur and such occurrences will be flagged as           05125000
          errors.                                                       05130000
                                                                        05135000
 Note 3:  Prior to the ABI chip release, an unsolicit reporting         05140000
          message can cause the next transaction to fail due            05145000
          to a parallel poll being generated by the unsolicit           05150000
          reporting message and the next transaction being pro-         05155000
          cessed with the wrong poll. The firmware will handle          05160000
          this by setting the Retransmit/Release Completed bit          05165000
          in the status field, thus resulting in a request retry        05170000
          in the driver. Since the driver does not ever use the         05175000
          auto-release option for release requests, the Release         05180000
          Completed status definition is not applicable to the          05185000
          driver.                                                       05190000
$PAGE                                                                   05195000
                 LINUS LOCK & UNLOCK CONSIDERATIONS                     05200000
                  ---------------------------------                     05205000
                                                                        05210000
                                                                        05215000
     The driver maintains a Lock/Unlock bit in the DIT which            05220000
     is set or cleared when various MPE modules call the driver         05225000
     Lock and Unlock function code. Operator request to unload          05230000
     the volume mounted will be denied when the Lock bit is set         05235000
     and allowed only when the Lock bit is cleared.                     05240000
                                                                        05245000
 A.  System Disc:                                                       05250000
                                                                        05255000
   - Driver Initialization section will lock a system disc.             05260000
     A system disc can only be unloaded after a formal                  05265000
     shutdown.                                                          05270000
                                                                        05275000
 B.  Private Volumes:                                                   05280000
                                                                        05285000
   - These are locked by the PVSYS module at the first logical          05290000
     mount and are unlocked at the last logical dismount.               05295000
                                                                        05300000
 C.  Serial & Foreign Discs:                                            05305000
                                                                        05310000
   - These are locked for each FOPEN to the file and unlocked           05315000
     after each DCLOSE to the file.                                     05320000
                                                                        05325000
                                                                        05330000
 Note:  PVPROC will lock all non-system discs while processing          05335000
        any unexpected interrupts passed to it by DEVREC.               05340000
$PAGE                                                                   05345000
$PAGE                                                                   05350000
                  LOGGING CONSIDERATIONS                                05355000
                  ----------------------                                05360000
                                                                        05365000
                                                                        05370000
 A.  CPVA(0) along with the channel program aborted relative            05375000
     offset is logged for the following reasons:                        05380000
                                                                        05385000
     1)  DMA Abort - DMA transfer aborted by memory errors.             05390000
     2)  Channel Program Execution Error - An error is                  05395000
         detected by the CPP while servicing the channel                05400000
         program.                                                       05405000
                                                                        05410000
 B.  20 bytes of disc status are logged for any errors occur-           05415000
     ring in the status fields. (See CS'80 Disc Drive Status)           05420000
                                                                        05425000
 C.  Logging will not occur for the status Data Overrun since           05430000
     this can occur even under normal operating conditions when         05435000
     there are several high speed devices on more than one GIC.         05440000
                                                                        05445000
 D.  Logging is exempted when the driver is in diagnostics mode.        05450000
                                                                        05455000
                                                                        05460000
                                                                        05465000
                  UNEXPECTED INTERRUPTS HANDLING                        05470000
                  ------------------------------                        05475000
                                                                        05480000
                                                                        05485000
 To avoid processing unexpected interrupts from the CS'80 discs         05490000
 due to Internal Maintenance (ie. error logging and head align-         05495000
 ments), DEVREC will always issue a request status to the driver        05500000
 with DRQ word QPAR1=8 and QPAR2=9 once an unexpected interrupt         05505000
 has occurred. The driver will then return to DEVREC the pattern        05510000
 %101010 for interrupts it wishes DEVREC to ignore or return the        05515000
 first word of status for interrupts it wishes DEVREC to process.       05520000
                                                                        05525000
 Note:  The driver will set the Ignore Interrupt flag in the            05530000
        DIT for all unexpected interrupts except Operator               05535000
        Request Release and Power On condition. The Ignore              05540000
        Interrupt flag will be cleared after returning the              05545000
        ignore pattern to DEVREC's status request.                      05550000
                                                                        05555000
                                                                        05560000
         STATUS CONSIDERATIONS                                          05565000
         ---------------------                                          05570000
                                                                        05575000
While the idle channel program is running, status will be               05580000
read into the ILT table pointed to by ILT(ISTAP). While an              05585000
IOQ is being processed by the driver, status will be read               05590000
into the DIT table. The driver will always reset the read               05595000
status pointer back to the ILT after processing an IOQ                  05600000
request. This is neccesary since SIODM will not call the                05605000
driver to reschedule the idle when the idle has not been                05610000
aborted. This will occur for the driver functions which do not          05615000
execute a START'HPIB (ie. Lock, Unlock, Fopen, etc.)                    05620000
$PAGE                                                                   05625000
                       DRIVER RETURN STATUS CODES                       05630000
                       --------------------------                       05635000
                                                                        05640000
                                                                        05645000
 General Status (13:3)       Qualifying Status (8:5)      Overall (8:8) 05650000
                                                                        05655000
 0 - Pending                1 - Waiting For Completion         %10      05660000
                            3 - Not Ready Wait                 %30      05665000
                                                                        05670000
 1 - Successful             0 - No Errors                       %1      05675000
                                                                        05680000
 3 - Unusual Condition      1 - Status Interrogation Required  %13*     05685000
                          %21 - Device Powered Up             %213*     05690000
                                                                        05695000
 4 - Irrecoverable Error    0 - Invalid Request                 %4      05700000
                            1 - Track/Sector Error             %14      05705000
                            2 - I/O Timed Out Before Complete  %24      05710000
                            4 - SIO Failure                    %44      05715000
                            5 - Unit Failure                   %54      05720000
                            6 - Invalid Disc Address           %64      05725000
                          %12 - System Error                  %124      05730000
                          %14 - Channel Failure               %144      05735000
                          %15 - Uninitialized Media           %154      05740000
                          %16 - No Spares Available           %164      05745000
                                                                        05750000
                                                                        05755000
                                                                        05760000
                                                                        05765000
                                                                        05770000
                                                                        05775000
                                                                        05780000
                                                                        05785000
                                                                        05790000
*Note:  These status are used for diagnostic reporting only.            05795000
                                                                        05800000
                                                                        05805000
                                                                        05810000
                                                                        05815000
                                                                        05820000
                                                                        05825000
                                                                        05830000
                                                                        05835000
                                                                        05840000
>>                                                                      05845000
$PAGE                                                                   05850000
BEGIN                                                                   05855000
$INCLUDE INCLLPDT                                              <<07045>>05860000
$PAGE                                                          <<07045>>05865000
$INCLUDE INCLSBH                                               <<07045>>05870000
$PAGE                                                          <<07045>>05875000
$INCLUDE INCLIOQ                                               <<07045>>05880000
$PAGE                                                          <<07045>>05885000
  EQUATE                                                                05890000
                                                                        05895000
       << CS'80 DISC SUBTYPES >>                                        05900000
                                                                        05905000
    HP7935    =  8,                                                     05910000
    HP7911    =  1,                                                     05915000
    HP7912    =  2,                                                     05920000
    LINUS     =  0,                                                     05925000
                                                                        05930000
       << DITP PARAMETERS >>                                            05935000
                                                                        05940000
    DIT'SIZE  = 28,  << SIZE OF DIT >>                         <<07045>>05945000
    DLDEV     =  3,  << LOGICAL DEVICE >>                      <<07045>>05950000
    DILTP     =  5,  << INTERRUPT LINKAGE TABLE POINTER >>              05955000
    DSTAT     =  6,  << DEVICE POWERFAIL STATUS >>                      05960000
    DSERR     =  7,  << DIT ERROR LOG LENGTH/OFFSET >>                  05965000
    DUNIT     = 10,  << (0:3):= 2 HPIB, (7:9) UNIT >>          <<07045>>05970000
    DSBUFADDR = 11,  << SBUF ELEMENT USED TO READ DSCT >>               05975000
    DBADBLK1  = 12,  << HIGH ORDER ADDR OF BAD SECTOR >>                05980000
    DBADBLK2  = 13,  << LOW ORDER ADDR OF BAD SECTOR >>                 05985000
    DBADXFER  = 14,  << BYTE XFER LEFT AFTER BAD BLK >>                 05990000
    DLOGERROR = 15,  << DIT HARDWARE ERROR LOGGED STATUS >>             05995000
    DSIOPSTOP = 16,  << DIT CP STOPPED RELATIVE OFFSET >>               06000000
    DSTATUS   = 17,  << DISC STATUS-LOGGED ON STATUS ERROR >>           06005000
    DMISC     = 27,  << DEVICE DEPENDENT WORD >>               <<07045>>06010000
                                                                        06015000
    DDBADBLK  =  6,  << DBLWRD OFFSET OF SUSPECT SECTOR >>              06020000
                                                                        06025000
       << IOQP PARAMETERS >>                                            06030000
                                                                        06035000
    QMISC     =  3,  << FLAGS PERTAINING TO THIS REQUEST >>             06040000
    QFUNC     =  6,  << REQUEST FUNCTION CODE >>                        06045000
    QWBCT     =  7,  << +WORD/-BYTE COUNT >>                            06050000
    QPAR1     =  8,  << PARAMETER 1 >>                                  06055000
    QPAR2     =  9,  << PARAMETER 2 >>                                  06060000
    QSTAT     = 10,  << REQUEST STATUS AND PCB NUMBER >>                06065000
                                                                        06070000
       << ILTP PARAMETERS >>                                            06075000
                                                                        06080000
    ICNTRL    =  7,  << DRT WORD >>                            <<07045>>06085000
    ISIOP     =  8,  << CHANNEL PROGRAM AREA POINTER >>                 06090000
    ISTAP     =  9,  << STATUS AREA POINTER >>                          06095000
                                                                        06100000
       << CS'80 SECONDARIES >>                                          06105000
                                                                        06110000
    WRT'CMD'SEC      =   %2005,  << WRT W/CMD MSG SEC >>                06115000
    READ'TRANS'SEC   =   %3402,  << READ W/TRANS MSG SEC >>             06120000
    WRT'TRANS'SEC    =   %4002,  << WRT W/TRANS MSG SEC >>              06125000
    READ'EXEC'SEC    =   %1416,  << READ W/EXEC MSG SEC >>              06130000
    WRT'EXEC'SEC     =   %2016,  << WRT W/EXEC MSG SEC >>               06135000
                                                                        06140000
       << CS'80 DISC DRIVER COMMAND DATA BYTES >>                       06145000
                                                                        06150000
    CDB'BLK'DISPL      =  %22,  << SET BLOCK DISP COMMAND >>            06155000
    CDB'CANCEL         =  %11,  << CANCEL COMMAND >>                    06160000
    CDB'CLEAR          =  %10,  << CLEAR COMMAND >>                     06165000
    CDB'DESCRIBE       =  %65,  << DESCRIBE COMMAND >>                  06170000
    CDB'INIT'DIAG      =  %63,  << INIT DIAGNOSTIC COMMAND >>           06175000
    CDB'INIT'MEDIA     =  %67,  << INITIALIZE MEDIA COMMAND >>          06180000
    CDB'INIT'UTIL      =  %60,  << NO EXECUTING MSG >>                  06185000
    CDB'JUMP'SPARE     =    4,  << JUMP SPARE PARAMETER >>              06190000
    CDB'NOP            =  %64,  << NO OPERATION COMMAND >>              06195000
    CDB'PARITY'OP      =    1,  << PARITY OPCODE COMMAND >>             06200000
    CDB'READ           =    0,  << LOCATE & READ COMMAND >>             06205000
    CDB'READ'LOOPBK    =   %2,  << READ LOOPBACK COMMAND >>             06210000
    CDB'RELEASE        =  %16,  << RELEASE COMMAND >>                   06215000
    CDB'RELEASE'DENY   =  %17,  << RELEASE DENIED COMMAND >>            06220000
    CDB'REQ'STATUS     =  %15,  << REQUEST STATUS COMMAND >>            06225000
    CDB'SET'BURST      =  %74,  << BURST MODE COMMAND >>                06230000
    CDB'SET'LENGTH     =  %30,  << SET LENGTH COMMAND >>                06235000
    CDB'SET'OPTIONS    =  %70,  << SET OPTIONS COMMAND >>               06240000
    CDB'SET'MASK       =  %76,  << SET STATUS MASK CMD >>               06245000
    CDB'SET'RELEASE    =  %73,  << SET RELEASE COMMAND >>               06250000
    CDB'SET'RETADR     = %110,  << SET RET ADDR MODE CMD >>             06255000
    CDB'SET'RETRY      =  %72,  << SET RETRY TIME COMMAND >>            06260000
    CDB'SET'RPS        =  %71,  << SET RPS COMMAND >>                   06265000
    CDB'SET'SNGL'VEC   =  %20,  << SET SNGL VEC ADDR CMD >>             06270000
    CDB'SET'3'VEC      =  %21,  << SET 3 VECTOR ADDR CMD >>             06275000
    CDB'SET'UNIT       =  %40,  << SET UNIT# COMMAND >>                 06280000
    CDB'SET'VOL        = %100,  << SET VOL# COMMAND >>                  06285000
    CDB'SKIP'SPARE     =    6,  << SKIP SPARE PARAMETER >>              06290000
    CDB'SPARE'BLK      =   %6,  << SPARE BLOCK COMMAND >>               06295000
    CDB'UNLOAD         = %112,  << UNLOAD COMMAND >>                    06300000
    CDB'VERIFY         =   %4,  << VERIFY COMMAND >>                    06305000
    CDB'WRITE          =   %2,  << LOCATE & WRITE COMMAND >>            06310000
    CDB'WRT'LOOPBK     =   %3,  << WRITE LOOPBACK COMMAND >>            06315000
                                                                        06320000
       << CHANNEL PROGRAM OFFSETS RELATIVE TO SIOP >>                   06325000
                                                                        06330000
    FIRSTBRANCH   = 7,            << MAIN BRANCH TO SECTIONS >><<03722>>06335000
    BRANCHPT      = FIRSTBRANCH+1, << BRANCH OFFSET >>         <<03722>>06340000
    IDLE          = BRANCHPT+1,    << IDLE CP OFFSET >>        <<03722>>06345000
    IDLE'WAIT     = IDLE+5,        << IDLE WHEN DEV NOT RDY >> <<03722>>06350000
    SYNCDSJ       = IDLE'WAIT+14,  << GET INSYNC W. CS80 CMDS>><<03722>>06355000
    DXFER         = SYNCDSJ+9,      << DATA XFER SEC. OFFSET >><<03722>>06360000
    RSTAT         = DXFER+25,      << READ STATUS OFFSET >>    <<03722>>06365000
    DIAG          = RSTAT+23,     << READ STATUS OFFSET >>     <<03722>>06370000
    PON           = DIAG+14,     << POWER ON OFFSET >>         <<03722>>06375000
    IDENT         = PON+11,     << IDENTIFY SECTION OFFSET >>  <<03722>>06380000
    STAT'CDB      = IDENT+4,   << IDENTIFY SECTION OFFSET >>   <<03722>>06385000
    LOC'WRT'CDB   = STAT'CDB+1, << LOC & WRITE CDB OFFSET >>   <<03722>>06390000
    INITFLG       = LOC'WRT'CDB+4, << INIT FLAG OFFSET >>      <<03722>>06395000
    FILL'WRD      = INITFLG+1,     << FILL WORD OFFSET >>      <<03722>>06400000
    DESC'AREA     = FILL'WRD+1,    << DESCRIBE AREA OFFSET >>  <<03722>>06405000
    CDB'AREA'WRD  = DESC'AREA+10, << CDB STORAGE AREA OFFSET >><<03722>>06410000
    CPGM'SIZE     = CDB'AREA'WRD+10,<< LENGTH OF CHAN PGM >>   <<03722>>06415000
    CPGM'SIZED2   = (CPGM'SIZE+2)/2,<< LEN OF CHAN PGM/2>>     <<03722>>06420000
    INIT'ARY'SIZE = 4+DIT'SIZE+CPGM'SIZE,<< LEN OF INIT ARRAY>><<03722>>06425000
                                                                        06430000
       << CHANNEL PROGRAM ENTRIES & AREA BYTE OFFSET >>                 06435000
                                                                        06440000
    CPBASE        = FIRSTBRANCH+2,   << CP BASE >>             <<03722>>06445000
    IDLECP        = IDLE-CPBASE,     << IDLE CP ENTRY >>                06450000
    IDLE'WAIT'CP  = IDLE'WAIT-CPBASE,<< IDLE WAIT CP ENTRY >>  <<03722>>06455000
    SYNCDSJCP     = SYNCDSJ-CPBASE, << OFFSET FROM FIRST JUMP>><<03722>>06460000
    DXFERCP       = DXFER-CPBASE,    << DATA XFER ENTRY >>              06465000
    RSTATCP       = RSTAT-CPBASE,    << REQUEST STAT ENTRY >>           06470000
    DIAGCP        = DIAG-CPBASE,     << DIAG FUNCTION ENTRY >>          06475000
    PONCP         = PON-CPBASE,      << POWER ON ENTRY >>               06480000
    IDENTCP       = IDENT-CPBASE,    << IDENTIFY ENTRY >>               06485000
                                                                        06490000
    DESC'AREA'BYTE = DESC'AREA*2,    << DESC AREA BYTE OFFST >>         06495000
    CDB'AREA'BYTE  = CDB'AREA'WRD*2, << CDB AREA BYTE OFFST >>          06500000
                                                                        06505000
    SNGL'VEC'LIMIT  = DESC'AREA'BYTE+30,   << SNGL VEC ADDR >>          06510000
    THREE'VEC'LIMIT = DESC'AREA'BYTE+24,   << 3-VEC ADDR >>             06515000
    WRD'SNGL'VEC'LIMIT = SNGL'VEC'LIMIT/2, <<WARNING!!>>       <<03722>>06520000
    WRD'THREE'VEC'LIMIT = THREE'VEC'LIMIT/2,<<WARNING!!>>      <<03722>>06525000
                                                                        06530000
       << CHANNEL PROGRAM SECTIONS OFFSETS >>                           06535000
                                                                        06540000
    IDLE16        = IDLE+16,    << CMD BUFFER ABS ADDR >>      <<03722>>06545000
    DXFER1        = DXFER+1,    << CMD BUFFER LENGTH >>                 06550000
    DXFER4        = DXFER+4,    << CMD BUFFER ABS ADDR >>               06555000
    DXFER5        = DXFER+5,    << WAIT COMMAND >>                      06560000
    DXFER6        = DXFER+6,    << WAIT COMMAND >>                      06565000
    DXFER7        = DXFER+7,    << EXEC MSG SECONDARY >>                06570000
    DXFER8        = DXFER+8,    << #BYTES TO READ/WRT >>                06575000
    DXFER9        = DXFER+9,    << BURST MODE BYTE CONUT >>             06580000
    DXFER10       = DXFER+10,   << DATA BANK >>                         06585000
    DXFER11       = DXFER+11,   << DATA BUFFER ABS ADDR >>              06590000
    DXFER16       = DXFER+16,   << WAIT COMMAND >>                      06595000
    DXFER17       = DXFER+17,   << WAIT COMMAND >>                      06600000
    RSTAT4        = RSTAT+4,    << CMD BUFFER ABS ADDR >>               06605000
    RSTAT11       = RSTAT+11,   << DATA BUFFER ABS ADDR >>              06610000
    DIAG1         = DIAG+1,     << CMD BUFFER LENGTH >>                 06615000
    DIAG3         = DIAG+3,     << CMD BUFFER BANK >>                   06620000
    DIAG4         = DIAG+4,     << CMD BUFFER ABS ADDR >>               06625000
    DIAG5         = DIAG+5,     << WAIT COMMAND >>                      06630000
    DIAG6         = DIAG+6,     << WAIT COMMAND >>                      06635000
    IDENT1        = IDENT+1,    << ID RETURN BYTE ADDR >>               06640000
    IDENT2        = IDENT+2,    << IDENT INT/HLT OR JMP >>              06645000
    IDENT3        = IDENT+3,    << IDENT INT/HLT OR JMP >>              06650000
                                                                        06655000
       << DIT STATUS OFFSET >>                                          06660000
                                                                        06665000
    ID'FIELD      = DSTATUS,    << IDENTIFICATION FIELD >>              06670000
    REJECT'FIELD  = DSTATUS+1,  << REJECT ERRORS FIELD >>               06675000
    FAULT'FIELD   = DSTATUS+2,  << FAULT ERRORS FIELD >>                06680000
    ACCESS'FIELD  = DSTATUS+3,  << ACCESS ERRORS FIELD >>               06685000
    INFOR'FIELD   = DSTATUS+4,  << INFORMATION FIELD >>                 06690000
    PARM'FIELD    = DSTATUS+5,  << PARAMETER FIELD >>                   06695000
                                                                        06700000
       << IDLE CP STATUS OFFSET >>                                      06705000
                                                                        06710000
    I'FAULT'FIELD  = 2,  << IDLE FAULT ERRORS FIELD >>                  06715000
    I'ACCESS'FIELD = 3,  << IDLE ACCESS ERRORS FIELD >>                 06720000
    I'INFOR'FIELD  = 4,  << IDLE INFORMATION FIELD >>                   06725000
    ABORT'WAIT     = 9,  << CLEAR WAIT DUE TO IOQ ABORT >>     <<07045>>06730000
                                                                        06735000
       << COMPLETION STATUS >>                                          06740000
                                                                        06745000
    GOODIO         =    1,  << SUCCESSFUL I/O COMPLETION >>             06750000
    INVALIDOP      =    4,  << INVALID OPERATION REQUESTED >>           06755000
    STAT'REQRD     =  %13,  << STATUS INTERROG REQUIRED >>              06760000
    TRKSCTERR      =  %14,  << UNRECOV TRK/SECTOR ERROR >>              06765000
    TIMOUTERR      =  %24,  << TIMED OUT ERROR >>                       06770000
    RING'WAIT      =  %40,  << NO RING WAIT >>                          06775000
    SIOFAIL        =  %44,  << SIO FAILURE >>                           06780000
    UNITERR        =  %54,  << UNIT FAILURE >>                          06785000
    INVALIDSKADR   =  %64,  << INVALID DISC ADDRESS >>                  06790000
    SYSERR         = %124,  << SYSTEM ERROR >>                          06795000
    CHANFAIL       = %144,  << I/O CHANNEL ERROR >>                     06800000
    UNINIT'MEDIA'ERR=%154,  << UNINITIALIZED MEDIA >>                   06805000
    NO'SPARE'ERR   = %164,  << NO SPARE AVAILABLE >>                    06810000
    DEVICE'PON     = %213,  << DEVICE POWERED ON >>                     06815000
                                                                        06820000
       << DRIVER STATES >>                                              06825000
                                                                        06830000
    CMPLTION'WAIT  = 1,  << WAITING FOR I/O COMPLETION INTRPT >>        06835000
    NOT'RDY'WAIT   = 2,  << NOT READY WAIT IN PROGRESS >>               06840000
    REL'WAIT       = 3,  << REL/REL DENY COMPLETION WAIT >>             06845000
    IOQ'DEFER'WAIT = 4,  << IOQ BEING DEFERRED WAIT >>                  06850000
    DSCT'READ'WAIT = 5,  << DEFECTIVE SECTOR TABLE READ WAIT >>         06855000
    DSCT'WRT'WAIT  = 6,  << DEFECTIVE SECTOR TABLE WRT WAIT >>          06860000
    SYNC'WAIT      = 7,  << DRIVER/FIRMWARE SYNC WAIT >>                06865000
    OPINTRVNWAIT   = 8,  << UNIT NOT READY WAIT FOR OPERATOR >>         06870000
                                                                        06875000
    IDLE'REQ'WAIT  = 1,  << IDLE REQUEST COMPLETION WAIT >>             06880000
                                                                        06885000
       << SIODM STATES >>                                               06890000
                                                                        06895000
    INTRPTWAIT  = %13,  << WAIT FOR I/O COMPLETION >>                   06900000
    NOTREADY    =   7,  << UNIT NOT READY >>                            06905000
    REQUESTDONE =   5,  << REQUEST DONE >>                              06910000
                                                                        06915000
       << IOMESSAGE PARAMETERS >>                                       06920000
                                                                        06925000
    OPCONSOLE      =  0,  << OUTPUT MSG TO SYS CONSOLE >>               06930000
    SYS'DENY'MSG   = 25,  << SYSDISC UNLOAD DENIED MSG >>               06935000
    NSYS'DENY'MSG  = 26,  << NON-SYSDISC UNLOAD DENY MSG >>             06940000
    SYS'DSCT'MSG   = 27,  << SYSDISC DSCT FULL MSG >>                   06945000
    PV'DSCT'MSG    = 28,  << PV DSCT FULL MSG >>                        06950000
    NO'RING        =220,  << NO WRITE RING MESSAGE >>                   06955000
                                                                        06960000
       << MISCELLANEOUS EQUATES >>                                      06965000
                                                                        06970000
    CPVA'TIMEOUT  = %160004,<<CPVA RETURNED IF GIC TIMEOUT>>   <<03722>>06975000
    CTRL'UNIT     = %17,    << CONTROLLER UNIT >>                       06980000
    DESCRIBE      = 22,     << DESCRIBE FUNCTION CODE >>                06985000
    DIAG'RESULT   = 16,     << DIAG RESULT FUNCTION CODE >>             06990000
    DSCT'DADR     = 1,      << DSCT DISC ADDRESS >>                     06995000
    DSCT'SIZE     = 256,    << #BYTES IN DSCT >>                        07000000
    INIT'MEDIA     = 8,       << FORMAT FUNCTION CODE >>       <<03667>>07005000
    IDENTIFY      = 16,     << IDENTIFY FUNCTION CODE >>                07010000
    MAX'DESC'BYTE = 37,     << MAX# DESCRIBE BYTES >>                   07015000
    REQ'STAT      = 7,      << REQUEST STATUS FUNCTION CODE >>          07020000
    REQ'VOL'LIMIT = 11,     << REQ VOL LIMIT FUNCTION CODE >>           07025000
    SYSLPDT       = %10,    << DB RELATIVE BASE OF LPDT >>              07030000
    SYSDB         = %1000,  << ADDRESS OF SYSDB AREA >>                 07035000
    TYPE          = 3,      << CS'80 DISCS TYPE >>                      07040000
    VERIFY        = 11,     << VERIFY FUNCTION CODE >>                  07045000
  ENDEQ           =  0;                                                 07050000
                                                                        07055000
       << MISCELLANEOUS DECLARATIONS >>                                 07060000
                                                                        07065000
                                                               <<07045>>07070000
$PAGE                                                                   07075000
                                                                        07080000
       << I/O STATUS BIT DEFINITIONS >>                                 07085000
                                                                        07090000
                                                                        07095000
  DEFINE                                                                07100000
                                                                        07105000
       << DMISC BIT DEFINITIONS >>                                      07110000
                                                                        07115000
    LOCK'FLG       = ( 0:1)#, << LOCK FLG FOR VOL MOUNTED >>            07120000
    IGNORE'INT'FLG = ( 1:1)#, << IGNORE UNEXPECTED INTRP FLAG >>        07125000
                                                                        07130000
    SUBSTATE   = (12:4)#, <<  INDICATES STATE OF IDLE CP  >>            07135000
                          <<                              >>            07140000
                          <<  0 - NORMAL IDLE CP WAIT     >>            07145000
                          <<  1 - IDLE REQUEST BEING      >>            07150000
                          <<      SERVICED WAIT           >>            07155000
                          <<                              >>            07160000
                                                                        07165000
       << QMISC BIT DEFINITIONS >>                                      07170000
                                                                        07175000
    CHAN'ERR'FLG   = ( 0:2)#, << CHANNEL ERROR RETRY FLAG >>            07180000
    RSTAT'FAIL'FLG = ( 2:1)#, << REQUEST STATUS FAILED FLAG >>          07185000
    UNLOAD'RING'FLG= (11:1)#, << UNLOAD TAPE FLAG >>           <<03667>>07190000
    OPER'REQ'FLG   = ( 3:1)#, << OPERATOR REQUEST RELEASE FLAG >>       07195000
    IM'FAULT'FLG   = ( 4:1)#, << INT MAINTENANCE FAULT FLAG >>          07200000
    RETRY'COUNT    = ( 5:3)#, << RETRY COUNT IN QMISC >>       <<03722>>07205000
    STAT'RTRY'FLG  = ( 5:1)#, << STAT ERROR SINGLE RETRY FLAG >>        07210000
    RTRANS'FLG     = ( 6:2)#, << RETRANSMIT REQUIRED FLAG >>            07215000
    LOAD'FLG       = ( 8:1)#, << MEDIA LOAD FLAG >>                     07220000
    SYS'PFAIL'FLG  = ( 9:1)#, << SYSTEM POWERFAIL FLAG >>               07225000
    VER'ERR'FLG    = (10:1)#, << VERIFY ERROR FLAG >>          <<03667>>07230000
                                                                        07235000
    WAITCODE   = (12:4)#, <<  INDICATES TYPE OF WAIT  >>                07240000
                          <<                          >>                07245000
                          <<  0 - NEW REQUEST         >>                07250000
                          <<  1 - COMPLETION WAIT     >>                07255000
                          <<  2 - NOT READY WAIT      >>                07260000
                          <<  3 - REL/REL DENY WAIT   >>                07265000
                          <<  4 - IOQ DEFER WAIT      >>                07270000
                          <<  5 - DSCT READ WAIT      >>                07275000
                          <<  6 - DSCT WRITE WAIT     >>                07280000
                          <<  7 - SYNC WAIT           >>                07285000
                          <<  8 - RING WAIT           >>       <<07045>>07290000
                          <<  9 - ABORT IOQ WAIT      >>       <<07045>>07295000
                          <<                          >>                07300000
                                                                        07305000
       << STATUS ERROR REPORTING FIELDS >>                              07310000
                                                                        07315000
    NOT'RDY         = ( 3:1)#,   << DEVICE NOT READY BIT >>             07320000
    UNIT'ATTN       = ( 8:8)#,   << UNIT ATTENTION BIT >>               07325000
                                                                        07330000
    CHAN'PARITY     = ( 2:1)=1#, << CHANNEL PARITY BIT >>               07335000
    ILLEG'OPCODE    = ( 5:1)=1#, << ILLEGAL OPCODE BIT >>               07340000
    MOD'ADDR'ERR    = ( 6:1)=1#, << MODULE ADDR ERROR BIT >>            07345000
    ADDR'BOUND      = ( 7:1)=1#, << ADDRESS BOUNDS BIT >>               07350000
    PARM'BOUND      = ( 8:1)=1#, << PARAMETER BOUNDS BIT >>             07355000
    ILLEG'PARM      = ( 9:1)=1#, << ILLEGAL PARAMETER BIT >>            07360000
    MSG'SEQ'VIOL    = (10:1)=1#, << MSG SEQ VIOLATION BIT >>            07365000
    MSG'LEN'DIFF    = (12:1)=1#, << MSG LENGTH DIFFER BIT >>            07370000
                                                                        07375000
    CROSS'UNIT      = ( 1:1)=1#, << ERROR DURING COPY OPER >>           07380000
    CTRL'FAULT      = ( 3:1)=1#, << CONTROLLER FAULT BIT >>             07385000
    UNIT'FAULT      = ( 6:1)=1#, << UNIT FAULT BIT >>                   07390000
    DIAG'FAILED     = ( 8:1)=1#, << DIAG FAILED BIT >>                  07395000
    OPER'REL'REQRD  = (10:1)=1#, << OPER REL REQUIRED BIT >>            07400000
    DIAG'REL'REQRD  = (11:1)=1#, << DIAG REL REQUIRED BIT >>            07405000
    INT'MAINT'REQRD = (12:1)=1#, << INT MAINT REQUIRED BIT >>           07410000
    POWER'FAIL      = (14:1)=1#, << POWER FAIL BIT >>                   07415000
    RETRANSMIT      = (15:1)=1#, << RETRANSMIT/REL CMPLT BIT >>         07420000
                                                                        07425000
    ILLEG'PAR'OPER  = ( 0:1)=1#, << ILLEGAL // OPERATION BIT >>         07430000
    UNINIT'MEDIA    = ( 1:1)=1#, << UNINITIALIZED MEDIA BIT >>          07435000
    NO'SPARE'AVAIL  = ( 2:1)=1#, << NO SPARE AVAILABLE BIT >>           07440000
    DEV'NOT'RDY     = ( 3:1)=1#, << DEVICE NOT READY BIT >>             07445000
    WRT'PROTECT     = ( 4:1)=1#, << WRITE PROTECT BIT >>                07450000
    NO'DATA'FOUND   = ( 5:1)=1#, << NO DATA FOUND BIT >>                07455000
    UNRECOV'DATA'OV = ( 8:1)=1#, << UNRECOV DATA OVERFLOW BIT >>        07460000
    UNRECOV'DATA    = ( 9:1)=1#, << UNRECOV DATA BIT >>                 07465000
    END'OF'FILE     = (11:1)=1#, << END OF FILE BIT >>                  07470000
    END'OF'VOLUME   = (12:1)=1#, << END OF VOLUME BIT >>                07475000
                                                                        07480000
    OPER'REL'REQST  = ( 0:1)=1#, << OPERATOR REL REQUEST BIT >>         07485000
    DIAG'REL'REQST  = ( 1:1)=1#, << DIAG REL REQUEST BIT >>             07490000
    INT'MAINT'REQST = ( 2:1)=1#, << INT MAINT REQUEST BIT >>            07495000
    MEDIA'WEARING   = ( 3:1)=1#, << MEDIA WEARING OUT BIT >>            07500000
    DATA'OVERRUN    = ( 4:1)=1#, << DATA OVERRUN BIT >>                 07505000
    DEF'BLK'SPARE   = ( 7:1)=1#, << DEFECTIVE BLK AUTO SPARED >>        07510000
    RECOV'DATA'OV   = ( 9:1)=1#, << RECOV DATA OVERFLOW BIT >>          07515000
    MARGINAL'DATA   = (10:1)=1#, << MARGINAL DATA BIT >>                07520000
    RECOV'DATA      = (11:1)=1#, << RECOV DATA BIT >>                   07525000
    MAINT'TRK'OV    = (13:1)=1#, << MAINT TRK OVERFLOW BIT >>           07530000
                                                                        07535000
       << MISCELLANEOUS BIT DEFINITIONS >>                              07540000
                                                                        07545000
    DIAGBIT    = ( 2:1)#, << QFLAG, DIAGNOSTIC BIT >>                   07550000
    DRTNUMBER  = ( 7:9)#, << DRT EXTRACT FROM ILT(ICNTRL) >>   <<07045>>07555000
    ERRORCODE  = ( 0:3)#, << CPVAP, ERROR CODE >>                       07560000
    FUNC       = ( 8:8)#, << QFUNC, FUNCTION CODE >>                    07565000
    IOSTAT     = ( 8:8)#, << QSTAT, REQUEST STATUS RETURNED >>          07570000
    PVBIT      = ( 4:1)#, << PRIVATE VOLUME BIT IN LPDT >>              07575000
    SABIT      = ( 4:1)#, << WRT INSTRUCTION SINGLE ADDRESS BIT >>      07580000
    SFBIT      = (10:2)#, << SERIAL/FOREIGN BIT IN LPDT >>              07585000
    SFAIL      = (10:1)#, << QFLAG, FAILURE ON DELAYED START SIO >>     07590000
    STYPE      = (12:4)#, << DISC SUBTYPE IN LPDT >>                    07595000
    TIMEDOUT   = (13:1)#, << CPVAP, TRANSFER ABORTED-TIMED OUT >>       07600000
                                                                        07605000
       << STATEMENT DEFINES >>                                          07610000
                                                                        07615000
    ABS        = ABSOLUTE#,                                    <<03722>>07620000
    DISABLE    = ASSEMBLE (SED 0)#,                                     07625000
    LOG'STATUS = DITP(DSERR) := [8/10,8/DSTATUS]#,                      07630000
  ENDDEF       = 0#;                                                    07635000
                                                                        07640000
  LOGICAL                                                               07645000
    POWERFAIL     = DB + %72,  << SYSDB REL POWERFAIL WORD >>           07650000
    SYSUP         = DB + %73;  << SYSDB REL SYSTEM UP WORD >>           07655000
                                                                        07660000
                                                                        07665000
$PAGE                                                                   07670000
<<                                                                      07675000
        *********************************                               07680000
        *                               *                               07685000
        *   DRIVER DB AREA DEFINITION   *                               07690000
        *                               *                               07695000
        *********************************                               07700000
>>                                                                      07705000
                                                                        07710000
        ARRAY INITIAL(0:INIT'ARY'SIZE) = DB :=                 <<03722>>07715000
  [8/DIT'SIZE,8/%61], << DISC DIT SIZE, CORE RESIDENT >>       <<07045>>07720000
                      << IDLE CHANNEL PROGRAM, DRIVER TYPE 1 >>         07725000
                 0,   << NOT USED >>                                    07730000
           %037400,   << UNIT EXTRACT INSTRUCTION - ANDI 0 >>           07735000
         [8/CPGM'SIZED2,8/10],<<CP SIZE/2,10 WRDS:STATUS>>     <<03722>>07740000
                                                                        07745000
        << DISC DIT >>                                                  07750000
                 0,   << DFLAG >>                              <<07045>>07755000
                 0,   << DLINK >>                                       07760000
                 0,   << DIOQP >>                                       07765000
                 0,   << DLDEV >>                              <<07045>>07770000
                 0,   << DDLTP >>                                       07775000
                 0,   << DILTP >>                                       07780000
                 0,   << DSTAT >>                                       07785000
                 0,   << DSERR >>                                       07790000
                 0,   << DQHEAD >>                                      07795000
                 0,   << DQTAIL >>                                      07800000
            %40000,   << HP-IB DEVICE - DUNIT >>               <<07045>>07805000
                 0,   << DSBUFADDR >>                                   07810000
                 0,   << DBADBLK1  >>                                   07815000
                 0,   << DBADBLK2  >>                                   07820000
                 0,   << DBADXFER  >>                                   07825000
                 0,   << DLOGERROR >>                                   07830000
                 0,   << DSIOPSTOP >>                                   07835000
         0,0,0,0,0,   << DSTATUS   >>                                   07840000
         0,0,0,0,0,                                                     07845000
                 0,   << DMISC >>                              <<07045>>07850000
                                                                        07855000
        <<----------------->>                                           07860000
        << CHANNEL PROGRAM >>                                           07865000
        <<----------------->>                                           07870000
                                                                        07875000
                                                               <<03722>>07880000
                                                               <<03722>>07885000
<< 0>>  << DSJ  >>          %2402,  << DSJ TO CHK PWR ON >>    <<03722>>07890000
<< 1>>                          0,  << RETURN BYTE >>          <<03722>>07895000
<< 2>>                          2,  << NORMAL RETURN >>        <<03722>>07900000
<< 3>>                         16,  << HARD-ERR REQUEST STAT >><<03722>>07905000
<< 4>>                         30,  << IDLE PWR ON OCCURED >>  <<03722>>07910000
                                                               <<03722>>07915000
<< 0>>  << FILL >>            0,0,  << UNUSED NEVER XEQED >>   <<03722>>07920000
                                                               <<03722>>07925000
                                                                        07930000
<< 0>>  << JUMP >>              0,  << BRANCH POINT TO CP SECTION >>    07935000
<< 1>>                          0,                                      07940000
                                                                        07945000
                                                                        07950000
        <<------------------------------------------------->>           07955000
        << IDLE CP - ON HARD ERROR, REQUESTS STATUS AND ON >>           07960000
        <<           POWER ON RETURNS AN IDLE PON STATUS   >>           07965000
        <<------------------------------------------------->>           07970000
                                                                        07975000
                                                                        07980000
<< 0>   << DSJ  >>          %2402,  << DSJ TO CHK PWR ON >>    <<03722>>07985000
<< 1>>                          0,  << RETURN BYTE >>          <<03722>>07990000
<< 2>>                          0,  << NORMAL RETURN >>        <<03722>>07995000
<< 3>>                          7,  << HARD-ERR REQ STAT >>    <<03722>>08000000
<< 4>>                         21,  << IDLE PWR ON OCCURED >>  <<03722>>08005000
                                                               <<03722>>08010000
<< 0>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     08015000
<< 1>>                          0,                                      08020000
                                                                        08025000
<< 2>>  << QSTAT >>         %2402,  << REPORTING MSG SECONDARY >>       08030000
<< 3>>                          0,  << RETURN BYTE >>                   08035000
<< 4>>                         12,  << NORMAL COMPLETION >>             08040000
<< 5>>                          0,  << HARD ERROR - REQ STATUS >>       08045000
<< 6>>                         14,  << IDLE POWER ON OCCURRED >>        08050000
                                                                        08055000
<< 7>>  << LOC & WRT >>     %2005,  << COMMAND MSG SECONDARY >>         08060000
<< 8>>                          7,  << CMD BUFFER LENGTH (BYTE) >>      08065000
<< 9>>                          0,  << BURST >>                         08070000
<<10>>                     %42000,  << CMD BUFFER BANK >>               08075000
<<11>>                          0,  << CMD BUFFER ABS ADDR >>           08080000
                                                                        08085000
<<12>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     08090000
<<13>>                          0,                                      08095000
                                                                        08100000
<<14>>  << QSTAT >>         %2402,  << REPORTING MSG SECONDARY >>       08105000
<<15>>                          0,  << RETURN BYTE >>                   08110000
<<16>>                          0,  << NORMAL COMPLETION >>             08115000
<<17>>                         29,  << HARD ERROR - REQ STATUS >>       08120000
<<18>>                          2,  << POWER ON OCCURRED >>             08125000
                                                                        08130000
<<19>>  << INT/HLT0 >>       %601,  << INTERRUPT/HALT >>                08135000
<<20>>                          0,  << CODE OF 0 IN CPVA(1) >>          08140000
                                                                        08145000
<<21>>  << INT/HLT4 >>       %601,  << INTERRUPT/HALT >>                08150000
<<22>>                          4,  << CODE OF 4 IN CPVA(1) >>          08155000
                                                                        08160000
                                                                        08165000
        <<------------------------------------------------->>           08170000
        << [DXFER] REAL-TIME & SOME GENERAL PURPOSE CMDS   >>           08175000
        << COMMAND - EXECUTION - REPORTING MESSAGE SECTION >>           08180000
        <<------------------------------------------------->>           08185000
                                                                        08190000
                                                                        08195000
<< 0>>  << WRITE CTRL >>    %2005,  << COMMAND MSG SECONDARY >>         08200000
<< 1>>                          0,  << CMD BUFFER LENGTH (BYTE) >>      08205000
<< 2>>                          0,  << BURST >>                         08210000
<< 3>>                      %2000,  << CMD BUFFER BANK >>               08215000
<< 4>>                          0,  << CMD BUFFER ABS ADDR >>           08220000
                                                                        08225000
<< 5>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     08230000
<< 6>>                          0,                                      08235000
                                                                        08240000
<< 7>>  << RD/WRT CTRL >>   %1416,  << EXECUTION MSG SECONDARY >>       08245000
<< 8>>                          0,  << #BYTES TO READ/WRITE >>          08250000
<< 9>>                          0,  << BURST >>                         08255000
<<10>>                          0,  << DATA BANK >>                     08260000
<<11>>                          0,  << DATA BUFFER ABS ADDR >>          08265000
<<12>>  << JUMP >>              0,  << XFER COMPLETE JUMP TO WAIT >>    08270000
<<13>>                          2,                                      08275000
                                                                        08280000
<<14>>  << JUMP >>              0,  << MORE BURSTS TO GO >>             08285000
<<15>>                        -11,                                      08290000
                                                                        08295000
<<16>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     08300000
<<17>>                          0,                                      08305000
                                                                        08310000
<<18>>  << QSTAT >>         %2402,  << REPORTING MSG SECONDARY >>       08315000
<<19>>                          0,  << RETURN BYTE >>                   08320000
<<20>>                          0,  << NORMAL COMPLETION >>             08325000
<<21>>                          2,  << HARD ERROR - REQ STATUS >>       08330000
<<22>>                         39,  << POWER ON OCCURRED >>             08335000
                                                                        08340000
<<23>>  << INT/HLT0 >>       %601,  << INTERRUPT/HALT >>                08345000
<<24>>                          0,  << CODE OF 0 IN CPVA(1) >>          08350000
                                                                        08355000
                                                                        08360000
        <<------------------------------------------------->>           08365000
        << [RSTAT] STATUS INTERROGATION SECTION            >>           08370000
        << COMMAND - EXECUTION - REPORTING MESSAGE SECTION >>           08375000
        <<------------------------------------------------->>           08380000
                                                                        08385000
                                                                        08390000
<< 0>>  << WRITE CTRL >>    %2005,  << COMMAND MSG SECONDARY >>         08395000
<< 1>>                          1,  << CMD BUFFER LENGTH (BYTE) >>      08400000
<< 2>>                          0,  << BURST >>                         08405000
<< 3>>                     %42000,  << CMD BUFFER BANK >>               08410000
<< 4>>  << STAT CDB >>          0,  << CMD BUFFER ABS ADDR >>           08415000
                                                                        08420000
<< 5>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     08425000
<< 6>>                          0,                                      08430000
                                                                        08435000
<< 7>>  << READ CTRL >>     %1416,  << EXECUTION MSG SECONDARY >>       08440000
<< 8>>                         20,  << #STATUS BYTES TO READ >>         08445000
<< 9>>                          0,  << BURST >>                         08450000
<<10>>                      %2000,  << DATA BANK >>                     08455000
<<11>>  << STAT AREA >>         0,  << DATA BUFFER ABS ADDR >>          08460000
                                                                        08465000
<<12>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     08470000
<<13>>                          0,                                      08475000
                                                                        08480000
<<14>>  << QSTAT >>         %2402,  << REPORTING MSG SECONDARY >>       08485000
<<15>>                          0,  << RETURN BYTE >>                   08490000
<<16>>                          0,  << NORMAL COMPLETION >>             08495000
<<17>>                          2,  << HARD ERROR - REQ STATUS >>       08500000
<<18>>                         18,  << POWER ON OCCURRED >>             08505000
                                                                        08510000
<<19>>  << INT/HLT1 >>       %601,  << INTERRUPT/HALT >>                08515000
<<20>>                          1,  << CODE OF 1 IN CPVA(1) >>          08520000
                                                                        08525000
<<21>>  << INT/HLT3 >>       %601,  << INTERRUPT/HALT >>                08530000
<<22>>                          3,  << CODE OF 3 IN CPVA(1) >>          08535000
                                                                        08540000
                                                                        08545000
        <<------------------------------------------------->>           08550000
        << [DIAG] COMPLEMENTARY, GP, DIAG, TRANS COMMANDS  >>           08555000
        << COMMAND/TRANS - REPORTING MESSAGE SECTION       >>           08560000
        <<------------------------------------------------->>           08565000
                                                                        08570000
                                                                        08575000
<< 0>>  << WRITE CTRL >>    %2005,  << CMD/TRANS MSG SECONDARY >>       08580000
<< 1>>                          0,  << CMD BUFFER LENGTH (BYTE) >>      08585000
<< 2>>                          0,  << BURST >>                         08590000
<< 3>>  << SEL DEV CLR >>   %2000,  << CMD BUFFER BANK >>               08595000
<< 4>>                          0,  << CMD BUFFER ABS ADDR >>           08600000
                                                                        08605000
<< 5>>  << WAIT >>          %1000,  << WAIT FOR // POLL RESPONSE >>     08610000
<< 6>>                          0,                                      08615000
                                                                        08620000
<< 7>>  << QSTAT >>         %2402,  << REPORTING MSG SECONDARY >>       08625000
<< 8>>                          0,  << RETURN BYTE >>                   08630000
<< 9>>                          0,  << NORMAL COMPLETION >>             08635000
<<10>>                        -35,  << HARD ERROR - REQ STATUS >>       08640000
<<11>>                          2,  << POWER ON OCCURRED >>             08645000
                                                                        08650000
<<12>>  << INT/HLT0 >>       %601,  << INTERRUPT/HALT >>                08655000
<<13>>                          0,  << CODE OF 0 IN CPVA(1) >>          08660000
                                                                        08665000
                                                                        08670000
        <<------------------------------------------------->>           08675000
        << [PON] SEL DEV CLEAR/PARITY ENABLED ON POWER ON  >>           08680000
        <<------------------------------------------------->>           08685000
                                                                        08690000
                                                                        08695000
<< 0>>                      %4401,  << SEL DEV CLR/PARITY ON >>         08700000
<< 1>>                          0,                                      08705000
                                                                        08710000
<< 2>>                      %1000,  << WAIT FOR // POLL RESPONSE >>     08715000
<< 3>>                          0,                                      08720000
                                                                        08725000
<< 4>>                      %2402,  << REPORTING MSG SECONDARY >>       08730000
<< 5>>                          0,  << RETURN BYTE >>                   08735000
<< 6>>                          0,  << NORMAL COMPLETION >>             08740000
<< 7>>                        -46,  << HARD ERROR - REQ STATUS >>       08745000
<< 8>>                         -9,  << POWER ON OCCURRED >>             08750000
                                                                        08755000
<< 9>>  << INT/HLT2 >>       %601,  << INTERRUPT/HALT >>                08760000
<<10>>                          2,  << CODE OF 2 IN CPVA(1) >>          08765000
                                                                        08770000
                                                                        08775000
        <<------------------------------------------------->>           08780000
        << [IDENT] CHANNEL INSTRUCTION IDENTIFY            >>           08785000
        <<------------------------------------------------->>           08790000
                                                                        08795000
                                                                        08800000
<< 0>>  << IDENTIFY >>      %3000,                                      08805000
<< 1>>                          0,  << ID RETURN BYTE >>                08810000
                                                                        08815000
<< 2>>                       %601,  << INTERRUPT/HALT >>                08820000
<< 3>>                          0,  << CODE OF 0 IN CPVA(1) >>          08825000
                                                                        08830000
                                                                        08835000
        <<------------------------------------------------->>           08840000
        << MISCELLANEOUS STORAGE AND CONSTANTS AREA        >>           08845000
        <<------------------------------------------------->>           08850000
                                                                        08855000
                                                                        08860000
<<  0>> << STATUS'CDB >>      %15,  << CDB FOR REQ STATUS >>            08865000
                                                                        08870000
<<  0>> << LOC & WRT CDB >>   %40,  << SET UNIT >>                      08875000
<<  1>>                    %14000,  << SET LENGTH ZERO >>               08880000
<<  2>>                         0,                                      08885000
<<  3>>                         2,  << LOC & WRT >>                     08890000
                                                                        08895000
<<  0>> << INITFLG >>           0,  << INITIALIZATION FLAG >>           08900000
<<  0>> << FILL WORD >>         0,  << FOR FILL W/ZEROS, BLANKS >>      08905000
                                                                        08910000
<<  0>> << DESC AREA >> 0,0,0,0,0,  << DESCRIBE AREA >>                 08915000
<<  5>>                 0,0,0,0,0,                                      08920000
                                                                        08925000
<<  0>> << CDB AREA >>  0,0,0,0,0,  << CDB AREA/DESC AREA >>            08930000
<<  5>>                 0,0,0,0,0;                                      08935000
                                                                        08940000
$PAGE                                                                   08945000
<<                                                                      08950000
         ***************************************                        08955000
         *                                     *                        08960000
         *   EXTERNAL PROCEDURE DECLARATIONS   *                        08965000
         *                                     *                        08970000
         ***************************************                        08975000
>>                                                                      08980000
                                                                        08985000
   INTEGER PROCEDURE GETDRT(DRTN,OFFSET);                               08990000
     VALUE DRTN,OFFSET;                                                 08995000
     INTEGER DRTN,OFFSET;                                               09000000
     OPTION EXTERNAL;                                                   09005000
                                                                        09010000
   INTEGER PROCEDURE GETSBUF(TYPE);                                     09015000
     VALUE TYPE;                                                        09020000
     INTEGER TYPE;                                                      09025000
     OPTION EXTERNAL;                                                   09030000
                                                                        09035000
   PROCEDURE GIP'HPIB;                                                  09040000
     OPTION EXTERNAL;                                                   09045000
                                                                        09050000
   PROCEDURE HELP;                                                      09055000
     OPTION EXTERNAL;                                                   09060000
                                                                        09065000
   LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,         09070000
                               DEST,REPLY,OFFSET,DITP,IOTYPE);          09075000
     VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,           09080000
           DITP,IOTYPE;                                                 09085000
     INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET;         09090000
     INTEGER IOTYPE;                                                    09095000
     INTEGER POINTER DITP;                                              09100000
     OPTION VARIABLE, EXTERNAL;                                         09105000
                                                                        09110000
   PROCEDURE LDEVNOTRDY(DITP);                                          09115000
     VALUE DITP;                                                        09120000
     POINTER DITP;                                                      09125000
     OPTION EXTERNAL;                                                   09130000
                                                                        09135000
   PROCEDURE MAINT'REQUEST(LDEV,TYPE,SUBTYPE);                          09140000
     VALUE LDEV,TYPE,SUBTYPE;                                           09145000
     INTEGER LDEV,TYPE,SUBTYPE;                                         09150000
     OPTION EXTERNAL;                                                   09155000
                                                                        09160000
   PROCEDURE SIODM(DITP,FLAGS);                                         09165000
     VALUE DITP,FLAGS;   LOGICAL FLAGS;                                 09170000
     POINTER DITP;   OPTION EXTERNAL;                                   09175000
                                                                        09180000
   PROCEDURE START'HPIB(DITP,SIOP,QFLAG);                               09185000
     VALUE DITP,SIOP,QFLAG;   LOGICAL QFLAG;                            09190000
     POINTER DITP,SIOP;   OPTION EXTERNAL;                              09195000
                                                                        09200000
   PROCEDURE RETURNSBUF(SBUFP);                                         09205000
     VALUE SBUFP;                                                       09210000
     INTEGER SBUFP;                                                     09215000
     OPTION EXTERNAL;                                                   09220000
                                                               <<07045>>09225000
   PROCEDURE PUTDRT(DRT,OFFSET,NUM);                           <<07045>>09230000
     VALUE DRT,OFFSET,NUM;                                     <<07045>>09235000
     INTEGER DRT,OFFSET,NUM;                                   <<07045>>09240000
     OPTION EXTERNAL;                                          <<07045>>09245000
$PAGE                                                                   09250000
<<       *********************************************                  09255000
         *                                           *                  09260000
         *   CS'80 DRIVER INITIALIZATION PROCEDURE   *                  09265000
         *                                           *                  09270000
         *********************************************                  09275000
>>                                                                      09280000
                                                                        09285000
   PROCEDURE CSINIT(DITP);                                              09290000
     INTEGER ARRAY DITP;                                                09295000
                                                                        09300000
<<---------------------------------------------------->>                09305000
<<                                                    >>                09310000
<<   THIS PROCEDURE INITIALIZES THE CS'80 CHANNEL     >>                09315000
<<   PROGRAM AREA AND SENDS OUT A DEVICE CLEAR TO     >>                09320000
<<   RESET THE DRIVE TO A KNOWN STATE.                >>                09325000
<<                                                    >>                09330000
<<---------------------------------------------------->>                09335000
                                                                        09340000
     BEGIN                                                              09345000
                                                                        09350000
       INTEGER POINTER                                                  09355000
         ILTP,      << ILT POINTER >>                                   09360000
         SIOP,      << CHANNEL PROGRAM POINTER >>                       09365000
         ISTAT;     << IDLE CP STATUS POINTER >>                        09370000
                                                                        09375000
       INTEGER                                                          09380000
         LPDT2;     << LPDT - WORD 2 >>                                 09385000
                                                                        09390000
       LOGICAL                                                 <<07045>>09395000
         LPDT'INDEX;                                           <<07045>>09400000
                                                               <<07045>>09405000
       DISABLE;   << ON ENTRY - WANT CSINIT TO COMPLETE >>              09410000
                                                                        09415000
       @ILTP := DITP(DILTP);        << ILTP    >>                       09420000
       @SIOP := ILTP(ISIOP);        << SIOP    >>                       09425000
       @ISTAT := ILTP(ISTAP);       << ISTAT   >>                       09430000
                                                                        09435000
       IF POWERFAIL <> 0 THEN   << BYPASS INIT ON POWERFAIL >>          09440000
         RETURN;                                                        09445000
                                                                        09450000
       IF NOT LOGICAL(SIOP(INITFLG)) THEN                               09455000
         BEGIN                                                          09460000
           LPDT'INDEX:= DITP(DLDEV)*                           <<07045>>09465000
             SIZE'OF'LPDT'ENTRY;                               <<07045>>09470000
           LPDT2:= LPDT(LPDT'INDEX+1);                         <<07045>>09475000
           DITP(DMISC).LOCK'FLG := IF LPDT2.PVBIT=0 AND                 09480000
             LPDT2.SFBIT=0 THEN 1 ELSE 0;                               09485000
                                                                        09490000
           SIOP(IDLE16) := @SIOP + SYSDB + LOC'WRT'CDB;        <<03722>>09495000
           SIOP(DXFER4) := @SIOP + SYSDB + CDB'AREA'WRD;                09500000
           SIOP(RSTAT4) := @SIOP + SYSDB + STAT'CDB;                    09505000
           SIOP(RSTAT11) := @ISTAT + SYSDB;                             09510000
                                                                        09515000
           SIOP(BRANCHPT) := PONCP;                                     09520000
           << FOR SERIES 33 AND 64 MICROCODE BUG >>            <<07045>>09525000
           PUTDRT(ILTP(ICNTRL).DRTNUMBER,3,0);                 <<07045>>09530000
           START'HPIB(DITP,SIOP,FALSE);                                 09535000
           DITP(DMISC).SUBSTATE := IDLE'REQ'WAIT;                       09540000
                                                                        09545000
           SIOP(INITFLG) := TRUE;                                       09550000
         END;                                                           09555000
                                                                        09560000
     END;                                                               09565000
$PAGE                                                                   09570000
<<       **********************************************                 09575000
         *                                            *                 09580000
         *   CS'80 DISC DRIVER PROCEDURE  -  CSDRVR   *                 09585000
         *                                            *                 09590000
         **********************************************                 09595000
>>                                                                      09600000
                                                                        09605000
   INTEGER PROCEDURE CSDRVR(IOQP,DITP,BANK,BUFFADDR,SIOP,DRTN);         09610000
                                                                        09615000
<<--------------------------------------------------------->>           09620000
<<                                                         >>           09625000
<<   THIS PROCEDURE INITIATES AND COMPLETES I/O REQUESTS   >>           09630000
<<   FOR THE CS'80 DISCS CONNECTED TO THE HP-IB AND CON-   >>           09635000
<<   TROLLED BY THE GENERAL I/O CHANNEL (GIC).             >>           09640000
<<                                                         >>           09645000
<<   MODE RETURNS IN CSDRVR -                              >>           09650000
<<     5 - REQUEST COMPLETED                               >>           09655000
<<     7 - NOT READY WAIT                                  >>           09660000
<<   %13 - WAIT FOR COMPLETION                             >>           09665000
<<                                                         >>           09670000
<<--------------------------------------------------------->>           09675000
                                                                        09680000
   VALUE DITP,IOQP,BANK,BUFFADDR,DRTN;                                  09685000
   INTEGER BANK,BUFFADDR,DRTN,IOQP;                            <<07045>>09690000
   INTEGER POINTER DITP;                                       <<07045>>09695000
   INTEGER ARRAY SIOP;                                                  09700000
   OPTION PRIVILEGED,UNCALLABLE;                                        09705000
                                                                        09710000
   BEGIN                                                                09715000
                                                                        09720000
     LOGICAL ARRAY                                                      09725000
       DITPL(*)= DITP;                                         <<07045>>09730000
                                                                        09735000
       LOGICAL POINTER SIOP'BASE;                              <<07045>>09740000
       LOGICAL TEMP;                                           <<07045>>09745000
       LOGICAL X= X;                                           <<07045>>09750000
                                                                        09755000
     INTEGER POINTER                                                    09760000
       ILTP,              << ILT POINTER >>                             09765000
       CPVAP = ILTP,      << CP VARIABLE AREA PTR >>                    09770000
       ISTAT,             << IDLE CP STATUS PTR >>                      09775000
       IDLE'SIOP,         << IDLE CP START ADDRESS >>                   09780000
       DSCT;              << DEFECTIVE SECTOR TABLE PTR >>              09785000
                                                                        09790000
     DOUBLE                                                             09795000
       SIOP'ABS'BYT'ADR,                                       <<03722>>09800000
       BUFFADDRD = Q- 7;  << BANK AND BUFFER ADDRESS >>                 09805000
     DOUBLE                                                    <<04834>>09810000
       VER'LEN;               << BYTE LENGTH OF A VERIFY >>    <<04834>>09815000
                                                               <<04834>>09820000
     LOGICAL                                                   <<04834>>09825000
       L1'VER'LEN=VER'LEN,    << FIRST WORD OF VER. LEN. >>    <<04834>>09830000
       L2'VER'LEN=VER'LEN+1;  << 2'ND  WORD OF VER. LEN. >>    <<04834>>09835000
                                                               <<04834>>09840000
                                                                        09845000
     DOUBLE POINTER                                                     09850000
       DDSCT = DSCT,                                                    09855000
       DDITP = DITP,                                                    09860000
       DSIOP = SIOP;                                                    09865000
                                                                        09870000
     LOGICAL                                                            09875000
       COUNT,             << BUFFER TRANSFER COUNT >>                   09880000
       CLDA1,             << CURRENT LOGICAL DISC ADDR1 >>              09885000
       CLDA2;             << CURRENT LOGICAL DISC ADDR2 >>              09890000
                                                                        09895000
     INTEGER                                                            09900000
       MSTATE = CSDRVR,   << MONITOR STATE RETURN >>                    09905000
       FCODE,             << FUNCTION CODE >>                           09910000
       INDEX,             << INDEX >>                                   09915000
       PARM,              << PARAMETER >>                               09920000
       SYSDISC,           << SYSTEM DISC FLAG >>                        09925000
       SDISC,             << SERIAL DISC FLAG >>                        09930000
       FOREIGN,           << FOREIGN DISC FLAG >>                       09935000
       SUBTYPE,           << DISC SUBTYPE >>                            09940000
       NO'ENTRIES,        << #ENTRIES IN DSCT >>                        09945000
       FIRST'ENTRY,       << FIRST ENTRY IN DSCT >>                     09950000
       MAX'ENTRIES;       << MAX #ENTRIES IN DSCT >>                    09955000
                                                                        09960000
     LOGICAL                                                   <<07045>>09965000
       INDEXL= INDEX,                                          <<07045>>09970000
       LPDT'INDEX;                                             <<07045>>09975000
                                                               <<07045>>09980000
       EQUATE SBUF'DSTN = %10;                                 <<07045>>09985000
       EQUATE SBUF'DTRK'ENTRY= 0;                              <<07045>>09990000
       EQUATE SBUF'BANK = SBUF'DSTN* 4+ 2;                     <<07045>>09995000
       EQUATE SBUF'ADDR = SBUF'DSTN* 4+ 3;                     <<07045>>10000000
       LOGICAL SBUF'ENTRY'INDEX;                               <<07045>>10005000
DEFINE SBUF'NUM'DTRK = SBF(SBUF'ENTRY'INDEX+ SBUF'DTRK'ENTRY)#;<<07045>>10010000
       LOGICAL POINTER DST = 2;                                <<07045>>10015000
                                                               <<07045>>10020000
       LOGICAL IOQ'ENTRY'INDEX;                                <<07045>>10025000
$PAGE                                                                   10030000
<<****************************************************>>                10035000
<<                                                    >>                10040000
<<   CS'80 DISC DRIVER SUBROUTINES                    >>                10045000
<<                                                    >>                10050000
<<****************************************************>>                10055000
                                                                        10060000
<<---------------------------------------------------->>       <<07045>>10065000
<<                                                    >>       <<07045>>10070000
<<   SIOPB -- SUBROUTINE TO STORE THE CS80            >>       <<07045>>10075000
<<            COMMAND BYTES INTO THE CHANNEL          >>       <<07045>>10080000
<<            PROGRAM AREA.                           >>       <<07045>>10085000
<<                                                    >>       <<07045>>10090000
<<---------------------------------------------------->>       <<07045>>10095000
                                                               <<07045>>10100000
   SUBROUTINE SIOPB(BYTE'OFFSET,ABYTE);                        <<07045>>10105000
     VALUE BYTE'OFFSET,ABYTE;                                  <<07045>>10110000
     LOGICAL BYTE'OFFSET,ABYTE;                                <<07045>>10115000
                                                               <<07045>>10120000
     BEGIN                                                     <<07045>>10125000
     TEMP:= SIOP'BASE(BYTE'OFFSET&LSR(1));                     <<07045>>10130000
     IF BYTE'OFFSET THEN TEMP.(8:8):=ABYTE                     <<07045>>10135000
       ELSE TEMP.(0:8):= ABYTE;                                <<07045>>10140000
     SIOP'BASE(X):= TEMP; << X SET BY (BYTE'OFFSET&LSR(1)) >>  <<07045>>10145000
     END;                                                      <<07045>>10150000
                                                               <<07045>>10155000
<<---------------------------------------------------->>                10160000
<<                                                    >>                10165000
<<   SET'BYTE'COUNT -- SUBROUTINE TO DETERMINE THE    >>                10170000
<<                     TRANSFER COUNT IN BYTES.       >>                10175000
<<                                                    >>                10180000
<<---------------------------------------------------->>                10185000
                                                                        10190000
     SUBROUTINE SET'BYTE'COUNT;                                         10195000
                                                                        10200000
       BEGIN                                                            10205000
         TOS:= IOQ'COUNT;                                      <<07045>>10210000
         IF < THEN   << BYTE COUNT >>                                   10215000
           COUNT := -TOS                                                10220000
         ELSE   << WORD COUNT >>                                        10225000
           COUNT := TOS & LSL(1);  << MAKE BYTE >>                      10230000
       END;                                                             10235000
                                                                        10240000
<<---------------------------------------------------->>                10245000
<<                                                    >>                10250000
<<   SET'CMD'BYTES -- SUBROUTINE TO SET UP THE        >>                10255000
<<                    COMMAND DATA BYTES FOR READ     >>                10260000
<<                    AND WRITE OPERATIONS.           >>                10265000
<<                                                    >>                10270000
<<---------------------------------------------------->>                10275000
                                                                        10280000
     SUBROUTINE SET'CMD'BYTES;                                          10285000
                                                                        10290000
       BEGIN                                                            10295000
         SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                  <<03722>>10300000
                                                                        10305000
         SIOPB(CDB'AREA'BYTE+1 , CDB'SET'SNGL'VEC);            <<03722>>10310000
         SIOPB(CDB'AREA'BYTE+2 , 0);                           <<03722>>10315000
         SIOPB(CDB'AREA'BYTE+3 , 0);                           <<03722>>10320000
         SIOPB(CDB'AREA'BYTE+4 , CLDA1.(0:8));                 <<03722>>10325000
         SIOPB(CDB'AREA'BYTE+5 , CLDA1.(8:8));                 <<03722>>10330000
         SIOPB(CDB'AREA'BYTE+6 , CLDA2.(0:8));                 <<03722>>10335000
         SIOPB(CDB'AREA'BYTE+7 , CLDA2.(8:8));                 <<03722>>10340000
                                                                        10345000
         SIOPB(CDB'AREA'BYTE+8 , CDB'SET'LENGTH);              <<03722>>10350000
         SIOPB(CDB'AREA'BYTE+9 , 0);                           <<03722>>10355000
         SIOPB(CDB'AREA'BYTE+10 , 0);                          <<03722>>10360000
         SIOPB(CDB'AREA'BYTE+11 , COUNT.(0:8));                <<03722>>10365000
         SIOPB(CDB'AREA'BYTE+12 , COUNT.(8:8));                <<03722>>10370000
         SIOPB(CDB'AREA'BYTE+13 , CDB'SET'BURST);              <<03722>>10375000
         SIOPB(CDB'AREA'BYTE+14 , 1);                          <<03722>>10380000
       END;                                                             10385000
                                                                        10390000
<<---------------------------------------------------->>                10395000
<<                                                    >>                10400000
<<   LOG'CPVAP -- LOG CHANNEL ERROR WORD (CPVA 0)     >>                10405000
<<             -- LOG CP RELATIVE OFFSET LOCATION     >>                10410000
<<                                                    >>                10415000
<<---------------------------------------------------->>                10420000
                                                                        10425000
       SUBROUTINE LOG'CPVAP;                                            10430000
                                                                        10435000
       BEGIN                                                            10440000
         DITP(DSERR) := [8/2,8/DLOGERROR];                              10445000
         DITP(DLOGERROR) := CPVAP;                                      10450000
         DITP(DSIOPSTOP) := GETDRT(DRTN,0) - (@SIOP + SYSDB);           10455000
       END;                                                             10460000
                                                                        10465000
<<---------------------------------------------------->>                10470000
<<                                                    >>                10475000
<<   CLEAR'STATUS -- CLEAR 20 BYTES OF STATUS IN DIT  >>                10480000
<<                                                    >>                10485000
<<---------------------------------------------------->>                10490000
                                                                        10495000
       SUBROUTINE CLEAR'STATUS;                                         10500000
                                                                        10505000
       BEGIN                                                            10510000
         INDEX := DSTATUS;                                              10515000
         DO DITP(INDEX) := 0 UNTIL                                      10520000
           (INDEX := INDEX + 1) > DSTATUS + 9;                          10525000
       END;                                                             10530000
                                                                        10535000
<<---------------------------------------------------->>                10540000
<<                                                    >>                10545000
<<   UPDATE'XFER'CNT -- UPDATE TRANSFER COUNT         >>                10550000
<<                                                    >>                10555000
<<---------------------------------------------------->>                10560000
                                                                        10565000
       SUBROUTINE UPDATE'XFER'CNT;                                      10570000
                                                                        10575000
       BEGIN                                                            10580000
         IF SIOP(DXFER8) <> 0 THEN                                      10585000
           BEGIN                                                        10590000
             COUNT := IOQ'COUNT;                               <<07100>>10595000
             IF < THEN                                                  10600000
               IOQ'COUNT:= INTEGER(COUNT)  +  SIOP(DXFER8)     <<07100>>10605000
             ELSE                                                       10610000
               IOQ'COUNT:= (INTEGER(COUNT) & LSL(1) -          <<07100>>10615000
                              SIOP(DXFER8)) / 2;                        10620000
           END;                                                         10625000
       END;                                                             10630000
                                                                        10635000
<<---------------------------------------------------->>                10640000
<<                                                    >>                10645000
<<   RETURN'SYSBUF -- RETURN SYSTEM BUFFER ELEMENT    >>                10650000
<<                                                    >>                10655000
<<---------------------------------------------------->>                10660000
                                                                        10665000
       SUBROUTINE RETURN'SYSBUF;                                        10670000
                                                                        10675000
       BEGIN                                                            10680000
         TOS := DITP(DSBUFADDR);                                        10685000
         IF <> THEN                                                     10690000
           BEGIN                                                        10695000
             RETURNSBUF(*);                                             10700000
             DITP(DSBUFADDR) := 0;                                      10705000
           END ELSE DEL;                                                10710000
       END;                                                             10715000
                                                                        10720000
$PAGE                                                                   10725000
<<****************************************************>>                10730000
<<                                                    >>                10735000
<<   CS'80 DISC DRIVER INITIATOR SECTION              >>                10740000
<<                                                    >>                10745000
<<****************************************************>>                10750000
                                                                        10755000
     @SIOP'BASE:= @SIOP;                                       <<07045>>10760000
                                                               <<07045>>10765000
     IOQ'ENTRY'INDEX:= IOQP;       << IOQ OFFSET  >>           <<07045>>10770000
     @ILTP := DITP(DILTP);         << ILTP        >>                    10775000
     FCODE:= IOQ'FUNC;             << FCODE       >>           <<07045>>10780000
     @ISTAT := ILTP(ISTAP);        << ISTAT       >>                    10785000
     @IDLE'SIOP := @SIOP + IDLE;   << IDLE'SIOP   >>                    10790000
     @DSCT := 0;                   << DSCT        >>                    10795000
                                                                        10800000
     COUNT := 0;                   << COUNT       >>                    10805000
     CLDA1 := 0;                   << CLDA1       >>                    10810000
     CLDA2 := 0;                   << CLDA2       >>                    10815000
                                                                        10820000
     INDEX := 0;                   << INDEX       >>                    10825000
     PARM := 0;                    << PARM        >>                    10830000
     SYSDISC := 0;                 << SYSDISC     >>                    10835000
     SDISC := 0;                   << SDISC       >>                    10840000
     FOREIGN := 0;                 << FOREIGN     >>                    10845000
     SUBTYPE := 0;                 << SUBTYPE     >>                    10850000
     NO'ENTRIES := 0;              << NO'ENTRIES  >>                    10855000
     FIRST'ENTRY := 0;             << FIRST'ENTRY >>                    10860000
     MAX'ENTRIES := 0;             << MAX'ENTRIES >>                    10865000
                                                                        10870000
<<---------------------------------------------------->>                10875000
<<   ASSURE THAT INITIALIZATION SECTION CALLED        >>                10880000
<<---------------------------------------------------->>                10885000
                                                                        10890000
     IF NOT LOGICAL(SIOP(INITFLG)) THEN                                 10895000
       BEGIN                                                            10900000
         CSINIT(DITP);                                                  10905000
         IF MSTATE= 2 THEN IF IOQ'ENTRY'INDEX <> 0 THEN        <<07045>>10910000
           BEGIN                                                        10915000
             IOQ'QMISC.WAITCODE:= IOQ'DEFER'WAIT;              <<07045>>10920000
             MSTATE := INTRPTWAIT;                                      10925000
             RETURN;                                                    10930000
           END;                                                         10935000
       END;                                                             10940000
                                                                        10945000
<<---------------------------------------------------->>                10950000
<<   SYSTEM DISC OR NON-SYSTEM DISC AND SUBTYPE       >>                10955000
<<---------------------------------------------------->>                10960000
                                                                        10965000
     LPDT'INDEX:= DITP(DLDEV)*                                 <<07045>>10970000
       SIZE'OF'LPDT'ENTRY;                                     <<07045>>10975000
     PARM:= LPDT(LPDT'INDEX+1);                                <<07045>>10980000
                                                                        10985000
     SYSDISC := IF PARM.PVBIT=0 AND PARM.SFBIT=0 THEN                   10990000
       1 ELSE 0;   << SYSTEM DISC >>                                    10995000
     SDISC := IF PARM.SFBIT=2 THEN                                      11000000
       1 ELSE 0;   << SERIAL DISC >>                                    11005000
     FOREIGN := IF PARM.SFBIT=3 THEN                                    11010000
       1 ELSE 0;   << FOREIGN DISC >>                                   11015000
                                                                        11020000
     SUBTYPE := PARM.STYPE;   << DISC SUBTYPE >>                        11025000
                                                                        11030000
<<---------------------------------------------------->>                11035000
<<   NO IOQ - SERVICE SPECIAL CONDITIONS OR           >>                11040000
<<          - SCHEDULE AN IDLE CHANNEL PROGRAM        >>                11045000
<<---------------------------------------------------->>                11050000
                                                                        11055000
     IF MSTATE= 2 THEN IF IOQ'ENTRY'INDEX = 0 THEN             <<07045>>11060000
                                                                        11065000
       BEGIN                                                            11070000
                                                               <<03722>>11075000
        IF CPVAP.ERRORCODE=6 OR    << DMA ABORT >>             <<03722>>11080000
          CPVAP.ERRORCODE=7 THEN   << CHANNEL ABORT >>         <<03722>>11085000
           GOTO IDLE'NOT'READY;                                <<03722>>11090000
                                                                        11095000
         IF CPVAP(1).(12:4) = 1 THEN   << STATUS DIAGNOSIS >>           11100000
                                                                        11105000
           BEGIN                                                        11110000
             CPVAP(1).(12:4) := 0;                                      11115000
                                                                        11120000
             IF ISTAT(I'FAULT'FIELD).POWER'FAIL THEN                    11125000
               GOTO IDLE'PON;                                           11130000
                                                                        11135000
             IF ISTAT(I'FAULT'FIELD).INT'MAINT'REQRD OR                 11140000
                ISTAT(I'INFOR'FIELD).OPER'REL'REQST OR                  11145000
                ISTAT(I'INFOR'FIELD).DIAG'REL'REQST OR                  11150000
                ISTAT(I'INFOR'FIELD).INT'MAINT'REQST THEN               11155000
                                                                        11160000
               BEGIN   << RELEASE/RELEASE DENY REQUEST >>               11165000
                 SIOP(DIAG) := WRT'CMD'SEC;                             11170000
                 SIOP(DIAG1) := 2;                                      11175000
                 SIOP(DIAG3) := %2000;                                  11180000
                 SIOP(DIAG4) := @SIOP + SYSDB + CDB'AREA'WRD;           11185000
                 SIOP(DIAG5) := %1000;                                  11190000
                 SIOP(DIAG6) := 0;                                      11195000
                                                                        11200000
                 SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT            <<03722>>11205000
                   +CTRL'UNIT);                                <<03722>>11210000
                 SIOPB(CDB'AREA'BYTE+1 ,                       <<03722>>11215000
                   IF ISTAT(I'FAULT'FIELD).INT'MAINT'REQRD OR           11220000
                      ISTAT(I'INFOR'FIELD).INT'MAINT'REQST OR           11225000
                      ISTAT(I'INFOR'FIELD).OPER'REL'REQST AND           11230000
                      ISTAT(I'ACCESS'FIELD).DEV'NOT'RDY OR              11235000
                      ISTAT(I'INFOR'FIELD).OPER'REL'REQST AND           11240000
                      DITP(DMISC).LOCK'FLG <> 1 THEN                    11245000
                        CDB'RELEASE                                     11250000
                      ELSE                                              11255000
                        CDB'RELEASE'DENY);                     <<03722>>11260000
                                                                        11265000
                 IF ISTAT(I'INFOR'FIELD).OPER'REL'REQST AND             11270000
                   DITP(DMISC).LOCK'FLG = 1 AND                         11275000
                   ISTAT(I'ACCESS'FIELD).NOT'RDY = 0 THEN               11280000
                                                                        11285000
                   BEGIN                                                11290000
                     IF SYSDISC=1 THEN INDEX := SYS'DENY'MSG            11295000
                       ELSE INDEX := NSYS'DENY'MSG;                     11300000
                     IOMESSAGE(1,INDEX,%10000,DITP(DLDEV),     <<07045>>11305000
                               ,,,,OPCONSOLE);                          11310000
                   END;                                                 11315000
                                                                        11320000
                 IF ISTAT(I'INFOR'FIELD).OPER'REL'REQST OR     <<03667>>11325000
                   ISTAT(I'ACCESS'FIELD).DEV'NOT'RDY THEN      <<03667>>11330000
                   DITP(DMISC).IGNORE'INT'FLG := 0                      11335000
                 ELSE                                                   11340000
                   DITP(DMISC).IGNORE'INT'FLG := 1;                     11345000
                                                                        11350000
                 SIOP(BRANCHPT) := DIAGCP;                              11355000
                 START'HPIB(DITP,SIOP,TRUE);                            11360000
                 DITP(DMISC).SUBSTATE := IDLE'REQ'WAIT;                 11365000
                 MSTATE := REQUESTDONE;                                 11370000
                 RETURN;                                                11375000
               END;                                                     11380000
                                                                        11385000
             IF ISTAT(I'INFOR'FIELD).MAINT'TRK'OV THEN                  11390000
               BEGIN                                                    11395000
                 MAINT'REQUEST(DITP(DLDEV),TYPE,SUBTYPE);      <<07045>>11400000
                 GOTO IDLE'CP;                                          11405000
               END;                                                     11410000
                                                                        11415000
           END;                                                         11420000
                                                                        11425000
         IF CPVAP(1).(12:4) = 4 THEN   << IDLE PON OCCURRED >>          11430000
  IDLE'PON:                                                             11435000
           BEGIN                                                        11440000
             CPVAP(1).(12:4) := 0;                                      11445000
             SIOP(BRANCHPT) := PONCP;   << DEVICE CLEAR >>              11450000
             START'HPIB(DITP,SIOP,TRUE);                                11455000
             DITP(DMISC).IGNORE'INT'FLG := 0;                           11460000
             DITP(DMISC).SUBSTATE := IDLE'REQ'WAIT;                     11465000
             MSTATE := REQUESTDONE;                                     11470000
             RETURN;                                                    11475000
           END;                                                         11480000
                                                                        11485000
  IDLE'CP:                                                              11490000
         IF DITP(DMISC).SUBSTATE = IDLE'REQ'WAIT THEN          <<03667>>11495000
           DITP(DMISC).SUBSTATE := 0  << IDLE WAIT DONE >>     <<03667>>11500000
         ELSE                                                  <<03667>>11505000
            DITP(DMISC).IGNORE'INT'FLG := 1;                   <<03667>>11510000
         SIOP(RSTAT11) := @ISTAT + SYSDB;                               11515000
                                                                        11520000
         CPVAP(1).(12:4) := 0;                                          11525000
         START'HPIB(DITP,SIOP(IDLE'WAIT),FALSE);               <<M7991>>11530000
         MSTATE := REQUESTDONE;                                         11535000
         RETURN;                                                        11540000
                                                                        11545000
       END;                                                             11550000
                                                                        11555000
<<---------------------------------------------------->>                11560000
<<   IDLE REQUEST CURRENTLY BEING SERVICED, DEFER     >>                11565000
<<   CURRENT REQUEST UNTIL IDLE REQUEST COMPLETED     >>                11570000
<<---------------------------------------------------->>                11575000
                                                                        11580000
     IF MSTATE=2 AND DITP(DMISC).SUBSTATE=IDLE'REQ'WAIT THEN            11585000
       BEGIN                                                            11590000
         IOQ'QMISC.WAITCODE:= IOQ'DEFER'WAIT;                  <<07045>>11595000
         MSTATE := INTRPTWAIT;                                          11600000
         RETURN;                                                        11605000
       END;                                                             11610000
                                                                        11615000
<<---------------------------------------------------->>                11620000
<<   MAP FROM EXTERNAL TO INTERNAL FUNCTION CODE      >>                11625000
<<                                                    >>                11630000
<<   FUNCTION CODE 15 --> INTERNAL CODE 7             >>                11635000
<<   FUNCTION CODE 11 --> INTERNAL CODE 10            >>                11640000
<<                                                    >>                11645000
<<   FUNCTION CODE 13-14 --> INTERNAL CODE 11-12      >>                11650000
<<   FUNCTION CODE 16-18 --> INTERNAL CODE 13-15      >>                11655000
<<   FUNCTION CODE 72-94 --> INTERNAL CODE 16-38      >>                11660000
<<---------------------------------------------------->>                11665000
                                                                        11670000
     IF  FCODE = 10 THEN GOTO INVALIDFUNC;                              11675000
     IF FCODE=12 THEN GOTO INVALIDFUNC;                                 11680000
                                                                        11685000
     IF FCODE=11 THEN FCODE := 10 ELSE                                  11690000
     IF (13 <= FCODE <= 14) THEN FCODE := FCODE - 2 ELSE                11695000
     IF FCODE=15 THEN FCODE := 7 ELSE                                   11700000
     IF (16 <= FCODE <= 18) THEN FCODE := FCODE - 3 ELSE                11705000
     IF (72 <= FCODE <= 94) THEN FCODE := FCODE - 56;                   11710000
     IF NOT (0 <= FCODE <= 38) THEN GOTO INVALIDFUNC;                   11715000
                                                                        11720000
<<---------------------------------------------------->>                11725000
<<   IOQ DEFERRED REQUEST COMPLETION - REDO REQUEST   >>                11730000
<<---------------------------------------------------->>                11735000
                                                                        11740000
    IF IOQ'QMISC.WAITCODE= IOQ'DEFER'WAIT THEN                 <<07045>>11745000
       BEGIN                                                            11750000
         DITP(DMISC).SUBSTATE := 0;   << RESET SUBSTATE >>              11755000
         IF ISTAT(I'INFOR'FIELD).MAINT'TRK'OV THEN                      11760000
           MAINT'REQUEST(DITP(DLDEV),TYPE,SUBTYPE);            <<07045>>11765000
         GOTO RETRY'REQUEST;                                            11770000
       END;                                                             11775000
                                                                        11780000
<<---------------------------------------------------->>                11785000
<<   NOT READY COMPLETION - GO TO COMPLETOR SECTION   >>                11790000
<<---------------------------------------------------->>                11795000
                                                                        11800000
     IF IOQ'QMISC.WAITCODE= NOT'RDY'WAIT THEN                  <<07045>>11805000
       GOTO CONTINUATOR;                                                11810000
                                                                        11815000
$PAGE                                                                   11820000
<<---------------------------------------------------->>                11825000
<<   INITIATOR CALL - INITIALIZE OR RESET VARIABLES   >>                11830000
<<                    POSSIBLY CHANGED IN LAST REQ.   >>                11835000
<<                  - CASE TO A DRIVER FUNCTION CODE  >>                11840000
<<---------------------------------------------------->>                11845000
                                                                        11850000
IF MSTATE=2 THEN                                                        11855000
                                                                        11860000
  BEGIN                                                                 11865000
                                                                        11870000
    IF FCODE <> REQ'STAT OR                                             11875000
       FCODE <> DIAG'RESULT THEN CLEAR'STATUS;                          11880000
                                                                        11885000
  RETRY'REQUEST:                                                        11890000
                                                                        11895000
    SIOP(RSTAT11) := @DITP + SYSDB + DSTATUS;                           11900000
    SIOP(DXFER) := WRT'CMD'SEC;                                         11905000
    SIOP(DXFER5) := SIOP(DXFER16) := %1000;                             11910000
    SIOP(DXFER6) := SIOP(DXFER17) := 0;                                 11915000
    SIOP(DXFER10) := 0;                                                 11920000
    SIOP(DIAG) := WRT'CMD'SEC;                                          11925000
    SIOP(DIAG3) := %2000;                                               11930000
    SIOP(DIAG4) := @SIOP + SYSDB + CDB'AREA'WRD;                        11935000
    SIOP(DIAG5) := %1000;                                               11940000
    SIOP(DIAG6) := 0;                                                   11945000
    SIOP(IDENT2) := %601;                                               11950000
    SIOP(IDENT3) := 0;                                                  11955000
                                                                        11960000
    INDEX := CDB'AREA'WRD;                                              11965000
    DO SIOP(INDEX) := 0 UNTIL   << ZERO CDB AREA >>                     11970000
      (INDEX := INDEX + 1) > CDB'AREA'WRD+9;                            11975000
                                                                        11980000
$PAGE                                                                   11985000
    CASE FCODE OF                                                       11990000
     BEGIN                                                              11995000
                                                                        12000000
<<--------------------------------------------------------->>           12005000
<<                                                         >>           12010000
<<   FCODE   FUNCTION                    INTERNAL FCODE    >>           12015000
<<   -----   --------                    --------------    >>           12020000
<<                                                         >>           12025000
<<      0    READ                              0           >>           12030000
<<      1    WRITE                             1           >>           12035000
<<      2    FILE OPEN                         2           >>           12040000
<<      3    FILE CLOSE                        3           >>           12045000
<<      4    DEVICE CLOSE                      4           >>           12050000
<<      5    FILL WITH ZERO                    5           >>           12055000
<<      6    FILE WITH BLANKS                  6           >>           12060000
<<   7,15    REQUEST STATUS                    7           >>           12065000
<<      8    INITIALIZE MEDIA                  8           >>           12070000
<<     11    WRITE DISC LABEL                  9           >>           12075000
<<     13    REQUEST VOLUME LIMIT             10           >>           12080000
<<     14    VERIFY                           11           >>           12085000
<<     16    LOCK                             12           >>           12090000
<<     17    UNLOCK                           13           >>           12095000
<<                                                         >>           12100000
<<     72    IDENTIFY                         14           >>           12105000
<<     73    INITIATE DIAGNOSTIC              15           >>           12110000
<<     74    DIAGNOSTIC RESULT                16           >>           12115000
<<     75    LOOPBACK WRITE                   17           >>           12120000
<<     76    LOOPBACK READ                    18           >>           12125000
<<     77    GENERAL PURPOSE COMMAND          19           >>           12130000
<<     78    DESCRIBE                         20           >>           12135000
<<     79    RELEASE                          21           >>           12140000
<<     80    RELEASE DENIED                   22           >>           12145000
<<     81    SET RELEASE                      23           >>           12150000
<<     82    SET ADDRESS                      24           >>           12155000
<<     83    SET BLOCK DISPLACEMENT           25           >>           12160000
<<     84    SET MASK STATUS                  26           >>           12165000
<<     85    SET RETURN ADDRESSING MODE       27           >>           12170000
<<     86    SET RETRY TIME                   28           >>           12175000
<<     87    SET RPS                          29           >>           12180000
<<     88    SPARE BLOCK                      30           >>           12185000
<<     89    READ AT PHYSICAL ADDRESS         31           >>           12190000
<<     90    WRITE AT PHYSICAL ADDRESS        32           >>           12195000
<<     91    INITIATE UTILITY                 33           >>           12200000
<<     92    DEVICE CLEAR                     34           >>           12205000
<<     93    CANCEL TRANSACTION               35           >>           12210000
<<     94    PARITY CHECKING                  36           >>           12215000
<<                                                         >>           12220000
<<--------------------------------------------------------->>           12225000
                                                                        12230000
$PAGE                                                                   12235000
<<---------------------------------------------------->>                12240000
<<                                                    >>                12245000
<<   READ [FUNCTION CODE = 0]                         >>                12250000
<<                                                    >>                12255000
<<   COUNT - TRANSFER COUNT                           >>                12260000
<<   BANK & BUFFADDR - CONTAINS DATA READ             >>                12265000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                12270000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                12275000
<<                                                    >>                12280000
<<---------------------------------------------------->>                12285000
                                                                        12290000
     BEGIN                                                              12295000
                                                                        12300000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   12305000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   12310000
                                                                        12315000
       CLDA1:= IOQ'PARM1;     <<LOGICAL SECTOR ADDR1 >>        <<07045>>12320000
       CLDA2:= IOQ'PARM2;     <<LOGICAL SECTOR ADDR2 >>        <<07045>>12325000
                                                                        12330000
       SET'BYTE'COUNT;                                                  12335000
       SET'CMD'BYTES;                                                   12340000
                                                                        12345000
       SIOP(DXFER1) := 16;   << CDB BYTE COUNT >>                       12350000
                                                                        12355000
       IF COUNT=0 THEN   << NO TRANSFER COUNT >>                        12360000
                                                                        12365000
         BEGIN                                                          12370000
           SIOP(DXFER5) := 0;   << BYPASS EXEC MSG >>                   12375000
           SIOP(DXFER6) := 5;   << JUMP *+5 >>                          12380000
         END                                                            12385000
                                                                        12390000
       ELSE   << SET UP EXECUTING MESSAGE >>                            12395000
                                                                        12400000
         BEGIN                                                          12405000
           SIOP(DXFER7) := READ'EXEC'SEC;                               12410000
           SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>               12415000
           SIOP(DXFER9) := 0;       << 256 BYTE BURST  >>               12420000
           SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>               12425000
           SIOP(DXFER10).(0:1) := 1;    << BURST MODE BIT >>            12430000
           SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>       12435000
         END;                                                           12440000
                                                                        12445000
       SIOPB(CDB'AREA'BYTE+15 , CDB'READ);                     <<03722>>12450000
                                                                        12455000
       SIOP(BRANCHPT) := DXFERCP;                                       12460000
                                                                        12465000
     END;                                                               12470000
$PAGE                                                                   12475000
<<---------------------------------------------------->>                12480000
<<                                                    >>                12485000
<<   WRITE [FUNCTION CODE = 1]                        >>                12490000
<<                                                    >>                12495000
<<   COUNT - TRANSFER COUNT                           >>                12500000
<<   BANK & BUFFADDR - CONTAINS DATA FOR WRITE        >>                12505000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                12510000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                12515000
<<                                                    >>                12520000
<<---------------------------------------------------->>                12525000
                                                                        12530000
     BEGIN                                                              12535000
                                                                        12540000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   12545000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   12550000
                                                                        12555000
       CLDA1:= IOQ'PARM1.(1:15); <<LOGICAL SECTOR ADDR1 >>     <<07045>>12560000
       CLDA2:= IOQ'PARM2;     <<LOGICAL SECTOR ADDR2 >>        <<07045>>12565000
                                                                        12570000
       << WRITE TO DISC LABEL (SECTOR 0) INVALID >>                     12575000
                                                                        12580000
       IF FOREIGN=0 AND CLDA1=0 AND CLDA2=0 THEN                        12585000
         GOTO INVALIDFUNC;                                              12590000
                                                                        12595000
       SET'BYTE'COUNT;                                                  12600000
       SET'CMD'BYTES;                                                   12605000
                                                                        12610000
       SIOPB(CDB'AREA'BYTE+15 , CDB'SET'OPTIONS);              <<03722>>12615000
       IF IOQ'PARM1.(0:1) = 1 THEN                             <<07045>>12620000
           SIOPB(CDB'AREA'BYTE+16 , CDB'SKIP'SPARE)            <<03722>>12625000
         ELSE                                                           12630000
           SIOPB(CDB'AREA'BYTE+16 , CDB'JUMP'SPARE);           <<03722>>12635000
                                                                        12640000
       SIOP(DXFER1) := 18;   << CDB BYTE COUNT >>                       12645000
                                                                        12650000
       IF COUNT=0 THEN   << NO TRANSFER COUNT >>                        12655000
                                                                        12660000
         BEGIN                                                          12665000
           SIOP(DXFER5) := 0;   << BYPASS EXEC MSG >>                   12670000
           SIOP(DXFER6) := 5;   << JUMP *+5 >>                          12675000
         END                                                            12680000
                                                                        12685000
       ELSE   << SET UP EXECUTING MESSAGE >>                            12690000
                                                                        12695000
         BEGIN                                                          12700000
           SIOP(DXFER7) := WRT'EXEC'SEC;                                12705000
           SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>               12710000
           SIOP(DXFER9) := 0;       << 256 BYTE BURST >>                12715000
           SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>               12720000
           SIOP(DXFER10).(0:3) := 5;  << BM AND NE BITS >>              12725000
           SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>       12730000
         END;                                                           12735000
                                                                        12740000
       SIOPB(CDB'AREA'BYTE+17 , CDB'WRITE);                    <<03722>>12745000
                                                                        12750000
       SIOP(BRANCHPT) := DXFERCP;                                       12755000
                                                                        12760000
     END;                                                               12765000
$PAGE                                                                   12770000
<<---------------------------------------------------->>                12775000
<<                                                    >>                12780000
<<   FILE OPEN [FUNCTION CODE = 2]                    >>                12785000
<<                                                    >>                12790000
<<---------------------------------------------------->>                12795000
                                                                        12800000
     BEGIN                                                              12805000
       GOTO GOODXFER;                                                   12810000
     END;                                                               12815000
                                                                        12820000
                                                                        12825000
<<---------------------------------------------------->>                12830000
<<                                                    >>                12835000
<<   FILE CLOSE [FUNCTION CODE = 3]                   >>                12840000
<<                                                    >>                12845000
<<---------------------------------------------------->>                12850000
                                                                        12855000
     BEGIN                                                              12860000
       GOTO GOODXFER;                                                   12865000
     END;                                                               12870000
                                                                        12875000
                                                                        12880000
<<---------------------------------------------------->>                12885000
<<                                                    >>                12890000
<<   DEVICE CLOSE [FUNCTION CODE = 4]                 >>                12895000
<<                                                    >>                12900000
<<---------------------------------------------------->>                12905000
                                                                        12910000
     BEGIN                                                              12915000
       GOTO GOODXFER;                                                   12920000
     END;                                                               12925000
                                                                        12930000
$PAGE                                                                   12935000
<<---------------------------------------------------->>                12940000
<<                                                    >>                12945000
<<   FILL WITH ZEROS [FUNCTION CODE = 5]              >>                12950000
<<                                                    >>                12955000
<<   COUNT - TRANSFER COUNT                           >>                12960000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                12965000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                12970000
<<                                                    >>                12975000
<<---------------------------------------------------->>                12980000
                                                                        12985000
     BEGIN                                                              12990000
                                                                        12995000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   13000000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   13005000
                                                                        13010000
       CLDA1:= IOQ'PARM1.(1:15); << LOGICAL SECTOR ADDR1 >>    <<07045>>13015000
       CLDA2:= IOQ'PARM2;     <<LOGICAL SECTOR ADDR2 >>        <<07045>>13020000
                                                                        13025000
       << WRITE TO DISC LABEL (SECTOR 0) INVALID >>                     13030000
                                                                        13035000
       IF FOREIGN=0 AND CLDA1=0 AND CLDA2=0 THEN                        13040000
         GOTO INVALIDFUNC;                                              13045000
                                                                        13050000
       SET'BYTE'COUNT;                                                  13055000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                13060000
       SET'CMD'BYTES;                                                   13065000
                                                                        13070000
       SIOPB(CDB'AREA'BYTE+15 , CDB'SET'OPTIONS);              <<03722>>13075000
       IF IOQ'PARM1.(0:1) = 1 THEN                             <<07045>>13080000
           SIOPB(CDB'AREA'BYTE+16 , CDB'SKIP'SPARE)            <<03722>>13085000
         ELSE                                                           13090000
           SIOPB(CDB'AREA'BYTE+16 , CDB'JUMP'SPARE);           <<03722>>13095000
                                                                        13100000
       SIOP(DXFER1) := 18;   << CDB BYTE COUNT >>                       13105000
       SIOP(DXFER7) := WRT'EXEC'SEC;                                    13110000
       SIOP(DXFER8) := COUNT;   << FILL BYTE COUNT >>                   13115000
       SIOP(DXFER9) := 0;       << 256 BYTE BURST >>                    13120000
       SIOP(DXFER10).SABIT := 1;   << WRT FROM SINGLE ADDR >>           13125000
       SIOP(DXFER10).(8:8) := 0;                                        13130000
       SIOP(DXFER10).(0:3) := 5;     << BM AND NE BITS >>               13135000
       SIOP(DXFER11) := @SIOP + SYSDB + FILL'WRD;                       13140000
                                                                        13145000
       SIOP(FILL'WRD) := 0;   << FILL WORD OF 0 >>                      13150000
       SIOPB(CDB'AREA'BYTE+17 , CDB'WRITE);                    <<03722>>13155000
                                                                        13160000
       SIOP(BRANCHPT) := DXFERCP;                                       13165000
                                                                        13170000
     END;                                                               13175000
                                                                        13180000
$PAGE                                                                   13185000
<<---------------------------------------------------->>                13190000
<<                                                    >>                13195000
<<   FILL WITH BLANKS [FUNCTION CODE = 6]             >>                13200000
<<                                                    >>                13205000
<<   COUNT - TRANSFER COUNT                           >>                13210000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                13215000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                13220000
<<                                                    >>                13225000
<<---------------------------------------------------->>                13230000
                                                                        13235000
     BEGIN                                                              13240000
                                                                        13245000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   13250000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   13255000
                                                                        13260000
       CLDA1:= IOQ'PARM1.(1:15); <<LOGICAL SECTOR ADDR1 >>     <<07045>>13265000
       CLDA2:= IOQ'PARM2;     <<LOGICAL SECTOR ADDR2 >>        <<07045>>13270000
                                                                        13275000
       << WRITE TO DISC LABEL (SECTOR 0) INVALID >>                     13280000
                                                                        13285000
       IF FOREIGN=0 AND CLDA1=0 AND CLDA2=0 THEN                        13290000
         GOTO INVALIDFUNC;                                              13295000
                                                                        13300000
       SET'BYTE'COUNT;                                                  13305000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                13310000
       SET'CMD'BYTES;                                                   13315000
                                                                        13320000
       SIOPB(CDB'AREA'BYTE+15 , CDB'SET'OPTIONS);              <<03722>>13325000
       IF IOQ'PARM1.(0:1) = 1 THEN                             <<07045>>13330000
           SIOPB(CDB'AREA'BYTE+16 , CDB'SKIP'SPARE)            <<03722>>13335000
         ELSE                                                           13340000
           SIOPB(CDB'AREA'BYTE+16 , CDB'JUMP'SPARE);           <<03722>>13345000
                                                                        13350000
       SIOP(DXFER1) := 18;   << CDB BYTE COUNT >>                       13355000
       SIOP(DXFER7) := WRT'EXEC'SEC;                                    13360000
       SIOP(DXFER8) := COUNT;   << FILL BYTE COUNT >>                   13365000
       SIOP(DXFER9) := 0;       << 256 BYTE BURST >>                    13370000
       SIOP(DXFER10).SABIT := 1;   << WRT FROM SINGLE ADDR >>           13375000
       SIOP(DXFER10).(8:8) := 0;                                        13380000
       SIOP(DXFER10).(0:3) := 5;    << BM AND NE BITS >>                13385000
       SIOP(DXFER11) := @SIOP + SYSDB + FILL'WRD;                       13390000
                                                                        13395000
       SIOP(FILL'WRD) := %20040;   << FILL WORD OF BLANKS >>            13400000
       SIOPB(CDB'AREA'BYTE+17 , CDB'WRITE);                    <<03722>>13405000
                                                                        13410000
       SIOP(BRANCHPT) := DXFERCP;                                       13415000
                                                                        13420000
     END;                                                               13425000
                                                                        13430000
$PAGE                                                                   13435000
<<---------------------------------------------------->>                13440000
<<                                                    >>                13445000
<<   REQUEST STATUS [FUNCTION CODE = 7 & 15]          >>                13450000
<<                                                    >>                13455000
<<   COUNT - STATUS LENGTH (MAX 20 BYTES)             >>                13460000
<<   BANK & BUFFADDR - RETURNS THE STATUS OR %101010  >>                13465000
<<   P1 - 8 (DENOTES A CALL FROM DEVREC)              >>                13470000
<<   P2 - 9 (DENOTES A CALL FROM DEVREC)              >>                13475000
<<                                                    >>                13480000
<<---------------------------------------------------->>                13485000
                                                                        13490000
     BEGIN                                                              13495000
                                                                        13500000
     << P1 = IOQP(QPAR1) >>                                             13505000
     << P2 = IOQP(QPAR2) >>                                             13510000
                                                                        13515000
  REQ'STATUS:                                                           13520000
                                                                        13525000
       SET'BYTE'COUNT;                                                  13530000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                13535000
                                                                        13540000
       IF DITP(DMISC).IGNORE'INT'FLG=1 AND                              13545000
         IOQ'PARM1=8 AND IOQ'PARM2= 9 THEN                     <<07045>>13550000
                                                                        13555000
           BEGIN                                                        13560000
             DITP(DMISC).IGNORE'INT'FLG := 0;                           13565000
             TOS := BUFFADDRD;                                          13570000
             TOS := %101010;                                            13575000
             ASSEMBLE (SSEA);                                           13580000
             GOTO GOODXFER;                                             13585000
           END;                                                         13590000
                                                                        13595000
       TOS := 0;                                                        13600000
       TOS := @SIOP + SYSDB + DESC'AREA;                                13605000
       TOS := 0;                                                        13610000
       TOS := @DITP + SYSDB + DSTATUS;                                  13615000
       TOS := 10;                                                       13620000
       ASSEMBLE (MABS);   << SAVE LAST STATUS IN DESC AREA >>           13625000
       CLEAR'STATUS;                                                    13630000
                                                                        13635000
       SIOP(DIAG1) := 7;   << DO SEEK TO FORCE STATUS >>                13640000
                                                                        13645000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>13650000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'LENGTH);                <<03722>>13655000
       SIOPB(CDB'AREA'BYTE+2 , 0);                             <<03722>>13660000
       SIOPB(CDB'AREA'BYTE+3 , 0);                             <<03722>>13665000
       SIOPB(CDB'AREA'BYTE+4 , 0);                             <<03722>>13670000
       SIOPB(CDB'AREA'BYTE+5 , 0);                             <<03722>>13675000
       SIOPB(CDB'AREA'BYTE+6 , CDB'WRITE);                     <<03722>>13680000
                                                                        13685000
       SIOP(IDENT2) := 0;     << IDENTIFY 1ST TO  >>                    13690000
       SIOP(IDENT3) := -29;   << DET CTRL HOOK UP >>                    13695000
       SIOP(BRANCHPT) := IDENTCP;                                       13700000
                                                                        13705000
     END;                                                               13710000
$PAGE                                                                   13715000
<<---------------------------------------------------->>                13720000
<<                                                    >>                13725000
<<   INITIALIZE MEDIA [FUNCTION CODE = 8]             >>                13730000
<<                                                    >>                13735000
<<   P1 - 0 RETAIN FACTORY, FIELD SPARES              >>                13740000
<<      - 1 RETAIN FACTORY SPARES ONLY                >>                13745000
<<   P2 - BLOCK INTERLEAVE BYTE (BINARY NUMBER)       >>                13750000
<<                                                    >>                13755000
<<---------------------------------------------------->>                13760000
                                                                        13765000
     BEGIN                                                              13770000
                                                                        13775000
       << P1 = IOQP(QPAR1) >>                                           13780000
       << P2 = IOQP(QPAR2) >>                                           13785000
                                                                        13790000
       SIOP(DIAG1) := 4;                                                13795000
       IF NOT (0 <= INTEGER(IOQ'PARM1) <= 4) THEN              <<07045>>13800000
         GOTO INVALIDFUNC;                                              13805000
                                                                        13810000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>13815000
       SIOPB(CDB'AREA'BYTE+1 , CDB'INIT'MEDIA);                <<03722>>13820000
       SIOPB(CDB'AREA'BYTE+2, IOQ'PARM1.(8:8));                <<07045>>13825000
       SIOPB(CDB'AREA'BYTE+3, IOQ'PARM2.(8:8));                <<07045>>13830000
                                                                        13835000
       SIOP(BRANCHPT) := DIAGCP;                                        13840000
                                                                        13845000
     END;                                                               13850000
$PAGE                                                                   13855000
<<---------------------------------------------------->>                13860000
<<                                                    >>                13865000
<<       UNLOAD (FUNCTION CODE =9)                    >>                13870000
<<                                                    >>                13875000
<<---------------------------------------------------->>                13880000
                                                                        13885000
     BEGIN                                                              13890000
                                                                        13895000
       SIOP(DIAG1) := 2;                                                13900000
                                                                        13905000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>13910000
       SIOPB(CDB'AREA'BYTE+1 , CDB'UNLOAD);                    <<03722>>13915000
                                                                        13920000
       SIOP(BRANCHPT) := DIAGCP;                                        13925000
                                                                        13930000
     END;                                                               13935000
                                                                        13940000
$PAGE                                                                   13945000
<<---------------------------------------------------->>                13950000
<<                                                    >>                13955000
<<   WRITE DISC LABEL [FUNCTION CODE = 11]            >>                13960000
<<                                                    >>                13965000
<<   COUNT - TRANSFER COUNT                           >>                13970000
<<   BANK & BUFFADDR - CONTAINS DISC LABEL INFO       >>                13975000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                13980000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                13985000
<<                                                    >>                13990000
<<---------------------------------------------------->>                13995000
                                                                        14000000
     BEGIN                                                              14005000
                                                                        14010000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   14015000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   14020000
                                                                        14025000
       CLDA1:= IOQ'PARM1.(1:15); <<LOGICAL SECTOR ADDR1 >>     <<07045>>14030000
       CLDA2:= IOQ'PARM2;     <<LOGICAL SECTOR ADDR2 >>        <<07045>>14035000
                                                                        14040000
       SET'BYTE'COUNT;                                                  14045000
       SET'CMD'BYTES;                                                   14050000
                                                                        14055000
       SIOPB(CDB'AREA'BYTE+15 , CDB'SET'OPTIONS);              <<03722>>14060000
       IF IOQ'PARM1.(0:1) = 1 THEN                             <<07045>>14065000
           SIOPB(CDB'AREA'BYTE+16 , CDB'SKIP'SPARE)            <<03722>>14070000
         ELSE                                                           14075000
           SIOPB(CDB'AREA'BYTE+16 , CDB'JUMP'SPARE);           <<03722>>14080000
                                                                        14085000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                14090000
                                                                        14095000
       SIOP(DXFER1) := 18;   << CDB BYTE COUNT >>                       14100000
       SIOP(DXFER7) := WRT'EXEC'SEC;                                    14105000
       SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>                   14110000
       SIOP(DXFER9) := 0;       << 256 BYTE BURST >>                    14115000
       SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>                   14120000
       SIOP(DXFER10).(0:3) := 5;   << BM AND NE BITS >>                 14125000
       SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>           14130000
                                                                        14135000
       SIOPB(CDB'AREA'BYTE+17 , CDB'WRITE);                    <<03722>>14140000
                                                                        14145000
       SIOP(BRANCHPT) := DXFERCP;                                       14150000
                                                                        14155000
     END;                                                               14160000
$PAGE                                                                   14165000
<<---------------------------------------------------->>                14170000
<<                                                    >>                14175000
<<   REQUEST VOLUME LIMIT [FUNCTION CODE = 13]        >>                14180000
<<                                                    >>                14185000
<<   BANK & BUFFADDR - RETURNS A DBL WRD ADDRESS OF   >>                14190000
<<                     THE MAXIMUM VOLUME LIMIT       >>                14195000
<<   P1 - 0 RETURN A SINGLE VECTOR ADDRESS            >>                14200000
<<      - 1 RETURN A THREE VECTOR ADDRESS             >>                14205000
<<                                                    >>                14210000
<<---------------------------------------------------->>                14215000
                                                                        14220000
     BEGIN                                                              14225000
                                                                        14230000
       << P1 = IOQP(QPAR1) >>                                           14235000
                                                                        14240000
       IF NOT (0 <= INTEGER(IOQ'PARM1) <= 1) THEN              <<07045>>14245000
         GOTO INVALIDFUNC;                                              14250000
                                                                        14255000
       SIOP(DXFER1) := 2;   << CDB BYTE COUNT >>                        14260000
       SIOP(DXFER7) := READ'EXEC'SEC;                                   14265000
       SIOP(DXFER8) := MAX'DESC'BYTE;   << MAX# DESC BYTES >>           14270000
       SIOP(DXFER10).(8:8) := 0;   << DESCRIBE AREA >>                  14275000
       SIOP(DXFER11) := @SIOP + SYSDB + DESC'AREA;                      14280000
                                                                        14285000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>14290000
       SIOPB(CDB'AREA'BYTE+1 , CDB'DESCRIBE);                  <<03722>>14295000
                                                                        14300000
       SIOP(BRANCHPT) := DXFERCP;                                       14305000
                                                                        14310000
     END;                                                               14315000
$PAGE                                                                   14320000
<<---------------------------------------------------->>                14325000
<<                                                    >>                14330000
<<   VERIFY [FUNCTION CODE = 14]                      >>                14335000
<<                                                    >>                14340000
<<   BANK & BUFFADDR - ENTRY   A DBL WRD ADDRESS OF   >>       <<04834>>14345000
<<                     VERIFY LENGTH                  >>       <<04834>>14350000
<<   BANK & BUFFADDR - RETURNS A DBL WRD ADDRESS OF   >>                14355000
<<                     1ST BAD SECTOR ENCOUNTERED     >>                14360000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                14365000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                14370000
<<                                                    >>                14375000
<<---------------------------------------------------->>                14380000
                                                                        14385000
     BEGIN                                                              14390000
                                                                        14395000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   14400000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   14405000
                                                                        14410000
       CLDA1:= IOQ'PARM1;     <<LOGICAL SECTOR ADDR1 >>        <<07045>>14415000
       CLDA2:= IOQ'PARM2;     <<LOGICAL SECTOR ADDR2 >>        <<07045>>14420000
                                                                        14425000
       SET'CMD'BYTES;                                          <<04834>>14430000
       TOS := BUFFADDRD;      << GET BANK & OFFSET OF BUFFER >><<04834>>14435000
       ASSEMBLE(LDEA;DXCH,DDEL);<<GET FRST 2 WORDS OF BUFFER >><<04834>>14440000
       VER'LEN := TOS;   << STORE VERIFY BYTE LENGTH >>        <<04834>>14445000
       INDEX := CDB'AREA'BYTE + 9 ;  << OFFSET OF LENGTH >>    <<04834>>14450000
       SIOPB(INDEX,L1'VER'LEN.(0:8)); <<PUT LEN IN CMND SEQ.>> <<04834>>14455000
       SIOPB(INDEX+1,L1'VER'LEN.(8:8));                        <<04834>>14460000
       SIOPB(INDEX+2,L2'VER'LEN.(0:8));                        <<04834>>14465000
       SIOPB(INDEX+3,L2'VER'LEN.(8:8));                        <<04834>>14470000
                                                               <<04834>>14475000
       SIOP(DIAG1) := 14;   << CDB BYTE COUNT >>                        14480000
       SIOPB(CDB'AREA'BYTE+13 , CDB'VERIFY);                   <<03722>>14485000
                                                                        14490000
       SIOP(BRANCHPT) := DIAGCP;                                        14495000
                                                                        14500000
     END;                                                               14505000
$PAGE                                                                   14510000
<<---------------------------------------------------->>                14515000
<<                                                    >>                14520000
<<   LOCK [FUNCTION CODE = 16]                        >>                14525000
<<                                                    >>                14530000
<<---------------------------------------------------->>                14535000
                                                                        14540000
     BEGIN                                                              14545000
       DITP(DMISC).LOCK'FLG := 1;                                       14550000
       GOTO GOODXFER;                                                   14555000
     END;                                                               14560000
$PAGE                                                                   14565000
<<---------------------------------------------------->>                14570000
<<                                                    >>                14575000
<<   UNLOCK [FUNCTION CODE = 17]                      >>                14580000
<<                                                    >>                14585000
<<---------------------------------------------------->>                14590000
                                                                        14595000
     BEGIN                                                              14600000
      DITP(DMISC).LOCK'FLG := 0;                                        14605000
      GOTO GOODXFER;                                                    14610000
     END;                                                               14615000
$PAGE                                                                   14620000
<<---------------------------------------------------->>                14625000
<<                                                    >>                14630000
<<       READ LOCK BIT (FUNCTION 18)                  >>                14635000
<<                                                    >>                14640000
<<       BANK & BUFFADDR - CONTAIN LOCK BIT STATE     >>                14645000
<<                                                    >>                14650000
<<---------------------------------------------------->>                14655000
                                                                        14660000
     BEGIN                                                              14665000
                                                                        14670000
       TOS := BANK;                                                     14675000
       TOS := BUFFADDR;                                                 14680000
       TOS := DITP(DMISC).LOCK'FLG;                                     14685000
       ASSEMBLE(SSEA);                                                  14690000
                                                                        14695000
       GOTO GOODXFER;                                                   14700000
                                                                        14705000
     END;                                                               14710000
                                                                        14715000
$PAGE                                                                   14720000
<<---------------------------------------------------->>                14725000
<<                                                    >>                14730000
<<   IDENTIFY [FUNCTION CODE = 72]                    >>                14735000
<<                                                    >>                14740000
<<---------------------------------------------------->>                14745000
                                                                        14750000
     BEGIN                                                              14755000
                                                                        14760000
       SIOP(IDENT1) := 0;   << ZERO RETURN BYTE >>                      14765000
       SIOP(BRANCHPT) := IDENTCP;                                       14770000
                                                                        14775000
     END;                                                               14780000
$PAGE                                                                   14785000
<<---------------------------------------------------->>                14790000
<<                                                    >>                14795000
<<   INITIATE DIAGNOSTIC [FUNCTION CODE = 73]         >>                14800000
<<   (SELFTEST INITIATE)                              >>                14805000
<<                                                    >>                14810000
<<   P1 - 2 BYTES LOOP COUNT (EXECUTION COUNT)        >>                14815000
<<   P2 - DIAGNOSTIC SECTION#                         >>                14820000
<<                                                    >>                14825000
<<---------------------------------------------------->>                14830000
                                                                        14835000
     BEGIN                                                              14840000
                                                                        14845000
       << P1 = IOQP(QPAR1) >>                                           14850000
       << P2 = IOQP(QPAR2) >>                                           14855000
                                                                        14860000
       IF IOQ'PARM1= 0 THEN   << LOOP 0 INVALID >>             <<07045>>14865000
         GOTO INVALIDFUNC;                                              14870000
                                                                        14875000
       SIOP(DIAG1) := 5;                                                14880000
                                                                        14885000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT + CTRL'UNIT);        <<03722>>14890000
       SIOPB(CDB'AREA'BYTE+1 , CDB'INIT'DIAG);                 <<03722>>14895000
       SIOPB(CDB'AREA'BYTE+2, IOQ'PARM1.(0:8));                <<07045>>14900000
       SIOPB(CDB'AREA'BYTE+3, IOQ'PARM1.(8:8));                <<07045>>14905000
       SIOPB(CDB'AREA'BYTE+4, IOQ'PARM2.(8:8));                <<07045>>14910000
                                                                        14915000
       SIOP(BRANCHPT) := DIAGCP;                                        14920000
                                                                        14925000
     END;                                                               14930000
$PAGE                                                                   14935000
<<---------------------------------------------------->>                14940000
<<                                                    >>                14945000
<<   DIAGNOSTIC RESULT [FUNCTION CODE = 74 = 7]       >>                14950000
<<   (SELFTEST RESULT)                                >>                14955000
<<                                                    >>                14960000
<<---------------------------------------------------->>                14965000
                                                                        14970000
     BEGIN                                                              14975000
                                                                        14980000
       GOTO REQ'STATUS;   << RESULTS PART OF STATUS >>                  14985000
                                                                        14990000
     END;                                                               14995000
$PAGE                                                                   15000000
<<---------------------------------------------------->>                15005000
<<                                                    >>                15010000
<<   LOOPBACK WRITE [FUNCTION CODE = 75]              >>                15015000
<<                                                    >>                15020000
<<   COUNT - TRANSFER COUNT                           >>                15025000
<<   BANK & BUFFADDR - CONTAINS LOOPBK DATA FOR WRT.  >>                15030000
<<                     MUST BEGIN W/HEX FF FOLLOWED   >>                15035000
<<                     BY BYTES EQUAL TO ITS PREDE-   >>                15040000
<<                     CESSOR PLUS ONE                >>                15045000
<<                                                    >>                15050000
<<---------------------------------------------------->>                15055000
                                                                        15060000
     BEGIN                                                              15065000
                                                                        15070000
       SET'BYTE'COUNT;                                                  15075000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                15080000
                                                                        15085000
       SIOP(DXFER) := WRT'TRANS'SEC;                                    15090000
       SIOP(DXFER1) := 5;   << CDB BYTE COUNT >>                        15095000
       SIOP(DXFER7) := WRT'TRANS'SEC;                                   15100000
       SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>                   15105000
       SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>                   15110000
       SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>           15115000
       SIOP(DXFER5) := SIOP(DXFER16) := 0;   << NO WAIT >>              15120000
                                                                        15125000
       SIOPB(CDB'AREA'BYTE , CDB'WRT'LOOPBK);                  <<03722>>15130000
       SIOPB(CDB'AREA'BYTE+1 , 0);                             <<03722>>15135000
       SIOPB(CDB'AREA'BYTE+2 , 0);                             <<03722>>15140000
       SIOPB(CDB'AREA'BYTE+3 , COUNT.(0:8));                   <<03722>>15145000
       SIOPB(CDB'AREA'BYTE+4 , COUNT.(8:8));                   <<03722>>15150000
                                                                        15155000
       SIOP(BRANCHPT) := DXFERCP;                                       15160000
                                                                        15165000
     END;                                                               15170000
$PAGE                                                                   15175000
<<---------------------------------------------------->>                15180000
<<                                                    >>                15185000
<<   LOOPBACK READ [FUNCTION CODE = 76]               >>                15190000
<<                                                    >>                15195000
<<   COUNT - TRANSFER COUNT                           >>                15200000
<<   BANK & BUFFADDR - CONTAINS LOOPBK DATA READ      >>                15205000
<<                                                    >>                15210000
<<---------------------------------------------------->>                15215000
                                                                        15220000
     BEGIN                                                              15225000
                                                                        15230000
       SET'BYTE'COUNT;                                                  15235000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                15240000
                                                                        15245000
       SIOP(DXFER) := WRT'TRANS'SEC;                                    15250000
       SIOP(DXFER1) := 5;   << CDB BYTE COUNT >>                        15255000
       SIOP(DXFER7) := READ'TRANS'SEC;                                  15260000
       SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>                   15265000
       SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>                   15270000
       SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>           15275000
       SIOP(DXFER5) := SIOP(DXFER16) := 0;   << NO WAIT >>              15280000
                                                                        15285000
       SIOPB(CDB'AREA'BYTE , CDB'READ'LOOPBK);                 <<03722>>15290000
       SIOPB(CDB'AREA'BYTE+1 , 0);                             <<03722>>15295000
       SIOPB(CDB'AREA'BYTE+2 , 0);                             <<03722>>15300000
       SIOPB(CDB'AREA'BYTE+3 , COUNT.(0:8));                   <<03722>>15305000
       SIOPB(CDB'AREA'BYTE+4 , COUNT.(8:8));                   <<03722>>15310000
                                                                        15315000
       SIOP(BRANCHPT) := DXFERCP;                                       15320000
                                                                        15325000
     END;                                                               15330000
$PAGE                                                                   15335000
<<---------------------------------------------------->>                15340000
<<                                                    >>                15345000
<<   GENERAL PURPOSE COMMAND [FUNCTION CODE = 77]     >>                15350000
<<                                                    >>                15355000
<<   COUNT - NUMBER OF COMMAND BYTES                  >>                15360000
<<   BANK & BUFFADDR - CONTAINS COMMAND DATA BYTES    >>                15365000
<<                     TO BE SENT THRU THE COMMAND    >>                15370000
<<                     & REPORTING MESSAGE PHASE      >>                15375000
<<                                                    >>                15380000
<<---------------------------------------------------->>                15385000
                                                                        15390000
     BEGIN                                                              15395000
                                                                        15400000
       SET'BYTE'COUNT;                                                  15405000
                                                                        15410000
       SIOP(DIAG1) := COUNT;                                            15415000
       SIOP(DIAG3).(8:8) := BANK;                                       15420000
       SIOP(DIAG4) := BUFFADDR;                                         15425000
                                                                        15430000
       SIOP(BRANCHPT) := DIAGCP;                                        15435000
                                                                        15440000
     END;                                                               15445000
$PAGE                                                                   15450000
<<---------------------------------------------------->>                15455000
<<                                                    >>                15460000
<<   DESCRIBE [FUNCTION CODE = 78]                    >>                15465000
<<                                                    >>                15470000
<<   COUNT - DESCRIBE LENGTH (MAX 37 BYTES)           >>                15475000
<<   BANK & BUFFADDR - RETURNS DATA FROM DESCRIBE     >>                15480000
<<                                                    >>                15485000
<<---------------------------------------------------->>                15490000
                                                                        15495000
     BEGIN                                                              15500000
                                                                        15505000
       SET'BYTE'COUNT;                                                  15510000
       IF COUNT=0 THEN GOTO INVALIDFUNC;                                15515000
                                                                        15520000
       SIOP(DXFER1) := 2;   << CDB BYTE COUNT >>                        15525000
       SIOP(DXFER7) := READ'EXEC'SEC;                                   15530000
       SIOP(DXFER8) := MAX'DESC'BYTE;   << MAX# DESC BYTES >>           15535000
       SIOP(DXFER10).(8:8) := 0;   << DESCRIBE AREA >>                  15540000
       SIOP(DXFER11) := @SIOP + SYSDB + DESC'AREA;                      15545000
                                                                        15550000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>15555000
       SIOPB(CDB'AREA'BYTE+1 , CDB'DESCRIBE);                  <<03722>>15560000
                                                                        15565000
       SIOP(BRANCHPT) := DXFERCP;                                       15570000
                                                                        15575000
     END;                                                               15580000
$PAGE                                                                   15585000
<<---------------------------------------------------->>                15590000
<<                                                    >>                15595000
<<   RELEASE [FUNCTION CODE = 79]                     >>                15600000
<<                                                    >>                15605000
<<---------------------------------------------------->>                15610000
                                                                        15615000
     BEGIN                                                              15620000
                                                                        15625000
       SIOP(DIAG1) := 2;                                                15630000
                                                                        15635000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT + CTRL'UNIT);        <<03722>>15640000
       SIOPB(CDB'AREA'BYTE+1 , CDB'RELEASE);                   <<03722>>15645000
                                                                        15650000
       SIOP(BRANCHPT) := DIAGCP;                                        15655000
                                                                        15660000
     END;                                                               15665000
$PAGE                                                                   15670000
<<---------------------------------------------------->>                15675000
<<                                                    >>                15680000
<<   RELEASE DENIED [FUNCTION CODE = 80]              >>                15685000
<<                                                    >>                15690000
<<---------------------------------------------------->>                15695000
                                                                        15700000
     BEGIN                                                              15705000
                                                                        15710000
       SIOP(DIAG1) := 2;                                                15715000
                                                                        15720000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT + CTRL'UNIT);        <<03722>>15725000
       SIOPB(CDB'AREA'BYTE+1 , CDB'RELEASE'DENY);              <<03722>>15730000
                                                                        15735000
       SIOP(BRANCHPT) := DIAGCP;                                        15740000
                                                                        15745000
     END;                                                               15750000
$PAGE                                                                   15755000
<<---------------------------------------------------->>                15760000
<<                                                    >>                15765000
<<   SET RELEASE [FUNCTION CODE = 81]                 >>                15770000
<<                                                    >>                15775000
<<   P1 - 0 ENABLE RELEASE TIMEOUT [T=0]              >>                15780000
<<        1 SUPPRESS RELEASE TIMEOUT [T=1]            >>                15785000
<<   P2 - 0 AUTO RELEASE DURING IDLE TIME [Z=0]       >>                15790000
<<        1 NO AUTO RELEASE DURING IDLE TIME [Z=1]    >>                15795000
<<                                                    >>                15800000
<<---------------------------------------------------->>                15805000
                                                                        15810000
     BEGIN                                                              15815000
                                                                        15820000
       << P1 = IOQP(QPAR1) >>                                           15825000
       << P2 = IOQP(QPAR2) >>                                           15830000
                                                                        15835000
       SIOP(DIAG1) := 3;                                                15840000
                                                                        15845000
       PARM := 0;                                                       15850000
       IF IOQ'PARM1= 1 THEN                                    <<07045>>15855000
         PARM.(0:1) := 1;   << SUPPRESS RELEASE TIMEOUT >>              15860000
       IF IOQ'PARM2= 1 THEN                                    <<07045>>15865000
         PARM.(1:1) := 1;   << RELEASE DURING IDLE TIME >>              15870000
                                                                        15875000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT + CTRL'UNIT);        <<03722>>15880000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'RELEASE);               <<03722>>15885000
       SIOPB(CDB'AREA'BYTE+2 , PARM.(0:8));  << TZ000000 >>    <<03722>>15890000
                                                                        15895000
       SIOP(BRANCHPT) := DIAGCP;                                        15900000
                                                                        15905000
     END;                                                               15910000
$PAGE                                                                   15915000
<<---------------------------------------------------->>                15920000
<<                                                    >>                15925000
<<   SET ADDRESS [FUNCTION CODE = 82]                 >>                15930000
<<                                                    >>                15935000
<<   BANK & BUFFADDR - CONTAINS A DBL WRD ADDRESS     >>                15940000
<<   P1 - 0 SINGLE VECTOR ADDRESS                     >>                15945000
<<      - 1 THREE VECTOR ADDRESS                      >>                15950000
<<                                                    >>                15955000
<<---------------------------------------------------->>                15960000
                                                                        15965000
     BEGIN                                                              15970000
                                                                        15975000
       << P1 = IOQP(QPAR1) >>                                           15980000
                                                                        15985000
       IF NOT (0 <= INTEGER(IOQ'PARM1) <= 1) THEN              <<07045>>15990000
         GOTO INVALIDFUNC;                                              15995000
                                                                        16000000
       TOS := BUFFADDRD;                                                16005000
       ASSEMBLE (LDEA);   << FETCH DBL WRD ADDR >>                      16010000
       CLDA2 := TOS;                                                    16015000
       CLDA1 := TOS;                                                    16020000
                                                                        16025000
       SIOP(DIAG1) := 8;                                                16030000
                                                                        16035000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>16040000
                                                                        16045000
       IF IOQ'PARM1= 0 THEN                                    <<07045>>16050000
                                                                        16055000
         BEGIN                                                          16060000
           SIOPB(CDB'AREA'BYTE+1 , CDB'SET'SNGL'VEC);          <<03722>>16065000
           SIOPB(CDB'AREA'BYTE+2 , 0);                         <<03722>>16070000
           SIOPB(CDB'AREA'BYTE+3 , 0);                         <<03722>>16075000
           SIOPB(CDB'AREA'BYTE+4 , CLDA1.(0:8));               <<03722>>16080000
           SIOPB(CDB'AREA'BYTE+5 , CLDA1.(8:8));               <<03722>>16085000
           SIOPB(CDB'AREA'BYTE+6 , CLDA2.(0:8));               <<03722>>16090000
           SIOPB(CDB'AREA'BYTE+7 , CLDA2.(8:8));               <<03722>>16095000
         END                                                            16100000
                                                                        16105000
       ELSE   << THREE VECTOR ADDR >>                                   16110000
                                                                        16115000
         BEGIN                                                          16120000
           SIOPB(CDB'AREA'BYTE+1 , CDB'SET'3'VEC);             <<03722>>16125000
           SIOPB(CDB'AREA'BYTE+2 , 0);                         <<03722>>16130000
           SIOPB(CDB'AREA'BYTE+3 , CLDA1.(0:8));               <<03722>>16135000
           SIOPB(CDB'AREA'BYTE+4 , CLDA1.(8:8));               <<03722>>16140000
           SIOPB(CDB'AREA'BYTE+5 , CLDA2.(0:8));               <<03722>>16145000
           SIOPB(CDB'AREA'BYTE+6 , 0);                         <<03722>>16150000
           SIOPB(CDB'AREA'BYTE+7 , CLDA2.(8:8));               <<03722>>16155000
         END;                                                           16160000
                                                                        16165000
       SIOP(BRANCHPT) := DIAGCP;                                        16170000
                                                                        16175000
     END;                                                               16180000
$PAGE                                                                   16185000
<<---------------------------------------------------->>                16190000
<<                                                    >>                16195000
<<   SET BLOCK DISPLACEMENT [FUNCTION CODE = 83]      >>                16200000
<<                                                    >>                16205000
<<   P1 - HIGH ORDER DBL WORD LOGICAL SECTOR ADDRESS  >>                16210000
<<   P2 - LOW ORDER DBL WORD LOGICAL SECTOR ADDRESS   >>                16215000
<<                                                    >>                16220000
<<---------------------------------------------------->>                16225000
                                                                        16230000
     BEGIN                                                              16235000
                                                                        16240000
       << P1 = IOQP(QPAR1) = CLDA1 >>                                   16245000
       << P2 = IOQP(QPAR2) = CLDA2 >>                                   16250000
                                                                        16255000
       CLDA1:= IOQ'PARM1;     <<LOGICAL SECTOR ADDR1 >>        <<07045>>16260000
       CLDA2:= IOQ'PARM2;     <<LOGICAL SECTOR ADDR2 >>        <<07045>>16265000
                                                                        16270000
       SIOP(DIAG1) := 8;                                                16275000
                                                                        16280000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>16285000
       SIOPB(CDB'AREA'BYTE+1 , CDB'BLK'DISPL);                 <<03722>>16290000
       SIOPB(CDB'AREA'BYTE+2 , 0);                             <<03722>>16295000
       SIOPB(CDB'AREA'BYTE+3 , 0);                             <<03722>>16300000
       SIOPB(CDB'AREA'BYTE+4 , CLDA1.(0:8));                   <<03722>>16305000
       SIOPB(CDB'AREA'BYTE+5 , CLDA1.(8:8));                   <<03722>>16310000
       SIOPB(CDB'AREA'BYTE+6 , CLDA2.(0:8));                   <<03722>>16315000
       SIOPB(CDB'AREA'BYTE+7 , CLDA2.(8:8));                   <<03722>>16320000
                                                                        16325000
       SIOP(BRANCHPT) := DIAGCP;                                        16330000
                                                                        16335000
     END;                                                               16340000
$PAGE                                                                   16345000
<<---------------------------------------------------->>                16350000
<<                                                    >>                16355000
<<   SET MASK STATUS [FUNCTION CODE = 84]             >>                16360000
<<                                                    >>                16365000
<<   BANK & BUFFADDR - CONTAINS 8 BYTES OF BIT        >>                16370000
<<                     POSITIONS CORRESPONDING TO     >>                16375000
<<                     THE STATUS ERROR BITS          >>                16380000
<<                                                    >>                16385000
<<---------------------------------------------------->>                16390000
                                                                        16395000
     BEGIN                                                              16400000
                                                                        16405000
       SIOP(DIAG1) := 10;                                               16410000
                                                                        16415000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>16420000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'MASK);                  <<03722>>16425000
                                                                        16430000
       TOS := 0;   << DESTINATION - CDB AREA >>                         16435000
       TOS := @SIOP + SYSDB + CDB'AREA'WRD+1;                           16440000
       TOS := BANK;   << SOURCE >>                                      16445000
       TOS := BUFFADDR;                                                 16450000
       TOS := 4;   << 8 BYTES STATUS MASK >>                            16455000
       ASSEMBLE (MABS);   << MOVE USING ABS ADDR >>                     16460000
                                                                        16465000
       SIOP(BRANCHPT) := DIAGCP;                                        16470000
                                                                        16475000
     END;                                                               16480000
$PAGE                                                                   16485000
<<---------------------------------------------------->>                16490000
<<                                                    >>                16495000
<<   SET RETURN ADDRESSING MODE [FUNCTION CODE = 85]  >>                16500000
<<                                                    >>                16505000
<<   P1 - 0 SINGLE VECTOR MODE                        >>                16510000
<<      - 1 THREE VECTOR MODE                         >>                16515000
<<                                                    >>                16520000
<<---------------------------------------------------->>                16525000
                                                                        16530000
     BEGIN                                                              16535000
                                                                        16540000
       << P1 = IOQP(QPAR1) >>                                           16545000
                                                                        16550000
       IF NOT (0 <= INTEGER(IOQ'PARM1) <= 1) THEN              <<07045>>16555000
         GOTO INVALIDFUNC;                                              16560000
                                                                        16565000
       SIOP(DIAG1) := 3;                                                16570000
                                                                        16575000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>16580000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'RETADR);                <<03722>>16585000
       SIOPB(CDB'AREA'BYTE+2, IF IOQ'PARM1= 0 THEN             <<07045>>16590000
         0 ELSE 1);  << SINGLE OR THREE VECTOR MODE >>         <<03722>>16595000
                                                                        16600000
       SIOP(BRANCHPT) := DIAGCP;                                        16605000
                                                                        16610000
     END;                                                               16615000
$PAGE                                                                   16620000
<<---------------------------------------------------->>                16625000
<<                                                    >>                16630000
<<   SET RETRY TIME [FUNCTION CODE = 86]              >>                16635000
<<                                                    >>                16640000
<<   P1 - TIME IN 10'S OF MILLISECONDS                >>                16645000
<<                                                    >>                16650000
<<---------------------------------------------------->>                16655000
                                                                        16660000
     BEGIN                                                              16665000
                                                                        16670000
       << P1 = IOQP(QPAR1) >>                                           16675000
                                                                        16680000
       SIOP(DIAG1) := 4;                                                16685000
                                                                        16690000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>16695000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'RETRY);                 <<03722>>16700000
       SIOPB(CDB'AREA'BYTE+2, IOQ'PARM1.(0:8));                <<07045>>16705000
       SIOPB(CDB'AREA'BYTE+3, IOQ'PARM1.(8:8));                <<07045>>16710000
                                                                        16715000
       SIOP(BRANCHPT) := DIAGCP;                                        16720000
                                                                        16725000
     END;                                                               16730000
$PAGE                                                                   16735000
<<---------------------------------------------------->>                16740000
<<                                                    >>                16745000
<<   SET RPS [FUNCTION CODE = 87]                     >>                16750000
<<                                                    >>                16755000
<<   P1 - TIME TO TARGET IN 100'S MICROSECONDS        >>                16760000
<<   P2 - WINDOW SIZE IN 100'S OF MICROSECONDS        >>                16765000
<<                                                    >>                16770000
<<---------------------------------------------------->>                16775000
                                                                        16780000
     BEGIN                                                              16785000
                                                                        16790000
       << P1 = IOQP(QPAR1) >>                                           16795000
       << P2 = IOQP(QPAR2) >>                                           16800000
                                                                        16805000
       SIOP(DIAG1) := 4;                                                16810000
                                                                        16815000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>16820000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'RPS);                   <<03722>>16825000
       SIOPB(CDB'AREA'BYTE+2, IOQ'PARM1.(8:8));                <<07045>>16830000
       SIOPB(CDB'AREA'BYTE+3, IOQ'PARM2.(8:8));                <<07045>>16835000
                                                                        16840000
       SIOP(BRANCHPT) := DIAGCP;                                        16845000
                                                                        16850000
     END;                                                               16855000
$PAGE                                                                   16860000
<<---------------------------------------------------->>                16865000
<<                                                    >>                16870000
<<   SPARE BLOCK [FUNCTION CODE = 88]                 >>                16875000
<<                                                    >>                16880000
<<   BANK & BUFFADDR - CONTAINS DBL WRD ADDRESS OF    >>                16885000
<<                     SECTOR TO BE SPARED            >>                16890000
<<   P1 - 0 SINGLE VECTOR ADDRESS                     >>                16895000
<<      - 1 THREE VECTOR ADDRESS                      >>                16900000
<<   P2 - 0 SPARE RETAINING DATA (NO TARGET SECTOR)   >>                16905000
<<        1 SPARE WITHOUT RETAINING DATA              >>                16910000
<<        4 SPARE RETAINING DATA (TARGET INCLUDED)    >>                16915000
<<                                                    >>                16920000
<<---------------------------------------------------->>                16925000
                                                                        16930000
     BEGIN                                                              16935000
                                                                        16940000
       << P1 = IOQP(QPAR1) >>                                           16945000
       << P2 = IOQP(QPAR2) >>                                           16950000
                                                                        16955000
       IF NOT (0 <= INTEGER(IOQ'PARM1) <= 1) THEN              <<07045>>16960000
         GOTO INVALIDFUNC;                                              16965000
                                                                        16970000
       IF NOT (0 <= INTEGER(IOQ'PARM2) <= 4) THEN              <<07045>>16975000
         GOTO INVALIDFUNC;                                              16980000
                                                                        16985000
       TOS := BUFFADDRD;                                                16990000
       ASSEMBLE (LDEA);   << FETCH DBL WRD ADDRESS >>                   16995000
       CLDA2 := TOS;                                                    17000000
       CLDA1 := TOS;                                                    17005000
                                                                        17010000
       SIOP(DIAG1) := 10;                                               17015000
                                                                        17020000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>17025000
                                                                        17030000
       IF IOQ'PARM1= 0 THEN   << SPARE W/SNGL VEC ADDR >>      <<07045>>17035000
                                                                        17040000
         BEGIN                                                          17045000
           SIOPB(CDB'AREA'BYTE+1 , CDB'SET'SNGL'VEC);          <<03722>>17050000
           SIOPB(CDB'AREA'BYTE+2 , 0);                         <<03722>>17055000
           SIOPB(CDB'AREA'BYTE+3 , 0);                         <<03722>>17060000
           SIOPB(CDB'AREA'BYTE+4 , CLDA1.(0:8));               <<03722>>17065000
           SIOPB(CDB'AREA'BYTE+5 , CLDA1.(8:8));               <<03722>>17070000
           SIOPB(CDB'AREA'BYTE+6 , CLDA2.(0:8));               <<03722>>17075000
           SIOPB(CDB'AREA'BYTE+7 , CLDA2.(8:8));               <<03722>>17080000
         END                                                            17085000
                                                                        17090000
       ELSE   << SPARE W/THREE VEC ADDR >>                              17095000
                                                                        17100000
         BEGIN                                                          17105000
           SIOPB(CDB'AREA'BYTE+1 , CDB'SET'3'VEC);             <<03722>>17110000
           SIOPB(CDB'AREA'BYTE+2 , 0);                         <<03722>>17115000
           SIOPB(CDB'AREA'BYTE+3 , CLDA1.(0:8));               <<03722>>17120000
           SIOPB(CDB'AREA'BYTE+4 , CLDA1.(8:8));               <<03722>>17125000
           SIOPB(CDB'AREA'BYTE+5 , CLDA2.(0:8));               <<03722>>17130000
           SIOPB(CDB'AREA'BYTE+6 , 0);                         <<03722>>17135000
           SIOPB(CDB'AREA'BYTE+7 , CLDA2.(8:8));               <<03722>>17140000
         END;                                                           17145000
                                                                        17150000
       SIOPB(CDB'AREA'BYTE+8 , CDB'SPARE'BLK);                 <<03722>>17155000
       SIOPB(CDB'AREA'BYTE+9, IOQ'PARM2.(8:8));                <<07045>>17160000
                                                                        17165000
       SIOP(BRANCHPT) := DIAGCP;                                        17170000
                                                                        17175000
     END;                                                               17180000
$PAGE                                                                   17185000
<<---------------------------------------------------->>                17190000
<<                                                    >>                17195000
<<   READ WITH 3-VECTOR ADDRESS [FUNCTION CODE = 89]  >>                17200000
<<                                                    >>                17205000
<<   COUNT - TRANSFER COUNT                           >>                17210000
<<   BANK & BUFFADDR - CONTAINS DATA READ             >>                17215000
<<   P1 - CYLINDER ADDRESS                            >>                17220000
<<   P2 - HEAD/SECTOR ADDRESS                         >>                17225000
<<                                                    >>                17230000
<<---------------------------------------------------->>                17235000
                                                                        17240000
     BEGIN                                                              17245000
                                                                        17250000
       << P1 = IOQP(QPAR1) >>                                           17255000
       << P2 = IOQP(QPAR2) >>                                           17260000
                                                                        17265000
       SET'BYTE'COUNT;                                                  17270000
                                                                        17275000
       SIOP(DXFER1) := 14;   << CDB BYTE COUNT >>                       17280000
                                                                        17285000
       IF COUNT=0 THEN   << NO TRANSFER COUNT >>                        17290000
                                                                        17295000
         BEGIN                                                          17300000
           SIOP(DXFER5) := 0;   << BYPASS EXEC MSG >>                   17305000
           SIOP(DXFER6) := 5;   << JUMP *+5 >>                          17310000
         END                                                            17315000
                                                                        17320000
       ELSE   << SET UP EXECUTING MESSAGE >>                            17325000
                                                                        17330000
         BEGIN                                                          17335000
           SIOP(DXFER7) := READ'EXEC'SEC;                               17340000
           SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>               17345000
           SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>               17350000
           SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>       17355000
         END;                                                           17360000
                                                                        17365000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>17370000
                                                                        17375000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'3'VEC);                 <<03722>>17380000
       SIOPB(CDB'AREA'BYTE+2 , 0);                             <<03722>>17385000
       SIOPB(CDB'AREA'BYTE+3, IOQ'PARM1.(0:8));                <<07045>>17390000
       SIOPB(CDB'AREA'BYTE+4, IOQ'PARM1.(8:8));                <<07045>>17395000
       SIOPB(CDB'AREA'BYTE+5, IOQ'PARM2.(0:8));                <<07045>>17400000
       SIOPB(CDB'AREA'BYTE+6 , 0);                             <<03722>>17405000
       SIOPB(CDB'AREA'BYTE+7, IOQ'PARM2.(8:8));                <<07045>>17410000
                                                                        17415000
       SIOPB(CDB'AREA'BYTE+8 , CDB'SET'LENGTH);                <<03722>>17420000
       SIOPB(CDB'AREA'BYTE+9 , 0);                             <<03722>>17425000
       SIOPB(CDB'AREA'BYTE+10 , 0);                            <<03722>>17430000
       SIOPB(CDB'AREA'BYTE+11 , COUNT.(0:8));                  <<03722>>17435000
       SIOPB(CDB'AREA'BYTE+12 , COUNT.(8:8));                  <<03722>>17440000
       SIOPB(CDB'AREA'BYTE+13 , CDB'READ);                     <<03722>>17445000
                                                                        17450000
       SIOP(BRANCHPT) := DXFERCP;                                       17455000
                                                                        17460000
     END;                                                               17465000
$PAGE                                                                   17470000
<<---------------------------------------------------->>                17475000
<<                                                    >>                17480000
<<   WRITE WITH 3-VECTOR ADDRESS [FUNCTION CODE = 90] >>                17485000
<<                                                    >>                17490000
<<   COUNT - TRANSFER COUNT                           >>                17495000
<<   BANK & BUFFADDR - CONTAINS DATA FOR WRITE        >>                17500000
<<   P1 - CYLINDER ADDRESS                            >>                17505000
<<   P2 - HEAD/SECTOR ADDRESS                         >>                17510000
<<                                                    >>                17515000
<<---------------------------------------------------->>                17520000
                                                                        17525000
     BEGIN                                                              17530000
                                                                        17535000
       << P1 = IOQP(QPAR1) >>                                           17540000
       << P2 = IOQP(QPAR2) >>                                           17545000
                                                                        17550000
       SET'BYTE'COUNT;                                                  17555000
                                                                        17560000
       SIOP(DXFER1) := 14;   << CDB BYTE COUNT >>                       17565000
                                                                        17570000
       IF COUNT=0 THEN   << NO TRANSFER COUNT >>                        17575000
                                                                        17580000
         BEGIN                                                          17585000
           SIOP(DXFER5) := 0;   << BYPASS EXEC MSG >>                   17590000
           SIOP(DXFER6) := 5;   << JUMP *+5 >>                          17595000
         END                                                            17600000
                                                                        17605000
       ELSE   << SET UP EXECUTING MESSAGE >>                            17610000
                                                                        17615000
         BEGIN                                                          17620000
           SIOP(DXFER7) := WRT'EXEC'SEC;                                17625000
           SIOP(DXFER8) := COUNT;   << DATA BYTE COUNT >>               17630000
           SIOP(DXFER10).(8:8) := BANK;   << DATA BANK >>               17635000
           SIOP(DXFER11) := BUFFADDR;   << DATA BUFFER ABS ADR >>       17640000
         END;                                                           17645000
                                                                        17650000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>17655000
                                                                        17660000
       SIOPB(CDB'AREA'BYTE+1 , CDB'SET'3'VEC);                 <<03722>>17665000
       SIOPB(CDB'AREA'BYTE+2 , 0);                             <<03722>>17670000
       SIOPB(CDB'AREA'BYTE+3, IOQ'PARM1.(0:8));                <<07045>>17675000
       SIOPB(CDB'AREA'BYTE+4, IOQ'PARM1.(8:8));                <<07045>>17680000
       SIOPB(CDB'AREA'BYTE+5, IOQ'PARM2.(0:8));                <<07045>>17685000
       SIOPB(CDB'AREA'BYTE+6 , 0);                             <<03722>>17690000
       SIOPB(CDB'AREA'BYTE+7, IOQ'PARM2.(8:8));                <<07045>>17695000
                                                                        17700000
       SIOPB(CDB'AREA'BYTE+8 , CDB'SET'LENGTH);                <<03722>>17705000
       SIOPB(CDB'AREA'BYTE+9 , 0);                             <<03722>>17710000
       SIOPB(CDB'AREA'BYTE+10 , 0);                            <<03722>>17715000
       SIOPB(CDB'AREA'BYTE+11 , COUNT.(0:8));                  <<03722>>17720000
       SIOPB(CDB'AREA'BYTE+12 , COUNT.(8:8));                  <<03722>>17725000
       SIOPB(CDB'AREA'BYTE+13 , CDB'WRITE);                    <<03722>>17730000
                                                                        17735000
       SIOP(BRANCHPT) := DXFERCP;                                       17740000
                                                                        17745000
     END;                                                               17750000
$PAGE                                                                   17755000
<<---------------------------------------------------->>                17760000
<<                                                    >>                17765000
<<   INITIATE UTILITY [FUNCTION CODE = 91]            >>                17770000
<<                                                    >>                17775000
<<   COUNT - EXECUTING MESSAGE LENGTH                 >>                17780000
<<   BANK & BUFFADDR - CONTAINS UTILITY BYTE COUNT    >>                17785000
<<                     WITH UTILITY PARAMETER BYTES   >>                17790000
<<                     TO FOLLOW (OPTIONAL).          >>                17795000
<<   BANK & BUFFADDR+10 - RETURNS UTILITY DATA        >>                17800000
<<                        INFORMATION (OPTIONAL).     >>                17805000
<<   P1 - 0 NO EXECUTING MESSAGE                      >>                17810000
<<      - 1 SEND EXECUTING MESSAGE TO THE DEVICE      >>                17815000
<<      - 2 RECEIVE EXECUTING MESSAGE FROM DEVICE     >>                17820000
<<   P2 - UTILITY NUMBER                              >>                17825000
<<                                                    >>                17830000
<<  *NOTE:  SEE CS'80 DRIVER REQ CODE DOCUMENTATION   >>                17835000
<<          FOR A MORE THOROUGH DESCRIPTION           >>                17840000
<<                                                    >>                17845000
<<---------------------------------------------------->>                17850000
                                                                        17855000
     BEGIN                                                              17860000
                                                                        17865000
       << P1 = IOQP(QPAR1) >>                                           17870000
       << P2 = IOQP(QPAR2) >>                                           17875000
                                                                        17880000
       IF NOT (0 <= INTEGER(IOQ'PARM1) <= 2) THEN              <<07045>>17885000
         GOTO INVALIDFUNC;                   <<  MSG QUALIFIER  >>      17890000
                                                                        17895000
       SET'BYTE'COUNT;                                                  17900000
                                                                        17905000
       IF (1 <= INTEGER(IOQ'PARM1) <= 2) AND COUNT= 0 THEN     <<07045>>17910000
         GOTO INVALIDFUNC;                                              17915000
                                                                        17920000
       SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);                    <<03722>>17925000
       SIOPB(CDB'AREA'BYTE+1 , CDB'NOP);                       <<03722>>17930000
       SIOPB(CDB'AREA'BYTE+2, CDB'INIT'UTIL+IOQ'PARM1.(8:8));  <<07045>>17935000
       SIOPB(CDB'AREA'BYTE+3, IOQ'PARM2.(8:8));                <<07045>>17940000
                                                                        17945000
       IF IOQ'PARM1 <> 1 THEN  << FETCH UTIL PARM BYTES >>     <<07045>>17950000
         BEGIN                                                          17955000
           TOS := BUFFADDRD;                                            17960000
           ASSEMBLE (LSEA);                                             17965000
           INDEX := TOS;   << #UTIL PARM BYTES >>                       17970000
           IF <> THEN                                                   17975000
             BEGIN                                                      17980000
               IF INDEX > 18 THEN   << EXCEED MAX BYTES ALLOW >>        17985000
                 GOTO INVALIDFUNC;                                      17990000
               PARM := INDEX/2;   << #UTIL PARM WRDS >>                 17995000
               IF (INDEX MOD 2) = 1 THEN   << HAVE ODD BYTE? >>         18000000
                 PARM := PARM + 1;   << #WORDS TO MOVE >>               18005000
               TOS := 0;   << DESTINATION - CDB AREA >>                 18010000
               TOS := @SIOP + SYSDB + CDB'AREA'WRD+2;                   18015000
               TOS := BANK;   << SOURCE >>                              18020000
               TOS := BUFFADDR+1;                                       18025000
               TOS := PARM;  << #WORDS TO MOVE >>                       18030000
               ASSEMBLE (MABS);   << MOVE USING ABS ADDR >>             18035000
            END;                                                        18040000
         END;                                                           18045000
                                                                        18050000
       CASE IOQ'PARM1 OF                                       <<07045>>18055000
                                                                        18060000
         BEGIN                                                          18065000
                                                                        18070000
           BEGIN   << NO EXEC MSG >>                                    18075000
                                                                        18080000
             SIOP(DIAG1) := 4 + INDEX;                                  18085000
             SIOP(BRANCHPT) := DIAGCP;                                  18090000
                                                                        18095000
           END;                                                         18100000
                                                                        18105000
           BEGIN   << SEND EXEC MSG TO DEVICE >>                        18110000
                                                                        18115000
             SIOP(DXFER1) := 4;                                         18120000
             SIOP(DXFER7) := WRT'EXEC'SEC;                              18125000
             SIOP(DXFER8) := COUNT;   << EXEC MSG COUNT >>              18130000
             SIOP(DXFER10).(8:8) := BANK;                               18135000
             SIOP(DXFER11) := BUFFADDR;                                 18140000
             SIOP(BRANCHPT) := DXFERCP;                                 18145000
                                                                        18150000
           END;                                                         18155000
                                                                        18160000
           BEGIN   << RECEIVE EXEC MSG FROM DEVICE >>                   18165000
                                                                        18170000
             SIOP(DXFER1) := 4 + INDEX;                                 18175000
             SIOP(DXFER7) := READ'EXEC'SEC;                             18180000
             SIOP(DXFER8) := COUNT;   << EXEC MSG COUNT >>              18185000
             SIOP(DXFER10).(8:8) := BANK;                               18190000
             SIOP(DXFER11) := BUFFADDR+10;                              18195000
             SIOP(BRANCHPT) := DXFERCP;                                 18200000
                                                                        18205000
           END;                                                         18210000
                                                                        18215000
         END;                                                           18220000
                                                                        18225000
     END;                                                               18230000
$PAGE                                                                   18235000
<<---------------------------------------------------->>                18240000
<<                                                    >>                18245000
<<   CLEAR DEVICE [FUNCTION CODE = 92]                >>                18250000
<<                                                    >>                18255000
<<---------------------------------------------------->>                18260000
                                                                        18265000
     BEGIN                                                              18270000
                                                                        18275000
       SIOP(DIAG3) := %4401;   << SEL DEV CLR W/PARITY ENABLED >>       18280000
       SIOP(DIAG4) := 0;                                                18285000
                                                                        18290000
       SIOP(BRANCHPT) := DIAGCP + 3;                                    18295000
                                                                        18300000
     END;                                                               18305000
$PAGE                                                                   18310000
<<---------------------------------------------------->>                18315000
<<                                                    >>                18320000
<<   CANCEL TRANSACTION [FUNCTION CODE = 93]          >>                18325000
<<                                                    >>                18330000
<<---------------------------------------------------->>                18335000
                                                                        18340000
     BEGIN                                                              18345000
                                                                        18350000
       SIOP(DIAG) := WRT'TRANS'SEC;                                     18355000
       SIOP(DIAG1) := 1;                                                18360000
                                                                        18365000
       SIOPB(CDB'AREA'BYTE , CDB'CANCEL);                      <<03722>>18370000
                                                                        18375000
       SIOP(BRANCHPT) := DIAGCP;                                        18380000
                                                                        18385000
     END;                                                               18390000
$PAGE                                                                   18395000
<<---------------------------------------------------->>                18400000
<<                                                    >>                18405000
<<   PARITY CHECKING [FUNCTION CODE = 94]             >>                18410000
<<   P1 - 0 (DISABLE PARITY CHECKING)                 >>                18415000
<<      - 1 (ENABLE PARITY CHECKING)                  >>                18420000
<<                                                    >>                18425000
<<---------------------------------------------------->>                18430000
                                                                        18435000
     BEGIN                                                              18440000
                                                                        18445000
       << P1 = IOQP(QPAR1) >>                                           18450000
                                                                        18455000
       IF NOT (0 <= INTEGER(IOQ'PARM1) <= 1) THEN              <<07045>>18460000
         GOTO INVALIDFUNC;                                              18465000
                                                                        18470000
       SIOP(DIAG) := WRT'TRANS'SEC;                                     18475000
       SIOP(DIAG1) := 2;                                                18480000
       SIOP(DIAG5) := 0;   << BYPASS WAIT & DSJ >>                      18485000
       SIOP(DIAG6) := 5;                                                18490000
                                                                        18495000
       SIOPB(CDB'AREA'BYTE , CDB'PARITY'OP);                   <<03722>>18500000
       SIOPB(CDB'AREA'BYTE+1, IF IOQ'PARM1= 0 THEN             <<07045>>18505000
         0 ELSE 1);    << ENABLE OR DISABLE PARITY CHECK >>    <<03722>>18510000
                                                                        18515000
       SIOP(BRANCHPT) := DIAGCP;                                        18520000
                                                                        18525000
     END;                                                               18530000
                                                                        18535000
     END;   << OF CASE STATEMENT >>                                     18540000
                                                                        18545000
$PAGE                                                                   18550000
<<---------------------------------------------------->>                18555000
<<                                                    >>                18560000
<<   START CHANNEL PROGRAM SECTION                    >>                18565000
<<                                                    >>                18570000
<<---------------------------------------------------->>                18575000
                                                                        18580000
  START'CHANP:                                                          18585000
                                                                        18590000
     CPVAP := 0;   << CLEAR CHANNEL STATUS WORD >>                      18595000
     START'HPIB(DITP,SIOP,TRUE);                                        18600000
                                                                        18605000
     IF > THEN   << SIO FAILURE >>                             <<03722>>18610000
       GOTO SIOERROR;                                                   18615000
     IOQ'QMISC.WAITCODE:= CMPLTION'WAIT;                       <<07045>>18620000
     MSTATE := INTRPTWAIT;                                              18625000
     RETURN;                                                            18630000
     HELP;   << LINK TO HELP - NEVER GETS EXECUTED >>                   18635000
                                                                        18640000
  END;   << END OF INITIATION SECTION >>                                18645000
                                                                        18650000
$PAGE                                                                   18655000
<<****************************************************>>                18660000
<<                                                    >>                18665000
<<   CS'80 DRIVER CONTINUATOR SECTION                 >>                18670000
<<                                                    >>                18675000
<<****************************************************>>                18680000
                                                                        18685000
  CONTINUATOR:                                                          18690000
                                                                        18695000
     IF DITP(DSTAT) = -1 THEN   << SYSTEM POWERFAIL >>                  18700000
       BEGIN                                                            18705000
         DITP(DSTAT) := 0;                                              18710000
         IOQ'QMISC.SYS'PFAIL'FLG:= 1;                          <<07045>>18715000
         GOTO RETRY'REQUEST;                                            18720000
       END;                                                             18725000
                                                               <<07045>>18730000
     IF IOQ'ABORT = 1 AND                                      <<07045>>18735000
       IOQ'QMISC.WAITCODE <> ABORT'WAIT  THEN  <<ABORT IOQ>>   <<07045>>18740000
          BEGIN                                                <<07045>>18745000
            IOQ'QMISC.WAITCODE := ABORT'WAIT;                  <<07045>>18750000
            SIOP(DIAG3) := %4401;                              <<07045>>18755000
            SIOP(DIAG4) := 0;                                  <<07045>>18760000
            SIOP(BRANCHPT) := DIAGCP + 3;                      <<07045>>18765000
            MSTATE := INTRPTWAIT;                              <<07045>>18770000
            START'HPIB(DITP,SIOP,TRUE);                        <<07045>>18775000
            IF > THEN                                          <<07045>>18780000
              GOTO SIOERROR;                                   <<07045>>18785000
            RETURN;                                            <<07045>>18790000
          END;                                                 <<07045>>18795000
                                                                        18800000
     IF CPVAP.ERRORCODE=6 OR    <<  DMA ABORT    >>                     18805000
       CPVAP.ERRORCODE=7 THEN   << CHANNEL ABORT >>                     18810000
                                                                        18815000
       BEGIN                                                            18820000
         IF IOQ'QMISC.CHAN'ERR'FLG= 3 THEN                     <<07045>>18825000
           IF CPVAP.ERRORCODE=7 AND CPVAP.TIMEDOUT=1 THEN               18830000
             GOTO DRIVE'NOT'READY                              <<03722>>18835000
           ELSE GOTO CHANERROR;                                         18840000
         IOQ'QMISC.CHAN'ERR'FLG:=    << RETRY 3 >>             <<07045>>18845000
           IOQ'QMISC.CHAN'ERR'FLG+ 1;  << TIMES   >>           <<07045>>18850000
         LOG'CPVAP;                                                     18855000
         CPVAP := 0;                                                    18860000
         SIOP(BRANCHPT) := SYNCDSJCP;                          <<03722>>18865000
         START'HPIB(DITP,SIOP(FIRSTBRANCH),TRUE);              <<03722>>18870000
         IF > THEN                                             <<03722>>18875000
           GOTO SIOERROR;                                               18880000
         IOQ'QMISC.WAITCODE:= SYNC'WAIT;                       <<07045>>18885000
         MSTATE := INTRPTWAIT;                                          18890000
         RETURN;                                                        18895000
       END;                                                             18900000
                                                                        18905000
     IF IOQ'SFAIL THEN  << FAILURE ON DELAYED START I/O >>     <<07045>>18910000
       GOTO SIOERROR;                                                   18915000
                                                                        18920000
<<====================================================>>                18925000
<<                                                    >>                18930000
<<   I/O STATUS INTERROGATION COMPLETION              >>                18935000
<<                                                    >>                18940000
<<====================================================>>                18945000
                                                                        18950000
     IF CPVAP(1).(12:4) = 1 THEN   << STATUS DIAGNOSIS >>               18955000
                                                                        18960000
       BEGIN                                                            18965000
                                                                        18970000
         CPVAP(1).(12:4) := 0;                                          18975000
                                                                        18980000
         IF DITP(FAULT'FIELD).POWER'FAIL THEN                           18985000
           BEGIN                                                        18990000
START'PONCP:                                                   <<03722>>18995000
             SIOP(BRANCHPT) := PONCP;                                   19000000
             << DO THE CLEAR. UNQUEUED STARTSIO >>             <<03722>>19005000
             START'HPIB(DITP,SIOP(FIRSTBRANCH),FALSE);         <<03722>>19010000
             IF > THEN  << SIO FAILURE >>                      <<03722>>19015000
               GOTO SIOERROR;                                  <<03722>>19020000
             IOQ'QMISC.WAITCODE:= CMPLTION'WAIT;               <<07045>>19025000
             MSTATE := INTRPTWAIT;                             <<03722>>19030000
             RETURN;                                           <<03722>>19035000
           END;                                                         19040000
                                                                        19045000
         IF FCODE = REQ'STAT OR   << UPDATE LAST STATUS >>              19050000
           FCODE = DIAG'RESULT THEN                                     19055000
                                                                        19060000
           BEGIN                                                        19065000
             SIOP(DESC'AREA+3).NOT'RDY                         <<03722>>19070000
             := DITP(ACCESS'FIELD).NOT'RDY;                    <<03722>>19075000
             GOTO REQ'STAT'CMPLT;                                       19080000
           END;                                                         19085000
                                                                        19090000
         IF IOQ'DIAG THEN  << DIAGNOSTIC COMPLETION >>         <<07045>>19095000
           GOTO DIAG'STAT'CMPLT;                                        19100000
                                                                        19105000
         IF DITP(ACCESS'FIELD).UNINIT'MEDIA THEN                        19110000
         BEGIN                                                 <<04834>>19115000
                                                               <<04884>>19120000
           GOTO UNINIT'MEDIAERROR;                                      19125000
         END;                                                  <<04834>>19130000
                                                                        19135000
         IF DITP(ID'FIELD).UNIT'ATTN <> %377 AND                        19140000
            DITP(ID'FIELD).UNIT'ATTN <> %17 AND                         19145000
            DITP(ID'FIELD).UNIT'ATTN <> 0 THEN                          19150000
            GOTO UNITERROR;                                             19155000
                                                                        19160000
         IF DITP(REJECT'FIELD).CHAN'PARITY OR                           19165000
            DITP(REJECT'FIELD).ILLEG'OPCODE OR                          19170000
            DITP(REJECT'FIELD).MOD'ADDR'ERR OR                          19175000
            DITP(REJECT'FIELD).PARM'BOUND OR                            19180000
            DITP(REJECT'FIELD).ILLEG'PARM OR                            19185000
            DITP(REJECT'FIELD).MSG'SEQ'VIOL OR                          19190000
            DITP(REJECT'FIELD).MSG'LEN'DIFF OR                          19195000
                                                                        19200000
            DITP(FAULT'FIELD).CROSS'UNIT OR                             19205000
            DITP(FAULT'FIELD).OPER'REL'REQRD OR                         19210000
            DITP(FAULT'FIELD).DIAG'REL'REQRD OR                         19215000
            DITP(FAULT'FIELD).CTRL'FAULT OR                    <<03722>>19220000
            DITP(FAULT'FIELD).UNIT'FAULT OR                    <<03722>>19225000
            DITP(FAULT'FIELD).DIAG'FAILED OR                   <<03722>>19230000
                                                                        19235000
            DITP(ACCESS'FIELD).ILLEG'PAR'OPER OR                        19240000
            DITP(ACCESS'FIELD).NO'DATA'FOUND OR                         19245000
            DITP(ACCESS'FIELD).END'OF'FILE THEN                <<04884>>19250000
            BEGIN                                                       19255000
              IF IOQ'QMISC.RETRY'COUNT= 7 THEN                 <<07045>>19260000
                GOTO UNITERROR;                                         19265000
              IOQ'QMISC.RETRY'COUNT:=                          <<07045>>19270000
                IOQ'QMISC.RETRY'COUNT+ 1;                      <<07045>>19275000
              IF DITP(REJECT'FIELD).MSG'SEQ'VIOL AND                    19280000
                IOQ'QMISC.SYS'PFAIL'FLG= 1 THEN                <<07045>>19285000
                GOTO RETRY'REQUEST;                                     19290000
              LOG'STATUS;                                               19295000
              GOTO RETRY'REQUEST;   << RETRY STATUS >>                  19300000
            END;                    << ERROR ONCE   >>                  19305000
                                                                        19310000
<<------------------------------------------------>>                    19315000
<<     DRIVE WAS WRITE PROTECTED                  >>                    19320000
<<------------------------------------------------>>                    19325000
                                                                        19330000
         IF DITP(ACCESS'FIELD).WRT'PROTECT THEN                         19335000
           BEGIN                                                        19340000
             IOQ'QMISC.UNLOAD'RING'FLG:= 1;                    <<07045>>19345000
             SIOP(DIAG1) := 2;         << BYTE COUNT >>                 19350000
             SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT);              <<03722>>19355000
             SIOPB(CDB'AREA'BYTE+1 , CDB'UNLOAD);              <<03722>>19360000
             SIOP(BRANCHPT) := DIAGCP;                                  19365000
                                                                        19370000
             IF NOT IOMESSAGE(1,NO'RING,%10000,DITP(DLDEV),    <<07045>>19375000
                              ,,,,OPCONSOLE) THEN                       19380000
               GOTO SYSERROR ;                                          19385000
                                                                        19390000
             GOTO START'CHANP;                                          19395000
           END;                                                         19400000
                                                                        19405000
                                                                        19410000
         IF DITP(FAULT'FIELD).RETRANSMIT THEN                           19415000
           BEGIN                                                        19420000
             IF IOQ'QMISC.RETRY'COUNT= 7 THEN                  <<07045>>19425000
               GOTO UNITERROR;                                          19430000
             IOQ'QMISC.RETRY'COUNT:=                           <<07045>>19435000
               IOQ'QMISC.RETRY'COUNT+ 1;                       <<07045>>19440000
             GOTO RETRY'REQUEST;                                        19445000
           END;                                                         19450000
                                                                        19455000
         IF DITP(ACCESS'FIELD).NO'SPARE'AVAIL THEN                      19460000
          BEGIN                                                <<04834>>19465000
                                                               <<04884>>19470000
            GOTO NO'SPARE'ERROR;                                        19475000
          END;                                                 <<04834>>19480000
                                                                        19485000
         IF DITP(REJECT'FIELD).ADDR'BOUND OR                            19490000
            DITP(ACCESS'FIELD).END'OF'VOLUME THEN                       19495000
          BEGIN                                                <<04834>>19500000
                                                               <<04884>>19505000
            GOTO INVALIDADR;                                            19510000
          END;                                                 <<04834>>19515000
                                                                        19520000
<<---------------------------------------------------->>                19525000
<<   RELEASE REQUEST/REQUIRED HANDLING:               >>                19530000
<<---------------------------------------------------->>                19535000
                                                                        19540000
         IF DITP(FAULT'FIELD).INT'MAINT'REQRD OR                        19545000
            DITP(INFOR'FIELD).OPER'REL'REQST OR                         19550000
            DITP(INFOR'FIELD).DIAG'REL'REQST OR                         19555000
            DITP(INFOR'FIELD).INT'MAINT'REQST THEN                      19560000
                                                                        19565000
            BEGIN                                                       19570000
                                                               <<03667>>19575000
              IF FCODE=VERIFY AND                              <<03667>>19580000
                DITP(ACCESS'FIELD).UNRECOV'DATA THEN           <<03667>>19585000
                                                               <<03667>>19590000
                BEGIN                                          <<03667>>19595000
                  TOS := BUFFADDRD;                            <<03667>>19600000
                  TOS := DITP(PARM'FIELD+1);    <<BAD BLK>>    <<03667>>19605000
                  TOS := DITP(PARM'FIELD+2);  <<ADDRESS>>      <<03667>>19610000
                  ASSEMBLE (SDEA);                             <<03667>>19615000
                  DITP(DBADXFER) := 0;                         <<03667>>19620000
                  IOQ'QMISC.VER'ERR'FLG:= 1;                   <<07045>>19625000
                END;                                           <<03667>>19630000
                                                               <<03667>>19635000
              SIOP(DIAG) := WRT'CMD'SEC;                                19640000
              SIOP(DIAG1) := 2;   << CDB BYTE COUNT >>                  19645000
              SIOP(DIAG3) := %2000;                                     19650000
              SIOP(DIAG4) := @SIOP + SYSDB + CDB'AREA'WRD;              19655000
              SIOP(DIAG5) := %1000;                                     19660000
              SIOP(DIAG6) := 0;                                         19665000
              SIOPB(CDB'AREA'BYTE , CDB'SET'UNIT + CTRL'UNIT); <<03722>>19670000
                                                                        19675000
              SIOPB(CDB'AREA'BYTE+1 ,                          <<03722>>19680000
                IF DITP(FAULT'FIELD).INT'MAINT'REQRD OR                 19685000
                   DITP(INFOR'FIELD).INT'MAINT'REQST OR                 19690000
                   DITP(INFOR'FIELD).OPER'REL'REQST AND                 19695000
                   DITP(ACCESS'FIELD).DEV'NOT'RDY OR                    19700000
                   DITP(INFOR'FIELD).OPER'REL'REQST AND                 19705000
                   DITP(DMISC).LOCK'FLG <> 1 THEN                       19710000
                     CDB'RELEASE                                        19715000
                   ELSE                                                 19720000
                     CDB'RELEASE'DENY);                        <<03722>>19725000
                                                                        19730000
              IF DITP(INFOR'FIELD).OPER'REL'REQST THEN                  19735000
                IOQ'QMISC.OPER'REQ'FLG:=1;                     <<07045>>19740000
              IF DITP(FAULT'FIELD).INT'MAINT'REQRD THEN                 19745000
                IOQ'QMISC.IM'FAULT'FLG:= 1;                    <<07045>>19750000
              IF DITP(ACCESS'FIELD).DEV'NOT'RDY THEN                    19755000
                IOQ'QMISC.LOAD'FLG:= 1;                        <<07045>>19760000
                                                                        19765000
              SIOP(BRANCHPT) := DIAGCP;   << SCHEDULE RELEASE >>        19770000
              START'HPIB(DITP,SIOP,TRUE); << OR RELEASE DENY  >>        19775000
              IF > THEN                                        <<03722>>19780000
                GOTO SIOERROR;                                          19785000
              IOQ'QMISC.WAITCODE:= REL'WAIT;                   <<07045>>19790000
              MSTATE := INTRPTWAIT;                                     19795000
              RETURN;                                                   19800000
            END;                                                        19805000
                                                                        19810000
<<---------------------------------------------------->>                19815000
<<   DRIVE NOT READY - SCHEDULE IDLE CP UNTIL READY   >>                19820000
<<---------------------------------------------------->>                19825000
DRIVE'NOT'READY:                                               <<03722>>19830000
                                                                        19835000
         IF DITP(ACCESS'FIELD).DEV'NOT'RDY                     <<03722>>19840000
            OR (CPVAP = CPVA'TIMEOUT) THEN                     <<03722>>19845000
           BEGIN                                                        19850000
             IF FCODE = REQ'STAT THEN GOTO                     <<03722>>19855000
                        REQ'STAT'CMPLT; <<INFORM USER-NOTRDY>> <<03722>>19860000
             IOQ'QMISC.WAITCODE:= NOT'RDY'WAIT;                <<07045>>19865000
IDLE'NOT'READY:    << MUST NOT REFERENCE IOQ BEFORE RETURN >>  <<03722>>19870000
             SIOP(BRANCHPT) := IDLECP;   << SCHEDULE IDLE CP >>         19875000
             IF SYSUP THEN                                              19880000
                                                                        19885000
               BEGIN                                                    19890000
                 LDEVNOTRDY(DITP);   << NOT RDY MSG TO CONSOLE >>       19895000
                 START'HPIB(DITP,SIOP(IDLE'WAIT),FALSE);       <<03722>>19900000
                 IF > THEN                                     <<03722>>19905000
                   GOTO SIOERROR;                                       19910000
                 MSTATE:=IF IOQ'ENTRY'INDEX=0 THEN REQUESTDONE <<07045>>19915000
                                      ELSE NOTREADY;           <<03722>>19920000
               END                                                      19925000
                                                                        19930000
             ELSE   << SYSTEM NOT UP - SIODM REJECTS MSTATE 7 >>        19935000
                                                                        19940000
               BEGIN                                                    19945000
                 START'HPIB(DITP,SIOP(IDLE'WAIT),TRUE);        <<03722>>19950000
                 IF > THEN                                     <<03722>>19955000
                   GOTO SIOERROR;                                       19960000
                 MSTATE:=IF IOQ'ENTRY'INDEX=0 THEN REQUESTDONE <<07045>>19965000
                                      ELSE INTRPTWAIT;         <<03722>>19970000
               END;                                                     19975000
                                                                        19980000
             RETURN;                                                    19985000
           END;                                                         19990000
                                                                        19995000
<<---------------------------------------------------->>                20000000
<<   DATA NOT RECOVERABLE  >>                                  <<04884>>20005000
<<---------------------------------------------------->>                20010000
                                                                        20015000
         IF DITP(ACCESS'FIELD).UNRECOV'DATA'OV OR                       20020000
            DITP(ACCESS'FIELD).UNRECOV'DATA THEN               <<04834>>20025000
                                                               <<04834>>20030000
                                                                        20035000
           BEGIN                                                        20040000
             DITP(DBADBLK1) := DITP(PARM'FIELD+1);   << BAD BLK >>      20045000
             DITP(DBADBLK2) := DITP(PARM'FIELD+2);   << ADDRESS >>      20050000
             DITP(DBADXFER) := SIOP(DXFER8);       << XFER LEFT >>      20055000
                                                                        20060000
             IF FCODE = VERIFY THEN   << VERIFY FUNCTION >>             20065000
               BEGIN                                                    20070000
                 TOS := BUFFADDRD;                                      20075000
                 TOS := DDITP(DDBADBLK);                                20080000
                 ASSEMBLE (SDEA);   << RETURN BAD SECTOR ADDR >>        20085000
                                                               <<04938>>20090000
               END;                                                     20095000
             GOTO TRKSCTERROR;                                 <<04938>>20100000
           END;                                                <<04884>>20105000
                                                                        20110000
<<---------------------------------------------------->>                20115000
<<   LOG INFORMATIONAL STATUS                         >>                20120000
<<---------------------------------------------------->>                20125000
                                                                        20130000
         IF DITP(INFOR'FIELD).MEDIA'WEARING OR                          20135000
            DITP(INFOR'FIELD).DEF'BLK'SPARE OR                          20140000
            DITP(INFOR'FIELD).MARGINAL'DATA OR                          20145000
            DITP(INFOR'FIELD).RECOV'DATA'OV OR                          20150000
            DITP(INFOR'FIELD).RECOV'DATA OR                             20155000
            DITP(INFOR'FIELD).MAINT'TRK'OV THEN                         20160000
            LOG'STATUS;                                                 20165000
                                                                        20170000
<<---------------------------------------------------->>                20175000
<<   MAINTENANCE TRK OV - SCHEDULE LOGGING PROCESS    >>                20180000
<<---------------------------------------------------->>                20185000
                                                                        20190000
         IF DITP(INFOR'FIELD).MAINT'TRK'OV THEN                         20195000
           MAINT'REQUEST(DITP(DLDEV),TYPE,SUBTYPE);            <<07045>>20200000
                                                                        20205000
       END;                                                             20210000
                                                                        20215000
<<====================================================>>                20220000
<<                                                    >>                20225000
<<   POWER ON COMPLETION                              >>                20230000
<<                                                    >>                20235000
<<====================================================>>                20240000
                                                                        20245000
     IF CPVAP(1).(12:4) = 2 THEN   << PON - REDO IOQ >>                 20250000
       BEGIN                                                            20255000
         CPVAP(1).(12:4) := 0;                                          20260000
         IF IOQ'DIAG THEN  << DIAG REQUEST >>                  <<07045>>20265000
           GOTO DIAG'PON'CMPLT                                          20270000
         ELSE                                                           20275000
           GOTO RETRY'REQUEST;                                          20280000
       END;                                                             20285000
                                                                        20290000
<<====================================================>>                20295000
<<                                                    >>                20300000
<<   PROBLEM INTERROGATING STATUS                     >>                20305000
<<                                                    >>                20310000
<<====================================================>>                20315000
                                                                        20320000
     IF CPVAP(1).(12:4) = 3 THEN   << RETRY ONCE >>                     20325000
       BEGIN                                                            20330000
         CPVAP(1).(12:4) := 0;                                          20335000
         IF IOQ'QMISC.RSTAT'FAIL'FLG= 1 THEN                   <<07045>>20340000
           GOTO UNITERROR;   << RETRY FAILED >>                         20345000
         IOQ'QMISC.RSTAT'FAIL'FLG:= 1;                         <<07045>>20350000
         SIOP(BRANCHPT) := RSTATCP;   << RETRY READ STATUS >>           20355000
         START'HPIB(DITP,SIOP,TRUE);                                    20360000
         IF > THEN                                             <<03722>>20365000
           GOTO SIOERROR;                                               20370000
         MSTATE := INTRPTWAIT;                                          20375000
         RETURN;                                                        20380000
       END;                                                             20385000
                                                                        20390000
<<====================================================>>                20395000
<<                                                    >>                20400000
<<   POWER ON REQUIRING DEVICE CLEAR COMPLETION       >>                20405000
<<                                                    >>                20410000
<<====================================================>>                20415000
                                                                        20420000
     IF CPVAP(1).(12:4) = 4 THEN   << ISSUE DEV CLR >>                  20425000
       BEGIN                                                            20430000
         CPVAP(1).(12:4) := 0;                                          20435000
         SIOP(BRANCHPT) := PONCP;                                       20440000
         GOTO START'PONCP;                                     <<03722>>20445000
       END;                                                             20450000
                                                                        20455000
                                                               <<07045>>20460000
<<====================================================>>       <<07045>>20465000
<<                                                    >>       <<07045>>20470000
<<       CLEAR DUE TO IOQ ABORT COMPLETION            >>       <<07045>>20475000
<<                                                    >>       <<07045>>20480000
<<====================================================>>       <<07045>>20485000
                                                               <<07045>>20490000
     IF IOQ'QMISC.WAITCODE = ABORT'WAIT THEN                   <<07045>>20495000
       GOTO GOODXFER;                                          <<07045>>20500000
                                                               <<07045>>20505000
<<====================================================>>                20510000
<<                                                    >>                20515000
<<   NOT READY COMPLETION                             >>                20520000
<<                                                    >>                20525000
<<====================================================>>                20530000
                                                                        20535000
     IF IOQ'QMISC.WAITCODE= NOT'RDY'WAIT THEN                  <<07045>>20540000
       GOTO RETRY'REQUEST;                                              20545000
                                                                        20550000
<<====================================================>>                20555000
<<                                                    >>                20560000
<<   RELEASE/RELEASE DENIED COMPLETION                >>                20565000
<<                                                    >>                20570000
<<====================================================>>                20575000
                                                                        20580000
     IF IOQ'QMISC.WAITCODE= REL'WAIT THEN                      <<07045>>20585000
       BEGIN                                                            20590000
         IF IOQ'QMISC.OPER'REQ'FLG= 1 LAND                     <<07045>>20595000
           IOQ'QMISC.LOAD'FLG <> 1 LAND                        <<07045>>20600000
           DITP(DMISC).LOCK'FLG = 1 THEN                                20605000
                                                                        20610000
           BEGIN                                                        20615000
             IF SYSDISC=1 THEN INDEX := SYS'DENY'MSG                    20620000
               ELSE INDEX := NSYS'DENY'MSG;                             20625000
             IF NOT IOMESSAGE(1,INDEX,%10000,                           20630000
               DITP(DLDEV),,,,,OPCONSOLE) THEN                 <<07045>>20635000
               GOTO SYSERROR;                                           20640000
           END;                                                         20645000
                                                                        20650000
         IF (FCODE=INIT'MEDIA OR FCODE=VERIFY) AND             <<03667>>20655000
           IOQ'QMISC.IM'FAULT'FLG <> 1 THEN                    <<07045>>20660000
                                                               <<03667>>20665000
           BEGIN                                               <<03667>>20670000
             IF FCODE=VERIFY AND                               <<03667>>20675000
               IOQ'QMISC.VER'ERR'FLG= 1 THEN                   <<07045>>20680000
               GOTO TRKSCTERROR                                <<03667>>20685000
             ELSE GOTO GOODXFER;                               <<03667>>20690000
           END;                                                <<03667>>20695000
                                                                        20700000
         GOTO RETRY'REQUEST;                                            20705000
       END;                                                             20710000
<<====================================================>>                20715000
<<                                                    >>                20720000
<<           NO WRITE RING COMPLETION                 >>                20725000
<<                                                    >>                20730000
<<====================================================>>                20735000
                                                                        20740000
                                                               <<07045>>20745000
       IF IOQ'QMISC.UNLOAD'RING'FLG <> 0 THEN                  <<07045>>20750000
         BEGIN                                                          20755000
           IOQ'QMISC.UNLOAD'RING'FLG:= 0;                      <<07045>>20760000
           IOQ'STAT:= RING'WAIT;                               <<07045>>20765000
           MSTATE := OPINTRVNWAIT;                                      20770000
           RETURN                                                       20775000
         END;                                                           20780000
                                                                        20785000
<<====================================================>>                20790000
<<                                                    >>                20795000
<<   DRIVER/FIRMWARE SYNCHRONIZATION COMPLETION       >>                20800000
<<                                                    >>                20805000
<<====================================================>>                20810000
                                                                        20815000
      IF IOQ'QMISC.WAITCODE= SYNC'WAIT THEN                    <<07045>>20820000
       GOTO RETRY'REQUEST;                                              20825000
                                                                        20830000
<<====================================================>>                20835000
<<                                                    >>                20840000
<<   FUNCTION DEPENDENCIES COMPLETION                 >>                20845000
<<                                                    >>                20850000
<<====================================================>>                20855000
                                                                        20860000
<<---------------------------------------------------->>                20865000
<<   STATUS RETURN & DESCRIBE COMPLETION              >>                20870000
<<---------------------------------------------------->>                20875000
                                                                        20880000
  REQ'STAT'CMPLT:                                                       20885000
                                                                        20890000
     IF FCODE = REQ'STAT OR                                             20895000
       FCODE = DIAG'RESULT OR                                           20900000
       FCODE = DESCRIBE THEN                                            20905000
                                                                        20910000
       BEGIN                                                            20915000
         COUNT:= IOQ'COUNT;                                    <<07045>>20920000
         IF < THEN   << MAKE WORD COUNT >>                              20925000
           COUNT := (1-COUNT)/2;                                        20930000
                                                                        20935000
         IF CPVAP=CPVA'TIMEOUT THEN                            <<03722>>20940000
            SIOP(DESC'AREA+3).NOT'RDY := 1;   << SET NOT RDY >><<03722>>20945000
         IF (FCODE = REQ'STAT OR FCODE = DIAG'RESULT) AND               20950000
           COUNT > 10 THEN COUNT := 10;   << MAX 10 WRDS >>             20955000
                                                                        20960000
         IF FCODE = DESCRIBE AND COUNT > 18 THEN                        20965000
           COUNT := 18;   << MAX 18 WORDS OF DESCRIBE >>                20970000
                                                                        20975000
         TOS := BANK;   << USER'S AREA >>                               20980000
         TOS := BUFFADDR;                                               20985000
         TOS := 0;      << DESCRIBE AREA >>                             20990000
         TOS := @SIOP + SYSDB + DESC'AREA;                              20995000
         TOS := COUNT;  << #WORDS TO MOVE >>                            21000000
         ASSEMBLE (MABS);                                               21005000
       END;                                                             21010000
                                                                        21015000
<<---------------------------------------------------->>                21020000
<<   REQUEST VOLUME LIMIT COMPLETION                  >>                21025000
<<---------------------------------------------------->>                21030000
                                                                        21035000
     IF FCODE=REQ'VOL'LIMIT THEN                                        21040000
       BEGIN                                                            21045000
         IF IOQ'PARM1= 0 THEN                                  <<07045>>21050000
                                                                        21055000
           BEGIN                                                        21060000
             CLDA1 := SIOP(WRD'SNGL'VEC'LIMIT+1);              <<03722>>21065000
                                                               <<03722>>21070000
             CLDA2 := SIOP(WRD'SNGL'VEC'LIMIT+2);              <<03722>>21075000
                                                               <<03722>>21080000
           END                                                          21085000
                                                                        21090000
         ELSE   << THREE VECTOR ADDR >>                                 21095000
                                                                        21100000
           BEGIN                                                        21105000
             CLDA1 := SIOP(WRD'THREE'VEC'LIMIT);               <<03722>>21110000
                                                               <<03722>>21115000
             CLDA2 := SIOP(WRD'THREE'VEC'LIMIT+2);             <<03722>>21120000
                                                               <<03722>>21125000
           END;                                                         21130000
                                                                        21135000
         TOS := BUFFADDRD;                                              21140000
         TOS := CLDA1;   << VOLUME LIMIT >>                             21145000
         TOS := CLDA2;                                                  21150000
         ASSEMBLE (SDEA);   << STORE DBL WORD >>                        21155000
       END;                                                             21160000
                                                                        21165000
<<---------------------------------------------------->>                21170000
<<   IDENTIFY COMPLETION                              >>                21175000
<<---------------------------------------------------->>                21180000
                                                                        21185000
     IF FCODE=IDENTIFY THEN                                             21190000
       BEGIN                                                            21195000
         TOS := BUFFADDRD;                                              21200000
         TOS := SIOP(IDENT1);  << DEVICE ID >>                          21205000
         ASSEMBLE (SSEA);                                               21210000
       END;                                                             21215000
                                                                        21220000
                                                                        21225000
$PAGE                                                                   21230000
                                                                        21235000
  GOODXFER:                                                             21240000
     IOQ'STAT:= GOODIO;                                        <<07045>>21245000
     GOTO EXIT;                                                         21250000
                                                                        21255000
  CHANERROR:                                                            21260000
     IOQ'STAT:= CHANFAIL;                                      <<07045>>21265000
     IF NOT IOQ'DIAG THEN LOG'CPVAP;                           <<07045>>21270000
     CPVAP := 0;                                                        21275000
     GOTO EXIT;                                                         21280000
                                                                        21285000
  DIAG'STAT'CMPLT:                                                      21290000
     IOQ'STAT:= STAT'REQRD;                                    <<07045>>21295000
     GOTO EXIT;                                                         21300000
                                                                        21305000
  DIAG'PON'CMPLT:                                                       21310000
     IOQ'STAT:= DEVICE'PON;                                    <<07045>>21315000
     GOTO EXIT;                                                         21320000
                                                                        21325000
  INVALIDFUNC:                                                          21330000
     IOQ'STAT:= INVALIDOP;                                     <<07045>>21335000
     GOTO EXIT;                                                         21340000
                                                                        21345000
  INVALIDADR:                                                           21350000
     IOQ'STAT:= INVALIDSKADR;                                  <<07045>>21355000
     LOG'STATUS;                                               <<04884>>21360000
     GOTO EXIT;                                                         21365000
                                                                        21370000
  NO'SPARE'ERROR:                                                       21375000
     IOQ'STAT:= NO'SPARE'ERR;                                  <<07045>>21380000
     LOG'STATUS;                                               <<04884>>21385000
     GOTO EXIT;                                                         21390000
                                                                        21395000
  TRKSCTERROR:                                                          21400000
     IOQ'STAT:= TRKSCTERR;                                     <<07045>>21405000
     LOG'STATUS;                                               <<04884>>21410000
     GOTO EXIT;                                                         21415000
                                                                        21420000
  SIOERROR:                                                             21425000
     IOQ'STAT:= SIOFAIL;                                       <<07045>>21430000
     LOG'STATUS;                                               <<04884>>21435000
     GOTO EXIT;                                                         21440000
                                                                        21445000
  SYSERROR:                                                             21450000
     IOQ'STAT:= SYSERR;                                        <<07045>>21455000
     LOG'STATUS;                                               <<04884>>21460000
     GOTO EXIT;                                                         21465000
                                                                        21470000
  TIMEOUT:                                                              21475000
     IOQ'STAT:= TIMOUTERR;                                     <<07045>>21480000
     IF NOT IOQ'DIAG THEN LOG'CPVAP;                           <<07045>>21485000
     CPVAP := 0;                                                        21490000
     GOTO EXIT;                                                         21495000
                                                                        21500000
  UNITERROR:                                                            21505000
     IOQ'STAT:= UNITERR;                                       <<07045>>21510000
     LOG'STATUS;                                               <<04884>>21515000
     GOTO EXIT;                                                         21520000
                                                                        21525000
  UNINIT'MEDIAERROR:                                                    21530000
     IOQ'STAT:= UNINIT'MEDIA'ERR;                              <<07045>>21535000
     LOG'STATUS;                                               <<04884>>21540000
     GOTO EXIT;                                                         21545000
                                                                        21550000
  EXIT:                                                                 21555000
     SIOP(RSTAT11) := @ISTAT + SYSDB;                          <<03667>>21560000
     UPDATE'XFER'CNT;                                                   21565000
     RETURN'SYSBUF;                                                     21570000
     MSTATE := REQUESTDONE;                                             21575000
                                                                        21580000
  END;   << OF THE CS'80 DISC DRIVER >>                                 21585000
                                                                        21590000
$PAGE                                                                   21595000
   ASSEMBLE(                                                            21600000
     PCAL SIODM;     << MONITOR >>                                      21605000
     PCAL CSDRVR;    << INITIATOR >>                                    21610000
     PCAL CSDRVR;    << COMPLETOR >>                                    21615000
     CON  0;         << NO IO PROCESS >>                                21620000
     PCAL CSINIT;    << INITIALIZATION >>                               21625000
     CON  1;         << ONE INTERRUPT HANDLER >>                        21630000
     PCAL GIP'HPIB); << INTERRUPT HANDLER >>                            21635000
   END.                                                                 21640000
