$CONTROL MAP,CODE,USLINIT                                               00010000
<<IOPRPN0 - MODULE 24>>                                                 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
                                                                        00030000
                                                                        00032000
                                                                        00034000
                                                                        00036000
                                                                        00038000
$CONTROL PRIVILEGED,UNCALLABLE                                          00040000
$THIRTY                                                                 00042000
$CONTROL MAIN=IOPRPN0                                          <<02698>>00044000
$TITLE "2894A PRINTING READER PUNCH DRIVER"                             00046000
$PAGE                                                          <<02698>>00048000
COMMENT                                                        <<02698>>00050000
            HP 3000 Printing Reader Punch Driver - IOPRPN0     <<02698>>00052000
            ----------------------------------------------     <<02698>>00054000
                                                               <<02698>>00056000
                                                               <<02698>>00058000
Operation of IOPRPN0:                                          <<02698>>00060000
                                                               <<02698>>00062000
IOPRPN0, together with the I/O  Device  Monitor  (SIODM)       <<02698>>00064000
constitute a standard MPE Type 1 I/O Driver/Monitor.           <<02698>>00066000
This means that it does not run in its own process, but        <<02698>>00068000
executes on any stack (including the Interrupt Control Stack)  <<02698>>00070000
and therefore must run to completion.  During initialization   <<02698>>00072000
it executes on PROGEN's stack, during request initiation it    <<02698>>00074000
executes on ATTACHIO's (user's) stack, and during interrupt    <<02698>>00076000
processing it executes on the Interrupt Control Stack (ICS).   <<02698>>00078000
                                                               <<02698>>00080000
IOPRPN0 consists of a global area, two procedure, and an       <<02698>>00082000
"outer block" which is really a linkage area for INITIAL.  The <<02698>>00084000
global area contains an array called INITIAL which is comprised<<02698>>00086000
of three parts. The first part specifies the size of the other <<02698>>00088000
two, the unit extract instruction, and various parameters which<<02698>>00090000
are used by INITIAL.  This section  is  deleted after INITIAL  <<02698>>00092000
is through with it.  The other two parts are the Device        <<02698>>00094000
Information Table (DIT) and the SIO Program area (SIOP),  which<<02698>>00096000
is part of the Interrupt Linkage Table (ILT).  INITIAL will put<<02698>>00098000
each of these items in the area of memory where it belongs. The<<02698>>00100000
linkage area specifies the procedure labels (P-labels) of the  <<02698>>00102000
associated monitor (SIODM), the request initiator (PRPCHDVR),  <<02698>>00104000
the  request completor (PRPCHDVR), and the interrupt handler   <<02698>>00106000
(GIP).                                                         <<02698>>00108000
                                                               <<02698>>00110000
The primary working code of IOPRPN0 is a procedure PRPCHDVR.   <<02698>>00112000
PRPCHDVR is called with six parameters. Two of these           <<02698>>00114000
parameters, BANK and BUFADR, are the absolute buffer address of<<02698>>00116000
the data to be processed. DRTN is the hardware address and     <<02698>>00118000
interrupt information area for the device. The other three,    <<02698>>00120000
DITP, IOQP, and SIOP are pointers to three tables. DITP is a   <<02698>>00122000
pointer to the Device Information Table which contains         <<02698>>00124000
information about its associated printing reader punch unit.   <<02698>>00126000
There is one DIT for unit on the controller and they contain   <<02698>>00128000
information which must be saved between I/O requests to the    <<02698>>00130000
driver. IOQP is a pointer to the Input/Output Queue element.   <<02698>>00132000
IOQ elements contain information relevant to the current       <<02698>>00134000
request. SIOP is a pointer to the first element of the SIO     <<02698>>00136000
program which is actually part of the Interrupt Linkage Table. <<02698>>00138000
PRPCHDVR utilizes the SIO program area as an auxiliary buffer  <<02698>>00140000
for read operation.                                            <<02698>>00142000
                                                               <<02698>>00144000
PRPCHDVR is always called by the I/O device monitor (SIODM)    <<02698>>00146000
and it determines the reason for the call by examining the IOQ <<02698>>00148000
and the DIT.  There are three basic parts of the driver, the   <<02698>>00150000
Common area, the Initiator and the Completor.                  <<02698>>00152000
The operation of each is discussed below.                      <<02698>>00154000
$PAGE                                                          <<02698>>00156000
IOPRPN0 Commom area:                                           <<02698>>00158000
                                                               <<02698>>00160000
This code is at the beginning of the driver and is executed any<<02698>>00162000
time the driver is "called." It performs housekeeping functions<<02698>>00164000
(sets up local variables, checks for abort or timeout          <<02698>>00166000
conditions).                                                   <<02698>>00168000
                                                               <<02698>>00170000
                                                               <<02698>>00172000
IOPRPN0 Initiator:                                             <<02698>>00174000
                                                               <<02698>>00176000
Execution begins here for either a new request or a retry/     <<02698>>00178000
continuation of the last request. If the request is a new one  <<02698>>00180000
counts and buffer offsets are initialized.  The main purpose of<<02698>>00182000
the Initiator is to initiate a card feed for READ, or,         <<02698>>00184000
to output PRINT/PUNCH data then feed a card for WRITE.         <<02698>>00186000
                                                               <<02698>>00188000
                                                               <<02698>>00190000
IOPRPN0 Completor:                                             <<02698>>00192000
                                                               <<02698>>00194000
The Completor section of the driver is entered as a result of  <<02698>>00196000
an external interrupt. The status condition of the last        <<02698>>00198000
interrupt is taken and then an analysis of this status is      <<02698>>00200000
performed and appropriate actions are taken. Finally either the<<02698>>00202000
request is completed and special notation is sent back to the  <<02698>>00204000
user or execution is resumed back at the Initiator to retry or <<02698>>00206000
complete the request. Actual data input will be done by this   <<02698>>00208000
section on read.                                               <<02698>>00210000
                                                               <<02698>>00212000
                                                               <<02698>>00214000
Default settings:                                              <<02698>>00216000
                                                               <<02698>>00218000
  READ:  Hopper#1 --> Stacker#1 --> Full                       <<02698>>00220000
                                                               <<02698>>00222000
  WRITE: Hopper#2 --> Stacker#2 --> Full                       <<02698>>00224000
                                                               <<02698>>00226000
  Spooler Header/Trailer WRITE                                 <<02698>>00228000
        Hopper#2 --> Stacker#2 -->                             <<02698>>00230000
                                                               <<02698>>00232000
  CLOSE (Eject card)                                           <<02698>>00234000
         Waiting Station --> Stacker#1                         <<02698>>00236000
                                                               <<02698>>00238000
                                                               <<02698>>00240000
                                                       /-------<<02698>>00242000
                                                       |Hopper|<<02698>>00244000
                                                       | #1   |<<02698>>00246000
                                                       --------<<02698>>00248000
                      ---------  --------- ---------       V   <<02698>>00250000
    ------------------|Print  |--|Punch  | |Waiting|--------   <<02698>>00252000
    V          V      |Station|  |Station| |Station|       ^   <<02698>>00254000
/--------  /--------  ---------  --------- ---------   /-------<<02698>>00256000
|Stacker|  |Stacker|                                   |Hopper|<<02698>>00258000
| #2    |  | #1    |                                   | #2   |<<02698>>00260000
---------  ---------                                   --------<<02698>>00262000
$PAGE                                                          <<02698>>00264000
                                                               <<02698>>00266000
THE FOLLOWING INFORMATION IS PERTINENT TO CONFIGURING THE      <<02698>>00268000
DEVICE INTO AN HP3000 COMPUTER SYSTEM.                         <<02698>>00270000
                                                               <<02698>>00272000
DEVICE TYPE    = 22                                            <<02698>>00274000
DEVICE SUBTYPE = 0 (80 column card)                            <<02698>>00276000
                 1 (96 column card - Not supported!)           <<02698>>00278000
RECORD WIDTH   = 40 words (80 column card)                     <<02698>>00280000
                 48 words (96 column card - Not supported!)    <<02698>>00282000
                                                                        00284000
                                                                        00286000
                                                                        00288000
DRIVER REQUEST CODES:                                                   00290000
                                                                        00292000
    0 - READ                                                            00294000
      This function reads the "count" data requested by the    <<02698>>00296000
      user from 2894A. P1/P2 parameters are used to specify the<<02698>>00298000
      EOF check level and data mode respectively.              <<02698>>00300000
        P1(13:3) - END OF FILE SPECIFICATION                            00302000
                   0 - RESET EOF AND READ                               00304000
                   1 - CHECK FOR HARDWARE EOF                           00306000
                   2 - CHECK FOR SUPERCOLON EOF                         00308000
                   3 - CHECK FOR COLON EOF                              00310000
       P2.(11:2) - ASCII/BINARY MODE                           <<00597>>00312000
                   0 - ASCII                                   <<00597>>00314000
                   1 - COLUMN BINARY                           <<00597>>00316000
                                                               <<02698>>00318000
    1 - WRITE                                                           00320000
      This function writes the "count" data requested by the   <<02698>>00322000
      user to 2894A. P2 parameter is used to specify the data  <<02698>>00324000
      mode.                                                    <<02698>>00326000
       P2.(10:1) - SYSTEM WRITE                                <<00597>>00328000
                   0 - USER INITIATED WRITE                    <<00597>>00330000
                   1 - SYSTEM INITIATED WRITE  (HEADER CARD)   <<00597>>00332000
          (11:2) - ASCII/BINARY MODE                           <<00597>>00334000
                   0 - ASCII                                            00336000
                   1 - COLUMN BINARY                                    00338000
                                                               <<02698>>00340000
    2 - OPEN FILE                                                       00342000
      This function sets up the initial condition for          <<02698>>00344000
      successive read/write. P2 parameter is used to designate <<02698>>00346000
      the type of access. Driver first initializes             <<02698>>00348000
      the 2894A then selects the default hopper/stacker        <<02698>>00350000
      (hopper #1 & stacker #1).                                <<02698>>00352000
        P2(13:3) - TYPE OF ACCESS                                       00354000
                   0 - OPEN FOR READ ONLY                               00356000
                   1 - OPEN FOR WRITE ONLY                              00358000
                   2 - OPEN FOR READ AND WRITE                          00360000
                                                               <<02698>>00362000
    3 - CLOSE FILE                                                      00364000
      P1/P2 parameters are not used by this function.          <<02698>>00366000
                                                               <<02698>>00368000
    4 - CLOSE DEVICE                                                    00370000
      P1/P2 parameters are not used by this function.          <<02698>>00372000
      This function resets the EOF condition then selects the  <<02698>>00374000
      default hopper/stacker (hopper #1 & stacker #1).         <<02698>>00376000
                                                               <<02698>>00378000
  %34 - CONTROL                                                <<02698>>00380000
        P1(6:1)    0 - SELECT NO INHIBIT FEED ON WRITE                  00382000
                   1 - SELECT INHIBIT FEED ON WRITE                     00384000
          (7:1)    0 - SELECT PUNCH ON WRITE                            00386000
                   1 - SELECT NO PUNCH ON WRITE                         00388000
          (8:1)    0 - SELECT PRINT ON WRITE                            00390000
                   1 - SELECT NO PRINT ON WRITE                         00392000
          (9:1)    0 - SELECT PRINT AND PUNCH SAME DATA                 00394000
                   1 - SELECT PRINT AND PUNCH SEPARATE DATA             00396000
          (10:1)   0 - SELECT PRIMARY STACKER                           00398000
                   1 - SELECT SECONDARY STACKER                         00400000
          (11:1)   0 - SELECT PRIMARY HOPPER                            00402000
                   1 - SELECT SECONDARY HOPPER                          00404000
$PAGE                                                          <<02698>>00406000
STATUS  RETURNS -                                              <<02698>>00408000
                                                               <<02698>>00410000
PENDING (WAITING).                                             <<02698>>00412000
 % 10  - WAITING FOR COMPLETION INTERRUPT.                     <<02698>>00414000
   30  - NOT READY WAIT.                                       <<02698>>00416000
                                                               <<02698>>00418000
SUCCESSFUL (COMPLETION).                                       <<02698>>00420000
   01  - NORMAL COMPLETION.                                    <<02698>>00422000
                                                               <<02698>>00424000
END OF FILE                                                    <<02698>>00426000
 % 12  - PHYSICAL END OF FILE.                                 <<02698>>00428000
   22  - DATA                                                  <<02698>>00430000
   32  - END OF DATA                                           <<02698>>00432000
   42  - HELLO                                                 <<02698>>00434000
   52  - BYE                                                   <<02698>>00436000
   62  - JOB                                                   <<02698>>00438000
   72  - END OF JOB                                            <<02698>>00440000
                                                               <<02698>>00442000
UNUSUAL COMPLETION (DATA MAY NOT TRANSFERRED TO/FROM DEVICE).  <<02698>>00444000
 % 33  - REQUEST ABORTED EXTERNALLY.                           <<02698>>00446000
   63  - SYSTEM POWER FAIL.(BUT NOT NECESSARILY 2894A PFAIL!)  <<02698>>00448000
                                                               <<02698>>00450000
IRRECOVERABLE (CATASTROPHIC TERMINATION).                      <<02698>>00452000
 % 04  - INVALID REQUEST, FUNCTION OR PARAMETER.               <<02698>>00454000
   14  - TRANSFER ERROR.                                       <<02698>>00456000
   24  - I/O TIMED OUT BEFORE COMPLETION.                      <<02698>>00458000
   54  - 2894A UNIT FAILURE.                                   <<02698>>00460000
  124  - NO MESSAGE LINK BUFFERS AVAILABLE.                    <<02698>>00462000
                                                               <<02698>>00464000
$PAGE                                                          <<02698>>00466000
                                                               <<02698>>00468000
                     Device Reference Table (DRT)              <<02698>>00470000
                     ----------------------------              <<02698>>00472000
                                                               <<02698>>00474000
                                                               <<02698>>00476000
There is one DRT for each device controller configured on the  <<02698>>00478000
system.                                                        <<02698>>00480000
                                                               <<02698>>00482000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC <<02698>>00484000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+           <<02698>>00486000
  0|      SIO Program Pointer      (SIOP)          |   DRT0    <<02698>>00488000
   |-----------------------------------------------|           <<02698>>00490000
  1|      Interrupt Handler Program Label          |   DRT1    <<02698>>00492000
   |-----------------------------------------------|           <<02698>>00494000
  2|    Interrupt Linkage Table Pointer (ILTP)     |   DRT2    <<02698>>00496000
   |-----------------------------------------------|           <<02698>>00498000
  3|               RESERVED                        |   DRT3    <<02698>>00500000
   +-----------------------------------------------+           <<02698>>00502000
$PAGE                                                          <<02698>>00504000
                                                               <<02698>>00506000
                Interrupt Linkage Table (ILT)                  <<02698>>00508000
                -----------------------------                  <<02698>>00510000
                                                               <<02698>>00512000
                                                               <<02698>>00514000
There is one ILT for each device controller configured on the  <<02698>>00516000
system.                                                        <<02698>>00518000
                                                               <<02698>>00520000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC <<02698>>00522000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+           <<02698>>00524000
  0|                       0                       |   ICPVA0  <<02698>>00526000
   .                       .                       .           <<02698>>00528000
  5|                       0                       |   ICPVA5  <<02698>>00530000
   |-----------------------------------------------|           <<02698>>00532000
  6|                       0                       |   ISRQL   <<02698>>00534000
   |--+-----------------+--------+-----------------|           <<02698>>00536000
  7|M |     CHANQUE     |        |   DRT number    |   IDRTN   <<02698>>00538000
   |--+-----------------+--------+-----------------|           <<02698>>00540000
%10|   SYSDB relative pointer to SIO Program area  |   ISIOP   <<02698>>00542000
   |-----------------------------------------------|           <<02698>>00544000
%11|                       0                       |   ISTAP   <<02698>>00546000
   |-----------------------------------------------|           <<02698>>00548000
%12| single instruction that is executed to extract|   IUNIT   <<02698>>00550000
   | the device unit number from the status.       |           <<02698>>00552000
   |-----------------------------------------------|           <<02698>>00554000
%13|                       0                       |   ICDP    <<02698>>00556000
   |-----------------------+-----------------------|           <<02698>>00558000
%14|       SIOPSIZE        |        CQUEN          |   IQUEUE  <<02698>>00560000
   |-----------------------+-----------------------|           <<02698>>00562000
%15|                       0                       |   IFLAG   <<02698>>00564000
   |-----------------------------------------------|           <<02698>>00566000
%16|        SYSDB relative DIT pointer             |   IDITP0  <<02698>>00568000
   |-----------------------------------------------|           <<02698>>00570000
%17| Printing Reader Punch SIO program area        |           <<02698>>00572000
   . used as a buffer for read operation.          .           <<02698>>00574000
   | 48 words: Buffer / 5 words: 96 col EOF check  |           <<02698>>00576000
   +-----------------------------------------------+           <<02698>>00578000
                                                               <<02698>>00580000
                                                               <<02698>>00582000
                                                               <<02698>>00584000
IDRTN - CONTAINS CONTROLLER INFORMATION                        <<02698>>00586000
                                                               <<02698>>00588000
  M       - IF THIS BIT IS SET, THE CONTROLLER IS SHARING A    <<02698>>00590000
            SOFTWARE CHANNEL RESOURCE IN ORDER TO LIMIT        <<02698>>00592000
            BANDWIDTH.                                         <<02698>>00594000
  CHANQUE - THE SOFTWARE CHANNEL RESOURCE NUMBER.              <<02698>>00596000
  DRTN    - THE DRT NUMBER FOR A PRINTING READER PUNCH.        <<02698>>00598000
                                                               <<02698>>00600000
                                                               <<02698>>00602000
IQUEUE - RESOURCE QUEUING INFORMATION.                         <<02698>>00604000
                                                               <<02698>>00606000
  SIOPSIZE - (NUMBER OF WORDS + 1)/2 IN THE SIO PROGRAM AREA.  <<02698>>00608000
  CQUEN    - FOR A MULTI-UNIT CONTROLLER THIS FIELD CONTAINS   <<02698>>00610000
             THE SOFTWARE CONTROLLER RESOURCE NUMBER.          <<02698>>00612000
$PAGE                                                          <<02698>>00614000
  2894A DIT -                                                  <<02698>>00616000
                                                               <<02698>>00618000
    0   1   2   3   4  5  6  7  8   9   10 11 12 13 14 15      <<02698>>00620000
  +---+---+---+---+--+--+--+--+---+---+---+--+-----------+     <<02698>>00622000
 0| 0 | 0 |ACT|REQ|0 |0 |SP|0 |IAK| 0 | 0 |  |  MSTATE   |DFLAG<<02698>>00624000
  |---+---+---+---+--+--+--+--+---+---+---+--+-----------|     <<02698>>00626000
 1|               POINTER TO NEXT DIT                    |DLINK<<02698>>00628000
  |------------------------------------------------------|     <<02698>>00630000
 2|             POINTER TO ACTIVE IOQ OR ZERO            |DIOQP<<02698>>00632000
  |-------+-------------------+--------------------------|     <<02698>>00634000
 3|   0   |         0         |  LOGICAL DEVICE NUMBER   |DLDEV<<02698>>00636000
  |-------+-------------------+--------------------------|     <<02698>>00638000
 4|             DRIVER LINKAGE TABLE POINTER             |DDLTP<<02698>>00640000
  |------------------------------------------------------|     <<02698>>00642000
 5|             INTERRUPT LINKAGE TABLE POINTER          |DILTP<<02698>>00644000
  |------------------------------------------------------|     <<02698>>00646000
 6|             CONTROLLER INTERRUPT STATUS              |DSTAT<<02698>>00648000
  |------------------------------------------------------|     <<02698>>00650000
 7|                 ERROR LOGGING INFORMATION            |DSERR<<02698>>00652000
  |---+--------------------------------------------------|     <<02698>>00654000
 8| T |         TIMEOUT INDICATION IN BIT 0              |DTIME<<02698>>00656000
  |---+---+---+---+--+--+--+--+---+---+---+--+-----+--+--|     <<02698>>00658000
 9|CBF|SC |SS |HS |IF|EO|IB|PR|PN |SPD|EC |SM|MODE |CO|TR|DACCP<<02698>>00660000
  |---+---+---+---+--+--+--+--+---+---+---+--+-----+--+--|     <<02698>>00662000
10|               TIMER REQUEST LIST INDEX               |DTRLX<<02698>>00664000
  +------------------------------------------------------+     <<02698>>00666000
                                                               <<02698>>00668000
   DFLAG - DEVICE RELATIVE FLAGS.                              <<02698>>00670000
         ACT   ACTIVE BIT. 1 IMPLIES A MONITOR CURRENTLY       <<02698>>00672000
               SERVICING THIS DEVICE.                          <<02698>>00674000
         REQ   REQUEST BIT. 1 IMPLIES SERVICE REQUESTED        <<02698>>00676000
               WHILE MONITOR IS ACTIVE.                        <<02698>>00678000
         SP    SIO PREEMPTION. IF SET THEN A PREEMPTIVE        <<02698>>00680000
               REQUEST HAS BEEN QUEUED FOR THIS DEVICE.        <<02698>>00682000
               PREEMPT CODE IS SET IN IOQ ELEMENT.             <<02698>>00684000
         IAK   IF SET, AN INTERRUPT OR RESPONSE HAS OCCURED.   <<02698>>00686000
$PAGE                                                          <<02698>>00688000
         MSTATE  CURRENT DRIVER STATE AS DEFINED BY THE MONITOR<<02698>>00690000
                 ALLOWABLE STATES ARE:                         <<02698>>00692000
              0 - START NEW REQUEST                            <<02698>>00694000
              1 - NOT USED(BUT RESERVED)                       <<02698>>00696000
              2 - CALL DRIVER INITIATOR                        <<02698>>00698000
              3 - CALL DRIVER COMPLETOR                        <<02698>>00700000
              4 - UNUSED(BUT RESERVED)                         <<02698>>00702000
              5 - COMPLETE REQUEST..PERHAPS RETURN TO USER.    <<02698>>00704000
              6 - UNEXPECTED INTERRUPT OCCURRED. (DEVREC)      <<02698>>00706000
              7 - START OPERATOR INTERVENTION WAIT. THEN %10.  <<02698>>00708000
            %10 - WAITING (ON OPERATOR). RESTART AT 0.         <<02698>>00710000
             11 - WAITING (DATA MAKEPRESENT/FREEZING) THEN 2.  <<02698>>00712000
             12 - WAITING (INITIATOR CODE MAKEPRESENT/FREEZE)  <<02698>>00714000
             13 - WAITING (FOR COMPLETION INTERRUPT)           <<02698>>00716000
             14 - WAITING (FOR DEVICE CONTROLLER AVAILABILITY) <<02698>>00718000
             15 - UNUSED(BUT RESERVED)                         <<02698>>00720000
             16 - WAITING (INITIATOR CODE MAKEPRESENT)         <<02698>>00722000
             17 - WAITING (COMPLETOR CODE MAKEPRESENT)         <<02698>>00724000
                                                               <<02698>>00726000
   DLDEV - LOGICAL DEVICE NUMBER.                              <<02698>>00728000
                                                               <<02698>>00730000
   DACCP - ACCESS CONTROL PARAMETER.                           <<02698>>00732000
                                                               <<02698>>00734000
    .CBF - Clear Buffer Full. (Currently not used)             <<02698>>00736000
           0 - The next card leaving the hopper will be read   <<02698>>00738000
               by the device.                                  <<02698>>00740000
           1 - The read buffer will be cleared when next card  <<02698>>00742000
               leaves the hopper.                              <<02698>>00744000
                                                               <<02698>>00746000
    .SC  - Stacker Control.                                    <<02698>>00748000
           0 - All cards are stacked in right stacker(#1) until<<02698>>00750000
               device goes not ready.                          <<02698>>00752000
           1 - Cards are stacked per SS.                       <<02698>>00754000
                                                               <<02698>>00756000
    .SS  - Stacker Select.                                     <<02698>>00758000
           0 - Right stacker (stacker #1)                      <<02698>>00760000
           1 - Left stacker (stacker #2)                       <<02698>>00762000
                                                               <<02698>>00764000
    .HS  - Hopper Select.                                      <<02698>>00766000
           0 - Pick from rear hopper (primary hopper)          <<02698>>00768000
           1 - Pick from front hopper(secondary hopper)        <<02698>>00770000
                                                               <<02698>>00772000
    .IF  - Inhibit Input Feed. (Currently not used)            <<02698>>00774000
           1 - Inhibit picking a card when card currently      <<02698>>00776000
               in wait station is eject to a stacker.          <<02698>>00778000
                                                               <<02698>>00780000
    .EO  - End Of File has been detected on a read operation.  <<02698>>00782000
                                                               <<02698>>00784000
    .IB  - Internal Buffer flag.                               <<02698>>00786000
           1 - An internal buffer is being used. The buffer    <<02698>>00788000
               is the SIO program area in the ILT.             <<02698>>00790000
                                                               <<02698>>00792000
    .PR  - No Print on the next card to pass the print station <<02698>>00794000
                                                               <<02698>>00796000
    .PN  - No Punch on the next card to pass the punch station.<<02698>>00798000
                                                               <<02698>>00800000
    .SPD - Separate Print Data.                                <<02698>>00802000
           Print data other than that being punched on the     <<02698>>00804000
           next card to pass the punch and print station.      <<02698>>00806000
                                                               <<02698>>00808000
    .EC  - Eject Card - Eject on a write after read. (Not used)<<02698>>00810000
           Used when reading one card then punching one card   <<02698>>00812000
           (last card was read).                               <<02698>>00814000
                                                               <<02698>>00816000
    .SM  - Stacker Mode:Saved stacker mode on last read.       <<02698>>00818000
           (Currently Not used)                                <<02698>>00820000
                                                               <<02698>>00822000
    .MODE- Access Mode (Currently not used)                    <<02698>>00824000
           0 - File opened for read only                       <<02698>>00826000
           1 - File opened for write only                      <<02698>>00828000
           2 - File opened for read write                      <<02698>>00830000
                                                               <<02698>>00832000
    .CO  - COntrol.                                            <<02698>>00834000
           0 - No control has occured for this devide          <<02698>>00836000
               (Use default settings)                          <<02698>>00838000
           1 - Control is in effect                            <<02698>>00840000
               (Use settings in this DIT word)                 <<02698>>00842000
                                                               <<02698>>00844000
    .TR  - Timer Request.                                      <<02698>>00846000
           Timer request is pending. Index is in DTRLX.        <<02698>>00848000
                                                               <<00597>>00850000
DEFINITION OF DIT WORD 9(DACESS AND DACCP)                              00852000
      BITS (0:5) ARE HOPPER/STACKER RELATED. THEIR MEANING FOLLOWS      00854000
                                                                        00856000
           (0:1) =0 80 COLS OF DATA FROM NEXT CARD LEAVING THE          00858000
                    HOPPER WILL BE STORED IN THE MEMORY OF DEVICE       00860000
                 =1 DATA IN MEMORY OF DEVICE IS CLEARED WHEN THE        00862000
                    NEXT CARD PASSES THE READ STATION.                  00864000
           (1:1) =0 STACKER CONTROL. CARDS ARE DISCHARGED TO THE        00866000
                    STACKER #1(RIGHT HAND-STACKER).                     00868000
                 =1 STACKER CONTROL. CARDS ARE DISCHARGED TO THE        00870000
                    STACKER AS SPECIFIED BY BIT (2:1) BELOW.            00872000
           (2:1)    SELECT STACKER BIT.  THIS BIT IS EFFECTIVE FOR      00874000
                    STACKING WHEN BIT (1:1) IS A 1.  THE STACKER        00876000
                    SELECTED IS AS FOLLOWS:                             00878000
                 =0 SELECT STACKER #1(RIGHT HAND-STACKER).              00880000
                 =1 SELECT STACKER #2(LEFT HAND-STACKER).               00882000
           (3:1) =0 HOPPER SELECT.  WHEN 0, SELECT FROM PRIMARY HOPPER  00884000
                    (HOPPER#1, ALSO KNOWN AS THE REAR HOPPER).          00886000
                 =1 HOPPER SELECT. WHEN 1, SELECT FROM SECONDARY        00888000
                    HOPPER.(HOPPER#2, OR FRONT HOPPER).                 00890000
           (4:1) =0 INHIBIT INPUT FEED. WHEN 0, ALLOWS A CARD TO BE     00892000
                    FED FROM THE HOPPER TO THE WAIT STATION WHEN THE    00894000
                    CURRENT CARD IN WAIT STATION IS SENT TO STACKER     00896000
                 =1 INHIBIT INPUT FEED. WHEN 1, NO CARD CAN BE FED      00898000
                    FROM EITHER HOPPER TO THE WAIT STATION. HOWEVER,    00900000
                    A CARD CURRENTLY IN THE WAIT STATION MAY BE FED     00902000
                    TO A STACKER.                                       00904000
            (5:1)=0 DRIVER INTERNAL FLAG. WHEN 0,NO EOF HAS BEEN        00906000
                    DETECTED.                                           00908000
                 =1 AN EOF HAS BEEN DETECTED ON A READ OPERATION.       00910000
            (6:1)=0 INTERNAL BUFFER FLAG.  WHEN 0, NO INTERNAL          00912000
                    BUFFER IS BEING USED.                               00914000
                 =1 AN INTERNAL AUXILLARY BUFFER(AT END OF SIO AREA     00916000
                    IS BEING USED.                                      00918000
            (7:3)   SEE PRINT/PUNCH OPTIONS IN DRIVER REQUEST CODES     00920000
                    UNDER (5-CONTROL, P1.(7:3)).                        00922000
           (10:4) - UNUSED.                                    <<00597>>00924000
           (14:1)=0 NO FCONTROL HAS OCCURED FOR THIS FILE. USE          00926000
                    DEFAULT SETTINGS.                                   00928000
                 =1 FCONTROL HAS OCCURRED. USE SETTINGS IN THIS         00930000
                    DIT WORD TO INDICATE HOW TO OPERATE DEVICE.         00932000
           (15:1)=0 NO TIMER REQUEST IS PENDING(SEE DIT WORD %12).      00934000
                 =1 A TIMER REQUEST INDEX IS IN WORD %12 OF DIT AND     00936000
                    IS CURRENT(AN ABORTTIMEREQ MUST BE DONE ON INTRPT)  00938000
$PAGE                                                          <<02698>>00940000
                                                               <<02698>>00942000
     THE DRIVER IS CONCERNED WITH THE I/O STATUS.              <<02698>>00944000
THE I/O STATUS CONTAINS INFO ABOUT THE ACTUAL 2894A HARDWARE   <<02698>>00946000
AND ITS CURRENT STATE.  THE DRIVER READS I/O STATUS INTO THE   <<02698>>00948000
DIT STATUS AREA.                                               <<02698>>00950000
THE FORMAT OF THE STATUS IS SHOWN BELOW.                       <<02698>>00952000
EACH WORD AND BIT IN THE TABLE IS DEFINED AS FOLLOWS:          <<02698>>00954000
                                                               <<02698>>00956000
                                                               <<02698>>00958000
I/O STATUS WORDS                                               <<02698>>00960000
                                                               <<02698>>00962000
Interrupt status word                                          <<02698>>00964000
                                                               <<02698>>00966000
  0   1   2   3 4   5   6   7   8   9   10  11  12  13  14  15 <<02698>>00968000
+---+---+---+-----+---+---+---+---+---+---+---+---+---+---+---+<<02698>>00970000
| 1 |RWK|INP| SEQ |DFS|IDS| 0 |RCI|RIN|NRI|DTI|IBI|ISI|   |TOI|<<02698>>00972000
+---+---+---+-----+---+---+---+---+---+---+---+---+---+---+---+<<02698>>00974000
                                                               <<02698>>00976000
     RWK - RIO or WIO OK.                                      <<02698>>00978000
                                                               <<02698>>00980000
     INP - Interrupt Pending.                                  <<02698>>00982000
                                                               <<02698>>00984000
     SEQ - Sequence counter.                                   <<02698>>00986000
                                                               <<02698>>00988000
           Bits  Counter  Meaning                              <<02698>>00990000
           3  4  State                                         <<02698>>00992000
           ----  -------  -------------------                  <<02698>>00994000
           0  0     0     No data transfer in progress         <<02698>>00996000
           1  0     1     DEV CMD sent to initiate data xfer   <<02698>>00998000
           1  1     2     DEV FLAG received and xfer completed <<02698>>01000000
           0  1     3     Never attained except passing state  <<02698>>01002000
                                                               <<02698>>01004000
     DFS - Device Flag Status                                  <<02698>>01006000
                                                               <<02698>>01008000
     IDS - Interrupt Status = 0.                               <<02698>>01010000
                                                               <<02698>>01012000
     RCI - Ready for Command Interrupt.                        <<02698>>01014000
                                                               <<02698>>01016000
     RIN - Ready INterrupt.                                    <<02698>>01018000
                                                               <<02698>>01020000
     NRI - Not Ready Interrupt.                                <<02698>>01022000
                                                               <<02698>>01024000
     DTI - Data Transfer Interrupt.                            <<02698>>01026000
                                                               <<02698>>01028000
     IBI - Input Buffer full Interrupt.                        <<02698>>01030000
                                                               <<02698>>01032000
     ISI - I/O System Interrupt.                               <<02698>>01034000
                                                               <<02698>>01036000
     TOI - Time Out Interrupt.                                 <<02698>>01038000
$PAGE                                                          <<02698>>01040000
Device status word                                             <<02698>>01042000
                                                               <<02698>>01044000
     0   1   2   3   4   5   6   7   8   9   10  11  12    15  <<02698>>01046000
   +---+---+---+-------+---+---+---+---+-------+---+---+-----+ <<02698>>01048000
   | 1 |RWK|INP|  SEQ  |DFS|IDS| 0 |RFC|  REA  |CWS|SHE|     | <<02698>>01050000
   +---+---+---+-------+---+---+---+---+-------+---+---+-----+ <<02698>>01052000
                                                               <<02698>>01054000
     IDS - Device Status = 1.                                  <<02698>>01056000
                                                               <<02698>>01058000
     RFC - Ready For Command.                                  <<02698>>01060000
                                                               <<02698>>01062000
     REA - Ready.                                              <<02698>>01064000
           Both bits are on  - READY and ON-LINE               <<02698>>01066000
           Bothe bits are off - Not READY or OFF-LINE          <<02698>>01068000
                                                               <<02698>>01070000
     CWS - Card in Wait Station.                               <<02698>>01072000
                                                               <<02698>>01074000
     SHE - Secondary Hopper Empty.                             <<02698>>01076000
                                                               <<02698>>01078000
                                                               <<02698>>01080000
6-Bit status word (Not stored in DIT)                          <<02698>>01082000
                                                               <<02698>>01084000
       0   1   2   3   4   5   6   7   8                    15 <<02698>>01086000
     +---+-------+---+---+---+---+---+------------------------+<<02698>>01088000
     |IBF|       |RCH|ICH|OCH|PHE|STF|                        |<<02698>>01090000
     +---+-------+---+---+---+---+---+------------------------+<<02698>>01092000
                                                               <<02698>>01094000
     IBF - Input Buffer Full.                                  <<02698>>01096000
                                                               <<02698>>01098000
     RCH - Read CHeck.                                         <<02698>>01100000
                                                               <<02698>>01102000
     ICH - Input CHeck.                                        <<02698>>01104000
                                                               <<02698>>01106000
     OCH - Output CHeck.                                       <<02698>>01108000
                                                               <<02698>>01110000
     PHE - Primary Hopper Empty.                               <<02698>>01112000
                                                               <<02698>>01114000
     STF - STacker Full.                                       <<02698>>01116000
$PAGE                                                          <<02698>>01118000
    2894A IOQ -                                                <<02698>>01120000
                                                               <<02698>>01122000
                                                               <<02698>>01124000
         0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15       <<02698>>01126000
        +--+-----+--+--+--+--+--+--+--+--+--+-----+--+--+      <<02698>>01128000
   IOQ0 |AB|     |SB|WA|BL|C |FR|ME|PR|SF|PF|PRMPT|  |MD| QFLAG<<02698>>01130000
        |--+-----+--+--+--+--+--+--+--+--+--+-----+--+--|      <<02698>>01132000
   IOQ1 |       IOQ POINTER TO NEXT NEW REQUEST         | QLINK<<02698>>01134000
        |-----------------------+-----------------------|      <<02698>>01136000
   IOQ2 |                       | LOGICAL DEVICE NUMBER | QLDEV<<02698>>01138000
        |-----------------------+-----------------------|      <<02698>>01140000
   IOQ3 |          MISCELLANEOUS PARAMETER              | QMISC<<02698>>01142000
        |--+--------------------------------------------|      <<02698>>01144000
   IOQ4 |S |               DST NUMBER                   | QDSTN<<02698>>01146000
        |--+--------------------------------------------|      <<02698>>01148000
   IOQ5 |        TARGET DATA BUFFER ADDRESS             | QADDR<<02698>>01150000
        |-----------------------+-----------------------|      <<02698>>01152000
   IOQ6 |                       |     FUNCTION CODE     | QFUNC<<02698>>01154000
        |-----------------------+-----------------------|      <<02698>>01156000
   IOQ7 |      WORD (+) OR BYTE (-) COUNT               | QWBCT<<02698>>01158000
        |-----------------------------------------------|      <<02698>>01160000
   I0Q8 |              PARAMETER 1                      | QPAR1<<02698>>01162000
        |-----------------------------------------------|      <<02698>>01164000
   I0Q9 |              PARAMETER 2                      | QPAR2<<02698>>01166000
        |-----------------------+--------------+--------|      <<02698>>01168000
   IOQ1 |     PCB NUMBER        |   QUALIFIER  |RSTATUS | QSTAT<<02698>>01170000
        +-----------------------+--------------+--------+      <<02698>>01172000
                                                               <<02698>>01174000
   QFLAG -                                                     <<02698>>01176000
        * AB      REQUEST ABORTED EXTERNALLY.                  <<02698>>01178000
          DI      DIAGNOSTIC FUNCTION REQUESTED.               <<02698>>01180000
          SB      REQUEST IS USING SYSTEM BUFFERS.             <<02698>>01182000
          WA      WAKE CALLER ON COMPLETION OF REQUEST.        <<02698>>01184000
          BL      BLOCKED IO. CALLER IS WAITING COMPLETION.    <<02698>>01186000
          C       REQUEST HAS BEEN COMPLETED & USER AWAKENED.  <<02698>>01188000
          FR      DATA SEG. IS PRESENT IN CORE AND FROZEN.     <<02698>>01190000
          ME      MAM ERROR ON DATA SEGMENT MAKE PRESENT.      <<02698>>01192000
          PR      THIS REQUEST STARTED-BUT PREEMPTED BY MAM.   <<02698>>01194000
          SF      SIO FAILURE IN GIP.                          <<02698>>01196000
        * PF      THE IO IS BEING ABORTED DUE TO POWER FAIL.   <<02698>>01198000
          PRMPT   PREEMPTIVE TYPE CODE: 1 - SOFT, 2 - HARD.    <<02698>>01200000
          MD      A MESSAGE REQUEST REPLY HAS COMPLETED.       <<02698>>01202000
                                                               <<02698>>01204000
        * denotes the information which 2894A driver uses.     <<02698>>01206000
$PAGE                                                          <<02698>>01208000
   QMISC -                                                     <<02698>>01210000
                                                               <<02698>>01212000
         0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15       <<02698>>01214000
        +-----------+-----------------------------------+      <<02698>>01216000
   IOQ3 |  WSTATE   |           UNUSED                  | QMISC<<02698>>01218000
        +-----------+-----------------------------------+      <<02698>>01220000
                                                               <<02698>>01222000
   WSTATE - Waiting state                                      <<02698>>01224000
                                                               <<02698>>01226000
                                                                        01228000
IOQ(QMISC) WORD DEFINITION FOLLOWS NEXT:                                01230000
           (0:1) =0 NULL. NO FUNCTION                                   01232000
                 =1 I/O INITIATED,WAITING FOR COMPLETION INTERRUPT      01234000
           (1:1) =0 NULL. NO FUNCTION                                   01236000
                 =1 WAITING ON A "NOT READY" INTERRUPT TO BRING         01238000
                    DEVICE BACK ONLINE.                                 01240000
           (2:1) =0 CURRENT OPERATION IS NOT A WRITE OPERATION.         01242000
                 =1 CURRENT OPERATION IS A WRITE OPERATION.             01244000
           (3:1) =0 NORMAL.                                    <<00597>>01246000
                 =1 WAITING FOR THE OPERATOR TO CLEAR THE      <<00597>>01248000
                    CARD PATH AFTER A READ CHECK OR INVALID    <<00597>>01250000
                    CODE.                                      <<00597>>01252000
           (4:12)   NOT USED AT PRESENT.                       <<00597>>01254000
$PAGE                                                          <<02698>>01256000
Special situations.                                            <<02698>>01258000
                                                               <<02698>>01260000
Auxilialy buffer.                                              <<02698>>01262000
                                                               <<02698>>01264000
  We have to read 80/96 columns data even if there is only less<<02698>>01266000
80/96 columns data required. For this reason, there is an      <<02698>>01268000
auxiliary buffer to hold the original contents of card columns <<02698>>01270000
in which at first the card contents will be read.              <<02698>>01272000
However, if the user's buffer is large enough to hold 80/96    <<02698>>01274000
columns data, the auxilialy buffer will not be used. The       <<02698>>01276000
exception is that when a :EOF: was read, we have to return EOF <<02698>>01278000
condition right away, therefore, the last card                 <<02698>>01280000
(which caused EOF condition) will be saved in auxiliary buffer.<<02698>>01282000
                                                               <<02698>>01284000
Buffer length.                                                 <<02698>>01286000
                                                               <<02698>>01288000
  If the buffer length is specified by negative number the     <<02698>>01290000
  following condition will occur if it was an odd number.      <<02698>>01292000
  ASCII mode : "count" columns will be read but will be        <<02698>>01294000
               truncated if auxiliary buffer in use.           <<02698>>01296000
  BINARY mode: truncated "count" columns will be read.         <<02698>>01298000
                                                               <<02698>>01300000
Column binary.                                                 <<02698>>01302000
                                                               <<02698>>01304000
  Only read first 40/48 columns.                               <<02698>>01306000
                                                               <<02698>>01308000
                                                               <<02698>>01310000
                                                               <<02698>>01312000
Card Jams.                                                     <<02698>>01314000
                                                               <<02698>>01316000
  If the last card in hopper causes a card jam, it will be     <<02698>>01318000
  damaged and will not be re-produced.                         <<02698>>01320000
                                                               <<02698>>01322000
                                                               <<02698>>01324000
                                                               <<02698>>01326000
                                                               <<02698>>01328000
                                                               <<02698>>01330000
;  << End of comments >>                                       <<02698>>01332000
$PAGE                                                          <<02698>>01334000
                                                                        01336000
                                                                        01338000
                                                                        01340000
BEGIN                                                                   01342000
    EQUATE                                                              01344000
         ASCII        = 0,       <<MODE>>                               01346000
         COLBIN       = 1,       <<MODE>>                               01348000
         QDSTN        = 4,       <<INDEX INTO IOQ-DST#>>                01350000
         QFUNC        = 6,       <<INDEX INTO IOQ-FUNCT CODE>>          01352000
         QPAR1        = 8,       <<INDEX INTO IOQ-PARAM #1>>            01354000
         QPAR2        = 9,       <<INDEX INTO IOQ-PARAM #2>>            01356000
         QMISC        = 3,       <<INDEX INTO IOQ-INTERNAL FLAGS>>      01358000
         QWBCNT       = 7,       <<INDEX INTO IOQ-WORD/BYTE CNT>>       01360000
         QFLAG        = 0,       <<INDEX INTO IOQ-FLAGS>>               01362000
         QLDEV        = 2,       <<INDEX INTO IOQ-LOG DEV#>>            01364000
         QSTAT        =10,       <<INDEX INTO IOQ-STATUS>>              01366000
         DFLAG        = 0,       <<INDEX INTO DIT-FLAGS>>               01368000
         DLDEV        = 3,       <<INDEX INTO DIT-LOG DEV#>>            01370000
         DSTAT        = 6,       <<INDEX INTO DIT-STATUS>>              01372000
         DACCESS      = 9,       <<INDEX INTO DIT-ACCESS TYPE>>         01374000
         DTRLX        = 10,      <<INDEX INTO DIT-TIMER>>               01376000
         DTIMER       = 8,       <<INDEX INTO DIT-TICK>>                01378000
         ICNTRL       = 7,       <<INDEX IN ILT OF DRT>>       <<01300>>01380000
         READ         = 0,       <<FUNCTION-READ>>                      01382000
         WRITE        = 1,       <<FUNCTION-WRITE>>                     01384000
         OPEN         = 2,       <<FUNCTION-FILE OPEN>>                 01386000
         CLOSE        = 3,       <<FUNCTION-FILE CLOSE>>                01388000
         DEVCLOSE     = 4,       <<FUNCTION-DEVICE CLOSE>>              01390000
         CONTROL      = 28,      <<FUNCTION-CONTROL>>                   01392000
         COMPLETION   = 3,       <<MONITOR STATE-COMPLETION>>           01394000
         ENDIO        = 5,       <<MONITOR STATE-END OF REQUEST>>       01396000
         REINIT       = %7,      <<MONITOR STATE-REINIT ON INTRP>>      01398000
         UNITFAIL     = %54,     <<STATUS RETURN=UNIT FAILURE>>         01400000
         INVALID      = %40,     <<STATUS RETURN-INVALID FUNC>>         01402000
         PUNCHERR     = %203,     <<STATUS RETURN-WR NO CARD IN WAIT>>  01404000
         MACC         = %123,    <<STATUS RETURN-MULTIPLE ACCESS>>      01406000
         ABORTED      = %33,     <<STATUS RETURN-I/0 ABORTED>>          01408000
         PFABORT      = %63,     <<STATUS RETURN-PWR FAIL ABORT>>       01410000
         CLEAR        = %040000, <<CLEAR ALL INTERRUPTS>>               01412000
         MSTRCLEAR    = %100000, <<MASTER CLEAR>>                       01414000
         SYSDB        = %1000,   <<SYSTEM DB>>                          01416000
         WNEW         = %7,      <<REINITIATE ON INTERRUPT>>            01418000
         CALLCMPLT    = %13,     <<CALL CMPLTR ON INTRPT>>              01420000
         BADCNTRL     = %3,      <<INVALID CONTROL FUNCTION>>           01422000
         BADFUNC      = %5,      <<INVALID FUNCTION CODE>>              01424000
         XFERERR      = %14,     <<TRANSFERR ERROR-STATUS>>             01426000
         SYSLPDT      = %10,     <<LPDT POINTER INDEX>>                 01428000
         CRPDITSZ     = 11,       <<DIT SIZE FOR CD/RDR/PCH>>           01430000
         SIOSIZE      = 54,      <<SIO PGM SIZE-USED AS BUFFER>>        01432000
         SIOSIZED2    = SIOSIZE/2,  <<SIOSIZE/2 FOR INITIAL>>  <<01300>>01434000
         CIOFEED      = %040010; <<CIO-FEED CARD>>                      01436000
                                                                        01438000
                                                                        01440000
  DEFINE                                                                01442000
       DISABLE        = ASSEMBLE(SED 0)#,                               01444000
       ENABLE         = ASSEMBLE(SED 1)#,                               01446000
       PFAILB         = (11:1)#,                                        01448000
       IAK            = (8:1)#,                                         01450000
       EOF            = (8:2)#,   <<EOF FIELD IN LPDT>>                 01452000
       DRT            = (8:8)#,   <<DRT FIELD IN ILT >>        <<01300>>01454000
       DEOF           =DITP(DACCESS).(12:1)#,                  <<00597>>01456000
       STATUS         =IOQP(QSTAT).(8:8)#,                              01458000
       DACCP          =DITP(DACCESS)#,                                  01460000
       AXBFLG         =DITP(DACCESS).(6:1)#,                            01462000
       SBUF           =IOQP(QFLAG).(3:1)#,                              01464000
       QMISCP         =IOQP(QMISC)#;                                    01466000
                                                                        01468000
                                                                        01470000
                                                                        01472000
                                                                        01474000
<< DIT DEFINITION AND DRIVER LINKAGE AREA >>                            01476000
                                                                        01478000
BYTE ARRAY CONFIG(0:7)=DB:=                                             01480000
CRPDITSZ,1,0,0,0,0,SIOSIZED2,0;                                <<01300>>01482000
                                                                        01484000
ARRAY DITAB(1:CRPDITSZ)=DB:=                                            01486000
0,0,0,0,0,0,0,0,0,%40000,0;                                    <<01.02>>01488000
                                                                        01490000
ARRAY SIOA(1:SIOSIZE)=DB:=0;                                            01492000
                                                                        01494000
                                                                        01496000
PROCEDURE DELAY(TIME);                                                  01498000
  VALUE TIME;                                                           01500000
  DOUBLE TIME;                                                          01502000
  OPTION EXTERNAL;                                                      01504000
                                                                        01506000
                                                                        01508000
PROCEDURE EOFCHECK(IOQP,BUFR,CNT,HARDCHK);                              01510000
  VALUE IOQP,BUFR,CNT,HARDCHK;                                          01512000
  DOUBLE BUFR;                                                          01514000
  POINTER IOQP;                                                         01516000
  INTEGER CNT,HARDCHK;                                                  01518000
  OPTION EXTERNAL;                                                      01520000
                                                                        01522000
PROCEDURE GIP;                                                          01524000
  OPTION EXTERNAL;                                                      01526000
                                                                        01528000
PROCEDURE HELP;                                                         01530000
  OPTION EXTERNAL;                                                      01532000
                                                                        01534000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,   <<0U.EB>>01536000
   DEST,REPLY,OFFSET,DITP,IOTYPE);                             <<0U.EB>>01538000
VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,DITP,  <<0U.EB>>01540000
   IOTYPE;                                                     <<0U.EB>>01542000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,     <<0U.EB>>01544000
   IOTYPE;                                                     <<0U.EB>>01546000
INTEGER POINTER DITP;                                          <<0U.EB>>01548000
OPTION VARIABLE,EXTERNAL;                                      <<0U.EB>>01550000
                                                                        01552000
                                                                        01554000
PROCEDURE SIODM(DITP,FLAGS);                                            01556000
  VALUE DITP,FLAGS;                                                     01558000
  LOGICAL FLAGS;                                                        01560000
  POINTER DITP;                                                         01562000
  OPTION EXTERNAL;                                                      01564000
                                                                        01566000
                                                                        01568000
PROCEDURE MASTERCLEAR(DITP);                                            01570000
  ARRAY DITP;                                                           01572000
  OPTION EXTERNAL;                                                      01574000
                                                                        01576000
                                                                        01578000
PROCEDURE IOFAILURE(DRTN,DITP);                                         01580000
  VALUE DRTN;                                                           01582000
  INTEGER DRTN;                                                         01584000
  ARRAY DITP;                                                           01586000
  OPTION EXTERNAL;                                                      01588000
                                                                        01590000
                                                                        01592000
                                                                        01594000
INTEGER PROCEDURE TIMEREQ(CODE,REQ,TIME);                               01596000
  VALUE CODE,REQ,TIME;                                                  01598000
  INTEGER CODE,REQ;                                                     01600000
  DOUBLE TIME;                                                          01602000
  OPTION EXTERNAL;                                                      01604000
                                                                        01606000
                                                                        01608000
PROCEDURE ABORTTIMEREQ(TRLX);                                           01610000
  VALUE TRLX;                                                           01612000
  INTEGER TRLX;                                                         01614000
     OPTION EXTERNAL;                                                   01616000
                                                                        01618000
                                                                        01620000
PROCEDURE INITZ(IDITP);                                                 01622000
   INTEGER ARRAY IDITP;                                                 01624000
   BEGIN                                                                01626000
     POINTER PS0=S-0;                                                   01628000
     MASTERCLEAR(IDITP);                                                01630000
     TOS:=IDITP(5);     <<GET DRT NIMBER>>                              01632000
     TOS:=PS0(ICNTRL).DRT;                                     <<01300>>01634000
     TOS:=2;          <<ENABLE INTERRUPTS>>                             01636000
     ASSEMBLE (CIO 1);                                                  01638000
     IF <> THEN ASSEMBLE(DEL);                                          01640000
   END;                                                                 01642000
$PAGE                                                          <<02698>>01644000
INTEGER PROCEDURE PRPCHDVR(IOQP,DITP,BANK,BUFADR,SIOP,DRTN);            01646000
  VALUE IOQP,DITP,BANK,BUFADR,SIOP,DRTN;                                01648000
  INTEGER BANK,BUFADR,DRTN;                                             01650000
  INTEGER POINTER IOQP,DITP,SIOP;                                       01652000
                                                                        01654000
                                                                        01656000
                                                                        01658000
  BEGIN                                                                 01660000
                                                                        01662000
    DOUBLE UBUF=BANK;                                                   01664000
    DOUBLE ABUF;                                                        01666000
    INTEGER MSTATE=PRPCHDVR,                                            01668000
            S0=S-0,                                                     01670000
            S1=S-1,                                                     01672000
            S2=S-2,                                                     01674000
            S3=S-3,                                                     01676000
            S4=S-4,                                                     01678000
            S5=S-5,                                                     01680000
            X=X,                                                        01682000
            FUNC,                                                       01684000
            P1,                                                         01686000
            P2,                                                         01688000
            MODE,                                                       01690000
            I,J,K,L,M,N,                                                01692000
            INDEX,                                                      01694000
            MAXBUFSIZE,                                                 01696000
            BNKNO,                                                      01698000
            TEMP,                                                       01700000
            FCNT,                                                       01702000
            HCNT,                                                       01704000
            WBCNT;                                                      01706000
    DEFINE LDEV   = IOQP(QLDEV).(8:8)#;                                 01708000
    DEFINE SIOPBASE=@SIOP+SYSDB#;                                       01710000
                                                                        01712000
                                                                        01714000
                                                                        01716000
$PAGE "ASCII TO HOLLERITH CONVERSION TABLE"                    <<02698>>01718000
    INTEGER ARRAY AHOLL(0:255)=PB:=                                     01720000
<<         0     1     2     3     4     5     6     7  >>              01722000
<<00>> %5403,%4401,%4201,%4101,%0005,%1023,%1013,%1007,                 01724000
<<01>> %2011,%4021,%1021,%4103,%4043,%4023,%4013,%4007,                 01726000
<<02>> %6403,%2401,%2201,%2101,%0043,%0023,%0201,%1011,                 01728000
<<03>> %2003,%2403,%0007,%1005,%2043,%2023,%2013,%2007,                 01730000
<<04>> %0000,%4006,%0006,%0102,%2102,%1042,%4000,%0022,                 01732000
<<05>> %4022,%2022,%2042,%4012,%1102,%2000,%4102,%1400,                 01734000
<<06>> %1000,%0400,%0200,%0100,%0040,%0020,%0010,%0004,                 01736000
<<07>> %0002,%0001,%0202,%2012,%4042,%0012,%1012,%1006,                 01738000
<<10>> %0042,%4400,%4200,%4100,%4040,%4020,%4010,%4004,                 01740000
<<11>> %4002,%4001,%2400,%2200,%2100,%2040,%2020,%2010,                 01742000
<<12>> %2004,%2002,%2001,%1200,%1100,%1040,%1020,%1010,                 01744000
<<13>> %1004,%1002,%1001,%4202,%1202,%2202,%2006,%1022,                 01746000
<<14>> %0402,%5400,%5200,%5100,%5040,%5020,%5010,%5004,                 01748000
<<15>> %5002,%5001,%6400,%6200,%6100,%6040,%6020,%6010,                 01750000
<<16>> %6004,%6002,%6001,%3200,%3100,%3040,%3020,%3010,                 01752000
<<17>> %3004,%3002,%3001,%5000,%6000,%3000,%3400,%4005,                 01754000
<<20>> %3403,%1401,%1201,%1101,%1041,%2021,%4011,%2005,                 01756000
<<21>> %1003,%1403,%1203,%1103,%1043,%4403,%4203,%2103,                 01758000
<<22>> %7403,%0401,%2203,%0101,%0041,%0021,%0011,%4003,                 01760000
<<23>> %0003,%0403,%0203,%0103,%4041,%2041,%0013,%3401,                 01762000
<<24>> %5401,%5201,%5101,%5041,%5021,%5011,%5005,%5003,                 01764000
<<25>> %4402,%6401,%6201,%6101,%6041,%6021,%6011,%6005,                 01766000
<<26>> %6003,%2402,%3201,%3101,%3041,%3021,%3011,%3005,                 01768000
<<27>> %3003,%1402,%7000,%7401,%7201,%7101,%7041,%7021,                 01770000
<<30>> %7011,%7005,%7003,%5402,%5202,%5102,%5042,%5022,                 01772000
<<31>> %5012,%5006,%6402,%6202,%6102,%6042,%6022,%6012,                 01774000
<<32>> %6006,%3402,%3202,%3102,%3042,%3022,%3012,%3006,                 01776000
<<33>> %7402,%7400,%7200,%7100,%7040,%7020,%7010,%7004,                 01778000
<<34>> %7002,%7001,%7202,%7102,%7042,%7022,%7012,%7006,                 01780000
<<35>> %5203,%5103,%5043,%5023,%5013,%5007,%6203,%6103,                 01782000
<<36>> %6043,%6023,%6013,%6007,%3203,%3103,%3043,%3023,                 01784000
<<37>> %3013,%3007,%7203,%7103,%7043,%7023,%7013,%7007;                 01786000
                                                                        01788000
$PAGE "HOLLERITH TO ASCII CONVERSION TABLE"                    <<02698>>01790000
INTEGER ARRAY HOLLASS(0:255)=PB :=                                      01792000
   %040, %061, %062, %063, %064, %065, %066, %067,                      01794000
   %070, %140, %072, %043, %100, %047, %075, %042,                      01796000
   %071, %221, %026, %223, %224, %225, %226, %004,                      01798000
   %230, %231, %232, %233, %024, %025, %236, %032,                      01800000
   %060, %057, %123, %124, %125, %126, %127, %130,                      01802000
   %131, %271, %134, %054, %045, %137, %076, %077,                      01804000
   %132, %201, %202, %203, %204, %012, %027, %033,                      01806000
   %210, %211, %212, %213, %214, %005, %006, %007,                      01808000
   %055, %112, %113, %114, %115, %116, %117, %120,                      01810000
   %121, %261, %135, %044, %052, %051, %073, %136,                      01812000
   %122, %021, %022, %023, %235, %205, %010, %207,                      01814000
   %030, %031, %222, %217, %034, %035, %036, %037,                      01816000
   %175, %176, %163, %164, %165, %166, %167, %170,                      01818000
   %171, %321, %322, %323, %324, %325, %326, %327,                      01820000
   %172, %237, %262, %263, %264, %265, %266, %267,                      01822000
   %270, %200, %364, %365, %366, %367, %370, %371,                      01824000
   %046, %101, %102, %103, %104, %105, %106, %107,                      01826000
   %110, %250, %133, %056, %074, %050, %053, %041,                      01828000
   %111, %001, %002, %003, %234, %011, %206, %177,                      01830000
   %227, %215, %216, %013, %014, %015, %016, %017,                      01832000
   %173, %141, %142, %143, %144, %145, %146, %147,                      01834000
   %150, %303, %304, %305, %306, %307, %310, %311,                      01836000
   %151, %240, %241, %242, %243, %244, %245, %246,                      01838000
   %247, %000, %350, %351, %352, %353, %354, %355,                      01840000
   %174, %152, %153, %154, %155, %156, %157, %160,                      01842000
   %161, %312, %313, %314, %315, %316, %317, %320,                      01844000
   %162, %251, %252, %253, %254, %255, %256, %257,                      01846000
   %260, %020, %356, %357, %360, %361, %362, %363,                      01848000
   %272, %331, %332, %333, %334, %335, %336, %337,                      01850000
   %340, %330, %342, %343, %344, %345, %346, %347,                      01852000
   %341, %273, %274, %275, %276, %277, %300, %301,                      01854000
   %302, %220, %372, %373, %374, %375, %376, %377;                      01856000
COMMENT                                                        <<02698>>01858000
Above table is indexed by the pattern of hollerith code as     <<02698>>01860000
follows:                                                       <<02698>>01862000
                                                               <<02698>>01864000
    8   9   10  11  12  13  14  15                             <<02698>>01866000
  +---+---+---+---+---+-----------+                            <<02698>>01868000
  |R12|R11|R0 |R9 |R8 | ROW#(1-7) |                            <<02698>>01870000
  +---+---+---+---+---+-----------+                            <<02698>>01872000
                                                               <<02698>>01874000
  R12,R11,R0,R9,R8 : Status of each ROW.                       <<02698>>01876000
                                                               <<02698>>01878000
  ROW#             : Value between 1 to 7 corresponds to ROW # <<02698>>01880000
                     which has a hole.                         <<02698>>01882000
                                                               <<02698>>01884000
  For example: "A" has holes on R11 and R1 and resulting index <<02698>>01886000
               is 10000001(%201).                              <<02698>>01888000
  ;                                                            <<02698>>01890000
                                                                        01892000
$PAGE "6 BIT CODE TO/FROM ASCII CONVERSION TABLE FOR 96 COLUMN"<<02698>>01894000
INTEGER ARRAY SIXA(%40:%141)=PB:=                                       01896000
<<%40>> %00,%52,%17,%13,%53,%34,%32,%15,                                01898000
<<%50>> %75,%55,%54,%76,%33,%40,%73,%21,                                01900000
<<%60>> %20,%01,%02,%03,%04,%05,%06,%07,                                01902000
<<%70>> %10,%11,%12,%56,%74,%16,%36,%37,                                01904000
<<%100>>%14,%61,%62,%63,%64,%65,%66,%67,                                01906000
<<%110>>%70,%71,%41,%42,%43,%44,%45,%46,                                01908000
<<%120>>%47,%50,%51,%22,%23,%24,%25,%26,                                01910000
<<%130>>%27,%30,%31,%00,%00,%57,%72,%35,                                01912000
<<%140>>%77,%60;                                                        01914000
                                                                        01916000
INTEGER ARRAY A6(%0:%77)=PB:=                                           01918000
<<%00>> %40,%61,%62,%63,%64,%65,%66,%67,                                01920000
<<%10>> %70,%71,%72,%43,%100,%47,%75,%42,                               01922000
<<%20>> %60,%57,%123,%124,%125,%126,%127,%130,                          01924000
<<%30>> %131,%132,%46,%54,%45,%137,%76,%77,                             01926000
<<%40>> %55,%112,%113,%114,%115,%116,%117,%120,                         01928000
<<%50>> %121,%122,%41,%44,%52,%51,%73,%135,                             01930000
<<%60>> %175,%101,%102,%103,%104,%105,%106,%107,                        01932000
<<%70>> %110,%111,%136,%56,%74,%50,%53,%174;                            01934000
$PAGE "2894A PRINTING READER PUNCH DRIVER"                     <<02698>>01936000
LOGICAL INHIBIT:=FALSE,                                                 01938000
        NOPUNCH:=FALSE,                                                 01940000
        NOPRINT:=FALSE,                                                 01942000
        PPSEPAR:=FALSE,                                                 01944000
        SECSTACK:=FALSE,                                                01946000
        SECHOPP:=FALSE,                                                 01948000
        STACKCONT:=FALSE,                                               01950000
        WRITEWORD:=%040000,                                             01952000
        SCRATCH,                                                        01954000
        BFILL;                                                          01956000
        INTEGER POINTER BUF;                                            01958000
        INTEGER POINTER CTAB;                                           01960000
        DOUBLE POINTER LPDTD = DB+SYSLPDT;                              01962000
                                                                        01964000
$PAGE                                                          <<02698>>01966000
SUBROUTINE SETFLAGS;                                                    01968000
  BEGIN                                                                 01970000
    TOS:=0;                                                             01972000
    TOS:=SIOPBASE;  <<SET UP AUX BUFFER>>                               01974000
    ABUF:=TOS;                                                          01976000
    TOS:=LPDTD(LDEV);                                                   01978000
    IF TOS.(12:4)=1 THEN  <<96 COL>>                                    01980000
    BEGIN                                                               01982000
      FCNT:=96;                                                         01984000
      HCNT:=48;                                                         01986000
    END                                                                 01988000
    ELSE                                                                01990000
    BEGIN                                                               01992000
      FCNT:=80;                                                         01994000
      HCNT:=40;                                                         01996000
    END;                                                                01998000
    DEL;                                                                02000000
    FUNC:=IOQP(QFUNC);     <<GET FUNCTION CODE>>                        02002000
    P1:=IOQP(QPAR1);       <<GET PARAMETER 1>>                          02004000
    P2:=IOQP(QPAR2);       <<GET PARAMETER 2>>                          02006000
    IF FUNC <> CONTROL  THEN MODE := P2.(11:2);                <<00597>>02008000
    IF DACCP.(14:1)=0 THEN   <<IF NO FCONTROL SET DEFAULTS>>   <<00597>>02010000
      IF FUNC = WRITE                                          <<00597>>02012000
        THEN DACCP.(0:5):=%16   <<SCM, HOPR 2, STKR 2>>        <<00597>>02014000
        ELSE DACCP.(0:5):=%10;  <<SCM, HOPR1, STKR1>>          <<00597>>02016000
    WRITEWORD.(0:5):=DACCP.(0:5);                                       02018000
    NOPUNCH:=DACCP.(7:1);     <<NO PUNCH OPTION>>                       02020000
    NOPRINT:=DACCP.(8:1);     <<NOPRINT OPTION>>                        02022000
    PPSEPAR:=DACCP.(9:1);     <<SEPARATE PRINT OPTION>>                 02024000
    IF FUNC=WRITE AND P2.(10:1)=1  THEN   <<IF SYSTEM WRITE>>  <<00597>>02026000
    BEGIN    <<SET DEFAULTS FOR HEADER/TRAILER>>               <<00597>>02028000
      WRITEWORD.(1:4):=%17;   <<HOPR2 -> STKR 2, IIF>>         <<00597>>02030000
      NOPUNCH:=FALSE;   <<PUNCH>>                              <<00597>>02032000
      NOPRINT:=FALSE;   <<PRINT>>                              <<00597>>02034000
    END;                                                       <<00597>>02036000
    SECHOPP:=WRITEWORD.(3:1);   <<HOPPER SELECT FLAG>>         <<00597>>02038000
    SECSTACK:=WRITEWORD.(2:1);  <<STACKER SELECT FLAG>>        <<00597>>02040000
  END;     <<SET FLAGS>>                                                02042000
                                                                        02044000
$PAGE                                                          <<02698>>02046000
SUBROUTINE FEEDCARD;                                                    02048000
  BEGIN                                                                 02050000
    QMISCP:=0;                                                          02052000
    TOS:=DRTN;                                                          02054000
    ASSEMBLE(TIO 0);                                                    02056000
    IF < THEN GO UFAIL;                                                 02058000
    IF S0.(9:1) <> 1 THEN                                               02060000
    BEGIN     <<DEVICE NOT READY>>                                      02062000
      DITP(DSTAT):=TOS;  <<SAVE STATUS>>                                02064000
      IOMESSAGE(1,11,%10000,LDEV,,,,,0);                       <<00597>>02066000
      QMISCP := %40000;   <<WAITING FOR READY>>                <<00597>>02068000
      TOS := %30;                                              <<00597>>02070000
      TOS := REINIT;   <<CALL INITIATOR ON IRPT>>              <<00597>>02072000
      GO BEND;                                                 <<00597>>02074000
    END;                                                                02076000
    DITP(DSTAT):=TOS;  <<DRTN NOW ON TOS>>                              02078000
    TOS := MSTRCLEAR;                                          <<00597>>02080000
    ASSEMBLE(CIO 1);    <<MASTERCLEAR>>                        <<00597>>02082000
    IF <> THEN GO UFAIL;                                       <<00597>>02084000
    TOS:=WRITEWORD LAND %73777;      <<TURN OFF IFF>>                   02086000
    ASSEMBLE(WIO 1);                                                    02088000
    IF < THEN GO UFAIL;                                                 02090000
    IF > THEN GO NOTRDY;                                                02092000
    TOS:= %1000;     <<SET DEV END>>                                    02094000
    ASSEMBLE(CIO 1);                                                    02096000
    IF <> THEN GO UFAIL;                                                02098000
    DISABLE;                                                   <<00597>>02100000
    TOS:=%40;     <<FRQ>>                                               02102000
    ASSEMBLE(CIO 1);                                                    02104000
    IF <> THEN GO UFAIL;                                                02106000
    TOS:=%3;      <<EIR,STT>>                                           02108000
    ASSEMBLE(CIO 1);                                                    02110000
    IF  <> THEN GO UFAIL;                                               02112000
    ASSEMBLE(DEL);  <<CLEAN OFF STACK>>                                 02114000
    IF FUNC=WRITE THEN                                                  02116000
    QMISCP:=%20000;                                                     02118000
    TOS:=1;                                                             02120000
    TOS:=CALLCMPLT;                                                     02122000
    GO BEND;                                                            02124000
  <<**NOTE--WE ARE NOT RETURNING TO CALLER**>>                 <<00597>>02126000
  END;     <<FEEDCARD>>                                                 02128000
                                                                        02130000
                                                                        02132000
$PAGE                                                          <<02698>>02134000
SUBROUTINE SETWBCOUNT;                                                  02136000
<<FIGURE OUT ACTUAL W/B COUNT AND SET MAXSIZE>>                         02138000
  BEGIN                                                                 02140000
    TOS:=IOQP(QWBCNT);                                                  02142000
    IF MODE = ASCII THEN                                                02144000
    BEGIN                                                               02146000
      IF S0.(0:1) =0 THEN                                               02148000
      TOS:=-(TOS&ASL(1));     <<SET TO BYTE COUNT>>                     02150000
      WBCNT:=TOS;                                                       02152000
      IF WBCNT< -FCNT THEN WBCNT:=-FCNT;                                02154000
      IF PPSEPAR THEN WBCNT:=-FCNT;  <<FULL CARD ON SEP PRINT>>         02156000
      IF IOQP(QWBCNT) <0 THEN IOQP(QWBCNT):=WBCNT                       02158000
      ELSE IOQP(QWBCNT) := -(WBCNT&ASR(1));                    <<01.03>>02160000
    END     <<ASCII COUNT>>                                             02162000
    ELSE                                                                02164000
    BEGIN     <<COL BIN COUNT>>                                         02166000
      IF S0.(0:1)=1 THEN                                                02168000
      TOS:=-(TOS&ASR(1));     <<SET TO WORD COUNT>>                     02170000
      WBCNT:=TOS;                                                       02172000
      IF WBCNT>FCNT THEN WBCNT:=FCNT;                                   02174000
      IF IOQP(QWBCNT) < 0 THEN IOQP(QWBCNT) := -(WBCNT&ASL(1)) <<01.03>>02176000
      ELSE IOQP(QWBCNT):=WBCNT;                                         02178000
    END;                                                                02180000
  END;     <<SET WORD BYTE COUNT>>                                      02182000
                                                                        02184000
                                                                        02186000
$PAGE                                                          <<02698>>02188000
SUBROUTINE WRITECARD;                                                   02190000
<<  J= # WRITES NECCESSARY(#COLUMNS TO BE PUNCHED)  >>                  02192000
<<  I= WRITE COUNTER(0 TO J-1)                      >>                  02194000
<<  K= INDEX OF BUFFER WORD CURRENTLY BEING REFERENCED >>               02196000
<<  BFILL= TRUE MEANS WRITE BLANKS(TO FILL OUT CARD)  >>                02198000
  BEGIN                                                                 02200000
    I:=-1;                                                              02202000
    K:=0;                                                               02204000
    TOS:=DRTN;                                                          02206000
    TOS:=BANK;                                                          02208000
    TOS:=BUFADR;                                                        02210000
    TOS:=TOS-1;                                                         02212000
    WHILE (I:=I+1)  <J DO                                               02214000
    BEGIN     <<WRITE LOOP>>                                            02216000
      IF BFILL THEN TOS:=0 ELSE                                         02218000
      BEGIN     <<DATA>>                                                02220000
        IF I.(15:1)=0 OR MODE=COLBIN THEN                      <<00140>>02222000
        TOS:=TOS+1;                                                     02224000
        ASSEMBLE(LSEA);                                                 02226000
        IF MODE = ASCII THEN                                            02228000
        BEGIN  <<ASCII>>                                                02230000
          IF LOGICAL(I) THEN                                            02232000
          K:=K+1 ELSE     <<R.H. BYTE>>                                 02234000
          TOS:=TOS&LSR(8);     <<L.H. BYTE>>                            02236000
          X:=TOS LAND %377;     <<ASCII CODE>>                          02238000
          IF FCNT=96 THEN                                               02240000
          BEGIN     <<SET UP 6 BIT CHAR>>                               02242000
            IF X>%40 THEN IF X<%140 THEN GO OUTA;                       02244000
            IF X=%174 THEN                                              02246000
            BEGIN                                                       02248000
              X:=%140;                                                  02250000
              GO OUTA;                                                  02252000
            END;                                                        02254000
            IF X= %175 THEN X:=%141                                     02256000
            ELSE X:=%133;                                               02258000
OUTA:                                                                   02260000
            TOS:=SIXA(X);                                               02262000
          END     <<6 BIT SET UP>>                                      02264000
          ELSE                                                          02266000
          TOS:=AHOLL(X);     <<HOLLERITH CODE>>                         02268000
        END;                                                            02270000
      END;  <<DATA>>                                                    02272000
      L := 1;      <<TIMEOUT COUNTER>>                         <<00597>>02274000
      DO   <<LOOP UNTIL WIO ALLOWED>>                          <<00597>>02276000
      BEGIN                                                    <<00597>>02278000
        ASSEMBLE(TIO 3);                                       <<00597>>02280000
        IF < THEN GO UFAIL;                                    <<00597>>02282000
        IF (L:=L+1)=0 THEN GO FAIL;  <<TIMED OUT>>             <<00597>>02284000
      END                                                      <<00597>>02286000
      UNTIL TOS.(5:1)=1;   <<DFS SET = WIO OK>>                <<00597>>02288000
      ASSEMBLE (WIO 3);                                                 02290000
      IF < THEN GO UFAIL;                                               02292000
      IF > THEN ASSEMBLE(DEL);                                          02294000
    END;  <<WRITE LOOP>>                                                02296000
    ASSEMBLE(DEL; DDEL);                                                02298000
  END;  <<WRITECARD SUBROUTINE>>                                        02300000
                                                                        02302000
                                                                        02304000
$PAGE                                                          <<02698>>02306000
SUBROUTINE CLBFULLSUB;                                                  02308000
  BEGIN                                                                 02310000
    IF DACCP.(15:1)=1 THEN GO BAGIN;                                    02312000
    TOS:=DRTN;                                                          02314000
      TOS:=WRITEWORD LOR %140000; <<CLEAR BUF FULL>>           <<01.02>>02316000
    ASSEMBLE(WIO 1);                                                    02318000
    IF < THEN GO UFAIL;                                                 02320000
    TOS:=%1000;     <<SDE>>                                             02322000
    ASSEMBLE(CIO 1);                                                    02324000
    IF <> THEN GO UFAIL;                                                02326000
    IF FUNC=WRITE THEN <<SET UP DELAY>>                                 02328000
    BEGIN                                                               02330000
      DITP(DTRLX):=TIMEREQ(%20,@DITP,100D);                    <<01.02>>02332000
      DACCP.(15:1):=1;                                                  02334000
      STATUS:=1;                                                        02336000
      MSTATE:=CALLCMPLT;                                                02338000
      GO TO FASOUT;                                                     02340000
BAGIN:                                                                  02342000
      ABORTTIMEREQ(DITP(DTRLX));                                        02344000
      DACCP.(15:1):=0;                                                  02346000
    TOS:=DRTN;                                                          02348000
    END;                                                                02350000
    TOS:=CLEAR;                                                         02352000
    ASSEMBLE(CIO 1);                                                    02354000
    IF <> THEN GO UFAIL;                                                02356000
    ASSEMBLE(DEL);                                                      02358000
  IF FUNC=WRITE THEN                                                    02360000
  BEGIN                                                                 02362000
    IF QMISCP=%20000 THEN GO BAG2                                       02364000
      ELSE GO WELLDONE;                                        <<01.02>>02366000
  END;                                                                  02368000
END;  <<CLEAR BUFFER FULL SUBROUTINE>>                                  02370000
$PAGE                                                                   02372000
<<  I  N  I  T  I  A  T  O  R    >>                                     02374000
                                                                        02376000
     DISABLE;     <<DISABLE INTERRUPTS>>                                02378000
     DITP(0).IAK:=0;  <<RESET IAK>>                                     02380000
     TOS:=IOQP;                                                         02382000
     DEL;                                                               02384000
     IF < THEN                                                          02386000
     BEGIN     <<I/O HAS BEEN ABORTED>>                                 02388000
       ENABLE;                                                          02390000
       MASTERCLEAR(DITP);                                               02392000
       IF IOQP.PFAILB =1 THEN TOS:=PFABORT ELSE TOS:=ABORTED;           02394000
       TOS:=ENDIO;                                                      02396000
       GO TO OUT;                                                       02398000
     END;                                                               02400000
     ENABLE;                                                            02402000
     IF MSTATE = COMPLETION THEN GO COMPLETOR;                          02404000
WIN:                                                                    02406000
     ENABLE;                                                   <<01.02>>02408000
     TOS:=DRTN;     <<ENABLE DEV STATUS,CLEAR INTERRUPTS>>              02410000
     TOS:=CLEAR LOR %10;                                                02412000
     ASSEMBLE (CIO 1; DEL);                                             02414000
     IF <> THEN                                                         02416000
     BEGIN                                                              02418000
UFAIL:                                                                  02420000
       ENABLE;                                                 <<01.02>>02422000
       IOFAILURE(DRTN,DITP);   <<NON RESPONDING DEVICE>>                02424000
FAIL:                                                                   02426000
       ENABLE;                                                 <<01.02>>02428000
      IOMESSAGE(1,208,%10000,LDEV,,,,,0);                      <<0U.EB>>02430000
      TOS:=DRTN;                                                        02432000
      TOS:=MSTRCLEAR;                                                   02434000
      ASSEMBLE(CIO 1; DEL);                                             02436000
      IF <> THEN ASSEMBLE(DEL);                                         02438000
      TOS:=UNITFAIL;                                                    02440000
      TOS:=ENDIO;                                                       02442000
      GO TO BEND;                                                       02444000
    END;                                                                02446000
    SETFLAGS;                                                           02448000
    IF FUNC = READ THEN                                                 02450000
$PAGE                                                                   02452000
<<I N I T I A T O R    R E A D                  >>                      02454000
    BEGIN                                                               02456000
      EOFCHECK(IOQP,0D,0,0);    <<PRE-READ EOF CHECK>>                  02458000
      IF <> THEN                                                        02460000
      BEGIN                                                             02462000
        MSTATE:=ENDIO;                                                  02464000
        RETURN;                                                         02466000
      END;                                                              02468000
      IF DEOF=1 THEN  <<LAST RD EOF.SWAP BUFFERS>>                      02470000
      BEGIN                                                             02472000
        IF MODE=ASCII THEN GO SWPBUF;                                   02474000
        TOS:=BADFUNC;     <<INVALID FUNCTION>>                          02476000
        TOS:=ENDIO;                                                     02478000
        GO TO BEND;                                                     02480000
      END;                                                              02482000
      AXBFLG:=0;                                                        02484000
      IF -(FCNT-1)<=IOQP(QWBCNT)<=(HCNT-1) THEN                         02486000
      AXBFLG:=1;     <<USE AUXILLARY BUFFER>>                           02488000
      SETWBCOUNT;                                                       02490000
      FEEDCARD;                                                         02492000
    END;  <<READ INITIAL>>                                              02494000
    IF FUNC = WRITE THEN                                                02496000
$PAGE                                                                   02498000
<<  I N I T I A T O R    W R I T E               >>                     02500000
                                                                        02502000
    BEGIN                                                               02504000
      TOS:=DRTN;                                                        02506000
      ASSEMBLE(TIO 0);                                                  02508000
      IF < THEN GO UFAIL;                                               02510000
      IF S0.(9:1)<> 1 THEN                                              02512000
      BEGIN     <<DEVICE NOT READY>>                                    02514000
NOTRDY:                                                                 02516000
        IOMESSAGE(1,11,%10000,LDEV,,,,,0);                     <<0U.EB>>02518000
        TOS:=DRTN;     <<CLEAR>>                                        02520000
        TOS:=CLEAR;                                            <<00597>>02522000
        ASSEMBLE(CIO 1);                                                02524000
        IF <> THEN GO UFAIL;                                            02526000
        TOS:=2;     <<EIR>>                                             02528000
        ASSEMBLE(CIO 1);                                                02530000
        IF <> THEN GO UFAIL;                                            02532000
        ASSEMBLE(DEL);                                                  02534000
        TOS:=0;                                                         02536000
        TOS:=REINIT;                                                    02538000
        GO BEND;                                                        02540000
      END;                                                              02542000
      IF TOS.(11:1) <> 1  THEN FEEDCARD;                       <<00597>>02544000
       <<IF NO CARD IN VWS, FEED ONE>>                         <<00597>>02546000
      TOS:=WRITEWORD;                                                   02548000
      ASSEMBLE(WIO 1);  <<HOPP,STACKER,INHIBIT OPTIONS>>                02550000
      IF < THEN GO UFAIL;                                               02552000
      IF > THEN GO NOTRDY;                                              02554000
      TOS:=%1000;     <<SET DEVICE END>>                                02556000
      IF NOT NOPRINT THEN                                               02558000
      TOS.(7:1):=1;     <<SET PRINT OPTION>>                            02560000
      IF NOT NOPUNCH THEN                                               02562000
      TOS.(8:1):=1;     <<SET PUNCH OPTION>>                            02564000
      IF PPSEPAR THEN                                                   02566000
      TOS.(9:1):=1;     <<SET SEPARATE PRINT OPTION>>                   02568000
      ASSEMBLE(DUP);     <<DUPLICATE COMMAND>>                          02570000
      ASSEMBLE(CIO 2);   <<PRINT,PUNCH OPTIONS>>                        02572000
      IF <> THEN GO UFAIL;                                              02574000
      TOS:=(TOS LAND %700) LOR %40;  <<ADD IN FEED REQ>>                02576000
      ASSEMBLE(CIO 1);                                                  02578000
      IF <> THEN GO UFAIL;                                              02580000
      SETWBCOUNT;                                                       02582000
      IF WBCNT < 0 THEN                                                 02584000
      J:=-(WBCNT)   <<#WRITES REQUIRED ASCII>>                          02586000
      ELSE J:=WBCNT;<<#WRITER REQUIRED COL BINARY>>                     02588000
      BFILL:=FALSE;                                                     02590000
      WRITECARD;                                                        02592000
      IF J<FCNT THEN                                                    02594000
      BEGIN     <<ZERO FILL>>                                           02596000
        J:=FCNT-J;     <<#COLS REMAINING>>                              02598000
        BFILL:=TRUE;                                                    02600000
        WRITECARD;                                                      02602000
      END;     <<ZERO FILL>>                                            02604000
      IF PPSEPAR THEN                                                   02606000
      BEGIN     <<SEPARATE PRINT DATA>>                                 02608000
        MODE:=ASCII;     <<ALL PRINTING IS IN ASCII>>                   02610000
        J:=FCNT;     <<ALWAYS PRINT FCNT CHARACTERS>>                   02612000
        BUFADR:=BUFADR+HCNT;    <<START OF PRINT BUFFER>>               02614000
        BFILL:=FALSE;                                                   02616000
        WRITECARD;                                                      02618000
        BUFADR:=BUFADR-HCNT;    <<RESET BUFFER>>                        02620000
      END;     <<SEPARATE PRINT>>                                       02622000
      TOS:=DRTN;                                                        02624000
      TOS:=%1003;     <<SET DEV END,ENAB INT,START TIMER>>              02626000
      DISABLE;                                                 <<01.02>>02628000
      ASSEMBLE(CIO 1);                                                  02630000
      IF <> THEN GO UFAIL;                                              02632000
      TOS:=1;                                                           02634000
      TOS:=CALLCMPLT;     <<CALL COMPLETOR>>                            02636000
      GO OUT;                                                           02638000
    END;     <<WRITE>>                                                  02640000
    IF FUNC = OPEN THEN                                                 02642000
$PAGE                                                                   02644000
<<  I N I T I A T O R    O P E N                  >>                    02646000
    BEGIN     <<FILE OPEN>>                                             02648000
      MASTERCLEAR(DITP);                                                02650000
      DACCP:=%40000;   <<SET STACKER CONTROL MODE>>            <<00597>>02652000
      GO WELLDONE;                                                      02654000
    END;                                                                02656000
    IF FUNC = CLOSE THEN                                                02658000
$PAGE                                                                   02660000
<<  I N I T I A T O R    C L O S E                 >>                   02662000
    BEGIN     <<FILE CLOSE>>                                            02664000
      TOS:=DRTN;                                                        02666000
      ASSEMBLE(TIO 0);                                                  02668000
      IF < THEN GO UFAIL;                                               02670000
      IF S0.(11:1)=1 THEN                                               02672000
      BEGIN     <<CARD IN WAIT STAT-MUST BE CLEARED>>                   02674000
        ASSEMBLE(DEL);                                                  02676000
         TOS:=WRITEWORD LOR %44000;<<INHIBIT INPUT FEED>>      <<01.02>>02678000
        ASSEMBLE(WIO 1);                                                02680000
        IF < THEN GO UFAIL;                                             02682000
        IF > THEN GO NOTRDY;                                            02684000
        TOS:=%1000;     <<SET DEV END>>                                 02686000
        ASSEMBLE(CIO 1);                                                02688000
        IF <> THEN GO UFAIL;                                            02690000
        TOS:=%43;   <<FRQ,EIR,STT>>                                     02692000
      DISABLE;                                                 <<01.02>>02694000
        ASSEMBLE(CIO 1);                                                02696000
        IF <> THEN GO UFAIL;                                            02698000
         QMISCP:=%100000;                                      <<01.02>>02700000
         TOS:=1;                                               <<01.02>>02702000
         TOS:=CALLCMPLT;                                       <<01.02>>02704000
         GO OUT;                                               <<01.02>>02706000
      END;                                                              02708000
      GO TO WELLDONE;                                                   02710000
    END;    <<FILE CLOSE>>                                              02712000
    IF FUNC = DEVCLOSE THEN                                             02714000
$PAGE                                                                   02716000
<<  I N I T I A T O R    D E V I C E   C L O S E   >>                   02718000
    BEGIN     <<DEVICE CLOSE>>                                          02720000
      TOS:=LPDTD(LDEV);                                                 02722000
      TOS.EOF:=0;  <<RESET EOF FIELD IN LPDT>>                          02724000
      LPDTD(X):=TOS;                                                    02726000
      DACCP:=%40000;   <<RESET DEFAULT CONTROL SETTINGS>>      <<00597>>02728000
      GO TO WELLDONE;                                                   02730000
    END;    <<DEVICE CLOSE>>                                            02732000
    IF FUNC = CONTROL THEN                                              02734000
$PAGE                                                                   02736000
<<  I N I T I A T O R    C O N T R O L               >>                 02738000
    BEGIN     <<CONTROL>>                                               02740000
      TOS:=%40000;   <<SET UP CONTROL OPTIONS>>                         02742000
      TOS.(4:1):=P1.(6:1);  <<INHIBIT FEED OPTION>>                     02744000
      TOS.(2:1):=P1.(10:1);  <<STACKER OPTION>>                         02746000
      TOS.(3:1):=P1.(11:1);  <<HOPPER OPTION>>                          02748000
      TOS:=TOS.(0:5);                                                   02750000
      DACCP.(0:5):=TOS;                                                 02752000
      WRITEWORD := DACCP;                                      <<00597>>02754000
      IF P1.(7:2) > 0   <<NO PRINT OR NO PUNCH?>>              <<00597>>02756000
        THEN P1.(9:1) := 0;   <<THEN NO SEPARATE BUFFER>>      <<00597>>02758000
      DACCP.(7:3):=P1.(7:3);  <<PRINT/PUNCH OPTIONS>>                   02760000
      DACCP.(14:1):=1; <<TURN ON CONTROL FLAG>>                         02762000
      GO TO WELLDONE;                                                   02764000
    END;     <<CONTROL>>                                                02766000
    IF FUNC > 5 THEN                                                    02768000
$PAGE                                                                   02770000
<<  I N I T I A T O R    I N V A L I D                >>                02772000
    BEGIN                                                               02774000
      TOS:=INVALID;                                                     02776000
      TOS:=ENDIO;                                                       02778000
      GO BEND;                                                          02780000
WELLDONE:                                                               02782000
      TOS:=1;     <<ENDING STAT OK>>                                    02784000
      TOS:=ENDIO;                                                       02786000
BEND:                                                                   02788000
      TOS:=DRTN;     <<EIR>>                                            02790000
      TOS:=2;                                                           02792000
      ASSEMBLE(CIO 1; DEL);                                             02794000
      IF <> THEN GO UFAIL;                                              02796000
OUT:                                                                    02798000
      MSTATE:=TOS;     <<SET MONITOR STATE>>                            02800000
      STATUS:=TOS;     <<SET STATUS>>                                   02802000
FASOUT:                                                                 02804000
      ENABLE;                                                  <<01.02>>02806000
      RETURN;                                                           02808000
    END;     <<INITIATOR>>                                              02810000
                                                                        02812000
                                                                        02814000
                                                                        02816000
$PAGE                                                                   02818000
<<        C  O  M  P  L  E  T  O  R        >>                           02820000
                                                                        02822000
                                                                        02824000
COMPLETOR:                                                              02826000
<< GET HERE IF MONITOR STATE = 3.  SHOULD ONLY GET HERE IF >>           02828000
<< FUNCTION CODE = READ,WRITE,FILE CLOSE,OR OPEN FOR       >>           02830000
<< WRITE ONLY.                                             >>           02832000
                                                                        02834000
   TOS:=DRTN;                                                           02836000
   IF DACCP.(15:1)=1 THEN                                      <<00219>>02838000
     BEGIN                                                     <<00219>>02840000
        FUNC := IOQP(QFUNC);                                   <<00219>>02842000
        CLBFULLSUB;                                            <<00219>>02844000
     END;                                                      <<00219>>02846000
   TOS:=CLEAR ;  <<CLEAR INTERRUPTS>>                                   02848000
   ASSEMBLE(CIO 1);                                                     02850000
   IF <> THEN GO UFAIL;                                                 02852000
   TOS:=DITP(DSTAT);  <<GET STATUS>>                                    02854000
   << STATUS NOW ON TOS>>                                               02856000
   TOS:=TOS&CSR(2);     <<TRANSFER ERROR BIT>>                          02858000
   IF < THEN                                                            02860000
   BEGIN     <<TRANSFER ERROR INTERRUPT>>                               02862000
     TOS:=XFERERR;                                                      02864000
     TOS:=ENDIO;                                                        02866000
     GO BEND;                                                           02868000
   END;                                                                 02870000
   TOS:=TOS&CSL(1);  <<WATCHDOG TIMER BIT>>                             02872000
   IF < THEN GO FAIL;     <<TIMED OUT>>                                 02874000
   TOS:=TOS&CSL(9);  <<READY FOR COMMAND BIT>>                          02876000
   IF < THEN GO CONT;                                                   02878000
   TOS:=TOS&CSL(4);  <<INPUT BUFFER FULL BIT>>                          02880000
   IF < THEN GO CONT;                                                   02882000
   TOS:=TOS&CSR(2);  <<BIT 0 = NOT RDY BIT>>                            02884000
   IF < THEN                                                            02886000
   BEGIN                                                                02888000
     MASTERCLEAR(DITP);                                                 02890000
      IF IOQP(QFUNC).(8:8) = WRITE  THEN GO CONT;              <<00288>>02892000
        <<HANDLE IN WRITE COMPLETOR IF WRITE>>                 <<00288>>02894000
     GO NOTRDY;                                                         02896000
   END;                                                                 02898000
   GO NOTRDY;                                                  <<01.02>>02900000
CONT:                                                                   02902000
   ASSEMBLE(DEL);     <<DRTN ON TOS>>                                   02904000
   SETFLAGS;                                                            02906000
   IF QMISCP=%20000 THEN                                                02908000
   BEGIN                                                                02910000
     CLBFULLSUB;                                                        02912000
BAG2:                                                                   02914000
     QMISCP:=0;                                                         02916000
     MSTATE:=2;                                                         02918000
     GO WIN;                                                            02920000
   END;                                                                 02922000
   IF FUNC = READ THEN                                                  02924000
$PAGE                                                                   02926000
<<  C O M P L E T O R  R E A D  >>                                      02928000
                                                                        02930000
   BEGIN     <<READ COMPLETION>>                                        02932000
     IF QMISCP.(3:1)=1 THEN    <<SEE IF OP. CLEARED CARD>>     <<00597>>02934000
     BEGIN  <<NOTE - DRTN IS ON TOS>>                          <<00597>>02936000
       TOS := %10;  <<ENABLE DEVICE STATUS>>                   <<00597>>02938000
       ASSEMBLE(CIO 1);                                        <<00597>>02940000
       IF <> THEN GO UFAIL;                                    <<00597>>02942000
       ASSEMBLE(TIO 0);   <<GET DEVICE STATUS>>                <<00597>>02944000
       IF < THEN GO UFAIL;                                     <<00597>>02946000
       IF TOS.(11:1) = 1 THEN   <<CARD IN VWS>>                <<00597>>02948000
       BEGIN   <<DEVICE NOT CLEARED--WAIT AGAIN>>              <<00597>>02950000
         TOS := 1;                                             <<00597>>02952000
         TOS := CALLCMPLT;  <<WAIT FOR IRPT>>                  <<00597>>02954000
         GO BEND;                                              <<00597>>02956000
       END                                                     <<00597>>02958000
       ELSE   <<OPERATOR CLEARED THE BAD CARD>>                <<00597>>02960000
       BEGIN                                                   <<00597>>02962000
         QMISCP := 0;                                          <<00597>>02964000
         MSTATE := 2;                                          <<00597>>02966000
         GO WIN;                                               <<00597>>02968000
       END;                                                    <<00597>>02970000
     END;                                                      <<00597>>02972000
     TOS:=HCNT;                                                         02974000
     IF MODE=ASCII THEN TOS:=TOS&LSL(1);                                02976000
     ASSEMBLE(DUP);                                                     02978000
     J:=TOS;      <<#READS REQUIRED>>                                   02980000
     M:=TOS;      <<#REQUEST READS REQUIRED>>                           02982000
     SCRATCH:=FALSE;                                                    02984000
     I:=-1;                                                             02986000
     K:=0;                                                              02988000
     IF AXBFLG=1 THEN                                                   02990000
     BEGIN     <<SET FOR AUX BUFFER>>                                   02992000
       TOS:=0;     <<BANK ALWAYS 0>>                                    02994000
       TOS:=@SIOP+%1000;                                                02996000
     END                                                                02998000
     ELSE                                                               03000000
     BEGIN     <<SET FOR USER BUFFER>>                                  03002000
       TOS:=BANK;                                                       03004000
       TOS:=BUFADR;                                                     03006000
     END;                                                               03008000
     << DRTN ON TOS -2>>                                                03010000
     WHILE (I:=I+1) < J DO                                              03012000
     BEGIN     <<READ LOOP>>                                            03014000
       L := 1;        <<TIMEOUT COUNTER>>                      <<00597>>03016000
       DO             <<LOOP UNTIL RIO ALLOWED>>               <<00597>>03018000
       BEGIN                                                   <<00597>>03020000
         ASSEMBLE(TIO 2);                                      <<00597>>03022000
         IF < THEN GO UFAIL;                                   <<00597>>03024000
         IF (L:=L+1)=0 AND I>0  THEN GO FAIL;  <<TIMED OUT>>   <<00597>>03026000
       END                                                     <<00597>>03028000
       UNTIL TOS.(5:1)=1   <<DFS SET = RIO ALLOWED>>           <<00597>>03030000
           OR L=0 AND I=0;  <<TIME OUT ON FIRST COL.>>         <<00597>>03032000
       ASSEMBLE(RIO 2);                                                 03034000
       IF < THEN GO UFAIL;                                              03036000
       IF > THEN GO NOTRDY;                                             03038000
       TOS:=%2000;     <<IDT>>                                          03040000
       IF I+1=J THEN ASSEMBLE(DEL)                                      03042000
       ELSE ASSEMBLE(CIO 4);                                            03044000
       IF <> THEN GO UFAIL;                                             03046000
       TOS:=CLEAR;                                                      03048000
       ASSEMBLE(CIO 4);                                                 03050000
       IF <> THEN GO UFAIL;                                             03052000
       IF I=0 THEN                                                      03054000
       BEGIN    <<DO THIS FIRST TIME ONLY>>                             03056000
         TOS:=TOS&CSL(3);                                               03058000
         IF < THEN                                                      03060000
         BEGIN     <<READ CHECK>>                                       03062000
           I:=1;                                                        03064000
           IF SECHOPP THEN I:=I+1;                                      03066000
           IOMESSAGE(1,217,%11000,LDEV,I,,,,0);                <<0U.EB>>03068000
           QMISCP:=0;                                                   03070000
           CLBFULLSUB;                                                  03072000
           QMISCP.(3:1) := 1;  <<WAIT FOR OP. TO CLEAR CARD>>  <<00597>>03074000
           TOS := 1;                                           <<00597>>03076000
           TOS := CALLCMPLT;  <<WAIT FOR INTERRUPT>>           <<00597>>03078000
           GO BEND;                                            <<00597>>03080000
         END;     <<READ CHECK>>                                        03082000
         TOS:=TOS&CSL(1);                                               03084000
         IF < THEN IF S0.(12:1)=0 THEN <<IBF=0,INPUT CHECK>>            03086000
         BEGIN                                                          03088000
           TOS:=DRTN;                                                   03090000
           TOS:=%1000;     <<SDE>>                                      03092000
           ASSEMBLE(CIO 1;DEL);                                         03094000
           IF <> THEN GO UFAIL;                                         03096000
           GO NOTRDY;                                                   03098000
         END;                                                           03100000
         TOS:=TOS&CSR(4);                                               03102000
       END;     <<FIRST TIME>>                                          03104000
ARND:                                                                   03106000
       TOS:=TOS LAND %7777;                                             03108000
       IF I < 5 THEN                                                    03110000
       SIOP(I+48):=S0;  <<SAVE FOR EOFCHECK (96COLBIN)>>                03112000
       IF I<M THEN                                                      03114000
       BEGIN   <<TRANSLATE AND CRAM INTO BUFFER>>                       03116000
         IF MODE = COLBIN THEN                                          03118000
         BEGIN     <<COLUMN BINARY>>                                    03120000
           ASSEMBLE(SSEA);                                              03122000
           TOS:=TOS+1;     <<BUMP BUFFER INDX>>                         03124000
           K:=K+1;                                                      03126000
         END                                                            03128000
         ELSE                                                           03130000
         BEGIN     <<ASCII>>                                            03132000
           IF FCNT=96 THEN                                              03134000
           BEGIN                                                        03136000
             X:=TOS;                                                    03138000
             TOS:=A6(X);                                                03140000
             GO TO FC96;                                                03142000
           END;                                                         03144000
           ASSEMBLE(TEST);                                              03146000
           IF = THEN INDEX:=TOS                                         03148000
           ELSE                                                         03150000
           BEGIN                                                        03152000
             TOS:=S0.(7:8)&LSL(7);  <<ROWS 1-8>>                        03154000
             TOS.(8:1):=0;          <<TEST ROW 8>>                      03156000
             INDEX:= IF = THEN 0 ELSE 8;                                03158000
             ASSEMBLE (SCAN);                                           03160000
             IF X < 8 THEN INDEX:=INDEX+X;                              03162000
             IF TOS <> 0 THEN                                           03164000
             BEGIN    <<INVALID HOLLERITH>>                             03166000
              DEL;                                             <<01.03>>03168000
               INDEX:=0;                                                03170000
               IOMESSAGE(1,218,%11100,LDEV,I+1,IF SECHOPP THEN <<0U.EB>>03172000
                  2 ELSE 1,,,0);                               <<0U.EB>>03174000
               J:=0;  <<TO GET OUT OF LOOP>>                            03176000
               SCRATCH:=TRUE;                                           03178000
               QMISCP:=0;                                               03180000
             END                                                        03182000
             ELSE                                                       03184000
             BEGIN                                                      03186000
               TOS:=(TOS CAT S0(7:15:1))&LSR(8);                        03188000
               INDEX:=TOS&LSL(4) LOR LOGICAL(INDEX);                    03190000
             END;                                                       03192000
           END;                                                         03194000
           TOS:=HOLLASS(INDEX);                                         03196000
FC96:                                                                   03198000
           IF LOGICAL (I) THEN                                          03200000
           BEGIN                                                        03202000
             TOS.(0:8):=TEMP;                                           03204000
             ASSEMBLE(SSEA);                                            03206000
             TOS:=TOS+1;     <<BUMP BUFFER INDX>>                       03208000
             K:=K+1;                                                    03210000
           END                                                          03212000
           ELSE                                                         03214000
           BEGIN                                                        03216000
             TEMP:=TOS;  <<SAVE FIRST HALF>>                            03218000
           END;                                                         03220000
         END;     <<ASCII>>                                             03222000
       END      <<TRANSLATE>>                                           03224000
       ELSE ASSEMBLE(DEL);                                              03226000
     END;     <<READ LOOP>>                                             03228000
     ASSEMBLE(DDEL; DEL);     <<CLEAR OUT BUFFER POINTERS>>             03230000
     IF SCRATCH THEN                                                    03232000
     BEGIN     <<INVALID HOLLERITH>>                                    03234000
       CLBFULLSUB;                                                      03236000
       QMISCP.(3:1) := 1;     <<WAIT FOR OP. TO CLEAR CARD>>   <<00597>>03238000
       TOS := 1;                                               <<00597>>03240000
       TOS := CALLCMPLT;  <<WAIT FOR INTERRUPT>>               <<00597>>03242000
       GO BEND;                                                <<00597>>03244000
     END;                                                               03246000
    CLBFULLSUB;                                                         03248000
           IF MODE=COLBIN AND FCNT=96 THEN                              03250000
           BEGIN  <<CHECK FOR 6 BIT :EOF:>>                             03252000
             IF SIOP(48)=%12 AND SIOP(49)=%65 AND                       03254000
             SIOP(50)=%46 AND SIOP(51)=%66 AND SIOP(52)=%12             03256000
             THEN                                                       03258000
             BEGIN  <<6 BIT :EOF: FOUND>>                               03260000
               TOS:=LPDTD(LDEV);                                        03262000
               TOS.EOF:=1; <<SET HARDWARE EOF>>                         03264000
               LPDTD(X):=TOS;                                           03266000
             END;                                                       03268000
         END;  <<CHECK FOR 6 BIT :EOF:>>                                03270000
         EOFCHECK(IOQP,IF LOGICAL(AXBFLG) THEN ABUF ELSE UBUF,          03272000
         HCNT,IF MODE=ASCII THEN 1 ELSE -1);                            03274000
         IF <> THEN                                                     03276000
         BEGIN     <<EOF FOUND>>                                        03278000
           IF < THEN IF AXBFLG=0 THEN                                   03280000
           BEGIN     <<ON EOF SAVE DATA IN AUX BUFFER>>                 03282000
             TOS:=ABUF;                                                 03284000
             TOS:=UBUF;                                                 03286000
             TOS:=HCNT;                                                 03288000
             ASSEMBLE(MABS);                                            03290000
             DEOF:=1;                                                   03292000
           END;                                                         03294000
           IF AXBFLG=1 THEN DEOF:=1;                                    03296000
           MSTATE:=ENDIO;                                               03298000
           RETURN;                                                      03300000
         END                                                            03302000
         ELSE                                                           03304000
         BEGIN     <<EOF NOT FOUND>>                                    03306000
           IF AXBFLG=1 THEN                                             03308000
           BEGIN     <<MOVE DATA FROM AUX BUFFER TO USERS>>             03310000
SWPBUF:                                                                 03312000
             TOS:=UBUF;                                                 03314000
             TOS:=ABUF;                                                 03316000
             TOS:=IOQP(QWBCNT);                                         03318000
             IF S0.(0:1)=1 THEN                                         03320000
             BEGIN                                                      03322000
             TOS:=-TOS;  TOS:=TOS&ASR(1); <<SET TO WORD CNT>>           03324000
             END;                                                       03326000
             IF S0 > HCNT THEN S0:=HCNT;                                03328000
             ASSEMBLE(MABS);                                            03330000
             AXBFLG:=0;                                                 03332000
           END;                                                         03334000
           DEOF:=0;     <<RESET EOF FLAG IN DIT>>                       03336000
         END;                                                           03338000
       GO WELLDONE;                                                     03340000
   END;      <<READ COMPLETION>>                                        03342000
   IF FUNC = WRITE THEN                                                 03344000
$PAGE                                                                   03346000
<<  C O M P L E T O R  W R I T E  >>                                    03348000
                                                                        03350000
   BEGIN     <<WRITE COMPLETION>>                                       03352000
     IF WRITEWORD.(4:1)=1 THEN GO WELLDONE;                             03354000
     <<IF INHIBIT FEED, NO CHECK FOR CARD AT VWS>>             <<00597>>03356000
     QMISCP:=0;                                                         03358000
     TOS:=%10;                                                          03360000
     ASSEMBLE(CIO 1);     <<DSE>>                                       03362000
     IF <> THEN GO UFAIL;                                               03364000
     ASSEMBLE(TIO 0);                                                   03366000
     IF < THEN GO UFAIL;                                                03368000
     IF S0.(11:1)=0 THEN                                       <<00288>>03370000
     BEGIN  <<NO CARD IN WAIT STATION SHOULD BE>>                       03372000
         << FIRST SEE IF DUE TO HOPPER EMPTY>>                 <<00288>>03374000
         << IF SO, SKIP MESSAGE...IT WILL BE CAUGHT >>         <<00288>>03376000
         << DURING WRITE INITIATOR FOR NEXT CARD >>            <<00288>>03378000
                                                               <<00288>>03380000
         IF TOS.(12:1) = 1 AND WRITEWORD.(3:1) = 1             <<00288>>03382000
          THEN GO WELLDONE;                                    <<00288>>03384000
         IF WRITEWORD.(3:1) = 0  THEN  <<SEE IF HOPR 1 EMPTY>> <<00288>>03386000
         BEGIN                                                 <<00288>>03388000
            TOS := DRTN;                                       <<00288>>03390000
            ASSEMBLE (RIO 0);                                  <<00288>>03392000
            ASSEMBLE (DELB);     <<DELETE DRTN>>               <<00288>>03394000
            IF <  THEN  GO UFAIL;                              <<00288>>03396000
            IF S0.(0:1) = 1  THEN GO FAIL;                     <<00288>>03398000
            IF TOS.(6:1) = 1  THEN GO WELLDONE;                <<00288>>03400000
         END;                                                  <<00288>>03402000
       IOMESSAGE(1,11,%10000,LDEV,,,,,0);                      <<0U.EB>>03404000
         QMISCP:=%40000;                                       <<01.02>>03406000
       TOS:=2;                                                          03408000
         DISABLE;                                              <<01.02>>03410000
       ASSEMBLE (CIO 1);     <<EIR>>                                    03412000
       IF <> THEN GO UFAIL;                                             03414000
       TOS:=0;                                                          03416000
       TOS:=WNEW;                                                       03418000
       GO BEND;                                                         03420000
     END                                                                03422000
     ELSE                                                               03424000
     BEGIN                                                              03426000
         DEL;      <<DELETE STATUS WORD>>                      <<00288>>03428000
CLEARB:                                                                 03430000
       CLBFULLSUB;                                                      03432000
                                                                        03434000
       GO WELLDONE;                                                     03436000
     END;                                                               03438000
   END;      <<WRITE COMPLETION>>                                       03440000
   IF FUNC = CLOSE THEN GO WELLDONE;                                    03442000
$PAGE                                                                   03444000
   IF FUNC=OPEN THEN                                                    03446000
   BEGIN                                                                03448000
     IF P2.(13:3)=1 THEN GO CLEARB;                                     03450000
   END;                                                                 03452000
$PAGE                                                                   03454000
<<  C O M P L E T O R  I N V A L I D  >>                                03456000
                                                                        03458000
<< IF YOU GET HERE FUNCTION IS INVALID.SHOULD NOT HAPPEN>>              03460000
   TOS:=INVALID;                                                        03462000
   TOS:=ENDIO;                                                          03464000
   GO BEND;                                                             03466000
                                                                        03468000
HELP;   <<***PROVIDE LINKAGE FOR HELP DEBUGGER***>>            <<00597>>03470000
                                                               <<00597>>03472000
END;     <<PRPCHDVR>>                                                   03474000
<< D R I V E R  L I N K A G E  A R E A >>                               03476000
                                                                        03478000
ASSEMBLE(                                                               03480000
         PCAL SIODM;          <<MONITOR>>                               03482000
         PCAL PRPCHDVR;       <<INITIATOR>>                             03484000
         PCAL PRPCHDVR;       <<COMPLETOR>>                             03486000
         CON 0;               <<NO I/O PROCESS>>                        03488000
         PCAL INITZ;          <<INITIALIZATION>>                        03490000
         CON 1;               <<1 INTERRUPT HANDLER>>                   03492000
         PCAL GIP);           <<INTERRUPT HANDLER>>                     03494000
END.                                                           <<02698>>03496000
