$CONTROL USLINIT,MAP,CODE                                               00010000
<<  HIOPPRT0, MODULE 23 - HP2680A PAGE PRINTER DRIVER SERIES 33   >>    00012000
<<  COPYRIGHT     (C) COPYRIGHT HEWLETT-PACKARD CO. 1976.,         >>   00014000
<<    THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A,      >>   00016000
<<    TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR,    >>   00018000
<<    STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION,>>   00020000
<<    OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED,  >>   00022000
<<    WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>   00024000
<<****NOTE - DOLLAR COPYRIGHT CANNOT BE USED WITH THIS MODULE ***  >>   00026000
$CONTROL PRIVILEGED,UNCALLABLE,MAIN=HIOPPRT0                            00028000
$TP                                                                     00030000
BEGIN                                                                   00032000
$PAGE                                                                   00034000
COMMENT                                                        <<02579>>00036000
            HP 3000 Page Printer Driver - HIOPPRT0                      00038000
            ---------------------------------------------               00040000
                                                                        00042000
                                                                        00044000
Operation of HIOPPRT0:                                                  00046000
                                                                        00048000
HIOPPRT0, together with the I/O  Device  Monitor  (SIODM)  constitute  a00050000
standard MPE Type 1 I/O Driver/Monitor.  This means that it does not run00052000
in its own process, but executes on any stack (including  the  Interrupt00054000
Control  Stack)  and therefore must run to completion.  During initiali-00056000
zation it executes on PROGEN's stack, during request initiation it  exe-00058000
cutes  on  ATTACHIO's (user's) stack, and during interrupt processing it00060000
executes on the Interrupt Control Stack (ICS).                          00062000
                                                                        00064000
HIOPPRT0 consists of a global area, one procedure, and an "outer  block"00066000
which is really a linkage area for INITIAL.  The global area contains an00068000
array called INITIAL which is comprised of three parts.  The first  part00070000
specifies  the  size of the other two, the unit extract instruction, and00072000
various parameters which are used by INITIAL.  This section  is  deleted00074000
after  INITIAL  is  through with it.  The other two parts are the Device00076000
Information Table (DIT) and the Channel Program area (CHANP),  which  is00078000
part  of  the  Interrupt  Linkage Table (ILT).  INITIAL will put each of00080000
these items in the area of memory where it belongs.   The  linkage  area00082000
specifies  the  procedure  labels  (P-labels)  of the associated monitor00084000
(SIODM),  the  request  initiator  (PPDRIVER),  the  request   completor00086000
(PPDRIVER), and the interrupt handler (GIP'HPIB).                       00088000
                                                                        00090000
The primary working code of HIOPPRT0 is a procedure PPDRIVER.   PPDRIVER00092000
is  called  with  six  parameters.    Two  of these parameters, BANK and00094000
BUFADR, are the absolute buffer address of the  data  to  be  processed.00096000
DRTN  is  the  hardware  address  and interrupt information area for the00098000
device.  The other three, DITP, IOQP, and CHANP are  pointers  to  three00100000
tables.    DITP  is  a  pointer  to  the  Device Information Table which00102000
contains information about its associated page printer unit.   There  is00104000
one  DIT  for  unit on the controller and they contain information which00106000
must be saved between I/O requests to the driver.  IOQP is a pointer  to00108000
the  Input/Output  Queue  element.    IOQ  elements  contain information00110000
relevent to the current request.   CHANP  is  a  pointer  to  the  first00112000
element  of  the Channel Program which is actually part of the Interrupt00114000
Linkage Table.                                                          00116000
                                                                        00118000
PPDRIVER is always called by the  I/O  device  monitor  (SIODM)  and  it00120000
determines  the  reason  for  the call by examining the IOQ and the DIT.00122000
There are three  basic  parts  of  the  driver,  the  Common  area,  the00124000
Initiator and the Completor.  The operation of each is discussed below. 00126000
                                                                        00128000
                                                                        00130000
HIOPPRT0 Commom area:                                                   00132000
                                                                        00134000
This code is at the beginning of the driver and is executed any time the00136000
driver is "called." It performs housekeeping functions (sets  up   local00138000
variables,  maps  external  function into internal functions, checks for00140000
abort or timeout conditions)  and ensures  that  certain  functions  are00142000
only accessible to the 2680 Online Diagnostic.                          00144000
                                                                        00146000
                                                                        00148000
HIOPPRT0 Initiator:                                                     00150000
                                                                        00152000
Execution begins here for either a new request or  a  retry/continuation00154000
of  the  last  request.    If the request is a new one counts and buffer00156000
offsets are initialized.  The main purpose of the Initiator is to set up00158000
the appropriate Channel program (if necessary) to perform the  requested00160000
function.                                                               00162000
                                                                        00164000
                                                                        00166000
HIOPPRT0 Completor:                                                     00168000
                                                                        00170000
The Completor section of the driver is entered either as a result of  an00172000
internal  interrupt  from  the  Channel  program or an unusual condition00174000
occurred in the Common  area  or  the  Initiator  section.   The  status00176000
condition  of  the  last Channel program execution is checked and appro-00178000
priate action is taken.  If an I/O status block was read from the  2680A00180000
then an analysis of this status is performed and appropriate actions are00182000
taken.  Finally either the request is completed and special notation  is00184000
sent  back  to the user or execution is resumed back at the Initiator to00186000
retry or complete the request.                                          00188000
                                                                        00190000
                                                               <<02656>>00192000
                                                               <<02656>>00194000
                                                               <<02656>>00196000
                                                               <<02656>>00198000
        Development and Fix History                            <<02656>>00200000
        ---------------------------                            <<02656>>00202000
                                                               <<02656>>00204000
Development Engineer: Dave Cassafer                            <<02656>>00206000
$PAGE                                                                   00208000
                                                                        00210000
THE FOLLOWING INFORMATION IS PERTINENT TO CONFIGURING THE               00212000
DEVICE INTO AN HP3000 COMPUTER SYSTEM.                                  00214000
                                                                        00216000
DEVICE TYPE    =32                                                      00218000
DEVICE SUBTYPE =8                                                       00220000
RECORD WIDTH   =66 WORDS                                                00222000
                                                                        00224000
                                                                        00226000
                                                                        00228000
                                                                        00230000
     SINCE THE 2680A (EPOC) IS A SPECIAL DEVICE IN MANY WAYS,           00232000
SOME OF THE FUNCTION CODES ARE ALSO SPECIAL.  THE MPE DEVELOPMENT       00234000
LAB WILL USE FUNCTION CODES 128 THROUGH 191 SOLELY FOR 2680A SPECIAL    00236000
FUNCTIONS.  THE SPOOLER PROCESS WILL START USING FUNCTION CODE 128      00238000
ON UP.  THIS DRIVER WILL USE FUNCTION CODES 191 ON DOWN.  HOPEFULLY,    00240000
63 FUNCTION CODES WILL BE SUFFICIENT FOR FUTURE GROWTH.  SEE HP         00242000
BOISE DIVISION DATA CONTROL SYSTEM (DCS) ERS DRAWING #A-2680-90002.     00244000
DRIVER REQUEST CODES ARE DEFINED AS FOLLOWS:                            00246000
                                                                        00248000
PAGE PRINTER REQUEST CODES.                                             00250000
                                                                        00252000
                                                                        00254000
                                                                        00256000
  1 - WRITE DATA                                                        00258000
      P1/P2 Parameters not used by this function.  This function        00260000
      merely writes the "count" data requested by the user to the       00262000
      HP2680A.                                                          00264000
                                                                        00266000
  2 - FILE OPEN                                                         00268000
      P1/P2 Parameters not used by this function.  This function is     00270000
      not used.  If the driver is called with this function code, it    00272000
      immediately returns a 'GOOD' completion without any communica-    00274000
      tion to the device.                                               00276000
                                                                        00278000
  3 - FILE CLOSE                                                        00280000
      P1/P2 Parameters not used by this function.  This function is     00282000
      not used.  If the driver is called with this function code, it    00284000
      immediately returns a 'GOOD' completion without any communica-    00286000
      tion to the device.                                               00288000
                                                                        00290000
  4 - DEVICE/JOB CLOSE                                                  00292000
      P1/P2 Parameters not used by this function.  The driver           00294000
      automatically will invoke a CLEAR command to the HP2680A.  This   00296000
      CLEAR will cause the HP2680A to do an JOB CLOSE CLEAR.            00298000
      The HP2680A will not respond to the driver until the currently    00300000
      printing job is completely printed.                               00302000
                                                                        00304000
 15 - (%17) READ I/O STATUS                                             00306000
      P1/P2 Parameters not used by this function.  This function reads  00308000
      16 words of I/O STATUS to the buffer provided by the caller.      00310000
                                                                        00312000
 71 - (%107) READ LAST I/O STATUS FROM THE DEVICE INFORMATION TABLE     00314000
      P1/P2 Parameters not used by this function.  This function reads  00316000
      the last I/O status that is kept in the Device Information        00318000
      Table.  This function should not be called unless there was       00320000
      an error or an unpredictable I/O status can occur.                00322000
                                                                        00324000
 72 - (%110) IDENTIFY                                                   00326000
      P1/P2 Parameters not used by this function.  This request is for  00328000
      use in identification of the device.  A two byte identification   00330000
      code will be returned to the caller.                              00332000
                                                                        00334000
 73 - (%111) INITIATE SELF TEST                                         00336000
      P1/P2 Parameters not used by this function.  This request is for  00338000
      use by ONLINE DIAGNOSTICS.  An INITIATE SELF TEST is performed.   00340000
      See Diagnostic Philosophy ERS.                                    00342000
                                                                        00344000
 74 - (%112) READ SELF TEST RESULTS                                     00346000
      P1/P2 Parameters not used by this function.  This request is for  00348000
      use by ONLINE DIAGNOSTICS.  The READ SELF TEST RESULTS is         00350000
      performed.  The read is for a 1 word result.  The word has bit    00352000
      settings which indicate the state of the HP2680A Processors       00354000
      in a go or no-go fashion.  See DIAGNOSTIC PHILOSOPHY ERS.         00356000
                                                                        00358000
 75 - (%113) WRITE LOOPBACK BUFFER                                      00360000
      P1/P2 Parameters not used by this function.  This request is for  00362000
      use by ONLINE DIAGNOSTICS.  The WRITE LOOPBACK BUFFER is          00364000
      performed.  The HP2680A accepts 16 words of loopback data.        00366000
      See DIAGNOSTIC PHILOSOPHY ERS.                                    00368000
                                                                        00370000
 76 - (%114) READ LOOPBACK BUFFER                                       00372000
      P1/P2 Parameters not used by this function.  This request is for  00374000
      use by ONLINE DIAGNOSTICS.  The READ LOOPBACK BUFFER is           00376000
      performed.  The HP2680A returns 16 words of data that was         00378000
      sent with the WRITE LOOPBACK BUFFER command.  See DIAGNOSTIC      00380000
      PHILOSOPHY ERS.                                                   00382000
                                                                        00384000
189 - (%275) DEVICE CLEAR COMMAND                                       00386000
      P1/P2 Parameters not used by this function.  The driver           00388000
      automatically will invoke a CLEAR command to the HP2680A.  This   00390000
      CLEAR will cause the HP2680A to do an JOB ABORT CLEAR.            00392000
      The HP2680A will terminate the current job without printing any   00394000
      pages that might be in the printers memory.                       00396000
                                                                        00398000
190 - (%276) WRITE RECOVERY BLOCK                                       00400000
      P1/P2 Parameters not used by this function.  The SPOOLER writes   00402000
      16 words of data to the HP2680A which is necessary for data       00404000
      recovery from an abnormal condition.                              00406000
                                                                        00408000
191 - (%277) READ ENVIRONMENTAL STATUS BLOCK                            00410000
      P1/P2 Parameters not used by this function.  The SPOOLER or       00412000
      ONLINE DIAGNOSTIC may read the 16 word status block which         00414000
      describes the current environment of the HP2680A as detailed in   00416000
      the Data Control System ERS.                                      00418000
                                                                        00420000
                                                                        00422000
$PAGE                                                                   00424000
STATUS  RETURNS -                                                       00426000
                                                                        00428000
PENDING (WAITING).                                                      00430000
 % 10  - WAITING FOR COMPLETION INTERRUPT.                              00432000
   20  - OFFLINE.                                                       00434000
   30  - LAST TRANSACTION TIMED OUT.                                    00436000
                                                                        00438000
SUCCESSFUL (COMPLETION).                                                00440000
   01  - NORMAL COMPLETION.                                             00442000
                                                                        00444000
UNUSUAL COMPLETION (DATA MAY NOT TRANSFERRED TO DEVICE).                00446000
 % 13  - I/O STATUS IS AVAILABLE FOR THE SPOOLING PROCESS.              00448000
   23  - I/O STATUS IS AVAILABLE FOR THE SPOOLING PROCESS AND           00450000
         A RETRANSMISSION OF THE LAST REQUEST IS NECESSARY.             00452000
   33  - REQUEST ABORTED EXTERNALLY.                                    00454000
   63  - SYSTEM POWER FAIL.(BUT NOT NECESSARILY 2680A PFAIL!)           00456000
  213  - 2680A POWER ON.                                                00458000
                                                                        00460000
IRRECOVERABLE (CATASTROPHIC TERMINATION).                               00462000
 % 04  - INVALID REQUEST, FUNCTION OR PARAMETER.                        00464000
   14  - TRANSFER ERROR.                                                00466000
   24  - I/O TIMED OUT BEFORE COMPLETION.                               00468000
   44  - SIO FAILURE.                                                   00470000
   54  - 2680A UNIT FAILURE.                                            00472000
  124  - NO MESSAGE LINK BUFFERS AVAILABLE.                             00474000
  144  - NO RESPONSE FROM CONTROLLER INTERFACE..WE ARE DEAD.            00476000
  214  - PARITY ERROR DETECTED ON PHI COMMAND.                          00478000
                                                                        00480000
$PAGE                                                                   00482000
                                                                        00484000
                     Device Reference Table (DRT)                       00486000
                     ----------------------------                       00488000
                                                                        00490000
                                                                        00492000
There is one DRT for each device controller configured on the system.   00494000
                                                                        00496000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00498000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00500000
  0|      Channel Program Pointer  (SIOP)          |   DRT0             00502000
   +-----------------------------------------------+                    00504000
  1|  Channel Program Variable Area pointer (CPVA) |   DRT1             00506000
   +-----------------------------------------------+                    00508000
  2|      Interrupt Handler Program Label          |   DRT2             00510000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00512000
  3|ST|SH|PF|      ( status )          |WS|GF|DT|WT|   DRT3             00514000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00516000
                                                                        00518000
 Channel Program Status:                                                00520000
                                                                        00522000
   Bit 0  - ST, Channel Program Status. 0 - halted,1 - running <<02579>>00524000
       1  - SH, SIOP or HIOP instruction pending                        00526000
       2  - PF, Power Fail recovery in progress                         00528000
      12  - WS, Waiting for device status request                       00530000
      13  - GF, GIC FIFO buffer not empty                               00532000
      14  - DT, DMA transfer active                                     00534000
      15  - WT, Channel Program in Wait state                           00536000
                                                                        00538000
$PAGE                                                                   00540000
                                                                        00542000
                Interrupt Linkage Table (ILT)                           00544000
                -----------------------------                           00546000
                                                                        00548000
                                                                        00550000
There is one ILT for each device controller configured on the system.   00552000
                                                                        00554000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00556000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00558000
  0|         Channel                               |   ICPVA0           00560000
  1|              Program                          |   ICPVA1           00562000
  2|                  Variable                     |   ICPVA2           00564000
  3|                       Area (CPVA)             |   ICPVA3           00566000
   +-----------------------------------------------+                    00568000
  4|         DMA Abort                             |   ICPVA4           00570000
  5|              Address                          |   ICPVA5           00572000
   +-----------------------------------------------+                    00574000
  6|                      0                        |   ISRQL            00576000
   +--+-----------------+-----+-----------+--------+                    00578000
  7|LI|     CHANQUE     |     |   CHAN    |  DEV   |   ICNTRL           00580000
   +--+-----------------+-----+-----------+--------+                    00582000
%10| SYSDB relative pointer to Channel Program area|   ISIOP            00584000
   +-----------------------------------------------+                    00586000
%11| SYSDB relative pointer to Status Return area. |   ISTAP            00588000
   |  Always 0 for the HP2680A Page Printer.       |                    00590000
   |     Note: I/O Status is read into the DIT.    |                    00592000
   +-----------------------------------------------+                    00594000
%12| single instruction that is executed to extract|   IUNIT            00596000
   | the device unit number from the status pointed|                    00598000
   | to by ISTAP.  Always 0 for HP2680A.           |                    00600000
   +-----------------------------------------------+                    00602000
%13| SYSDB relative DIT pointer of the device      |   ICDP             00604000
   | currently using the channel to perform a      |                    00606000
   | data operation.                               |                    00608000
   +-----------------------+-----------------------+                    00610000
%14|       SIOPSIZE        |        CQUEN          |   IQUEUE           00612000
   +--+--+--+--------------+-----------+-----------+                    00614000
%15|RW|WP|IG|                          |  HCUNIT   |   IFLAG            00616000
   +--+--+--+--------------------------+-----------+                    00618000
%16| SYSDB relative DIT pointer                    |   IDITP0           00620000
   +-----------------------------------------------+                    00622000
%17|             Page Printer                      |                    00624000
   .               Channel                         .                    00626000
   |                 Program                       |                    00628000
   +-----------------------------------------------+                    00630000
                                                                        00632000
$PAGE                                                                   00634000
ICPVA0 - Channel Program Variable Area                                  00636000
                                                                        00638000
                                                                        00640000
  THE CHANNEL PROGRAM VARIABLE AREA (CPVA) IS MODIFIED BY               00642000
  THIS CHANNEL PROGRAM IN THE FOLLOWING WAYS:                           00644000
                                                                        00646000
  CPVA0 =    RESERVED FOR CHANNEL HARDWARE STATUS.  NOT USED            00648000
             BY THE CHANNEL PROGRAM (BELOW) FOR ANY REASON!             00650000
                                                                        00652000
  CPVA1 =  0 DEFAULT PRE-RUN STATE SET UP BY DRIVER.                    00654000
           1 TRANSMISSION COMPLETED SUCCESSFULLY.                       00656000
           2 I/O STATUS READ BEFORE MAIN TRANSFER DONE.                 00658000
           3 I/O STATUS READ AFTER MAIN TRANSFER DONE.                  00660000
                                                                        00662000
  CPVA2 =  0 DEFAULT PRE-RUN STATE SET UP BY DRIVER.                    00664000
             CURRENTLY NOT USED.                                        00666000
                                                                        00668000
  CPVA3 =  0 DEFAULT PRE-RUN STATE SET UP BY DRIVER.                    00670000
             CURRENTLY NOT USED.                                        00672000
                                                                        00674000
                                                                        00676000
  CPVA4/5  - DMA ABORT ADDRESS.                                         00678000
                                                                        00680000
             IF A DMA ABORT OCCURS, THE ABSOLUTE ADDRESS WHERE THE      00682000
             ABORT OCCURRED IS STORED IN THIS AREA.                     00684000
                                                                        00686000
                                                                        00688000
ICNTRL - CONTAINS CONTROLLER INFORMATION                                00690000
                                                                        00692000
  LI      - IF THIS BIT IS SET, THE CONTROLLER IS SHARING A SOFTWARE    00694000
            CHANNEL RESOURCE IN ORDER TO LIMIT BANDWIDTH.               00696000
  CHANQUE - THE SOFTWARE CHANNEL RESOURCE NUMBER.                       00698000
  CHAN    - CHANNEL NUMBER (FOUR MOST SIGNIFICANT BITS OF DRTN).        00700000
  DEV     - DEVICE NUMBER (THREE LEAST SIGNIFICANT BITS OF DRTN).       00702000
                                                                        00704000
                                                                        00706000
IQUEUE - RESOURCE QUEUING INFORMATION.                                  00708000
                                                                        00710000
  SIOPSIZE - (NUMBER OF WORDS + 1)/2 IN THE CHANNEL PROGRAM AREA.       00712000
  CQUEN    - FOR A MULTI-UNIT CONTROLLER THIS FIELD CONTAINS THE        00714000
             SOFTWARE CONTROLLER RESOURCE NUMBER.                       00716000
                                                                        00718000
                                                                        00720000
IFLAG - CONTROLLER AND CHANNEL PROGRAM STATE FLAGS                      00722000
                                                                        00724000
  RW (RUNWAIT)  - AN IDLE CHANNEL PROGRAM SHOULD BE STARTED WHEN THERE  00726000
                  ARE NO ACTIVE REQUESTS TO PROCESS.                    00728000
  WP (WAITPROG) - AN IDLE CHANNEL PROGRAM HAS BEEN STARTED FOR THIS     00730000
                  CONTROLLER.  THIS BIT IS RESET BY AN INTERRUPT.       00732000
  IG (IGNOREHI) - AN HIOP INSTRUCTION HAS BEEN ISSUED AGAINST THIS	     00734000
                  CONTROLLER BUT THE CHANNEL PROGRAM WAS NOT IN A WAIT  00736000
                  STATEMENT.  THEREFORE IGNORE THE INTERRUPT GENERATED  00738000
                  BY THE CHANNEL CODE WHEN THIS PROGRAM HALTS.          00740000
  HCUNIT        - HIGHEST CONFIGURED UNIT NUMBER FOR THIS CONTROLLER.   00742000
                                                                        00744000
$PAGE                                                                   00746000
                                                                        00748000
                                                                        00750000
    2680A DIT -                                                         00752000
                                                                        00754000
          0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15               00756000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              00758000
   DIT0  !0 !0 !AC!RQ!0 !0 !SP!CP!IA!NR!SW!  !   STATE   !  DFLAG       00760000
         -------------------------------------------------              00762000
      1  !           POINTER TO NEXT DIT                 !  DLINK       00764000
         -------------------------------------------------              00766000
      2  !        POINTER TO ACTIVE IOQ OR ZERO          !  DIOQP       00768000
         -------------------------------------------------              00770000
      3  ! IOT !   UNIT NUMBER   ! LOGICAL DEVICE NUMBER !  DLDEV       00772000
         -------------------------------------------------              00774000
      4  !      DRIVER LINKAGE TABLE POINTER             !  DDLTP       00776000
         -------------------------------------------------              00778000
      5  !      INTERRUPT LINKAGE TABLE POINTER          !  DILTP       00780000
         -------------------------------------------------              00782000
      6  !     SPECIAL ERROR CONDITIONS TO BE LOGGED     !  DSTAT       00784000
         -------------------------------------------------              00786000
      7  !          ERROR LOGGING INFORMATION            !  DSERR       00788000
         -------------------------------------------------              00790000
      8  !T !    TIMEOUT INDICATION IN BIT 0             !  DTIME       00792000
         -------------------------------------------------              00794000
      9  !       TIMER REQUEST INDEX (TRL) OR ZERO       !  DTRLX       00796000
         -------------------------------------------------              00798000
      10 !          CURRENT DATA WRITE BYTE COUNT        !  DCBCNT      00800000
         -------------------------------------------------              00802000
      11 !            CURRENT DATA WORD COUNT            !  DCWCNT      00804000
         -------------------------------------------------              00806000
      12 !        # OF WORDS LEFT TO TRANSFER            !  DRCNT       00808000
         -------------------------------------------------              00810000
      13 !  BUFFER OFFSET FOR NEXT # OF WORDS TO XFER.   !  DOFFSET     00812000
         -------------------------------------------------              00814000
      14 !                                             !D!  DDEBUG      00816000
         -------------------------------------------------              00818000
      15 ! I/O STATUS BLOCK WORD 1 GETS LOGGED FROM HERE !  DLOGBUFFER  00820000
         +-----------------------------------------------+              00822000
      16 ! I/O STATUS BLOCK WORD 3 GETS LOGGED FROM HERE !              00824000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              00826000
      17 ! I/O STATUS AREA (16 WORDS, SEE DEFINITION)    !  DIOSTAT     00828000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              00830000
                                                                        00832000
   DFLAG - DEVICE RELATIVE FLAGS.                                       00834000
         AC         ACTIVE BIT. 1 IMPLIES A MONITOR CURRENTLY           00836000
                    SERVICING THIS DEVICE.                              00838000
         RQ         REQUEST BIT. 1 IMPLIES SERVICE REQUESTED            00840000
                    WHILE MONITOR IS ACTIVE.                            00842000
         SP         SIO PREEMPTION. IF SET THEN A PREEMPTIVE            00844000
                    REQUEST HAS BEEN QUEUED FOR THIS DEVICE.            00846000
                    PREEMPT CODE IS SET IN IOQ ELEMENT.                 00848000
         CP         CHANNEL PROGRAM IN PROGRESS. IF SET, THEN           00850000
                    A CHANNEL PROGRAM IS CURRENTLY EXECUTING.           00852000
         IA         IF SET, AN INTERRUPT OR RESPONSE HAS OCCURED.       00854000
         NR         IF SET, DEVICE IS IN A NOT READY OR OPERATOR WAIT.  00856000
         SW         IF SET, AN IDLE CHANNEL PROGRAM SHOULD BE STARTED   00858000
                    FOR THIS DEVICE.                                    00860000
$PAGE                                                                   00862000
         MSTATE     CURRENT DRIVER STATE AS DEFINED BY THE MONITOR.     00864000
                    ALLOWABLE STATES ARE:                               00866000
                    0  - START REQUEST                                  00868000
                    1  - NOT USED(BUT RESERVED)                         00870000
                    2  - CALL DRIVER INITIATOR                          00872000
                    3  - CALL DRIVER COMPLETOR                          00874000
                    4  - UNUSED(BUT RESERVED)                           00876000
                    5  - COMPLETE REQUEST..PERHAPS RETURN TO USER.      00878000
                    6  - UNEXPECTED INTERRUPT OCCURRED.                 00880000
                    7  - START OPERATOR INTERVENTION WAIT.              00882000
                  %10  - WAITING (ON OPERATOR). RESTART AT 0.           00884000
                   11  - WAITING (DATA MAKEPRESENT/FREEZING)            00886000
                   12  - WAITING (INITIATOR CODE MAKEPRESENT/FREEZE)    00888000
                   13  - WAITING (FOR COMPLETION INTERRUPT)             00890000
                   14  - WAITING (FOR DEVICE CONTROLLER AVAILABILITY)   00892000
                   15  - UNUSED(BUT RESERVED)                           00894000
                   16  - WAITING (INITIATOR CODE MAKEPRESENT)           00896000
                   17  - WAITING (COMPLETOR CODE MAKEPRESENT)           00898000
                                                                        00900000
   DLDEV - I/O SYSTEM TYPE, UNIT AND LOGICAL DEVICE NUMBER.             00902000
         IOT        I/O SYSTEM TYPE.                                    00904000
                    0 - HP3000 SERIES II/III (SIO/DIO)                  00906000
                    1 - HP-IB                                           00908000
                    2 - RESERVED                                        00910000
                    3 - RESERVED                                        00912000
                                                                        00914000
   DCBCNT - CURRENT BYTE COUNT TO BE TRANSFERRED.                       00916000
                                                                        00918000
   DCWCNT - CURRENT WORD COUNT TO BE TRANSFERRED.                       00920000
                                                                        00922000
   DRCNT  - REMAINING WORD COUNT TO TRANSFER.                           00924000
                                                                        00926000
   DOFFSET - OFFSET IN BUFFER OF NEXT # WORDS TO TRANSFER.              00928000
                                                                        00930000
   DDEBUG - IF BIT 15=1 THEN DEBUGGING INFO WILL BE SENT TO CONSOLE     00932000
                                                                        00934000
   DLOGBUFFER - STATUS WORDS 1 & 3 ARE MOVED HERE TO BE LOGGED          00936000
                IF THEY WERE LOGGED FROM THE I/O STATUS BLOCK           00938000
                THEIR CONTENTS MIGHT BE CHANGED BEFORE THEY             00940000
                WERE LOGGED.                                            00942000
                                                                        00944000
   DIOSTAT - I/O STATUS AREA 16 WORDS, SEE I/O STATUS BLOCK DEFINITION. 00946000
                                                                        00948000
$PAGE                                                                   00950000
                                                                        00952000
     THE DRIVER IS CONCERNED WITH THE I/O STATUS BLOCK.  THE            00954000
I/O STATUS BLOCK CONTAINS INFO ABOUT THE ACTUAL 2680 HARDWARE           00956000
AND ITS CURRENT STATE.  THE DRIVER READS I/O STATUS INTO THE            00958000
DIT STATUS AREA POINTED TO BY DIT(DIOSTAT) POINTER.  THE FORMAT         00960000
OF THE BLOCK IS SHOWN BELOW.  IT IS READ BY THE CHANNEL PROGRAM         00962000
WITH AN ADDRESS MODIFIER SET TO 1.  IF ANY BIT IN THE I/O               00964000
STATUS WORD CHANGES STATE, THE DEVICE WILL ASSERT PARALLEL POLL         00966000
AND RESPOND TO THE NEXT DSJ WITH A 1.  EACH WORD AND BIT IN             00968000
THE TABLE IS DEFINED AS FOLLOWS:                                        00970000
                                                                        00972000
                                                                        00974000
                                                                        00976000
                                                                        00978000
I/O STATUS BLOCK                                                        00980000
                                                                        00982000
          0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15               00984000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              00986000
      0  !0 !--THE "OR" OF WORDS 1/15 IS LOCATED HERE----! DIT17        00988000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              00990000
      1  !OF!MS!PW!PE!TE!  !  !  !  !  !  !  !  !  !  !  !    18        00992000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              00994000
      2  !  !  !  !  !  !  (RESERVED)  !  !  !  !  !  !  !    19        00996000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              00998000
      3  !              MCS FAULT NUMBER                 !    20        01000000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              01002000
      4  !CL!FL!VL!CU!FU!VU!IL!IP!ST!SB!IR!MP!NJ!NM!NL!NC!    21        01004000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              01006000
      5  !LP!PF!NC!  !  !  !  !  !  !  !  !  !  !  !  !  !    22        01008000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              01010000
      6  !  !  !  !  !  !  (RESERVED)  !  !  !  !  !  !  !    23        01012000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              01014000
      7  !  !  !  !  !  !  (RESERVED)  !  !  !  !  !  !  !    24        01016000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              01018000
      8  !  !  !  !  !  !  (RESERVED)  !  !  !  !  !  !  !    25        01020000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              01022000
      9  !  !  !  !  !  !  (RESERVED)  !  !  !  !  !  !  !    26        01024000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              01026000
      10 !  !  !  !  !  !  (RESERVED)  !  !  !  !  !  !  !    27        01028000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              01030000
      11 !  !  !  !  !  !  (RESERVED)  !  !  !  !  !  !  !    28        01032000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              01034000
      12 !          RECORD NUMBER OF ERROR               !    29        01036000
         +--             IF WORD 4 IS                  --+              01038000
      13 !                NON-ZERO                       !    30        01040000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              01042000
      14 !  SHEET NUMBER OF ERROR IF WORD 4 IS NON-ZERO  !    31        01044000
         +--                   OR                      --+              01046000
      15 !  LAST SHEET TRANSFERRED IF "JOB" & POWER-ON   !    32        01048000
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+              01050000
$PAGE                                                                   01052000
WORD 0 - EACH BIT IS THE 'OR' OF ONE WORD IN THE TABLE (EXCEPT          01054000
         BIT 0 WHICH IS NOT USED).  THEREFORE, BIT .(1:1) IS SET        01056000
         IF WORD 1 IN THE TABLE IS NON-ZERO.                            01058000
                                                                        01060000
WORD 1 - BIT= 0 - (OF)  ONLINE/OFFLINE BIT.                             01062000
              1 - (MS)  MESSAGE BEING DISPLAYED ON THE 2680A CONSOLE.   01064000
              2 - (PW)  POWER UP COMPLETED SINCE LAST I/O STATUS READ.  01066000
              3 - (PE)  PARITY ERROR DETECTED ON PHI COMMAND.           01068000
              4 - (TE)  TRANSMISSION ERROR DETECTED IN THE PRINTER.     01070000
           5/15 -       RESERVED.  UNUSED.                              01072000
                                                                        01074000
WORD 2 - NOT USED. RESERVED.                                            01076000
                                                                        01078000
WORD 3 - MCS FAULT NUMBER.  CONTAINS AN INTEGER DESCRIBING THE LAST     01080000
         FAULT TO OCCUR SINCE THE LAST TIME THE I/O STATUS WAS READ     01082000
         OR THE HP2680A WAS POWERED DOWN.  IF THE WORD IS ZERO THERE    01084000
         IS NO MCS FAULT. SEE DCS ERS FOR A DESCRIPTION OF THE MCS      01086000
         FAULT NUMBERS.                                                 01088000
                                                                        01090000
WORD 4 - BIT= 0 - (CL)  NO ROOM FOR ATTEMPTED CHARACTER SET LOAD.       01092000
              1 - (FL)  NO ROOM FOR ATTEMPTED FORM LOAD.                01094000
              2 - (VL)  NO ROOM FOR ATTEMPTED VFC LOAD.                 01096000
              3 - (CU)  ATTEMPT TO PRINT DATA AND THERE IS NO CURRENTLY 01098000
                  SELECTED CHARACTER SET.                               01100000
              4 - (FU)  ATTEMPT TO SELECT AN UNDEFINED FORM SET.        01102000
              5 - (VU)  ATTEMPT TO PRINT DATA AND THERE IS NO CURRENTLY 01104000
                  SELECTED VFC SET.                                     01106000
              6 - (IL)  ATTEMPT TO PRINT DATA AND THERE IS NO CURRENTLY 01108000
                  SELECTED LOGICAL PAGE TABLE (LPT) ENTRY.              01110000
              7 - (IP)  ATTEMPT TO MOVE PEN OFF THE LOGICAL PAGE.       01112000
              8 - (ST)  THE 2680A COULD NOT PROCESS ALL OF THE DATA     01114000
                  BEFORE IT WAS SUPPOSED TO BE TRANSFERRED TO THE       01116000
                  DRUM/PAPER.  DATA WAS LOST!                           01118000
              9 - (SB)  SPOOLER BLOCK CONTAINS FORMAT ERROR.            01120000
             10 - (IR)  INVALID RECOVERY BLOCK RECEIVED FROM SPOOLER.   01122000
             11 - (MP)  MAXIMUM NUMBER OF COPIES PER PHYSICAL PAGE      01124000
                  HAS BEEN EXCEEDED.  THIS IS A RESULT OF THE           01126000
                  SPOOLER PROCESS SETTING THE MAXIMUM COPIES PER        01128000
                  PAGE WITH FUNCTION CODE 132.                          01130000
             12 - (NJ)  A COMMAND OR FUNCTION CODE WAS RECEIVED WHEN NO 01132000
                  "JOB" WAS IN PROGRESS.  THE COMMAND OR FUNCTION WAS   01134000
                  IGNORED BY THE DCS.                                   01136000
             13 - (NM)  NO MEMORY.  2680A DYNAMIC MEMORY ALLOCATION HAS 01138000
                  DETECED THAT MAIN MEMORY IS COMPLETELY OCCUPIED WITH  01140000
                  CHARACTER SETS, VFC'S, FORMS AND DATA SUCH THAT THE   01142000
                  2680A CANNOT PROCESS THE CURRENT INPUT DATA.  DATA    01144000
                  WILL BE LOST!                                         01146000
             14 - (NL)  A VFC IS SELECTED BY A LPT ENTRY WHICH HAS WORD 01148000
                  10 (LINE SPACING ON PAGE) LESS THAN OR EQUAL TO ZERO. 01150000
                  ENTRIES SELECTED.                                     01152000
             15 - (NC)  A NON-EXISTENT VFC CHANNEL WAS SKIPPED TO.      01154000
$PAGE                                                                   01156000
WORD 5 - BIT= 0 - (LP)  LOGICAL PAGE TRUNCATED TO FIT PHYSICAL PAGE.    01158000
              1 - (PF)  PAGE SIZE REQUIRED BY PROGRAMMER DID NOT        01160000
                  MATCH PAGE SIZE SET BY OPERATOR.  OPERATOR PAGE       01162000
                  SIZE PREVAILS.                                        01164000
              2 - (NC)  NO CHARACTER SET SELECTED.                      01166000
                                                                        01168000
WORDS 6/11        NOT USED BUT RESERVED FOR FUTURE USE.                 01170000
                                                                        01172000
WORDS 12/13 - THE RECORD NUMBER WHICH CONTAINS THE OFFENDING ERROR      01174000
             AS DEFINED BY WORD FOUR.  IF A POWER FAIL OCCURS DURING    01176000
             A "JOB", THE POWER FAIL BIT IS SET AND A SHEET NUMBER IS   01178000
             MADE AVAILABLE IN WORDS FOURTEEN AND FIFTEEN.  HOWEVER,    01180000
             THE RECORD NUMBER IS LOST AND CANNOT BE REPORTED.  THESE   01182000
             WORDS OCCUR IN A "JOB" ONLY.                               01184000
                                                                        01186000
WORDS 14/15 - THE SHEET NUMBER ON WHICH THE ERROR OCCURED AS DEFINED    01188000
             BY WORD FOUR.  IF AN ERROR OCCURS IN THE ENVIRONMENT FILE  01190000
             AT THE START OF A "JOB", THEN THIS NUMBER WILL BE ZERO.    01192000
             IN ADDITION, WHEN A POWER FAIL OCCURS DURING A "JOB",      01194000
             THE POWER ON BIT IS SET IN WORD ONE AND THE SHEET          01196000
             NUMBER OF THE LAST SUCCESSFULLY TRANSFERRED PAGE IS        01198000
             PLACED HERE.  THIS INFORMATION IS FOR USE BY THE           01200000
             SPOOLER SHOULD A RECOVERY OF A "JOB" BE DETERMINED.        01202000
             THESE WORDS OCCUR IN "JOB" ONLY.                           01204000
                                                                        01206000
                                                                        01208000
                                                                        01210000
     ALL WORDS OF THE I/O STATUS ARE CLEARED WHENEVER THE STATUS BLOCK  01212000
IS RETURNED TO THE HOST.  IT IS UP TO THE HOST CPU TO RETAIN ANY ON-    01214000
GOING STATUS BITS REQUIRED.                                             01216000
                                                                        01218000
$PAGE                                                                   01220000
                                                                        01222000
    2680A IOQ -                                                         01224000
                                                                        01226000
                                                                        01228000
          0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15               01230000
         +--+--------+--------+--------+--------+--------+              01232000
   IOQ0  !AB!  !DI!SB!WA!BL!C !FR!  !PR!SF!PF!PRMPT!  !MD!  QFLAG       01234000
         -------------------------------------------------              01236000
   IOQ1  !       IOQ POINTER TO NEXT NEW REQUEST         !  QLINK       01238000
         -------------------------------------------------              01240000
   IOQ2  !                       ! LOGICAL DEVICE NUMBER !  QLDEV       01242000
         -------------------------------------------------              01244000
   IOQ3  !          MISCELLANEOUS PARAMETER              !  QMISC       01246000
         -------------------------------------------------              01248000
   IOQ4  !                  DST NUMBER                   !  QDSTN       01250000
         -------------------------------------------------              01252000
   IOQ5  !        TARGET DATA BUFFER ADDRESS             !  QADDR       01254000
         -------------------------------------------------              01256000
   IOQ6  !                       !     FUNCTION CODE     !  QFUNC       01258000
         -------------------------------------------------              01260000
   IOQ7  !      WORD (+) OR BYTE (-) COUNT               !  QWBCT       01262000
         -------------------------------------------------              01264000
   I0Q8  !              PARAMETER 1                      !  QPAR1       01266000
         -------------------------------------------------              01268000
   I0Q9  !              PARAMETER 2                      !  QPAR2       01270000
         -------------------------------------------------              01272000
   IOQ10 !     PCB NUMBER        !   QUALIFIER  !RSTATUS !  QSTAT       01274000
         -------------------------------------------------              01276000
                                                                        01278000
   QFLAG -                                                              01280000
          AB         REQUEST ABORTED EXTERNALLY.                        01282000
          DI         DIAGNOSTIC FUNCTION REQUESTED.                     01284000
          SB         REQUEST IS USING SYSTEM BUFFERS.                   01286000
          WA         WAKE CALLER ON COMPLETION OF REQUEST.              01288000
          BL         BLOCKED IO. CALLER IS WAITING COMPLETION.          01290000
          C          REQUEST HAS BEEN COMPLETED & USER AWAKENED.        01292000
          FR         DATA SEG. IS PRESENT IN CORE AND FROZEN.           01294000
          PR         THIS REQUEST STARTED-BUT PREEMPTED BY MAM.         01296000
                     (NOT A POSSIBLE SEQUENCE OF EVENTS IN EPOC).       01298000
          SF         START IO FAILURE IN GIP.                           01300000
          PF         THE IO IS BEING ABORTED DUE TO POWER FAIL.         01302000
          PRMPT      (NOT USED IN EPOC DRIVER AT PRESENT)               01304000
          MD         A MESSAGE REQUEST REPLY HAS COMPLETED.             01306000
                     (NOT USED IN EPOC DRIVER AT PRESENT)               01308000
                                                                        01310000
$PAGE                                                                   01312000
   QMISC -                                                              01314000
                                                                        01316000
          0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15               01318000
         +--+--+--+-----+--+--+--+--+--------+--------+--+              01320000
   IOQ3  !MB!RB!AB!IO!TO!           !  XFER  ! PARITY !  !  QMISC       01322000
         +--+--+--+-----+--+--+--+--+--------+--------+--+              01324000
                                                                        01326000
   WHERE:                                                               01328000
                                                                        01330000
     .(0:1) - MB         USER REQUESTED TRANSFER IN EXCESS OF 4096      01332000
                         WORDS.  THE DRIVER CAN WRITE UP TO 4096 WORDS  01334000
                         TO THE 2680A.  IN ORDER TO HANDLE UP TO 32K    01336000
                         WORDS, MULTIPLE WRITES ARE USED WITHOUT A      01338000
                         RETURN TO THE USER WHO CALLED THE DRIVER.      01340000
                         THIS BIT INDICATES THAT MULTIPLE WRITES ARE    01342000
                         BEING DONE TO THE 2680A.                       01344000
                                                                        01346000
     .(1:1) - RB         THE CURRENT WRITE BLOCK MUST BE RETRIED.       01348000
                                                                        01350000
     .(2:1) - AB         USER REQUESTED ABORT IN PROGRESS FLAG.         01352000
                                                                        01354000
     .(3:1) - IO         I/O STATUS HAS BEEN READ AND IS AVAILABLE.     01356000
                                                                        01358000
     .(4:1) - TO         GENERAL I/O CONTROLLER TIMED OUT.              01360000
                                                                        01362000
     .(5:4) - RESERVED   NOT CURRENTLY USED.                            01364000
                                                                        01366000
     .(9:3) - XFER       2680A TRANSFER ERROR COUNTER.                  01368000
                                                                        01370000
     .(12:3)- PARITY     CHANNEL PROGRAM COMMAND PARITY ERROR COUNTER.  01372000
                                                                        01374000
     .(15:1)- RESERVED   NOT CURRENTLY USED.                            01376000
                                                                        01378000
      **NOTE**  IN THE ABOVE, SINGLE BIT FIELDS ARE AS DEFINED          01380000
                WHEN THE BIT IS A LOGIC "1".                            01382000
$PAGE                                                                   01384000
                                                                        01386000
Special situations.                                                     01388000
                                                                        01390000
    A job can be disrupted by either a paper jam or power failure.      01392000
Generally a paper jam is detected immediately before any data is        01394000
lost.  The operator straightens the paper path and hits run.  The       01396000
printer will restart with the proper page.  To facilitate recovery      01398000
after a power failure the sheet number of each page is recorded in      01400000
non-volatile memory after it is transferred to paper.  The host can     01402000
interrogate this value by reading the Environmental status block at     01404000
any time.  The printer can be instructed to start printing any job      01406000
on a specified sheet, thus allowing a disrupted job to be resumed on    01408000
the proper page.  The following sections detail the recovery mechanisms.01410000
                                                                        01412000
$PAGE                                                                   01414000
Power Fail Recovery.                                                    01416000
                                                                        01418000
    If a power failure occurs the printer can restart the job on the    01420000
page of the failure.  This is accomplished by retransmitting the job    01422000
from the beginning and the printer will "silent run" until the proper   01424000
page is found and then resume printing.  The protocol is:               01426000
                                                                        01428000
                                                                        01430000
    1.  Power failure occurs on the 2680A.                              01432000
                                                                        01434000
    2.  Power resumes, the printer asserts parallel poll and the DSJ    01436000
        response indicates that an I/O status block is pending.         01438000
                                                                        01440000
    3.  The host reads the I/O status block and see's the power on      01442000
        completed bit.                                                  01444000
                                                                        01446000
    4.  If the host wishes to restart a job after power resumes it      01448000
        reads the Environmental status block to determine the page      01450000
        number of the last page completely transferred to paper before  01452000
        power failed.  The host then adds 1 to the sheet number and     01454000
        sends the correct Recovery block to the printer.                01456000
                                                                        01458000
    5.  The host the retransmits the job from the start, beginning      01460000
        with the Job Open.                                              01462000
                                                                        01464000
    6.  The printer will resume printing with the sheet number          01466000
        specified in the Recovery block which preceeded the Job         01468000
        Open.                                                           01470000
                                                                        01472000
$PAGE                                                                   01474000
Paper Jams.                                                             01476000
                                                                        01478000
    Generally a paper jam is detected before any pages of print are     01480000
damaged.  In these cases the operator straightens the paper and presses 01482000
run.  The printer will restart at the correct page.  No host computer   01484000
interaction is required.  If the paper jam occurred in the output area  01486000
of the printer and several pages of print are damaged the operator may  01488000
elect to reprint several pages.  This requires host system interaction. 01490000
The steps are:                                                          01492000
                                                                        01494000
                                                                        01496000
    1.  A paper jam occurs.  The printer goes into Stop mode.           01498000
                                                                        01500000
    2.  The operator clears the paper path and decides to back up       01502000
        several pages.                                                  01504000
                                                                        01506000
    3.  The operator aborts the current job from the system console     01508000
        and instructs the spooling system to back up "n" pages.         01510000
                                                                        01512000
    4.  The spooling system then reads the Environmental status block   01514000
        and computes which page to restart on.  It then sends a         01516000
        Recovery block and retransmits the job.                         01518000
                                                                        01520000
    5.  The printer will resume printing on the correct page.           01522000
                                                                        01524000
$PAGE                                                          <<02579>>01526000
                                                               <<02579>>01528000
*********** How to Interpret Error Logging ***********         <<02579>>01530000
                                                               <<02579>>01532000
There are four conditions which cause the Driver to invoke     <<02579>>01534000
error logging.  These are the causes and what will be logged   <<02579>>01536000
in each case:                                                  <<02579>>01538000
1.  Parity Error -    1 word will be logged and its value      <<02579>>01540000
                      will be %177777.                         <<02579>>01542000
2.  Channel Failure - 1 word will be logged and its value      <<02579>>01544000
                      will be the contents of CPVA0.           <<02579>>01546000
                      (The contents of CPVA0 cannot be         <<02579>>01548000
                       %177777.)                               <<02579>>01550000
3.  Transfer Error -  2 words will be logged.  They will be    <<02579>>01552000
                      words 1&3 of the I/O STATUS BLOCK.  Bit  <<02579>>01554000
                      4 of the first word will be set to 1.    <<02579>>01556000
4.  MCS Fault -       2 words will be logged.  They will be    <<02579>>01558000
                      words 1&3 of the I/O STATUS BLOCK.  The  <<02579>>01560000
                      second word will contain the MCS Fault   <<02579>>01562000
                      number.                                  <<02579>>01564000
Please Note:  If 2 words are logged and both bit 4 of the      <<02579>>01566000
              first word is set and the second word is         <<02579>>01568000
              nonzero then both a transfer error and an        <<02579>>01570000
              MCS Fault were reported by the device.           <<02579>>01572000
                                                               <<02579>>01574000
$PAGE                                                                   01576000
Job Protocol.                                                           01578000
                                                                        01580000
    It is expected that jobs will be sent to the printer following a    01582000
standard protocol outlined below.                                       01584000
                                                                        01586000
                                                                        01588000
    1.  The first record received is a Job Open.                        01590000
                                                                        01592000
    2.  The spooling system prints the header. ( optional ).            01594000
                                                                        01596000
    3.  The Environment file is sent.                                   01598000
                                                                        01600000
    4.  The data is sent.  Environment changes can be included in the   01602000
        data.                                                           01604000
                                                                        01606000
    5.  If a programming error occurs the printer returns an I/O status 01608000
        block to the host.                                              01610000
                                                                        01612000
    6.  The host commands the printer to load the default environment.  01614000
                                                                        01616000
    7.  The host prints the error trailer, detailing the record number  01618000
        of each programming error in the job.                           01620000
                                                                        01622000
    8.  The regular trailer is printed. ( optional ).                   01624000
                                                                        01626000
    9.  The host sends a Job Close command.                             01628000
                                                                        01630000
   10.  The host reads the Environmental status block to determine,     01632000
        for accounting purposes, how many pages were printed.           01634000
                                                                        01636000
                                                                        01638000
    Many variations can occur, but the above scenario represents        01640000
most jobs.                                                              01642000
$PAGE                                                                   01644000
                                                                        01646000
Comd.  Secondary  Meaning                           Data Bytes          01648000
-----  ---------  -------                           ----------          01650000
READ    011MMMMM  READ SOME STATUS BLOCK            32 BYTES READ       01652000
           00001  I/O STATUS BLOCK                                      01654000
           00010  ENVIRONMENTAL STATUS BLOCK                            01656000
           11110  READ LOOPBACK BUFFER              256 BYTES READ      01658000
           11111  READ SELF TEST RESULTS            2 BYTES READ        01660000
                                                                        01662000
                                                                        01664000
                                                                        01666000
WRITE   011MMMMM  WRITE SOME DATA TO 2680A                              01668000
           00000  HERE COMES SPOOLFILE DATA         *NOTE 1             01670000
           00001  BYTE COUNT                        2 BYTES OF N        01672000
           00011  PAGE STATUS RECOVERY BLOCK        32 BYTES            01674000
           11110  WRITE LOOPBACK BUFFER             256 BYTES           01676000
           11111  INITIATE SELF TEST                1 BYTE-IGNORED      01678000
                                                                        01680000
                                                                        01682000
                                                                        01684000
DSJ     01110000  REASON FOR PARALLEL POLL?         1 BYTE              01686000
         (talk)                                     *NOTE 2             01688000
                  PRINTER READY                     00000000            01690000
                  I/O STATUS READ REQUESTED         00000001            01692000
                                                                        01694000
                                                                        01696000
                                                                        01698000
CLEAR   01110000  PERFORM SOME CLEAR                *NOTE 3             01700000
        (listen)                                                        01702000
                  BYTE = 0, JOB CLOSE CLEAR                             01704000
                  BYTE = 1, JOB ABORT CLEAR                             01706000
                                                                        01708000
Summary of Secondary Address Commands                                   01710000
                                                                        01712000
                                                                        01714000
Secondary Address Command                                               01716000
******  NOTES  ******                                                   01718000
---------------------                                                   01720000
                                                                        01722000
NOTE 1.  Spoolfile data is sent from the host to the 2680A in blocks    01724000
of 512 words each.  The host may send multiple blocks in one trans-     01726000
mission up to the limit of the 3000 driver (32767 words).               01728000
                                                                        01730000
NOTE 2.  In addition to transferring data from the Host to the Device,  01732000
it is also necessary to transfer I/O Status to the CPU. The general     01734000
protocol is that EPOC will assert Parallel Poll whenever it has status  01736000
for the CPU.  The CPU driver sends a DSJ request to device and device   01738000
responds with one of the following bytes which is mapped to the CPVA    01740000
by the channel program.  The HP2680A responds with one of the follow-   01742000
ing two DSJ status bytes.                                               01744000
                                                 HANDLING               01746000
STATUS BYTE          MEANING                     PRIORITY               01748000
---------------      --------------------------  --------               01750000
                                                                        01752000
0                    Device Ready                   2                   01754000
1                    Request I/O Status Read        1                   01756000
                                                                        01758000
                                                                        01760000
     After the DSJ has been responded to by outputting one of           01762000
the above bytes (by device to CPU), the device will clear the Parallel  01764000
Poll.  If a non-zero DSJ response vector is received by the driver, it  01766000
will interrogate the device with a DSJ after taking the appropriate     01768000
action on the current DSJ byte.  Note that the Parallel Poll line is    01770000
used to indicate that status is available and the line is cleared once  01772000
the HP2680A indicates to the driver that status is pending!  The        01774000
actual status info has not yet been transferred.  At this point, it is  01776000
the responsibility of the driver to make the appropriate read to fetch  01778000
the status block.  There are 2 different status blocks: Environmental   01780000
status and I/O status.  The first are for use by the CPU                01782000
calling process to determine the current state of affairs in the        01784000
HP2680A.  Each status block is 16 words (32 bytes) long and is read by  01786000
setting the secondary address modifier bits appropriately.              01788000
                                                                        01790000
NOTE 3.  A Job Close Clear closes the current page, if opened, and      01792000
all pages in the printer memory will be printed.  A Job Abort Clear     01794000
will terminate the current job without printing any pages that might    01796000
be in the printers memory.                                              01798000
                                                                        01800000
;  <<end of comments>>                                         <<02579>>01802000
$PAGE "I/O TABLE AND GENERAL INFORMATION"                               01804000
EQUATE                                                                  01806000
  ADVISORY'MSG      = 1001,   << ADVISORY MESSAGE NUMBER >>             01808000
  CALL'INITIATOR    = 2,      << MONITOR STATE = 2 >>                   01810000
  CPVA0             = 0,      << CHANNEL PROGRAM VARIABLE AREA >>       01812000
  CPVA1             = 1,                                                01814000
  CPVA2             = 2,                                                01816000
  CPVA3             = 3,                                                01818000
  CPVA4             = 4,                                                01820000
  CPVA5             = 5,                                                01822000
  DATAWRITE         = 1,      << FUNCTION = WRITE DATA >>               01824000
  DCBCNT            = 10,     << DIT- CURRENT BYTE COUNT >>             01826000
  DDEBUG            = 14,     << DIT- FOR DEBUGGING >>                  01828000
  DCWCNT            = 11,     << DIT- CURRENT WORD COUNT >>             01830000
  DDLTP             = 4,      << DIT- DRIVER LINKAGE TABLE POINTER >>   01832000
  DEVICECLEAR       = 12,     << FUNCTION = JOB ABORT CLEAR >>          01834000
  DEVICECLOSE       = 4,      << FUNCTION = DEVICE CLOSE >>             01836000
  DFLAG             = 0,      << DIT- FLAGS WORD >>                     01838000
  DILTP             = 5,      << DIT- INTERRUPT LINKAGE TABLE POINTER >>01840000
  DIOQP             = 2,      << DIT- IOQ POINTER >>                    01842000
  DIOSTAT           = 17,     << DIT- I/O STATUS AREA >>                01844000
  DITSIZE           = 33,     << WORD SIZE OF PAGE PRINTER DIT >>       01846000
  DLDEV             = 3,      << DIT- I/O SYSTEM TYPE, LDEV, UNIT >>    01848000
  DLINK             = 1,      << DIT- NEXT DIT REQUESTING SERVICE >>    01850000
  DLOGBUFFER        = 15,     << DIT- LOGGING AREA FOR IOSTATUS         01852000
                                 WORDS 1 & 3 >>                         01854000
  DOFFSET           = 13,     << DIT- RELATIVE BUFFER OFFSET >>         01856000
  DRCNT             = 12,     << DIT- REMAINING WORD COUNT >>           01858000
  DSERR             = 7,      << DIT- ERROR LOGGING STATUS WORD >>      01860000
  DSTAT             = 6,      << DIT- CHANNEL STATUS >>                 01862000
  DTIME             = 8,      << DIT- TIMEOUT FLAGS WORD >>             01864000
  DTRLX             = 9,      << DIT- TIMER REQUEST INDEX >>            01866000
  ICNTRL            = 7,      << ILT- CONTROLLER INFORMATION >>         01868000
  IFLAG             = 13,     << ILT- FLAGS WORD >>                     01870000
  IDENTIFYFUNC      = 7,      << IDENTIFY INTERNAL FUNCTION CODE >>     01872000
  ISIOP             = 8,      << ILT- CHANNEL PROGRAM POINTER >>        01874000
  ISTAP             = 9,      << ILT- I/O STATUS AREA POINTER >>        01876000
  LOG'DSTAT         = %000406,<< DSTAT LOGGING INFO >>                  01878000
  LOG'BUFFER        = %001017,<< DLOGBUFFER LOGGING INFO >>             01880000
  MAX'RECORD'SIZE   = 4096,   << SINGLE WRITE MAXIMUM SIZE >>           01882000
  MCS'WORD          = DIOSTAT+3,<< DIT RELATIVE ADR OF MCR'STATUS>>     01884000
  NRDYMSG           = 11,     << NOT READY MESSAGE NUMBER >>            01886000
  PPSET             = 22,     << CATALOG MESSAGE SET NUMBER >>          01888000
  QADDR             = 5,      << IOQ- TARGET BUFFER ADDRESS >>          01890000
  QDSTN             = 4,      << IOQ- DATA SEGMENT NUMBER >>            01892000
  QFLAG             = 0,      << IOQ- FLAGS WORD >>                     01894000
  QFUNC             = 6,      << IOQ- I/O FUNCTION >>                   01896000
  QLDEV             = 2,      << IOQ- LOGICAL DEVICE NUMBER >>          01898000
  QLINK             = 1,      << IOQ- IOQ POINTER FOR NEXT REQUEST >>   01900000
  QMISC             = 3,      << IOQ- DRIVER DEPENDENT MISC. AREA >>    01902000
  QPAR1             = 8,      << IOQ- DRIVER DEPENDENT PARAMETER # 1 >> 01904000
  QPAR2             = 9,      << IOQ- DRIVER DEPENDENT PARAMETER # 2 >> 01906000
  QSTAT             = 10,     << IOQ- RETURN STATUS AREA >>             01908000
  QWBCT             = 7,      << IOQ- WORD (+) OR BYTE (-) COUNT >>     01910000
  SIOSIZE           = 40,     << CHANNEL PROGRAM SIZE >>                01912000
  SIOHALF           = SIOSIZE/2,                                        01914000
  INITSIZE          = DITSIZE + SIOSIZE + 4,                            01916000
  STATSIZE          = 0,      << I/O STATUS AREA IN ILT NOT USED >>     01918000
  SYSDB             = %1000,                                            01920000
  SYSMSET           = 1;      << SYSTEM MESSAGE SET IN CATALOG >>       01922000
                                                                        01924000
$PAGE "CHANNEL PROGRAM INSTRUCTIONS"                                    01926000
                                                                        01928000
EQUATE                                                                  01930000
  JOB'ABORT'CLEAR   = %4401,                                            01932000
  DSJ               = %2401,                                            01934000
  JOB'CLOSE'CLEAR   = %4400,                                            01936000
  DSJ1'AFTER        = 3,                                                01938000
  DSJ1'BEFORE       = 2,                                                01940000
  IDENTIFY          = %3000,                                            01942000
  INITSELFTEST      = %4017,                                            01944000
  INTERRUPT'HALT1   = %601,                                             01946000
  INTERRUPT'HALT2   = %602,                                             01948000
  INTERRUPT'HALT3   = %603,                                             01950000
  JUMP              = 0,                                                01952000
  READENVSTATUS     = %1402,                                            01954000
  READIOSTATUS      = %1401,                                            01956000
  READLOOPBACK      = %3416,                                            01958000
  READSELFTEST      = %3417,                                            01960000
  WAIT              = %1000,                                            01962000
  WRITEBYTECOUNT    = %2001,                                            01964000
  WRITEDATA         = %2000,                                            01966000
  WRITELOOPBACK     = %4016,                                            01968000
  WRITEPGRECOVER    = %2003;                                            01970000
                                                                        01972000
$PAGE "CHANNEL PROGRAM JUMP VECTORS AND ADDRESSES"                      01974000
                                                                        01976000
EQUATE                                                                  01978000
  CPBASE            = 6,                 << CHANNEL PROGRAM BASE ADDR >>01980000
  JADR              = 5,                 << INITIAL JUMP ADDRESS >>     01982000
  WBC1              = 6,                 << WRITE BYTE COUNT >>         01984000
  WBC2              = 7,                 << CHANNEL INSTRUCTION >>      01986000
  WBC3              = 8,                 << RELATIVE ADDRESSES >>       01988000
  WBC4              = 9,                                                01990000
  WBC5              = 10,                                               01992000
  CMND1             = 17,                << FIVE WORD CHANNEL >>        01994000
  CMND2             = 18,                << RELATIVE ADDRESSES >>       01996000
  CMND3             = 19,                                               01998000
  CMND4             = 20,                                               02000000
  CMND5             = 21,                                               02002000
  DSJ3              = 24,                                               02004000
  IOST1             = 32,                << I/O STATUS READ CHANNEL >>  02006000
  IOST2             = 33,                << INSTRUCTION RELATIVE >>     02008000
  IOST3             = 34,                << ADRRESSES >>                02010000
  IOST4             = 35,                                               02012000
  IOST5             = 36,                                               02014000
  WAIT1             = 11,                                               02016000
  WAIT2             = 22,                                               02018000
  WAIT3             = 37,                                               02020000
  STHLT             = 38,              << HALT CODE AFTER I/O>>         02022000
  CLEARCP           = CMND4 - CPBASE,    << CLEAR JUMP ADDR.>>          02024000
  IDENTCP           = CMND2 - CPBASE,    << IDENTIFY >>                 02026000
  IDLECP            = WAIT2 - CPBASE,    << IDLE CHANNEL PROGRAM >>     02028000
  IOSTATCP          = IOST1 - CPBASE,    << INTERNAL I/O STATUS READ >> 02030000
  IO'STATUS'CP      = CMND1 - CPBASE,    << EXTERNAL I/O STATUS READ >> 02032000
  LOOPBACKCP        = CMND1 - CPBASE,    << PERFORM LOOPBACK TEST >>    02034000
  PAGERECVCP        = CMND1 - CPBASE,    << WRITE PAGE RECOVERY BLOCK >>02036000
  READENVSTATCP     = CMND1 - CPBASE,    << READ ENVIRONMENTAL STATUS >>02038000
  SELFTESTCP        = CMND1 - CPBASE,    << PERFORM SELF TEST >>        02040000
  WRITECP           = WBC1 - CPBASE;     << WRITE DATA >>               02042000
                                                                        02044000
$PAGE "DRIVER RETURN CODES & MONITOR STATES"                            02046000
                                                                        02048000
EQUATE                                                                  02050000
  PENDING           = %10,      << PENDING/WAITING FOR COMPLETION >>    02052000
  OFFLINESTAT       = %20,      << OFFLINE >>                           02054000
  TIMEOUTSTAT       = %30,      << TIMEOUT >>                           02056000
                                                                        02058000
  SUCCESSFUL        = 1,        << SUCCESSFUL COMPLETION >>             02060000
                                                                        02062000
  SPOOLERSTATUS     = %13,      << UNUSUAL COMPLETION >>                02064000
  RETRANSMIT'SPOOL  = %23,                                              02066000
  USERABORT         = %33,                                              02068000
  POWERFAIL         = %63,                                              02070000
  POWERUPSTAT       = %213,                                             02072000
                                                                        02074000
  INVALID           = 4,        << IRRECOVERABLE ERROR >>               02076000
  TRANSFER'ERROR    = %14,                                              02078000
  IO'TIMEDOUT       = %24,                                              02080000
  BADCHANP          = %44,                                              02082000
  UNIT'FAILURE      = %54,                                              02084000
  SYSTEMERROR       = %124,                                             02086000
  CNTRLNOGOOD       = %144,                                             02088000
  PARITY'ERROR      = %214,                                             02090000
                                                                        02092000
  COMPLETED         = 5,        << MONITOR RETURN STATES >>             02094000
  OPERATOR'WAIT     = 7,                                                02096000
  COMPLETION'WAIT   = %13;                                              02098000
                                                                        02100000
$PAGE "PROGRAM DEFINES & BIT DEFINITIONS"                               02102000
                                                                        02104000
DEFINE                                                                  02106000
  ABORT             = (0:1)#,                                           02108000
  ABS               = ABSOLUTE#,                                        02110000
  ASMB              = ASSEMBLE#,                                        02112000
  DIAG              = (2:1)#,                                           02114000
  DIAGNOSTIC        = IOQPL(QFLAG).DIAG#,                               02116000
  ERRORCODE         = (0:3)#,                                           02118000
  FINISH            = (15:1)#,                                          02120000
  FUNC              = (8:8)#,                                           02122000
  IOPROG            = (7:1)#,                                           02124000
  IOSTAT            = (14:1)#,                                          02126000
  LDEV              = (8:8)#,                                           02128000
  PFAILABORT        = (11:1)#,                                          02130000
  SYSBUFR           = (3:1)#,                                           02132000
  STAT              = (8:8)#,                                           02134000
  TIMEDOUT          = (13:1)#,                                          02136000
  SETMBLOCKMODE     = MISC.(0:1) := 1#,                                 02138000
  MULTIBLOCKMODE    = MISC.(0:1)#,                                      02140000
  CLEARMBLOCKMODE   = MISC.(0:1) := 0#,                                 02142000
  SETBLOCKRETRY     = MISC.(1:1) := 1#,                                 02144000
  BLOCKRETRY        = MISC.(1:1)#,                                      02146000
  CLEARBLOCKRETRY   = MISC.(1:1) := 0#,                                 02148000
  SETABORTFLAG      = MISC.(2:1) := 1#,                                 02150000
  ABORTFLAG         = MISC.(2:1)#,                                      02152000
  CLEARABORTFLAG    = MISC.(2:1) := 0#,                                 02154000
  SETIOSTATUS       = MISC.(3:1) := 1#,                                 02156000
  IOSTATUS          = MISC.(3:1)#,                                      02158000
  CLEARIOSTATUS     = MISC.(3:1) := 0#,                                 02160000
  SETTIMEOUT        = MISC.(4:1) := 1#,                                 02162000
  TIMEOUT           = MISC.(4:1)#,                                      02164000
  CLEARTIMEOUT      = MISC.(4:1) := 0#,                                 02166000
  OFFLINE           = IOSTATUS1.(0:1)#,                                 02168000
  ADVISORY          = IOSTATUS1.(1:1)#,                                 02170000
  POWERUP           = IOSTATUS1.(2:1)#,                                 02172000
  PARITY            = IOSTATUS1.(3:1)#,                                 02174000
  XFERERROR         = IOSTATUS1.(4:1)#;                                 02176000
                                                                        02178000
$PAGE "I/O TABLE DEFINITION AREA"                                       02180000
<< DIT DEFINITION/DRIVER LINKAGE AREA/CHANNEL PROGRAM AREA >>           02182000
                                                                        02184000
ARRAY INITIAL(0:INITSIZE-1)= DB :=                                      02186000
    [8/DITSIZE,8/1],        << DIT SIZE, TYPE 1 MONITOR >>              02188000
    0,                      << NOT USED >>                              02190000
    0,                      << NO UNIT EXTRACT >>                       02192000
    [8/SIOHALF,8/STATSIZE], << CHANNEL PROGRAM SIZE/2, STATUS SIZE >>   02194000
                                                                        02196000
    << DIT AREA >>                                                      02198000
                                                                        02200000
                                                                        02202000
                                                                        02204000
    0,             << DFLAG   - 0 >>                                    02206000
    0,             << DLINK   - 1 >>                                    02208000
    0,             << DIOQP   - 2 >>                                    02210000
    %40000,        << DLDEV   - 3 >>                                    02212000
    0,             << DDLTP   - 4 >>                                    02214000
    0,             << DILTP   - 5 >>                                    02216000
    0,             << DSTAT   - 6 >>                                    02218000
    0,             << DSERR   - 7 >>                                    02220000
    0,             << DTIME   - 8 >>                                    02222000
    0,             << DTRLX   - 9 >>                                    02224000
    0,             << DCBCNT  -10 >>                                    02226000
    0,             << DCWCNT  -11 >>                                    02228000
    0,             << DRCNT   -12 >>                                    02230000
    0,             << DOFFSET -13 >>                                    02232000
    0,             << DDEBUG  -14>>                                     02234000
    2(0),          << DLOGBUFFER -15>>                                  02236000
    16(0),         << DIOSTAT -17/32 >>                                 02238000
$PAGE "CHANNEL PROGRAM"                                                 02240000
                                                                        02242000
<<********************************************************************  02244000
                                                                        02246000
  THE CHANNEL PROGRAM VARIABLE AREA (CPVA) IS MODIFIED BY               02248000
  THIS CHANNEL PROGRAM IN THE FOLLOWING WAYS:                           02250000
                                                                        02252000
  CPVA0 =    RESERVED FOR CHANNEL HARDWARE STATUS.  NOT USED            02254000
             BY THE CHANNEL PROGRAM (BELOW) FOR ANY REASON!             02256000
                                                                        02258000
  CPVA1 =  0 DEFAULT PRE-RUN STATE SET UP BY DRIVER.                    02260000
           1 TRANSMISSION COMPLETED SUCCESSFULLY.                       02262000
           2 I/O STATUS READ BEFORE MAIN TRANSFER DONE.                 02264000
           3 I/O STATUS READ AFTER MAIN TRANSFER DONE.                  02266000
                                                                        02268000
  CPVA2 =  0 DEFAULT PRE-RUN STATE SET UP BY DRIVER.                    02270000
             CURRENTLY NOT USED.                                        02272000
                                                                        02274000
  CPVA3 =  0 DEFAULT PRE-RUN STATE SET UP BY DRIVER.                    02276000
             CURRENTLY NOT USED.                                        02278000
                                                                        02280000
********************************************************************    02282000
                                                                        02284000
              IDENTIFY TO MAKE SURE DEVICE IS CONNECTED TO CPU          02286000
                                                                        02288000
********************************************************************>>  02290000
<<THE PURPOSE OF THIS IDENTIFY IS SO THAT IF THE DEVICE IS NOT CONNECTED02292000
THE DENTIFY COMMAND WILL TIME OUT AND INTERRUPT THE DRIVER,             02294000
IF THE IDENTIFY WAS NOT HERE THE DRIVER COULD HANG INDEFINATELY         02296000
IN THE WAIT FOLLOWING THE WRITE. >>                                     02298000
                                                                        02300000
<<  0>> << IDENTIFY >>        %3000,                                    02302000
<<  1>>                           0,                                    02304000
                                                                        02306000
<<THE JUMP 0 IS SO THAT THE LENGTH OF THE CHANNEL PROGRAM               02308000
  WOULD NOT CHANGE WHEN THE IDENTIFY COMMMAND WAS SUBSTITUTED           02310000
  FOR A DSJ AT THE BEGINNING OF THE CHANNEL PROGRAM>>                   02312000
<<  2>> << JUMP 0 >>              0,                                    02314000
<<  3>>                           0,                                    02316000
                                                                        02318000
<<********************************************************************  02320000
                                                                        02322000
               JUMP TO APPROPRIATE CHANNEL PROGRAM AREA                 02324000
                                                                        02326000
********************************************************************>>  02328000
                                                                        02330000
<<  4>> << JUMP >>                0,                                    02332000
<<  5>>                           0,                                    02334000
                                                                        02336000
$PAGE                                                                   02338000
<<********************************************************************  02340000
                                                                        02342000
                           WRITE BYTE COUNT                             02344000
                                                                        02346000
********************************************************************>>  02348000
                                                                        02350000
<<  6>> << WRITE COMMAND >>   %2001,  << WRITE BYTE COUNT >>            02352000
<<  7>>                           0,  << BYTE COUNT >>                  02354000
<<  8>>                           0,  << BURST LENGTH >>                02356000
<<  9>>                           0,  << FLAGS AND BANK NUMBER >>       02358000
<< 10>>                           0,  << ADDRESS >>                     02360000
                                                                        02362000
<< 11>> << WAIT >>            %1000,  << WAIT FOR PARALLEL POLL >>      02364000
<< 12>>                           0,                                    02366000
                                                                        02368000
<< 13>> << DSJ >>             %2401,  << CHECK PRINTER'S CONDITION >>   02370000
<< 14>>                           0,  << DSJ # 2 RETURN BYTE >>         02372000
<< 15>>                           0,  << OK >>                          02374000
<< 16>>                          13,  << READ I/O STATUS >>             02376000
                                                                        02378000
<<********************************************************************  02380000
                                                                        02382000
                              WRITE DATA                                02384000
                   WRITE PAGE STATUS RECOVERY BLOCK                     02386000
                           READ I/O STATUS                              02388000
                   READ ENVIRONMENTAL STATUS BLOCK                      02390000
                          INITIATE SELF TEST                            02392000
                        READ SELF TEST RESULTS                          02394000
                        WRITE LOOPBACK BUFFER                           02396000
                         READ LOOPBACK BUFFER                           02398000
                                CLEAR                                   02400000
                               IDENTIFY                                 02402000
                                                                        02404000
********************************************************************>>  02406000
                                                                        02408000
<< 17>> << WRITE COMMAND >>   %2000,  << READ OR WRITE COMMAND >>       02410000
<< 18>> << IDENTIFY >>            0,  << BYTE COUNT >>                  02412000
<< 19>>                           0,  << BURST LENGTH >>                02414000
<< 20>> << CLEAR OR ID HALT >>    0,  << FLAGS AND BANK NUMBER >>       02416000
<< 21>>                           0,  << ADDRESS >>                     02418000
                                                                        02420000
<< 22>> << WAIT OR JUMP 0>>   %1000,<< WAIT FOR PARALLEL POLL>>         02422000
<< 23>>                           0,  << ALSO IDLE CHANNEL PROGRAM >>   02424000
<< READ I/O STATUS DOES NOT WANT A WAIT SO IT WILL BE CHANGED>>         02426000
<<TO A JUMP 0 TO GO ON TO THE DSJ>>                                     02428000
                                                                        02430000
<< 24>> << DSJ >>             %2401,  << CHECK PRINTER'S CONDITION >>   02432000
<< 25>>                           0,  << DSJ # 3 RETURN BYTE >>         02434000
<< 26>>                           0,  << OK >>                          02436000
<< 27>>                           4,  << READ I/O STATUS >>             02438000
$PAGE                                                                   02440000
<<********************************************************************  02442000
                                                                        02444000
                 TRANSMISSION COMPLETED SUCCESSFULLY                    02446000
                            SET CPVA1 = 1                               02448000
                                                                        02450000
********************************************************************>>  02452000
                                                                        02454000
<< 28>> << INTERRUPT HALT >>   %601,  << CPVA1 = 1 >>                   02456000
<< 29>>                           1,  << TRANSMISSION SUCCESSFUL >>     02458000
                                                                        02460000
<<********************************************************************  02462000
                                                                        02464000
  MODIFY THE HALT CODE AFTER THE I/O STATUS READ TO SIGIFY THAT THE     02466000
STATUS WAS READ BEFORE THE TRANSMISSION COMPLETED TO SET UP             02468000
FOR RETRY CONDITION.                                                    02470000
                            SET CPVA1 = 2                               02472000
                                                                        02474000
********************************************************************>>  02476000
                                                                        02478000
<< 30>> << WRITE REL. IMM. >> %7406,  << MODIFY THE HALT CODE>>         02480000
<< 31>>                           2,  << AFTER I/O STATUS READ >>       02482000
                                                                        02484000
<<********************************************************************  02486000
                                                                        02488000
                           READ I/O STATUS                              02490000
                 CPAV1 SHOWS WHEN I/O STATUS WAS READ                   02492000
    CPVA1 = 2 - I/O STATUS WAS READ BEFORE TRANSMISSION COMPLETED       02494000
    CPVA1 = 3 - I/O STATUS WAS READ AFTER  TRANSMISSION COMPLETED       02496000
                                                                        02498000
********************************************************************>>  02500000
                                                                        02502000
<< 32>> << READ COMMAND >>    %1401,  << READ I/O STATUS >>             02504000
<< 33>>                          32,  << BYTE COUNT >>                  02506000
<< 34>>                           0,  << BURST LENGTH >>                02508000
<< 35>>                       %2000,  << FLAGS AND BANK NUMBER >>       02510000
<< 36>>                           0,  << ADDRESS >>                     02512000
                                                                        02514000
<< 37>> << INTERRUPT >>        %601,  << I/O STATUS WAS READ >>         02516000
<< 38>>                           3;  <<BEFORE/AFTER TRANSFER>>         02518000
                                                                        02520000
<< END OF CHANNEL PROGRAM AREA >>                                       02522000
                                                                        02524000
$PAGE "EXTERNAL PROCEDURE DECLARATIONS"                                 02526000
                                                                        02528000
PROCEDURE ABORTTIMEREQ(TRLX);                                           02530000
VALUE   TRLX; INTEGER TRLX;                                             02532000
OPTION  EXTERNAL;                                                       02534000
                                                                        02536000
INTEGER PROCEDURE GETDRT(DRT,OFFSET);                          <<03009>>02538000
VALUE DRT,OFFSET;                                              <<03087>>02540000
INTEGER DRT,OFFSET;                                            <<03009>>02542000
OPTION EXTERNAL;                                               <<03009>>02544000
                                                               <<03009>>02546000
PROCEDURE GIP'HPIB;                                                     02548000
OPTION  EXTERNAL;                                                       02550000
                                                                        02552000
PROCEDURE HELP;                                                         02554000
OPTION  EXTERNAL;                                                       02556000
                                                                        02558000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,            02560000
                            DEST,REPLY,OFFSET,DITP,IOTYPE);             02562000
VALUE   SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,IOTYPE;       02564000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,IOTYPE;       02566000
INTEGER POINTER DITP;                                                   02568000
OPTION  EXTERNAL, VARIABLE;                                             02570000
                                                                        02572000
PROCEDURE MASTERCLEARHPIB(DITP);                                        02574000
INTEGER ARRAY DITP;                                                     02576000
OPTION  EXTERNAL;                                                       02578000
                                                                        02580000
PROCEDURE SIODM(DITP,FLAGS);                                            02582000
VALUE   DITP,FLAGS;                                                     02584000
LOGICAL FLAGS;                                                          02586000
POINTER DITP;                                                           02588000
OPTION  EXTERNAL;                                                       02590000
                                                                        02592000
PROCEDURE START'HPIB(DITP,SIOP,QFLAG);                                  02594000
VALUE   DITP,SIOP,QFLAG;                                                02596000
LOGICAL QFLAG;                                                          02598000
POINTER DITP,SIOP;                                                      02600000
OPTION  EXTERNAL;                                                       02602000
                                                                        02604000
INTEGER PROCEDURE TIMEREQ(CODE,REQ,TIME);                               02606000
VALUE   CODE,REQ,TIME;                                                  02608000
INTEGER CODE,REQ;                                                       02610000
DOUBLE  TIME;                                                           02612000
OPTION  EXTERNAL;                                                       02614000
                                                                        02616000
                                                                        02618000
$PAGE "PAGE PRINTER DRIVER"                                             02620000
INTEGER PROCEDURE PPDRIVER(IOQP,DITP,BANK,BUFADR,CHANP,DRTN);           02622000
<<                                                                      02624000
  THIS PROCEDURE INITIATES AND COMPLETES I/O FOR THE HP2680A            02626000
  CONNECTED THROUGH THE HPIB INTERFACE.                                 02628000
                                                                        02630000
    MONITOR RETURNS IN PPDRIVER:                                        02632000
                                                                        02634000
        5  -  REQUEST COMPLETED.                                        02636000
        7  -  OPERATOR INTERVENTION (NOT READY) WAIT.                   02638000
      %13  -  INTERRUPT WAIT OR WAIT FOR COMPLETION.                    02640000
>>                                                                      02642000
                                                                        02644000
VALUE   DITP,   << POINTER TO DEVICE INFORMATION TABLE >>               02646000
        IOQP,   << POINTER TO I/O REQUEST QUEUE >>                      02648000
        BANK,   << BANK WHERE THE BUFFER RESIDES >>                     02650000
        BUFADR, << TARGET ADDRESS WITHIN BANK >>                        02652000
        CHANP,  << POINTER TO BEGINING OF THE CHANNEL PROGRAM >>        02654000
        DRTN;   << DEVICE REFERENCE TABLE NO. .. HARDWARE ADDRESS >>    02656000
                                                                        02658000
INTEGER BANK,                                                           02660000
        DRTN,                                                           02662000
        BUFADR;                                                         02664000
                                                                        02666000
INTEGER POINTER DITP,                                                   02668000
                IOQP,                                                   02670000
                CHANP;                                                  02672000
                                                                        02674000
OPTION  PRIVILEGED, UNCALLABLE;                                         02676000
  BEGIN                                                                 02678000
                                                                        02680000
    INTEGER FUNCTION       = Q+3,          << FUNCTION CODE >>          02682000
            S0             = S-0,          << TOP OF STACK >>           02684000
            S1             = S-1,          << TOP OF STACK - 1 >>       02686000
            MSTATE         = PPDRIVER,     << MONITOR STATE RETURN >>   02688000
            INDEX          = Q+7,          << TEMPORARY INDEX >>        02690000
            X              = X;            << X REGISTER >>             02692000
                                                                        02694000
    LOGICAL CPPSTATUS      = Q+4,          << CHANNEL STATUS >>         02696000
            IOSTATUS1      = Q+5,          << I/O STATUS WORD 1 >>      02698000
            MISC           = Q+6,          << MISCELLANEOUS FLAGS >>    02700000
            LS0            = S-0;          << TOP OF STACK >>           02702000
                                                                        02704000
    LOGICAL POINTER                                                     02706000
            IOQPL          = IOQP;         << I/O REQUEST POINTER >>    02708000
                                                                        02710000
    INTEGER POINTER                                                     02712000
            ILTP           = Q+1,          << INTERRUPT LINKAGE TABLE >>02714000
            STATP          = Q+2;          << STATUS POINTER >>         02716000
                                                                        02718000
    DEFINE  BANKNO         = BANK.(8:8)#;  << BANK NUMBER >>            02720000
$PAGE "DRIVER INITIATOR & COMPLETOR COMMON AREA"                        02722000
                                                                        02724000
    SUBROUTINE BUMPPARITY;                                              02726000
                                                                        02728000
    <<                                                                  02730000
       CALLED IF A COMMAND SENT TO THE HP2680A HAD A PARITY ERROR.      02732000
                                                                        02734000
       UPDATES A RETRY COUNTER IN THE QMISC WORD AND RETURNS            02736000
       INDICATION WHETHER MORE THAN 3 RETRIES HAVE BEEN ATTEMPTED.      02738000
    >>                                                                  02740000
                                                                        02742000
      BEGIN                                                             02744000
                                                                        02746000
        TOS := MISC;                                                    02748000
        ASMB(LDI %2; LADD,DUP);                                         02750000
        MISC := TOS;                                                    02752000
        ASMB(TBC 12; DEL);                                              02754000
      END;                                                              02756000
                                                                        02758000
                                                                        02760000
                                                                        02762000
    SUBROUTINE BUMPXFER;                                                02764000
                                                                        02766000
    <<                                                                  02768000
       CALLED IF A TRANSFER ERROR OCCURRED IN THE 2680A.                02770000
                                                                        02772000
       UPDATES A RETRY COUNTER IN THE QMISC WORD AND RETURNS            02774000
       INDICATION WHETHER MORE THAN 3 RETRIES HAVE BEEN ATTEMPTED.      02776000
    >>                                                                  02778000
                                                                        02780000
      BEGIN                                                             02782000
                                                                        02784000
        TOS := MISC;                                                    02786000
        ASMB(LDI %20; LADD,DUP);                                        02788000
        MISC := TOS;                                                    02790000
        ASMB(TBC 9; DEL);                                               02792000
      END;                                                              02794000
                                                                        02796000
                                                                        02798000
$PAGE                                                                   02800000
    SUBROUTINE START'IDLEWAIT(RSTATUS);                                 02802000
    VALUE   RSTATUS;    << IOQ RETURN STATUS >>                         02804000
    INTEGER RSTATUS;                                                    02806000
                                                                        02808000
    <<                                                                  02810000
       SET UP AND START AN IDLE WAIT CHANNEL PROGRAM AND                02812000
       RETURN THE APPROPRIATE STATUS.                                   02814000
    >>                                                                  02816000
                                                                        02818000
      BEGIN                                                             02820000
                                                                        02822000
                                                                        02824000
        << NEED TO STOP THE TIMEOUT REQUEST IF AN >>                    02826000
        << IDLE CHANNEL PROGRAM IS BEING EXECUTED >>                    02828000
                                                                        02830000
        IF DITP(DTRLX) <> 0 THEN                                        02832000
          BEGIN << A TIMER REQUEST WAS MADE >>                          02834000
            ABORTTIMEREQ(DITP(DTRLX));                                  02836000
            DITP(DTRLX) := 0; << CLEAR TIMER REQUEST INDEX IN DIT >>    02838000
            DITP(DTIME).(0:1) := 0; << SET CC ON PREVIOUS BIT STATE >>  02840000
          END;                                                          02842000
    CHANP:=JUMP; <<IDLE CP MUST NOT START WITH IDENTIFY>>      <<02656>>02844000
    CHANP(1):=IDLECP+4;                                                 02846000
        CHANP(DSJ3+3):=0; <<DONT READ STATUS AFTER IDLE CP>>            02848000
        START'HPIB(DITP, CHANP, FALSE);                                 02850000
        IF < THEN GOTO CHANPFAIL;                                       02852000
        IOQP(QMISC) := MISC;                                            02854000
        IOQP(QSTAT).STAT := RSTATUS;                                    02856000
        MSTATE := OPERATOR'WAIT;                                        02858000
      END;   << START'IDLEWAIT >>                                       02860000
                                                                        02862000
$PAGE                                                                   02864000
                                                                        02866000
    << IF NO IOQ, THEN ERRONEOUS INTERRUPT >>                           02868000
                                                                        02870000
    IF MSTATE = CALL'INITIATOR THEN IF @IOQP = 0 THEN                   02872000
      BEGIN << NO IOQ >>                                                02874000
        MSTATE := 5;  << SET GOOD END >>                                02876000
        RETURN;                                                         02878000
      END;                                                              02880000
                                                                        02882000
    << SET UP LOCAL VARIABLES >>                                        02884000
                                                                        02886000
    TOS := DITP(DILTP);           << ILT POINTER IN Q+1 >>              02888000
    TOS := @DITP + DIOSTAT;       << STATUS POINTER IN Q+2 >>           02890000
    TOS := IOQP(QFUNC).FUNC;      << FUNCTION CODE IN Q+3 >>            02892000
    TOS := 0D;                    << CPPSTATUS & IOSTATUS1 IN Q+4/5 >>  02894000
    TOS := IOQP(QMISC);           << MISCELLANEOUS FLAGS IN Q+6 >>      02896000
    TOS := 0;                     << TEMPORARY INDEX IN Q+7 >>          02898000
                                                                        02900000
    << MAP EXTERNAL FUNCTION CODES INTO INTERNAL FUNCTION CODES >>      02902000
    << FUNCTION CODE 15 MAPS TO INTERNAL CODE 5                 >>      02904000
    << FUNCTION CODES 71/76 MAP TO INTERNAL CODES 6/11          >>      02906000
    << FUNCTION CODES 189/191 MAP TO INTERNAL CODES 12/14       >>      02908000
                                                                        02910000
    IF (5 <= FUNCTION <= 14) THEN GOTO INVALIDFUNC;                     02912000
    IF FUNCTION = 15 THEN FUNCTION := 5 ELSE                            02914000
    IF (71 <= FUNCTION <= 76) THEN FUNCTION := FUNCTION - 65 ELSE       02916000
    IF (189 <= FUNCTION <= 191) THEN FUNCTION := FUNCTION - 177;        02918000
    IF NOT(1 <= FUNCTION <= 17) THEN GO TO INVALIDFUNC;                 02920000
                                                                        02922000
    << IF THE REQUEST IS FOR A DIAGNOSTIC OPERATION THEN THE >>         02924000
    << HP2680A MUST BE IN DIAGNOSTIC MODE, OTHERWISE THE     >>         02926000
    << CURRENT USER COULD LOSE DATA, ENVIRONMENT, ETC.       >>         02928000
                                                                        02930000
    IF (7 <= FUNCTION <= 11) THEN                                       02932000
      IF NOT DIAGNOSTIC THEN GOTO INVALIDFUNC;                          02934000
                                                                        02936000
    << CHECK FOR INTERNAL TIMEOUT INTERRUPTS. >>                        02938000
                                                                        02940000
    IF DITP(DTRLX) <> 0 THEN                                            02942000
      BEGIN << A TIMER REQUEST WAS MADE >>                              02944000
        ABORTTIMEREQ(DITP(DTRLX));                                      02946000
        DITP(DTRLX) := 0; << CLEAR TIMER REQUEST INDEX IN DIT >>        02948000
        DITP(DTIME).(0:1) := 0; << SET CC ON PREVIOUS BIT STATE >>      02950000
        IF <> THEN                                                      02952000
          BEGIN   << TIMER POPPED...LAST TRANSACTION TIMED OUT >>       02954000
            IOQP(QSTAT).STAT := TIMEOUTSTAT;                            02956000
            GOTO ERROREXIT;                                             02958000
          END;                                                          02960000
      END;                                                              02962000
$PAGE                                                                   02964000
    << CHECK FOR POWER FAIL OR ABORT REQUEST >>                         02966000
                                                                        02968000
    IF IOQPL.ABORT THEN                                                 02970000
      BEGIN  << A PENDING ABORT >>                                      02972000
        MASTERCLEARHPIB(DITP);                                          02974000
        IF NOT IOQPL.PFAILABORT THEN                                    02976000
          BEGIN      << USER REQUEST >>                                 02978000
            IF ABORTFLAG THEN                                           02980000
              BEGIN     << ALREADY DID "CLEAR" EVENT >>                 02982000
                IOQP(QSTAT).STAT := USERABORT;                          02984000
                GOTO ERROREXIT;                                         02986000
              END;                                                      02988000
            SETABORTFLAG;                                               02990000
            GO TO CLEARFUNC;                                            02992000
          END                                                           02994000
        ELSE                                                            02996000
          BEGIN   << POWER FAIL ABORT >>                                02998000
            IOQP(QSTAT).STAT := POWERFAIL;                              03000000
            GOTO ERROREXIT;                                             03002000
          END;                                                          03004000
      END;                                                              03006000
$PAGE "DRIVER INITIATOR"                                                03008000
    IF MSTATE = CALL'INITIATOR THEN                                     03010000
      BEGIN  << DRIVER INITIATOR >>                                     03012000
                                                                        03014000
        CHANP(WAIT2):=WAIT; <<RESTORE WAIT>>                            03016000
        CHANP(DSJ3+3):=4; <<RESTORE DSJ VECTOR>>                        03018000
        CHANP:=IDENTIFY; <<RESTORE INTITIAL IDENTIFY IT MAY HAVE BEEN>> 03020000
        CHANP(1):=0; <<CHANGED TO A JUMP TO IDLE CP>>                   03022000
      COMMAND'RETRY:                                                    03024000
                                                                        03026000
        << IF THIS REQUEST IS FROM A NOT READY CONDITION,      >>       03028000
        << CHECK IF RECOVERY OR MULTIPLE BLOCKS ARE IN EFFECT. >>       03030000
                                                                        03032000
        IF BLOCKRETRY OR MULTIBLOCKMODE THEN GOTO WRITERETRYBLOCK;      03034000
                                                                        03036000
        << CALCULATE WORD & BYTE COUNT >>                               03038000
        << INITIALIZE BUFFER OFFSET    >>                               03040000
                                                                        03042000
        TOS := IOQP(QWBCT);                                             03044000
        TOS := IF < THEN -TOS ELSE TOS*2;                               03046000
        DITP(DRCNT) := (DITP(DCBCNT) := TOS)&LSR(1);                    03048000
        DITP(DOFFSET) := 0;                                             03050000
                                                                        03052000
        << CHECK FOR VALID COUNT IF SYSTEM BUFFERS >>                   03054000
                                                                        03056000
        IF IOQPL.SYSBUFR THEN                                           03058000
          IF NOT (1 <= DITP(DCBCNT) <= 256) THEN GOTO INVALIDFUNC;      03060000
                                                                        03062000
        << THE BYTE COUNT MUST BE A MULTIPLE OF 1024 >>                 03064000
        << FOR A FUNCTION OF WRITE DATA.             >>                 03066000
                                                                        03068000
        IF FUNCTION = DATAWRITE THEN                                    03070000
          IF LOGICAL(DITP(DCBCNT)) MOD 1024 <> 0 OR DITP(DCBCNT) = 0    03072000
          THEN GOTO INVALIDFUNC;                                        03074000
                                                                        03076000
$PAGE "DRIVER FUNCTIONS"                                                03078000
                                                                        03080000
        CASE FUNCTION OF                                                03082000
          BEGIN  << DRIVER FUNCTION CASES >>                            03084000
                                                                        03086000
COMMENT                                                                 03088000
                                                                        03090000
************************************************************************03092000
                                                                        03094000
FUNCTION                     EXTERNAL CODE          INTERNAL CODE       03096000
                             ( ATTACHIO )            ( DRIVER )         03098000
                                                                        03100000
************************************************************************03102000
                                                                        03104000
WRITE SPOOLFILE DATA                   1                  1             03106000
FILE OPEN                              2                  2             03108000
FILE CLOSE                             3                  3             03110000
DEVICE CLOSE                           4                  4             03112000
READ CURRENT I/O STATUS               15                  5             03114000
READ LAST I/O STATUS FROM DIT         71                  6             03116000
DEVICE IDENTIFY                       72                  7             03118000
INITIATE SELF TEST                    73                  8             03120000
READ SELF TEST RESULTS                74                  9             03122000
WRITE LOOPBACK BUFFER                 75                 10             03124000
READ LOOPBACK BUFFER                  76                 11             03126000
DEVICE CLEAR                         189                 12             03128000
WRITE PAGE STATUS RECOVERY BLOCK     190                 13             03130000
READ ENVIRONMENTAL STATUS BLOCK      191                 14             03132000
                                                                        03134000
************************************************************************03136000
                                                                        03138000
; << END OF COMMENT >>                                                  03140000
                                                                        03142000
$PAGE                                                                   03144000
            BEGIN  << FUNCTION = 0; INVALID FUNCTION CODE >>            03146000
                                                                        03148000
              GOTO INVALIDFUNC;                                         03150000
                                                                        03152000
            END;   << FUNCTION = 0; INVALID FUNCTIONC CODE >>           03154000
$PAGE                                                                   03156000
            BEGIN  << FUNCTION = 1; WRITE SPOOLFILE DATA >>             03158000
                                                                        03160000
              << DO WE NEED TO RE-TRANSMIT A BLOCK? >>                  03162000
              << RESET REMAINING COUNT & BUFFER ADDRESS >>              03164000
                                                                        03166000
            WRITERETRYBLOCK:                                            03168000
                                                                        03170000
              IF BLOCKRETRY THEN                                        03172000
                BEGIN    << A BLOCK MUST BE RETRANSMITTED >>            03174000
                  CLEARBLOCKRETRY;                                      03176000
                  DITP(DRCNT) := DITP(DRCNT) + DITP(DCWCNT);            03178000
                  DITP(DOFFSET) := DITP(DOFFSET) - DITP(DCWCNT);        03180000
                END;                                                    03182000
                                                                        03184000
              << CHECK FOR MULTIPLE WRITES >>                           03186000
              << SET UP COUNTS & ADDRESS INTO THE DIT >>                03188000
                                                                        03190000
            WRITEMULTIBLOCK:                                            03192000
                                                                        03194000
              << CHECK IF MULTI-BLOCK (REQUEST GREATER THAN 4K WORDS) >>03196000
              << FIGURE CURRENT COUNT IN WORDS & BYTES, SAVE IN DIT   >>03198000
                                                                        03200000
              CLEARMBLOCKMODE;                                          03202000
              TOS := DITP(DRCNT);                                       03204000
              IF <= THEN                                                03206000
                BEGIN   << ALL FINISHED >>                              03208000
                  DEL;                                                  03210000
                  GOTO DONE;                                            03212000
                END;                                                    03214000
              IF S0 > MAX'RECORD'SIZE THEN                              03216000
                BEGIN   << MULTI-BLOCK TRANSFER >>                      03218000
                  DITP(DRCNT) := TOS - MAX'RECORD'SIZE;                 03220000
                  TOS := MAX'RECORD'SIZE;                               03222000
                  SETMBLOCKMODE;                                        03224000
                END                                                     03226000
              ELSE DITP(DRCNT) := 0;                                    03228000
              DITP(DCBCNT) := (DITP(DCWCNT) := TOS)&LSL(1);             03230000
                                                                        03232000
              << SET UP THE WRITE BYTE CNT & DATA CHANNEL PROGRAMS >>   03234000
                                                                        03236000
              CHANP(JADR) := WRITECP;     << JUMP TO WRITE BYTE COUNT >>03238000
                                                                        03240000
              << SET UP WRITE BYTE COUNT CHANNEL INSTRUCTION >>         03242000
                                                                        03244000
              CHANP(WBC1) := WRITEBYTECOUNT;                            03246000
              CHANP(WBC2) := 2;                                         03248000
              CHANP(WBC3) := 0;                                         03250000
              CHANP(WBC4) := 0;                                         03252000
              CHANP(WBC5) := @DITP+SYSDB+DCBCNT; << ADDR OF BYTE CNT >> 03254000
                                                                        03256000
              << SET UP WRITE DATA CHANNEL INSTRUCTION >>               03258000
                                                                        03260000
              CHANP(CMND1) := WRITEDATA;                                03262000
              CHANP(CMND2) := DITP(DCBCNT);                             03264000
              CHANP(CMND3) := 0;                                        03266000
              CHANP(CMND4) := BANKNO;                                   03268000
              CHANP(CMND5) := BUFADR + DITP(DOFFSET);                   03270000
                                                                        03272000
              << UPDATE BUFERR OFFSET >>                                03274000
                                                                        03276000
              DITP(DOFFSET) := DITP(DOFFSET) + DITP(DCWCNT);            03278000
                                                                        03280000
            END;   << FUNCTION = 1; WRITE SPOOLFILE DATA >>             03282000
$PAGE                                                                   03284000
            BEGIN  << FUNCTION = 2; FILE OPEN >>                        03286000
                                                                        03288000
              << JUST RETURN GOOD COMPLETION >>                         03290000
                                                                        03292000
              IOQP(QSTAT).STAT := SUCCESSFUL;                           03294000
              GOTO EXIT;                                                03296000
                                                                        03298000
            END;   << FUNCTION = 2; FILE OPEN >>                        03300000
$PAGE                                                                   03302000
            BEGIN  << FUNCTION = 3; FILE CLOSE >>                       03304000
                                                                        03306000
              << JUST RETURN GOOD COMPLETION >>                         03308000
                                                                        03310000
              IOQP(QSTAT).STAT := SUCCESSFUL;                           03312000
              GOTO EXIT;                                                03314000
                                                                        03316000
            END;   << FUNCTION = 3; FILE CLOSE >>                       03318000
$PAGE                                                                   03320000
            BEGIN  << FUNCTION = 4; DEVICE CLOSE >>                     03322000
                                                                        03324000
              << SET UP THE CLEAR CHANNEL PROGRAM >>                    03326000
                                                                        03328000
              CHANP(JADR) := CLEARCP;  << SET INITIAL JUMP TO CLEAR >>  03330000
                                                                        03332000
              << SET UP CLEAR CHANNEL INSTRUCTION >>                    03334000
                                                                        03336000
              CHANP(CMND4) := JOB'CLOSE'CLEAR;                          03338000
              CHANP(CMND5) := 0;                                        03340000
                                                                        03342000
            END;   << FUNCTION = 4; DEVICE CLOSE >>                     03344000
$PAGE                                                                   03346000
            BEGIN  << FUNCTION = 15; READ I/O STATUS BLOCK >>           03348000
                                                                        03350000
              << CHECK FOR VALID COUNT >>                               03352000
                                                                        03354000
              IF DITP(DCBCNT) <> 32 THEN GOTO INVALIDFUNC;              03356000
                                                                        03358000
              << SET UP READ I/O STATUS CHANNEL PROGRAM >>              03360000
                                                                        03362000
              CHANP(JADR) := IO'STATUS'CP; << JUMP TO READ I/O STATUS >>03364000
                                                                        03366000
              << SET UP READ I/O STATUS CHANNEL INSTRUCTION >>          03368000
                                                                        03370000
              CHANP(CMND1) := READIOSTATUS;                             03372000
              CHANP(CMND2) := DITP(DCBCNT);                             03374000
              CHANP(CMND3) := 0;                                        03376000
              CHANP(CMND4) := BANKNO;                                   03378000
              CHANP(CMND5) := BUFADR;                                   03380000
              CHANP(WAIT2):=JUMP; <<IN THE CASE OF READ I/O >>          03382000
                          <<STATUS WE REPLACE THE WAIT WITH A>>         03384000
                                <<JUMP 0 TO GET TO NEXT INSTR>>         03386000
                                                                        03388000
            END;   << FUNCTION = 15; READ I/O STATUS BLOCK >>           03390000
$PAGE                                                                   03392000
            BEGIN  << FUNCTION = 71; READ LAST I/O STATUS FROM DIT >>   03394000
                                                                        03396000
              << CHECK FOR VALID COUNT >>                               03398000
                                                                        03400000
              IF DITP(DCBCNT) <> 32 THEN GOTO INVALIDFUNC;              03402000
                                                                        03404000
              << MOVE THE LAST STATUS TO THE CALLER'S BUFFER >>         03406000
                                                                        03408000
              TOS := BANKNO;          << TARGET BANK >>                 03410000
              TOS := BUFADR;          << TARGET ABSOLUTE ADDRESS >>     03412000
              TOS := 0;               << SOURCE BANK >>                 03414000
              TOS := @STATP + SYSDB;  << SOURCE ABSOLUTE ADDRESS >>     03416000
              TOS := 16;              << 16 WORDS OF I/O STATUS >>      03418000
              ASMB(MABS);                                               03420000
              GOTO DONE;                                                03422000
                                                                        03424000
            END;   << FUNCTION = 71; READ LAST I/O STATUS FROM DIT >>   03426000
$PAGE                                                                   03428000
            BEGIN  << FUNCTION = 72; DEVICE IDENTIFY >>                 03430000
                                                                        03432000
              << CHECK FOR VALID COUNT >>                               03434000
                                                                        03436000
              IF DITP(DCBCNT) <> 2 THEN GOTO INVALIDFUNC;               03438000
                                                                        03440000
              << SET UP THE IDENTIFY CHANNEL PROGRAM >>                 03442000
                                                                        03444000
              CHANP(JADR) := IDENTCP;  << INITIAL JUMP TO IDENTIFY >>   03446000
                                                                        03448000
              << SET UP IDENTIFY CHANNEL INSTRUCTION >>                 03450000
                                                                        03452000
              CHANP(CMND2) := IDENTIFY;                                 03454000
              CHANP(CMND3) := 0;       << IDENTIFY CODE RETURN AREA >>  03456000
              CHANP(CMND4) := INTERRUPT'HALT1;                          03458000
              CHANP(CMND5) := 1;       << COMPLETE >>                   03460000
                                                                        03462000
            END;   << FUNCTION = 72; DEVICE IDENTIFY >>                 03464000
$PAGE                                                                   03466000
            BEGIN  << FUNCTION = 73; INITIATE SELF TEST >>              03468000
                                                                        03470000
              << CHECK FOR VALID COUNT >>                               03472000
                                                                        03474000
              IF DITP(DCBCNT) <> 1 THEN GOTO INVALIDFUNC;               03476000
                                                                        03478000
              << SET UP INITIATE SELF TEST CHANNEL PROGRAM >>           03480000
                                                                        03482000
              CHANP(JADR) := SELFTESTCP;  << JUMP TO INIT. SELF TEST >> 03484000
                                                                        03486000
              << SET UP INITIATE SELF TEST CHANNEL INSTRUCTION >>       03488000
                                                                        03490000
              CHANP(CMND1) := INITSELFTEST;                             03492000
              CHANP(CMND2) := 1;  << BYTE COUNT IGNORED >>              03494000
              CHANP(CMND3) := 0;                                        03496000
              CHANP(CMND4) := 0;                                        03498000
              CHANP(CMND5) := 0;  << ADDRESS IGNORED >>                 03500000
                                                                        03502000
            END;   << FUNCTION = 73; INITIATE SELF TEST >>              03504000
$PAGE                                                                   03506000
            BEGIN  << FUNCTION = 74; READ SELF TEST RESULTS >>          03508000
                                                                        03510000
              << CHECK FOR VALID COUNT >>                               03512000
                                                                        03514000
              IF DITP(DCBCNT) <> 2 THEN GOTO INVALIDFUNC;               03516000
                                                                        03518000
              << SET UP READ SELF TEST RESULTS CHANNEL PROGRAM >>       03520000
                                                                        03522000
              CHANP(JADR) := SELFTESTCP;  << JUMP TO READ SELF TEST >>  03524000
                                                                        03526000
              << SET UP READ SELF TEST RESULTS CHANNEL INSTRUCTION >>   03528000
                                                                        03530000
              CHANP(CMND1) := READSELFTEST;                             03532000
              CHANP(CMND2) := DITP(DCBCNT);                             03534000
              CHANP(CMND3) := 0;                                        03536000
              CHANP(CMND4) := BANKNO;                                   03538000
              CHANP(CMND5) := BUFADR;                                   03540000
                                                                        03542000
            END;   << FUNCTION = 74; READ SELF TEST RESULTS >>          03544000
$PAGE                                                                   03546000
            BEGIN  << FUNCTION = 75; WRITE LOOPBACK BUFFER >>           03548000
                                                                        03550000
              << CHECK FOR VALID COUNT >>                               03552000
                                                                        03554000
              IF DITP(DCBCNT) <> 256 THEN GOTO INVALIDFUNC;             03556000
                                                                        03558000
              << SET UP WRITE LOOPBACK BUFFER CHANNEL PROGRAM >>        03560000
                                                                        03562000
              CHANP(JADR) := LOOPBACKCP; << JUMP TO WRITE LOOPBACK >>   03564000
                                                                        03566000
              << SET UP WRITE LOOPBACK BUFFER CHANNEL INSTRUCTION >>    03568000
                                                                        03570000
              CHANP(CMND1) := WRITELOOPBACK;                            03572000
              CHANP(CMND2) := DITP(DCBCNT);                             03574000
              CHANP(CMND3) := 0;                                        03576000
              CHANP(CMND4) := BANKNO;                                   03578000
              CHANP(CMND5) := BUFADR;                                   03580000
                                                                        03582000
            END;   << FUNCTION = 75; WRITE LOOPBACK BUFFER >>           03584000
$PAGE                                                                   03586000
            BEGIN  << FUNCTION = 76; READ LOOPBACK BUFFER >>            03588000
                                                                        03590000
              << CHECK FOR VALID COUNT >>                               03592000
                                                                        03594000
              IF DITP(DCBCNT) <> 256 THEN GOTO INVALIDFUNC;             03596000
                                                                        03598000
              << SET UP READ LOOPBACK BUFFER CHANNEL PROGRAMS >>        03600000
                                                                        03602000
              CHANP(JADR) := LOOPBACKCP; << JUMP TO WRITE LOOPBACK >>   03604000
                                                                        03606000
              << SET UP READ LOOPBACK BUFFER CHANNEL INSTRUCTION >>     03608000
                                                                        03610000
              CHANP(CMND1) := READLOOPBACK;                             03612000
              CHANP(CMND2) := DITP(DCBCNT);                             03614000
              CHANP(CMND3) := 0;                                        03616000
              CHANP(CMND4) := BANKNO;                                   03618000
              CHANP(CMND5) := BUFADR;                                   03620000
                                                                        03622000
            END;   << FUNCTION = 76; READ LOOPBACK BUFFER >>            03624000
$PAGE                                                                   03626000
            BEGIN  << FUNCTION = 189; DEVICE CLEAR >>                   03628000
                                                                        03630000
            CLEARFUNC:                                                  03632000
                                                                        03634000
              << SET UP THE CLEAR CHANNEL PROGRAM >>                    03636000
                                                                        03638000
              CHANP(JADR) := CLEARCP;  << SET INITIAL JUMP TO CLEAR >>  03640000
                                                                        03642000
              << SET UP CLEAR CHANNEL INSTRUCTION >>                    03644000
                                                                        03646000
              CHANP(CMND4) := JOB'ABORT'CLEAR;                          03648000
              CHANP(CMND5) := 0;                                        03650000
                                                                        03652000
            END;   << FUNCTION = 189; DEVICE CLEAR >>                   03654000
$PAGE                                                                   03656000
            BEGIN  << FUNCTION = 190; WRITE RECOVERY BLOCK >>           03658000
                                                                        03660000
              << CHECK FOR VALID COUNT >>                               03662000
                                                                        03664000
              IF DITP(DCBCNT) <> 32 THEN GOTO INVALIDFUNC;              03666000
                                                                        03668000
              << SET UP WRITE RECOVERY BLOCK CHANNEL PROG. >>           03670000
                                                                        03672000
              CHANP(JADR) := PAGERECVCP;  << JUMP TO WRITE RECOVERY >>  03674000
                                                                        03676000
              << SET UP WRITE RECOVERY BLOCK INSTRUCTION >>             03678000
                                                                        03680000
              CHANP(CMND1) := WRITEPGRECOVER;                           03682000
              CHANP(CMND2) := DITP(DCBCNT);                             03684000
              CHANP(CMND3) := 0;                                        03686000
              CHANP(CMND4) := BANKNO;                                   03688000
              CHANP(CMND5) := BUFADR;                                   03690000
                                                                        03692000
            END;   << FUNCTION = 190; WRITE RECOVERY BLOCK >>           03694000
$PAGE                                                                   03696000
            BEGIN  << FUNCTION = 191; READ ENVIRONMENTAL STATUS BLOCK >>03698000
                                                                        03700000
              << CHECK FOR VALID COUNT >>                               03702000
                                                                        03704000
              IF DITP(DCBCNT) <> 32 THEN GOTO INVALIDFUNC;              03706000
                                                                        03708000
              << SET UP READ ENV STATUS BLOCK CHANNEL PROGRAM >>        03710000
                                                                        03712000
              CHANP(JADR) := READENVSTATCP; << JUMP TO READ ENV STATUS>>03714000
                                                                        03716000
              << SET UP READ ENV STATUS BLOCK CHANNEL INSTRUCTION >>    03718000
                                                                        03720000
              CHANP(CMND1) := READENVSTATUS;                            03722000
              CHANP(CMND2) := DITP(DCBCNT);                             03724000
              CHANP(CMND3) := 0;                                        03726000
              CHANP(CMND4) := BANKNO;                                   03728000
              CHANP(CMND5) := BUFADR;                                   03730000
                                                                        03732000
            END;   << FUNCTION = 191; READ ENVIRONMENTAL STATUS BLOCK >>03734000
          END;   << DRIVER FUNCTION CASES >>                            03736000
$PAGE "SET UP AND START THE CHANNEL PROGRAM"                            03738000
      START'CHANP:                                                      03740000
                                                                        03742000
        << SET UP INTERNAL READ I/O STATUS AND INTERRUPT HALT >>        03744000
                                                                        03746000
        CHANP(IOST2) := 32;  << I/O STATUS READ BYTE COUNT >>           03748000
        CHANP(IOST5) := @STATP + SYSDB; << I/O STATUS READ AREA >>      03750000
        CHANP(STHLT) := DSJ1'AFTER;  << I/O STATUS READ AFTER XFER >>   03752000
                                                                        03754000
        << CLEAR THE CHANNEL PROGRAM VARIABLE AREA >>                   03756000
                                                                        03758000
        INDEX := 0;                                                     03760000
        DO ILTP(INDEX) := 0 UNTIL (INDEX := INDEX+1) > 3;               03762000
                                                                        03764000
        << START THE CHANNEL PROGRAM...... >>                           03766000
                                                                        03768000
        START'HPIB(DITP, CHANP, TRUE);                                  03770000
        IF < THEN GOTO CHANPFAIL;                                       03772000
                                                                        03774000
        << SET UP TIMER REQUEST TO TIME THE COMMAND >>                  03776000
                                                                        03778000
        IF DIAGNOSTIC THEN                                              03780000
          DITP(DTRLX) := TIMEREQ(%20,@DITP,60000D);  << 60 SECONDS >>   03782000
                                                                        03784000
        IOQP(QSTAT).STAT := PENDING;                                    03786000
        IOQP(QMISC) := MISC;                                            03788000
        MSTATE := COMPLETION'WAIT;                                      03790000
        RETURN;                                                         03792000
                                                                        03794000
        << THE FOLLOWING HELP CALL IS FOR LINKAGE TO HELP >>            03796000
        << IT IS NEVER DIRECTLY EXECUTED.                 >>            03798000
                                                                        03800000
        HELP;                                                           03802000
      END;   << DRIVER INITIATOR >>                                     03804000
                                                                        03806000
                                                                        03808000
$PAGE "HP2680A PAGE PRINTER DRIVER COMPLETOR"                           03810000
                                                                        03812000
    << CHECK CPVA0 FOR CHANNEL PROGRAM ERROR/STATUS CONDITIONS >>       03814000
                                                                        03816000
    CPPSTATUS := ILTP; << CPVA0 >>                                      03818000
    IF CPPSTATUS.ERRORCODE = 6 THEN GOTO CHANNEL'FAILURE;               03820000
    IF CPPSTATUS.ERRORCODE = 7 THEN                                     03822000
      BEGIN                                                             03824000
        IF NOT CPPSTATUS.TIMEDOUT THEN GO TO CHANNEL'FAILURE;           03826000
        IF TIMEOUT THEN BEGIN                                           03828000
          IF DIAGNOSTIC OR ((GETDRT(DRTN,0))<>(@CHANP+SYSDB))  <<03009>>03832000
            THEN GOTO UNIT'FAIL ELSE GOTO OFFLINECODE;                  03834000
            <<IF DRTPTR=@CHANP+SYSDB THEN GIC TIMEDOUT ON>>             03836000
            <<FIRST INSTRUCTION UNLESS WE ARE CALLED BY>>               03838000
            <<DIAGNOSTIC WE WILL TREAT THIS AS OFFLINE>>                03840000
        END                                                             03842000
        ELSE                                                            03844000
          BEGIN  << GIC TIMEOUT ; CHECK FOR A PARITY ERROR >>           03846000
            SETTIMEOUT;                                                 03848000
            CHANP(JADR) := IOSTATCP;                                    03850000
            GOTO START'CHANP;                                           03852000
          END;                                                          03854000
      END;                                                              03856000
                                                                        03858000
    << CHECK CPVA1 TO SEE HOW CHANNEL PROGRAM ENDED >>                  03860000
                                                                        03862000
    IF ILTP(CPVA1).IOSTAT = 1 THEN SETIOSTATUS;                         03864000
    IF ILTP(CPVA1).FINISH = 0 THEN SETBLOCKRETRY;                       03866000
                                                                        03868000
    << IF WE GOT THIS FAR AND THE FUNCTION IS AN IDENTIFY THEN >>       03870000
    << RETURN THE IDENTIFY CODE TO THE USERS BUFFER.           >>       03872000
                                                                        03874000
    IF FUNCTION = IDENTIFYFUNC THEN                                     03876000
      BEGIN << MOVE THE IDENTIFY CODE TO THE USERS BUFFER >>            03878000
        TOS := BANKNO;           << USER BUFFER BANK NUMBER >>          03880000
        TOS := BUFADR;           << USERS BUFFER ADDRESS >>             03882000
        TOS := CHANP(CMND3);     << IDENTIFY CODE >>                    03884000
        ASMB(SSEA);              << STORE INTO USERS BUFFER >>          03886000
        DDEL;                    << DELETE BANK & ADDRESS >>            03888000
      END;                                                              03890000
$PAGE "I/O STATUS EVALUATION"                                           03892000
                                                                        03894000
    << CHECK IF ANALYSIS OF I/O STATUS IS NECESSARY >>                  03896000
                                                                        03898000
    IF IOSTATUS THEN                                                    03900000
      BEGIN << I/O STATUS WAS READ >>                                   03902000
        CLEARIOSTATUS;                                                  03904000
                                                                        03906000
                                                                        03908000
        IOQP(QSTAT).STAT:=IF DIAGNOSTIC THEN SPOOLERSTATUS ELSE         03910000
                                                       SUCCESSFUL;      03912000
        <<STATUS MAY BE OVERWRITTEN AFTER FURTHER CHECKING>>            03914000
                                                                        03916000
        IF ( (FUNCTION=DATAWRITE) LAND BLOCKRETRY ) OR                  03918000
           (FUNCTION=DEVICECLOSE)                                       03920000
           THEN IOQP(QSTAT).STAT:=RETRANSMIT'SPOOL;                     03922000
                                                                        03924000
        << CHECK I/O STATUS WORDS 4 & 5 FOR ERROR CONDITIONS >>         03926000
                                                                        03928000
        IF STATP(4) <> 0 OR STATP(5) <> 0 THEN                          03930000
          BEGIN                                                         03932000
           IF ( (FUNCTION=DATAWRITE) LAND BLOCKRETRY ) OR               03934000
              (FUNCTION=DEVICECLOSE)                                    03936000
              THEN IOQP(QSTAT).STAT:=RETRANSMIT'SPOOL                   03938000
              ELSE IOQP(QSTAT).STAT:=SPOOLERSTATUS;                     03940000
          END; <<ANALYSIS OF I/O STATUS WORDS 4&5 >>                    03942000
                                                                        03944000
        << CHECK I/O STATUS WORD 3 FOR AN MCS FAULT NUMBER >>           03946000
                                                                        03948000
        IF STATP(3)<>0 THEN                                             03950000
          BEGIN  << CHECK OUT I/O STATUS WORD 3 >>                      03952000
            DITP(DLOGBUFFER):=DITP(DIOSTAT+1);                          03954000
            DITP(DLOGBUFFER+1):=DITP(MCS'WORD);                         03956000
            <<MOVE WORD 1 AND WORD 3 TO DLOGBUFFER SO IT CAN BE LOGGED>>03958000
            DITP(DSERR):=LOG'BUFFER; <<LOG WORD 1 AND MCS STATUS>>      03960000
          END;   << ANALYSIS OF I/O STATUS WORD 3 >>                    03962000
                                                                        03964000
        << CHECK I/O STATUS WORD 1 FOR ERROR CONDITIONS >>              03966000
                                                                        03968000
        IF STATP.(1:1) = 1 THEN                                         03970000
          BEGIN  << CHECK OUT I/O STATUS WORD 1 >>                      03972000
            IOSTATUS1 := STATP(1);                                      03974000
            IF <> THEN                                                  03976000
              BEGIN  << I/O STATUS WORD 1 CONTAINS VALID INFORMATION >> 03978000
                                                                        03980000
                IF POWERUP THEN                                         03982000
                  BEGIN                                                 03984000
                    IOQP(QSTAT).STAT := POWERUPSTAT;                    03986000
                    GOTO ERROREXIT;                                     03988000
                  END;                                                  03990000
                                                                        03992000
                IF ADVISORY THEN                                        03994000
                  BEGIN                                                 03996000
                    IF NOT IOMESSAGE(PPSET,ADVISORY'MSG,%10000,         03998000
                       DITP(DLDEV).LDEV,,,,, ) THEN GOTO SYSERR;        04000000
                  END;                                                  04002000
                                                                        04004000
                                                                        04006000
                IF OFFLINE THEN                                         04008000
                  BEGIN  << START AN OPERATOR WAIT SEQUENCE >>          04010000
                    IF DIAGNOSTIC THEN                                  04012000
                      BEGIN  << FALL THRU, DON'T CAUSE A WAIT >>        04014000
                        IOQP(QSTAT).STAT := OFFLINESTAT;                04016000
                        GOTO EXIT;                                      04018000
                      END;                                              04020000
                    IF STATP.(4:2)=0 THEN BEGIN                         04022000
OFFLINECODE:                                                            04024000
                      IF NOT IOMESSAGE(SYSMSET,NRDYMSG,%10000,          04026000
                         DITP(DLDEV).LDEV,,,,, ) THEN GOTO SYSERR;      04028000
                      START'IDLEWAIT(OFFLINESTAT);                      04030000
                      RETURN;                                           04032000
                    END; <<IF THERE IS STATUS IN 4 OR 5 WE MUST RETURN>>04034000
                         <<IT OR IT WILL BE LOST.  THE DRIVER WILL>>    04036000
                         <<SEE THAT THE DEVICE IS OFFLINE ON THE>>      04038000
                         <<NEXT REQUEST AND START THE IDLE CP>>         04040000
                  END;                                                  04042000
                                                                        04044000
                IF PARITY THEN                                          04046000
                  BEGIN                                                 04048000
                    IF STATP.(4:2)=0 THEN BEGIN                         04050000
                      IF FUNCTION = DATAWRITE THEN SETBLOCKRETRY;       04052000
                      BUMPPARITY;                                       04054000
                      IF = THEN GOTO COMMAND'RETRY;                     04056000
                      DITP(DSTAT) := -1;                                04058000
                      IOQP(QSTAT).STAT := PARITY'ERROR;                 04060000
                      DITP(DSERR):=LOG'DSTAT;  <<LOG ERROR>>            04062000
                      GOTO ERROREXIT;                                   04064000
                    END ELSE IOQP(QSTAT).STAT:=RETRANSMIT'SPOOL;        04066000
                  END;                                                  04068000
                                                                        04070000
                IF XFERERROR THEN                                       04072000
                  BEGIN                                                 04074000
                    IF STATP.(4:2)=0 THEN BEGIN                         04076000
                      IF FUNCTION = DATAWRITE THEN SETBLOCKRETRY;       04078000
                      BUMPXFER;                                         04080000
                      IF = THEN GOTO COMMAND'RETRY;                     04082000
                      IOQP(QSTAT).STAT := TRANSFER'ERROR;               04084000
                      DITP(DLOGBUFFER):=DITP(DIOSTAT+1);                04086000
                      DITP(DLOGBUFFER+1):=DITP(MCS'WORD);               04088000
                      DITP(DSERR):=LOG'BUFFER;                          04090000
                      <<MOVE STATUS WORDS 1&3 TO DLOGBUFFER             04092000
                        AND LOG THEM>>                                  04094000
                      GOTO ERROREXIT;                                   04096000
                    END ELSE IOQP(QSTAT).STAT:=RETRANSMIT'SPOOL;        04098000
                  END;                                                  04100000
                                                                        04102000
              END;                                                      04104000
          END;   << ANALYSIS OF I/O STATUS WORD 1 >>                    04106000
                                                                        04108000
         GOTO EXIT;                                                     04110000
      END;  << I/O STATUS WAS READ >>                                   04112000
$PAGE "CLEANUP AND STATUS REPORTING"                                    04114000
  DONE:                                                                 04116000
                                                                        04118000
    IF BLOCKRETRY THEN GOTO WRITERETRYBLOCK;                            04120000
                                                                        04122000
    IF MULTIBLOCKMODE THEN GOTO WRITEMULTIBLOCK;                        04124000
                                                                        04126000
    IOQP(QSTAT).STAT := SUCCESSFUL;                                     04128000
    GOTO EXIT;                                                          04130000
                                                                        04132000
  INVALIDFUNC:                                                          04134000
                                                                        04136000
    IOQP(QSTAT).STAT := INVALID;                                        04138000
    GOTO ERROREXIT;                                                     04140000
                                                                        04142000
  CHANPFAIL:                                                            04144000
                                                                        04146000
    IOQP(QSTAT).STAT := BADCHANP;                                       04148000
    GOTO ERROREXIT;                                                     04150000
                                                                        04152000
  UNIT'FAIL:                                                            04154000
                                                                        04156000
    IOQP(QSTAT).STAT := UNIT'FAILURE;                                   04158000
    GOTO ERROREXIT;                                                     04160000
                                                                        04162000
  SYSERR:                                                               04164000
                                                                        04166000
    IOQP(QSTAT).STAT := SYSTEMERROR;                                    04168000
    GOTO ERROREXIT;                                                     04170000
                                                                        04172000
  CHANNEL'FAILURE:                                                      04174000
                                                                        04176000
    DITP(DSTAT) := ILTP;       << CPVA 0 >>                             04178000
    IOQP(QSTAT).STAT := CNTRLNOGOOD;                                    04180000
    DITP(DSERR):=LOG'DSTAT;  <<LOG ERROR>>                              04182000
                                                                        04184000
  ERROREXIT:                                                            04186000
                                                                        04188000
    IOQP(QWBCT) := 0;  << ZERO COUNT ON ERROR >>                        04190000
                                                                        04192000
  EXIT:                                                                 04194000
<< DEBUGGING SOFTWARE >>                                       <<DEBUG>>04196000
                                                               <<DEBUG>>04198000
IF DITP(DDEBUG).(15:1)=1 THEN                                  <<DEBUG>>04200000
  BEGIN                                                        <<DEBUG>>04202000
    IOMESSAGE(PPSET,2000,%11100,IOQP(QFUNC).FUNC,              <<DEBUG>>04204000
      IOQP(QWBCT),IOQP(QSTAT).STAT);                           <<DEBUG>>04206000
                                                               <<DEBUG>>04208000
    IF FUNCTION = 1 THEN                                       <<DEBUG>>04210000
      BEGIN                                                    <<DEBUG>>04212000
        TOS := BANK;                                           <<DEBUG>>04214000
        TOS := BUFADR+2;  << SPOOLER FUNCTION >>               <<DEBUG>>04216000
        ASMB(LSEA);                                            <<DEBUG>>04218000
        IOMESSAGE(PPSET,2001,%10000,S0);                       <<DEBUG>>04220000
        DDEL;                                                  <<DEBUG>>04222000
        TOS := BUFADR+510; << RECORD NUMBER >>                 <<DEBUG>>04224000
        ASMB(LDEA);                                            <<DEBUG>>04226000
        IOMESSAGE(PPSET,2002,%11000,S1,S0);                    <<DEBUG>>04228000
        DDEL; DDEL;                                            <<DEBUG>>04230000
      END;                                                     <<DEBUG>>04232000
                                                               <<DEBUG>>04234000
    IF IOQP(QSTAT).STAT = %13 OR IOQP(QSTAT).STAT = %23 THEN   <<DEBUG>>04236000
      BEGIN                                                    <<DEBUG>>04238000
        IOMESSAGE(PPSET,2003,%11100,DITP(21),DITP(22),         <<DEBUG>>04240000
          DITP(29),DITP(30));                                  <<DEBUG>>04242000
      END;                                                     <<DEBUG>>04244000
  END;                                                         <<DEBUG>>04246000
                                                               <<DEBUG>>04248000
                                                                        04250000
    MSTATE := COMPLETED;                                                04252000
    IOQP(QMISC) := MISC;                                                04254000
  END;  << PAGE PRINTER DRIVER >>                                       04256000
                                                                        04258000
$PAGE "OUTER BLOCK"                                                     04260000
                                                                        04262000
ASMB( PCAL SIODM;       << DRIVER MONITOR >>                            04264000
      PCAL PPDRIVER;    << DRIVER INITIATOR >>                          04266000
      PCAL PPDRIVER;    << DRIVER COMPLETOR >>                          04268000
      CON  0;           << NO I/O PROCESS NECESSARY >>                  04270000
      CON  0;           << NO INITIALIZATION PROCEDURE >>               04272000
      CON  1;           << ONE INTERRUPT HANDLER >>                     04274000
      PCAL GIP'HPIB);   << GENERAL INTERRUPT HANDLER >>                 04276000
END.                                                                    04278000
