$CONTROL MAP,CODE,USLINIT                                               00010000
  <<   HIOLPRT1, MODULE 38 - HP2631 LP DRIVER HPIB   >>                 00012000
<< HP32002C MPE SOURCE C.00.00 >>                                       00014000
<< COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980.           >>  00016000
<<     THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A       >>  00018000
<<     TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR     >>  00020000
<<     STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION >>  00022000
<<     OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED   >>  00024000
<<     WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>  00026000
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00028000
$TITLE "HP2631 LINE PRINTER DRIVER - HPIB"                              00030000
$CONTROL PRIVILEGED,UNCALLABLE                                          00032000
$TP                                                                     00034000
                                                                        00036000
<<                                                                      00038000
                                                                        00040000
                                                                        00042000
        HP2631 [HP3000-HPIB] Line Printer Driver - HIOLPRT1             00044000
        ---------------------------------------------------             00046000
                                                                        00048000
                                                                        00050000
Structure of HIOLPRT1:                                                  00052000
                                                                        00054000
HIOLPRT1, together with the SIO Device Monitor (SIODM) constitute a     00056000
standard MPE Type 1 I/O Driver/Monitor.  This means that it does not    00058000
run in its own process, but executes on any stack and therefore must    00060000
run to completion.  During initialization it executes on PROGEN's       00062000
stack, during request initiation it executes on ATTACHIO's stack, and   00064000
during interrupt processing it executes on the Interrupt Control        00066000
Stack (ICS).                                                            00068000
                                                                        00070000
HIOLPRT1 consists of a global area, two procedures, and an "outer       00072000
block" which is really a linkage area for INITIAL.  The global area     00074000
contains an array called INITIAL which is comprised of three parts.     00076000
The first part specifies the size of the other two, the unit extract    00078000
instruction, and various parameters which are used by INITIAL.  This    00080000
section is deleted after INITIAL is through with it.  The other two     00082000
parts are the Device Information Table (DIT) and the Channel Program    00084000
area, which is part of the Interrupt Linkage Table (ILT).  INITIAL      00086000
will put each of these items in the area of memory where it belongs.    00088000
The linkage area specifies the procedure labels (P-labels) of the       00090000
associated monitor (SIODM), the request initiator (LPDRVR), the         00092000
request completor (LPDRVR), the initialization procedure (LPINIT,       00094000
called by PROGEN at system startup), and the interrupt handler (GIP).   00096000
                                                                        00098000
                                                                        00100000
Operation of HIOLPRT1:                                                  00102000
                                                                        00104000
The primary working code of HIOLPRT1 is a procedure LPDRVR.  LPDRVR is  00106000
called with five parameters.  Two of these parameters, BANK and         00108000
BUFFADDR, are the absolute buffer address of the data to be processed.  00110000
The other three, DITP, IOQP, and SIOP are pointers to three arrays.     00112000
DITP is a pointer to the Device Information Table which contains        00114000
information about its associated line printer.  There is one DIT for    00116000
unit on the controller and they contain information which must be       00118000
saved between I/O requests to the driver.  IOQP is a pointer to the     00120000
Input/Output Queue element.  IOQ elements contain information relevent  00122000
to the current request.  SIOP is a pointer to the first element of the  00124000
Channel Program which is actually part of the Interrupt Linkage Table.  00126000
These three elements are described in more detail elsewhere in this     00128000
listing.                                                                00130000
                                                                        00132000
LPDRVR is always called by the SIO device monitor (SIODM) and it        00134000
determines the reason for the call by examining the IOQ and the DIT.    00136000
When a new request is initiated, LPDRVR examines the function code      00138000
and parameter fields contained in the IOQ element to determine the      00140000
task that is desired.  The proper command codes and program branches    00142000
are then placed in the Channel Program and its execution is begun.      00144000
                                                                        00146000
Upon completion of the request, an interrupt is generated and LPDRVR    00148000
is again called.  The code checks for current activity in progress,     00150000
and this being the case, branches to the completion section of the      00152000
driver.  Here several status words are exaimed for errors or special    00154000
conditions which might have occurred during the execution of the        00156000
Channel Program, during the data transfer, or during the operation of   00158000
the line printer.  These conditions can cause error retries and/or      00160000
special notation back to the caller.  A list of the conditions and      00162000
the return codes is provided in this listing.                           00164000
$PAGE                                                                   00166000
                Device Information Table (DIT)                          00168000
                ------------------------------                          00170000
                                                                        00172000
                                                                        00174000
There is one DIT per physical device.  If a physical device represents  00176000
more than one logical device, the logical device number is obtained     00178000
from the IOQ element (however, there is only one device per 2631        00180000
controller.)  The following diagram shows the DIT used for the          00182000
2631 line printer driver.                                               00184000
                                                                        00186000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00188000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00190000
  0| 0| 0|AC|RQ| 0| 0| 0|IO|IA|NO|ST| 0|   STATE   |   DFLAG            00192000
   +--+--+--+--+--+--+--+--+--+--+--+--+-----------+                    00194000
  1| SYSDB relative pointer to the DIT for the next|   DLINK            00196000
   | device requesting this resource or service    |                    00198000
   +-----------------------------------------------+                    00200000
  2| SYSDB relative pointer to the first IOQ in    |   DIOQP            00202000
   | request list for this device                  |                    00204000
   +-----+-----------------+-----------------------+                    00206000
  3|IOT  |    Phys. unit # | Logical device number |   DLDEV            00208000
   +-----+-----------------+-----------------------+                    00210000
  4| SYSDB relative pointer to Device Linkage Table|   DDLTP            00212000
   +-----------------------------------------------+                    00214000
  5| SYSDB relative pntr to Interrupt Linkage Table|   DILTP            00216000
   +-----------------------------------------------+                    00218000
  6|                                      |PS|FL|TP|   DSAVE            00220000
   +-----------------------------------------------+                    00222000
  7| Hardware error status.  Set when the driver   |   DSERR            00224000
   | detects an error.  Whenever <>0, the driver   |                    00226000
   | monitor logs an I/O error and clears this word|                    00228000
   +-----------------------------------------------+                    00230000
%10| Bit 0 is set at completion of timer           |   DTIME            00232000
   +-----------------------------------------------+                    00234000
%11| Holds the time out request entry index while  |   DRQST            00236000
   | a timer is active.                            |                    00238000
   +-----------------------------------------------+                    00240000
%12|          Hardware logged error status         | DLOGERROR          00242000
   +-----------------------------------------------+                    00244000
                                                                        00246000
                                                                        00248000
DFLAG - Flags and request state                                         00250000
  AC  ACTIVE  - A monitor is currently servicing this device.           00252000
  RQ  REQUEST - A service request is pending while the monitor is       00254000
                active.                                                 00256000
  IO  IOPROG  - An I/O Channel Program is running for this device.      00258000
  IA  IAK     - An interrupt or response has occurred for this device.  00260000
  NO  NOTRDY  - Go to state %10 after Idle Channel Program is started.  00262000
  ST  STWAIT  - The device monitor is starting an Idle Channel Program  00264000
                for this device.  There is no IOQ associated with this  00266000
                type of request.                                        00268000
  STATE       - State of the device monitor.  Specifies the next action 00270000
                to be taken in SIODM in servicing the request:          00272000
                  0 - start new request                                 00274000
                  1 - not used                                          00276000
                  2 - call driver initiator procedure                   00278000
                  3 - call driver completor procedure                   00280000
                  4 - not used                                          00282000
                  5 - process request completed                         00284000
                  6 - initiate device recognition sequence              00286000
                  7 - start operator intervention wait                  00288000
                %10 - wait for interrupt (operator intervention)        00290000
                      restart at state 0                                00292000
                %11 - wait for data segment freeze, then state 2        00294000
                %12 - wait for driver initiator to be frozen, then      00296000
                      allocate controller (state 2)                     00298000
                %13 - wait for I/O completion interrupt, then state 3   00300000
                %14 - wait for controller, then call driver initiator   00302000
                %15 - not used                                          00304000
                %16 - wait for initiator make present, then state 2     00306000
                %17 - wait for completor make present, then state 3     00308000
                                                                        00310000
DLDEV - I/O system type, unit and logical device number                 00312000
  IOT I/O TYPE - Type of I/O system                                     00314000
             0 - HP3000 Series 2/3                                      00316000
             1 - HP3000 Series 33 (HPIB)                                00318000
             2 - Unused                                                 00320000
             3 - Unused                                                 00322000
                                                                        00324000
DSAVE - Device processing flags                                         00326000
  PS   PRESPACE  - Last request used prespacing.                        00328000
  FL   FULL      - Line printer buffer is full.                         00330000
  TP   TOP       - Printer is at top of form                            00332000
                                                                        00334000
$PAGE                                                                   00336000
                Interrupt Linkage Table (ILT)                           00338000
                -----------------------------                           00340000
                                                                        00342000
                                                                        00344000
There is one ILT for each device controller configured on the system.   00346000
A controller may support more than one unit, however the 2631           00348000
controller only supports one unit.                                      00350000
                                                                        00352000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00354000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00356000
  0|         Channel                               |   ICPVA0           00358000
  1|              Program                          |   ICPVA1           00360000
  2|                  Variable                     |   ICPVA2           00362000
  3|                       Area (ICPVA)            |   ICPVA3           00364000
   +-----------------------------------------------+                    00366000
  4|         DMA Abort                             |   ICPVA4           00368000
  5|              Address                          |   ICPVA5           00370000
   +-----------------------------------------------+                    00372000
  6|                      0                        |   ISRQL            00374000
   +--+-----------------+-----+-----------+--------+                    00376000
  7|LI|     CHANQUE     |     |   CHAN    |  DEV   |   ICNTRL           00378000
   +--+-----------------+-----+-----------+--------+                    00380000
%10| SYSDB relative pointer to Channel Program area|   ISIOP            00382000
   +-----------------------------------------------+                    00384000
%11| SYSDB relative pointer to Status Return area. |   ISTAP            00386000
   | (The 2631 driver does not use the Status      |                    00388000
   |  Return area so this entry is 0.)             |                    00390000
   +-----------------------------------------------+                    00392000
%12| single instruction that is executed to extract|   IUNIT            00394000
   | the device unit number from the status pointed|                    00396000
   | to by ISTAP.  (Since there is only one unit   |                    00398000
   | on the controller, this entry is not used.)   |                    00400000
   +-----------------------------------------------+                    00402000
%13| SYSDB relative DIT pointer of the device      |   ICDP             00404000
   | currently using the channel to perform a      |                    00406000
   | data operation.                               |                    00408000
   +-----------------------+-----------------------+                    00410000
%14|       SIOPSIZE        |        CQUEN          |   IQUEUE           00412000
   +--+--+--+--------------+-----------+-----------+                    00414000
%15|RW|WP|IG|                          |  HCUNIT   |   IFLAG            00416000
   +--+--+--+--------------------------+-----------+                    00418000
%16| SYSDB relative DIT pointer for unit 0         |   IDITP0           00420000
   +-----------------------------------------------+                    00422000
%17|             Line Printer                      |                    00424000
   .               Channel                         .                    00426000
   |                 Program                       |                    00428000
   +-----------------------------------------------+                    00430000
                                                                        00432000
                                                                        00434000
ICPVA0 - Channel Program Variable Area                                  00436000
                                                                        00438000
  The first word is used by the channel program processor to store      00440000
  status information after I/O channel aborts.  The next word is used   00442000
  by the driver to indicate if status should be examined for special    00444000
  conditions or errors.  The other two words are not used.              00446000
                                                                        00448000
                                                                        00450000
ICPVA4 - DMA abort address                                              00452000
                                                                        00454000
  If a DMA abort occurs, the absolute address where the abort occurred  00456000
  is stored in this area.                                               00458000
                                                                        00460000
                                                                        00462000
ICNTRL - Contains controller information                                00464000
                                                                        00466000
  LIM     - If this bit is set, the controller is sharing a software    00468000
            channel resource in order to limit bandwidth.               00470000
  CHANQUE - The software channel resource number.                       00472000
  CHAN    - Channel number (four most significant bits of DRTN).        00474000
  DEV     - Device number (three least significant bits of DRTN).       00476000
                                                                        00478000
                                                                        00480000
IQUEUE -                                                                00482000
                                                                        00484000
  SIOPSIZE - (number of words + 1)/2 in the channel program area.       00486000
  CQUEN    - For a multi-unit controller this field contains the        00488000
             software controller resource number.                       00490000
                                                                        00492000
                                                                        00494000
IFLAG - Controller and Channel Program state flags                      00496000
                                                                        00498000
  RUNWAIT  - An Idle Channel Program should be started when there       00500000
             are no active requests to process.  This flag is always    00502000
             0 for the 2631.                                            00504000
  WAITPROG - An Idle Channel Program has been started for this          00506000
             controller.  This bit is reset by an interrupt.            00508000
  IGNOREHI - An HIOP instruction has been issued against this	          00510000
             controller but the channel program was not in a wait       00512000
             statement.  Therefore ignore the interrupt generated by    00514000
             the channel code when this program halts.                  00516000
  HCUNIT   - Highest configured unit number for this controller.        00518000
                                                                        00520000
                                                                        00522000
                                                                        00524000
            Device Reference Table DRT                                  00526000
            --------------------------                                  00528000
                                                                        00530000
There is one DRT per device controller.  The the contents of this       00532000
table are used for processing interrupts.                               00534000
                                                                        00536000
     Word 0  SIOP   - Absolute address of the current I/O               00538000
                      instruction in execution.                         00540000
     Word 1  DBI    - Absolute address of the base of the ILT           00542000
                      for this controller.                              00544000
     Word 2  PLABLE - The external program label of the interrupt       00546000
                      service routine for this controller.              00548000
     Word 3  CHAN   - Contains channel program status information       00550000
                      which is used by the channel program interpreter. 00552000
$PAGE                                                                   00554000
            I/O QUEUE ELEMENT (IOQ)                                     00556000
            -----------------------                                     00558000
                                                                        00560000
                                                                        00562000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00564000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00566000
  0|      Request dependent flags (see below)      |   QFLAG            00568000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00570000
  1| SYSDB relative pointer to next IOQ element.   |   QLINK            00572000
   | Points to first word of element.              |                    00574000
   +-----------------------+-----------------------+                    00576000
  2|                       | Logical device number |   QLDEV            00578000
   +--+--+--+--------+-----+-----------+-----------+                    00580000
  3|PP|PE|PF|TOUTCNTR|                 | WAITCODE  |   QMISC            00582000
   +--+--+--+--------+-----------------+-----------+                    00584000
  4| S| If QFLAG.(3:1) is clear then this is the   |   QDSTN            00586000
   |  | DST number of the target data segment.  If |                    00588000
   |  | S is set, QADDR is DB relative.            |                    00590000
   +--+--------------------------------------------+                    00592000
  5| Offset in the data segment or system buffer   |   QADDR            00594000
   | table to the target data buffer.              |                    00596000
   +-----------------------+-----------------------+                    00598000
  6|                       | Function code for     |   QFUNC            00600000
   |                       | this request.  (See   |                    00602000
   |                       | next section.)        |                    00604000
   +-----------------------+-----------------------+                    00606000
  7| On initiation, specifies the word count (>0)  |   QWBCT            00608000
   | or byte count (<0).  At completion of the     |                    00610000
   | request this location contains the actual     |                    00612000
   | transmission count in the same units (bytes   |                    00614000
   | or words) as in the request.                  |                    00616000
   +-----------------------------------------------+                    00618000
%10| Parameter 1.  Vertical Format specification.  |   QPAR1            00620000
   | (See next section for detail.)                |                    00622000
   +-----------------------------------------------+                    00624000
%11| Parameter 2.  Space Mode Flags.  (See next    |   QPAR2            00626000
   | section for details.)                         |                    00628000
   +-----------------------+--------------+--------+                    00630000
%12|         PCBN          |  QUALIFIER   | STATUS |   QSTAT            00632000
   +-----------------------+--------------+--------+                    00634000
                                                                        00636000
                                                                        00638000
QFLAG - Request dependent flags                                         00640000
                                                                        00642000
  Bit 0  ABORT     - Abort this request and return an error indication  00644000
                     to the caller.                                     00646000
  Bit 1  SPECIAL   - Apply special handling to this request.  (Not used)00648000
  Bit 2  DIAG      - This is a request from the diagnostic subsystem.   00650000
                     (Not used)                                         00652000
  Bit 3  SYSBUFF   - Target is an index relative to the SBUF Table of   00654000
                     the data buffer.                                   00656000
  Bit 4  IOWAKE    - Wake caller on completion of request.              00658000
  Bit 5  BLOCKED   - Blocked I/O.  The caller is waited in ATTACHIO     00660000
                     until the request is completed.  Implies IOWAKE.   00662000
  Bit 6  COMPLETED - The request has been completed and the caller      00664000
                     awakened if he had requested (with IOWAKE).        00666000
  Bit 7  DATAFRZN  - Set by the memory management routines (MAM) when a 00668000
                     MAKEPRESENT request is successfully completed and  00670000
                     indicates the data segment is frozen in memory.    00672000
  Bit 8  MAMERRORD - An error has occurred while MAM was trying to      00674000
                     make the target data segment present and freeze    00676000
                     it in memory.                                      00678000
  Bit 9  PREQ      - (Not used)                                         00680000
  Bit 10 SFAIL     - Delayed failure of SIO instruction.  If a call to  00682000
                     STARTIO resulted in the request being added to     00684000
                     the channel queue, this bit indicates that the SIO 00686000
                     instruction failed when the request was selected   00688000
                     for execution.                                     00690000
  Bit 11 PFAIL     - The request was aborted because of a system power  00692000
                     failure.                                           00694000
                                                                        00696000
                                                                        00698000
QMISC - Driver request dependent flags and counters.                    00700000
                                                                        00702000
  PRE'TO'POST - Pre to post spacing change flag.                        00704000
  PEJECT      - Last operation was a page eject.                        00706000
  TOUTCNTR    - Channel time-out retry counter.                         00708000
  POWERFAIL   - Power fail flag indicates power fail occurred.          00710000
  WAITCODE    - Indicates type of wait:                                 00712000
                  0 - new request                                       00714000
                  1 - completion wait                                   00716000
                  2 - not ready wait                                    00718000
                                                                        00720000
                                                                        00722000
QSTAT - PCB number and request completion status.                       00724000
                                                                        00726000
  PCBN    - The Process Control Block (PCB) number of the process       00728000
            which made this request.  If zero, the request is not       00730000
            associated with any process and the IOQ element is to       00732000
            be returned by the system when the request has completed.   00734000
  STATUS  - General status indicating the final state of the request.   00736000
            The following codes are used:                               00738000
              0 - Not started or awaiting completion.                   00740000
              1 - Successful completion.                                00742000
              2 - End-of-file detected.                                 00744000
              3 - Unusual, but recoverable, condition detected.         00746000
              4 - Irrecoverable error has occurred.                     00748000
  QUALIFIER - A code which further defines or qualifies the general     00750000
              status.  (See the section Driver Return Status Codes.)    00752000
                                                                        00754000
$PAGE                                                                   00756000
                                                                        00758000
     LINE PRINTER REQUEST CODES -                                       00760000
                                                                        00762000
  OPERATION     FUNCTION          PARAMETERS                            00764000
                                                                        00766000
    WRITE          1      P1 - VERTICAL FORMAT SPECIFICATION            00768000
                                  1 - USE 1ST DATA CHAR AS FORMAT SPEC  00770000
                                                                        00772000
                                %53 - "+", PRINT AND SUPPRESS SPACING   00774000
                                %55 - "-", PRINT AND TRIPLE SPACE       00776000
                                %60 - "0", PRINT AND DOUBLE SPACE       00778000
                                %61 - "1", PRINT AND TOP OF FORM        00780000
                                                                        00782000
                                %200-%277, PRINT AND SPACE N-%200 LINES 00784000
                                %300-%307, PRINT WITH CHANNEL N-%277    00786000
                                                                        00788000
                                %320- FILL LINE PRINTER BUFFER ONLY     00790000
                                                                        00792000
                                ALL OTHERS, PRINT AND SINGLE SPACE      00794000
                                                                        00796000
                           P2 - SPACE MODE FLAGS                        00798000
                                (15:1) = PRESPACE FLAG                  00800000
                                   IF SET, PRINT THEN FILL BUFFER       00802000
                                   IF CLEAR, FILL BUFFER THEN PRINT     00804000
                                (14:1) = NO PAGE STEPOVER FLAG          00806000
                                   IF SET, SINGLE AND DOUBLE SPACE      00808000
                                     WITHOUT STEPOVER (66 LINES/PAGE)   00810000
                                   IF CLEAR, SINGLE AND DOUBLE SPACE    00812000
                                     WITH STEPOVER (60 LINES/PAGE)      00814000
                                                                        00816000
                                                                        00818000
    FILE OPEN      2      PAGE EJECT IF NOT AT TOP OF FORM              00820000
                                                                        00822000
    FILE CLOSE     3      PAGE EJECT IF NOT AT TOP OF FORM              00824000
                                                                        00826000
    DEVICE CLOSE   4      PAGE EJECT IF NOT AT TOP OF FORM              00828000
                                                                        00830000
    READ STATUS  %17      READ I/O STATUS                               00832000
                           COUNT - 1 BYTE MINIMUM REQUIRED              00834000
                                                                        00836000
    VFC SET     %100      LOADS VFC RAM                                 00838000
                           P1 -  1 - 1 LPI (LINES PER INCH)             00840000
                                 2 - 2 LPI                              00842000
                                 3 - 3 LPI                              00844000
                                 4 - 4 LPI                              00846000
                                 6 - 6 LPI                              00848000
                                 8 - 8 LPI                              00850000
                                12 - 12 LPI                             00852000
                                ANY OTHER VALUE DEFAULTS TO 6 LPI       00854000
$PAGE                                                                   00856000
                                                                        00858000
     STATUS RETURNS -                                                   00860000
                                                                        00862000
         1 - NORMAL COMPLETION                                          00864000
                                                                        00866000
        33 - REQUEST ABORTED EXTERNALLY                                 00868000
        63 - REQUEST ABORTED DUE TO POWER FAILURE                       00870000
       213 - DEVICE POWERED UP (RESTORE ENVIRONMENT)                    00872000
                                                                        00874000
         4 - INVALID REQUEST (FUNCTION OR PARAMETER)                    00876000
        24 - I/O TIMED OUT BEFORE COMPLETION                            00878000
        44 - SIO FAILURE                                                00880000
        54 - UNIT FAILURE                                               00882000
       124 - NO MESSAGE LINK BUFFERS AVAILABLE                          00884000
       144 - I/O CHANNEL FAILURE                                        00886000
                                                                        00888000
   NOTE:  WHEN POSTSPACE MODE FOLLOWS A PRESPACE OPERATION WHICH LEFT   00890000
          DATA IN THE PRINTER BUFFER, A SINGLE SPACE WITH PAGE STEPOVER 00892000
          IS EXECUTED TO CLEAR THE BUFFER BEFORE THE NEXT OPERATION IS  00894000
          PERFORMED.                                                    00896000
                                                                        00898000
          PAGE EJECTS ARE SUPPRESSED WHEN THE PREVIOUS OPERATION WAS    00900000
          A PAGE EJECT.                                                 00902000
                                                                        00904000
          IF THE NUMBER OF PRINTABLE CHARACTERS EXCEEDS THE CARRIAGE    00906000
          WIDTH, THE LINE WILL BE CONTINUED ON THE NEXT LINE AS THE     00908000
          2631 DOES NOT PERFORM LINE TRUNCATION.                        00910000
                                                                        00912000
                                                                        00914000
        2631 I/O STATUS BITS                                            00916000
                                                                        00918000
     0 - ON LINE                                                        00920000
                                                                        00922000
     1 - READY                                                          00924000
     2 - (NOT USED)                                                     00926000
     3 - (NOT USED)                                                     00928000
                                                                        00930000
     4 - PARITY ERROR                                                   00932000
     5 - (NOT USED)                                                     00934000
     6 - PAPER OUT                                                      00936000
                                                                        00938000
     7 - POWER RESTORED/UNIT RESET                                      00940000
                                                                        00942000
>>                                                                      00944000
$PAGE                                                                   00946000
   BEGIN                                                                00948000
     EQUATE                                                             00950000
                                                                        00952000
            << CHANNEL PROGRAM ARRAY POINTERS >>                        00954000
                                                                        00956000
       BADDR       =   29,  << WRITE DATA BUFFER ADDRESS >>             00958000
       BCOUNT      =   26,  << WRITE DATA BYTE COUNT >>                 00960000
       BUFFJMP     =   18,  << ON/OFF SWITCH FOR BUFF FILL >>           00962000
       DSJ'RB1     =    3,  << FIRST DSJ RETURN BYTE >>        <<01367>>00964000
       ESC'CTL     =   97,  << ONLINE ESC CODE BUFFER >>       <<01482>>00966000
       IDLE        =   49,  << START OF IDLE CHAN PROG >>               00968000
       MEMX        =   28,  << WRITE DATA BANK ADDRESS >>               00970000
       MODECMD     =   96,  << RESTRICTED MODE CMD BUFFER >>   <<01482>>00972000
       PBANK       =   47,  << POSTSPACE CTL BANK ADR >>       <<01367>>00974000
       PCOUNT      =   45,  << POSTSPACE BYTE COUNT >>         <<01367>>00976000
       POLLMASK    =   95,  << POLL MASK BUFFER >>             <<01482>>00978000
       PONCP       =   71,  << POWER ON INIT ROUTINE >>        <<01482>>00980000
       POST'CTL    =   93,  << POST-SPACE CONTROL BUFFER >>    <<01482>>00982000
       POSTJMP     =   43,  << ON/OFF SWITCH FOR POST-SPACING >>        00984000
       PRE'CTL     =   92,  << PRESPACE CONTROL BUFFER >>      <<01482>>00986000
       PREJMP      =    9,  << ON/OFF SWITCH FOR PRESPACING >>          00988000
       SCOUNT      =   58,  << READ STATUS BYTE COUNT >>       <<01201>>00990000
       SBANK       =   60,  << READ STATUS BANK ADDR >>        <<01201>>00992000
       STATADR     =   61,  << READ STATUS BUFFER ADDR >>      <<01201>>00994000
       STATUS      =   94,  << I/O STATUS BUFFER >>            <<01482>>00996000
       WRTCTL1     =   10,  << WRITE CONTROL INSTRUCTION >>             00998000
       WRTCTL2     =   44,  << WRITE CONTROL INSTRUCTION >>             01000000
                                                                        01002000
                                                                        01004000
       ABORTED     =  %33,  << REQUEST ABORTED RETURN STATUS >>         01006000
       CHANFAIL    = %144,  << I/O CHANNEL ERROR >>                     01008000
       CMPLTIONWAIT=    1,  << WAITING FOR I/O COMPLETION INTERRUPT >>  01010000
       DCLOSE      =    4,  << DEVICE CLOSE FUNCTION >>                 01012000
       DILTP       =    5,  << INTERRUPT LINKAGE TABLE POINTER >>       01014000
       DLDEV       =    3,  << LOGICAL DEVICE AND UNIT NUMBERS >>       01016000
       DLOGERROR   =   10,  << HARDWARE LOGGED ERROR STATUS>>  <<01348>>01018000
       DRQST       =    9,  << DRIVER REQUEST FLAGS >>         <<01301>>01020000
       DSAVE       =    6,  << DRIVER FLAGS >>                 <<01301>>01022000
       DSERR       =    7,  <<DIT HARDWARE COUNT & INDEX>>     <<01348>>01024000
       DTIME       =    8,  << TIME-OUT REQUEST ENTRY INDEX >> <<01301>>01026000
       FOPEN       =    2,  << FILE OPEN FUNCTION >>                    01028000
       FCLOSE      =    3,  << FILE CLOSE FUNCTION >>                   01030000
       FULL'       =   14,  << LINE PRINTER BUFFER FULL >>              01032000
       GOODIO      =    1,  << SUCCESSFUL I/O STATUS RETURN >>          01034000
       INITIOWAIT  =    3,  << INITIALIZE UNIT WAIT IN PROGRESS >>      01036000
       INTRPTWAIT  =  %13,  << WAIT FOR COMPLETION DRIVER RETURN >>     01038000
       INVALIDOP   =    4,  << INVALID OPERATION REQUESTED >>           01040000
       IOTIMER     =  %20,  << WAIT FOR CHANNEL PROG TO FINISH >>       01042000
       ISIOP       =    8,  << CHANNEL PROGRAM AREA POINTER >>          01044000
       NOTRDYMSG   =   11,  << NOT READY MESSAGE # TO MESS PROCESSOR >> 01046000
       NOTRDYWAIT  =    2,  << NOT READY WAIT IN PROGRESS >>            01048000
       NOTREADY    =    7,  << NOT READY DRIVER RETURN >>               01050000
       OPCONSOLE   =    0,  << OUTPUT MESSAGE TO OPERATOR >>            01052000
       PAPEROUTMSG =   14,  << PAPER OUT MESSAGE # TO MESS PROCESSOR >> 01054000
       PARITYERROR =   -1,  << PARITY ERROR LOGGING VALUE >>            01056000
       PFABORT     =  %63,  << REQUEST ABORTED DUE TO POWER FAIL >>     01058000
       POWERUP     = %213,  << UNIT RESET DUE TO POWER FAILURE >>       01060000
       PRESPACE'   =   13,  << LAST REQUEST USED PRESPACING >>          01062000
       QFUNC       =    6,  << FUNCTION CODE >>                         01064000
       QLINK       =    1,  << IOQ POINTER TO NEXT REQUEST >>           01066000
       QMISC       =    3,  << REQUEST STATE >>                         01068000
       QPAR1       =    8,  << CARRIAGE CONTROL SPECIFICATION >>        01070000
       QPAR2       =    9,  << PRESPACE AND STEPOVER REQUEST FLAGS >>   01072000
       QSTAT       =   10,  << REQUEST STATUS AND PCB NUMBER >>         01074000
       QWBCT       =    7,  << WORD/BYTE COUNT >>                       01076000
       REQUESTDONE =    5,  << REQUEST COMPLETED DRIVER RETURN >>       01078000
       SIOFAIL     =  %44,  << SIO FAILURE REQUEST STATUS >>            01080000
       SYSDB       =%1000,  << SET START OF SYSDB AREA >>               01082000
       SYSERROR    = %124,  << SYSTEM ERROR REQUEST STATUS >>           01084000
     ENDEQ         =    0;                                              01086000
                                                                        01088000
                                                                        01090000
                                                                        01092000
             << I/O STATUS BIT DEFINITIONS >>                           01094000
                                                                        01096000
     DEFINE                                                             01098000
       RDYBIT     = ( 1:1)#, << UNIT READY FOR DATA/COMMAND BIT >>      01100000
       PAPEROUT   = ( 6:1)#, << PAPER OUT INDICATOR >>                  01102000
       PARITYERR  = ( 4:1)#, << PARITY ERROR OCCURRED BIT >>            01104000
       PON        = ( 7:1)#, << UNIT POWERED UP OR WAS RESET >>         01106000
                                                                        01108000
                                                                        01110000
               << QMISC BIT DEFINITIONS >>                              01112000
                                                                        01114000
       PRE'TO'POST= ( 0:1)#, << PRE TO POST SPACING CHANGE FLAG >>      01116000
       PEJECT     = ( 1:1)#, << LAST OPERATION WAS A PAGE EJECT >>      01118000
       TOUTCNTR   = ( 3:3)#, << CHANNEL TIME-OUT RETRY COUNTER >>       01120000
       PONDONE    = ( 2:1)#, << POWER FAIL OCCURRED FLAG >>    <<01493>>01122000
       WAITCODE   = (12:4)#, << INDICATES TYPE OF WAIT >>               01124000
                             <<   0 - NEW REQUEST      >>               01126000
                             <<   1 - COMPLETION WAIT  >>               01128000
                             <<   2 - NOT READY WAIT   >>               01130000
                             <<   3 - INITIALIZE UNIT WAIT >>           01132000
                                                                        01134000
                                                                        01136000
            << DSAVE BIT DEFINITIONS >>                                 01138000
                                                                        01140000
       PRESPACE   = (13:1)#, << LAST REQUEST USED PRESPACING >>         01142000
       FULL       = (14:1)#, << LINE PRINTER BUFFER IS FULL >>          01144000
       TOP        = (15:1)#, << PRINTER IS AT TOP-OF-FORM (TOF) >>      01146000
                                                                        01148000
                                                                        01150000
             << MISCELLANEOUS BIT DEFINITIONS >>                        01152000
                                                                        01154000
       CMD        = (12:4)#, << SECONDARY COMMAND >>                    01156000
       DLDEVN     = ( 8:8)#, << LOGICAL DEVICE NUMBER OF DIT >>         01158000
       ERRORCODE  = ( 0:3)#, << CPVAP, ERROR CODE >>                    01160000
       FUNC       = ( 8:8)#, << QFUNC, FUNCTION CODE >>                 01162000
       IOSTAT     = ( 8:8)#, << QSTAT, REQUEST STATUS RETURNED >>       01164000
       LRBIT      = ( 1:1)#, << WRITE INSTRUCTION LEFT/RIGHT BYTE BIT >>01166000
       PFAIL      = (11:1)#, << QFLAG, ABORT SET DUE TO POWER FAIL >>   01168000
       SFAIL      = (10:1)#, << QFLAG, FAILURE ON DELAYED START SIO >>  01170000
       STEPOVER   = (14:1)#, << IF SET THEN NO PAGE STEPOVER >>         01172000
       TIMEDOUT   = (13:1)#, << CPVAP, TRANSFER ABORTED DUE TO TO >>    01174000
       ASMB       = ASSEMBLE#,                                 <<01367>>01176000
       HIOP       = CON %20302; CON 1#,                        <<01367>>01178000
       LOADMEMORY = ASSEMBLE(LSEA)#,                                    01180000
     ENDDEF       = 0#;                                                 01182000
                                                                        01184000
                                                                        01186000
                                                                        01188000
$PAGE                                                                   01190000
<<      *********************************                               01192000
        *                               *                               01194000
        *   DRIVER DB AREA DEFINITION   *                               01196000
        *                               *                               01198000
        *********************************       >>                      01200000
                                                                        01202000
                                                                        01204000
ARRAY INITIAL(0:112)= DB:=                                     <<01482>>01206000
       [8/11,8/1],<<DIT SIZE,NOT CORE RES/NO IDLE CP/DVR TYPE>><<01348>>01208000
                0,   << NOT USED >>                                     01210000
                0,   << UNIT EXTRACT INSTRUCTION - NOT USED >>          01212000
       [8/49,8/0],   << CP SIZE/2, STATUS RET AREA SIZE >>     <<01482>>01214000
                                                                        01216000
       << LP DIT >>                                                     01218000
                0,   << DFLAG >>                                        01220000
                0,   << DLINK >>                                        01222000
                0,   << DIOQP >>                                        01224000
          %040000,   << DLDEV - HP-IB DEVICE >>                <<01301>>01226000
                0,   << DDLTP >>                                        01228000
                0,   << DILTP >>                                        01230000
                0,   << DSAVE >>                               <<01301>>01232000
                0,   << DSERR >>                                        01234000
                0,   << DTIME >>                               <<01301>>01236000
                0,   << DRQST >>                               <<01301>>01238000
                0,   << DLOGERROR >>                           <<01348>>01240000
                                                                        01242000
                                                                        01244000
       << CHANNEL PROGRAM >>                                            01246000
                                                                        01248000
<< 0>> << WAIT >>           %1000,  << MAKE SURE UNIT IS RESPONDING >>  01250000
<< 1>>                          0,                                      01252000
                                                                        01254000
<< 2>> << DSJ >>            %2403,  << CHECK PRINTER'S CONDITION >>     01256000
<< 3>>                          0,     << RETURN BYTE >>                01258000
<< 4>>                          0,     << JMP *+0, READY FOR COMMAND >> 01260000
<< 5>>                         56,     << JMP *+56, ERROR, READ STAT >> 01262000
<< 6>>                         56,     << JMP *+56, STAT READ REQUIRED>>01264000
<< 7>>                         56,     << JMP *+56, PARITY ERROR >>     01266000
                                                                        01268000
<< 8>> << JUMP >>               0,  << JUMP *+0 FOR PRESPACE REQUEST >> 01270000
<< 9>>                          0,  << JUMP *+7 OTHERWISE >>            01272000
                                                                        01274000
<<10>> << WRITE CONTROL >>  %2010,  << PRESPACE WRITE CONTROL/SET VFC >>01276000
<<11>>                          1,                                      01278000
<<12>>                          0,                                      01280000
<<13>>                     %42000,                                      01282000
<<14>>                          0,                                      01284000
                                                                        01286000
<<15>> << WAIT >>           %1000,  << WAIT FOR UNIT TO PARALLEL POLL >>01288000
<<16>>                          0,                                      01290000
                                                                        01292000
<<17>> << JUMP >>               0,  << JUMP *+0 FOR BUFFER FILL >>      01294000
<<18>>                          0,  << JUMP *+23 OTHERWISE >>           01296000
                                                                        01298000
<<19>> << DSJ >>            %2403,  << CHECK PRINTER'S CONDITION >>     01300000
<<20>>                          0,     << RETURN BYTE >>                01302000
<<21>>                          0,     << JMP*+0, READY FOR NEXT BURST>>01304000
<<22>>                         39,     << JMP*+39, ERROR, READ STATUS >>01306000
<<23>>                         39,     << JMP*+39, STAT READ REQUIRED >>01308000
<<24>>                          0,     << JMP*+0, N/A IN BURST LOOP >>  01310000
                                                                        01312000
<<25>> << WRITE DATA >>     %2000,  << WRITE OUT DATA BUFFER >>         01314000
<<26>>                          0,                                      01316000
<<27>>                          7,     << BURST OF 7 BYTES >>           01318000
<<28>>                    %100000,                                      01320000
<<29>>                          0,                                      01322000
                                                                        01324000
<<30>> << JUMP >>               0,  << JUMP *+2, END OF TRANSFER >>     01326000
<<31>>                          2,                                      01328000
                                                                        01330000
<<32>> << JUMP >>               0,  << JUMP *-19, END OF BURST >>       01332000
<<33>>                        -19,                                      01334000
                                                                        01336000
<<34>> << WAIT >>           %1000,  << WAIT FOR UNIT TO PARALLEL POLL >>01338000
<<35>>                          0,                                      01340000
                                                                        01342000
<<36>> << DSJ >>            %2403,  << CHECK PRINTER'S STATE >>         01344000
<<37>>                          0,     << RETURN BYTE >>                01346000
<<38>>                          0,     << JMP *+0, READY FOR COMMAND >> 01348000
<<39>>                         22,     << JMP *+22, ERROR - READ STAT >>01350000
<<40>>                         22,     << JMP *+22, STAT READ REQUIRED>>01352000
<<41>>                          0,     << JMP *+0, PARITY ERROR >>      01354000
                                                                        01356000
<<42>> << JUMP >>               0,  << JUMP *+0 FOR POSTSPACE REQUEST >>01358000
<<43>>                          0,  << JUMP *+7 OTHERWISE >>            01360000
                                                                        01362000
<<44>> << WRITE CONTROL >>  %2010,  << POSTSPACE WRITE CONTROL >>       01364000
<<45>>                          1,                                      01366000
<<46>>                          0,                                      01368000
<<47>>                     %44000,                             <<01367>>01370000
<<48>>                          0,                                      01372000
                                                                        01374000
<<49>> << WAIT >>           %1000,  << WAIT FOR UNIT TO PARALLEL POLL >>01376000
<<50>>                          0,                                      01378000
                                                                        01380000
<<51>> << DSJ >>            %2403,  << CHECK PRINTER'S STATE >>         01382000
<<52>>                          0,     << RETURN BYTE >>                01384000
<<53>>                          0,     << JMP *+0, READY FOR COMMAND >> 01386000
<<54>>                          7,     << JMP *+7, ERROR - READ STAT >> 01388000
<<55>>                          7,     << JMP *+7, STAT READ REQUIRED >>01390000
<<56>>                          0,     << JMP *+0, PARITY ERROR >>      01392000
                                                                        01394000
<<57>> << READ STATUS >>    %1416,  << READ STATUS BYTE >>              01396000
<<58>>                          1,                                      01398000
<<59>>                          0,                                      01400000
<<60>>                      %2000,                                      01402000
<<61>>                          0,                                      01404000
                                                                        01406000
<<62>> << INT/HLT >>         %601,  << INTERRUPT/HALT AND PUT HALT >>   01408000
<<63>>                          1,     <<CODE OF 1 IN CPVA WORD 1 >>    01410000
                                                                        01412000
<<64>> << READ STATUS >>    %1416,  << READ STATUS BYTE >>              01414000
<<65>>                          1,                                      01416000
<<66>>                          0,                                      01418000
<<67>>                      %2000,                                      01420000
<<68>>                          0,                                      01422000
                                                                        01424000
<<69>> << INT/HLT >>         %601,  << INTERRUPT/HALT AND PUT HALT >>   01426000
<<70>>                          2,     << CODE OF 2 IN CPVA WORD 1 >>   01428000
                                                               <<01482>>01430000
       << POWER ON INITIATION ROUTINE >>                       <<01482>>01432000
                                                               <<01482>>01434000
<<71>> << WRITE COMMAND >>  %2000,  << SET LP ONLINE >>        <<01482>>01436000
<<72>>                          2,                             <<01482>>01438000
<<73>>                          0,                             <<01482>>01440000
<<74>>                      %2000,                             <<01482>>01442000
<<75>>                          0,  << ESC (ONLINE) ADR >>     <<01482>>01444000
                                                               <<01482>>01446000
<<76>> << WAIT >>           %1000,                             <<01482>>01448000
<<77>>                          0,                             <<01482>>01450000
                                                               <<01482>>01452000
       << INITIALIZATION ROUTINE >>                            <<01482>>01454000
                                                               <<01482>>01456000
<<78>> << CLEAR >>          %4401,  << CLR W/PARITY CHECK >>   <<01482>>01458000
<<79>>                          0,                             <<01482>>01460000
                                                               <<01482>>01462000
<<80>> << WRITE COMMAND >>  %2001,  << SET POLL MASK CMD >>    <<01482>>01464000
<<81>>                          1,                             <<01482>>01466000
<<82>>                          0,                             <<01482>>01468000
<<83>>                     %42000,                             <<01482>>01470000
<<84>>                          0,                             <<01482>>01472000
                                                               <<01482>>01474000
<<85>> << WRITE COMMAND >>  %2002,  << RESTRICTED MODE CMD >>  <<01482>>01476000
<<86>>                          1,                             <<01482>>01478000
<<87>>                          0,                             <<01482>>01480000
<<88>>                     %42000,                             <<01482>>01482000
<<89>>                          0,                             <<01482>>01484000
                                                               <<01482>>01486000
<<90>> << INT/HLT >>         %601,  << INT/HLT & PUT HALT >>   <<01482>>01488000
<<91>>                          0,  << CODE 0 IN CPVAP(1) >>   <<01482>>01490000
                                                               <<01482>>01492000
<<92>> << BUFFERS >>            0,  << PRESPACE CONTROL >>     <<01482>>01494000
<<93>>                          0,  << POSTSPACE CONTROL >>    <<01482>>01496000
<<94>>                          0,  << STATUS BUFFER >>        <<01482>>01498000
<<95>>                       %330,  << POLL MASK >>            <<01482>>01500000
<<96>>                       %202,  << RESTRICTED MODE CODE >> <<01482>>01502000
<<97>>                    %015556;  << ONLINE ESC SEQ >>       <<01482>>01504000
$PAGE                                                                   01506000
<<       ***************************************                        01508000
         *                                     *                        01510000
         *   EXTERNAL PROCEDURE DECLARATIONS   *                        01512000
         *                                     *                        01514000
         ***************************************     >>                 01516000
                                                                        01518000
                                                                        01520000
   PROCEDURE ABORTTIMEREQ(TRLX);                                        01522000
     VALUE TRLX;   INTEGER TRLX;                                        01524000
     OPTION EXTERNAL;                                                   01526000
                                                                        01528000
   PROCEDURE GIP'HPIB;                                         <<01301>>01530000
     OPTION EXTERNAL;                                                   01532000
                                                                        01534000
   PROCEDURE HELP;                                                      01536000
     OPTION EXTERNAL;                                                   01538000
                                                                        01540000
   LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,    01542000
                               REPLY,OFFSET,DITP,IOTYPE);               01544000
     VALUE  SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,          01546000
            DITP,IOTYPE;                                                01548000
     INTEGER  SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,IOTYPE; 01550000
     INTEGER POINTER  DITP;                                             01552000
     OPTION VARIABLE, EXTERNAL;                                         01554000
                                                                        01556000
   PROCEDURE SIODM(DITP,FLAGS);                                         01558000
     VALUE DITP,FLAGS;   LOGICAL FLAGS;                                 01560000
     POINTER DITP;   OPTION EXTERNAL;                                   01562000
                                                                        01564000
   PROCEDURE MASTERCLEARHPIB(DITP);                            <<01301>>01566000
     ARRAY DITP;   OPTION EXTERNAL;                                     01568000
                                                                        01570000
   PROCEDURE START'HPIB(DITP,SIOP,QFLAG);                      <<01301>>01572000
     VALUE DITP,SIOP,QFLAG;   LOGICAL QFLAG;                            01574000
     POINTER DITP,SIOP;   OPTION EXTERNAL;                              01576000
                                                                        01578000
   INTEGER PROCEDURE TIMEREQ(CODE,REQ,TIME);                            01580000
     VALUE CODE,REQ,TIME;                                               01582000
     INTEGER CODE,REQ;   DOUBLE TIME;                                   01584000
     OPTION EXTERNAL;                                                   01586000
$PAGE                                                                   01588000
<<       ******************************************                     01590000
         *                                        *                     01592000
         *   LP DRIVER INITIALIZATION PROCEDURE   *                     01594000
         *                                        *                     01596000
         ******************************************     >>              01598000
                                                                        01600000
                                                                        01602000
   PROCEDURE LPINIT(DITP);                                              01604000
     INTEGER ARRAY DITP;                                                01606000
                                                                        01608000
<<                                                                      01610000
       THIS PROCEDURE INITIALIZES THE PRESPACING, POST-SPACING, AND     01612000
       STATUS BUFFER ADDRESSES IN THE CHANNEL PROGRAM.                  01614000
>>                                                                      01616000
     BEGIN                                                              01618000
       INTEGER POINTER   ILTP = Q+1;                                    01620000
       INTEGER POINTER   SIOP = Q+2;                                    01622000
       INTEGER        SIOBASE = Q+3;                                    01624000
                                                                        01626000
                                                                        01628000
       TOS := DITP(DILTP);      << ILTP    >>                           01630000
       TOS := ILTP(ISIOP);      << SIOP    >>                           01632000
       TOS := @SIOP + SYSDB;    << SIOBASE >>                           01634000
                                                                        01636000
       SIOP(14) := SIOBASE + PRE'CTL;                                   01638000
       SIOP(48) := SIOBASE + POST'CTL;                                  01640000
       SIOP(75) := SIOBASE + ESC'CTL;                          <<01482>>01642000
       SIOP(68) := SIOBASE + STATUS;                                    01644000
       SIOP(84) := SIOBASE + POLLMASK;                         <<01482>>01646000
       SIOP(89) := SIOBASE + MODECMD;                          <<01482>>01648000
                                                                        01650000
     END;                                                               01652000
$PAGE                                                                   01654000
<<       ************************************************               01656000
         *                                              *               01658000
         *   LINE PRINTER DRIVER PROCEDURE  -  LPDRVR   *               01660000
         *                                              *               01662000
         ************************************************     >>        01664000
                                                                        01666000
                                                                        01668000
                                                                        01670000
   INTEGER PROCEDURE LPDRVR(IOQP,DITP,BANK,BUFFADDR,SIOP,DRTN);<<01301>>01672000
<<                                                                      01674000
       THIS PROCEDURE INITIATES AND COMPLETES I/O REQUESTS              01676000
       FOR THE HP 2631 LINE PRINTER CONNECTED TO THE HP-IB              01678000
       AND CONTROLLED BY THE GIC.                                       01680000
                                                                        01682000
       MODE RETURNS IN LPDRVR -                                         01684000
           5 - REQUEST COMPLETED                                        01686000
           7 - NOT READY WAIT                                           01688000
         %13 - WAIT FOR COMPLETION                              >>      01690000
                                                                        01692000
   VALUE  DITP,IOQP,BANK,BUFFADDR,SIOP,DRTN;                   <<01301>>01694000
   INTEGER  BANK,BUFFADDR,DRTN;                                <<01301>>01696000
   INTEGER POINTER  DITP,IOQP,SIOP;                                     01698000
   OPTION  PRIVILEGED,UNCALLABLE;                                       01700000
                                                                        01702000
   BEGIN                                                                01704000
     LOGICAL ARRAY                                                      01706000
       DITPL(*) = DITP, IOQPL(*) = IOQP, SIOPL(*) = SIOP;               01708000
                                                                        01710000
     DOUBLE                                                             01712000
       BUFFADDRD = Q-7;    << BANK AND BUFFER ADDRESS >>       <<01301>>01714000
                                                                        01716000
     INTEGER POINTER                                                    01718000
       CPVAP    = Q+1,    << HOLDS CHANNEL I/O STATUS >>                01720000
       IDLESIOP = Q+2,    << POINTS TO START OF IDLE CHAN PROG >>       01722000
       INITSIOP = Q+3,    << POINTS TO START OF INIT CP >>     <<01367>>01724000
       STATSIOP = Q+8,    << POINTS TO CP STATUS READ >>       <<01367>>01726000
       FILLSIOP = Q+9,    << POINTS TO FILL BUFFER >>          <<01367>>01728000
       POSTSIOP = Q+10;   << POINTS TO POSTSPACE PRT >>        <<01367>>01730000
                                                                        01732000
     INTEGER                                                            01734000
       COUNT    = Q+4,    << BUFFER BYTE COUNT >>                       01736000
       PARAM    = Q+5,    << CONTROL PARAMETER >>                       01738000
       PRINTCTL = Q+6,    << PRINT CONTROL BYTE >>                      01740000
       FCODE    = Q+7,    << FUNCTION CODE >>                           01742000
       S0       = S-0;                                                  01744000
                                                                        01746000
$PAGE                                                                   01748000
   << INITIALIZE LOCAL POINTERS AND VARIABLES >>                        01750000
                                                                        01752000
     TOS := DITP(DILTP);     << CPVAP >>                                01754000
     TOS := @SIOP+IDLE;      << IDLESIOP >>                             01756000
     TOS := @SIOP+PONCP;     << PONSIOP  >>                    <<01482>>01758000
     TOS := IOQP(QWBCT);     << COUNT >>                       <<01201>>01760000
     TOS := 0;               << PARAM >>                                01762000
     TOS := 0;               << PRINTCTL >>                             01764000
     TOS := IOQP(QFUNC).FUNC;  << FCODE >>                              01766000
     TOS := @SIOP+57;        << STATSIOP >>                    <<01201>>01768000
     TOS := @SIOP+15;        << FILLSIOP >>                    <<01367>>01770000
     TOS := @SIOP+34;        << POSTSIOP >>                    <<01367>>01772000
                                                                        01774000
     IF @IOQP = 0 THEN GOTO EXIT;  << NOTHING TO DO >>         <<02695>>01776000
                                                                        01778000
     IF IOQP(QMISC).WAITCODE = CMPLTIONWAIT THEN                        01780000
       ABORTTIMEREQ(DITP(DRQST));                              <<01301>>01782000
                                                                        01784000
     TOS := IOQP;                                                       01786000
     IF < THEN      << ABORT PROCESS >>                                 01788000
       BEGIN                                                            01790000
         TOS := IF IOQPL.PFAIL THEN PFABORT ELSE ABORTED;               01792000
         GOTO BADIO;                                                    01794000
         HELP;     << LINK >>                                           01796000
       END;                                                             01798000
     DEL;                                                      <<01367>>01800000
                                                                        01802000
     IF IOQP(QMISC).WAITCODE = NOTRDYWAIT THEN                 <<01493>>01804000
       BEGIN   << RETURN FROM NOT READY COND >>                <<01493>>01806000
         IOQP(QMISC).PONDONE := 0;                             <<01493>>01808000
         IF <> OR SIOP(STATUS).PON = 1 THEN  << PON OCCURRED >><<01493>>01810000
           GOTO PONINIT;                                       <<01493>>01812000
         IF SIOP(DSJ'RB1) <> 7 THEN                            <<01493>>01814000
           BEGIN                                               <<01493>>01816000
           TOS := DRTN;                                        <<01493>>01818000
           ASMB( HIOP );  << HALT ANY INCOMPLETE CHAN PROG >>  <<01493>>01820000
           GO TO RESTART;                                      <<01493>>01822000
           END;                                                <<01493>>01824000
       END;                                                    <<01493>>01826000
                                                               <<01493>>01828000
                                                                        01830000
     IF IOQP(QMISC).WAITCODE=CMPLTIONWAIT THEN  << PROCESS INTERRUPT >> 01832000
       GOTO LPCONT;                                                     01834000
                                                                        01836000
     IF IOQP(QMISC).WAITCODE = INITIOWAIT THEN                          01838000
       BEGIN                                                            01840000
         TOS := POWERUP;                                                01842000
         GOTO IODONE;                                                   01844000
       END;                                                             01846000
                                                                        01848000
     SIOP(BUFFJMP) := 23;                                               01850000
     SIOP(PREJMP) := SIOP(POSTJMP) := 7;  << INIT CP >>                 01852000
     SIOP(WRTCTL1).CMD := %10;  << INIT WRITE CTL TO PRINT COMMAND >>   01854000
     SIOP(WRTCTL2).CMD := %10;  << INIT WRITE CTL TO PRINT COMMAND >>   01856000
     SIOP(SCOUNT) := 1;  << READ SINGLE STATUS >>              <<01201>>01858000
     SIOP(SBANK).(8:8) := 0;                                   <<01201>>01860000
     SIOP(STATADR) := @SIOP+SYSDB+STATUS;  << CP STAT ADR >>   <<01482>>01862000
     SIOP(PCOUNT) := 1;  << RESET POSTSP CTRL CNT >>           <<01367>>01864000
     SIOP(PBANK).LRBIT := 1;  << RESET RT BYTE BIT >>          <<01367>>01866000
                                                                        01868000
                                                                        01870000
          << CHECK FOR FOPEN, FCLOSE, AND DCLOSE  (FCODE = 2,3, OR 4) >>01872000
                                                                        01874000
     IF FCODE = DCLOSE THEN                                             01876000
       BEGIN                                                            01878000
         IF DITP(DSAVE).(FULL':2) <> 1 THEN  << EJECT A PAGE >><<02695>>01880000
           BEGIN                                                        01882000
             SIOP(PREJMP) := 0;                                         01884000
             SIOP(PRE'CTL) := %100;                                     01886000
           END;                                                         01888000
         DITP(DSAVE) := 1;   << SET TOF FLAG >>                         01890000
                                                               <<02694>>01892000
                                                               <<02694>>01894000
                                                               <<02694>>01896000
         IOQP(QMISC).PEJECT := 1;                                       01898000
         GOTO STARTPRINT;                                               01900000
       END                                                              01902000
                                                                        01904000
                                                                        01906000
     ELSE  IF FCODE=FOPEN OR FCODE=FCLOSE THEN                          01908000
       BEGIN                                                            01910000
         IF DITP(DSAVE).(FULL':2) = 1 THEN                     <<02695>>01912000
           GOTO PRINTDONE;  << EMPTY BUFFER & ALREADY AT TOP >><<02695>>01914000
         DITP(DSAVE).FULL := 0;  << SET BUFFER EMPTY >>        <<02695>>01916000
         IOQP(QMISC).PEJECT := 1;   << SET PAGE EJECT FLAG >>           01918000
         SIOP(POSTJMP) := 0;                                   <<01367>>01920000
         SIOP(POST'CTL) := %100;  << SKIP TO TOP OF PAGE >>    <<01367>>01922000
         GOTO STARTPRINT;                                      <<01367>>01924000
       END                                                              01926000
                                                                        01928000
          << CHECK FOR FWRITE  (FCODE = 1) >>                           01930000
   ELSE IF FCODE = 1 THEN                                               01932000
     BEGIN                                                              01934000
                                                                        01936000
                                                                        01938000
     IF DITP(DSAVE).(PRESPACE':2)=3 AND NOT IOQPL(QPAR2) THEN           01940000
       BEGIN                                                            01942000
         SIOP(PREJMP) := 0;                                             01944000
         IF IOQPL(QPAR2).STEPOVER THEN  << NO AUTO EJECT >>    <<02695>>01946000
           SIOP(PRE'CTL) := 1  << SINGLE SPACE W/O STEPOVER >> <<02695>>01948000
         ELSE  << AUTO PAGE EJECT >>                           <<02695>>01950000
         SIOP(PRE'CTL) := %102;         << ISSUE SINGLE SPACE WITH >>   01952000
         IOQP(QMISC).PRE'TO'POST := 1;  << STEPOVER TO CLEAR LP BUFF >> 01954000
       END;                                                             01956000
                                                                        01958000
     TOS := IOQP(QWBCT);                                                01960000
     IF < THEN             << BYTE COUNT >>                             01962000
       COUNT := -TOS         << MAKE POSITIVE >>                        01964000
     ELSE                  << WORD COUNT >>                             01966000
       COUNT := TOS&ASL(1);  << CHANGE TO BYTE COUNT >>                 01968000
                                                                        01970000
     IF IOQP(QPAR1) = 1 THEN   << IMBEDDED CONTROL >>                   01972000
       BEGIN                                                            01974000
         IF COUNT = 0 THEN    << INVALID OPERATION >>                   01976000
           BEGIN                                                        01978000
             TOS := INVALIDOP;                                          01980000
             GOTO IODONE;                                               01982000
           END;                                                         01984000
         TOS := BUFFADDRD;    << LOAD BANK AND BUFF ADDRESS >>          01986000
         LOADMEMORY;             << LOAD FIRST WORD >>                  01988000
         PARAM := TOS&LSR(8);    << ISOLATE AND SAVE CONTROL PARAM >>   01990000
         COUNT := COUNT - 1;     << DECREMENT BYTE COUNT >>             01992000
       END                                                              01994000
     ELSE                      << CONTROL IN PARAM WORD >>              01996000
       PARAM := IOQP(QPAR1);                                            01998000
                                                                        02000000
     DITP(DSAVE).PRESPACE := IF IOQPL(QPAR2)                            02002000
       THEN 1 ELSE 0;                 << SET PRESPACE FLAG >>           02004000
                                                                        02006000
                                                                        02008000
        << INITIALIZE PRINT CONTROL BYTE >>                             02010000
                                                                        02012000
     IF IOQPL(QPAR2).STEPOVER THEN  << SINGLE SPACE WITHOUT STEPOVER >> 02014000
       PRINTCTL := 1                                                    02016000
     ELSE                           << SINGLE SPACE WITH STEPOVER >>    02018000
       PRINTCTL := %102;                                                02020000
                                                                        02022000
                                                                        02024000
        << SETUP PRINT CONTROL BYTE >>                                  02026000
                                                                        02028000
     IF PARAM = "+" THEN            << SUPPRESS SPACING >>              02030000
       PRINTCTL := 0                                                    02032000
                                                                        02034000
     ELSE IF PARAM = "0" THEN       << DOUBLE SPACE >>                  02036000
       PRINTCTL := PRINTCTL + 1                                         02038000
                                                                        02040000
     ELSE IF PARAM = "-" THEN       << TRIPLE SPACE >>                  02042000
       PRINTCTL := PRINTCTL + 2                                         02044000
                                                                        02046000
     ELSE IF PARAM = "1" THEN       << TOP OF FORM >>                   02048000
       BEGIN                                                            02050000
         IF COUNT=0 AND DITP(DSAVE).(FULL':2)=1 THEN                    02052000
           GOTO PRINTDONE;  << EMPTY BUFFER AND ALREADY AT TOP >>       02054000
         PRINTCTL := %100;                                              02056000
         IOQP(QMISC).PEJECT := 1;   << SET PAGE EJECT FLAG >>           02058000
       END                                                              02060000
                                                                        02062000
     ELSE IF %200 <= PARAM <= %277 THEN  << SLEW N LINES >>             02064000
       PRINTCTL := PARAM - %200                                         02066000
                                                                        02068000
     ELSE IF %300 <= PARAM <= %307 THEN  << SELECT CHANNEL N >>         02070000
       PRINTCTL := PARAM - %200                                         02072000
                                                                        02074000
     ELSE IF PARAM = %320 THEN      << BUFFER FILL ONLY >>              02076000
       BEGIN                                                            02078000
         PRINTCTL := -1;                                                02080000
         IF IOQP(QMISC).PRE'TO'POST=0 AND COUNT=0 THEN                  02082000
           GOTO PRINTDONE;                                              02084000
       END;                                                             02086000
                                                                        02088000
                                                                        02090000
<<  SETUP CHANNEL PROGRAM FOR BUFFER FILL AND PRINT CONTROL  >>         02092000
                                                                        02094000
  PRINTSETUP:                                                           02096000
     IF PRINTCTL >= 0 THEN    << SETUP PRINT CONTROL >>                 02098000
       BEGIN                                                            02100000
         DITP(DSAVE).FULL := 0;                                         02102000
         IF DITP(DSAVE).PRESPACE=1 THEN    << PRESPACE >>               02104000
           BEGIN                                                        02106000
             SIOP(PREJMP) := 0;                                         02108000
             SIOP(PRE'CTL) := PRINTCTL;                                 02110000
           END                                                          02112000
         ELSE                              << POST-SPACE >>             02114000
           BEGIN                                                        02116000
             SIOP(POSTJMP) := 0;                                        02118000
             SIOP(POST'CTL) := PRINTCTL;                                02120000
           END;                                                         02122000
       END;                                                             02124000
                                                                        02126000
                                                                        02128000
     IF COUNT <> 0 THEN        << SETUP BUFFER FILL >>                  02130000
       BEGIN                                                            02132000
         SIOP(BUFFJMP) := 0;                                            02134000
         SIOP(BCOUNT) := COUNT;                                         02136000
         SIOP(MEMX).(8:8) := BANK;                                      02138000
         SIOP(MEMX).LRBIT := IF IOQP(QPAR1)=1   << IMBEDDED CONTROL >>  02140000
           THEN 1 ELSE 0;               << START WITH RIGHT BYTE >>     02142000
         SIOP(BADDR) := BUFFADDR;                                       02144000
         DITP(DSAVE).FULL := IF DITPL(DSAVE).PRESPACE                   02146000
           THEN 1 ELSE 0;    << IF PRESPACING INDICATE BUFF IS FULL >>  02148000
       END;                                                             02150000
                                                                        02152000
                                                                        02154000
                                                                        02156000
<<  START CHANNEL PROGRAM  >>                                           02158000
                                                                        02160000
  STARTPRINT:                                                           02162000
     CPVAP := 0;                << CLEAR CHANNEL STATUS WORD >>         02164000
     SIOP(DSJ'RB1) := 7;        << INIT 1ST DSJ RETURN BYTE >> <<01367>>02166000
     SIOP(STATUS) := 0;         << CLEAR CP STATUS WORD >>              02168000
                                                                        02170000
     START'HPIB(DITP,SIOP,TRUE);   << START CHANNEL PROGRAM >> <<01301>>02172000
PRINTCONT:                                                     <<01201>>02174000
     IF < THEN      << SIO FAILURE >>                                   02176000
       BEGIN                                                            02178000
         TOS := SIOFAIL;                                                02180000
         GOTO BADIO;                                                    02182000
       END;                                                             02184000
                                                                        02186000
     IOQP(QMISC).WAITCODE := CMPLTIONWAIT;  << SET REQUEST STATE >>     02188000
     DITP(DTIME) := 0;                                         <<01301>>02190000
     DITP(DRQST) := TIMEREQ(IOTIMER,@DITP,4000D);              <<01301>>02192000
     LPDRVR := INTRPTWAIT;                                              02194000
     RETURN;                                                            02196000
                                                                        02198000
                                                                        02200000
     END      << OF WRITE LOGIC (FUNCTION CODE = 1) >>                  02202000
                                                                        02204000
                                                                        02206000
                                                                        02208000
   ELSE IF FCODE = %17 THEN                                    <<01201>>02210000
     BEGIN   << PERFORM READ STATUS >>                         <<01201>>02212000
       IF COUNT = 0 THEN << SINGLE STATUS MINIMUM >>           <<01201>>02214000
         BEGIN   << INVALID REQUEST >>                         <<01201>>02216000
           TOS := INVALIDOP;                                   <<01201>>02218000
           GO TO BADIO;                                        <<01201>>02220000
         END;                                                  <<01201>>02222000
       TOS := IOQP(QWBCT);                                     <<01201>>02224000
       IF < THEN  << BYTE COUNT >>                             <<01201>>02226000
         COUNT := -TOS  << MAKE POSITIVE >>                    <<01201>>02228000
       ELSE                                                    <<01201>>02230000
         COUNT := TOS&ASL(1); << CHANGE TO BYTE CNT >>         <<01201>>02232000
       IF COUNT > 1 THEN COUNT := 1;  << MAX AVAIL >>          <<01201>>02234000
                                                               <<01201>>02236000
       SIOP(SCOUNT) := COUNT;  << STATUS BYTE COUNT >>         <<01201>>02238000
       SIOP(SBANK).(8:8) := BANK;                              <<01201>>02240000
       SIOP(STATADR) := BUFFADDR;                              <<01201>>02242000
       START'HPIB(DITP,STATSIOP,FALSE);  << START CP >>        <<01367>>02244000
       GO TO PRINTCONT;                                        <<01201>>02246000
                                                               <<01201>>02248000
                                                               <<01201>>02250000
     END  << OF READ STATUS (FUNCTION CODE = %17) >>           <<01201>>02252000
                                                               <<01201>>02254000
                                                               <<01201>>02256000
                                                               <<01201>>02258000
   ELSE  IF FCODE = %100 THEN                                           02260000
     BEGIN   << SET VFC PROCESSING >>                                   02262000
       TOS := IOQP(QPAR1);                                              02264000
       IF 0<S0 AND S0<5 THEN TOS := TOS + %24                           02266000
       ELSE IF S0=8 THEN TOS := TOS + %22                               02268000
       ELSE IF TOS=12 THEN TOS := %24                                   02270000
       ELSE TOS := %31;                                                 02272000
                                                                        02274000
       SIOP(PRE'CTL) := TOS;    << SET REQUEST INTO CONTROL BUFF >>     02276000
       SIOP(PREJMP) := 0;                                               02278000
       SIOP(WRTCTL1).CMD := 2;  << SET WRITE CONTROL TO VFC COMMAND>>   02280000
       GOTO STARTPRINT;                                                 02282000
                                                                        02284000
                                                                        02286000
     END  << OF SET VFC LOGIC (FUNCTION CODE = %100) >>                 02288000
   ELSE       << FALL THROUGH  >>                                       02290000
                                                                        02292000
                                                                        02294000
$PAGE                                                                   02296000
                                                                        02298000
  PRINTDONE:                                                            02300000
     TOS := GOODIO;                                                     02302000
                                                                        02304000
  IODONE:                                                               02306000
     IOQP(QSTAT).IOSTAT := TOS;    << STORE RETURN STATUS >>            02308000
                                                               <<02695>>02310000
  EXIT:                                                        <<02695>>02312000
     LPDRVR := REQUESTDONE;                                             02314000
     RETURN;                                                            02316000
                                                                        02318000
  CHANERROR:                                                            02320000
     TOS := CHANFAIL;                                                   02322000
     DITP(DSERR):= [8/1,8/DLOGERROR];                          <<01348>>02324000
     DITP(DLOGERROR) := CPVAP;    <<LOG ERROR STATUS>>         <<01348>>02326000
                                                                        02328000
  BADIO:                                                                02330000
     DITP(DSAVE) := 0;    << CLEAR DRIVER FLAGS >>                      02332000
     MASTERCLEARHPIB(DITP);                                    <<01301>>02334000
     GOTO IODONE;                                                       02336000
                                                                        02338000
                                                                        02340000
                                                                        02342000
<<  LINE PRINTER CONTINUATOR SECTION  >>                                02344000
                                                                        02346000
  LPCONT:                                                               02348000
     IF CPVAP.ERRORCODE = 6 THEN   << DMA ABORT >>                      02350000
       GOTO CHANERROR;                                                  02352000
                                                                        02354000
     IF CPVAP.ERRORCODE = 7 THEN   << CHANNEL ABORT >>                  02356000
       BEGIN                                                            02358000
         IF CPVAP.TIMEDOUT = 0 THEN   << BAD CHANNEL >>                 02360000
           GOTO CHANERROR;                                              02362000
                                                                        02364000
         TOS := IOQP(QMISC).TOUTCNTR+1;   << TIMED-OUT COUNTER >>       02366000
         IF S0 > 3 THEN      << CHANNEL FAILURE >>                      02368000
           GOTO CHANERROR                                               02370000
         ELSE                                                           02372000
           IOQP(QMISC).TOUTCNTR := TOS;   << UPDATE COUNTER >>          02374000
         GOTO STARTPRINT;                                               02376000
       END;                                                             02378000
                                                                        02380000
     IF IOQPL.SFAIL THEN     << FAILURE ON DELAYED START I/O >>         02382000
       BEGIN                                                            02384000
         TOS := SIOFAIL;                                                02386000
         GOTO BADIO;                                                    02388000
       END;                                                             02390000
                                                                        02392000
     DITP(DTIME).(0:1) := 0;                                   <<01301>>02394000
     IF <> THEN   << TIMER POPPED >>                                    02396000
       BEGIN                                                            02398000
                                                                        02400000
   LPNOTREADY:                                                          02402000
         IF IOMESSAGE(1,IF SIOPL(STATUS).PAPEROUT THEN PAPEROUTMSG ELSE 02404000
                NOTRDYMSG,%10000,DITP(DLDEV).DLDEVN,,,,,OPCONSOLE) THEN 02406000
           BEGIN                                                        02408000
             START'HPIB(DITP,IDLESIOP,FALSE);                  <<01301>>02410000
             IF < THEN                                                  02412000
               BEGIN                                                    02414000
                 TOS := SIOFAIL;                                        02416000
                 GOTO BADIO;                                            02418000
               END;                                                     02420000
             IOQP(QMISC).WAITCODE := NOTRDYWAIT;  <<SET REQUEST STATE >>02422000
             LPDRVR := NOTREADY;                                        02424000
             RETURN;                                                    02426000
           END;                                                         02428000
                                                                        02430000
         TOS := SYSERROR;   << INDICATE FAILURE BECAUSE THERE >>        02432000
         GOTO BADIO;        << ARE NO MESSAGE LINK BUFFERS >>           02434000
       END;                                                             02436000
                                                                        02438000
     IF FCODE=%17 THEN  << IF STATUS READ - DONE >>            <<01201>>02440000
       GO TO PRINTDONE;                                        <<01201>>02442000
                                                               <<01201>>02444000
     IF CPVAP(1).(14:2) = 2 THEN   << STATUS DIAGNOSIS IS REQUIRED >>   02446000
       BEGIN                                                            02448000
         IF SIOP(STATUS).RDYBIT = 0 THEN  << UNIT NOTREADY >>           02450000
           BEGIN                                               <<01493>>02452000
             IF SIOP(STATUS).PON = 1 THEN                      <<01493>>02454000
               IOQP(QMISC).PONDONE := 1;   << PON OCCURRED >>  <<01493>>02456000
             GOTO LPNOTREADY;                                  <<01493>>02458000
           END;                                                <<01493>>02460000
                                                                        02462000
         IF SIOPL(STATUS).PAPEROUT THEN  << UNIT OUT OF PAPER >>        02464000
           BEGIN                                               <<01493>>02466000
             IF SIOP(STATUS).PON = 1 THEN                      <<01493>>02468000
               IOQP(QMISC).PONDONE := 1;   << PON OCCURRED >>  <<01493>>02470000
             GOTO LPNOTREADY;                                  <<01493>>02472000
           END;                                                <<01493>>02474000
                                                                        02476000
         IF SIOP(STATUS).PON = 1 THEN  << UNIT HAS JUST POWERED UP >>   02478000
 PONINIT:                                                      <<01493>>02480000
           BEGIN                                                        02482000
             START'HPIB(DITP,INITSIOP,TRUE);                   <<01301>>02484000
             IF < THEN                                                  02486000
               BEGIN                                                    02488000
                 TOS := SIOFAIL;                                        02490000
                 GOTO BADIO;                                            02492000
               END;                                                     02494000
             IOQP(QMISC).WAITCODE := INITIOWAIT;                        02496000
             LPDRVR := INTRPTWAIT;                                      02498000
             RETURN;                                                    02500000
           END;                                                         02502000
                                                                        02504000
         IF SIOP(STATUS).PARITYERR = 1 THEN                             02506000
           BEGIN                                                        02508000
             DITP(DSERR):= [8/1,8/DLOGERROR];                  <<01348>>02510000
             DITP(DLOGERROR) := PARITYERROR;   <<LOG ERROR>>   <<01348>>02512000
             GOTO STARTPRINT;                                           02514000
           END;                                                         02516000
                                                               <<01367>>02518000
  RESTART:                                                     <<01367>>02520000
         IF FCODE=1 THEN  << RESTART INCOMPLETE OPERATION >>   <<01367>>02522000
           BEGIN                                               <<01367>>02524000
           IF SIOP(BCOUNT)<>0 THEN  << BURST CNT EXPIRED >>    <<01367>>02526000
             BEGIN  << RESTART FILL BUF FOR PRE & POST SPACE >><<01367>>02528000
             TOS := IOQP(QWBCT);  << GET TOTAL COUNT >>        <<01367>>02530000
             IF < THEN  << BYTE COUNT >>                       <<01367>>02532000
               COUNT := -TOS  << MAKE POSITIVE >>              <<01367>>02534000
             ELSE  << WORD COUNT >>                            <<01367>>02536000
               COUNT := TOS&ASL(1);  << CHANGE TO BYTE COUNT >><<01367>>02538000
             SIOP(MEMX).(8:8) := BANK;  << RESET BANK & ADR >> <<01367>>02540000
             SIOP(BADDR) := BUFFADDR+  << ADD OFFSET TO ADR >> <<01367>>02542000
               (COUNT-SIOP(BCOUNT))/2;  << MAKE WRD CNT >>     <<01367>>02544000
             START'HPIB(DITP,FILLSIOP,FALSE);                  <<01367>>02546000
             GO TO PRINTCONT;                                  <<01367>>02548000
             END;                                              <<01367>>02550000
                                                               <<01367>>02552000
           IF SIOP(PCOUNT)<>0 THEN  << POSTSPACE PRT DONE? >>  <<01367>>02554000
             BEGIN  << RESTART POSTSPACE OPERATION >>          <<01367>>02556000
             START'HPIB(DITP,POSTSIOP,FALSE);                  <<01367>>02558000
             GO TO PRINTCONT;                                  <<01367>>02560000
             END;                                              <<01367>>02562000
           END;                                                <<01367>>02564000
       END;                                                             02566000
                                                                        02568000
     DITP(DSAVE).TOP := IOQP(QMISC).PEJECT;  << SET TOP IF PE WAS DONE>>02570000
                                                                        02572000
                                                                        02574000
     GO TO PRINTDONE;    << GOT HERE - REQUEST COMPLETED >>    <<01367>>02576000
                                                                        02578000
   END;                                                                 02580000
$PAGE                                                                   02582000
   ASSEMBLE(                                                            02584000
     PCAL SIODM;     << MONITOR >>                                      02586000
     PCAL LPDRVR;    << INITIATOR >>                                    02588000
     PCAL LPDRVR;    << COMPLETOR >>                                    02590000
     CON  0;         << NO IO PROCESS >>                                02592000
     PCAL LPINIT;    << INITIALIZATION >>                               02594000
     CON  1;         << ONE INTERRUPT HANDLER >>                        02596000
     PCAL GIP'HPIB); << INTERRUPT HANDLER >>                   <<01301>>02598000
   END.                                                                 02600000
